x
 
1
function bootUI(document, window, base) {
2
3
  base.elem(document.body, {
4
    background: 'rgb(3,11,61)',
5
    color: 'cyan',
6
    border: 'none',
7
    overflow: 'hidden',
8
    fontFamily: 'Segoe UI, Toronto, Helvetica, Roboto, Droid Sans, Sans Serif'
9
  });
10
11
  base.elem('div', {
12
    innerHTML:
13
      '<table style="width:100%;filter:blur(1px);-webkit-filter:blur(1px);" width=100%><tr><td style="width:50%;" width=50% valign=top>'+
14
      '<div style="color: white">'+
15
      '<div style="background: cyan; width: 30%;">######</div>'+
16
      '##### <br>'+
17
      '### <br>'+
18
      '#####' +
19
      '</div>'+
20
      '******* <br>'+
21
      '****** <br>'+
22
      '********* *** <br>'+
23
      '************** <br>'+
24
      '************* <br>'+
25
      '*******' +
26
      '</td><td style="width:50%;" width=50% valign=top>'+
27
      '<div style="color: white">'+
28
      '.. <br>'+
29
      '###### <br>'+
30
      '##### <br>'+
31
      '### <br>'+
32
      '#####' +
33
      '</div>'+
34
      '******* <br>'+
35
      '****** <br>'+
36
      '********* *** <br>'+
37
      '************** <br>'+
38
      '************* <br>'+
39
      '*******' +
40
      '</td></tr></table>'
41
  }, document.body);
42
43
44
  var progressContainer = base.elem('div', {
45
    position: 'absolute',
  • boot
    • base.d.ts
      declare function getText(element: Element): string;
      declare function getText(fn: Function): string;
      
      declare function setText(element: Element, text: string): void;
      
      declare function elem(tag: string): HTMLElement;
      declare function elem(tag: string, style: {}, parent?: Element): HTMLElement;
      declare function elem(tag: string, parent: Element): HTMLElement;
      declare function elem(elem: HTMLElement, style: {}, parent?: Element): HTMLElement;
      
      
      declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
      declare function on(obj: Window, eventName: string, handler: (evt: Event) => void);
      declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
      declare function off(obj: Window, eventName: string, handler: (evt: Event) => void);
      
      declare function createFrame(): createFrame.LoadedResult;
      
      declare module createFrame {
        export interface LoadedResult {
          global: Window;
          document: Document; 
          iframe: HTMLIFrameElement;
          evalFN(code: string): any;
        }
      }
    • base.ts
      function base(window: Window) {
      
        return {
          getText,
          setText,
          elem,
          on, off,
          createFrame,
          apply
        };
      
        function apply() {
          (<any>window).getText = getText;
          (<any>window).setText = setText;
          (<any>window).elem = elem;
          (<any>window).on = on;
          (<any>window).off = off;
          (<any>window).createFrame = createFrame;
        }
      
        function getText(obj) {
      
          if (typeof obj === 'function') {
            var result = /\/\*(\*(?!\/)|[^*])*\*\//m.exec(obj + '')[0];
            if (result) result = result.slice(2, result.length - 2);
            return result;
          }
          else if (/^SCRIPT$/i.test(obj.tagName)) {
            if ('text' in obj)
              return obj.text;
            else
              return obj.innerHTML;
          }
          else if (/^STYLE$/i.test(obj.tagName)) {
            if ('text' in obj)
              return obj.text;
            else if (obj.styleSheet)
              return obj.styleSheet.cssText;
            else
              return obj.innerHTML;
          }
          else if ('textContent' in obj) {
            return obj.textContent;
          }
          else if (/^INPUT$/i.test(obj.tagName)) {
            return obj.value;
          }
          else {
            var result: string = obj.innerText;
            if (result) {
              // IE fixes
              result = result.replace(/\<BR\s*\>/g, '\n').replace(/\r\n/g, '\n');
            }
            return result || '';
          }
        }
      
        function setText(obj, text) {
      
          if (/^SCRIPT$/i.test(obj.tagName)) {
            if ('text' in obj)
              obj.text = text;
            else
              obj.innerHTML = text;
          }
          else if (/^STYLE$/i.test(obj.tagName)) {
            if ('text' in obj) {
              obj.text = text;
            }
            else if ('styleSheet' in obj) {
              if (!obj.styleSheet && !obj.type) obj.type = 'text/css';
              obj.styleSheet.cssText = text;
            }
            else if ('textContent' in obj) {
              obj.textContent = text;
            }
            else {
              obj.innerHTML = text;
            }
          }
          else if ('textContent' in obj) {
            if ('type' in obj && !obj.type) obj.type = 'text/css';
            obj.textContent = text;
          }
          else if (/^INPUT$/i.test(obj.tagName)) {
            obj.value = text;
          }
          else {
            obj.innerText = text;
          }
        }
      
        function on(obj, eventName, handler) {
          if (obj.addEventListener) {
            obj.addEventListener(eventName, handler, false);
          }
          else if (obj.attachEvent) {
            obj.attachEvent('on' + eventName, handler);
          }
          else {
            obj['on' + eventName] = function(e) { return handler(e || window.event); };
          }
        };
      
        function off(obj, eventName, handler) {
          if (obj.removeEventListener) {
            obj.removeEventListener(eventName, handler, false);
          }
          else if (obj.detachEvent) {
            obj.detachEvent('on' + eventName, handler);
          }
          else {
            if (obj['on' + eventName])
              obj['on' + eventName] = null;
          }
        };
      
        function elem(tag, style, parent) {
          var e = tag.tagName ? tag : window.document.createElement(tag);
      
          if (!parent && style && style.tagName) {
            parent = style;
            style = null;
          }
      
          if (style) {
            if (typeof style === 'string') {
              setText(e, style);
            }
            else {
              for (var k in style) if (style.hasOwnProperty(k)) {
                if (k === 'text') {
                  setText(e, style[k]);
                }
                else if (k === 'className') {
                  e.className = style[k];
                }
                else if (!(e.style && k in e.style) && k in e) {
                  e[k] = style[k];
                }
                else {
      
                  if (style[k] && typeof style[k] === 'object' && typeof style[k].length === 'number') {
                    // array: iterate and apply values
                    var applyValues = style[k];
                    for (var i = 0; i < applyValues.length; i++) {
                      try { e.style[k] = applyValues[i]; }
                      catch (errApplyValues) { }
                    }
                  }
                  else {
                    // not array
                    try {
                      e.style[k] = style[k];
                    }
                    catch (err) {
                      try {
                        if (typeof console !== 'undefined' && typeof console.error === 'function')
                          console.error(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
                      }
                      catch (whatevs) {
                        alert(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
                      }
                    }
                  }
                }
              }
            }
          }
      
          if (parent) {
            try {
              parent.appendChild(e);
            }
            catch (error) {
              throw new Error(error.message + ' adding ' + e.tagName + ' to ' + parent.tagName);
            }
          }
      
          return e;
        }
      
        function createFrame() {
      
          var ifr = elem(
            'iframe',
            {
              position: 'absolute',
              left: 0, top: 0,
              width: '100%', height: '100%',
              border: 'none',
              src: 'about:blank'
            },
            window.document.body);
      
          var ifrwin = ifr.contentWindow || ifr.window;
          var ifrdoc = ifrwin.document;
      
          if (ifrdoc.open) ifrdoc.open();
          ifrdoc.write(
            '<!' + 'doctype html' + '>' +
            '<' + 'html' + '>' +
            '<' + 'head' + '><' + 'style' + '>' +
            'body,html{margin:0;padding:0;border:none;height:100%;border:none;}' +
            '*,*:before,*:after{box-sizing:inherit;}' +
            'html{box-sizing:border-box;}' +
            '</' + 'style' + '>\n' +
      
            '<' + 'body' + '>' +
      
            '<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
      
            // it's important to have body before any long scripts (especialy external),
            // so IFRAME is immediately ready
            '<' + 'body' + '>' +
      
            '</' + 'html' + '>');
          if (ifrdoc.close) ifrdoc.close();
      
          var ifrwin_eval = ifrwin.__eval_export_;
          try {
            delete (<any>ifrwin).__eval_export_;
          }
          catch (weirdIEFailure) {
            // no big deal if it fails
          }
      
          ifrdoc.body.innerHTML = '';
      
          if (window.onerror) {
            ifrwin.onerror = delegate_onerror;
          }
      
          return {
            document: ifrdoc,
            global: ifrwin,
            iframe: ifr,
            evalFN: ifrwin_eval
          };
      
          function delegate_onerror() {
            window.onerror.apply(window, arguments);
          }
      
        }
      
      }
    • bootUI.js
      function bootUI(document, window, base) {
      
        base.elem(document.body, {
          background: 'rgb(3,11,61)',
          color: 'cyan',
          border: 'none',
          overflow: 'hidden',
          fontFamily: 'Segoe UI, Toronto, Helvetica, Roboto, Droid Sans, Sans Serif'
        });
      
        base.elem('div', {
          innerHTML:
          	'<table style="width:100%;filter:blur(1px);-webkit-filter:blur(1px);" width=100%><tr><td style="width:50%;" width=50% valign=top>'+
          	'<div style="color: white">'+
          	'<div style="background: cyan; width: 30%;">######</div>'+
          	'##### <br>'+
          	'### <br>'+
          	'#####' +
          	'</div>'+
          	'******* <br>'+
          	'****** <br>'+
          	'********* *** <br>'+
          	'************** <br>'+
          	'************* <br>'+
          	'*******' +
          	'</td><td style="width:50%;" width=50% valign=top>'+
          	'<div style="color: white">'+
          	'.. <br>'+
          	'###### <br>'+
          	'##### <br>'+
          	'### <br>'+
          	'#####' +
          	'</div>'+
          	'******* <br>'+
          	'****** <br>'+
          	'********* *** <br>'+
          	'************** <br>'+
          	'************* <br>'+
          	'*******' +
          	'</td></tr></table>'
        }, document.body);
      
      
        var progressContainer = base.elem('div', {
          position: 'absolute',
          left: 0, top: 0,
          padding: '4em'
        }, document.body);
      
        var header = base.elem('h2', {
          text: 'Mini portabled shell',
          color: 'white',
          fontWeight: '100',
          fontSize: '400%'
        }, progressContainer);
      
        var smallTitle = base.elem('div', {
          text: 'Loading...',
          opacity: 0.8
        }, progressContainer);
      
        var bootBar = base.elem('div', {
          marginTop: '2em',
          background: 'gold', color: 'gold',
          height: '2px',
          width: '3%',
          fontSize: '10%',
          innerHTML: '&nbsp;'
        }, progressContainer);
      
        var darkBottom = base.elem('div', {
          position: 'absolute',
          bottom: 0,
          width: '100%',
          height: '3em',
          background: 'black'
        }, document.body);
      
        return {
          title: function(t, ratio) {
            setText(smallTitle,t);
            if (typeof console !== 'undefined' && typeof console.log === 'function')
              console.log(t);
            if (ratio) {
              bootBar.style.width = (ratio*100) + '%';
            }
          },
          loaded: function() {
            setText(smallTitle, 'Loaded.');
          }
        };
      }
    • earlyBoot.ts
      function earlyBoot(window: Window) {
      
        base(window).apply();
      
        (<any>window).__boot_times.earlyBootStart = (+new Date());
      
        document.write(
          '<' + 'style' + ' data-legit=mi>' +
          '*{display:none;background:white;color:white;}' +
          'html,body{display:block;}' +
          '</' + 'style' + '>' +
          (document.body ? '' : '<body>'));
      
        elem(document.body, {
          height: '100%',
          margin: 0,
          padding: 0,
          overflow: 'hidden'
        });
        elem(document.body.parentElement, {
          overflow: 'hidden'
        });
      
        var allStyleElements = document.getElementsByTagName('style');
        var addedStyle = allStyleElements[allStyleElements.length - 1];
      
        var bootFrame: any = createFrame();
        bootFrame.iframe.style.zIndex = <any>2000;
        bootFrame.iframe.style.display = 'block';
      
        base(bootFrame.global).apply();
      
        var bootUI = (<any>window).bootUI;
      
        var bootAPI = bootUI(bootFrame.document, bootFrame.global, { elem: (<any>bootFrame.global).elem });
        bootFrame.api = bootAPI;
        bootFrame.earlyStartTime = (<any>window).__boot_times.onerror_start;
        bootFrame.bootStartTime = (<any>window).__boot_times.earlyBootStart;
      
        var uniqueKey = deriveUniqueKey(location);
      
        var shellLoaderInstance = null;
        var shellLoadInterval = setInterval(function() {
          if ((<any>window).shellLoader === 'undefined') return;
          if (!shellLoadInterval) return; // protect against old Opera's super-async habits
          shellLoaderInstance = shellLoaderInstance ? shellLoaderInstance.continueLoading() : (<any>window).shellLoader ? (<any>window).shellLoader(uniqueKey, document, bootFrame) : null;
        }, 1);
      
        window.onload = function() {
      
          clearInterval(shellLoadInterval);
          shellLoadInterval = 0;
      
          removeSpyElements();
          bootFrame.iframe.style.zIndex = <any>1000;
          if (addedStyle.parentElement)
            addedStyle.parentElement.removeChild(addedStyle);
          bootFrame.iframe.style.display = '';
      
          (shellLoaderInstance || (<any>window).shellLoader(uniqueKey, document, bootFrame)).finishLoading();
      
        };
      
        function deriveUniqueKey(locationSeed) {
          var key = (locationSeed + '').split('?')[0].split('#')[0].toLowerCase();
      
          var posIndexTrail = key.search(/\/index\.html$/);
          if (posIndexTrail > 0) key = key.slice(0, posIndexTrail);
      
          if (key.charAt(0) === '/')
            key = key.slice(1);
          if (key.slice(-1) === '/')
            key = key.slice(0, key.length - 1);
      
          return smallHash(key) + '-' + smallHash(key.slice(1) + 'a');
      
          function smallHash(key) {
            for (var h = 0, i = 0; i < key.length; i++) {
              h = Math.pow(31, h + 31 / key.charCodeAt(i));
              h -= h | 0;
            }
            return (h * 2000000000) | 0;
          }
      
        }
      
        function removeSpyElements() {
      
          removeElements('iframe', function(ifr) { return ifr !== bootFrame.iframe; });
          removeElements('style', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
          removeElements('script', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
      
          function removeElements(tagName, predicateToRemove) {
            var list = document.getElementsByTagName(tagName);
            for (var i = 0; i < list.length; i++) {
              var elem = list[i] || list.item(i);
              if (predicateToRemove(elem)) {
                elem.parentElement.removeChild(elem);
                i--;
              }
            }
          }
        }
      
      }
    • onerror.js
      window.__boot_times = window.__boot_times || {};
      window.__boot_times.onerror_start = +new Date();
      
      window.onerror = function onerror() {
      
        var msg = [];
        for (var i = 0; i < arguments.length; i++) {
          var a = arguments[i];
          if (a && (typeof a === 'object')) {
      
            if (a.stack) {
              msg.push(a.stack);
            }
            else {
              var msg1 = [];
              for (var k in a) {
                var r = a[k];
                if (typeof r === 'function' || (typeof r === 'object' && !r)) continue;
                msg1.push(k+':'+r);
              }
              msg.push(msg1.join(', '));
            }
          }
          else {
            msg.push(a===null ? 'null' : a);
          }
      
        }
      
        alert(msg.join('\n'));
      
      }
  • isolation
    • noapi
      • imports
        • base64-js
          • b64.js
            var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
            
            ;(function (exports) {
              'use strict'
            
              var Arr = (typeof Uint8Array !== 'undefined')
                ? Uint8Array
                : Array
            
              var PLUS = '+'.charCodeAt(0)
              var SLASH = '/'.charCodeAt(0)
              var NUMBER = '0'.charCodeAt(0)
              var LOWER = 'a'.charCodeAt(0)
              var UPPER = 'A'.charCodeAt(0)
              var PLUS_URL_SAFE = '-'.charCodeAt(0)
              var SLASH_URL_SAFE = '_'.charCodeAt(0)
            
              function decode (elt) {
                var code = elt.charCodeAt(0)
                if (code === PLUS || code === PLUS_URL_SAFE) return 62 // '+'
                if (code === SLASH || code === SLASH_URL_SAFE) return 63 // '/'
                if (code < NUMBER) return -1 // no match
                if (code < NUMBER + 10) return code - NUMBER + 26 + 26
                if (code < UPPER + 26) return code - UPPER
                if (code < LOWER + 26) return code - LOWER + 26
              }
            
              function b64ToByteArray (b64) {
                var i, j, l, tmp, placeHolders, arr
            
                if (b64.length % 4 > 0) {
                  throw new Error('Invalid string. Length must be a multiple of 4')
                }
            
                // the number of equal signs (place holders)
                // if there are two placeholders, than the two characters before it
                // represent one byte
                // if there is only one, then the three characters before it represent 2 bytes
                // this is just a cheap hack to not do indexOf twice
                var len = b64.length
                placeHolders = b64.charAt(len - 2) === '=' ? 2 : b64.charAt(len - 1) === '=' ? 1 : 0
            
                // base64 is 4/3 + up to two characters of the original data
                arr = new Arr(b64.length * 3 / 4 - placeHolders)
            
                // if there are placeholders, only get up to the last complete 4 chars
                l = placeHolders > 0 ? b64.length - 4 : b64.length
            
                var L = 0
            
                function push (v) {
                  arr[L++] = v
                }
            
                for (i = 0, j = 0; i < l; i += 4, j += 3) {
                  tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
                  push((tmp & 0xFF0000) >> 16)
                  push((tmp & 0xFF00) >> 8)
                  push(tmp & 0xFF)
                }
            
                if (placeHolders === 2) {
                  tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
                  push(tmp & 0xFF)
                } else if (placeHolders === 1) {
                  tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
                  push((tmp >> 8) & 0xFF)
                  push(tmp & 0xFF)
                }
            
                return arr
              }
            
              function uint8ToBase64 (uint8) {
                var i
                var extraBytes = uint8.length % 3 // if we have 1 byte left, pad 2 bytes
                var output = ''
                var temp, length
            
                function encode (num) {
                  return lookup.charAt(num)
                }
            
                function tripletToBase64 (num) {
                  return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
                }
            
                // go through the array every three bytes, we'll deal with trailing stuff later
                for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
                  temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
                  output += tripletToBase64(temp)
                }
            
                // pad the end with zeros, but make sure to not forget the extra bytes
                switch (extraBytes) {
                  case 1:
                    temp = uint8[uint8.length - 1]
                    output += encode(temp >> 2)
                    output += encode((temp << 4) & 0x3F)
                    output += '=='
                    break
                  case 2:
                    temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
                    output += encode(temp >> 10)
                    output += encode((temp >> 4) & 0x3F)
                    output += encode((temp << 2) & 0x3F)
                    output += '='
                    break
                  default:
                    break
                }
            
                return output
              }
            
              exports.toByteArray = b64ToByteArray
              exports.fromByteArray = uint8ToBase64
            }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
            
        • buffer
          • index.js
            /*!
             * The buffer module from node.js, for the browser.
             *
             * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
             * @license  MIT
             */
            
            var base64 = require('base64-js')
            var ieee754 = require('ieee754')
            var isArray = require('is-array')
            
            exports.Buffer = Buffer
            exports.SlowBuffer = SlowBuffer
            exports.INSPECT_MAX_BYTES = 50
            Buffer.poolSize = 8192 // not used by this implementation
            
            var kMaxLength = 0x3fffffff
            var rootParent = {}
            
            /**
             * If `Buffer.TYPED_ARRAY_SUPPORT`:
             *   === true    Use Uint8Array implementation (fastest)
             *   === false   Use Object implementation (most compatible, even IE6)
             *
             * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
             * Opera 11.6+, iOS 4.2+.
             *
             * Note:
             *
             * - Implementation must support adding new properties to `Uint8Array` instances.
             *   Firefox 4-29 lacked support, fixed in Firefox 30+.
             *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
             *
             *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
             *
             *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
             *    incorrect length in some situations.
             *
             * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
             * get the Object implementation, which is slower but will work correctly.
             */
            Buffer.TYPED_ARRAY_SUPPORT = (function () {
              try {
                var buf = new ArrayBuffer(0)
                var arr = new Uint8Array(buf)
                arr.foo = function () { return 42 }
                return arr.foo() === 42 && // typed array instances can be augmented
                    typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
                    new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
              } catch (e) {
                return false
              }
            })()
            
            /**
             * Class: Buffer
             * =============
             *
             * The Buffer constructor returns instances of `Uint8Array` that are augmented
             * with function properties for all the node `Buffer` API functions. We use
             * `Uint8Array` so that square bracket notation works as expected -- it returns
             * a single octet.
             *
             * By augmenting the instances, we can avoid modifying the `Uint8Array`
             * prototype.
             */
            function Buffer (arg) {
              if (!(this instanceof Buffer)) {
                // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
                if (arguments.length > 1) return new Buffer(arg, arguments[1])
                return new Buffer(arg)
              }
            
              this.length = 0
              this.parent = undefined
            
              // Common case.
              if (typeof arg === 'number') {
                return fromNumber(this, arg)
              }
            
              // Slightly less common case.
              if (typeof arg === 'string') {
                return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
              }
            
              // Unusual.
              return fromObject(this, arg)
            }
            
            function fromNumber (that, length) {
              that = allocate(that, length < 0 ? 0 : checked(length) | 0)
              if (!Buffer.TYPED_ARRAY_SUPPORT) {
                for (var i = 0; i < length; i++) {
                  that[i] = 0
                }
              }
              return that
            }
            
            function fromString (that, string, encoding) {
              if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
            
              // Assumption: byteLength() return value is always < kMaxLength.
              var length = byteLength(string, encoding) | 0
              that = allocate(that, length)
            
              that.write(string, encoding)
              return that
            }
            
            function fromObject (that, object) {
              if (Buffer.isBuffer(object)) return fromBuffer(that, object)
            
              if (isArray(object)) return fromArray(that, object)
            
              if (object == null) {
                throw new TypeError('must start with number, buffer, array or string')
              }
            
              if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) {
                return fromTypedArray(that, object)
              }
            
              if (object.length) return fromArrayLike(that, object)
            
              return fromJsonObject(that, object)
            }
            
            function fromBuffer (that, buffer) {
              var length = checked(buffer.length) | 0
              that = allocate(that, length)
              buffer.copy(that, 0, 0, length)
              return that
            }
            
            function fromArray (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            // Duplicate of fromArray() to keep fromArray() monomorphic.
            function fromTypedArray (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              // Truncating the elements is probably not what people expect from typed
              // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
              // of the old Buffer constructor.
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            function fromArrayLike (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
            // Returns a zero-length buffer for inputs that don't conform to the spec.
            function fromJsonObject (that, object) {
              var array
              var length = 0
            
              if (object.type === 'Buffer' && isArray(object.data)) {
                array = object.data
                length = checked(array.length) | 0
              }
              that = allocate(that, length)
            
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            function allocate (that, length) {
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                // Return an augmented `Uint8Array` instance, for best performance
                that = Buffer._augment(new Uint8Array(length))
              } else {
                // Fallback: Return an object instance of the Buffer class
                that.length = length
                that._isBuffer = true
              }
            
              var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
              if (fromPool) that.parent = rootParent
            
              return that
            }
            
            function checked (length) {
              // Note: cannot use `length < kMaxLength` here because that fails when
              // length is NaN (which is otherwise coerced to zero.)
              if (length >= kMaxLength) {
                throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                                     'size: 0x' + kMaxLength.toString(16) + ' bytes')
              }
              return length | 0
            }
            
            function SlowBuffer (subject, encoding) {
              if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
            
              var buf = new Buffer(subject, encoding)
              delete buf.parent
              return buf
            }
            
            Buffer.isBuffer = function isBuffer (b) {
              return !!(b != null && b._isBuffer)
            }
            
            Buffer.compare = function compare (a, b) {
              if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
                throw new TypeError('Arguments must be Buffers')
              }
            
              if (a === b) return 0
            
              var x = a.length
              var y = b.length
            
              var i = 0
              var len = Math.min(x, y)
              while (i < len) {
                if (a[i] !== b[i]) break
            
                ++i
              }
            
              if (i !== len) {
                x = a[i]
                y = b[i]
              }
            
              if (x < y) return -1
              if (y < x) return 1
              return 0
            }
            
            Buffer.isEncoding = function isEncoding (encoding) {
              switch (String(encoding).toLowerCase()) {
                case 'hex':
                case 'utf8':
                case 'utf-8':
                case 'ascii':
                case 'binary':
                case 'base64':
                case 'raw':
                case 'ucs2':
                case 'ucs-2':
                case 'utf16le':
                case 'utf-16le':
                  return true
                default:
                  return false
              }
            }
            
            Buffer.concat = function concat (list, length) {
              if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
            
              if (list.length === 0) {
                return new Buffer(0)
              } else if (list.length === 1) {
                return list[0]
              }
            
              var i
              if (length === undefined) {
                length = 0
                for (i = 0; i < list.length; i++) {
                  length += list[i].length
                }
              }
            
              var buf = new Buffer(length)
              var pos = 0
              for (i = 0; i < list.length; i++) {
                var item = list[i]
                item.copy(buf, pos)
                pos += item.length
              }
              return buf
            }
            
            function byteLength (string, encoding) {
              if (typeof string !== 'string') string = String(string)
            
              if (string.length === 0) return 0
            
              switch (encoding || 'utf8') {
                case 'ascii':
                case 'binary':
                case 'raw':
                  return string.length
                case 'ucs2':
                case 'ucs-2':
                case 'utf16le':
                case 'utf-16le':
                  return string.length * 2
                case 'hex':
                  return string.length >>> 1
                case 'utf8':
                case 'utf-8':
                  return utf8ToBytes(string).length
                case 'base64':
                  return base64ToBytes(string).length
                default:
                  return string.length
              }
            }
            Buffer.byteLength = byteLength
            
            // pre-set for values that may exist in the future
            Buffer.prototype.length = undefined
            Buffer.prototype.parent = undefined
            
            // toString(encoding, start=0, end=buffer.length)
            Buffer.prototype.toString = function toString (encoding, start, end) {
              var loweredCase = false
            
              start = start | 0
              end = end === undefined || end === Infinity ? this.length : end | 0
            
              if (!encoding) encoding = 'utf8'
              if (start < 0) start = 0
              if (end > this.length) end = this.length
              if (end <= start) return ''
            
              while (true) {
                switch (encoding) {
                  case 'hex':
                    return hexSlice(this, start, end)
            
                  case 'utf8':
                  case 'utf-8':
                    return utf8Slice(this, start, end)
            
                  case 'ascii':
                    return asciiSlice(this, start, end)
            
                  case 'binary':
                    return binarySlice(this, start, end)
            
                  case 'base64':
                    return base64Slice(this, start, end)
            
                  case 'ucs2':
                  case 'ucs-2':
                  case 'utf16le':
                  case 'utf-16le':
                    return utf16leSlice(this, start, end)
            
                  default:
                    if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
                    encoding = (encoding + '').toLowerCase()
                    loweredCase = true
                }
              }
            }
            
            Buffer.prototype.equals = function equals (b) {
              if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
              if (this === b) return true
              return Buffer.compare(this, b) === 0
            }
            
            Buffer.prototype.inspect = function inspect () {
              var str = ''
              var max = exports.INSPECT_MAX_BYTES
              if (this.length > 0) {
                str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
                if (this.length > max) str += ' ... '
              }
              return '<Buffer ' + str + '>'
            }
            
            Buffer.prototype.compare = function compare (b) {
              if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
              if (this === b) return 0
              return Buffer.compare(this, b)
            }
            
            Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
              if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
              else if (byteOffset < -0x80000000) byteOffset = -0x80000000
              byteOffset >>= 0
            
              if (this.length === 0) return -1
              if (byteOffset >= this.length) return -1
            
              // Negative offsets start from the end of the buffer
              if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
            
              if (typeof val === 'string') {
                if (val.length === 0) return -1 // special case: looking for empty string always fails
                return String.prototype.indexOf.call(this, val, byteOffset)
              }
              if (Buffer.isBuffer(val)) {
                return arrayIndexOf(this, val, byteOffset)
              }
              if (typeof val === 'number') {
                if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
                  return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
                }
                return arrayIndexOf(this, [ val ], byteOffset)
              }
            
              function arrayIndexOf (arr, val, byteOffset) {
                var foundIndex = -1
                for (var i = 0; byteOffset + i < arr.length; i++) {
                  if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
                    if (foundIndex === -1) foundIndex = i
                    if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
                  } else {
                    foundIndex = -1
                  }
                }
                return -1
              }
            
              throw new TypeError('val must be string, number or Buffer')
            }
            
            // `get` will be removed in Node 0.13+
            Buffer.prototype.get = function get (offset) {
              console.log('.get() is deprecated. Access using array indexes instead.')
              return this.readUInt8(offset)
            }
            
            // `set` will be removed in Node 0.13+
            Buffer.prototype.set = function set (v, offset) {
              console.log('.set() is deprecated. Access using array indexes instead.')
              return this.writeUInt8(v, offset)
            }
            
            function hexWrite (buf, string, offset, length) {
              offset = Number(offset) || 0
              var remaining = buf.length - offset
              if (!length) {
                length = remaining
              } else {
                length = Number(length)
                if (length > remaining) {
                  length = remaining
                }
              }
            
              // must be an even number of digits
              var strLen = string.length
              if (strLen % 2 !== 0) throw new Error('Invalid hex string')
            
              if (length > strLen / 2) {
                length = strLen / 2
              }
              for (var i = 0; i < length; i++) {
                var parsed = parseInt(string.substr(i * 2, 2), 16)
                if (isNaN(parsed)) throw new Error('Invalid hex string')
                buf[offset + i] = parsed
              }
              return i
            }
            
            function utf8Write (buf, string, offset, length) {
              return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
            }
            
            function asciiWrite (buf, string, offset, length) {
              return blitBuffer(asciiToBytes(string), buf, offset, length)
            }
            
            function binaryWrite (buf, string, offset, length) {
              return asciiWrite(buf, string, offset, length)
            }
            
            function base64Write (buf, string, offset, length) {
              return blitBuffer(base64ToBytes(string), buf, offset, length)
            }
            
            function ucs2Write (buf, string, offset, length) {
              return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
            }
            
            Buffer.prototype.write = function write (string, offset, length, encoding) {
              // Buffer#write(string)
              if (offset === undefined) {
                encoding = 'utf8'
                length = this.length
                offset = 0
              // Buffer#write(string, encoding)
              } else if (length === undefined && typeof offset === 'string') {
                encoding = offset
                length = this.length
                offset = 0
              // Buffer#write(string, offset[, length][, encoding])
              } else if (isFinite(offset)) {
                offset = offset | 0
                if (isFinite(length)) {
                  length = length | 0
                  if (encoding === undefined) encoding = 'utf8'
                } else {
                  encoding = length
                  length = undefined
                }
              // legacy write(string, encoding, offset, length) - remove in v0.13
              } else {
                var swap = encoding
                encoding = offset
                offset = length | 0
                length = swap
              }
            
              var remaining = this.length - offset
              if (length === undefined || length > remaining) length = remaining
            
              if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
                throw new RangeError('attempt to write outside buffer bounds')
              }
            
              if (!encoding) encoding = 'utf8'
            
              var loweredCase = false
              for (;;) {
                switch (encoding) {
                  case 'hex':
                    return hexWrite(this, string, offset, length)
            
                  case 'utf8':
                  case 'utf-8':
                    return utf8Write(this, string, offset, length)
            
                  case 'ascii':
                    return asciiWrite(this, string, offset, length)
            
                  case 'binary':
                    return binaryWrite(this, string, offset, length)
            
                  case 'base64':
                    // Warning: maxLength not taken into account in base64Write
                    return base64Write(this, string, offset, length)
            
                  case 'ucs2':
                  case 'ucs-2':
                  case 'utf16le':
                  case 'utf-16le':
                    return ucs2Write(this, string, offset, length)
            
                  default:
                    if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
                    encoding = ('' + encoding).toLowerCase()
                    loweredCase = true
                }
              }
            }
            
            Buffer.prototype.toJSON = function toJSON () {
              return {
                type: 'Buffer',
                data: Array.prototype.slice.call(this._arr || this, 0)
              }
            }
            
            function base64Slice (buf, start, end) {
              if (start === 0 && end === buf.length) {
                return base64.fromByteArray(buf)
              } else {
                return base64.fromByteArray(buf.slice(start, end))
              }
            }
            
            function utf8Slice (buf, start, end) {
              var res = ''
              var tmp = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                if (buf[i] <= 0x7F) {
                  res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
                  tmp = ''
                } else {
                  tmp += '%' + buf[i].toString(16)
                }
              }
            
              return res + decodeUtf8Char(tmp)
            }
            
            function asciiSlice (buf, start, end) {
              var ret = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                ret += String.fromCharCode(buf[i] & 0x7F)
              }
              return ret
            }
            
            function binarySlice (buf, start, end) {
              var ret = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                ret += String.fromCharCode(buf[i])
              }
              return ret
            }
            
            function hexSlice (buf, start, end) {
              var len = buf.length
            
              if (!start || start < 0) start = 0
              if (!end || end < 0 || end > len) end = len
            
              var out = ''
              for (var i = start; i < end; i++) {
                out += toHex(buf[i])
              }
              return out
            }
            
            function utf16leSlice (buf, start, end) {
              var bytes = buf.slice(start, end)
              var res = ''
              for (var i = 0; i < bytes.length; i += 2) {
                res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
              }
              return res
            }
            
            Buffer.prototype.slice = function slice (start, end) {
              var len = this.length
              start = ~~start
              end = end === undefined ? len : ~~end
            
              if (start < 0) {
                start += len
                if (start < 0) start = 0
              } else if (start > len) {
                start = len
              }
            
              if (end < 0) {
                end += len
                if (end < 0) end = 0
              } else if (end > len) {
                end = len
              }
            
              if (end < start) end = start
            
              var newBuf
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                newBuf = Buffer._augment(this.subarray(start, end))
              } else {
                var sliceLen = end - start
                newBuf = new Buffer(sliceLen, undefined)
                for (var i = 0; i < sliceLen; i++) {
                  newBuf[i] = this[i + start]
                }
              }
            
              if (newBuf.length) newBuf.parent = this.parent || this
            
              return newBuf
            }
            
            /*
             * Need to make sure that buffer isn't trying to write out of bounds.
             */
            function checkOffset (offset, ext, length) {
              if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
              if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
            }
            
            Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var val = this[offset]
              var mul = 1
              var i = 0
              while (++i < byteLength && (mul *= 0x100)) {
                val += this[offset + i] * mul
              }
            
              return val
            }
            
            Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) {
                checkOffset(offset, byteLength, this.length)
              }
            
              var val = this[offset + --byteLength]
              var mul = 1
              while (byteLength > 0 && (mul *= 0x100)) {
                val += this[offset + --byteLength] * mul
              }
            
              return val
            }
            
            Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 1, this.length)
              return this[offset]
            }
            
            Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              return this[offset] | (this[offset + 1] << 8)
            }
            
            Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              return (this[offset] << 8) | this[offset + 1]
            }
            
            Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return ((this[offset]) |
                  (this[offset + 1] << 8) |
                  (this[offset + 2] << 16)) +
                  (this[offset + 3] * 0x1000000)
            }
            
            Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset] * 0x1000000) +
                ((this[offset + 1] << 16) |
                (this[offset + 2] << 8) |
                this[offset + 3])
            }
            
            Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var val = this[offset]
              var mul = 1
              var i = 0
              while (++i < byteLength && (mul *= 0x100)) {
                val += this[offset + i] * mul
              }
              mul *= 0x80
            
              if (val >= mul) val -= Math.pow(2, 8 * byteLength)
            
              return val
            }
            
            Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var i = byteLength
              var mul = 1
              var val = this[offset + --i]
              while (i > 0 && (mul *= 0x100)) {
                val += this[offset + --i] * mul
              }
              mul *= 0x80
            
              if (val >= mul) val -= Math.pow(2, 8 * byteLength)
            
              return val
            }
            
            Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 1, this.length)
              if (!(this[offset] & 0x80)) return (this[offset])
              return ((0xff - this[offset] + 1) * -1)
            }
            
            Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              var val = this[offset] | (this[offset + 1] << 8)
              return (val & 0x8000) ? val | 0xFFFF0000 : val
            }
            
            Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              var val = this[offset + 1] | (this[offset] << 8)
              return (val & 0x8000) ? val | 0xFFFF0000 : val
            }
            
            Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset]) |
                (this[offset + 1] << 8) |
                (this[offset + 2] << 16) |
                (this[offset + 3] << 24)
            }
            
            Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset] << 24) |
                (this[offset + 1] << 16) |
                (this[offset + 2] << 8) |
                (this[offset + 3])
            }
            
            Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
              return ieee754.read(this, offset, true, 23, 4)
            }
            
            Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
              return ieee754.read(this, offset, false, 23, 4)
            }
            
            Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 8, this.length)
              return ieee754.read(this, offset, true, 52, 8)
            }
            
            Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 8, this.length)
              return ieee754.read(this, offset, false, 52, 8)
            }
            
            function checkInt (buf, value, offset, ext, max, min) {
              if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
              if (value > max || value < min) throw new RangeError('value is out of bounds')
              if (offset + ext > buf.length) throw new RangeError('index out of range')
            }
            
            Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
            
              var mul = 1
              var i = 0
              this[offset] = value & 0xFF
              while (++i < byteLength && (mul *= 0x100)) {
                this[offset + i] = (value / mul) & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
            
              var i = byteLength - 1
              var mul = 1
              this[offset + i] = value & 0xFF
              while (--i >= 0 && (mul *= 0x100)) {
                this[offset + i] = (value / mul) & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
              if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
              this[offset] = value
              return offset + 1
            }
            
            function objectWriteUInt16 (buf, value, offset, littleEndian) {
              if (value < 0) value = 0xffff + value + 1
              for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
                buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
                  (littleEndian ? i : 1 - i) * 8
              }
            }
            
            Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
              } else {
                objectWriteUInt16(this, value, offset, true)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 8)
                this[offset + 1] = value
              } else {
                objectWriteUInt16(this, value, offset, false)
              }
              return offset + 2
            }
            
            function objectWriteUInt32 (buf, value, offset, littleEndian) {
              if (value < 0) value = 0xffffffff + value + 1
              for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
                buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
              }
            }
            
            Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset + 3] = (value >>> 24)
                this[offset + 2] = (value >>> 16)
                this[offset + 1] = (value >>> 8)
                this[offset] = value
              } else {
                objectWriteUInt32(this, value, offset, true)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 24)
                this[offset + 1] = (value >>> 16)
                this[offset + 2] = (value >>> 8)
                this[offset + 3] = value
              } else {
                objectWriteUInt32(this, value, offset, false)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) {
                var limit = Math.pow(2, 8 * byteLength - 1)
            
                checkInt(this, value, offset, byteLength, limit - 1, -limit)
              }
            
              var i = 0
              var mul = 1
              var sub = value < 0 ? 1 : 0
              this[offset] = value & 0xFF
              while (++i < byteLength && (mul *= 0x100)) {
                this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) {
                var limit = Math.pow(2, 8 * byteLength - 1)
            
                checkInt(this, value, offset, byteLength, limit - 1, -limit)
              }
            
              var i = byteLength - 1
              var mul = 1
              var sub = value < 0 ? 1 : 0
              this[offset + i] = value & 0xFF
              while (--i >= 0 && (mul *= 0x100)) {
                this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
              if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
              if (value < 0) value = 0xff + value + 1
              this[offset] = value
              return offset + 1
            }
            
            Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
              } else {
                objectWriteUInt16(this, value, offset, true)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 8)
                this[offset + 1] = value
              } else {
                objectWriteUInt16(this, value, offset, false)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
                this[offset + 2] = (value >>> 16)
                this[offset + 3] = (value >>> 24)
              } else {
                objectWriteUInt32(this, value, offset, true)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
              if (value < 0) value = 0xffffffff + value + 1
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 24)
                this[offset + 1] = (value >>> 16)
                this[offset + 2] = (value >>> 8)
                this[offset + 3] = value
              } else {
                objectWriteUInt32(this, value, offset, false)
              }
              return offset + 4
            }
            
            function checkIEEE754 (buf, value, offset, ext, max, min) {
              if (value > max || value < min) throw new RangeError('value is out of bounds')
              if (offset + ext > buf.length) throw new RangeError('index out of range')
              if (offset < 0) throw new RangeError('index out of range')
            }
            
            function writeFloat (buf, value, offset, littleEndian, noAssert) {
              if (!noAssert) {
                checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
              }
              ieee754.write(buf, value, offset, littleEndian, 23, 4)
              return offset + 4
            }
            
            Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
              return writeFloat(this, value, offset, true, noAssert)
            }
            
            Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
              return writeFloat(this, value, offset, false, noAssert)
            }
            
            function writeDouble (buf, value, offset, littleEndian, noAssert) {
              if (!noAssert) {
                checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
              }
              ieee754.write(buf, value, offset, littleEndian, 52, 8)
              return offset + 8
            }
            
            Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
              return writeDouble(this, value, offset, true, noAssert)
            }
            
            Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
              return writeDouble(this, value, offset, false, noAssert)
            }
            
            // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
            Buffer.prototype.copy = function copy (target, targetStart, start, end) {
              if (!start) start = 0
              if (!end && end !== 0) end = this.length
              if (targetStart >= target.length) targetStart = target.length
              if (!targetStart) targetStart = 0
              if (end > 0 && end < start) end = start
            
              // Copy 0 bytes; we're done
              if (end === start) return 0
              if (target.length === 0 || this.length === 0) return 0
            
              // Fatal error conditions
              if (targetStart < 0) {
                throw new RangeError('targetStart out of bounds')
              }
              if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
              if (end < 0) throw new RangeError('sourceEnd out of bounds')
            
              // Are we oob?
              if (end > this.length) end = this.length
              if (target.length - targetStart < end - start) {
                end = target.length - targetStart + start
              }
            
              var len = end - start
            
              if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
                for (var i = 0; i < len; i++) {
                  target[i + targetStart] = this[i + start]
                }
              } else {
                target._set(this.subarray(start, start + len), targetStart)
              }
            
              return len
            }
            
            // fill(value, start=0, end=buffer.length)
            Buffer.prototype.fill = function fill (value, start, end) {
              if (!value) value = 0
              if (!start) start = 0
              if (!end) end = this.length
            
              if (end < start) throw new RangeError('end < start')
            
              // Fill 0 bytes; we're done
              if (end === start) return
              if (this.length === 0) return
            
              if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
              if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
            
              var i
              if (typeof value === 'number') {
                for (i = start; i < end; i++) {
                  this[i] = value
                }
              } else {
                var bytes = utf8ToBytes(value.toString())
                var len = bytes.length
                for (i = start; i < end; i++) {
                  this[i] = bytes[i % len]
                }
              }
            
              return this
            }
            
            /**
             * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
             * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
             */
            Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
              if (typeof Uint8Array !== 'undefined') {
                if (Buffer.TYPED_ARRAY_SUPPORT) {
                  return (new Buffer(this)).buffer
                } else {
                  var buf = new Uint8Array(this.length)
                  for (var i = 0, len = buf.length; i < len; i += 1) {
                    buf[i] = this[i]
                  }
                  return buf.buffer
                }
              } else {
                throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
              }
            }
            
            // HELPER FUNCTIONS
            // ================
            
            var BP = Buffer.prototype
            
            /**
             * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
             */
            Buffer._augment = function _augment (arr) {
              arr.constructor = Buffer
              arr._isBuffer = true
            
              // save reference to original Uint8Array set method before overwriting
              arr._set = arr.set
            
              // deprecated, will be removed in node 0.13+
              arr.get = BP.get
              arr.set = BP.set
            
              arr.write = BP.write
              arr.toString = BP.toString
              arr.toLocaleString = BP.toString
              arr.toJSON = BP.toJSON
              arr.equals = BP.equals
              arr.compare = BP.compare
              arr.indexOf = BP.indexOf
              arr.copy = BP.copy
              arr.slice = BP.slice
              arr.readUIntLE = BP.readUIntLE
              arr.readUIntBE = BP.readUIntBE
              arr.readUInt8 = BP.readUInt8
              arr.readUInt16LE = BP.readUInt16LE
              arr.readUInt16BE = BP.readUInt16BE
              arr.readUInt32LE = BP.readUInt32LE
              arr.readUInt32BE = BP.readUInt32BE
              arr.readIntLE = BP.readIntLE
              arr.readIntBE = BP.readIntBE
              arr.readInt8 = BP.readInt8
              arr.readInt16LE = BP.readInt16LE
              arr.readInt16BE = BP.readInt16BE
              arr.readInt32LE = BP.readInt32LE
              arr.readInt32BE = BP.readInt32BE
              arr.readFloatLE = BP.readFloatLE
              arr.readFloatBE = BP.readFloatBE
              arr.readDoubleLE = BP.readDoubleLE
              arr.readDoubleBE = BP.readDoubleBE
              arr.writeUInt8 = BP.writeUInt8
              arr.writeUIntLE = BP.writeUIntLE
              arr.writeUIntBE = BP.writeUIntBE
              arr.writeUInt16LE = BP.writeUInt16LE
              arr.writeUInt16BE = BP.writeUInt16BE
              arr.writeUInt32LE = BP.writeUInt32LE
              arr.writeUInt32BE = BP.writeUInt32BE
              arr.writeIntLE = BP.writeIntLE
              arr.writeIntBE = BP.writeIntBE
              arr.writeInt8 = BP.writeInt8
              arr.writeInt16LE = BP.writeInt16LE
              arr.writeInt16BE = BP.writeInt16BE
              arr.writeInt32LE = BP.writeInt32LE
              arr.writeInt32BE = BP.writeInt32BE
              arr.writeFloatLE = BP.writeFloatLE
              arr.writeFloatBE = BP.writeFloatBE
              arr.writeDoubleLE = BP.writeDoubleLE
              arr.writeDoubleBE = BP.writeDoubleBE
              arr.fill = BP.fill
              arr.inspect = BP.inspect
              arr.toArrayBuffer = BP.toArrayBuffer
            
              return arr
            }
            
            var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g
            
            function base64clean (str) {
              // Node strips out invalid characters like \n and \t from the string, base64-js does not
              str = stringtrim(str).replace(INVALID_BASE64_RE, '')
              // Node converts strings with length < 2 to ''
              if (str.length < 2) return ''
              // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
              while (str.length % 4 !== 0) {
                str = str + '='
              }
              return str
            }
            
            function stringtrim (str) {
              if (str.trim) return str.trim()
              return str.replace(/^\s+|\s+$/g, '')
            }
            
            function toHex (n) {
              if (n < 16) return '0' + n.toString(16)
              return n.toString(16)
            }
            
            function utf8ToBytes (string, units) {
              units = units || Infinity
              var codePoint
              var length = string.length
              var leadSurrogate = null
              var bytes = []
              var i = 0
            
              for (; i < length; i++) {
                codePoint = string.charCodeAt(i)
            
                // is surrogate component
                if (codePoint > 0xD7FF && codePoint < 0xE000) {
                  // last char was a lead
                  if (leadSurrogate) {
                    // 2 leads in a row
                    if (codePoint < 0xDC00) {
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      leadSurrogate = codePoint
                      continue
                    } else {
                      // valid surrogate pair
                      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
                      leadSurrogate = null
                    }
                  } else {
                    // no lead yet
            
                    if (codePoint > 0xDBFF) {
                      // unexpected trail
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      continue
                    } else if (i + 1 === length) {
                      // unpaired lead
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      continue
                    } else {
                      // valid lead
                      leadSurrogate = codePoint
                      continue
                    }
                  }
                } else if (leadSurrogate) {
                  // valid bmp char, but last char was a lead
                  if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                  leadSurrogate = null
                }
            
                // encode utf8
                if (codePoint < 0x80) {
                  if ((units -= 1) < 0) break
                  bytes.push(codePoint)
                } else if (codePoint < 0x800) {
                  if ((units -= 2) < 0) break
                  bytes.push(
                    codePoint >> 0x6 | 0xC0,
                    codePoint & 0x3F | 0x80
                  )
                } else if (codePoint < 0x10000) {
                  if ((units -= 3) < 0) break
                  bytes.push(
                    codePoint >> 0xC | 0xE0,
                    codePoint >> 0x6 & 0x3F | 0x80,
                    codePoint & 0x3F | 0x80
                  )
                } else if (codePoint < 0x200000) {
                  if ((units -= 4) < 0) break
                  bytes.push(
                    codePoint >> 0x12 | 0xF0,
                    codePoint >> 0xC & 0x3F | 0x80,
                    codePoint >> 0x6 & 0x3F | 0x80,
                    codePoint & 0x3F | 0x80
                  )
                } else {
                  throw new Error('Invalid code point')
                }
              }
            
              return bytes
            }
            
            function asciiToBytes (str) {
              var byteArray = []
              for (var i = 0; i < str.length; i++) {
                // Node's code seems to be doing this and not & 0x7F..
                byteArray.push(str.charCodeAt(i) & 0xFF)
              }
              return byteArray
            }
            
            function utf16leToBytes (str, units) {
              var c, hi, lo
              var byteArray = []
              for (var i = 0; i < str.length; i++) {
                if ((units -= 2) < 0) break
            
                c = str.charCodeAt(i)
                hi = c >> 8
                lo = c % 256
                byteArray.push(lo)
                byteArray.push(hi)
              }
            
              return byteArray
            }
            
            function base64ToBytes (str) {
              return base64.toByteArray(base64clean(str))
            }
            
            function blitBuffer (src, dst, offset, length) {
              for (var i = 0; i < length; i++) {
                if ((i + offset >= dst.length) || (i >= src.length)) break
                dst[i + offset] = src[i]
              }
              return i
            }
            
            function decodeUtf8Char (str) {
              try {
                return decodeURIComponent(str)
              } catch (err) {
                return String.fromCharCode(0xFFFD) // UTF 8 invalid char
              }
            }
            
        • ieee754
          • index.js
            exports.read = function (buffer, offset, isLE, mLen, nBytes) {
              var e, m,
                  eLen = nBytes * 8 - mLen - 1,
                  eMax = (1 << eLen) - 1,
                  eBias = eMax >> 1,
                  nBits = -7,
                  i = isLE ? (nBytes - 1) : 0,
                  d = isLE ? -1 : 1,
                  s = buffer[offset + i]
            
              i += d
            
              e = s & ((1 << (-nBits)) - 1)
              s >>= (-nBits)
              nBits += eLen
              for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
            
              m = e & ((1 << (-nBits)) - 1)
              e >>= (-nBits)
              nBits += mLen
              for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
            
              if (e === 0) {
                e = 1 - eBias
              } else if (e === eMax) {
                return m ? NaN : ((s ? -1 : 1) * Infinity)
              } else {
                m = m + Math.pow(2, mLen)
                e = e - eBias
              }
              return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
            }
            
            exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
              var e, m, c,
                  eLen = nBytes * 8 - mLen - 1,
                  eMax = (1 << eLen) - 1,
                  eBias = eMax >> 1,
                  rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
                  i = isLE ? 0 : (nBytes - 1),
                  d = isLE ? 1 : -1,
                  s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
            
              value = Math.abs(value)
            
              if (isNaN(value) || value === Infinity) {
                m = isNaN(value) ? 1 : 0
                e = eMax
              } else {
                e = Math.floor(Math.log(value) / Math.LN2)
                if (value * (c = Math.pow(2, -e)) < 1) {
                  e--
                  c *= 2
                }
                if (e + eBias >= 1) {
                  value += rt / c
                } else {
                  value += rt * Math.pow(2, 1 - eBias)
                }
                if (value * c >= 2) {
                  e++
                  c /= 2
                }
            
                if (e + eBias >= eMax) {
                  m = 0
                  e = eMax
                } else if (e + eBias >= 1) {
                  m = (value * c - 1) * Math.pow(2, mLen)
                  e = e + eBias
                } else {
                  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
                  e = 0
                }
              }
            
              for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
            
              e = (e << mLen) | m
              eLen += mLen
              for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
            
              buffer[offset + i - d] |= s * 128
            }
            
        • is-array
          • index.js
            /**
             * isArray
             */
            
            var isArray = Array.isArray;
            
            /**
             * toString
             */
            
            var str = Object.prototype.toString;
            
            /**
             * Whether or not the given `val`
             * is an array.
             *
             * example:
             *
             *        isArray([]);
             *        // > true
             *        isArray(arguments);
             *        // > false
             *        isArray('');
             *        // > false
             *
             * @param {mixed} val
             * @return {bool}
             */
            
            module.exports = isArray || function (val) {
              return !! val && '[object Array]' == str.call(val);
            };
            
      • apply.ts
        module noapi {
        
          export function apply(
            global: any,
            drive: persistence.Drive,
            options?: {
              argv?: string[];
              cwd?: string;
              env?: any;
            }) {
        
            var apiGlobal = {
              process: <Process>null,
              module: <Module>null
            };
        
            if (!options) options = {};
        
            var cleanOptions = {
              argv: options.argv || ['/node'],
              cwd: options.cwd || '/',
              env: options.env || {}
            };
        
            var coreModules = {
              fs: <FS>null,
              os: <OS>null,
              path: <Path>null
            };
        
            apiGlobal.process = createProcess(coreModules, cleanOptions);
            apiGlobal.module = createModule('repl' /*id*/, null /*filename*/, null /*parent*/, module_require);
        
            coreModules.fs = createFS(drive, coreModules);
            coreModules.os = createOS(apiGlobal);
            coreModules.path = createPath(apiGlobal);
        
            global.process = apiGlobal.process;
            global.module = apiGlobal.module;
            global.require = global_require;
        
            function global_require(moduleName: string) {
              return module_require(moduleName);
            }
        
            function module_require(moduleName: string): any {
              if (coreModules.hasOwnProperty(moduleName)) return coreModules[moduleName];
        
              throw new Error('Cannot find module \'' + moduleName + '\'');
            }
          }
        
          export function nextTick(callback: Function): void {
        
            function fire() {
              if (fired) return;
              fired = true;
              callback();
            }
        
            var fired = false;
            setTimeout(fire, 0);
            if (typeof requestAnimationFrame !== 'undefined') {
              requestAnimationFrame(fire);
            }
            else if (typeof msRequestAnimationFrame !== 'undefined') {
              msRequestAnimationFrame(fire);
            }
        
          }
        
          export function wrapAsync(fn: Function): () => void {
            return function() {
              var args = [];
              for (var i = 0; i < arguments.length - 1; i++) {
                args.push(arguments[i]);
              }
              var callback = arguments[arguments.length - 1];
        
              nextTick(function() {
                try {
                  var result = fn.apply(null, args);
                }
                catch (error) {
                  callback(error);
                }
                callback(null, result);
              });
            }
          }
        
          export function wrapAsyncNoError(fn: Function): () => void {
            return function() {
              var args = [];
              for (var i = 0; i < arguments.length - 1; i++) {
                args.push(arguments[i]);
              }
              var callback = arguments[arguments.length - 1];
        
              nextTick(function() {
                try {
                  var result = fn.apply(null, args);
                }
                catch (error) {
                  callback(error);
                }
                callback(result);
              });
            }
          }
        
        }
      • def.d.ts
        declare module noapi {
        
          export interface RequireFunction {
            (id: string): any;
            resolve(id: string): string;
            cache: any;
            extensions: any;
            main: any;
          }
        
          export interface Global {
            module: Module;
            process: Process;
            require: RequireFunction;
            exports?: any;
            __filename?: string;
            __dirname?: string;
          }
        
          export interface ErrnoError extends Error {
          }
        
          export interface Buffer {
            [index: number]: number;
            write(string: string, offset?: number, length?: number, encoding?: string): number;
            toString(encoding?: string, start?: number, end?: number): string;
            toJSON(): any;
            length: number;
            copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
            slice(start?: number, end?: number): Buffer;
            readUInt8(offset: number, noAsset?: boolean): number;
            readUInt16LE(offset: number, noAssert?: boolean): number;
            readUInt16BE(offset: number, noAssert?: boolean): number;
            readUInt32LE(offset: number, noAssert?: boolean): number;
            readUInt32BE(offset: number, noAssert?: boolean): number;
            readInt8(offset: number, noAssert?: boolean): number;
            readInt16LE(offset: number, noAssert?: boolean): number;
            readInt16BE(offset: number, noAssert?: boolean): number;
            readInt32LE(offset: number, noAssert?: boolean): number;
            readInt32BE(offset: number, noAssert?: boolean): number;
            readFloatLE(offset: number, noAssert?: boolean): number;
            readFloatBE(offset: number, noAssert?: boolean): number;
            readDoubleLE(offset: number, noAssert?: boolean): number;
            readDoubleBE(offset: number, noAssert?: boolean): number;
            writeUInt8(value: number, offset: number, noAssert?: boolean): void;
            writeUInt16LE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt16BE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt32LE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt32BE(value: number, offset: number, noAssert?: boolean): void;
            writeInt8(value: number, offset: number, noAssert?: boolean): void;
            writeInt16LE(value: number, offset: number, noAssert?: boolean): void;
            writeInt16BE(value: number, offset: number, noAssert?: boolean): void;
            writeInt32LE(value: number, offset: number, noAssert?: boolean): void;
            writeInt32BE(value: number, offset: number, noAssert?: boolean): void;
            writeFloatLE(value: number, offset: number, noAssert?: boolean): void;
            writeFloatBE(value: number, offset: number, noAssert?: boolean): void;
            writeDoubleLE(value: number, offset: number, noAssert?: boolean): void;
            writeDoubleBE(value: number, offset: number, noAssert?: boolean): void;
            fill(value: any, offset?: number, end?: number): void;
          }
        
        }
      • events.d.ts
        declare module noapi {
        
          export interface EventEmitter {
            //static listenerCount(emitter: EventEmitter, event: string): number;
        
            addListener(event: string, listener: Function): EventEmitter;
        
            on(event: string, listener: Function): EventEmitter;
        
            once(event: string, listener: Function): EventEmitter;
        
            removeListener(event: string, listener: Function): EventEmitter;
        
            removeAllListeners(event?: string): EventEmitter;
        
            setMaxListeners(n: number): void;
        
            listeners(event: string): Function[];
        
            emit(event: string, ...args: any[]): boolean;
        
          }
        
        }
      • events.ts
        module noapi {
        
          export function createEventEmitter(): EventEmitter {
        
            var _listeners: { [eventKey: string]: Function[]; } = {};
        
            var result = {
              addListener, removeListener, removeAllListeners,
              on, once,
              setMaxListeners,
              listeners,
              emit
            };
            return result;
        
            function addListener(event: string, listener: Function): EventEmitter {
              var key = '*' + event;
              var list = _listeners[key] || (this._listeners[key] = []);
              list.push(listener);
              return result;
            }
        
            function removeListener(event: string, listener: Function): EventEmitter {
              var key = '*' + event;
              var list = _listeners[key];
              if (list) {
                for (var i = 0; i < list.length; i++) {
                  if (list[i] === listener) {
                    list.splice(i, 1);
                    break;
                  }
                }
              }
              return result;
            }
        
            function removeAllListeners(event?: string): EventEmitter {
              var key = '*' + event;
              delete _listeners[key];
              return result;
            }
        
            function setMaxListeners(n: number): void {
              // too complicated for now, ignore
            }
        
            function listeners(event: string): Function[] {
              var key = '*' + event;
              var list = _listeners[key];
              if (list)
                return list.slice(0);
              else
                return [];
            }
        
            function emit(event: string, ...args: any[]): boolean {
              var key = '*' + event;
              var list = _listeners[key];
              if (!list) return false;
              for (var i = 0; i < list.length; i++) {
                var f = list[i];
                f.apply(null, args);
              }
              return true;
            }
        
            function on(event: string, listener: Function): EventEmitter {
              return addListener(event, listener);
            }
        
            function once(event: string, listener: Function): EventEmitter {
              return on(event, listener);
            }
        
          }
        
        }
      • fs.d.ts
        declare module noapi {
        
          export interface FS {
        
            rename(oldPath: string, newPath: string, callback?: (err?: ErrnoError) => void): void;
            renameSync(oldPath: string, newPath: string): void;
        
        
            truncate(path: string, callback?: (err?: ErrnoError) => void): void;
            truncate(path: string, len: number, callback?: (err?: ErrnoError) => void): void;
            truncateSync(path: string, len?: number): void;
        
            ftruncate(fd: number, callback?: (err?: ErrnoError) => void): void;
            ftruncate(fd: number, len: number, callback?: (err?: ErrnoError) => void): void;
            ftruncateSync(fd: number, len?: number): void;
        
        
            chown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            chownSync(path: string, uid: number, gid: number): void;
        
            fchown(fd: number, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            fchownSync(fd: number, uid: number, gid: number): void;
        
            lchown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            lchownSync(path: string, uid: number, gid: number): void;
        
        
            chmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            chmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            chmodSync(path: string, mode: number): void;
            chmodSync(path: string, mode: string): void;
        
            fchmod(fd: number, mode: number, callback?: (err?: ErrnoError) => void): void;
            fchmod(fd: number, mode: string, callback?: (err?: ErrnoError) => void): void;
            fchmodSync(fd: number, mode: number): void;
            fchmodSync(fd: number, mode: string): void;
        
            lchmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            lchmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            lchmodSync(path: string, mode: number): void;
            lchmodSync(path: string, mode: string): void;
        
        
            stat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
            lstat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
            fstat(fd: number, callback?: (err: ErrnoError, stats: Stats) => any): void;
            statSync(path: string): Stats;
            lstatSync(path: string): Stats;
            fstatSync(fd: number): Stats;
        
        
            link(srcpath: string, dstpath: string, callback?: (err?: ErrnoError) => void): void;
            linkSync(srcpath: string, dstpath: string): void;
        
            symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: ErrnoError) => void): void;
            symlinkSync(srcpath: string, dstpath: string, type?: string): void;
        
        
            readlink(path: string, callback?: (err: ErrnoError, linkString: string) => any): void;
            readlinkSync(path: string): string;
        
        
            realpath(path: string, callback?: (err: ErrnoError, resolvedPath: string) => any): void;
            realpath(path: string, cache: { [path: string]: string }, callback: (err: ErrnoError, resolvedPath: string) => any): void;
            realpathSync(path: string, cache?: { [path: string]: string }): string;
        
        
            unlink(path: string, callback?: (err?: ErrnoError) => void): void;
            unlinkSync(path: string): void;
        
        
            rmdir(path: string, callback?: (err?: ErrnoError) => void): void;
            rmdirSync(path: string): void;
        
        
            mkdir(path: string, callback?: (err?: ErrnoError) => void): void;
            mkdir(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            mkdir(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            mkdirSync(path: string, mode?: number): void;
            mkdirSync(path: string, mode?: string): void;
        
        
            readdir(path: string, callback?: (err: ErrnoError, files: string[]) => void): void;
            readdirSync(path: string): string[];
        
        
            close(fd: number, callback?: (err?: ErrnoError) => void): void;
            closeSync(fd: number): void;
        
        
            open(path: string, flags: string, callback?: (err: ErrnoError, fd: number) => any): void;
            open(path: string, flags: string, mode: number, callback?: (err: ErrnoError, fd: number) => any): void;
            open(path: string, flags: string, mode: string, callback?: (err: ErrnoError, fd: number) => any): void;
            openSync(path: string, flags: string, mode?: number): number;
            openSync(path: string, flags: string, mode?: string): number;
        
        
            utimes(path: string, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
            utimes(path: string, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
            utimesSync(path: string, atime: number, mtime: number): void;
            utimesSync(path: string, atime: Date, mtime: Date): void;
        
            futimes(fd: number, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
            futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
            futimesSync(fd: number, atime: number, mtime: number): void;
            futimesSync(fd: number, atime: Date, mtime: Date): void;
        
        
            fsync(fd: number, callback?: (err?: ErrnoError) => void): void;
            fsyncSync(fd: number): void;
        
        
            read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, bytesRead: number, buffer: Buffer) => void): void;
            readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
        
            readFile(filename: string, encoding: string, callback: (err: ErrnoError, data: string) => void): void;
            readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: ErrnoError, data: string) => void): void;
            readFile(filename: string, options: { flag?: string; }, callback: (err: ErrnoError, data: Buffer) => void): void;
            readFile(filename: string, callback: (err: ErrnoError, data: Buffer) => void): void;
            readFileSync(filename: string, encoding: string): string;
            readFileSync(filename: string, options: { encoding: string; flag?: string; }): string;
            readFileSync(filename: string, options?: { flag?: string; }): Buffer;
        
            write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, written: number, buffer: Buffer) => void): void;
            writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
        
            writeFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
            writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
            writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
        
        
            appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            appendFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
            appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
            appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
        
        
            watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void;
            watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void;
        
            unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void;
        
            watch(filename: string, listener?: (event: string, filename: string) => any): Watcher;
            watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): Watcher;
        
        
            exists(path: string, callback?: (exists: boolean) => void): void;
            existsSync(path: string): boolean;
        
        
            createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: number; bufferSize?: number; }): ReadStream;
            createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: string; bufferSize?: number; }): ReadStream;
        
            createWriteStream(path: string, options?: { flags?: string; encoding?: string; string?: string; }): WriteStream;
        
          }
        
          export interface Stats {
            isFile(): boolean;
            isDirectory(): boolean;
            isBlockDevice(): boolean;
            isCharacterDevice(): boolean;
            isSymbolicLink(): boolean;
            isFIFO(): boolean;
            isSocket(): boolean;
            dev: number;
            ino: number;
            mode: number;
            nlink: number;
            uid: number;
            gid: number;
            rdev: number;
            size: number;
            blksize: number;
            blocks: number;
            atime: Date;
            mtime: Date;
            ctime: Date;
          }
        
          export interface Watcher extends EventEmitter {
            close(): void;
          }
        
          export interface ReadStream extends Readable {
            close(): void;
          }
        
          export interface WriteStream extends Writable {
            close(): void;
          }
        
        }
      • fs.ts
        module noapi {
        
          export function createFS(drive: persistence.Drive, modules: { path: Path; }): FS {
        
            var fs: FS = {
        
              renameSync: renameSync,
              rename: wrapAsync(renameSync),
        
              statSync: statSync,
              lstatSync: statSync,
              stat: wrapAsync(statSync),
              lstat: wrapAsync(statSync),
              fstat: null, fstatSync: null, // TODO: implement fstat using fstab
        
        
              existsSync: existsSync,
              exists: wrapAsyncNoError(existsSync),
        
              openSync: openSync,
              open: wrapAsync(openSync),
              close: null, closeSync: null,
              fsync: null, fsyncSync: null,
        
        
        
              readFileSync: readFileSync,
              readFile: wrapAsync(readFileSync),
              createReadStream: null,
        
              writeFileSync: writeFileSync,
              writeFile: wrapAsync(writeFileSync),
              appendFile: null, appendFileSync: null,
              createWriteStream: null,
        
        
              readSync: readSync,
              read: wrapAsync(readSync),
        
              writeSync: writeSync,
              write: wrapAsync(writeSync),
        
        
        
              truncate: null, truncateSync: null,
              ftruncate: null, ftruncateSync: null,
        
              chown: null, chownSync: null,
              fchown: null, fchownSync: null,
              lchown: null, lchownSync: null,
        
              chmod: null, chmodSync: null,
              fchmod: null, fchmodSync: null,
              lchmod: null, lchmodSync: null,
        
              link: null, linkSync: null,
              readlink: null, readlinkSync: null,
        
              symlink: null, symlinkSync: null,
              unlink: null, unlinkSync: null,
        
              realpath: null, realpathSync: null,
        
              mkdir: wrapAsync(mkdirSync), mkdirSync: mkdirSync,
              rmdir: null, rmdirSync: null,
        
              readdir: null, readdirSync: null,
        
              utimes: null, utimesSync: null,
              futimes: null, futimesSync: null,
        
        
              watch: null, watchFile: null, unwatchFile: null
            };
        
            return fs;
        
            function existsSync(file: string): boolean {
              var content = drive.read(file);
              if (content || (content !== null && typeof content === 'undefined'))
                return true;
        
              var files = drive.files();
              var normPath = modules.path.normalize(file);
              if (normPath.slice(-1) !== '/') normPath += '/';
              var leadMatch = getStartMatcher(file);
              for (var i = 0; i < files.length; i++) {
                if (leadMatch(files[i])) return;
              }
        
              return false;
            }
        
            function mkdirSync(path: string, mode?: any): void {
              var normPath = modules.path.normalize(path);
              if (normPath.slice(-1) !== '/') normPath += '/';
        
              if (existsSync(path)) throw new Error('Directory \'' + path + '\'');
        
              drive.write(normPath, '');
            }
        
            function renameSync(oldPath: string, newPath: string): void {
        
              var oldContent = drive.read(oldPath);
              if (oldContent !== null) {
                // TODO: check if directory is in the way
                // if (nofs
                drive.write(newPath, oldContent);
                drive.write(oldPath, null);
                return;
              }
        
              if (drive.read(newPath) !== null) {
                // node actually reports oldPath here, but let's be reasonable
                throw new Error('ENOTDIR, not a directory \'' + newPath + '\'');
              }
        
              var norm_oldPath = modules.path.resolve(oldPath);
              if (norm_oldPath === '/')
                throw new Error('EBUSY, resource busy or locked \'/\'');
              else
                norm_oldPath += '/';
        
              var norm_newPath = modules.path.resolve(newPath);
              if (norm_newPath === '/')
                throw new Error('EBUSY, resource busy or locked \'/\'');
              else
                norm_newPath += '/';
        
        
              var files = drive.files();
        
        
              var startAsOld = getStartMatcher(norm_oldPath);
        
              for (var i = 0; i < files.length; i++) {
                var fi = files[i];
                if (startAsOld(fi)) {
                  var oldContent = drive.read(fi);
                  var restPath = fi.slice(norm_newPath.length);
                  var newFiPath = norm_newPath + restPath;
                  drive.write(newFiPath, oldContent);
                  drive.write(newFiPath, null);
                }
              }
        
            }
        
        
        
            function statSync(path: string): Stats {
              // TODO: implement
              throw new Error('Not implemented');
            }
            /*
              stat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              lstat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              fstat(fd: number, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              statSync(path: string): nofs_Stats;
              lstatSync(path: string): nofs_Stats;
              fstatSync(fd: number): nofs_Stats;
            */
        
        
        
            function readFileSync(filename: string, options?: { encoding?: string; flag?: string; }): any {
        
              // TODO: handle encoding and other
              return drive.read(filename);
        
            }
        
            function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
        
              // TODO: consider also std handles
              //var path = nofs_fdtable()[fd];
        
              throw new Error('Buffer-aware API fs.readSync is not implemented.');
            }
        
        
        
            function writeFileSync(filename: string, content: string) {
        
              drive.write(filename, content);
        
            }
        
        
            function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
        
              if (fd === 1) {
                if (typeof console !== 'undefined')
                  console.log(buffer);
        
                return length;
              }
        
              var path = get_fdtable()[fd];
        
              throw new Error('Buffer-aware API fs.writeSync is not implemented.');
            }
        
        
        
        
            function openSync(path: string, flags: string, mode?: number): number;
            function openSync(path: string, flags: string, mode?: string): number;
            function openSync(path: string, flags?: string, mode?: any): number {
        
              var fdtable = get_fdtable();
        
              for (var fd in fdtable) {
                var fpath = fdtable[fd];
                if (fpath === path) {
                  return Number(fd);
                }
              }
        
              var newFD = _fdbase_++;
              fdtable[newFD] = path;
              return newFD;
            }
        
            var _fdbase_;
            var _fdtable_: string[];
        
            function get_fdtable() {
              if (!_fdtable_) {
                _fdtable_ = [];
                _fdbase_ = 34957346;
              }
              return _fdtable_;
            }
          }
        
        
        
        
        
          function getStartMatcher(oldPath: string) {
        
            if (!oldPath) return (txt: string) => !txt;
        
            return (txt: string) => {
              if (!txt) return false;
              if (txt.length < oldPath.length) return false;
              return txt.slice(0, oldPath.length) === oldPath;
            };
          }
        
        
        }
      • module.d.ts
        declare module noapi {
        
          export interface Module {
            exports: any;
            require(id: string): any;
            id: string;
            filename: string;
            loaded: boolean;
            parent: any;
            children: any[];
          }
        
        }
      • module.ts
        module noapi {
        
          export function createModule(
            id: string,
            filename: string,
            parent: any,
            requireForModule: (moduleName: string) => any): Module {
        
            var module: Module = {
              exports: {},
              id,
              filename,
              loaded: false,
              parent,
              children: [],
              require
            };
        
            return module;
        
            var _moduleCache: any;
            var _resolveCache: any;
        
            function require(moduleName: string): any {
              var key = '*' + moduleName;
              if (_moduleCache && key in _moduleCache)
                return _moduleCache[key];
        
              var mod = requireForModule(moduleName);
              (_moduleCache || (_moduleCache = {}))[key] = mod;
              return mod;
            }
        
          }
        
        }
      • os.d.ts
        declare module noapi {
        
          export interface OS {
            tmpdir(): string;
            hostname(): string;
            type(): string;
            platform(): string;
            arch(): string;
            release(): string;
            uptime(): number;
            loadavg(): number[];
            totalmem(): number;
            freemem(): number;
            cpus(): { model: string; speed: number; times: { user: number; nice: number; sys: number; idle: number; irq?: number; }; }[];
            networkInterfaces(): any;
            EOL: string;
          }
        
        }
      • os.ts
        module noapi {
        
          export function createOS(global: { process: Process; }) {
        
            return {
              EOL: '\n',
              tmpdir: () => '/.tmp',
              hostname: () => 'localhost',
              type: () => 'Linux',
              arch: () => global.process.arch,
              platform: () => global.process.platform,
              release: () => '3.16.0-38-generic',
              uptime: () => global.process.uptime(),
              loadavg: () => [0.7275390625, 0.65576171875, 0.4658203125],
              totalmem: () => 3680739328 + ((Math.random() * 1000) | 0),
              freemem: () => 2344873984 - ((Math.random() * 1000) | 0),
              cpus: () => [
                { model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 8058000, nice: 29600, sys: 1079400, idle: 128185400, irq: 0 } },
                { model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 7779400, nice: 33000, sys: 1069200, idle: 127970900, irq: 0 } }
              ],
              networkInterfaces: () => {
                return {
                  lo: [
                    { address: '127.0.0.1', family: 'IPv4', internal: true },
                    { address: '::1', family: 'IPv6', internal: true }
                  ],
                  wlan0: [
                    { address: '192.168.1.3', family: 'IPv4', internal: false },
                    { address: 'fe80::8256:f2ff:fe04:3d29', family: 'IPv6', internal: false }
                  ]
                }
              }
            };
          }
        
        }
      • path.d.ts
        declare module noapi {
        
          export interface Path {
        
            normalize(p: string): string;
            join(...paths: any[]): string;
            resolve(...pathSegments: any[]): string;
            isAbsolute(p: string): boolean;
            relative(from: string, to: string): string;
            dirname(p: string): string;
            basename(p: string, ext?: string): string;
            extname(p: string): string;
            sep: string;
            delimiter: string;
        
            // new apis? definitely not in v0.10.38
            parse?(p: string): { root: string; dir: string; base: string; ext: string; name: string; };
            format?(pP: { root: string; dir: string; base: string; ext: string; name: string; }): string;
        
          }
        
        }
      • path.ts
        module noapi {
        
          export function createPath(global: { process: Process; }): Path {
        
            var result: Path = {
              basename, extname,
              dirname,
              isAbsolute,
              normalize,
              join,
              relative, resolve,
              sep: '/',
              delimiter: ':'
            };
            return result;
        
            function basename(p: string, ext?: string): string {
        
              p = normalize(p);
              if (p === '/')
                return '';
        
              var result: string;
        
              var lastSlash = p.lastIndexOf('/');
              if (lastSlash === p.length - 1) {
                var prevSlash = p.lastIndexOf('/', lastSlash - 1);
                if (prevSlash < 0)
                  prevSlash = 0;
                result = p.slice(prevSlash + 1, lastSlash);
              }
              else {
                result = p.slice(lastSlash + 1);
              }
        
              if (ext && result.length >= ext.length && result.slice(-ext.length) === ext)
                result = result.slice(0, result.length - ext.length);
            }
        
            function dirname(p: string): string {
              var p = normalize(p);
              if (p === '/') return '/';
              var lastSlash = p.lastIndexOf('/');
              if (lastSlash === p.length - 1)
                lastSlash = p.lastIndexOf('/', lastSlash - 1);
              return p.slice(0, lastSlash + 1);
            }
        
            function isAbsolute(p: string): boolean {
              return /^\//.test(p);
            }
        
            function extname(p: string): string {
        
              var base = basename(p);
              var lastDot = base.lastIndexOf('.');
              if (lastDot >= 0)
                return base.slice(lastDot);
              else
                return '';
        
            }
        
            function normalize(p: string): string {
              return p;
            }
        
            function join(...paths: any[]): string {
              return join_core(paths);
            }
        
            function join_core(paths: any[]): string {
              var parts: string[] = [];
              var trailSlash = false;
              for (var i = 0; i < paths.length; i++) {
                var part = paths[i];
                if (!part) continue;
        
                if (parts.length) {
                  var wlead = part;
                  part = part.replace(/^\/*/, '');
                  if (!part) continue;
                  if (wlead.length > part.length)
                    parts.push('');
                }
                var wtrail = part;
                part = part.replace(/\/*$/, '');
                if (!part) continue;
                parts.push(part);
        
                trailSlash = wtrail.length > part.length;
              }
        
              if (trailSlash)
                parts.push('/');
        
              return parts.join('/');
            }
        
            function relative(from: string, to: string): string {
              throw new Error('path/relative is not implemented');
            }
        
            function resolve(...pathSegments: any[]): string {
        
              var res = join_core(pathSegments);
        
              if (!/^\//.test(res))
                res = global.process.cwd() + res;
        
              return res;
            }
          }
        }
      • process.d.ts
        declare module noapi {
        
          export interface Process extends EventEmitter {
        
            stdout: WritableStream;
            stderr: WritableStream;
            stdin: ReadableStream;
        
            argv: string[];
        
            execPath: string;
        
            abort(): void;
        
            chdir(directory: string): void;
            cwd(): string;
        
            env: any;
        
            exit(code?: number): void;
        
            getgid(): number;
            setgid(id: number): void;
            setgid(id: string): void;
        
            getuid(): number;
            setuid(id: number): void;
            setuid(id: string): void;
        
            version: string;
            versions: {
              http_parser: string;
              node: string;
              v8: string;
              ares: string;
              uv: string;
              zlib: string;
              openssl: string;
            };
        
            config: {
              target_defaults: {
                cflags: any[];
                default_configuration: string;
                defines: string[];
                include_dirs: string[];
                libraries: string[];
              };
              variables: {
                clang?: number;
                host_arch?: string;
                target_arch?: string;
                visibility?: string;
              };
            };
        
            kill(pid: number, signal?: string): void;
        
            pid: number;
        
            title: string;
        
            arch: string;
            platform: string;
        
            memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; };
        
            nextTick(callback: Function): void;
        
            umask(mask?: number): number;
        
            uptime(): number;
            hrtime(time?: number[]): number[];
        
            // Worker
            send?(message: any, sendHandle?: any): void;
          }
        }
      • process.ts
        module noapi {
        
          export function createProcess(
            modules: { fs: FS; path: Path; },
            options: {
              argv: string[];
              cwd: string;
              env: any;
            }): Process {
        
            var evt = createEventEmitter();
        
            return {
              abort, exit, kill,
              nextTick,
              chdir, cwd,
        
              title: 'node',
              arch: 'ia32',
              platform: 'linux',
              execPath: '/usr/bin/nodejs',
        
              getgid, setgid, getuid, setuid,
        
              stdout: load_stdout(), stderr: load_stderr(), stdin: load_stdin(),
        
              memoryUsage,
        
              uptime: load_uptime(),
              hrtime: <any>function() { throw new Error('High resultion time is not implemenetd yet.'); },
        
              pid: load_pid(),
              umask: load_umask(),
              config: load_config(),
              versions: load_versions(),
              version: load_versions().node,
        
              argv: options.argv,
              env: options.env,
        
              addListener: evt.addListener,
              on: evt.on,
              once: evt.once,
              removeListener: evt.removeListener,
              removeAllListeners: evt.removeAllListeners,
              setMaxListeners: evt.setMaxListeners,
              listeners: evt.listeners,
              emit: evt.emit
        
            };
        
            function abort() {
            }
        
            function exit(code?: number) {
            }
        
            function kill(pid: number, signal?: string) {
              // when we emulate processes, implement process termination
            }
        
        
        
        
            function chdir(directory: string) {
              var dirStat = modules.fs.statSync(directory);
        
              if (dirStat && dirStat.isDirectory()) {
                if (directory !== cwd()) {
                  var normDirectory = modules.path.normalize(directory);
                  if (cwd() !== normDirectory) {
                    options.cwd = normDirectory;
                  }
                }
              }
              else {
                // TODO: throw a node-shaped error instead
                throw new Error('ENOENT, no such file or directory');
              }
            }
        
            function cwd(): string {
              return options.cwd;
            }
        
        
        
            function getgid() {
              // taken from node running on ubuntu
              return 1000;
            }
        
            function setgid(id: any) {
              // TODO: use node-shaped error
              throw new Error('EPERM, Operation not permitted');
            }
        
            function getuid(): number {
              // taken from node running on ubuntu
              return 1000;
            }
        
            function setuid(id: any) {
              // TODO: use node-shaped error
              throw new Error('EPERM, Operation not permitted');
            }
        
        
        
            function load_uptime() {
              var _uptime_start_ = typeof Date.now === 'function' ? Date.now() : +(new Date());
              return uptime;
        
              function uptime() {
                var now = typeof Date.now === 'function' ? Date.now() : +(new Date());
                return now - _uptime_start_;
              }
            }
        
        
        
            function load_stdout() {
              return <WritableStream>{
              };
            }
        
            function load_stderr() {
              return <WritableStream>{
              };
            }
        
            function load_stdin() {
              return <ReadableStream>{
              };
            }
        
        
        
            function memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; } {
              return {
                rss: 13225984 + ((Math.random() * 3000) | 0),
                heapTotal: 7130752 + ((Math.random() * 3000) | 0),
                heapUsed: 2449612 + ((Math.random() * 3000) | 0)
              };
            }
        
        
        
            function load_pid() {
              return 32754 + ((Math.random() * 500) | 0);
            }
        
            function load_umask() {
              var _umask_;
              return umask;
        
              function umask(mask?: number): number {
                if (typeof _umask_ !== 'number') {
                  _umask_ = 2;
                }
        
                if (typeof mask === 'number') {
                  var res = _umask_;
                  _umask_ = mask;
                  return res;
                }
        
                return _umask_;
              }
            }
        
            function load_versions() {
              // real node running on ubuntu as of Friday 22 of May 2015
              // (these might not be properly implemented when hosted in browser)
              return {
                http_parser: '1.0',
                node: '0.10.38',
                v8: '3.14.5.9',
                ares: '1.9.0-DEV',
                uv: '0.10.36',
                zlib: '1.2.8',
                modules: '11',
                openssl: '1.0.1m'
              };
            }
        
        
            function load_config() {
              return {
                target_defaults:
                {
                  cflags: [],
                  default_configuration: 'Release',
                  defines: [],
                  include_dirs: [],
                  libraries: []
                },
                variables:
                {
                  clang: 0,
                  gcc_version: 48,
                  host_arch: 'ia32',
                  node_install_npm: true,
                  node_prefix: '/usr',
                  node_shared_cares: false,
                  node_shared_http_parser: false,
                  node_shared_libuv: false,
                  node_shared_openssl: false,
                  node_shared_v8: false,
                  node_shared_zlib: false,
                  node_tag: '',
                  node_unsafe_optimizations: 0,
                  node_use_dtrace: false,
                  node_use_etw: false,
                  node_use_openssl: true,
                  node_use_perfctr: false,
                  node_use_systemtap: false,
                  openssl_no_asm: 0,
                  python: '/usr/bin/python',
                  target_arch: 'ia32',
                  v8_enable_gdbjit: 0,
                  v8_no_strict_aliasing: 1,
                  v8_use_snapshot: false,
                  want_separate_host_toolset: 0
                }
              };
            }
          }
        }
      • stream.d.ts
        declare module noapi {
        
          export interface ReadableStream extends EventEmitter {
            readable: boolean;
            read(size?: number): string|Buffer;
            setEncoding(encoding: string): void;
            pause(): void;
            resume(): void;
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
            unpipe<T extends WritableStream>(destination?: T): void;
            unshift(chunk: string): void;
            unshift(chunk: Buffer): void;
            wrap(oldStream: ReadableStream): ReadableStream;
          }
        
          export interface WritableStream extends EventEmitter {
            writable: boolean;
            write(buffer: Buffer, cb?: Function): boolean;
            write(str: string, cb?: Function): boolean;
            write(str: string, encoding?: string, cb?: Function): boolean;
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void
          }
        
          export interface Stream extends EventEmitter {
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
          }
        
          export interface ReadableOptions {
            highWaterMark?: number;
            encoding?: string;
            objectMode?: boolean;
          }
        
          export interface Readable extends EventEmitter, ReadableStream {
            readable: boolean;
            //constructor(opts?: ReadableOptions)
            _read(size: number): void;
        
            read(size?: number): string|Buffer;
        
            setEncoding(encoding: string): void;
        
            pause(): void;
        
            resume(): void;
        
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
        
            unpipe(destination?: WritableStream): void;
        
            unshift(chunk: string): void;
        
            unshift(chunk: Buffer): void;
        
            wrap(oldStream: ReadableStream): ReadableStream;
        
            push(chunk: any, encoding?: string): boolean;
        
          }
        
          export interface WritableOptions {
            highWaterMark?: number;
            decodeStrings?: boolean;
          }
        
          export interface Writable extends EventEmitter, WritableStream {
            writable: boolean;
            // constructor(opts?: WritableOptions)
        
            _write(data: Buffer, encoding: string, callback: Function): void;
        
            _write(data: string, encoding: string, callback: Function): void;
        
            write(buffer: Buffer, cb?: Function): boolean;
        
            write(str: string, cb?: Function): boolean;
        
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
        
            end(buffer: Buffer, cb?: Function): void;
        
            end(str: string, cb?: Function): void;
        
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        
          export interface DuplexOptions extends ReadableOptions, WritableOptions {
            allowHalfOpen?: boolean;
          }
        
          /**
           * Note: Duplex extends both Readable and Writable.
           */
          export interface Duplex extends Readable {
            writable: boolean;
            // constructor(opts?: DuplexOptions);
        
            _write(data: Buffer, encoding: string, callback: Function);
            _write(data: string, encoding: string, callback: Function): void;
        
            write(buffer: Buffer, cb?: Function);
            write(str: string, cb?: Function);
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        
          export interface TransformOptions extends ReadableOptions, WritableOptions { }
        
          /**
             * Note: Transform lacks the _read and _write methods of Readable/Writable.
             */
          interface Transform extends EventEmitter {
            readable: boolean;
            writable: boolean;
            // constructor(opts?: TransformOptions)
        
            _transform(chunk: Buffer, encoding: string, callback: Function): void;
            _transform(chunk: string, encoding: string, callback: Function): void;
        
            _flush(callback: Function): void;
        
            read(size?: number): any;
        
            setEncoding(encoding: string): void;
        
            pause(): void;
        
            resume(): void;
        
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
        
            unpipe(destination?: WritableStream): void;
        
            unshift(chunk: string): void;
        
            unshift(chunk: Buffer): void;
        
            wrap(oldStream: ReadableStream): ReadableStream;
        
            push(chunk: any, encoding?: string): boolean;
        
            write(buffer: Buffer, cb?: Function): boolean;
            write(str: string, cb?: Function): boolean;
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        }
    • nobrowser
      • overrideLocalStorage.ts
        module nobrowser {
        
          export function overrideLocalStorage() {
          }
        }
      • overrideXMLHttpRequest.ts
        module nobrowser {
        
          export function overrideXMLHttpRequest(readCache: (url: string, callback: (content: string) => void) => void) {
        
            return XMLHttpRequestOverride;
        
            // urlBase - 'https://rawgit.com/jeffpar/pcjs/master'
        
        
            class XMLHttpRequestOverride {
        
              private _url: string = null;
        
              status = 0;
              readyState = 0;
              responseText = null;
              onreadystatechange: () => void = null;
        
              open(method: string, url: string) {
                this._url = url;
              }
        
              send() {
                var completed = false;
                this.readyState = 0;
                readCache(this._url, content => {
                  this.status = 200;
                  this.readyState = 4;
                  this.responseText = content;
                  if (completed)
                    this.onreadystatechange();
                  return;
                });
        
                if (this.readyState === 4) {
                  setTimeout(() => this.onreadystatechange(), 1);
                }
        
        
              }
        
              setRequestHeader() {
              }
        
            }
          }
        
        }
    • Context.ts
      module isolation {
      
        export class Context {
      
          private _frame;
          private _obscureScope: any = {};
      
          constructor(private _window: Window) {
            this._frame = createFrame(this._window);
            defineObscureScope(this._obscureScope, this._frame.global);
            defineObscureScope(this._obscureScope, this._frame.window);
            this._obscureScope.global = void 0;
            var setGlobal = this._frame.evalFN('(function() { return function(global) { window.global = global; }; })()');
            setGlobal(this._obscureScope);
          }
      
          run(code: string, path: string, scope: any) {
            path = path || typeof path === 'string' ? path : createTimebasedPath();
            this._obscureScope.global = scope || {};
            var decoratedCode =
              'with(window.global){with(global){   ' + code +
              '\n }}  //# sourceURL=' + path;
            var result = this._frame.evalFN(decoratedCode);
            this._obscureScope.global = null;
            return result;
          }
      
          dispose() {
            document.body.removeChild(this._frame.iframe);
          }
      
        }
      
        function createTimebasedPath() {
          var now = new Date();
          var path = now.getFullYear() +
            (now.getMonth() + 1 > 9 ? '' : '0') + now.getMonth() +
            (now.getDate() > 9 ? '' : '0') + now.getDate() + '-' +
            (now.getHours() > 9 ? '' : '0') + now.getHours() +
            (now.getMinutes() > 9 ? '' : '0') + now.getMinutes() + '-' +
            (now.getSeconds() > 9 ? '' : '0') + now.getSeconds() +
            '.' + ((now.getMilliseconds() | 0) + 1000).toString().slice(1) +
            '.js';
          return path;
        }
      
        function createFrame(window: Window) {
          var ifr = window.document.createElement('iframe');
          ifr.style.display = 'none';
          window.document.body.appendChild(ifr);
      
          var ifrwin: Window = ifr.contentWindow || (<any>ifr).window;
          var ifrdoc = ifrwin.document;
      
          if (ifrdoc.open) ifrdoc.open();
          ifrdoc.write(
            '<!' + 'doctype html' + '>' +
            '<' + 'html' + '><' + 'body' + '>' +
            '<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
            '<' + 'body' + '></' + 'html' + '>');
          if (ifrdoc.close) ifrdoc.close();
      
          var ifrwin_eval: typeof eval = (<any>ifrwin).__eval_export_;
          try {
            delete (<any>ifrwin).__eval_export_;
          }
          catch (weirdIEFailure) {
            // no big deal if it fails
          }
      
          ifrdoc.body.innerHTML = '';
      
          return {
            document: ifrdoc,
            window: ifrwin,
            global: ifrwin_eval('this'),
            iframe: ifr,
            evalFN: ifrwin_eval
          };
        }
      
        function defineObscureScope(scope: any, pollutedGlobal: any) {
      
          var natives = defineAllowedNatives();
      
          var dummy;
      
          // normal properties
          for (var k in pollutedGlobal) {
            if (scope[k] || natives[k]) continue;
            scope[k] = dummy;
          }
      
          // non-enumerable properties directly on global
          if (Object.getOwnPropertyNames) {
            var props = Object.getOwnPropertyNames(pollutedGlobal);
            for (var i = 0; i < props.length; i++) {
              if (scope[props[i]] || natives[props[i]]) continue;
              scope[props[i]] = dummy;
            }
      
            // non-enumerable properties on global's prototype
            if (pollutedGlobal.constructor
              && pollutedGlobal.constructor.prototype
              && pollutedGlobal.constructor.prototype !== Object.prototype) {
              props = Object.getOwnPropertyNames(pollutedGlobal.constructor.prototype);
              for (var i = 0; i < props.length; i++) {
                if (scope[props[i]] || natives[props[i]]) continue;
                scope[props[i]] = dummy;
              }
            }
          }
        }
      
        var allowedNatives = null;
      
        function defineAllowedNatives() {
          return {
            setTimeout: 1, setInterval: 1, clearTimeout: 1, clearInterval: 1,
            eval: 1,
            console: 1,
            undefined: 1,
            Object: 1, Array: 1, Date: 1, Function: 1, String: 1, Boolean: 1, Number: 1,
            Infinity: 1, NaN: 1, isNaN: 1, isFinite: 1, parseInt: 1, parseFloat: 1,
            escape: 1, unescape: 1,
      
            Int32Array: 1, Int8Array: 1, Int16Array: 1,
            UInt32Array: 1, UInt8Array: 1, UInt8ClampedArray: 1, UInt16Array: 1,
            Float32Array: 1, Float64Array: 1, ArrayBuffer: 1,
      
            Math: 1, JSON: 1, RegExp: 1,
            Error: 1, SyntaxError: 1, EvalError: 1, RangeError: 1, ReferenceError: 1,
      
            toString: 1, toJSON: 1, toValue: 1,
      
            Map: 1, Promise: 1
          };
        }
      }
  • load
    • shellLoader.ts
      declare var showCommanderInContext;
      
      function shellLoader(uniqueKey: string, document: Document, boot: shellLoader.BootModuleAPI): shellLoader.ContinueLoading {
      
        var driveMount = persistence.bootMount(uniqueKey, document);
      
        return continueLoading();
      
        function continueLoading(): shellLoader.ContinueLoading {
          driveMount = driveMount.continueLoading();
      
          boot.api.title('Loading files: ' + progressText('dom'), 0.05 + 0.8* driveMount.loadedSize/driveMount.totalSize);
          return { continueLoading, finishLoading };
        }
      
        var timings;
        var prevStage;
        var prevStageStart;
        var prevTimeText;
        function progressText(stage) {
      
          var fileText = driveMount.loadedFileCount + ' (' + driveMount.totalSize + ' total)';
      
          var now = +new Date();
      
          if (!prevStage) {
            timings = [
              {stage: 'boot ui', time: boot.bootStartTime - boot.earlyStartTime}
            ];
            prevTimeText = ' boot UI ' + (boot.bootStartTime - boot.earlyStartTime) + 'ms init ' + (now - boot.bootStartTime) + 'ms';
            prevStageStart = boot.bootStartTime;
            prevStage = stage;
            return fileText + prevTimeText;
          }
          else if (prevStage !== stage) {
            timings.push({
              stage: prevStage,
              time: now-prevStageStart
            });
            prevTimeText += ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
            prevStageStart = now;
            prevStage = stage;
            return fileText + prevTimeText;
          }
          else {
            return fileText + prevTimeText + ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
          }
      
        }
      
        function finishLoading() {
      
          boot.api.title('Loading modifications: ' + progressText('local'), 0.85);
          driveMount.finishLoading(drive => {
      
            boot.api.title('Loading application: ' + progressText('ui-init'), 0.9);
      
            var uiframe = createFrame();
            uiframe.iframe.style.opacity = '0';
            uiframe.iframe.style.filter = 'alpha(opacity=0)';
            var uiframeBase = (<any>window).base(uiframe.global);
            uiframeBase.apply();
      
            var wasResized = false;
            var resizeHandlers: any[] = [];
            on(window, 'resize', global_resize_detect);
            on(document.body, 'resize', global_resize_detect);
            on(uiframe.document.body, 'touchstart', global_resize_detect);
            on(uiframe.document.body, 'touchmove', global_resize_detect);
            on(uiframe.document.body, 'touchend', global_resize_detect);
            on(uiframe.document.body, 'pointerdown', global_resize_detect);
            on(uiframe.document.body, 'pointerup', global_resize_detect);
            on(uiframe.document.body, 'pointerout', global_resize_detect);
            on(uiframe.document.body, 'keydown', global_resize_detect);
            on(uiframe.document.body, 'keyup', global_resize_detect);
      
      
            (<any>uiframe.global).require = shell_require;
            boot.api.title('Loaded: ' + progressText('ui'), 0.95);
      
            try {
              showCommanderInContext(drive, uiframe.global, uiframe.document, shell_require);
            }
            catch (error) {
              alert('Shell initialisation failed ' + error.message+'\n'+error.stack+'\n'+error);
            }
      
            boot.api.title('Completed: ' + progressText('ui'), 0.99);
      
            function shell_require(moduleName): any {
              switch (moduleName) {
                case 'window': return window;
                case 'document': return document;
                case 'ui': return uiframe;
                case 'drive': return drive;
                case 'resize': return { on: onresize, off: offresize };
                case 'timings': return timings;
              }
              throw new Error('Module ' + moduleName + ' is not supported.');
            }
      
            function onresize(handler) {
              if (typeof handler !== 'function') return;
              resizeHandlers.push(handler);
            }
      
            function offresize(handler) {
              if (typeof handler !== 'function') return;
              for (var i = 0; i < resizeHandlers.length; i++) {
                if (resizeHandlers[i] === handler) {
                  resizeHandlers.splice(i, 1);
                }
              }
            }
      
            function global_resize_detect() {
              if (wasResized) return;
              wasResized = true;
      
              if (typeof requestAnimationFrame === 'function') {
                requestAnimationFrame(global_resize_delayed);
              }
              else {
                setTimeout(global_resize_delayed, 5);
              }
            }
      
            var lastMetrics: any = {};
            function global_resize_delayed() {
              wasResized = false;
      
              var metrics = getMetrics();
              if (metrics.windowWidth !== lastMetrics.windowWidth
                && metrics.windowHeight !== lastMetrics.windowHeight) {
                lastMetrics = metrics;
      
                for (var i = 0; i < resizeHandlers.length; i++) {
                  var f = resizeHandlers[i];
                  if (f)
                    f(metrics);
                }
              }
            }
      
            function getMetrics() {
              var metrics = {
                windowWidth: window.innerWidth || document.body.parentElement.clientWidth || document.body.clientWidth,
                windowHeight: window.innerHeight || document.body.parentElement.clientHeight || document.body.clientHeight
              };
              return metrics;
            }
      
            var start = new Date().valueOf();
            var fadeintTime = Math.min(500, ((+new Date()) - boot.bootStartTime) * 0.9);
            var animateFadeIn = setInterval(function() {
              var passed = new Date().valueOf() - start;
              var opacity = Math.min(passed, fadeintTime) / fadeintTime;
              boot.iframe.style.opacity = (1 - opacity).toString();
              if (uiframe.iframe.style.filter)
              	boot.iframe.style.filter = 'alpha(opacity=' + ((opacity * 100) | 0) + ')';
              uiframe.iframe.style.opacity = '1';
      
              uiframe.iframe.style.filter = 'alpha(opacity=100)';
      
              if (passed >= fadeintTime) {
                clearInterval(animateFadeIn);
                if (boot.iframe.parentElement) // old Opera may keep firing even after clearInterval
                  boot.iframe.parentElement.removeChild(boot.iframe);
              }
            }, 10);
      
            //if (typeof console !== 'undefined' && console.log)
            //  console.log(window['dbgDrive'] = drive);
      
          });
      
        }
      
      }
      
      module shellLoader {
      
        export interface BootModuleAPI extends createFrame.LoadedResult {
          api?: any;
          earlyStartTime?: number;
          bootStartTime?: number;
        }
      
        export interface ContinueLoading {
      
          continueLoading(): ContinueLoading;
      
          finishLoading();
      
        }
      
      }
  • pcjs
    • devices
      • modules
        • diskdump
          • bin
            • diskdump
              #!/usr/bin/env node
              /**
               * @fileoverview Implements the DiskDump command-line interface
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              var path = require("path");
              var fs = require("fs");
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              require(lib + "diskdump.js").CLI();
              
          • lib
            • diskdump.js
              /**
               * @fileoverview Converts disk images to/from JSON
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-02-01
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               * See http://en.wikipedia.org/wiki/Design_of_the_FAT_file_system for more information.
               */
              
              "use strict";
              
              var fs      = require("fs");
              var path    = require("path");
              var http    = require("http");
              var mkdirp  = require("mkdirp");
              var crypto  = require("crypto");
              var net     = require("../../shared/lib/netlib");
              var proc    = require("../../shared/lib/proclib");
              var str     = require("../../shared/lib/strlib");
              var usr     = require("../../shared/lib/usrlib");
              var DiskAPI = require("../../shared/lib/diskapi");
              var DumpAPI = require("../../shared/lib/dumpapi");
              var X86     = require("../../pcjs/lib/x86");
              
              /**
               * @class exports
               * @property {string} name
               * @property {string} version
               */
              var pkg = require("../../../package.json");
              
              /*
               * fConsole controls console messages; it is false by default but is enable by the CLI interface.
               */
              var fConsole = false;
              
              /*
               * fDebug controls debug console messages; it is false by default but can be enabled from the command-line
               * using "--debug".
               */
              var fDebug = false;
              
              /*
               * logFile is passed from the web server through HTMLOut to us, allowing us to "mingle" our logConsole()
               * output with the server's log (typically "./logs/node.log").
               */
              var logFile = null;
              
              /*
               * fNormalize attempts to enforce consistency across multiple dump requests, including the order of files within every
               * directory, the use of hard-coded volume label timestamps, etc.  And since I assume that normalization is a wonderful
               * thing, I don't provide any UI for turning it off.
               */
              var fNormalize = true;
              
              /**
               * DiskDump()
               *
               * TODO: Honor the caller's mbHD size. At the moment, any hard disk build request translates to 10Mb,
               * since we rely on a "canned" BPB in aDefaultBPBs.
               *
               * TODO: If sServerRoot is set, make sure the final sDiskPath refers to something in either /apps/ or /disks/,
               * to prevent random enumeration of other server resources.
               *
               * @constructor
               * @param {string|Array} sDiskPath
               * @param {Array|null} [asExclude] contains filename exclusions, if any
               * @param {string} [sFormat] is the output format, one of "json"|"data"|"hex"|"bytes"|"img"
               * @param {boolean|string} [fComments] enables comments and other readability enhancements in the JSON output
               * @param {string} [mbHD] specifies a hard disk size, in megabytes, when building a new image
               * @param {string|null} [sServerRoot]
               * @param {string} [sManifestFile]
               * @param {Object} [argv] optional (experimental) arguments, if any
               */
              function DiskDump(sDiskPath, asExclude, sFormat, fComments, mbHD, sServerRoot, sManifestFile, argv)
              {
                  /*
                   * I used to set this.sServerRoot to "sServerRoot || process.cwd()", but in reality, the
                   * server (httpapi.js) always passes the web server's root directory; when called from the
                   * command-line, sServerRoot is a bit of a misnomer: it's basically blank if sDiskPath begins
                   * with a slash, and process.cwd() otherwise.
                   */
                  this.sServerRoot = sServerRoot;
                  this.sDiskPath = (net.isRemote(sDiskPath)? sDiskPath : path.join(this.sServerRoot, sDiskPath));
                  this.asExclude = asExclude || DiskDump.asExclusions;
                  this.mbHD = mbHD? parseInt(mbHD, 10) : 0;
                  this.sFormat = (sFormat || DumpAPI.FORMAT.JSON);
                  this.fJSONNative = (this.sFormat == DumpAPI.FORMAT.JSON && !fComments);
                  this.nJSONIndent = 0;
                  this.fJSONComments = fComments;
                  this.sJSONWhitespace = (this.fJSONComments? " " : "");
                  this.fXDFSupport = (argv && argv['xdf']);
              
                  /*
                   * The dump operation itself doesn't care about sManifestFile, but we DO need some indication
                   * of whether MD5 checksums need to be computed for the individual files, so we use the filename
                   * as that indication.
                   */
                  this.sManifestFile = sManifestFile;
              
                  /*
                   * If we have to enumerate one or more files during the buildImage() process, this array
                   * will save them, in case the caller wants to query that information later, in updateManifest().
                   *
                   * Originally, I thought each saved entry would be a subset of what the fileInfo objects contain,
                   * but it turns out I pretty much need everything.  This, in turn, means that some of the original
                   * buildImage() functions could simply use this.aManifestInfo, instead of their own aFiles array,
                   * but sometimes they're using aFiles of subdirectories, so it's not quite that simple.
                   */
                  this.aManifestInfo = [];
              
                  /*
                   * bufDisk is set by buildImage() (or by loadFile() if the file is NOT a ".json" file; otherwise
                   * loadFile() loads the file as string data and stores it in jsonDisk).
                   *
                   * In those cases where bufDisk is set, the caller must call convertToJSON() to obtain JSON, which
                   * will simply return jsonDisk if it was already set by loadFile() OR if it was already created by
                   * a previous convertToJSON() call.
                   *
                   * In those cases where jsonDisk is set, the caller must call convertToIMG() to obtain an IMG file.
                   * Since that function relies on dataDisk, it first calls JSON.parse() to convert jsonDisk to dataDisk,
                   * and then it builds bufDisk from dataDisk; if a previous call already created dataDisk and/or bufDisk,
                   * the previous values are used/returned.
                   *
                   * dataDisk is a native data object built by convertToJSON() and convertToIMG() as needed.  In the
                   * first case, it's used to create JSON using JSON.stringify(), but only if fJSONNative is set (ie,
                   * the caller explicitly specifies FORMAT_JSON); that probably should be the default setting, but it
                   * wasn't an option in the original PHP code, so I added it as an option here in order to compare the
                   * output of both methods.  fJSONNative still isn't an option for converting OSI disk images to JSON
                   * (and it may never be, as those images aren't very common).
                   */
                  this.bufDisk = null;
                  this.jsonDisk = "";
                  this.dataDisk = undefined;
              }
              
              /**
               * setLogFile(file)
               *
               * @param {Object} file
               */
              DiskDump.setLogFile = function(file) {
                  logFile = file;
              };
              
              /*
               * Class constants
               */
              DiskDump.sAPIURL = "http://www.pcjs.org" + DumpAPI.ENDPOINT;
              DiskDump.sCopyright = "© 2012-2015 by Jeff Parsons (@jeffpar)";
              DiskDump.sNotice = DiskDump.sAPIURL + " " + DiskDump.sCopyright;
              DiskDump.sUsage = "Usage: " + DiskDump.sAPIURL + "?" + DumpAPI.QUERY.PATH + "={url}&amp;" + DumpAPI.QUERY.FORMAT + "=json|data|hex|bytes|img";
              
              /*
               * MY_VOL_LABEL is our default label, used whenever a more suitable label (eg, the disk image's folder name)
               * is not available or not supplied, and MY_OEM_STRING is inserted into any DiskDump-generated diskette images.
               */
              DiskDump.MY_VOL_LABEL = "PCJSDISK";
              DiskDump.MY_OEM_STRING = "PCJS.ORG";
              
              /**
               * The BPBs that buildImage() currently supports; these BPBs should be in order of smallest to largest capacity,
               * to help ensure we don't select a disk format larger than necessary.
               *
               * TODO: For now, the code that chooses a default BPB is starting with #1 instead of #0, because Windows 95 (at least
               * when running under VMware) fails to read the contents of such disks correctly.  Whether that's my fault or Windows 95's
               * fault is still TBD (although it's probably mine -- perhaps 160Kb diskettes aren't supposed to have BPBs?)  The simple
               * work-around is to avoid creating 160Kb diskette images.
               */
              DiskDump.aDefaultBPBs = [
                [                             // define BPB for 160Kb diskette
                  0xEB, 0xFE, 0x90,           // 0x00: JMP instruction, following by 8-byte OEM signature
                  0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47,     // MY_OEM_STRING
               // 0x49, 0x42, 0x4D, 0x20, 0x20, 0x31, 0x2E, 0x30,     // "IBM  1.0" (this is a fake OEM signature)
                  0x00, 0x02,                 // 0x0B: bytes per sector (0x200 or 512)
                  0x01,                       // 0x0D: sectors per cluster (1)
                  0x01, 0x00,                 // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
                  0x02,                       // 0x10: FAT copies (2)
                  0x40, 0x00,                 // 0x11: root directory entries (0x40 or 64)  0x40 * 0x20 = 0x800 (1 sector is 0x200 bytes, total of 4 sectors)
                  0x40, 0x01,                 // 0x13: number of sectors (0x140 or 320)
                  0xFE,                       // 0x15: media type (eg, 0xFF: 320Kb, 0xFE: 160Kb, 0xFD: 360Kb, 0xFC: 180Kb)
                  0x01, 0x00,                 // 0x16: sectors per FAT (1)
                  0x08, 0x00,                 // 0x18: sectors per track (8)
                  0x01, 0x00,                 // 0x1A: number of heads (2)
                  0x00, 0x00, 0x00, 0x00      // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
                ],
                [                             // define BPB for 360Kb diskette
                  0xEB, 0xFE, 0x90,           // 0x00: JMP instruction, following by 8-byte OEM signature
                  0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47,     // MY_OEM_STRING
               // 0x49, 0x42, 0x4D, 0x20, 0x20, 0x32, 0x2E, 0x30,     // "IBM  2.0" (this is a real OEM signature)
                  0x00, 0x02,                 // 0x0B: bytes per sector (0x200 or 512)
                  0x02,                       // 0x0D: sectors per cluster (2)
                  0x01, 0x00,                 // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
                  0x02,                       // 0x10: FAT copies (2)
                  0x70, 0x00,                 // 0x11: root directory entries (0x70 or 112)  0x70 * 0x20 = 0xE00 (1 sector is 0x200 bytes, total of 7 sectors)
                  0xD0, 0x02,                 // 0x13: number of sectors (0x2D0 or 720)
                  0xFD,                       // 0x15: media type (eg, 0xFF: 320Kb, 0xFE: 160Kb, 0xFD: 360Kb, 0xFC: 180Kb)
                  0x02, 0x00,                 // 0x16: sectors per FAT (2)
                  0x09, 0x00,                 // 0x18: sectors per track (9)
                  0x02, 0x00,                 // 0x1A: number of heads (2)
                  0x00, 0x00, 0x00, 0x00      // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
                ],
                [                             // define BPB for 1.2Mb diskette
                  0xEB, 0xFE, 0x90,           // 0x00: JMP instruction, following by 8-byte OEM signature
                  0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47,     // MY_OEM_STRING
               // 0x49, 0x42, 0x4D, 0x20, 0x31, 0x30, 0x2E, 0x31,     // "10.0" (which I believe was used on IBM OS/2 1.0 diskettes)
                  0x00, 0x02,                 // 0x0B: bytes per sector (0x200 or 512)
                  0x01,                       // 0x0D: sectors per cluster (1)
                  0x01, 0x00,                 // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
                  0x02,                       // 0x10: FAT copies (2)
                  0xE0, 0x00,                 // 0x11: root directory entries (0xe0 or 224)  0xe0 * 0x20 = 0x1c00 (1 sector is 0x200 bytes, total of 14 sectors)
                  0x60, 0x09,                 // 0x13: number of sectors (0x960 or 2400)
                  0xF9,                       // 0x15: media type (0xF9 was used for 1228800-byte diskettes, and later for 737280-byte diskettes)
                  0x07, 0x00,                 // 0x16: sectors per FAT (7)
                  0x0f, 0x00,                 // 0x18: sectors per track (15)
                  0x02, 0x00,                 // 0x1A: number of heads (2)
                  0x00, 0x00, 0x00, 0x00      // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
                ],
                [                             // define BPB for 1.44Mb diskette
                  0xEB, 0xFE, 0x90,           // 0x00: JMP instruction, following by 8-byte OEM signature
                  0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47,     // MY_OEM_STRING
               // 0x4d, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30,     // "MSDOS5.0" (an actual OEM signature, arbitrarily chosen for use here)
                  0x00, 0x02,                 // 0x0B: bytes per sector (0x200 or 512)
                  0x01,                       // 0x0D: sectors per cluster (1)
                  0x01, 0x00,                 // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
                  0x02,                       // 0x10: FAT copies (2)
                  0xE0, 0x00,                 // 0x11: root directory entries (0xe0 or 224)  0xe0 * 0x20 = 0x1c00 (1 sector is 0x200 bytes, total of 14 sectors)
                  0x40, 0x0B,                 // 0x13: number of sectors (0xb40 or 2880)
                  0xF0,                       // 0x15: media type (0xF0 was used for 1474560-byte diskettes)
                  0x09, 0x00,                 // 0x16: sectors per FAT (9)
                  0x12, 0x00,                 // 0x18: sectors per track (18)
                  0x02, 0x00,                 // 0x1A: number of heads (2)
                  0x00, 0x00, 0x00, 0x00      // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
                ],
                [                             // define BPB for 10Mb hard disk
                  0xEB, 0xFE, 0x90,           // 0x00: JMP instruction, following by 8-byte OEM signature
                  0x50, 0x43, 0x4A, 0x53, 0x2E, 0x4F, 0x52, 0x47,     // MY_OEM_STRING
               // 0x49, 0x42, 0x4D, 0x20, 0x20, 0x32, 0x2E, 0x30,     // "IBM  2.0" (this is a real OEM signature)
                  0x00, 0x02,                 // 0x0B: bytes per sector (0x200 or 512)
                  0x08,                       // 0x0D: sectors per cluster (8)
                  0x01, 0x00,                 // 0x0E: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (1)
                  0x02,                       // 0x10: FAT copies (2)
                  0x00, 0x02,                 // 0x11: root directory entries (0x200 or 512)  0x200 * 0x20 = 0x4000 (1 sector is 0x200 bytes, total of 0x20 or 32 sectors)
                  0x03, 0x51,                 // 0x13: number of sectors (0x5103 or 20739; * 512 bytes/sector = 10,618,368 bytes = 10,369Kb = 10Mb)
                  0xF8,                       // 0x15: media type (eg, 0xF8: hard disk w/FAT12)
                  0x08, 0x00,                 // 0x16: sectors per FAT (8)
                  // Wikipedia (http://en.wikipedia.org/wiki/File_Allocation_Table#BIOS_Parameter_Block) implies everything past this point was introduced
                  // post-DOS 2.0.  I think that's wrong, because I just formatted a diskette with PC-DOS 2.0 and it properly initialized the next 3 fields as well.
                  0x11, 0x00,                 // 0x18: sectors per track (17)
                  0x04, 0x00,                 // 0x1A: number of heads (4)
                  // PC-DOS 2.0 actually stored 0x01, 0x00, 0x80, 0x00 here, so you can't always assume that anything past offset 0x1E is part of the BPB;
                  // requires further investigation.
                  0x01, 0x00, 0x00, 0x00      // 0x1C: number of hidden sectors (always 0 for non-partitioned media)
                ]
              ];
              
              DiskDump.asExclusions = [".*", ".IMG"];
              DiskDump.asTextFileExts = [".MD", ".ME", ".ASM", ".BAS", ".TXT", ".XML"];
              
              /*
               * Class methods
               */
              
              /**
               * CLI()
               *
               * Provides the command-line interface for the diskdump module.
               *
               * Usage
               * ---
               *      diskdump --dir={directory} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
               *      diskdump --disk={disk image} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
               *      diskdump --path={file[;file]...} [--format=json|data|hex|bytes|img] [--comments] [--output={file}]
               *
               *      NOTE: --img is permitted as an alias for --disk
               *
               * Arguments
               * ---
               *      The default format is "json", which generates an array of signed 32-bit decimal values; "hex" is an older
               *      text format that consists entirely of 2-character hex values (deprecated), and "bytes" is a JSON-like format
               *      that also uses hex values (but with "0x" prefixes) and is normally used only when comments are enabled.
               *
               *      Note that command-line arguments, if any, are not validated.  For example, argv['comments'] may be any of
               *      boolean, string, or undefined, since the user may have typed "--comments" or "--comments=foo" or nothing at all.
               *
               *      Additional command-line arguments include:
               *
               *          --mbhd={number}: requests a hard disk image with the given number of megabytes (eg, 10 for a 10mb image)
               *          --exclude={filename}: specifies a filename that should be excluded from the image; repeat as often as needed
               *          --overwrite: allows the --output option to overwrite an existing file; default is to NOT overwrite
               *          --manifest[={filename}]: update the specified manifest.xml file with details about the disk image
               *          --xdf: enable support for XDF-formatted disk images (experimental)
               *
               * Examples
               * ---
               *      node modules/diskdump/bin/diskdump --disk=../jsmachines/disks/pc/games/infocom/zork1/zork1.dsk
               *      node modules/diskdump/bin/diskdump --dir=./apps/pc/1981/visicalc/ --format=img --output=./apps/pc/1981/visicalc/disk.img
               *      node modules/diskdump/bin/diskdump --path=./apps/pc/1981/visicalc/bin/vc.com;../README.md --format=json --output=./apps/pc/1981/visicalc/disk.json
               */
              DiskDump.CLI = function()
              {
                  var err = null;
                  var args = proc.getArgs();
              
                  fConsole = true;
              
                  if (args.argc) {
                      var argv = args.argv;
              
                      if (argv['debug'] !== undefined) fDebug = argv['debug'];
              
                      if (fDebug) {
                          DiskDump.logConsole("cwd: " + process.cwd());
                          DiskDump.logConsole("args: " + JSON.stringify(argv));
                      }
              
                      var sDiskPath = null, sServerRoot = "";
                      var sDir = argv['dir'], sDisk = (argv['disk'] || argv['img']), sPath = argv['path'];
              
                      if (typeof sDir == "string") {
                          sDiskPath = sDir;
                      }
                      else if (typeof sDisk == "string") {
                          sDiskPath = sDisk;
                      }
                      else if (typeof sPath == "string") {
                          sDiskPath = sPath;
                      }
                      if (sDiskPath && sDiskPath.charAt(0) != '/') sServerRoot = process.cwd();
              
                      var asExclude = argv['exclude'];
                      if (asExclude && typeof asExclude == "string") asExclude = [asExclude];
              
                      /*
                       * Create some sensible defaults for --manifest and --output when no values are specified
                       */
                      var sManifestFile = argv['manifest'];
                      if (typeof sManifestFile == "boolean") {
                          sManifestFile = "manifest.xml";
                      }
                      if (sManifestFile && sManifestFile.charAt(0) != '/') {
                          sManifestFile = path.join(process.cwd(), sManifestFile);
                      }
              
                      var sOutput = "";
                      var sOutputFile = argv['output'];
                      if (typeof sOutputFile == "string" && !str.endsWith(sOutputFile, ".img") && !str.endsWith(sOutputFile, ".json")) {
                          sOutput = sOutputFile;
                          sOutputFile = true;
                      }
                      if (typeof sOutputFile == "boolean") {
                          if (sDir || sDisk) {
                              sOutput = path.join(sOutput, path.basename(sDir || sDisk));
                              var i = sOutput.lastIndexOf('.');
                              if (i > 0) {
                                  var sExt = sOutput.substr(i);
                                  if (sExt == ".img" || sExt == ".json") sOutput = sOutput.substr(0, i);
                              }
                          } else {
                              sOutput = "disk";
                          }
                          sOutputFile = sOutput + '.' + argv['format'];
                      }
                      if (sOutputFile && sOutputFile.charAt(0) != '/') sOutputFile = path.join(process.cwd(), sOutputFile);
              
                      var fOverwrite = argv['overwrite'];
                      var sManifestTitle = argv['title'];
              
                      if (sDiskPath) {
                          var disk = new DiskDump(sDiskPath, asExclude, argv['format'], argv['comments'], argv['mbhd'], sServerRoot, sManifestFile, argv);
                          if (sDir) {
                              disk.buildImage(true, function(err) {
                                  DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
                              });
                          }
                          else if (sDisk) {
                              disk.loadFile(function(err) {
                                  DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
                              });
                          }
                          else if (sPath) {
                              disk.buildImage(false, function(err) {
                                  DiskDump.outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle);
                              });
                          }
                      } else {
                          err = new Error("no dir|disk|path specified");
                      }
                  }
                  else {
                      DiskDump.logConsole("usage: diskdump --dir={dir}|--disk={disk}|--path={file}[;{file}...] [--format=json|data|hex|bytes|img] [--comments] [--output={file}] [--manifest={file}] [--xdf]");
                  }
              
                  if (err) {
                      DiskDump.logError(err);
                      process.exit(1);
                  }
              };
              
              /**
               * outputDisk(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle)
               *
               * @param {Error} err
               * @param {DiskDump} disk
               * @param {string} sDiskPath
               * @param {string} sOutputFile
               * @param {boolean} fOverwrite
               * @param {string} [sManifestTitle]
               */
              DiskDump.outputDisk = function(err, disk, sDiskPath, sOutputFile, fOverwrite, sManifestTitle)
              {
                  if (!err) {
                      /*
                       * The caller may have built an image (or loaded an IMG file), in which case
                       * bufDisk will be set (otherwise, jsonDisk will be set).  We then look for pending
                       * conversions: if a disk image was built/loaded, but the requested format was not,
                       * call convertToJSON().  Similarly, if bufDisk is not set and a raw image was
                       * requested, call convertToIMG().
                       */
                      var data = disk.bufDisk;
                      if (data) {
                          if (disk.sFormat != DumpAPI.FORMAT.IMG) {
                              data = disk.convertToJSON();
                          }
                      } else {
                          if (disk.sFormat == DumpAPI.FORMAT.IMG) {
                              data = disk.convertToIMG();
                          }
                      }
                      if (data) {
              
                          var cbDisk = (disk.bufDisk? disk.bufDisk.length : data.length);
              
                          if (sOutputFile) {
              
                              var fUnchanged;
                              var md5Disk = null, md5JSON = null;
                              if (disk.sManifestFile) {
                                  if (typeof data == "string") {
                                      md5JSON = crypto.createHash('md5').update(data).digest('hex');
                                  }
                                  if (disk.bufDisk) {
                                      md5Disk = crypto.createHash('md5').update(disk.bufDisk).digest('hex');
                                  }
                                  fUnchanged = DiskDump.updateManifest(disk, disk.sManifestFile, sDiskPath, sOutputFile, true, sManifestTitle, md5Disk, md5JSON);
                              }
              
                              try {
                                  if (fUnchanged) {
                                      DiskDump.logConsole(sOutputFile + " unchanged");
                                  } else {
                                      if (fs.existsSync(sOutputFile) && !fOverwrite) {
                                          DiskDump.logConsole(sOutputFile + " exists, use --overwrite to rewrite");
                                      } else {
                                          var sDirName = path.dirname(sOutputFile);
                                          if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
                                          fs.writeFileSync(sOutputFile, data);
                                          DiskDump.logConsole(cbDisk + "-byte disk image saved to " + sOutputFile);
                                      }
                                  }
                              } catch(e) {
                                  err = e;
                              }
                          } else {
                              /*
                               * We'll dump JSON to the console, but not a raw disk buffer; we could add an option to
                               * "stringify" buffers, but if that's what the caller wants, they should use "--format=json".
                               */
                              if (typeof data == "string") {
                                  DiskDump.logConsole(data);
                              } else {
                                  DiskDump.logConsole("specify --output={file} to save " + cbDisk + "-byte disk image");
                              }
                          }
                      } else {
                          err = new Error("unable to convert " + disk.sDiskPath);
                      }
                  }
              
                  if (err) {
                      DiskDump.logError(err);
                      process.exit(1);
                  }
              };
              
              /**
               * getManifestAttr(sID, sTag)
               *
               * @param sID
               * @param sTag
               * @return {string|null}
               */
              DiskDump.getManifestAttr = function(sID, sTag)
              {
                  var match = sTag.match(new RegExp(sID + '="([^"]*)"'));
                  if (match) return match[1];
                  return null;
              };
              
              /**
               * updateManifest(disk, sManifestFile, sDiskPath, sOutputFile, fOverwrite, sTitle, md5Disk, md5JSON)
               *
               * This function reports a change if EITHER the md5Disk value does not match the original
               * "md5" value recorded in the manifest OR the manifest itself has changed.  If md5JSON is
               * also provided, we require that to match as well.
               *
               * Since this function is for command-line use only, we use *Sync functions, so that we can
               * return the results immediately.
               *
               * @param {DiskDump} disk
               * @param {string} sManifestFile
               * @param {string} sDiskPath
               * @param {string} sOutputFile
               * @param {boolean} fOverwrite
               * @param {string} [sTitle]
               * @param {string} [md5Disk] for the entire disk image
               * @param {string} [md5JSON] for the entire JSON-encoded disk image, if any
               * @return {boolean|undefined} true if disk has changed, false if not, undefined if unknown
               */
              DiskDump.updateManifest = function(disk, sManifestFile, sDiskPath, sOutputFile, fOverwrite, sTitle, md5Disk, md5JSON)
              {
                  var i, fUnchanged, fExists = false, sXML, err = null;
                  var sMatchDisk = null, sIDDisk = null, sMD5Disk = null, sMD5JSON = null;
              
                  try {
                      sXML = fs.readFileSync(sManifestFile, {encoding: "utf8"});
                      fExists = true;
                  } catch(e) {
                      var sPrefix = "";
                      if (!sTitle) {
                          sTitle = str.getBaseName(disk.sDiskPath);
                          if (sTitle) {
                              sTitle = sTitle.charAt(0).toUpperCase() + sTitle.substr(1);
                          }
                      }
                      if (sTitle) {
                          i = sTitle.indexOf(':');
                          if (i > 0) sPrefix = ' prefix="' + sTitle.substr(0, i) + '"';
                      }
                      sXML = '<?xml version="1.0" encoding="UTF-8"?>\n';
                      sXML += '<?xml-stylesheet type="text/xsl" href="/versions/pcjs/' + pkg.version + '/manifest.xsl"?>\n';
                      sXML += '<manifest type="software">\n';
                      sXML += '\t<title' + sPrefix + '>' + sTitle + '</title>\n';
                      sXML += '</manifest>';
                  }
              
                  i = sOutputFile.indexOf("/disks/");
                  if (i > 0) {
                      sOutputFile = sOutputFile.substr(i);
                  } else {
                      i = sOutputFile.indexOf("/apps/");
                      if (i > 0) {
                          sOutputFile = sOutputFile.substr(i);
                      }
                  }
              
                  var match = sXML.match(new RegExp('[ \t]*<disk ([^>]*href="' + sOutputFile + '"[^>]*?)(>[\\s\\S]*?</disk>|/>)[ \t]*\n?'));
                  if (match) {
                      sMatchDisk = match[0];
                      sIDDisk = DiskDump.getManifestAttr("id", match[1]);
                      sMD5Disk = DiskDump.getManifestAttr("md5", match[1]);
                      sMD5JSON = DiskDump.getManifestAttr("md5json", match[1]);
                  }
              
                  if (!sIDDisk) {
                      for (i = 1; i < 1000; i++) {
                          sIDDisk = i.toString();
                          if (sIDDisk.length < 2) sIDDisk = '0' + sIDDisk;
                          sIDDisk = "disk" + sIDDisk;
                          if (sXML.indexOf(' id="' + sIDDisk + '"') < 0) break;
                      }
                      if (i == 1000) {
                          err = new Error("manifest already contains " + i + " disks");
                      }
                  }
              
                  if (!err) {
                      /*
                       * Thanks to buildImage(), fDir is true if a "dir" parameter was provided, false if a "path" parameter was provided,
                       * and undefined otherwise, which implies a "disk" parameter (or no parameter at all -- in which case, why are we even here?)
                       */
                      var sParm = null;
                      if (disk.fDir === true) {
                          sParm = "dir";
                      } else if (disk.fDir === undefined) {
                          sParm = "img";
                      }
              
                      /*
                       * Build a "size" attribute with the total disk size in bytes and a "chs" attribute that describes the disk geometry; eg:
                       *
                       *      size="368640" chs="40:2:9"
                       */
                      var size = 0, sCHS = "";
                      if (disk.dataDisk) {
                          sCHS = disk.dataDisk.length + ':' + disk.dataDisk[0].length + ':' + disk.dataDisk[0][0].length;
                          size = disk.dataDisk.length * disk.dataDisk[0].length * disk.dataDisk[0][0].length * disk.dataDisk[0][0][0].length;
                      }
                      var sXMLDisk = '\t<disk id="' + sIDDisk + '"' + (size? ' size="' + size + '"' : '') + (sCHS? ' chs="' + sCHS + '"' : '') + (sParm? ' ' + sParm + '="' + sDiskPath + '"' : '') + ' href="' + sOutputFile + '"' + (md5Disk? ' md5="' + md5Disk + '"' : '') + (md5JSON? ' md5json="' + md5JSON + '"' : '') + '>\n';
              
                      var sName = "";
                      if (sMatchDisk && (match = sMatchDisk.match(/<name>([^>]*)<\/name>/))) {
                          sName = match[1];
                      }
                      if (!sName && sXML.indexOf("\n\t<name>") < 0) {
                          sName = str.getBaseName(sOutputFile, true).toUpperCase();
                      }
                      if (sName) {
                          sXMLDisk += '\t\t<name>' + sName + '</name>\n';
                      }
                      if (sMatchDisk && (match = sMatchDisk.match(/<from [^>]*?\/>/))) {
                          sXMLDisk += '\t\t' + match[0] + '\n';
                      }
                      var sBaseDir = null;
                      for (i = 0; i < disk.aManifestInfo.length; i++) {
                          var sAttrs = "";
                          var fileInfo = disk.aManifestInfo[i];
                          if (fileInfo.FILE_SIZE < 0) continue;       // ignore non-file entries
                          var sDir = path.dirname(fileInfo.FILE_PATH) + '/';
                          if (sBaseDir === null) sBaseDir = sDir;
                          sAttrs += ' size="' + fileInfo.FILE_SIZE + '"';
                          sAttrs += ' time="' + usr.formatDate("Y-m-d H:i:s", fileInfo.FILE_TIME) + '"';
                          sAttrs += ' attr="0x' + fileInfo.FILE_ATTR.toString(16) + '"';
                          if (fileInfo.FILE_MD5) sAttrs += ' md5="' + fileInfo.FILE_MD5 + '"';
                          if (!sDir.indexOf(sBaseDir)) {
                              sDir = sDir.substr(sBaseDir.length);
                              if (sDir) {
                                  sAttrs += ' dir="' + sDir + '"';
                              }
                          }
                          sXMLDisk += '\t\t<file' + sAttrs + '>' + fileInfo.FILE_NAME + '</file>\n';
                      }
                      sXMLDisk += '\t</disk>\n';
                      sXMLDisk = sXMLDisk.replace(/(<disk[^>]*)>\s*<\/disk>/, "$1/>");
                      if (!sMatchDisk) {
                          sMatchDisk = '</manifest>';
                          sXMLDisk += sMatchDisk;
                      }
                      if (sMatchDisk != sXMLDisk) {
                          fUnchanged = false;
                          sXML = sXML.replace(sMatchDisk, sXMLDisk);
                          if (fOverwrite || !fExists) {
                              try {
                                  fs.writeFileSync(sManifestFile, sXML);
                                  DiskDump.logConsole(sManifestFile + " updated");
                              } catch(e) {
                                  err = e;
                              }
                          } else {
                              DiskDump.logConsole(sManifestFile + " exists, use --overwrite to rewrite");
                              if (fDebug) DiskDump.logConsole(sXML);
                          }
                      } else {
                          DiskDump.logConsole(sManifestFile + " unchanged");
                          fUnchanged = (!md5Disk || !sMD5Disk || (md5Disk == sMD5Disk && (!md5JSON || md5JSON == sMD5JSON)));
                      }
                  }
              
                  DiskDump.logError(err);
                  return fUnchanged;
              };
              
              /**
               * logConsole(s)
               *
               * @param {string} s
               * @return {string}
               */
              DiskDump.logConsole = function(s)
              {
                  if (fConsole) console.log(s);
                  if (logFile) logFile.write(s + "\n");
                  return s;
              };
              
              /**
               * logError(err)
               *
               * Conditionally logs an error to the console
               *
               * @param {Error} err
               * @return {string} the error message that was logged (or that would have been logged had logging been enabled)
               */
              DiskDump.logError = function(err)
              {
                  var sError = "";
                  if (err) {
                      sError = "diskdump error: " + err.message;
                      DiskDump.logConsole(sError);
                  }
                  return sError;
              };
              
              /**
               * logWarning(s)
               *
               * Conditionally logs a warning to the console
               *
               * @param {string} s
               * @return {string} the warning message that was logged (or that would have been logged had logging been enabled)
               */
              DiskDump.logWarning = function(s)
              {
                  var sWarning = "";
                  if (s) {
                      sWarning = "diskdump warning: " + s;
                      DiskDump.logConsole(sWarning);
                  }
                  return sWarning;
              };
              
              
              /**
               * getStat(sPath, done)
               *
               * An alternative to fs.stat() that handles supported remote files, in addition to local files
               *
               * @param {string} sPath
               * @param {function(Error,Object)} done
               */
              DiskDump.getStat = function(sPath, done)
              {
                  net.isRemote(sPath)? net.getStat(sPath, done) : fs.stat(sPath, done);   // jshint ignore:line
              };
              
              /**
               * readFile(sPath, sEncoding, done)
               *
               * An alternative to fs.readFile() that handles supported remote files, in addition to local files
               *
               * @param {string} sPath
               * @param {string|null} sEncoding
               * @param {function(Error,Buffer|string)} done
               */
              DiskDump.readFile = function(sPath, sEncoding, done)
              {
                  if (net.isRemote(sPath)) {
                      /*
                       * Just a quick verification that the getStat() function works...
                       *
                       net.getStat(sPath, function(err, stats) {
                          if (!err) {
                              DiskDump.logConsole(stats);
                          } else {
                              DiskDump.logError(err);
                          }
                      });
                       */
                      net.getFile(sPath, sEncoding, function doneReadFileRemote(err, status, buf) {
                          done(err, buf);
                      });
                  } else {
                      fs.readFile(sPath, {encoding: sEncoding}, function doneReadFileLocal(err, buf) {
                          done(err, buf);
                      });
                  }
              };
              
              /*
               * Object methods
               */
              
              /**
               * isExcluded(sName)
               *
               * @this {DiskDump}
               * @param {string} sName is the basename of a file under consideration
               * @return {boolean} is true if the file should be excluded, false if not
               */
              DiskDump.prototype.isExcluded = function(sName)
              {
                  sName = sName.toUpperCase();
                  for (var i = 0; i < this.asExclude.length; i++) {
                      var sExclude = this.asExclude[i].toUpperCase();
                      if (sName == sExclude) return true;
                      if (sExclude.charAt(0) == '.') {
                          if (sExclude.charAt(1) == '*') {
                              if (sName.charAt(0) == '.') return true;
                          } else {
                              if (str.endsWith(sName, sExclude)) return true;
                          }
                      }
                  }
                  return false;
              };
              
              /**
               * loadFile(done)
               *
               * This used to be part of the DiskDump constructor, but I felt it would be safer to separate
               * object creation from any I/O that the object may perform, to ensure that a callback can never
               * be called before the caller has actually received the newly created object.
               *
               * @this {DiskDump}
               * @param {function(Error)} done
               */
              DiskDump.prototype.loadFile = function(done)
              {
                  /*
                   * When the 'encoding' property of the 'options' object is null (or the 'options'
                   * object is omitted altogether), the callback's 2nd parameter will be a Buffer object
                   * rather than a String.
                   */
                  var obj = this;
                  var sEncoding = null;
                  if (this.sDiskPath.slice(-5) == ".json") sEncoding = "utf8";
                  DiskDump.readFile(this.sDiskPath, sEncoding, function doneLoadFile(err, buf) {
                      obj.setData(err, buf, done);
                  });
              };
              
              /**
               * setData(err, buf, done)
               *
               * Records the loaded disk data buffer
               *
               * @this {DiskDump}
               * @param {Error} err
               * @param {Buffer|string} buf
               * @param {function(Error)} done
               */
              DiskDump.prototype.setData = function(err, buf, done)
              {
                  if (err) {
                      DiskDump.logError(err);  // DiskDump.logConsole("unable to read " + this.sDiskPath);
                      done(err);
                      return;
                  }
                  /*
                   * Record the disk data buffer, and then notify the caller
                   */
                  if (typeof buf == "string") {
                      this.jsonDisk = buf;
                      /*
                       * The following code is non-essential, but it's handy for forcing existing JSON to be
                       * regenerated; here, we assume that it's unlikely any JSON stored on the server was stored
                       * with comments, so if the caller has requested comments, we immediately convert the
                       * JSON to a Buffer and throw the JSON away.  The next convertToJSON() call will take care
                       * of the rest.
                       *
                       * We could also move this functionality into its own function, or wait until the
                       * caller actually calls convertToJSON() -- although if the caller inadvertently calls
                       * convertToJSON() multiple times, you don't want to be regenerating the JSON every time.
                       */
                      if (this.fJSONComments) {
                          if (this.convertToIMG()) {
                              /*
                               * Since convertToIMG() succeeded, we can safely blow away jsonDisk.
                               */
                              this.jsonDisk = null;
                          }
                      }
                  } else {
                      this.bufDisk = buf;
                  }
                  done(null);
              };
              
              /**
               * dumpLine(nIndent, sLine, sComment)
               *
               * @this {DiskDump}
               * @param {number} [nIndent] is the relative number of characters to indent the given line (0 if none)
               * @param {string} [sLine] is the given line
               * @param {string} [sComment] is an optional comment to append to the line, if comment output is enabled
               * @return {string} the indented/commented line
               */
              DiskDump.prototype.dumpLine = function(nIndent, sLine, sComment)
              {
                  if (nIndent < 0) {
                      this.nJSONIndent += nIndent;
                  }
                  if (this.fJSONComments) {
                      sLine = "                                ".substr(0, this.nJSONIndent) + (sLine? (sLine + (sComment? (" // " + sComment) : "") + "\n") : "");
                  }
                  if (nIndent > 0) {
                      this.nJSONIndent += nIndent;
                  }
                  return sLine;
              };
              
              /**
               * dumpProp(sKey, value, fLast)
               *
               * @this {DiskDump}
               * @param {string} sKey
               * @param {number|string|null} value
               * @param {boolean} [fLast]
               * @return {string} the indented property
               */
              DiskDump.prototype.dumpProp = function(sKey, value, fLast)
              {
                  var sDump = "";
                  if (value) {
                      sDump += this.dumpLine(0, '"' + sKey + '":' + this.sJSONWhitespace + (typeof value == 'string'? ("'" + value + "'") : value) + (fLast? "" : ","));
                  }
                  return sDump;
              };
              
              /**
               * dumpBuffer(sKey, buf, len, cbItem, offData)
               *
               * @this {DiskDump}
               * @param {string|null} sKey is name of buffer data element
               * @param {Buffer} buf is a Buffer containing the bytes to dump
               * @param {number} len is the number of bytes to dump
               * @param {number} cbItem is either 1 or 4, to dump bytes or dwords respectively
               * @param {number} [offData] is a relative offset of this data within the parent (for display purposes only)
               * @return {string} hex (or decimal) representation of the data
               */
              DiskDump.prototype.dumpBuffer = function(sKey, buf, len, cbItem, offData)
              {
                  var sDump = this.dumpLine(2, (sKey? '"' + sKey + '":' : "") + this.sJSONWhitespace + '[');
              
                  var sLine = "";
                  var sASCII = "";
                  var cMaxCols = 16 * cbItem;
                  if (offData === undefined) offData = 0;
              
                  /*
                   * TODO: Assert that off is always < buf.length as well.
                   */
                  for (var off = 0; off < len; off += cbItem) {
              
                      var v = (cbItem == 1? buf.readUInt8(off) : buf.readInt32LE(off));
              
                      if (off) {
                          sLine += ",";
                          if ((off % cMaxCols) === 0) {
                              sDump += this.dumpLine(0, sLine, sASCII);
                              sLine = sASCII = "";
                          }
                      }
                      if (cbItem > 1) {
                          sLine += v;
                      }
                      else {
                          sLine += str.toHexByte(v);
                          if (!sASCII) sASCII = "0x" + str.toHex(offData + off) + " ";
                          sASCII += (v >= 0x20 && v < 0x7F && v != 0x3C && v != 0x3E? String.fromCharCode(v) : ".");
                      }
                  }
              
                  sDump += this.dumpLine(0, sLine + "]", sASCII);
                  this.dumpLine(-2);
              
                  return sDump;
              };
              
              /**
               * dumpTrackOSI(sTrackSig, nTrackNum, nTrackType, nTrackLoad)
               *
               * Dumps track data for an OSI disk track
               *
               * @this {DiskDump}
               * @param {string} sTrackSig
               * @param {number} nTrackNum
               * @param {number} nTrackType
               * @param {number} [nTrackLoad]
               * @return {string}
               */
              DiskDump.prototype.dumpTrackOSI = function(sTrackSig, nTrackNum, nTrackType, nTrackLoad)
              {
                  var sDump = "";
                  nTrackNum = Math.floor(nTrackNum / 16) * 10 + (nTrackNum % 16);
                  sDump += this.dumpLine(2, "{");
                  sDump += this.dumpProp("trackSig", sTrackSig);
                  sDump += this.dumpProp("trackNum", nTrackNum);
                  sDump += this.dumpProp("trackType", nTrackType);
                  sDump += this.dumpProp("trackLoad", nTrackLoad);
                  sDump += this.dumpLine(2, '"sectors":' + this.sJSONWhitespace + '[');
                  return sDump;
              };
              
              /**
               * dumpSectorOSI(nSectorSig, nSectorNum, nSectorPages, bufSector, sSectorEndSig, nSectorOffset)
               *
               * Dumps sector data for an OSI disk sector
               *
               * @this {DiskDump}
               * @param {number|null} nSectorSig
               * @param {number} nSectorNum
               * @param {number} nSectorPages
               * @param {Buffer} bufSector
               * @param {string|null} sSectorEndSig
               * @param {number} nSectorOffset
               * @return {string}
               */
              DiskDump.prototype.dumpSectorOSI = function(nSectorSig, nSectorNum, nSectorPages, bufSector, sSectorEndSig, nSectorOffset)
              {
                  var sDump = "";
                  sDump += this.dumpLine(2, "{");
                  sDump += this.dumpProp("sectorSig", nSectorSig);
                  sDump += this.dumpProp("sectorNum", nSectorNum);
                  sDump += this.dumpProp("sectorPages", nSectorPages);
                  sDump += this.dumpProp("sectorEndSig", sSectorEndSig);
                  sDump += this.dumpBuffer("sectorData", bufSector, bufSector.length, 1, nSectorOffset);
                  return sDump;
              };
              
              /**
               * trimSector(buf, len)
               *
               * If dwPattern is not null, then cbBuffer is the number of unique bytes
               * at the beginning of the sector, and dwPattern is the 32-bit pattern that
               * fills out the rest of the sector.
               *
               * There are many compression schemes I could have adopted to reduce the size of
               * JSON-encoded disk images, but for now, I keep it simple: trim all bytes from
               * the end of each sector that match.  This is easy for the simulator to deal with,
               * since all it has to do is append zeros (or the specified pattern byte) to every
               * under-sized sector.
               *
               * NOTE: The C1Pjs Simulator doesn't support this feature (yet), which is why
               * trimSector() isn't used when dumping OSI disk images.
               *
               * @this {DiskDump}
               * @param {Buffer} buf
               * @param {number} len
               * @return {Array} containing [dwPattern, cbBuffer]
               */
              DiskDump.prototype.trimSector = function(buf, len)
              {
                  var cbTrim = 0;
                  var cbBuffer = buf.length;
                  var cbPattern = 4;
                  var dwPattern = null;
                  if (cbBuffer == len) {      // sector must be full-size (we don't pad it with zeros first like convdisk.php did)
                      var off = cbBuffer - cbPattern;
                      dwPattern = buf.readInt32LE(off);
                      while ((off -= cbPattern) >= 0) {
                          var dw = buf.readInt32LE(off);
                          // if (fDebug) DiskDump.logConsole("0x" + str.toHex(off) + ": comparing 0x" + str.toHex(dw) + " to pattern 0x" + str.toHex(dwPattern));
                          if (dw != dwPattern) break;
                          cbTrim += cbPattern;
                      }
                  }
                  if (cbTrim < 8) {
                      dwPattern = null;
                  } else {
                      cbBuffer -= (cbTrim + cbPattern);
                  }
                  return [dwPattern, cbBuffer];
              };
              
              /*
               * fileInfo objects have the following properties:
               *
               *      FILE_NAME: the 8.3 name to use
               *      FILE_PATH: the fully-qualified host path, if any
               *      FILE_ATTR: the attribute bits to use (see the ATTR constants below)
               *      FILE_TIME: a Date object representing the file's modification date/time, null if unknown
               *      FILE_SIZE: the size of the file, in bytes (or -1, in which case FILE_DATA is another aFiles array)
               *      FILE_DATA: the file's data (either a string or a Buffer), which may either be pre-read or deferred to buildClusters()
               *      FILE_CLUS: the cluster to be assigned to the file, if any
               *
               * Next up: assorted FAT file system constants.
               */
              DiskDump.ATTR_READONLY    = 0x01;
              DiskDump.ATTR_HIDDEN      = 0x02;
              DiskDump.ATTR_SYSTEM      = 0x04;
              DiskDump.ATTR_VOLUME      = 0x08;
              DiskDump.ATTR_SUBDIR      = 0x10;
              DiskDump.ATTR_ARCHIVE     = 0x20;
              
              /**
               * validateTime(dateTime)
               *
               * @this {DiskDump}
               * @param {Date} dateTime
               * @return {boolean} true if date/time modified, false if not
               */
              DiskDump.prototype.validateTime = function(dateTime)
              {
                  var fModified = false;
                  if (dateTime) {
                      var year = dateTime.getFullYear();
                      var month = dateTime.getMonth();
                      var day = dateTime.getDate();
                      var hours = dateTime.getHours();
                      var minutes = dateTime.getMinutes();
                      var seconds = dateTime.getSeconds();
                      /*
                       * The year in a DOS modification date occupies 7 bits and is interpreted as a non-negative value (0-127)
                       * that is added to the base year of 1980, so the range of valid years is 1980-2107.  However, it's worth
                       * nothing that in PC-DOS 2.0, I observed a date with the largest possible year value (127) displayed as
                       * "12-31-:7" (an ASCII ':' is the next highest character after '0').  While that DOES distinguish the year
                       * 2007 from the year 2107, we probably shouldn't allow any year > 2099, to eliminate confusion.
                       *
                       * In fact, it might be worth setting the upper limit to 2079, otherwise a date like "12-31-81" is ambiguous
                       * (it could mean 1981 or 2081).  But I'll stick to a limit of 2099 for now.
                       */
                      if (year < 1980) {
                          year = 1980; month = 0; day = 1;
                          hours = 0; minutes = 0; seconds = 2;        // PC-DOS 2.0 won't display times that are completely zero
                          fModified = true;
                      } else if (year > 2099) {
                          year = 2099; month = 11; day = 31;
                          hours = 23; minutes = 59; seconds = 2;
                          fModified = true;
                      }
                      if (fModified) {
                          dateTime.setFullYear(year, month, day);
                          dateTime.setHours(hours, minutes, seconds);
                      }
                  }
                  return fModified;
              };
              
              /**
               * buildData(cb)
               *
               * @this {DiskDump}
               * @param {number} cb
               * @param {Array.<number>} [abInit]
               * @return {Array.<number>} of bytes zero-initialized
               */
              DiskDump.prototype.buildData = function(cb, abInit)
              {
                  var ab = new Array(cb);
                  for (var i = 0; i < cb; i++) {
                      ab[i] = (abInit && i < abInit.length? abInit[i] : 0);
                  }
                  return ab;
              };
              
              /**
               * copyData(ab)
               *
               * @this {DiskDump}
               * @param {number} offDisk
               * @param {Array.<number>} ab
               * @return {number} number of bytes written
               */
              DiskDump.prototype.copyData = function(offDisk, ab)
              {
                  var buf = new Buffer(ab);
                  buf.copy(this.bufDisk, offDisk);
                  return ab.length;
              };
              
              /**
               * addManifestInfo(fileInfo)
               *
               * @this {DiskDump}
               * @param {Object} fileInfo
               */
              DiskDump.prototype.addManifestInfo = function(fileInfo)
              {
                  this.aManifestInfo.push(fileInfo);
              };
              
              /**
               * isTextFile(sFileName)
               *
               * @this {DiskDump}
               * @param {string} sFileName
               * @return {boolean} true if the filename contains a known text file extension, false if unknown
               */
              DiskDump.prototype.isTextFile = function(sFileName)
              {
                  for (var i = 0; i < DiskDump.asTextFileExts.length; i++) {
                      if (str.endsWith(sFileName, DiskDump.asTextFileExts[i])) return true;
                  }
                  return false;
              };
              
              /**
               * readDir(sDir, fRoot, done)
               *
               * Returns an array (aFiles) via the done() callback, where each entry is a fileInfo object.
               * If fileInfo refers to a subdirectory, then FILE_SIZE is -1 and FILE_DATA entry is another aFiles array.
               *
               * @this {DiskDump}
               * @param {string} sDir is a fully-qualified directory name
               * @param {boolean} [fRoot] should be true for the first directory read
               * @param {function(Error,Array)} done
               */
              DiskDump.prototype.readDir = function(sDir, fRoot, done)
              {
                  var fileInfo;
                  var aFiles = [];
              
                  /*
                   * Use the directory name as a candidate for a volume label as well, if it's upper-case and
                   * 11 characters or less (after we remove any numeric prefix that we may have added to indicate
                   * disk order, that is).
                   */
                  if (fRoot) {
                      fileInfo = this.buildVolLabel(sDir);
                      if (fileInfo) {
                          aFiles.push(fileInfo);
                          // this.addManifestInfo(fileInfo);
                      }
                  }
              
                  var obj = this;
                  var cCallbacks = 0;
                  fs.readdir(sDir, function doneReadDir(err, asFiles) {
                      var iFile;
                      if (err) {
                          done(err, null);
                          return;
                      }
              
                      /*
                       * Sorting file names now (since they're just strings) is easier/faster than sorting the filtered
                       * aFiles array later (which would require the use of a compare function), so we do the sort now; it
                       * has no bearing on the outcome.  Note that the lack of a stable sort in JavaScript also has no
                       * bearing, because we're sorting on name, and every name is different.
                       *
                       * However, it's not entirely clear whether this is strictly necessary.  I think the variations in
                       * file name order that I was originally seeing may have simply been due to out-of-order fs.stat()
                       * calls, because I used to call addManifestInfo() in the callback.
                       */
                      // if (fNormalize) asFiles.sort();
              
                      for (iFile = 0; iFile < asFiles.length; iFile++) {
                          var sFileName = asFiles[iFile];
                          /*
                           * fs.readdir() already excludes "." and ".." but there are also a wide variety of hidden
                           * files on *nix systems that begin with a period, which in general we should ignore, too.
                           *
                           * TODO: Consider an override option that will allow hidden file(s) to be included as well.
                           */
                          if (sFileName.charAt(0) == '.') continue;
                          var sFilePath = path.join(sDir, sFileName);
                          fileInfo = {};
                          /*
                           * TODO: Verify that buildName() didn't change the name into one that already exists in this directory.
                           * In the normal case, the directory being read already contains files named according to DOS conventions,
                           * and therefore they will automatically be unique.
                           */
                          if (obj.isExcluded(sFileName)) continue;
                          fileInfo.FILE_NAME = obj.buildName(sFileName);
                          fileInfo.FILE_PATH = sFilePath;
                          aFiles.push(fileInfo);
              
                          /*
                           * We add the fileInfo objects to the aManifestInfo array NOW, because the fs.stat() callbacks may
                           * occur out-of-order.  The only downside is that non-file entries can now appear in the array, which
                           * means updateManifest() will want to check for those and ignore them.
                           */
                          obj.addManifestInfo(fileInfo);
                      }
              
                      var errSave = null;
                      for (iFile = 0; iFile < aFiles.length; iFile++) {
                          if (!aFiles[iFile].FILE_PATH) continue;
                          (function readDirEntry(fileInfo) {
                              cCallbacks++;
                              fs.stat(fileInfo.FILE_PATH, function doneStat(err, stats) {
                                  if (!err) {
                                      fileInfo.FILE_TIME = stats.mtime;       // NOTE: This is a Date object
                                      obj.validateTime(fileInfo.FILE_TIME);
                                      if (stats.isDirectory()) {
                                          fileInfo.FILE_ATTR = DiskDump.ATTR_SUBDIR;
                                          fileInfo.FILE_SIZE = -1;
                                          obj.readDir(fileInfo.FILE_PATH, false, function(err, aFilesDir) {
                                              fileInfo.FILE_DATA = aFilesDir;
                                              if (err && !errSave) errSave = err;
                                              if (!--cCallbacks) done(errSave, aFiles);
                                          });
                                          return;
                                      } else {
                                          fileInfo.FILE_ATTR = DiskDump.ATTR_ARCHIVE;
                                          fileInfo.FILE_SIZE = stats.size;
                                          if (obj.isTextFile(fileInfo.FILE_NAME)) {
                                              fs.readFile(fileInfo.FILE_PATH, {encoding: "utf8"}, function doneReadDirEntry(err, s) {
                                                  if (!err) {
                                                      s = s.replace(/\n/g, "\r\n").replace(/\r\r/g, "\r");
                                                      fileInfo.FILE_DATA = s;
                                                      fileInfo.FILE_SIZE = s.length;
                                                  } else {
                                                      if (!errSave) errSave = err;
                                                  }
                                                  // obj.addManifestInfo(fileInfo);
                                                  if (!--cCallbacks) done(errSave, aFiles);
                                              });
                                              return;
                                          }
                                          // obj.addManifestInfo(fileInfo);
                                      }
                                  } else {
                                      if (!errSave) errSave = err;
                                  }
                                  if (!--cCallbacks) done(errSave, aFiles);
                              });
                          }(aFiles[iFile]));  // jshint ignore:line
                      }
                      if (!cCallbacks) done(errSave, aFiles);
                  });
              };
              
              /**
               * readPath(sPath, done)
               *
               * Returns an array (aFiles) via the done() callback, where each entry is a fileInfo object.
               * If fileInfo refers to a subdirectory, then FILE_SIZE is -1 and FILE_DATA entry is another aFiles array.
               *
               * NOTE: sPath begins fully-qualified (see this.sDiskPath), but if any of the intermediate entries contains paths,
               * it's our responsibility to join them with sServerRoot.
               *
               * @this {DiskDump}
               * @param {string} sPath contains series of semi-colon-separated files (local or remote)
               * @param {function(Error,Array)} done
               */
              DiskDump.prototype.readPath = function(sPath, done)
              {
                  var aFiles = [];
                  var asFiles = sPath.split(';');
                  var sDefaultPath = "";
              
                  var fileInfo = this.buildVolLabel();
                  if (fileInfo) {
                      aFiles.push(fileInfo);
                      // this.addManifestInfo(fileInfo);
                  }
              
                  for (var iFile = 0; iFile < asFiles.length; iFile++) {
                      fileInfo = {};
                      var sFileName = asFiles[iFile];
                      var i = sFileName.lastIndexOf('/');
                      if (i >= 0) {
                          if (sFileName.indexOf("..") < 0) {
                              sDefaultPath = sFileName.substr(0, i);
                              /*
                               * The DiskDump constructor joins the beginning of sPath with sServerRoot,
                               * but if there are any intermediate paths, we have to join them ourselves.
                               */
                              if (iFile > 0 && !net.isRemote(sDefaultPath)) {
                                  sDefaultPath = path.join(this.sServerRoot, sDefaultPath);
                              }
                              sFileName = sFileName.substr(i+1);
                          } else {
                              /*
                               * TODO: We need to permit ".." without compromising the server...
                               *
                              var err = new Error('invalid file "' + sFileName + '"');
                              done(err, null);
                              return;
                               */
                          }
                      }
                      /*
                       * Ordinarily, sFileName will already be the basename, except when it has a path element like "../"
                       *
                       * TODO: Verify that buildName() doesn't change the name into one that already exists.
                       * This is more of a problem than in readDir(), because all these names are user-supplied.
                       */
                      var sBaseName = path.basename(sFileName);
                      if (this.isExcluded(sBaseName)) continue;
                      fileInfo.FILE_NAME = this.buildName(sBaseName);
                      fileInfo.FILE_PATH = path.join(sDefaultPath, sFileName);
                      fileInfo.FILE_TIME = null;
                      aFiles.push(fileInfo);
              
                      /*
                       * We add the fileInfo objects to the aManifestInfo array NOW, because the getStat() callbacks may
                       * occur out-of-order.  The only downside is that non-file entries can now appear in the array, which
                       * means updateManifest() will want to check for those and ignore them.
                       */
                      this.addManifestInfo(fileInfo);
                  }
              
                  var obj = this;
                  var cCallbacks = 0;
                  var errSave = null;
              
                  for (iFile = 0; iFile < aFiles.length; iFile++) {
                      if (!aFiles[iFile].FILE_PATH) continue;
                      (function readPathEntry(fileInfo) {
                          cCallbacks++;
                          var sFilePath = fileInfo.FILE_PATH;
                          /*
                           * TODO: See if we can eliminate some of the unfortunate redundancy between the code
                           * below and the very similar code in readDir(), such as the "README.md" pre-processing.
                           *
                           * However, in this case, because we want readPath() to support both local and remote
                           * paths, we call DiskDump.readFile() instead of fs.readFile().
                           */
                          DiskDump.getStat(sFilePath, function doneReadPathStat(err, stats) {
                              if (!err) {
                                  fileInfo.FILE_TIME = stats.mtime;           // NOTE: This is a Date object
                                  obj.validateTime(fileInfo.FILE_TIME);
                                  if (!stats.remote && stats.isDirectory()) {
                                      fileInfo.FILE_ATTR = DiskDump.ATTR_SUBDIR;
                                      fileInfo.FILE_SIZE = -1;
                                      obj.readDir(fileInfo.FILE_PATH, false, function(err, aFilesDir) {
                                          fileInfo.FILE_DATA = aFilesDir;
                                          if (err && !errSave) errSave = err;
                                          if (!--cCallbacks) done(errSave, aFiles);
                                      });
                                      return;
                                  } else {
                                      fileInfo.FILE_ATTR = DiskDump.ATTR_ARCHIVE;
                                      fileInfo.FILE_SIZE = stats.size;
                                      if (obj.isTextFile(fileInfo.FILE_NAME)) {
                                          DiskDump.readFile(sFilePath, "utf8", function doneReadPathEntry(err, sData) {
                                              if (!err) {
                                                  sData = sData.replace(/\n/g, "\r\n").replace(/\r\r/g, "\r");
                                                  fileInfo.FILE_DATA = sData;
                                                  fileInfo.FILE_SIZE = sData.length;
                                                  // obj.addManifestInfo(fileInfo);
                                              } else {
                                                  if (!errSave) errSave = err;
                                              }
                                              if (!--cCallbacks) done(errSave, aFiles);
                                          });
                                          return;
                                      }
                                      // obj.addManifestInfo(fileInfo);
                                  }
                              } else {
                                  if (!errSave) errSave = err;
                              }
                              if (!--cCallbacks) done(errSave, aFiles);
                          });
                      }(aFiles[iFile]));      // jshint ignore:line
                  }
                  if (!cCallbacks) done(errSave, aFiles);
              };
              
              /**
               * buildName(sFile)
               *
               * @this {DiskDump}
               * @param {string} sFile is the basename of a file
               * @return {string} containing a corresponding FAT-compatible filename
               */
              DiskDump.prototype.buildName = function(sFile)
              {
                  var sName = sFile.toUpperCase();
                  var iExt = sName.lastIndexOf('.');
                  var sExt = "";
                  if (iExt >= 0) {
                      sExt = sName.substr(iExt+1);
                      sName = sName.substr(0, iExt);
                  }
                  sName = sName.substr(0, 8).trim();
                  sExt = sExt.substr(0, 3).trim();
                  var iPeriod = -1;
                  if (sExt) {
                      iPeriod = sName.length;
                      sName += '.' + sExt;
                  }
                  for (var i = 0; i < sName.length; i++) {
                      if (i == iPeriod) continue;
                      var ch = sName.charAt(i);
                      if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()-@^_`{}~".indexOf(ch) < 0) {
                          sName = sName.substr(0, i) + '_' + sName.substr(i+1);
                      }
                  }
                  return sName;
              };
              
              /**
               * buildVolLabel(sDir)
               *
               * NOTE: When fileInfo is returned, there will be no FILE_PATH property, which means
               * don't go looking for a corresponding entry in the host file system, because there isn't one.
               *
               * @this {DiskDump}
               * @param {string} [sDir]
               * @return {Object|null} fileInfo (or null if no suitable volume label)
               */
              DiskDump.prototype.buildVolLabel = function(sDir)
              {
                  var sVolume = null;
                  var fileInfo = null;
                  if (sDir) {
                      sVolume = path.basename(sDir);
                      if (sVolume == sVolume.toUpperCase()) {
                          var i = sVolume.indexOf('-');
                          if (i > 0) {
                              var sPrefix = sVolume.substr(0, i);
                              if (!sPrefix.match(/^\d+$/))
                                  sVolume = null;
                              else
                                  sVolume = sVolume.substr(i+1);
                          }
                      }
                  }
                  if (!sVolume) {
                      sVolume = DiskDump.MY_VOL_LABEL;
                  }
                  if (sVolume && sVolume.length <= 11) {
                      fileInfo = {};
                      fileInfo.FILE_NAME = this.buildName(sVolume);
                      fileInfo.FILE_ATTR = DiskDump.ATTR_VOLUME;
                      /*
                       * I used to initialize the volume label's date with a simple "new Date()", but because that results
                       * in a different disk image every time we run DiskDump, I've opted for a hard-coded date/time (ie, the
                       * day the IBM PC was introduced, August 12, 1981, with an arbitrary time of 12pm).
                       */
                      fileInfo.FILE_TIME = fNormalize? new Date(1981, 7, 12, 12) : new Date();
                      this.validateTime(fileInfo.FILE_TIME);
                      fileInfo.FILE_SIZE = 0;
                  }
                  return fileInfo;
              };
              
              /**
               * buildFAT(abFAT, aFiles, iCluster, cbCluster)
               *
               * @this {DiskDump}
               * @param {Array.<number>} abFAT
               * @param {Array} aFiles
               * @param {number} iCluster
               * @param {number} cbCluster
               * @return {number}
               */
              DiskDump.prototype.buildFAT = function(abFAT, aFiles, iCluster, cbCluster)
              {
                  var cb;
                  var cSubDirs = 0;
                  for (var iFile = 0; iFile < aFiles.length; iFile++) {
                      cb = aFiles[iFile].FILE_SIZE;
                      if (cb < 0) {
                          cb = (aFiles[iFile].FILE_DATA.length + 2) * 32;
                          cSubDirs++;
                      }
                      var cFileClusters = ((cb + cbCluster - 1) / cbCluster) | 0;
                      if (!cFileClusters) {
                          aFiles[iFile].FILE_CLUS = 0;
                      } else {
                          aFiles[iFile].FILE_CLUS = iCluster;
                          while (cFileClusters-- > 0) {
                              var iNextCluster = iCluster + 1;
                              if (!cFileClusters) iNextCluster = 0xFFF;
                              // if (fDebug) DiskDump.logConsole(aFiles[iFile].FILE_NAME + ": setting cluster entry " + iCluster + " to " + str.toHexWord(iNextCluster));
                              this.buildFATEntry(abFAT, iCluster++, iNextCluster);
                          }
                      }
                  }
                  if (cSubDirs) {
                      for (iFile = 0; iFile < aFiles.length; iFile++) {
                          cb = aFiles[iFile].FILE_SIZE;
                          if (cb < 0) {
                              iCluster = this.buildFAT(abFAT, aFiles[iFile].FILE_DATA, iCluster, cbCluster);
                          }
                      }
                  }
                  return iCluster;
              };
              
              /**
               * buildFATEntry(abFat, iFat, v)
               *
               * @this {DiskDump}
               * @param {Array.<number>} abFAT
               * @param {number} iFAT
               * @param {number} v
               */
              DiskDump.prototype.buildFATEntry = function(abFAT, iFAT, v)
              {
                  var iBit = iFAT * 12;
                  var iByte = (iBit >> 3);
                  if ((iBit % 8) === 0) {
                      abFAT[iByte] = v & 0xff;
                      iByte++;
                      if (abFAT[iByte] === undefined) abFAT[iByte] = 0;
                      abFAT[iByte] = (abFAT[iByte] & 0xF0) | (v >> 8);
                  }
                  else {
                      if (abFAT[iByte] === undefined) abFAT[iByte] = 0;
                      abFAT[iByte] = (abFAT[iByte] & 0x0F) | ((v & 0xF) << 4);
                      iByte++;
                      abFAT[iByte] = (v >> 4);
                  }
              };
              
              /**
               * buildDir(abDir, aFiles, dateMod, iCluster, iParentCluster)
               *
               * @this {DiskDump}
               * @param {Array.<number>} abDir
               * @param {Array} aFiles
               * @param {Date} [dateMod]
               * @param {number} [iCluster]
               * @param {number} [iParentCluster]
               * @return {number} number of directory entries built
               */
              DiskDump.prototype.buildDir = function(abDir, aFiles, dateMod, iCluster, iParentCluster)
              {
                  if (dateMod === undefined) dateMod = null;
                  if (iCluster === undefined) iCluster = -1;
                  if (iParentCluster === undefined) iParentCluster = -1;
              
                  var offDir = 0;
                  var cEntries = 0;
                  if (iCluster >= 0) {
                      offDir += this.buildDirEntry(abDir, offDir, ".", 0, DiskDump.ATTR_SUBDIR, dateMod, iCluster);
                      offDir += this.buildDirEntry(abDir, offDir, "..", 0, DiskDump.ATTR_SUBDIR, dateMod, iParentCluster);
                      cEntries += 2;
                  }
                  for (var iFile = 0; iFile < aFiles.length; iFile++) {
                      if (aFiles[iFile].FILE_CLUS === undefined) {
                          if (fDebug) DiskDump.logConsole("file " + aFiles[iFile].FILE_NAME + " missing cluster, skipping");
                          continue;
                      }
                      offDir += this.buildDirEntry(abDir, offDir, aFiles[iFile].FILE_NAME, aFiles[iFile].FILE_SIZE, aFiles[iFile].FILE_ATTR, aFiles[iFile].FILE_TIME, aFiles[iFile].FILE_CLUS);
                      cEntries++;
                  }
                  return cEntries;
              };
              
              /**
               * buildDirEntry(ab, off, sFile, cbFile, bAttr, dateMod, iCluster)
               *
               * TODO: Create constants that define the various directory entry fields, including the overall size (32 bytes).
               *
               * @this {DiskDump}
               * @param {Array.<number>} ab contains the bytes of a directory
               * @param {number} off is the offset within ab to build the next directory entry
               * @param {string} sFile is the file name
               * @param {number} cbFile is the size of the file, in bytes
               * @param {number} bAttr contains the attribute bits of the file
               * @param {Date} dateMod contains the modification date of the file
               * @param {number} iCluster is the starting cluster of the file
               * @return {number} number of bytes added to the directory (normally 32)
               */
              DiskDump.prototype.buildDirEntry = function(ab, off, sFile, cbFile, bAttr, dateMod, iCluster)
              {
                  var offDir = off;
                  var sFileExt = "";
                  var i = sFile.indexOf('.');
              
                  if (i > 0) {
                      sFileExt = sFile.substr(i+1);
                      sFile = sFile.substr(0, i);
                  }
                  for (i = 0; i < 8; i++) {
                      ab[off++] = (i < sFile.length? sFile.charCodeAt(i) : 0x20);
                  }
                  for (i = 0; i < 3; i++) {
                      ab[off++] = (i < sFileExt.length? sFileExt.charCodeAt(i) : 0x20);
                  }
              
                  /*
                   * File attribute bits at offset 0x0B are next: (0x01 for read-only, 0x02 for hidden, 0x04 for system,
                   * 0x08 for volume label, 0x10 for subdirectory, and 0x20 for archive)
                   */
                  ab[off++] = bAttr;
              
                  /*
                   * Skip 10 bytes, bringing us to offset 0x16: 2 bytes for modification time, plus 2 bytes for modification date.
                   */
                  off += 10;
                  if (dateMod) {
                      var year = dateMod.getFullYear();
                      var month = dateMod.getMonth() + 1;
                      var day = dateMod.getDate();
                      var time = ((dateMod.getHours() & 0x1F) << 11) | ((dateMod.getMinutes() & 0x3F) << 5) | ((dateMod.getSeconds() >> 1) & 0x1F);
                      /*
                       * NOTE: If validateTime() is doing its job, then we should never have to do this.  This is simple paranoia.
                       */
                      if (year < 1980) {
                          year = 1980; month = 1; day = 1; time = 1;
                      } else if (year > 2099) {
                          year = 2099; month = 12; day = 31; time = 1;
                      }
                      ab[off++] = time & 0xff;
                      ab[off++] = time >> 8;
                      var date = (((year - 1980) & 0x7F) << 9) | (month << 5) | day;
                      ab[off++] = date & 0xff;
                      ab[off++] = date >> 8;
                  } else {
                      for (i = 0; i < 4; i++) {
                          ab[off++] = 0;
                      }
                  }
              
                  /*
                   * Now we're at offset 0x1A, where the starting cluster (2 bytes) and file size (4 bytes) are stored,
                   * completing the 32-byte directory entry.
                   */
                  ab[off++] = iCluster & 0xff;                // first file cluster (low byte)
                  ab[off++] = (iCluster >> 8) & 0xff;         // first file cluster (high byte)
              
                  /*
                   * For subdirectories, we recorded a -1 rather than a 0, because unlike true 0-length files, they DO actually
                   * have a size, it's just not immediately known until we traverse the directory's contents.  However, when it
                   * comes time to the write the directory entry for a subdirectory, the FAT convention is to record it as zero.
                   */
                  if (cbFile < 0) cbFile = 0;
                  ab[off++] = cbFile & 0xff;
                  ab[off++] = (cbFile >> 8) & 0xff;
                  ab[off++] = (cbFile >> 16) & 0xff;
                  ab[off++] = (cbFile >> 24) & 0xff;
              
                  return off - offDir;
              };
              
              /**
               * buildClusters(aFiles, offDisk, cbCluster, iParentCluster, done)
               *
               * @this {DiskDump}
               * @param {Array} aFiles
               * @param {number} offDisk
               * @param {number} cbCluster
               * @param {number} iParentCluster
               * @param {number} iLevel
               * @param {function(Error)} done
               * @return {number} number of clusters built
               */
              DiskDump.prototype.buildClusters = function(aFiles, offDisk, cbCluster, iParentCluster, iLevel, done)
              {
                  var obj = this;
                  var cSubDirs = 0;
                  var cClusters = 0;
              
                  if (!iLevel) {
                      this.cWritesPending = 0;
                  }
              
                  for (var iFile = 0; iFile < aFiles.length; iFile++) {
                      var bufData = null;
                      var cbData = aFiles[iFile].FILE_SIZE;
                      if (cbData > 0) {
                          var sData = aFiles[iFile].FILE_DATA;
                          if (!sData) {
                              this.cWritesPending++;
                              (function readClusters(file, cb, off) {
                                  fs.readFile(file.FILE_PATH, function doneReadClusters(err, buf) {
                                      /*
                                       * If cWritesPending has been prematurely zeroed, we assume that's because the buildClusters()
                                       * caller discovered a problem (eg, the total number of clusters exceeds what can fit in the image),
                                       * so we bail.
                                       */
                                      if (!obj.cWritesPending) return;
                                      if (!err) {
                                          if (fDebug && cb != buf.length) DiskDump.logConsole(file.FILE_NAME + ": initial size (" + cb + ") does not match actual size (" + buf.length + ")");
                                          buf.copy(obj.bufDisk, off);
                                          if (fDebug) DiskDump.logConsole("0x" + str.toHex(off) + ": 0x" + str.toHex(buf.length) + " bytes written for " + file.FILE_PATH);
                                          if (obj.sManifestFile) file.FILE_MD5 = crypto.createHash('md5').update(buf).digest('hex');
                                      }
                                      if (!--obj.cWritesPending) done(err);
                                  });
                              }(aFiles[iFile], cbData, offDisk));     // jshint ignore:line
                          } else {
                              cbData = sData.length;
                              bufData = new Buffer(sData);
                              if (this.sManifestFile) aFiles[iFile].FILE_MD5 = crypto.createHash('md5').update(bufData).digest('hex');
                          }
                      }
                      else if (cbData < 0) {
                          var abData = [];
                          cbData = this.buildDir(abData, aFiles[iFile].FILE_DATA, aFiles[iFile].FILE_TIME, aFiles[iFile].FILE_CLUS, iParentCluster) * 32;
                          bufData = new Buffer(this.buildData(cbData, abData));
                          cSubDirs++;
                      }
                      if (bufData) {
                          bufData.copy(this.bufDisk, offDisk);
                          if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": 0x" + str.toHex(bufData.length) + " bytes IMMEDIATELY written for " + aFiles[iFile].FILE_PATH);
                      }
                      offDisk += cbData;
                      cClusters += ((cbData / cbCluster) | 0);
                      var cbPartial = (cbData % cbCluster);
                      if (cbPartial) {
                          cbPartial = cbCluster - cbPartial;
                          offDisk += cbPartial;
                          cClusters++;
                      }
                  }
              
                  if (cSubDirs > 0) {
                      for (iFile = 0; iFile < aFiles.length; iFile++) {
                          var cb = aFiles[iFile].FILE_SIZE;
                          if (cb < 0) {
                              if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": buildClusters()");
                              var cSubClusters = this.buildClusters(aFiles[iFile].FILE_DATA, offDisk, cbCluster, aFiles[iFile].FILE_CLUS, iLevel + 1, done);
                              cClusters += cSubClusters;
                              offDisk += cSubClusters * cbCluster;
                              if (fDebug) DiskDump.logConsole("0x" + str.toHex(offDisk) + ": buildClusters() returned, writing " + cSubClusters + " clusters");
                          }
                      }
                  }
              
                  if (!iLevel) {
                      if (!this.cWritesPending) done(null);
                  }
              
                  return cClusters;
              };
              
              /**
               * buildImage()
               *
               * @this {DiskDump}
               * @param {boolean} fDir
               * @param {function(Error)} done
               */
              DiskDump.prototype.buildImage = function(fDir, done)
              {
                  var obj = this;
                  if ((this.fDir = fDir)) {
                      this.readDir(this.sDiskPath, true, function doneReadDir(err, aFiles) {
                          if (err) {
                              done(err);
                              return;
                          }
                          obj.buildImageFromFiles(aFiles, done);
                      });
                  } else {
                      this.readPath(this.sDiskPath, function doneReadPath(err, aFiles) {
                          if (err) {
                              done(err);
                              return;
                          }
                          obj.buildImageFromFiles(aFiles, done);
                      });
                  }
              };
              
              /**
               * calcFileSizes(aFiles)
               *
               * WARNING: Our "total data" calculation should be rounding up to the next cluster,
               * not the next sector, because data on the disk is cluster-granular, not sector-granular.
               * But we have a chicken-and-egg problem: we won't know the cluster size until we've
               * calculated total data and found a BPB we think will accommodate it.  So, the code below
               * will still have to be prepared for running out of disk space.  This is just a good estimate.
               *
               * @this {DiskDump}
               * @param {Array} aFiles
               * @return {number} of bytes required for all files, including all subdirectories
               */
              DiskDump.prototype.calcFileSizes = function(aFiles)
              {
                  var cbTotal = 0;
                  for (var iFile = 0; iFile < aFiles.length; iFile++) {
                      var cb = aFiles[iFile].FILE_SIZE;
                      var cbSubTotal = 0;
                      if (cb < 0) {
                          cb = (aFiles[iFile].FILE_DATA.length + 2) * 32;
                          cbSubTotal = this.calcFileSizes(aFiles[iFile].FILE_DATA);
                      }
                      cbTotal += cb;
                      if ((cb %= 512)) {
                          cbTotal += 512 - cb;        // WARNING: rounding to next sector may not be enough (see above)
                      }
                      cbTotal += cbSubTotal;
                  }
                  return cbTotal;
              };
              
              /**
               * buildMBR(cHeads, cSectorsPerTrack, cbSector, cTotalSectors)
               *
               * @this {DiskDump}
               * @param {number} cHeads
               * @param {number} cSectorsPerTrack
               * @param {number} cbSector
               * @param {number} cTotalSectors
               * @returns {Array.<number>}
               */
              DiskDump.prototype.buildMBR = function(cHeads, cSectorsPerTrack, cbSector, cTotalSectors)
              {
                  /*
                   * There are four 16-byte partition entries in the MBR, starting at offset 0x1BE,
                   * but we need only one, and like DOS 2.0, we'll use the last one, at offset 0x1EE.
                   */
                  var offSector = 0x1EE;
                  var abSector = this.buildData(cbSector);
              
                  /*
                   * Next 1 byte: status + physical drive #
                   */
                  abSector[offSector++] = 0x80;           // 0x80 indicates an active partition entry
              
                  /*
                   * Next 3 bytes: CHS (Cylinder/Head/Sector) of first partition sector
                   */
                  abSector[offSector++] = 0x00;           // head: 0
                  abSector[offSector++] = 0x02;           // sector: 1 (bits 0-5), cyclinder bits 8-9: 0 (bits 6-7)
                  abSector[offSector++] = 0x00;           // cylinder bits 0-7: 0
              
                  /*
                   * Next 1 byte: partition ID
                   */
                  abSector[offSector++] = 0x01;           // partition ID: 0x01 (FAT12)
              
                  /*
                   * Next 3 bytes: CHS (Cylinder/Head/Sector) of last partition sector
                   */
                  abSector[offSector++] = cHeads-1;
                  var cCylinders = (cTotalSectors / (cHeads * cSectorsPerTrack)) | 0;
                  abSector[offSector++] = cSectorsPerTrack | ((cCylinders & 0x300) >> 2);
                  abSector[offSector++] = cCylinders & 0xff;
              
                  /*
                   * Next 4 bytes: LBA (Logical Block Address) of first partition sector
                   */
                  abSector[offSector++] = 1;
                  abSector[offSector++] = 0x00;
                  abSector[offSector++] = 0x00;
                  abSector[offSector++] = 0x00;
              
                  /*
                   * Next 4 bytes: Number of sectors in partition
                   */
                  abSector[offSector++] = (cTotalSectors & 0xff);
                  abSector[offSector++] = ((cTotalSectors >> 8) & 0xff);
                  abSector[offSector++] = ((cTotalSectors >> 16) & 0xff);
                  abSector[offSector++] = ((cTotalSectors >> 24) & 0xff);
              
                  /*
                   * Since we should be at offset 0x1FE now, store the MBR signature bytes
                   */
                  abSector[offSector++] = 0x55;
                  abSector[offSector] = 0xAA;
                  return abSector;
              };
              
              /**
               * buildImageFromFiles(aFiles)
               *
               * Note, however, that even if this function returns true, you won't receive the buffer until
               * all the writes to have it have finished.
               *
               * @this {DiskDump}
               * @param {Array} aFiles
               * @param {function(Error)} done
               * @return {boolean} true if disk allocation successful, false if not
               */
              DiskDump.prototype.buildImageFromFiles = function(aFiles, done)
              {
                  var err;
                  if (!aFiles || !aFiles.length) {
                      done(null);
                      return false;
                  }
              
                  /*
                   * Put reasonable upper limits on both individual file sizes and the total size of all files.
                   */
                  var cbMax = (this.mbHD? this.mbHD * 1024 * 1024 : 1440 * 1024);
                  var cbTotal = this.calcFileSizes(aFiles);
              
                  if (fDebug) DiskDump.logConsole("total calculated size for " + aFiles.length + " files/folders: " + cbTotal + " bytes (0x" + str.toHex(cbTotal) + ")");
              
                  if (cbTotal >= cbMax) {
                      err = new Error("file(s) too large (" + cbTotal + " bytes total, " + cbMax + " bytes maximum)");
                      done(err);
                      return false;
                  }
              
                  var abBoot, cbSector, cSectorsPerCluster, cbCluster, cFATs, cFATSectors;
                  var cRootEntries, cRootSectors, cTotalSectors, cSectorsPerTrack, cHeads, cDataSectors, cbAvail;
              
                  /*
                   * Find or build a BPB with enough capacity, and at the same time, calculate all
                   * the other values we'll need, including total number of data sectors (cDataSectors).
                   */
                  for (var iBPB = 1; iBPB < DiskDump.aDefaultBPBs.length; iBPB++) {
                      /*
                       * If this BPB is for a hard disk but a hard disk size was not specified, skip it.
                       */
                      abBoot = DiskDump.aDefaultBPBs[iBPB];
                      if ((abBoot[0x15] == 0xF8) != (this.mbHD > 0)) continue;
                      cbSector = abBoot[0x0B] | (abBoot[0x0C] << 8);
                      cSectorsPerCluster = abBoot[0x0D];
                      cbCluster = cbSector * cSectorsPerCluster;
                      cFATs = abBoot[0x10];
                      cFATSectors = abBoot[0x16] | (abBoot[0x17] << 8);
                      cRootEntries = abBoot[0x11] | (abBoot[0x12] << 8);
                      cRootSectors = (((cRootEntries * 0x20) + cbSector - 1) / cbSector) | 0;
                      cTotalSectors = abBoot[0x13] | (abBoot[0x14] << 8);
                      cSectorsPerTrack = abBoot[0x18] | (abBoot[0x19] << 8);
                      cHeads = abBoot[0x1A] | (abBoot[0x1B] << 8);
                      cDataSectors = cTotalSectors - cRootSectors - cFATs * cFATSectors + 1;
                      cbAvail = cDataSectors * cbSector;
                      if (cbTotal <= cbAvail) break;          // found a BPB that works!
                  }
              
                  if (iBPB == DiskDump.aDefaultBPBs.length) {
                      err = new Error("file(s) too large for disk image (" + cbTotal + " vs. " + cbAvail + " bytes)");
                      done(err);
                      return false;
                  }
              
                  if (aFiles.length > cRootEntries) {
                      err = new Error("too many files for disk image (" + aFiles.length + " vs. " + cRootEntries + " max)");
                      done(err);
                      return false;
                  }
              
                  var abSector;
                  var offDisk = 0;
                  var cbDisk = cTotalSectors * cbSector;
              
                  /*
                   * TODO: Consider doing what convertToIMG() does, which is deferring setting this.bufDisk until the
                   * buffer is fully (and successfully) initialized.  Here, however, the build process relies on worker
                   * functions that prefer not passing around temporary buffers.  In the meantime, perhaps any catastrophic
                   * failures should set bufDisk back to null?
                   */
                  this.bufDisk = new Buffer(cbDisk);
              
                  /*
                   * WARNING: Buffers are NOT zero-initialized, so we need explicitly fill bufDisk with zeros (this seems
                   * to be a reversal in the trend to zero buffers, when security concerns would trump performance concerns).
                   */
                  this.bufDisk.fill(0);
              
                  /*
                   * Output a Master Boot Record (MBR), if a hard disk image was requested
                   */
                  if (this.mbHD > 0) {
                      abSector = this.buildMBR(cHeads, cSectorsPerTrack, cbSector, cTotalSectors);
                      offDisk += this.copyData(offDisk, abSector);
                  }
              
                  /*
                   * Output a boot sector
                   *
                   * NOTE: I don't put a [0x55,0xAA] signature at the end, since it's not actually bootable.
                   */
                  abSector = this.buildData(cbSector, abBoot);
                  offDisk += this.copyData(offDisk, abSector);
              
                  /*
                   * Build the FAT, noting the starting cluster number that each file will use along the way.
                   */
                  var abFAT = [];
                  this.buildFATEntry(abFAT, 0, abBoot[0x15] | 0xF00);
                  this.buildFATEntry(abFAT, 1, 0xFFF);
                  this.buildFAT(abFAT, aFiles, 2, cbCluster);
              
                  /*
                   * Output the FAT sectors; we simplify the logic a bit by writing each FAT table as if it
                   * were one giant sector.
                   */
                  while (cFATs--) {
                      abSector = this.buildData(cFATSectors * cbSector, abFAT);
                      offDisk += this.copyData(offDisk, abSector);
                  }
              
                  /*
                   * Build the root directory
                   */
                  var abRoot = [];
                  var cEntries = this.buildDir(abRoot, aFiles);
              
                  /*
                   * PC-DOS 1.0 requires ALL unused directory entries to start with 0xE5; 0x00 isn't good enough,
                   * so we must loop through all the remaining directory entries and zap them with 0xE5.
                   */
                  var offRoot = cEntries * 32;
                  while (cEntries++ < cRootEntries) {
                      abRoot[offRoot] = 0xE5;
                      offRoot += 32;
                  }
              
                  /*
                   * Output the root directory sectors (as before, as if they were one giant sector)
                   */
                  abSector = this.buildData(cRootSectors * cbSector, abRoot);
                  offDisk += this.copyData(offDisk, abSector);
              
                  /*
                   * Output the file data clusters, which must be stored sequentially, mirroring the order in which
                   * we wrote the cluster sequences to the FAT, above.
                   */
                  var cClusters = this.buildClusters(aFiles, offDisk, cbCluster, 0, 0, done);
                  offDisk += cClusters * cSectorsPerCluster * cbSector;
              
                  if (fDebug) DiskDump.logConsole(offDisk + " bytes written, " + cbDisk + " bytes available");
              
                  if (offDisk > cbDisk) {
                      err = new Error("too much data for disk image (" + cClusters + " clusters required)");
                      this.cWritesPending = 0;
                      done(err);
                      return false;
                  }
              
                  return true;
              };
              
              /**
               * convertToJSON()
               *
               * Converts the disk image data to JSON.
               *
               * @this {DiskDump}
               * @return {string|null} containing a JSON representation of the disk image, or null if unrecognized/malformed
               */
              DiskDump.prototype.convertToJSON = function()
              {
                  if (this.jsonDisk) {
                      return this.jsonDisk;
                  }
              
                  /*
                   * TODO: Decide if we want to retain this usage info:
                   */
                  if (!this.bufDisk) {
                      // DiskDump.logConsole("no data available in disk image");
                      // this.jsonDisk = "[ /* no data */ ]";
                      this.jsonDisk = "[\n  /**\n   * " + DiskDump.sNotice + "\n   * " + DiskDump.sUsage + "\n   */\n]";
                      return this.jsonDisk;
                  }
              
                  var json = null;
                  try {
                      var nHeads = 0;
                      var nCylinders = 0;
                      var nSectorsPerTrack = 0;
                      var aTracks = [];                   // track array (used only for disk images with track tables)
                      var iTrack, cbTrack, offTrack, bufTrack, bufSector;
                      var cbSector = 512;                 // default sector size
                      var offBootSector = 0;
                      var cbDiskData = this.bufDisk.length;
              
                      if (cbDiskData >= 3000000) {        // arbitrary threshold between diskette image sizes and hard disk image sizes
                          /*
                           * In this case, the first sector should be an MBR; find the active partition entry,
                           * then read the LBA of the first partition sector to calculate the boot sector offset.
                           */
                          for (var offEntry = 0x1BE; offEntry <= 0x1EE; offEntry += 0x10) {
                              if (this.bufDisk.readUInt8(offEntry) >= 0x80) {
                                  offBootSector = this.bufDisk.readUInt16LE(offEntry + 0x08) * cbSector;
                                  break;
                              }
                          }
                          /*
                           * If we failed to find an active entry, we'll fall into the BPB detection code, which
                           * should fail if the first sector really was an MBR.  Otherwise, the BPB should give us
                           * the geometry info we need to dump the entire disk image, including the MBR and any
                           * other reserved sectors.
                           */
                      }
              
                      var bByte0 = this.bufDisk.readUInt8(offBootSector + DiskAPI.BOOT.JMP_OPCODE);
                      var cbSectorBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.SECTOR_BYTES);
              
                      /*
                       * These checks are not only necessary for DOS 1.x diskette images (and other pre-BPB images),
                       * but also non-DOS diskette images (eg, CPM-86 diskettes).
                       *
                       * And we must perform these tests BEFORE checking for a BPB, because we want the PHYSICAL geometry
                       * of the disk, whereas any values in the BPB may only be LOGICAL. For example, DOS may only be using
                       * 8 sectors per track on diskette that's actually formatted with 9 sectors per track.
                       *
                       * Checking these common sizes insures we get the proper physical geometry for common disk formats,
                       * but at some point, we'll need to perform more general calculations to properly deal with ANY disk
                       * image whose logical format doesn't agree with its physical structure.
                       */
                      var fXDFOutput = false;
                      var disketteFormat = DiskAPI.DISKETTE_FORMATS[cbDiskData];
                      if (disketteFormat) {
                          nCylinders = disketteFormat[0];
                          nHeads = disketteFormat[1];
                          nSectorsPerTrack = disketteFormat[2];
                      }
                      else {
                          /*
                           * See if the first sector of the image contains a valid DOS BPB.  That begs the question: what IS a valid
                           * DOS BPB?  For starters, the first word (at offset 0x0B) is invariably 0x0200, indicating a 512-byte sector
                           * size.  I also check the first byte for an Intel JMP opcode (0xEB is JMP with a 1-byte displacement, and
                           * 0xE9 is JMP with a 2-byte displacement).  What else?
                           */
                          if ((bByte0 == X86.OPCODE.JMP || bByte0 == X86.OPCODE.JMPS) && cbSectorBPB == cbSector) {
              
                              var nHeadsBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TOTAL_HEADS);
                              var nSectorsTotalBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TOTAL_SECS);
                              var nSectorsPerTrackBPB = this.bufDisk.readUInt16LE(offBootSector + DiskAPI.BPB.TRACK_SECS);
              
                              if (nSectorsPerTrackBPB && nHeadsBPB) {
              
                                  var nSectorsPerCylinderBPB = nSectorsPerTrackBPB * nHeadsBPB;
                                  nHeads = nHeadsBPB;
                                  nCylinders = Math.floor(nSectorsTotalBPB / nSectorsPerCylinderBPB);
                                  nSectorsPerTrack = nSectorsPerTrackBPB;
              
                                  /*
                                   * OK, great, the disk appears to contain a valid BPB.  But so do XDF disk images, which are
                                   * diskette images with tracks containing:
                                   *
                                   *      1 8Kb sector (equivalent of 16 512-byte sectors)
                                   *      1 2Kb sector (equivalent of 4 512-byte sectors)
                                   *      1 1Kb sector (equivalent of 2 512-byte sectors)
                                   *      1 512-byte sector (equivalent of, um, 1 512-byte sector)
                                   *
                                   * for a total of the equivalent of 23 512-byte sectors, or 11776 (0x2E00) bytes per track.
                                   * For an 80-track diskette with 2 sides, that works out to a total of 3680 512-byte sectors,
                                   * or 1884160 bytes, or 1.84Mb, which is the exact size of the (only) XDF diskette images we
                                   * currently (try to) support.
                                   *
                                   * Moreover, the first two tracks (ie, the first cylinder) contain only 19 sectors each,
                                   * rather than 23, but XDF disk images still pads those tracks with 4 unused sectors.
                                   *
                                   * So, data for the first track contains 1 boot sector ending at 512 (0x200), 11 FAT sectors
                                   * ending at 6144 (0x1800), and 7 "micro-disk" sectors ending at 9728 (0x2600).  Then there's
                                   * 4 (useless?) sectors that end at 11776 (0x2E00).
                                   *
                                   * Data for the second track contains 7 root directory sectors ending at 15360 (0x3C00), followed
                                   * by disk data.
                                   *
                                   * For more details, check out this helpful article: http://www.os2museum.com/wp/the-xdf-diskette-format/
                                   */
                                  if (nSectorsTotalBPB == 3680 && this.fXDFSupport) {
                                      DiskDump.logWarning("XDF diskette detected, experimental XDF output enabled");
                                      fXDFOutput = true;
                                  }
                              }
                          }
                      }
              
                      if (!nHeads) {
                          /*
                           * Next, check for a DSK header (an old private format I used to use, which begins with either
                           * 0x00 (read-write) or 0x01 (write-protected), followed by 7 more bytes):
                           *
                           *      0x01: # heads (1 byte)
                           *      0x02: # cylinders (2 bytes)
                           *      0x04: # sectors/track (2 bytes)
                           *      0x06: # bytes/sector (2 bytes)
                           *
                           * which may be followed by an array of track table entries if the words at 0x04 and 0x06 are zero.
                           * If the track table exists, each entry contains the following:
                           *
                           *      0x00: # sectors/track (2 bytes)
                           *      0x02: # bytes/sector (2 bytes)
                           *      0x04: file offset of track data (4 bytes)
                           *
                           * TODO: Our JSON disk format doesn't explicitly support a write-protect indicator.  Instead, we
                           * (used to) include the string "write-protected" as a comment in the first line of the JSON data
                           * as a work-around, and if the FDC component sees that comment string, it will honor it; however,
                           * we now prefer that read-only disk images simply include a "-readonly" suffix in the filename.
                           */
                          if (!(bByte0 & 0xFE)) {
                              var cbSectorDSK = this.bufDisk.readUInt16LE(offBootSector + 0x06);
                              if (!(cbSectorDSK & (cbSectorDSK - 1))) {
                                  cbSector = cbSectorDSK;
                                  nHeads = this.bufDisk.readUInt8(offBootSector + 0x01);
                                  nCylinders = this.bufDisk.readUInt16LE(offBootSector + 0x02);
                                  nSectorsPerTrack= this.bufDisk.readUInt16LE(offBootSector + 0x04);
                                  var nTracks = nHeads * nCylinders;
                                  cbTrack = nSectorsPerTrack * cbSector;
                                  offTrack = 0x08;
                                  if (!cbTrack) {
                                      for (iTrack = 0; iTrack < nTracks; iTrack++) {
                                          nSectorsPerTrack = this.bufDisk.readUInt16LE(offTrack);
                                          cbSectorDSK = this.bufDisk.readUInt16LE(offTrack+2);
                                          cbTrack = nSectorsPerTrack * cbSectorDSK;
                                          offSector = this.bufDisk.readUInt32LE(offTrack+4);
                                          bufTrack = this.bufDisk.slice(offSector, offSector + cbTrack);
                                          aTracks[iTrack] = [nSectorsPerTrack, cbSectorDSK, bufTrack];
                                          offTrack += 8;
                                      }
                                  }
                              }
                          }
                      }
              
                      if (nHeads) {
                          /*
                           * Output the disk data as an array of cylinders, each containing an array of tracks (one track per head),
                           * and each track containing an array of sectors.
                           */
                          iTrack = offTrack = 0;
                          cbTrack = nSectorsPerTrack * cbSector;
                          if (this.fJSONNative) {
                              this.dataDisk = new Array(nCylinders);
                          } else {
                              json = this.dumpLine(2, "[", "DiskDump of " + this.sDiskPath + " via " + DiskDump.sNotice);
                          }
                          for (var iCylinder=0; iCylinder < nCylinders; iCylinder++) {
              
                              var aHeads;
                              if (this.fJSONNative) {
                                  aHeads = new Array(nHeads);
                                  this.dataDisk[iCylinder] = aHeads;
                              } else {
                                  json += this.dumpLine(2, "[", "cylinder: " + iCylinder);
                              }
                              var offHead = 0;
                              for (var iHead=0; iHead < nHeads; iHead++) {
              
                                  if (aTracks.length) {
                                      var aTrack = aTracks[iTrack++];
                                      nSectorsPerTrack = aTrack[0];
                                      cbSector = aTrack[1];
                                      bufTrack = aTrack[2];
                                      cbTrack = nSectorsPerTrack * cbSector;
                                  } else {
                                      bufTrack = this.bufDisk.slice(offTrack + offHead, offTrack + offHead + cbTrack);
                                  }
              
                                  var aSectors;
                                  if (this.fJSONNative) {
                                      aSectors = new Array(nSectorsPerTrack);
                                      aHeads[iHead] = aSectors;
                                  } else {
                                      json += this.dumpLine(2, "[", "head:" + this.sJSONWhitespace + iHead + ", track:" + this.sJSONWhitespace + iCylinder);
                                  }
              
                                  /*
                                   * For most disks, the size of every sector and the number of sectors/track are consistent, and the
                                   * sector number encoded in every sector (nSector) matches the 1-based sector index (iSector) we use
                                   * to "track" our progress through the current track.  However, for XDF disk images, the above is
                                   * NOT true beyond cylinder 0, which is why we have all these *ThisTrack variables, which would otherwise
                                   * be unnecessary.
                                   */
                                  var cbSectorThisTrack = cbSector;
                                  var nSectorsThisTrack = nSectorsPerTrack;
              
                                  /*
                                   * Notes regarding XDF track layouts, from http://forum.kryoflux.com/viewtopic.php?f=3&t=234:
                                   *
                                   *      Track 0, side 0: 19x512 bytes per sector, with standard numbering for the first 8 sectors, then custom numbering
                                   *      Track 0, side 1: 19x512 bytes per sector, with interleaved sector numbering 0x81...0x93
                                   *
                                   *      Track 1 and up, side 0, 4 sectors per track:
                                   *      1x1024, 1x512, 1x2048, 1x8192 bytes per sector (0x83, 0x82, 084, 0x86 as sector numbers)
                                   *
                                   *      Track 1 and up, side 1, 4 sectors per track:
                                   *      1x2048, 1x512, 1x1024, 1x8192 bytes per sector (0x84, 0x82, 083, 0x86 as sector numbers)
                                   *
                                   * Notes regarding the order in which XDF sectors are read (from http://mail.netbridge.at/cgi-bin/info2www?(fdutils)XDF),
                                   * where each position column represents a (roughly) 128-byte section of the track:
                                   *
                                   *          1         2         3         4
                                   * 1234567890123456789012345678901234567890 (position)
                                   * ----------------------------------------
                                   * 6633332244444446666666666666666666666666 (side 0)
                                   * 6666444444422333366666666666666666666666 (side 1)
                                   *
                                   * where 2's contain a 512-byte sector, 3's contain a 1Kb sector, 4's contains a 2Kb sector, and 6's contain an 8Kb sector.
                                   *
                                   * Reading all the data on an XDF cylinder occurs in the following order, from the specified start to end positions:
                                   *
                                   *     sector    head   start     end
                                   *          3       0       3       7
                                   *          4       0       9      16
                                   *          6       1      18       5 (1st wrap around)
                                   *          2       0       7       9
                                   *          2       1      12      14
                                   *          6       0      16       3 (2nd wrap around)
                                   *          4       1       5      12
                                   *          3       1      14      18
                                   */
                                  if (fXDFOutput) nSectorsThisTrack = (iCylinder? 4 : 19);
              
                                  for (var iSector=1, offSector=0; iSector <= nSectorsThisTrack && offSector < cbTrack; iSector++, offSector += cbSectorThisTrack) {
              
                                      var sector = {};
                                      var nSector = iSector;
              
                                      if (fXDFOutput && iCylinder) {
                                          if (!iHead) {
                                              cbSectorThisTrack = (iSector == 1? 1024 : (iSector == 2? 512 : (iSector == 3? 2048 : 8192)));
                                          } else {
                                              cbSectorThisTrack = (iSector == 1? 8192 : (iSector == 2? 2048 : (iSector == 3? 1024 : 512)));
                                          }
                                          nSector = (cbSectorThisTrack == 512? 2 : (cbSectorThisTrack == 1024? 3 : (cbSectorThisTrack == 2048? 4 : 6)));
                                      }
              
                                      bufSector = bufTrack.slice(offSector, offSector + cbSectorThisTrack);
              
                                      if (this.fJSONNative) {
                                          sector['sector'] = nSector;
                                          sector['length'] = cbSectorThisTrack;
                                      } else {
                                          json += (iSector == 1? this.dumpLine(2, "{") : "");
                                          json += this.dumpLine(0, '"sector":' + this.sJSONWhitespace + nSector + ",");
                                          json += this.dumpLine(0, '"length":' + this.sJSONWhitespace + cbSectorThisTrack + ",");
                                      }
              
                                      var aTrim = this.trimSector(bufSector, cbSectorThisTrack);
                                      var dwPattern = aTrim[0];
                                      var cbBuffer = cbSectorThisTrack;
                                      if (dwPattern !== null) {
                                          cbBuffer = aTrim[1];
                                          if (this.fJSONNative) {
                                              sector['pattern'] = dwPattern;
                                          } else {
                                              json += this.dumpLine(0, '"pattern":' + this.sJSONWhitespace + dwPattern + ",");
                                          }
                                      }
              
                                      if (this.fJSONNative) {
                                          var dataSector = [];
                                          sector['data'] = dataSector;
                                          for (var off = 0; off < cbBuffer; off += 4) {
                                              dataSector.push(bufSector.readInt32LE(off));
                                          }
                                          aSectors[iSector-1] = sector;
                                      } else {
                                          if (this.sFormat == DumpAPI.FORMAT.BYTES) {
                                              json += this.dumpBuffer("bytes", bufSector, cbBuffer, 1, offSector);
                                          } else {
                                              /*
                                               * TODO: Assert that sFormat is FORMAT_JSON or FORMAT_DATA (both use the same dword format)
                                               */
                                              json += this.dumpBuffer("data", bufSector, cbBuffer, 4, offSector);
                                          }
                                          json += (iSector < nSectorsThisTrack? this.dumpLine(0, "},{") : this.dumpLine(-2, "}"));
                                      }
                                  }
                                  if (!this.fJSONNative) json += this.dumpLine(-2, "]" + (iHead+1 == nHeads? "" : ","));
                                  offHead += cbTrack;         // end of head {iHead}, track {iCylinder}
                              }
                              if (!this.fJSONNative) json += this.dumpLine(-2, "]" + (iCylinder+1 == nCylinders? "" : ","));
                              offTrack += offHead;            // end of cylinder {iCylinder}
                          }
                          /*
                           * Here's where I used to output the following comment:
                           *
                           *      // write-protected
                           *
                           * as the first line of the JSON stream if the disk was marked write-protected (ie, if (bByte0 & 0x1) != 0).
                           *
                           * But since that makes JSON.parse() sad, the preferred solution is to name read-only JSON disk images with a
                           * "-readonly" suffix.
                           */
                          if (this.fJSONNative) {
                              json = JSON.stringify(this.dataDisk);
                          } else {
                              json += this.dumpLine(-2, "]");
                          }
                          this.jsonDisk = json;
                      }
                      else if (this.bufDisk.readUInt16BE(0x900) == 0x4357) {
                          this.jsonDisk = this.convertOSIDiskToJSON();
                      }
                  } catch(err) {
                      DiskDump.logError(err);
                  }
                  return this.jsonDisk;
              };
              
              /**
               * convertOSIDiskToJSON()
               *
               * This is called when we detect a "CW" signature at offset 0x900 of bufDisk, so we'll try parsing the data
               * as an OSI disk image, and output the data in JSON as an array of heads, each containing an array of tracks,
               * like so:
               *
               *    [ [ {
               *          trackSig:"CW",
               *          trackNum:0x01,
               *          trackType:0x58,
               *          trackLoad:0xnnnn,
               *          sectors:[
               *            { sectorSig:0x76,
               *              sectorNum:0x01,
               *              sectorPages:0x01,
               *              sectorEndSig:"GS",
               *              sectorData: [0x52,0x41,0x43,0x4b,...]
               *            },...
               *          ]
               *        },
               *        {
               *          trackSig:"CW",
               *          ...
               *        }
               *    ] ]
               *
               * TODO: If we ever add support for OSI drives/disk images with more than one head, we should change the disk image
               * format to match that used by DOS disk images and PCjs; ie, an array of cylinders, each containing an array of heads,
               * each containing an array of tracks.  It's largely just a matter of swapping the two outermost array elements, both
               * here and in the C1Pjs disk module.
               *
               * @this {DiskDump}
               * @return {string|null} containing a JSON representation of the disk image, or null if unrecognized/malformed
               */
              DiskDump.prototype.convertOSIDiskToJSON = function()
              {
                  var json = null;
                  try {
                      var iTrack = 0;
                      var offTrack = 0;
                      var cbTrack = 0x900;                // this is the raw track length for a 40-track 5.25-inch disk image
              
                      if (this.fJSONNative) {
                          json = "";
                      } else {
                          json = "/*\n *  OSI DiskDump of " + this.sDiskPath + " via " + DiskDump.sNotice + "\n */\n";
                      }
                      json += this.dumpLine(2, "[");
                      json += this.dumpLine(2, "[");      // begin array of heads
              
                      while (true) {
                          var bufSector;
                          var bufTrack = this.bufDisk.slice(offTrack, offTrack + cbTrack);
                          if (!bufTrack.length) {
                              if (iTrack) {
                                  json += this.dumpLine(-2, "}");
                              }
                              break;
                          }
                          var nSectorPages;
                          if (!iTrack) {
                              /*
                               * Track 0 is first, with this format:
                               *
                               *      0x0000: track load address (high and low bytes of 16-bit address, respectively)
                               *      0x0002: number of pages (up to 8)
                               */
                              var nTrackLoad = bufTrack.readUInt16BE(0);
                              json += this.dumpTrackOSI("", 0, null, nTrackLoad);
                              /*
                               * Track 0 supports only 1 sector; it has no nSectorSig (hence the first null), an implied
                               * sector number of 1, and no end signature (hence the second null).
                               */
                              nSectorPages = bufTrack.readUInt8(2);
                              bufSector = bufTrack.slice(3, 3 + nSectorPages * 256);
                              json += this.dumpSectorOSI(null, 1, nSectorPages, bufSector, null, nTrackLoad);
                              json += this.dumpLine(-2, "}");
                              json += this.dumpLine(-2, "]");
                          }
                          else {
                              /*
                               * Track N is next, with this format:
                               *
                               *      0x0000: start-of-track signature "CW" (0x43,0x57)
                               *      0x0002: track number (in BCD); eg, 0x01
                               *      0x0003: track type code (0x58)
                               *              <sector info begins>
                               *      0x0004: sector start code (0x76)
                               *      0x0005: sector number (in binary); eg, 0x01
                               *      0x0006: sector length (no. of pages, in binary); eg, 0x08
                               *      0x0007: <sector data begins>
                               *      0xnnnn: end-of-sector signature "GS" (0x47,0x53); eg, 0xnnnn is 0x0807, using the above examples.
                               *
                               * The next track is typically stored at the next page boundary (eg, 0x0900), which is why
                               * cbTrack is hard-coded to 0x900 above.
                               *
                               * Note that anything from 1 (large) sector to multiple (smaller) sectors can be stored in a single track,
                               * if the sector length byte at 0x0006 is less than 8; for example, if the first sector's length was only 1 page,
                               * then this would follow:
                               *
                               *      0x0107: end-of-sector signature "GS"
                               *              <sector info begins>
                               *      0x0109: sector start code (0x76)
                               *      0x010A: sector number (in binary); eg, 0x02
                               *      0x010B: sector length (no. of pages, in binary); eg, 0x01
                               *      0x010C: <sector data begins>
                               *      0xnnnn: next end-of-sector signature "GS" (0x47,0x53); eg, 0x020C
                               */
                              if (bufTrack.readUInt16BE(0) == 0x4357) {
                                  var nSectorOffset = 0;
                                  json += this.dumpLine(-2, "},");
                                  json += this.dumpTrackOSI("CW", bufTrack.readUInt8(2), bufTrack.readUInt8(3));
                                  bufTrack = bufTrack.slice(4);
                                  while (bufTrack.length > 5 && bufTrack.readUInt8(0) == 0x76) {
                                      nSectorPages = bufTrack.readUInt8(2);
                                      var cbSector = nSectorPages * 256;
                                      bufSector = bufTrack.slice(3, cbSector+3);
                                      var sSectorEndSig = bufTrack.slice(cbSector+3, cbSector+5).toString("ascii");
                                      if (nSectorOffset) json += this.dumpLine(-2, "},");
                                      json += this.dumpSectorOSI(bufTrack.readUInt8(0), bufTrack.readUInt8(1), nSectorPages, bufSector, sSectorEndSig, nSectorOffset);
                                      bufTrack = bufTrack.slice(cbSector+5);
                                      nSectorOffset += cbSector;
                                  }
                                  json += this.dumpLine(-2, "}");
                                  json += this.dumpLine(-2, "]");
                              }
                              else {
                                  DiskDump.logError(new Error("unrecognized OSI disk track at 0x" + str.toHex(offTrack)));
                                  break;
                              }
                          }
                          offTrack += cbTrack;
                          iTrack++;
                      }
                      json += this.dumpLine(-2, "]");
                      json += this.dumpLine(-2, "]");
                  } catch(err) {
                      DiskDump.logError(err);
                  }
                  return json;
              };
              
              /**
               * convertToIMG()
               *
               * Converts the disk image data to a Buffer.
               *
               * TODO: Consider creating a caching mechanism for these requests (ie, stash a limited number of these
               * disk images under /tmp, using a name based on a hash of the source path).
               *
               * @this {DiskDump}
               * @return {Buffer|null} containing the disk image's raw data, or null if no data available (or parse error)
               */
              DiskDump.prototype.convertToIMG = function()
              {
                  if (!this.bufDisk) {
              
                      if (!this.dataDisk) {
                          if (!this.jsonDisk) {
                              return null;
                          }
                          try {
                              /*
                               * These replacements provide compatibility with older JSON disk images
                               * that were generated by convdisk.php and weren't entirely JSON-compatible.
                               */
                              this.jsonDisk = this.jsonDisk.replace(/(sector|length|bytes|data|pattern):/g, '"$1":');
                              /*
                               * Comments can appear even when comments weren't requested; the only situation
                               * where that currently may occur is when a write-protected .DSK file is converted,
                               * requiring us to output a "write-protected" comment on the first line.
                               * A better solution requires revamping the disk image format or, better yet, updating
                               * the FDC component to implement a user-configurable option for write-protecting media.
                               */
                              this.jsonDisk = this.jsonDisk.replace(/\/\/[^\n]*/g, "");
                              /*
                               * There are also some old files that also contain hex constants; eg:
                               *
                               *      "pattern": 0xe5e5e5e5
                               *
                               * which must be converted to decimal before JSON.parse() will be happy.
                               * While I could sit here and search for all hex patterns and replace them,
                               * the proper solution is to simply reconvert those disk images.
                               *
                               * TODO: Generate a clear warning whenever "this.jsonDisk.indexOf("0x") >= 0".
                               *
                               * TODO: Remove the above transformations once we can be sure there are no more
                               * disk images with those legacy features.
                               */
                              this.dataDisk = JSON.parse(this.jsonDisk);
                          } catch(err) {
                              DiskDump.logError(err);
                              return null;
                          }
                      }
              
                      /*
                       * The following code was adapted from the mount() method in disk.js, and assumes a homogeneous disk
                       * format with 512-byte sectors.
                       *
                       * TODO: Rework this code to support non-homogeneous disk formats (eg, variable sector sizes, variable
                       * sectors per track, etc).
                       */
                      var buf = null;
              
                      try {
                          /*
                           * We need to be prepared for any number of errors due to malformed data; in fact, it's entirely
                           * possible the JSON we just parsed is NOT a disk image, which means nCylinders, nHeads, etc may be
                           * undefined, in which case an exception will occur almost immediately.
                           */
                          var nCylinders = this.dataDisk.length;
                          var nHeads = this.dataDisk[0].length;
                          var nSectorsPerTrack = this.dataDisk[0][0].length;
                          var cbDisk = nCylinders * nHeads * nSectorsPerTrack * 512;
              
                          var off = 0;
                          buf = new Buffer(cbDisk);
              
                          /*
                           * WARNING: Buffers are NOT zero-initialized, so we need explicitly fill it with zeros (this seems to
                           * be a reversal in the trend to zero buffers, when security concerns used to trump performance concerns).
                           */
                          buf.fill(0);
              
                          for (var iCylinder = 0; iCylinder < nCylinders; iCylinder++) {
                              for (var iHead = 0; iHead < this.dataDisk[iCylinder].length; iHead++) {
                                  for (var iSector = 0; iSector < this.dataDisk[iCylinder][iHead].length; iSector++) {
                                      var idw;
                                      var sector = this.dataDisk[iCylinder][iHead][iSector];
                                      var length = sector['length'];
                                      if (length === undefined) {     // provide backward-compatibility with older JSON...
                                          length = sector['length'] = 512;
                                      }
                                      length >>= 2;                   // convert length from a byte-length to a dword-length
                                      var dwPattern = sector['pattern'];
                                      if (dwPattern === undefined) {
                                          dwPattern = sector['pattern'] = 0;
                                      }
                                      var adw = sector['data'];
                                      if (adw === undefined) {
                                          var ab = sector['bytes'];
                                          if (ab === undefined || !ab.length) {
                                              /*
                                               * It would be odd if there was neither a 'bytes' nor 'data' array; I'm just
                                               * being paranoid.  It's more likely that the 'bytes' array is simply empty,
                                               * in which case we need only create an empty 'data' array and turn the byte
                                               * pattern, if any, into a dword pattern.
                                               */
                                              adw = [];
                                              // if (DEBUG) this.assert((dwPattern & 0xff) == dwPattern);
                                              dwPattern = sector['pattern'] = (dwPattern | (dwPattern << 8) | (dwPattern << 16) | (dwPattern << 24));
                                          } else {
                                              /*
                                               * To keep the conversion code simple, we'll do any necessary pattern-filling first,
                                               * to fully "inflate" the sector, eliminating the possibility of partial dwords and
                                               * saving any code downstream from dealing with byte-size patterns.
                                               */
                                              var ib;
                                              var cb = length << 2;
                                              for (ib = ab.length; ib < cb; ib++) {
                                                  ab[ib] = dwPattern; // the pattern for byte-arrays was only a byte
                                              }
                                              ib = 0;
                                              adw = new Array(length);
                                              for (idw = 0; idw < adw.length; idw++) {
                                                  adw[idw] = ab[ib] | (ab[ib + 1] << 8) | (ab[ib + 2] << 16) | (ab[ib + 3] << 24);
                                                  ib += 4;
                                              }
                                          }
                                          delete sector['bytes'];
                                          sector['data'] = adw;
                                      }
                                      /*
                                       * Now the current sector has ALL of the following properties:
                                       *
                                       *      'sector': sector number
                                       *      'length': size of the sector, in bytes
                                       *      'data': array of dwords
                                       *      'pattern': dword pattern to use for empty or partial sectors
                                       *
                                       * TODO: Honor the 'sector' property and dump the sectors in sector-number order.
                                       */
                                      for (idw = 0; idw < length; idw++) {
                                          var dw = (idw < adw.length? adw[idw] : dwPattern);
                                          buf.writeInt32LE(dw, off);
                                          off += 4;
                                      }
                                  }
                              }
                          }
                          /*
                           * Since there's no way (and rightly so) of setting fDebug via the API, I've added the check for
                           * fJSONComments as another way of disabling "branding" via the API; requesting an IMG file with comments
                           * is otherwise a nonsensical request.
                           */
                          if (!fDebug && !this.fJSONComments && buf.length < 3000000) {   // arbitrary size threshold between diskette images and hard disk images
                              /*
                               * Mimic the BPB test in convertToJSON(), because we don't want to blast an OEM string into non-DOS diskette images
                               */
                              var bByte0 = buf.readUInt8(DiskAPI.BOOT.JMP_OPCODE);
                              var cbSectorBPB = buf.readUInt16LE(DiskAPI.BPB.SECTOR_BYTES);
                              if ((bByte0 == X86.OPCODE.JMP || bByte0 == X86.OPCODE.JMPS) && cbSectorBPB == 512) {
                                  /*
                                   * Overwrite the OEM string with our own, so that people know how the image originated
                                   */
                                  buf.write(DiskDump.MY_OEM_STRING, DiskAPI.BOOT.OEM_STRING, DiskDump.MY_OEM_STRING.length);
                              }
                          }
                      } catch(err) {
                          DiskDump.logError(err);
                          return null;
                      }
              
                      this.bufDisk = buf;
                  }
                  return this.bufDisk;
              };
              
              module.exports = DiskDump;
              
          • README.md
            DiskDump
            ===
            
            **DiskDump** is a Node module with both a command-line interface and a web server API for converting disk images
            to/from various formats (eg, JSON files, JSON files with comments, IMG disk images, etc). 
            
            Building Disk Images from Folders/Files
            ---
            In addition to converting disk images to/from JSON, DiskDump can also create disk images from the contents of local
            files/folders.
            
            For example, from the root directory of the project, you could run:
            
            	node modules/diskdump/bin/diskdump --path="apps/pc/1981/visicalc/README.md" --format=img --output=disk.img
            
            to produce a `disk.img` containing one file, "README.md", which you could then mount on your local operating
            system *or* inside a PCjs machine.
            
            To make the disk image more useful, you might want to download a copy of [VisiCalc](http://www.bricklin.com/history/vcexecutable.htm)
            into that folder as well, so that you could then run:
            
            	node modules/diskdump/bin/diskdump --path="apps/pc/1981/visicalc/vc.com;README.md" --format=img --output=disk.img
            
            to produce a `disk.img` containing both "VC.COM" and "README.md".  In fact, this is exactly how the
            [disk.json](/apps/pc/1981/visicalc/disk.json) stored in the [VisiCalc](/apps/pc/1981/visicalc/) folder was generated.
            
            The equivalent web server API request would look like:
            
            	http://localhost:8088/api/v1/dump?path=/apps/pc/1981/visicalc/vc.com;README.md&format=img
            	
            DiskDump is a port of the original [JavaScript Machines](http://jsmachines.net/) **convdisk.php** utility.
            
          • package.json
            {
              "name": "diskdump",
              "version": "0.2.0",
              "description": "Converts disk images to/from JSON",
              "main": "./lib/diskdump",
              "scripts": {
                "test": "echo \"error: no test specified\" && exit 1"
              },
              "author": "Jeff Parsons <Jeff@pcjs.org>",
              "licenses": [
                {
                  "type": "GPLv3",
                  "url": "http://www.gnu.org/licenses/gpl.html"
                }
              ],
              "bin": {
                "diskdump": "./bin/diskdump"
              }
            }
            
        • filedump
          • bin
            • filedump
              #!/usr/bin/env node
              /**
               * @fileoverview Implements the FileDump command-line interface
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              var path = require("path");
              var fs = require("fs");
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              require(lib + "filedump.js").CLI();
              
          • lib
            • filedump.js
              /**
               * @fileoverview Converts file contents to JSON
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-02-01
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var fs      = require("fs");
              var path    = require("path");
              var mkdirp  = require("mkdirp");
              var net     = require("../../shared/lib/netlib");
              var proc    = require("../../shared/lib/proclib");
              var str     = require("../../shared/lib/strlib");
              var DumpAPI = require("../../shared/lib/dumpapi");
              
              /**
               * FileDump()
               *
               * TODO: Consider adding a "map" option that allows the user to supply a MAP filename (via a "map" API parameter
               * or a "--map" command-line option), which in turn triggers a call to loadMap().  Note that loadMap() will need
               * to be a bit more general and use a worker function that calls either net.getFile() or fs.readFile(), similar
               * to what our loadFile() function already does.
               *
               * @constructor
               * @param {string|undefined} sFormat should be one of "json"|"data"|"hex"|"bytes"|"rom" (see the FORMAT constants)
               * @param {boolean|string|undefined} fComments enables comments and other readability enhancements in the JSON output
               * @param {boolean|string|undefined} fDecimal forces decimal output if not undefined
               * @param {number|string|undefined} offDump
               * @param {number|string|undefined} nWidthDump
               * @param {string} [sServerRoot]
               */
              function FileDump(sFormat, fComments, fDecimal, offDump, nWidthDump, sServerRoot)
              {
                  this.fDebug = false;
                  this.sFormat = (sFormat || DumpAPI.FORMAT.JSON);
                  this.fJSONNative = (this.sFormat == DumpAPI.FORMAT.JSON && !fComments);
                  this.nJSONIndent = 0;
                  this.fJSONComments = fComments;
                  this.sJSONWhitespace = (this.fJSONComments? " " : "");
                  this.fDecimal = fDecimal;
                  this.offDump = +offDump || 0;
                  this.nWidthDump = +nWidthDump || 16;
                  this.sServerRoot = sServerRoot || process.cwd();
                  this.buf = null;
                  /*
                   * TODO: Decide what to do with this usage info; we can't use it as a default, because setting this.json
                   * causes outputFile() to ignore this.buf indiscriminately (ie, it breaks non-JSON output modes).
                   */
                  this.json = ""; // "[\n  /**\n   * " + FileDump.sAPIURL + " " + FileDump.sCopyright + "\n   * " + FileDump.sUsage + "\n   */\n]";
              }
              
              /*
               * Class constants
               */
              FileDump.sAPIURL = "http://www.pcjs.org" + DumpAPI.ENDPOINT;
              FileDump.sCopyright = "© 2012-2015 by Jeff Parsons (@jeffpar)";
              FileDump.sNotice = FileDump.sAPIURL + " " + FileDump.sCopyright;
              FileDump.sUsage = "Usage: " + FileDump.sAPIURL + "?" + DumpAPI.QUERY.FILE + "=({path}|{URL})&" + DumpAPI.QUERY.FORMAT + "=(json|data|hex|bytes|rom)";
              
              FileDump.asBadExts = [
                  "js", "log"
              ];
              
              /*
               * Class methods
               */
              
              /**
               * CLI()
               *
               * Provides the command-line interface for the FileDump module.
               *
               * Usage
               * ---
               *      filedump --file=({path}|{URL}) [--merge=({path}|{url})] [--format=(json|data|hex|bytes|rom)] [--comments]
               *               [--decimal] [--offset={number}] [--width={number}] [--output={path}] [--overwrite]
               *
               * Arguments
               * ---
               *      The default format is "json", which generates an array of signed 32-bit decimal values; "hex" is an older
               *      text format that consists entirely of 2-character hex values (deprecated), and "bytes" is a JSON-like format
               *      that also uses hex values (but with "0x" prefixes) and is normally used only when comments are enabled (use
               *      --decimal to force decimal byte output).
               *
               *      When a second file is "merged", the first file sets all even bytes and the second file sets all odd bytes.
               *      In fact, any number of files can be merged: if there are N files, file #1 sets bytes at "offset mod N == 0",
               *      file #2 sets all bytes at "offset mod N == 1", and file #N sets all bytes at "offset mod N == N - 1".
               *
               *      Note that command-line arguments, if any, are not validated.  For example, argv['comments'] may be any of
               *      boolean, string, or undefined, since the user may have typed "--comments" or "--comments=foo" or nothing at all.
               *
               * Examples
               * ---
               *      filedump --file=devices/pc/video/ibm-ega.rom --format=bytes --decimal
               *
               * Notes
               * ---
               *      Originally, we had to specify `--format=bytes` because the onLoadROM() code in rom.js assumed the data was
               *      always byte-sized, but it has since been updated to support dword arrays, so the default format ("json")
               *      works fine as well.  Also, `--decimal` reduces the size of the output file significantly.
               *
               *      If there's a ".map" file (eg, "ibm-ega.map"), it's automatically loaded and appended to the ROM data as a
               *      "symbols" property; we may want to consider an option to disable the processing of map files, but for now, the
               *      simple answer is: if you don't want one, don't create one.
               */
              FileDump.CLI = function()
              {
                  var args = proc.getArgs();
              
                  if (!args.argc) {
                      console.log("usage: filedump --file=({path}|{URL}) [--merge=({path}|{url})] [--format=(json|data|hex|bytes|rom)] [--comments] [--decimal] [--output={path}] [--overwrite]");
                      return;
                  }
              
                  var argv = args.argv;
                  var sFile = argv['file'];
                  if (!sFile || FileDump.asBadExts.indexOf(str.getExtension(sFile)) >= 0) {
                      FileDump.logError(new Error("bad or missing input filename"));
                      return;
                  }
              
                  var sOutputFile = argv['output'];
                  if (sOutputFile && sOutputFile.charAt(0) != '/') sOutputFile = path.join(process.cwd(), sOutputFile);
                  var fOverwrite = argv['overwrite'];
              
                  var sFormat = FileDump.validateFormat(argv['format']);
                  if (sFormat === false) {
                      FileDump.logError(new Error("unrecognized format"));
                      return;
                  }
              
                  var sMergeFile, asMergeFiles = [];
                  var file = new FileDump(sFormat, argv['comments'], argv['decimal'], argv['offset'], argv['width']);
                  if (argv['merge']) {
                      if (typeof argv['merge'] == "string") {
                          asMergeFiles.push(argv['merge']);
                      } else {
                          for (sMergeFile in argv['merge']) asMergeFiles.push(sMergeFile);
                      }
                  }
                  var cMergesPending = asMergeFiles.length;
                  var iStart = 0, nSkip = cMergesPending;
                  file.loadFile(sFile, iStart++, nSkip, function(err) {
                      if (!err) {
                          var cErrors = 0;
                          while ((sMergeFile = asMergeFiles.shift())) {
                              file.loadFile(sMergeFile, iStart++, nSkip, function(err) {
                                  if (err) cErrors++;
                                  if (!--cMergesPending) {
                                      if (!cErrors) file.convertToFile(sOutputFile, fOverwrite);
                                  }
                              });
                          }
                          if (!cMergesPending) {
                              if (argv['checksum']) console.log("checksum: " + file.getChecksum());
                              file.convertToFile(sOutputFile, fOverwrite);
                          }
                      }
                  });
              };
              
              /**
               * logError(err)
               *
               * Conditionally logs an error to the console.
               *
               * @param {Error} err
               * @return {string} the error message that was logged (or that would have been logged had logging been enabled)
               */
              FileDump.logError = function(err)
              {
                  var sError = "";
                  if (err) {
                      sError = "filedump error: " + err.message;
                      console.log(sError);
                  }
                  return sError;
              };
              
              /**
               * validateFormat(sFormat)
               *
               * @param {string} sFormat
               * @return {null|string|boolean} the validated format, null if unspecified, or false if invalid
               */
              FileDump.validateFormat = function(sFormat)
              {
                  if (!sFormat) {
                      return null;
                  }
                  for (var s in DumpAPI.FORMAT) {
                      if (sFormat == DumpAPI.FORMAT[s]) return sFormat;
                  }
                  return false;
              };
              
              /*
               * Object methods
               */
              
              /**
               * loadFile(sFile, iStart, nSkip, done)
               *
               * This used to be part of the FileDump constructor, but I felt it would be safer to separate
               * object creation from any I/O that the object may perform, to ensure that a callback can never
               * be called before the caller has actually received the newly created object.
               *
               * @this {FileDump}
               * @param {string} sFile
               * @param {number} iStart
               * @param {number} nSkip
               * @param {function(Error)} done
               */
              FileDump.prototype.loadFile = function(sFile, iStart, nSkip, done)
              {
                  var obj = this;
              
                  var sExt = str.getExtension(sFile);
                  var options = {encoding: sExt == DumpAPI.FORMAT.JSON || sExt == DumpAPI.FORMAT.HEX? "utf8" : null};
              
                  var sFilePath = net.isRemote(sFile)? sFile : path.join(this.sServerRoot, sFile);
              
                  if (!this.sFilePath) this.sFilePath = sFilePath;
                  if (this.fDebug) console.log("loadFile(" + sFilePath + "," + iStart + "," + nSkip + ")");
              
                  if (net.isRemote(sFilePath)) {
                      net.getFile(sFilePath, options.encoding, function(err, status, buf) {
                          if (err) {
                              FileDump.logError(err);
                              done(err);
                              return;
                          }
                          obj.setData(buf, iStart, nSkip);
                          done(null);
                      });
                  } else {
                      fs.readFile(sFilePath, options, function(err, buf) {
                          if (err) {
                              FileDump.logError(err);
                              done(err);
                              return;
                          }
                          obj.setData(buf, iStart, nSkip);
                          done(null);
                      });
                  }
              };
              
              /**
               * setData(buf, iStart, nSkip)
               *
               * Records the given file data in the FileDump's buffer
               *
               * @this {FileDump}
               * @param {Buffer|string} buf
               * @param {number} iStart
               * @param {number} nSkip
               */
              FileDump.prototype.setData = function(buf, iStart, nSkip)
              {
                  var b, i, j, s;
                  if (typeof buf == "string") {
                      var ab = [];
                      if (buf.indexOf('{') >= 0) {
                          /*
                           * Treat the incoming string data as JSON data.
                           */
                          var json;
                          try {
                              json = JSON.parse(buf);
                          } catch (e) {
                              json = null;
                          }
                          if (json && json.data && json.data.length) {
                              for (i = 0; i < json.data.length; i++) {
                                  var dw = json.data[i];
                                  for (j = 0; j < 4; j++) {
                                      ab.push(dw & 0xff);
                                      dw >>>= 8;
                                  }
                              }
                          }
                      }
                      else {
                          /*
                           * Treat the incoming string data as HEX (ie, a series of byte values encoded in hex, separated by whitespace)
                           */
                          var as = buf.split(/\s+/);
                          for (i = 0; i < as.length; i++) {
                              s = as[i];
                              if (!s.length) continue;
                              if (isNaN(b = parseInt(s, 16))) break;
                              ab.push(b);
                          }
                      }
                      /*
                       * If we didn't recognize the data, then simply return, leaving this.buf undefined.
                       */
                      if (!ab.length) return;
              
                      buf = new Buffer(ab);
                  }
                  if (!this.buf) {
                      if (!nSkip) {
                          this.buf = buf;
                      } else {
                          this.buf = new Buffer(buf.length * (nSkip + 1));
                      }
                  }
                  if (nSkip) {
                      for (i = 0; i < buf.length; i++) {
                          this.buf.writeUInt8(b = buf.readUInt8(i), iStart);
                          iStart += nSkip + 1;
                      }
                  }
              };
              
              /**
               * getData()
               *
               * @this {FileDump}
               * @return {Buffer|null}
               */
              FileDump.prototype.getData = function()
              {
                  return this.buf;
              };
              
              /**
               * getChecksum()
               *
               * @this {FileDump}
               * @return {number|null}
               */
              FileDump.prototype.getChecksum = function()
              {
                  if (!this.buf) return null;
                  var b = 0;
                  for (var i = 0; i < this.buf.length; i++) {
                      b += this.buf.readUInt8(i);
                  }
                  return b & 0xff;
              };
              
              /**
               * dumpLine(nIndent, sLine, sComment)
               *
               * @this {FileDump}
               * @param {number} [nIndent] is the relative number of characters to indent the given line (0 if none)
               * @param {string} [sLine] is the given line
               * @param {string} [sComment] is an optional comment to append to the line, if comment output is enabled
               * @return {string} the indented/commented line
               */
              FileDump.prototype.dumpLine = function(nIndent, sLine, sComment)
              {
                  if (nIndent < 0) {
                      this.nJSONIndent += nIndent;
                  }
                  if (this.fJSONComments) {
                      sLine = "                                ".substr(0, this.nJSONIndent) + (sLine? (sLine + (sComment? (" // " + sComment) : "")) : "");
                  }
                  if (sLine) sLine += "\n";
                  if (nIndent > 0) {
                      this.nJSONIndent += nIndent;
                  }
                  return sLine;
              };
              
              /**
               * dumpBuffer(sKey, buf, len, cbItem, offDump, nWidthDump)
               *
               * @this {FileDump}
               * @param {string|null} sKey is name of buffer data element
               * @param {Buffer} buf is a Buffer containing the bytes to dump
               * @param {number} len is the number of bytes to dump
               * @param {number} cbItem is either 1 or 4, to dump bytes or dwords respectively
               * @param {number} [offDump] is a relative offset (default is 0; see constructor)
               * @param {number} [nWidthDump] is an alternate width (default is 16; see constructor)
               * @return {string} hex (or decimal) representation of the data
               */
              FileDump.prototype.dumpBuffer = function(sKey, buf, len, cbItem, offDump, nWidthDump)
              {
                  var chOpen = '', chClose = '', chSep = ' ', sHexPrefix = "";
              
                  this.sKey = sKey;
              
                  if (this.sFormat != DumpAPI.FORMAT.HEX) {
                      chOpen = '['; chClose = ']'; chSep = ',';
                  }
              
                  offDump = offDump || this.offDump;
                  nWidthDump = nWidthDump || this.nWidthDump;
              
                  var sDump = this.dumpLine(2, (sKey? '"' + sKey + '":' : "") + this.sJSONWhitespace + chOpen);
              
                  var sLine = "";
                  var sASCII = "";
                  var cMaxCols = nWidthDump * cbItem;
              
                  for (var off = offDump; off < len; off += cbItem) {
              
                      /*
                       * WARNING: Whenever the following condition arises, you probably have a non-dword-granular
                       * file, and you should have requested a byte-granular dump instead.
                       */
                      if (off + cbItem > buf.length) {
                          break;
                      }
              
                      var v = (cbItem == 1? buf.readUInt8(off) : buf.readInt32LE(off));
              
                      if (off > offDump) {
                          sLine += chSep;
                          if (!((off - offDump) % cMaxCols)) {    // jshint ignore:line
                              sDump += this.dumpLine(0, sLine, sASCII);
                              sLine = sASCII = "";
                          }
                      }
                      if (cbItem > 1) {
                          sLine += v;
                      }
                      else {
                          if (this.fDecimal) {
                              sLine += v;
                          } else {
                              sLine += str.toHexByte(v);
                          }
                          if (!sASCII) sASCII = "0x" + str.toHex(off) + " ";
                          sASCII += (v >= 0x20 && v < 0x7F && v != 0x3C && v != 0x3E? String.fromCharCode(v) : ".");
                      }
                  }
              
                  sDump += this.dumpLine(0, sLine + chClose, sASCII);
                  this.dumpLine(-2);
              
                  return sDump;
              };
              
              /**
               * loadMap(sFilePath, done)
               *
               * NOTE: Since ".map" files are an internal construct, I support only local map files (for now)
               *
               * @this {FileDump}
               * @param {string} sFilePath
               * @param {function(Error,string)} done
               */
              FileDump.prototype.loadMap = function(sFilePath, done)
              {
                  /*
                   * The HEX format doesn't support MAP files, because old HEX clients expect an Array of bytes,
                   * not an Object.  For all other (JSON) formats, we assume that the JSON is "unwrapped" at this point,
                   * and so even if loadMap() doesn't find a map file, it will still wrap the resulting JSON with braces.
                   */
                  if (this.sFormat != DumpAPI.FORMAT.HEX) {
                      if (!this.sKey) {
                          this.json = '"bytes":' + this.json;
                      }
                      var obj = this;
                      var sMapPath = sFilePath.replace(/\.(rom|json)$/, ".map");
                      if (str.endsWith(sMapPath, ".map")) {
                          var sMapFile = path.basename(sMapPath);
                          fs.readFile(sMapPath, {encoding: "utf8"}, function(err, str) {
                              var sMapData = null;
                              if (err) {
                                  /*
                                   * This isn't really an error (map files are optional), although it might be helpful to display
                                   * a warning.  In any case, this is also why the first done() callback below always passes null for
                                   * the Error parameter.
                                   *
                                   FileDump.logError(err);
                                   */
                              }
                              else {
                                  // console.log("add this to obj.json:\n" + str);
              
                                  /*
                                   * Parse MAP data into a set of properties; for example, if the .map file contains:
                                   *
                                   *           0320   =   HF_PORT
                                   *      0000:0034   4   HDISK_INT
                                   *      0040:0042   1   CMD_BLOCK
                                   *           0003   @   DISK_SETUP
                                   *      0000:004C   4   ORG_VECTOR
                                   *           0028   .   MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR
                                   *
                                   * where the symbols in the second column of the .map file indicate type/size information as follows:
                                   *
                                   *      =   unsized value
                                   *      1   1-byte (DB) value
                                   *      2   2-byte (DW) value
                                   *      4   4-byte (DD) value
                                   *      @   label
                                   *      .   reference
                                   *      +   bias (ie, value to be added to all following offsets)
                                   *
                                   * then we should produce the following corresponding JSON:
                                   *
                                   *      {
                                   *          "HF_PORT": {
                                   *              "v":800
                                   *          },
                                   *          "HDISK_INT": {
                                   *              "b":4, "s":0, "o":52
                                   *          },
                                   *          "ORG_VECTOR": {
                                   *              "b":4, "s":0, "o":76
                                   *          },
                                   *          "CMD_BLOCK": {
                                   *              "b":1, "s":64, "o":66
                                   *          },
                                   *          "DISK_SETUP": {
                                   *              "o":3
                                   *          },
                                   *          ".40": {
                                   *              "o":64, "a":"MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR"
                                   *          }
                                   *      }
                                   *
                                   * where "v" is the value of an absolute (unsized) value; "b" is either 1, 2, 4 or undefined; "s" is either a hard-coded
                                   * segment or undefined; and "o" is the offset of an symbol.  Also, if the symbol is not entirely upper-case, then we
                                   * store the original-case version of the symbol as an "l" property.
                                   *
                                   * If the same symbol appears more than once in a .map file, the value of the last occurrence will replace any previous
                                   * occurrence(s).
                                   *
                                   * aSymbols() wil be an associative array containing an entry for every symbol, where the key is the symbol and the value
                                   * is another associative array containing the other properties described above.
                                   */
                                  var nBias = 0;
                                  var aSymbols = {};
                                  var asLines = str.split('\n');
                                  for (var iLine = 0; iLine < asLines.length; iLine++){
                                      var s = asLines[iLine].trim();
                                      if (!s || s.charAt(0) == ';') continue;
                                      var match = s.match(/^\s*([0-9A-Z:]+)\s+([=124@\.\+])\s*(.*?)\s*$/i);
                                      if (match) {
                                          var sValue = match[1];
                                          var sSegment = null;
                                          var i = sValue.indexOf(':');
                                          if (i >= 0) {
                                              sSegment = sValue.substr(0, i);
                                              sValue = sValue.substr(i+1);
                                          }
                                          var sType = match[2];
                                          var sSymbol = match[3].replace(/"/g, "''");
                                          var sComment = null;
                                          i = sSymbol.indexOf(';');
                                          if (i >= 0) {
                                              sComment = sSymbol.substr(i+1).trim();
                                              sSymbol = sSymbol.substr(0, i).trim();
                                          }
                                          var sID = sSymbol.toUpperCase();
                                          var aValue = {};
                                          switch (sType) {
                                          case '=':
                                              aValue['v'] = parseInt(sValue, 16);
                                              break;
                                          case '1':
                                          case '2':
                                          case '4':
                                              aValue['b'] = parseInt(sType, 10);
                                              /* falls through */
                                          case '@':
                                          case '.':
                                              aValue['o'] = parseInt(sValue, 16) + nBias;
                                              if (sSegment) {
                                                  aValue['s'] = parseInt(sSegment, 16);
                                              }
                                              if (sType != '.') break;
                                              match = sSymbol.match(/^([A-Z_][A-Z0-9_]*):\s*(.*)/i);
                                              if (match) {
                                                  sSymbol = match[1];
                                                  sID = sSymbol.toUpperCase();
                                                  if (match[2]) aValue['a'] = match[2];
                                                  if (aSymbols[sID]) {
                                                      sID = '.' + parseInt(sValue, 16);
                                                  }
                                              } else {
                                                  aValue['a'] = sSymbol;
                                                  sID = sSymbol = '.' + parseInt(sValue, 16);
                                              }
                                              break;
                                          case '+':
                                              nBias = parseInt(sValue, 16);
                                              continue;
                                          default:
                                              done(new Error("unrecognized symbol type (" + sType + ") in MAP file: " + sMapFile), null);
                                              return;
                                          }
                                          if (sID != sSymbol) {
                                              aValue['l'] = sSymbol;
                                          }
                                          if (sComment) {
                                              aValue['c'] = sComment;
                                          }
                                          aSymbols[sID] = aValue;
                                          continue;
                                      }
                                      done(new Error("unrecognized line (" + s + ") in MAP file: " + sMapFile), null);
                                      return;
                                  }
                                  sMapData = JSON.stringify(aSymbols);
                                  if (sMapData) {
                                      obj.json = '{' + obj.json + ',"symbols":' + sMapData + '}';
                                  }
                              }
                              if (!sMapData) {
                                  obj.json = '{' + obj.json + '}';
                              }
                              done(null, obj.json);
                          });
                          return;
                      }
                      this.json = '{' + this.json + '}';
                  }
                  done(null, this.json);
              };
              
              /**
               * buildJSON()
               *
               * Common code between the API helper (convertToJSON()) and the command-line helper (convertToFile()).
               *
               * @this {FileDump}
               */
              FileDump.prototype.buildJSON = function()
              {
                  this.json = "";
                  if (!this.buf) {
                      // console.log("no data available in file");
                      this.json = "[ /* no data */ ]";
                  } else {
                      // console.log("length of buffer: " + this.buf.length);
                      if (this.fJSONComments || this.sFormat == DumpAPI.FORMAT.HEX || this.sFormat == DumpAPI.FORMAT.BYTES) {
                          this.json += this.dumpBuffer(null, this.buf, this.buf.length, 1);
                      } else {
                          this.json += this.dumpBuffer("data", this.buf, this.buf.length, 4);
                      }
                  }
              };
              
              /**
               * convertToJSON(done)
               *
               * Converts the data buffer to JSON.
               *
               * @this {FileDump}
               * @param {function(Error,string)} done
               */
              FileDump.prototype.convertToJSON = function(done)
              {
                  this.buildJSON();
                  this.loadMap(this.sFilePath, done);
              };
              
              /**
               * convertToFile(sOutputFile, fOverwrite)
               *
               * Converts the data buffer to JSON, as appropriate.
               *
               * @this {FileDump}
               * @param {string} sOutputFile
               * @param {boolean} fOverwrite
               */
              FileDump.prototype.convertToFile = function(sOutputFile, fOverwrite)
              {
                  if (this.sFormat != DumpAPI.FORMAT.ROM) {
                      var obj = this;
                      this.buildJSON();
                      this.loadMap(sOutputFile || this.sFilePath, function(err, str) {
                          if (err) {
                              FileDump.logError(err);
                          } else {
                              obj.outputFile(sOutputFile, fOverwrite);
                          }
                      });
                      return;
                  }
                  this.outputFile(sOutputFile, fOverwrite);
              };
              
              /**
               * outputFile(sOutputFile, fOverwrite)
               *
               * @this {FileDump}
               * @param {string} sOutputFile
               * @param {boolean} fOverwrite
               */
              FileDump.prototype.outputFile = function(sOutputFile, fOverwrite)
              {
                  var data = this.json || this.buf;
              
                  var sFormat = this.sFormat.toUpperCase();
              
                  if (sOutputFile) {
                      try {
                          if (fs.existsSync(sOutputFile) && !fOverwrite) {
                              console.log(sOutputFile + " exists, use --overwrite to rewrite");
                          } else {
                              var sDirName = path.dirname(sOutputFile);
                              if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
                              fs.writeFileSync(sOutputFile, data);
                              console.log(data.length + "-byte " + sFormat + " file saved as " + sOutputFile);
                          }
                      } catch(err) {
                          FileDump.logError(err);
                      }
                  } else {
                      /*
                       * We'll dump JSON to the console, but not a raw file buffer; we could add an option to
                       * "stringify" buffers, but if that's what the caller wants, they should use "--format=json".
                       */
                      if (typeof data == "string") {
                          console.log(data);
                      } else {
                          console.log("specify --output={file} to save " + data.length + "-byte " + sFormat + " file");
                      }
                  }
              };
              
              module.exports = FileDump;
              
          • README.md
            FileDump
            ===
            Module (and command-line utility) for converting the contents of files to JSON.
            
          • package.json
            {
              "name": "filedump",
              "version": "0.2.0",
              "description": "Converts file contents to JSON",
              "main": "./lib/filedump",
              "scripts": {
                "test": "echo \"error: no test specified\" && exit 1"
              },
              "author": "Jeff Parsons <Jeff@pcjs.org>",
              "licenses": [
                {
                  "type": "GPLv3",
                  "url": "http://www.gnu.org/licenses/gpl.html"
                }
              ],
              "bin": {
                "filedump": "./bin/filedump"
              }
            }
            
        • grunts
          • manifester
            • tasks
              • manifester.js
                /**
                 * grunt-manifester
                 * https://github.com/jeffpar/jsmachines
                 *
                 * Copyright (c) 2014 jeffpar
                 * Licensed under the MIT license.
                 * 
                 * TODO: Update this header with our standard header and fix all the JSHint warnings
                 */
                
                "use strict";
                
                var fs = require("fs");
                var path = require("path");
                var mkdirp = require("mkdirp");
                var url = require("url");
                var async = require("async");
                var parseXML = require("xml2js").parseString;   // see: https://github.com/Leonidas-from-XIV/node-xml2js
                var unzip = require("unzip");
                var util = require("util");
                var net = require("../../../shared/lib/netlib");
                
                module.exports = function (grunt) {
                
                    /*
                     * Please see the Grunt documentation for more information regarding task
                     * creation: http://gruntjs.com/creating-tasks
                     */
                    grunt.registerMultiTask('manifester', 'manifest.xml processor', function() {
                        
                        /*
                         * Merge task-specific and/or target-specific options with these defaults
                         *
                        var options = this.options({
                        });
                         */
                
                        /*
                         * Tell grunt this task is asynchronous
                         */
                        var asManifests = [];
                        var doneGrunt = this.async();
                        
                        /*
                         * Iterate over all specified file groups
                         */
                        this.files.forEach(function(file) {
                
                            file.src.filter(function(sFilePath) {
                                /*
                                 * Warn on and remove invalid source files (if nonull was set)
                                 */
                                if (!grunt.file.exists(sFilePath)) {
                                    grunt.log.warn('Source file "' + sFilePath + '" not found.');
                                    return false;
                                }
                                return true;
                            }).map(function(sFilePath) {
                                /*
                                 * TODO: Given the memory constraints I've run into with Grunt in the past, it would
                                 * probably be better queue up the file paths instead of the file contents, and do async
                                 * readFile() calls.
                                 */
                                asManifests.push(sFilePath);
                            });
                        });
                
                        async.each(asManifests, function processXML(sManifestFile, doneAsync) {
                            var sManifestXML = grunt.file.read(sManifestFile); 
                            parseXML(sManifestXML, function doneParseXML(err, xml) {
                                var cCallbacks = 0;
                                if (xml.manifest) {
                                    // console.log(util.inspect(xml, false, null));
                                    for (var iRepo in xml.manifest.repo) {
                                        var repo = xml.manifest.repo[iRepo];
                                        if (repo.src) {
                                            var src = repo.src[0];
                                            var sURL = src.$['href'];
                                         // var sURL = src._ || src;    // the former is set if there are any attributes, otherwise the element is just a string
                                            console.log('found src URL: "' + sURL + '"');
                                            if (sURL.slice(0, 5) == "http:" && sURL.slice(-1) == '/') {
                                                for (var iDownload in repo.download) {
                                                    var download = repo.download[iDownload];
                                                    var sDownloadFile = download.$['href'];
                                                 // var sDownloadFile = download._ || download;
                                                    console.log("processing download " + sDownloadFile);
                                                    var sRemoteFile = sURL + sDownloadFile;
                                                    var sLocalDir = path.join(path.dirname(sManifestFile), repo.$['dir']);
                                                    if (grunt.file.exists(sLocalDir) || mkdirp.sync(sLocalDir)) {
                                                        var sLocalFile = path.join(sLocalDir, sDownloadFile);
                                                        if (grunt.file.exists(sLocalFile)) {
                                                            console.log("file already exists: " + sLocalFile);
                                                        } else {
                                                            console.log('downloadFile("' + sRemoteFile + '", "' + sLocalFile + '")...');
                                                            cCallbacks++;
                                                            net.downloadFile(sRemoteFile, sLocalFile, function doneDownloadFile(err, status) {
                                                                console.log('downloadFile("' + sRemoteFile + '") returned ' + status + ': ' + (err? false : true));
                                                                if (!err && status == 200 && sLocalFile.slice(-4) == ".zip") {
                                                                    var sLocalZipDir = path.join(sLocalDir, path.basename(sLocalFile, ".zip"));
                                                                    if (grunt.file.exists(sLocalZipDir) || mkdirp.sync(sLocalZipDir)) {
                                                                        /*
                                                                         * TODO: As explained here (https://github.com/EvanOxfeld/node-unzip/issues/40), determine why this ZIP
                                                                         * file (http://beej.us/moria/files/pc/zip-arc/mor55-88.zip) causes an "invalid stored block lengths" error.
                                                                         */
                                                                        fs.createReadStream(sLocalFile).pipe(unzip.Extract({path: sLocalZipDir})).on('close', function() {
                                                                            console.log("unzip complete: " + sLocalZipDir);
                                                                            if (--cCallbacks == 0) doneAsync();
                                                                        });
                                                                        return;
                                                                    } else {
                                                                        grunt.log.warn("unzip directory not available: " + sLocalZipDir);
                                                                    }
                                                                }
                                                                if (--cCallbacks == 0) doneAsync();
                                                            });
                                                        }
                                                    } else {
                                                        grunt.log.warn("download directory not available: " + sLocalDir);
                                                    }
                                                }
                                            } else {
                                                grunt.log.warn("unsupported repo src: " + sURL);
                                            }
                                        }
                                    }
                                }
                                if (!cCallbacks) doneAsync();
                            });
                        }, function(err) {
                            doneGrunt();
                        });
                        
                    });
                };
                
            • test
              • expected
                • custom_options
                  Testing: 1 2 3 !!!
                • default_options
                  Testing, 1 2 3.
              • fixtures
                • 123
                  1 2 3
                • testing
                  Testing
              • manifester_test.js
                'use strict';
                
                var grunt = require('grunt');
                
                /*
                  ======== A Handy Little Nodeunit Reference ========
                  https://github.com/caolan/nodeunit
                
                  Test methods:
                    test.expect(numAssertions)
                    test.done()
                  Test assertions:
                    test.ok(value, [message])
                    test.equal(actual, expected, [message])
                    test.notEqual(actual, expected, [message])
                    test.deepEqual(actual, expected, [message])
                    test.notDeepEqual(actual, expected, [message])
                    test.strictEqual(actual, expected, [message])
                    test.notStrictEqual(actual, expected, [message])
                    test.throws(block, [error], [message])
                    test.doesNotThrow(block, [error], [message])
                    test.ifError(value)
                */
                
                exports.manifester = {
                  setUp: function(done) {
                    // setup here if necessary
                    done();
                  },
                  default_options: function(test) {
                    test.expect(1);
                
                    var actual = grunt.file.read('tmp/default_options');
                    var expected = grunt.file.read('test/expected/default_options');
                    test.equal(actual, expected, 'should describe what the default behavior is.');
                
                    test.done();
                  },
                  custom_options: function(test) {
                    test.expect(1);
                
                    var actual = grunt.file.read('tmp/custom_options');
                    var expected = grunt.file.read('test/expected/custom_options');
                    test.equal(actual, expected, 'should describe what the custom option(s) behavior is.');
                
                    test.done();
                  },
                };
                
            • .gitignore
              node_modules
              npm-debug.log
              tmp
              
            • .jshintrc
              {
                "curly": true,
                "eqeqeq": true,
                "immed": true,
                "latedef": true,
                "newcap": true,
                "noarg": true,
                "sub": true,
                "undef": true,
                "boss": true,
                "eqnull": true,
                "node": true
              }
              
            • Gruntfile.js
              /*
               * grunt-manifester
               * https://github.com/jeffpar/jsmachines
               *
               * Copyright (c) 2014 jeffpar
               * Licensed under the MIT license.
               */
              
              'use strict';
              
              module.exports = function (grunt) {
              
                  // Project configuration.
                  grunt.initConfig({
                      jshint: {
                          all: [
                              'Gruntfile.js',
                              'tasks/*.js',
                              '<%= nodeunit.tests %>'
                          ],
                          options: {
                              jshintrc: '.jshintrc'
                          }
                      },
              
                      // Before generating any new files, remove any previously-created files.
                      clean: {
                          tests: ['tmp']
                      },
              
                      // Configuration to be run (and then tested).
                      manifester: {
                          default_options: {
                              options: {
                              },
                              files: {
                                  'tmp/default_options': ['test/fixtures/testing', 'test/fixtures/123']
                              }
                          },
                          custom_options: {
                              options: {
                                  separator: ': ',
                                  punctuation: ' !!!'
                              },
                              files: {
                                  'tmp/custom_options': ['test/fixtures/testing', 'test/fixtures/123']
                              }
                          }
                      },
              
                      // Unit tests.
                      nodeunit: {
                          tests: ['test/*_test.js']
                      }
              
                  });
              
                  // Actually load this plugin's task(s).
                  grunt.loadTasks('tasks');
              
                  // These plugins provide necessary tasks.
                  grunt.loadNpmTasks('grunt-contrib-jshint');
                  grunt.loadNpmTasks('grunt-contrib-clean');
                  grunt.loadNpmTasks('grunt-contrib-nodeunit');
              
                  // Whenever the "test" task is run, first clean the "tmp" dir, then run this
                  // plugin's task(s), then test the result.
                  grunt.registerTask('test', ['clean', 'manifester', 'nodeunit']);
              
                  // By default, lint and run all tests.
                  grunt.registerTask('default', ['jshint', 'test']);
              
              };
              
            • LICENSE-MIT
              Copyright (c) 2014 jeffpar
              
              Permission is hereby granted, free of charge, to any person
              obtaining a copy of this software and associated documentation
              files (the "Software"), to deal in the Software without
              restriction, including without limitation the rights to use,
              copy, modify, merge, publish, distribute, sublicense, and/or sell
              copies of the Software, and to permit persons to whom the
              Software is furnished to do so, subject to the following
              conditions:
              
              The above copyright notice and this permission notice shall be
              included in all copies or substantial portions of the Software.
              
              THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
              EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
              OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
              NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
              HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
              WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
              FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
              OTHER DEALINGS IN THE SOFTWARE.
              
            • README.md
              # grunt-manifester
              
              > manifest.xml processor
              
              ## Getting Started
              This plugin requires Grunt `~0.4.4`
              
              If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
              
              ```shell
              npm install grunt-manifester --save-dev
              ```
              
              Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
              
              ```js
              grunt.loadNpmTasks('grunt-manifester');
              ```
              
              ## The "manifester" task
              
              ### Overview
              In your project's Gruntfile, add a section named `manifester` to the data object passed into `grunt.initConfig()`.
              
              ```js
              grunt.initConfig({
                manifester: {
                  options: {
                    // Task-specific options go here.
                  },
                  your_target: {
                    // Target-specific file lists and/or options go here.
                  },
                },
              });
              ```
              
              ### Options
              
              #### options.separator
              Type: `String`
              Default value: `',  '`
              
              A string value that is used to do something with whatever.
              
              #### options.punctuation
              Type: `String`
              Default value: `'.'`
              
              A string value that is used to do something else with whatever else.
              
              ### Usage Examples
              
              #### Default Options
              In this example, the default options are used to do something with whatever. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result would be `Testing, 1 2 3.`
              
              ```js
              grunt.initConfig({
                manifester: {
                  options: {},
                  files: {
                    'dest/default_options': ['src/testing', 'src/123'],
                  },
                },
              });
              ```
              
              #### Custom Options
              In this example, custom options are used to do something else with whatever else. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result in this case would be `Testing: 1 2 3 !!!`
              
              ```js
              grunt.initConfig({
                manifester: {
                  options: {
                    separator: ': ',
                    punctuation: ' !!!',
                  },
                  files: {
                    'dest/default_options': ['src/testing', 'src/123'],
                  },
                },
              });
              ```
              
              ## Contributing
              In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
              
              ## Release History
              _(Nothing yet)_
              
            • package.json
              {
                "name": "grunt-manifester",
                "description": "manifest.xml processor",
                "version": "0.1.0",
                "homepage": "https://github.com/jeffpar/jsmachines",
                "author": {
                  "name": "jeffpar",
                  "email": "jeffpar@mac.com"
                },
                "repository": {
                  "type": "git",
                  "url": "git://github.com/jeffpar/jsmachines.git"
                },
                "bugs": {
                  "url": "https://github.com/jeffpar/jsmachines/issues"
                },
                "licenses": [
                  {
                    "type": "MIT",
                    "url": "https://github.com/jeffpar/jsmachines/blob/master/LICENSE-MIT"
                  }
                ],
                "engines": {
                  "node": ">= 0.8.0"
                },
                "scripts": {
                  "test": "grunt test"
                },
                "devDependencies": {
                  "grunt-contrib-jshint": "~0.6.0",
                  "grunt-contrib-clean": "~0.4.0",
                  "grunt-contrib-nodeunit": "~0.2.0",
                  "grunt": "~0.4.4"
                },
                "peerDependencies": {
                  "grunt": "~0.4.4"
                },
                "keywords": [
                  "gruntplugin"
                ]
              }
          • prepjs
            • tasks
              • prepjs.js
                /**
                 * @fileoverview Pre-process JavaScript file(s) with well-defined constants inlined
                 * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
                 * @version 1.1
                 * Created 2014-Mar-22
                 *
                 * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
                 *
                 * This file is part of C1Pjs, PCjs, and other related components written
                 * by Jeff Parsons and originally published at cpusim.org and jsmachines.net.
                 *
                 * C1Pjs and PCjs are free software: you can redistribute them and/or modify
                 * them under the terms of the GNU General Public License as published by
                 * the Free Software Foundation, either version 3 of the License, or
                 * (at your option) any later version.
                 *
                 * C1Pjs and PCjs are distributed in the hope that they will be useful,
                 * but WITHOUT ANY WARRANTY; without even the implied warranty of
                 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                 * GNU General Public License for more details.
                 *
                 * You should have received a copy of the GNU General Public License
                 * along with C1Pjs and PCjs.  If not, see <http://www.gnu.org/licenses/gpl.html>.
                 *
                 * You are required to include the above copyright notice in every source
                 * code file of every copy or modified version of this work, and to display
                 * that copyright notice on every screen that loads or runs any version
                 * of this software (see Computer.sCopyright).
                 *
                 * Some C1Pjs and PCjs files also attempt to load external resource files, such
                 * as character-image files and ROM files. Those external resource files are
                 * not considered part of the PCjs program for purposes of the GNU General Public
                 * License, and the author does not claim any copyright as to their contents.
                 */
                
                /*
                 * Options
                 * ---
                 * The 'includeObjectConstants' option allows replacement of constants defined
                 * within objects, instead of only global constants. Use with caution, because
                 * constants defined within an object scope may not be unique.  This does attempt
                 * to catch any constant collisions and completely disable their replacement, but
                 * it's not foolproof.
                 *
                 * History
                 * ---
                 * Although we run all our code through Google's Closure Compiler, which does a
                 * great job of inlining not only variables but also code to improve performance,
                 * JavaScript doesn't have the notion of "constants", so we have to define all our
                 * constants as properties and simply trust that the Closure Compiler will inline
                 * them all.  I'm not completely trusting, so I've created this script that allows
                 * us to verify the compiler produces substantially the same code whether or not
                 * we inline all our constants first.
                 *
                 * See "inline.php" for the original PHP version of this module.
                 *
                 * Conventions
                 * ---
                 * This script looks for global constant definitions of the form "Component.XXX = YYY;".
                 *
                 * The current approach requires all inlined constants to be defined as properties on
                 * the associated class constructor (ie, as "class constants").  Life might be simpler
                 * if the Closure Compiler honored "@const" references for properties, and who knows,
                 * perhaps the latest version does now; but on the other hand, having my own convention
                 * relieves me from having to annotate every single constant with a "@const" JSDoc tag.
                 *
                 * TODO: Update the C1Pjs sources to use class constants instead of "object constants",
                 * because in order for C1Pjs to benefit from constant inlining, we must reply on the
                 * 'includeObjectConstants' option (hack) to expand the contexts that constants may live
                 * in, which is inherently less safe.  Moreover, that option prevents us from removing
                 * the original constant definitions, because constants like "this.PORT_CRA" could be used
                 * in other contexts that this script will NOT catch (eg, "controller.PORT_CRA").
                 *
                 * TODO: Think about adding another quick hack to this tool, to convert all:
                 *
                 *      at-param {Debugger} dbg
                 * to:
                 *      at-param {Component} dbg
                 *
                 * prior to compilation.  The only reason I declared my "dbg" variables generically,
                 * as Component objects rather than Debugger objects, was to work around compilation
                 * errors in the non-Debugger builds.
                 *
                 * Implementation
                 * ---
                 * This script uses a very simplistic replacement approach that doesn't perform any
                 * parsing, tokenizing or other pre-processing of the source code, which would otherwise
                 * be required if we wanted to guarantee that all our replacements precisely mirrored what
                 * JavaScript actually replaces at run-time.  For example, JavaScript allows any so-called
                 * constant to be redefined at any point, and we don't attempt to catch modifications. 
                 *
                 * This is why it's important that we limit inlining to only those constants described
                 * above, and why such constants must never be altered by the code using them.
                 *
                 * Debugging
                 * ===
                 * Use the following command to debug this task (after making Chrome your default browser):
                 *
                 *      node-debug $(which grunt) prepjs
                 *
                 * which required installing "node-inspector" first:
                 *
                 *      sudo npm install -g node-inspector
                 *
                 * You may also want to enable the heapdump code below, which required installing "heapdump" first:
                 *
                 *      npm install heapdump --save-dev
                 *
                 * TODO: Resolve once and for all the "process out of memory" error that occurs if we don't divide
                 * the src input into smaller chunks.  See the WARNING below.
                 */
                
                'use strict';
                
                // var heapdump = require("heapdump");
                
                /**
                 * compareConstants(a, b)
                 *
                 * @param {Array} a
                 * @param {Array} b
                 * @returns {number}
                 */
                var compareConstants = function(a, b)
                {
                    return b[0].length - a[0].length;
                };
                
                /**
                 * indexOfConstant(sConstant, aConstants)
                 *
                 * @param {string} sConstant
                 * @param {Array} aConstants
                 * @returns {number} index of aConstants entry, or -1 if not found
                 */
                var indexOfConstant = function(sConstant, aConstants)
                {
                    for (var i = 0; i < aConstants.length; i++) {
                        if (sConstant == aConstants[i][0]) {
                            return i;
                        }
                    }
                    return -1;
                };
                
                /**
                 * findConstants(sInput)
                 *
                 * @param {string} sInput
                 * @param {Array} aConstants
                 * @param {boolean} fObjectConstants
                 * @param {boolean} fReplaceConstants
                 * @param {function} [fnLog]
                 * @returns {string} modified input
                 */
                var findConstants = function(sInput, aConstants, fObjectConstants, fReplaceConstants, fnLog) {
                    var sWarning = "";
                    var sConstDef = "[A-Z][A-Za-z0-9_]*";
                    if (fObjectConstants) {
                        sConstDef = "(?:" + sConstDef + "|this)";
                    }
                    var aConstDef;
                    var reConstDef = new RegExp("[ \t]*(" + sConstDef + "\\.[A-Z_][A-Z0-9_\\.]*)\\s*=\\s*(.*?)\\s*;[\t ]*(?://[^\n]*|)\n", "g");
                    while (aConstDef = reConstDef.exec(sInput)) {
                        var i;
                        var sFind = aConstDef[1];
                        var sReplace = aConstDef[2];
                        if (fReplaceConstants && !fObjectConstants) {
                            sInput = sInput.substr(0, aConstDef.index) + sInput.substr(aConstDef.index + aConstDef[0].length);
                            reConstDef.lastIndex -= aConstDef[0].length;
                        }
                        if ((i = indexOfConstant(sFind, aConstants)) >= 0) {
                            sWarning += "/*\n * warning: multiple definitions for '" + sFind + "' (" + sReplace + ")\n */\n";
                            aConstants[i][2] = -1;      // set a negative replacement count to disable this constant definition
                            continue;
                        }
                        /*
                         * If the replacement string is entirely quoted, or parenthesized, or a single constant, then we can leave
                         * the replacement string as-is; otherwise, let's wrap it with parentheses (we could probably wrap everything
                         * with parentheses, but I like to avoid doing that whenever it's completely unnecessary).
                         */
                        if (!sReplace.match(/^["'\(].*["'\)]$/) && sReplace.match(/[^A-Za-z0-9\.]/)) {
                            sReplace = "(" + sReplace + ")";
                        }
                        if (fnLog) {
                            fnLog("found '" + sFind + "' => '" + sReplace + "'");
                            /*
                            if (sFind == "Video.CRT.CURSOR_END") {
                                fnLog("here's where we usually run of memory (" + process.cwd() + ")");
                                heapdump.writeSnapshot();
                            }
                            */
                        }
                        aConstants.push([sFind, sReplace, 0]);
                    }
                    if (sWarning) sInput = sWarning + sInput;
                    return sInput;
                };
                
                /**
                 * replaceConstants(sInput, aConstants, fObjectConstants, fInConstant, fnLog)
                 *
                 * @param {string} sInput
                 * @param {Array} aConstants
                 * @param {boolean} fObjectConstants
                 * @param {boolean} [fInConstant]
                 * @param {function} [fnLog]
                 * @returns {string} modified input
                 */
                var replaceConstants = function(sInput, aConstants, fObjectConstants, fInConstant, fnLog)
                {
                    do {
                        var cReplacements = 0;
                        for (var i = 0; i < aConstants.length; i++) {
                            if (aConstants[i][2] < 0) continue;     // skip any replacement for which we recorded multiple definitions (ie, negative replacement count)
                            var sFind = aConstants[i][0];
                            var sReplace = aConstants[i][1];
                            var cchFind = sFind.length;
                            var cchReplace = sReplace.length;
                            var iNext = 0;
                            while ((iNext = sInput.indexOf(sFind, iNext)) >= 0) {
                                if (fObjectConstants) {
                                    /*
                                     * As discussed earlier, the 'includeObjectConstants' option precludes removing any constant definitions,
                                     * so we must additionally ensure that we don't inadvertently perform replacements on those definitions.
                                     */
                                    if (sInput.substr(iNext, 1024).match(/([A-Za-z][A-Za-z0-9_]*\.[A-Z_][A-Z0-9_\.]*)\s*=\s*(.*?)\s*;[\t ]*(?:\/\/[^\n]*|)\n/)) {
                                        iNext += cchFind;
                                        continue;
                                    }
                                }
                                if (fnLog) {
                                    fnLog("replaced '" + sFind + "' with '" + sReplace + "'");
                                }
                                sInput = sInput.substr(0, iNext) + sReplace + sInput.substr(iNext + cchFind);
                                aConstants[i][2]++;
                                cReplacements++;
                                iNext += cchReplace;
                            }
                            /*
                             * If we've just done any replacements within another constant, then start the process over again
                             * with the longest constant, to ensure we don't perform any partial replacements.
                             */
                            if (fInConstant && cReplacements) break;
                        }
                    } while (cReplacements);
                    return sInput;
                };
                
                module.exports = function(grunt) {
                
                    // Please see the Grunt documentation for more information regarding task
                    // creation: http://gruntjs.com/creating-tasks
                
                    grunt.registerMultiTask('prepjs', 'JS Preprocessor', function() {
                        /*
                         * Merge task-specific and/or target-specific options with these defaults.
                         */
                        var options = this.options({
                            includeObjectConstants: false,
                            listConstants: true,
                            replaceConstants: true
                        });
                        /*
                         * Iterate over all specified file groups.
                         *
                         * See http://gruntjs.com/inside-tasks#this.files, which says in part:
                         *
                         *      Your task should iterate over the this.files array, utilizing the src and dest
                         *      properties of each object in that array. The this.files property will always be an array.
                         *      The src property will also always be an array, in case your task cares about multiple
                         *      source files per destination file.
                         *
                         * And http://gruntjs.com/configuring-tasks#files-array-format, which explains that all files
                         * objects support src and dest but the 'Files Array' format supports a few additional properties:
                         *
                         *      filter: Either a valid fs.Stats method name or a function that is passed the matched
                         *      src filepath and returns true or false;
                         *
                         *      nonull: If set to true then the operation will include non-matching patterns. Combined
                         *      with grunt's --verbose flag, this option can help debug file path issues;
                         *
                         *      dot: Allow patterns to match filenames starting with a period, even if the pattern does
                         *      not explicitly have a period in that spot;
                         *
                         *      matchBase: If set, patterns without slashes will be matched against the basename of the path
                         *      if it contains slashes. For example, a?b would match the path /xyz/123/acb, but not /xyz/acb/123;
                         *
                         *      expand: Process a dynamic src-dest file mapping, see "Building the files object dynamically"
                         *      for more information.
                         */
                        this.files.forEach(function(file) {
                
                            /*
                             * Allow any of our options to be set at the target level as well
                             */
                            var fObjectConstants = file.includeObjectConstants;
                            if (fObjectConstants === undefined) fObjectConstants = options.includeObjectConstants;
                
                            var fListConstants = file.listConstants;
                            if (fListConstants === undefined) fListConstants = options.listConstants;
                
                            var fReplaceConstants = file.replaceConstants;
                            if (fReplaceConstants === undefined) fReplaceConstants = options.replaceConstants;
                
                            /*
                             * Read all file contents into src
                             */
                            var src = file.src.filter(function(sFilePath) {
                                /*
                                 * Warn on and remove invalid source files (if nonull was set)
                                 */
                                if (!grunt.file.exists(sFilePath)) {
                                    grunt.log.warn('Source file "' + sFilePath + '" not found.');
                                    return false;
                                }
                                return true;
                            }).map(function(sFilePath) {
                                /*
                                 * Read a file
                                 */
                                return grunt.file.read(sFilePath);
                            }).join("\n");
                
                            /*
                             * Find all the constants in src, and remove their definitions from src if possible
                             * (ie, if fReplaceConstants is true and fObjectConstants is false).
                             *
                             * aConstants is the array of constant definitions, where each definition is another
                             * 3-element array:
                             *
                             *      [0]: the original string (ie, the name of the constant)
                             *      [1]: the replacement string (ie, the value of the constant)
                             *      [2]: a replacement count, initialized to zero; set to -1 if a duplicate is found
                             *
                             * WARNING: Grunt (ie, Node) fails with the following error:
                             *
                             *      FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
                             *
                             * when processing a large src stream (eg, on the order 1.5Mb), and it always seems to
                             * die in findConstants()'s call to RegExp's exec() method.  I couldn't glean any clues
                             * from the heapdump (other than observing that, yes, running Grunt generates a shitload of
                             * objects and is probably not very well-tuned), so I've implemented a simple work-around:
                             * divide the src stream into two parts.  If necessary, this work-around can easily be
                             * generalized to N parts.  If the problem is a direct side-effect of passing very large
                             * strings to the RegExp library, then this is clearly one way to avoid that problem.
                             */
                            var aConstants = [];
                            var i = src.length/2;
                            i = src.indexOf("\n", i) + 1;       // divide the src after the first linefeed beyond the midpoint
                            var src1 = src.substr(0, i);
                            var src2 = src.substr(i);
                            // grunt.log.writeln("findConstants(src1): " + src1.length + " chars");
                            src1 = findConstants(src1, aConstants, fObjectConstants, fReplaceConstants);
                            // grunt.log.writeln("findConstants(src2): " + src2.length + " chars");
                            src2 = findConstants(src2, aConstants, fObjectConstants, fReplaceConstants);
                
                            /*
                             * Sort the constants in order of longest definition to shortest, because we perform all the replacements
                             * in array order, and we can't allow definitions that are subsets of longer definitions to be replaced first.
                             */
                            // grunt.log.writeln("aConstants.sort()");
                            aConstants.sort(compareConstants);
                
                            // grunt.log.writeln("replacing constants in other constants");
                            aConstants.forEach(function(constant) {
                                constant[1] = replaceConstants(constant[1], aConstants, fObjectConstants, true);
                            });
                
                            if (fReplaceConstants) {
                                // grunt.log.writeln("replaceConstants(src1)");
                                src1 = replaceConstants(src1, aConstants, fObjectConstants, false);
                                // grunt.log.writeln("replaceConstants(src2)");
                                src2 = replaceConstants(src2, aConstants, fObjectConstants, false);
                                // grunt.log.writeln("replaceConstants() complete");
                            }
                
                            var sListing = "";
                
                            if (fListConstants) {
                                // grunt.log.writeln("listing constants");
                                sListing += "/*\n * List of grunt-prepjs replacements:\n *\n";
                                for (i = 0; i < aConstants.length; i++) {
                                    sListing += " * " + aConstants[i][0] + " => " + aConstants[i][1]  + " (" + aConstants[i][2] + " occurrences)\n";
                                }
                                sListing += " */\n";
                            }
                
                            /*
                             * Write the destination file
                             */
                            // grunt.log.writeln("writing " + f.dest);
                            grunt.file.write(file.dest, sListing + src1 + src2);
                
                            /*
                             * Print a success message
                             */
                            grunt.log.writeln('File "' + file.dest + '" created.');
                        });
                    });
                };
                
            • test
              • expected
                • custom_options
                  Testing: 1 2 3 !!!
                • default_options
                  Testing, 1 2 3.
              • fixtures
                • 123
                  1 2 3
                • testing
                  Testing
              • prepjs_test.js
                'use strict';
                
                var grunt = require('grunt');
                
                /*
                  ======== A Handy Little Nodeunit Reference ========
                  https://github.com/caolan/nodeunit
                
                  Test methods:
                    test.expect(numAssertions)
                    test.done()
                  Test assertions:
                    test.ok(value, [message])
                    test.equal(actual, expected, [message])
                    test.notEqual(actual, expected, [message])
                    test.deepEqual(actual, expected, [message])
                    test.notDeepEqual(actual, expected, [message])
                    test.strictEqual(actual, expected, [message])
                    test.notStrictEqual(actual, expected, [message])
                    test.throws(block, [error], [message])
                    test.doesNotThrow(block, [error], [message])
                    test.ifError(value)
                */
                
                exports.prepjs = {
                  setUp: function(done) {
                    // setup here if necessary
                    done();
                  },
                  default_options: function(test) {
                    test.expect(1);
                
                    var actual = grunt.file.read('tmp/default_options');
                    var expected = grunt.file.read('test/expected/default_options');
                    test.equal(actual, expected, 'should describe what the default behavior is.');
                
                    test.done();
                  },
                  custom_options: function(test) {
                    test.expect(1);
                
                    var actual = grunt.file.read('tmp/custom_options');
                    var expected = grunt.file.read('test/expected/custom_options');
                    test.equal(actual, expected, 'should describe what the custom option(s) behavior is.');
                
                    test.done();
                  },
                };
                
            • .jshintrc
              {
                "curly": true,
                "eqeqeq": true,
                "immed": true,
                "latedef": true,
                "newcap": true,
                "noarg": true,
                "sub": true,
                "undef": true,
                "boss": true,
                "eqnull": true,
                "node": true
              }
              
            • Gruntfile.js
              /*
               * grunt-prepjs
               * https://github.com/jeffpar/jsmachines
               *
               * Copyright (c) 2014 jeffpar
               * Licensed under the MIT license.
               *
               * Genesis:
               *
               *      sudo npm install -g grunt-init
               *      git clone git://github.com/gruntjs/grunt-init-gruntplugin.git ~/.grunt-init/gruntplugin
               *      cd ~/Sites/pcjs/modules
               *      mkdir -p grunts/prepjs
               *      cd grunts/prepjs
               *      grunt-init gruntplugin
               *      npm install
               *
               * This file was generated at the "grunt-init gruntplugin" stage.  Here's what that process looked like:
               *
               *      Running "init:gruntplugin" (init) task
               *      This task will create one or more files in the current directory, based on the
               *      environment and the answers to a few questions. Note that answering "?" to any
               *      question will show question-specific help and answering "none" to most questions
               *      will leave its value blank.
               *
               *      "gruntplugin" template notes:
               *      For more information about Grunt plugin best practices, please see the docs at
               *      http://gruntjs.com/creating-plugins
               *
               *      Please answer the following:
               *      [?] Project name (grunt-prep) grunt-prepjs
               *      [?] Description (The best Grunt plugin ever.) JS Preprocessor
               *      [?] Version (0.1.0)
               *      [?] Project git repository (git://github.com/jeffpar/jsmachines.git)
               *      [?] Project homepage (https://github.com/jeffpar/jsmachines)
               *      [?] Project issues tracker (https://github.com/jeffpar/jsmachines/issues)
               *      [?] Licenses (MIT)
               *      [?] Author name (jeffpar)
               *      [?] Author email (jeffpar@mac.com)
               *      [?] Author url (none)
               *      [?] What versions of grunt does it require? (~0.4.4)
               *      [?] What versions of node does it run on? (>= 0.8.0)
               *      [?] Do you need to make any changes to the above before continuing? (y/N)
               *
               *      Writing .gitignore...OK
               *      Writing .jshintrc...OK
               *      Writing Gruntfile.js...OK
               *      Writing README.md...OK
               *      Writing tasks/prepjs.js...OK
               *      Writing test/expected/custom_options...OK
               *      Writing test/expected/default_options...OK
               *      Writing test/fixtures/123...OK
               *      Writing test/fixtures/testing...OK
               *      Writing test/prepjs_test.js...OK
               *      Writing LICENSE-MIT...OK
               *      Writing package.json...OK
               *
               *      Initialized from template "gruntplugin".
               *      You should now install project dependencies with npm install. After that, you
               *      may execute project tasks with grunt. For more information about installing
               *      and configuring Grunt, please see the Getting Started guide:
               *
               *      http://gruntjs.com/getting-started
               *
               *      Done, without errors.
               *
               * The process was a bit sloppy about trailing commas, though.  I've cleaned those up, thanks to PhpStorm.
               *
               * Online tutorials further recommended the following in my project's root:
               *
               *      npm install modules/grunts/prepjs --save-dev
               *
               * However, all that does is make another copy of my "grunt-prepjs" module, inside the "node_modules" folders;
               * I can avoid that by simply including the following in my root Gruntfile.js:
               *
               *      grunt.loadTasks("modules/grunts/prepjs/tasks");
               */
              
              'use strict';
              
              module.exports = function (grunt) {
              
                  // Project configuration.
                  grunt.initConfig({
                      jshint: {
                          all: [
                              'Gruntfile.js',
                              'tasks/*.js',
                              '<%= nodeunit.tests %>'
                          ],
                          options: {
                              jshintrc: '.jshintrc'
                          }
                      },
              
                      // Before generating any new files, remove any previously-created files.
                      clean: {
                          tests: ['tmp']
                      },
              
                      // Configuration to be run (and then tested).
                      prepjs: {
                          default_options: {
                              options: {
                              },
                              files: {
                                  'tmp/default_options': ['test/fixtures/testing', 'test/fixtures/123']
                              }
                          },
                          custom_options: {
                              options: {
                                  separator: ': ',
                                  punctuation: ' !!!'
                              },
                              files: {
                                  'tmp/custom_options': ['test/fixtures/testing', 'test/fixtures/123']
                              }
                          }
                      },
              
                      // Unit tests.
                      nodeunit: {
                          tests: ['test/*_test.js']
                      }
              
                  });
              
                  // Actually load this plugin's task(s).
                  grunt.loadTasks('tasks');
              
                  // These plugins provide necessary tasks.
                  grunt.loadNpmTasks('grunt-contrib-jshint');
                  grunt.loadNpmTasks('grunt-contrib-clean');
                  grunt.loadNpmTasks('grunt-contrib-nodeunit');
              
                  // Whenever the "test" task is run, first clean the "tmp" dir, then run this
                  // plugin's task(s), then test the result.
                  grunt.registerTask('test', ['clean', 'prepjs', 'nodeunit']);
              
                  // By default, lint and run all tests.
                  grunt.registerTask('default', ['jshint', 'test']);
              
              };
              
            • LICENSE-MIT
              Copyright (c) 2014 jeffpar
              
              Permission is hereby granted, free of charge, to any person
              obtaining a copy of this software and associated documentation
              files (the "Software"), to deal in the Software without
              restriction, including without limitation the rights to use,
              copy, modify, merge, publish, distribute, sublicense, and/or sell
              copies of the Software, and to permit persons to whom the
              Software is furnished to do so, subject to the following
              conditions:
              
              The above copyright notice and this permission notice shall be
              included in all copies or substantial portions of the Software.
              
              THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
              EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
              OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
              NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
              HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
              WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
              FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
              OTHER DEALINGS IN THE SOFTWARE.
              
            • README.md
              # grunt-prepjs
              
              > JS Preprocessor
              
              ## Getting Started
              This plugin requires Grunt `~0.4.4`
              
              If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
              
              ```shell
              npm install grunt-prepjs --save-dev
              ```
              
              Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
              
              ```js
              grunt.loadNpmTasks('grunt-prepjs');
              ```
              
              ## The "prepjs" task
              
              ### Overview
              In your project's Gruntfile, add a section named `prepjs` to the data object passed into `grunt.initConfig()`.
              
              ```js
              grunt.initConfig({
                prepjs: {
                  options: {
                    // Task-specific options go here.
                  },
                  your_target: {
                    // Target-specific file lists and/or options go here.
                  },
                },
              });
              ```
              
              ### Options
              
              #### options.separator
              Type: `String`
              Default value: `',  '`
              
              A string value that is used to do something with whatever.
              
              #### options.punctuation
              Type: `String`
              Default value: `'.'`
              
              A string value that is used to do something else with whatever else.
              
              ### Usage Examples
              
              #### Default Options
              In this example, the default options are used to do something with whatever. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result would be `Testing, 1 2 3.`
              
              ```js
              grunt.initConfig({
                prepjs: {
                  options: {},
                  files: {
                    'dest/default_options': ['src/testing', 'src/123'],
                  },
                },
              });
              ```
              
              #### Custom Options
              In this example, custom options are used to do something else with whatever else. So if the `testing` file has the content `Testing` and the `123` file had the content `1 2 3`, the generated result in this case would be `Testing: 1 2 3 !!!`
              
              ```js
              grunt.initConfig({
                prepjs: {
                  options: {
                    separator: ': ',
                    punctuation: ' !!!',
                  },
                  files: {
                    'dest/default_options': ['src/testing', 'src/123'],
                  },
                },
              });
              ```
              
              ## Contributing
              In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
              
              ## Release History
              _(Nothing yet)_
              
            • package.json
              {
                "name": "grunt-prepjs",
                "description": "JS Preprocessor",
                "version": "0.1.0",
                "homepage": "https://github.com/jeffpar/jsmachines",
                "author": {
                  "name": "jeffpar",
                  "email": "jeffpar@mac.com"
                },
                "repository": {
                  "type": "git",
                  "url": "git://github.com/jeffpar/jsmachines.git"
                },
                "bugs": {
                  "url": "https://github.com/jeffpar/jsmachines/issues"
                },
                "licenses": [
                  {
                    "type": "MIT",
                    "url": "https://github.com/jeffpar/jsmachines/blob/master/LICENSE-MIT"
                  }
                ],
                "engines": {
                  "node": ">= 0.8.0"
                },
                "scripts": {
                  "test": "grunt test"
                },
                "devDependencies": {
                  "grunt-contrib-jshint": "~0.6.0",
                  "grunt-contrib-clean": "~0.4.0",
                  "grunt-contrib-nodeunit": "~0.2.0",
                  "grunt": "~0.4.4"
                },
                "peerDependencies": {
                  "grunt": "~0.4.4"
                },
                "keywords": [
                  "gruntplugin"
                ]
              }
          • README.md
            Experimental Grunt Tasks
            ===
            
            I experimented briefly with a few Grunt tasks, but working with Grunt wasn't all that pleasant,
            and neither of these tasks are all that important right now, so they're only here for a rainy day or
            to be cannibalized for some other purpose.
            
            [manifester](manifester/) was intended to open a manifest.xml file (discussed in more detail [here](/apps/))
            and download all the referenced files.  The task was inspired by `npm install`, which downloads all the required
            modules specified in [package.json](/package.json) without requiring them to be checked into the project.
            However, the manifest design needs to be fleshed out more before work on this continues.
            
            [prepjs](prepjs/) was intended to inline well-defined constants in all JavaScript files before running them
            through the Closure Compiler, but it turned out that:
             
            - the Grunt task would quickly run out of memory
            - the Closure Compiler actually did a pretty good job inlining all by itself
            
        • htmlout
          • bin
            • delete_indexes.sh
              #!/bin/sh
              #
              # This script was created for the Grunt "delete-indexes" task in /Gruntfile.js; it lives here
              # because htmlout is the module responsible for "littering" the project with "index.html" files,
              # therefore it bears responsibility for cleaning them up.  This is its "poor man's" solution.
              #
              find . -name "index.html" -exec grep -H -l -e "<title>pcjs.org" {} \; | sed -E "s/(.*)/rm -v \"\1\"/" | bash
              
            • htmlout
              #!/usr/bin/env node
              /**
               * @fileoverview Implements the HTMLOut command-line interface
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              var path = require("path");
              var fs = require("fs");
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              require(lib + "htmlout.js").CLI();
              
          • lib
            • htmlout.js
              /**
               * @fileoverview Builds default ("index.html") documents from HTML templates
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-02-14
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var fs = require("fs");
              var path = require("path");
              var glob = require("glob");
              
              /**
               * @class exports
               * @property {function(string)} sync
               */
              var HTTPAPI = require("./httpapi");
              var DumpAPI = require("../../shared/lib/dumpapi");
              var MarkOut = require("../../markout");
              var net     = require("../../shared/lib/netlib");
              var proc    = require("../../shared/lib/proclib");
              var str     = require("../../shared/lib/strlib");
              var usr     = require("../../shared/lib/usrlib");
              
              /**
               * @class exports
               * @property {string} name
               * @property {string} version
               * @property {Array.<string>} c1pCSSFiles
               * @property {Array.<string>} c1pJSFiles
               * @property {Array.<string>} pcCSSFiles
               * @property {Array.<string>} pcJSFiles
               */
              var pkg = require("../../../package.json");
              
              /*
               * fCache controls "index.html" caching; it is true by default and can be overridden using the setOptions()
               * 'cache' property.
               */
              var fCache = true;
              
              /*
               * fConsole controls console messages; it is false by default and can be overridden using the setOptions()
               * 'console' property.
               */
              var fConsole = false;
              
              /*
               * fServerDebug controls server-related debug features; it is false by default and can be enabled using the
               * setOptions() 'debug' property (or from the server's command-line interface using "--debug").
               *
               * This used to be named fDebug, which was fine, but it has been renamed to make the distinction between the
               * server's debug state (fServerDebug) and the debug state of HTMLOut instances (this.fDebug) clearer.
               */
              var fServerDebug = false;
              
              /*
               * logFile is set by server.js using the setOptions() 'logfile' property, if the server has turned on
               * logging.  This allows us to "mingle" our logConsole() output with the server's log (typically "./logs/node.log").
               *
               * The same "mingled" messages will also appear on the console if fConsole has been turned on as well
               * (using "--console" from our own command-line interface, or via the setOptions() 'console' property).
               */
              var logFile = null;
              
              /*
               * fRebuild controls the rebuilding of cached "index.html" files, assuming fCache is true; fRebuild is false
               * by default, and it can be set for all requests using the setOptions() 'rebuild' property, or for individual
               * requests using the fRebuild parameter to HTMLOut().
               */
              var fRebuild = false;
              
              /*
               * fSendDefault determines what happens HTMLOut() determines that an up-to-date default document already exists;
               * if false (default), HTMLOut() will return null, allowing our Express filter() function pass the request on
               * as a normal static file request; otherwise, HTMLOut() will load the document and send the contents itself
               * (this is the mode that the CLI uses).
               *
               * TODO: Consider honoring fSendDefault even when generating a new default document, although there may be some
               * efficiency to sending new documents ourselves, because we don't have to wait for the writeFile() to complete.
               *
               * NOTE: I've since changed the fSendDefault from false to true, because I'm running into situations where, at
               * least for directory URLs with default documents, the Express static file handler is reporting that the static
               * content is "not modified" (304), which in turn causes Safari to occasionally display blank pages.
               *
               * The server (server.js) still has the option (via setOptions) to override this setting, but until the dreaded
               * "Safari blank page" problem is fully understood and addressed, the server should probably not do that.
               *
               * TODO: Understand and properly address the "Safari blank page" problem (which I'm still seeing as of
               * Safari v7.0.3); some folks claim it's a Safari bug, but I'm not convinced, because similar requests/responses
               * from Apache don't cause the problem.
               */
              var fSendDefault = true;
              
              /*
               * fSockets is set if the server tells us to enable client-side support.
               */
              var fSockets = false;
              
              /*
               * sServerRoot is the root directory of the web server; it can (and should) be overridden using by the Express
               * web server using setRoot().
               */
              var sServerRoot = "/Users/Jeff/Sites/pcjs";
              
              /*
               * sDefaultFile is the default filename to use for web server directories, and sTemplateFile is the default HTML
               * template to use.
               */
              var sDefaultFile = "index.html";
              var sTemplateFile = "./modules/shared/templates/common.html";
              
              /*
               * sReadMeFile is the default markdown file to load and convert to HTML when a "readme" token is detected in an
               * HTML template file; sMachineXMLFile is a fallback file to look for when sReadMeFile doesn't exist.
               */
              var sReadMeFile = "README.md";
              var sMachineXMLFile = "machine.xml";
              var sManifestXMLFile = "manifest.xml";
              
              /*
               * We need lists of the uncompiled scripts for C1Pjs and PCjs, indexed by machine class, so that if we have
               * to inject those individual scripts into the current document, all the ordering dependencies will be honored
               * (which is why processMachines() can't simply enumerate all the .js files in the respective script folder).
               *
               * We build these lists from the lists stored in the project's "package.json" file; also, we start with the
               * complete lists (ie, with "debugger.js" included in the proper sequence) and then filter out the debugger
               * later if it turns out we don't need it.
               *
               * We include any required CSS files in these lists as well, for convenience.  CSS files are added just before
               * the closing </head> tag, and JS files are added just before the closing </body> tag.
               */
              var aMachineFiles = {
                  'c1p':  pkg.c1pCSSFiles.concat(pkg.c1pJSFiles),
                  'pc':   pkg.pcCSSFiles.concat(pkg.pcJSFiles)
              };
              var aMachineFileTypes = {
                  'head': [".css"],           // put BOTH ".css" and ".js" here if convertMDMachineLinks() embeds its own scripts
                  'body': [".js"]
              };
              
              /*
               * Since we have a small server-side optimization that assumes any directory entry without an extension is
               * a directory, this is a list of known exceptions (ie, entries that are NOT directories despite no extension).
               */
              var asNonDirectories = [
                  "COPYING",
                  "LICENSE",
                  "README",
                  "makefile"
              ];
              
              /*
               * A list of plain-text file types that we want the server to serve up with mime-type "text/plain".
               */
              var asExtsPlainText = [
                  "65v",
                  "bas",
                  "hex",
                  "map",
                  "nasm",
                  "txt"
              ];
              
              /*
               * When we're generating file listings for a directory (ie, getDirList()), we exclude
               * all files/folders in BOTH of the following arrays.  However, if someone knows/guesses
               * the name of a non-listed file that does not appear in the non-served set, we're OK
               * with serving it to them.
               *
               * EXAMPLE: If you put "lib" in the non-listed set, then folders containing a "lib" won't
               * list it, but if you enter a URL to a "lib", its contents will be listed; whereas if you
               * put "lib" in the non-served set, then neither it NOR its contents will be listed.
               *
               * NOTE: There are some additional non-listed run-time checks we perform, such as files
               * containing a "-debug" suffix, as well as some non-served run-time checks, like anything
               * ending with ".sh" or ".php" (although I no longer bother with ".php", since all PHP files
               * should now be removed from the project).
               */
              var asFilesNonListed = [
              //  "LICENSE",
                  "Gruntfile.js",
                  "npm-shrinkwrap.json",
                  "package.json",
                  "server.js",
                  "index.html",
                  "notes.md",
                  "README.md",
                  "robots.txt",
                  "machine.xml",
                  "manifest.xml",
                  "cache.manifest"
              ];
              
              var asExtsNonListed = [
               // "json"              // let's allow these after all (so that people can download disk images)
              ];
              
              var asExtsNonServed = [
                  "sh"
              ];
              
              var asFilesNonServed = [
                  "bin",
                  "debug",
                  "grunts",
                  "logs",
                  "node.log",
                  "node_modules",
                  "tests",
                  "tmp",
                  "users",
                  "users.log",
                  "iisnode",          // Azure/IISNode-specific
                  "IISNode.yml",      // Azure/IISNode-specific
                  "web.config"        // Azure/IISNode-specific
              ];
              
              var nBlogExcerpts = 20;
              
              /**
               * HTMLOut()
               *
               * Load (building or rebuilding as needed) a default HTML document ("index.html")
               * for the specified directory (which corresponds to req.path).  sFile is the name
               * of a specific template file to start with, but in most cases, callers will pass
               * null, which means we'll fall back to sTemplateFile.
               *
               * @constructor
               * @param {string} sDir is a fully-qualified web server directory
               * @param {string|null} sFile is an optional template path (relative to sDir)
               * @param {boolean} fRebuild (this overrides the module's normal fRebuild setting)
               * @param {Object} req
               * @param {function(Error,string)} done
               */
              function HTMLOut(sDir, sFile, fRebuild, req, done)
              {
                  this.sDir = sDir;
              
                  this.sFile = (sFile? path.join(sDir, sFile) : path.join(sServerRoot, sTemplateFile));
              
                  HTMLOut.logDebug('HTMLOut("' + sDir + '", "' + this.sFile + '", ' + fRebuild + ')');
              
                  this.fDebug = (fServerDebug || net.hasParm(net.GORT_COMMAND, net.GORT_DEBUG, req)) && !net.hasParm(net.GORT_COMMAND, net.GORT_RELEASE, req);
                  this.fRebuild = fRebuild;
                  this.req = req;
                  this.done = done;
              
                  this.sHTML = "";
                  this.sTemplate = null;
                  this.aTokens = {};
                  this.fRandomize = false;
              
                  /*
                   * Since we now pass fDebug to the MarkOut module, which may generate some debug
                   * info in the final output that we wouldn't want to cache, I've changed the behavior
                   * of fDebug to simply never cache, instead of always rebuilding the cache.
                   *
                   *      if (this.fDebug) this.fRebuild = true;
                   *
                   * Note that a production server should not need the GORT_REBUILD command, so we accept
                   * it only if fServerDebug is true.
                   */
                  if (fServerDebug && net.hasParm(net.GORT_COMMAND, net.GORT_REBUILD, req)) {
                      req.query[net.GORT_COMMAND] = undefined;
                      this.fRebuild = true;
                  }
              
                  /*
                   * Check the global cache setting, as well as the presence of ANY special commands
                   * that we would never want to cache.
                   */
                  if (!fCache || fServerDebug || net.hasParm(net.GORT_COMMAND, null, req) || net.hasParm(net.REVEAL_COMMAND, null, req)) {
                      this.loadFile(this.sFile, true);
                      return;
                  }
              
                  /*
                   * Set the name of the default file (eg, "index.html") we will use to cache the template
                   * after all tokens have been replaced.
                   */
                  this.sCacheFile = path.join(sDir, sDefaultFile);
              
                  if (this.fRebuild) {
                      HTMLOut.logDebug("HTMLOut(): rebuilding " + this.sCacheFile);
                      this.loadFile(this.sFile, true);
                      return;
                  }
              
                  /*
                   * Since caching is allowed, let's see if sDefaultFile has already been built
                   * and is newer than the specified template file.
                   */
                  var obj = this;
                  fs.stat(this.sCacheFile, function doneStatCacheFile(err, statsIndex) {
                      if (err) {
                          obj.loadFile(obj.sFile, true);
                      } else {
                          fs.stat(obj.sFile, function doneStatTemplateFile(err, statsTemplate) {
                              if (!err && statsIndex.mtime.getTime() < statsTemplate.mtime.getTime()) {
                                  /*
                                   * Since the template has a new timestamp, we're going to load and process it
                                   * as a template (so set fTemplate = true);
                                   */
                                  obj.loadFile(obj.sFile, true);
                              } else {
                                  /*
                                   * If the specified template file can't be accessed, we can either report that as
                                   * an error, or display the current sDefaultFile; it seems safer and friendlier to
                                   * do the latter, and simply log the missing template error.
                                   *
                                   *  if (err) {
                                   *      obj.setData(err, null);
                                   *  }
                                   */
                                  if (err) {
                                      HTMLOut.logError(err, true);
                                  }
                                  if (fSendDefault) {
                                      /*
                                       * Since the cached copy appears to be up-to-date, we can load it, but there's
                                       * no need to (re)process it as a template (so set fTemplate = false).
                                       */
                                      obj.loadFile(obj.sCacheFile, false);
                                  } else {
                                      /*
                                       * By passing null for the (2nd) data parameter, we're telling the caller to pass
                                       * the request on as a static file request.
                                       */
                                      obj.done(null, null);
                                  }
                              }
                          });
                      }
                  });
              }
              
              /**
               * CLI() provides a command-line interface for the htmlout module
               *
               * Usage:
               *
               *      htmlout --dir=(directory) [--file=(filename)] [--cache] [--console] [--rebuild]
               *
               * Arguments:
               *
               *      --cache turns "index.html" caching on or off; caching is ON by default.
               *
               *      --console turns diagnostic console messages on or off; they are OFF by default.
               *
               *      --debug turns internal debug console messages on or off; they are OFF by default.
               *
               *      --dir specifies a directory relative to the web server's root directory; it must begin with '/' and
               *      will be fully-qualified before being passed to HTMLOut().
               *
               *      --file specifies an optional filename (relative to the directory given by --dir) of an alternative HTML
               *      template file; otherwise, sTemplateFile (which is relative to sServerRoot) will be used.
               *
               *      --rebuild forces any cached version of the resulting HTML to be rebuilt (in other words, we will not read
               *      any cached version of the HTML, but if caching is enabled, we will write a new cached version).
               *
               * Examples:
               *
               *      node modules/htmlout/bin/htmlout --dir=/ --console --rebuild
               */
              HTMLOut.CLI = function()
              {
                  var args = proc.getArgs();
              
                  if (args.argc) {
                      var argv = args.argv;
              
                      /*
                       * Create a dummy Express req object
                       */
                      var sDir = argv['dir'];
                      var req = {'path': sDir};
              
                      if (argv['debug'] !== undefined) fServerDebug = argv['debug'];
              
                      /*
                       * Note that we don't provide command-line control over the 'senddef' option, because
                       * that option's only purpose is to force HTMLOut() to load and return the requested
                       * file (and the CLI interface is not a filter function).
                       */
                      HTMLOut.setOptions({'cache': argv['cache'], 'console': argv['console'], 'senddef': true});
              
                      if (fServerDebug) {
                          console.log("args: " + JSON.stringify(argv));
                          console.log("req: " + JSON.stringify(req));
                      }
              
                      if (sDir && sDir.charAt(0) == '/') {
                          sDir = path.join(sServerRoot, sDir);
                          var file = new HTMLOut(sDir, argv['file'], argv['rebuild'], req, function doneHTMLOutCLI(err, s) {
                              if (err) {
                                  HTMLOut.logError(err, true);
                              }
                              else {
                                  console.log(s);
                              }
                          });
                      } else {
                          console.log("error: --dir missing or invalid");
                      }
                  } else {
                      console.log("usage: htmlout [--dir=(directory)] [--file=(filename)] [--rebuild] [--cache=(true|false)] [--console=(true|false)]");
                  }
              };
              
              /**
               * filter(req, res, next) is called by the Express web server to give us a crack at the URL
               *
               * If the URL path (req.path) refers to a directory, then we will read a common HTML template and fill
               * it with the contents of the README.md in that directory, and send the response ourselves.  Otherwise,
               * we pass the request back to Express, via next(), because req.path must either refer to a static file,
               * which the express.static() middleware will take care of, or a non-existent file, which Express should
               * handle by returning an error (eg, 404).
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @param {function()} next is the function to call to finish processing this request (unless WE finish it)
               */
              HTMLOut.filter = function(req, res, next)
              {
                  HTMLOut.logDebug('HTMLOut.filter("' + req.url + '")');
              
                  if (HTTPAPI.redirect(req, res, next)) return;
              
                  var i;
                  var sPath = path.join(sServerRoot, req.path);
                  var sBaseName = path.basename(req.path);
                  var sBaseExt = ((i = sBaseName.lastIndexOf('.')) > 0? sBaseName.substr(i+1) : "").toLowerCase();
                  var sTrailingChar = req.path.slice(-1);
              
                  if (!fServerDebug && !net.hasParm(net.GORT_COMMAND, net.GORT_DEBUG, req)) {
                      if (asExtsNonServed.indexOf(sBaseExt) >= 0 || asFilesNonServed.indexOf(sBaseName) >= 0) {
                          /*
                           * Mimic the error code+message that express.static() displays for non-existent files/folders.
                           */
                          res.status(404).send("Cannot GET " + req.path);
                          return;
                      }
                  }
              
                  /*
                   * The Safari "blank page" problem continues to plague us.  Our first work-around was for directory
                   * "index.html" documents, which we resolved by setting fSendDefault to true, so that we would always send
                   * it ourselves, along with an "ok" (200) response code, instead of letting the Express next() function
                   * handle it with a "not modified" (304) response code.
                   *
                   * However, the problem also extends to any XML files that we serve to an initial Safari request
                   * (eg, the machine.xml and manifest.xml files that we style as web pages).  Safari includes
                   * "Cache-Control max-age=0" in the request, and if the response is "Cache-Control public, max-age=0"
                   * along with a 304 response code, Safari may once again display a blank page.
                   *
                   * This problem appears limited to the initial resource request for a particular URL.  When these XML
                   * files are requested by Safari while loading another web page, Safari's caching logic is different
                   * (eg, it doesn't include the same "Cache-Control" setting).
                   */
                  if (sBaseName == "machine.xml" || sBaseName == "manifest.xml") {
                      var sAgent = req.headers['user-agent'];
                      if (sAgent && sAgent.indexOf("Safari/") >= 0 && sAgent.indexOf("Chrome/") < 0 && sAgent.indexOf("OPR/") < 0) {
                          var sCacheControl = req.headers['cache-control'];
                          if (sCacheControl && sCacheControl.indexOf("max-age=0") >= 0) {
                              HTMLOut.logDebug("HTMLOut.filter(" + sBaseName + "): Safari work-around in progress");
                              fs.readFile(sPath, {encoding: "utf8"}, function doneReadFileFilter(err, sData) {
                                  if (err) {
                                      HTMLOut.logError(err);
                                      next();     // alternatively: res.status(404).send("Cannot GET " + req.path);
                                  } else {
                                      /*
                                       * HACK: Express may still modify our response, turning our 200 status code into a 304
                                       * and adding an Etag, unless we ALSO change the req.method from "GET" to something else.
                                       * Supposedly, we could also use app.disable('etag'), but I'm not sure that would prevent
                                       * Express from changing the status code, and I'm tired of testing work-arounds for this
                                       * irritating behavior.
                                       */
                                      req.method = "NONE";
                                      res.set("Content-Type", "application/xml");
                                      res.status(200).send(sData);
                                  }
                              });
                              return;
                          }
                      }
                  }
              
                  if (asNonDirectories.indexOf(sBaseName) >= 0 || asExtsPlainText.indexOf(sBaseExt) >= 0) {
                      res.set("Content-Type", "text/plain");
                  }
              
                  /*
                   * Next, check for API requests (eg, "/api/v1/dump?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img")
                   *
                   * We perform this before the trailing-slash-redirect check below, because we don't require our API endpoints to
                   * have a trailing slash.
                   */
                  if (HTTPAPI.filterAPI(req, res, next)) return;
              
                  /*
                   * If sBaseName contains a file extension, I want to save some time by assuming it's NOT a directory.
                   * I simplistically check for a file extension by checking merely for the presence of a period ("dot").
                   * Obviously, folder names *could* also contain periods, so this optimization works only so long as I promise
                   * to not create any public directories containing periods (well, ignoring folders containing version numbers).
                   *
                   * Conversely, if there is NO period, then I want to assume that it IS a directory, and therefore if the
                   * basename did NOT end with a trailing slash AND I've enabled "strict routing" in Express (which I should
                   * have), then we want to pass this request on to next(), so that the "express-slash" module will get a
                   * crack at the URL and redirect with a trailing slash as appropriate.
                   *
                   * This isn't just a cosmetic issue, because without "strict routing" and the "express-slash" module,
                   * URLs like "http://localhost:8088/devices/pc/machine/5150/mda/64kb/debugger" will cause problems for
                   * client-side JavaScript when it tries to do an XMLHttpRequest with a relative filename (eg, "machine.xml");
                   * that request will fetch the "machine.xml" in the parent directory instead of the "debugger" directory.
                   *
                   * TODO: Verify the problem observed above is NOT a side-effect of some poorly written client-side JavaScript
                   * forming improper paths.
                   *
                   * NOTE: To minimize unnecessary redirects, the getDirList() function should always (try to) generate URLs for
                   * folders with trailing slashes.
                   */
                  if (asNonDirectories.indexOf(sBaseName) < 0) {
                      if (sTrailingChar != '/') {
                          HTMLOut.logDebug('HTMLOut.filter("' + sBaseName + '"): passing static file request to next()');
                          next();
                          return;
                      }
                  }
              
                  fs.stat(sPath, function doneStatDirFilter(err, stats) {
                      if (err) {
                          HTMLOut.logError(err);
                          // res.status(404).send(err.message);
                      } else {
                          var fDir = stats.isDirectory();
              
                          HTMLOut.logDebug('HTMLOut.filter(): isDirectory("' + sPath + '"): ' + fDir);
              
                          if (fDir) {
                              new HTMLOut(sPath, null, fRebuild, req, function doneHTMLOutFilter(err, sData) {
                                  if (err) {
                                      HTMLOut.logError(err);
                                      next();
                                  } else if (!sData) {
                                      /*
                                       * HTMLOut() has the option of returning null, if it determines we can
                                       * simply pass the request (ie, treat it as a static request).
                                       *
                                       * TODO: Assert that this behavior is consistent with the fSendDefault setting
                                       * (fSendDefault should be false).
                                       */
                                      HTMLOut.logDebug("HTMLOut.filter(): returned null");
                                      next();
                                  } else {
                                      HTMLOut.logDebug("HTMLOut.filter(): returned " + sData.length + " bytes");
                                      /*
                                       * HACK: Express may still modify our response, turning our 200 status code into a 304
                                       * and adding an Etag, unless we ALSO change the req.method from "GET" to something else.
                                       * Supposedly, we could also use app.disable('etag'), but I'm not sure that would prevent
                                       * Express from changing the status code, and I'm tired of testing work-arounds for this
                                       * irritating behavior in Safari.
                                       */
                                      req.method = "NONE";
                                      res.status(200).send(sData);
                                  }
                              });
                              return;
                          }
                      }
                      next();
                  });
              };
              
              /**
               * logConsole(s)
               *
               * By using this instead of console.log(), we can eliminate the constant checks for fConsole (although
               * doing those checks might save some unnecessary string concatenation when fConsole is false), and we get
               * the added benefit of optionally being able to log all our messages to the server's log file.
               *
               * @param {string} s
               * @return {string}
               */
              HTMLOut.logConsole = function(s)
              {
                  if (fConsole) console.log(s);
                  if (logFile) logFile.write(s + "\n");
                  return s;
              };
              
              /**
               * logDebug(s)
               *
               * @param {string} s
               * @return {string}
               */
              HTMLOut.logDebug = function(s)
              {
                  if (fServerDebug) HTMLOut.logConsole(s);
                  return s;
              };
              
              /**
               * logError(err) conditionally logs an error to the console
               *
               * @param {Error} err
               * @param {boolean} [fForce]
               * @return {string} the error message that was logged (or that would have been logged had logging been enabled)
               */
              HTMLOut.logError = function(err, fForce)
              {
                  var sError = "";
                  if (err) {
                      sError = "htmlout error: " + err.message;
                      if (fConsole || fForce) HTMLOut.logConsole(sError);
                  }
                  return sError;
              };
              
              /**
               * setOptions(options) is used by the Express web server to set module options
               *
               * Supported options include:
               *
               *      'cache'     fCache
               *      'console'   fConsole
               *      'debug'     fServerDebug
               *      'logfile'   logFile
               *      'rebuild'   fRebuild
               *      'senddef'   fSendDefault
               *      'sockets'   fSockets
               *
               * Note that an option must be explicitly set in order to override the option's default value
               * (see fCache, fConsole, fServerDebug, fRebuild and fSockets, respectively).
               *
               * @param {Object} options
               */
              HTMLOut.setOptions = function(options)
              {
                  if (options['cache'] !== undefined) {
                      fCache = options['cache'];
                  }
                  if (options['console'] !== undefined) {
                      fConsole = options['console'];
                  }
                  if (options['debug'] !== undefined) {
                      fServerDebug = options['debug'];
                  }
                  if (options['logfile'] !== undefined) {
                      logFile = options['logfile'];
                      HTTPAPI.setLogFile(logFile);
                  }
                  if (options['rebuild'] !== undefined) {
                      fRebuild = options['rebuild'];
                  }
                  if (options['senddef'] !== undefined) {
                      fSendDefault = options['senddef'];
                  }
                  if (options['sockets'] !== undefined) {
                      fSockets = options['sockets'];
                  }
              };
              
              /**
               * setRoot(sRoot) is used by the Express web server to inform us of its root directory
               *
               * NOTE: We can't use __dirname, because every module has its own __dirname, so our __dirname
               * won't be the same as Express's __dirname.  Moreover, the Express web server won't necessarily
               * be configured to use __dirname as the root.  Normally, this should match whatever gets
               * passed to express.static().
               *
               * @param {string} sRoot
               */
              HTMLOut.setRoot = function(sRoot)
              {
                  sServerRoot = sRoot;
                  HTTPAPI(HTMLOut, sRoot);
              };
              
              /*
               * Object methods
               */
              
              /**
               * loadFile()
               *
               * @this {HTMLOut}
               * @param {string} sFile
               * @param {boolean} fTemplate
               */
              HTMLOut.prototype.loadFile = function(sFile, fTemplate)
              {
                  var obj = this;
              
                  HTMLOut.logConsole('HTMLOut.loadFile("' + sFile + '")');
              
                  fs.readFile(sFile, {encoding: "utf8"}, function doneLoadFile(err, sData) {
                      obj.setData(err, sData, sFile, fTemplate);
                  });
              };
              
              /**
               * setData(err, sData)
               *
               * Records the given HTML template and immediately parses it.
               *
               * @this {HTMLOut}
               * @param {Error} err
               * @param {string} sData
               * @param {string} sFile
               * @param {boolean} fTemplate
               */
              HTMLOut.prototype.setData = function(err, sData, sFile, fTemplate)
              {
                  if (err) {
                      HTMLOut.logError(err);
                      sData = "unable to read " + sFile;
                      fTemplate = false;
                  }
              
                  if (!fTemplate || !sData) {
                      this.done(null, sData);
                      return;
                  }
              
                  /*
                   * Copy the HTML template, and then start finding/replacing tokens.
                   *
                   * We cheat slightly and insert one of those tokens right now, because otherwise
                   * the template file itself would not render correctly in your web browser.
                   */
                  this.sTemplate = sData.replace("/modules/shared/templates/common.css", "/versions/pcjs/<!-- pcjs:version -->/common.css");
                  this.sHTML = this.sTemplate;
              
                  /*
                   * But first, let's automatically massage any URLs in the template file.
                   */
                  var link;
                  var reLinks = /(<a[^>]*?\shref=)(['"])([^'"]*)(\2[^>]*>)/gi;
                  while ((link = reLinks.exec(this.sTemplate))) {
                      var sReplacement = link[1] + link[2] + net.encodeURL(link[3], this.req, this.fDebug) +  link[4];
                      this.sHTML = this.sHTML.replace(link[0], sReplacement);
                  }
              
                  var reTokens = /([ \t]*)<!--\s*([a-z]+):([a-z]+)(\(.*?\)|)\s*-->/gi;
                  this.findTokens(reTokens);
              };
              
              /**
               * findTokens()
               *
               * @this {HTMLOut}
               * @param {RegExp} reTokens
               */
              HTMLOut.prototype.findTokens = function(reTokens)
              {
                  while (true) {
                      var token = reTokens.exec(this.sTemplate);
                      if (!token) break;
                      var sIndent = token[1];
              
                      /*
                       * As per the warning in replaceTokens(), we must beware of token characters that have special meaning
                       * when parsed as a regular expression; for example, if there are any opening or closing parentheses in
                       * the token, each must be escaped.
                       */
                      var sToken = token[0].substr(sIndent.length);
                      sToken = sToken.replace(/([\(\)\*])/g, "\\$1");
              
                      if (this.aTokens[sToken] === undefined) {
                          this.aTokens[sToken] = "";
                          if (HTMLOut.tokenFunctions[token[2]] !== undefined) {
                              var fnToken = HTMLOut.tokenFunctions[token[2]][token[3]];
                              if (fnToken !== undefined) {
                                  this.aTokens[sToken] = null;
                                  if (fnToken === null) {
                                      this.aTokens[sToken] = undefined;
                                      continue;
                                  }
                                  var aParms = [];
                                  if (token[4]) {
                                      var aMatch;
                                      var reParms = /"(.*?)"/g;
                                      while ((aMatch = reParms.exec(token[4]))) {
                                          aParms.push(aMatch[1]);
                                      }
                                  }
                                  fnToken.call(this, sToken, sIndent, aParms);
                              }
                          }
                          /*
                           *  We could yield here after every newly discovered token, but our templates
                           *  are pretty simple, so I doubt finding all of them will take significant time.
                           *
                           *      var obj = this;
                           *      setImmediate(function() { obj.findTokens(reTokens); });
                           *      return;
                           */
                      }
                  }
                  this.replaceTokens();
              };
              
              /**
               * replaceTokens()
               *
               * @this {HTMLOut}
               */
              HTMLOut.prototype.replaceTokens = function()
              {
                  var fPending = false;
              
                  for (var sToken in this.aTokens) {
              
                      if (!this.aTokens.hasOwnProperty(sToken)) continue;
              
                      var sReplacement = this.aTokens[sToken];
              
                      /*
                       *  Skip tokens that have already been replaced.
                       */
                      if (sReplacement === undefined) {
                          continue;
                      }
              
                      /*
                       *  Unknown (null) tokens are pending replacements, which occur when a template function is waiting
                       *  for a callback; the callback is required to call replaceTokens() once the replacement is known,
                       *  starting the replacement process over again (eg, see getDirList()).
                       */
                      if (sReplacement === null) {
                          fPending = true;
                          continue;
                      }
              
                      // HTMLOut.logDebug('HTMLOut.replaceTokens: replacing "' + sToken + '" with "' + sReplacement + '"');
              
                      /*
                       * WARNING: Beware of tokens containing characters that have special meaning within regular
                       * expressions; otherwise, this global search-and-replace will fail in unexpected ways.
                       */
                      this.sHTML = this.sHTML.replace(new RegExp(sToken, "g"), sReplacement);
              
                      /*
                       *  Mark the token as replaced, by setting it to undefined (it's tempting to simply "delete" it,
                       *  but that would modify the object we're iterating over, which would be bad form).
                       */
                      this.aTokens[sToken] = undefined;
                  }
              
                  if (!fPending) {
                      /*
                       * Remove any lingering HTML/JavaScript comments and unnecessary scripts
                       */
                      this.sHTML = this.sHTML.replace(/[ \t]*<!--[\s\S]*?-->[\r\n]*/g, "");
                      if (!this.fRandomize) {
                          this.sHTML = this.sHTML.replace(/[ \t]*<script id="randomize"[\s\S]*?<\/script>[\r\n]*/g, "");
                      }
              
                      if (this.sCacheFile) {
              
                          HTMLOut.logConsole('HTMLOut.writeFile("' + this.sCacheFile + '")');
              
                          var today = new Date();
                          this.sHTML = this.sHTML.replace(/(<body[^>]*>)(\s*)/, "$1$2<!-- " + sDefaultFile + " generated on " + today.toString() + " -->$2");
              
                          fs.writeFile(this.sCacheFile, this.sHTML, function doneWriteFileReplaceTokens(err) {
                              HTMLOut.logError(err);
                          });
                      }
                      this.done(null, this.sHTML);
                  }
              };
              
              /**
               * getTitle(sToken, sIndent, aParms)
               *
               * aParms[0], if present, is used as the preferred title for the home page
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getTitle = function(sToken, sIndent, aParms)
              {
                  this.aTokens[sToken] = ((this.req.path == "/" && aParms[0])? aParms[0] : this.req.path);
              };
              
              /**
               * getVersion(sToken, sIndent, aParms)
               *
               * Returns the current version in "package.json".
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getVersion = function(sToken, sIndent, aParms)
              {
                  /*
                   * Use the same test that processMachines() uses for setting fCompiled: if we're not using compiled code,
                   * then we should be using "current" CSS and template files (as opposed to version-specific template files).
                   *
                   * NOTE: I used to create a symlink in each app's "versions" directory (eg, /versions/pcjs/current ->
                   * ../../modules/shared/templates), so that when fDebug was true, I could simply insert "current" in
                   * place of a version number.  However, that symlink didn't get added to the repository, and I'm not sure
                   * all operating systems would deal with it properly even if was added, so now I'm treating the "version"
                   * token as the equivalent of a symlink here.
                   */
                  this.aTokens[sToken] = this.fDebug? "../../modules/shared/templates" : pkg.version;
              };
              
              /**
               * getPath(sToken, sIndent, aParms)
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getPath = function(sToken, sIndent, aParms)
              {
                  this.aTokens[sToken] = this.req.path;
              };
              
              /**
               * getPCPath(sToken, sIndent, aParms)
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getPCPath = function(sToken, sIndent, aParms)
              {
                  /*
                   * SIDEBAR: We must use a regular expression to replace all forward slashes with backslashes, because
                   * the string form of JavaScript's replace() method replaces only the FIRST occurrence of the search string.
                   */
                  var s = this.req.path.replace(/\//g, "\\").toUpperCase();
                  /*
                   * Remove any trailing backslash from the final result.
                   */
                  if (s.slice(-1) == '\\') s = s.slice(0, -1);
                  this.aTokens[sToken] = s;
              };
              
              /**
               * getDirList(sToken, sIndent, aParms)
               *
               * Generate a list element for every subdirectory; each list element should look like:
               *
               *      <li>
               *          <a href="/apps/">[apps]</a>
               *      </li>
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getDirList = function(sToken, sIndent, aParms)
              {
                  var obj = this;
                  fs.readdir(this.sDir, function doneReadDirList(err, asFiles) {
                      if (err) {
                          obj.aTokens[sToken] = HTMLOut.logError(err);
                      } else {
                          var sList = "";
              
                          /*
                           * We add an entry for the parent directory; when we call path.join() with obj.req.path,
                           * the ".." will be replaced by the actual path to the parent, and if there is no parent
                           * (ie, path.join() returns obj.req.path unmodified), we will discard the entry at that point.
                           */
                          asFiles.push("..");
              
                          /*
                           * For sorting purposes, I want all folders ending in "kb" and beginning with one to three
                           * digits to sort as if they all began with FOUR digits (ie, with leading zeros as needed).
                           * But I don't want to change the folder names that are ultimately displayed.  So instead,
                           * I pad those names with slashes, since a leading slash will sort much like a leading zero
                           * without being a valid filename character, meaning we can trim away those leading slashes
                           * with impunity after the sort is done.
                           *
                           * Why does this work? The ASCII value of '0' is 48, whereas the ASCII value of '/' is 47,
                           * so there are no intervening characters that could sort differently.
                           */
                          var re = /^([0-9]+)(kb|mb)$/i;
                          for (var i = 0; i < asFiles.length; i++) {
                              var match = re.exec(asFiles[i]);
                              if (match) asFiles[i] = "///".substr(0, 4 - match[1].length) + asFiles[i];
                          }
                          asFiles.sort();
              
                          for (var iFile = 0; iFile < asFiles.length; iFile++) {
                              var sBaseName = asFiles[iFile].replace(/\//g, "");
              
                              /*
                               * The only exception we currently make to the "no filenames with leading periods" rule
                               * is the parent directory entry that we explicitly added above.
                               */
                              var iExt = sBaseName.lastIndexOf('.');
                              if (sBaseName == "..") {
                                  iExt = -1;
                              } else if (sBaseName.charAt(0) == '.') {
                                  continue;
                              }
                              var sExt = (iExt > 0? sBaseName.substr(iExt+1) : "");
              
                              if (!obj.fDebug) {
                                  if (sBaseName.indexOf("-debug") > 0) continue;
                                  if (asExtsNonServed.indexOf(sExt) >= 0) continue;
                                  if (asExtsNonListed.indexOf(sExt) >= 0) continue;
                                  if (asFilesNonServed.indexOf(sBaseName) >= 0) continue;
                                  if (asFilesNonListed.indexOf(sBaseName) >= 0) continue;
                              } else {
                                  /*
                                   * Even when the server's in Debug mode, there are some files it makes no sense to list.
                                   */
                                  if (sBaseName == "index.html") continue;
                              }
              
                              /*
                               * If path.join() returns obj.req.path unmodified, we treat that as a sign we're at
                               * sServerRoot (ie, that sFile is ".." and there is no parent), so we discard the entry.
                               *
                               * IISNode hack: path.join() may return paths with backslashes, so convert back to slashes.
                               *
                               * Yes, encodeURL() would take care of that for us, but we must also perform some preliminary
                               * checks on sURL first, and having consistent slash-based paths make those checks simpler.
                               */
                              var sURL = path.join(obj.req.path, sBaseName).replace(/\\/g, '/');
                              if (sURL.length == obj.req.path.length) continue;
              
                              /*
                               * Here's where we make the same assumption that filter() makes; ie, that any basename
                               * without a file extension (period) -- or a period followed by one or more digits -- should
                               * be considered a directory, and should therefore include a trailing slash, to minimize
                               * unnecessary redirects.  Unless, of course, the path is already a lone slash (ie, the root).
                               */
                              var fDir = false;
                              if (sURL == '/' || sBaseName == "..") {
                                  fDir = true;
                                  if (sURL != '/') sURL += '/';
                              } else if (asNonDirectories.indexOf(sBaseName) < 0 && (iExt < 0 || sBaseName.match(/\.[0-9]+[Ma-c]?$/))) {
                                  fDir = true;
                                  sURL += '/';
                              }
                              sURL = net.encodeURL(sURL, obj.req, obj.fDebug);
              
                              /*
                               * Here's where we add some code to massage disk image links: if this is a ".json" file in the
                               * /disks folders OR the basename contains "disk", then transform the link into one that will
                               * return an ".img" file when clicked (adapted from the code in browseFolder() in transform.php).
                               *
                               * We assume someone accessing/downloading such a file would rather have it in its original binary
                               * form rather than its JSON-ified form (which is all we typically check into the project).
                               */
                              var sOnClick = "";
                              if (sExt == DumpAPI.FORMAT.JSON && (sURL.indexOf("/disks/") === 0 || sBaseName.indexOf("disk") >= 0)) {
                                  sOnClick = obj.genOnClick(sURL);
                              }
              
                              /*
                               * The following code would similarly convert any links to ".img" files to a JSON stream, but I'm
                               * not sure we really need to support the reverse of the above.
                               *
                               *      if (sExt == DumpAPI.FORMAT.IMG) {
                               *          sOnClick = obj.genOnClick(sURL, DumpAPI.FORMAT.JSON);
                               *      }
                               */
              
                              sBaseName = '\\' + sBaseName.toUpperCase();
                           // if (fDir) sBaseName = sBaseName + '\\';
              
                              sList += sIndent + '\t<li><a href="' + sURL + '"' + sOnClick + '>' + sBaseName + '</a></li>\n';
                          }
                          if (sList) sList = '<ul class="common-list">\n' + sIndent + '\t' + sList.trim() + '\n' + sIndent + '</ul>';
                          obj.aTokens[sToken] = sList;
                      }
                      obj.replaceTokens();
                  });
              };
              
              /**
               * getYear(sToken, sIndent, aParms)
               *
               * Return the current year.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getYear = function(sToken, sIndent, aParms)
              {
                  var year = new Date().getFullYear();
                  if (year < 2015) year = 2015;
                  this.aTokens[sToken] = year.toString();
              };
              
              /**
               * getBlog(sToken, sIndent, aParms)
               *
               * If we're in the "blog" folder, then enumerate all available blog entries and create a rendering of blog excerpts.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               * @return {boolean} true if blog folder, false if not
               */
              HTMLOut.prototype.getBlog = function(sToken, sIndent, aParms)
              {
                  var obj = this;
                  if (this.sDir.match(/[\/\\]blog/)) {
                      var sPath = path.join(this.sDir, "**/README.md");
                      /*
                       * WARNING: On Azure, this.sDir will contain backslashes instead of slashes, which means
                       * you'd also expect the results from glob() to contain backslashes as well -- but they don't.
                       *
                       * For example, sPath on Azure is typically:
                       *
                       *      D:\home\site\wwwroot\blog\**\README.md
                       *
                       * but the results from glob() typically look like:
                       *
                       *      'D:/home/site/wwwroot/blog/2014/01/README.md',
                       *      'D:/home/site/wwwroot/blog/2013/11/README.md'
                       *
                       * However, it would be VERY unwise to rely on that behavior.  Let's continue to operate in a
                       * path-separator-agnostic mode, like passing any URL we form from these paths through encodeURL().
                       */
                      glob(sPath, {nosort: true}, function doneGlobForBlog(err, asPaths) {
                          asPaths.sort(function(a, b) {return a < b? 1 : -1;});
                          /*
                           * Sorting the list of blog files now was all well and good, except that there's
                           * no guarantee the readFile() callbacks will return in the same order we issue them.
                           *
                           * To deal with that, we turn asPaths into aExcerpts: an array of objects (instead of
                           * strings) that can hold the excerpts.  We'll plug the excerpts into aExcerpts as they
                           * come in, and then we'll assemble them all at the end.
                           *
                           * We also take this opportunity to cap the number of (most recent) excerpts.
                           */
                          var i;
                          var cExcerpts = Math.min(asPaths.length, nBlogExcerpts);
                          var aExcerpts = new Array(cExcerpts);
                          var cExcerptsRemaining = aExcerpts.length;
                          for (i = 0; i < cExcerpts; i++) {
                              /*
                               * If any of the paths we received appear to be the same as obj.sDir (which we can
                               * infer simply based on path lengths, without worrying about slashes vs. backslashes),
                               * then we can presume that there's a README.md in the requested directory, meaning
                               * this is probably a "leaf" folder of the blog "tree", and so it's that README.md we
                               * should display, not these excerpts -- so set the excerpt count to zero and bail.
                               */
                              if (path.dirname(asPaths[i]).length - obj.sDir.length <= 0) {
                                  cExcerptsRemaining = 0;
                                  break;
                              }
                              aExcerpts[i] = {path: asPaths[i], excerpt: ""};
                          }
                          if (cExcerptsRemaining) {
                              for (i = 0; i < aExcerpts.length; i++) {
                                  (function(iPath) {
                                      var sFile = aExcerpts[iPath].path;
                                      fs.readFile(sFile, {encoding: "utf8"}, function doneReadFileForBlog(err, s) {
                                          if (err) {
                                              aExcerpts[iPath].excerpt = HTMLOut.logError(err);
                                          } else {
                                              s = s.replace(/\r\n/g, "\n");
                                              var cch = s.indexOf("\n\n");
                                              cch = s.indexOf("\n\n", cch+2);
                                              if (cch >= 0) {
                                                  s = s.substr(0, cch+2);
                                                  /*
                                                   * I believe path.dirname() always removes any trailing slash, and since
                                                   * these are directories, we definitely want a trailing slash on the URL.
                                                   */
                                                  var sURL = path.dirname(sFile.substr(obj.sDir.length)) + "/";
                                                  /*
                                                   * I would like to annotate the excerpt with date information, which we can
                                                   * derive from sFile, which should be in one of two forms:
                                                   *
                                                   *      YYYY/MM
                                                   * or:
                                                   *      YYYY/MM/DD
                                                   *
                                                   * We adhere to those forms because, when sorted, they produce a chronological listing.
                                                   */
                                                  var asParts = sFile.match(/[\/\\](\d\d\d\d)[\/\\](\d\d)[\/\\]?(\d*)/);
                                                  if (asParts) {
                                                      var iYear = parseInt(asParts[1], 10);
                                                      var iMonth = parseInt(asParts[2], 10) - 1;
                                                      var iDay = asParts[3]? parseInt(asParts[3], 10) : 1;
                                                      var sDate = usr.formatDate(asParts[3]? "F j, Y" : "F Y", new Date(iYear, iMonth, iDay));
                                                      s = s.replace(/^([^\n]*\n[^\n]*\n)/, '$1<p style="font-size:x-small;margin-top:-12px">' + sDate + '</p>\n\n');
                                                  }
                                                  aExcerpts[iPath].excerpt = s + "[Read more](" + sURL + ")...";
                                              } else {
                                                  aExcerpts[iPath].excerpt = "Can't parse " + sFile;
                                              }
                                          }
                                          if (!--cExcerptsRemaining) {
                                              var sExcerpts = "";
                                              for (var i = 0; i < aExcerpts.length; i++) {
                                                  sExcerpts += aExcerpts[i].excerpt + "\n\n";
                                              }
                                              var mExcerpts = new MarkOut(sExcerpts, sIndent, obj.req, aParms, obj.fDebug);
                                              obj.aTokens[sToken] = mExcerpts.convertMD("    ").trim();
                                              obj.replaceTokens();
                                          }
                                      });
                                  })(i);
                              }
                          } else {
                              obj.getManifestXML(sToken, sIndent, aParms);
                          }
                      });
                      return true;
                  }
                  return false;
              };
              
              /**
               * getDefault(sToken, sIndent, aParms)
               *
               * Process whatever default document(s) are appropriate for the folder being requested.
               *
               * getBlog() gets first crack; if we're in a blog folder, it will display the appropriate blog entries.
               * If getBlog() declines the request, we move on to getManifestXML(), because we have some folders where
               * there's BOTH a manifest and a README, such as /apps/pc/1981/visicalc, and we want the manifest to take
               * priority.  getManifestXML() will, in turn, pass the request on to getReadMe(), which will, in turn,
               * pass the request on to getMachineXML().
               *
               * If getMachineXML() declines as well, then getRandomString() is called, which is kinda useless, but better
               * than nothing (well, maybe).
               *
               * Some wrinkles have been added to the above: getManifestXML() can alternatively call getMachineXML()
               * with a specific machine XML file, which would have had the potential to bypass getReadMe() altogether, so
               * getMachineXML() may now call getReadMe() -- which must NOT call getMachineXML() back whenever that happens.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getDefault = function(sToken, sIndent, aParms)
              {
                  if (this.getBlog(sToken, sIndent, aParms)) {
                      return;
                  }
                  this.getManifestXML(sToken, sIndent, aParms);
              };
              
              /**
               * getHTMLFile(sToken, sIndent, aParms)
               *
               * If the HTML file specified by aParms[0] exists, insert its contents into the current HTML document.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getHTMLFile = function(sToken, sIndent, aParms)
              {
                  /*
                   * If we're debugging, we don't want any HTML fragments embedded (at least not the Google Analytics or
                   * AdSense fragments).
                   *
                   * TODO: Consider a cleaner way for a tokenFunction to bypass token replacement (such as returning
                   * false); findTokens() sets the current token replacement value to null, to indicate a pending replacement,
                   * so currently our only bypass option is to set the token replacement value to an empty string, otherwise
                   * replaceTokens() won't think we're done.
                   */
                  if (fServerDebug || net.hasParm(net.GORT_COMMAND, null, this.req)) {
                      this.aTokens[sToken] = "";
                      return;
                  }
              
                  var obj = this;
                  var sFile = path.join(sServerRoot, path.dirname(sTemplateFile), aParms[0]);
              
                  HTMLOut.logConsole('HTMLOut.getHTMLFile("' + sFile + '")');
              
                  fs.readFile(sFile, {encoding: "utf8"}, function doneReadHTMLFile(err, s) {
                      if (err) {
                          HTMLOut.logError(err);
                          s = "";
                      }
                      obj.aTokens[sToken] = s.trim();
                      obj.replaceTokens();
                  });
              };
              
              /**
               * getMachineXML(sToken, sIndent, aParms, sXMLFile, sStateFile)
               *
               * If "machine.xml" exists in the current directory, open it and determine if embedding it makes sense.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>|null} [aParms]
               * @param {string|null} [sXMLFile]
               * @param {string|null} [sStateFile]
               */
              HTMLOut.prototype.getMachineXML = function(sToken, sIndent, aParms, sXMLFile, sStateFile)
              {
                  var obj = this;
                  var fFromManifest = !!sXMLFile;
                  var sFile = sXMLFile? path.join(sServerRoot, sXMLFile) : path.join(this.sDir, sXMLFile = sMachineXMLFile);
              
                  HTMLOut.logConsole('HTMLOut.getMachineXML("' + sFile + '")');
              
                  fs.readFile(sFile, {encoding: "utf8"}, function doneReadMachineXMLFile(err, sXML) {
                      var s;
                      if (!err) {
                          /*
                           * I've made this test stricter, to ensure we're only embedding machine XML files, because trying to
                           * embed other kinds of XML files (eg, those using an "outline.xsl", such as the C1P "server array" demo)
                           * will fail.
                           */
                          var aMatch = sXML.match(/<\?xml-stylesheet.*?href="(.*?machine\.xsl)"\?>/);
                          if (aMatch) {
                              var sStyleSheet = aMatch[1];
                              /*
                               * Recognized machine stylesheets are either "production" stylesheets in ("/versions/pcjs"|"/versions/c1pjs")
                               * or "development" stylesheets in ("/modules/pcjs/templates"|"/modules/c1pjs/templates").
                               *
                               * The common denominator in both sets is either "/pc" or "/c1p", which in turn indicates the class of machine
                               * (ie, "PC" or "C1P").
                               */
                              var sMachineClass = (sStyleSheet.indexOf("/pc") >= 0? "PC" : (sStyleSheet.indexOf("/c1p") >= 0? "C1P" : null));
                              if (sMachineClass) {
                                  /*
                                   * Since the MarkOut module already contains the ability to embed a machine definition with
                                   * one simple line of Markdown-like magic, we'll create such a line and let MarkOut do the rest.
                                   *
                                   * The string we initialize the MarkOut object should look like one of
                                   *
                                   *      '[Embedded PC](machine.xml "PCjs:machineID:stylesheet:version:options:state")'
                                   *      '[Embedded C1P](machine.xml "C1Pjs:machineID:stylesheet:version:options:state")'
                                   *
                                   * where machineID is the machine "id" embedded in the XML, stylesheet is the path to the XML stylesheet,
                                   * version is a version number ('*' or blank for the latest version, which is all we support here), and
                                   * options is a comma-delimited series of, well, options; the only option we currently output is "debugger"
                                   * if a <debugger> element is present in the machine XML.
                                   */
                                  var sMachineID = "machine" + sMachineClass; // fallback to either "machinePC" or "machineC1P" if no ID found
                                  aMatch = sXML.match(/<machine.*?\sid=(['"])(.*?)\1[^>]*>/);
                                  if (aMatch) sMachineID = aMatch[2];
              
                                  /*
                                   * WARNING: Machine XML files use machine XSL stylesheets, which are designed to transform a
                                   * machine definition into a complete self-contained HTML document, which is inappropriate for
                                   * embedding inside an existing HTML document, so any "machine.xsl" stylesheet must be remapped
                                   * to a corresponding "components.xsl" stylesheet (which is what the next line does).
                                   */
                                  var sMachineDef = sMachineClass + "js:" + sMachineID + ":" + sStyleSheet.replace("machine.xsl", "components.xsl");
                                  sMachineDef += (sXML.indexOf("<debugger") > 0? ":*:debugger" : ":*:none");
                                  sMachineDef += (sStateFile? ":" + sStateFile : "");
              
                                  s = '[Embedded ' + sMachineClass + '](' + sXMLFile + ' "' + sMachineDef + '")';
                                  var m = new MarkOut(s, sIndent, obj.req, null, obj.fDebug);
                                  s = m.convertMD("    ").trim();
              
                                  obj.processMachines(m.getMachines(), function doneProcessXMLMachines() {
                                      obj.getReadMe(sToken, sIndent, aParms, s);
                                  });
                                  return;
                              }
                          }
                      }
              
                      /*
                       * If we're still here, one of the following happened:
                       *
                       *      1) there was no "machine.xml"; see err for details
                       *      2) there was no stylesheet specified in "machine.xml"
                       *      3) the specified stylesheet in "machine.xml" was not recognized
                       *
                       * But, instead of displaying a cryptic error message inside our beautiful HTML template, eg:
                       *
                       *      htmlout error: ENOENT, open '/Users/Jeff/Sites/pcjs/devices/pc/machine/5160/cga/256kb/win101/debugger/machine.xml'
                       *
                       * we have one more fallback: a random string!  Less useful, but more entertaining.  Well, maybe not even that.
                       *
                       *      s = HTMLOut.logError(err);
                       */
              
                      /*
                       * If we were called from getManifestXML(), then let's fallback to getReadMe() instead.
                       */
                      s = obj.getRandomString(sIndent);
                      if (fFromManifest) {
                          obj.getReadMe(sToken, sIndent, aParms, s);
                          return;
                      }
              
                      obj.aTokens[sToken] = s;
                      obj.replaceTokens();
                  });
              };
              
              /**
               * getManifestXML(sToken, sIndent, aParms)
               *
               * If "manifest.xml" exists in the current directory, open it and embed it.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getManifestXML = function(sToken, sIndent, aParms)
              {
                  var obj = this;
                  var sXMLFile = path.join(this.sDir, sManifestXMLFile);
              
                  HTMLOut.logConsole('HTMLOut.getManifestXML("' + sXMLFile + '")');
              
                  fs.readFile(sXMLFile, {encoding: "utf8"}, function doneReadManifestXMLFile(err, sXML) {
                      var s;
                      if (!err) {
                          var match = sXML.match(/<\?xml-stylesheet.*?href="(.*?manifest\.xsl)"\?>\s*<manifest[^>]* type="([^"]*)"/);
                          if (match) {
                              var sListItems = "";
                              var sHeading = "Manifest";
                              var sStyleSheet = match[1];
                              var sManifestType = match[2];
              
                              /*
                               * Manifests contain a variety of metadata describing software or documentation, which we display
                               * in a "common-list-data" list.  Those data items are already listed in "manifest.xsl", so to minimize
                               * redundancy, I read the XSL file and enumerate the items to, uh, be enumerated.
                               */
                              var sXSLFile = path.join(sServerRoot, sStyleSheet);
                              fs.readFile(sXSLFile, {encoding: "utf8"}, function doneReadManifestXSLFile(err, sXSL) {
                                  if (!err) {
                                      var reTemplate = new RegExp("<xsl:template match=\"/manifest\\[@type\\s*=\\s*'" + sManifestType + "'[^>]*>([\\s\\S]*?)</xsl:template>");
                                      var matchXSL = sXSL.match(reTemplate);
                                      var sXSLTemplate = (matchXSL? matchXSL[1] : "");
                                      var fCreationDate = false;
                                      var matchItem, matchParams;
                                      var sName = null, sVersion = null;
                                      var reItems = /<xsl:call-template name="listItem">([\s\S]*?)<\/xsl:call-template>/g;
                                      var reParams = /<xsl:with-param name="([^"]*)"\s+select="'?([^"']*)'?"[^>]*\/>/g;
                                      while ((matchItem = reItems.exec(sXSLTemplate))) {
                                          var sLabel = null, sNode = null, sDefault = null;
                                          while ((matchParams = reParams.exec(matchItem[0]))) {
                                              switch(matchParams[1]) {
                                              case "label":
                                                  sLabel = matchParams[2];
                                                  break;
                                              case "node":
                                                  sNode = matchParams[2];
                                                  if (!sLabel && sNode == "releaseDate") sLabel = (fCreationDate? "Updated" : "Released");
                                                  break;
                                              case "default":
                                                  sDefault = matchParams[2];
                                                  break;
                                              default:
                                                  break;
                                              }
                                          }
                                          if (sLabel) {
                                              var matchNode;
                                              var fMatch = false;
                                              var reNodes = new RegExp('<' + sNode + '([^>]*)>([\\s\\S]*?)</' + sNode + '>', "g");
                                              while ((matchNode = reNodes.exec(sXML))) {
              
                                                  var sNodeDesc = "", sNodeValue = matchNode[2];
                                                  match = sNodeValue.match("<desc[^>]*>(.*?)</desc>");
                                                  if (match) {
                                                      sNodeDesc = match[1];
                                                  } else {
                                                      match = sNodeValue.match("<org[^>]*>(.*?)</org>");
                                                      if (match) sNodeDesc = match[1];
                                                  }
              
                                                  match = sNodeValue.match("<name[^>]*>(.*?)</name>");
                                                  if (match) {
                                                      sNodeValue = match[1];
                                                  } else if (!sNodeValue || sNodeValue.indexOf('<') >= 0) {
                                                      if (!sDefault && sNode == "disk") {
                                                          sDefault = (sName? sName + (sVersion? ' ' + sVersion : '') : '');
                                                      }
                                                      sNodeValue = sDefault;
                                                  }
              
                                                  if (!sNodeValue) continue;
                                                  if (sNode == "name") sName = sNodeValue;
                                                  if (sNode == "version") sVersion = sNodeValue;
                                                  if (sNode == "creationDate") fCreationDate = true;
              
                                                  var sNodeLink = "", sOnClick = "";
                                                  if (matchNode[1] && (match = matchNode[1].match(/ href=(['"])(.*?)\1/))) {
                                                      sNodeLink = match[2];
                                                  }
              
                                                  var matchCover = null;
                                                  match = matchNode[2].match('<cover[^>]*href="([^"]*)"');
                                                  if (match && match[1].indexOf("static/") >= 0) {
                                                      matchCover = match[1];
                                                      if (obj.fDebug) {
                                                          sNodeLink = matchCover.replace("/thumbs/", '/').replace(/ ?[0-9]*\.(jpeg|jpg)/, ".pdf");
                                                      }
                                                  }
              
                                                  if (sNodeLink) {
                                                      if (str.endsWith(sNodeLink, ".json") && sNodeLink.indexOf("/disks/") === 0) {
                                                          sOnClick = obj.genOnClick(sNodeLink);
                                                      }
                                                      sNodeValue = '<a href="' + net.encodeURL(sNodeLink, obj.req, obj.fDebug) + '"' + sOnClick + '>' + sNodeValue + '</a>';
                                                  }
              
                                                  var sItemPages = "";
                                                  var rePages = /<page([^>]*)>([^<]*)<\/page>/g;
                                                  while ((match = rePages.exec(matchNode[2]))) {
                                                      var sPageName = match[2];
                                                      match = match[1].match(/ href="([^"]*)"/);
                                                      var sPageLink = (match? match[1] : null);
                                                      if (sPageLink) {
                                                          if (sPageLink.charAt(0) == '#') {
                                                              match = sPageLink.match(/page=([0-9]+)/);
                                                              if (!match || !matchCover) {
                                                                  sPageLink = sNodeLink + sPageLink;
                                                              } else {
                                                                  sPageLink = matchCover.replace("/thumbs/", '/pages/').replace(/( ?)[0-9]*\.(jpeg|jpg)/, "$1" + match[1] + ".pdf");
                                                              }
                                                          }
                                                          sPageName = '<a href="' + net.encodeURL(sPageLink, obj.req, obj.fDebug) + '" target="_blank">' + sPageName + '</a>';
                                                      }
                                                      sItemPages += sIndent + '\t\t\t<li>' + sPageName + '</li>\n';
                                                  }
              
                                                  if (!fMatch) {
                                                      sListItems += sIndent + '\t<li>' + sLabel + '\n';
                                                      sListItems += sIndent + '\t\t<ul class="common-list-data-items">\n';
                                                      fMatch = true;
                                                  }
              
                                                  sListItems += sIndent + '\t\t\t<li' + (sNodeDesc? ' title="' + sNodeDesc + '"' : '') + '>' + sNodeValue;
                                                  if (sItemPages) {
                                                      sListItems += '\n' + sIndent + '\t\t<ul class="common-list-data-subitems">\n' + sItemPages + sIndent + '\t\t</ul>';
                                                  }
                                                  sListItems += '\n' + sIndent + '\t\t\t</li>\n';
                                              }
                                              if (fMatch) {
                                                  sListItems += sIndent + '\t\t</ul>\n';
                                                  sListItems += sIndent + '\t</li>\n';
                                              }
                                          }
                                      }
              
                                      sListItems = '<h4><a href="' + sManifestXMLFile + '">' + sHeading + '</a></h4>\n' + sIndent + '<ul class="common-list-data">\n' + sListItems + sIndent + '</ul>\n';
                                      obj.aTokens["<!-- pcjs:manifest -->"] = sListItems;
              
                                      var sXMLFile = null, sStateFile = null;
                                      var matchMachine = sXML.match(/<machine(.*?)\/>/);
                                      if (matchMachine) {
                                          if ((match = matchMachine[1].match(/ href=(['"])(.*?)\1/))) {
                                              sXMLFile = match[2];
                                          }
                                          if ((match = matchMachine[1].match(/ state=(['"])(.*?)\1/))) {
                                              sStateFile = match[2];
                                          }
                                      }
                                      if (sXMLFile) {
                                          obj.getMachineXML(sToken, sIndent, null, sXMLFile, sStateFile);
                                          return;
                                      }
                                  }
              
                                  /*
                                   * If we're still here, then there was either a problem reading the manifest XSL file,
                                   * or the manifest XML file didn't contain a machine reference.  For now, we fall back to
                                   * getReadMe().
                                   */
                                  obj.getReadMe(sToken, sIndent, aParms);
                              });
                              return;
                          }
                      }
                      /*
                       * If we're still here, then there was either a problem reading the manifest XML file, or it didn't
                       * contain a recognized stylesheet.  For now, we fall back to getReadMe().
                       */
                      obj.getReadMe(sToken, sIndent, aParms);
                  });
              };
              
              /**
               * getReadMe(sToken, sIndent, aParms, sPrevious)
               *
               * If a "README.md" exists in the current directory, open it, convert it, and prepare for replacement.
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               * @param {string|null} [sPrevious] is text, if any, that should precede the README.md
               */
              HTMLOut.prototype.getReadMe = function(sToken, sIndent, aParms, sPrevious)
              {
                  var obj = this;
                  var sFile = path.join(this.sDir, sReadMeFile);
              
                  HTMLOut.logConsole('HTMLOut.getReadMe("' + sFile + '")');
              
                  fs.readFile(sFile, {encoding: "utf8"}, function doneReadMeFile(err, s) {
                      if (err) {
                          /*
                           * Instead of displaying a cryptic error message inside our beautiful HTML template, eg:
                           *
                           *      htmlout error: ENOENT, open '/Users/Jeff/Sites/pcjs/devices/pc/machine/5160/cga/256kb/win101/debugger/README.md'
                           *
                           * which is all this will give us:
                           *
                           *      s = HTMLOut.logError(err);
                           *
                           * we now try some fallbacks, like checking for a "machine.xml" -- but only if sPrevious is not defined.
                           */
                          if (sPrevious !== undefined) {              // this means we were called from getMachineXML(), so it's the end of road
                              obj.aTokens[sToken] = sPrevious;
                              obj.replaceTokens();
                          } else {
                              obj.getMachineXML(sToken, sIndent);     // we don't pass along aParms, because those are for Markdown files only
                          }
                      } else {
                          var m = new MarkOut(s, sIndent, obj.req, aParms, obj.fDebug);
                          s = m.convertMD("    ").trim();
                          /*
                           * If the Markdown document begins with a heading, stuff that into the <title> tag;
                           * it would be cleaner if this replacement could be performed by getTitle(), but unfortunately,
                           * getTitle() is called long before any README.md is opened.
                           */
                          var match = s.match(/^\s*<h([0-9])[^>]*>(.*?)<\/h\1>/);
                          if (match) {
                              var sTitle = match[2];
                              match = sTitle.match(/<a [^>]*>([^<]*)<\/a>/);
                              if (match) sTitle = match[1];
                              obj.sHTML = obj.sHTML.replace(/(<title[^>]*>)([^\|]*)\|[^<]*(<\/title>)/, "$1$2| " + sTitle + "$3");
                          }
                          /*
                           * We need to query the MarkOut object for any machine definitions that the current "readme"
                           * document contained and give them to processMachines(), so that any associated scripts can
                           * be added to the current page.
                           *
                           * However, processMachines() may need to search the file system for the appropriate scripts,
                           * and since that may not finish immediately, we defer updating the "readme" token until the
                           * processMachines() callback has been called.  This insures that the HTML page will not be
                           * delivered until all associated scripts for all machine definitions have been added.
                           *
                           * Note that if we ever decide to support more than one Markdown document (or "readme" token)
                           * per HTML page, it may be better to collect all the machine definitions in an array, eliminate
                           * any duplicates from that array, and then call processMachines() at some later point, after
                           * all tokens have been replaced.
                           */
                          obj.processMachines(m.getMachines(), function doneProcessReadMeMachines() {
                              obj.aTokens[sToken] = sPrevious? (sPrevious + sIndent + s) : s;
                              obj.replaceTokens();
                          });
                      }
                  });
              };
              
              /**
               * getSocketScripts(sToken, sIndent, aParms)
               *
               * @this {HTMLOut}
               * @param {string} sToken
               * @param {string} [sIndent]
               * @param {Array.<string>} [aParms]
               */
              HTMLOut.prototype.getSocketScripts = function(sToken, sIndent, aParms)
              {
                  this.aTokens[sToken] = (fSockets? '<script type="text/javascript" src="/socket.io/socket.io.js"></script>\n' + sIndent + '<script type="text/javascript" src="/modules/shared/lib/sockets.js"></script>' : "");
              };
              
              /**
               * getRandomString(sIndent)
               *
               * Generate a random string of words, purely for entertainment purposes (eg, something in honor of "ADVENT").
               *
               * @this {HTMLOut}
               * @param {string} [sIndent]
               * @return {string}
               */
              HTMLOut.prototype.getRandomString = function(sIndent)
              {
                  var s = "";
                  var asNouns = ["maze", "passages"];
                  var asAdjectives = ["little", "twisty|twisting"];
              
                  while (asNouns.length) {
                      var cAdjectives = Math.floor(Math.random() * Math.min(2, asAdjectives.length));
                      while (cAdjectives--) {
                          var iAdjective = Math.floor(Math.random() * asAdjectives.length);
                          var sAdjective = asAdjectives[iAdjective];
                          var asVariations = sAdjective.split("|");
                          sAdjective = asVariations[Math.floor(Math.random() * asVariations.length)];
                          if (s) s += " ";
                          s += sAdjective;
                          asAdjectives.splice(iAdjective, 1);
                      }
                      if (s) s += " ";
                      s += asNouns[0];
                      asNouns.splice(0, 1);
                      if (asNouns.length) s += " of";
                  }
                  s = sIndent + '<p id="random">You are in a ' + s + ', all ' + (Math.floor(Math.random() * 2)? 'alike' : 'different') + '.</p>\n';
                  this.fRandomize = true;
                  return s;
              };
              
              /**
               * processMachines(aMachines, done)
               *
               * At a minimum, each machine object should contain the following properties:
               *
               *      'class' (eg, a machine class, such as "pc" or "c1p")
               *      'version' (eg, "1.10", "*" to select the current version, or "uncompiled"; "*" is the default)
               *      'debugger' (eg, true or false; false is the default)
               *
               * @this {HTMLOut}
               * @param {Array} aMachines is an array of objects containing information about each machine on the current page
               * @param {function()} done
               */
              HTMLOut.prototype.processMachines = function(aMachines, done)
              {
                  for (var iMachine = 0; iMachine < aMachines.length; iMachine++) {
              
                      var infoMachine = aMachines[iMachine];
              
                      HTMLOut.logDebug('HTMLOut.processMachines(' + JSON.stringify(infoMachine) + ')');
              
                      var sClass = infoMachine['class'];                      // aka the machine class
              
                      var fCompiled = !this.fDebug;
                      var sVersion = infoMachine['version'];
                      if (sVersion === undefined || sVersion == '*') {
                          sVersion = pkg.version;
                      } else {
                          fCompiled = (sVersion != "uncompiled");
                      }
              
                      var fDebugger = infoMachine['debugger'];
                      if (fDebugger === undefined) fDebugger = false;         // default to no debugger
              
                      var fNoDebug = !this.fDebug;
                      if (net.hasParm(net.GORT_COMMAND, net.GORT_NODEBUG, this.req)) {
                          fNoDebug = true;
                          fCompiled = false;
                      }
              
                      var sScriptEmbed = "";
                      if (infoMachine['func']) {
                          sScriptEmbed = '<script type="text/javascript">' + 'window.' + infoMachine['func'] + '("' + infoMachine['id'] + '","' + infoMachine['xml'] + '"' + (infoMachine['xsl']? (',"' + infoMachine['xsl'] + '"') : ',""') + (infoMachine['state']? (',"' + infoMachine['state'] + '"') : '') + ');</script>';
                      }
              
                      var asFiles = [];
                      if (fCompiled) {
                          var sScriptFolder = sClass + "js";                  // aka the app class
                          var sScriptFile = sClass + (fDebugger? "-dbg" : "") + ".js";
                          asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/components.css");
                          asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/" + sScriptFile);
                          this.addFilesToHTML(asFiles, sScriptEmbed);
                      }
                      else {
                          /*
                           * SIDEBAR: Why the "slice()"?  It's a handy way to create a copy of the array, and we need a copy,
                           * because if it turns out we need to "cut out" some of the files below (using splice), we don't want that
                           * affecting the original array.
                           */
                          if ((asFiles = aMachineFiles[sClass].slice())) {
                              var i;
                              if (fNoDebug) {
                                  /*
                                   * We need to find the shared "defines.js" source file, and follow it with "nodebug.js".
                                   */
                                  for (i = 0; i < asFiles.length; i++) {
                                      if (asFiles[i].indexOf("shared/lib/defines.js") >= 0) {
                                          asFiles.splice(i + 1, 0, asFiles[i].replace("defines.js", "nodebug.js"));
                                          break;
                                      }
                                  }
                              }
                              if (!fDebugger) {
                                  /*
                                   * Step 1: We need to find the client's "defines.js" source file, and follow it with "nodebugger.js".
                                   */
                                  for (i = 0; i < asFiles.length; i++) {
                                      if (asFiles[i].indexOf("js/lib/defines.js") >= 0) {
                                          asFiles.splice(i + 1, 0, asFiles[i].replace("defines.js", "nodebugger.js"));
                                          break;
                                      }
                                  }
                                  /*
                                   * Step 2: If there's a "debugger.js" source file in the list of uncompiled files, we need to remove it,
                                   * which we do by using the Array splice() method, removing the 1 matching element from the array.
                                   */
                                  for (i = 0; i < asFiles.length; i++) {
                                      if (asFiles[i].indexOf("/debugger.js") >= 0) {
                                          asFiles.splice(i, 1);
                                          break;
                                      }
                                  }
                              }
                              this.addFilesToHTML(asFiles, sScriptEmbed);
                          }
                      }
                  }
                  if (done) done();
              };
              
              /**
               * addFilesToHTML(asFiles)
               *
               * @this {HTMLOut}
               * @param {Array.<string>} asFiles is a list of CSS and/or JS files to include in the HTML
               * @param {string} [sScriptEmbed] is an optional script to embed in the <body> (after any JS files listed above)
               */
              HTMLOut.prototype.addFilesToHTML = function(asFiles, sScriptEmbed)
              {
                  for (var sTag in aMachineFileTypes) {
                      var aMatch = this.sHTML.match(new RegExp("<" + sTag + ">\n?([ \t]*)([\\s\\S]*?)[\n \t]*</" + sTag + ">", "i"));
                      if (aMatch) {
                          var sTextInsert = "";
                          var sIndent = aMatch[1];
                          var sText = aMatch[2];
                          for (var iExt = 0; iExt < aMachineFileTypes[sTag].length; iExt++) {
                              var sExt = aMachineFileTypes[sTag][iExt];
                              for (var i = 0; i < asFiles.length; i++) {
                                  var sFile = asFiles[i];
                                  /*
                                   * If the filenames coming from "package.json" begin with "./", strip the leading period.
                                   */
                                  if (sFile.substr(0, 2) == "./") sFile = sFile.substr(1);
                                  /*
                                   * SIDEBAR: substr(-4) is another way to extract the last 4 characters of a string,
                                   * but it's non-standard (eg, early versions of IE didn't support it), so if you want to extract
                                   * from the end of a string, using slice() with negative indexes is the safer way to go.
                                   */
                                  var sInsert;
                                  if (sFile.slice(-sExt.length) == sExt) {
                                      if (sExt == ".css") {
                                          sInsert = '\n' + sIndent + '<link rel="stylesheet" type="text/css" href="' + sFile + '">';
                                          if (sText.indexOf(sInsert) < 0) {
                                              sTextInsert += sInsert;
                                          }
                                      }
                                      else if (sExt == ".js") {
                                          sInsert = '\n' + sIndent + '<script type="text/javascript" src="' + sFile + '"></script>';
                                          if (sText.indexOf(sInsert) < 0) {
                                              sTextInsert += sInsert;
                                          }
                                      }
                                  }
                              }
                          }
                          if (sScriptEmbed && sTag == "body") {
                              sTextInsert += '\n' + sIndent + sScriptEmbed;
                          }
                          if (sTextInsert) {
                              this.sHTML = this.sHTML.replace(sText, sText + sTextInsert);
                          }
                      }
                      else {
                          HTMLOut.logError(new Error("missing <" + sTag + "> in HTML template"));
                      }
                  }
              };
              
              /**
               * genOnClick(sURL)
               *
               * @this {HTMLOut}
               * @param {string} sURL
               * @param {string} [sFormat] (default is DumpAPI.FORMAT.IMG)
               * @return {string}
               */
              HTMLOut.prototype.genOnClick = function(sURL, sFormat)
              {
                  return " onclick=\"window.location='" + DumpAPI.ENDPOINT + "?" + DumpAPI.QUERY.DISK + "=" + sURL.replace('?', '&') + "&" + DumpAPI.QUERY.FORMAT + "=" + (sFormat || DumpAPI.FORMAT.IMG) + "'; return false;\"";
              };
              
              /*
               * Class constants/globals
               */
              HTMLOut.tokenFunctions = {
                  'pcjs': {
                      'title':    HTMLOut.prototype.getTitle,
                      'version':  HTMLOut.prototype.getVersion,
                      'path':     HTMLOut.prototype.getPath,
                      'pcpath':   HTMLOut.prototype.getPCPath,
                      'dirlist':  HTMLOut.prototype.getDirList,
                      'manifest': null,
                      'year':     HTMLOut.prototype.getYear,
                      'default':  HTMLOut.prototype.getDefault,
                      'htmlfile': HTMLOut.prototype.getHTMLFile,
                      'sockets':  HTMLOut.prototype.getSocketScripts
                  }
              };
              
              module.exports = HTMLOut;
              
            • httpapi.js
              /**
               * @fileoverview Handles API requests and redirects
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-02-14
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var fs          = require("fs");
              var path        = require("path");
              
              /**
               * @class exports
               * @property {function(string)} sync
               */
              var mkdirp      = require("mkdirp");
              
              var DiskAPI     = require("../../shared/lib/diskapi");
              var DumpAPI     = require("../../shared/lib/dumpapi");
              var UserAPI     = require("../../shared/lib/userapi");
              var ReportAPI   = require("../../shared/lib/reportapi");
              var net         = require("../../shared/lib/netlib");
              var str         = require("../../shared/lib/strlib");
              var usr         = require("../../shared/lib/usrlib");
              var DiskDump    = require("../../diskdump");
              var FileDump    = require("../../filedump");
              
              /**
               * @type {HTMLOut}
               */
              var HTMLOut;
              
              /**
               * sServerRoot is the root directory of the web server; it can (and should) be overridden using by the Express
               * web server using setRoot().
               *
               * @type {string}
               */
              var sServerRoot = "";
              
              /*
               * logFile is set by HTMLOut, allowing us to "mingle" our output with the server's log (typically "./logs/node.log").
               */
              var logFile = null;
              
              /*
               * Entries in this table are matched first, as-is, to req.path (no string or RegExp compare involved);
               * we do, however, strip any trailing slash from the incoming path before doing the lookup, so none of
               * the entries on the left-hand side should contain trailing slashes.
               *
               * FYI, here's what the jsmachines.net .htaccess contained before we retired its Apache webserver:
               *
               *     Redirect permanent /c1p /docs/c1pjs/
               *     Redirect permanent /c1pjs /docs/c1pjs/
               *     Redirect permanent /pc /docs/pcjs/
               *     Redirect permanent /pcjs /docs/pcjs/
               *     Redirect permanent /configs/c1p/embed/ /docs/c1pjs/embed/
               *     # Redirect permanent /configs/c1p/machines/ /docs/c1pjs/
               *     Redirect permanent /configs/pc/machines/5160/cga/win101/xt-cga-win101.xml /configs/pc/machines/5160/cga/256kb/win101/
               *     Redirect permanent /devices/c1p/array.xml /configs/c1p/machines/array/
               *     Redirect permanent /devices/pc/5160/cga/machine-dos400m.xml /configs/pc/machines/5160/cga/640kb/dos400m/
               *     Redirect permanent /demos/c1p/embed.html /docs/c1pjs/embed/
               *     Redirect permanent /demos/pc/cga-win101/xt-cga-win101.xml /configs/pc/machines/5160/cga/256kb/win101/
               *     Redirect permanent /videos/pcjs/ /disks/pc/dos/microsoft/4.0M/
               *     RedirectMatch permanent /demos/pc/.* /configs/pc/machines/
               */
              var aExternalRedirects = {
                  "/c1p":                                                     "/docs/c1pjs/",
                  "/c1pjs":                                                   "/docs/c1pjs/",
                  "/pc":                                                      "/docs/about/pcjs/",
                  "/pcjs":                                                    "/docs/about/pcjs/",
                  "/configs/c1p/embed":                                       "/docs/c1pjs/embed/",
                  "/configs/c1p/machines/array":                              "/devices/c1p/machine/8kb/array/",
                  "/configs/c1p/machines/array.xml":                          "/devices/c1p/machine/8kb/array/",
                  "/configs/c1p/machines/machine.xml":                        "/devices/c1p/machine/8kb/large/",
                  "/configs/pc/disks":                                        "/disks/pc/",
                  "/configs/pc/machines/5150/mda/demo/pc-mda-64k.xml":        "/devices/pc/machine/5150/mda/64kb/",
                  "/configs/pc/machines/5150/cga/donkey/pc-cga-64k.xml":      "/devices/pc/machine/5150/cga/64kb/donkey/",
                  "/configs/pc/machines/5150/cga/donkey/pc-dbg-64k.xml":      "/devices/pc/machine/5150/cga/64kb/donkey/debugger/",
                  "/configs/pc/machines/5160/cga/demo":                       "/devices/pc/machine/5160/cga/256kb/demo/",
                  "/configs/pc/machines/5160/cga/demo/xt-cga-256k.xml":       "/devices/pc/machine/5160/cga/256kb/demo/",
                  "/configs/pc/machines/5160/cga/demo/xt-dbg-256k.xml":       "/devices/pc/machine/5160/cga/256kb/demo/debugger/",
                  "/configs/pc/machines/5160/cga/win101/xt-cga-win101.xml":   "/devices/pc/machine/5160/cga/256kb/win101/",
                  "/configs/pc/machines/5160/cga/machine-512k-win101.xml":    "/devices/pc/machine/5160/cga/512kb/win101/softkbd/",
                  "/demos/c1p/embed.html":                                    "/docs/c1pjs/embed/",
                  "/demos/c1p/embed.xml":                                     "/devices/c1p/machine/8kb/embed/machine.xml",
                  "/demos/pc/cga":                                            "/devices/pc/machine/5150/cga/",
                  "/demos/pc/donkey/pc-cga-64k.xml":                          "/devices/pc/machine/5150/cga/64kb/donkey/",
                  "/demos/pc/cga-win101":                                     "/devices/pc/machine/5160/cga/256kb/win101/",
                  "/demos/pc/cga-win101/xt-cga-win101.xml":                   "/devices/pc/machine/5160/cga/256kb/win101/",
                  "/devices/c1p/array.xml":                                   "/devices/c1p/machine/8kb/array/",
                  "/devices/pc/5160/cga/machine-dos400m.xml":                 "/devices/pc/machine/5160/cga/640kb/dos400m/",
                  "/videos/pcjs":                                             "/devices/pc/machine/5160/cga/640kb/dos400m/"
              };
              
              var aExternalRedirectPatterns = {
                  "^/configs/c1p/machines/?(.*)":                             "/devices/c1p/machine/$1",
                  "^/configs/pc/machines/?(.*)":                              "/devices/pc/machine/$1"
              };
              
              /*
               * Entries in this table are matched next, using a RegExp comparison; comparisons start with the first entry
               * and continue until a match is found, at which point the replacement is performed and comparisons stop;
               * we could make the replacement process "additive", by continuing comparisons/replacements until the
               * end is reached, but let's not, unless there's an actual need.
               *
               * Feel free to use subgroups on the left-hand side, and references to them (eg, $1, $2, etc) on the right.
               */
              var aInternalRedirectPatterns = {
              //  "^/apps/pc/visicalc/":      "/apps/pc/1981/visicalc/",
              //  "^/demos/pc/.*":            "/devices/pc/machine/"
              };
              
              /**
               * HTTPAPI()
               *
               * @param {HTMLOut} out
               * @param {string} sRoot
               */
              function HTTPAPI(out, sRoot) {
                  HTMLOut = out;
                  sServerRoot = sRoot;
              }
              
              /**
               * setLogFile(file)
               *
               * @param {Object} file
               */
              HTTPAPI.setLogFile = function(file)  {
                  logFile = file;
                  DiskDump.setLogFile(file);
              };
              
              /**
               * @class Volume
               * @property {number|null} fd   file descriptor
               * @property {string} mode      access mode (one of DiskAPI.MODE.*)
               * @property {string} path      path of the volume file
               * @property {string} machine   machine ID associated with the volume file
               */
              
              /**
               * User IDs are added to userVolumes as users open volumes;  for now, only one open
               * volume per user is supported.  Every entry in userVolumes is another object (Volume).
               *
               * @type {Object.<Volume>}
               */
              var userVolumes = {};
              
              /**
               * redirect(req, res, next) is called by filter() to give us a crack at the URL
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @param {function()} next is the function to call to finish processing this request (unless WE finish it)
               * @return {boolean} true if the request was permanently redirected, false if not
               */
              HTTPAPI.redirect = function(req, res, next)
              {
                  var re;
                  var sPath = req.path;
                  if (sPath.slice(-1) == '/') sPath = sPath.slice(0, -1);
              
                  if (sPath.indexOf("%2520") >= 0) {
                      sPath = sPath.replace(/%2520/g, "%20");
                      res.redirect(301, sPath);
                      return true;
                  }
              
                  if (aExternalRedirects[sPath] !== undefined) {
                      res.redirect(301, aExternalRedirects[sPath]);
                      return true;
                  }
              
                  for (sPath in aExternalRedirectPatterns) {
                      re = new RegExp(sPath);
                      if (re.exec(req.url)) {
                          res.redirect(301, req.url.replace(re, aExternalRedirectPatterns[sPath]));
                          return true;
                      }
                  }
              
                  for (sPath in aInternalRedirectPatterns) {
                      re = new RegExp(sPath);
                      if (re.exec(req.url)) {
                          req.url = req.url.replace(re, aInternalRedirectPatterns[sPath]);
                          break;
                      }
                  }
                  return false;
              };
              
              /**
               * filterAPI(req, res, next) is called by filter() to give us a crack at any API URLs
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @param {function()} next is the function to call to finish processing this request (unless WE finish it)
               * @return {boolean} true if the request was handled as an API request, false if not
               */
              HTTPAPI.filterAPI = function(req, res, next)
              {
                  var asURL = req.path.match(/(^\/api\/v1\/[a-z]+)/);
                  if (asURL) {
                      if (asURL[0] == DiskAPI.ENDPOINT) {
                          if (HTTPAPI.processDiskAPI(req, res)) {
                              return true;
                          }
                      }
                      else if (asURL[0] == DumpAPI.ENDPOINT) {
                          if (HTTPAPI.processDumpAPI(req, res)) {
                              return true;
                          }
                      }
                      else if (asURL[0] == ReportAPI.ENDPOINT) {
                          if (HTTPAPI.processReportAPI(req, res)) {
                              return true;
                          }
                      }
                      else if (asURL[0] == UserAPI.ENDPOINT) {
                          if (HTTPAPI.processUserAPI(req, res)) {
                              return true;
                          }
                      }
                      /*
                       * If we're still here, the API request didn't pass muster.
                       *
                       * TODO: Consider providing some simple usage info, and changing the nResponse to 200,
                       * since the API endpoints will eventually be documented in /docs/pcjs/.
                       */
                      var nResponse = 400;                // default to "Bad Request"
                      var sResponse = "unrecognized API request: " + asURL[0] + "\n";
                      res.status(nResponse).send(sResponse);
                      return true;
                  }
                  return false;
              };
              
              /**
               * hasAPICommand(req, asCommands)
               *
               * @param {Object} req
               * @param {Array.<string>} asCommands (eg, DumpAPI.asDiskCommands or DumpAPI.asFileCommands)
               * @returns {Array|null}
               */
              HTTPAPI.hasAPICommand = function(req, asCommands)
              {
                  if (req.query) {
                      for (var i = 0; i < asCommands.length; i++) {
                          var sValue = req.query[asCommands[i]];
                          if (sValue) return [asCommands[i], sValue];
                      }
                  }
                  return null;
              };
              
              /**
               * initUserVolume(vol, fd, cbInit)
               *
               * @param {Object} vol
               * @param {number} fd
               * @param {number} cbInit
               * @param {function(nResponse:number,sResponse:string,fd:number)} done
               */
              HTTPAPI.initUserVolume = function(vol, fd, cbInit, done)
              {
                  vol.fd = fd;
                  var nResponse = 200;
                  var sResponse = null;
                  /*
                   * We need to know if the file was just created, and if so, "truncate" it to the proper size
                   */
                  if (cbInit) {
                      fs.fstat(fd, function(err, stats) {
                          if (!stats.size) {
                              fs.ftruncate(fd, cbInit, function(err) {
                                  if (err) {
                                      HTMLOut.logError(err);
                                      fs.close(fd, function(err) {
                                          vol.fd = null;
                                          nResponse = 400;
                                          sResponse = DiskAPI.FAIL.WRITEVOL;
                                          done(nResponse, sResponse, null);
                                      });
                                      return;
                                  }
                                  done(nResponse, sResponse, fd);
                              });
                              return;
                          }
                          if (stats.size != cbInit) {
                              HTMLOut.logError(new Error(sResponse = "file size (" + stats.size + ") does not match requested size (" + cbInit + ")"));
                              fs.close(fd, function(err) {
                                  vol.fd = null;
                                  nResponse = 400;
                                  sResponse = DiskAPI.FAIL.BADVOL;
                                  done(nResponse, sResponse, null);
                              });
                              return;
                          }
                          done(nResponse, sResponse, fd);
                      });
                  }
              };
              
              /**
               * openUserVolume(sPath, sMachine, sUser, sMode, cbInit, done)
               *
               * User IDs are added to userVolumes as users open volumes;  for now, only one open
               * volume per user is supported.  Every entry in userVolumes is another Volume object.
               *
               * @param {string} sPath
               * @param {string} sMachine
               * @param {string} sUser
               * @param {string} sMode
               * @param {number} cbInit
               * @param {function(nResponse:number,sResponse:string,fd:number)} done
               */
              HTTPAPI.openUserVolume = function(sPath, sMachine, sUser, sMode, cbInit, done)
              {
                  var vol = userVolumes[sUser];
                  if (vol) {
                      /*
                       * TODO: If the path is the same and the machine ID differs, then we need to add the
                       * current machine ID to a "revocation" list, consider that machine's access "revoked",
                       * and return DiskAPI.FAIL.REVOKED; otherwise, there's no real protection of volume
                       * integrity here.  One of the challenges will be ensuring the list of revoked machine
                       * IDs doesn't grow without bound.
                       *
                       * When revoking, we should also be able to reuse the current vol by simply updating its
                       * machine ID; there's no need to close and re-open the file (although assuming revocation
                       * is a rare occurrence, it shouldn't much matter).
                       */
                      if (vol.path != sPath || vol.machine != sMachine) {
                          HTTPAPI.closeUserVolume(vol.path, vol.machine, sUser, function() {
                              HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, done);
                          });
                          return;
                      }
                  }
              
                  if (!vol) {
                      vol = {fd: null, mode: sMode, path: sPath, machine: sMachine};
                      userVolumes[sUser] = vol;
                  }
              
                  var nResponse = 200;
                  var sResponse = null;
              
                  if (!vol.fd) {
              
                      HTMLOut.logDebug('HTMLOut.openUserVolume("' + sPath + '")');
              
                      fs.open(sPath, "r+", function(err, fd) {
                          if (err) {
                              if (sMode == DiskAPI.MODE.DEMANDRW) {
                                  fs.open(sPath, "w+", function(err, fd) {
                                      if (err) {
                                          HTMLOut.logError(err);
                                          nResponse = 400;
                                          sResponse = DiskAPI.FAIL.CREATEVOL;
                                          done(nResponse, sResponse, null);
                                      } else {
                                          HTTPAPI.initUserVolume(vol, fd, cbInit, done);
                                      }
                                  });
                              } else {
                                  HTMLOut.logError(err);
                                  nResponse = 400;
                                  sResponse = DiskAPI.FAIL.OPENVOL;
                                  done(nResponse, sResponse, null);
                              }
                          } else {
                              HTTPAPI.initUserVolume(vol, fd, cbInit, done);
                          }
                      });
                      return;
                  }
                  done(nResponse, sResponse, vol.fd);
              };
              
              /**
               * readUserVolume(sPath, fd, aCHS, aAddr, done)
               *
               * aCHS is filled in as follows:
               *
               *      [0]: total cylinders
               *      [1]: total heads
               *      [2]: total sectors per track
               *      [3]: total bytes per sector (generally 512)
               *
               * aAddr is filled in as follows:
               *
               *      [0]: 0-based cylinder number
               *      [1]: 0-based head number
               *      [2]: 1-based sector number
               *      [3]: sector count
               *
               * @param {string} sPath
               * @param {number} fd
               * @param {Array.<number>} aCHS
               * @param {Array.<number>} aAddr
               * @param {function(nResponse:number,sResponse:string)} done
               */
              HTTPAPI.readUserVolume = function(sPath, fd, aCHS, aAddr, done)
              {
                  var pos = (aAddr[0] * (aCHS[1] * aCHS[2] * aCHS[3])) + (aAddr[1] * (aCHS[2] * aCHS[3])) + ((aAddr[2] - 1) * aCHS[3]);
                  var len = (aAddr[3] * aCHS[3]);
              
                  HTMLOut.logDebug('HTMLOut.readUserVolume("' + sPath + '"): pos: ' + pos + ', len: ' + len);
              
                  var buf = new Buffer(len);
                  fs.read(fd, buf, 0, len, pos, function(err, cbRead, buffer) {
                      var nResponse = 200;
                      var sResponse = null;
                      //
                      // TODO: The callback should be asserting/verifying that cbRead equals the requested length.
                      //
                      if (err) {
                          nResponse = 400;
                          sResponse = err.message;
                      } else {
                          sResponse = JSON.stringify(buffer);
                      }
                      done(nResponse, sResponse);
                      /*
                       * Replace the preceding line with this if you want to test how well the client deals with long I/O delays (eg, 10 seconds)
                       *
                      setTimeout(function() {
                          HTMLOut.logDebug("HTTPAPI.readUserVolume(): responding after 10000ms delay");
                          done(nResponse, sResponse);
                      }, 10000);
                      */
                  });
              };
              
              /**
               * writeUserVolume(sPath, fd, aCHS, aAddr, sData, done)
               *
               * aCHS is filled in as follows:
               *
               *      [0]: total cylinders
               *      [1]: total heads
               *      [2]: total sectors per track
               *      [3]: total bytes per sector (generally 512)
               *
               * aAddr is filled in as follows:
               *
               *      [0]: 0-based cylinder number
               *      [1]: 0-based head number
               *      [2]: 1-based sector number
               *      [3]: sector count
               *
               * @param {string} sPath
               * @param {number} fd
               * @param {Array.<number>} aCHS
               * @param {Array.<number>} aAddr
               * @param {string} sData
               * @param {function(nResponse:number,sResponse:string)} done
               */
              HTTPAPI.writeUserVolume = function(sPath, fd, aCHS, aAddr, sData, done)
              {
                  var pos = (aAddr[0] * (aCHS[1] * aCHS[2] * aCHS[3])) + (aAddr[1] * (aCHS[2] * aCHS[3])) + ((aAddr[2] - 1) * aCHS[3]);
                  var len = (aAddr[3] * aCHS[3]);
              
                  HTMLOut.logDebug('HTMLOut.writeUserVolume("' + sPath + '"): pos: ' + pos + ', len: ' + len);
              
                  var abData;
                  try {
                      abData = JSON.parse(sData);
                  } catch(err) {
                      done(-1, err.message);
                      return;
                  }
              
                  if (abData.length == len) {
                      var buf = new Buffer(abData);
                      /*
                       * I have some concerns about asynchronous writes being performed out of order; however,
                       * even after changing fs.write() to fs.writeSync(), I'm still getting a corrupted 20mb disk
                       * image after running PKXARC B:DOCS.ARC into C:\TMP.  TODO: Investigate.
                       */
                      var nResponse = 200;
                      var sResponse = null;
                      var cbWrite = fs.writeSync(fd, buf, 0, len, pos);
                      if (cbWrite != len) {
                          nResponse = 400;
                          sResponse = "write length (" + cbWrite + ") does not equal buffer length (" + len + ")"
                      }
                      done(nResponse, sResponse);
                      /*
                      fs.write(fd, buf, 0, len, pos, function(err, cbWrite, buffer) {
                          //
                          // TODO: The callback should be asserting/verifying that cbWrite equals the requested length.
                          //
                          var nResponse = 200;
                          var sResponse = null;
                          if (err) {
                              nResponse = 400;
                              sResponse = err.message;
                          }
                          done(nResponse, sResponse);
                      });
                      */
                  } else {
                      done(-1, "buffer length (" + abData.length + ") does not equal requested length (" + len + ")");
                  }
              };
              
              /**
               * closeUserVolume(sPath, sMachine, sUser, done)
               *
               * @param {string} sPath
               * @param {string} sMachine
               * @param {string} sUser
               * @param {function(Error)} done
               */
              HTTPAPI.closeUserVolume = function(sPath, sMachine, sUser, done)
              {
                  /**
                   * @type {Volume}
                   */
                  var vol = userVolumes[sUser];
                  if (vol) {
                      if (vol.path == sPath && vol.machine == sMachine) {
                          userVolumes[sUser] = null;
                          if (vol.fd) {
                              HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '")');
                              fs.close(vol.fd, done);
                              return;
                          }
                          done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): volume not open')));
                          return;
                      }
                      done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): different volume open (' + vol.path + ')')));
                      return;
                  }
                  done(new Error(HTMLOut.logDebug('HTTPAPI.closeUserVolume("' + sPath + '"): no open volumes')));
              };
              
              /**
               * parseDiskValues(s, aDefaults)
               *
               * @param {string} s
               * @param {Array.<number>} a
               * @returns {Array.<number>}
               */
              HTTPAPI.parseDiskValues = function(s, a)
              {
                  if (s) {
                      var as = s.split(':');
                      for (var i = 0; i < as.length && i < a.length; i++) {
                          if (!str.isValidInt(as[i])) break;
                          a[i] = parseInt(as[i]);
                      }
                  }
                  return a;
              };
              
              /**
               * processDiskAPI(req, res)
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if the request was handled as an API request, false if not
               */
              HTTPAPI.processDiskAPI = function(req, res)
              {
                  /*
                   * For every volume, we must maintain the active machine+user that currently has access.
                   */
                  var nResponse = 400;                                // default to "Bad Request"
                  var reqParms = req.method == "GET"? req.query : req.body;
                  var sAction = reqParms[DiskAPI.QUERY.ACTION];
                  var sPath = reqParms[DiskAPI.QUERY.VOLUME];
                  var sMode = reqParms[DiskAPI.QUERY.MODE];           // one of DiskAPI.MODE.* (eg, DiskAPI.MODE.DEMANDRW)
                  var sCHS = reqParms[DiskAPI.QUERY.CHS];
                  var sAddr = reqParms[DiskAPI.QUERY.ADDR];
                  var sData = reqParms[DiskAPI.QUERY.DATA];
                  var sMachine = reqParms[DiskAPI.QUERY.MACHINE];
                  var sUser = reqParms[DiskAPI.QUERY.USER];
              
                  /*
                   * aCHS is filled in as follows:
                   *
                   *      [0]: total cylinders
                   *      [1]: total heads
                   *      [2]: total sectors per track
                   *      [3]: total bytes per sector (generally 512)
                   *
                   * aAddr is filled in as follows:
                   *
                   *      [0]: 0-based cylinder number
                   *      [1]: 0-based head number
                   *      [2]: 1-based sector number
                   *      [3]: sector count
                   */
                  var aCHS = HTTPAPI.parseDiskValues(sCHS, [0, 0, 0, 512]);
                  var aAddr = HTTPAPI.parseDiskValues(sAddr, [0, 0, 0, 0]);
              
                  HTMLOut.logDebug('HTTPAPI.processDiskAPI("' + sPath + '"): action=' + sAction + ', chs=' + sCHS + ', addr=' + sAddr);
              
                  if (sPath && sPath.indexOf('*/') === 0 && sPath.indexOf("..") < 0) {
                      HTTPAPI.verifyUserDir(sUser, function(sDir) {
                          if (sDir) {
                              var cbInit = aCHS[0] * aCHS[1] * aCHS[2] * aCHS[3];
                              sPath = path.join(sDir, sPath.replace('*', ''));
                              switch(sAction) {
                                  case DiskAPI.ACTION.OPEN:
                                      HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
                                          res.status(nResponse).send(sResponse);
                                      });
                                      break;
                                  case DiskAPI.ACTION.READ:
                                      HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
                                          if (fd) {
                                              HTTPAPI.readUserVolume(sPath, fd, aCHS, aAddr, function(nResponse, sResponse) {
                                                  /*
                                                   * Without the addition of "no-store", Chrome will assume that a previous response to
                                                   * a previously seen URL can be re-used without hitting the server again, which would be
                                                   * bad if the requested sector(s) had been written in the meantime.
                                                   *
                                                   * Perhaps I should be using different HTTP verbs, or perhaps I should switch to sockets,
                                                   * but in the meantime, this is absolutely necessary.
                                                   */
                                                  res.set("Cache-Control", "no-cache, no-store");
                                                  res.status(nResponse).send(sResponse);
                                              });
                                          } else {
                                              res.status(nResponse).send(sResponse);
                                          }
                                      });
                                      break;
                                  case DiskAPI.ACTION.WRITE:
                                      HTTPAPI.openUserVolume(sPath, sMachine, sUser, sMode, cbInit, function(nResponse, sResponse, fd) {
                                          if (fd) {
                                              HTTPAPI.writeUserVolume(sPath, fd, aCHS, aAddr, sData, function(nResponse, sResponse) {
                                                  res.status(nResponse).send(sResponse);
                                              });
                                          } else {
                                              res.status(nResponse).send(sResponse);
                                          }
                                      });
                                      break;
                                  case DiskAPI.ACTION.CLOSE:
                                      HTTPAPI.closeUserVolume(sPath, sMachine, sUser, function(err) {
                                          var sResponse = null;
                                          if (err) {
                                              sResponse = err.message;
                                          } else {
                                              nResponse = 200;
                                          }
                                          res.status(nResponse).send(sResponse);
                                      });
                                      break;
                                  default:
                                      res.status(nResponse).send(DiskAPI.FAIL.BADACTION);
                                      break;
                              }
                              return;
                          }
                          res.status(nResponse).send(DiskAPI.FAIL.BADUSER);
                      });
                      return true;
                  }
              
                  res.status(nResponse).send(DiskAPI.FAIL.BADVOL);
                  return true;
              };
              
              /**
               * processDumpAPI(req, res)
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if the request was handled as an API request, false if not
               */
              HTTPAPI.processDumpAPI = function(req, res)
              {
                  var aCommand;
                  var nResponse = 400;                // default to "Bad Request"
                  var sDisk, sFile, sFormat, fComments;
              
                  if ((aCommand = HTTPAPI.hasAPICommand(req, DumpAPI.asDiskCommands))) {
              
                      sDisk = aCommand[1];
                      HTMLOut.logDebug('HTTPAPI.processDumpAPI("' + sDisk + '"): type=' + aCommand[0]);
              
                      /*
                       * Allowing ".." in a path component is risky, unless we're running locally...
                       */
                      if (sDisk.indexOf("..") < 0 || req.app.settings.port == 8088) {
              
                          sFormat = req.query[DumpAPI.QUERY.FORMAT] || DumpAPI.FORMAT.JSON;
                          fComments = (req.query[DumpAPI.QUERY.COMMENTS]? true : false);
                          var mbHD = req.query[DumpAPI.QUERY.MBHD];
              
                          /*
                           * TODO: Consider adding support for DiskDump's "exclusion" option to the API interface
                           * (the command-line interface supports it).
                           */
                          var disk = new DiskDump(sDisk, null, sFormat, fComments, mbHD, sServerRoot);
                          if (aCommand[0] == DumpAPI.QUERY.DISK || aCommand[0] == DumpAPI.QUERY.IMG) {
                              disk.loadFile(function(err) {
                                  HTTPAPI.dumpDisk(err, disk, res);
                              });
                          } else {
                              disk.buildImage(aCommand[0] == DumpAPI.QUERY.DIR, function(err) {
                                  HTTPAPI.dumpDisk(err, disk, res);
                              });
                          }
                          return true;
                      }
                  }
                  else if ((aCommand = HTTPAPI.hasAPICommand(req, DumpAPI.asFileCommands))) {
              
                      sFile = aCommand[1];
                      HTMLOut.logDebug('HTTPAPI.processDumpAPI("' + sFile + '"): type=' + aCommand[0]);
              
                      /*
                       * Allowing ".." in a path component is too risky, unless we're running locally.
                       */
                      if (sFile.indexOf("..") < 0 || req.app.settings.port == 8088) {
              
                          sFormat = req.query[DumpAPI.QUERY.FORMAT] || DumpAPI.FORMAT.JSON;
                          fComments = (req.query[DumpAPI.QUERY.COMMENTS]? true : false);
                          var fDecimal;
                          if (req.query[DumpAPI.QUERY.DECIMAL]) {
                              fDecimal = (req.query[DumpAPI.QUERY.DECIMAL] == "true");
                          }
                          var file = new FileDump(sFormat, fComments, fDecimal, sServerRoot);
                          file.loadFile(sFile, 0, 0, function(err) {
                              HTTPAPI.dumpFile(err, file, res);
                          });
                          return true;
                      }
                  }
                  return false;
              };
              
              /**
               * dumpDisk(err, disk, res)
               *
               * @param {Error} err
               * @param {DiskDump} disk
               * @param {Object} res
               */
              HTTPAPI.dumpDisk = function(err, disk, res)
              {
                  var sResponse = "";
                  var nResponse = 400;                // default to "Bad Request"
                  var sMIMEType = null;
                  var sAttachment = null;
              
                  if (err) {
                      /*
                       * TODO: Do a better job of mapping the underlying error (eg, err.errno) to an appropriate HTTP response error.
                       */
                      nResponse = 404;
                      sResponse = err.message;
                  } else {
                      if (disk.sFormat == DumpAPI.FORMAT.IMG) {
                          // sMIMEType = "application/octet-stream";
                          sMIMEType = "application/x-download";
                          sAttachment = path.basename(disk.sDiskPath);
                          var i = sAttachment.lastIndexOf('.');
                          if (i > 0) sAttachment = sAttachment.substring(0, i+1) + DumpAPI.FORMAT.IMG;
                          sResponse = disk.convertToIMG();
                      } else {
                          // res.charset = "utf-8";
                          sMIMEType = "application/json; charset=utf-8";
                          sResponse = disk.convertToJSON();
                      }
                      /*
                       * Return a successful response ONLY if the disk conversion call returned any data
                       */
                      if (sResponse) {
                          nResponse = 200;
                      } else {
                          sResponse = "unable to convert disk image: " + disk.sDiskPath;
                      }
                  }
                  if (sMIMEType) {
                      res.set("Content-Type", sMIMEType);
                  }
                  if (sAttachment) {
                      res.set("Content-Disposition", 'attachment; filename="' + sAttachment + '"');
                  }
                  res.status(nResponse).send(sResponse);
              };
              
              /**
               * dumpFile(err, file, res)
               *
               * @param {Error} err
               * @param {FileDump} file
               * @param {Object} res
               */
              HTTPAPI.dumpFile = function(err, file, res)
              {
                  var sResponse = "";
                  var nResponse = 400;                // default to "Bad Request"
                  var sMIMEType = null;
                  var sAttachment = null;
              
                  if (err) {
                      /*
                       * TODO: Do a better job of mapping the underlying error (eg, err.errno) to an appropriate HTTP response error.
                       */
                      nResponse = 404;
                      sResponse = err.message;
                  } else {
                      if (file.sFormat == DumpAPI.FORMAT.ROM) {
                          // sMIMEType = "application/octet-stream";
                          sMIMEType = "application/x-download";
                          sAttachment = path.basename(file.sFilePath);
                          var i = sAttachment.lastIndexOf('.');
                          if (i > 0) sAttachment = sAttachment.substring(0, i+1) + DumpAPI.FORMAT.ROM;
                          sResponse = file.getData();
                      } else {
                          file.convertToJSON(function(err, str) {
                              if (!err) {
                                  nResponse = 200;
                              } else {
                                  str = err.message;
                              }
                              res.status(nResponse).send(str);
                          });
                          return;
                      }
                      /*
                       * Return a successful response ONLY if the file conversion call returned any data
                       */
                      if (sResponse) {
                          nResponse = 200;
                      } else {
                          sResponse = "unable to convert file image: " + file.sFilePath;
                      }
                  }
                  if (sMIMEType) {
                      res.set("Content-Type", sMIMEType);
                  }
                  if (sAttachment) {
                      res.set("Content-Disposition", 'attachment; filename="' + sAttachment + '"');
                  }
                  res.status(nResponse).send(sResponse);
              };
              
              /**
               * processReportAPI(req, res)
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if the request was handled as an API request, false if not
               */
              HTTPAPI.processReportAPI = function(req, res)
              {
                  var sApp = req.body[ReportAPI.QUERY.APP];
                  var sVer = req.body[ReportAPI.QUERY.VER];
                  var sURL = req.body[ReportAPI.QUERY.URL];
                  var sUser = req.body[ReportAPI.QUERY.USER];
                  var sType = req.body[ReportAPI.QUERY.TYPE];
                  var sData = req.body[ReportAPI.QUERY.DATA];
              
                  HTMLOut.logDebug('HTTPAPI.processReportAPI("' + sApp + '"): ver=' + sVer + ', url=' + sURL + ', type=' + sType);
              
                  if (sApp && sVer && sType == ReportAPI.TYPE.BUG && sData) {
                      /*
                       * Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
                       * non-zero, convert to base 36, and chop off the leading digit and "decimal" point.
                       */
                      var sRemoteIP = req? req.ip : "";
                      var sDataFile = "/logs/" + sType + "s/" + usr.formatDate("Ymd") + '-' + (Math.random() + 0.1).toString(36).substr(2,8) + ".json";
                      var sReport = "<p>" + sApp + ' v' + sVer + ' ' + usr.formatDate("Y-m-d H:i:s") + ' ' + sRemoteIP + ' <a href="' + sURL + '?state=' + sDataFile + (sUser? '&user=' + sUser : '') + '">' + sDataFile + "</a></p>\n";
                      sDataFile = path.join(sServerRoot, sDataFile);
                      fs.writeFile(sDataFile, sData);
                      var sTypeFile = path.join(sServerRoot, "/logs/" + sType + "s.html");
                      fs.appendFile(sTypeFile, sReport);
                      res.status(200).send(ReportAPI.RES.OK);
                      return true;
                  }
                  return false;
              };
              
              /**
               * processUserAPI(req, res)
               *
               * @param {Object} req is an Express request object (http://expressjs.com/api.html#req.params)
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if the request was handled as an API request, false if not
               */
              HTTPAPI.processUserAPI = function(req, res)
              {
                  var reqParms = req.method == "GET"? req.query : req.body;
                  var sReq = reqParms[UserAPI.QUERY.REQ];
                  var sUser = reqParms[UserAPI.QUERY.USER];
                  var sState = reqParms[UserAPI.QUERY.STATE];
                  var sData = reqParms[UserAPI.QUERY.DATA];
              
                  HTMLOut.logDebug('HTTPAPI.processUserAPI("' + sUser + '"): req=' + sReq + (sState? (', state=' + sState) : ''));
              
                  if (sUser) {
                      switch(sReq) {
                          case UserAPI.REQ.CREATE:
                              if (HTTPAPI.createUserID(sUser, res)) return true;
                              break;
                          case UserAPI.REQ.VERIFY:
                              if (HTTPAPI.verifyUserID(sUser, res)) return true;
                              break;
                          case UserAPI.REQ.STORE:
                              if (HTTPAPI.storeUserData(sUser, sState, sData, res)) return true;
                              break;
                          case UserAPI.REQ.LOAD:
                              if (HTTPAPI.loadUserData(sUser, sState, res)) return true;
                              break;
                          default:
                              break;
                      }
                  }
                  return false;
              };
              
              /**
               * createUserID(sUser, res)
               *
               * sUser must consist of the authorizing key, a colon, and the key to be authorized.
               *
               * @param {string} sUser
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if request was valid (does not imply success), false if invalid
               */
              HTTPAPI.createUserID = function(sUser, res)
              {
                  HTMLOut.logDebug('HTTPAPI.createUserID("' + sUser + '")');
              
                  var asUsers = sUser.split(':');
                  if (asUsers[0] && asUsers[1]) {
                      HTTPAPI.verifyUserID(asUsers[0], res, function doneVerifyAuthorizedID(iVerified, result, res) {
              
                          HTMLOut.logDebug('HTTPAPI.doneVerifyAuthorizedID("' + asUsers[0] + '"): ' + iVerified);
              
                          /*
                           * The authorizing key has been verified, but it may authorize another key only
                           * if it is the first key in the list (or there are no keys at all yet and the authorizing
                           * key matches GORT_COMMAND).
                           */
                          if (iVerified == 1 || iVerified <= 0 && asUsers[0] == net.GORT_COMMAND) {
                              HTTPAPI.verifyUserID(asUsers[1], res, function doneVerifyUserID(iVerified, resultSecond, res) {
              
                                  HTMLOut.logDebug('HTTPAPI.doneVerifyUserID("' + asUsers[1] + '"): ' + iVerified);
              
                                  if (iVerified <= 0) {
                                      var sUserFile = path.join(sServerRoot, "/logs/users.log");
                                      fs.appendFile(sUserFile, asUsers[1] + "\n");
                                      result[UserAPI.RES.CODE] = UserAPI.CODE.OK;
                                      result[UserAPI.RES.DATA] = asUsers[1];
                                  } else {
                                      result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
                                      result[UserAPI.RES.DATA] = UserAPI.FAIL.DUPLICATE;
                                  }
                                  if (res) res.status(200).send(JSON.stringify(result) + "\n");
                              });
                              return;
                          }
                          result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
                          result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
                          if (res) res.status(200).send(JSON.stringify(result) + "\n");
                      });
                      return true;
                  }
                  return false;
              };
              
              /**
               * verifyUserID(sUser, res, done)
               *
               * If a done() handler is specified, the first parameter it receives is iVerified, which
               * will be -1 if the "users.log" file hasn't been initialized yet, 0 if the key doesn't exist,
               * or a positive number representing the line number at which the key appears.
               *
               * Moreover, when a done() handler is provided, it simply passes the response object (res) to
               * done(), which must actually send the response, based on the provided result; this function sends
               * a response only if done() is NOT provided.
               *
               * @param {string} sUser
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @param {function(number, Object, Object)} [done]
               * @return {boolean} true if request was valid (does not imply success), false if invalid
               */
              HTTPAPI.verifyUserID = function(sUser, res, done)
              {
                  HTMLOut.logDebug('HTTPAPI.verifyUserID("' + sUser + '")');
              
                  /*
                   * If a colon separator is present, this is an implicit REQ.CREATE call
                   * (in fact, at present, PCjs does not issue any explicit REQ.CREATE calls).
                   */
                  if (sUser.indexOf(':') > 0 && HTTPAPI.createUserID(sUser, res)) {
                      return true;
                  }
                  var iVerified = -1;
                  var sUserFile = path.join(sServerRoot, "/logs/users.log");
                  fs.readFile(sUserFile, {encoding: "utf8"}, function doneReadUserIDs(err, sData) {
              
                      var sResCode = UserAPI.CODE.FAIL;
                      var sResData = UserAPI.FAIL.VERIFY;
                      if (err) {
                          HTMLOut.logError(err);
                      } else {
                          var asUsers = sData.split("\n");
                          iVerified = asUsers.indexOf(sUser);
                          if (iVerified >= 0) {
                              if (HTTPAPI.createUserDir(sUser)) {
                                  sResCode = UserAPI.CODE.OK;
                                  sResData = sUser;
                              }
                          }
                          iVerified++;
                      }
                      var result = {};
                      result[UserAPI.RES.CODE] = sResCode;
                      result[UserAPI.RES.DATA] = sResData;
                      if (done) {
                          done(iVerified, result, res);
                          return;
                      }
                      if (res) res.status(200).send(JSON.stringify(result) + "\n");
                  });
                  return true;
              };
              
              /**
               * getUserDir(sUser)
               *
               * @param {string} sUser
               * @return {string}
               */
              HTTPAPI.getUserDir = function(sUser)
              {
                  return path.join(sServerRoot, "/logs/users/" + /* sUser.substr(0, 2) + "/" + */ sUser);
              };
              
              /**
               * createUserDir(sUser)
               *
               * TODO: Creation is relatively rare, so I'm lazy and use synchronous calls, but fix this someday.
               *
               * @param {string} sUser
               * @return {boolean} true if successful, false if not
               */
              HTTPAPI.createUserDir = function(sUser)
              {
                  var sDir = HTTPAPI.getUserDir(sUser);
                  return (fs.existsSync(sDir) || !!mkdirp.sync(sDir));
              };
              
              /**
               * verifyUserDir(sUser, done)
               *
               * @param {string} sUser
               * @param {function(string|null)} done
               */
              HTTPAPI.verifyUserDir = function(sUser, done)
              {
                  HTMLOut.logDebug('HTTPAPI.verifyUserDir("' + sUser + '")');
              
                  if (sUser) {
                      var sDir = HTTPAPI.getUserDir(sUser);
                      fs.exists(sDir, function(fExists) {
                          if (!fExists) {
                              HTTPAPI.verifyUserID(sUser, null, function(iVerified, result, res) {
                                  done(iVerified > 0? sDir : null);
                              });
                              return;
                          }
                          done(sDir);
                      });
                      return;
                  }
                  done(null);
              };
              
              /**
               * loadUserData(sUser, sState, res)
               *
               * @param {string} sUser
               * @param {string} sState is a state ID
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if request was valid (does not imply success), false if invalid
               */
              HTTPAPI.loadUserData = function(sUser, sState, res)
              {
                  HTMLOut.logDebug('HTTPAPI.loadUserData("' + sUser + '","' + sState + '")');
              
                  if (sState) {
                      HTTPAPI.verifyUserDir(sUser, function(sDir) {
                          var result = {};
                          result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
                          result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
                          if (sDir) {
                              if (sState.indexOf("..") >= 0) {
                                  result[UserAPI.RES.DATA] = UserAPI.FAIL.BADSTATE;
                              }
                              else {
                                  var sFile = path.join(sDir, sState);
                                  fs.readFile(sFile, {encoding: "utf8"}, function doneReadUserData(err, sData) {
                                      if (err) {
                                          HTMLOut.logError(err);
                                          /*
                                           * We'll assume that any error here means the file doesn't exist (ie, NOSTATE instead
                                           * of BADLOAD).
                                           */
                                          result[UserAPI.RES.DATA] = UserAPI.FAIL.NOSTATE;
                                      } else {
                                          /*
                                           * Suppress the normal RES_CODE+RES_DATA output format and simply return the "raw" state;
                                           * this makes life simpler for the client app.
                                           */
                                          result = sData;
                                          /*
                                           * Without the addition of "no-store", Chrome (and perhaps other browsers) will assume that
                                           * a previous response to a previously seen URL can be re-used without hitting the server
                                           * again, which would be bad if the requested state has been modified in the meantime.
                                           *
                                           * Here's the scenario: the user loads a web page with a machine that uses server-side state,
                                           * the user changes the state of that machine and switches away from the machine (eg, clicks
                                           * a link to a different page), which causes the state to be updated on the server; then they
                                           * click the Back button, and the browser, seeing the same server-side state request, simply
                                           * uses the state data it originally retrieved, instead of requesting the updated state from the
                                           * server.
                                           */
                                          res.set("Cache-Control", "no-cache, no-store");
                                      }
                                      res.status(200).send(typeof result == "string"? result : JSON.stringify(result) + "\n");
                                  });
                                  return;
                              }
                          }
                          res.status(200).send(JSON.stringify(result) + "\n");
                      });
                      return true;
                  }
                  return false;
              };
              
              /**
               * storeUserData(sUser, sState, sData, res)
               *
               * @param {string} sUser
               * @param {string} sState is a state ID
               * @param {string} sData
               * @param {Object} res is an Express response object (http://expressjs.com/api.html#res.status)
               * @return {boolean} true if request was valid (does not imply success), false if invalid
               */
              HTTPAPI.storeUserData = function(sUser, sState, sData, res)
              {
                  HTMLOut.logDebug('HTTPAPI.storeUserData("' + sUser + '","' + sState + '")');
              
                  if (sState && sData) {
                      HTTPAPI.verifyUserDir(sUser, function(sDir) {
                          var result = {};
                          result[UserAPI.RES.CODE] = UserAPI.CODE.FAIL;
                          result[UserAPI.RES.DATA] = UserAPI.FAIL.VERIFY;
                          if (sDir) {
                              if (sState.indexOf("..") >= 0) {
                                  result[UserAPI.RES.DATA] = UserAPI.FAIL.BADSTATE;
                              }
                              else {
                                  var sFile = path.join(sDir, sState);
                                  fs.writeFile(sFile, sData);
                                  result[UserAPI.RES.CODE] = UserAPI.CODE.OK;
                                  result[UserAPI.RES.DATA] = sData.length + " bytes stored";
                              }
                          }
                          res.status(200).send(JSON.stringify(result) + "\n");
                      });
                      return true;
                  }
                  return false;
              };
              
              module.exports = HTTPAPI;
              
          • README.md
            HTMLOut
            ===
            This module provides a filter() function for [server.js](../../../server.js),
            our Express-based web server.  The function is installed like so:
            
            	app.use(HTMLOut.filter);
            	
            The filter function examines the URL, and if it corresponds to a directory on the server,
            the function will generate an "index.html" in that directory, based on the contents of a
            default template file (currently [common.html](../shared/templates/common.html)).
            
          • package.json
            {
              "name": "htmlout",
              "version": "0.1.0",
              "description": "Filters HTTP requests and creates default documents from HTML templates",
              "main": "./lib/htmlout",
              "scripts": {
                "test": "echo \"error: no test specified\" && exit 1"
              },
              "author": "Jeff Parsons <Jeff@pcjs.org>",
              "licenses": [
                {
                  "type": "GPLv3",
                  "url": "http://www.gnu.org/licenses/gpl.html"
                }
              ],
              "bin": {
                "example": "./bin/htmlout"
              }
            }
            
        • markout
          • bin
            • markout
              #!/usr/bin/env node
              /**
               * @fileoverview Implements the MarkOut command-line interface
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              var path = require("path");
              var fs = require("fs");
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              require(lib + "markout.js").CLI();
              
          • lib
            • markout.js
              /**
               * @fileoverview Parses simplified Markdown files
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-02-14
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               * For complete Markdown syntax, see: http://daringfireball.net/projects/markdown/syntax
               *
               * TODO: Consider adding support for GFM-style tables, as described [here](https://help.github.com/articles/github-flavored-markdown#tables);
               * this would be nice for a Markdown-based ASCII table, for example.
               *
               * TODO: Consider adding support for GFM-style strike-through, as described [here](https://help.github.com/articles/github-flavored-markdown#strikethrough)
               *
               * TODO: Consider adding support for anything in the Markdown spec that we don't currently support (but only features that I might actually want to use).
               */
              
              "use strict";
              
              var path    = require("path");
              var net     = require("../../shared/lib/netlib");
              var proc    = require("../../shared/lib/proclib");
              var str     = require("../../shared/lib/strlib");
              
              /**
               * @class exports
               * @property {string} name
               * @property {string} version
               */
              var pkg     = require("../../../package.json");
              
              /**
               * fConsole controls diagnostic messages; it is false by default and can be overridden using the
               * setOptions() 'console' property.
               *
               * @type {boolean}
               */
              var fConsole = false;
              
              /**
               * sDefaultDir is the default directory to use with the command-line interface; it can be overridden using --dir.
               *
               * @type {string}
               */
              var sDefaultDir = "/Users/Jeff/Sites/pcjs";
              
              /**
               * sDefaultFile is the default file to use with the command-line interface; it can be overridden using --file.
               *
               * @type {string}
               */
              var sDefaultFile = "./README.md";
              
              /**
               * MarkOut()
               *
               * The req parameter is provided ONLY so that we can check for special URL parameters which, for
               * example, require us to transform standard machine configurations into DEBUG configurations.
               *
               * If aParms is provided, it should contain the following elements:
               *
               *      aParms[0]: the version to use for any machines (default is "*" for the latest version)
               *      aParms[1]: the class prefix to use for any image galleries (eg, "common-image")
               *
               * @constructor
               * @param {string} sMD containing markdown
               * @param {string|null} [sIndent] sets the overall indentation of the document
               * @param {Object} [req] is the web server's (ie, Express) request object, if any
               * @param {Array.<string>|null} [aParms] is an array of overrides to use (see below)
               * @param {boolean} [fDebug] turns on debugging features (eg, debug comments, special URL encodings, etc)
               */
              function MarkOut(sMD, sIndent, req, aParms, fDebug)
              {
                  this.sMD = sMD;
                  this.sIndent = (sIndent || "");
                  this.req = req;
                  this.sMachineVersion = ((aParms && aParms[0]) || "*");
                  if ((this.sClassImage = ((aParms && aParms[1]) || ""))) {
                      this.sClassImageGallery = this.sClassImage + "-gallery";
                      this.sClassImageFrame = this.sClassImage + "-frame";
                      this.sClassImageLink = this.sClassImage + "-link";
                      this.sClassImageLabel = this.sClassImage + "-label";
                  }
                  this.fDebug = fDebug;
                  this.sHTML = null;
                  this.aIDs = [];         // this keeps tracks of auto-generated ID attributes for page elements, to insure uniqueness
                  this.aMachines = [];    // this keeps tracks of embedded machines on the page
              }
              
              /*
               * Class constants/globals
               */
              
              /*
               * Class methods
               */
              
              /**
               * CLI()
               *
               * Provides a command-line interface for the markout module
               *
               * Usage:
               *
               *      markout [--dir=(directory)] [--file=(filename)] [--console=(true|false)]
               *
               * Options:
               *
               *      --dir specifies a directory to use in conjunction with --file; sDefaultDir used if none specified.
               *
               *      --file specifies an optional filename (relative to the directory given by --dir) of a markdown file;
               *      sDefaultFile is used if none specified.
               *
               *      --console turns diagnostic console messages on or off; they are OFF by default.
               *
               * Examples:
               *
               *      node modules/markout/bin/markout --file=/modules/grunts/prepjs/README.md --debug
               */
              MarkOut.CLI = function()
              {
                  var fs = require("fs");
                  var path = require("path");
              
                  var fDebug = false;
                  var args = proc.getArgs();
              
                  if (args.argc) {
                      var argv = args.argv;
              
                      /*
                       * Create a dummy Express req.query object
                       */
                      var req = {'query': {}};
                      if (argv['debug'] !== undefined) fDebug = argv['debug'];
              
                      MarkOut.setOptions({'console': argv['console']});
              
                      if (fDebug) console.log("args:" + JSON.stringify(argv));
              
                      var sDir = argv['dir'] !== undefined? argv['dir'] : sDefaultDir;
                      var sFile = argv['file'] !== undefined? argv['file'] : sDefaultFile;
              
                      sFile = path.join(sDir, sFile);
                      if (fConsole) console.log("readFile(" + sFile + ")");
              
                      fs.readFile(sFile, {encoding: "utf8"}, function(err, str) {
                          if (err) {
                              MarkOut.logError(err, true);
                          } else {
                              var m = new MarkOut(str, null, req, null, fDebug);
                              console.log(m.convertMD("    "));
                          }
                      });
                  } else {
                      console.log("usage: markout [--dir=(directory)] [--file=(filename)] [--console=(true|false)]");
                  }
              };
              
              /**
               * logError(err) conditionally logs an error to the console
               *
               * @param {Error} err
               * @param {boolean} [fForce]
               * @return {string} the error message that was logged (or that would have been logged had logging been enabled)
               */
              MarkOut.logError = function(err, fForce)
              {
                  var sError = "";
                  if (err) {
                      sError = "markout error: " + err.message;
                      if (fConsole || fForce) console.log(sError);
                  }
                  return sError;
              };
              
              /**
               * setOptions(options) sets module options
               *
               * Supported options are 'console'; note that an option must be explicitly set in order to override
               * the option's default value (see fConsole).
               *
               * @param {Object} options
               */
              MarkOut.setOptions = function(options)
              {
                  if (options['console'] !== undefined) {
                      fConsole = options['console'];
                  }
              };
              
              /*
               * Object methods
               */
              
              /**
               * addMachine(infoMachine)
               *
               * The infoMachine object should contain, at a minimum:
               *
               *      {
               *          'class': sMachineClass,     // eg, "pc"
               *          'func': sMachineFunc,
               *          'id': sMachineID,
               *          'xml': sMachineXMLFile,
               *          'xsl': sMachineXSLFile,
               *          'version': sMachineVersion, // eg, "1.13.0"
               *          'debugger': fDebugger,      // eg, false
               *          'state': sMachineState
               *      }
               *
               * This is an internal function, used by convertMDMachineLinks() to record all the machines defined
               * in the current document.  getMachines() is then called externally (eg, by HTMLOut) to get this list
               * and make sure all the pre-requisites are in place (eg, CSS file and scripts in the HTML document's
               * header).
               *
               * @this {MarkOut}
               * @param {Object} infoMachine
               */
              MarkOut.prototype.addMachine = function(infoMachine)
              {
                  this.aMachines.push(infoMachine);
              };
              
              /**
               * getMachines()
               *
               * @this {MarkOut}
               * @return {Array} of objects containing information about each machine defined by the document
               */
              MarkOut.prototype.getMachines = function()
              {
                  return this.aMachines;
              };
              
              /**
               * generateID(sText)
               *
               * Generate an ID from the given text, by basically converting it to lower case, converting anything
               * that's not a letter or a digit to a hyphen (-), and stripping all leading and trailing hyphens from
               * the result.  Furthermore, if the generated ID is not unique (among the set of ALL generated IDs),
               * then no ID is produced.
               *
               * @this {MarkOut}
               * @param {string} sText
               * @returns {string|null} converts the given text to a unique ID (or null if resulting ID was not unique)
               */
              MarkOut.prototype.generateID = function(sText)
              {
                  var sID = sText.replace(/[^A-Z0-9]+/gi, '-').replace(/^-+|-+$/g, "").toLowerCase();
                  if (this.aIDs.indexOf(sID) < 0) {
                      this.aIDs.push(sID);
                      return sID;
                  }
                  return null;
              };
              
              MarkOut.aHTMLEntities = {
                  "\\\\": "&#92;",
                  "\\`":  "&#96;",
                  "\\*":  "&#42;",
                  "\\_":  "&#95;",
                  "\\{":  "&#123;",
                  "\\}":  "&#125;",
                  "\\[":  "&#91;",
                  "\\]":  "&#93;",
                  "\\(":  "&#40;",
                  "\\)":  "&#41;",
                  "\\#":  "&#35;",
                  "\\+":  "&#43;",
                  "\\-":  "&#45;",
                  "\\.":  "&#46;",
                  "\\!":  "&#33;"
              };
              
              /**
               * convertMD()
               *
               * @this {MarkOut}
               * @param {string} [sIndent] sets the indentation of HTML elements within the document
               */
              MarkOut.prototype.convertMD = function(sIndent)
              {
                  var sMD = this.sMD;
              
                  /*
                   * Convert any escaped asterisks, square brackets, etc, to their HTML-entity equivalents,
                   * as a convenient way of avoiding parsing problems later.  We also take this opportunity
                   * to replace any \r\n sequences with \n.
                   */
                  sMD = str.replaceArray(MarkOut.aHTMLEntities, sMD).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
              
                  /*
                   * Before performing the original comment-elimination step, a new step has been added that
                   * allows blocks of Markdown to be excluded from the Markout process (eg, build instructions
                   * that you'd like to see on GitHub but that don't need to be displayed on the public website).
                   *
                   * Basically, you wrap those kinds of blocks with a pair of special comments, like so:
                   *
                   *      <!-- BEGIN:EXCLUDE --> ... <!-- END:EXCLUDE -->
                   *
                   * While I used upper-case for emphasis, the replacement is case-insensitive and also supports
                   * triple-dash-style comments.
                   */
                  if (!this.fDebug) {
                      sMD = sMD.replace(/[ \t]*<!--+\s*begin:exclude\s*-+->[\s\S]*?<!--+\s*end:exclude\s*-+->[\r\n]*/i, "");
                  }
              
                  /*
                   * I eliminate all HTML-style comments up front, because I sometimes use such comments to
                   * document Markdown-internal issues.  I've seen online references to "triple-dash" (<!--- --->)
                   * comments being used for that purpose, but it doesn't seem to be a standard; however, this
                   * regex should eliminate both forms.
                   *
                   *      $sMD = preg_replace("%<!--.*?-->%s", "", $sMD);
                   *
                   * NOTE: I found the following trick online: use "[\s\S]" to match any character, to work around JavaScript's
                   * lack of support for the "s" (aka "dotall" or "multiline") option that changes "." to match newlines.
                   */
                  sMD = sMD.replace(/<!--[\s\S]*?-->/g, "");
              
                  /*
                   * Convert all lone series of three or more hyphens/underscores/asterisks into horizontal rules.
                   */
                  sMD = sMD.replace(/(^|\n\n+)(-\s*-\s*-+|_\s*_\s*_+|\*\s*\*\s*\*+)\s*(\n\n+|$)+/g, "$1<hr/>$3");
              
                  /*
                   * "Normalize" all series of blank lines into simple "double-linefeed" sequences
                   * that we can use as markers to delineate all the top-level Markdown blocks (ie,
                   * headings, paragraphs, lists, code blocks, etc).
                   */
                  sMD = sMD.trim().replace(/\n([ \t]*\n)+/g, "\n\n");
              
                  /*
                   * HACK: To allow paragraphs to appear within list items, I also find all lines that begin
                   * with an indented list marker and are followed by a series of indented and/or blank lines,
                   * and replace all double-linefeeds in that series with "\n\t\n", so that the entire series
                   * will be treated as a single block.
                   *
                   * convertMDList() will, in turn, look for any "\n\t\n" sequences, convert them back into
                   * "\n\n", and then call convertMDBlocks().
                   *
                   * WARNING: This hack works ONLY for lists whose list markers are indented by at least one space
                   * (and up to three spaces).  This doesn't affect normal parsers, which treat all list markers
                   * indented by 0-3 spaces equally.
                   *
                   * NOTE: I find this to be a very annoying feature of Markdown, because it's not clear to me why:
                   *
                   *      *   A list item.
                   *
                   *          With multiple paragraphs.
                   *
                   *      *   Another item in the list.
                   *
                   * should be interpreted as ONE list whose first item contains multiple paragraphs, rather than
                   * as TWO lists, each with one item, and an indented code block between them.  And in fact, that's
                   * exactly what I'll give you if your list markers aren't indented, per my warning above.
                   *
                   * The official Markdown spec (http://daringfireball.net/projects/markdown/syntax) says that if
                   * you want the second paragraph to appear as a code block, it must be indented TWICE (by 8 spaces
                   * or 2 tabs).  That behavior should fall out of this hack as well.
                   */
                  var aMatch;
                  var re = /(^|\n)(  ? ?)([\*+-]|[0-9]+\.)([^\n]*\n)([ \t]+[^\n]*\n|\n)+([ \t]+[^\n]+)/g;
                  //noinspection UnnecessaryLocalVariableJS
                  var sMDOrig = sMD;
                  while ((aMatch = re.exec(sMDOrig))) {
                      var sReplace = aMatch[0].replace(/\n\n/g, "\n\t\n");
                      sMD = sMD.replace(aMatch[0], sReplace);
                  }
              
                  /*
                   * Ready to convert all blocks now.
                   */
                  sMD = this.convertMDBlocks(sMD, sIndent);
              
                  /*
                   * Post-processing hacks go here.  First off, we would like all <pre>...</pre><pre>...</pre> sequences
                   * to become one single (unified) <pre> sequence.
                   */
                  sMD = sMD.replace(/<\/pre>(\s*)<pre>/g, "\n\n").replace(/<\/code>(\s*)<code>/g, "$1");
              
                  this.sHTML = sMD;
                  return this.sHTML;
              };
              
              /**
               * convertMDBlocks(sMD, sIndent)
               *
               * If your text may contain some block markers (ie, double-linefeeds), or headers (either "Atx-style"
               * or "Setext-style) that require the insertion of double-linefeed block markers, then call this function.
               *
               * @this {MarkOut}
               * @param {string} sMD
               * @param {string} [sIndent]
               */
              MarkOut.prototype.convertMDBlocks = function(sMD, sIndent)
              {
                  var sHTML = "";
              
                  /*
                   * Convert all "Atx-style headers" (ie, series of leading hashmarks) to their <h#> equivalents.
                   *
                   * A slight tweak to standard Markdown: if there are equal numbers of hashmarks on either side of the
                   * text, we center it.
                   */
                  sMD = sMD.replace(/(^|\n)(#+)\s+(.*?)\2(\n|$)/g, '$1<h$2 style="text-align:center">$3</h$2>\n\n');
                  sMD = sMD.replace(/(^|\n)(#+)\s+(.*?)#*(\n|$)/g, "$1<h$2>$3</h$2>\n\n");
              
                  sMD = str.replaceArray({"<h######":"<h6", "<h#####":"<h5", "<h####":"<h4", "<h###":"<h3", "<h##":"<h2", "<h#":"<h1"}, sMD);
                  sMD = str.replaceArray({"h######>":"h6>", "h#####>":"h5>", "h####>":"h4>", "h###>":"h3>", "h##>":"h2>", "h#>":"h1>"}, sMD);
              
                  /*
                   * Convert all "Setext-style headers" (ie, series of equal-signs or dashes) to their <h#> equivalents.
                   */
                  sMD = sMD.replace(/([^\n]+)\n([=-])[=-]*(\n|$)/g, "<h$2>$1</h$2>\n\n");
                  sMD = str.replaceArray({"h=>":"h1>", "h->":"h2>"}, sMD);
              
                  /*
                   * Auto-generate IDs for headings
                   */
                  var match;
                  var re = /<(h[0-9])>([^<]*)<\/\1>/g;
                  while ((match = re.exec(sMD))) {
                      var sID = this.generateID(match[2]);
                      if (sID) {
                          sMD = sMD.replace(match[0], '<' + match[1] + ' id="' + sID + '">' + match[2] + '</' + match[1] + '>');
                          /*
                           * Since the replacement is guaranteed to be longer than the original, no need to worry about re.lastIndex
                           */
                      }
                  }
              
                  /*
                   * The preceding replacements used to end with a match on "(\n|$)+", but in cases where there were consecutive
                   * headings, the first match would "eat" all the linefeeds between them, and so the second heading would not get
                   * matched. However, a side-effect of not "eating" all those linefeeds is that we can end up with too many of them
                   * after all the heading replacements are done.
                   *
                   * So, even though we already "normalized" all consecutive linefeeds in convertMD(), we have to do it again
                   * (although this normalization is simpler, as we don't have to worry about any other whitespace).
                   */
                  sMD = sMD.replace(/\n\n+/g, "\n\n");
              
                  /*
                   * Explode the given Markdown sequence into blocks based purely on double-linefeed sequences.
                   */
                  var asBlocks = sMD.split("\n\n");
                  for (var iBlock = 0; iBlock < asBlocks.length; iBlock++) {
                      sHTML += this.convertMDBlock(asBlocks[iBlock], sIndent);
                  }
                  return sHTML;
              };
              
              /**
               * convertMDBlock(sBlock, sIndent)
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @param {string} [sIndent]
               */
              MarkOut.prototype.convertMDBlock = function(sBlock, sIndent)
              {
                  var sHTML = "";
              
                  // this.addIndent(sIndent);
              
                  // if (this.fDebug) sHTML += this.encodeComment("convertMDBlock", sBlock);
              
                  /*
                   * Look for "quoted" paragraphs that should be wrapped with <blockquote>.
                   *
                   * This is a recursive operation, so this code does not need to "fall into" the other conversions.
                   */
                  if (sBlock.match(/^>\s+/)) {
                      sBlock = sBlock.replace(/(^|\n)>\s+/g, "$1");
                      sHTML += this.sIndent + "<blockquote>\n" + this.convertMDBlocks(sBlock, sIndent) + this.sIndent + "</blockquote>\n";
                      return sHTML;
                  }
              
                  /*
                   * Look for indented paragraphs that should be converted to <pre><code> blocks.
                   *
                   * No other conversions should occur in such a block, so we don't "fall into" the other conversions.
                   */
                  var aMatch;
                  var re = /^((^|\n)(    |\t)([^\n]*))+$/;
                  if ((aMatch = re.exec(sBlock))) {
                      var sUndented = aMatch[0].replace(/(^|\n)(    |\t)([^\n]*)/g, "$1$3");
                      sBlock = sBlock.replace(aMatch[0], "<pre><code>" + str.escapeHTML(sUndented.replace(/\t/g, "    ")) + "</code></pre>");
                      sHTML += this.sIndent + sBlock + "\n";
                      return sHTML;
                  }
              
                  /*
                   * Look for GFM ("GitHub Flavored Markdown") "fenced code blocks", which are basically code blocks
                   * wrapped by "triple-backticks" instead of being indented.
                   *
                   * No other conversions should occur in such a block, so we don't "fall into" the other conversions.
                   *
                   * TODO: GFM doesn't require fenced code blocks to be preceded/followed by blank lines, so if we want
                   * to support those as well, it will be up to convertMD() to detect them and parse them into discrete blocks.
                   */
                  re = /^```([^\n]*)\n([\s\S]*?)```$/;
                  if ((aMatch = re.exec(sBlock))) {
                      sBlock = sBlock.replace(aMatch[0], "<pre><code>" + str.escapeHTML(aMatch[2]) + "</code></pre>");
                      sHTML += this.sIndent + sBlock + "\n";
                      return sHTML;
                  }
              
                  /*
                   * Convert any "double-backtick" sequences into <code> sequences, with inner backticks
                   * treated as literal; we translate those to HTML entity "&#96;" to prevent them from being
                   * detected as part of a "single-backtick" sequence below.
                   *
                   * Note that we also do the entity replacement AFTER calling htmlspecialchars(), because
                   * our implementation of htmlspecialchars() isn't smart enough to avoid the "double-encoding"
                   * problem (ie, translating the leading "&" of an entity into yet another "&amp;" entity).
                   */
                  var sBlockOrig = sBlock;
                  re = /``(.*?)``/g;
                  while ((aMatch = re.exec(sBlockOrig))) {
                      sBlock = sBlock.replace(aMatch[0], "<code>" + str.escapeHTML(aMatch[1]).replace(/`/g, "&#96;") + "</code>");
                  }
              
                  /*
                   * Convert any remaining "single-backtick" sequences into <code> sequences as well.
                   */
                  sBlockOrig = sBlock;
                  re = /`(.*?)`/g;
                  while ((aMatch = re.exec(sBlockOrig))) {
                      sBlock = sBlock.replace(aMatch[0], "<code>" + str.escapeHTML(aMatch[1]) + "</code>");
                  }
              
                  /*
                   * Per markdown syntax: "When you do want to insert a <br /> break tag using Markdown,
                   * you end a line with two or more spaces, then type return."
                   */
                  sBlock = sBlock.replace(/  +\n/g, "<br/>\n" + this.sIndent);
              
                  /*
                   * If the block looks like a list, convertMDList() will convert it; if not, then it will wrap the
                   * block with paragraph tags -- assuming the block isn't already wrapped with some sort of block markup.
                   */
                  sBlock = this.convertMDList(sBlock, sIndent);
              
                  /*
                   * Process any "image" Markdown links first (since they can be misinterpreted as "normal" links);
                   * this ordering also allows image links to be wrapped by "normal" Markdown links, if you want to
                   * turn images into links, as in:
                   *
                   *      [![Alt text](http://www.google.com.au/images/nav_logo7.png)](http://google.com.au/)
                   *
                   * However, we also offer a "link:" extension to the title attribute; as in:
                   *
                   *      ![Alt text](http://www.google.com.au/images/nav_logo7.png "link:http://google.com.au/")
                   *
                   * which has the same effect but ALSO wraps the image in a special "image link" class and displays the
                   * "Alt text" as a label underneath the image; and if the block consists entirely of such images, then all
                   * the images are wrapped in an "image gallery" class.
                   */
                  sBlock = this.convertMDImageLinks(sBlock, sIndent);
              
                  /*
                   * Process any special "machine" Markdown-style links next.
                   */
                  sBlock = this.convertMDMachineLinks(sBlock);
              
                  /*
                   * Now we can finally process "normal" Markdown links.
                   */
                  sBlock = this.convertMDLinks(sBlock);
              
                  /*
                   * Finally, look for all assorted forms of Markdown emphasis (there's no particular reason we do it last, we just do).
                   */
                  sBlock = this.convertMDEmphasis(sBlock);
              
                  sHTML += this.sIndent + sBlock + "\n";
              
                  // this.subIndent(sIndent);
              
                  return sHTML;
              };
              
              /**
               * convertMDList(sBlock, sIndent)
               *
               * If the block begins with an unordered list marker, create an unordered list;
               * similarly, if the block begins with an ordered list marker, create an ordered list.
               *
               * Otherwise, wrap the block with paragraph tags in the absence of any other block markup.
               *
               * HACK: To allow paragraphs to appear within list items, convertMD() found all lines that
               * began with an indented list marker and were followed by a series of indented and/or  blank
               * lines, and replaced all double-linefeeds in that series with "\n\t\n".  Hence, this
               * function must compensate by replacing "\n\t\n" sequences in any sub-lists with the normal
               * "\n\n" and calling convertMDBlocks().
               *
               * FEATURE: If you use "*" as your unordered list marker (instead of "+" or "-", all of which
               * Markdown apparently treats equivalently), I automatically use a list style that omits bullets.
               * So, if you REALLY want bullets, use "-" or "+".
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @param {string} sIndent
               * @return {string}
               */
              MarkOut.prototype.convertMDList = function(sBlock, sIndent)
              {
                  var sIndentPrev = this.addIndent(sIndent);
              
                  var aMatch;
                  var aMatches = [];
                  var re = /(^|\n) ? ? ?([\*+-]|[0-9]+\.)[ \t]+/g;
                  while ((aMatch = re.exec(sBlock))) {
                      aMatches.push(aMatch);
                  }
                  if (aMatches.length && aMatches[0].index === 0) {
                      aMatch = aMatches[0];
                      var sListType = aMatch[2].charAt(0);
                      var sListStyle = "md-list" + (sListType == '*'? " md-list-none" : (sListType == '-'? " md-list-compact" : ""));
                      sListType = (sListType >= '0' && sListType <= '9')? "ol" : "ul";
                      var sList = '<' + sListType + ' class="' + sListStyle + '">\n';
              
                      for (var iMatch = 0; iMatch < aMatches.length; iMatch++) {
                          aMatch = aMatches[iMatch];
                          var iStart = aMatch.index + aMatch[0].length;
                          var iStop = iMatch < aMatches.length-1? aMatches[iMatch+1].index : sBlock.length;
                          var sListItem = sBlock.substr(iStart, iStop - iStart);
                          /*
                           * If this list item contains one or more lines indented by 4 or more spaces (or 1 or more tabs)
                           * then we need to strip them, so that they can be parsed as a sub-list.
                           */
                          re = /((^|\n)(    |\t)([^\n]*))+/;
                          if ((aMatch = re.exec(sListItem))) {
                              // if (this.fDebug) sList += this.encodeComment("subList", aMatch[0]);
                              var sSubList = aMatch[0].replace(/(^|\n)(    |\t)([^\n]*)/g, "$1$3").replace(/\n\t\n/g, "\n\n");
                              if (sSubList.charAt(0) == "\n") sSubList = sSubList.substr(1);
                              sListItem = str.replaceAll(aMatch[0], "\n" + this.sIndent + this.convertMDBlocks(sSubList, sIndent).trim() + "\n" + this.sIndent, sListItem);
                          } else {
                              sListItem = this.convertMDLines(sListItem);
                          }
                          sList += this.sIndent + "<li>" + sListItem + "</li>\n";
                      }
                      sList += sIndentPrev + "</" + sListType + ">";
                      sBlock = sList;
                  }
                  else {
                      /*
                       * In the absence of any other block markup, wrap the block in paragraph tags.
                       *
                       * TODO: The test here is currently for *any* HTML markup; this should probably be tightened up.
                       */
                      if (sBlock.charAt(0) != "<") sBlock = "<p>" + this.convertMDLines(sBlock) + "</p>";
                  }
                  this.subIndent(sIndent);
                  return sBlock;
              };
              
              /**
               * convertMDLines(s)
               *
               * This function is purely cosmetic.  The intent is to indent all the lines in multi-line items
               * (eg, paragraphs, list items), so that the resulting HTML is a bit more readable.  Unfortunately,
               * it has some unintended side-effects (for example, it creates unnecessary indentation inside image
               * galleries, which are nothing more than paragraphs containing a series of image links), so this
               * code is disabled for now.
               *
               * @this {MarkOut}
               * @param {string} s
               * @return {string}
               */
              MarkOut.prototype.convertMDLines = function(s)
              {
                  return s;
                  // return s.replace(/\n/g, "\n" + this.sIndent).trim();
              };
              
              /**
               * convertMDLinks(sBlock)
               *
               * Aside from basic "inline" Markdown links, we also support named anchors; if the link begins with '#',
               * we strip the '#' and use the remainder of the link as the name of the anchor.  To reference a named
               * anchor from another link, you have to specify a path with '#' and the anchor name appended, in order
               * to distinguish an anchor name from an anchor reference.
               *
               * Note that the need for named anchors is somewhat diminished now that I automatically generate IDs for
               * all heading tags (eg, <h1>); refer to the generateID() function that's used in convertMDBlocks().
               *
               * Another extension to Markdown that I've added is detecting empty parentheses alongside a likely URL,
               * and automatically converting it to a link; eg:
               *
               *      [http://www.ascii-code.com/]()
               *
               * Also, if a URL contains any asterisks, we replace them with the current version number from "package.json".
               *
               * I prefer this solution over GFM's "autolinking" solution, which is too "loosey-goosey" for my taste
               * (see https://help.github.com/articles/github-flavored-markdown#url-autolinking).
               *
               * TODO: Consider adding support for "reference"-style Markdown links.
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @return {string}
               */
              MarkOut.prototype.convertMDLinks = function(sBlock)
              {
                  var aMatch;
                  var re = /\[([^\[\]]*)]\((.*?)(?:\s*"(.*?)"\)|\))/g;
                  while ((aMatch = re.exec(sBlock))) {
                      var sTag = "a";
                      var sType = "href";
                      var sText = aMatch[1];
                      var sURL = aMatch[2];
                      var sTitle = (aMatch[3]? ' title="' + aMatch[3] + '"' : '');
                      if (!sURL) {            // if the parentheses are empty and the text (kinda) looks like a URL, use the text as the URL, too
                          if (sText.match(/^[a-z]+:/) || sText.match(/^\/(.*)\/$/)) {
                              sURL = sText;
                          } else if (sText.match(/(^www\.|\.com|\.org|\.net|\.io)/)) {
                              sURL = "http://" + sText;
                          } else if (sText.indexOf(' ') < 0 && sText.indexOf('.') > 0) {
                              sURL = sText;   // we assume you're trying to automatically link to a filename
                          }
                      }
                      sURL = sURL.replace(/\*/g, pkg.version);
                      if (sURL.charAt(0) == '#') {
                          sTag = "span";      // using <a> to name an anchor is deprecated
                          sType = "id";       // using the "name" attribute is deprecated as well
                          sURL = sURL.substr(1);
                      } else {
                          sURL = net.encodeURL(sURL, this.req, this.fDebug);
                      }
                      sBlock = str.replaceAll(aMatch[0], '<' + sTag +  ' ' + sType + '="' + sURL + '"' + sTitle + '>' + sText + '</' + sTag + '>', sBlock);
                  }
                  return sBlock;
              };
              
              /**
               * convertMDImageLinks(sBlock)
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @param {string} sIndent
               * @return {string}
               */
              MarkOut.prototype.convertMDImageLinks = function(sBlock, sIndent)
              {
                  /*
                   * Look for image links of the form ![...](...) and convert them.  We do this before processing non-image
                   * ("normal") links, since the only difference in syntax is the presence of a preceding exclamation point (!).
                   *
                   * We also extend the syntax a bit, by allowing the optional title string inside the parentheses to include
                   * a special "link:" prefix; if that prefix is present, we will wrap the image with the URL following that prefix,
                   * and then wrap THAT with the special image classes, if any, that we were given at initialization.
                   */
                  var aMatch;
                  var cImageLinks = 0;
                  var fNoGallery = false;
                  var sBlockOrig = sBlock;
                  var re = /!\[(.*?)]\((.*?)(?:\s*"(.*?)"\)|\))/g;
                  while ((aMatch = re.exec(sBlockOrig))) {
                      var sImage = '<img src="' + net.encodeURL(aMatch[2], this.req, this.fDebug) + '" alt="' + aMatch[1] + '"';
                      if (aMatch[3]) {
                          /*
                           * The format of the special "link:" syntax is:
                           *
                           *      link:url[:width[:height]]
                           *
                           * If "link:" is specified, a URL is required, but image width and height are optional.
                           *
                           * Alternatively:
                           *
                           *      link:url:nogallery[:width[:height]]
                           *
                           * to disable the automatic "gallery-ification" of image links (an optional width and height
                           * can still follow).
                           */
                          var iPart = 0;
                          var asParts = aMatch[3].split(':');
                          if (asParts[iPart++] == "link") {
                              var sURL = asParts[iPart++];
                              if ((sURL == "http" || sURL == "https" || sURL == "ftp") && asParts[iPart]) {
                                  sURL += ':' + asParts[iPart];
                                  asParts.splice(2, 1);
                              }
                              /*
                               * If the image link (aMatch[2]) contains "static/" but the sURL is external, AND we're in
                               * "reveal mode", then transform sURL into a "static/" URL as well; encodeURL() will take care
                               * of the rest of the transformation.
                               *
                               * This feature is used with READMEs like /pubs/pc/programming/README.md, where normally we
                               * want to link to documents stored on sites like archive.org, minuszerodegrees.net or bitsavers,
                               * unless you're in "reveal mode", in which case we'll serve up our own "backup copies".
                               *
                               * The assumption here is that if we have "static" thumbs, then we should also have full "static"
                               * copies as well.
                               */
                              if (aMatch[2].indexOf("static/") >= 0 && sURL.indexOf("://") > 0 && (this.fDebug || net.hasParm(net.REVEAL_COMMAND, net.REVEAL_PDFS, this.req))) {
                                  sURL = aMatch[2].replace("/thumbs/", "/").replace(" 1.jpeg", ".pdf").replace(".jpg", ".pdf");
                              }
                              sURL = net.encodeURL(sURL, this.req, this.fDebug);
                              if (asParts[iPart] == "nogallery") {
                                  fNoGallery = true;
                                  iPart++;
                              }
                              this.addIndent(sIndent);
                              var sID = this.generateID(aMatch[1]);
                              sID = (sID? (' id="' + sID + '"') : "");
                              var sImageLink = this.sIndent + '<div' + sID + ' class="' + this.sClassImageFrame + '">\n';
                              this.addIndent(sIndent);
                              sImageLink += this.sIndent + '<div class="' + this.sClassImageLink + '">\n';
                              this.addIndent(sIndent);
                              sImageLink += this.sIndent + (sURL? '<a href="' + sURL + '">' : '') + sImage;
                              if (asParts[iPart]) {
                                  sImageLink += ' width="' + asParts[iPart++] + '"';
                              }
                              if (asParts[iPart]) {
                                  sImageLink += ' height="' + asParts[iPart++] + '"';
                              }
                              sImageLink += "/>" + (sURL? "</a>" : "");
                              this.subIndent(sIndent);
                              sImageLink += this.sIndent + '</div>\n';
                              sImageLink += this.sIndent + '<span class="' + this.sClassImageLabel + '">' + aMatch[1] + '</span>\n';
                              this.subIndent(sIndent);
                              sImageLink += this.sIndent + '</div>';
                              this.subIndent(sIndent);
                              sImage = sImageLink;
                              cImageLinks++;
                          } else {
                              sImage += ' title="' + aMatch[3] + '"/>';
                          }
                      } else {
                          sImage += '/>';
                      }
                      sBlock = sBlock.replace(aMatch[0], sImage);
                  }
                  if (cImageLinks && !fNoGallery) {
                      sBlock = sBlock.replace(/^<p>([\s\S]*)<\/p>$/g, '<div class="' + this.sClassImageGallery + '">\n$1\n' + this.sIndent + '</div>');
                  }
                  return sBlock;
              };
              
              /**
               * convertMDMachineLinks(sBlock)
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @return {string}
               */
              MarkOut.prototype.convertMDMachineLinks = function(sBlock)
              {
                  /*
                   * Before we call convertMDLinks() to process any normal Markdown-style links, we first
                   * look for our own special flavor of "machine" Markdown links; ie:
                   *
                   *      [IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:demoPC:stylesheet:version:options:state")
                   *
                   * where a special title attribute triggers generation of an embedded machine rather than
                   * a link.  Use "PCjs" or "C1Pjs" to automatically include the latest version of either
                   * "pc.js" or "c1p.js", followed by a colon and the ID you want to use for the embedded <div>.
                   * If you need to use the script with the built-in Debugger (ie, either "pc-dbg.js" or
                   * "c1p-dbg.js"), then include "debugger" in the list of comma-delimited options, as in:
                   *
                   *      [IBM PC](/devices/pc/machine/5150/mda/64kb/ "PCjs:demoPC:::debugger")
                   *
                   * If the link ends with a slash, then it's an implied reference to a "machine.xml".
                   *
                   * Granted, there are a number of things we could be smarter about.  First, you probably
                   * don't care about the ID for the <div>; it's purely a mechanism for telling the script
                   * where to embed the machine, so we could auto-generate an ID for you, but on the other hand,
                   * there might actually be situations where you want to style the machine a certain way, or
                   * interact with it from another script, so having a known ID can be a good thing.
                   *
                   * Second, if we know we're running on the same server as the machine XML file in the link,
                   * we could crack that file open right now, see if it includes a <debugger>, and automatically
                   * include the appropriate script, without requiring the user to specify that.  And in fact,
                   * that's exactly what the "machine.xsl" stylesheet does: it calls componentScripts() with the
                   * appropriate script based on the presence of a <debugger> element in the XML file.  That's
                   * similar to what getMachineXML() in htmlout.js does, when it's loading a "machine.xml".
                   *
                   * We don't have the XML file open here, and I don't think it's worth the hit to open it.
                   * Besides, the XML config file isn't necessarily on the same server (although whenever this
                   * script is being used, it very likely is).
                   *
                   * TODO: Consider cracking open the XML file anyway, even though the Markdown module is supposed
                   * to be non-blocking; I'd like to be smarter about defaults (eg, specifying "debugger" when the
                   * XML file clearly needs it).
                   */
                  var aMatch;
                  var cMatches = 0;
                  var reMachines = /\[(.*?)]\((.*?)\s*"(PC|C1P)js:(.*?)"\)/gi;
              
                  while ((aMatch = reMachines.exec(sBlock))) {
              
                      var sMachineXMLFile = aMatch[2];
                      if (sMachineXMLFile.slice(-1) == "/") sMachineXMLFile += "machine.xml";
              
                      var sMachine = aMatch[3].toUpperCase();
                      var sMachineFunc = "embed" + sMachine;
                      var sMachineClass = sMachine.toLowerCase();
                      var aMachineParms = aMatch[4].split(':');
                      var sMachineMessage = "Waiting for " + sMachine + "js to load";
              
                      var sMachineID = aMachineParms[0];
                      var sMachineXSLFile = aMachineParms[1] || "";
                      var sMachineVersion = aMachineParms[2] || this.sMachineVersion;
                      var sMachineOptions = aMachineParms[3] || "";
                      var sMachineState = aMachineParms[4] || "";
                      var aMachineOptions = sMachineOptions.split(',');
                      var fDebugger = (aMachineOptions.indexOf("debugger") >= 0);
              
                      /*
                       * TODO: Consider validating the existence of this XML file and generating a more meaningful error if not found
                       */
                      var sReplacement = '<div id="' + sMachineID + '" class="machine-placeholder"><p>' + aMatch[1] + '</p><p class="machine-warning">' + sMachineMessage + '</p></div>\n';
              
                      /*
                       * The embedPC()/embedC1P functions take an XSL file as the 3rd parameter, which defaults to:
                       *
                       *      "/versions/" + APPCLASS + "/" + APPVERSION + "/components.xsl"
                       *
                       * However, when debugging, I'd prefer to use the "development" version of components.xsl, rather than the default
                       * "production" version.
                       */
                      if (!sMachineXSLFile || sMachineXSLFile.indexOf("components.xsl") >= 0) {
                          if (this.fDebug) {
                              sMachineXSLFile = "/modules/" + sMachineClass + "js/templates/components.xsl";
                          }
                      }
              
                      /*
                       * Now that we're providing all of the following machine information to addMachine(), we don't
                       * need to install the machine embed code here; processMachines() in HTMLOut will take care of that now.
                       *
                      sReplacement += this.sIndent + '<script type="text/javascript">\n' + this.sIndent + 'window.' + sMachineFunc + '("' + sMachineID + '","' + sMachineXMLFile + '","' + sMachineXSLFile + '");\n' + this.sIndent + '</script>';
                       */
              
                      sBlock = sBlock.replace(aMatch[0], sReplacement);
                      reMachines.lastIndex = 0;       // reset lastIndex, since we just modified the string that reMachines is iterating over
                      cMatches++;
              
                      this.addMachine({
                          'class': sMachineClass,     // eg, a machine class, such as "pc" or "c1p"
                          'func': sMachineFunc,
                          'id': sMachineID,
                          'xml': sMachineXMLFile,
                          'xsl': sMachineXSLFile,
                          'version': sMachineVersion, // eg, "1.10", "*" to select the current version, or "uncompiled"; "*" is the default
                          'debugger': fDebugger,      // eg, true or false; false is the default
                          'state': sMachineState}
                      );
                  }
              
                  if (cMatches) {
                      sBlock = sBlock.replace(/^<p>([\s\S]*)<\/p>$/g, "$1");
                  }
              
                  return sBlock;
              };
              
              /**
               * convertMDEmphasis(sBlock)
               *
               * We look for sequences like **strength**, __strength__, *emphasis* and _emphasis_;
               * we convert the stronger (double-character) forms first, followed by the weaker
               * (single-character) forms, since we don't want to misconstrue the former as containing
               * the latter.
               *
               * Also, standard Markdown says that "if you surround an * or _ with spaces, it’ll be
               * treated as a literal asterisk or underscore."  Well, we don't.  You can already escape
               * special characters with a backslash to make them literal, so I don't feel like
               * complicating the RegExps below to accommodate a syntax I don't use or want to support.
               *
               * Also, for reasons noted in the code below, we don't support emphasis in the middle
               * of words.
               *
               * @this {MarkOut}
               * @param {string} sBlock
               * @return {string}
               */
              MarkOut.prototype.convertMDEmphasis = function(sBlock)
              {
                  /*
                   * Standard Markdown allows * or _ in the middle of a word, as in:
                   *
                   *      un*frigging*believable
                   *
                   * but we do not.  That's because a Markdown link like:
                   *
                   *      [modules](/modules/)
                   *
                   * would otherwise be misconstrued as containing emphasis (and it doesn't
                   * matter whether we process emphasis BEFORE or AFTER links -- an HTML link
                   * poses the same problem as a Markdown link).
                   *
                   * To resolve this, I require something non-alphanumeric to both precede AND
                   * follow the emphasis characters.  I would expect that "something" to normally
                   * be whitespace, but we make it a bit more flexible, so that you can do things
                   * like place emphasis INSIDE links:
                   *
                   *      [*modules*](/modules/)
                   *
                   * or OUTSIDE links:
                   *
                   *      *[modules](/modules/)*
                   */
                  if (sBlock.indexOf('*') >= 0 || sBlock.indexOf('_') >= 0) {
                      sBlock = sBlock.replace(/(^|[^a-z0-9])([\*_])\2([\s\S]*?)\2\2([^a-z0-9]|$)/gi, "$1<strong>$3</strong>$4");
                      sBlock = sBlock.replace(/(^|[^a-z0-9])([\*_])([\s\S]*?)\2([^a-z0-9]|$)/gi, "$1<em>$3</em>$4");
                  }
                  return sBlock;
              };
              
              /**
               * addIndent(sIndent)
               *
               * @this {MarkOut}
               * @param {string|undefined} sIndent
               * @return {string} previous indent
               */
              MarkOut.prototype.addIndent = function(sIndent)
              {
                  var sIndentPrev = this.sIndent;
                  this.sIndent += (sIndent || "");
                  return sIndentPrev;
              };
              
              /**
               * subIndent(sIndent)
               *
               * @this {MarkOut}
               * @param {string|undefined} sIndent
               */
              MarkOut.prototype.subIndent = function(sIndent)
              {
                  if (sIndent) {
                      var cch = this.sIndent.length - sIndent.length;
                      if (cch < 0) {
                          MarkOut.logError(new Error("indentation underflow"), true);
                          cch = 0;
                      }
                      this.sIndent = this.sIndent.substr(0, cch);
                  }
              };
              
              /**
               * encodeComment(sLabel, sText)
               *
               * This is used purely (at the moment) for debugging purposes, so that we can clearly see
               * what our simplistic Markdown parser is parsing at each stage.
               *
               * @this {MarkOut}
               * @param {string} sLabel
               * @param {string} sText
               * @return {string}
               *
              MarkOut.prototype.encodeComment = function(sLabel, sText)
              {
                  return '<!-- ' + sLabel + '("' + this.encodeWhitespace(sText) + '") -->\n';
              };
               */
              
              /**
               * encodeWhitespace(sText)
               *
               * This is used purely (at the moment) for debugging purposes, so that we can clearly see
               * what our simplistic Markdown parser is parsing at each stage.
               *
               * @this {MarkOut}
               * @param {string} sText
               * @return {string}
               *
              MarkOut.prototype.encodeWhitespace = function(sText)
              {
                  return str.replaceArray({" ":".", "\t":"\\t", "\n":"\\n"}, sText);
              };
               */
              
              module.exports = MarkOut;
              
          • README.md
            MarkOut
            ===
            This modules transforms a subset of Markdown into HTML.  It's used by the
            [HTMLOut](../htmlout) module to process README.md files and incorporate their
            contents into the "index.html" files that we generate when browsing directories.
            
          • package.json
            {
              "name": "markout",
              "version": "0.1.0",
              "description": "Transforms simplified Markdown to HTML",
              "main": "./lib/markout",
              "scripts": {
                "test": "echo \"error: no test specified\" && exit 1"
              },
              "author": "Jeff Parsons <Jeff@pcjs.org>",
              "licenses": [
                {
                  "type": "GPLv3",
                  "url": "http://www.gnu.org/licenses/gpl.html"
                }
              ],
              "bin": {
                "example": "./bin/markout"
              }
            }
            
        • pcjs
          • bin
            • .jshintrc
              {
                  "globalstrict": true,
                  "sub": true,
                  "globals": {
                      "global": true,
                      "console": true,
                      "module": true,
                      "require": true
                  }
              }
              
            • fptest.js
              /**
               * @fileoverview This file tests raw floating point access using typed arrays.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Aug-20
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              try {
                  /*
                   * If Node is running us, this will succeed, and we'll have a print()
                   * function (an alias for console.log).  If JSC is running us instead,
                   * then this will fail (there is neither a global NOR a console object),
                   * but that's OK, because print() is a built-in function.
                   *
                   * TODO: Find a cleaner way of doing this, and while you're at it, alias
                   * Node's process.argv to JSC's "arguments" array, and Node's process.exit()
                   * to JSC's quit().
                   *
                   * UPDATE: Node *must* be used to run this test, because JSC's support for
                   * typed arrays is incomplete.
                   */
                  var print = console.log;
              } catch(err) {}
              
              function toHex(v, len) {
                  var s = "00000000" + v.toString(16);
                  return "0x" + s.slice(s.length - (!len? 8 : (len < 8? len : 8))).toUpperCase();
              }
              
              var f = 3.4;
              
              var af = new Float64Array(1);
              af.set([f]);                        // the optional offset defaults to zero
              var dv = new DataView(af.buffer);
              var dw1 = dv.getUint32(0);
              var dw2 = dv.getUint32(4);
              
              print(f + " = " + toHex(dw1) + "," + toHex(dw2));
              
            • ibm5150.json
              {
                "computer": {
                  "id": "ibm5150.pc-mda-64k",
                  "name": "IBM PC",
                  "resume": "1",
                  "state": ""
                },
                "ram": [
                  { "id": "ibm5150.ramLow",
                    "name": "",
                    "addr": 0x00000,
                    "size": 0,
                    "test": true
                  }
                ],
                "rom": [
                  { "id": "ibm5150.romBASIC",
                    "name": "",
                    "addr": 0xf6000,
                    "size": 0x08000,
                    "file": "/devices/pc/basic/ibm-basic-1.00.json",
                    "notify": ""
                  },
                  { "id": "ibm5150.romBIOS",
                    "name": "",
                    "addr": 0xfe000,
                    "size": 0x02000,
                    "file": "/devices/pc/bios/5150/1981-04-24.json",
                    "notify": ""
                  }
                ],
                "video": [
                  { "id": "ibm5150.videoMDA",
                    "name": "Monochrome Display",
                    "model": "",
                    "mode": 7,
                    "screenWidth": 720,
                    "screenHeight": 350,
                    "scale": true,
                    "charCols": 80,
                    "charRows": 25,
                    "fontROM": "/devices/pc/video/ibm/mda/ibm-mda.json",
                    "screenColor": "black",
                    "touchScreen": false
                  }
                ],
                "cpu": {
                  "id": "ibm5150.cpu8088",
                  "name": "",
                  "model": 8088,
                  "clock": 0,
                  "multiplier": 1,
                  "autoStart": true,
                  "csStart": -1,
                  "csInterval": -1,
                  "csStop": -1
                },
                "keyboard": {
                  "id": "ibm5150.keyboard",
                  "name": "",
                  "model": ""
                },
                "fdc": {
                  "id": "ibm5150.fdcNEC",
                  "name": "",
                  "autoMount": {
                    "A": {
                      "name": "PC-DOS 2.00 (Disk 1)",
                      "path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"
                    },
                    "B": {
                      "name": "PC-DOS 2.00 (Disk 2)",
                      "path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"
                    }
                  }
                },
                "chipset": {
                  "id": "ibm5150.chipset",
                  "name": "",
                  "model": "5150",
                  "sw1": "01000001",
                  "sw2": "11110000",
                  "sound": true
                },
                "debugger": {
                  "id": "ibm5150.debugger",
                  "name": "",
                  "messages": ""
                },
                "xml": "/devices/pc/machine/5150/mda/64kb/machine.xml"
              }
              
            • pcjs
              #!/usr/bin/env node
              /**
               * @fileoverview Implements the PCjs command-line interface
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var path = require("path");
              var fs = require("fs");
              var repl = require("repl");
              var str = require("../../shared/lib/strlib");
              var proc = require("../../shared/lib/proclib");
              
              var fConsole = false;
              var fDebug = false;
              var args = proc.getArgs();
              var argv = args.argv;
              var sCmdPrev = "";
              if (argv['console'] !== undefined) fConsole = argv['console'];
              if (argv['debug'] !== undefined) fDebug = argv['debug'];
              
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              try {
                  var pkg = require(lib + "../../../package.json");
              } catch(err) {
                  console.log(err.message);
              }
              
              /*
               * We will build an array of components whose names will match the component names
               * used in a JSON machine definition file; eg:
               * 
               *  [
               *      {name: "panel",
               *       Create: Panel,
               *       objects: []
               *      },
               *      {name: "chipset":
               *       Create: ChipSet,
               *       objects: []
               *      },
               *      ...
               *  ]
               *  
               * Every component name comes from the component filename, minus the ".js" extension;
               * Create is the constructor returned by require().  The only bit of fudging we do is
               * overriding the constructor for component "cpu" with the constructor for "x86cpu",
               * because when a "cpu" definition is encountered, it's the "x86cpu" subclass that we
               * actually want to create, not the "cpu" superclass.
               * 
               * TODO: Update the list of ignored (ie, ignorable) components.
               */
              var Component;
              var dbg;
              var aComponents = [];
              var asComponentsIgnore = ["embed"];
              
              /**
               * loadComponents(asFiles)
               * 
               * @param {Array.<string>} asFiles
               */
              function loadComponents(asFiles)
              {
                  for (var i = 0; i < asFiles.length; i++) {
                      var sFile = asFiles[i];
                      if (str.getExtension(sFile) != "js") continue;
                      var sName = str.getBaseName(sFile, true);
                      if (asComponentsIgnore.indexOf(sName) >= 0) continue;
                      if (fDebug) console.log(sFile);
                      try {
                          /*
                           * We COULD load ("require") all the files on-demand, because it's only the
                           * browser initialization sequence we want to mimic in loadMachine(), but this
                           * is simpler, and it also gives us direct references to certain components
                           * we'll want to access later (eg, "component" in getComponentByType()).
                           */
                          var fn = require(lib + "../../../" + sFile);
                          if (sName == "x86cpu") {
                              for (var j = 0; j < aComponents.length; j++) {
                                  if (aComponents[j].name == "cpu") {
                                      aComponents[j].Create = fn;
                                      sName = null;
                                      break;
                                  }
                              }
                          }
                          if (sName == "component") {
                              fn.log = fn.println = function(s, type) {
                                  console.log((type !== undefined? (type + ": ") : "") + (s || ""));
                              };      // jshint ignore:line
                          }
                          if (sName) {
                              aComponents.push({name: sName, Create: fn, objects: []});
                          }
                          if (sName == "defines") {
                              /*
                               * Enabling component console messages requires setting CONSOLE to true.
                               */ 
                              if (global.DEBUG !== undefined) {
                                  global.DEBUG = fDebug;
                                  global.CONSOLE = fConsole;
                              }
                          }
                      } catch(err) {
                          console.log(err.message);
                      }
                  }
              }
              
              /**
               * getComponentByName(sName)
               * 
               * @param sName
               * @return {*}
               */
              function getComponentByName(sName)
              {
                  for (var i = 0; i < aComponents.length; i++) {
                      if (aComponents[i].name == sName) {
                          return aComponents[i].Create;
                      }
                  }
                  return null;
              }
              
              /**
               * getComponentByType(sType)
               *
               * @param sType
               * @return {*}
               */
              function getComponentByType(sType)
              {
                  var component = null;
                  
                  if (!Component) {
                      Component = getComponentByName("component");
                  }
                  if (Component) {
                      component = Component.getComponentByType(sType);
                  }
                  return component;
              }
              
              /**
               * loadMachine(sFile)
               * 
               * @param {string} sFile
               * @return {Object} representing the machine whose component objects have been loaded into aComponents
               */
              function loadMachine(sFile)
              {
                  if (fDebug) console.log('loadMachine("' + sFile + '")');
                  
                  /*
                   * Clear any/all saved objects from any previous machine
                   */
                  var i, j;
                  Component = dbg = null;
                  for (i = 0; i < aComponents.length; i++) {
                      aComponents[i].objects = [];
                  }
                  
                  var machine;
                  try {
                      /*
                       * Since our JSON files may contain comments, hex values, and/or other tokens deemed
                       * unacceptable by the JSON Overlords, we can't use require() to load it, as we're able to
                       * do with "package.json".  Also note that require() assumes the same path as that of the
                       * requiring file, whereas fs.readFileSync() assumes the path reported by process.cwd().
                       * 
                       * TODO: I've since removed the comments from my sample "ibm5150.json" file, so we could
                       * try to reinstate this code; however, there are still hex constants, which I find *much*
                       * preferable to the decimal equivalents.  JSON's restrictions continue to infuriate me.
                       *
                       *      var machine = require(lib + "../bin/" +sFile);
                       */
                      var sMachine = fs.readFileSync(sFile, {encoding: "utf8"});
                      sMachine = '(' + sMachine + ')';
                      if (fDebug) console.log(sMachine);
                      machine = eval(sMachine);       // jshint ignore:line
                      if (machine) {
                          /*
                           * Since we have a machine object, we now mimic the initialization sequence that occurs
                           * in the browser, by walking the list of PCjs components we loaded above and looking for
                           * matches.
                           */
                          for (i = 0; i < aComponents.length; i++) {
                              var parms = machine[aComponents[i].name];
                              /*
                               * If parms is undefined, it means there is no component with that name defined in the
                               * machine object (NOT that the component has no parms), and therefore we should skip it.
                               */
                              if (parms === undefined) continue;
                              /*
                               * If parms is an Array, then we must create an object for each parms element;  and yes,
                               * I'm relying on the fact that none of my parm objects use a "length" property, as a quick
                               * and dirty way of differentiating objects from arrays.
                               */
                              var aParms = parms.length !== undefined? parms : [parms];
                              for (j = 0; j < aParms.length; j++) {
                                  
                                  var obj;
                                  if (fDebug) console.log("creating " + aComponents[i].name + "...");
                                  if (fDebug) console.log(aParms[j]);
                                  
                                  if (aComponents[i].name == "cpu") {
                                      aParms[j]['autoStart'] = false;
                                  }
                                  
                                  try {
                                      obj = new aComponents[i].Create(aParms[j]);
                                  } catch(err) {
                                      console.log("error creating " + aComponents[i].name + ": " + err.message);
                                      continue;
                                  }
                                  
                                  console.log(obj['id'] + " object created");
                                  aComponents[i].objects.push(obj);
                                  
                                  if (obj.type == "Debugger") {
                                      dbg = obj;
                                  }
                              }
                          }
                          /*
                           * Return the original machine object only in DEBUG mode
                           */
                          if (!fDebug) machine = true;
                      }
                  } catch(err) {
                      console.log(err.message);
                  }
                  return machine;
              }
              
              /**
               * doCommand(sCmd)
               * 
               * @param {string} sCmd
               * @return {*}
               */
              function doCommand(sCmd)
              {
                  if (!sCmd) {
                      sCmd = sCmdPrev;
                  } else {
                      sCmdPrev = sCmd;
                  }
                  
                  var result = false;
                  var aTokens = sCmd.split(' ');
                  
                  switch(aTokens[0]) {
                  case "cwd":
                      result = process.cwd();
                      break;
                  case "load":
                      result = loadMachine(aTokens[1]);
                      break;
                  case "quit":
                      process.exit();
                      result = true;
                      break;
                  default:
                      if (sCmd) {
                          try {
                              if (dbg && !dbg.doCommand(sCmd, true)) {
                                  sCmd = '(' + sCmd + ')';
                                  result = eval(sCmd);        // jshint ignore:line
                              }
                          } catch(err) {
                              console.log(err.message);
                          }
                      }
                      break;
                  }
                  return result;
              }
              
              /**
               * onCommand(cmd, context, filename, callback)
               * 
               * The Node docs (http://nodejs.org/api/repl.html) say that repl.start's "eval" option is:
               * 
               *      a function that will be used to eval each given line; defaults to an async wrapper for eval()
               *      
               * and it gives this example of such a function:
               * 
               *      function eval(cmd, context, filename, callback) {
               *          callback(null, result);
               *      }
               *      
               * but it defines NEITHER the parameters for the function NOR the parameters for the callback().
               * 
               * It's pretty clear that "result" is expected to return whatever "eval()" would return for the expression
               * in "cmd" (which is always parenthesized in preparation for a call to "eval()"), but it's not clear what
               * the first callback() parameter (represented by null) is supposed to be.  Should we assume it's an Error
               * object, in case we want to report an error?
               * 
               * @param {string} cmd
               * @param {Object} context
               * @param {string} filename
               * @param {function(Object|null, Object)} callback
               */
              var onCommand = function (cmd, context, filename, callback)
              {
                  var result = false;
                  /*
                   * WARNING: After updating from Node v0.10.x to v0.11.x, the incoming expression in "cmd" is no longer
                   * parenthesized, so I had to tweak the RegExp below.  But... WTF.  Do we not care what we break, folks?
                   */
                  var match = cmd.match(/^\(?\s*(.*?)\s*\)?$/);
                  if (match) result = doCommand(match[1]);
                  callback(null, result);
              };
              
              if (pkg) {
                  loadComponents(pkg.pcJSFiles);
              }
              
              /*
               * Before falling into the REPL, process any command-line (--cmd) commands -- which should eventually include batch files.
               */
              if (argv['cmd'] !== undefined) {
                  var cmds = argv['cmd'];
                  var aCmds = (typeof cmds == "string"? [cmds] : cmds);
                  for (var i = 0; i < aCmds.length; i++) {
                      doCommand(aCmds[i]);
                  }
                  sCmdPrev = "";
              }
              
              repl.start({
                  prompt: "PCjs> ",
                  input: process.stdin,
                  output: process.stdout,
                  eval: onCommand 
              });
              
            • romtests.json
              {
                "computer": {
                  "id": "pc386.computer",
                  "name": "Compaq DeskPro 386",
                  "resume": 0,
                  "state": "",
                  "busWidth": 32
                },
                "ram": [
                  { "id": "pc386.ramLow",
                    "name": "",
                    "addr": 0,
                    "size": 655360,
                    "test": false
                  }
                ],
                "rom": [
                  { "id": "pc386.romTests",
                    "name": "",
                    "addr": 983296,
                    "size": 65280,
                    "alias": 4294902016,
                    "file": "/tests/pc/80386/tests.json",
                    "notify": ""
                  }
                ],
                "video": [
                  { "id": "pc386.videoMDA",
                    "name": "Monochrome Display",
                    "model": "",
                    "mode": 7,
                    "screenWidth": 720,
                    "screenHeight": 350,
                    "scale": true,
                    "charCols": 80,
                    "charRows": 25,
                    "fontROM": "/devices/pc/video/ibm/mda/ibm-mda.json",
                    "screenColor": "black",
                    "touchScreen": false
                  }
                ],
                "cpu": {
                  "id": "pc386.cpu",
                  "name": "",
                  "model": 80386,
                  "clock": 0,
                  "multiplier": 1,
                  "autoStart": true,
                  "csStart": -1,
                  "csInterval": -1,
                  "csStop": -1
                },
                "keyboard": {
                  "id": "pc386.keyboard",
                  "name": "",
                  "model": ""
                },
                "fdc": {
                  "id": "pc386.fdcNEC",
                  "name": "",
                  "autoMount": {
                    "A": {
                      "name": "PC-DOS 2.00 (Disk 1)",
                      "path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"
                    },
                    "B": {
                      "name": "PC-DOS 2.00 (Disk 2)",
                      "path": "/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"
                    }
                  }
                },
                "chipset": {
                  "id": "pc386.chipset",
                  "name": "",
                  "model": "deskpro386",
                  "sound": false
                },
                "debugger": {
                  "id": "pc386.debugger",
                  "name": "",
                  "commands": "",
                  "messages": ""
                }
              }
              
            • x86gen.js
              /**
               * @fileoverview This file generates PCjs 8086 mode-byte decoders.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              try {
                  /*
                   * If Node is running us, this will succeed, and we'll have a print()
                   * function (an alias for console.log).  If JSC is running us instead,
                   * then this will fail (there is neither a global NOR a console object),
                   * but that's OK, because print() is a built-in function.
                   *
                   * TODO: Find a cleaner way of doing this, and while you're at it, alias
                   * Node's process.argv to JSC's "arguments" array, and Node's process.exit()
                   * to JSC's quit().
                   */
                  var print = console.log;
              } catch(err) {}
              
              /*
               * I'm going to start by creating 4 sets of "mod,reg,r/m" aka OpMod tables:
               *
               *      Set 0: mod,r/m is dst, size is byte, dispatch table is aOpModMemByte
               *      Set 1: mod,r/m is dst, size is word, dispatch table is aOpModMemWord
               *      Set 2: reg is dst,     size is byte, dispatch table is aOpModRegByte
               *      Set 3: reg is dst,     size is word, dispatch table is aOpModRegWord
               *
               * See p. 3-41 of "The 8086 Book" for more details.
               */
              
              var f16Only = true;
              var aDst = ["Mem", "Reg"];
              var aSize = ["Byte", "Word"];
              var aOpPrefix = ["B", "W"];
              var aAddrPrefix = [f16Only? "" : "16", "32"];
              var aDisp = ["8", "16"];
              
              /*
               * Index aREG like so: aREG[w][reg]
               */
              var aREG = [
                  ["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"],
                  ["AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"]
              ];
              
              var w, sError = "";
              var fGenMods = true;
              var sEAFuncs = "";
              
              var aBase  = ["EAX", "ECX", "EDX", "EBX", "ESP",  "EBP", "ESI", "EDI"];
              var aIndex = ["EAX", "ECX", "EDX", "EBX", "none", "EBP", "ESI", "EDI"];
              
              if (!fGenMods) {
              
                  var sOps = "", cOps = 0;
              
                  for (var op = 0x00; op <= 0xFF; op++) {
              
                      var i, iReg, sOp, sOpCode, sOperator, sDst, sDstReg;
              
                      if (op >= 0x40 && op <= 0x4F) {
                          i = op - 0x40;
                          iReg = i % 8;
                          sOpCode = (op < 0x48? "INC" : "DEC");
                          sOperator = (op < 0x48? "+" : "-");
                          sDst = aREG[1][iReg];
                          sDstReg = "this.reg." + aREG[1][iReg];
                          print("    /**");
                          print("     * @this {X86CPU}");
                          print("     *");
                          print("     * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " " + sDst + ")");
                          print("     */");
                          sOp = "op" + sOpCode + sDst;
                          print("    " + sOp + ": function() {");
                          print("        " + sDstReg + " = (" + sDstReg + " " + sOperator + " 1) & 0xffff;");
                          print("    },");
                          if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
                          sOps += "        this." + sOp;
                          cOps++;
                      }
                      else if (op >= 0x50 && op <= 0x5F) {
                          i = op - 0x50;
                          iReg = i % 8;
                          sOpCode = (op < 0x58? "PUSH" : "POP");
                          sDst = aREG[1][iReg];
                          sDstReg = "this.reg." + aREG[1][iReg];
                          print("    /**");
                          print("     * @this {X86CPU}");
                          print("     *");
                          print("     * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " " + sDst + ")");
                          print("     */");
                          sOp = "op" + sOpCode + sDst;
                          print("    " + sOp + ": function() {");
                          if (op < 0x58) {
                              print("        this.pushWord(" + sDstReg + ");");
                          }
                          else {
                              print("        " + sDstReg + " = this.popWord();");
                          }
                          print("    },");
                          if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
                          sOps += "        this." + sOp;
                          cOps++;
                      }
                      else if (op == 0x90) {
                          if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
                          sOps += "        this.opNOP";
                          cOps++;
                      }
                      else if (op >= 0x91 && op <= 0x97) {
                          i = op - 0x90;
                          iReg = i % 8;
                          sOpCode = "XCHG";
                          sDst = aREG[1][iReg];
                          sDstReg = "this.reg." + aREG[1][iReg];
                          print("    /**");
                          print("     * @this {X86CPU}");
                          print("     *");
                          print("     * op=0x" + toHex(op, 2) + " (" + sOpCode.toLowerCase() + " EAX," + sDst + ")");
                          print("     */");
                          sOp = "op" + sOpCode + sDst;
                          print("    " + sOp + ": function() {");
                          print("        var temp = this.regEAX; this.regEAX = " + sDstReg + "; " + sDstReg + " = temp;");
                          print("    },");
                          if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
                          sOps += "        this." + sOp;
                          cOps++;
                      }
                      else if (op >= 0xB0 && op <= 0xBF) {
                          i = op - 0xB0;
                          w = (i < 8? 0 : 1);
                          i = i % 8;
                          sDst = aREG[w][i].toLowerCase();
                          print("    /**");
                          print("     * @this {X86CPU}");
                          print("     *");
                          print("     * op=0x" + toHex(op, 2) + " (mov " + aREG[w][i] + "," + aSize[w].toLowerCase() + ")");
                          print("     */");
                          sOp = "opMOV" + aREG[w][i] + aDisp[w];
                          print("    " + sOp + ": function() {");
                          var sRegSet = "", sRegSetEnd = null;
                          if (w == 1) {
                              sRegSet = "this.reg" + aREG[1][i] + " = ";
                          }
                          else {
                              if (i < 4) {
                                  sRegSet = "this.reg" + aREG[1][i] + " = (this.reg" + aREG[1][i] + " & ~0xff) | ";
                              }
                              else {
                                  sRegSet = "this.reg" + aREG[1][i - 4] + " = (this.reg" + aREG[1][i - 4] + " & 0xff) | ";
                                  sRegSetEnd = " << 8";
                              }
                          }
                          print("        " + sRegSet + (sRegSetEnd? "(" : "") + "this.getIP" + aSize[w] + "()" + (sRegSetEnd? (sRegSetEnd + ")") : "") + ";");
                          print("    },");
                          if (sOps) sOps += ((cOps % 4)? ", " : ",\n");
                          sOps += "        this." + sOp;
                          cOps++;
                      }
                  }
              }
              else {
              
                  /*
                   * Index aMOD like so: aMOD[mod]
                   */
                  var aMOD = ["mem", "mem+d8", "mem+d16", "reg"];
              
                  /*
                   * Index aRM like so: aRM[a][mod][w][r_m], forcing w to 0 unless mod is 3
                   */
                  var aRM = [
                      [
                          [["BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "d16", "BX"], []],
                          [["BX+SI+d8", "BX+DI+d8", "BP+SI+d8", "BP+DI+d8", "SI+d8", "DI+d8", "BP+d8", "BX+d8"], []],
                          [["BX+SI+d16", "BX+DI+d16", "BP+SI+d16", "BP+DI+d16", "SI+d16", "DI+d16", "BP+d16", "BX+d16"], []],
                          [["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"], ["AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"]]
                      ],[
                          [["EAX", "ECX", "EDX", "EBX", "sib", "d32", "ESI", "EDI"], []],
                          [["EAX+d8", "ECX+d8", "EDX+d8", "EBX+d8", "sib+d8", "EBP+d8", "ESI+d8", "EDI+d8"], []],
                          [["EAX+d32", "ECX+d32", "EDX+d32", "EBX+d32", "sib+d32", "EBP+d32", "ESI+d32", "EDI+d32"], []],
                          [["AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"], ["EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"]]
                      ]
                  ];
              
                  var cOpMods, mrm;
                  var sOpMods, sOpMod, sContainer;
              
                  print('"use strict";\n');
                  if (f16Only) {
                      print("var X86ModB = {};");
                      print("var X86ModW = {};\n");
                  } else {
                      print("var X86ModB16 = {};");
                      print("var X86ModW16 = {};");
                      print("var X86ModB32 = {};");
                      print("var X86ModW32 = {};\n");
                  }
              
                  for (var a = 0; a <= (f16Only? 0 : 1) && !sError; a++) {
              
                      for (w = 0; w <= 1 && !sError; w++) {
              
                          for (var d = 1; d >= 0 && !sError; d--) {
              
                              cOpMods = 0;
                              sOpMods = "";
                              sContainer = "X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpMod" + aDst[d];
              
                              print(sContainer + " = [");
                              for (mrm = 0x00; mrm <= 0xff && !sError; mrm++) {
                                  sOpMod = genMode(a, d, w, mrm);
                                  if (sOpMod) {
                                      if (sOpMods) sOpMods += ((cOpMods % 4)? ", " : ",\n");
                                      sOpMods += "    " + sContainer + "." + sOpMod;
                                      cOpMods++;
                                  }
                              }
                              print("];\n");
                          }
              
                          cOpMods = 0;
                          sOpMods = "";
                          sContainer = "X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpModGrp";
              
                          print(sContainer + " = [");
                          for (mrm = 0x00; mrm <= 0xff && !sError; mrm++) {
                              sOpMod = genMode(a, 0, w, mrm, "Grp");
                              if (sOpMod) {
                                  if (sOpMods) sOpMods += ((cOpMods % 4)? ", " : ",\n");
                                  sOpMods += "    " + sContainer + "." + sOpMod;
                                  cOpMods++;
                              }
                          }
                          print("];\n");
                      }
                  }
              
                  if (!f16Only) {
                      sContainer = "X86ModSIB" + ".aOpModSIB";
                      print(sContainer + " = [");
                      for (var sib = 0x00; sib <= 0xff && !sError; sib++) {
                          genSIB(sib);
                      }
                      print("];\n");
                  }
              
                  if (sEAFuncs) {
                      print("var X86Mods = {\n" + sEAFuncs + "};\n");
                  }
              }
              
              function genSIB(sib) {
                  var scale = (sib >> 6);
                  var index = (sib >> 3) & 0x7;
                  var base = (sib & 0x7);
                  var sFunc = "opModSIB" + toHex(sib, 2);
                  print("    /**");
                  print("     * " + sFunc + "(): scale=" + toBin(scale, 2) + " (" + toHex(1 << scale, 1) + ")  index=" + toBin(index, 3) + " (" + aIndex[index] + ")  base=" + toBin(base, 3) + " (" + (base == 5? "mod? EBP : disp32)" : aBase[base] + ")"));
                  print("     *");
                  print("     * @this {X86CPU}");
                  print("     * @param {number} mod");
                  print("     */");
                  print("    function " + sFunc + "(mod) {");
                  var sMod = "this.reg" + aBase[base];
                  if (aBase[base] == "ESP" || aBase[base] == "EBP") {
                      if (base != 5) {
                          print("        this.segData = this.segStack;");
                      } else {
                          sMod = "((this.segData = this.segStack), " + sMod + ")";
                      }
                  }
                  var sBase = (base == 5? "(mod? " + sMod + " : this.getIPAddr())" : "this.reg" + aBase[base]);
                  if (index != 4) sBase += " + " + (scale? ("(this.reg" + aIndex[index] + " << " + scale + ")") : ("this.reg" + aIndex[index]));
                  print("        return " + sBase + ";");
                  print("    }" + (sib < 255? "," : ""));
              }
              
              function genMode(a, d, w, mrm, sGroup, sRO) {
                  var mod = (mrm >> 6);
                  var reg = (mrm >> 3) & 0x7;
                  var r_m = (mrm & 0x7);
                  var sRegGet = null;
                  var sRegSet = null;
                  var sRegSetBegin = "", sRegSetEnd = "";
                  var sRegBTLo = null, sRegBTHi = null;
                  if (!w) {
                      switch (reg) {
                      case 0:
                          sRegGet = "this.regEAX & 0xff";
                          sRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
                          sRegBTLo = "this.backTrack.btiAL";
                          break;
                      case 1:
                          sRegGet = "this.regECX & 0xff";
                          sRegSet = "this.regECX = (this.regECX & ~0xff) | ";
                          sRegBTLo = "this.backTrack.btiCL";
                          break;
                      case 2:
                          sRegGet = "this.regEDX & 0xff";
                          sRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
                          sRegBTLo = "this.backTrack.btiDL";
                          break;
                      case 3:
                          sRegGet = "this.regEBX & 0xff";
                          sRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
                          sRegBTLo = "this.backTrack.btiBL";
                          break;
                      case 4:
                          sRegGet = f16Only? "this.regEAX >> 8" : "(this.regEAX >> 8) & 0xff";
                          sRegSet = f16Only? "this.regEAX = (this.regEAX & 0xff) | " : "this.regEAX = (this.regEAX & ~0xff00) | ";
                          sRegSetEnd = " << 8";
                          sRegBTLo = "this.backTrack.btiAH";
                          break;
                      case 5:
                          sRegGet = f16Only? "this.regECX >> 8" : "(this.regECX >> 8) & 0xff";
                          sRegSet = f16Only? "this.regECX = (this.regECX & 0xff) | " : "this.regECX = (this.regECX & ~0xff00) | ";
                          sRegSetEnd = " << 8";
                          sRegBTLo = "this.backTrack.btiCH";
                          break;
                      case 6:
                          sRegGet = f16Only? "this.regEDX >> 8" : "(this.regEDX >> 8) & 0xff";
                          sRegSet = f16Only? "this.regEDX = (this.regEDX & 0xff) | " : "this.regEDX = (this.regEDX & ~0xff00) | ";
                          sRegSetEnd = " << 8";
                          sRegBTLo = "this.backTrack.btiDH";
                          break;
                      case 7:
                          sRegGet = f16Only? "this.regEBX >> 8" : "(this.regEBX >> 8) & 0xff";
                          sRegSet = f16Only? "this.regEBX = (this.regEBX & 0xff) | " : "this.regEBX = (this.regEBX & ~0xff00) | ";
                          sRegSetEnd = " << 8";
                          sRegBTLo = "this.backTrack.btiBH";
                          break;
                      default:
                          sError = "unrecognized w=0 reg: " + reg;
                          break;
                      }
                  }
                  else {
                      switch (reg) {
                      case 0:
                          sRegGet = f16Only? "this.regEAX" : "this.regEAX & this.dataMask";
                          sRegSet = f16Only? "" : "this.regEAX = (this.regEAX & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiAL";
                          sRegBTHi = "this.backTrack.btiAH";
                          break;
                      case 1:
                          sRegGet = f16Only? "this.regECX" : "this.regECX & this.dataMask";
                          sRegSet = f16Only? "" : "this.regECX = (this.regECX & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiCL";
                          sRegBTHi = "this.backTrack.btiCH";
                          break;
                      case 2:
                          sRegGet = f16Only? "this.regEDX" : "this.regEDX & this.dataMask";
                          sRegSet = f16Only? "" : "this.regEDX = (this.regEDX & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiDL";
                          sRegBTHi = "this.backTrack.btiDH";
                          break;
                      case 3:
                          sRegGet = f16Only? "this.regEBX" : "this.regEBX & this.dataMask";
                          sRegSet = f16Only? "" : "this.regEBX = (this.regEBX & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiBL";
                          sRegBTHi = "this.backTrack.btiBH";
                          break;
                      case 4:
                          sRegGet = f16Only? "this.regESP" : "this.regESP & this.dataMask";
                          sRegSet = f16Only? "" : "this.regESP = (this.regESP & ~this.dataMask) | ";
                          sRegBTLo = "X86.BACKTRACK.SP_LO";
                          sRegBTHi = "X86.BACKTRACK.SP_HI";
                          break;
                      case 5:
                          sRegGet = f16Only? "this.regEBP" : "this.regEBP & this.dataMask";
                          sRegSet = f16Only? "" : "this.regEBP = (this.regEBP & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiBPLo";
                          sRegBTHi = "this.backTrack.btiBPHi";
                          break;
                      case 6:
                          sRegGet = f16Only? "this.regESI" : "this.regESI & this.dataMask";
                          sRegSet = f16Only? "" : "this.regESI = (this.regESI & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiSILo";
                          sRegBTHi = "this.backTrack.btiSIHi";
                          break;
                      case 7:
                          sRegGet = f16Only? "this.regEDI" : "this.regEDI & this.dataMask";
                          sRegSet = f16Only? "" : "this.regEDI = (this.regEDI & ~this.dataMask) | ";
                          sRegBTLo = "this.backTrack.btiDILo";
                          sRegBTHi = "this.backTrack.btiDIHi";
                          break;
                      default:
                          sError = "unrecognized w=1 reg: " + reg;
                          break;
                      }
                  }
                  /*
                   * The 8086/8088 cycle counts below come from p.3-48 of "The 8086 Book", where it discusses EA
                   * ("effective address") calculations and the number of execution cycles required for each type
                   * of calculation.
                   *
                   *
                   */
                  var fInline = true;
                  var nCycles = null;
                  var sModAddr = null;
                  var sModFunc = null;
                  var sModRegGet = null;
                  var sModRegSet = null;
                  var sModRegSetBegin = "", sModRegSetEnd = "";
                  var sModRegBTLo = null, sModRegBTHi = null;
                  var sModRegSeg = "Data";
              
                  if (!a) {
                      switch (mod) {
                      case 0:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEBX + this.regESI";
                              sModFunc = "BXSI";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndex";        // 8086: 7
                              break;
                          case 1:
                              sModAddr = "this.regEBX + this.regEDI";
                              sModFunc = "BXDI";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexExtra";   // 8086: 8
                              break;
                          case 2:
                              sModAddr = "this.regEBP + this.regESI";
                              sModFunc = "BPSI";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexExtra";   // 8086: 8
                              break;
                          case 3:
                              sModAddr = "this.regEBP + this.regEDI";
                              sModFunc = "BPDI";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndex";        // 8086: 7
                              break;
                          case 4:
                              sModAddr = "this.regESI";
                              sModFunc = "SI";
                              nCycles = "this.cycleCounts.nEACyclesBase";             // 8086: 5
                              break;
                          case 5:
                              sModAddr = "this.regEDI";
                              sModFunc = "DI";
                              nCycles = "this.cycleCounts.nEACyclesBase";             // 8086: 5
                              break;
                          case 6:
                              sModAddr = "this.getIPAddr()";
                              sModFunc = "D16";
                              nCycles = "this.cycleCounts.nEACyclesDisp";             // 8086: 6
                              break;
                          case 7:
                              sModAddr = "this.regEBX";
                              sModFunc = "BX";
                              nCycles = "this.cycleCounts.nEACyclesBase";             // 8086: 5
                              break;
                          default:
                              sError = "unrecognized mod=0 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 1:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEBX + this.regESI + this.getIPDisp()";
                              sModFunc = "BXSID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp";        // 8086: 11
                              break;
                          case 1:
                              sModAddr = "this.regEBX + this.regEDI + this.getIPDisp()";
                              sModFunc = "BXDID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra";   // 8086: 12
                              break;
                          case 2:
                              sModAddr = "this.regEBP + this.regESI + this.getIPDisp()";
                              sModFunc = "BPSID8";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra";   // 8086: 12
                              break;
                          case 3:
                              sModAddr = "this.regEBP + this.regEDI + this.getIPDisp()";
                              sModFunc = "BPDID8";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp";        // 8086: 11
                              break;
                          case 4:
                              sModAddr = "this.regESI + this.getIPDisp()";
                              sModFunc = "SID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 5:
                              sModAddr = "this.regEDI + this.getIPDisp()";
                              sModFunc = "DID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 6:
                              sModAddr = "this.regEBP + this.getIPDisp()";
                              sModFunc = "BPD8";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 7:
                              sModAddr = "this.regEBX + this.getIPDisp()";
                              sModFunc = "BXD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          default:
                              sError = "unrecognized mod=1 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 2:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEBX + this.regESI + this.getIPAddr()";
                              sModFunc = "BXSID16";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp";        // 8086: 11
                              break;
                          case 1:
                              sModAddr = "this.regEBX + this.regEDI + this.getIPAddr()";
                              sModFunc = "BXDID16";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra";   // 8086: 12
                              break;
                          case 2:
                              sModAddr = "this.regEBP + this.regESI + this.getIPAddr()";
                              sModFunc = "BPSID16";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDispExtra";   // 8086: 12
                              break;
                          case 3:
                              sModAddr = "this.regEBP + this.regEDI + this.getIPAddr()";
                              sModFunc = "BPDID16";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseIndexDisp";        // 8086: 11
                              break;
                          case 4:
                              sModAddr = "this.regESI + this.getIPAddr()";
                              sModFunc = "SID16";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 5:
                              sModAddr = "this.regEDI + this.getIPAddr()";
                              sModFunc = "DID16";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 6:
                              sModAddr = "this.regEBP + this.getIPAddr()";
                              sModFunc = "BPD16";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          case 7:
                              sModAddr = "this.regEBX + this.getIPAddr()";
                              sModFunc = "BXD16";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";             // 8086: 9
                              break;
                          default:
                              sError = "unrecognized mod=2 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 3:
                          if (!w) {
                              switch (r_m) {
                              case 0:
                                  sModRegGet = "this.regEAX & 0xff";
                                  sModRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiAL";
                                  break;
                              case 1:
                                  sModRegGet = "this.regECX & 0xff";
                                  sModRegSet = "this.regECX = (this.regECX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiCL";
                                  break;
                              case 2:
                                  sModRegGet = "this.regEDX & 0xff";
                                  sModRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiDL";
                                  break;
                              case 3:
                                  sModRegGet = "this.regEBX & 0xff";
                                  sModRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiBL";
                                  break;
                              case 4:
                                  sModRegGet = f16Only? "(this.regEAX >> 8)" : "(this.regEAX >> 8) & 0xff";
                                  sModRegSet = f16Only? "this.regEAX = (this.regEAX & 0xff) | " : "this.regEAX = (this.regEAX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiAH";
                                  break;
                              case 5:
                                  sModRegGet = f16Only? "(this.regECX >> 8)" : "(this.regECX >> 8) & 0xff";
                                  sModRegSet = f16Only? "this.regECX = (this.regECX & 0xff) | " : "this.regECX = (this.regECX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiCH";
                                  break;
                              case 6:
                                  sModRegGet = f16Only? "(this.regEDX >> 8)" : "(this.regEDX >> 8) & 0xff";
                                  sModRegSet = f16Only? "this.regEDX = (this.regEDX & 0xff) | " : "this.regEDX = (this.regEDX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiDH";
                                  break;
                              case 7:
                                  sModRegGet = f16Only? "(this.regEBX >> 8)" : "(this.regEBX >> 8) & 0xff";
                                  sModRegSet = f16Only? "this.regEBX = (this.regEBX & 0xff) | " : "this.regEBX = (this.regEBX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiBH";
                                  break;
                              default:
                                  sError = "unrecognized w=0 mod=3 r/m: " + r_m;
                                  break;
                              }
                          }
                          else {
                              switch (r_m) {
                              case 0:
                                  sModRegGet = f16Only? "this.regEAX" : "this.regEAX & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regEAX = (this.regEAX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiAL";
                                  sModRegBTHi = "this.backTrack.btiAH";
                                  break;
                              case 1:
                                  sModRegGet = f16Only? "this.regECX" : "this.regECX & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regECX = (this.regECX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiCL";
                                  sModRegBTHi = "this.backTrack.btiCH";
                                  break;
                              case 2:
                                  sModRegGet = f16Only? "this.regEDX" : "this.regEDX & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regEDX = (this.regEDX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiDL";
                                  sModRegBTHi = "this.backTrack.btiDH";
                                  break;
                              case 3:
                                  sModRegGet = f16Only? "this.regEBX" : "this.regEBX & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regEBX = (this.regEBX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiBL";
                                  sModRegBTHi = "this.backTrack.btiBH";
                                  break;
                              case 4:
                                  sModRegGet = f16Only? "this.regESP" : "this.regESP & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regESP = (this.regESP & ~this.dataMask) | ";
                                  sModRegBTLo = "X86.BACKTRACK.SP_LO";
                                  sModRegBTHi = "X86.BACKTRACK.SP_HI";
                                  break;
                              case 5:
                                  sModRegGet = f16Only? "this.regEBP" : "this.regEBP & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regEBP = (this.regEBP & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiBPLo";
                                  sModRegBTHi = "this.backTrack.btiBPHi";
                                  break;
                              case 6:
                                  sModRegGet = f16Only? "this.regESI" : "this.regESI & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regESI = (this.regESI & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiSILo";
                                  sModRegBTHi = "this.backTrack.btiSIHi";
                                  break;
                              case 7:
                                  sModRegGet = f16Only? "this.regEDI" : "this.regEDI & this.dataMask";
                                  sModRegSet = f16Only? "" : "this.regEDI = (this.regEDI & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiDILo";
                                  sModRegBTHi = "this.backTrack.btiDIHi";
                                  break;
                              default:
                                  sError = "unrecognized w=1 mod=3 r/m: " + r_m;
                                  break;
                              }
                          }
                          break;
                      default:
                          sError = "unrecognized mod: " + mod;
                          break;
                      }
                  } else {
                      switch (mod) {
                      case 0:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEAX";
                              sModFunc = "EAX";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 1:
                              sModAddr = "this.regECX";
                              sModFunc = "ECX";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 2:
                              sModAddr = "this.regEDX";
                              sModFunc = "EDX";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 3:
                              sModAddr = "this.regEBX";
                              sModFunc = "EBX";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 4:
                              sModAddr = "this.getSIBAddr(0)";
                              sModFunc = "SIB";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 5:
                              sModAddr = "this.getIPAddr()";
                              sModFunc = "D32";
                              nCycles = "this.cycleCounts.nEACyclesDisp";
                              break;
                          case 6:
                              sModAddr = "this.regESI";
                              sModFunc = "ESI";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          case 7:
                              sModAddr = "this.regEDI";
                              sModFunc = "EDI";
                              nCycles = "this.cycleCounts.nEACyclesBase";
                              break;
                          default:
                              sError = "unrecognized mod=0 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 1:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEAX + this.getIPDisp()";
                              sModFunc = "EAXD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 1:
                              sModAddr = "this.regECX + this.getIPDisp()";
                              sModFunc = "ECXD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 2:
                              sModAddr = "this.regEDX + this.getIPDisp()";
                              sModFunc = "EDXD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 3:
                              sModAddr = "this.regEBX + this.getIPDisp()";
                              sModFunc = "EBXD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 4:
                              sModAddr = "this.getSIBAddr(1) + this.getIPDisp()";
                              sModFunc = "SIBD8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 5:
                              sModAddr = "this.regEBP + this.getIPDisp()";
                              sModFunc = "EBPD8";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 6:
                              sModAddr = "this.regESI + this.getIPDisp()";
                              sModFunc = "ESID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 7:
                              sModAddr = "this.regEDI + this.getIPDisp()";
                              sModFunc = "EDID8";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          default:
                              sError = "unrecognized mod=1 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 2:
                          switch (r_m) {
                          case 0:
                              sModAddr = "this.regEAX + this.getIPAddr()";
                              sModFunc = "EAXD32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 1:
                              sModAddr = "this.regECX + this.getIPAddr()";
                              sModFunc = "ECXD32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 2:
                              sModAddr = "this.regEDX + this.getIPAddr()";
                              sModFunc = "EDXD32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 3:
                              sModAddr = "this.regEBX + this.getIPAddr()";
                              sModFunc = "EBXD32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 4:
                              sModAddr = "this.getSIBAddr(2) + this.getIPAddr()";
                              sModFunc = "SIBD32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 5:
                              sModAddr = "this.regEBP + this.getIPAddr()";
                              sModFunc = "EBPD32";
                              sModRegSeg = "Stack";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 6:
                              sModAddr = "this.regESI + this.getIPAddr()";
                              sModFunc = "ESID32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          case 7:
                              sModAddr = "this.regEDI + this.getIPAddr()";
                              sModFunc = "EDID32";
                              nCycles = "this.cycleCounts.nEACyclesBaseDisp";
                              break;
                          default:
                              sError = "unrecognized mod=2 r/m: " + r_m;
                              break;
                          }
                          break;
                      case 3:
                          if (!w) {
                              switch (r_m) {
                              case 0:
                                  sModRegGet = "this.regEAX & 0xff";
                                  sModRegSet = "this.regEAX = (this.regEAX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiAL";
                                  break;
                              case 1:
                                  sModRegGet = "this.regECX & 0xff";
                                  sModRegSet = "this.regECX = (this.regECX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiCL";
                                  break;
                              case 2:
                                  sModRegGet = "this.regEDX & 0xff";
                                  sModRegSet = "this.regEDX = (this.regEDX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiDL";
                                  break;
                              case 3:
                                  sModRegGet = "this.regEBX & 0xff";
                                  sModRegSet = "this.regEBX = (this.regEBX & ~0xff) | ";
                                  sModRegBTLo = "this.backTrack.btiBL";
                                  break;
                              case 4:
                                  sModRegGet = "(this.regEAX >> 8) & 0xff";
                                  sModRegSet = "this.regEAX = (this.regEAX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiAH";
                                  break;
                              case 5:
                                  sModRegGet = "(this.regECX >> 8) & 0xff";
                                  sModRegSet = "this.regECX = (this.regECX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiCH";
                                  break;
                              case 6:
                                  sModRegGet = "(this.regEDX >> 8) & 0xff";
                                  sModRegSet = "this.regEDX = (this.regEDX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiDH";
                                  break;
                              case 7:
                                  sModRegGet = "(this.regEBX >> 8) & 0xff";
                                  sModRegSet = "this.regEBX = (this.regEBX & ~0xff00) | ";
                                  sModRegSetEnd = " << 8";
                                  sModRegBTLo = "this.backTrack.btiBH";
                                  break;
                              default:
                                  sError = "unrecognized w=0 mod=3 r/m: " + r_m;
                                  break;
                              }
                          }
                          else {
                              switch (r_m) {
                              case 0:
                                  sModRegGet = "this.regEAX & this.dataMask";
                                  sModRegSet = "this.regEAX = (this.regEAX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiAL";
                                  sModRegBTHi = "this.backTrack.btiAH";
                                  break;
                              case 1:
                                  sModRegGet = "this.regECX & this.dataMask";
                                  sModRegSet = "this.regECX = (this.regECX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiCL";
                                  sModRegBTHi = "this.backTrack.btiCH";
                                  break;
                              case 2:
                                  sModRegGet = "this.regEDX & this.dataMask";
                                  sModRegSet = "this.regEDX = (this.regEDX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiDL";
                                  sModRegBTHi = "this.backTrack.btiDH";
                                  break;
                              case 3:
                                  sModRegGet = "this.regEBX & this.dataMask";
                                  sModRegSet = "this.regEBX = (this.regEBX & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiBL";
                                  sModRegBTHi = "this.backTrack.btiBH";
                                  break;
                              case 4:
                                  sModRegGet = "this.regESP & this.dataMask";
                                  sModRegSet = "this.regESP = (this.regESP & ~this.dataMask) | ";
                                  sModRegBTLo = "X86.BACKTRACK.SP_LO";
                                  sModRegBTHi = "X86.BACKTRACK.SP_HI";
                                  break;
                              case 5:
                                  sModRegGet = "this.regEBP & this.dataMask";
                                  sModRegSet = "this.regEBP = (this.regEBP & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiBPLo";
                                  sModRegBTHi = "this.backTrack.btiBPHi";
                                  break;
                              case 6:
                                  sModRegGet = "this.regESI & this.dataMask";
                                  sModRegSet = "this.regESI = (this.regESI & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiSILo";
                                  sModRegBTHi = "this.backTrack.btiSIHi";
                                  break;
                              case 7:
                                  sModRegGet = "this.regEDI & this.dataMask";
                                  sModRegSet = "this.regEDI = (this.regEDI & ~this.dataMask) | ";
                                  sModRegBTLo = "this.backTrack.btiDILo";
                                  sModRegBTHi = "this.backTrack.btiDIHi";
                                  break;
                              default:
                                  sError = "unrecognized w=1 mod=3 r/m: " + r_m;
                                  break;
                              }
                          }
                          break;
                      default:
                          sError = "unrecognized mod: " + mod;
                          break;
                      }
                  }
              
                  if (sError) {
                      print(sError);
                      return null;
                  }
              
                  sOpMod = "opMod" + aAddrPrefix[a] + (sGroup? sGroup + (sRO? sRO : "") : aDst[d]) + aSize[w] + toHex(mrm, 2);
              
                  var sTemp = aSize[w].charAt(0).toLowerCase();
              
                  if (sGroup) {
                      /*
                       * Use this to generate ModRM decoders that accept an array (ie, "group") of functions, and pass along an implied argument as well
                       */
                      if (sRO && reg != 7) {
                          sOpMod = "opMod" + aAddrPrefix[a] + (sGroup? sGroup : aDst[d]) + aSize[w] + toHex(mrm, 2);
                          return sOpMod;
                      }
              
                      print("    /**");
                      print("     * " + sOpMod + "(afnGrp, fnSrc): mod=" + toMod(d, mod) + "  reg=" + toReg(d, w, reg, sGroup) + "  r/m=" + toRM(a, mod, w, r_m));
                      print("     *");
                      print("     * @this {X86CPU}");
                      print("     * @param {Array.<function(number,number)>} afnGrp");
                      print("     * @param {function()} fnSrc");
                      print("     */");
                      print("    function " + sOpMod + "(afnGrp, fnSrc) {");
              
                      if (sModAddr) {
                          if (!d) {
                              if (reg == 7 && sRO) {
                                  if (sModFunc) {
                                      if (fInline) {
                                          print("        afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), fnSrc.call(this));");
                                      } else {
                                          sModFunc = "read" + sModFunc + aSize[w];
                                          print("        var addr = X86Mods." + sModFunc + ".call(this);");
                                          print("        afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + "(addr), fnSrc.call(this));");
                                          genEAFunc(sModFunc, "this.regEA = " + sModRegSeg + "[1] + " + sModAddr);
                                      }
                                  } else {
                                      print("        this.regEA = " + sModRegSeg + "[1] + " + sModAddr + ";");
                                      print("        afnGrp[" + reg + "].call(this, this.getEA" + aSize[w] + "(this.regEA), fnSrc.call(this));");
                                  }
                              }
                              else {
                                  if (sModFunc) {
                                      if (fInline) {
                                          print("        var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), fnSrc.call(this));");
                                          print("        this.setEA" + aSize[w] + "(" + sTemp + ");");
                                      } else {
                                          sModFunc = "write" + sModFunc + aSize[w];
                                          print("        var addr = X86Mods." + sModFunc + ".call(this);");
                                          print("        var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + "(addr), fnSrc.call(this));");
                                          print("        this.setEA" + aSize[w] + "(addr, " + sTemp + ");");
                                          genEAFunc(sModFunc, "this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr);
                                      }
                                  } else {
                                      print("        this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr + ";");
                                      print("        var " + sTemp + " = afnGrp[" + reg + "].call(this, this.modEA" + aSize[w] + "(this.regEAWrite), fnSrc.call(this));");
                                      print("        this.setEA" + aSize[w] + "(this.regEAWrite, " + sTemp + ");");
                                  }
                              }
                              if (nCycles !== null)
                                  print("        this.nStepCycles -= " + nCycles + ";");
                          }
                      }
                      else if (sModRegGet) {
                          if (!sModRegSet) {
                              sModRegSet = sModRegGet + " = ";
                              sTemp = null;
                          }
                          if (sModRegSetEnd) {
                              sModRegSetBegin = "(";
                              sModRegSetEnd += ")";
                          }
                          if (reg == 7 && sRO) {
                              print("        afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this));");
                          } else {
                              if (!sTemp) {
                                  print("        " + sModRegSet + sModRegSetBegin + "afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this))" + sModRegSetEnd + ";");
                              } else {
                                  print("        var " + sTemp + " = afnGrp[" + reg + "].call(this, " + sModRegGet + ", fnSrc.call(this));");
                                  print("        " + sModRegSet + sModRegSetBegin + sTemp + sModRegSetEnd + ";");
                              }
                              if (sModRegBTLo) {
                                  if (!sModRegBTHi) {
                                      print("        if (BACKTRACK) " + sModRegBTLo + " = this.backTrack.btiEALo;");
                                  } else if (sModRegBTLo.indexOf("_") < 0) {
                                      print("        if (BACKTRACK) {");
                                      print("            " + sModRegBTLo + " = this.backTrack.btiEALo; " + sModRegBTHi + " = this.backTrack.btiEAHi;");
                                      print("        }");
                                  }
                              }
                          }
                      }
                  }
                  else {
              
                      /*
                       * Is this OpMod a duplicate OpMod?  Specifically, when mod is 3 and d is 0, the destination is a register specified by r_m,
                       * which should match the OpMod handler for when mod' == 3 and d' == 1 and reg' == r_m and r_m' == reg.
                       */
                      if (mod == 3 && !d) {
                          var mrmPrime = (mod << 6) | (r_m << 3) | reg;
                          print("    X86Mod" + aOpPrefix[w] + aAddrPrefix[a] + ".aOpModReg[0x" + toHex(mrmPrime, 2) + "],");
                          sOpMod = "opMod" + aAddrPrefix[a] + aDst[1] + aSize[w] + toHex(mrmPrime, 2);
                          return sOpMod;
                      }
              
                      print("    /**");
                      print("     * " + sOpMod + "(fn): mod=" + toMod(d, mod) + "  reg=" + toReg(d, w, reg) + "  r/m=" + toRM(a, mod, w, r_m));
                      print("     *");
                      print("     * @this {X86CPU}");
                      print("     * @param {function(number,number)} fn (dst,src)");
                      print("     */");
                      print("    function " + sOpMod + "(fn) {");
              
                      if (sModAddr && sRegGet) {
                          if (!d) {
                              if (sModFunc) {
                                  if (fInline) {
                                      print("        var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "), " + sRegGet + ");");
                                      if (sRegBTLo) {
                                          if (!sRegBTHi) {
                                              print("        if (BACKTRACK) this.backTrack.btiEALo = " + sRegBTLo + ";");
                                          } else {
                                              print("        if (BACKTRACK) {");
                                              print("            this.backTrack.btiEALo = " + sRegBTLo + "; this.backTrack.btiEAHi = " + sRegBTHi + ";");
                                              print("        }");
                                          }
                                      }
                                      print("        this.setEA" + aSize[w] + "(" + sTemp + ");");
                                  } else {
                                      sModFunc = "write" + sModFunc + aSize[w];
                                      print("        var addr = X86Mods." + sModFunc + ".call(this);");
                                      print("        var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + "(addr), " + sRegGet + ");");
                                      print("        this.setEA" + aSize[w] + "(addr, " + sTemp + ");");
                                      genEAFunc(sModFunc, "this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr);
                                  }
                              } else {
                                  print("        this.regEAWrite = " + sModRegSeg + "[1] + " + sModAddr + ";");
                                  print("        var " + sTemp + " = fn.call(this, this.modEA" + aSize[w] + "(this.regEAWrite), " + sRegGet + ");");
                                  if (sRegBTLo) {
                                      if (!sRegBTHi) {
                                          print("        if (BACKTRACK) this.backTrack.btiEALo = " + sRegBTLo + ";");
                                      } else {
                                          print("        if (BACKTRACK) {");
                                          print("            this.backTrack.btiEALo = " + sRegBTLo + "; this.backTrack.btiEAHi = " + sRegBTHi + ";");
                                          print("        }");
                                      }
                                  }
                                  print("        this.setEA" + aSize[w] + "(this.regEAWrite, " + sTemp + ");");
                              }
                          }
                          else {
                              if (!sRegSet) {
                                  sRegSet = sRegGet + " = ";
                                  sTemp = null;
                              }
                              if (sRegSetEnd) {
                                  sRegSetBegin = "(";
                                  sRegSetEnd += ")";
                              }
                              if (sModFunc) {
                                  if (fInline) {
                                      if (!sTemp) {
                                          print("        " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "))" + sRegSetEnd + ";");
                                      } else {
                                          print("        var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + sModRegSeg + "(" + sModAddr + "));");
                                          print("        " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
                                      }
                                  } else {
                                      sModFunc = "read" + sModFunc + aSize[w];
                                      print("        var addr = X86Mods." + sModFunc + ".call(this);");
                                      if (!sTemp) {
                                          print("        " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(addr))" + sRegSetEnd + ";");
                                      } else {
                                          print("        var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(addr));");
                                          print("        " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
                                      }
                                      genEAFunc(sModFunc, "this.regEA = " + sModRegSeg + "[1] + " + sModAddr);
                                  }
                              } else {
                                  print("        this.regEA = " + sModRegSeg + "[1] + " + sModAddr + ";");
                                  if (!sTemp) {
                                      print("        " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(this.regEA))" + sRegSetEnd + ";");
                                  } else {
                                      print("        var " + sTemp + " = fn.call(this, " + sRegGet + ", this.getEA" + aSize[w] + "(this.regEA));");
                                      print("        " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
                                  }
                              }
                              if (sRegBTLo && sRegBTLo.indexOf("this.") >= 0) {
                                  if (!sRegBTHi) {
                                      print("        if (BACKTRACK) " + sRegBTLo + " = this.backTrack.btiEALo;");
                                  } else {
                                      print("        if (BACKTRACK) {");
                                      print("            " + sRegBTLo + " = this.backTrack.btiEALo; " + sRegBTHi + " = this.backTrack.btiEAHi;");
                                      print("        }");
                                  }
                              }
                          }
                          if (nCycles !== null)
                              print("        this.nStepCycles -= " + nCycles + ";");
                      }
                      else if (sModRegGet && sRegGet) {
                          if (!d) {
                              if (!sModRegSet) {
                                  sModRegSet = sModRegGet + " = ";
                                  sTemp = null;
                              }
                              if (sModRegSetEnd) {
                                  sModRegSetBegin = "(";
                                  sModRegSetEnd += ")";
                              }
                              if (!sTemp) {
                                  print("        " + sModRegSet + sModRegSetBegin + "fn.call(this, " + sModRegGet + ", " + sRegGet + ")" + sModRegSetEnd + ";");
                              } else {
                                  print("        var " + sTemp + " = fn.call(this, " + sModRegGet + ", " + sRegGet + ");");
                                  print("        " + sModRegSet + sModRegSetBegin + sTemp + sModRegSetEnd + ";");
                              }
                              if (sModRegBTLo && sModRegBTLo.indexOf("this.") >= 0 && sRegBTLo && sModRegBTLo != sRegBTLo) {
                                  if (!sModRegBTHi || !sRegBTHi) {
                                      print("        if (BACKTRACK) " + sModRegBTLo + " = " + sRegBTLo + ";");
                                  } else if (sModRegBTLo.indexOf("_") < 0) {
                                      print("        if (BACKTRACK) {");
                                      print("            " + sModRegBTLo + " = " + sRegBTLo + "; " + sModRegBTHi + " = " + sRegBTHi + ";");
                                      print("        }");
                                  }
                              }
                          }
                          else {
                              if (!sRegSet) {
                                  sRegSet = sRegGet + " = ";
                                  sTemp = null;
                              }
                              if (sRegSetEnd) {
                                  sRegSetBegin = "(";
                                  sRegSetEnd += ")";
                              }
                              if (!sTemp) {
                                  print("        " + sRegSet + sRegSetBegin + "fn.call(this, " + sRegGet + ", " + sModRegGet + ")" + sRegSetEnd + ";");
                              } else {
                                  print("        var " + sTemp + " = fn.call(this, " + sRegGet + ", " + sModRegGet + ");");
                                  print("        " + sRegSet + sRegSetBegin + sTemp + sRegSetEnd + ";");
                              }
                              if (sRegBTLo && sRegBTLo.indexOf("this.") >= 0 && sModRegBTLo && sRegBTLo != sModRegBTLo) {
                                  if (!sRegBTHi || !sModRegBTHi) {
                                      print("        if (BACKTRACK) " + sRegBTLo + " = " + sModRegBTLo + ";");
                                  } else {
                                      print("        if (BACKTRACK) {");
                                      print("            " + sRegBTLo + " = " + sModRegBTLo + "; " + sRegBTHi + " = " + sModRegBTHi + ";");
                                      print("        }");
                                  }
                              }
                          }
                      }
                  }
              
                  print("    }" + (mrm < 0xff? "," : ""));
              
                  return sOpMod;
              }
              
              function genEAFunc(sFuncName, sFuncBody) {
                  if (sEAFuncs.indexOf(sFuncName) < 0) {
                      sEAFuncs += "    /**\n";
                      sEAFuncs += "     * @this {X86CPU}\n";
                      sEAFuncs += "     * @return {number}\n";
                      sEAFuncs += "     */\n";
                      sEAFuncs += "    " + sFuncName + ": function() {\n";
                      sEAFuncs += "        return (" + sFuncBody + ");\n";
                      sEAFuncs += "    },\n";
                  }
              }
              
              function toMod(d, mod) {
                  return toBin(mod, 2) + " (" + (d? "src" : "dst") + ":" + aMOD[mod] + ")";
              }
              
              function toReg(d, w, reg, sGroup) {
                  return toBin(reg, 3) + " (" + (sGroup? "afnGrp[" + reg + "]" : (d? "dst" : "src") + ":" + aREG[w][reg]) + ")";
              }
              
              function toRM(a, mod, w, r_m) {
                  return toBin(r_m, 3) + " (" + aRM[a][mod][mod < 3? 0 : w][r_m] + ")";
              }
              
              function toBin(v, len) {
                  var s = "0000000000000000" + v.toString(2);
                  return s.slice(s.length - (len === undefined? 8 : (len < 16? len : 16)));
              }
              
              function toHex(v, len) {
                  var s = "00000000" + v.toString(16);
                  return s.slice(s.length - (len === undefined? 4 : (len < 8? len : 8))).toUpperCase();
              }
              
          • lib
            • .jshintrc
              {
                "boss": true,
                "eqnull": true,
                "evil": true,
                "loopfunc": true,
                "sub": true,
                "globalstrict": true,
                "globals": {
                  "APPNAME": false,
                  "APPVERSION": false,
                  "SITEHOST": false,
                  "COMPILED": true,
                  "DEBUG": true,
                  "MAXDEBUG": false,
                  "PCJSCLASS": true,
                  "DEBUGGER": true,
                  "PREFETCH": true,
                  "FATARRAYS": true,
                  "TYPEDARRAYS": true,
                  "BACKTRACK": true,
                  "SAMPLER": true,
                  "BUGS_8086": true,
                  "I386": true,
                  "COMPAQ386": true,
                  "Component": true,
                  "State": true,
                  "Bus": true,
                  "ChipSet": true,
                  "Computer": true,
                  "CPU": true,
                  "Debugger": true,
                  "Disk": true,
                  "FDC": true,
                  "HDC": true,
                  "Keyboard": true,
                  "Memory": true,
                  "Mouse": true,
                  "Panel": true,
                  "RAM": true,
                  "ROM": true,
                  "SerialPort": true,
                  "Video": true,
                  "X86": true,
                  "X86Seg": true,
                  "X86CPU": true,
                  "X86Func": true,
                  "X86OpXX": true,
                  "X86Op0F": true,
                  "X86ModB": true,
                  "X86ModW": true,
                  "X86ModB32": true,
                  "X86ModW32": true,
                  "X86ModSIB": true,
                  "str": true,
                  "usr": true,
                  "web": true,
                  "document": true,
                  "global": true,
                  "module": true,
                  "require": true,
                  "ArrayBuffer": false,
                  "DataView": false,
                  "FileReader": false,
                  "Uint8Array": false,
                  "Uint16Array": false,
                  "Int32Array": false,
                  "setTimeout": false,
                  "clearTimeout": false,
                  "webkitAudioContext": false,
                  "window": true
                }
              }
              
            • README.md
              PCjs Sources
              ===
              
              Structure
              ---
              These JavaScript files divide PCjs functionality into major PC components.  Most of the files are device
              components, implementing a specific device (or set of devices, in the case of [chipset.js](chipset.js)).
              
              Be aware that *component* is an overloaded term, since **Component** is also the name of the
              shared base class in [component.js](../../shared/lib/component.js) used by most machine components.
              A few low-level components (eg, the **Memory** and **State** components, the Card class of the **Video**
              component, the Color and Rectangle classes of the **Panel** component, etc) do not extend **Component**,
              so don't assume that every PCjs object has access to [component.js](../../shared/lib/component.js) methods.
              
              Examples of non-device components include UI components like [panel.js](panel.js) and [debugger.js](debugger.js),
              and sub-components like [x86opxx.js](x86opxx.js) and [x86func.js](x86func.js) that separate the CPU
              functionality of [x86.js](x86.js) into more manageable pieces.
              
              These components should always be loaded or compiled in the order listed by the *pcJSFiles* property in
              [package.json](../../../package.json), which includes all the necessary *shared* components as well.
              At the time of this writing, the recommended order is:
              
              * [shared/defines.js](../../shared/lib/defines.js)
              * [shared/diskapi.js](../../shared/lib/diskapi.js)
              * [shared/dumpapi.js](../../shared/lib/dumpapi.js)
              * [shared/reportapi.js](../../shared/lib/reportapi.js)
              * [shared/userapi.js](../../shared/lib/userapi.js)
              * [shared/strlib.js](../../shared/lib/strlib.js)
              * [shared/usrlib.js](../../shared/lib/usrlib.js)
              * [shared/weblib.js](../../shared/lib/weblib.js)
              * [shared/component.js](../../shared/lib/component.js)
              * [pcjs/defines.js](defines.js)
              * [pcjs/interrupts.js](interrupts.js)
              * [pcjs/messages.js](messages.js)
              * [pcjs/panel.js](panel.js)
              * [pcjs/bus.js](bus.js)
              * [pcjs/memory.js](memory.js)
              * [pcjs/cpu.js](cpu.js)
              * [pcjs/x86.js](x86.js)
              * [pcjs/x86seg.js](x86seg.js)
              * [pcjs/x86cpu.js](x86cpu.js)
              * [pcjs/x86func.js](x86func.js)
              * [pcjs/x86opxx.js](x86opxx.js)
              * [pcjs/x86op0f.js](x86op0f.js)
              * [pcjs/x86modb.js](x86modb.js)
              * [pcjs/x86modw.js](x86modw.js)
              * [pcjs/x86modb16.js](x86modb16.js)
              * [pcjs/x86modw16.js](x86modw16.js)
              * [pcjs/x86modb32.js](x86modb32.js)
              * [pcjs/x86modw32.js](x86modw32.js)
              * [pcjs/x86modsib.js](x86modsib.js)
              * [pcjs/chipset.js](chipset.js)
              * [pcjs/rom.js](rom.js)
              * [pcjs/ram.js](ram.js)
              * [pcjs/keyboard.js](keyboard.js)
              * [pcjs/video.js](video.js)
              * [pcjs/serialport.js](serialport.js)
              * [pcjs/mouse.js](mouse.js)
              * [pcjs/disk.js](disk.js)
              * [pcjs/fdc.js](fdc.js)
              * [pcjs/hdc.js](hdc.js)
              * [pcjs/debugger.js](debugger.js)
              * [pcjs/state.js](state.js)
              * [pcjs/computer.js](computer.js)
              * [shared/embed.js](../../shared/lib/embed.js)
              
              Some of the components *can* be reordered or even omitted (eg, [debugger.js](debugger.js) or
              [embed.js](../../shared/lib/embed.js)), but you should observe the following:
              
              * [component.js](../../shared/lib/component.js) must be listed before any component that extends **Component**
              * [panel.js](panel.js) should be loaded early to initialize the Control Panel (if any) as soon as possible
              * [computer.js](computer.js) should be the last device component, as it supervises and notifies all the other device components
              
              To minimize ordering requirements, the init() handlers and constructors of all components should avoid
              referencing other components.  Device components should define an initBus() notification handler, which the
              *Computer* component will call after it has created/initialized the *Bus* component.
              
              Features
              ---
              
              [List of major existing features goes here]
              
              ### BackTrack Support
              
              The next major feature to be implemented is referred to as BackTrack Support, or simply BackTracks.  When BackTracks
              are enabled, every memory location (at the byte level) and every general-purpose byte register may have an optional link
              back to its source.  These links are called BackTrack indexes.
              
              All the code that a virtual machine initially executes enters the machine either via ROM or disk sectors, and as that
              code executes, the machine is loading data into registers from memory locations and/or I/O ports and writing the results
              to other memory locations and/or I/O ports.  BackTracks keep track of that data flow, allowing us to examine the history
              of any piece of data at any time, down to the byte level; while this feature could be extended to the bit level, it
              would make the feature dramatically more expensive, both in terms of size and speed.
              
              A BackTrack index is encoded as a 32-bit value with three parts:
              
              - Bits 0-8: 9-bit BackTrack object offset (0-511)
              - Bits 9-15: 7-bit type and access info
              - Bits 16-30: 15-bit BackTrack object number (1-32767, 0 reserved for dynamic data)
              
              This represents a total of 31 bits, with bit 31 reserved.
              
              For example, look at one of the last things a ROM does during boot: loading a disk sector into RAM.  It will be up to the
              disk controller (or DMA controller, if used) to create a BackTrack object representing the sector that was read,
              adding that object to the global BackTrack object array, and then associating the corresponding BackTrack index with
              the first byte of RAM where the sector was loaded.  Subsequent bytes of RAM containing the rest of the sector will refer
              to the same BackTrack object, using BackTrack indexes containing offsets 1-511.
              
            • bus.js
              /**
               * @fileoverview Implements the PCjs Bus component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var Component   = require("../../shared/lib/component");
                  var Memory      = require("./memory");
                  var Messages    = require("./messages");
                  var State       = require("./state");
                  var X86         = require("./x86");
              }
              
              /**
               * Bus(cpu, dbg)
               *
               * The Bus component manages physical memory and I/O address spaces.
               *
               * The Bus component has no UI elements, so it does not require an init() handler,
               * but it still inherits from the Component class and must be allocated like any
               * other device component.  It's currently allocated by the Computer's init() handler,
               * which then calls the initBus() method of all the other components.
               *
               * When initMemory() initializes the entire address space, it also passes aMemBlocks
               * to the CPU object, so that the CPU can perform its own address-to-block calculations
               * (essential, for example, when the CPU enables paging).
               *
               * For memory beyond the simple needs of the ROM and RAM components (ie, memory-mapped
               * devices), the address space must still be allocated through the Bus component via
               * addMemory().  If the component needs something more than simple read/write storage,
               * it must provide a controller with getMemoryBuffer() and getMemoryAccess() methods.
               *
               * By contrast, all port (I/O) operations are defined by external handlers; they register
               * with us, and we manage those registrations, as well as support for I/O breakpoints,
               * but unlike memory accesses, we're not involved with port data accesses.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsBus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              function Bus(parmsBus, cpu, dbg)
              {
                  Component.call(this, "Bus", parmsBus, Bus);
              
                  this.cpu = cpu;
                  this.dbg = dbg;
              
                  this.nBusWidth = parmsBus['buswidth'] || 20;
              
                  /*
                   * Compute all Bus memory block parameters, based on the width of the bus.
                   *
                   * Regarding blockTotal, we want to avoid using block overflow expressions like:
                   *
                   *      iBlock < this.nBlockTotal? iBlock : 0
                   *
                   * As long as we know that blockTotal is a power of two (eg, 256 or 0x100, in the case of
                   * nBusWidth == 20 and blockSize == 4096), we can define blockMask as (blockTotal - 1) and
                   * rewrite the previous expression as:
                   *
                   *      iBlock & this.nBlockMask
                   *
                   * Similarly, we mask addresses with busMask to enforce "A20 wrap" on 20-bit busses.
                   * For larger busses, A20 wrap can be simulated by either clearing bit 20 of busMask or by
                   * changing all the block entries for the 2nd megabyte to match those in the 1st megabyte.
                   *
                   *      Bus Property        Old hard-coded values (when nBusWidth was always 20)
                   *      ------------        ----------------------------------------------------
                   *      this.nBusLimit      0xfffff
                   *      this.nBusMask       [same as busLimit]
                   *      this.nBlockSize     4096
                   *      this.nBlockLen      (this.nBlockSize >> 2)
                   *      this.nBlockShift    12
                   *      this.nBlockLimit    0xfff
                   *      this.nBlockTotal    ((this.nBusLimit + this.nBlockSize) / this.nBlockSize) | 0
                   *      this.nBlockMask     (this.nBlockTotal - 1) [ie, 0xff]
                   *
                   * Note that we choose a nBlockShift value (and thus a physical memory block size) based on "buswidth":
                   *
                   *      Bus Width                       Block Shift     Block Size
                   *      ---------                       -----------     ----------
                   *      20 bits (1Mb address space):    12              4Kb (256 maximum blocks)
                   *      24 bits (16Mb address space):   14              16Kb (1K maximum blocks)
                   *      32 bits (4Gb address space);    15              32Kb (128K maximum blocks)
                   *
                   * The coarser block granularities (ie, 16Kb and 32Kb) may cause problems for certain RAM and/or ROM
                   * allocations that are contiguous but are allocated out of order, or that have different controller
                   * requirements.  Your choices, for the moment, are either to ensure the allocations are performed in
                   * order, or to choose smaller nBlockShift values (at the expense of a generating a larger block array).
                   *
                   * Note that if PAGEBLOCKS is set, then for a bus width of 32 bits, the block size is fixed at 4Kb.
                   */
                  this.addrTotal = Math.pow(2, this.nBusWidth);
                  this.nBusLimit = this.nBusMask = (this.addrTotal - 1) | 0;
                  this.nBlockShift = (PAGEBLOCKS && this.nBusWidth == 32 || this.nBusWidth <= 20)? 12 : (this.nBusWidth <= 24? 14 : 15);
                  this.nBlockSize = 1 << this.nBlockShift;
                  this.nBlockLen = this.nBlockSize >> 2;
                  this.nBlockLimit = this.nBlockSize - 1;
                  this.nBlockTotal = (this.addrTotal / this.nBlockSize) | 0;
                  this.nBlockMask = this.nBlockTotal - 1;
                  this.assert(this.nBlockMask <= Bus.BlockInfo.num.mask);
              
                  /*
                   * Lists of I/O notification functions: aPortInputNotify and aPortOutputNotify are arrays, indexed by
                   * port, of sub-arrays which contain:
                   *
                   *      [0]: registered component
                   *      [1]: registered function to call for every I/O access
                   *
                   * The registered function is called with the port address, and if the access was triggered by the CPU,
                   * the linear instruction pointer (LIP) at the point of access.
                   *
                   * WARNING: Unlike the (old) read and write memory notification functions, these support only one
                   * pair of input/output functions per port.  A more sophisticated architecture could support a list
                   * of chained functions across multiple components, but I doubt that will be necessary here.
                   *
                   * UPDATE: The Debugger now piggy-backs on these arrays to indicate ports for which it wants notification
                   * of I/O.  In those cases, the registered component/function elements may or may not be set, but the following
                   * additional element will be set:
                   *
                   *      [2]: true to break on I/O, false to ignore I/O
                   *
                   * The false case is important if fPortInputBreakAll and/or fPortOutputBreakAll is set, because it allows the
                   * Debugger to selectively ignore specific ports.
                   */
                  this.aPortInputNotify = [];
                  this.aPortOutputNotify = [];
                  this.fPortInputBreakAll = this.fPortOutputBreakAll = false;
              
                  /*
                   * Allocate empty Memory blocks to span the entire physical address space.
                   */
                  this.initMemory();
              
                  if (BACKTRACK) {
                      this.abtObjects = [];
                      this.cbtDeletions = 0;
                      this.ibtLastAlloc = -1;
                      this.ibtLastDelete = 0;
                  }
              
                  this.setReady();
              }
              
              Component.subclass(Bus);
              
              if (BACKTRACK) {
                  /**
                   * BackTrack object definition
                   *
                   *  obj:        reference to the source object (eg, ROM object, Sector object)
                   *  off:        the offset within the source object that this object refers to
                   *  slot:       the slot (+1) in abtObjects which this object currently occupies
                   *  refs:       the number of memory references, as recorded by writeBackTrack()
                   *
                   * @typedef {{
                   *  obj:        Object,
                   *  off:        number,
                   *  slot:       number,
                   *  refs:       number
                   * }}
                   */
                  var BackTrack;
              
                  /*
                   * BackTrack indexes are 31-bit values, where bits 0-8 store an object offset (0-511) and bits 16-30 store
                   * an object number (1-32767).  Object number 0 is reserved for dynamic data (ie, data created independent
                   * of any source); examples include zero values produced by instructions such as "SUB AX,AX" or "XOR AX,AX".
                   * We must special-case instructions like that, because even though AX will almost certainly contain some source
                   * data prior to the instruction, the result no longer has any connection to the source.  Similarly, "SBB AX,AX"
                   * may produce 0 or -1, depending on carry, but since we don't track the source of individual bits (including the
                   * carry flag), AX is now source-less.  TODO: This is an argument for maintaining source info on selected flags,
                   * even though it would be rather expensive.
                   *
                   * The 7 middle bits (9-15) record type and access information, as follows:
                   *
                   *      bit 15: set to indicate a "data" byte, clear to indicate a "code" byte
                   *
                   * All bytes start out as "data" bytes; only once they've been executed do they become "code" bytes.  For code
                   * bytes, the remaining 6 middle bits (9-14) represent an execution count that starts at 1 (on the byte's initial
                   * transition from data to code) and tops out at 63.
                   *
                   * For data bytes, the remaining middle bits indicate any transformations the data has undergone; eg:
                   *
                   *      bit 14: ADD/SUB/INC/DEC
                   *      bit 13: MUL/DIV
                   *      bit 12: OR/AND/XOR/NOT
                   *
                   * We make no attempt to record the original data or the transformation data, only that the transformation occurred.
                   *
                   * Other middle bits indicate whether the data was ever read and/or written:
                   *
                   *      bit 11: READ
                   *      bit 10: WRITE
                   *
                   * Bit 9 is reserved for now.
                   */
                  Bus.BACKTRACK = {
                      SLOT_MAX:       32768,
                      SLOT_SHIFT:     16,
                      TYPE_DATA:      0x8000,
                      TYPE_ADDSUB:    0x4000,
                      TYPE_MULDIV:    0x2000,
                      TYPE_LOGICAL:   0x1000,
                      TYPE_READ:      0x0800,
                      TYPE_WRITE:     0x0400,
                      TYPE_COUNT_INC: 0x0200,
                      TYPE_COUNT_MAX: 0x7E00,
                      TYPE_MASK:      0xFE00,
                      TYPE_SHIFT:     9,
                      OFF_MAX:        512,
                      OFF_MASK:       0x1FF
                  };
              }
              
              /**
               * @typedef {number}
               */
              var BlockInfo;
              
              /**
               * This defines the BlockInfo bit fields used by scanMemory() when it creates the aBlocks array.
               *
               * @typedef {{
               *  num:    BitField,
               *  count:  BitField,
               *  btmod:  BitField,
               *  type:   BitField
               * }}
               */
              Bus.BlockInfo = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
              
              /**
               * BusInfo object definition (returned by scanMemory())
               *
               *  cbTotal:    total bytes allocated
               *  cBlocks:    total Memory blocks allocated
               *  aBlocks:    array of allocated Memory block numbers
               *
               * @typedef {{
               *  cbTotal:    number,
               *  cBlocks:    number,
               *  aBlocks:    Array.<BlockInfo>
               * }}
               */
              var BusInfo;
              
              /**
               * initMemory()
               *
               * Allocate enough (empty) Memory blocks to span the entire physical address space.
               *
               * @this {Bus}
               */
              Bus.prototype.initMemory = function()
              {
                  var block = new Memory();
                  this.aMemBlocks = new Array(this.nBlockTotal);
                  for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                      this.aMemBlocks[iBlock] = block;
                  }
                  this.cpu.initMemory(this.aMemBlocks, this.nBlockShift);
                  this.cpu.setAddressMask(this.nBusMask);
              };
              
              /**
               * reset()
               *
               * @this {Bus}
               */
              Bus.prototype.reset = function()
              {
                  this.setA20(true);
                  if (BACKTRACK) this.ibtLastDelete = 0;
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * We don't need a powerDown() handler, because for largely historical reasons, our state (including the A20 state)
               * is saved by saveMemory().
               *
               * However, we do need a powerUp() handler, because on resumable machines, the Computer's onReset() function calls
               * everyone's powerUp() handler rather than their reset() handler.
               *
               * TODO: Perhaps Computer should be smarter: if there's no powerUp() handler, then fallback to the reset() handler.
               * In that case, however, we'd either need to remove the powerUp() stub in Component, or detect the existence of the stub.
               *
               * @this {Bus}
               * @param {Object|null} data (always null because we supply no powerDown() handler)
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Bus.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) this.reset();
                  return true;
              };
              
              /**
               * addMemory(addr, size, type, controller)
               *
               * Adds new Memory blocks to the specified address range.  Any Memory blocks previously
               * added to that range must first be removed via removeMemory(); otherwise, you'll get
               * an allocation conflict error.  This helps prevent address calculation errors, redundant
               * allocations, etc.
               *
               * We've relaxed some of the original requirements (ie, that addresses must start at a
               * block-granular address, or that sizes must be equal to exactly one or more blocks), because
               * machines with large block sizes can make it impossible to load certain ROMs at at their
               * required addresses.
               *
               * Even so, Bus memory management does NOT provide a general-purpose heap.  Most memory
               * allocations occur during machine initialization and never change.  The only notable
               * exception is the Video frame buffer, which ranges from 4Kb (MDA) to 16Kb (CGA) to
               * 32Kb/64Kb/128Kb (EGA), and only the EGA changes its buffer address post-initialization.
               *
               * Each Memory block keeps track of a single address (addr) and length (used), indicating
               * the used space within the block; any free space that precedes or follows that used space
               * can be allocated later, by simply extending the beginning or ending of the previously used
               * space.  However, any holes that might have existed between the original allocation and an
               * extension are subsumed by the extension.
               *
               * @this {Bus}
               * @param {number} addr is the starting physical address of the request
               * @param {number} size of the request, in bytes
               * @param {number} type is one of the Memory.TYPE constants
               * @param {Object} [controller] is an optional memory controller component
               * @return {boolean} true if successful, false if not
               */
              Bus.prototype.addMemory = function(addr, size, type, controller)
              {
                  var iBlock = addr >>> this.nBlockShift;
                  while (size > 0 && iBlock < this.aMemBlocks.length) {
                      var block = this.aMemBlocks[iBlock];
                      var addrBlock = iBlock * this.nBlockSize;
                      var sizeBlock = size > this.nBlockSize? this.nBlockSize : size;
              
                      if (block && block.size) {
                          if (block.type == type && block.controller == controller) {
                              /*
                               * Where there is already a block with a non-zero size, we can allow the allocation only if:
                               *
                               *   1) addr + size <= block.addr (the request precedes the used portion of the current block)
                               * or:
                               *   2) addr >= block.addr + block.used (the request follows the used portion of the current block)
                               */
                              if (addr + size <= block.addr) {
                                  block.used += (block.addr - addr);
                                  block.addr = addr;
                                  return true;
                              }
                              if (addr >= block.addr + block.used) {
                                  var sizeAvail = block.size - (addr - addrBlock);
                                  if (sizeAvail > size) sizeAvail = size;
                                  block.used = addr - block.addr + sizeAvail;
                                  size -= sizeAvail;
                                  addr = addrBlock + this.nBlockSize;
                                  continue;
                              }
                          }
                          return this.reportError(1, addr, size);
                      }
                      block = this.aMemBlocks[iBlock++] = new Memory(addr, sizeBlock, this.nBlockSize, type, controller);
                      if (DEBUGGER && this.dbg) {
                          block.setDebugger(this.dbg, addr, this.nBlockSize);
                      }
                      size -= sizeBlock;
                      addr = addrBlock + this.nBlockSize;
                  }
                  if (size > 0) {
                      return this.reportError(2, addr, size);
                  }
                  return true;
              };
              
              /**
               * cleanMemory(addr, size)
               *
               * @this {Bus}
               * @param {number} addr
               * @param {number} size
               * @return {boolean} true if all blocks were clean, false if dirty; all blocks are cleaned in the process
               */
              Bus.prototype.cleanMemory = function(addr, size)
              {
                  var fClean = true;
                  var iBlock = addr >>> this.nBlockShift;
                  while (size > 0 && iBlock < this.aMemBlocks.length) {
                      if (this.aMemBlocks[iBlock].fDirty) {
                          this.aMemBlocks[iBlock].fDirty = fClean = false;
                          this.aMemBlocks[iBlock].fDirtyEver = true;
                      }
                      size -= this.nBlockSize;
                      iBlock++;
                  }
                  return fClean;
              };
              
              /**
               * scanMemory(info, addr, size)
               *
               * Returns a BusInfo object for the specified address range.
               *
               * @this {Bus}
               * @param {Object} [info] previous BusInfo, if any
               * @param {number} [addr] starting address of range (0 if none provided)
               * @param {number} [size] size of range, in bytes (up to end of address space if none provided)
               * @return {Object} updated info (or new info if no previous info provided)
               */
              Bus.prototype.scanMemory = function(info, addr, size)
              {
                  if (addr == null) addr = 0;
                  if (size == null) size = (this.addrTotal - addr) | 0;
                  if (info == null) info = {cbTotal: 0, cBlocks: 0, aBlocks: []};
              
                  var iBlock = addr >>> this.nBlockShift;
                  var iBlockMax = ((addr + size - 1) >>> this.nBlockShift);
              
                  info.cbTotal = 0;
                  info.cBlocks = 0;
                  while (iBlock <= iBlockMax) {
                      var block = this.aMemBlocks[iBlock];
                      info.cbTotal += block.size;
                      if (block.size) {
                          var btmod = (BACKTRACK && block.modBackTrack(false)? 1 : 0);
                          info.aBlocks.push(usr.initBitFields(Bus.BlockInfo, iBlock, 0, btmod, block.type));
                          info.cBlocks++
                      }
                      iBlock++;
                  }
                  return info;
              };
              
              /**
               * getA20()
               *
               * @this {Bus}
               * @return {boolean} true if enabled, false if disabled
               */
              Bus.prototype.getA20 = function()
              {
                  return !this.aBlocks2Mb && this.nBusLimit == this.nBusMask;
              };
              
              /**
               * setA20(fEnable)
               *
               * On 32-bit bus machines, I've adopted the approach that Compaq took with DeskPro 386 machines,
               * which is to map the 1st Mb to the 2nd Mb whenever A20 is disabled, rather than blindly masking
               * the A20 address bit from all addresses; in fact, this is what the DeskPro 386 ROM BIOS requires.
               *
               * For 24-bit bus machines, we take the same approach that most if not all 80286 systems took, which
               * is simply masking the A20 address bit.  A lot of 32-bit machines probably took the same approach.
               *
               * TODO: On machines with a 32-bit bus, look into whether we can eliminate address masking altogether,
               * which seems feasible, provided all incoming addresses are already pre-truncated to 32 bits.  Also,
               * confirm that DeskPro 386 machines mapped the ENTIRE 1st Mb to the 2nd, and not simply the first 64Kb,
               * which is technically all that 8086 address wrap-around compatibility would require.
               *
               * @this {Bus}
               * @param {boolean} fEnable is true to enable A20 (default), false to disable
               */
              Bus.prototype.setA20 = function(fEnable)
              {
                  if (this.nBusWidth == 32) {
                      if (fEnable) {
                          if (this.aBlocks2Mb) {
                              this.setMemoryBlocks(0x100000, 0x100000, this.aBlocks2Mb);
                              this.aBlocks2Mb = null;
                          }
                      } else {
                          if (!this.aBlocks2Mb) {
                              this.aBlocks2Mb = this.getMemoryBlocks(0x100000, 0x100000);
                              this.setMemoryBlocks(0x100000, 0x100000, this.getMemoryBlocks(0x0, 0x100000));
                          }
                      }
                  }
                  else if (this.nBusWidth > 20) {
                      var addrMask = (this.nBusMask & ~0x100000) | (fEnable? 0x100000 : 0);
                      if (addrMask != this.nBusMask) {
                          this.nBusMask = addrMask;
                          if (this.cpu) this.cpu.setAddressMask(addrMask);
                      }
                  }
              };
              
              /**
               * getWidth()
               *
               * @this {Bus}
               * @return {number}
               */
              Bus.prototype.getWidth = function()
              {
                  return this.nBusWidth;
              };
              
              /**
               * setMemoryAccess(addr, size)
               *
               * Updates the access functions in every block of the specified address range.  Since the only components
               * that should be dynamically modifying the memory access functions are those that use addMemory() with a custom
               * memory controller, we require that the block(s) being updated do in fact have a controller.
               *
               * @this {Bus}
               * @param {number} addr
               * @param {number} size
               * @param {Array.<function()>} [afn]
               * @return {boolean} true if successful, false if not
               */
              Bus.prototype.setMemoryAccess = function(addr, size, afn)
              {
                  if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
                      var iBlock = addr >>> this.nBlockShift;
                      while (size > 0) {
                          var block = this.aMemBlocks[iBlock];
                          if (!block.controller) {
                              return this.reportError(5, addr, size);
                          }
                          block.setAccess(afn);
                          size -= this.nBlockSize;
                          iBlock++;
                      }
                      return true;
                  }
                  return this.reportError(3, addr, size);
              };
              
              /**
               * removeMemory(addr, size)
               *
               * Replaces every block in the specified address range with empty Memory blocks that will ignore all reads/writes.
               *
               * TODO: Update the removeMemory() interface to reflect the relaxed requirements of the addMemory() interface.
               *
               * @this {Bus}
               * @param {number} addr
               * @param {number} size
               * @return {boolean} true if successful, false if not
               */
              Bus.prototype.removeMemory = function(addr, size)
              {
                  if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
                      var iBlock = addr >>> this.nBlockShift;
                      while (size > 0) {
                          addr = iBlock * this.nBlockSize;
                          var block = this.aMemBlocks[iBlock++] = new Memory(addr);
                          if (DEBUGGER && this.dbg) {
                              block.setDebugger(this.dbg, addr, this.nBlockSize);
                          }
                          size -= this.nBlockSize;
                      }
                      return true;
                  }
                  return this.reportError(4, addr, size);
              };
              
              /**
               * getMemoryBlocks(addr, size)
               *
               * @this {Bus}
               * @param {number} addr is the starting physical address
               * @param {number} size of the request, in bytes
               * @return {Array} of Memory blocks
               */
              Bus.prototype.getMemoryBlocks = function(addr, size)
              {
                  var aBlocks = [];
                  var iBlock = addr >>> this.nBlockShift;
                  while (size > 0 && iBlock < this.aMemBlocks.length) {
                      aBlocks.push(this.aMemBlocks[iBlock++]);
                      size -= this.nBlockSize;
                  }
                  return aBlocks;
              };
              
              /**
               * setMemoryBlocks(addr, size, aBlocks, type)
               *
               * If no type is specified, then specified address range uses all the provided blocks as-is;
               * this form of setMemoryBlocks() is used for complete physical aliases.
               *
               * Otherwise, new blocks are allocated with the specified type; the underlying memory from the
               * provided blocks is still used, but the new blocks may have different access to that memory.
               *
               * @this {Bus}
               * @param {number} addr is the starting physical address
               * @param {number} size of the request, in bytes
               * @param {Array} aBlocks as returned by getMemoryBlocks()
               * @param {number} [type] is one of the Memory.TYPE constants
               */
              Bus.prototype.setMemoryBlocks = function(addr, size, aBlocks, type)
              {
                  var i = 0;
                  var iBlock = addr >>> this.nBlockShift;
                  while (size > 0 && iBlock < this.aMemBlocks.length) {
                      var block = aBlocks[i++];
                      this.assert(block);
                      if (!block) break;
                      if (type !== undefined) {
                          var blockNew = new Memory(addr);
                          if (DEBUGGER && this.dbg) {
                              blockNew.setDebugger(this.dbg, addr, this.nBlockSize);
                          }
                          blockNew.clone(block, type);
                          block = blockNew;
                      }
                      this.aMemBlocks[iBlock++] = block;
                      size -= this.nBlockSize;
                  }
              };
              
              /**
               * getByte(addr)
               *
               * For physical addresses only; for linear addresses, use cpu.getByte().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} byte (8-bit) value at that address
               */
              Bus.prototype.getByte = function(addr)
              {
                  return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
              };
              
              /**
               * getByteDirect(addr)
               *
               * This is useful for the Debugger and other components that want to bypass getByte() breakpoint detection.
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} byte (8-bit) value at that address
               */
              Bus.prototype.getByteDirect = function(addr)
              {
                  return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByteDirect(addr & this.nBlockLimit, addr);
              };
              
              /**
               * getShort(addr)
               *
               * For physical addresses only; for linear addresses, use cpu.getShort().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} word (16-bit) value at that address
               */
              Bus.prototype.getShort = function(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off != this.nBlockLimit) {
                      return this.aMemBlocks[iBlock].readShort(off, addr);
                  }
                  return this.aMemBlocks[iBlock++].readByte(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByte(0, addr + 1) << 8);
              };
              
              /**
               * getShortDirect(addr)
               *
               * This is useful for the Debugger and other components that want to bypass getShort() breakpoint detection.
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} word (16-bit) value at that address
               */
              Bus.prototype.getShortDirect = function(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off != this.nBlockLimit) {
                      return this.aMemBlocks[iBlock].readShortDirect(off, addr);
                  }
                  return this.aMemBlocks[iBlock++].readByteDirect(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByteDirect(0, addr + 1) << 8);
              };
              
              /**
               * getLong(addr)
               *
               * For physical addresses only; for linear addresses, use cpu.getLong().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} long (32-bit) value at that address
               */
              Bus.prototype.getLong = function(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off < this.nBlockLimit - 2) {
                      return this.aMemBlocks[iBlock].readLong(off, addr);
                  }
                  var nShift = (off & 0x3) << 3;
                  return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
              };
              
              /**
               * getLongDirect(addr)
               *
               * This is useful for the Debugger and other components that want to bypass getLong() breakpoint detection.
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number} long (32-bit) value at that address
               */
              Bus.prototype.getLongDirect = function(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off < this.nBlockLimit - 2) {
                      return this.aMemBlocks[iBlock].readLongDirect(off, addr);
                  }
                  var nShift = (off & 0x3) << 3;
                  return (this.aMemBlocks[iBlock].readLongDirect(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLongDirect(0, addr + 3) << (32 - nShift));
              };
              
              /**
               * setByte(addr, b)
               *
               * For physical addresses only; for linear addresses, use cpu.setByte().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
               */
              Bus.prototype.setByte = function(addr, b)
              {
                  this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
              };
              
              /**
               * setByteDirect(addr, b)
               *
               * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
               * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
               */
              Bus.prototype.setByteDirect = function(addr, b)
              {
                  this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByteDirect(addr & this.nBlockLimit, b & 0xff, addr);
              };
              
              /**
               * setShort(addr, w)
               *
               * For physical addresses only; for linear addresses, use cpu.setShort().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
               */
              Bus.prototype.setShort = function(addr, w)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off != this.nBlockLimit) {
                      this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
                      return;
                  }
                  this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
                  this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
              };
              
              /**
               * setShortDirect(addr, w)
               *
               * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
               * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
               */
              Bus.prototype.setShortDirect = function(addr, w)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off != this.nBlockLimit) {
                      this.aMemBlocks[iBlock].writeShortDirect(off, w & 0xffff, addr);
                      return;
                  }
                  this.aMemBlocks[iBlock++].writeByteDirect(off, w & 0xff, addr);
                  this.aMemBlocks[iBlock & this.nBlockMask].writeByteDirect(0, (w >> 8) & 0xff, addr + 1);
              };
              
              /**
               * setLong(addr, l)
               *
               * For physical addresses only; for linear addresses, use cpu.setLong().
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} l is the long (32-bit) value to write
               */
              Bus.prototype.setLong = function(addr, l)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off < this.nBlockLimit - 2) {
                      this.aMemBlocks[iBlock].writeLong(off, l);
                      return;
                  }
                  var lPrev, nShift = (off & 0x3) << 3;
                  off &= ~0x3;
                  lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
                  this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
                  iBlock = (iBlock + 1) & this.nBlockMask;
                  addr += 3;
                  lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
                  this.aMemBlocks[iBlock].writeLong(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
              };
              
              /**
               * setLongDirect(addr, l)
               *
               * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
               * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} l is the long (32-bit) value to write
               */
              Bus.prototype.setLongDirect = function(addr, l)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                  if (off < this.nBlockLimit - 2) {
                      this.aMemBlocks[iBlock].writeLongDirect(off, l, addr);
                      return;
                  }
                  var lPrev, nShift = (off & 0x3) << 3;
                  off &= ~0x3;
                  lPrev = this.aMemBlocks[iBlock].readLongDirect(off, addr);
                  this.aMemBlocks[iBlock].writeLongDirect(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
                  iBlock = (iBlock + 1) & this.nBlockMask;
                  addr += 3;
                  lPrev = this.aMemBlocks[iBlock].readLongDirect(0, addr);
                  this.aMemBlocks[iBlock].writeLongDirect(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
              };
              
              /**
               * addBackTrackObject(obj, bto, off)
               *
               * If bto is null, then we create bto (ie, an object that wraps obj and records off).
               *
               * If bto is NOT null, then we verify that off is within the given bto's range; if not,
               * then we must create a new bto and return that instead.
               *
               * @this {Bus}
               * @param {Object} obj
               * @param {BackTrack} bto
               * @param {number} off (the offset within obj that this wrapper object is relative to)
               * @return {BackTrack|null}
               */
              Bus.prototype.addBackTrackObject = function(obj, bto, off)
              {
                  if (BACKTRACK && obj) {
                      var cbtObjects = this.abtObjects.length;
                      if (!bto) {
                          /*
                           * Try the most recently created bto, on the off-chance it's what the caller needs
                           */
                          if (this.ibtLastAlloc >= 0) bto = this.abtObjects[this.ibtLastAlloc];
                      }
                      if (!bto || bto.obj != obj || off < bto.off || off >= bto.off + Bus.BACKTRACK.OFF_MAX) {
              
                          bto = {obj: obj, off: off, slot: 0, refs: 0};
              
                          var slot;
                          if (!this.cbtDeletions) {
                              slot = cbtObjects;
                          } else {
                              for (slot = this.ibtLastDelete; slot < cbtObjects; slot++) {
                                  var btoTest = this.abtObjects[slot];
                                  if (!btoTest || !btoTest.refs && !this.isBackTrackWeak(slot << Bus.BACKTRACK.SLOT_SHIFT)) {
                                      this.ibtLastDelete = slot + 1;
                                      this.cbtDeletions--;
                                      break;
                                  }
                              }
                              /*
                               * There's no longer any guarantee that simply because cbtDeletions was non-zero that there WILL
                               * be an available (existing) slot, because cbtDeletions also counts weak references that may still
                               * be weak.
                               *
                               *      this.assert(slot < cbtObjects);
                               */
                          }
                          this.assert(slot < Bus.BACKTRACK.SLOT_MAX);
                          this.ibtLastAlloc = slot;
                          bto.slot = slot + 1;
                          if (slot == cbtObjects) {
                              this.abtObjects.push(bto);
                          } else {
                              this.abtObjects[slot] = bto;
                          }
                      }
                      return bto;
                  }
                  return null;
              };
              
              /**
               * getBackTrackIndex(bto, off)
               *
               * @this {Bus}
               * @param {BackTrack|null} bto
               * @param {number} off
               * @return {number}
               */
              Bus.prototype.getBackTrackIndex = function(bto, off)
              {
                  var bti = 0;
                  if (BACKTRACK && bto) {
                      bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
                  }
                  return bti;
              };
              
              /**
               * writeBackTrackObject(addr, bto, off)
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {BackTrack|null} bto
               * @param {number} off
               */
              Bus.prototype.writeBackTrackObject = function(addr, bto, off)
              {
                  if (BACKTRACK && bto) {
                      this.assert(off - bto.off >= 0 && off - bto.off < Bus.BACKTRACK.OFF_MAX);
                      var bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
                      this.writeBackTrack(addr, bti);
                  }
              };
              
              /**
               * readBackTrack(addr)
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @return {number}
               */
              Bus.prototype.readBackTrack = function(addr)
              {
                  if (BACKTRACK) {
                      return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readBackTrack(addr & this.nBlockLimit);
                  }
                  return 0;
              };
              
              /**
               * writeBackTrack(addr, bti)
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} bti
               */
              Bus.prototype.writeBackTrack = function(addr, bti)
              {
                  if (BACKTRACK) {
                      var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
                      var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                      var btiPrev = this.aMemBlocks[iBlock].writeBackTrack(addr & this.nBlockLimit, bti);
                      var slotPrev = btiPrev >>> Bus.BACKTRACK.SLOT_SHIFT;
                      if (slot != slotPrev) {
                          this.aMemBlocks[iBlock].modBackTrack(true);
                          if (btiPrev && slotPrev) {
                              var btoPrev = this.abtObjects[slotPrev-1];
                              if (!btoPrev) {
                                  if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
                                      this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to empty slot (" + slotPrev + ")");
                                  }
                              }
                              else if (btoPrev.refs <= 0) {
                                  if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
                                      this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to object with bad ref count (" + btoPrev.refs + ")");
                                  }
                              } else if (!--btoPrev.refs) {
                                  /*
                                   * We used to just slam a null into the previous slot and consider it gone, but there may still
                                   * be "weak references" to that slot (ie, it may still be associated with a register bti).
                                   *
                                   * The easiest way to handle weak references is to leave the slot allocated, with the object's ref
                                   * count sitting at zero, and change addBackTrackObject() to look for both empty slots AND non-empty
                                   * slots with a ref count of zero; in the latter case, it should again check for weak references,
                                   * after which we can re-use the slot if all its weak references are now gone.
                                   */
                                  if (!this.isBackTrackWeak(btiPrev)) this.abtObjects[slotPrev-1] = null;
                                  /*
                                   * TODO: Consider what the appropriate trigger should be for resetting ibtLastDelete to zero;
                                   * if we don't OCCASIONALLY set it to zero, we may never clear out obsolete weak references,
                                   * whereas if we ALWAYS set it to zero, we may be forcing addBackTrackObject() to scan the entire
                                   * table too often.
                                   *
                                   * I'd prefer to do something like this:
                                   *
                                   *      if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = slotPrev-1;
                                   *
                                   * or even this:
                                   *
                                   *      if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = 0;
                                   *
                                   * But neither one of those guarantees that we will at least occasionally scan the entire table.
                                   */
                                  this.ibtLastDelete = 0;
                                  this.cbtDeletions++;
                              }
                          }
                          if (bti && slot) {
                              var bto = this.abtObjects[slot-1];
                              if (bto) {
                                  this.assert(slot == bto.slot);
                                  bto.refs++;
                              }
                          }
                      }
                  }
              };
              
              /**
               * isBackTrackWeak(bti)
               *
               * @param {number} bti
               * @returns {boolean} true if the given bti is still referenced by a register, false if not
               */
              Bus.prototype.isBackTrackWeak = function(bti)
              {
                  var bt = this.cpu.backTrack;
                  var slot = bti >> Bus.BACKTRACK.SLOT_SHIFT;
                  return (bt.btiAL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiAH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiBL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiBH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiCL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiCH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiDL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiDH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiBPLo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiBPHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiSILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiSIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiDILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                          bt.btiDIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot
                  );
              };
              
              /**
               * updateBackTrackCode(addr, bti)
               *
               * @this {Bus}
               * @param {number} addr is a physical address
               * @param {number} bti
               */
              Bus.prototype.updateBackTrackCode = function(addr, bti)
              {
                  if (BACKTRACK) {
                      if (bti & Bus.BACKTRACK.TYPE_DATA) {
                          bti = (bti & ~Bus.BACKTRACK.TYPE_MASK) | Bus.BACKTRACK.TYPE_COUNT_INC;
                      } else if ((bti & Bus.BACKTRACK.TYPE_MASK) < Bus.BACKTRACK.TYPE_COUNT_MAX) {
                          bti += Bus.BACKTRACK.TYPE_COUNT_INC;
                      } else {
                          return;
                      }
                      this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeBackTrack(addr & this.nBlockLimit, bti);
                  }
              };
              
              /**
               * getBackTrackObject(bti)
               *
               * @this {Bus}
               * @param {number} bti
               * @return {Object|null}
               */
              Bus.prototype.getBackTrackObject = function(bti)
              {
                  if (BACKTRACK) {
                      var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
                      if (slot) {
                          var bto = this.abtObjects[slot-1];
                          if (bto) return bto.obj;
                      }
                  }
                  return null;
              };
              
              /**
               * getBackTrackObjectFromAddr(addr)
               *
               * @this {Bus}
               * @param {number} addr
               * @return {Object|null}
               */
              Bus.prototype.getBackTrackObjectFromAddr = function(addr)
              {
                  return BACKTRACK? this.getBackTrackObject(this.readBackTrack(addr)) : null;
              };
              
              /**
               * getBackTrackInfo(bti)
               *
               * @this {Bus}
               * @param {number} bti
               * @return {string|null}
               */
              Bus.prototype.getBackTrackInfo = function(bti)
              {
                  if (BACKTRACK) {
                      var bto = this.getBackTrackObject(bti);
                      if (bto) {
                          var off = bti & Bus.BACKTRACK.OFF_MASK;
                          var file = bto.obj.file;
                          if (file) {
                              this.assert(!bto.off);
                              return file.sName + '[' + (bto.obj.offFile + off) + ']';
                          }
                          return bto.obj.idComponent + '[' + (bto.off + off) + ']';
                      }
                  }
                  return null;
              };
              
              /**
               * getBackTrackInfoFromAddr(addr)
               *
               * @this {Bus}
               * @param {number} addr
               * @return {string|null}
               */
              Bus.prototype.getBackTrackInfoFromAddr = function(addr)
              {
                  return BACKTRACK? this.getBackTrackInfo(this.readBackTrack(addr)) : null;
              };
              
              /**
               * saveMemory()
               *
               * The only memory blocks we save are those marked as dirty; most likely all of RAM will have been marked dirty,
               * and even if our dirty-memory flags were as smart as our dirty-sector flags (ie, were set only when a write changed
               * what was already there), it's unlikely that would reduce the number of RAM blocks we must save/restore.  At least
               * all the ROM blocks should be clean (except in the unlikely event that the Debugger was used to modify them).
               *
               * All dirty blocks will be stored in a single array, as pairs of block numbers and data arrays, like so:
               *
               *      [iBlock0, [dw0, dw1, ...], iBlock1, [dw0, dw1, ...], ...]
               *
               * In a normal 4Kb block, there will be 1K DWORD values in the data array.  Remember that each DWORD is a signed 32-bit
               * integer (because they are formed using bit-wise operator rather than floating-point math operators), so don't be
               * surprised to see negative numbers in the data.
               *
               * The above example assumes "uncompressed" data arrays.  If we choose to use "compressed" data arrays, the data arrays
               * will look like:
               *
               *      [count0, dw0, count1, dw1, ...]
               *
               * where each count indicates how many times the following DWORD value occurs.  A data array length less than 1K indicates
               * that it's compressed, since we'll only store them in compressed form if they actually shrank, and we'll use State
               * helper methods compress() and decompress() to create and expand the compressed data arrays.
               *
               * @this {Bus}
               * @return {Array} a
               */
              Bus.prototype.saveMemory = function()
              {
                  var i = 0;
                  var a = [];
                  for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                      var block = this.aMemBlocks[iBlock];
                      /*
                       * We have to check both fDirty and fDirtyEver, because we may have called cleanMemory() on some of
                       * the memory blocks (eg, video memory), and while cleanMemory() will clear a dirty block's fDirty flag,
                       * it also sets the dirty block's fDirtyEver flag, which is left set for the lifetime of the machine.
                       */
                      if (block.fDirty || block.fDirtyEver) {
                          a[i++] = iBlock;
                          a[i++] = State.compress(block.save());
                      }
                  }
                  a[i] = this.getA20();
                  return a;
              };
              
              /**
               * restoreMemory(a)
               *
               * This restores the contents of all Memory blocks; called by X86CPU.restore().
               *
               * In theory, we ONLY have to save/restore block contents.  Other block attributes,
               * like the type, the memory controller (if any), and the active memory access functions,
               * should already be restored, since every component (re)allocates all the memory blocks
               * it was using when it's restored.  And since the CPU is guaranteed to be the last
               * component to be restored, all those blocks (and their attributes) should be in place now.
               *
               * See saveMemory() for a description of how the memory block contents are saved.
               *
               * @this {Bus}
               * @param {Array} a
               * @return {boolean} true if successful, false if not
               */
              Bus.prototype.restoreMemory = function(a)
              {
                  var i;
                  for (i = 0; i < a.length - 1; i += 2) {
                      var iBlock = a[i];
                      var adw = a[i+1];
                      if (adw && adw.length < this.nBlockLen) {
                          adw = State.decompress(adw, this.nBlockLen);
                      }
                      var block = this.aMemBlocks[iBlock];
                      if (!block || !block.restore(adw)) {
                          /*
                           * Either the block to restore hasn't been allocated, indicating a change in the machine
                           * configuration since it was last saved (the most likely explanation) or there's some internal
                           * inconsistency (eg, the block size is wrong).
                           */
                          Component.error("Unable to restore memory block " + iBlock);
                          return false;
                      }
                  }
                  if (a[i] !== undefined) this.setA20(a[i]);
                  return true;
              };
              
              /**
               * addMemBreak(addr, fWrite)
               *
               * @this {Bus}
               * @param {number} addr
               * @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
               */
              Bus.prototype.addMemBreak = function(addr, fWrite)
              {
                  if (DEBUGGER) {
                      var iBlock = addr >>> this.nBlockShift;
                      this.aMemBlocks[iBlock].addBreakpoint(addr & this.nBlockLimit, fWrite);
                  }
              };
              
              /**
               * removeMemBreak(addr, fWrite)
               *
               * @this {Bus}
               * @param {number} addr
               * @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
               */
              Bus.prototype.removeMemBreak = function(addr, fWrite)
              {
                  if (DEBUGGER) {
                      var iBlock = addr >>> this.nBlockShift;
                      this.aMemBlocks[iBlock].removeBreakpoint(addr & this.nBlockLimit, fWrite);
                  }
              };
              
              /**
               * addPortInputBreak(port)
               *
               * @this {Bus}
               * @param {number} [port]
               * @return {boolean} true if break on port input enabled, false if disabled
               */
              Bus.prototype.addPortInputBreak = function(port)
              {
                  if (port === undefined) {
                      this.fPortInputBreakAll = !this.fPortInputBreakAll;
                      return this.fPortInputBreakAll;
                  }
                  if (this.aPortInputNotify[port] === undefined) {
                      this.aPortInputNotify[port] = [null, null, false];
                  }
                  this.aPortInputNotify[port][2] = !this.aPortInputNotify[port][2];
                  return this.aPortInputNotify[port][2];
              };
              
              /**
               * addPortInputNotify(start, end, component, fn)
               *
               * Add a port input-notification handler to the list of such handlers.
               *
               * @this {Bus}
               * @param {number} start port address
               * @param {number} end port address
               * @param {Component} component
               * @param {function(number,number)} fn is called with the port and LIP values at the time of the input
               */
              Bus.prototype.addPortInputNotify = function(start, end, component, fn)
              {
                  if (fn !== undefined) {
                      for (var port = start; port <= end; port++) {
                          if (this.aPortInputNotify[port] !== undefined) {
                              Component.warning("Input port " + str.toHexWord(port) + " registered by " + this.aPortInputNotify[port][0].id + ", ignoring " + component.id);
                              continue;
                          }
                          this.aPortInputNotify[port] = [component, fn, false, false];
                          if (MAXDEBUG) this.log("addPortInputNotify(" + str.toHexWord(port) + "," + component.id + ")");
                      }
                  }
              };
              
              /**
               * addPortInputTable(component, table, offset)
               *
               * Add port input-notification handlers from the specified table (a batch version of addPortInputNotify)
               *
               * @this {Bus}
               * @param {Component} component
               * @param {Object} table
               * @param {number} [offset] is an optional port offset
               */
              Bus.prototype.addPortInputTable = function(component, table, offset)
              {
                  if (offset === undefined) offset = 0;
                  for (var port in table) {
                      this.addPortInputNotify(+port + offset, +port + offset, component, table[port]);
                  }
              };
              
              /**
               * checkPortInputNotify(port, addrLIP)
               *
               * @this {Bus}
               * @param {number} port
               * @param {number} [addrLIP] is the LIP value at the time of the input
               * @return {number} simulated port value (0xff if none)
               *
               * NOTE: It seems that at least parts of the ROM BIOS (like the RS-232 probes around F000:E5D7 in the 5150 BIOS)
               * assume that ports for non-existent hardware return 0xff rather than 0x00, hence my new default (0xff) below.
               */
              Bus.prototype.checkPortInputNotify = function(port, addrLIP)
              {
                  var bIn = 0xff;
                  var aNotify = this.aPortInputNotify[port];
              
                  if (BACKTRACK) {
                      this.cpu.backTrack.btiIO = 0;
                  }
                  if (aNotify !== undefined) {
                      if (aNotify[1]) {
                          var b = aNotify[1].call(aNotify[0], port, addrLIP);
                          if (b !== undefined) bIn = b;
                      }
                      if (DEBUGGER && this.dbg && this.fPortInputBreakAll != aNotify[2]) {
                          this.dbg.checkPortInput(port, bIn);
                      }
                  }
                  else {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.messageIO(this, port, null, addrLIP);
                          if (this.fPortInputBreakAll) this.dbg.checkPortInput(port, bIn);
                      }
                  }
                  return bIn;
              };
              
              /**
               * removePortInputNotify(start, end, component, fn)
               *
               * Remove a port input-notification handler from the list of such handlers (to be ENABLED later if needed)
               *
               * @this {Bus}
               * @param {number} start address
               * @param {number} end address
               * @param {Component} component
               * @param {function(number,number)} fn of previously added handler
               *
              Bus.prototype.removePortInputNotify = function(start, end, component, fn)
               {
                  for (var port = start; port < end; port++) {
                      if (this.aPortInputNotify[port] && this.aPortInputNotify[port][0] == component && this.aPortInputNotify[port][1] == fn) {
                          this.aPortInputNotify[port] = undefined;
                      }
                  }
              };
               */
              
              /**
               * addPortOutputBreak(port)
               *
               * @this {Bus}
               * @param {number} [port]
               * @return {boolean} true if break on port output enabled, false if disabled
               */
              Bus.prototype.addPortOutputBreak = function(port)
              {
                  if (port === undefined) {
                      this.fPortOutputBreakAll = !this.fPortOutputBreakAll;
                      return this.fPortOutputBreakAll;
                  }
                  if (this.aPortOutputNotify[port] === undefined) {
                      this.aPortOutputNotify[port] = [null, null, false];
                  }
                  this.aPortOutputNotify[port][2] = !this.aPortOutputNotify[port][2];
                  return this.aPortOutputNotify[port][2];
              };
              
              /**
               * addPortOutputNotify(start, end, component, fn)
               *
               * Add a port output-notification handler to the list of such handlers.
               *
               * @this {Bus}
               * @param {number} start port address
               * @param {number} end port address
               * @param {Component} component
               * @param {function(number,number)} fn is called with the port and LIP values at the time of the output
               */
              Bus.prototype.addPortOutputNotify = function(start, end, component, fn)
              {
                  if (fn !== undefined) {
                      for (var port = start; port <= end; port++) {
                          if (this.aPortOutputNotify[port] !== undefined) {
                              Component.warning("Output port " + str.toHexWord(port) + " registered by " + this.aPortOutputNotify[port][0].id + ", ignoring " + component.id);
                              continue;
                          }
                          this.aPortOutputNotify[port] = [component, fn, false, false];
                          if (MAXDEBUG) this.log("addPortOutputNotify(" + str.toHexWord(port) + "," + component.id + ")");
                      }
                  }
              };
              
              /**
               * addPortOutputTable(component, table, offset)
               *
               * Add port output-notification handlers from the specified table (a batch version of addPortOutputNotify)
               *
               * @this {Bus}
               * @param {Component} component
               * @param {Object} table
               * @param {number} [offset] is an optional port offset
               */
              Bus.prototype.addPortOutputTable = function(component, table, offset)
              {
                  if (offset === undefined) offset = 0;
                  for (var port in table) {
                      this.addPortOutputNotify(+port + offset, +port + offset, component, table[port]);
                  }
              };
              
              /**
               * checkPortOutputNotify(port, bOut, addrLIP)
               *
               * @this {Bus}
               * @param {number} port
               * @param {number} bOut
               * @param {number} [addrLIP] is the LIP value at the time of the output
               */
              Bus.prototype.checkPortOutputNotify = function(port, bOut, addrLIP)
              {
                  var aNotify = this.aPortOutputNotify[port];
                  if (aNotify !== undefined) {
                      if (aNotify[1]) {
                          aNotify[1].call(aNotify[0], port, bOut, addrLIP);
                      }
                      if (DEBUGGER && this.dbg && this.fPortOutputBreakAll != aNotify[2]) {
                          this.dbg.checkPortOutput(port, bOut);
                      }
                  }
                  else {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.messageIO(this, port, bOut, addrLIP);
                          if (this.fPortOutputBreakAll) this.dbg.checkPortOutput(port, bOut);
                      }
                  }
              };
              
              /**
               * removePortOutputNotify(start, end, component, fn)
               *
               * Remove a port output-notification handler from the list of such handlers (to be ENABLED later if needed)
               *
               * @this {Bus}
               * @param {number} start address
               * @param {number} end address
               * @param {Component} component
               * @param {function(number,number)} fn of previously added handler
               *
              Bus.prototype.removePortOutputNotify = function(start, end, component, fn)
               {
                  for (var port = start; port < end; port++) {
                      if (this.aPortOutputNotify[port] && this.aPortOutputNotify[port][0] == component && this.aPortOutputNotify[port][1] == fn) {
                          this.aPortOutputNotify[port] = undefined;
                      }
                  }
              };
               */
              
              /**
               * reportError(op, addr, size)
               *
               * @this {Bus}
               * @param {number} op
               * @param {number} addr
               * @param {number} size
               * @return {boolean} false
               */
              Bus.prototype.reportError = function(op, addr, size)
              {
                  Component.error("Memory block error (" + op + "," + str.toHex(addr) + "," + str.toHex(size) + ")");
                  return false;
              };
              
              if (typeof module !== 'undefined') module.exports = Bus;
              
            • chipset.js
              /**
               * @fileoverview Implements the PCjs ChipSet component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-14
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Interrupts  = require("./interrupts");
                  var Messages    = require("./messages");
                  var State       = require("./state");
              }
              
              /**
               * ChipSet(parmsChipSet)
               *
               * The ChipSet component has the following component-specific (parmsChipSet) properties:
               *
               *      model:          "5150", "5160", "5170" or "deskpro386" (should be a member of ChipSet.MODELS)
               *      sw1:            8-character binary string representing the SW1 DIP switches (SW1[1-8])
               *      sw2:            8-character binary string representing the SW2 DIP switches (SW2[1-8]) (MODEL_5150 only)
               *      sound:          true to enable (experimental) sound support (default); false to disable
               *      scaleTimers:    true to divide timer cycle counts by the CPU's cycle multiplier (default is false)
               *      floppies:       array of floppy drive sizes in Kb (default is "[360, 360]" if no sw1 value provided)
               *      monitor:        none|tv|color|mono|ega|vga (if no sw1 value provided, default is "ega" for 5170, "mono" otherwise)
               *      rtcDate:        optional RTC date/time (in GMT) to use on reset; use the ISO 8601 format; eg: "2014-10-01T08:00:00"
               *
               * The conventions used for the sw1 and sw2 strings are that the left-most character represents DIP switch [1],
               * the right-most character represents DIP switch [8], and "1" means the DIP switch is ON and "0" means it is OFF.
               *
               * Internally, we convert the above strings into binary values that the 8255A PPI returns, where DIP switch [1]
               * is bit 0 and DIP switch [8] is bit 7, and 0 indicates the switch is ON and 1 indicates it is OFF.
               *
               * For reference, here's how the SW1 and SW2 switches correspond to the internal 8255A PPI bit values:
               *
               *      SW1[1]    (bit 0)     "0xxxxxxx" (1):  IPL,  "1xxxxxxx" (0):  No IPL
               *      SW1[2]    (bit 1)     reserved
               *      SW1[3,4]  (bits 3-2)  "xx11xxxx" (00): 16Kb, "xx01xxxx" (01): 32Kb,  "xx10xxxx" (10): 48Kb,  "xx00xxxx" (11): 64Kb
               *      SW1[5,6]  (bits 5-4)  "xxxx11xx" (00): none, "xxxx01xx" (01): tv,    "xxxx10xx" (10): color, "xxxx00xx" (11): mono
               *      SW1[7,8]  (bits 7-6)  "xxxxxx11" (00): 1 FD, "xxxxxx01" (01): 2 FD,  "xxxxxx10" (10): 3 FD,  "xxxxxx00" (11): 4 FD
               *
               * Note: FD refers to floppy drive, and IPL refers to an "Initial Program Load" floppy drive.
               *
               *      SW2[1-4]    (bits 3-0)  "NNNNxxxx": number of 32Kb blocks of I/O expansion RAM present
               *
               * TODO: There are cryptic references to SW2[5] in the original (5150) TechRef, and apparently the 8255A PPI can
               * be programmed to return it (which we support), but its purpose remains unclear to me (see PPI_B.ENABLE_SW2).
               *
               * For example, sw1="01110011" indicates that all SW1 DIP switches are ON, except for SW1[1], SW1[5] and SW1[6],
               * which are OFF.  Internally, the order of these bits must reversed (to 11001110) and then inverted (to 00110001)
               * to yield the value that the 8255A PPI returns.  Reading the final value right-to-left, 00110001 indicates an
               * IPL floppy drive, 1X of RAM (where X is 16Kb on a MODEL_5150 and 64Kb on a MODEL_5160), MDA, and 1 floppy drive.
               *
               * WARNING: It is possible to set SW1 to indicate more memory than the RAM component has been configured to provide.
               * This is a configuration error which will cause the machine to crash after reporting a "201" error code (memory
               * test failure), which is presumably what a real machine would do if it was similarly misconfigured.  Surprisingly,
               * the BIOS forges ahead, setting SP to the top of the memory range indicated by SW1 (via INT 0x12), but the lack of
               * a valid stack causes the system to crash after the next IRET.  The BIOS should have either halted or modified
               * the actual memory size to match the results of the memory test.
               *
               * This module provides support for many of the following components (except where a separate component is noted).
               * This list is taken from p.1-8 ("System Unit") of the IBM 5160 (PC XT) Technical Reference Manual (as revised
               * April 1983), only because I didn't see a similar listing in the original 5150 TechRef.
               *
               *      Port(s)         Description
               *      -------         -----------
               *      000-00F         DMA Chip 8237A-5                                [see below]
               *      020-021         Interrupt 8259A                                 [see below]
               *      040-043         Timer 8253-5                                    [see below]
               *      060-063         PPI 8255A-5                                     [see below]
               *      080-083         DMA Page Registers                              [see below]
               *          0Ax [1]     NMI Mask Register                               [see below]
               *          0Cx         Reserved
               *          0Ex         Reserved
               *      200-20F         Game Control
               *      210-217         Expansion Unit
               *      220-24F         Reserved
               *      278-27F         Reserved
               *      2F0-2F7         Reserved
               *      2F8-2FF         Asynchronous Communications (Secondary)         [see the SerialPort component]
               *      300-31F         Prototype Card
               *      320-32F         Hard Drive Controller (XTC)                     [see the HDC component]
               *      378-37F         Printer
               *      380-38C [2]     SDLC Communications
               *      380-389 [2]     Binary Synchronous Communications (Secondary)
               *      3A0-3A9         Binary Synchronous Communications (Primary)
               *      3B0-3BF         IBM Monochrome Display/Printer                  [see the Video component]
               *      3C0-3CF         Reserved
               *      3D0-3DF         Color/Graphics (Motorola 6845)                  [see the Video component]
               *      3EO-3E7         Reserved
               *      3FO-3F7         Floppy Drive Controller                         [see the FDC component]
               *      3F8-3FF         Asynchronous Communications (Primary)           [see the SerialPort component]
               *
               * [1] At power-on time, NMI is masked off, perhaps because models 5150 and 5160 also tie coprocessor
               * interrupts to NMI.  Suppressing NMI by default seems odd, because that would also suppress memory
               * parity errors.  TODO: Determine whether "power-on time" refers to the initial power-on state of the
               * NMI Mask Register or the state that the BIOS "POST" (Power-On Self-Test) sets.
               *
               * [2] These devices cannot be used together since their port addresses overlap.
               *
               *      MODEL_5170      Description
               *      ----------      -----------
               *          070 [3]     CMOS Address                                    ChipSet.CMOS.ADDR.PORT
               *          071         CMOS Data                                       ChipSet.CMOS.DATA.PORT
               *          0F0         Coprocessor Clear Busy (output 0x00)
               *          0F1         Coprocessor Reset (output 0x00)
               *      1F0-1F7         Hard Drive Controller (ATC)                     [see the HDC component]
               *
               * [3] Port 0x70 doubles as the NMI Mask Register: output a CMOS address with bit 7 clear to enable NMI
               * or with bit 7 set to disable NMI (apparently the inverse of the older NMI Mask Register at port 0xA0).
               * Also, apparently unlike previous models, the MODEL_5170 POST leaves NMI enabled.  And fortunately, the
               * coprocessor interrupt line is no longer tied to NMI (it uses IRQ 13).
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsChipSet
               */
              function ChipSet(parmsChipSet)
              {
                  Component.call(this, "ChipSet", parmsChipSet, ChipSet, Messages.CHIPSET);
              
                  this.model = parmsChipSet['model'];
                  this.model = this.model && ChipSet.MODELS[this.model] || ChipSet.MODEL_5150;
              
                  /*
                   * SW1 describes the number of floppy drives, the amount of base memory, the primary monitor type,
                   * and (on the MODEL_5160) whether or not a coprocessor is installed.  If no SW1 settings are provided,
                   * we look for individual 'floppies' and 'monitor' settings and build a default SW1 value.
                   *
                   * The defaults below select max memory, monochrome monitor (EGA monitor for MODEL_5170), and two floppies.
                   * Don't get too excited about "max memory" either: on a MODEL_5150, the max was 64Kb, and on a MODEL_5160,
                   * the max was 256Kb.  However, the RAM component is free to install as much base memory as it likes,
                   * overriding the SW1 memory setting.
                   *
                   * Given that the ROM BIOS is hard-coded to load boot sectors @0000:7C00, the minimum amount of system RAM
                   * required to boot is therefore 32Kb.  Whether that's actually enough to run any or all versions of PC-DOS is
                   * a separate question.  FYI, with only 16Kb, the ROM BIOS will still try to boot, and fail miserably.
                   */
                  this.sw1Init = 0;
                  var sw1 = parmsChipSet['sw1'];
                  if (sw1) {
                      this.sw1Init = this.parseSwitches(sw1, ChipSet.PPI_SW.MEMORY.X4 | ChipSet.PPI_SW.MONITOR.MONO);
                  } else {
                      this.aFloppyDrives = [360, 360];
                      var aFloppyDrives = parmsChipSet['floppies'];
                      if (aFloppyDrives && aFloppyDrives.length) this.aFloppyDrives = aFloppyDrives;
                      var nDrives = this.aFloppyDrives.length;
                      if (nDrives) {
                          this.sw1Init |= ChipSet.PPI_SW.FDRIVE.IPL;
                          nDrives--;
                          this.sw1Init |= ((nDrives & 0x3) << ChipSet.PPI_SW.FDRIVE.SHIFT);
                      }
                      var sMonitor = parmsChipSet['monitor'] || (this.model < ChipSet.MODEL_5170? "mono" : "ega");
                      if (sMonitor && ChipSet.aMonitorSwitches[sMonitor] !== undefined) {
                          this.sw1Init |= (ChipSet.aMonitorSwitches[sMonitor] << ChipSet.PPI_SW.MONITOR.SHIFT);
                      }
                  }
              
                  /*
                   * SW2 describes the number of 32Kb blocks of I/O expansion RAM that's present in the system. The MODEL_5150
                   * ROM BIOS only checked/supported the first four switches, so the maximum amount of additional RAM specifiable
                   * was 15 * 32Kb, or 480Kb.  With a maximum of 64Kb on the motherboard, the MODEL_5150 ROM BIOS could support
                   * a grand total of 544Kb.
                   *
                   * For MODEL_5160 (PC XT) and up, memory expansion cards had their own configuration switches, and the motherboard
                   * SW2 switches for I/O expansion RAM were eliminated.  Instead, the ROM BIOS scans the entire address space
                   * (up to 0xA0000) looking for additional memory.  As a result, the only mechanism we provide for adding RAM
                   * (above the maximum of 256Kb supported on the motherboard) is the "size" parameter of the RAM component.
                   *
                   * NOTE: If you use the "size" parameter, you will not be able to dynamically alter the memory configuration;
                   * the RAM component will ignore any changes to SW1.
                   */
                  this.sw2Init = this.parseSwitches(parmsChipSet['sw2'] || "11110000", 0);
              
                  /*
                   * The SW1 memory setting is actually just a multiplier: it's multiplied by 16Kb on a MODEL_5150, 64Kb otherwise.
                   */
                  this.kbSW = (this.model == ChipSet.MODEL_5150? 16 : 64);
              
                  this.cDMACs = this.cPICs = 1;
                  if (this.model >= ChipSet.MODEL_5170) {
                      this.cDMACs = this.cPICs = 2;
                  }
              
                  this.fScaleTimers = parmsChipSet['scaleTimers'] || false;
                  this.sRTCDate = parmsChipSet['rtcDate'];
              
                  /*
                   * Here, I'm finally getting around to trying the Web Audio API.  Fortunately, based on what little I know about
                   * sound generation, using the API to make the same noises as the IBM PC speaker seems straightforward.
                   *
                   * To start, we create an audio context, unless the 'sound' parameter has been explicitly set to false.
                   *
                   * From:
                   *
                   *      http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html
                   *
                   * "Similar to how HTML5 canvas requires a context on which lines and curves are drawn, Web Audio requires an audio context
                   *  on which sounds are played and manipulated. This context will be the parent object of further audio objects to come....
                   *  Your audio context is typically created when your page initializes and should be long-lived. You can play multiple sounds
                   *  coming from multiple sources within the same context, so it is unnecessary to create more than one audio context per page."
                   */
                  this.fSpeaker = false;
                  if (parmsChipSet['sound']) {
                      this.classAudio = this.contextAudio = null;
                      if (window) {
                          this.classAudio = window['AudioContext'] || window['webkitAudioContext'];
                      }
                      if (this.classAudio) {
                          this.contextAudio = new this.classAudio();
                      } else {
                          if (DEBUG) this.log("AudioContext not available");
                      }
                  }
              
                  /*
                   * I used to defer ChipSet's reset() to powerUp(), which then gave us the option of doing either
                   * reset() OR restore(), instead of both.  However, on MODEL_5170 machines, the initial CMOS data
                   * needs to be created earlier, so that when other components are initializing their state (eg, when
                   * HDC calls setCMOSDriveType() or RAM calls addCMOSMemory()), the CMOS will be ready to take their calls.
                   */
                  this.reset(true);
              
                  this.setReady();
              }
              
              Component.subclass(ChipSet);
              
              /*
               * Supported model numbers
               *
               * Unless otherwise noted, all BIOS references refer to the *original* BIOS released with each model.
               */
              ChipSet.MODEL_5150      = 5150;         // used in reference to the 1st 5150 BIOS, dated Apr 24, 1981
              ChipSet.MODEL_5160      = 5160;         // used in reference to the 1st 5160 BIOS, dated Nov 8, 1982
              ChipSet.MODEL_5170      = 5170;         // used in reference to the 1st 5170 BIOS, dated Jan 10, 1984
              
              /*
               * The following are fake model numbers, used only to document issues/features in later IBM PC AT BIOS revisions.
               */
              ChipSet.MODEL_5170_REV2 = 5170.2;       // used in reference to the 2nd 5170 BIOS, dated Jun 10, 1985
              ChipSet.MODEL_5170_REV3 = 5170.3;       // used in reference to the 3rd 5170 BIOS, dated Nov 15, 1985
              
              /*
               * The following are even more fake model numbers, as we begin to depart from the IBM lineage.  All that
               * really matters at this point is that MODEL_DESKPRO386 > MODEL_5170.
               */
              ChipSet.MODEL_DESKPRO386 = 5180;
              
              /*
               * Last but not least, a complete list of supported model strings, and corresponding internal model numbers.
               */
              ChipSet.MODELS = {
                  "5150":         ChipSet.MODEL_5150,
                  "5160":         ChipSet.MODEL_5160,
                  "5170":         ChipSet.MODEL_5170,
                  "deskpro386":   ChipSet.MODEL_DESKPRO386
              };
              
              /*
               * Values returned by ChipSet.getSWVideoMonitor()
               */
              ChipSet.MONITOR = {
                  NONE:               0,
                  TV:                 1,  // Composite monitor (lower resolution; no support)
                  COLOR:              2,  // Color Display (5153)
                  MONO:               3,  // Monochrome Display (5151)
                  EGACOLOR:           4,  // Enhanced Color Display (5154) in High-Res Mode
                  EGAEMULATION:       6,  // Enhanced Color Display (5154) in Emulation Mode
                  VGACOLOR:           7   // VGA Color Display
              };
              
              /*
               * Lookup table for converting ChipSet "monitor" values into the corresponding SW1 switch bits
               * (they must be shifted left by ChipSet.PPI_SW.MONITOR.SHIFT before OR'ing them into sw1/sw1Init).
               */
              ChipSet.aMonitorSwitches = {
                  "none":             0x0,
                  "tv":               0x1,
                  "color":            0x2,
                  "mono":             0x3,
                  "ega":              0x0,
                  "vga":              0x0
              };
              
              /*
               *  8237A DMA Controller (DMAC) I/O ports
               *
               *  MODEL_5150 and up uses DMA channel 0 for memory refresh cycles and channel 2 for the FDC.
               *
               *  MODEL_5160 and up uses DMA channel 3 for HDC transfers (XTC only).
               *
               *  DMA0 refers to the original DMA controller found on all models, and DMA1 refers to the additional
               *  controller found on MODEL_5170 and up; channel 4 on DMA1 is used to "cascade" channels 0-3 from DMA0,
               *  so only channels 5-7 are available on DMA1.
               *
               *  For FDC DMA notes, refer to http://wiki.osdev.org/ISA_DMA
               *  For general DMA notes, refer to http://www.freebsd.org/doc/en/books/developers-handbook/dma.html
               *
               *  TODO: Determine why the MODEL_5150 ROM BIOS sets the DMA channel 1 page register (port 0x83) to zero.
               */
              ChipSet.DMA0 = {
                  INDEX:              0,
                  PORT: {
                      CH0_ADDR:       0x00,   // OUT: starting address        IN: current address
                      CH0_COUNT:      0x01,   // OUT: starting word count     IN: remaining word count
                      CH1_ADDR:       0x02,   // OUT: starting address        IN: current address
                      CH1_COUNT:      0x03,   // OUT: starting word count     IN: remaining word count
                      CH2_ADDR:       0x04,   // OUT: starting address        IN: current address
                      CH2_COUNT:      0x05,   // OUT: starting word count     IN: remaining word count
                      CH3_ADDR:       0x06,   // OUT: starting address        IN: current address
                      CH3_COUNT:      0x07,   // OUT: starting word count     IN: remaining word count
                      CMD_STATUS:     0x08,   // OUT: command register        IN: status register
                      REQUEST:        0x09,
                      MASK:           0x0A,
                      MODE:           0x0B,
                      RESET_FF:       0x0C,   // reset flip-flop
                      MASTER_CLEAR:   0x0D,   // master clear
                      MASK_CLEAR:     0x0E,   // TODO: Provide handlers
                      MASK_ALL:       0x0F,   // TODO: Provide handlers
                      CH2_PAGE:       0x81,   // OUT: DMA channel 2 page register
                      CH3_PAGE:       0x82,   // OUT: DMA channel 3 page register
                      CH1_PAGE:       0x83,   // OUT: DMA channel 1 page register
                      CH0_PAGE:       0x87    // OUT: DMA channel 0 page register (unusable; See "The Inside Out" book, p.246)
                  }
              };
              ChipSet.DMA1 = {
                  INDEX:              1,
                  PORT: {
                      CH6_PAGE:       0x89,   // OUT: DMA channel 6 page register (MODEL_5170)
                      CH7_PAGE:       0x8A,   // OUT: DMA channel 7 page register (MODEL_5170)
                      CH5_PAGE:       0x8B,   // OUT: DMA channel 5 page register (MODEL_5170)
                      CH4_PAGE:       0x8F,   // OUT: DMA channel 4 page register (MODEL_5170; unusable; aka "Refresh" page register?)
                      CH4_ADDR:       0xC0,   // OUT: starting address        IN: current address
                      CH4_COUNT:      0xC2,   // OUT: starting word count     IN: remaining word count
                      CH5_ADDR:       0xC4,   // OUT: starting address        IN: current address
                      CH5_COUNT:      0xC6,   // OUT: starting word count     IN: remaining word count
                      CH6_ADDR:       0xC8,   // OUT: starting address        IN: current address
                      CH6_COUNT:      0xCA,   // OUT: starting word count     IN: remaining word count
                      CH7_ADDR:       0xCC,   // OUT: starting address        IN: current address
                      CH7_COUNT:      0xCE,   // OUT: starting word count     IN: remaining word count
                      CMD_STATUS:     0xD0,   // OUT: command register        IN: status register
                      REQUEST:        0xD2,
                      MASK:           0xD4,
                      MODE:           0xD6,
                      RESET_FF:       0xD8,   // reset flip-flop
                      MASTER_CLEAR:   0xDA,   // master clear
                      MASK_CLEAR:     0xDC,   // TODO: Provide handlers
                      MASK_ALL:       0xDE    // TODO: Provide handlers
                  }
              };
              
              ChipSet.DMA_CMD = {
                  M2M_ENABLE:         0x01,
                  CH0HOLD_ENABLE:     0x02,
                  CTRL_DISABLE:       0x04,
                  COMP_TIMING:        0x08,
                  ROT_PRIORITY:       0x10,
                  EXT_WRITE_SEL:      0x20,
                  DREQ_ACTIVE_LO:     0x40,
                  DACK_ACTIVE_HI:     0x80
              };
              
              ChipSet.DMA_STATUS = {
                  CH0_TC:             0x01,   // Channel 0 has reached Terminal Count (TC)
                  CH1_TC:             0x02,   // Channel 1 has reached Terminal Count (TC)
                  CH2_TC:             0x04,   // Channel 2 has reached Terminal Count (TC)
                  CH3_TC:             0x08,   // Channel 3 has reached Terminal Count (TC)
                  ALL_TC:             0x0f,   // all TC bits are cleared whenever DMA_STATUS is read
                  CH0_REQ:            0x10,   // Channel 0 DMA requested
                  CH1_REQ:            0x20,   // Channel 1 DMA requested
                  CH2_REQ:            0x40,   // Channel 2 DMA requested
                  CH3_REQ:            0x80    // Channel 3 DMA requested
              };
              
              ChipSet.DMA_MASK = {
                  CHANNEL:            0x03,
                  CHANNEL_SET:        0x04
              };
              
              ChipSet.DMA_MODE = {
                  CHANNEL:            0x03,   // bits 0-1 select 1 of 4 possible channels
                  TYPE:               0x0C,   // bits 2-3 select 1 of 3 valid (4 possible) transfer types
                  TYPE_VERIFY:        0x00,   // pseudo transfer (generates addresses, responds to EOP, but nothing is moved)
                  TYPE_WRITE:         0x04,   // write to memory (move data FROM an I/O device; eg, reading a sector from a disk)
                  TYPE_READ:          0x08,   // read from memory (move data TO an I/O device; eg, writing a sector to a disk)
                  AUTOINIT:           0x10,
                  DECREMENT:          0x20,   // clear for INCREMENT
                  MODE:               0xC0,   // bits 6-7 select 1 of 4 possible transfer modes
                  MODE_DEMAND:        0x00,
                  MODE_SINGLE:        0x40,
                  MODE_BLOCK:         0x80,
                  MODE_CASCADE:       0xC0
              };
              
              ChipSet.DMA_REFRESH   = 0x00;   // DMA channel assigned to memory refresh
              ChipSet.DMA_FDC       = 0x02;   // DMA channel assigned to the Floppy Drive Controller (FDC)
              ChipSet.DMA_HDC       = 0x03;   // DMA channel assigned to the Hard Drive Controller (HDC; XTC only)
              
              /*
               * 8259A Programmable Interrupt Controller (PIC) I/O ports
               *
               * Internal registers:
               *
               *      ICW1    Initialization Command Word 1 (sent to port ChipSet.PIC_LO)
               *      ICW2    Initialization Command Word 2 (sent to port ChipSet.PIC_HI)
               *      ICW3    Initialization Command Word 3 (sent to port ChipSet.PIC_HI)
               *      ICW4    Initialization Command Word 4 (sent to port ChipSet.PIC_HI)
               *      IMR     Interrupt Mask Register
               *      IRR     Interrupt Request Register
               *      ISR     Interrupt Service Register
               *      IRLow   (IR having lowest priority; IR+1 will have highest priority; default is 7)
               *
               * Note that ICW2 effectively contains the starting IDT vector number (ie, for IRQ 0),
               * which must be multiplied by 4 to calculate the vector offset, since every vector is 4 bytes long.
               *
               * Also, since the low 3 bits of ICW2 are ignored in 8086/8088 mode (ie, they are effectively
               * treated as zeros), this means that the starting IDT vector can only be a multiple of 8.
               *
               * So, if ICW2 is set to 0x08, the starting vector number (ie, for IRQ 0) will be 0x08, and the
               * 4-byte address for the corresponding ISR will be located at offset 0x20 in the real-mode IDT.
               *
               * ICW4 is typically set to 0x09, indicating 8086 mode, non-automatic EOI, buffered/slave mode.
               *
               * TODO: Determine why the original ROM BIOS chose buffered/slave over buffered/master.
               * Did it simply not matter in pre-AT systems with only one PIC, or am I misreading something?
               *
               * TODO: Consider support for level-triggered PIC interrupts, even though the original IBM PCs
               * (up through MODEL_5170) used only edge-triggered interrupts.
               */
              ChipSet.PIC0 = {                // all models: the "master" PIC
                  INDEX:              0,
                  PORT_LO:            0x20,
                  PORT_HI:            0x21
              };
              
              ChipSet.PIC1 = {                // MODEL_5170 and up: the "slave" PIC
                  INDEX:              1,
                  PORT_LO:            0xA0,
                  PORT_HI:            0xA1
              };
              
              ChipSet.PIC_LO = {              // ChipSet.PIC1.PORT_LO or ChipSet.PIC2.PORT_LO
                  ICW1:               0x10,   // set means ICW1
                  ICW1_ICW4:          0x01,   // ICW4 needed (otherwise ICW4 must be sent)
                  ICW1_SNGL:          0x02,   // single PIC (and therefore no ICW3; otherwise there is another "cascaded" PIC)
                  ICW1_ADI:           0x04,   // call address interval is 4 (otherwise 8; presumably ignored in 8086/8088 mode)
                  ICW1_LTIM:          0x08,   // level-triggered interrupt mode (otherwise edge-triggered mode, which is what PCs use)
                  OCW2:               0x00,   // bit 3 (PIC_LO.OCW3) and bit 4 (ChipSet.PIC_LO.ICW1) are clear in an OCW2 command byte
                  OCW2_IR_LVL:        0x07,
                  OCW2_OP_MASK:       0xE0,   // of the following valid OCW2 operations, the first 4 are EOI commands (all have ChipSet.PIC_LO.OCW2_EOI set)
                  OCW2_EOI:           0x20,   // non-specific EOI (end-of-interrupt)
                  OCW2_EOI_SPEC:      0x60,   // specific EOI
                  OCW2_EOI_ROT:       0xA0,   // rotate on non-specific EOI
                  OCW2_EOI_ROTSPEC:   0xE0,   // rotate on specific EOI
                  OCW2_SET_ROTAUTO:   0x80,   // set rotate in automatic EOI mode
                  OCW2_CLR_ROTAUTO:   0x00,   // clear rotate in automatic EOI mode
                  OCW2_SET_PRI:       0xC0,   // bits 0-2 specify the lowest priority interrupt
                  OCW3:               0x08,   // bit 3 (PIC_LO.OCW3) is set and bit 4 (PIC_LO.ICW1) clear in an OCW3 command byte (bit 7 should be clear, too)
                  OCW3_READ_IRR:      0x02,   // read IRR register
                  OCW3_READ_ISR:      0x03,   // read ISR register
                  OCW3_READ_CMD:      0x03,
                  OCW3_POLL_CMD:      0x04,   // poll
                  OCW3_SMM_RESET:     0x40,   // special mask mode: reset
                  OCW3_SMM_SET:       0x60,   // special mask mode: set
                  OCW3_SMM_CMD:       0x60
              };
              
              ChipSet.PIC_HI = {              // ChipSet.PIC1.PORT_HI or ChipSet.PIC2.PORT_HI
                  ICW2_VECTOR:        0xF8,   // starting vector number (bits 0-2 are effectively treated as zeros in 8086/8088 mode)
                  ICW4_8086:          0x01,
                  ICW4_AUTO_EOI:      0x02,
                  ICW4_MASTER:        0x04,
                  ICW4_BUFFERED:      0x08,
                  ICW4_FULLY_NESTED:  0x10,
                  OCW1_IMR:           0xFF
              };
              
              /*
               * The priorities of IRQs 0-7 are normally high to low, unless the master PIC has been reprogrammed.
               * Also, if a slave PIC is present, the priorities of IRQs 8-15 fall between the priorities of IRQs 1 and 3.
               *
               * As the MODEL_5170 TechRef states:
               *
               *      "Interrupt requests are prioritized, with IRQ9 through IRQ12 and IRQ14 through IRQ15 having the
               *      highest priority (IRQ9 is the highest) and IRQ3 through IRQ7 having the lowest priority (IRQ7 is
               *      the lowest).
               *
               *      Interrupt 13 (IRQ.COPROC) is used on the system board and is not available on the I/O channel.
               *      Interrupt 8 (IRQ.RTC) is used for the real-time clock."
               *
               * This priority scheme is a byproduct of IRQ8 through IRQ15 (slave PIC interrupts) being tied to IRQ2 of
               * the master PIC.  As a result, the two other system board interrupts, IRQ0 and IRQ1, continue to have the
               * highest priority, by default.
               */
              ChipSet.IRQ = {
                  TIMER0:             0x00,
                  KBD:                0x01,
                  SLAVE:              0x02,   // MODEL_5170
                  COM2:               0x03,
                  COM1:               0x04,
                  XTC:                0x05,   // MODEL_5160 uses IRQ 5 for HDC (XTC version)
                  LPT2:               0x05,   // MODEL_5170 uses IRQ 5 for LPT2
                  FDC:                0x06,
                  LPT1:               0x07,
                  RTC:                0x08,   // MODEL_5170
                  IRQ2:               0x09,   // MODEL_5170
                  COPROC:             0x0D,   // MODEL_5170
                  ATC:                0x0E    // MODEL_5170 uses IRQ 14 for HDC (ATC version)
              };
              
              /*
               * 8253 Programmable Interval Timer (PIT) I/O ports
               *
               * Although technically, a PIT provides 3 "counters" rather than 3 "timers", we have
               * adopted IBM's TechRef nomenclature, which refers to the PIT's counters as TIMER0,
               * TIMER1, and TIMER2.  For machines with a second PIT (eg, the DeskPro 386), we refer
               * to those additional counters as TIMER3, TIMER4, and TIMER5.
               *
               * In addition, if there's a need to refer to a specfic PIT, use PIT0 for the first PIT
               * and PIT1 for the second.  This mirrors how we refer to multiple DMA controllers
               * (eg, DMA0 and DMA1) and multiple PICs (eg, PIC0 and PIC1).
               *
               * This differs from Compaq's nomenclature, which used "Timer 1" to refer to the first
               * PIT, and "Timer 2" for the second PIT, and then referred to "Counter 0", "Counter 1",
               * and "Counter 2" within each PIT.
               */
              ChipSet.PIT0 = {
                  PORT:               0x40,
                  TIMER0:             0,      // used for time-of-day (prior to MODEL_5170)
                  TIMER1:             1,      // used for memory refresh
                  TIMER2:             2       // used for speaker tone generation
              };
              
              ChipSet.PIT1 = {
                  PORT:               0x48,   // MODEL_DESKPRO386 only
                  TIMER3:             0,      // used for fail-safe clock
                  TIMER4:             1,      // N/A
                  TIMER5:             2       // used for refresher request extend/speed control
              };
              
              ChipSet.PIT_CTRL = {
                  PORT1:              0x43,   // write-only control register (use the Read-Back command to get status)
                  PORT2:              0x4B,   // write-only control register (use the Read-Back command to get status)
                  BCD:                0x01,
                  MODE:               0x0E,
                  MODE0:              0x00,   // interrupt on Terminal Count (TC)
                  MODE1:              0x02,   // programmable one-shot
                  MODE2:              0x04,   // rate generator
                  MODE3:              0x06,   // square wave generator
                  MODE4:              0x08,   // software-triggered strobe
                  MODE5:              0x0A,   // hardware-triggered strobe
                  RW:                 0x30,
                  RW_LATCH:           0x00,
                  RW_LSB:             0x10,
                  RW_MSB:             0x20,
                  RW_BOTH:            0x30,
                  SC:                 0xC0,
                  SC_CTR0:            0x00,
                  SC_CTR1:            0x40,
                  SC_CTR2:            0x80,
                  SC_BACK:            0xC0
              };
              
              ChipSet.TIMER_TICKS_PER_SEC = 1193181;
              
              /*
               * 8255A Programmable Peripheral Interface (PPI) I/O ports, for Cassette/Speaker/Keyboard/SW1/etc
               *
               * Normally, 0x99 is written to PPI_CTRL.PORT, indicating that PPI_A.PORT and PPI_C.PORT are INPUT ports
               * and PPI_B.PORT is an OUTPUT port.
               *
               * However, the MODEL_5160 ROM BIOS initially writes 0x89 instead, making PPI_A.PORT an OUTPUT port.
               * I'm guessing that's just part of some "diagnostic mode", because all it writes to PPI_A.PORT are a series
               * of "checkpoint" values (ie, 0x01, 0x02, and 0x03) before updating PPI_CTRL.PORT with the usual 0x99.
               */
              ChipSet.PPI_A = {               // this.bPPIA (port 0x60)
                  PORT:               0x60    // INPUT: keyboard scan code (PPI_B.CLEAR_KBD must be clear)
              };
              
              ChipSet.PPI_B = {               // this.bPPIB (port 0x61)
                  PORT:               0x61,   // OUTPUT (although it has to be treated as INPUT, too: the keyboard interrupt handler reads it, OR's PPI_B.CLEAR_KBD, writes it, and then rewrites the original read value)
                  CLK_TIMER2:         0x01,   // ALL: set to enable clock to TIMER2
                  SPK_TIMER2:         0x02,   // ALL: set to connect output of TIMER2 to speaker (MODEL_5150: clear for cassette)
                  ENABLE_SW2:         0x04,   // MODEL_5150: set to enable SW2[1-4] through PPI_C.PORT, clear to enable SW2[5]; MODEL_5160: unused (there is no SW2 switch block on the MODEL_5160 motherboard)
                  CASS_MOTOR_OFF:     0x08,   // MODEL_5150: cassette motor off
                  ENABLE_SW_HI:       0x08,   // MODEL_5160: clear to read SW1[1-4], set to read SW1[5-8]
                  DISABLE_RW_MEM:     0x10,   // ALL: clear to enable RAM parity check, set to disable
                  DISABLE_IO_CHK:     0x20,   // ALL: clear to enable I/O channel check, set to disable
                  CLK_KBD:            0x40,   // ALL: clear to force keyboard clock low
                  CLEAR_KBD:          0x80    // ALL: clear to enable keyboard scan codes (MODEL_5150: set to enable SW1 through PPI_A.PORT)
              };
              
              ChipSet.PPI_C = {               // this.bPPIC (port 0x62)
                  PORT:               0x62,   // INPUT (see below)
                  SW:                 0x0F,   // MODEL_5150: SW2[1-4] or SW2[5], depending on whether PPI_B.ENABLE_SW2 is set or clear; MODEL_5160: SW1[1-4] or SW1[5-8], depending on whether PPI_B.ENABLE_SW_HI is clear or set
                  CASS_DATA_IN:       0x10,
                  TIMER2_OUT:         0x20,
                  IO_CHANNEL_CHK:     0x40,   // used by NMI handler to detect I/O channel errors
                  RW_PARITY_CHK:      0x80    // used by NMI handler to detect R/W memory parity errors
              };
              
              ChipSet.PPI_CTRL = {            // this.bPPICtrl (port 0x63)
                  PORT:               0x63,   // OUTPUT: initialized to 0x99, defining PPI_A and PPI_C as INPUT and PPI_B as OUTPUT
                  A_IN:               0x10,
                  B_IN:               0x02,
                  C_IN_LO:            0x01,
                  C_IN_HI:            0x08,
                  B_MODE:             0x04,
                  A_MODE:             0x60
              };
              
              /*
               * On the MODEL_5150, the following PPI_SW bits are exposed through PPI_A.
               *
               * On the MODEL_5160, either the low or high 4 bits are exposed through PPI_C.SW, if PPI_B.ENABLE_SW_HI is clear or set.
               */
              ChipSet.PPI_SW = {
                  FDRIVE: {
                      IPL:            0x01,   // MODEL_5150: IPL ("Initial Program Load") floppy drive attached; MODEL_5160: "Loop on POST"
                      ONE:            0x00,   // 1 floppy drive attached (or 0 drives if PPI_SW.FDRIVE_IPL is not set -- MODEL_5150 only)
                      TWO:            0x40,   // 2 floppy drives attached
                      THREE:          0x80,   // 3 floppy drives attached
                      FOUR:           0xC0,   // 4 floppy drives attached
                      MASK:           0xC0,
                      SHIFT:          6
                  },
                  COPROC:             0x02,   // MODEL_5150: reserved; MODEL_5160: coprocessor installed
                  MEMORY: {                   // MODEL_5150: "X" is 16Kb; MODEL_5160: "X" is 64Kb
                      X1:             0x00,   // 16Kb or 64Kb
                      X2:             0x04,   // 32Kb or 128Kb
                      X3:             0x08,   // 48Kb or 192Kb
                      X4:             0x0C,   // 64Kb or 256Kb
                      MASK:           0x0C,
                      SHIFT:          2
                  },
                  MONITOR: {
                      TV:             0x10,
                      COLOR:          0x20,
                      MONO:           0x30,
                      MASK:           0x30,
                      SHIFT:          4
                  }
              };
              
              /*
               * 8042 Keyboard Controller I/O ports (MODEL_5170)
               *
               * On the MODEL_5170, port 0x60 is designated KBC.DATA rather than PPI_A, although the BIOS also refers to it
               * as "PORT_A: 8042 KEYBOARD SCAN/DIAG OUTPUTS").  This is the 8042's output buffer and should be read only when
               * KBC.STATUS.OUTBUFF_FULL is set.
               *
               * Similarly, port 0x61 is designated KBC.RWREG rather than PPI_B; the BIOS also refers to it as "PORT_B: 8042
               * READ WRITE REGISTER", but it is not otherwise discussed in the MODEL_5170 TechRef's 8042 documentation.
               *
               * There are brief references to bits 0 and 1 (KBC.RWREG.CLK_TIMER2 and KBC.RWREG.SPK_TIMER2), and the BIOS sets
               * bits 2-7 to "DISABLE PARITY CHECKERS" (principally KBC.RWREG.DISABLE_NMI, which are bits 2 and 3); why the BIOS
               * also sets bits 4-7 (or if those bits are even settable) is unclear, since it uses 11111100b rather than defined
               * constants.
               *
               * The bottom line: on a MODEL_5170, port 0x61 is still used for speaker control and parity checking, so we use
               * the same register (bPPIB) but install different I/O handlers.  It's also bi-directional: at one point, the BIOS
               * reads KBC.RWREG.REFRESH_BIT (bit 4) to verify that it's alternating.
               *
               * PPI_C and PPI_CTRL don't seem to be documented or used by the MODEL_5170 BIOS, so I'm assuming they're obsolete.
               *
               * NOTE: For more information on the 8042 Controller, including information on undocumented commands, refer to the
               * documents in /devices/pc/keyboard, as well as the following websites:
               *
               *      http://halicery.com/8042/8042_INTERN_TXT.htm
               *      http://www.os2museum.com/wp/ibm-pcat-8042-keyboard-controller-commands/
               */
              ChipSet.KBC = {
                  DATA: {                     // this.b8042OutBuff (PPI_A on previous models, still referred to as "PORT A" by the MODEL_5170 BIOS)
                      PORT:           0x60,
                      CMD: {                  // this.b8042CmdData (KBC.DATA.CMD "data bytes" written to port 0x60, after writing a KBC.CMD byte to port 0x64)
                          INT_ENABLE: 0x01,   // generate an interrupt when the controller places data in the output buffer
                          SYS_FLAG:   0x04,   // this value is propagated to ChipSet.KBC.STATUS.SYS_FLAG
                          NO_INHIBIT: 0x08,   // disable inhibit function
                          NO_CLOCK:   0x10,   // disable keyboard by driving "clock" line low
                          PC_MODE:    0x20,
                          PC_COMPAT:  0x40    // generate IBM PC-compatible scan codes
                      },
                      SELF_TEST: {            // result of ChipSet.KBC.CMD.SELF_TEST command (0xAA)
                          OK:         0x55
                      },
                      INTF_TEST: {            // result of ChipSet.KBC.CMD.INTF_TEST command (0xAB)
                          OK:         0x00,   // no error
                          CLOCK_LO:   0x01,   // keyboard clock line stuck low
                          CLOCK_HI:   0x02,   // keyboard clock line stuck high
                          DATA_LO:    0x03,   // keyboard data line stuck low
                          DATA_HI:    0x04    // keyboard data line stuck high
                      }
                  },
                  INPORT: {                   // this.b8042InPort
                      COMPAQ_50MHZ:   0x01,   // 50Mhz system clock enabled (0=48Mhz); see Compaq 386/25 TechRef p2-106
                      UNDEFINED:      0x02,   // undefined
                      COMPAQ_NO80387: 0x04,   // 80387 coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
                      COMPAQ_NOWEITEK:0x08,   // Weitek coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
                      ENABLE_256KB:   0x10,   // enable 2nd 256Kb of system board RAM
                      COMPAQ_HISPEED: 0x10,   // high-speed enabled (0=auto); see Compaq 386/25 TechRef p2-106
                      MFG_OFF:        0x20,   // manufacturing jumper not installed
                      COMPAQ_DIP5OFF: 0x20,   // system board DIP switch #5 OFF (0=ON); see Compaq 386/25 TechRef p2-106
                      MONO:           0x40,   // monochrome monitor is primary display
                      COMPAQ_NONDUAL: 0x40,   // Compaq Dual-Mode monitor NOT installed; see Compaq 386/25 TechRef p2-106
                      KBD_UNLOCKED:   0x80    // keyboard not inhibited (in Compaq parlance: security lock is unlocked)
                  },
                  OUTPORT: {                  // this.b8042OutPort
                      NO_RESET:       0x01,   // set by default
                      A20_ON:         0x02,   // set by default
                      COMPAQ_SLOWD:   0x08,   // SL0WD* NOT asserted (refer to timer 2, counter 2); see Compaq 386/25 TechRef p2-105
                      OUTBUFF_FULL:   0x10,   // output buffer full
                      INBUFF_EMPTY:   0x20,   // input buffer empty
                      KBD_CLOCK:      0x40,   // keyboard clock (output)
                      KBD_DATA:       0x80    // keyboard data (output)
                  },
                  TESTPORT: {                 // generated "on the fly"
                      KBD_CLOCK:      0x01,   // keyboard clock (input)
                      KBD_DATA:       0x02    // keyboard data (input)
                  },
                  RWREG: {                    // this.bPPIB (since CLK_TIMER2 and SPK_TIMER2 are in both PPI_B and RWREG)
                      PORT:           0x61,
                      CLK_TIMER2:     0x01,   // set to enable clock to TIMER2 (R/W)
                      SPK_TIMER2:     0x02,   // set to connect output of TIMER2 to speaker (R/W)
                      COMPAQ_FSNMI:   0x04,   // set to disable RAM/FS NMI (R/W, DESKPRO386)
                      COMPAQ_IONMI:   0x08,   // set to disable IOCHK NMI (R/W, DESKPRO386)
                      DISABLE_NMI:    0x0C,   // set to disable IOCHK and RAM/FS NMI, clear to enable (R/W)
                      REFRESH_BIT:    0x10,   // 0 if RAM refresh occurring, 1 if RAM not in refresh cycle (R/O)
                      OUT_TIMER2:     0x20,   // state of TIMER2 output signal (R/O, DESKPRO386)
                      IOCHK_NMI:      0x40,   // IOCHK NMI (R/O); to reset, pulse bit 3 (0x08)
                      RAMFS_NMI:      0x80,   // RAM/FS (parity or fail-safe) NMI (R/O); to reset, pulse bit 2 (0x04)
                      NMI_ERROR:      0xC0
                  },
                  CMD: {                      // this.b8042InBuff (on write to port 0x64, interpret this as a CMD)
                      PORT:           0x64,
                      READ_CMD:       0x20,   // sends the current CMD byte (this.b8042CmdData) to KBC.DATA.PORT
                      WRITE_CMD:      0x60,   // followed by a command byte written to KBC.DATA.PORT (see KBC.DATA.CMD)
                      COMPAQ_SLOWD:   0xA3,   // enable system slow down; see Compaq 386/25 TechRef p2-111
                      COMPAQ_TOGGLE:  0xA4,   // toggle speed-control bit; see Compaq 386/25 TechRef p2-111
                      COMPAQ_SPCREAD: 0xA5,   // special read of "port 2"; see Compaq 386/25 TechRef p2-111
                      SELF_TEST:      0xAA,   // self-test (KBC.DATA.SELF_TEST.OK is placed in the output buffer if no errors)
                      INTF_TEST:      0xAB,   // interface test
                      DIAG_DUMP:      0xAC,   // diagnostic dump
                      DISABLE_KBD:    0xAD,   // disable keyboard
                      ENABLE_KBD:     0xAE,   // enable keyboard
                      READ_INPORT:    0xC0,   // read input port and place data in output buffer (use only if output buffer empty)
                      READ_OUTPORT:   0xD0,   // read output port and place data in output buffer (use only if output buffer empty)
                      WRITE_OUTPORT:  0xD1,   // next byte written to KBC.DATA.PORT (port 0x60) is placed in the output port (see KBC.OUTPORT)
                      READ_TEST:      0xE0,
                      PULSE_OUTPORT:  0xF0    // this is the 1st of 16 commands (0xF0-0xFF) that pulse bits 0-3 of the output port
                  },
                  STATUS: {                   // this.b8042Status (on read from port 0x64)
                      PORT:           0x64,
                      OUTBUFF_FULL:   0x01,
                      INBUFF_FULL:    0x02,   // set if the controller has received but not yet read data from the input buffer (not normally set)
                      SYS_FLAG:       0x04,
                      CMD_FLAG:       0x08,   // set on write to KBC.CMD (port 0x64), clear on write to KBC.DATA (port 0x60)
                      NO_INHIBIT:     0x10,   // (in Compaq parlance: security lock not engaged)
                      XMT_TIMEOUT:    0x20,
                      RCV_TIMEOUT:    0x40,
                      PARITY_ERR:     0x80,   // last byte of data received had EVEN parity (ODD parity is normally expected)
                      OUTBUFF_DELAY:  0x100
                  }
              };
              
              /*
               * MC146818A RTC/CMOS Ports (MODEL_5170)
               *
               * Write a CMOS address to ChipSet.CMOS.ADDR.PORT, then read/write data from/to ChipSet.CMOS.DATA.PORT.
               *
               * The ADDR port also controls NMI: write an address with bit 7 clear to enable NMI or set to disable NMI.
               */
              ChipSet.CMOS = {
                  ADDR: {                     // this.bCMOSAddr
                      PORT:           0x70,
                      RTC_SEC:        0x00,
                      RTC_SEC_ALRM:   0x01,
                      RTC_MIN:        0x02,
                      RTC_MIN_ALRM:   0x03,
                      RTC_HOUR:       0x04,
                      RTC_HOUR_ALRM:  0x05,
                      RTC_WEEK_DAY:   0x06,
                      RTC_MONTH_DAY:  0x07,
                      RTC_MONTH:      0x08,
                      RTC_YEAR:       0x09,
                      STATUSA:        0x0A,
                      STATUSB:        0x0B,
                      STATUSC:        0x0C,
                      STATUSD:        0x0D,
                      DIAG:           0x0E,
                      SHUTDOWN:       0x0F,
                      FDRIVE:         0x10,
                      HDRIVE:         0x12,
                      EQUIP:          0x14,
                      BASEMEM_LO:     0x15,
                      BASEMEM_HI:     0x16,   // the BASEMEM values indicate the total Kb of base memory, up to 0x280 (640Kb)
                      EXTMEM_LO:      0x17,
                      EXTMEM_HI:      0x18,   // the EXTMEM values indicate the total Kb of extended memory, up to 0x3C00 (15Mb)
                      CHKSUM_HI:      0x2E,
                      CHKSUM_LO:      0x2F,   // CMOS bytes included in the checksum calculation: 0x10-0x2D
                      EXTMEM2_LO:     0x30,
                      EXTMEM2_HI:     0x31,
                      CENTURY_DATE:   0x32,   // BCD value for the current century (eg, 0x19 for 20th century, 0x20 for 21st century)
                      BOOT_INFO:      0x33,   // 0x80 if 128Kb expansion memory installed, 0x40 if Setup Utility wants an initial setup message
                      MASK:           0x3F,
                      TOTAL:          0x40,
                      NMI_DISABLE:    0x80
                  },
                  DATA: {                     // this.abCMOSData
                      PORT:           0x71
                  },
                  STATUSA: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSA]
                      UIP:            0x80,   // bit 7: 1 indicates Update-In-Progress, 0 indicates date/time ready to read
                      DV:             0x70,   // bits 6-4 (DV2-DV0) are programmed to 010 to select a 32.768Khz time base
                      RS:             0x0F    // bits 3-0 (RS3-RS0) are programmed to 0110 to select a 976.562us interrupt rate
                  },
                  STATUSB: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSB]
                      SET:            0x80,   // bit 7: 1 to set any/all of the 14 time-bytes
                      PIE:            0x40,   // bit 6: 1 for Periodic Interrupt Enable
                      AIE:            0x20,   // bit 5: 1 for Alarm Interrupt Enable
                      UIE:            0x10,   // bit 4: 1 for Update Interrupt Enable
                      SQWE:           0x08,   // bit 3: 1 for Square Wave Enabled (as set by the STATUSA rate selection bits)
                      BINARY:         0x04,   // bit 2: 1 for binary Date Mode, 0 for BCD Date Mode
                      HOUR24:         0x02,   // bit 1: 1 for 24-hour mode, 0 for 12-hour mode
                      DST:            0x01    // bit 0: 1 for Daylight Savings Time enabled
                  },
                  STATUSC: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSC]
                      IRQF:           0x80,   // bit 7: 1 indicates one or more of the following bits (PF, AF, UF) are set
                      PF:             0x40,   // bit 6: 1 indicates Periodic Interrupt
                      AF:             0x20,   // bit 5: 1 indicates Alarm Interrupt
                      UF:             0x10,   // bit 4: 1 indicates Update Interrupt
                      RESERVED:       0x0F
                  },
                  STATUSD: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSD]
                      VRB:            0x80,   // bit 7: 1 indicates Valid RAM Bit (0 implies power was and/or is lost)
                      RESERVED:       0x7F
                  },
                  DIAG: {                     // abCMOSData[ChipSet.CMOS.ADDR.DIAG]
                      RTCFAIL:        0x80,   // bit 7: 1 indicates RTC lost power
                      CHKSUMFAIL:     0x40,   // bit 6: 1 indicates bad CMOS checksum
                      CONFIGFAIL:     0x20,   // bit 5: 1 indicates bad CMOS configuration info
                      MEMSIZEFAIL:    0x10,   // bit 4: 1 indicates memory size miscompare
                      HDRIVEFAIL:     0x08,   // bit 3: 1 indicates hard drive controller or drive init failure
                      TIMEFAIL:       0x04,   // bit 2: 1 indicates time failure
                      RESERVED:       0x03
                  },
                  FDRIVE: {                   // abCMOSData[ChipSet.CMOS.ADDR.FDRIVE]
                      D0_MASK:        0xF0,   // Drive 0 type in high nibble
                      D1_MASK:        0x0F,   // Drive 1 type in lower nibble
                      NONE:           0,      // no drive
                      /*
                       * There's at least one floppy drive type that IBM didn't bother defining a CMOS drive type for:
                       * single-sided drives that were only capable of storing 160Kb (or 180Kb when using 9 sectors/track).
                       * So, as you can see in getSWFloppyDriveType(), we lump all standard diskette capacities <= 360Kb
                       * into the FD360 bucket.
                       */
                      FD360:          1,      // 5.25-inch double-sided double-density (DSDD 48TPI) drive: 40 tracks, 9 sectors/track, 360Kb max
                      FD1200:         2,      // 5.25-inch double-sided high-density (DSHD 96TPI) drive: 80 tracks, 15 sectors/track, 1200Kb max
                      FD720:          3,      // 3.5-inch drive capable of storing 80 tracks and up to 9 sectors/track, 720Kb max
                      FD1440:         4       // 3.5-inch drive capable of storing 80 tracks and up to 18 sectors/track, 1440Kb max
                  },
                  /*
                   * HDRIVE types are defined by table in the HDC component, which uses setCMOSDriveType() to update the CMOS
                   */
                  HDRIVE: {                   // abCMOSData[ChipSet.CMOS.ADDR.HDRIVE]
                      D0_MASK:        0xF0,   // Drive 0 type in high nibble
                      D1_MASK:        0x0F    // Drive 1 type in lower nibble
                  },
                  /*
                   * The CMOS equipment flags use the same format as the older PPI equipment flags
                   */
                  EQUIP: {                    // abCMOSData[ChipSet.CMOS.ADDR.EQUIP]
                      MONITOR:        ChipSet.PPI_SW.MONITOR,         // PPI_SW.MONITOR.MASK == 0x30
                      COPROC:         ChipSet.PPI_SW.COPROC,          // PPI_SW.COPROC == 0x02
                      FDRIVE:         ChipSet.PPI_SW.FDRIVE           // PPI_SW.FDRIVE.IPL == 0x01 and PPI_SW.FDRIVE.MASK = 0xC0
                  }
              };
              
              /*
               * DMA Page Registers
               *
               * The MODEL_5170 TechRef lists 0x80-0x9F as the range for DMA page registers, but that may be a bit
               * overbroad.  There are a total of 8 (7 usable) DMA channels on the MODEL_5170, each of which has the
               * following assigned DMA page registers:
               *
               *      Channel #   Page Reg
               *      ---------   --------
               *          0         0x87
               *          1         0x83
               *          2         0x81
               *          3         0x82
               *          4         0x8F (not usable; the 5170 TechRef refers to this as the "Refresh" page register)
               *          5         0x8B
               *          6         0x89
               *          7         0x8A
               *
               * That leaves 0x80, 0x84, 0x85, 0x86, 0x88, 0x8C, 0x8D and 0x8E unaccounted for in the range 0x80-0x8F.
               * (I'm saving the question of what, if anything, is available in the range 0x90-0x9F for another day.)
               *
               * As for port 0x80, the TechRef says:
               *
               *      "I/O address hex 080 is used as a diagnostic-checkpoint port or register.
               *      This port corresponds to a read/write register in the DMA page register (74LS612)."
               *
               * so I used to have dedicated handlers and storage (bMFGData) for the register at port 0x80, but I've since
               * appended it to abDMAPageSpare, an 8-element array that captures all I/O to the 8 unassigned (aka "spare")
               * DMA page registers.  The 5170 BIOS uses 0x80 as a "checkpoint" register, and the DESKPRO386 uses 0x84 in a
               * similar fashion.  The 5170 also contains "MFG_TST" code that uses other unassigned DMA page registers as
               * scratch registers, which come in handy when RAM hasn't been tested/initialized yet.
               *
               * Here's our mapping of entries in the abDMAPageSpare array to the unassigned ("spare") DMA page registers:
               *
               *      Index #     Page Reg
               *      --------    --------
               *          0         0x84
               *          1         0x85
               *          2         0x86
               *          3         0x88
               *          4         0x8C
               *          5         0x8D
               *          6         0x8E
               *          7         0x80
               *
               * The only reason port 0x80 is out of sequence (ie, at the end of the array, at index 7 instead of index 0) is
               * because it was added the array later, and the entire array gets written to our save/restore data structures, so
               * reordering the elements would be a bad idea.
               */
              
              /*
               * NMI Mask Register (MODEL_5150 and MODEL_5160 only)
               */
              ChipSet.NMI = {                 // this.bNMI
                  PORT:               0xA0,
                  ENABLE:             0x80,
                  DISABLE:            0x00
              };
              
              /*
               * Coprocessor Control Registers (MODEL_5170)
               */
              ChipSet.COPROC = {              // TODO: Define a variable for this
                  PORT_CLEAR:         0xF0,   // clear the coprocessor's "busy" state
                  PORT_RESET:         0xF1    // reset the coprocessor
              };
              
              /**
               * @this {ChipSet}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "sw1")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              ChipSet.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  switch (sBinding) {
                      case "sw1":
                          this.bindings[sBinding] = control;
                          this.addSwitches(sBinding, control, 8, this.sw1Init, {
                              0: (this.model == ChipSet.MODEL_5150? "Bootable Floppy Drive" : "Loop on POST"),
                              1: (this.model == ChipSet.MODEL_5150? "Reserved" : "Coprocessor"),
                              2: "Base Memory Size",          // up to 64Kb on a MODEL_5150, 256Kb on a MODEL_5160
                              4: "Monitor Type",
                              6: "Number of Floppy Drives"
                          });
                          return true;
                      case "sw2":
                          if (this.model == ChipSet.MODEL_5150) {
                              this.bindings[sBinding] = control;
                              this.addSwitches(sBinding, control, 8, this.sw2Init, {
                                  0: "Expansion Memory Size", // up to 480Kb, which, when combined with 64Kb of MODEL_5150 base memory, gives a maximum of 544Kb
                                  4: "Reserved"
                              });
                              return true;
                          }
                          break;
                      case "swdesc":
                          this.bindings[sBinding] = control;
                          return true;
                      default:
                          break;
                  }
                  return false;
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {ChipSet}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.cmp = cmp;
                  this.kbd = cmp.getComponentByType("Keyboard");
                  /*
                   * This divisor is invariant, so we calculate it as soon as we're able to query the CPU's base speed.
                   */
                  this.nTicksDivisor = (cpu.getCyclesPerSecond() / ChipSet.TIMER_TICKS_PER_SEC);
              
                  bus.addPortInputTable(this, ChipSet.aPortInput);
                  bus.addPortOutputTable(this, ChipSet.aPortOutput);
                  if (this.model < ChipSet.MODEL_5170) {
                      bus.addPortInputTable(this, ChipSet.aPortInput5150);
                      bus.addPortOutputTable(this, ChipSet.aPortOutput5150);
                  } else {
                      bus.addPortInputTable(this, ChipSet.aPortInput5170);
                      bus.addPortOutputTable(this, ChipSet.aPortOutput5170);
                  }
                  if (DEBUGGER) {
                      if (dbg) {
                          var chipset = this;
                          /*
                           * TODO: Add more "dumpers" (eg, for DMA, RTC, 8042, etc)
                           */
                          dbg.messageDump(Messages.PIC, function onDumpPIC() {
                              chipset.dumpPIC();
                          });
                          dbg.messageDump(Messages.TIMER, function onDumpTimer() {
                              chipset.dumpTimer();
                          });
                          dbg.messageDump(Messages.CMOS, function onDumpCMOS() {
                              chipset.dumpCMOS();
                          });
                      }
                      cpu.addIntNotify(Interrupts.RTC.VECTOR, this, this.intBIOSRTC);
                  }
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {ChipSet}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              ChipSet.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data) {
                          this.reset();
                      } else {
                          if (!this.restore(data)) return false;
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {ChipSet}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              ChipSet.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * reset(fHard)
               *
               * @this {ChipSet}
               * @param {boolean} [fHard] true on the initial reset (not a normal "soft" reset)
               */
              ChipSet.prototype.reset = function(fHard)
              {
                  /*
                   * We propagate the sw1Init/sw2Init values to sw1/sw2 at reset; the user is only
                   * allowed to tweak sw1Init/sw2Init, which doesn't take effect until the next reset.
                   */
                  var i;
                  this.sw1 = this.sw1Init;
                  this.sw2 = this.sw2Init;
                  this.updateSwitchDesc();
              
                  /*
                   * DMA (Direct Memory Access) Controller initialization
                   */
                  this.aDMACs = new Array(this.cDMACs);
                  for (i = 0; i < this.cDMACs; i++) {
                      this.initDMAController(i);
                  }
              
                  /*
                   * PIC (Programmable Interupt Controller) initialization
                   */
                  this.aPICs = new Array(this.cPICs);
                  this.initPIC(ChipSet.PIC0.INDEX, ChipSet.PIC0.PORT_LO);
                  if (this.cPICs > 1) {
                      this.initPIC(ChipSet.PIC1.INDEX, ChipSet.PIC1.PORT_LO);
                  }
              
                  /*
                   * PIT (Programmable Interval Timer) initialization
                   *
                   * Although the DeskPro 386 refers to the timers in the first PIT as "Timer 1, Counter 0",
                   * "Timer 1, Counter 1" and "Timer 1, Counter 2", we're sticking with IBM's nomenclature:
                   * TIMER0, TIMER1 and TIMER2.  Which means that we refer to the "counters" in the second PIT
                   * as TIMER3, TIMER4 and TIMER5; that numbering also matches their indexes in the aTimers array.
                   */
                  this.bPIT1Ctrl = null;          // tracks writes to port 0x43
                  this.bPIT2Ctrl = null;          // tracks writes to port 0x4B (MODEL_DESKPRO386 only)
                  this.aTimers = new Array(this.model == ChipSet.MODEL_DESKPRO386? 6 : 3);
                  for (i = 0; i < this.aTimers.length; i++) {
                      this.initTimer(i);
                  }
              
                  /*
                   * PPI and other misc ports
                   */
                  this.bPPIA = null;              // tracks writes to port 0x60, in case PPI_CTRL.A_IN is not set
                  this.bPPIB = null;              // tracks writes to port 0x61, in case PPI_CTRL.B_IN is not set
                  this.bPPIC = null;              // tracks writes to port 0x62, in case PPI_CTRL.C_IN_LO or PPI_CTRL.C_IN_HI is not set
                  this.bPPICtrl = null;           // tracks writes to port 0x63 (eg, 0x99); read-only
                  this.bNMI = ChipSet.NMI.DISABLE;// tracks writes to the NMI Mask Register
              
                  /*
                   * ChipSet state introduced by the MODEL_5170
                   */
                  if (this.model >= ChipSet.MODEL_5170) {
                      /*
                       * The 8042 input buffer is treated as a "command byte" when written via port 0x64 and as a "data byte"
                       * when written via port 0x60.  So, whenever the KBC.CMD.WRITE_CMD "command byte" is written to the input
                       * buffer, the subsequent command data byte is saved in b8042CmdData.  Similarly, for KBC.CMD.WRITE_OUTPORT,
                       * the subsequent data byte is saved in b8042OutPort.
                       *
                       * TODO: Consider a UI for the Keyboard INHIBIT switch.  By default, our keyboard is never inhibited
                       * (ie, locked).  Also, note that the hardware changes this bit only when new data is sent to b8042OutBuff.
                       */
                      this.b8042Status = ChipSet.KBC.STATUS.NO_INHIBIT;
                      this.b8042InBuff = 0;
                      this.b8042CmdData = ChipSet.KBC.DATA.CMD.NO_CLOCK;
                      this.b8042OutBuff = 0;
              
                      /*
                       * TODO: Provide more control over these 8042 "Input Port" bits (eg, the keyboard lock)
                       */
                      this.b8042InPort = ChipSet.KBC.INPORT.MFG_OFF | ChipSet.KBC.INPORT.KBD_UNLOCKED;
              
                      if (this.getSWMemorySize() >= 512) {
                          this.b8042InPort |= ChipSet.KBC.INPORT.ENABLE_256KB;
                      }
              
                      if (this.getSWVideoMonitor() == ChipSet.MONITOR.MONO) {
                          this.b8042InPort |= ChipSet.KBC.INPORT.MONO;
                      }
              
                      if (COMPAQ386 && this.model == ChipSet.MODEL_DESKPRO386) {
                          this.b8042InPort |= ChipSet.KBC.INPORT.COMPAQ_NO80387 | ChipSet.KBC.INPORT.COMPAQ_NOWEITEK;
                      }
              
                      this.b8042OutPort = ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON;
              
                      this.abDMAPageSpare = new Array(8);
              
                      this.bCMOSAddr = 0;         // NMI is enabled, since the ChipSet.CMOS.ADDR.NMI_DISABLE bit is not set in bCMOSAddr
              
                      /*
                       * Now that we call reset() from the ChipSet constructor, enabling other components to update
                       * their own CMOS information as needed, we must distinguish between the initial ("hard") reset
                       * and any later ("soft") resets (eg, from powerUp() calls), and make sure the latter preserves
                       * existing CMOS information.
                       */
                      if (fHard) {
                          this.abCMOSData = new Array(ChipSet.CMOS.ADDR.TOTAL);
                      }
              
                      this.initRTCTime(this.sRTCDate);
              
                      /*
                       * initCMOSData() will initialize a variety of "legacy" CMOS bytes, but it will NOT overwrite any memory
                       * size or hard drive type information that might have been set, via addCMOSMemory() or setCMOSDriveType().
                       */
                      this.initCMOSData();
                  }
              
                  if (DEBUGGER && MAXDEBUG) {
                      /*
                       * Arrays for interrupt counts (one count per IRQ) and timer data
                       */
                      this.acInterrupts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
                      this.acTimersFired = [0, 0, 0];
                      this.acTimer0Counts = [];
                  }
              };
              
              /**
               * initRTCTime(sDate)
               *
               * Initialize the RTC portion of the CMOS registers to match the specified date/time (or if none is specified,
               * the current date/time).  The date/time should be expressed in the ISO 8601 format; eg: "2011-10-10T14:48:00".
               *
               * NOTE: There are two approaches we could take here: always store the RTC bytes in binary, and convert them
               * to/from BCD on-demand (ie, as the simulation reads/writes the CMOS RTC registers); or init/update them in the
               * format specified by CMOS.STATUSB.BINARY (1 for binary, 0 for BCD).  Both approaches require BCD conversion
               * functions, but the former seems more efficient, in part because the periodic calls to updateRTCTime() won't
               * require any conversions.
               *
               * We take the same approach with the CMOS.STATUSB.HOUR24 setting: internally, we always operate in 24-hour mode,
               * but externally, we convert the RTC hour values to the 12-hour format as needed.
               *
               * Thus, all I/O to the RTC bytes must be routed through the getRTCByte() and setRTCByte() functions, to ensure
               * that all the necessary on-demand conversions occur.
               *
               * @this {ChipSet}
               * @param {string} [sDate]
               */
              ChipSet.prototype.initRTCTime = function(sDate)
              {
                  /*
                   * NOTE: I've already been burned once by a JavaScript library function that did NOT treat an undefined
                   * parameter (ie, a parameter === undefined) the same as an omitted parameter (eg, the async parameter in
                   * xmlHTTP.open() in IE), so I'm taking no chances here: if sDate is undefined, then explicitly call Date()
                   * with no parameters.
                   */
                  var date = sDate? new Date(sDate) : new Date();
              
                  /*
                   * Example of a valid Date string:
                   *
                   *      2014-10-01T08:00:00 (interpreted as GMT, resulting in "Wed Oct 01 2014 01:00:00 GMT-0700 (PDT)")
                   *
                   * Examples of INVALID Date strings:
                   *
                   *      2014-10-01T08:00:00PST
                   *      2014-10-01T08:00:00-0700 (actually, this DOES work in Chrome, but NOT in Safari)
                   *
                   * In the case of INVALID Date strings, the Date object is invalid, but there's no obvious test for an "invalid"
                   * object, so I've adapted the following test from StackOverflow.
                   *
                   * See http://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript
                   */
                  if (Object.prototype.toString.call(date) !== "[object Date]" || isNaN(date.getTime())) {
                      date = new Date();
                      this.println("CMOS date invalid (" + sDate + "), using " + date);
                  } else if (sDate) {
                      this.println("CMOS date: " + date);
                  }
              
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = date.getSeconds();
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM] = 0;
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = date.getMinutes();
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM] = 0;
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = date.getHours();
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM] = 0;
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = date.getDay() + 1;
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = date.getDate();
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = date.getMonth() + 1;
                  var nYear = date.getFullYear();
                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = nYear % 100;
                  var nCentury = (nYear / 100);
                  this.abCMOSData[ChipSet.CMOS.ADDR.CENTURY_DATE] = (nCentury % 10) | ((nCentury / 10) << 4);
              
                  this.abCMOSData[ChipSet.CMOS.ADDR.STATUSA] = 0x26;                          // hard-coded default; refer to ChipSet.CMOS.STATUSA.DV and ChipSet.CMOS.STATUSA.RS
                  this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] = ChipSet.CMOS.STATUSB.HOUR24;   // default to BCD mode (ChipSet.CMOS.STATUSB.BINARY not set)
                  this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] = 0x00;
                  this.abCMOSData[ChipSet.CMOS.ADDR.STATUSD] = ChipSet.CMOS.STATUSD.VRB;
              
                  this.nRTCCyclesLastUpdate = this.nRTCCyclesNextUpdate = 0;
                  this.nRTCPeriodsPerSecond = this.nRTCCyclesPerPeriod = null;
              };
              
              /**
               * getRTCByte(iRTC)
               *
               * @param {number} iRTC
               * @return {number} b
               */
              ChipSet.prototype.getRTCByte = function(iRTC)
              {
                  this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
              
                  var b = this.abCMOSData[iRTC];
              
                  if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
                      var f12HourValue = false;
                      if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
                          if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
                              if (b < 12) {
                                  b = (!b? 12 : b);
                              } else {
                                  b -= 12;
                                  b = (!b? 0x8c : b + 0x80);
                              }
                              f12HourValue = true;
                          }
                      }
                      if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
                          /*
                           * We're in BCD mode, so we must convert b from BINARY to BCD.  But first:
                           *
                           *      If b is a 12-hour value (ie, we're in 12-hour mode) AND the hour is a PM value
                           *      (ie, in the range 0x81-0x8C), then it must be adjusted to yield 81-92 in BCD.
                           *
                           *      AM hour values (0x01-0x0C) need no adjustment; they naturally convert to 01-12 in BCD.
                           */
                          if (f12HourValue && b > 0x80) {
                              b -= (0x81 - 81);
                          }
                          b = (b % 10) | ((b / 10) << 4);
                      }
                  } else {
                      if (iRTC == ChipSet.CMOS.ADDR.STATUSA) {
                          /*
                           * HACK: Perform a mindless toggling of the "Update-In-Progress" bit, so that it's flipped
                           * on the next read; this makes the MODEL_5170 BIOS ("POST2_RTCUP") happy.
                           */
                          this.abCMOSData[iRTC] ^= ChipSet.CMOS.STATUSA.UIP;
                      }
                  }
                  return b;
              };
              
              /**
               * setRTCByte(iRTC, b)
               *
               * @param {number} iRTC
               * @param {number} b proposed byte to write
               * @return {number} actual byte to write
               */
              ChipSet.prototype.setRTCByte = function(iRTC, b)
              {
                  this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
              
                  if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
                      var fBCD = false;
                      if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
                          /*
                           * We're in BCD mode, so we must convert b from BCD to BINARY (we assume it's valid
                           * BCD; ie, that both nibbles contain only 0-9, not A-F).
                           */
                          b = (b >> 4) * 10 + (b & 0xf);
                          fBCD = true;
                      }
                      if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
                          if (fBCD) {
                              /*
                               * If the original BCD hour was 0x81-0x92, then the previous BINARY-to-BCD conversion
                               * transformed it to 0x51-0x5C, so we must add 0x30.
                               */
                              if (b > 23) {
                                  this.assert(b >= 0x51 && b <= 0x5c);
                                  b += 0x30;
                              }
                          }
                          if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
                              if (b <= 12) {
                                  b = (b == 12? 0 : b);
                              } else {
                                  b -= (0x80 - 12);
                                  b = (b == 24? 12 : b);
                              }
                          }
                      }
                  }
                  return b;
              };
              
              /**
               * calcRTCCyclePeriod()
               *
               * This should be called whenever the timings in STATUSA may have changed.
               *
               * TODO: 1024 is a hard-coded number of periods per second based on the default interrupt rate of 976.562us
               * (ie, 1000000 / 976.562).  Calculate the actual number based on the values programmed in the STATUSA register.
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.calcRTCCyclePeriod = function()
              {
                  this.nRTCCyclesLastUpdate = this.cpu.getCycles(this.fScaleTimers);
                  this.nRTCPeriodsPerSecond = 1024;
                  this.nRTCCyclesPerPeriod = Math.floor(this.cpu.getCyclesPerSecond() / this.nRTCPeriodsPerSecond);
                  this.setRTCCycleLimit();
              };
              
              /**
               * getRTCCycleLimit(nCycles)
               *
               * This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
               *
               * @this {ChipSet}
               * @param {number} nCycles desired
               * @return {number} maximum number of cycles (<= nCycles)
               */
              ChipSet.prototype.getRTCCycleLimit = function(nCycles)
              {
                  if (this.abCMOSData && this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                      var nCyclesUpdate = this.nRTCCyclesNextUpdate - this.cpu.getCycles(this.fScaleTimers);
                      if (nCyclesUpdate > 0) {
                          if (nCycles > nCyclesUpdate) {
                              if (DEBUG && this.messageEnabled(Messages.RTC)) {
                                  this.printMessage("getRTCCycleLimit(" + nCycles + "): reduced to " + nCyclesUpdate + " cycles", true);
                              }
                              nCycles = nCyclesUpdate;
                          } else {
                              if (DEBUG && this.messageEnabled(Messages.RTC)) {
                                  this.printMessage("getRTCCycleLimit(" + nCycles + "): already less than " + nCyclesUpdate + " cycles", true);
                              }
                          }
                      } else {
                          if (DEBUG && this.messageEnabled(Messages.RTC)) {
                              this.printMessage("RTC next update has passed by " + nCyclesUpdate + " cycles", true);
                          }
                      }
                  }
                  return nCycles;
              };
              
              /**
               * setRTCCycleLimit(nCycles)
               *
               * This should be called when PIE becomes set in STATUSB (and whenever PF is cleared in STATUSC while PIE is still set).
               *
               * @this {ChipSet}
               * @param {number} [nCycles]
               */
              ChipSet.prototype.setRTCCycleLimit = function(nCycles)
              {
                  if (nCycles === undefined) nCycles = this.nRTCCyclesPerPeriod;
                  this.nRTCCyclesNextUpdate = this.cpu.getCycles(this.fScaleTimers) + nCycles;
                  if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                      this.cpu.setBurstCycles(nCycles);
                  }
              };
              
              /**
               * updateRTCTime()
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.updateRTCTime = function()
              {
                  var nCyclesPerSecond = this.cpu.getCyclesPerSecond();
                  var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
              
                  /*
                   * We must arrange for the very first calcRTCCyclePeriod() call to occur here, on the very first
                   * updateRTCTime() call, because this is the first point we can be guaranteed that CPU cycle counts
                   * are initialized (the CPU is the last component to be powered up/restored).
                   *
                   * TODO: A side-effect of this is that it undermines the save/restore code's preservation of last
                   * and next RTC cycle counts, which may affect when the next RTC event is delivered.
                   */
                  if (this.nRTCCyclesPerPeriod == null) this.calcRTCCyclePeriod();
              
                  /*
                   * Step 1: Deal with Periodic Interrupts
                   */
                  if (nCyclesUpdate >= this.nRTCCyclesNextUpdate) {
                      var bPrev = this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC];
                      this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.PF;
                      if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                          /*
                           * When PIE is set, setBurstCycles() should be getting called as needed to ensure
                           * that updateRTCTime() is called more frequently, so let's assert that we don't have
                           * an excess of cycles and thus possibly some missed Periodic Interrupts.
                           */
                          if (DEBUG) {
                              if (nCyclesUpdate - this.nRTCCyclesNextUpdate > this.nRTCCyclesPerPeriod) {
                                  if (bPrev & ChipSet.CMOS.STATUSC.PF) {
                                      this.printMessage("RTC interrupt handler failed to clear STATUSC", Messages.RTC);
                                  } else {
                                      this.printMessage("CPU took too long trigger new RTC periodic interrupt", Messages.RTC);
                                  }
                              }
                          }
                          this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                          this.setIRR(ChipSet.IRQ.RTC);
                          /*
                           * We could also call setRTCCycleLimit() at this point, but I don't think there's any
                           * benefit until the interrupt had been acknowledged and STATUSC has been read, thereby
                           * clearing the way for another Periodic Interrupt; it seems to me that when STATUSC
                           * is read, that's the more appropriate time to call setRTCCycleLimit().
                           */
                      }
                      this.nRTCCyclesNextUpdate = nCyclesUpdate + this.nRTCCyclesPerPeriod;
                  }
              
                  /*
                   * Step 2: Deal with Alarm Interrupts
                   */
                  if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM]) {
                      if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM]) {
                          if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM]) {
                              this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.AF;
                              if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.AIE) {
                                  this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                                  this.setIRR(ChipSet.IRQ.RTC);
                              }
                          }
                      }
                  }
              
                  /*
                   * Step 3: Update the RTC date/time and deal with Update Interrupts
                   */
                  var nCyclesDelta = nCyclesUpdate - this.nRTCCyclesLastUpdate;
                  this.assert(nCyclesDelta >= 0);
                  var nSecondsDelta = Math.floor(nCyclesDelta / nCyclesPerSecond);
              
                  /*
                   * We trust that updateRTCTime() is being called as part of updateAllTimers(), and is therefore
                   * being called often enough to ensure that nSecondsDelta will never be greater than one.  In fact,
                   * it would always be LESS than one if it weren't also for the fact that we plow any "unused" cycles
                   * (nCyclesDelta % nCyclesPerSecond) back into nRTCCyclesLastUpdate, so that we will eventually
                   * see a one-second delta.
                   */
                  this.assert(nSecondsDelta <= 1);
              
                  /*
                   * Make sure that CMOS.STATUSB.SET isn't set; if it is, then the once-per-second RTC updates must be
                   * disabled so that software can write new RTC date/time values without interference.
                   */
                  if (nSecondsDelta && !(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.SET)) {
                      while (nSecondsDelta--) {
                          if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] >= 60) {
                              this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = 0;
                              if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] >= 60) {
                                  this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = 0;
                                  if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] >= 24) {
                                      this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = 0;
                                      this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] % 7) + 1;
                                      var nDayMax = usr.getMonthDays(this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH], this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR]);
                                      if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] > nDayMax) {
                                          this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = 1;
                                          if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] > 12) {
                                              this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = 1;
                                              this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] + 1) % 100;
                                          }
                                      }
                                  }
                              }
                          }
                      }
                      this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.UF;
                      if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.UIE) {
                          this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                          this.setIRR(ChipSet.IRQ.RTC);
                      }
                  }
              
                  this.nRTCCyclesLastUpdate = nCyclesUpdate - (nCyclesDelta % nCyclesPerSecond);
              };
              
              /**
               * initCMOSData()
               *
               * Initialize all the CMOS configuration bytes in the range 0x0E-0x2F (TODO: Decide what to do about 0x30-0x3F)
               *
               * Note that the MODEL_5170 "SETUP" utility is normally what sets all these bytes, including the checksum, and then
               * the BIOS verifies it, but since we want our machines to pass BIOS verification "out of the box", we go the extra
               * mile here, even though it's not really our responsibility.
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.initCMOSData = function()
              {
                  /*
                   * On all reset() calls, the RAM component(s) will (re)add their totals, so we have to make sure that
                   * the addition always starts with 0.  That also means that ChipSet must always be initialized before RAM.
                   */
                  var iCMOS;
                  for (iCMOS = ChipSet.CMOS.ADDR.BASEMEM_LO; iCMOS <= ChipSet.CMOS.ADDR.EXTMEM_HI; iCMOS++) {
                      this.abCMOSData[iCMOS] = 0;
                  }
              
                  /*
                   * Make sure all the "checksummed" CMOS bytes are initialized (not just the handful we set below) to ensure
                   * that the checksum will be valid.
                   */
                  for (iCMOS = ChipSet.CMOS.ADDR.DIAG; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
                      if (this.abCMOSData[iCMOS] === undefined) this.abCMOSData[iCMOS] = 0;
                  }
              
                  /*
                   * We propagate all compatible "legacy" SW1 bits to the CMOS.EQUIP byte using the old SW masks, but any further
                   * access to CMOS.ADDR.EQUIP should use the new CMOS_EQUIP flags (eg, CMOS.EQUIP.COPROC, CMOS.EQUIP.MONITOR.CGA80, etc).
                   */
                  this.abCMOSData[ChipSet.CMOS.ADDR.EQUIP] = this.sw1 & (ChipSet.PPI_SW.MONITOR.MASK | ChipSet.PPI_SW.COPROC | ChipSet.PPI_SW.FDRIVE.IPL | ChipSet.PPI_SW.FDRIVE.MASK);
                  this.abCMOSData[ChipSet.CMOS.ADDR.FDRIVE] = (this.getSWFloppyDriveType(0) << 4) | this.getSWFloppyDriveType(1);
              
                  /*
                   * The final step is calculating the CMOS checksum, which we then store into the CMOS as a courtesy, so that the
                   * user doesn't get unnecessary CMOS errors.
                   */
                  this.updateCMOSChecksum();
              };
              
              /**
               * setCMOSByte(iCMOS, b)
               *
               * This is ONLY for use by components that need to update CMOS configuration bytes to match their internal configuration.
               *
               * @this {ChipSet}
               * @param {number} iCMOS
               * @param {number} b
               * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
               */
              ChipSet.prototype.setCMOSByte = function(iCMOS, b)
              {
                  if (this.abCMOSData) {
                      this.assert(iCMOS >= ChipSet.CMOS.ADDR.FDRIVE && iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI);
                      this.abCMOSData[iCMOS] = b;
                      this.updateCMOSChecksum();
                      return true;
                  }
                  return false;
              };
              
              /**
               * addCMOSMemory(addr, size)
               *
               * For use by the RAM component, to dynamically update the CMOS memory configuration.
               *
               * @this {ChipSet}
               * @param {number} addr (if 0, BASEMEM_LO/BASEMEM_HI is updated; if >= 0x100000, then EXTMEM_LO/EXTMEM_HI is updated)
               * @param {number} size (in bytes; we convert to Kb)
               * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
               */
              ChipSet.prototype.addCMOSMemory = function(addr, size)
              {
                  if (this.abCMOSData) {
                      var iCMOS = (addr < 0x100000? ChipSet.CMOS.ADDR.BASEMEM_LO : ChipSet.CMOS.ADDR.EXTMEM_LO);
                      var wKb = this.abCMOSData[iCMOS] | (this.abCMOSData[iCMOS+1] << 8);
                      wKb += (size >> 10);
                      this.abCMOSData[iCMOS] = wKb & 0xff;
                      this.abCMOSData[iCMOS+1] = wKb >> 8;
                      this.updateCMOSChecksum();
                      return true;
                  }
                  return false;
              };
              
              /**
               * setCMOSDriveType(iDrive, bType)
               *
               * For use by the HDC component, to update the CMOS drive configuration to match HDC's internal configuration.
               *
               * TODO: Consider extending this to support FDC drive updates, so that the FDC can specify diskette drive types
               * (ie, FD360 or FD1200) in the same way that HDC does.  However, historically, the ChipSet has been responsible for
               * floppy drive configuration, at least in terms of *number* of drives, through the use of SW1 settings, and we've
               * continued that tradition with the addition of the ChipSet 'floppies' parameter, which allows both the number *and*
               * capacity of drives to be specified with a simple array (eg, [360, 360] for two 360Kb drives).
               *
               * @this {ChipSet}
               * @param {number} iDrive
               * @param {number} bType
               * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
               */
              ChipSet.prototype.setCMOSDriveType = function(iDrive, bType)
              {
                  if (this.abCMOSData) {
                      var b = this.abCMOSData[ChipSet.CMOS.ADDR.HDRIVE];
                      this.assert(bType > 0 && bType < 0xf);
                      if (iDrive) {
                          b = (b & ChipSet.CMOS.HDRIVE.D0_MASK) | bType;
                      } else {
                          b = (b & ChipSet.CMOS.HDRIVE.D1_MASK) | (bType << 4);
                      }
                      this.setCMOSByte(ChipSet.CMOS.ADDR.HDRIVE, b);
                      return true;
                  }
                  return false;
              };
              
              /**
               * updateCMOSChecksum()
               *
               * This sums all the CMOS bytes from 0x10-0x2D, creating a 16-bit checksum.  That's a total of 30 (unsigned) 8-bit
               * values which could sum to at most 30*255 or 7650 (0x1DE2).  Since there's no way that can overflow 16 bits, we don't
               * worry about masking it with 0xffff.
               *
               * WARNING: The IBM PC AT TechRef, p.1-53 (p.75) claims that the checksum is on bytes 0x10-0x20, but that's simply wrong.
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.updateCMOSChecksum = function()
              {
                  var wChecksum = 0;
                  for (var iCMOS = ChipSet.CMOS.ADDR.FDRIVE; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
                      wChecksum += this.abCMOSData[iCMOS];
                  }
                  this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_LO] = wChecksum & 0xff;
                  this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_HI] = wChecksum >> 8;
              };
              
              /**
               * save()
               *
               * @this {ChipSet}
               * @return {Object}
               *
               * This implements save support for the ChipSet component.
               */
              ChipSet.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, [this.sw1Init, this.sw2Init, this.sw1, this.sw2]);
                  state.set(1, [this.saveDMAControllers()]);
                  state.set(2, [this.savePICs()]);
                  state.set(3, [this.bPIT1Ctrl, this.saveTimers(), this.bPIT2Ctrl]);
                  state.set(4, [this.bPPIA, this.bPPIB, this.bPPIC, this.bPPICtrl, this.bNMI]);
                  if (this.model >= ChipSet.MODEL_5170) {
                      state.set(5, [this.b8042Status, this.b8042InBuff, this.b8042CmdData,
                                    this.b8042OutBuff, this.b8042InPort, this.b8042OutPort]);
                      state.set(6, [this.abDMAPageSpare[7], this.abDMAPageSpare, this.bCMOSAddr, this.abCMOSData, this.nRTCCyclesLastUpdate, this.nRTCCyclesNextUpdate]);
                  }
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * @this {ChipSet}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               *
               * This implements restore support for the ChipSet component.
               */
              ChipSet.prototype.restore = function(data)
              {
                  var a, i;
                  a = data[0];
                  this.sw1Init = a[0];
                  this.sw2Init = a[1];
                  this.sw1 = a[2];
                  this.sw2 = a[3];
              
                  a = data[1];
                  for (i = 0; i < this.cDMACs; i++) {
                      this.initDMAController(i, a.length == 1? a[0][i] : a);
                  }
              
                  a = data[2];
                  for (i = 0; i < this.cPICs; i++) {
                      this.initPIC(i, i === 0? ChipSet.PIC0.PORT_LO : ChipSet.PIC1.PORT_LO, a[0][i]);
                  }
              
                  a = data[3];
                  this.bPIT1Ctrl = a[0];
                  this.bPIT2Ctrl = a[2];
                  for (i = 0; i < this.aTimers.length; i++) {
                      this.initTimer(i, a[1][i]);
                  }
              
                  a = data[4];
                  this.bPPIA = a[0];
                  this.bPPIB = a[1];
                  this.bPPIC = a[2];
                  this.bPPICtrl = a[3];
                  this.bNMI  = a[4];
              
                  a = data[5];
                  if (a) {
                      this.assert(this.model >= ChipSet.MODEL_5170);
                      this.b8042Status = a[0];
                      this.b8042InBuff = a[1];
                      this.b8042CmdData = a[2];
                      this.b8042OutBuff = a[3];
                      this.b8042InPort = a[4];
                      this.b8042OutPort = a[5];
                  }
              
                  a = data[6];
                  if (a) {
                      this.assert(this.model >= ChipSet.MODEL_5170);
                      this.abDMAPageSpare = a[1];
                      this.abDMAPageSpare[7] = a[0];  // formerly bMFGData
                      this.bCMOSAddr = a[2];
                      this.abCMOSData = a[3];
                      this.nRTCCyclesLastUpdate = a[4];
                      this.nRTCCyclesNextUpdate = a[5];
                      /*
                       * TODO: Decide whether restore() should faithfully preserve the RTC date/time that save() saved,
                       * or always reinitialize the date/time, or give the user (or the machine configuration) the option.
                       *
                       * For now, we're always reinitializing the RTC date.  Alternatively, we could selectively update
                       * the CMOS bytes above, instead of overwriting them all, in which case this extra call to initRTCTime()
                       * could be avoided.
                       */
                      this.initRTCTime();
                  }
                  return true;
              };
              
              ChipSet.aDMAControllerInit = [0, null, null, 0, new Array(4)];
              
              /**
               * initDMAController(iDMAC, aState)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {Array} [aState]
               */
              ChipSet.prototype.initDMAController = function(iDMAC, aState)
              {
                  var controller = this.aDMACs[iDMAC];
                  if (!controller) {
                      this.assert(!aState);
                      controller = {
                          aChannels: new Array(4)
                      };
                  }
                  var a = aState && aState.length == 5? aState : ChipSet.aDMAControllerInit;
                  controller.bStatus = a[0];
                  controller.bCmd = a[1];
                  controller.bReq = a[2];
                  controller.bIndex = a[3];
                  controller.nChannelBase = iDMAC << 2;
                  for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                      this.initDMAChannel(controller, iChannel, a[4][iChannel]);
                  }
                  this.aDMACs[iDMAC] = controller;
              };
              
              ChipSet.aDMAChannelInit = [true, [0,0], [0,0], [0,0], [0,0]];
              
              /**
               * initDMAChannel(controller, iChannel, aState)
               *
               * @this {ChipSet}
               * @param {Object} controller
               * @param {number} iChannel
               * @param {Array} [aState]
               */
              ChipSet.prototype.initDMAChannel = function(controller, iChannel, aState)
              {
                  var channel = controller.aChannels[iChannel];
                  if (!channel) {
                      this.assert(!aState);
                      channel = {
                          addrInit: [0,0],
                          countInit: [0,0],
                          addrCurrent: [0,0],
                          countCurrent: [0,0]
                      };
                  }
                  var a = aState && aState.length == 8? aState : ChipSet.aDMAChannelInit;
                  channel.masked = a[0];
                  channel.addrInit[0] = a[1][0]; channel.addrInit[1] = a[1][1];
                  channel.countInit[0] = a[2][0];  channel.countInit[1] = a[2][1];
                  channel.addrCurrent[0] = a[3][0]; channel.addrCurrent[1] = a[3][1];
                  channel.countCurrent[0] = a[4][0]; channel.countCurrent[1] = a[4][1];
                  channel.mode = a[5];
                  channel.bPage = a[6];
                  // a[7] is deprecated
                  channel.controller = controller;
                  channel.iChannel = iChannel;
                  this.initDMAFunction(channel, a[8], a[9]);
                  controller.aChannels[iChannel] = channel;
              };
              
              /**
               * initDMAFunction(channel)
               *
               * @param {Object} channel
               * @param {Component|string} [component]
               * @param {string} [sFunction]
               * @param {Object} [obj]
               * @return {*}
               */
              ChipSet.prototype.initDMAFunction = function(channel, component, sFunction, obj)
              {
                  if (typeof component == "string") {
                      component = Component.getComponentByID(component);
                  }
                  if (component) {
                      channel.done = null;
                      channel.sDevice = component.id;
                      channel.sFunction = sFunction;
                      channel.component = component;
                      channel.fnTransfer = component[sFunction];
                      channel.obj = obj;
                  }
                  return channel.fnTransfer;
              };
              
              /**
               * saveDMAControllers()
               *
               * @this {ChipSet}
               * @return {Array}
               */
              ChipSet.prototype.saveDMAControllers = function()
              {
                  var data = [];
                  for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
                      var controller = this.aDMACs[iDMAC];
                      data[iDMAC] = [
                          controller.bStatus,
                          controller.bCmd,
                          controller.bReq,
                          controller.bIndex,
                          this.saveDMAChannels(controller)
                      ];
                  }
                  return data;
              };
              
              /**
               * saveDMAChannels(controller)
               *
               * @this {ChipSet}
               * @param {Object} controller
               * @return {Array}
               */
              ChipSet.prototype.saveDMAChannels = function(controller)
              {
                  var data = [];
                  for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                      var channel = controller.aChannels[iChannel];
                      data[iChannel] = [
                          channel.masked,
                          channel.addrInit,
                          channel.countInit,
                          channel.addrCurrent,
                          channel.countCurrent,
                          channel.mode,
                          channel.bPage,
                          channel.sDevice,
                          channel.sFunction
                      ];
                  }
                  return data;
              };
              
              ChipSet.aPICInit = [0, new Array(4)];
              
              /**
               * initPIC(iPIC, port, aState)
               *
               * @this {ChipSet}
               * @param {number} iPIC
               * @param {number} port
               * @param {Array} [aState]
               */
              ChipSet.prototype.initPIC = function(iPIC, port, aState)
              {
                  var pic = this.aPICs[iPIC];
                  if (!pic) {
                      pic = {
                          aICW:   [null,null,null,null]
                      };
                  }
                  var a = aState && aState.length == 8? aState : ChipSet.aPICInit;
                  pic.port = port;
                  pic.nIRQBase = iPIC << 3;
                  pic.nDelay = a[0];
                  pic.aICW[0] = a[1][0]; pic.aICW[1] = a[1][1]; pic.aICW[2] = a[1][2]; pic.aICW[3] = a[1][3];
                  pic.nICW = a[2];
                  pic.bIMR = a[3];
                  pic.bIRR = a[4];
                  pic.bISR = a[5];
                  pic.bIRLow = a[6];
                  pic.bOCW3 = a[7];
                  this.aPICs[iPIC] = pic;
              };
              
              /**
               * savePICs()
               *
               * @this {ChipSet}
               * @return {Array}
               */
              ChipSet.prototype.savePICs = function()
              {
                  var data = [];
                  for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
                      var pic = this.aPICs[iPIC];
                      data[iPIC] = [
                          pic.nDelay,
                          pic.aICW,
                          pic.nICW,
                          pic.bIMR,
                          pic.bIRR,
                          pic.bISR,
                          pic.bIRLow,
                          pic.bOCW3
                      ];
                  }
                  return data;
              };
              
              ChipSet.aTimerInit = [[0,0], [0,0], [0,0], [0,0]];
              
              /**
               * initTimer(iTimer, aState)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @param {Array} [aState]
               */
              ChipSet.prototype.initTimer = function(iTimer, aState)
              {
                  var timer = this.aTimers[iTimer];
                  if (!timer) {
                      timer = {
                          countInit: [0,0],
                          countStart: [0,0],
                          countCurrent: [0,0],
                          countLatched: [0,0]
                      };
                  }
                  var a = aState && aState.length == 13? aState : ChipSet.aTimerInit;
                  timer.countInit[0] = a[0][0]; timer.countInit[1] = a[0][1];
                  timer.countStart[0] = a[1][0]; timer.countStart[1] = a[1][1];
                  timer.countCurrent[0] = a[2][0]; timer.countCurrent[1] = a[2][1];
                  timer.countLatched[0] = a[3][0]; timer.countLatched[1] = a[3][1];
                  timer.bcd = a[4];
                  timer.mode = a[5];
                  timer.rw = a[6];
                  timer.countIndex = a[7];
                  timer.countBytes = a[8];
                  timer.fOUT = a[9];
                  timer.fLatched = a[10];
                  timer.fCounting = a[11];
                  timer.nCyclesStart = a[12];
                  this.aTimers[iTimer] = timer;
              };
              
              /**
               * saveTimers()
               *
               * @this {ChipSet}
               * @return {Array}
               */
              ChipSet.prototype.saveTimers = function()
              {
                  var data = [];
                  for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                      var timer = this.aTimers[iTimer];
                      data[iTimer] = [
                          timer.countInit,
                          timer.countStart,
                          timer.countCurrent,
                          timer.countLatched,
                          timer.bcd,
                          timer.mode,
                          timer.rw,
                          timer.countIndex,
                          timer.countBytes,
                          timer.fOUT,
                          timer.fLatched,
                          timer.fCounting,
                          timer.nCyclesStart
                      ];
                  }
                  return data;
              };
              
              /**
               * getSWMemorySize(fInit)
               *
               * @this {ChipSet}
               * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
               * @return {number} number of Kb of specified memory (NOT necessarily the same as installed memory; see RAM component)
               */
              ChipSet.prototype.getSWMemorySize = function(fInit)
              {
                  var sw1 = (fInit? this.sw1Init : this.sw1);
                  var sw2 = (fInit? this.sw2Init : this.sw2);
                  return (((sw1 & ChipSet.PPI_SW.MEMORY.MASK) >> ChipSet.PPI_SW.MEMORY.SHIFT) + 1) * this.kbSW + (sw2 & ChipSet.PPI_C.SW) * 32;
              };
              
              /**
               * getSWFloppyDrives(fInit)
               *
               * @this {ChipSet}
               * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
               * @return {number} number of floppy drives specified by SW1 (range is 0 to 4)
               */
              ChipSet.prototype.getSWFloppyDrives = function(fInit)
              {
                  var sw1 = (fInit? this.sw1Init : this.sw1);
                  return ((this.model != ChipSet.MODEL_5150) || (sw1 & ChipSet.PPI_SW.FDRIVE.IPL))? ((sw1 & ChipSet.PPI_SW.FDRIVE.MASK) >> ChipSet.PPI_SW.FDRIVE.SHIFT) + 1 : 0;
              };
              
              /**
               * getSWFloppyDriveType(iDrive)
               *
               * @this {ChipSet}
               * @param {number} iDrive (0-based)
               * @return {number} one of the ChipSet.CMOS.FDRIVE.FD* values (FD360, FD1200, etc)
               */
              ChipSet.prototype.getSWFloppyDriveType = function(iDrive)
              {
                  if (iDrive < this.getSWFloppyDrives()) {
                      if (!this.aFloppyDrives) {
                          return ChipSet.CMOS.FDRIVE.FD360;
                      }
                      if (iDrive < this.aFloppyDrives.length) {
                          switch(this.aFloppyDrives[iDrive]) {
                          case 160:
                          case 180:
                          case 320:
                          case 360:
                              return ChipSet.CMOS.FDRIVE.FD360;
                          case 720:
                              return ChipSet.CMOS.FDRIVE.FD720;
                          case 1200:
                              return ChipSet.CMOS.FDRIVE.FD1200;
                          case 1440:
                              return ChipSet.CMOS.FDRIVE.FD1440;
                          }
                      }
                      this.assert(false);  // we should never get here (else something is out of out sync)
                  }
                  return ChipSet.CMOS.FDRIVE.NONE;
              };
              
              /**
               * getSWFloppyDriveSize(iDrive)
               *
               * @this {ChipSet}
               * @param {number} iDrive (0-based)
               * @return {number} capacity of drive in Kb (eg, 360, 1200, 1440, etc), or 0 if none
               */
              ChipSet.prototype.getSWFloppyDriveSize = function(iDrive)
              {
                  if (iDrive < this.getSWFloppyDrives()) {
                      if (!this.aFloppyDrives) {
                          return 360;
                      }
                      if (iDrive < this.aFloppyDrives.length) {
                          return this.aFloppyDrives[iDrive];
                      }
                      this.assert(false);  // we should never get here (else something is out of out sync)
                  }
                  return 0;
              };
              
              /**
               * getSWVideoMonitor(fInit)
               *
               * @this {ChipSet}
               * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
               * @return {number} one of ChipSet.MONITOR.*
               */
              ChipSet.prototype.getSWVideoMonitor = function(fInit)
              {
                  var sw1 = (fInit? this.sw1Init : this.sw1);
                  return (sw1 & ChipSet.PPI_SW.MONITOR.MASK) >> ChipSet.PPI_SW.MONITOR.SHIFT;
              };
              
              /**
               * addSwitches(s, control, n, v, oTips)
               *
               * @this {ChipSet}
               * @param {string} s is the name of the control
               * @param {Object} control is the HTML control DOM object
               * @param {number} n is the number of switches to add
               * @param {number} v contains the current value(s) of the switches
               * @param {Object} oTips contains tooltips for the various cells
               */
              ChipSet.prototype.addSwitches = function(s, control, n, v, oTips)
              {
                  var sHTML = "";
                  var sCellClass = PCJSCLASS + "-bitCell";
                  for (var i = 1; i <= n; i++) {
                      var sCellClasses = sCellClass;
                      if (!i) sCellClasses += " " + PCJSCLASS + "-bitCellLeft";
                      var sCellID = s + "-" + i;
                      sHTML += "<div id=\"" + sCellID + "\" class=\"" + sCellClasses + "\" data-value=\"0\">" + i + "</div>\n";
                  }
                  control.innerHTML = sHTML;
                  var aeCells = Component.getElementsByClass(control, sCellClass);
                  var sTip = null;
                  for (i = 0; i < aeCells.length; i++) {
                      if (oTips != null && oTips[i] != null) {
                          sTip = oTips[i];
                      }
                      if (sTip) aeCells[i].setAttribute("title", sTip);
                      this.setSwitch(aeCells[i], (v & (0x1 << i))? false : true);
                      aeCells[i].onclick = function(chipset, eSwitch) {
                          /*
                           *  If we defined the onclick handler below as "function(e)" instead of simply "function()", then we could
                           *  also receive an event object (e); however, IE reportedly requires that we examine a global (window.event)
                           *  instead.  If that's true, and if we ever care to get more details about the click event, then we might
                           *  have to worry about that (eg, define a local var: "var event = window.event || e").
                           */
                          return function onClickSwitch() {
                              chipset.toggleSwitch(eSwitch);
                          };
                      }(this, aeCells[i]);
                  }
              };
              
              /**
               * getSwitch(control)
               *
               * @this {ChipSet}
               * @param {Object} control is an HTML control DOM object
               * @return {boolean} true if the switch represented by e is "on", false if "off"
               */
              ChipSet.prototype.getSwitch = function(control)
              {
                  return control.getAttribute("data-value") == "1";
              };
              
              /**
               * setSwitch(control, f)
               *
               * @this {ChipSet}
               * @param {Object} control is an HTML control DOM object
               * @param {boolean} f is true if the switch represented by control should be "on", false if "off"
               */
              ChipSet.prototype.setSwitch = function(control, f)
              {
                  control.setAttribute("data-value", f? "1" : "0");
                  control.style.color = (f? "#ffffff" : "#000000");
                  control.style.backgroundColor = (f? "#000000" : "#ffffff");
              };
              
              /**
               * toggleSwitch(control)
               *
               * @this {ChipSet}
               * @param {Object} control is an HTML control DOM object
               */
              ChipSet.prototype.toggleSwitch = function(control)
              {
                  var f = !this.getSwitch(control);
                  this.setSwitch(control, f);
                  var sID = control.getAttribute("id");
                  var asParts = sID.split("-");
                  var b = (0x1 << (+asParts[1] - 1));
                  switch (asParts[0]) {
                  case "sw1":
                      this.sw1Init = (this.sw1Init & ~b) | (f? 0 : b);
                      break;
                  case "sw2":
                      this.sw2Init = (this.sw2Init & ~b) | (f? 0 : b);
                      break;
                  default:
                      break;
                  }
                  this.updateSwitchDesc();
              };
              
              /**
               * updateSwitchDesc()
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.updateSwitchDesc = function()
              {
                  var controlDesc = this.bindings["swdesc"];
                  /*
                   * TODO: Monitor type 0 used to be "No" (as in "No Monitor"), which was correct in the pre-EGA world,
                   * but in the post-EGA world, it depends.  We could ask the Video component for a definitive answer, but
                   * but what we print here isn't that critical, because most people won't bother with a Control Panel,
                   * which is really the only beneficiary of this code.
                   */
                  var asMonitorTypes = {
                      0: "Enhanced Color",
                      1: "TV",
                      2: "Color",
                      3: "Monochrome"
                  };
                  if (controlDesc != null) {
                      var sText = "";
                      sText += this.getSWMemorySize(true) + "Kb";
                      sText += ", " + asMonitorTypes[this.getSWVideoMonitor(true)] + " Monitor";
                      sText += ", " + this.getSWFloppyDrives(true) + " Floppy Drives";
                      if (this.sw1 != null && this.sw1 != this.sw1Init || this.sw2 != null && this.sw2 != this.sw2Init) {
                          sText += " (Reset required)";
                      }
                      controlDesc.textContent = sText;
                  }
              };
              
              /**
               * dumpPIC()
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.dumpPIC = function()
              {
                  if (DEBUGGER) {
                      for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
                          var pic = this.aPICs[iPIC];
                          var sDump = "PIC" + iPIC + ":";
                          for (var i = 0; i < pic.aICW.length; i++) {
                              var b = pic.aICW[i];
                              sDump += " IC" + (i + 1) + '=' + str.toHexByte(b);
                          }
                          sDump += " IMR=" + str.toHexByte(pic.bIMR) + " IRR=" + str.toHexByte(pic.bIRR) + " ISR=" + str.toHexByte(pic.bISR) + " DELAY=" + pic.nDelay;
                          this.dbg.println(sDump);
                      }
                  }
              };
              
              /**
               * dumpTimer()
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.dumpTimer = function()
              {
                  if (DEBUGGER) {
                      for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                          this.updateTimer(iTimer);
                          var timer = this.aTimers[iTimer];
                          var sDump = "TIMER" + iTimer + ":";
                          var count = 0;
                          if (timer.countBytes != null) {
                              for (var i = 0; i <= timer.countBytes; i++) {
                                  count |= (timer.countCurrent[i] << (i * 8));
                              }
                          }
                          sDump += " mode=" + timer.mode + " bytes=" + timer.countBytes + " count=" + str.toHexWord(count);
                          this.dbg.println(sDump);
                      }
                  }
              };
              
              /**
               * dumpCMOS()
               *
               * @this {ChipSet}
               */
              ChipSet.prototype.dumpCMOS = function()
              {
                  if (DEBUGGER) {
                      var sDump = "";
                      for (var iCMOS = 0; iCMOS < ChipSet.CMOS.ADDR.TOTAL; iCMOS++) {
                          var b = (iCMOS <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(iCMOS) : this.abCMOSData[iCMOS]);
                          if (sDump) sDump += '\n';
                          sDump += "CMOS[" + str.toHexByte(iCMOS) + "]: " + str.toHexByte(b);
                      }
                      this.dbg.println(sDump);
                  }
              };
              
              /**
               * inDMAChannelAddr(iDMAC, iChannel, port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel
               * @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inDMAChannelAddr = function(iDMAC, iChannel, port, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  var channel = controller.aChannels[iChannel];
                  var b = channel.addrCurrent[controller.bIndex];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", b, true);
                  }
                  controller.bIndex ^= 0x1;
                  /*
                   * Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
                   * every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
                   * and TYPE_READ (0x58) and initialized TIMER1 appropriately.
                   *
                   * However, we don't need to be that particular.  Simply simulate an ever-increasing address after every
                   * read of the full DMA channel 0 address.
                   */
                  if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
                      channel.addrCurrent[0]++;
                      if (channel.addrCurrent[0] > 0xff) {
                          channel.addrCurrent[0] = 0;
                          channel.addrCurrent[1]++;
                          if (channel.addrCurrent[1] > 0xff) {
                              channel.addrCurrent[1] = 0;
                          }
                      }
                  }
                  return b;
              };
              
              /**
               * outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel
               * @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAChannelAddr = function outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", null, true);
                  }
                  var channel = controller.aChannels[iChannel];
                  channel.addrCurrent[controller.bIndex] = channel.addrInit[controller.bIndex] = bOut;
                  controller.bIndex ^= 0x1;
              };
              
              /**
               * inDMAChannelCount(iDMAC, iChannel, port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel
               * @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inDMAChannelCount = function(iDMAC, iChannel, port, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  var channel = controller.aChannels[iChannel];
                  var b = channel.countCurrent[controller.bIndex];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", b, true);
                  }
                  controller.bIndex ^= 0x1;
                  /*
                   * Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
                   * every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
                   * and TYPE_READ (0x58) and initialized TIMER1 appropriately.
                   *
                   * However, we don't need to be that particular.  Simply simulate an ever-decreasing count after every
                   * read of the full DMA channel 0 count.
                   */
                  if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
                      channel.countCurrent[0]--;
                      if (channel.countCurrent[0] < 0) {
                          channel.countCurrent[0] = 0xff;
                          channel.countCurrent[1]--;
                          if (channel.countCurrent[1] < 0) {
                              channel.countCurrent[1] = 0xff;
                              /*
                               * This is the logical point to indicate Terminal Count (TC), but again, there's no need to be
                               * so particular; inDMAStatus() has its own logic for periodically signalling TC.
                               */
                          }
                      }
                  }
                  return b;
              };
              
              /**
               * outDMAChannelCount(iDMAC, iChannel, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel (ports 0x01, 0x03, 0x05, 0x07)
               * @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", null, true);
                  }
                  var channel = controller.aChannels[iChannel];
                  channel.countCurrent[controller.bIndex] = channel.countInit[controller.bIndex] = bOut;
                  controller.bIndex ^= 0x1;
              };
              
              /**
               * inDMAStatus(iDMAC, port, addrFrom)
               *
               * From the 8237A spec:
               *
               * "The Status register is available to be read out of the 8237A by the microprocessor.
               * It contains information about the status of the devices at this point. This information includes
               * which channels have reached Terminal Count (TC) and which channels have pending DMA requests.
               *
               * Bits 0–3 are set every time a TC is reached by that channel or an external EOP is applied.
               * These bits are cleared upon Reset and on each Status Read.
               *
               * Bits 4–7 are set whenever their corresponding channel is requesting service."
               *
               * TRIVIA: This hook wasn't installed when I was testing with the MODEL_5150 ROM BIOS, and it
               * didn't matter, but the MODEL_5160 ROM BIOS checks it several times, including @F000:E156, where
               * it verifies that TIMER1 didn't request service on channel 0.
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inDMAStatus = function(iDMAC, port, addrFrom)
              {
                  /*
                   * HACK: Unlike the MODEL_5150, the MODEL_5160 ROM BIOS checks DMA channel 0 for TC (@F000:E4DF)
                   * after running a number of unrelated tests, since enough time would have passed for channel 0 to
                   * have reached TC at least once.  So I simply OR in a hard-coded TC bit for channel 0 every time
                   * status is read.
                   */
                  var controller = this.aDMACs[iDMAC];
                  var b = controller.bStatus | ChipSet.DMA_STATUS.CH0_TC;
                  controller.bStatus &= ~ChipSet.DMA_STATUS.ALL_TC;
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".STATUS", b, true);
                  }
                  return b;
              };
              
              /**
               * outDMACmd(iDMAC, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMACmd = function(iDMAC, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CMD", null, true);
                  }
                  this.aDMACs[iDMAC].bCmd = bOut;
              };
              
              /**
               * outDMAReq(iDMAC, port, bOut, addrFrom)
               *
               * From the 8237A spec:
               *
               * "The 8237A can respond to requests for DMA service which are initiated by software as well as by a DREQ.
               * Each channel has a request bit associated with it in the 4-bit Request register. These are non-maskable and subject
               * to prioritization by the Priority Encoder network. Each register bit is set or reset separately under software
               * control or is cleared upon generation of a TC or external EOP. The entire register is cleared by a Reset.
               *
               * To set or reset a bit the software loads the proper form of the data word.... In order to make a software request,
               * the channel must be in Block Mode."
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x09 for DMAC 0, 0xD2 for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAReq = function(iDMAC, port, bOut, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".REQ", null, true);
                  }
                  /*
                   * Bits 0-1 contain the channel number
                   */
                  var iChannel = (bOut & 0x3);
                  /*
                   * Bit 2 is the request bit (0 to reset, 1 to set), which must be propagated to the corresponding bit (4-7) in the status register
                   */
                  var iChannelBit = ((bOut & 0x4) << (iChannel + 2));
                  controller.bStatus = (controller.bStatus & ~(0x10 << iChannel)) | iChannelBit;
                  controller.bReq = bOut;
              };
              
              /**
               * outDMAMask(iDMAC, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x0A for DMAC 0, 0xD4 for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAMask = function(iDMAC, port, bOut, addrFrom)
              {
                  var controller = this.aDMACs[iDMAC];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASK", null, true);
                  }
                  var iChannel = bOut & ChipSet.DMA_MASK.CHANNEL;
                  var channel = controller.aChannels[iChannel];
                  channel.masked = !!(bOut & ChipSet.DMA_MASK.CHANNEL_SET);
                  if (!channel.masked) this.requestDMA(controller.nChannelBase + iChannel);
              };
              
              /**
               * outDMAMode(iDMAC, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x0B for DMAC 0, 0xD6 for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAMode = function(iDMAC, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MODE", null, true);
                  }
                  var iChannel = bOut & ChipSet.DMA_MODE.CHANNEL;
                  this.aDMACs[iDMAC].aChannels[iChannel].mode = bOut;
              };
              
              /**
               * outDMAResetFF(iDMAC, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x0C for DMAC 0, 0xD8 for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               *
               * Any write to this port simply resets the controller's "first/last flip-flop", which determines whether
               * the even or odd byte of a DMA address or count register will be accessed next.
               */
              ChipSet.prototype.outDMAResetFF = function(iDMAC, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".RESET_FF", null, true);
                  }
                  this.aDMACs[iDMAC].bIndex = 0;
              };
              
              /**
               * outDMAMasterClear(iDMAC, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} port (0x0D for DMAC 0, 0xDA for DMAC 1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAMasterClear = function(iDMAC, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASTER_CLEAR", null, true);
                  }
                  /*
                   * The value written to this port doesn't matter; any write triggers a "master clear" operation
                   *
                   * TODO: Can't we just call initDMAController(), which would also take care of clearing controller.bStatus?
                   */
                  var controller = this.aDMACs[iDMAC];
                  for (var i = 0; i < controller.aChannels.length; i++) {
                      this.initDMAChannel(controller, i);
                  }
              };
              
              /**
               * inDMAPageReg(iDMAC, iChannel, port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel
               * @param {number} port
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inDMAPageReg = function(iDMAC, iChannel, port, addrFrom)
              {
                  var bIn = this.aDMACs[iDMAC].aChannels[iChannel].bPage;
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", bIn, true);
                  }
                  return bIn;
              };
              
              /**
               * outDMAPageReg(iDMAC, iChannel, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iDMAC
               * @param {number} iChannel
               * @param {number} port
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAPageReg = function(iDMAC, iChannel, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", null, true);
                  }
                  this.aDMACs[iDMAC].aChannels[iChannel].bPage = bOut;
              };
              
              /**
               * inDMAPageSpare(iSpare, port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iSpare
               * @param {number} port
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inDMAPageSpare = function(iSpare, port, addrFrom)
              {
                  var bIn = this.abDMAPageSpare[iSpare];
                  if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", bIn, true);
                  }
                  return bIn;
              };
              
              /**
               * outDMAPageSpare(iSpare, port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iSpare
               * @param {number} port
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outDMAPageSpare = function(iSpare, port, bOut, addrFrom)
              {
                  /*
                   * TODO: Remove this DEBUG-only DESKPRO386 code once we're done debugging DeskPro 386 ROMs;
                   * it enables logging of all DeskPro ROM checkpoint I/O to port 0x84.
                   */
                  if (this.messageEnabled(Messages.DMA | Messages.PORT) || DEBUG && this.model == ChipSet.MODEL_DESKPRO386 && port == 0x84) {
                      this.printMessageIO(port, bOut, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", null, true);
                  }
                  this.abDMAPageSpare[iSpare] = bOut;
              };
              
              /**
               * checkDMA()
               *
               * Called by the CPU whenever INTR.DMA is set.
               *
               * @return {boolean} true if one or more async DMA channels are still active (unmasked), false to reset INTR.DMA
               */
              ChipSet.prototype.checkDMA = function()
              {
                  var fActive = false;
                  for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
                      var controller = this.aDMACs[iDMAC];
                      for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                          var channel = controller.aChannels[iChannel];
                          if (!channel.masked) {
                              this.advanceDMA(channel);
                              if (!channel.masked) fActive = true;
                          }
                      }
                  }
                  return fActive;
              };
              
              /**
               * connectDMA(iDMAChannel, component, sFunction, obj)
               *
               * @param {number} iDMAChannel
               * @param {Component|string} component
               * @param {string} sFunction
               * @param {Object} obj (eg, when the HDC connects, it passes a drive object)
               */
              ChipSet.prototype.connectDMA = function(iDMAChannel, component, sFunction, obj)
              {
                  var iDMAC = iDMAChannel >> 2;
                  var controller = this.aDMACs[iDMAC];
              
                  var iChannel = iDMAChannel & 0x3;
                  var channel = controller.aChannels[iChannel];
              
                  this.initDMAFunction(channel, component, sFunction, obj);
              };
              
              /**
               * requestDMA(iDMAChannel, done)
               *
               * @this {ChipSet}
               * @param {number} iDMAChannel
               * @param {function(boolean)} [done]
               *
               * For DMA_MODE.TYPE_WRITE transfers, fnTransfer(-1) must return bytes as long as we request them (although it may
               * return -1 if it runs out of bytes prematurely).
               *
               * Similarly, for DMA_MODE.TYPE_READ transfers, fnTransfer(b) must accept bytes as long as we deliver them (although
               * it is certainly free to ignore bytes it no longer wants).
               */
              ChipSet.prototype.requestDMA = function(iDMAChannel, done)
              {
                  var iDMAC = iDMAChannel >> 2;
                  var controller = this.aDMACs[iDMAC];
              
                  var iChannel = iDMAChannel & 0x3;
                  var channel = controller.aChannels[iChannel];
              
                  if (!channel.component || !channel.fnTransfer || !channel.obj) {
                      if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
                          this.printMessage("requestDMA(" + iDMAChannel + "): not connected to a component", true);
                      }
                      if (done) done(true);
                      return;
                  }
              
                  /*
                   * We can't simply slam done into channel.done; that would be fine if requestDMA() was called only by functions
                   * like HDC.doRead() and HDC.doWrite(), but we're also called whenever a DMA channel is unmasked, and in those cases,
                   * we need to preserve whatever handler may have been previously set.
                   *
                   * However, in an effort to ensure we don't end up with stale done handlers, connectDMA() will reset channel.done.
                   */
                  if (done) channel.done = done;
              
                  if (channel.masked) {
                      if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
                          this.printMessage("requestDMA(" + iDMAChannel + "): channel masked, request queued", true);
                      }
                      return;
                  }
              
                  /*
                   * Let's try to do async DMA without asking the CPU for help...
                   *
                   *      this.cpu.setDMA(true);
                   */
                  this.advanceDMA(channel, true);
              };
              
              /**
               * advanceDMA(channel, fInit)
               *
               * @this {ChipSet}
               * @param {Object} channel
               * @param {boolean} [fInit]
               */
              ChipSet.prototype.advanceDMA = function(channel, fInit)
              {
                  if (fInit) {
                      channel.count = (channel.countCurrent[1] << 8) | channel.countCurrent[0];
                      channel.type = (channel.mode & ChipSet.DMA_MODE.TYPE);
                      channel.fWarning = channel.fError = false;
                      if (DEBUG && DEBUGGER) {
                          channel.cbDebug = channel.count + 1;
                          channel.sAddrDebug = (DEBUG && DEBUGGER? null : undefined);
                      }
                  }
                  /*
                   * To support async DMA without requiring help from the CPU (ie, without relying upon cpu.setDMA()), we require that
                   * the data transfer functions provide an fAsync parameter to their callbacks; fAsync must be true if the callback was
                   * truly asynchronous (ie, it had to wait for a remote I/O request to finish), or false if the data was already available
                   * and the callback was performed synchronously.
                   *
                   * Whenever a callback is issued asynchronously, we will immediately daisy-chain another pair of updateDMA()/advanceDMA()
                   * calls, which will either finish the DMA operation if no more remote I/O requests are required, or will queue up another
                   * I/O request, which will in turn trigger another async callback.  Thus, the DMA request keeps itself going without
                   * requiring any special assistance from the CPU via setDMA().
                   */
                  var bto = null;
                  var chipset = this;
                  var fAsyncRequest = false;
                  var controller = channel.controller;
                  var iDMAChannel = controller.nChannelBase + channel.iChannel;
              
                  while (true) {
                      if (channel.count >= 0) {
                          var b;
                          var addr = (channel.bPage << 16) | (channel.addrCurrent[1] << 8) | channel.addrCurrent[0];
                          if (DEBUG && DEBUGGER && channel.sAddrDebug === null) {
                              channel.sAddrDebug = str.toHex(addr >> 4, 4) + ":" + str.toHex(addr & 0xf, 4);
                              if (this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type != ChipSet.DMA_MODE.TYPE_WRITE) {
                                  this.printMessage("advanceDMA(" + iDMAChannel + ") transferring " + channel.cbDebug + " bytes from " + channel.sAddrDebug, true);
                                  this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
                              }
                          }
                          if (channel.type == ChipSet.DMA_MODE.TYPE_WRITE) {
                              fAsyncRequest = true;
                              (function advanceDMAWrite(addrCur) {
                                  channel.fnTransfer.call(channel.component, channel.obj, -1, function onTransferDMA(b, fAsync, obj, off) {
                                      if (b < 0) {
                                          if (!channel.fWarning) {
                                              if (DEBUG && chipset.messageEnabled(Messages.DMA)) {
                                                  chipset.printMessage("advanceDMA(" + iDMAChannel + ") ran out of data, assuming 0xff", true);
                                              }
                                              channel.fWarning = true;
                                          }
                                          /*
                                           * TODO: Determine whether to abort, as we do for DMA_MODE.TYPE_READ.
                                           */
                                          b = 0xff;
                                      }
                                      if (!channel.masked) {
                                          chipset.bus.setByte(addrCur, b);
                                          if (BACKTRACK) {
                                              if (!off && obj.file && chipset.messageEnabled(Messages.DISK)) {
                                                  chipset.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] at %" + str.toHex(addrCur), true);
                                              }
                                              bto = chipset.bus.addBackTrackObject(obj, bto, off);
                                              chipset.bus.writeBackTrackObject(addrCur, bto, off);
                                          }
                                      }
                                      fAsyncRequest = fAsync;
                                      if (fAsync) {
                                          setTimeout(function() {
                                              if (!chipset.updateDMA(channel)) chipset.advanceDMA(channel);
                                          }, 0);
                                      }
                                  });
                              }(addr));
                          }
                          else if (channel.type == ChipSet.DMA_MODE.TYPE_READ) {
                              /*
                               * TODO: Determine whether we should support async dmaWrite() functions (currently not required)
                               */
                              b = chipset.bus.getByte(addr);
                              if (channel.fnTransfer.call(channel.component, channel.obj, b) < 0) {
                                  /*
                                   * In this case, I think I have no choice but to terminate the DMA operation in response to a failure,
                                   * because the ROM BIOS FDC.REG_DATA.CMD.FORMAT_TRACK command specifies a count that is MUCH too large
                                   * (a side-effect of the ROM BIOS using the same "DMA_SETUP" code for reads, writes AND formats).
                                   */
                                  channel.fError = true;
                              }
                          }
                          else if (channel.type == ChipSet.DMA_MODE.TYPE_VERIFY) {
                              /*
                               * Nothing to read or write; just call updateDMA()
                               */
                          }
                          else {
                              if (DEBUG && this.messageEnabled(Messages.DMA | Messages.WARN)) {
                                  this.printMessage("advanceDMA(" + iDMAChannel + ") unsupported transfer type: " + str.toHexWord(channel.type), true);
                              }
                              channel.fError = true;
                          }
                      }
                      if (fAsyncRequest || this.updateDMA(channel)) break;
                  }
              };
              
              /**
               * updateDMA(channel)
               *
               * @this {ChipSet}
               * @param {Object} channel
               * @return {boolean} true if DMA operation complete, false if not
               */
              ChipSet.prototype.updateDMA = function(channel)
              {
                  if (!channel.fError && --channel.count >= 0) {
                      if (channel.mode & ChipSet.DMA_MODE.DECREMENT) {
                          channel.addrCurrent[0]--;
                          if (channel.addrCurrent[0] < 0) {
                              channel.addrCurrent[0] = 0xff;
                              channel.addrCurrent[1]--;
                              if (channel.addrCurrent[1] < 0) channel.addrCurrent[1] = 0xff;
                          }
                      } else {
                          channel.addrCurrent[0]++;
                          if (channel.addrCurrent[0] > 0xff) {
                              channel.addrCurrent[0] = 0x00;
                              channel.addrCurrent[1]++;
                              if (channel.addrCurrent[1] > 0xff) channel.addrCurrent[1] = 0x00;
                          }
                      }
                      /*
                       * In situations where an HDC DMA operation took too long, the Fixed Disk BIOS would give up, but the DMA operation would continue.
                       *
                       * TODO: Verify that the Fixed Disk BIOS shuts down (ie, re-masks) a DMA channel for failed requests, and that this handles those failures.
                       */
                      if (!channel.masked) return false;
                  }
              
                  var controller = channel.controller;
                  var iDMAChannel = controller.nChannelBase + channel.iChannel;
                  controller.bStatus = (controller.bStatus & ~(0x10 << channel.iChannel)) | (0x1 << channel.iChannel);
              
                  /*
                   * EOP is supposed to automatically (re)mask the channel, unless it's set for auto-initialize.
                   */
                  if (!(channel.mode & ChipSet.DMA_MODE.AUTOINIT)) {
                      channel.masked = true;
                      channel.component = channel.obj = null;
                  }
              
                  if (DEBUG && this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type == ChipSet.DMA_MODE.TYPE_WRITE && channel.sAddrDebug) {
                      this.printMessage("updateDMA(" + iDMAChannel + ") transferred " + channel.cbDebug + " bytes to " + channel.sAddrDebug, true);
                      this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
                  }
              
                  if (channel.done) {
                      channel.done(!channel.fError);
                      channel.done = null;
                  }
              
                  /*
                   * While it might make sense to call cpu.setDMA() here, it's simpler to let the CPU issue one more call
                   * to chipset.checkDMA() and let the CPU update INTR.DMA on its own, based on the return value from checkDMA().
                   */
                  return true;
              };
              
              /**
               * inPICLo(iPIC, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iPIC
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPICLo = function(iPIC, addrFrom)
              {
                  var b = 0;
                  var pic = this.aPICs[iPIC];
                  if (pic.bOCW3 != null) {
                      var bReadReg = pic.bOCW3 & ChipSet.PIC_LO.OCW3_READ_CMD;
                      switch (bReadReg) {
                          case ChipSet.PIC_LO.OCW3_READ_IRR:
                              b = pic.bIRR;
                              break;
                          case ChipSet.PIC_LO.OCW3_READ_ISR:
                              b = pic.bISR;
                              break;
                          default:
                              break;
                      }
                  }
                  if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                      this.printMessageIO(pic.port, null, addrFrom, "PIC" + iPIC, b, true);
                  }
                  return b;
              };
              
              /**
               * outPICLo(iPIC, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iPIC
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPICLo = function(iPIC, bOut, addrFrom)
              {
                  var pic = this.aPICs[iPIC];
                  if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                      this.printMessageIO(pic.port, bOut, addrFrom, "PIC" + iPIC, null, true);
                  }
                  if (bOut & ChipSet.PIC_LO.ICW1) {
                      /*
                       * This must be an ICW1...
                       */
                      pic.nICW = 0;
                      pic.aICW[pic.nICW++] = bOut;
                      /*
                       * I used to do the rest of this initialization in outPICHi(), once all the ICW commands had been received,
                       * but a closer reading of the 8259A spec indicates that that should happen now, on receipt on ICW1.
                       *
                       * Also, on p.10 of that spec, it says "The Interrupt Mask Register is cleared".  I originally took that to
                       * mean that all interrupts were masked, but based on what MS-DOS 4.0M expects to happen after this code runs:
                       *
                       *      0070:44C6 B013          MOV      AL,13
                       *      0070:44C8 E620          OUT      20,AL
                       *      0070:44CA B050          MOV      AL,50
                       *      0070:44CC E621          OUT      21,AL
                       *      0070:44CE B009          MOV      AL,09
                       *      0070:44D0 E621          OUT      21,AL
                       *
                       * (ie, it expects its next call to INT 0x13 will still generate an interrupt), I've decided the spec
                       * must be read literally, meaning that all IMR bits must be zeroed.  Unmasking all possible interrupts by
                       * default seems unwise to me, but who am I to judge....
                       */
                      pic.bIMR = 0x00;
                      pic.bIRLow = 7;
                      /*
                       * TODO: I'm also zeroing both IRR and ISR, even though that's not actually mentioned as part of the ICW
                       * sequence, because they need to be (re)initialized at some point.  However, if some component is currently
                       * requesting an interrupt, what should I do about that?  Originally, I had decided to clear them ONLY if they
                       * were still undefined, but that change appeared to break the ROM BIOS handling of CTRL-ALT-DEL, so I'm back
                       * to unconditionally zeroing them.
                       */
                      pic.bIRR = pic.bISR = 0;
                      /*
                       * The spec also says that "Special Mask Mode is cleared and Status Read is set to IRR".  I attempt to insure
                       * the latter, but as for special mask mode... well, that mode isn't supported yet.
                       */
                      pic.bOCW3 = ChipSet.PIC_LO.OCW3 | ChipSet.PIC_LO.OCW3_READ_IRR;
                  }
                  else if (!(bOut & ChipSet.PIC_LO.OCW3)) {
                      /*
                       * This must be an OCW2...
                       */
                      var bOCW2 = bOut & ChipSet.PIC_LO.OCW2_OP_MASK;
                      if (bOCW2 & ChipSet.PIC_LO.OCW2_EOI) {
                          /*
                           * This OCW2 must be an EOI command...
                           */
                          var nIRL, bIREnd = 0;
                          if ((bOCW2 & ChipSet.PIC_LO.OCW2_EOI_SPEC) == ChipSet.PIC_LO.OCW2_EOI_SPEC) {
                              /*
                               * More "specifically", a specific EOI command...
                               */
                              nIRL = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
                              bIREnd = 1 << nIRL;
                          } else {
                              /*
                               * Less "specifically", a non-specific EOI command.  The search for the highest priority in-service
                               * interrupt must start with whichever interrupt is opposite the lowest priority interrupt (normally 7,
                               * but technically whatever bIRLow is currently set to).  For example:
                               *
                               *      If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
                               *      If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
                               *      If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
                               *      etc.
                               */
                              nIRL = pic.bIRLow + 1;
                              while (true) {
                                  nIRL &= 0x7;
                                  var bIR = 1 << nIRL;
                                  if (pic.bISR & bIR) {
                                      bIREnd = bIR;
                                      break;
                                  }
                                  if (nIRL++ == pic.bIRLow) break;
                              }
                              if (DEBUG && !bIREnd) nIRL = null;      // for unexpected non-specific EOI commands, there's no IRQ to report
                          }
                          var nIRQ = (nIRL == null? undefined : pic.nIRQBase + nIRL);
                          if (pic.bISR & bIREnd) {
                              if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
                                  this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): IRQ " + nIRQ + " ending @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
                              }
                              pic.bISR &= ~bIREnd;
                              this.checkIRR();
                          } else {
                              if (DEBUG && this.messageEnabled(Messages.PIC | Messages.WARN)) {
                                  this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unexpected EOI command, IRQ " + nIRQ + " not in service", true);
                                  if (!SAMPLER && MAXDEBUG) this.dbg.stopCPU();
                              }
                          }
                          /*
                           * TODO: Support EOI commands with automatic rotation (eg, ChipSet.PIC_LO.OCW2_EOI_ROT and ChipSet.PIC_LO.OCW2_EOI_ROTSPEC)
                           */
                          if (bOCW2 & ChipSet.PIC_LO.OCW2_SET_ROTAUTO) {
                              this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 rotate command: " + str.toHexByte(bOut));
                          }
                      }
                      else  if (bOCW2 == ChipSet.PIC_LO.OCW2_SET_PRI) {
                          /*
                           * This OCW2 changes the lowest priority interrupt to the specified level (the default is 7)
                           */
                          pic.bIRLow = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
                      }
                      else {
                          /*
                           * TODO: Remaining commands to support: ChipSet.PIC_LO.OCW2_SET_ROTAUTO and ChipSet.PIC_LO.OCW2_CLR_ROTAUTO
                           */
                          this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 automatic EOI command: " + str.toHexByte(bOut));
                      }
                  } else {
                      /*
                       * This must be an OCW3 request. If it's a "Read Register" command (PIC_LO.OCW3_READ_CMD), inPICLo() will take care it.
                       *
                       * TODO: If OCW3 specified a "Poll" command (PIC_LO.OCW3_POLL_CMD) or a "Special Mask Mode" command (PIC_LO.OCW3_SMM_CMD),
                       * that's unfortunate, because I don't support them yet.
                       */
                      if (bOut & (ChipSet.PIC_LO.OCW3_POLL_CMD | ChipSet.PIC_LO.OCW3_SMM_CMD)) {
                          this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW3 command: " + str.toHexByte(bOut));
                      }
                      pic.bOCW3 = bOut;
                  }
              };
              
              /**
               * inPICHi(iPIC, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iPIC
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPICHi = function(iPIC, addrFrom)
              {
                  var pic = this.aPICs[iPIC];
                  var b = pic.bIMR;
                  if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                      this.printMessageIO(pic.port+1, null, addrFrom, "PIC" + iPIC, b, true);
                  }
                  return b;
              };
              
              /**
               * outPICHi(iPIC, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iPIC
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPICHi = function(iPIC, bOut, addrFrom)
              {
                  var pic = this.aPICs[iPIC];
                  if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                      this.printMessageIO(pic.port+1, bOut, addrFrom, "PIC" + iPIC, null, true);
                  }
                  if (pic.nICW < pic.aICW.length) {
                      pic.aICW[pic.nICW++] = bOut;
                      if (pic.nICW == 2 && (pic.aICW[0] & ChipSet.PIC_LO.ICW1_SNGL))
                          pic.nICW++;
                      if (pic.nICW == 3 && !(pic.aICW[0] & ChipSet.PIC_LO.ICW1_ICW4))
                          pic.nICW++;
                  }
                  else {
                      /*
                       * We have all our ICW "words" (ie, bytes), so this must be an OCW1 write (which is simply an IMR write)
                       */
                      pic.bIMR = bOut;
                      /*
                       * See the CPU's delayINTR() function for an explanation of why this explicit delay is necessary.
                       */
                      this.cpu.delayINTR();
                      /*
                       * Alas, we need a longer delay for the MODEL_5170's "KBD_RESET" function (F000:17D2), which must drop
                       * into a loop and decrement CX at least once after unmasking the KBD IRQ.  The "KBD_RESET" function on
                       * previous models could be handled with a 4-instruction delay provided by the Keyboard.resetDevice() call
                       * to setIRR(), but the MODEL_5170 needs a roughly 6-instruction delay after it unmasks the KBD IRQ.
                       */
                      this.checkIRR(!iPIC && bOut == 0xFD? 6 : 0);
                  }
              };
              
              /**
               * checkIMR(nIRQ)
               *
               * @this {ChipSet}
               * @param {number} nIRQ
               * @return {boolean} true if the specified IRQ is masked, false if not
               */
              ChipSet.prototype.checkIMR = function(nIRQ)
              {
                  var iPIC = nIRQ >> 3;
                  var nIRL = nIRQ & 0x7;
                  var pic = this.aPICs[iPIC];
                  return (pic.bIMR & (0x1 << nIRL))? true : false;
              };
              
              /**
               * setIRR(nIRQ, nDelay)
               *
               * @this {ChipSet}
               * @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
               * @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of the IRQ (see getIRRVector)
               */
              ChipSet.prototype.setIRR = function(nIRQ, nDelay)
              {
                  var iPIC = nIRQ >> 3;
                  var nIRL = nIRQ & 0x7;
                  var pic = this.aPICs[iPIC];
                  var bIRR = (1 << nIRL);
                  if (!(pic.bIRR & bIRR)) {
                      pic.bIRR |= bIRR;
                      if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
                          this.printMessage("setIRR(" + nIRQ + ")", true);
                      }
                      pic.nDelay = nDelay || 0;
                      this.checkIRR();
                  }
              };
              
              /**
               * clearIRR(nIRQ)
               *
               * @this {ChipSet}
               * @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
               */
              ChipSet.prototype.clearIRR = function(nIRQ)
              {
                  var iPIC = nIRQ >> 3;
                  var nIRL = nIRQ & 0x7;
                  var pic = this.aPICs[iPIC];
                  var bIRR = (1 << nIRL);
                  if (pic.bIRR & bIRR) {
                      pic.bIRR &= ~bIRR;
                      if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
                          this.printMessage("clearIRR(" + nIRQ + ")", true);
                      }
                      this.checkIRR();
                  }
              };
              
              /**
               * checkIRR(nDelay)
               *
               * @this {ChipSet}
               * @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of a pending interrupt
               */
              ChipSet.prototype.checkIRR = function(nDelay)
              {
                  /*
                   * Look for any IRR bits that aren't masked and aren't already in service; in theory, all we'd have to
                   * check is the master PIC (which is the *only* PIC on pre-5170 models), because when any IRQs are set or
                   * cleared on the slave, that would automatically be reflected in IRQ.SLAVE on the master; that's what
                   * setIRR() and clearIRR() used to do.
                   *
                   * Unfortunately, despite setIRR() and clearIRR()'s efforts, whenever a slave interrupt is acknowledged,
                   * getIRRVector() ends up clearing the IRR bits for BOTH the slave's IRQ and the master's IRQ.SLAVE.
                   * So if another lower-priority slave IRQ is waiting to be dispatched, that fact is no longer reflected
                   * in IRQ.SLAVE.
                   *
                   * Since checkIRR() is called on every EOI, we can resolve that problem here, by first checking the slave
                   * PIC for any unmasked, unserviced interrupts and updating the master's IRQ.SLAVE.
                   *
                   * And since this is ALSO called by both setIRR() and clearIRR(), those functions no longer need to perform
                   * their own IRQ.SLAVE updates.  This function consolidates the propagation of slave interrupts to the master.
                   */
                  var pic;
                  var bIR = -1;
              
                  if (this.cPICs > 1) {
                      pic = this.aPICs[1];
                      bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
                  }
              
                  pic = this.aPICs[0];
              
                  if (bIR >= 0) {
                      if (bIR) {
                          pic.bIRR |= (1 << ChipSet.IRQ.SLAVE);
                      } else {
                          pic.bIRR &= ~(1 << ChipSet.IRQ.SLAVE);
                      }
                  }
              
                  bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
              
                  this.cpu.updateINTR(!!bIR);
              
                  if (bIR && nDelay) pic.nDelay = nDelay;
              };
              
              /**
               * getIRRVector()
               *
               * getIRRVector() is called by the CPU whenever PS_IF is set and OP_NOINTR is clear.  Ordinarily, an immediate
               * response would seem perfectly reasonable, but unfortunately, there are places in the original ROM BIOS like
               * "KBD_RESET" (F000:E688) that enable interrupts but still expect nothing to happen for several more instructions.
               *
               * So, in addition to the two normal responses (an IDT vector #, or -1 indicating no pending interrupts), we must
               * support a third response (-2) that basically means: don't change the CPU interrupt state, just keep calling until
               * we return one of the first two responses.  The number of times we delay our normal response is determined by the
               * component that originally called setIRR with an optional delay parameter.
               *
               * @this {ChipSet}
               * @param {number} [iPIC]
               * @return {number} IDT vector # of the next highest-priority interrupt, -1 if none, or -2 for "please try your call again later"
               */
              ChipSet.prototype.getIRRVector = function(iPIC)
              {
                  if (iPIC === undefined) iPIC = 0;
              
                  /*
                   * Look for any IRR bits that aren't masked and aren't already in service...
                   */
                  var nIDT = -1;
                  var pic = this.aPICs[iPIC];
                  if (!pic.nDelay) {
                      var bIR = pic.bIRR & ((pic.bISR | pic.bIMR) ^ 0xff);
                      /*
                       * The search for the next highest priority requested interrupt (that's also not in-service and not masked)
                       * must start with whichever interrupt is opposite the lowest priority interrupt (normally 7, but technically
                       * whatever bIRLow is currently set to).  For example:
                       *
                       *      If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
                       *      If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
                       *      If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
                       *      etc.
                       *
                       * This process is similar to the search performed by non-specific EOIs, except those apply only to a single
                       * PIC (which is why a slave interrupt must be EOI'ed twice: once for the slave PIC and again for the master),
                       * whereas here we must search across all PICs.
                       */
                      var nIRL = pic.bIRLow + 1;
                      while (true) {
                          nIRL &= 0x7;
              
                          var bIRNext = 1 << nIRL;
                          if (bIR & bIRNext) {
              
                              if (!iPIC && nIRL == ChipSet.IRQ.SLAVE) {
                                  /*
                                   * Slave interrupts are tied to the master PIC on IRQ2; query the slave PIC for the vector #
                                   */
                                  nIDT = this.getIRRVector(1);
                              } else {
                                  /*
                                   * Get the starting IDT vector # from ICW2 and add the IR level to obtain the target IDT vector #
                                   */
                                  nIDT = pic.aICW[1] + nIRL;
                              }
              
                              if (nIDT >= 0) {
                                  pic.bISR |= bIRNext;
              
                                  /*
                                   * Setting the ISR implies clearing the IRR, but clearIRR() has side-effects we don't want
                                   * (eg, clearing the slave IRQ, notifying the CPU, etc), so we clear the IRR ourselves.
                                   */
                                  pic.bIRR &= ~bIRNext;
              
                                  var nIRQ = pic.nIRQBase + nIRL;
                                  if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
                                      this.printMessage("getIRRVector(): IRQ " + nIRQ + " interrupting @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
                                  }
                                  if (MAXDEBUG && DEBUGGER) {
                                      this.acInterrupts[nIRQ]++;
                                  }
                              }
                              break;
                          }
              
                          if (nIRL++ == pic.bIRLow) break;
                      }
                  } else {
                      nIDT = -2;
                      pic.nDelay--;
                  }
                  return nIDT;
              };
              
              /**
               * inTimer(iTimer, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @param {number} port (0x40, 0x41, 0x42, etc)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inTimer = function(iTimer, port, addrFrom)
              {
                  var b;
                  var timer = this.aTimers[iTimer];
                  if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
                  if (timer.fLatched) {
                      return timer.countLatched[timer.countIndex++];
                  }
                  this.updateTimer(iTimer);
                  b = timer.countCurrent[timer.countIndex++];
                  if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "TIMER" + iTimer, b, true);
                  }
                  return b;
              };
              
              /**
               * outTimer(iTimer, port, bOut, addrFrom)
               *
               * We now rely EXCLUSIVELY on setBurstCycles() to address situations where quick timer interrupt turn-around
               * is expected; eg, by the ROM BIOS POST when it sets TIMER0 to a low test count (0x16); since we typically
               * don't update any of the timers until after we've finished a burst of CPU cycles, we must reduce the current
               * burst cycle count, so that the current instruction burst will end at the same time a timer interrupt is expected.
               *
               * Note that in some cases, if the number of cycles remaining in the current burst is less than the target,
               * this may have the effect of *lengthening* the current burst instead of shortening it, but stepCPU() should be
               * OK with that.
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @param {number} port (0x40, 0x41, 0x42, etc)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outTimer = function(iTimer, port, bOut, addrFrom)
              {
                  if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "TIMER" + iTimer, null, true);
                  }
                  var timer = this.aTimers[iTimer];
                  if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
                  timer.countInit[timer.countIndex++] = bOut;
                  if (timer.countIndex == timer.countBytes) {
                      /*
                       * In general, writing a new count to a timer that's already counting isn't supposed to affect the current
                       * count, with the notable exceptions of MODE0 and MODE4.
                       */
                      if (!timer.fCounting || timer.mode == ChipSet.PIT_CTRL.MODE0 || timer.mode == ChipSet.PIT_CTRL.MODE4) {
                          timer.fLatched = false;
                          timer.countCurrent[0] = timer.countStart[0] = timer.countInit[0];
                          timer.countCurrent[1] = timer.countStart[1] = timer.countInit[1];
                          timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
                          timer.fCounting = true;
              
                          /*
                           * I believe MODE0 is the only mode where "OUT" (fOUT) starts out "low" (false); for the rest of the modes,
                           * "OUT" (fOUT) starts "high" (true).  It's also my understanding that the way edge-triggered interrupts work
                           * on the original PC is that an interrupt is requested only when the corresponding "OUT" transitions from
                           * "low" to "high".
                           */
                          timer.fOUT = (timer.mode != ChipSet.PIT_CTRL.MODE0);
              
                          if (iTimer == ChipSet.PIT0.TIMER0) {
                              /*
                               * TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
                               */
                              this.clearIRR(ChipSet.IRQ.TIMER0);
                              var countInit = this.getTimerInit(ChipSet.PIT0.TIMER0);
                              var nCyclesRemain = (countInit * this.nTicksDivisor) | 0;
                              if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
                              this.cpu.setBurstCycles(nCyclesRemain);
                          }
                      }
              
                      if (iTimer == ChipSet.PIT0.TIMER2) this.setSpeaker();
                  }
              };
              
              /**
               * inPIT1Ctrl(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x43)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number|null} simulated port value
               */
              ChipSet.prototype.inPIT1Ctrl = function(port, addrFrom)
              {
                  this.printMessageIO(port, null, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
                  if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
                  return null;
              };
              
              /**
               * outPIT1Ctrl(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x43)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPIT1Ctrl = function(port, bOut, addrFrom)
              {
                  this.bPIT1Ctrl = bOut;
                  this.printMessageIO(port, bOut, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
                  /*
                   * Extract the SC (Select Counter) bits
                   */
                  var iTimer = (bOut & ChipSet.PIT_CTRL.SC) >> 6;
                  if (iTimer == 0x3) {
                      if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
                      return;
                  }
                  /*
                   * Extract the BCD, MODE, and RW bits, which we simply store as-is (see setTimerMode)
                   */
                  var bcd = (bOut & ChipSet.PIT_CTRL.BCD);
                  var mode = (bOut & ChipSet.PIT_CTRL.MODE);
                  var rw = (bOut & ChipSet.PIT_CTRL.RW);
                  if (!rw) {
                      this.latchTimer(iTimer);
                  } else {
                      this.setTimerMode(iTimer, bcd, mode, rw);
              
                      /*
                       * The 5150 ROM BIOS code @F000:E285 ("TEST.7") would fail after a warm boot (eg, after a CTRL-ALT-DEL) because
                       * it assumed that no TIMER0 interrupt would occur between the point it unmasked the TIMER0 interrupt and the
                       * point it started reprogramming TIMER0.
                       *
                       * Similarly, the 5160 ROM BIOS @F000:E35D ("8253 TIMER CHECKOUT") would fail after initializing the EGA BIOS,
                       * because the EGA BIOS uses TIMER0 during its diagnostics; as in the previous example, by the time the 8253
                       * test code runs later, there's now a pending TIMER0 interrupt, which triggers an interrupt as soon as IRQ0 is
                       * unmasked @F000:E364.
                       *
                       * After looking at this problem at bit more closely the second time around (while debugging the EGA BIOS),
                       * it turns out I missed an important 8253 feature: whenever a new MODE0 control word OR a new MODE0 count
                       * is written, fOUT (which is what drives IRQ0) goes low.  So, by simply adding an appropriate clearIRR() call
                       * both here and in outTimer(), this annoying problem seems to be gone.
                       *
                       * TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
                       */
                      if (iTimer == ChipSet.PIT0.TIMER0) this.clearIRR(ChipSet.IRQ.TIMER0);
              
                      /*
                       * Another TIMER0 HACK: The "CASSETTE DATA WRAP TEST" @F000:E51E occasionally reports an error when the second of
                       * two TIMER0 counts it latches is greater than the first.  You would think the ROM BIOS would expect this, since
                       * TIMER0 can reload its count at any time.  Is the ROM BIOS assuming that TIMER0 was initialized sufficiently
                       * recently that this should never happen?  I'm not sure, but for now, let's try resetting TIMER0's count immediately
                       * after TIMER2 has been reprogrammed for the test in question (ie, when interrupts are masked and PPIB is set as
                       * shown below).
                       *
                       * FWIW, I believe the cassette hardware was discontinued after MODEL_5150, and even if the test fails, it's non-fatal;
                       * the ROM BIOS displays an error (131) and moves on.
                       */
                      if (iTimer == ChipSet.PIT0.TIMER2) {
                          var pic = this.aPICs[0];
                          if (pic.bIMR == 0xff && this.bPPIB == (ChipSet.PPI_B.CLK_TIMER2 | ChipSet.PPI_B.ENABLE_SW2 | ChipSet.PPI_B.CASS_MOTOR_OFF | ChipSet.PPI_B.CLK_KBD)) {
                              var timer = this.aTimers[0];
                              timer.countStart[0] = timer.countInit[0];
                              timer.countStart[1] = timer.countInit[1];
                              timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
                              if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                                  this.printMessage("TIMER0 count reset @" + timer.nCyclesStart + " cycles", true);
                              }
                          }
                      }
                  }
              };
              
              /**
               * getTimerInit(iTimer)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @return {number} initial timer count
               */
              ChipSet.prototype.getTimerInit = function(iTimer)
              {
                  var timer = this.aTimers[iTimer];
                  var countInit = (timer.countInit[1] << 8) | timer.countInit[0];
                  if (!countInit) countInit = (timer.countBytes == 1? 0x100 : 0x10000);
                  return countInit;
              };
              
              /**
               * getTimerStart(iTimer)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @return {number} starting timer count (from the initial timer count for the current countdown)
               */
              ChipSet.prototype.getTimerStart = function(iTimer)
              {
                  var timer = this.aTimers[iTimer];
                  var countStart = (timer.countStart[1] << 8) | timer.countStart[0];
                  if (!countStart) countStart = (timer.countBytes == 1? 0x100 : 0x10000);
                  return countStart;
              };
              
              /**
               * getTimerCycleLimit(iTimer, nCycles)
               *
               * This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
               * It's presumed that no instructions have been executed since the last updateTimer(iTimer) call.
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @param {number} nCycles desired
               * @return {number} maximum number of cycles remaining for the specified timer (<= nCycles)
               */
              ChipSet.prototype.getTimerCycleLimit = function(iTimer, nCycles)
              {
                  var timer = this.aTimers[iTimer];
                  if (timer.fCounting) {
                      var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
                      var ticksElapsed = ((nCyclesUpdate - timer.nCyclesStart) / this.nTicksDivisor) | 0;
                      this.assert(ticksElapsed >= 0);
                      var countStart = this.getTimerStart(iTimer);
                      var count = countStart - ticksElapsed;
                      if (timer.mode == ChipSet.PIT_CTRL.MODE3) count -= ticksElapsed;
                      this.assert(count > 0);
                      var nCyclesRemain = (count * this.nTicksDivisor) | 0;
                      if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
                      if (nCycles > nCyclesRemain) nCycles = nCyclesRemain;
                  }
                  return nCycles;
              };
              
              /**
               * latchTimer(iTimer)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               */
              ChipSet.prototype.latchTimer = function(iTimer)
              {
                  /*
                   * Update the timer's current count
                   */
                  this.updateTimer(iTimer);
              
                  /*
                   * Now we can latch it
                   */
                  var timer = this.aTimers[iTimer];
                  timer.countLatched[0] = timer.countCurrent[0];
                  timer.countLatched[1] = timer.countCurrent[1];
                  timer.fLatched = true;
              
                  /*
                   * VERIFY: That a latch request resets the timer index
                   */
                  this.resetTimerIndex(iTimer);
              };
              
              /**
               * setTimerMode(iTimer, bcd, mode, rw)
               *
               * FYI: After setting a timer's mode, the CPU must set the timer's count before it becomes operational;
               * ie, before fCounting becomes true.
               *
               * @this {ChipSet}
               * @param {number} iTimer
               * @param {number} bcd
               * @param {number} mode
               * @param {number} rw
               */
              ChipSet.prototype.setTimerMode = function(iTimer, bcd, mode, rw)
              {
                  var timer = this.aTimers[iTimer];
                  timer.rw = rw;
                  timer.mode = mode;
                  timer.bcd = bcd;
                  timer.countInit = [0, 0];
                  timer.countCurrent = [0, 0];
                  timer.countLatched = [0, 0];
                  timer.fOUT = false;
                  timer.fLatched = false;
                  timer.fCounting = false;
                  this.resetTimerIndex(iTimer);
              };
              
              /**
               * resetTimerIndex(iTimer)
               *
               * @this {ChipSet}
               * @param {number} iTimer
               */
              ChipSet.prototype.resetTimerIndex = function(iTimer)
              {
                  var timer = this.aTimers[iTimer];
                  timer.countIndex = (timer.rw == ChipSet.PIT_CTRL.RW_MSB? 1 : 0);
                  timer.countBytes = (timer.rw == ChipSet.PIT_CTRL.RW_BOTH? 2 : 1);
              };
              
              /**
               * updateTimer(iTimer, fCycleReset)
               *
               * updateTimer() calculates and updates a timer's current count purely on an "on-demand" basis; we don't
               * actually adjust timer counters every 4 CPU cycles on a 4.77Mhz PC, since updating timers that frequently
               * would be prohibitively slow.  If you're single-stepping the CPU, then yes, updateTimer() will be called
               * after every stepCPU(), via updateAllTimers(), but if we're doing our job correctly here, the frequency
               * of calls to updateTimer() should not affect timer counts across otherwise identical runs.
               *
               * TODO: Implement support for all TIMER modes, and verify that all the modes currently implemented are
               * "up to spec"; they're close enough to make the ROM BIOS happy, but beyond that, I've done very little.
               *
               * @this {ChipSet}
               * @param {number} iTimer
               *      0: Time-of-Day interrupt (~18.2 interrupts/second)
               *      1: DMA refresh
               *      2: Sound/Cassette
               * @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
               * @return {Object} timer
               */
              ChipSet.prototype.updateTimer = function(iTimer, fCycleReset)
              {
                  var timer = this.aTimers[iTimer];
              
                  /*
                   * Every timer's counting state is gated by its own fCounting flag; TIMER2 is further gated by PPI_B's
                   * CLK_TIMER2 bit.
                   */
                  if (timer.fCounting && (iTimer != ChipSet.PIT0.TIMER2 || (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2))) {
                      /*
                       * We determine the current timer count based on how many instruction cycles have elapsed since we started
                       * the timer.  Timers are supposed to be "ticking" at a rate of 1193181.8181 times per second, which is
                       * the system clock of 14.31818Mhz, divided by 12.
                       *
                       * Similarly, for an 8088, there are supposed to be 4.77Mhz instruction cycles per second, which comes from
                       * the system clock of 14.31818Mhz, divided by 3.
                       *
                       * If we divide 4,772,727 CPU cycles per second by 1,193,181 ticks per second, we get 4 cycles per tick,
                       * which agrees with the ratio of the clock divisors: 12 / 3 == 4.
                       *
                       * However, if getCycles() is being called with fScaleTimers == true AND the CPU is running faster than its
                       * base cycles-per-second setting, then getCycles() will divide the cycle count by the CPU's cycle multiplier,
                       * so that the timers fire with the same real-world frequency that the user expects.  However, that will
                       * break any code (eg, the ROM BIOS diagnostics) that assumes that the timers are ticking once every 4 cycles
                       * (or more like every 5 cycles on a 6Mhz 80286).
                       *
                       * So, when using a machine with the ChipSet "scaletimers" property set, make sure you reset the machine's
                       * speed prior to rebooting, otherwise you're likely to see ROM BIOS errors.  Ditto for any application code
                       * that makes similar assumptions about the relationship between CPU and timer speeds.
                       *
                       * In general, you're probably better off NOT using the "scaletimers" property, and simply allowing the timers
                       * to tick faster as you increase CPU speed (which is why fScaleTimers defaults to false).
                       */
                      var nCycles = this.cpu.getCycles(this.fScaleTimers);
              
                      /*
                       * Instead of maintaining partial tick counts, we calculate a fresh countCurrent from countStart every
                       * time we're called, using the cycle count recorded when the timer was initialized.  countStart is set
                       * to countInit when fCounting is first set, and then it is refreshed from countInit at the expiration of
                       * every count, so that if someone loaded a new countInit in the meantime (eg, BASICA), we'll pick it up.
                       *
                       * For the original MODEL_5170, the number of cycles per tick is approximately 6,000,000 / 1,193,181,
                       * or 5.028575, so we can no longer always divide cycles by 4 with a simple right-shift by 2.  The proper
                       * divisor (eg, 4 for MODEL_5150 and MODEL_5160, 5 for MODEL_5170, etc) is nTicksDivisor, which initBus()
                       * calculates using the base CPU speed returned by cpu.getCyclesPerSecond().
                       */
                      var ticksElapsed = ((nCycles - timer.nCyclesStart) / this.nTicksDivisor) | 0;
              
                      if (ticksElapsed < 0) {
                          if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                              this.printMessage("updateTimer(" + iTimer + "): negative tick count (" + ticksElapsed + ")", true);
                          }
                          timer.nCyclesStart = nCycles;
                          ticksElapsed = 0;
                      }
              
                      var countInit = this.getTimerInit(iTimer);
                      var countStart = this.getTimerStart(iTimer);
              
                      var fFired = false;
                      var count = countStart - ticksElapsed;
              
                      /*
                       * NOTE: This mode is used by ROM BIOS test code that wants to verify timer interrupts are arriving
                       * neither too slowly nor too quickly.  As a result, I've had to add some corresponding trickery
                       * in outTimer() to force interrupt simulation immediately after a low initial count (0x16) has been set.
                       */
                      if (timer.mode == ChipSet.PIT_CTRL.MODE0) {
                          if (count <= 0) count = 0;
                          if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                              this.printMessage("updateTimer(" + iTimer + "): MODE0 timer count=" + count, true);
                          }
                          if (!count) {
                              timer.fOUT = true;
                              timer.fCounting = false;
                              if (!iTimer) {
                                  fFired = true;
                                  this.setIRR(ChipSet.IRQ.TIMER0);
                                  if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                              }
                          }
                      }
                      /*
                       * Early implementation of this mode was minimal because when using this mode, the ROM BIOS simply wanted
                       * to see the count changing; it wasn't looking for interrupts.  See ROM BIOS "TEST.03" code @F000:E0DE,
                       * where TIMER1 is programmed for MODE2, LSB (the same settings, incidentally, used immediately afterward
                       * for TIMER1 in conjunction with DMA channel 0 memory refreshes).
                       *
                       * Now this mode generates interrupts.  Note that "OUT" goes "low" when the count reaches 1, then "high"
                       * one tick later, at which point the count is reloaded and counting continues.
                       *
                       * Chances are, we will often miss the exact point at which the count becomes 1 (or more importantly, one
                       * tick later, when the count *would* become 0, since that's when "OUT" transitions from "low" to "high"),
                       * but as with MODE3, hopefully no one will mind.
                       *
                       * FYI, technically, it appears that the count is never supposed to reach 0, and that an initial count of 1
                       * is "illegal", whatever that means.
                       */
                      else if (timer.mode == ChipSet.PIT_CTRL.MODE2) {
                          timer.fOUT = (count != 1);          // yes, this line does seem rather pointless....
                          if (count <= 0) {
                              count = countInit + count;
                              if (count <= 0) {
                                  /*
                                   * TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
                                   */
                                  if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
                                      this.printMessage("updateTimer(" + iTimer + "): mode=2, underflow=" + count, true);
                                  }
                                  count = countInit;
                              }
                              timer.countStart[0] = count & 0xff;
                              timer.countStart[1] = count >> 8;
                              timer.nCyclesStart = nCycles;
                              if (!iTimer && timer.fOUT) {
                                  fFired = true;
                                  this.setIRR(ChipSet.IRQ.TIMER0);
                                  if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                              }
                          }
                      }
                      /*
                       * NOTE: This is the normal mode for TIMER0, which the ROM BIOS uses to generate h/w interrupts roughly
                       * 18.2 times per second.  In this mode, the count must be decremented twice as fast (hence the extra ticks
                       * subtraction below, in addition to the subtraction above), but IRQ_TIMER0 is raised only on alternate
                       * iterations; ie, only when fOUT transitions to true ("high").  The equal alternating fOUT states is why
                       * this mode is referred to as "square wave" mode.
                       *
                       * TODO: Implement the correct behavior for this mode when the count is ODD.  In that case, fOUT is supposed
                       * to be "high" for (N + 1) / 2 ticks and "low" for (N - 1) / 2 ticks.
                       */
                      else if (timer.mode == ChipSet.PIT_CTRL.MODE3) {
                          count -= ticksElapsed;
                          if (count <= 0) {
                              timer.fOUT = !timer.fOUT;
                              count = countInit + count;
                              if (count <= 0) {
                                  /*
                                   * TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
                                   */
                                  if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
                                      this.printMessage("updateTimer(" + iTimer + "): mode=3, underflow=" + count, true);
                                  }
                                  count = countInit;
                              }
                              if (MAXDEBUG && DEBUGGER && !iTimer) {
                                  var nCycleDelta = 0;
                                  if (this.acTimer0Counts.length > 0) nCycleDelta = nCycles - this.acTimer0Counts[0][1];
                                  this.acTimer0Counts.push([count, nCycles, nCycleDelta]);
                              }
                              timer.countStart[0] = count & 0xff;
                              timer.countStart[1] = count >> 8;
                              timer.nCyclesStart = nCycles;
                              if (!iTimer && timer.fOUT) {
                                  fFired = true;
                                  this.setIRR(ChipSet.IRQ.TIMER0);
                                  if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                              }
                          }
                      }
              
                      if (DEBUG && this.messageEnabled(Messages.TIMER | Messages.LOG)) {
                          this.log("TIMER" + iTimer + " count: " + count + ", ticks: " + ticksElapsed + ", fired: " + (fFired? "true" : "false"));
                      }
              
                      timer.countCurrent[0] = count & 0xff;
                      timer.countCurrent[1] = count >> 8;
                      if (fCycleReset) this.nCyclesStart = 0;
                  }
                  return timer;
              };
              
              /**
               * updateAllTimers(fCycleReset)
               *
               * @this {ChipSet}
               * @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
               */
              ChipSet.prototype.updateAllTimers = function(fCycleReset)
              {
                  for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                      this.updateTimer(iTimer, fCycleReset);
                  }
                  if (this.model >= ChipSet.MODEL_5170) this.updateRTCTime();
              };
              
              /**
               * inPPIA(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x60)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPPIA = function(port, addrFrom)
              {
                  var b = this.bPPIA;
                  if (this.bPPICtrl & ChipSet.PPI_CTRL.A_IN) {
                      if (this.bPPIB & ChipSet.PPI_B.CLEAR_KBD) {
                          b = this.sw1;
                      }
                      else if (this.kbd) {
                          b = this.kbd.readScanCode();
                      }
                  }
                  this.printMessageIO(port, null, addrFrom, "PPI_A", b);
                  return b;
              };
              
              /**
               * outPPIA(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x60)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPPIA = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PPI_A");
                  this.bPPIA = bOut;
              };
              
              /**
               * inPPIB(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x61)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPPIB = function(port, addrFrom)
              {
                  var b = this.bPPIB;
                  this.printMessageIO(port, null, addrFrom, "PPI_B", b);
                  return b;
              };
              
              /**
               * outPPIB(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x61)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPPIB = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PPI_B");
                  this.updatePPIB(bOut);
                  if (this.kbd) this.kbd.setEnabled((bOut & ChipSet.PPI_B.CLEAR_KBD)? false : true, (bOut & ChipSet.PPI_B.CLK_KBD)? true : false);
              };
              
              /**
               * updatePPIB(bOut)
               *
               * On MODEL_5170 and up, this updates the "simulated" PPI_B.  The only common (and well-documented) PPI_B bits
               * across all models are PPI_B.CLK_TIMER2 and PPI_B.SPK_TIMER2, so its possible that this function may need to
               * limit its updates to just those bits, and move any model-specific requirements back into the appropriate I/O
               * handlers (PPIB or 8042RWReg).  We'll see.
               *
               * @this {ChipSet}
               * @param {number} bOut
               */
              ChipSet.prototype.updatePPIB = function(bOut)
              {
                  var fNewSpeaker = !!(bOut & ChipSet.PPI_B.SPK_TIMER2);
                  var fOldSpeaker = !!(this.bPPIB & ChipSet.PPI_B.SPK_TIMER2);
                  this.bPPIB = bOut;
                  if (fNewSpeaker != fOldSpeaker) {
                      /*
                       * Originally, this code didn't catch the "ERROR_BEEP" case @F000:EC34, which first turns both PPI_B.CLK_TIMER2 (0x01)
                       * and PPI_B.SPK_TIMER2 (0x02) off, then turns on only PPI_B.SPK_TIMER2 (0x02), then restores the original port value.
                       *
                       * So, when the ROM BIOS keyboard buffer got full, we didn't issue a BEEP alert.  I've fixed that by limiting the test
                       * to PPI_B.SPK_TIMER2 and ignoring PPI_B.CLK_TIMER2.
                       */
                      this.setSpeaker(fNewSpeaker);
                  }
              };
              
              /**
               * inPPIC(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x62)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPPIC = function(port, addrFrom)
              {
                  var b = 0;
              
                  /*
                   * If you ever wanted to simulate I/O channel errors or R/W memory parity errors, you could
                   * add either PPI_C.IO_CHANNEL_CHK (0x40) or PPI_C.RW_PARITY_CHK (0x80) to the return value (b).
                   */
                  if (this.model == ChipSet.MODEL_5150) {
                      if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW2) {
                          b |= this.sw2 & ChipSet.PPI_C.SW;
                      } else {
                          b |= (this.sw2 >> 4) & 0x1;     // QUESTION: Does any component actually care about SW2[5] on a MODEL_5150?
                      }
                  } else {
                      if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW_HI) {
                          b |= this.sw1 >> 4;
                      } else {
                          b |= this.sw1 & 0xf;
                      }
                  }
              
                  if (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2) {
                      var timer = this.updateTimer(ChipSet.PIT0.TIMER2);
                      if (timer.fOUT) {
                          if (this.bPPIB & ChipSet.PPI_B.SPK_TIMER2)
                              b |= ChipSet.PPI_C.TIMER2_OUT;
                          else
                              b |= ChipSet.PPI_C.CASS_DATA_IN;
                      }
                  }
              
                  /*
                   * The ROM BIOS polls this port incessantly during its memory tests, checking for memory parity errors
                   * (which of course we never report), so we further restrict these port messages to Messages.MEM.
                   */
                  this.printMessageIO(port, null, addrFrom, "PPI_C", b, Messages.CHIPSET | Messages.MEM);
                  return b;
              };
              
              /**
               * outPPIC(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x62)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.outPPIC = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PPI_C");
                  this.bPPIC = bOut;
              };
              
              /**
               * inPPICtrl(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x63)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inPPICtrl = function(port, addrFrom)
              {
                  var b = this.bPPICtrl;
                  this.printMessageIO(port, null, addrFrom, "PPI_CTRL", b);
                  return b;
              };
              
              /**
               * outPPICtrl(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x63)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outPPICtrl = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PPI_CTRL");
                  this.bPPICtrl = bOut;
              };
              
              /**
               * in8042OutBuff(port, addrFrom)
               *
               * Return the contents of the OUTBUFF register and clear the OUTBUFF_FULL status bit.
               *
               * This function then calls kbd.checkScanCode(), on the theory that the next buffered scan
               * code, if any, can now be delivered to OUTBUFF.  However, there are applications like
               * BASICA that install a keyboard interrupt handler that reads OUTBUFF, do some scan code
               * preprocessing, and then pass control on to the ROM's interrupt handler.  As a result,
               * OUTBUFF is read multiple times during a single interrupt, so filling it with new data
               * after every read would result in lost scan codes.
               *
               * To avoid that problem, kbd.checkScanCode() also requires that kbd.setEnabled() be called
               * before it supplies any more data via notifyKbdData().  That will happen as soon as the
               * ROM re-enables the controller, and is why KBC.CMD.ENABLE_KBD processing also ends with a
               * call to kbd.checkScanCode().
               *
               * Note that, the foregoing notwithstanding, I still clear the OUTBUFF_FULL bit here (as I
               * believe I should); fortunately, none of the interrupt handlers rely on OUTBUFF_FULL as a
               * prerequisite for reading OUTBUFF (not the BASICA handler, and not the ROM).  The assumption
               * seems to be that if an interrupt occurred, OUTBUFF must contain data, regardless of the
               * state of OUTBUFF_FULL.
               *
               * @this {ChipSet}
               * @param {number} port (0x60)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.in8042OutBuff = function(port, addrFrom)
              {
                  var b = this.b8042OutBuff;
                  this.printMessageIO(port, null, addrFrom, "8042_OUTBUFF", b, Messages.C8042);
                  this.b8042Status &= ~(ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY);
                  if (this.kbd) this.kbd.checkScanCode();
                  return b;
              };
              
              /**
               * out8042InBuffData(port, bOut, addrFrom)
               *
               * This writes to the 8042's input buffer; using this port (ie, 0x60 instead of 0x64) designates the
               * the byte as a KBC.DATA.CMD "data byte".  Before clearing KBC.STATUS.CMD_FLAG, however, we see if it's set,
               * and then based on the previous KBC.CMD "command byte", we do whatever needs to be done with this "data byte".
               *
               * @this {ChipSet}
               * @param {number} port (0x60)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.out8042InBuffData = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "8042_INBUF.DATA", null, Messages.C8042);
              
                  if (this.b8042Status & ChipSet.KBC.STATUS.CMD_FLAG) {
                      switch (this.b8042InBuff) {
              
                      case ChipSet.KBC.CMD.WRITE_CMD:
                          this.set8042CmdData(bOut);
                          break;
              
                      case ChipSet.KBC.CMD.WRITE_OUTPORT:
                          this.set8042OutPort(bOut);
                          break;
              
                      /*
                       * This case is reserved for command bytes that the 8042 is not expecting, which should therefore be passed on
                       * to the Keyboard itself.
                       *
                       * Here's some relevant MODEL_5170 ROM BIOS code, "XMIT_8042" (missing from the original MODEL_5170 ROM BIOS listing),
                       * which sends a command code in AL to the Keyboard and waits for a response, returning it in AL.  Note that
                       * the only "success" exit path from this function involves LOOPing 64K times before finally reading the Keyboard's
                       * response; either the hardware and/or this code seems a bit brain-damaged if that's REALLY what you had to do to ensure
                       * a valid response....
                       *
                       *      F000:1B25 86E0          XCHG     AH,AL
                       *      F000:1B27 2BC9          SUB      CX,CX
                       *      F000:1B29 E464          IN       AL,64
                       *      F000:1B2B A802          TEST     AL,02      ; WAIT FOR INBUFF_FULL TO BE CLEAR
                       *      F000:1B2D E0FA          LOOPNZ   1B29
                       *      F000:1B2F E334          JCXZ     1B65       ; EXIT WITH ERROR (CX == 0)
                       *      F000:1B31 86E0          XCHG     AH,AL
                       *      F000:1B33 E660          OUT      60,AL      ; SAFE TO WRITE KEYBOARD CMD TO INBUFF NOW
                       *      F000:1B35 2BC9          SUB      CX,CX
                       *      F000:1B37 E464          IN       AL,64
                       *      F000:1B39 8AE0          MOV      AH,AL
                       *      F000:1B3B A801          TEST     AL,01
                       *      F000:1B3D 7402          JZ       1B41
                       *      F000:1B3F E460          IN       AL,60      ; READ PORT 0x60 IF OUTBUFF_FULL SET ("FLUSH"?)
                       *      F000:1B41 F6C402        TEST     AH,02
                       *      F000:1B44 E0F1          LOOPNZ   1B37
                       *      F000:1B46 751D          JNZ      1B65       ; EXIT WITH ERROR (CX == 0)
                       *      F000:1B48 B306          MOV      BL,06
                       *      F000:1B4A 2BC9          SUB      CX,CX
                       *      F000:1B4C E464          IN       AL,64
                       *      F000:1B4E A801          TEST     AL,01
                       *      F000:1B50 E1FA          LOOPZ    1B4C
                       *      F000:1B52 7508          JNZ      1B5C       ; PROCEED TO EXIT NOW THAT OUTBUFF_FULL IS SET
                       *      F000:1B54 FECB          DEC      BL
                       *      F000:1B56 75F4          JNZ      1B4C
                       *      F000:1B58 FEC3          INC      BL
                       *      F000:1B5A EB09          JMP      1B65       ; EXIT WITH ERROR (CX == 0)
                       *      F000:1B5C 2BC9          SUB      CX,CX
                       *      F000:1B5E E2FE          LOOP     1B5E       ; LOOOOOOPING....
                       *      F000:1B60 E460          IN       AL,60
                       *      F000:1B62 83E901        SUB      CX,0001    ; EXIT WITH SUCCESS (CX != 0)
                       *      F000:1B65 C3            RET
                       *
                       * But WAIT, the FUN doesn't end there.  After this function returns, "KBD_RESET" waits for a Keyboard interrupt
                       * to occur, hoping for scan code 0xAA as the Keyboard's final response.  "KBD_RESET" also returns CX to the caller,
                       * and the caller ("TEST.21") assumes there was no interrupt if CX is zero.
                       *
                       *              MOV     AL,0FDH
                       *              OUT     INTA01,AL
                       *              MOV     INTR_FLAG,0
                       *              STI
                       *              MOV     BL,10
                       *              SUB     CX,CX
                       *      G11:    TEST    [1NTR_FLAG],02H
                       *              JNZ     G12
                       *              LOOP    G11
                       *              DEC     BL
                       *              JNZ     G11
                       *              ...
                       *
                       * However, if [INTR_FLAG] is set immediately, the above code will exit immediately, without ever decrementing CX.
                       * CX can be zero not only if the loop exhausted it, but also if no looping was required; the latter is not an
                       * error, but "TEST.21" assumes that it is.
                       */
                      default:
                          this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
                          if (this.kbd) this.set8042OutBuff(this.kbd.sendCmd(bOut));
                          break;
                      }
                  }
                  this.b8042InBuff = bOut;
                  this.b8042Status &= ~ChipSet.KBC.STATUS.CMD_FLAG;
              };
              
              /**
               * in8042RWReg(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x61)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.in8042RWReg = function(port, addrFrom)
              {
                  /*
                   * Normally, we return whatever was last written to this port, but we do need to mask the
                   * two upper-most bits (KBC.RWREG.NMI_ERROR), as those are output-only bits used to signal
                   * parity errors.
                   *
                   * Also, "TEST.09" of the MODEL_5170 BIOS expects the REFRESH_BIT to alternate, so we used to
                   * do this:
                   *
                   *      this.bPPIB ^= ChipSet.KBC.RWREG.REFRESH_BIT;
                   *
                   * However, the MODEL_5170_REV3 BIOS not only checks REFRESH_BIT in "TEST.09", but includes
                   * an additional test right before "TEST.11A", which requires the bit change "a bit less"
                   * frequently.  This new test sets CX to zero, and at the end of the test (@F000:05B8), CX
                   * must be in the narrow range of 0xF600 through 0xF9FD.
                   *
                   * In fact, the new "WAITF" function @F000:1A3A tells us exactly how frequently REFRESH_BIT
                   * is expected to change now.  That function performs a "FIXED TIME WAIT", where CX is a
                   * "COUNT OF 15.085737us INTERVALS TO WAIT".
                   *
                   * So we now tie the state of the REFRESH_BIT to bit 6 of the current CPU cycle count,
                   * effectively toggling the bit after every 64 cycles.  On an 8Mhz CPU that can do 8 cycles
                   * in 1us, 64 cycles represents 8us, so that might be a bit fast for "WAITF", but bit 6
                   * is the only choice that also satisfies the pre-"TEST.11A" test as well.
                   */
                  var b = this.bPPIB & ~(ChipSet.KBC.RWREG.NMI_ERROR | ChipSet.KBC.RWREG.REFRESH_BIT) | ((this.cpu.getCycles() & 0x40)? ChipSet.KBC.RWREG.REFRESH_BIT : 0);
                  /*
                   * Thanks to the WAITF function, this has become a very "busy" port, so if this generates too
                   * many messages, try adding Messages.LOG to the criteria.
                   */
                  this.printMessageIO(port, null, addrFrom, "8042_RWREG", b, Messages.C8042);
                  return b;
              };
              
              /**
               * out8042RWReg(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x61)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               */
              ChipSet.prototype.out8042RWReg = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "8042_RWREG", null, Messages.C8042);
                  this.updatePPIB(bOut);
              };
              
              /**
               * in8042Status(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x64)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.in8042Status = function(port, addrFrom)
              {
                  this.printMessageIO(port, null, addrFrom, "8042_STATUS", this.b8042Status, Messages.C8042);
                  var b = this.b8042Status & 0xff;
                  /*
                   * There's code in the 5170 BIOS (F000:03BF) that writes an 8042 command (0xAA), waits for
                   * KBC.STATUS.INBUFF_FULL to go clear (which it always is, because we always accept commands
                   * immediately), then checks KBC.STATUS.OUTBUFF_FULL and performs a "flush" on port 0x60 if
                   * it's set, then waits for KBC.STATUS.OUTBUFF_FULL *again*.  Unfortunately, the "flush" throws
                   * away our response if we respond immediately.
                   *
                   * So now when out8042InBuffCmd() has a response, it sets KBC.STATUS.OUTBUFF_DELAY instead
                   * (which is outside the 0xff range of bits we return); when we see KBC.STATUS.OUTBUFF_DELAY,
                   * we clear it and set KBC.STATUS.OUTBUFF_FULL, which will be returned on the next read.
                   *
                   * This provides a single poll delay, so that the aforementioned "flush" won't toss our response.
                   * If longer delays are needed down the road, we may need to set a delay count in the upper (hidden)
                   * bits of b8042Status, instead of using a single delay bit.
                   */
                  if (this.b8042Status & ChipSet.KBC.STATUS.OUTBUFF_DELAY) {
                      this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
                      this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_DELAY;
                  }
                  return b;
              };
              
              /**
               * out8042InBuffCmd(port, bOut, addrFrom)
               *
               * This writes to the 8042's input buffer; using this port (ie, 0x64 instead of 0x60) designates the
               * the byte as a "command byte".  We immediately set KBC.STATUS.CMD_FLAG, and then see if we can act upon
               * the command immediately (some commands requires us to wait for a "data byte").
               *
               * @this {ChipSet}
               * @param {number} port (0x64)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.out8042InBuffCmd = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "8042_INBUFF.CMD", null, Messages.C8042);
                  this.assert(!(this.b8042Status & ChipSet.KBC.STATUS.INBUFF_FULL));
                  this.b8042InBuff = bOut;
              
                  this.b8042Status |= ChipSet.KBC.STATUS.CMD_FLAG;
              
                  var bPulseBits = 0;
                  if (this.b8042InBuff >= ChipSet.KBC.CMD.PULSE_OUTPORT) {
                      bPulseBits = (this.b8042InBuff ^ 0xf);
                      /*
                       * Now that we have isolated the bit(s) to pulse, map all pulse commands to KBC.CMD.PULSE_OUTPORT
                       */
                      this.b8042InBuff = ChipSet.KBC.CMD.PULSE_OUTPORT;
                  }
              
                  switch (this.b8042InBuff) {
                  case ChipSet.KBC.CMD.READ_CMD:          // 0x20
                      this.set8042OutBuff(this.b8042CmdData);
                      break;
              
                  case ChipSet.KBC.CMD.WRITE_CMD:         // 0x60
                      /*
                       * No further action required for this command; more data is expected via out8042InBuffData()
                       */
                      break;
              
                  case ChipSet.KBC.CMD.DISABLE_KBD:       // 0xAD
                      this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
                      if (DEBUG) this.printMessage("keyboard disabled", Messages.KEYBOARD | Messages.PORT);
                      /*
                       * NOTE: The MODEL_5170 BIOS calls "KBD_RESET" (F000:17D2) while the keyboard interface is disabled,
                       * yet we must still deliver the Keyboard's CMDRES.BAT_OK response code?  Seems like an odd thing for
                       * a "disabled interface" to do.
                       */
                      break;
              
                  case ChipSet.KBC.CMD.ENABLE_KBD:        // 0xAE
                      this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
                      if (DEBUG) this.printMessage("keyboard re-enabled", Messages.KEYBOARD | Messages.PORT);
                      if (this.kbd) this.kbd.checkScanCode();
                      break;
              
                  case ChipSet.KBC.CMD.SELF_TEST:         // 0xAA
                      if (this.kbd) this.kbd.flushScanCode();
                      this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
                      if (DEBUG) this.printMessage("keyboard disabled on reset", Messages.KEYBOARD | Messages.PORT);
                      this.set8042OutBuff(ChipSet.KBC.DATA.SELF_TEST.OK);
                      this.set8042OutPort(ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON);
                      break;
              
                  case ChipSet.KBC.CMD.INTF_TEST:         // 0xAB
                      /*
                       * TODO: Determine all the side-effects of the Interface Test, if any.
                       */
                      this.set8042OutBuff(ChipSet.KBC.DATA.INTF_TEST.OK);
                      break;
              
                  case ChipSet.KBC.CMD.READ_INPORT:       // 0xC0
                      this.set8042OutBuff(this.b8042InPort);
                      break;
              
                  case ChipSet.KBC.CMD.READ_OUTPORT:      // 0xD0
                      this.set8042OutBuff(this.b8042OutPort);
                      break;
              
                  case ChipSet.KBC.CMD.WRITE_OUTPORT:     // 0xD1
                      /*
                       * No further action required for this command; more data is expected via out8042InBuffData()
                       */
                      break;
              
                  case ChipSet.KBC.CMD.READ_TEST:         // 0xE0
                      this.set8042OutBuff((this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)? 0 : ChipSet.KBC.TESTPORT.KBD_CLOCK);
                      break;
              
                  case ChipSet.KBC.CMD.PULSE_OUTPORT:     // 0xF0-0xFF
                      if (bPulseBits & 0x1) {
                          /*
                           * Bit 0 of the 8042's output port is connected to RESET.  If it's pulsed, the processor resets.
                           * We don't want to clear *all* CPU state (eg, cycle counts), so we call cpu.resetRegs() instead
                           * of cpu.reset().
                           */
                          this.cpu.resetRegs();
                      }
                      break;
              
                  default:
                      if (DEBUG && this.messageEnabled(Messages.C8042)) {
                          this.printMessage("unrecognized 8042 command: " + str.toHexByte(this.b8042InBuff), true);
                          this.dbg.stopCPU();
                      }
                      break;
                  }
              };
              
              /**
               * set8042CmdData(b)
               *
               * @this {ChipSet}
               * @param {number} b
               */
              ChipSet.prototype.set8042CmdData = function(b)
              {
                  var bClockWasEnabled = !(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK);
                  this.b8042CmdData = b;
                  this.assert(ChipSet.KBC.DATA.CMD.SYS_FLAG === ChipSet.KBC.STATUS.SYS_FLAG);
                  this.b8042Status = (this.b8042Status & ~ChipSet.KBC.STATUS.SYS_FLAG) | (b & ChipSet.KBC.DATA.CMD.SYS_FLAG);
                  if (this.kbd) {
                      /*
                       * This seems to be what the doctor ordered for the MODEL_5170_REV3 BIOS @F000:0A6D, where it
                       * sends ChipSet.KBC.CMD.WRITE_CMD to port 0x64, followed by 0x4D to port 0x60, which clears NO_CLOCK
                       * and enables the keyboard.  The BIOS then waits for OUTBUFF_FULL to be set, at which point it seems
                       * to be anticipating an 0xAA response in the output buffer.
                       *
                       * And indeed, if we call the original MODEL_5150/MODEL_5160 setEnabled() Keyboard interface here,
                       * and both the data and clock lines have transitioned high (ie, both parameters are true), then it
                       * will call resetDevice(), generating a Keyboard.CMDRES.BAT_OK response.
                       *
                       * This agrees with my understanding of what happens when the 8042 toggles the clock line high
                       * (ie, clears NO_CLOCK): the TechRef's "Basic Assurance Test" section says that when the Keyboard is
                       * powered on, it performs the BAT, and then when the clock and data lines go high, the keyboard sends
                       * a completion code (eg, 0xAA for success, or 0xFC or something else for failure).
                       */
                      var bClockEnabled = !(b & ChipSet.KBC.DATA.CMD.NO_CLOCK);
                      this.kbd.setEnabled(!!(b & ChipSet.KBC.DATA.CMD.NO_INHIBIT), bClockEnabled);
                  }
              };
              
              /**
               * set8042OutBuff(b, fNoDelay)
               *
               * The 5170 ROM BIOS assumed there would be a slight delay after certain 8042 commands, like SELF_TEST
               * (0xAA), before there was an OUTBUFF response; in fact, there is BIOS code that will fail without such
               * a delay.  This is discussed in greater detail in in8042Status().
               *
               * So we default to a "single poll" delay, setting OUTBUFF_DELAY instead of OUTBUFF_FULL, unless the caller
               * explicitly asks for no delay.  The fNoDelay parameter was added later, so that notifyKbdData() could
               * request immediate delivery of keyboard scan codes, because some operating systems (eg, Microport's 1986
               * version of Unix for PC AT machines) poll the status port only once, immediately giving up if no data is
               * available.
               *
               * TODO: Determine if we can/should invert the fNoDelay default (from false to true) and delay only in
               * specific cases; perhaps only the SELF_TEST command required a delay.
               *
               * @this {ChipSet}
               * @param {number} b
               * @param {boolean} [fNoDelay]
               */
              ChipSet.prototype.set8042OutBuff = function(b, fNoDelay)
              {
                  if (b >= 0) {
                      this.b8042OutBuff = b;
                      if (fNoDelay) {
                          this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
                      } else {
                          this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_FULL;
                          this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_DELAY;
                      }
                      if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                          this.printMessage("set8042OutBuff(" + str.toHexByte(b) + ")", true);
                      }
                  }
              };
              
              /**
               * set8042OutPort(b)
               *
               * @this {ChipSet}
               * @param {number} b
               */
              ChipSet.prototype.set8042OutPort = function(b)
              {
                  this.b8042OutPort = b;
              
                  this.bus.setA20(!!(b & ChipSet.KBC.OUTPORT.A20_ON));
              
                  if (!(b & ChipSet.KBC.OUTPORT.NO_RESET)) {
                      /*
                       * Bit 0 of the 8042's output port is connected to RESET.  Normally, it's "pulsed" with the
                       * KBC.CMD.PULSE_OUTPORT command, so if a RESET is detected via this command, we should try to
                       * determine if that's what the caller intended.
                       */
                      if (DEBUG && this.messageEnabled(Messages.C8042)) {
                          this.printMessage("unexpected 8042 output port reset: " + str.toHexByte(b), true);
                          this.dbg.stopCPU();
                      }
                      this.cpu.resetRegs();
                  }
              };
              
              /**
               * notifyKbdData(b)
               *
               * In the old days of PCjs, the Keyboard component would simply call setIRR() when it had some data for the
               * keyboard controller.  However, the Keyboard's sole responsibility is to emulate an actual keyboard and call
               * notifyKbdData() whenever it has some data; it's not allowed to mess with IRQ lines.
               *
               * If there's an 8042, we check (this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK); if NO_CLOCK is clear,
               * we can raise the IRQ immediately.  Well, not quite immediately....
               *
               * Notes regarding the MODEL_5170 (eg, /devices/pc/machine/5170/ega/1152kb/rev3/machine.xml):
               *
               * The "Rev3" BIOS, dated 11-Nov-1985, contains the following code in the keyboard interrupt handler at K26A:
               *
               *      F000:3704 FA            CLI
               *      F000:3705 B020          MOV      AL,20
               *      F000:3707 E620          OUT      20,AL
               *      F000:3709 B0AE          MOV      AL,AE
               *      F000:370B E88D02        CALL     SHIP_IT
               *      F000:370E FA            CLI                     <-- window of opportunity
               *      F000:370F 07            POP      ES
               *      F000:3710 1F            POP      DS
               *      F000:3711 5F            POP      DI
               *      F000:3712 5E            POP      SI
               *      F000:3713 5A            POP      DX
               *      F000:3714 59            POP      CX
               *      F000:3715 5B            POP      BX
               *      F000:3716 58            POP      AX
               *      F000:3717 5D            POP      BP
               *      F000:3718 CF            IRET
               *
               * and SHIP_IT looks like this:
               *
               *      F000:399B 50            PUSH     AX
               *      F000:399C FA            CLI
               *      F000:399D 2BC9          SUB      CX,CX
               *      F000:399F E464          IN       AL,64
               *      F000:39A1 A802          TEST     AL,02
               *      F000:39A3 E0FA          LOOPNZ   399F
               *      F000:39A5 58            POP      AX
               *      F000:39A6 E664          OUT      64,AL
               *      F000:39A8 FB            STI
               *      F000:39A9 C3            RET
               *
               * This code *appears* to be trying to ensure that another keyboard interrupt won't occur until after the IRET,
               * but sadly, it looks to me like the CLI following the call to SHIP_IT is too late.  SHIP_IT should have been
               * written with PUSHF/CLI and POPF intro/outro sequences, thereby honoring the first CLI at the top of K26A and
               * eliminating the need for the second CLI (@F000:370E).
               *
               * Of course, in "real life", this was probably never a problem, because the 8042 probably wasn't fast enough to
               * generate another interrupt so soon after receiving the ChipSet.KBC.CMD.ENABLE_KBD command.  In my case, I ran
               * into this problem by 1) turning on "kbd" Debugger messages and 2) rapidly typing lots of keys.  The Debugger
               * messages bogged the machine down enough for me to hit the "window of opportunity", generating this message in
               * PC-DOS 3.20:
               *
               *      "FATAL: Internal Stack Failure, System Halted."
               *
               * and halting the system @0070:0923 (JMP 0923).
               *
               * That wasn't the only spot in the BIOS where I hit this problem; here's another "window of opportunity":
               *
               *      F000:3975 FA            CLI
               *      F000:3976 B020          MOV      AL,20
               *      F000:3978 E620          OUT      20,AL
               *      F000:397A B0AE          MOV      AL,AE
               *      F000:397C E81C00        CALL     SHIP_IT
               *      F000:397F B80291        MOV      AX,9102        <-- window of opportunity
               *      F000:3982 CD15          INT      15
               *      F000:3984 80269600FC    AND      [0096],FC
               *      F000:3989 E982FD        JMP      370E
               *
               * In this second, lengthier, example, I counted about 60 instructions being executed from the EOI @F000:3978 to
               * the final IRET @F000:3718, most of them in the INT 0x15 handler.  So, I'm going to double that count to 120
               * instructions, just to be safe, and pass that along to every setIRR() call we make here.
               *
               * @this {ChipSet}
               * @param {number} b
               */
              ChipSet.prototype.notifyKbdData = function(b)
              {
                  if (this.model < ChipSet.MODEL_5170) {
                      /*
                       * TODO: Should we be checking bPPI for PPI_B.CLK_KBD on these older machines, before calling setIRR()?
                       */
                      this.setIRR(ChipSet.IRQ.KBD, 4);
                  }
                  else {
                      if (!(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)) {
                          /*
                           * The next read of b8042OutBuff will clear both of these bits and call kbd.checkScanCode(),
                           * which will call notifyKbdData() again if there's still keyboard data to process.
                           */
                          if (!(this.b8042Status & (ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY))) {
                              this.set8042OutBuff(b, true);
                              this.kbd.shiftScanCode();
                              /*
                               * A delay of 4 instructions was originally requested as part of the the Keyboard's resetDevice()
                               * response, but a larger delay (120) is now needed for MODEL_5170 machines, per the discussion above.
                               */
                              this.setIRR(ChipSet.IRQ.KBD, 120);
                          }
                          else {
                              if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                                  this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): output buffer full", true);
                              }
                          }
                      } else {
                          if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                              this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): disabled", true);
                          }
                      }
                  }
              };
              
              /**
               * inCMOSAddr(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x70)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inCMOSAddr = function(port, addrFrom)
              {
                  this.printMessageIO(port, null, addrFrom, "CMOS.ADDR", this.bCMOSAddr, Messages.CMOS);
                  return this.bCMOSAddr;
              };
              
              /**
               * outCMOSAddr(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x70)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outCMOSAddr = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "CMOS.ADDR", null, Messages.CMOS);
                  this.bCMOSAddr = bOut;
                  this.bNMI = (bOut & ChipSet.CMOS.ADDR.NMI_DISABLE)? ChipSet.NMI.DISABLE : ChipSet.NMI.ENABLE;
              };
              
              /**
               * inCMOSData(port, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x71)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
               * @return {number} simulated port value
               */
              ChipSet.prototype.inCMOSData = function(port, addrFrom)
              {
                  var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
                  var bIn = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(bAddr) : this.abCMOSData[bAddr]);
                  if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
                      this.printMessageIO(port, null, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", bIn, true);
                  }
                  if (addrFrom != null) {
                      if (bAddr == ChipSet.CMOS.ADDR.STATUSC) {
                          /*
                           * When software reads the STATUSC port, all interrupt bits (PF, AF, and UF) are automatically
                           * cleared, which in turn clears the IRQF bit, which in turn clears the IRQ.
                           */
                          this.abCMOSData[bAddr] &= ChipSet.CMOS.STATUSC.RESERVED;
                          if (bIn & ChipSet.CMOS.STATUSC.IRQF) this.clearIRR(ChipSet.IRQ.RTC);
                          /*
                           * If we just cleared PF, and PIE is still set, then we need to make sure the next Periodic Interrupt
                           * occurs in a timely manner, too.
                           */
                          if ((bIn & ChipSet.CMOS.STATUSC.PF) && (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE)) {
                              if (DEBUG) this.printMessage("RTC periodic interrupt cleared", Messages.RTC);
                              this.setRTCCycleLimit();
                          }
                      }
                  }
                  return bIn;
              };
              
              /**
               * outCMOSData(port, bOut, addrFrom)
               *
               * @this {ChipSet}
               * @param {number} port (0x71)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outCMOSData = function(port, bOut, addrFrom)
              {
                  var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
                  if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
                      this.printMessageIO(port, bOut, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", null, true);
                  }
                  var bDelta = bOut ^ this.abCMOSData[bAddr];
                  this.abCMOSData[bAddr] = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.setRTCByte(bAddr, bOut) : bOut);
                  if (bAddr == ChipSet.CMOS.ADDR.STATUSB && (bDelta & ChipSet.CMOS.STATUSB.PIE)) {
                      if (bOut & ChipSet.CMOS.STATUSB.PIE) {
                          if (DEBUG) this.printMessage("RTC periodic interrupts enabled", Messages.RTC);
                          this.setRTCCycleLimit();
                      } else {
                          if (DEBUG) this.printMessage("RTC periodic interrupts disabled", Messages.RTC);
                      }
                  }
              };
              
              /**
               * outNMI(port, bOut, addrFrom)
               *
               * This handler is installed only for models before MODEL_5170.
               *
               * @this {ChipSet}
               * @param {number} port (0xA0)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outNMI = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "NMI");
                  this.bNMI = bOut;
              };
              
              /**
               * outCoprocClear(port, bOut, addrFrom)
               *
               * This handler is installed only for MODEL_5170.
               *
               * @this {ChipSet}
               * @param {number} port (0xF0)
               * @param {number} bOut (0x00 is the only expected output)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outCoprocClear = function(port, bOut, addrFrom)
              {
                  /*
                   * TODO: Implement
                   */
                  this.printMessageIO(port, bOut, addrFrom, "COPROC.CLEAR");
                  this.assert(!bOut);
              };
              
              /**
               * outCoprocReset(port, bOut, addrFrom)
               *
               * This handler is installed only for MODEL_5170.
               *
               * @this {ChipSet}
               * @param {number} port (0xF1)
               * @param {number} bOut (0x00 is the only expected output)
               * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
               */
              ChipSet.prototype.outCoprocReset = function(port, bOut, addrFrom)
              {
                  /*
                   * TODO: Implement
                   */
                  this.printMessageIO(port, bOut, addrFrom, "COPROC.RESET");
                  this.assert(!bOut);
              };
              
              /**
               * intBIOSRTC(addr)
               *
               * INT 0x1A Quick Reference:
               *
               *      AH
               *      ----
               *      0x00    Get current clock count in CX:DX
               *      0x01    Set current clock count from CX:DX
               *      0x02    Get real-time clock using BCD (CH=hours, CL=minutes, DH=seconds)
               *      0x03    Set real-time clock using BCD (CH=hours, CL=minutes, DH=seconds, DL=1 if Daylight Savings Time option)
               *      0x04    Get real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
               *      0x05    Set real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
               *      0x06    Set alarm using BCD (CH=hours, CL=minutes, DH=seconds)
               *      0x07    Reset alarm
               *
               * @this {ChipSet}
               * @param {number} addr
               * @return {boolean} true to proceed with the INT 0x1A software interrupt, false to skip
               */
              ChipSet.prototype.intBIOSRTC = function(addr)
              {
                  if (DEBUGGER) {
                      if (this.messageEnabled(Messages.RTC) && this.dbg.messageInt(Interrupts.RTC.VECTOR, addr)) {
                          /*
                           * By computing AH now, we get the incoming AH value; if we computed it below, along with
                           * the rest of the register values, we'd get the outgoing AH value, which is not what we want.
                           */
                          var AH = this.cpu.regEAX >> 8;
                          this.cpu.addIntReturn(addr, function(chipset, nCycles) {
                              return function onBIOSRTCReturn(nLevel) {
                                  nCycles = chipset.cpu.getCycles() - nCycles;
                                  var sResult;
                                  var CL = chipset.cpu.regEDX & 0xff;
                                  var CH = chipset.cpu.regEDX >> 8;
                                  var DL = chipset.cpu.regEDX & 0xff;
                                  var DH = chipset.cpu.regEDX >> 8;
                                  if (AH == 0x02 || AH == 0x03) {
                                      sResult = " CH(hour)=" + str.toHexWord(CH) + " CL(min)=" + str.toHexByte(CL) + " DH(sec)=" + str.toHexByte(DH);
                                  } else if (AH == 0x04 || AH == 0x05) {
                                      sResult = " CX(year)=" + str.toHexWord(chipset.cpu.regECX) + " DH(month)=" + str.toHexByte(DH) + " DL(day)=" + str.toHexByte(DL);
                                  }
                                  chipset.dbg.messageIntReturn(Interrupts.RTC.VECTOR, nLevel, nCycles, sResult);
                              };
                          }(this, this.cpu.getCycles()));
                      }
                  }
                  return true;
              };
              
              /**
               * parseSwitches(s, def)
               *
               * @this {ChipSet}
               * @param {string|undefined} s describing switch settings
               * @param {number} def is a default value to use if s is undefined
               * @return {number} value representing the switch settings
               */
              ChipSet.prototype.parseSwitches = function(s, def)
              {
                  if (s === undefined) return def;
                  /*
                   * NOTE: We can't simply use parseInt() with a base of 2, because the bit order is reversed, as well as the bit sense.
                   */
                  var b = 0, bit = 0x1;
                  for (var i = 0; i < s.length; i++) {
                      if (s.charAt(i) == "0") b |= bit;
                      bit <<= 1;
                  }
                  return b;
              };
              
              /**
               * setSpeaker(fOn)
               *
               * @this {ChipSet}
               * @param {boolean} [fOn] true to turn speaker on, false to turn off, otherwise update as appropriate
               */
              ChipSet.prototype.setSpeaker = function(fOn)
              {
                  if (this.contextAudio) {
                      try {
                          if (fOn !== undefined) {
                              this.fSpeaker = fOn;
                          } else {
                              fOn = this.fSpeaker && this.cpu && this.cpu.isRunning();
                          }
                          var freq = Math.round(ChipSet.TIMER_TICKS_PER_SEC / this.getTimerInit(ChipSet.PIT0.TIMER2));
                          /*
                           * Treat frequencies outside the normal hearing range (below 20hz or above 20Khz) as a clever attempt
                           * to turn sound off; we have to explicitly turn the sound off in those cases, to prevent the Audio API
                           * from "easing" the audio to the target frequency and creating odd sound effects.
                           */
                          if (freq < 20 || freq > 20000) fOn = false;
                          if (fOn) {
                              if (this.sourceAudio) {
                                  this.sourceAudio['frequency']['value'] = freq;
                                  if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker set to " + freq + "hz", true);
                              } else {
                                  this.sourceAudio = this.contextAudio['createOscillator']();
                                  if (this.sourceAudio) {
                                      if (typeof this.sourceAudio['type'] == "number") {
                                          this.sourceAudio['type'] = 1;   // deprecated: 0: "sine", 1: "square", 2: "sawtooth", 3: "triangle"
                                      } else {
                                          this.sourceAudio['type'] = "square";
                                      }
                                      this.sourceAudio['connect'](this.contextAudio['destination']);
                                      this.sourceAudio['frequency']['value'] = freq;
                                      if ('start' in this.sourceAudio) {
                                          this.sourceAudio['start'](0);
                                      } else {
                                          this.sourceAudio['noteOn'](0);  // deprecated: this.sourceAudio['noteOn'](0)
                                      }
                                      if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker on at  " + freq + "hz", true);
                                  }
                              }
                          } else {
                              if (this.sourceAudio) {
                                  if ('stop' in this.sourceAudio) {
                                      this.sourceAudio['stop'](0);
                                  } else {
                                      this.sourceAudio['noteOff'](0);     // deprecated: this.sourceAudio['noteOff'](0)
                                  }
                                  this.sourceAudio['disconnect']();       // QUESTION: is this automatic following a stop(), since this particular source cannot be started again?
                                  delete this.sourceAudio;                // QUESTION: ditto?
                                  if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker off at " + freq + "hz", true);
                              }
                          }
                      } catch(e) {
                          this.notice("AudioContext exception: " + e.message);
                          this.contextAudio = null;
                      }
                  } else if (fOn) {
                      this.printMessage("BEEP", Messages.SPEAKER);
                  }
              };
              
              /**
               * messageBitsDMA(iChannel)
               *
               * @this {ChipSet}
               * @param {number} [iChannel] if the message is associated with a particular IRQ #
               * @return {number}
               */
              ChipSet.prototype.messageBitsDMA = function(iChannel)
              {
                  var bitsMessage = Messages.DATA;
                  if (iChannel == ChipSet.DMA_FDC) {
                      bitsMessage |= Messages.FDC;
                  } else if (iChannel == ChipSet.DMA_HDC) {
                      bitsMessage |= Messages.HDC;
                  }
                  return bitsMessage;
              };
              
              /**
               * messageBitsIRQ(nIRQ)
               *
               * @this {ChipSet}
               * @param {number|undefined} [nIRQ] if the message is associated with a particular IRQ #
               * @return {number}
               */
              ChipSet.prototype.messageBitsIRQ = function(nIRQ)
              {
                  var bitsMessage = Messages.PIC;
                  if (nIRQ == ChipSet.IRQ.TIMER0) {           // IRQ 0
                      bitsMessage |= Messages.TIMER;
                  } else if (nIRQ == ChipSet.IRQ.KBD) {       // IRQ 1
                      bitsMessage |= Messages.KEYBOARD;
                  } else if (nIRQ == ChipSet.IRQ.SLAVE) {     // IRQ 2 (MODEL_5170 and up)
                      bitsMessage |= Messages.CHIPSET;
                  } else if (nIRQ == ChipSet.IRQ.COM1 || nIRQ == ChipSet.IRQ.COM2) {
                      bitsMessage |= Messages.SERIAL;
                  } else if (nIRQ == ChipSet.IRQ.XTC) {       // IRQ 5 (MODEL_5160)
                      bitsMessage |= Messages.HDC;
                  } else if (nIRQ == ChipSet.IRQ.FDC) {       // IRQ 6
                      bitsMessage |= Messages.FDC;
                  } else if (nIRQ == ChipSet.IRQ.RTC) {       // IRQ 8 (MODEL_5170 and up)
                      bitsMessage |= Messages.RTC;
                  } else if (nIRQ == ChipSet.IRQ.ATC) {       // IRQ 14 (MODEL_5170 and up)
                      bitsMessage |= Messages.HDC;
                  }
                  return bitsMessage;
              };
              
              /*
               * Port input notification tables
               */
              ChipSet.aPortInput = {
                  0x00: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
                  0x01: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
                  0x02: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                  0x03: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                  0x04: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                  0x05: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                  0x06: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                  0x07: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                  0x08: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA0.INDEX, port, addrFrom); },
                  0x20: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC0.INDEX, addrFrom); },
                  0x21: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC0.INDEX, addrFrom); },
                  0x40: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER0, port, addrFrom); },
                  0x41: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER1, port, addrFrom); },
                  0x42: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER2, port, addrFrom); },
                  0x43: ChipSet.prototype.inPIT1Ctrl,
                  0x81: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                  0x82: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                  0x83: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                  0x87: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 0, port, addrFrom); }
              };
              
              ChipSet.aPortInput5150 = {
                  0x60: ChipSet.prototype.inPPIA,
                  0x61: ChipSet.prototype.inPPIB,
                  0x62: ChipSet.prototype.inPPIC,
                  0x63: ChipSet.prototype.inPPICtrl   // technically, not actually readable, but I want the Debugger to be able to read this
              };
              
              ChipSet.aPortInput5170 = {
                  0x60: ChipSet.prototype.in8042OutBuff,
                  0x61: ChipSet.prototype.in8042RWReg,
                  0x64: ChipSet.prototype.in8042Status,
                  0x70: ChipSet.prototype.inCMOSAddr,
                  0x71: ChipSet.prototype.inCMOSData,
                  0x80: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(7, port, addrFrom); },
                  0x84: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(0, port, addrFrom); },
                  0x85: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(1, port, addrFrom); },
                  0x86: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(2, port, addrFrom); },
                  0x88: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(3, port, addrFrom); },
                  0x89: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                  0x8A: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                  0x8B: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                  0x8C: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(4, port, addrFrom); },
                  0x8D: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(5, port, addrFrom); },
                  0x8E: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(6, port, addrFrom); },
                  0x8F: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                  0xA0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC1.INDEX, addrFrom); },
                  0xA1: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC1.INDEX, addrFrom); },
                  0xC0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                  0xC2: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                  0xC4: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                  0xC6: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                  0xC8: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                  0xCA: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                  0xCC: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                  0xCE: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                  0xD0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA1.INDEX, port, addrFrom); }
              };
              
              /*
               * Port output notification tables
               */
              ChipSet.aPortOutput = {
                  0x00: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
                  0x01: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
                  0x02: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                  0x03: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                  0x04: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                  0x05: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                  0x06: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                  0x07: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                  0x08: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x09: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x0A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x0B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x0C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x0D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                  0x20: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC0.INDEX, bOut, addrFrom); },
                  0x21: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC0.INDEX, bOut, addrFrom); },
                  0x40: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER0, port, bOut, addrFrom); },
                  0x41: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER1, port, bOut, addrFrom); },
                  0x42: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER2, port, bOut, addrFrom); },
                  0x43: ChipSet.prototype.outPIT1Ctrl,
                  0x81: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                  0x82: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                  0x83: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                  0x87: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); }
              };
              
              ChipSet.aPortOutput5150 = {
                  0x60: ChipSet.prototype.outPPIA,
                  0x61: ChipSet.prototype.outPPIB,
                  0x62: ChipSet.prototype.outPPIC,
                  0x63: ChipSet.prototype.outPPICtrl,
                  0xA0: ChipSet.prototype.outNMI
              };
              
              ChipSet.aPortOutput5170 = {
                  0x60: ChipSet.prototype.out8042InBuffData,
                  0x61: ChipSet.prototype.out8042RWReg,
                  0x64: ChipSet.prototype.out8042InBuffCmd,
                  0x70: ChipSet.prototype.outCMOSAddr,
                  0x71: ChipSet.prototype.outCMOSData,
                  0x80: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(7, port, bOut, addrFrom); },
                  0x84: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(0, port, bOut, addrFrom); },
                  0x85: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(1, port, bOut, addrFrom); },
                  0x86: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(2, port, bOut, addrFrom); },
                  0x88: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(3, port, bOut, addrFrom); },
                  0x89: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                  0x8A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                  0x8B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                  0x8C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(4, port, bOut, addrFrom); },
                  0x8D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(5, port, bOut, addrFrom); },
                  0x8E: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(6, port, bOut, addrFrom); },
                  0x8F: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                  0xA0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC1.INDEX, bOut, addrFrom); },
                  0xA1: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC1.INDEX, bOut, addrFrom); },
                  0xC0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                  0xC2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                  0xC4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                  0xC6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                  0xC8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                  0xCA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                  0xCC: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                  0xCE: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                  0xD0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xD2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xD4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xD6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xD8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xDA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                  0xF0: ChipSet.prototype.outCoprocClear,
                  0xF1: ChipSet.prototype.outCoprocReset
              };
              
              /**
               * ChipSet.init()
               *
               * This function operates on every HTML element of class "chipset", extracting the
               * JSON-encoded parameters for the ChipSet constructor from the element's "data-value"
               * attribute, invoking the constructor to create a ChipSet component, and then binding
               * any associated HTML controls to the new component.
               */
              ChipSet.init = function()
              {
                  var aeChipSet = Component.getElementsByClass(window.document, PCJSCLASS, "chipset");
                  for (var iChip = 0; iChip < aeChipSet.length; iChip++) {
                      var eChipSet = aeChipSet[iChip];
                      var parmsChipSet = Component.getComponentParms(eChipSet);
                      var chipset = new ChipSet(parmsChipSet);
                      Component.bindComponentControls(chipset, eChipSet, PCJSCLASS);
                      chipset.updateSwitchDesc();
                  }
              };
              
              /*
               * Initialize every ChipSet module on the page.
               */
              web.onInit(ChipSet.init);
              
              if (typeof module !== 'undefined') module.exports = ChipSet;
              
            • computer.js
              /**
               * @fileoverview Implements the PCjs Computer component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-15
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               * BUILD INSTRUCTIONS
               *
               * To build PCjs (pc.js), run Google's Closure Compiler, replacing "*.js" with
               * the input file sequence defined by the "pcJSFiles" property in package.json:
               *
               *      java -jar compiler.jar
               *          --compilation_level ADVANCED_OPTIMIZATIONS
               *          --define='DEBUG=false'
               *          --warning_level=VERBOSE
               *          --js *.js
               *          --js_output_file pc.js
               *
               * Google's Closure Compiler (compiler.jar) is documented at
               * https://developers.google.com/closure/compiler/ and is available
               * for download here:
               *
               *      http://closure-compiler.googlecode.com/files/compiler-latest.zip
               *
               * The PCjs JavaScript files do have some initialization-order dependencies.
               * If you load the files individually, it's recommended that you load them in
               * the same order that they're compiled.
               *
               * Generally speaking, component.js should be first, computer.js should be
               * last (of the files based on component.js), and panel.js should be listed
               * early so that the Control Panel is ready as soon as possible.
               *
               * Another recent ordering requirement is that rom.js must be loaded before
               * ram.js; this was true before, but now it's required, because I'm starting
               * to add ROM BIOS Data Area definitions to rom.js, and since the data area
               * is in RAM, ram.js may want access to some of those definitions.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var web         = require("../../shared/lib/weblib");
                  var UserAPI     = require("../../shared/lib/userapi");
                  var ReportAPI   = require("../../shared/lib/reportapi");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var Bus         = require("./bus");
                  var State       = require("./state");
              }
              
              /**
               * Computer(parmsComputer, parmsMachine, fSuspended)
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsComputer
               * @param {Object} [parmsMachine]
               * @param {boolean} [fSuspended]
               *
               * The Computer component has no required (parmsComputer) properties, but does
               * support the following:
               *
               *      busWidth: number of memory address lines (address bits) on the computer's "bus";
               *      20 is the minimum (and the default), which implies 8086/8088 real-mode addressing,
               *      while 24 is required for 80286 protected-mode addressing.  This value is passed
               *      directly through to the Bus component; see that component for more details.
               *
               *      resume: one of the Computer.RESUME constants, which are as follows:
               *          '0' if resume disabled (default)
               *          '1' if enabled without prompting
               *          '2' if enabled with prompting
               *          '3' if enabled with prompting and auto-delete
               *          or a string containing the path of a predefined JSON-encoded state
               *
               *      state: the path to JSON-encoded state file (see details regarding 'state' below)
               *
               * If a predefined state is supplied AND it's successfully loaded, then resume behavior
               * defaults to '1' (ie, resume enabled without prompting).
               *
               * This component insures that all components are ready before "powering" them.
               *
               * Different components become ready at different times, and initialization order (ie,
               * the order the scripts are combined on the page) only partially determines readiness.
               * This is because components like ROM and Video must finish loading their resource files
               * before they are ready.  Other components become ready after we call their initBus()
               * function, because they have a Bus or CPU dependency, such as access to memory management
               * functions.  And other components, like CPU and Panel, are ready as soon as their
               * constructor finishes.
               *
               * Once a component has indicated it's ready, we call its powerUp() notification
               * function (if it has one--it's optional).  We call the CPU's powerUp() function last,
               * so that the CPU is assured that all other components are ready and "powered".
               */
              function Computer(parmsComputer, parmsMachine, fSuspended) {
              
                  Component.call(this, "Computer", parmsComputer, Computer, Messages.COMPUTER);
              
                  this.aFlags.fPowered = false;
                  /*
                   * TODO: Deprecate 'buswidth' (it should have always used camelCase)
                   */
                  this.nBusWidth = parmsComputer['busWidth'] || parmsComputer['buswidth'];
                  this.resume = Computer.RESUME_NONE;
                  this.sStateData = null;
                  this.fServerState = false;
                  this.url = parmsMachine? parmsMachine['url'] : null;
              
                  /*
                   * Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
                   * non-zero, convert to base 36, and chop off the leading digit and "decimal" point.
                   */
                  this.sMachineID = (Math.random() + 0.1).toString(36).substr(2,12);
                  this.sUserID = this.queryUserID();
              
                  /*
                   * Find the appropriate CPU (and Debugger and Control Panel, if any)
                   *
                   * CLOSURE COMPILER TIP: To override the type of a right-hand expression (as we need to do here,
                   * where we know getComponentByType() will only return an X86CPU object or null), wrap the expression
                   * in parentheses.  I never knew this until I stumbled across it in "Closure: The Definitive Guide".
                   */
                  this.cpu = /** @type {X86CPU} */ (Component.getComponentByType("CPU", this.id));
                  if (!this.cpu) {
                      Component.error("Unable to find CPU component");
                      return;
                  }
                  this.dbg = /** @type {Debugger} */ (Component.getComponentByType("Debugger", this.id));
              
                  /*
                   * Initialize the Bus component
                   */
                  this.bus = new Bus({'id': this.idMachine + '.bus', 'buswidth': this.nBusWidth}, this.cpu, this.dbg);
              
                  /*
                   * Iterate through all the components and connect them to the Control Panel, if any
                   */
                  var iComponent, component;
                  var aComponents = Component.getComponents(this.id);
                  this.panel = Component.getComponentByType("Panel", this.id);
              
                  if (this.panel && this.panel.controlPrint) {
                      for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                          component = aComponents[iComponent];
                          /*
                           * I can think of many "cleaner" ways for the Control Panel component to pass its
                           * notice(), println(), etc, overrides on to all the other components, but it's just
                           * too darn convenient to slam those overrides into the components directly.
                           */
                          component.notice = this.panel.notice;
                          component.println = this.panel.println;
                          component.controlPrint = this.panel.controlPrint;
                      }
                  }
              
                  if (DEBUG && this.messageEnabled()) this.printMessage("PREFETCH: " + PREFETCH + ", TYPEDARRAYS: " + TYPEDARRAYS);
              
                  /*
                   * Iterate through all the components again and call their initBus() handler, if any
                   */
                  for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      component = aComponents[iComponent];
                      if (component.initBus) component.initBus(this, this.bus, this.cpu, this.dbg);
                  }
              
                  var sStatePath = null;
                  var sResume = parmsComputer['resume'];
                  if (sResume !== undefined) {
                      /*
                       * DEPRECATE: This goofiness is a holdover from when the 'resume' property was a string (either a
                       * single-digit string or a path); now it's always a number, so it never has a 'length' property and
                       * the call to parseInt() is unnecessary.
                       */
                      if (sResume.length > 1) {
                          sStatePath = this.sResumePath = sResume;
                      } else {
                          this.resume = parseInt(sResume, 10);
                      }
                  }
              
                  /*
                   * The Computer 'state' property allows a state file to be specified independent of the 'resume' feature;
                   * previously, you could only use 'resume' to load a state file -- which we still support, but loading a state
                   * file that way prevents the machine's state from being saved, since we always resume from the 'resume' file.
                   *
                   * The other wrinkle is on the restore side: we need to IGNORE the 'state' property if a saved state now exists.
                   * So we have to peek at localStorage, and unfortunately, the only way to "peek" is to actually load the data,
                   * but we're not ready to use it yet, so powerUp() has been changed to use any existing stateComputer that we've
                   * already loaded.
                   *
                   * However, there's now a wrinkle to the wrinkle: if a 'state' parameter has been passed via the URL, then that
                   * OVERRIDES everything; it overrides any 'state' Computer parameter AND it disables resume of any saved state in
                   * localStorage (in other words, it prevents fAllowResume from being true, and forcing resume off).
                   */
                  var fAllowResume;
                  var sState = Component.parmsURL && Component.parmsURL['state'] || (fAllowResume = true) && parmsComputer['state'];
              
                  if (sState) {
                      sStatePath = this.sStatePath = sState;
                      if (!fAllowResume) {
                          this.fServerState = true;
                          this.resume = Computer.RESUME_NONE;
                      }
                      if (this.resume) {
                          this.stateComputer = new State(this, Computer.sAppVer);
                          if (this.stateComputer.load()) {
                              sStatePath = null;
                          } else {
                              delete this.stateComputer;
                          }
                      }
                  }
              
                  /*
                   * If sStatePath is set, we must use it.  But if there's no sStatePath AND resume is set,
                   * then we have the option of resuming from a server-side state, assuming a valid USERID.
                   */
                  if (!sStatePath && this.resume) {
                      sStatePath = this.getServerStatePath();
                      if (sStatePath) this.fServerState = true;
                  }
              
                  if (!sStatePath) {
                      this.setReady();
                  } else {
                      web.loadResource(sStatePath, true, null, this, this.onLoadSetReady);
                  }
              
                  if (!fSuspended) {
                      /*
                       * Power "up" the computer, giving every component the opportunity to reset or restore itself.
                       */
                      this.wait(this.powerOn);
                  }
              }
              
              Component.subclass(Computer);
              
              /*
               * NOTE: 1.01 is the first version to provide limited save/restore support using localStorage.
               * From this point on, care must be taken to insure that any new version that's incompatible with
               * previous localStorage data be released with a version number that is at least 1 greater,
               * since we're tagging the localStorage data with the integer portion of the version string.
               */
              Computer.sAppName = APPNAME || "PCjs";
              Computer.sAppVer = APPVERSION;
              Computer.sCopyright = "Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>";
              
              /*
               * I think it's a good idea to also display a GPL notice, putting people on notice that even
               * the "compiled" source code has all the same GPL requirements as the uncompiled source code.
               */
              Computer.LICENSE = "License: GPL version 3 or later <http://gnu.org/licenses/gpl.html>";
              
              Computer.STATE_FAILSAFE  = "failsafe";
              Computer.STATE_VALIDATE  = "validate";
              Computer.STATE_TIMESTAMP = "timestamp";
              Computer.STATE_VERSION   = "version";
              Computer.STATE_HOSTURL   = "url";
              Computer.STATE_BROWSER   = "browser";
              Computer.STATE_USERID    = "user";
              
              /*
               * The following constants define all the resume options.  Negative values (eg, RESUME_REPOWER) are for
               * internal use only, and RESUME_DELETE is not documented (it provides a way of deleting ALL saved states
               * whenever a resume is declined).  As a result, the only "end-user" values are 0, 1 and 2.
               */
              Computer.RESUME_REPOWER = -1;   // resume without changing any state (for internal use only)
              Computer.RESUME_NONE    = 0;    // default (no resume)
              Computer.RESUME_AUTO    = 1;    // automatically save/restore state
              Computer.RESUME_PROMPT  = 2;    // automatically save but conditionally restore (WARNING: if restore is declined, any state is discarded)
              Computer.RESUME_DELETE  = 3;    // same as RESUME_PROMPT but discards ALL machines states whenever ANY machine restore is declined (undocumented)
              
              /**
               * getMachineID()
               *
               * @return {string}
               */
              Computer.prototype.getMachineID = function()
              {
                  return this.sMachineID;
              };
              
              /**
               * getUserID()
               *
               * @return {string}
               */
              Computer.prototype.getUserID = function()
              {
                  return this.sUserID? this.sUserID : "";
              };
              
              /**
               * onLoadSetReady(sStateFile, sStateData, nErrorCode)
               *
               * @this {Computer}
               * @param {string} sStateFile
               * @param {string} sStateData
               * @param {number} nErrorCode
               */
              Computer.prototype.onLoadSetReady = function(sStateFile, sStateData, nErrorCode)
              {
                  if (!nErrorCode) {
                      this.sStateData = sStateData;
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("loaded state file " + sStateFile.replace(this.sUserID || "xxx", "xxx"));
                      }
                  } else {
                      this.sResumePath = null;
                      this.fServerState = false;
                      this.notice('Unable to load machine state from server (error ' + nErrorCode + (sStateData? ': ' + str.trim(sStateData) : '') + ')');
                  }
                  this.setReady();
              };
              
              /**
               * wait(fn, parms)
               *
               * wait() waits until every component is ready (including ourselves, the last component we check),
               * then calls the specified Computer method.
               *
               * TODO: As with web.loadResource(), the Closure Compiler makes it difficult for us to define
               * a function type for "fn" that works in all cases; sometimes we want to pass a function that takes
               * only a "number", and other times we want to pass a function that takes only an "Array" (the type
               * will mirror that of the "parms" parameter). However, the Closure Compiler insists that both functions
               * must be declared as accepting both types of parameters. So once again, we must use an untyped function
               * declaration, instead of something stricter like:
               *
               *      param {function(this:Computer, (number|Array|undefined)): undefined} fn
               *
               * @this {Computer}
               * @param {function(...)} fn
               * @param {number|Array} [parms] optional parameters
               */
              Computer.prototype.wait = function(fn, parms)
              {
                  var computer = this;
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent <= aComponents.length; iComponent++) {
                      var component = (iComponent < aComponents.length ? aComponents[iComponent] : this);
                      if (!component.isReady()) {
                          component.isReady(function onComponentReady() {
                              computer.wait(fn, parms);
                          });
                          return;
                      }
                  }
                  if (DEBUG && this.messageEnabled()) this.printMessage("Computer.wait(ready)");
                  fn.call(this, parms);
              };
              
              /**
               * validateState(stateComputer)
               *
               * NOTE: We clear() stateValidate only when there's no stateComputer.
               *
               * @this {Computer}
               * @param {State|null} [stateComputer]
               * @return {boolean} true if state passes validation, false if not
               */
              Computer.prototype.validateState = function(stateComputer)
              {
                  var fValid = true;
                  var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
                  if (stateValidate.load() && stateValidate.parse()) {
                      var sTimestampValidate = stateValidate.get(Computer.STATE_TIMESTAMP);
                      var sTimestampComputer = stateComputer ? stateComputer.get(Computer.STATE_TIMESTAMP) : "unknown";
                      if (sTimestampValidate != sTimestampComputer) {
                          this.notice("Machine state may be out-of-date\n(" + sTimestampValidate + " vs. " + sTimestampComputer + ")\nCheck your browser's local storage limits");
                          fValid = false;
                          if (!stateComputer) stateValidate.clear();
                      } else {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("Last state: " + sTimestampComputer + " (validate: " + sTimestampValidate + ")");
                          }
                      }
                  }
                  return fValid;
              };
              
              /**
               * powerOn(resume)
               *
               * Power every component "up", applying any previously available state information.
               *
               * @this {Computer}
               * @param {number} [resume] is a valid RESUME value; default is this.resume
               */
              Computer.prototype.powerOn = function(resume)
              {
                  if (resume === undefined) {
                      resume = this.resume || (this.sStateData? Computer.RESUME_AUTO : Computer.RESUME_NONE);
                  }
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("Computer.powerOn(" + (resume == Computer.RESUME_REPOWER ? "repower" : (resume ? "resume" : "")) + ")");
                  }
              
                  var fRepower = false;
                  var fRestore = false;
                  this.fRestoreError = false;
                  var stateComputer = this.stateComputer || new State(this, Computer.sAppVer);
              
                  if (resume == Computer.RESUME_REPOWER) {
                      fRepower = true;
                  }
                  else if (resume > Computer.RESUME_NONE) {
                      if (stateComputer.load(this.sStateData)) {
                          /*
                           * Since we're resuming something (either a predefined state or a state from localStorage), let's
                           * create a "failsafe" checkpoint in localStorage, and destroy it at the end of a successful powerOn().
                           * Which means, of course, that if a previous "failsafe" checkpoint already exists, something bad
                           * may have happened the last time around.
                           */
                          this.stateFailSafe = new State(this, Computer.sAppVer, Computer.STATE_FAILSAFE);
                          if (this.stateFailSafe.load()) {
                              this.powerReport(stateComputer);
                              /*
                               * We already know resume is something other than RESUME_NONE, so we'll go ahead and bump it
                               * all the way to RESUME_PROMPT, so that the user will be prompted, and if the user declines to
                               * restore, the state will be removed.
                               */
                              resume = Computer.RESUME_PROMPT;
                              /*
                               * To ensure that the set() below succeeds, we need to call unload(), otherwise it may fail
                               * with a "read only" error (eg, "TypeError: Cannot assign to read only property 'timestamp'").
                               */
                              this.stateFailSafe.unload();
                          }
              
                          this.stateFailSafe.set(Computer.STATE_TIMESTAMP, usr.getTimestamp());
                          this.stateFailSafe.store();
              
                          var fValidate = this.resume && !this.fServerState;
                          if (resume == Computer.RESUME_AUTO || web.confirmUser("Click OK to restore the previous " + Computer.sAppName + " machine state, or CANCEL to reset the machine.")) {
                              fRestore = stateComputer.parse();
                              if (fRestore) {
                                  var sCode = stateComputer.get(UserAPI.RES.CODE);
                                  var sData = stateComputer.get(UserAPI.RES.DATA);
                                  if (sCode) {
                                      if (sCode == UserAPI.CODE.OK) {
                                          stateComputer.load(sData);
                                      } else {
                                          /*
                                           * A missing (or not yet created) state file is no cause for alarm, but other errors might be
                                           */
                                          if (sCode == UserAPI.CODE.FAIL && sData != UserAPI.FAIL.NOSTATE) {
                                              this.notice("Error: " + sData);
                                              if (sData == UserAPI.FAIL.VERIFY) this.resetUserID();
                                          } else {
                                              this.println(sCode + ": " + sData);
                                          }
                                          /*
                                           * Try falling back to the state that we should have saved in localStorage, as a backup to the
                                           * server-side state.
                                           */
                                          stateComputer.unload();     // discard the invalid server-side state first
                                          if (stateComputer.load()) {
                                              fRestore = stateComputer.parse();
                                              fValidate = true;
                                          } else {
                                              fRestore = false;       // hmmm, there was nothing in localStorage either
                                          }
                                      }
                                  }
                              }
                              /*
                               * If the load/parse was successful, and it was from localStorage (not sStateData),
                               * then we should to try verify that localStorage snapshot is current.  One reason it may
                               * NOT be current is if localStorage was full and we got a quota error during the last
                               * powerOff().
                               */
                              if (fValidate) this.validateState(fRestore? stateComputer : null);
                          } else {
                              /*
                               * RESUME_PROMPT indicates we should delete the state if they clicked Cancel to confirm() above.
                               */
                              if (resume == Computer.RESUME_PROMPT) stateComputer.clear();
                          }
                      } else {
                          /*
                           * If there's no state, then there should also be no validation timestamp; if there is, then once again,
                           * we're probably dealing with a quota error.
                           */
                          this.validateState();
                      }
                      delete this.sStateData;
                      delete this.stateComputer;
                  }
              
                  /*
                   * Start powering all components, including any data they may need to restore their state;
                   * we restore power to the CPU last.
                   */
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (component !== this && component != this.cpu) {
                          fRestore = this.powerRestore(component, stateComputer, fRepower, fRestore);
                      }
                  }
              
                  /*
                   * Assuming this is not a repower, we must perform another wait, because some components may
                   * have marked themselves as "not ready" again (eg, the FDC component, if the restore forced it
                   * to mount one or more additional disk images).
                   */
                  var aParms = [stateComputer, resume, fRestore];
              
                  if (resume != Computer.RESUME_REPOWER) {
                      this.wait(this.donePowerOn, aParms);
                      return;
                  }
                  this.donePowerOn(aParms);
              };
              
              /**
               * powerRestore(component, stateComputer, fRepower, fRestore)
               *
               * @this {Computer}
               * @param {Component} component
               * @param {State} stateComputer
               * @param {boolean} fRepower
               * @param {boolean} fRestore
               * @return {boolean} true if restore should continue, false if not
               */
              Computer.prototype.powerRestore = function(component, stateComputer, fRepower, fRestore)
              {
                  if (!component.aFlags.fPowered) {
              
                      component.aFlags.fPowered = true;
              
                      if (component.powerUp) {
              
                          var data = null;
                          if (fRestore) {
                              data = stateComputer.get(component.id);
                              if (!data) {
                                  /*
                                   * This is a hack that makes it possible for a machine whose ID has been
                                   * supplemented with a suffix (a single letter or digit) to find object IDs
                                   * in states created from a machine without the suffix.
                                   *
                                   * For example, if a state file was created from a machine with ID "ibm5160"
                                   * but the current machine is "ibm5160a", this attempts a second lookup with
                                   * "ibm5160", enabling us to find objects that match the original machine ID
                                   * (eg, "ibm5160.romEGA").
                                   */
                                  data = stateComputer.get(component.id.replace(/[a-z0-9]\./i, '.'));
                              }
                          }
              
                          /*
                           * State.get() will return whatever was originally passed to State.set() (eg, an
                           * Object or a string), but components are supposed to store only Objects, so if a
                           * string comes back, something went wrong.  By explicitly eliminating "string" data,
                           * the Closure Compiler stops complaining that we might be passing strings to our
                           * powerUp() functions (even though we know we're not).
                           *
                           * TODO: Determine if there's some way to coerce the Closure Compiler into treating
                           * data as Object or null, without having to include this runtime check.  An assert
                           * would be a good idea, but this is overkill.
                           */
                          if (typeof data === "string") data = null;
              
                          /*
                           * If computer is null, this is simply a repower notification, which most components
                           * don't do anything with.  Exceptions include: CPU (since it may be halted) and Video
                           * (since its screen may be "turned off").
                           */
                          if (!component.powerUp(data, fRepower) && data) {
              
                              Component.error("Unable to restore state for " + component.type);
                              /*
                               * If this is a resume error for a machine that also has a predefined state
                               * AND we're not restoring from that state, then throw away the current state,
                               * prevent any new state from being created, and then force a reload, which will
                               * hopefully restore us to the functioning predefined state.
                               *
                               * TODO: Considering doing this in ALL cases, not just in situations where a
                               * 'state' exists but we're not actually resuming from it.
                               */
                              if (this.sStatePath && !this.sStateData) {
                                  stateComputer.clear();
                                  this.resume = Computer.RESUME_NONE;
                                  web.reloadPage();
                              } else {
                                  /*
                                   * In all other cases, we set fRestoreError, which should trigger a call to
                                   * powerReport() and then delete the offending state.
                                   */
                                  this.fRestoreError = true;
                              }
                              /*
                               * Any failure triggers an automatic to call powerUp() again, without any state,
                               * in the hopes that the component can recover by performing a reset.
                               */
                              component.powerUp(null);
                              /*
                               * We also disable the rest of the restore operation, because it's not clear
                               * the remaining state information can be trusted;  the machine is already in an
                               * inconsistent state, so we're not likely to make things worse, and the only
                               * alternative (starting over and performing a state-less reset) isn't likely to make
                               * the user any happier.  But, we'll see... we need some experience with the code.
                               */
                              fRestore = false;
                          }
                      }
              
                      if (!fRepower && component.comment) {
                          var asComments = component.comment.split("|");
                          for (var i = 0; i < asComments.length; i++) {
                              component.status(asComments[i]);
                          }
                      }
                  }
                  return fRestore;
              };
              
              /**
               * donePowerOn(aParms)
               *
               * This is nothing more than a continuation of powerOn(), giving us the option of calling wait() one more time.
               *
               * @this {Computer}
               * @param {Array} aParms containing [stateComputer, resume, fRestore]
               */
              Computer.prototype.donePowerOn = function(aParms)
              {
                  var stateComputer = aParms[0];
                  var fRepower = (aParms[1] < 0);
                  var fRestore = aParms[2];
              
                  if (DEBUG && this.aFlags.fPowered && this.messageEnabled()) {
                      this.printMessage("Computer.donePowerOn(): redundant");
                  }
              
                  this.aFlags.fPowered = true;
              
                  if (!this.fInitialized) {
                      this.println(Computer.sAppName + " v" + Computer.sAppVer + "\n" + Computer.sCopyright + "\n" + Computer.LICENSE);
                      this.fInitialized = true;
                  }
              
                  /*
                   * Once we get to this point, we're guaranteed that all components are ready, so it's safe to power the CPU;
                   * the CPU should begin executing immediately, unless a debugger is attached.
                   */
                  if (this.cpu) {
                      /*
                       * TODO: Do we not care about the return value here? (ie, is checking fRestoreError sufficient)?
                       */
                      this.powerRestore(this.cpu, stateComputer, fRepower, fRestore);
                      this.cpu.autoStart();
                  }
              
                  /*
                   * If the state was bad, offer to report it and then delete it.  Deleting may be moot, since invariably a new
                   * state will be created on powerOff() before the next powerOn(), but it seems like good paranoia all the same.
                   */
                  if (this.fRestoreError) {
                      this.powerReport(stateComputer);
                      stateComputer.clear();
                  }
              
                  if (!fRepower && this.stateFailSafe) {
                      this.stateFailSafe.clear();
                      delete this.stateFailSafe;
                  }
              };
              
              /**
               * checkPower()
               *
               * @this {Computer}
               * @return {boolean} true if the computer is fully powered, false otherwise
               */
              Computer.prototype.checkPower = function()
              {
                  if (this.aFlags.fPowered) return true;
              
                  var component = null, iComponent;
                  var aComponents = Component.getComponents(this.id);
                  for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      component = aComponents[iComponent];
                      if (component !== this && !component.aFlags.fReady) break;
                  }
                  if (iComponent == aComponents.length) {
                      for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                          component = aComponents[iComponent];
                          if (component !== this && !component.aFlags.fPowered) break;
                      }
                  }
                  if (iComponent == aComponents.length) component = this;
                  var s = "The " + component.type + " component (" + component.id + ") is not " + (!component.aFlags.fReady? "ready yet" + (component.fnReady? " (waiting for notification)" : "") : "powered yet") + ".";
                  web.alertUser(s);
                  return false;
              };
              
              /**
               * powerReport(stateComputer)
               *
               * @this {Computer}
               * @param {State} stateComputer
               */
              Computer.prototype.powerReport = function(stateComputer)
              {
                  if (web.confirmUser("There may be a problem with your " + Computer.sAppName + " machine.\n\nTo help us diagnose it, click OK to send this " + Computer.sAppName + " machine state to http://" + SITEHOST + ".")) {
                      web.sendReport(Computer.sAppName, Computer.sAppVer, this.url, this.getUserID(), ReportAPI.TYPE.BUG, stateComputer.toString());
                  }
              };
              
              /**
               * powerOff(fSave, fShutdown)
               *
               * Power every component "down" and optionally save the machine state.
               *
               * There's one scenario that powerOff() isn't currently able to deal with very effectively: what to do when
               * the user switches away while it's still being restored, causing Disk loadResource() calls to fail.  The
               * Disk component calls notify() when that happens -- see Disk.mount() -- but the FDC and HDC controllers don't
               * notify *us* of those problems, so Computer assumes that the restore was completely successful, when in fact
               * it was only partially successful.
               *
               * Then we immediately arrive here to perform a save, following that incomplete restore.  It would be wrong to
               * deal with that incomplete restore by setting fRestoreError, because we don't want to trigger a powerReport()
               * and the deletion of the previous state, because the state itself was presumably OK.  Unfortunately, the new
               * state we now save will no longer include manually mounted disk images whose remounts were interrupted, so future
               * restores won't remount them either.
               *
               * We could perhaps solve this by having the Disk component notify us in those situations, set a new flag
               * (fRestoreIncomplete?), and set fSave to false if that's ever set.  Be careful though: when fSave is false,
               * that means MORE than not saving; it also means deleting any previous state, which is NOT what you'd want to
               * do in a "fRestoreIncomplete" situation.  Also, we have to worry about Disk operations that fail for other reasons,
               * making sure those failures don't interfere with the save process in the same way.
               *
               * As it stands, the worst that happens is any manually mounted disk images might have to be manually remounted,
               * which doesn't seem like a huge problem.
               *
               * @this {Computer}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown] is true if the machine is being shut down
               * @return {string|null} string representing the captured state (or null if error)
               */
              Computer.prototype.powerOff = function(fSave, fShutdown)
              {
                  var data;
                  var sState = "none";
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("Computer.powerOff(" + (fSave ? "save" : "nosave") + (fShutdown ? ",shutdown" : "") + ")");
                  }
              
                  var stateComputer = new State(this, Computer.sAppVer);
                  var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
              
                  var sTimestamp = usr.getTimestamp();
                  stateValidate.set(Computer.STATE_TIMESTAMP, sTimestamp);
                  stateComputer.set(Computer.STATE_TIMESTAMP, sTimestamp);
                  stateComputer.set(Computer.STATE_VERSION, APPVERSION);
                  stateComputer.set(Computer.STATE_HOSTURL, web.getHostURL());
                  stateComputer.set(Computer.STATE_BROWSER, web.getUserAgent());
              
                  /*
                   * Always power the CPU "down" first, just to insure it doesn't ask other
                   * components to do anything after they're no longer ready.
                   */
                  if (this.cpu && this.cpu.powerDown) {
                      if (fShutdown) this.cpu.stopCPU();
                      data = this.cpu.powerDown(fSave, fShutdown);
                      if (typeof data === "object") stateComputer.set(this.cpu.id, data);
                      if (fShutdown) {
                          this.cpu.aFlags.fPowered = false;
                          if (data === false) sState = null;
                      }
                  }
              
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (component.aFlags.fPowered) {
                          if (component.powerDown) {
                              data = component.powerDown(fSave, fShutdown);
                              if (typeof data === "object") stateComputer.set(component.id, data);
                          }
                          if (fShutdown) {
                              component.aFlags.fPowered = false;
                              if (data === false) sState = null;
                          }
                      }
                  }
              
                  if (sState) {
                      if (fShutdown) {
                          var fClear = false;
                          var fClearAll = false;
                          if (fSave) {
                              if (this.sUserID) {
                                  this.saveServerState(this.sUserID, stateComputer.toString());
                              }
                              if (!stateValidate.store() || !stateComputer.store()) {
                                  sState = null;
                                  /*
                                   * New behavior as of v1.13.2:  if it appears that localStorage is full, we blow it ALL away.
                                   * Dedicated server-side storage is the only way we'll ever be able to reliably preserve a
                                   * particular machine's state.  Historically, attempting to limp along with whatever localStorage
                                   * is left just generates the same useless and annoying warnings over and over.
                                   */
                                  fClear = fClearAll = true;
                              }
                          }
                          else {
                              /*
                               * I used to ALWAYS clear (ie, delete) any associated computer state, but now I do this only if the
                               * current machine is "resumable", because there are situations where I have two configurations
                               * for the same machine -- one resumable and one not -- and I don't want the latter throwing away the
                               * state of the former.
                               *
                               * So this code is here now strictly for callers to delete the state of a "resumable" machine, not as
                               * some paranoid clean-up operation.
                               *
                               * An undocumented feature of this operation is that if your configuration uses the special 'resume="3"'
                               * value, and you click the "Reset" button, and then you click OK to reset the everything, this will
                               * actually reset EVERYTHING (ie, all localStorage for ALL configs will be reclaimed).
                               */
                              if (this.resume) {
                                  fClear = true;
                                  fClearAll = (this.resume == Computer.RESUME_DELETE);
                              }
                          }
                          if (fClear) {
                              stateComputer.clear(fClearAll);
                          }
                      } else {
                          sState = stateComputer.toString();
                      }
                  }
              
                  if (fShutdown) this.aFlags.fPowered = false;
              
                  return sState;
              };
              
              /**
               * reset()
               *
               * Notify all (other) components with a reset() method that the Computer is being reset.
               *
               * NOTE: We'd like to reset the Bus first (due to the importance of the A20 line), but since we
               * allocated the Bus object ourselves, after all the other components were allocated, it ends
               * up near the end of Component's list of components.  Hence the special case for this.bus below.
               *
               * @this {Computer}
               */
              Computer.prototype.reset = function()
              {
                  if (this.bus && this.bus.reset) {
                      /*
                       * TODO: Why does WebStorm think that this.bus.type is undefined? The base class (Component)
                       * constructor defines it.
                       */
                      this.printMessage("Resetting " + this.bus.type);
                      this.bus.reset();
                  }
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (component !== this && component !== this.bus && component.reset) {
                          this.printMessage("Resetting " + component.type);
                          component.reset();
                      }
                  }
              };
              
              /**
               * start(ms, nCycles)
               *
               * Notify all (other) components with a start() method that the CPU has started.
               *
               * Note that we're called by runCPU(), which is why we exclude the CPU component,
               * as well as ourselves.
               *
               * @this {Computer}
               * @param {number} ms
               * @param {number} nCycles
               */
              Computer.prototype.start = function(ms, nCycles)
              {
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (component.type == "CPU" || component === this) continue;
                      if (component.start) {
                          component.start(ms, nCycles);
                      }
                  }
              };
              
              /**
               * stop(ms, nCycles)
               *
               * Notify all (other) components with a stop() method that the CPU has stopped.
               *
               * Note that we're called by runCPU(), which is why we exclude the CPU component,
               * as well as ourselves.
               *
               * @this {Computer}
               * @param {number} ms
               * @param {number} nCycles
               */
              Computer.prototype.stop = function(ms, nCycles)
              {
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (component.type == "CPU" || component === this) continue;
                      if (component.stop) {
                          component.stop(ms, nCycles);
                      }
                  }
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {Computer}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              Computer.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var computer = this;
                  switch (sBinding) {
                      case "save":
                          this.bindings[sBinding] = control;
                          control.onclick = function onClickSave() {
                              var sUserID = computer.queryUserID(true);
                              if (sUserID) {
                                  var fSave = !!(computer.resume && !computer.sResumePath);
                                  var sState = computer.powerOff(fSave);
                                  if (fSave) {
                                      computer.saveServerState(sUserID, sState);
                                  } else {
                                      computer.notice("Resume disabled, machine state not saved");
                                  }
                              }
                          };
                          return true;
                      case "reset":
                          this.bindings[sBinding] = control;
                          control.onclick = function onClickReset() {
                              computer.onReset();
                          };
                          return true;
                      default:
                          break;
                  }
                  return false;
              };
              
              /**
               * resetUserID()
               */
              Computer.prototype.resetUserID = function()
              {
                  web.setLocalStorageItem(Computer.STATE_USERID, "");
                  this.sUserID = null;
              };
              
              /**
               * queryUserID(fPrompt)
               *
               * @param {boolean} [fPrompt]
               * @returns {string|null|undefined}
               */
              Computer.prototype.queryUserID = function(fPrompt)
              {
                  var sUserID = this.sUserID;
                  if (!sUserID) {
                      sUserID = web.getLocalStorageItem(Computer.STATE_USERID);
                      if (sUserID !== undefined) {
                          if (!sUserID && fPrompt) {
                              sUserID = web.promptUser("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.");
                              if (sUserID) {
                                  sUserID = this.verifyUserID(sUserID);
                                  if (!sUserID) this.notice("Your user ID has not been approved.");
                              }
                          }
                      } else if (fPrompt) {
                          this.notice("Browser local storage is not available");
                      }
                  }
                  return sUserID;
              };
              
              /**
               * verifyUserID(sUserID)
               *
               * @this {Computer}
               * @param {string} sUserID
               * @return {string} validated user ID, or null if error
               */
              Computer.prototype.verifyUserID = function(sUserID)
              {
                  this.sUserID = null;
                  var fMessages = DEBUG && this.messageEnabled();
                  if (fMessages) this.printMessage("verifyUserID(" + sUserID + ")");
                  var sRequest = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUserID;
                  var response = web.loadResource(sRequest);
                  var nErrorCode = response[0];
                  var sResponse = response[1];
                  if (!nErrorCode && sResponse) {
                      try {
                          response = eval("(" + sResponse + ")");
                          if (response.code && response.code == UserAPI.CODE.OK) {
                              web.setLocalStorageItem(Computer.STATE_USERID, response.data);
                              if (fMessages) this.printMessage(Computer.STATE_USERID + " updated: " + response.data);
                              this.sUserID = response.data;
                          } else {
                              if (fMessages) this.printMessage(response.code + ": " + response.data);
                          }
                      } catch (e) {
                          Component.error(e.message + " (" + sResponse + ")");
                      }
                  } else {
                      if (fMessages) this.printMessage("invalid response (error " + nErrorCode + ")");
                  }
                  return this.sUserID;
              };
              
              /**
               * getServerStatePath()
               *
               * @this {Computer}
               * @return {string|null} sStatePath (null if no localStorage or no USERID stored in localStorage)
               */
              Computer.prototype.getServerStatePath = function()
              {
                  var sStatePath = null;
                  if (this.sUserID) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage(Computer.STATE_USERID + " for load: " + this.sUserID);
                      }
                      sStatePath = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.LOAD + '&' + UserAPI.QUERY.USER + '=' + this.sUserID + '&' + UserAPI.QUERY.STATE + '=' + State.key(this, Computer.sAppVer);
                  } else {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage(Computer.STATE_USERID + " unavailable");
                      }
                  }
                  return sStatePath;
              };
              
              /**
               * saveServerState(sUserID, sState)
               *
               * @param {string} sUserID
               * @param {string|null} sState
               */
              Computer.prototype.saveServerState = function(sUserID, sState)
              {
                  /*
                   * We must pass fSync == true, because (as I understand it) browsers will blow off any async
                   * requests when a page is being closed.  Since our request is synchronous, storeServerState()
                   * should also return a result, but there's not much we can do with it, since browsers ALSO
                   * tend to blow off alerts() and the like when closing down.
                   */
                  if (sState) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("size of server state: " + sState.length + " bytes");
                      }
                      var response = this.storeServerState(sUserID, sState, true);
                      if (response && response[UserAPI.RES.CODE] == UserAPI.CODE.OK) {
                          this.notice("Machine state saved to server");
                      } else if (sState) {
                          var sError = (response && response[UserAPI.RES.DATA]) || UserAPI.FAIL.BADSTORE;
                          if (response[UserAPI.RES.CODE] == UserAPI.CODE.FAIL) {
                              sError = "Error: " + sError;
                          } else {
                              sError = "Error " + response[UserAPI.RES.CODE] + ": " + sError;
                          }
                          this.notice(sError);
                          this.resetUserID();
                      }
                  } else {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("no state to store");
                      }
                  }
              };
              
              /**
               * storeServerState(sUserID, sState, fSync)
               *
               * @this {Computer}
               * @param {string} sUserID
               * @param {string} sState
               * @param {boolean} [fSync] is true if we're powering down and should perform a synchronous request (default is async)
               * @return {*} server response if fSync is true and a response was received; otherwise null
               */
              Computer.prototype.storeServerState = function(sUserID, sState, fSync)
              {
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage(Computer.STATE_USERID + " for store: " + sUserID);
                  }
                  /*
                   * TODO: Determine whether or not any browsers cancel our request if we're called during a browser "shutdown" event,
                   * and whether or not it matters if we do an async request (currently, we're not, to try to ensure the request goes through).
                   */
                  var data = {};
                  data[UserAPI.QUERY.REQ] = UserAPI.REQ.STORE;
                  data[UserAPI.QUERY.USER] = sUserID;
                  data[UserAPI.QUERY.STATE] = State.key(this, Computer.sAppVer);
                  data[UserAPI.QUERY.DATA] = sState;
                  var sRequest = web.getHost() + UserAPI.ENDPOINT;
                  if (!fSync) {
                      web.loadResource(sRequest, true, data);
                  } else {
                      var response = web.loadResource(sRequest, false, data);
                      var sResponse = response[1];
                      if (response[0]) {
                          if (sResponse) {
                              var i = sResponse.indexOf('\n');
                              if (i > 0) sResponse = sResponse.substr(0, i);
                              if (!sResponse.indexOf("Error: ")) sResponse = sResponse.substr(7);
                          }
                          sResponse = '{"' + UserAPI.RES.CODE + '":' + response[0] + ',"' + UserAPI.RES.DATA + '":"' + sResponse + '"}';
                      }
                      if (DEBUG && this.messageEnabled()) this.printMessage(sResponse);
                      return JSON.parse(sResponse);
                  }
                  return null;
              };
              
              /**
               * onReset()
               *
               * @this {Computer}
               */
              Computer.prototype.onReset = function()
              {
                  /*
                   * If this is a "resumable" machine (and it's not using a predefined state), then we overload the reset
                   * operation to offer an explicit "save or discard" option first.  This is currently the only UI we offer to
                   * discard a machine's state, including any disk changes.  The traditional "reset" operation is still available
                   * for non-resumable machines.
                   *
                   * TODO: Break this behavior out into a separate "discard" operation, in case the designer of the machine really
                   * wants to clutter the UI with confusing options. ;-)
                   */
                  if (this.resume && !this.sResumePath) {
                      /*
                       * I used to bypass the prompt if this.resume == Computer.RESUME_AUTO, setting fSave to true automatically,
                       * but that gives the user no means of resetting a resumable machine that contains errors in its resume state.
                       */
                      var fSave = (/* this.resume == Computer.RESUME_AUTO || */ web.confirmUser("Click OK to save changes to this " + Computer.sAppName + " machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded."));
                      this.powerOff(fSave, true);
                      /*
                       * Forcing the page to reload is an expedient option, but ugly. It's preferable to call powerOn()
                       * and rely on all the components to reset themselves to their default state.  The components with
                       * the greatest burden here are FDC and HDC, which must rely on the fReload flag to determine whether
                       * or not to unload/reload all their original auto-mounted disk images.
                       *
                       * However, if we started with a predefined state (ie, sStatePath is set), we take this shortcut, because
                       * we don't (yet) have code in place to gracefully reload the initial state (requires calling loadResource()
                       * again); alternatively, we could avoid throwing that state away, but it seems better to save the memory.
                       *
                       * TODO: Make this more graceful, so that we can stop using the reloadPage() sledgehammer.
                       */
                      if (!fSave && this.sStatePath) {
                          web.reloadPage();
                          return;
                      }
                      if (!fSave) this.fReload = true;
                      this.powerOn(Computer.RESUME_NONE);
                      this.fReload = false;
                  } else {
                      this.reset();
                      if (this.cpu) this.cpu.autoStart();
                  }
              };
              
              /**
               * getComponentByType(sType, componentPrev)
               *
               * @this {Computer}
               * @param {string} sType
               * @param {Component|null} [componentPrev] of previously returned component, if any
               * @return {Component|null}
               */
              Computer.prototype.getComponentByType = function(sType, componentPrev)
              {
                  var aComponents = Component.getComponents(this.id);
                  for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                      var component = aComponents[iComponent];
                      if (componentPrev) {
                          if (componentPrev == component) componentPrev = null;
                          continue;
                      }
                      if (component.type == sType) return component;
                  }
                  return null;
              };
              
              /**
               * Computer.init()
               *
               * For every machine represented by an HTML element of class "pcjs-machine", this function
               * locates the HTML element of class "computer", extracting the JSON-encoded parameters for the
               * Computer constructor from the element's "data-value" attribute, invoking the constructor to
               * create a Computer component, and then binding any associated HTML controls to the new component.
               */
              Computer.init = function()
              {
                  var aeMachines = Component.getElementsByClass(window.document, PCJSCLASS + "-machine");
              
                  for (var iMachine = 0; iMachine < aeMachines.length; iMachine++) {
              
                      var eMachine = aeMachines[iMachine];
                      var parmsMachine = Component.getComponentParms(eMachine);
              
                      var aeComputers = Component.getElementsByClass(eMachine, PCJSCLASS, "computer");
              
                      for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
              
                          var eComputer = aeComputers[iComputer];
                          var parmsComputer = Component.getComponentParms(eComputer);
              
                          /*
                           * We set fSuspended in the Computer constructor because we want to "power up" the
                           * computer ourselves, after any/all bindings are in place.
                           */
                          var computer = new Computer(parmsComputer, parmsMachine, true);
              
                          if (DEBUG && computer.messageEnabled()) {
                              computer.printMessage("onInit(" + computer.aFlags.fPowered + ")");
                          }
              
                          /*
                           * For now, all we support are "reset" and "save" buttons. We may eventually add a "power"
                           * button to manually suspend/resume the machine.  An "erase" button was also considered, but
                           * "reset" now provides a way to force the machine to start from scratch again, so "erase"
                           * might be redundant now.
                           */
                          Component.bindComponentControls(computer, eComputer, PCJSCLASS);
              
                          /*
                           * Power "up" the computer, giving every component the opportunity to reset or restore itself.
                           */
                          computer.wait(computer.powerOn);
                      }
                  }
              };
              
              /**
               * Computer.show()
               *
               * When exit() is using an "onbeforeunload" handler, this "onpageshow" handler allows us to repower everything,
               * without either resetting or restoring.  We call powerOn() with a special resume value (RESUME_REPOWER) if the
               * computer is already marked as "ready", meaning the browser didn't change anything.  This "repower" process
               * should be very quick, essentially just marking all components as powered again (so that, for example, the Video
               * component will start drawing again) and firing the CPU up again.
               */
              Computer.show = function()
              {
                  var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
                  for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
                      var eComputer = aeComputers[iComputer];
                      var parmsComputer = Component.getComponentParms(eComputer);
                      var computer = Component.getComponentByType("Computer", parmsComputer['id']);
                      if (computer) {
              
                          if (DEBUG && computer.messageEnabled()) {
                              computer.printMessage("onShow(" + computer.fInitialized + "," + computer.aFlags.fPowered + ")");
                          }
              
                          if (computer.fInitialized && !computer.aFlags.fPowered) {
                              /**
                               * Repower the computer, notifying every component to continue running as-is.
                               */
                              computer.powerOn(Computer.RESUME_REPOWER);
                          }
                      }
                  }
              };
              
              /**
               * Computer.exit()
               *
               * The Computer is currently the only component that uses an "exit" handler, which web.onExit() defines as
               * either an "unload" or "onbeforeunload" handler.  This gives us the opportunity to save the machine state,
               * using our powerOff() function, before the page goes away.
               *
               * It's worth noting that "onbeforeunload" offers one nice feature when used instead of "onload": the entire
               * page (and therefore this entire application) is retained in its current state by the browser (well, some
               * browsers), so that if you go to a new URL, either by entering a new URL in the same window/tab, or by pressing
               * the FORWARD button, and then you press the BACK button, the page is immediately restored to its previous state.
               *
               * In fact, that's how some browsers operate whether you have an "onbeforeunload" handler or not; in other words,
               * an "onbeforeunload" handler doesn't change the page retention behavior of the browser.  By contrast, the mere
               * presence of an "onunload" handler generally causes a browser to throw the page away once the handler returns.
               *
               * However, in order to safely use "onbeforeunload", we must add yet another handler ("onpageshow") to repower
               * everything, without either resetting or restoring.  Hence, the Computer.show() function, which calls powerOn()
               * with a special resume value (RESUME_REPOWER) if the computer is already marked as "ready", meaning the browser
               * didn't change anything.  This "repower" process should be very quick, essentially just marking all components as
               * powered again (so that, for example, the Video component will start drawing again) and firing the CPU up again.
               *
               * Reportedly, some browsers (eg, Opera) don't support "onbeforeunload", in which case Component will have to use
               * "unload" instead.  But even when the page must be rebuilt from scratch, the combination of browser cache and
               * localStorage means the simulation should be restored and become operational almost immediately.
               */
              Computer.exit = function()
              {
                  var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
                  for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
                      var eComputer = aeComputers[iComputer];
                      var parmsComputer = Component.getComponentParms(eComputer);
                      var computer = Component.getComponentByType("Computer", parmsComputer['id']);
                      if (computer) {
              
                          if (DEBUG && computer.messageEnabled()) {
                              computer.printMessage("onExit(" + computer.aFlags.fPowered + ")");
                          }
              
                          if (computer.aFlags.fPowered) {
                              /**
                               * Power "down" the computer, giving every component an opportunity to save its state,
                               * but only if 'resume' has been set AND there is no valid resume path (because if a valid resume
                               * path exists, we'll always load our state from there, and not from whatever we save here).
                               */
                              computer.powerOff(!!(computer.resume && !computer.sResumePath), true);
                          }
                      }
                  }
              };
              
              /*
               * Initialize every Computer on the page.
               */
              web.onInit(Computer.init);
              web.onShow(Computer.show);
              web.onExit(Computer.exit);
              
              if (typeof module !== 'undefined') module.exports = Computer;
              
            • cpu.js
              /**
               * @fileoverview Implements the PCjs CPU component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
              }
              
              /**
               * CPU(parmsCPU, nCyclesDefault)
               *
               * The CPU class supports the following (parmsCPU) properties:
               *
               *      cycles: the machine's base cycles per second; the X86CPU constructor will
               *      provide us with a default (based on the CPU model) to use as a fallback
               *
               *      multiplier: base cycle multiplier; default is 1
               *
               *      autoStart: true to automatically start, false to not, or null (default)
               *      to make the autoStart decision based on whether or not a Debugger is
               *      installed (if there's no Debugger AND no "Run" button, then auto-start,
               *      otherwise don't)
               *
               *      csStart: the number of cycles that runCPU() must wait before generating
               *      checksum records; -1 if disabled. checksum records are a diagnostic aid
               *      used to help compare one CPU run to another.
               *
               *      csInterval: the number of cycles that runCPU() must execute before
               *      generating a checksum record; -1 if disabled.
               *
               *      csStop: the number of cycles to stop generating checksum records.
               *
               * This component is primarily responsible for interfacing the CPU with the outside
               * world (eg, Panel and Debugger components), and managing overall CPU operation.
               *
               * It is extended by the X86CPU component, where all the x86-specific logic resides.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsCPU
               * @param {number} nCyclesDefault
               */
              function CPU(parmsCPU, nCyclesDefault)
              {
                  Component.call(this, "CPU", parmsCPU, CPU, Messages.CPU);
              
                  var nCycles = parmsCPU['cycles'] || nCyclesDefault;
              
                  var nMultiplier = parmsCPU['multiplier'] || 1;
              
                  this.aCounts = {};
                  this.aCounts.nCyclesPerSecond = nCycles;
              
                  /*
                   * nCyclesMultiplier replaces the old "speed" variable (0, 1, 2) and eliminates the need for
                   * the constants (SPEED_SLOW, SPEED_FAST and SPEED_MAX).  The UI simply doubles the multiplier
                   * until we've exceeded the host's speed limit and then starts the multiplier over at 1.
                   */
                  this.aCounts.nCyclesMultiplier = nMultiplier;
                  this.aCounts.mhzDefault = Math.round(this.aCounts.nCyclesPerSecond / 10000) / 100;
                  /*
                   * TODO: Take care of this with an initial setSpeed() call instead?
                   */
                  this.aCounts.mhzTarget = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
              
                  /*
                   * We add a number of flags to the set initialized by Component
                   */
                  this.aFlags.fRunning = false;
                  this.aFlags.fStarting = false;
                  this.aFlags.fAutoStart = parmsCPU['autoStart'];
              
                  /*
                   * TODO: Add some UI for fDisplayLiveRegs (either an XML property, or a UI checkbox, or both)
                   */
                  this.aFlags.fDisplayLiveRegs = false;
              
                  /*
                   * Provide a power-saving URL-based way of overriding the 'autostart' setting;
                   * if an "autostart" parameter is specified on the URL, anything other than "true"
                   * or "false" is treated as the null setting (see above for details).
                   */
                  var sAutoStart = Component.parmsURL['autostart'];
                  if (sAutoStart !== undefined) {
                      this.aFlags.fAutoStart = (sAutoStart == "true"? true : (sAutoStart  == "false"? false : null));
                  }
              
                  /*
                   * Get checksum parameters, if any. runCPU() behavior is not affected until fChecksum
                   * is true, which won't happen until resetChecksum() is called with nCyclesChecksumInterval
                   * ("csInterval") set to a positive value.
                   *
                   * As above, any of these parameters can also be set with the Debugger's execution options
                   * command ("x"); for example, "x cs int 5000" will set nCyclesChecksumInterval to 5000
                   * and call resetChecksum().
                   */
                  this.aFlags.fChecksum = false;
                  this.aCounts.nChecksum = this.aCounts.nCyclesChecksumNext = 0;
                  this.aCounts.nCyclesChecksumStart = parmsCPU["csStart"];
                  this.aCounts.nCyclesChecksumInterval = parmsCPU["csInterval"];
                  this.aCounts.nCyclesChecksumStop = parmsCPU["csStop"];
              
                  /*
                   * Initially, no video devices are attached that require CPU-driven updates.  initBus() will update this.
                   */
                  this.aVideo = [];
              
                  var cpu = this;
                  this.onRunTimeout = function() { cpu.runCPU(); };
              
                  this.setReady();
              }
              
              Component.subclass(CPU);
              
              /*
               * Constants that control the frequency at which various updates should occur.
               *
               * These values do NOT control the simulation directly.  Instead, they are used by
               * calcCycles(), which uses the nCyclesPerSecond passed to the constructor as a starting
               * point and computes the following variables:
               *
               *      this.aCounts.nCyclesPerYield         (this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND)
               *      this.aCounts.nCyclesPerVideoUpdate   (this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND)
               *      this.aCounts.nCyclesPerStatusUpdate  (this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND)
               *
               * The above variables are also multiplied by any cycle multiplier in effect, via setSpeed(),
               * and then they're used to initialize another set of variables for each runCPU() iteration:
               *
               *      this.aCounts.nCyclesNextYield        <= this.aCounts.nCyclesPerYield
               *      this.aCounts.nCyclesNextVideoUpdate  <= this.aCounts.nCyclesPerVideoUpdate
               *      this.aCounts.nCyclesNextStatusUpdate <= this.aCounts.nCyclesPerStatusUpdate
               */
              CPU.YIELDS_PER_SECOND         = 30;
              CPU.VIDEO_UPDATES_PER_SECOND  = 60;     // WARNING: if you change this, beware of side-effects in the Video component
              CPU.STATUS_UPDATES_PER_SECOND = 2;
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {CPU}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {CPU} cpu
               * @param {Debugger} dbg
               */
              CPU.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.dbg = dbg;
                  this.cmp = cmp;
                  /*
                   * Attach the Video component to the CPU, so that the CPU can periodically update
                   * the video display via updateVideo(), as cycles permit.
                   */
                  for (var video = null; (video = cmp.getComponentByType("Video", video));) {
                      this.aVideo.push(video);
                  }
                  /*
                   * Attach the ChipSet component to the CPU, so that it can obtain the IDT vector number of
                   * pending hardware interrupts, in response to ChipSet's updateINTR() notifications.
                   *
                   * We must also call chipset.updateAllTimers() periodically; stepCPU() takes care of that.
                   */
                  this.chipset = cmp.getComponentByType("ChipSet");
                  this.setReady();
              };
              
              /**
               * reset()
               *
               * This is a placeholder for reset (overridden by the X86CPU component).
               *
               * @this {CPU}
               */
              CPU.prototype.reset = function()
              {
              };
              
              /**
               * save()
               *
               * This is a placeholder for save support (overridden by the X86CPU component).
               *
               * @this {CPU}
               * @return {Object|null}
               */
              CPU.prototype.save = function()
              {
                  return null;
              };
              
              /**
               * restore(data)
               *
               * This is a placeholder for restore support (overridden by the X86CPU component).
               *
               * @this {CPU}
               * @param {Object} data
               * @return {boolean} true if restore successful, false if not
               */
              CPU.prototype.restore = function(data)
              {
                  return false;
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {CPU}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              CPU.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.reset();
                      } else {
                          this.resetCycles();
                          if (!this.restore(data)) return false;
                          this.resetChecksum();
                      }
                      /*
                       * Give the Debugger a chance to do/print something once we've powered up
                       */
                      if (DEBUGGER && this.dbg) {
                          this.dbg.init();
                      } else {
                          /*
                           * The Computer (this.cmp) knows if there's a Control Panel (this.cmp.panel), and the Control Panel
                           * knows if there's a "print" control (this.cmp.panel.controlPrint), and if there IS a "print" control
                           * but no debugger, the machine is probably misconfigured (most likely, the page simply neglected to
                           * load the Debugger component).
                           *
                           * However, we don't actually need to check all that; it's always safe use println(), regardless whether
                           * a Control Panel with a "print" control is present or not.
                           */
                          this.println("No debugger detected");
                      }
                  }
                  /*
                   * The Computer component (which is responsible for all powerDown and powerUp notifications)
                   * is now responsible for managing a component's fPowered flag, not us.
                   *
                   *      this.aFlags.fPowered = true;
                   */
                  this.updateCPU();
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {CPU}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              CPU.prototype.powerDown = function(fSave, fShutdown)
              {
                  /*
                   * The Computer component (which is responsible for all powerDown and powerUp notifications)
                   * is now responsible for managing a component's fPowered flag, not us.
                   *
                   *      this.aFlags.fPowered = false;
                   */
                  return fSave && this.save ? this.save() : true;
              };
              
              /**
               * autoStart()
               *
               * @this {CPU}
               * @return {boolean} true if started, false if not
               */
              CPU.prototype.autoStart = function()
              {
                  if (this.aFlags.fAutoStart === true || this.aFlags.fAutoStart === null && (!DEBUGGER || !this.dbg) && this.bindings["run"] === undefined) {
                      this.runCPU();      // start running automatically on power-up, assuming there's no Debugger and no "Run" button
                      return true;
                  }
                  return false;
              };
              
              /**
               * isPowered()
               *
               * @this {CPU}
               * @return {boolean}
               */
              CPU.prototype.isPowered = function()
              {
                  if (!this.aFlags.fPowered) {
                      this.println(this.toString() + " not powered");
                      return false;
                  }
                  return true;
              };
              
              /**
               * isRunning()
               *
               * @this {CPU}
               * @return {boolean}
               */
              CPU.prototype.isRunning = function()
              {
                  return this.aFlags.fRunning;
              };
              
              /**
               * getChecksum()
               *
               * This will be implemented by the X86CPU component.
               *
               * @this {CPU}
               * @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
               */
              CPU.prototype.getChecksum = function()
              {
                  return 0;
              };
              
              /**
               * resetChecksum()
               *
               * If checksum generation is enabled (fChecksum is true), this resets the running 32-bit checksum and the
               * cycle counter that will trigger the next displayChecksum(); called by resetCycles(), which is called whenever
               * the CPU is reset or restored.
               *
               * @this {CPU}
               * @return {boolean} true if checksum generation enabled, false if not
               */
              CPU.prototype.resetChecksum = function()
              {
                  if (this.aCounts.nCyclesChecksumStart === undefined) this.aCounts.nCyclesChecksumStart = 0;
                  if (this.aCounts.nCyclesChecksumInterval === undefined) this.aCounts.nCyclesChecksumInterval = -1;
                  if (this.aCounts.nCyclesChecksumStop === undefined) this.aCounts.nCyclesChecksumStop = -1;
                  this.aFlags.fChecksum = (this.aCounts.nCyclesChecksumStart >= 0 && this.aCounts.nCyclesChecksumInterval > 0);
                  if (this.aFlags.fChecksum) {
                      this.aCounts.nChecksum = 0;
                      this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart - this.nTotalCycles;
                      // this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart + this.aCounts.nCyclesChecksumInterval - (this.nTotalCycles % this.aCounts.nCyclesChecksumInterval);
                      return true;
                  }
                  return false;
              };
              
              /**
               * updateChecksum(nCycles)
               *
               * When checksum generation is enabled (fChecksum is true), runCPU() asks stepCPU() to execute a minimum
               * number of cycles (1), effectively limiting execution to a single instruction, and then we're called with
               * the exact number cycles that were actually executed.  This should give us instruction-granular checksums
               * at precise intervals that are 100% repeatable.
               *
               * @this {CPU}
               * @param {number} nCycles
               */
              CPU.prototype.updateChecksum = function(nCycles)
              {
                  if (this.aFlags.fChecksum) {
                      /*
                       * Get a 32-bit summation of the current CPU state and add it to our running 32-bit checksum
                       */
                      var fDisplay = false;
                      this.aCounts.nChecksum = (this.aCounts.nChecksum + this.getChecksum()) | 0;
                      this.aCounts.nCyclesChecksumNext -= nCycles;
                      if (this.aCounts.nCyclesChecksumNext <= 0) {
                          this.aCounts.nCyclesChecksumNext += this.aCounts.nCyclesChecksumInterval;
                          fDisplay = true;
                      }
                      if (this.aCounts.nCyclesChecksumStop >= 0) {
                          if (this.aCounts.nCyclesChecksumStop <= this.getCycles()) {
                              this.aCounts.nCyclesChecksumInterval = this.aCounts.nCyclesChecksumStop = -1;
                              this.resetChecksum();
                              this.stopCPU();
                              fDisplay = true;
                          }
                      }
                      if (fDisplay) this.displayChecksum();
                  }
              };
              
              /**
               * displayChecksum()
               *
               * When checksum generation is enabled (fChecksum is true), this is called to provide a crude log of all
               * checksums generated at the specified cycle intervals, as specified by the "csStart" and "csInterval" parmsCPU
               * properties).
               *
               * @this {CPU}
               */
              CPU.prototype.displayChecksum = function()
              {
                  this.println(this.getCycles() + " cycles: " + "checksum=" + str.toHex(this.aCounts.nChecksum));
              };
              
              /**
               * displayValue(sLabel, nValue, cch)
               *
               * This is principally for displaying register values, but in reality, it can be used to display any
               * numeric (hex) value bound to the given label.
               *
               * @this {CPU}
               * @param {string} sLabel
               * @param {number} nValue
               * @param {number} cch
               */
              CPU.prototype.displayValue = function(sLabel, nValue, cch)
              {
                  if (this.bindings[sLabel]) {
                      if (nValue === undefined) {
                          this.setError("Value for " + sLabel + " is invalid");
                          this.stopCPU();
                      }
                      var sVal;
                      if (!this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
                          sVal = str.toHex(nValue, cch);
                      } else {
                          sVal = "--------".substr(0, cch);
                      }
                      /*
                       * TODO: Determine if this test actually avoids any redrawing when a register hasn't changed, and/or if
                       * we should maintain our own (numeric) cache of displayed register values (to avoid creating these temporary
                       * string values that will have to garbage-collected), and/or if this is actually slower, and/or if I'm being
                       * too obsessive.
                       */
                      if (this.bindings[sLabel].textContent != sVal) this.bindings[sLabel].textContent = sVal;
                  }
              };
              
              /**
               * updateStatus(fForce)
               *
               * This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
               * The X86CPU subclasses updateStatus() to take care of any DOM updates (eg, register values) while the CPU is running.
               *
               * @this {CPU}
               * @param {boolean} [fForce]
               */
              CPU.prototype.updateStatus = function(fForce)
              {
                  if (this.cmp && this.cmp.panel) this.cmp.panel.updateStatus();
              };
              
              /**
               * updateVideo()
               *
               * Any high-frequency updates should be performed here.  Avoid DOM updates, since updateVideo() can be called up to
               * 60 times per second (see VIDEO_UPDATES_PER_SECOND).
               *
               * @this {CPU}
               */
              CPU.prototype.updateVideo = function()
              {
                  for (var i = 0; i < this.aVideo.length; i++) {
                      this.aVideo[i].updateScreen();
                  }
                  if (this.cmp && this.cmp.panel) this.cmp.panel.updateAnimation();
              };
              
              /**
               * setFocus()
               *
               * @this {CPU}
               */
              CPU.prototype.setFocus = function()
              {
                  if (this.aVideo.length) this.aVideo[0].setFocus();
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {CPU}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "run")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var cpu = this;
                  var fBound = false;
                  switch (sBinding) {
                  case "run":
                      this.bindings[sBinding] = control;
                      control.onclick = function onClickRun() {
                          if (!cpu.cmp || !cpu.cmp.checkPower()) return;
                          if (!cpu.aFlags.fRunning)
                              cpu.runCPU(true);
                          else
                              cpu.stopCPU(true);
                      };
                      fBound = true;
                      break;
              
                  case "reset":
                      /*
                       * A "reset" button is really a function of the entire computer, not just the CPU, but
                       * it's not always convenient to stick a reset button in the computer component definition,
                       * so we support a "reset" binding both here AND in the Computer component.
                       */
                      this.bindings[sBinding] = control;
                      control.onclick = function onClickReset() {
                          if (cpu.cmp) cpu.cmp.onReset();
                      };
                      fBound = true;
                      break;
              
                  case "speed":
                      this.bindings[sBinding] = control;
                      fBound = true;
                      break;
              
                  case "setSpeed":
                      this.bindings[sBinding] = control;
                      control.onclick = function onClickSetSpeed() {
                          cpu.setSpeed(cpu.aCounts.nCyclesMultiplier << 1, true);
                      };
                      control.textContent = this.getSpeedTarget();
                      fBound = true;
                      break;
              
                  default:
                      break;
                  }
                  return fBound;
              };
              
              /**
               * setBurstCycles(nCycles)
               *
               * This function is used by the ChipSet component whenever a very low timer count is set,
               * in anticipation of the timer requiring an update sooner than the normal nCyclesPerYield
               * period in runCPU() would normally provide.
               *
               * @this {CPU}
               * @param {number} nCycles is the target number of cycles to drop the current burst to
               * @return {boolean}
               */
              CPU.prototype.setBurstCycles = function(nCycles)
              {
                  if (this.aFlags.fRunning) {
                      var nDelta = this.nStepCycles - nCycles;
                      /*
                       * NOTE: If nDelta is negative, we will actually be increasing nStepCycles and nBurstCycles.
                       * Which is OK, but if we're also taking snapshots of the cycle counts, to make sure that instruction
                       * costs are being properly assessed, then we need to update nSnapCycles as well.
                       *
                       * TODO: If the delta is negative, we could simply ignore the request, but we must first carefully
                       * consider the impact on the ChipSet timers.
                       */
                      if (DEBUG) this.nSnapCycles -= nDelta;
                      this.nStepCycles -= nDelta;
                      this.nBurstCycles -= nDelta;
                      return true;
                  }
                  return false;
              };
              
              /**
               * addCycles(nCycles, fEndStep)
               *
               * @this {CPU}
               * @param {number} nCycles
               * @param {boolean} [fEndStep]
               */
              CPU.prototype.addCycles = function(nCycles, fEndStep)
              {
                  this.nTotalCycles += nCycles;
                  if (fEndStep) {
                      this.nBurstCycles = this.nStepCycles = 0;
                  }
              };
              
              /**
               * calcCycles(fRecalc)
               *
               * Calculate the number of cycles to process for each "burst" of CPU activity.  The size of a burst
               * is driven by the following values:
               *
               *      CPU.YIELDS_PER_SECOND (eg, 30)
               *      CPU.VIDEO_UPDATES_PER_SECOND (eg, 60)
               *      CPU.STATUS_UPDATES_PER_SECOND (eg, 5)
               *
               * The largest of the above values forces the size of the burst to its smallest value.  Let's say that
               * largest value is 30.  Assuming nCyclesPerSecond is 1,000,000, that results in bursts of 33,333 cycles.
               *
               * At the end of each burst, we subtract burst cycles from yield, video, and status cycle "threshold"
               * counters. Whenever the "next yield" cycle counter goes to (or below) zero, we compare elapsed time
               * to the time we expected the virtual hardware to take (eg, 1000ms/50 or 20ms), and if we still have time
               * remaining, we sleep the remaining time (or 0ms if there's no remaining time), and then restart runCPU().
               *
               * Similarly, whenever the "next video update" cycle counter goes to (or below) zero, we call updateVideo(),
               * and whenever the "next status update" cycle counter goes to (or below) zero, we call updateStatus().
               *
               * @this {CPU}
               * @param {boolean} [fRecalc] is true if the caller wants to recalculate thresholds based on the most recent
               * speed calculation (see calcSpeed).
               */
              CPU.prototype.calcCycles = function(fRecalc)
              {
                  /*
                   * Calculate the most cycles we're allowed to execute in a single "burst"
                   */
                  var nMostUpdatesPerSecond = CPU.YIELDS_PER_SECOND;
                  if (nMostUpdatesPerSecond < CPU.VIDEO_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.VIDEO_UPDATES_PER_SECOND;
                  if (nMostUpdatesPerSecond < CPU.STATUS_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.STATUS_UPDATES_PER_SECOND;
              
                  /*
                   * Calculate cycle "per" values for the yield, video update, and status update cycle counters
                   */
                  var vMultiplier = 1;
                  if (fRecalc) {
                      if (this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz) {
                          vMultiplier = (this.aCounts.mhz / this.aCounts.mhzDefault);
                      }
                  }
              
                  this.aCounts.msPerYield = Math.round(1000 / CPU.YIELDS_PER_SECOND);
                  this.aCounts.nCyclesPerBurst = Math.floor(this.aCounts.nCyclesPerSecond / nMostUpdatesPerSecond * vMultiplier);
                  this.aCounts.nCyclesPerYield = Math.floor(this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND * vMultiplier);
                  this.aCounts.nCyclesPerVideoUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND * vMultiplier);
                  this.aCounts.nCyclesPerStatusUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND * vMultiplier);
              
                  /*
                   * And initialize "next" yield, video update, and status update cycle "threshold" counters to those "per" values
                   */
                  if (!fRecalc) {
                      this.aCounts.nCyclesNextYield = this.aCounts.nCyclesPerYield;
                      this.aCounts.nCyclesNextVideoUpdate = this.aCounts.nCyclesPerVideoUpdate;
                      this.aCounts.nCyclesNextStatusUpdate = this.aCounts.nCyclesPerStatusUpdate;
                  }
                  this.aCounts.nCyclesRecalc = 0;
              };
              
              /**
               * getCycles(fScaled)
               *
               * getCycles() returns the number of cycles executed so far.  Note that we can be called after
               * runCPU() OR during runCPU(), perhaps from a handler triggered during the current run's stepCPU(),
               * so nRunCycles must always be adjusted by number of cycles stepCPU() was asked to run (nBurstCycles),
               * less the number of cycles it has yet to run (nStepCycles).
               *
               * nRunCycles is zeroed whenever the CPU is halted or the CPU speed is changed, which is why we also
               * have nTotalCycles, which accumulates all nRunCycles before we zero it.  However, nRunCycles and
               * nTotalCycles eventually get reset by calcSpeed(), to avoid overflow, so components that rely on
               * getCycles() returning steadily increasing values should also be prepared for a reset at any time.
               *
               * @this {CPU}
               * @param {boolean} [fScaled] is true if the caller wants a cycle count relative to a multiplier of 1
               * @return {number}
               */
              CPU.prototype.getCycles = function(fScaled)
              {
                  var nCycles = this.nTotalCycles + this.nRunCycles + this.nBurstCycles - this.nStepCycles;
                  if (fScaled && this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz > this.aCounts.mhzDefault) {
                      /*
                       * We could scale the current cycle count by the current effective speed (this.aCounts.mhz); eg:
                       *
                       *      nCycles = Math.round(nCycles / (this.aCounts.mhz / this.aCounts.mhzDefault));
                       *
                       * but that speed will fluctuate somewhat: large fluctuations at first, but increasingly smaller
                       * fluctuations after each burst of instructions that runCPU() executes.
                       *
                       * Alternatively, we can scale the cycle count by the multiplier, which is good in that the
                       * multiplier doesn't vary once the user changes it, but a potential downside is that the
                       * multiplier might be set too high, resulting in a target speed that's higher than the effective
                       * speed is able to reach.
                       *
                       * Also, if multipliers were always limited to a power-of-two, then this could be calculated
                       * with a simple shift.  However, only the "setSpeed" UI binding limits it that way; the Debugger
                       * interface allows any value, as does the CPU "multiplier" parmsCPU property (from the machine's
                       * XML file).
                       */
                      nCycles = Math.round(nCycles / this.aCounts.nCyclesMultiplier);
                  }
                  return nCycles;
              };
              
              /**
               * getCyclesPerSecond()
               *
               * This returns the CPU's "base" speed (ie, the original cycles per second defined for the machine)
               *
               * @this {CPU}
               * @return {number}
               */
              CPU.prototype.getCyclesPerSecond = function()
              {
                  return this.aCounts.nCyclesPerSecond;
              };
              
              /**
               * resetCycles()
               *
               * Resets speed and cycle information as part of any reset() or restore(); this typically occurs during powerUp().
               * It's important that this be called BEFORE the actual restore() call, because restore() may want to call setSpeed(),
               * which in turn assumes that all the cycle counts have been initialized to sensible values.
               *
               * @this {CPU}
               */
              CPU.prototype.resetCycles = function()
              {
                  this.aCounts.mhz = 0;
                  this.nTotalCycles = this.nRunCycles = this.nBurstCycles = this.nStepCycles = 0;
                  this.resetChecksum();
                  this.setSpeed(1);
              };
              
              /**
               * getSpeed()
               *
               * @this {CPU}
               * @return {number} the current speed multiplier
               */
              CPU.prototype.getSpeed = function()
              {
                  return this.aCounts.nCyclesMultiplier;
              };
              
              /**
               * getSpeedCurrent()
               *
               * @this {CPU}
               * @return {string} the current speed, in mhz, as a string formatted to two decimal places
               */
              CPU.prototype.getSpeedCurrent = function()
              {
                  /*
                   * TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
                   */
                  return ((this.aFlags.fRunning && this.aCounts.mhz)? (this.aCounts.mhz.toFixed(2) + "Mhz") : "Stopped");
              };
              
              /**
               * getSpeedTarget()
               *
               * @this {CPU}
               * @return {string} the target speed, in mhz, as a string formatted to two decimal places
               */
              CPU.prototype.getSpeedTarget = function()
              {
                  /*
                   * TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
                   */
                  return this.aCounts.mhzTarget.toFixed(2) + "Mhz";
              };
              
              /**
               * setSpeed(nMultiplier, fOnClick)
               *
               * @this {CPU}
               * @param {number} [nMultiplier] is the new proposed multiplier (reverts to 1 if the target was too high)
               * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
               * @return {number} the target speed, in mhz
               * @desc Whenever the speed is changed, the running cycle count and corresponding start time must be reset,
               * so that the next effective speed calculation obtains sensible results.  In fact, when runCPU() initially calls
               * setSpeed() with no parameters, that's all this function does (it doesn't change the current speed setting).
               */
              CPU.prototype.setSpeed = function(nMultiplier, fOnClick)
              {
                  if (nMultiplier !== undefined) {
                      /*
                       * If we couldn't reach at least 80% (0.8) of the current target speed,
                       * then revert the multiplier back to one.
                       */
                      if (this.aCounts.mhz / this.aCounts.mhzTarget < 0.8) nMultiplier = 1;
                      this.aCounts.nCyclesMultiplier = nMultiplier;
                      var mhz = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
                      if (this.aCounts.mhzTarget != mhz) {
                          this.aCounts.mhzTarget = mhz;
                          var sSpeed = this.getSpeedTarget();
                          var controlSpeed = this.bindings["setSpeed"];
                          if (controlSpeed) controlSpeed.textContent = sSpeed;
                          this.println("target speed: " + sSpeed);
                      }
                      if (fOnClick) this.setFocus();
                  }
                  this.addCycles(this.nRunCycles);
                  this.nRunCycles = 0;
                  this.aCounts.msStartRun = usr.getTime();
                  this.aCounts.msEndThisRun = 0;
                  this.calcCycles();
                  return this.aCounts.mhzTarget;
              };
              
              /**
               * calcSpeed(nCycles, msElapsed)
               *
               * @this {CPU}
               * @param {number} nCycles
               * @param {number} msElapsed
               */
              CPU.prototype.calcSpeed = function(nCycles, msElapsed)
              {
                  if (msElapsed) {
                      this.aCounts.mhz = Math.round(nCycles / (msElapsed * 10)) / 100;
                      if (msElapsed >= 86400000) {
                          this.nTotalCycles = 0;
                          if (this.chipset) this.chipset.updateAllTimers(true);
                          this.setSpeed();        // reset all counters once per day so that we never have to worry about overflow
                      }
                  }
              };
              
              /**
               * calcStartTime()
               *
               * @this {CPU}
               */
              CPU.prototype.calcStartTime = function()
              {
                  if (this.aCounts.nCyclesRecalc >= this.aCounts.nCyclesPerSecond) {
                      this.calcCycles(true);
                  }
                  this.aCounts.nCyclesThisRun = 0;
                  this.aCounts.msStartThisRun = usr.getTime();
              
                  /*
                   * Try to detect situations where the browser may have throttled us, such as when the user switches
                   * to a different tab; in those situations, Chrome and Safari may restrict setTimeout() callbacks
                   * to roughly one per second.
                   *
                   * Another scenario: the user resizes the browser window.  setTimeout() callbacks are not throttled,
                   * but there can still be enough of a lag between the callbacks that CPU speed will be noticeably
                   * erratic if we don't compensate for it here.
                   *
                   * We can detect throttling/lagging by verifying that msEndThisRun (which was set at the end of the
                   * previous run and includes any requested sleep time) is comparable to the current msStartThisRun;
                   * if the delta is significant, we compensate by bumping msStartRun forward by that delta.
                   *
                   * This shouldn't be triggered when the Debugger halts the CPU, because setSpeed() -- which is called
                   * whenever the CPU starts running again -- zeroes msEndThisRun.
                   *
                   * This also won't do anything about other internal delays; for example, Debugger message() calls.
                   * By the time the message() function has called yieldCPU(), the cost of the message has already been
                   * incurred, so it will be end up being charged against the instruction(s) that triggered it.
                   *
                   * TODO: Consider calling yieldCPU() sooner from message(), so that it can arrange for the msEndThisRun
                   * "snapshot" to occur sooner; it's unclear, however, whether that will really improve the CPU's ability
                   * to hit its target speed, since you would expect any instruction that displays a message to be an
                   * EXTREMELY slow instruction.
                   */
                  if (this.aCounts.msEndThisRun) {
                      var msDelta = this.aCounts.msStartThisRun - this.aCounts.msEndThisRun;
                      if (msDelta > this.aCounts.msPerYield) {
                          if (MAXDEBUG) this.println("large time delay: " + msDelta + "ms");
                          this.aCounts.msStartRun += msDelta;
                          /*
                           * Bumping msStartRun forward should NEVER cause it to exceed msStartThisRun; however, just
                           * in case, I make absolutely sure it cannot happen, since doing so could result in negative
                           * speed calculations.
                           */
                          this.assert(this.aCounts.msStartRun <= this.aCounts.msStartThisRun);
                          if (this.aCounts.msStartRun > this.aCounts.msStartThisRun) {
                              this.aCounts.msStartRun = this.aCounts.msStartThisRun;
                          }
                      }
                  }
              };
              
              /**
               * calcRemainingTime()
               *
               * @this {CPU}
               * @return {number}
               */
              CPU.prototype.calcRemainingTime = function()
              {
                  this.aCounts.msEndThisRun = usr.getTime();
              
                  var msYield = this.aCounts.msPerYield;
                  if (this.aCounts.nCyclesThisRun) {
                      /*
                       * Normally, we would assume we executed a full quota of work over msPerYield, but since the CPU
                       * now has the option of calling yieldCPU(), that might not be true.  If nCyclesThisRun is correct, then
                       * the ratio of nCyclesThisRun/nCyclesPerYield should represent the percentage of work we performed,
                       * and so applying that percentage to msPerYield should give us a better estimate of work vs. time.
                       */
                      msYield = Math.round(msYield * this.aCounts.nCyclesThisRun / this.aCounts.nCyclesPerYield);
                  }
              
                  var msElapsedThisRun = this.aCounts.msEndThisRun - this.aCounts.msStartThisRun;
                  var msRemainsThisRun = msYield - msElapsedThisRun;
              
                  /*
                   * We could pass only "this run" results to calcSpeed():
                   *
                   *      nCycles = this.aCounts.nCyclesThisRun;
                   *      msElapsed = msElapsedThisRun;
                   *
                   * but it seems preferable to use longer time periods and hopefully get a more accurate speed.
                   *
                   * Also, if msRemainsThisRun >= 0 && this.aCounts.nCyclesMultiplier == 1, we could pass these results instead:
                   *
                   *      nCycles = this.aCounts.nCyclesThisRun;
                   *      msElapsed = this.aCounts.msPerYield;
                   *
                   * to insure that we display a smooth, constant N Mhz.  But for now, I prefer seeing any fluctuations.
                   */
                  var nCycles = this.nRunCycles;
                  var msElapsed = this.aCounts.msEndThisRun - this.aCounts.msStartRun;
              
                  if (MAXDEBUG && msRemainsThisRun < 0 && this.aCounts.nCyclesMultiplier > 1) {
                      this.println("warning: updates @" + msElapsedThisRun + "ms (prefer " + Math.round(msYield) + "ms)");
                  }
              
                  this.calcSpeed(nCycles, msElapsed);
              
                  if (msRemainsThisRun < 0 || this.aCounts.mhz < this.aCounts.mhzTarget) {
                      /*
                       * If the last burst took MORE time than we allotted (ie, it's taking more than 1 second to simulate
                       * nCyclesPerSecond), all we can do is yield for as little time as possible (ie, 0ms) and hope that the
                       * simulation is at least usable.
                       */
                      msRemainsThisRun = 0;
                  }
              
                  /*
                   * Last but not least, update nCyclesRecalc, so that when runCPU() starts up again and calls calcStartTime(),
                   * it'll be ready to decide if calcCycles() should be called again.
                   */
                  this.aCounts.nCyclesRecalc += this.aCounts.nCyclesThisRun;
              
                  if (DEBUG && this.messageEnabled(Messages.LOG) && msRemainsThisRun) {
                      this.log("calcRemainingTime: " + msRemainsThisRun + "ms to sleep after " + this.aCounts.msEndThisRun + "ms");
                  }
              
                  this.aCounts.msEndThisRun += msRemainsThisRun;
                  return msRemainsThisRun;
              };
              
              /**
               * runCPU(fOnClick)
               *
               * @this {CPU}
               * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
               */
              CPU.prototype.runCPU = function(fOnClick)
              {
                  if (!this.setBusy(true)) {
                      this.updateCPU();
                      if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
                      return;
                  }
              
                  this.startCPU(fOnClick);
              
                  /*
                   *  calcStartTime() initializes the cycle counter and timestamp for this runCPU() invocation, and optionally
                   *  recalculates the the maximum number of cycles for each burst if the nCyclesRecalc threshold has been reached.
                   */
                  this.calcStartTime();
                  try {
                      do {
                          var nCyclesPerBurst = (this.aFlags.fChecksum? 1 : this.aCounts.nCyclesPerBurst);
              
                          if (this.chipset) {
                              this.chipset.updateAllTimers();
                              nCyclesPerBurst = this.chipset.getTimerCycleLimit(0, nCyclesPerBurst);
                              nCyclesPerBurst = this.chipset.getRTCCycleLimit(nCyclesPerBurst);
                          }
              
                          /*
                           * nCyclesPerBurst is how many cycles we WANT to run on each iteration of stepCPU(), but it may run
                           * significantly less (or slightly more, since we can't execute partial instructions).
                           */
                          this.stepCPU(nCyclesPerBurst);
              
                          /*
                           * nBurstCycles, less any remaining nStepCycles, is how many cycles stepCPU() ACTUALLY ran (nCycles).
                           * We add that to nCyclesThisRun, as well as nRunCycles, which is the cycle count since the CPU first
                           * started running.
                           */
                          var nCycles = this.nBurstCycles - this.nStepCycles;
                          this.nRunCycles += nCycles;
                          this.aCounts.nCyclesThisRun += nCycles;
                          this.addCycles(0, true);
                          this.updateChecksum(nCycles);
              
                          this.aCounts.nCyclesNextVideoUpdate -= nCycles;
                          if (this.aCounts.nCyclesNextVideoUpdate <= 0) {
                              this.aCounts.nCyclesNextVideoUpdate += this.aCounts.nCyclesPerVideoUpdate;
                              this.updateVideo();
                          }
              
                          this.aCounts.nCyclesNextStatusUpdate -= nCycles;
                          if (this.aCounts.nCyclesNextStatusUpdate <= 0) {
                              this.aCounts.nCyclesNextStatusUpdate += this.aCounts.nCyclesPerStatusUpdate;
                              this.updateStatus();
                          }
              
                          this.aCounts.nCyclesNextYield -= nCycles;
                          if (this.aCounts.nCyclesNextYield <= 0) {
                              this.aCounts.nCyclesNextYield += this.aCounts.nCyclesPerYield;
                              break;
                          }
                      } while (this.aFlags.fRunning);
                  }
                  catch (e) {
                      this.stopCPU();
                      this.updateCPU();
                      if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
                      this.setBusy(false);
                      this.setError(e.stack || e.message);
                      return;
                  }
                  setTimeout(this.onRunTimeout, this.calcRemainingTime());
              };
              
              /**
               * startCPU(fSetFocus)
               *
               * WARNING: Other components must use runCPU() to get the CPU running; this is a runCPU() helper function only.
               *
               * @param {boolean} [fSetFocus]
               */
              CPU.prototype.startCPU = function(fSetFocus)
              {
                  if (!this.aFlags.fRunning) {
                      /*
                       *  setSpeed() without a speed parameter leaves the selected speed in place, but also resets the
                       *  cycle counter and timestamp for the current series of runCPU() calls, calculates the maximum number
                       *  of cycles for each burst based on the last known effective CPU speed, and resets the nCyclesRecalc
                       *  threshold counter.
                       */
                      this.setSpeed();
                      if (this.cmp) this.cmp.start(this.aCounts.msStartRun, this.getCycles());
                      this.aFlags.fRunning = true;
                      this.aFlags.fStarting = true;
                      if (this.chipset) this.chipset.setSpeaker();
                      var controlRun = this.bindings["run"];
                      if (controlRun) controlRun.textContent = "Halt";
                      this.updateStatus(true);
                      if (fSetFocus) this.setFocus();
                  }
              };
              
              /**
               * stepCPU(nMinCycles)
               *
               * This will be implemented by the X86CPU component.
               *
               * @this {CPU}
               * @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
               * @return {number} of cycles executed; 0 indicates that the last instruction was not executed
               */
              CPU.prototype.stepCPU = function(nMinCycles)
              {
                  return 0;
              };
              
              /**
               * stopCPU(fComplete)
               *
               * For use by any component that wants to stop the CPU.
               *
               * This similar to yieldCPU(), but it doesn't need to zero nCyclesNextYield to break out of runCPU();
               * it simply needs to clear fRunning (well, "simply" may be oversimplifying a bit....)
               *
               * @this {CPU}
               * @param {boolean} [fComplete]
               */
              CPU.prototype.stopCPU = function(fComplete)
              {
                  this.isBusy(true);
                  this.nBurstCycles -= this.nStepCycles;
                  this.nStepCycles = 0;
                  this.addCycles(this.nRunCycles);
                  this.nRunCycles = 0;
                  if (this.aFlags.fRunning) {
                      this.aFlags.fRunning = false;
                      if (this.chipset) this.chipset.setSpeaker();
                      var controlRun = this.bindings["run"];
                      if (controlRun) controlRun.textContent = "Run";
                  }
                  this.aFlags.fComplete = fComplete;
              };
              
              /**
               * updateCPU()
               *
               * This used to be performed at the end of every stepCPU(), but runCPU() -- which relies upon
               * stepCPU() -- needed to have more control over when these updates are performed.  However, for
               * other callers of stepCPU(), such as the Debugger, the combination of stepCPU() + updateCPU()
               * provides the old behavior.
               *
               * @this {CPU}
               */
              CPU.prototype.updateCPU = function()
              {
                  this.updateVideo();
                  this.updateStatus();
              };
              
              /**
               * yieldCPU()
               *
               * Similar to stopCPU() with regard to how it resets various cycle countdown values, but the CPU
               * remains in a "running" state.
               *
               * @this {CPU}
               */
              CPU.prototype.yieldCPU = function()
              {
                  this.aCounts.nCyclesNextYield = 0;  // this will break us out of runCPU(), once we break out of stepCPU()
                  this.nBurstCycles -= this.nStepCycles;
                  this.nStepCycles = 0;               // this will break us out of stepCPU()
                  if (DEBUG) this.nSnapCycles = this.nBurstCycles;
                  /*
                   * The Debugger calls yieldCPU() after every message() to ensure browser responsiveness, but it looks
                   * odd for those messages to show CPU state changes but for the CPU's own status display to not (ditto
                   * for the Video display), so I've added this call to try to keep things looking synchronized.
                   */
                  this.updateCPU();
              };
              
              if (typeof module !== 'undefined') module.exports = CPU;
              
            • debugger.js
              /**
               * @fileoverview Implements the PCjs Debugger component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-21
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (DEBUGGER) {
                  if (typeof module !== 'undefined') {
                      var str         = require("../../shared/lib/strlib");
                      var usr         = require("../../shared/lib/usrlib");
                      var web         = require("../../shared/lib/weblib");
                      var Component   = require("../../shared/lib/component");
                      var Interrupts  = require("./interrupts");
                      var Messages    = require("./messages");
                      var Bus         = require("./bus");
                      var Memory      = require("./memory");
                      var Keyboard    = require("./keyboard");
                      var State       = require("./state");
                      var CPU         = require("./cpu");
                      var X86         = require("./x86");
                      var X86Seg      = require("./x86seg");
                  }
              }
              
              /**
               * Debugger Address Object
               *
               * When off is null, the entire address is considered invalid.
               *
               * When sel is null, addr must be set to a valid linear address.
               *
               * When addr is null (or reset to null), it will be recomputed from sel:off.
               *
               * NOTE: I originally tried to define DbgAddr as a record typedef, which allowed me to reference the type
               * as {DbgAddr} instead of {{DbgAddr}}, but my IDE (WebStorm) did not recognize all instances of {DbgAddr}.
               * Using this @class definition is a bit cleaner, and it makes both WebStorm and the Closure Compiler happier,
               * at the expense of making all references {{DbgAddr}}.  Defining a typedef based on this class doesn't help.
               *
               * @class DbgAddr
               * @property {number|null|undefined} off (offset, if any)
               * @property {number|null|undefined} sel (selector, if any)
               * @property {number|null|undefined} addr (linear address, if any)
               * @property {boolean|undefined} fData32 (true if 32-bit operand size in effect)
               * @property {boolean|undefined} fAddr32 (true if 32-bit address size in effect)
               * @property {boolean|undefined} fOverride (true if any overrides were processed with this address)
               * @property {boolean|undefined} fComplete (true if a complete instruction was processed with this address)
               * @property {boolean|undefined} fTempBreak (true if this is a temporary breakpoint address)
               */
              
              /**
               * Debugger(parmsDbg)
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsDbg
               *
               * The Debugger component supports the following optional (parmsDbg) properties:
               *
               *      commands: string containing zero or more commands, separated by ';'
               *
               *      messages: string containing zero or more message categories to enable;
               *      multiple categories must be separated by '|' or ';'.  Parsed by messageInit().
               *
               * The Debugger component is an optional component that implements a variety of user
               * commands for controlling the CPU, dumping and editing memory, etc.
               */
              function Debugger(parmsDbg)
              {
                  if (DEBUGGER) {
              
                      Component.call(this, "Debugger", parmsDbg, Debugger);
              
                      /*
                       * These keep track of instruction activity, but only when tracing or when Debugger checks
                       * have been enabled (eg, one or more breakpoints have been set).
                       *
                       * They are zeroed by the reset() notification handler.  cInstructions is advanced by
                       * stepCPU() and checkInstruction() calls.  nCycles is updated by every stepCPU() or stop()
                       * call and simply represents the number of cycles performed by the last run of instructions.
                       */
                      this.nCycles = -1;
                      this.cInstructions = -1;
              
                      /*
                       * Default number of hex chars in a register and a linear address (ie, for real-mode);
                       * updated by initBus().
                       */
                      this.cchReg = 4;
                      this.maskReg = 0xffff;
                      this.cchAddr = 5;
                      this.maskAddr = 0xfffff;
              
                      /*
                       * Most commands that require an address call parseAddr(), which defaults to dbgAddrNextCode
                       * or dbgAddrNextData when no address has been given.  doDump() and doUnassemble(), in turn,
                       * update dbgAddrNextData and dbgAddrNextCode, respectively, when they're done.
                       *
                       * All dbgAddr variables contain properties off, sel, and addr, where sel:off represents the
                       * segmented address and addr is the corresponding linear address (if known).  For certain
                       * segmented addresses (eg, breakpoint addresses), we pre-compute the linear address and save
                       * that in addr, so that the breakpoint will still operate as intended even if the mode changes
                       * later (eg, from real-mode to protected-mode).
                       *
                       * Finally, for TEMPORARY breakpoint addresses, we set fTempBreak to true, so that they can be
                       * automatically cleared when they're hit.
                       */
                      this.dbgAddrNextCode = this.newAddr();
                      this.dbgAddrNextData = this.newAddr();
              
                      /*
                       * This maintains command history.  New commands are inserted at index 0 of the array.
                       * When Enter is pressed on an empty input buffer, we default to the command at aPrevCmds[0].
                       */
                      this.iPrevCmd = -1;
                      this.aPrevCmds = [];
              
                      /*
                       * fAssemble is true when "assemble mode" is active, false when not.
                       */
                      this.fAssemble = false;
                      this.dbgAddrAssemble = this.newAddr();
              
                      /*
                       * aSymbolTable is an array of 4-element arrays, one per ROM or other chunk of address space.
                       * Each 4-element arrays contains:
                       *
                       *      [0]: addr
                       *      [1]: size
                       *      [2]: aSymbols
                       *      [3]: aOffsetPairs
                       *
                       * See addSymbols() for more details, since that's how callers add sets of symbols to the table.
                       */
                      this.aSymbolTable = [];
              
                      /*
                       * clearBreakpoints() initializes the breakpoints lists: aBreakExec is a list of addresses
                       * to halt on whenever attempting to execute an instruction at the corresponding address,
                       * and aBreakRead and aBreakWrite are lists of addresses to halt on whenever a read or write,
                       * respectively, occurs at the corresponding address.
                       */
                      this.clearBreakpoints();
              
                      /*
                       * Execution history is allocated by historyInit() whenever checksEnabled() conditions change.
                       * Execution history is updated whenever the CPU calls checkInstruction(), which will happen
                       * only when checksEnabled() returns true (eg, whenever one or more breakpoints have been set).
                       * This ensures that, by default, the CPU runs as fast as possible.
                       */
                      this.historyInit();
              
                      /*
                       * Initialize Debugger message support
                       */
                      this.messageInit(parmsDbg['messages']);
              
                      /*
                       * The instruction trace buffer is a lightweight logging mechanism with minimal impact
                       * on the browser (unlike printing to either console.log or an HTML control, which can
                       * make the browser unusable if printing is too frequent).  The Debugger's info command
                       * ("n dump [#]") dumps this buffer.  Note that dumping too much at once can also bog
                       * things down, but by that point, you've presumably already captured the info you need
                       * and are willing to wait.
                       */
                      if (DEBUG) this.traceInit();
              
                      this.sInitCommands = parmsDbg['commands'];
              
                      /*
                       * Make it easier to access Debugger commands from an external REPL (eg, the WebStorm
                       * "live" console window); eg:
                       *
                       *      $('r')
                       *      $('dw 0:0')
                       *      $('h')
                       *      ...
                       */
                      var dbg = this;
                      if (window) {
                          if (window['$'] === undefined) {
                              window['$'] = function(s) { return dbg.doCommand(s); };
                          }
                      } else {
                          if (global['$'] === undefined) {
                              global['$'] = function(s) { return dbg.doCommand(s); };
                          }
                      }
              
                  }   // endif DEBUGGER
              }
              
              if (DEBUGGER) {
              
                  Component.subclass(Debugger);
              
                  /*
                   * Information regarding interrupts of interest (used by messageInt() and others)
                   */
                  Debugger.INT_MESSAGES = {
                      0x10:       Messages.VIDEO,
                      0x13:       Messages.FDC,
                      0x15:       Messages.CHIPSET,
                      0x16:       Messages.KEYBOARD,
                   // 0x1a:       Messages.RTC,       // ChipSet contains its own custom messageInt() handler for the RTC
                      0x1c:       Messages.TIMER,
                      0x21:       Messages.DOS,
                      0x33:       Messages.MOUSE
                  };
              
                  Debugger.COMMANDS = {
                      '?':     "help",
                      'a [#]': "assemble",
                      'b [#]': "breakpoint",
                      'c':     "clear output",
                      'd [#]': "dump memory",
                      'e [#]': "edit memory",
                      'f':     "frequencies",
                      'g [#]': "go [to #]",
                      'h [#]': "halt/history",
                      'i [#]': "input port #",
                      'k':     "stack trace",
                      'l':     "load sector(s)",
                      'm':     "messages",
                      'o [#]': "output port #",
                      'p':     "step over",
                      'r':     "dump/edit registers",
                      't [#]': "step instruction(s)",
                      'u [#]': "unassemble",
                      'x':     "execution options",
                      'reset': "reset computer",
                      'ver':   "display version"
                  };
              
                  /*
                   * Address types for parseAddr(), to help choose between dbgAddrNextCode and dbgAddrNextData
                   */
                  Debugger.ADDR_CODE = 1;
                  Debugger.ADDR_DATA = 2;
              
                  /*
                   * Instruction ordinals
                   */
                  Debugger.INS = {
                      NONE:   0,   AAA:    1,   AAD:    2,   AAM:    3,   AAS:    4,   ADC:    5,   ADD:    6,   AND:    7,
                      ARPL:   8,   AS:     9,   BOUND:  10,  BSF:    11,  BSR:    12,  BT:     13,  BTC:    14,  BTR:    15,
                      BTS:    16,  CALL:   17,  CBW:    18,  CLC:    19,  CLD:    20,  CLI:    21,  CLTS:   22,  CMC:    23,
                      CMP:    24,  CMPSB:  25,  CMPSW:  26,  CS:     27,  CWD:    28,  DAA:    29,  DAS:    30,  DEC:    31,
                      DIV:    32,  DS:     33,  ENTER:  34,  ES:     35,  ESC:    36,  FADD:   37,  FBLD:   38,  FBSTP:  39,
                      FCOM:   40,  FCOMP:  41,  FDIV:   42,  FDIVR:  43,  FIADD:  44,  FICOM:  45,  FICOMP: 46,  FIDIV:  47,
                      FIDIVR: 48,  FILD:   49,  FIMUL:  50,  FIST:   51,  FISTP:  52,  FISUB:  53,  FISUBR: 54,  FLD:    55,
                      FLDCW:  56,  FLDENV: 57,  FMUL:   58,  FNSAVE: 59,  FNSTCW: 60,  FNSTENV:61,  FNSTSW: 62,  FRSTOR: 63,
                      FS:     64,  FST:    65,  FSTP:   66,  FSUB:   67,  FSUBR:  68,  GS:     69,  HLT:    70,  IDIV:   71,
                      IMUL:   72,  IN:     73,  INC:    74,  INS:    75,  INT:    76,  INT3:   77,  INTO:   78,  IRET:   79,
                      JBE:    80,  JC:     81,  JCXZ:   82,  JG:     83,  JGE:    84,  JL:     85,  JLE:    86,  JMP:    87,
                      JA:     88,  JNC:    89,  JNO:    90,  JNP:    91,  JNS:    92,  JNZ:    93,  JO:     94,  JP:     95,
                      JS:     96,  JZ:     97,  LAHF:   98,  LAR:    99,  LDS:    100, LEA:    101, LEAVE:  102, LES:    103,
                      LFS:    104, LGDT:   105, LGS:    106, LIDT:   107, LLDT:   108, LMSW:   109, LOADALL:110, LOCK:   111,
                      LODSB:  112, LODSW:  113, LOOP:   114, LOOPNZ: 115, LOOPZ:  116, LSL:    117, LSS:    118, LTR:    119,
                      MOV:    120, MOVSB:  121, MOVSW:  122, MOVSX:  123, MOVZX:  124, MUL:    125, NEG:    126, NOP:    127,
                      NOT:    128, OR:     129, OS:     130, OUT:    131, OUTS:   132, POP:    133, POPA:   134, POPF:   135,
                      PUSH:   136, PUSHA:  137, PUSHF:  138, RCL:    139, RCR:    140, REPNZ:  141, REPZ:   142, RET:    143,
                      RETF:   144, ROL:    145, ROR:    146, SAHF:   147, SALC:   148, SAR:    149, SBB:    150, SCASB:  151,
                      SCASW:  152, SETBE:  153, SETC:   154, SETG:   155, SETGE:  156, SETL:   157, SETLE:  158, SETNBE: 159,
                      SETNC:  160, SETNO:  161, SETNP:  162, SETNS:  163, SETNZ:  164, SETO:   165, SETP:   166, SETS:   167,
                      SETZ:   168, SGDT:   169, SHL:    170, SHLD:   171, SHR:    172, SHRD:   173, SIDT:   174, SLDT:   175,
                      SMSW:   176, SS:     177, STC:    178, STD:    179, STI:    180, STOSB:  181, STOSW:  182, STR:    183,
                      SUB:    184, TEST:   185, VERR:   186, VERW:   187, WAIT:   188, XCHG:   189, XLAT:   190, XOR:    191,
                      GRP1B:  192, GRP1W:  193, GRP1SW: 194, GRP2B:  195, GRP2W:  196, GRP2B1: 197, GRP2W1: 198, GRP2BC: 199,
                      GRP2WC: 200, GRP3B:  201, GRP3W:  202, GRP4B:  203, GRP4W:  204, OP0F:   205, GRP6:   206, GRP7:   207,
                      GRP8:   208
                  };
              
                  /*
                   * Instruction names (mnemonics), indexed by instruction ordinal (above)
                   */
                  Debugger.INS_NAMES = [
                      "INVALID","AAA",    "AAD",    "AAM",    "AAS",    "ADC",    "ADD",    "AND",
                      "ARPL",   "AS:",    "BOUND",  "BSF",    "BSR",    "BT",     "BTC",    "BTR",
                      "BTS",    "CALL",   "CBW",    "CLC",    "CLD",    "CLI",    "CLTS",   "CMC",
                      "CMP",    "CMPSB",  "CMPSW",  "CS:",    "CWD",    "DAA",    "DAS",    "DEC",
                      "DIV",    "DS:",    "ENTER",  "ES:",    "ESC",    "FADD",   "FBLD",   "FBSTP",
                      "FCOM",   "FCOMP",  "FDIV",   "FDIVR",  "FIADD",  "FICOM",  "FICOMP", "FIDIV",
                      "FIDIVR", "FILD",   "FIMUL",  "FIST",   "FISTP",  "FISUB",  "FISUBR", "FLD",
                      "FLDCW",  "FLDENV", "FMUL",   "FNSAVE", "FNSTCW", "FNSTENV","FNSTSW", "FRSTOR",
                      "FS:",    "FST",    "FSTP",   "FSUB",   "FSUBR",  "GS:",    "HLT",    "IDIV",
                      "IMUL",   "IN",     "INC",    "INS",    "INT",    "INT3",   "INTO",   "IRET",
                      "JBE",    "JC",     "JCXZ",   "JG",     "JGE",    "JL",     "JLE",    "JMP",
                      "JA",     "JNC",    "JNO",    "JNP",    "JNS",    "JNZ",    "JO",     "JP",
                      "JS",     "JZ",     "LAHF",   "LAR",    "LDS",    "LEA",    "LEAVE",  "LES",
                      "LFS",    "LGDT",   "LGS",    "LIDT",   "LLDT",   "LMSW",   "LOADALL","LOCK",
                      "LODSB",  "LODSW",  "LOOP",   "LOOPNZ", "LOOPZ",  "LSL",    "LSS",    "LTR",
                      "MOV",    "MOVSB",  "MOVSW",  "MOVSX",  "MOVZX",  "MUL",    "NEG",    "NOP",
                      "NOT",    "OR",     "OS:",    "OUT",    "OUTS",   "POP",    "POPA",   "POPF",
                      "PUSH",   "PUSHA",  "PUSHF",  "RCL",    "RCR",    "REPNZ",  "REPZ",   "RET",
                      "RETF",   "ROL",    "ROR",    "SAHF",   "SALC",   "SAR",    "SBB",    "SCASB",
                      "SCASW",  "SETBE",  "SETC",   "SETG",   "SETGE",  "SETL",   "SETLE",  "SETNBE",
                      "SETNC",  "SETNO",  "SETNP",  "SETNS",  "SETNZ",  "SETO",   "SETP",   "SETS",
                      "SETZ",   "SGDT",   "SHL",    "SHLD",   "SHR",    "SHRD",   "SIDT",   "SLDT",
                      "SMSW",   "SS:",    "STC",    "STD",    "STI",    "STOSB",  "STOSW",  "STR",
                      "SUB",    "TEST",   "VERR",   "VERW",   "WAIT",   "XCHG",   "XLAT",   "XOR"
                  ];
              
                  Debugger.CPU_8086  = 0;
                  Debugger.CPU_80186 = 1;
                  Debugger.CPU_80286 = 2;
                  Debugger.CPU_80386 = 3;
                  Debugger.CPUS = [8086, 80186, 80286, 80386];
              
                  /*
                   * ModRM masks and definitions
                   */
                  Debugger.REG_AL  = 0x00;             // bits 0-2 are standard Reg encodings
                  Debugger.REG_CL  = 0x01;
                  Debugger.REG_DL  = 0x02;
                  Debugger.REG_BL  = 0x03;
                  Debugger.REG_AH  = 0x04;
                  Debugger.REG_CH  = 0x05;
                  Debugger.REG_DH  = 0x06;
                  Debugger.REG_BH  = 0x07;
                  Debugger.REG_AX  = 0x08;
                  Debugger.REG_CX  = 0x09;
                  Debugger.REG_DX  = 0x0A;
                  Debugger.REG_BX  = 0x0B;
                  Debugger.REG_SP  = 0x0C;
                  Debugger.REG_BP  = 0x0D;
                  Debugger.REG_SI  = 0x0E;
                  Debugger.REG_DI  = 0x0F;
                  Debugger.REG_SEG = 0x10;
                  Debugger.REG_IP  = 0x16;
                  Debugger.REG_PS  = 0x17;
                  Debugger.REG_EAX = 0x18;
                  Debugger.REG_ECX = 0x19;
                  Debugger.REG_EDX = 0x1A;
                  Debugger.REG_EBX = 0x1B;
                  Debugger.REG_ESP = 0x1C;
                  Debugger.REG_EBP = 0x1D;
                  Debugger.REG_ESI = 0x1E;
                  Debugger.REG_EDI = 0x1F;
                  Debugger.REG_CR0 = 0x20;
                  Debugger.REG_CR1 = 0x21;
                  Debugger.REG_CR2 = 0x22;
                  Debugger.REG_CR3 = 0x23;
              
                  Debugger.REGS = [
                      "AL",  "CL",  "DL",  "BL",  "AH",  "CH",  "DH",  "BH",
                      "AX",  "CX",  "DX",  "BX",  "SP",  "BP",  "SI",  "DI",
                      "ES",  "CS",  "SS",  "DS",  "FS",  "GS",  "IP",  "PS",
                      "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI",
                      "CR0", "CR1", "CR2", "CR3"
                  ];
              
                  Debugger.REG_ES         = 0x00;     // bits 0-1 are standard SegReg encodings
                  Debugger.REG_CS         = 0x01;
                  Debugger.REG_SS         = 0x02;
                  Debugger.REG_DS         = 0x03;
                  Debugger.REG_FS         = 0x04;
                  Debugger.REG_GS         = 0x05;
                  Debugger.REG_UNKNOWN    = 0x00;
              
                  Debugger.MOD_NODISP     = 0x00;     // use RM below, no displacement
                  Debugger.MOD_DISP8      = 0x01;     // use RM below + 8-bit displacement
                  Debugger.MOD_DISP16     = 0x02;     // use RM below + 16-bit displacement
                  Debugger.MOD_REGISTER   = 0x03;     // use REG above
              
                  Debugger.RM_BXSI        = 0x00;
                  Debugger.RM_BXDI        = 0x01;
                  Debugger.RM_BPSI        = 0x02;
                  Debugger.RM_BPDI        = 0x03;
                  Debugger.RM_SI          = 0x04;
                  Debugger.RM_DI          = 0x05;
                  Debugger.RM_BP          = 0x06;
                  Debugger.RM_IMMOFF      = Debugger.RM_BP;       // only if MOD_NODISP
                  Debugger.RM_BX          = 0x07;
              
                  Debugger.RMS = [
                      "BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI",    "DI",    "BP",    "BX",
                      "EAX",   "ECX",   "EDX",   "EBX",   "ESP",   "EBP",   "ESI",   "EDI"
                  ];
              
                  /*
                   * Operand type descriptor masks and definitions
                   *
                   * Note that the letters in () in the comments refer to Intel's
                   * nomenclature used in Appendix A of the 80386 Programmers Reference Manual.
                   */
                  Debugger.TYPE_SIZE      = 0x000F;   // size field
                  Debugger.TYPE_MODE      = 0x00F0;   // mode field
                  Debugger.TYPE_IREG      = 0x0F00;   // implied register field
                  Debugger.TYPE_OTHER     = 0xF000;   // "other" field
              
                  /*
                   * TYPE_SIZE values.  Some of the values (eg, TYPE_WORDIB and TYPE_WORDIW)
                   * imply the presence of a third operand, for those weird cases....
                   */
                  Debugger.TYPE_NONE      = 0x0000;   //     (all other TYPE fields ignored)
                  Debugger.TYPE_BYTE      = 0x0001;   // (b) byte, regardless of operand size
                  Debugger.TYPE_SBYTE     = 0x0002;   //     byte sign-extended to word
                  Debugger.TYPE_WORD      = 0x0003;   // (w) word, regardless...
                  Debugger.TYPE_VWORD     = 0x0004;   // (v) word or double-word, depending...
                  Debugger.TYPE_DWORD     = 0x0005;   // (d) double-word, regardless...
                  Debugger.TYPE_SEGP      = 0x0006;   // (p) 32-bit or 48-bit pointer
                  Debugger.TYPE_FARP      = 0x0007;   // (p) 32-bit or 48-bit pointer for JMP/CALL
                  Debugger.TYPE_2WORD     = 0x0008;   // (a) two memory operands (BOUND only)
                  Debugger.TYPE_DESC      = 0x0009;   // (s) 6 byte pseudo-descriptor
                  Debugger.TYPE_WORDIB    = 0x000A;   //     two source operands (eg, IMUL)
                  Debugger.TYPE_WORDIW    = 0x000B;   //     two source operands (eg, IMUL)
                  Debugger.TYPE_PREFIX    = 0x000F;   //     (treat similarly to TYPE_NONE)
              
                  /*
                   * TYPE_MODE values.  Order is somewhat important, as all values implying
                   * the presence of a ModRM byte are assumed to be >= TYPE_MODRM.
                   */
                  Debugger.TYPE_IMM       = 0x0000;   // (I) immediate data
                  Debugger.TYPE_ONE       = 0x0010;   //     implicit 1 (eg, shifts/rotates)
                  Debugger.TYPE_IMMOFF    = 0x0020;   // (A) immediate offset
                  Debugger.TYPE_IMMREL    = 0x0030;   // (J) immediate relative
                  Debugger.TYPE_DSSI      = 0x0040;   // (X) memory addressed by DS:SI
                  Debugger.TYPE_ESDI      = 0x0050;   // (Y) memory addressed by ES:DI
                  Debugger.TYPE_IMPREG    = 0x0060;   //     implicit register in TYPE_IREG
                  Debugger.TYPE_IMPSEG    = 0x0070;   //     implicit segment register in TYPE_IREG
                  Debugger.TYPE_MODRM     = 0x0080;   // (E) standard ModRM decoding
                  Debugger.TYPE_MEM       = 0x0090;   // (M) ModRM refers to memory only
                  Debugger.TYPE_REG       = 0x00A0;   // (G) standard Reg decoding
                  Debugger.TYPE_SEGREG    = 0x00B0;   // (S) Reg selects segment register
                  Debugger.TYPE_MODREG    = 0x00C0;   // (R) Mod refers to register only
                  Debugger.TYPE_CTLREG    = 0x00D0;   // (C) Reg selects control register
                  Debugger.TYPE_DBGREG    = 0x00E0;   // (D) Reg selects debug register
                  Debugger.TYPE_TSTREG    = 0x00F0;   // (T) Reg selects test register
              
                  /*
                   * TYPE_IREG values, based on the REG_* constants.
                   * For convenience, they include TYPE_IMPREG or TYPE_IMPSEG as appropriate.
                   */
                  Debugger.TYPE_AL = (Debugger.REG_AL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_CL = (Debugger.REG_CL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_DL = (Debugger.REG_DL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_BL = (Debugger.REG_BL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_AH = (Debugger.REG_AH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_CH = (Debugger.REG_CH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_DH = (Debugger.REG_DH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_BH = (Debugger.REG_BH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                  Debugger.TYPE_AX = (Debugger.REG_AX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_CX = (Debugger.REG_CX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_DX = (Debugger.REG_DX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_BX = (Debugger.REG_BX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_SP = (Debugger.REG_SP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_BP = (Debugger.REG_BP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_SI = (Debugger.REG_SI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_DI = (Debugger.REG_DI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                  Debugger.TYPE_ES = (Debugger.REG_ES << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                  Debugger.TYPE_CS = (Debugger.REG_CS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                  Debugger.TYPE_SS = (Debugger.REG_SS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                  Debugger.TYPE_DS = (Debugger.REG_DS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                  Debugger.TYPE_FS = (Debugger.REG_FS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                  Debugger.TYPE_GS = (Debugger.REG_GS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
              
                  /*
                   * TYPE_OTHER bit definitions
                   */
                  Debugger.TYPE_IN    = 0x1000;        // operand is input
                  Debugger.TYPE_OUT   = 0x2000;        // operand is output
                  Debugger.TYPE_BOTH  = (Debugger.TYPE_IN | Debugger.TYPE_OUT);
                  Debugger.TYPE_8086  = (Debugger.CPU_8086 << 14);
                  Debugger.TYPE_80186 = (Debugger.CPU_80186 << 14);
                  Debugger.TYPE_80286 = (Debugger.CPU_80286 << 14);
                  Debugger.TYPE_80386 = (Debugger.CPU_80386 << 14);
                  Debugger.TYPE_CPU_SHIFT = 14;
              
                  /*
                   * Message categories supported by the messageEnabled() function and other assorted message
                   * functions. Each category has a corresponding bit value that can be combined (ie, OR'ed) as
                   * needed.  The Debugger's message command ("m") is used to turn message categories on and off,
                   * like so:
                   *
                   *      m port on
                   *      m port off
                   *      ...
                   *
                   * NOTE: The order of these categories can be rearranged, alphabetized, etc, as desired; just be
                   * aware that changing the bit values could break saved Debugger states (not a huge concern, just
                   * something to be aware of).
                   */
                  Debugger.MESSAGES = {
                      "cpu":      Messages.CPU,
                      "seg":      Messages.SEG,
                      "desc":     Messages.DESC,
                      "tss":      Messages.TSS,
                      "int":      Messages.INT,
                      "fault":    Messages.FAULT,
                      "bus":      Messages.BUS,
                      "mem":      Messages.MEM,
                      "port":     Messages.PORT,
                      "dma":      Messages.DMA,
                      "pic":      Messages.PIC,
                      "timer":    Messages.TIMER,
                      "cmos":     Messages.CMOS,
                      "rtc":      Messages.RTC,
                      "8042":     Messages.C8042,
                      "chipset":  Messages.CHIPSET,   // ie, anything else in ChipSet besides DMA, PIC, TIMER, CMOS, RTC and 8042
                      "keyboard": Messages.KEYBOARD,
                      "key":      Messages.KEYS,      // using "keys" instead of "key" causes an unfortunate JavaScript property collision
                      "video":    Messages.VIDEO,
                      "fdc":      Messages.FDC,
                      "hdc":      Messages.HDC,
                      "disk":     Messages.DISK,
                      "serial":   Messages.SERIAL,
                      "speaker":  Messages.SPEAKER,
                      "state":    Messages.STATE,
                      "mouse":    Messages.MOUSE,
                      "computer": Messages.COMPUTER,
                      "dos":      Messages.DOS,
                      "data":     Messages.DATA,
                      "log":      Messages.LOG,
                      "warn":     Messages.WARN,
                      /*
                       * Now we turn to message actions rather than message types; for example, setting "halt"
                       * on or off doesn't enable "halt" messages, but rather halts the CPU on any message above.
                       */
                      "halt":     Messages.HALT
                  };
              
                  /*
                   * Instruction trace categories supported by the traceLog() function.  The Debugger's info
                   * command ("n") is used to turn trace categories on and off, like so:
                   *
                   *      n shl on
                   *      n shl off
                   *      ...
                   *
                   * Note that there are usually multiple entries for each category (one for each supported operand size);
                   * all matching entries are enabled or disabled as a group.
                   */
                  Debugger.TRACE = {
                      ROLB:   {ins: Debugger.INS.ROL,  size: 8},
                      ROLW:   {ins: Debugger.INS.ROL,  size: 16},
                      RORB:   {ins: Debugger.INS.ROR,  size: 8},
                      RORW:   {ins: Debugger.INS.ROR,  size: 16},
                      RCLB:   {ins: Debugger.INS.RCL,  size: 8},
                      RCLW:   {ins: Debugger.INS.RCL,  size: 16},
                      RCRB:   {ins: Debugger.INS.RCR,  size: 8},
                      RCRW:   {ins: Debugger.INS.RCR,  size: 16},
                      SHLB:   {ins: Debugger.INS.SHL,  size: 8},
                      SHLW:   {ins: Debugger.INS.SHL,  size: 16},
                      MULB:   {ins: Debugger.INS.MUL,  size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
                      IMULB:  {ins: Debugger.INS.IMUL, size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
                      DIVB:   {ins: Debugger.INS.DIV,  size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
                      IDIVB:  {ins: Debugger.INS.IDIV, size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
                      MULW:   {ins: Debugger.INS.MUL,  size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
                      IMULW:  {ins: Debugger.INS.IMUL, size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
                      DIVW:   {ins: Debugger.INS.DIV,  size: 32}, // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
                      IDIVW:  {ins: Debugger.INS.IDIV, size: 32}  // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
                  };
              
                  Debugger.TRACE_LIMIT = 100000;
              
                  /*
                   * Opcode 0x0F has a distinguished history:
                   *
                   *      On the 8086, it functioned as POP CS
                   *      On the 80186, it generated an Invalid Opcode (UD_FAULT) exception
                   *      On the 80286, it introduced a new (and growing) series of two-byte opcodes
                   *
                   * Based on the active CPU model, we make every effort to execute and disassemble this (and every other)
                   * opcode appropriately, by setting the opcode's entry in aaOpDescs accordingly.  0x0F in aaOpDescs points
                   * to the 8086 table: aOpDescPopCS.
                   *
                   * Note that we must NOT modify aaOpDescs directly.  this.aaOpDescs will point to Debugger.aaOpDescs
                   * if the processor is an 8086, because that's the processor that the hard-coded contents of the table
                   * represent; for all other processors, this.aaOpDescs will contain a copy of the table that we can modify.
                   */
                  Debugger.aOpDescPopCS     = [Debugger.INS.POP,  Debugger.TYPE_CS   | Debugger.TYPE_OUT];
                  Debugger.aOpDescUndefined = [Debugger.INS.NONE, Debugger.TYPE_NONE];
                  Debugger.aOpDesc0F        = [Debugger.INS.OP0F, Debugger.TYPE_WORD | Debugger.TYPE_BOTH];
              
                  /*
                   * The aaOpDescs array is indexed by opcode, and each element is a sub-array (aOpDesc) that describes
                   * the corresponding opcode. The sub-elements are as follows:
                   *
                   *      [0]: {number} of the opcode name (see INS.*)
                   *      [1]: {number} containing the destination operand descriptor bit(s), if any
                   *      [2]: {number} containing the source operand descriptor bit(s), if any
                   *      [3]: {number} containing the occasional third operand descriptor bit(s), if any
                   *
                   * These sub-elements are all optional. If [0] is not present, the opcode is undefined; if [1] is not
                   * present (or contains zero), the opcode has no (or only implied) operands; if [2] is not present, the
                   * opcode has only a single operand.  And so on.
                   */
                  Debugger.aaOpDescs = [
                  /* 0x00 */ [Debugger.INS.ADD,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x01 */ [Debugger.INS.ADD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x02 */ [Debugger.INS.ADD,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x03 */ [Debugger.INS.ADD,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x04 */ [Debugger.INS.ADD,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x05 */ [Debugger.INS.ADD,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x06 */ [Debugger.INS.PUSH,  Debugger.TYPE_ES     | Debugger.TYPE_IN],
                  /* 0x07 */ [Debugger.INS.POP,   Debugger.TYPE_ES     | Debugger.TYPE_OUT],
              
                  /* 0x08 */ [Debugger.INS.OR,    Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x09 */ [Debugger.INS.OR,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x0A */ [Debugger.INS.OR,    Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x0B */ [Debugger.INS.OR,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x0C */ [Debugger.INS.OR,    Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x0D */ [Debugger.INS.OR,    Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x0E */ [Debugger.INS.PUSH,  Debugger.TYPE_CS     | Debugger.TYPE_IN],
                  /* 0x0F */ Debugger.aOpDescPopCS,
              
                  /* 0x10 */ [Debugger.INS.ADC,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x11 */ [Debugger.INS.ADC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x12 */ [Debugger.INS.ADC,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x13 */ [Debugger.INS.ADC,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x14 */ [Debugger.INS.ADC,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x15 */ [Debugger.INS.ADC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x16 */ [Debugger.INS.PUSH,  Debugger.TYPE_SS     | Debugger.TYPE_IN],
                  /* 0x17 */ [Debugger.INS.POP,   Debugger.TYPE_SS     | Debugger.TYPE_OUT],
              
                  /* 0x18 */ [Debugger.INS.SBB,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x19 */ [Debugger.INS.SBB,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x1A */ [Debugger.INS.SBB,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x1B */ [Debugger.INS.SBB,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x1C */ [Debugger.INS.SBB,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x1D */ [Debugger.INS.SBB,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x1E */ [Debugger.INS.PUSH,  Debugger.TYPE_DS     | Debugger.TYPE_IN],
                  /* 0x1F */ [Debugger.INS.POP,   Debugger.TYPE_DS     | Debugger.TYPE_OUT],
              
                  /* 0x20 */ [Debugger.INS.AND,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x21 */ [Debugger.INS.AND,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x22 */ [Debugger.INS.AND,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x23 */ [Debugger.INS.AND,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x24 */ [Debugger.INS.AND,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x25 */ [Debugger.INS.AND,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x26 */ [Debugger.INS.ES,    Debugger.TYPE_PREFIX],
                  /* 0x27 */ [Debugger.INS.DAA],
              
                  /* 0x28 */ [Debugger.INS.SUB,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x29 */ [Debugger.INS.SUB,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x2A */ [Debugger.INS.SUB,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x2B */ [Debugger.INS.SUB,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x2C */ [Debugger.INS.SUB,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x2D */ [Debugger.INS.SUB,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x2E */ [Debugger.INS.CS,    Debugger.TYPE_PREFIX],
                  /* 0x2F */ [Debugger.INS.DAS],
              
                  /* 0x30 */ [Debugger.INS.XOR,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x31 */ [Debugger.INS.XOR,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x32 */ [Debugger.INS.XOR,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x33 */ [Debugger.INS.XOR,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x34 */ [Debugger.INS.XOR,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x35 */ [Debugger.INS.XOR,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x36 */ [Debugger.INS.SS,    Debugger.TYPE_PREFIX],
                  /* 0x37 */ [Debugger.INS.AAA],
              
                  /* 0x38 */ [Debugger.INS.CMP,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x39 */ [Debugger.INS.CMP,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x3A */ [Debugger.INS.CMP,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x3B */ [Debugger.INS.CMP,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x3C */ [Debugger.INS.CMP,   Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x3D */ [Debugger.INS.CMP,   Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x3E */ [Debugger.INS.DS,    Debugger.TYPE_PREFIX],
                  /* 0x3F */ [Debugger.INS.AAS],
              
                  /* 0x40 */ [Debugger.INS.INC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH],
                  /* 0x41 */ [Debugger.INS.INC,   Debugger.TYPE_CX     | Debugger.TYPE_BOTH],
                  /* 0x42 */ [Debugger.INS.INC,   Debugger.TYPE_DX     | Debugger.TYPE_BOTH],
                  /* 0x43 */ [Debugger.INS.INC,   Debugger.TYPE_BX     | Debugger.TYPE_BOTH],
                  /* 0x44 */ [Debugger.INS.INC,   Debugger.TYPE_SP     | Debugger.TYPE_BOTH],
                  /* 0x45 */ [Debugger.INS.INC,   Debugger.TYPE_BP     | Debugger.TYPE_BOTH],
                  /* 0x46 */ [Debugger.INS.INC,   Debugger.TYPE_SI     | Debugger.TYPE_BOTH],
                  /* 0x47 */ [Debugger.INS.INC,   Debugger.TYPE_DI     | Debugger.TYPE_BOTH],
              
                  /* 0x48 */ [Debugger.INS.DEC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH],
                  /* 0x49 */ [Debugger.INS.DEC,   Debugger.TYPE_CX     | Debugger.TYPE_BOTH],
                  /* 0x4A */ [Debugger.INS.DEC,   Debugger.TYPE_DX     | Debugger.TYPE_BOTH],
                  /* 0x4B */ [Debugger.INS.DEC,   Debugger.TYPE_BX     | Debugger.TYPE_BOTH],
                  /* 0x4C */ [Debugger.INS.DEC,   Debugger.TYPE_SP     | Debugger.TYPE_BOTH],
                  /* 0x4D */ [Debugger.INS.DEC,   Debugger.TYPE_BP     | Debugger.TYPE_BOTH],
                  /* 0x4E */ [Debugger.INS.DEC,   Debugger.TYPE_SI     | Debugger.TYPE_BOTH],
                  /* 0x4F */ [Debugger.INS.DEC,   Debugger.TYPE_DI     | Debugger.TYPE_BOTH],
              
                  /* 0x50 */ [Debugger.INS.PUSH,  Debugger.TYPE_AX     | Debugger.TYPE_IN],
                  /* 0x51 */ [Debugger.INS.PUSH,  Debugger.TYPE_CX     | Debugger.TYPE_IN],
                  /* 0x52 */ [Debugger.INS.PUSH,  Debugger.TYPE_DX     | Debugger.TYPE_IN],
                  /* 0x53 */ [Debugger.INS.PUSH,  Debugger.TYPE_BX     | Debugger.TYPE_IN],
                  /* 0x54 */ [Debugger.INS.PUSH,  Debugger.TYPE_SP     | Debugger.TYPE_IN],
                  /* 0x55 */ [Debugger.INS.PUSH,  Debugger.TYPE_BP     | Debugger.TYPE_IN],
                  /* 0x56 */ [Debugger.INS.PUSH,  Debugger.TYPE_SI     | Debugger.TYPE_IN],
                  /* 0x57 */ [Debugger.INS.PUSH,  Debugger.TYPE_DI     | Debugger.TYPE_IN],
              
                  /* 0x58 */ [Debugger.INS.POP,   Debugger.TYPE_AX     | Debugger.TYPE_OUT],
                  /* 0x59 */ [Debugger.INS.POP,   Debugger.TYPE_CX     | Debugger.TYPE_OUT],
                  /* 0x5A */ [Debugger.INS.POP,   Debugger.TYPE_DX     | Debugger.TYPE_OUT],
                  /* 0x5B */ [Debugger.INS.POP,   Debugger.TYPE_BX     | Debugger.TYPE_OUT],
                  /* 0x5C */ [Debugger.INS.POP,   Debugger.TYPE_SP     | Debugger.TYPE_OUT],
                  /* 0x5D */ [Debugger.INS.POP,   Debugger.TYPE_BP     | Debugger.TYPE_OUT],
                  /* 0x5E */ [Debugger.INS.POP,   Debugger.TYPE_SI     | Debugger.TYPE_OUT],
                  /* 0x5F */ [Debugger.INS.POP,   Debugger.TYPE_DI     | Debugger.TYPE_OUT],
              
                  /* 0x60 */ [Debugger.INS.PUSHA, Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                  /* 0x61 */ [Debugger.INS.POPA,  Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                  /* 0x62 */ [Debugger.INS.BOUND, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80286, Debugger.TYPE_MODRM | Debugger.TYPE_2WORD | Debugger.TYPE_IN],
                  /* 0x63 */ [Debugger.INS.ARPL,  Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_OUT,                        Debugger.TYPE_REG   | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                  /* 0x64 */ [Debugger.INS.FS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                  /* 0x65 */ [Debugger.INS.GS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                  /* 0x66 */ [Debugger.INS.OS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                  /* 0x67 */ [Debugger.INS.AS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
              
                  /* 0x68 */ [Debugger.INS.PUSH,  Debugger.TYPE_IMM    | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80286],
                  /* 0x69 */ [Debugger.INS.IMUL,  Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH | Debugger.TYPE_80286,   Debugger.TYPE_MODRM | Debugger.TYPE_WORDIW | Debugger.TYPE_IN],
                  /* 0x6A */ [Debugger.INS.PUSH,  Debugger.TYPE_IMM    | Debugger.TYPE_SBYTE | Debugger.TYPE_IN   | Debugger.TYPE_80286],
                  /* 0x6B */ [Debugger.INS.IMUL,  Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH | Debugger.TYPE_80286,   Debugger.TYPE_MODRM | Debugger.TYPE_WORDIB | Debugger.TYPE_IN],
                  /* 0x6C */ [Debugger.INS.INS,   Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80286,   Debugger.TYPE_DX    | Debugger.TYPE_IN],
                  /* 0x6D */ [Debugger.INS.INS,   Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80286,   Debugger.TYPE_DX    | Debugger.TYPE_IN],
                  /* 0x6E */ [Debugger.INS.OUTS,  Debugger.TYPE_DX     | Debugger.TYPE_IN    | Debugger.TYPE_80286,   Debugger.TYPE_DSSI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x6F */ [Debugger.INS.OUTS,  Debugger.TYPE_DX     | Debugger.TYPE_IN    | Debugger.TYPE_80286,   Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0x70 */ [Debugger.INS.JO,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x71 */ [Debugger.INS.JNO,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x72 */ [Debugger.INS.JC,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x73 */ [Debugger.INS.JNC,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x74 */ [Debugger.INS.JZ,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x75 */ [Debugger.INS.JNZ,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x76 */ [Debugger.INS.JBE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x77 */ [Debugger.INS.JA,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
              
                  /* 0x78 */ [Debugger.INS.JS,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x79 */ [Debugger.INS.JNS,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7A */ [Debugger.INS.JP,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7B */ [Debugger.INS.JNP,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7C */ [Debugger.INS.JL,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7D */ [Debugger.INS.JGE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7E */ [Debugger.INS.JLE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x7F */ [Debugger.INS.JG,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
              
                  /* 0x80 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x81 */ [Debugger.INS.GRP1W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x82 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x83 */ [Debugger.INS.GRP1SW,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x84 */ [Debugger.INS.TEST,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x85 */ [Debugger.INS.TEST,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x86 */ [Debugger.INS.XCHG,  Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                  /* 0x87 */ [Debugger.INS.XCHG,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
              
                  /* 0x88 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,  Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x89 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x8A */ [Debugger.INS.MOV,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0x8B */ [Debugger.INS.MOV,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x8C */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_SEGREG | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                  /* 0x8D */ [Debugger.INS.LEA,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_MEM    | Debugger.TYPE_VWORD],
                  /* 0x8E */ [Debugger.INS.MOV,   Debugger.TYPE_SEGREG | Debugger.TYPE_WORD  | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0x8F */ [Debugger.INS.POP,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT],
              
                  /* 0x90 */ [Debugger.INS.NOP],
                  /* 0x91 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_CX | Debugger.TYPE_BOTH],
                  /* 0x92 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_DX | Debugger.TYPE_BOTH],
                  /* 0x93 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_BX | Debugger.TYPE_BOTH],
                  /* 0x94 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_SP | Debugger.TYPE_BOTH],
                  /* 0x95 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_BP | Debugger.TYPE_BOTH],
                  /* 0x96 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_SI | Debugger.TYPE_BOTH],
                  /* 0x97 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_DI | Debugger.TYPE_BOTH],
              
                  /* 0x98 */ [Debugger.INS.CBW],
                  /* 0x99 */ [Debugger.INS.CWD],
                  /* 0x9A */ [Debugger.INS.CALL,  Debugger.TYPE_IMM    | Debugger.TYPE_FARP | Debugger.TYPE_IN],
                  /* 0x9B */ [Debugger.INS.WAIT],
                  /* 0x9C */ [Debugger.INS.PUSHF],
                  /* 0x9D */ [Debugger.INS.POPF],
                  /* 0x9E */ [Debugger.INS.SAHF],
                  /* 0x9F */ [Debugger.INS.LAHF],
              
                  /* 0xA0 */ [Debugger.INS.MOV,   Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xA1 */ [Debugger.INS.MOV,   Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xA2 */ [Debugger.INS.MOV,   Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,     Debugger.TYPE_AL    | Debugger.TYPE_IN],
                  /* 0xA3 */ [Debugger.INS.MOV,   Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,     Debugger.TYPE_AX    | Debugger.TYPE_IN],
                  /* 0xA4 */ [Debugger.INS.MOVSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,     Debugger.TYPE_DSSI  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xA5 */ [Debugger.INS.MOVSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,     Debugger.TYPE_DSSI  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xA6 */ [Debugger.INS.CMPSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,      Debugger.TYPE_DSSI  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xA7 */ [Debugger.INS.CMPSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_IN,      Debugger.TYPE_DSSI  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0xA8 */ [Debugger.INS.TEST,  Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_IMM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xA9 */ [Debugger.INS.TEST,  Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_IMM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xAA */ [Debugger.INS.STOSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,   Debugger.TYPE_AL    | Debugger.TYPE_IN],
                  /* 0xAB */ [Debugger.INS.STOSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,   Debugger.TYPE_AX    | Debugger.TYPE_IN],
                  /* 0xAC */ [Debugger.INS.LODSB, Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_DSSI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xAD */ [Debugger.INS.LODSW, Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xAE */ [Debugger.INS.SCASB, Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_ESDI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xAF */ [Debugger.INS.SCASW, Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0xB0 */ [Debugger.INS.MOV,   Debugger.TYPE_AL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB1 */ [Debugger.INS.MOV,   Debugger.TYPE_CL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB2 */ [Debugger.INS.MOV,   Debugger.TYPE_DL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB3 */ [Debugger.INS.MOV,   Debugger.TYPE_BL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB4 */ [Debugger.INS.MOV,   Debugger.TYPE_AH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB5 */ [Debugger.INS.MOV,   Debugger.TYPE_CH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB6 */ [Debugger.INS.MOV,   Debugger.TYPE_DH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xB7 */ [Debugger.INS.MOV,   Debugger.TYPE_BH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
              
                  /* 0xB8 */ [Debugger.INS.MOV,   Debugger.TYPE_AX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xB9 */ [Debugger.INS.MOV,   Debugger.TYPE_CX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBA */ [Debugger.INS.MOV,   Debugger.TYPE_DX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBB */ [Debugger.INS.MOV,   Debugger.TYPE_BX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBC */ [Debugger.INS.MOV,   Debugger.TYPE_SP     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBD */ [Debugger.INS.MOV,   Debugger.TYPE_BP     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBE */ [Debugger.INS.MOV,   Debugger.TYPE_SI     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xBF */ [Debugger.INS.MOV,   Debugger.TYPE_DI     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0xC0 */ [Debugger.INS.GRP2B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xC1 */ [Debugger.INS.GRP2W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xC2 */ [Debugger.INS.RET,   Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                  /* 0xC3 */ [Debugger.INS.RET],
                  /* 0xC4 */ [Debugger.INS.LES,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                  /* 0xC5 */ [Debugger.INS.LDS,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                  /* 0xC6 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xC7 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0xC8 */ [Debugger.INS.ENTER, Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN | Debugger.TYPE_80286,  Debugger.TYPE_IMM   | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xC9 */ [Debugger.INS.LEAVE, Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                  /* 0xCA */ [Debugger.INS.RETF,  Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                  /* 0xCB */ [Debugger.INS.RETF],
                  /* 0xCC */ [Debugger.INS.INT3],
                  /* 0xCD */ [Debugger.INS.INT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xCE */ [Debugger.INS.INTO],
                  /* 0xCF */ [Debugger.INS.IRET],
              
                  /* 0xD0 */ [Debugger.INS.GRP2B1,Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_ONE    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xD1 */ [Debugger.INS.GRP2W1,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xD2 */ [Debugger.INS.GRP2BC,Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL |   Debugger.TYPE_IN],
                  /* 0xD3 */ [Debugger.INS.GRP2WC,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL |   Debugger.TYPE_IN],
                  /* 0xD4 */ [Debugger.INS.AAM,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE],
                  /* 0xD5 */ [Debugger.INS.AAD,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE],
                  /* 0xD6 */ [Debugger.INS.SALC],
                  /* 0xD7 */ [Debugger.INS.XLAT],
              
                  /* 0xD8 */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xD9 */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDA */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDB */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDC */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDD */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDE */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xDF */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
              
                  /* 0xE0 */ [Debugger.INS.LOOPNZ,Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xE1 */ [Debugger.INS.LOOPZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xE2 */ [Debugger.INS.LOOP,  Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xE3 */ [Debugger.INS.JCXZ,  Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xE4 */ [Debugger.INS.IN,    Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xE5 */ [Debugger.INS.IN,    Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                  /* 0xE6 */ [Debugger.INS.OUT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_AL   | Debugger.TYPE_IN],
                  /* 0xE7 */ [Debugger.INS.OUT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_AX   | Debugger.TYPE_IN],
              
                  /* 0xE8 */ [Debugger.INS.CALL,  Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xE9 */ [Debugger.INS.JMP,   Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                  /* 0xEA */ [Debugger.INS.JMP,   Debugger.TYPE_IMM    | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                  /* 0xEB */ [Debugger.INS.JMP,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                  /* 0xEC */ [Debugger.INS.IN,    Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_DX | Debugger.TYPE_IN],
                  /* 0xED */ [Debugger.INS.IN,    Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_DX | Debugger.TYPE_IN],
                  /* 0xEE */ [Debugger.INS.OUT,   Debugger.TYPE_DX     | Debugger.TYPE_IN,     Debugger.TYPE_AL | Debugger.TYPE_IN],
                  /* 0xEF */ [Debugger.INS.OUT,   Debugger.TYPE_DX     | Debugger.TYPE_IN,     Debugger.TYPE_AX | Debugger.TYPE_IN],
              
                  /* 0xF0 */ [Debugger.INS.LOCK,  Debugger.TYPE_PREFIX],
                  /* 0xF1 */ [Debugger.INS.NONE],
                  /* 0xF2 */ [Debugger.INS.REPNZ, Debugger.TYPE_PREFIX],
                  /* 0xF3 */ [Debugger.INS.REPZ,  Debugger.TYPE_PREFIX],
                  /* 0xF4 */ [Debugger.INS.HLT],
                  /* 0xF5 */ [Debugger.INS.CMC],
                  /* 0xF6 */ [Debugger.INS.GRP3B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                  /* 0xF7 */ [Debugger.INS.GRP3W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
              
                  /* 0xF8 */ [Debugger.INS.CLC],
                  /* 0xF9 */ [Debugger.INS.STC],
                  /* 0xFA */ [Debugger.INS.CLI],
                  /* 0xFB */ [Debugger.INS.STI],
                  /* 0xFC */ [Debugger.INS.CLD],
                  /* 0xFD */ [Debugger.INS.STD],
                  /* 0xFE */ [Debugger.INS.GRP4B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                  /* 0xFF */ [Debugger.INS.GRP4W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
                  ];
              
                  Debugger.aaOp0FDescs = {
                      0x00: [Debugger.INS.GRP6,   Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH],
                      0x01: [Debugger.INS.GRP7,   Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH],
                      0x02: [Debugger.INS.LAR,    Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_OUT  | Debugger.TYPE_80286, Debugger.TYPE_MEM    | Debugger.TYPE_WORD | Debugger.TYPE_IN],
                      0x03: [Debugger.INS.LSL,    Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_OUT  | Debugger.TYPE_80286, Debugger.TYPE_MEM    | Debugger.TYPE_WORD | Debugger.TYPE_IN],
                      0x05: [Debugger.INS.LOADALL,Debugger.TYPE_80286],
                      0x06: [Debugger.INS.CLTS,   Debugger.TYPE_80286],
                      0x20: [Debugger.INS.MOV,    Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
                      0x22: [Debugger.INS.MOV,    Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
                      0x80: [Debugger.INS.JO,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x81: [Debugger.INS.JNO,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x82: [Debugger.INS.JC,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x83: [Debugger.INS.JNC,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x84: [Debugger.INS.JZ,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x85: [Debugger.INS.JNZ,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x86: [Debugger.INS.JBE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x87: [Debugger.INS.JA,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x88: [Debugger.INS.JS,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x89: [Debugger.INS.JNS,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8A: [Debugger.INS.JP,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8B: [Debugger.INS.JNP,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8C: [Debugger.INS.JL,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8D: [Debugger.INS.JGE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8E: [Debugger.INS.JLE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x8F: [Debugger.INS.JG,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                      0x90: [Debugger.INS.SETO,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x91: [Debugger.INS.SETNO,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x92: [Debugger.INS.SETC,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x93: [Debugger.INS.SETNC,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x94: [Debugger.INS.SETZ,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x95: [Debugger.INS.SETNZ,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x96: [Debugger.INS.SETBE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x97: [Debugger.INS.SETNBE, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x98: [Debugger.INS.SETS,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x99: [Debugger.INS.SETNS,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9A: [Debugger.INS.SETP,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9B: [Debugger.INS.SETNP,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9C: [Debugger.INS.SETL,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9D: [Debugger.INS.SETGE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9E: [Debugger.INS.SETLE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0x9F: [Debugger.INS.SETG,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                      0xA0: [Debugger.INS.PUSH,   Debugger.TYPE_FS     | Debugger.TYPE_IN    | Debugger.TYPE_80386],
                      0xA1: [Debugger.INS.POP,    Debugger.TYPE_FS     | Debugger.TYPE_OUT   | Debugger.TYPE_80386],
                      0xA3: [Debugger.INS.BT,     Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xA4: [Debugger.INS.SHLD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      0xA5: [Debugger.INS.SHLD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL   | Debugger.TYPE_IN],
                      0xA8: [Debugger.INS.PUSH,   Debugger.TYPE_GS     | Debugger.TYPE_IN    | Debugger.TYPE_80386],
                      0xA9: [Debugger.INS.POP,    Debugger.TYPE_GS     | Debugger.TYPE_OUT   | Debugger.TYPE_80386],
                      0xAB: [Debugger.INS.BTS,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xAC: [Debugger.INS.SHRD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      0xAD: [Debugger.INS.SHRD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL   | Debugger.TYPE_IN],
                      0xAF: [Debugger.INS.IMUL,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xB2: [Debugger.INS.LSS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                      0xB3: [Debugger.INS.BTR,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xB4: [Debugger.INS.LFS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                      0xB5: [Debugger.INS.LGS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                      0xB6: [Debugger.INS.MOVZX,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                      0xB7: [Debugger.INS.MOVZX,  Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                      0xBA: [Debugger.INS.GRP8,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                      0xBB: [Debugger.INS.BTC,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xBC: [Debugger.INS.BSF,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xBD: [Debugger.INS.BSR,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      0xBE: [Debugger.INS.MOVSX,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                      0xBF: [Debugger.INS.MOVSX,  Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_IN]
                  };
              
                  Debugger.aaGrpDescs = [
                    [
                      /* GRP1B */
                      [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP1W */
                      [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP1SW */
                      [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                      [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2B */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2W */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2B1 */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2W1 */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2BC */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP2WC */
                      [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                      [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
                    ],
                    [
                      /* GRP3B */
                      [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.NOT,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                      [Debugger.INS.NEG,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                      [Debugger.INS.MUL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                      [Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                      [Debugger.INS.DIV,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                      [Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH]
                    ],
                    [
                      /* GRP3W */
                      [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.NOT,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                      [Debugger.INS.NEG,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                      [Debugger.INS.MUL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                      [Debugger.INS.DIV,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
                    ],
                    [
                      /* GRP4B */
                      [Debugger.INS.INC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                      [Debugger.INS.DEC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined
                    ],
                    [
                      /* GRP4W */
                      [Debugger.INS.INC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                      [Debugger.INS.DEC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                      [Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                      [Debugger.INS.JMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                      [Debugger.INS.JMP,  Debugger.TYPE_MODRM | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                      [Debugger.INS.PUSH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                       Debugger.aOpDescUndefined
                    ],
                    [ /* OP0F */ ],
                    [
                      /* GRP6 */
                      [Debugger.INS.SLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                      [Debugger.INS.STR,  Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                      [Debugger.INS.LLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                      [Debugger.INS.LTR,  Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                      [Debugger.INS.VERR, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                      [Debugger.INS.VERW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined
                    ],
                    [
                      /* GRP7 */
                      [Debugger.INS.SGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                      [Debugger.INS.SIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                      [Debugger.INS.LGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                      [Debugger.INS.LIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                      [Debugger.INS.SMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.LMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                       Debugger.aOpDescUndefined
                    ],
                    [
                      /* GRP8 */
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                       Debugger.aOpDescUndefined,
                      [Debugger.INS.BT,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN  | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.BTS, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.BTR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                      [Debugger.INS.BTC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                    ]
                  ];
              
                  Debugger.INT_FUNCS = {
                      0x13: {
                          0x00: "disk reset",
                          0x01: "get status",
                          0x02: "read drive DL (CH:DH:CL,AL) into ES:BX",
                          0x03: "write drive DL (CH:DH:CL,AL) from ES:BX",
                          0x04: "verify drive DL (CH:DH:CL,AL)",
                          0x05: "format drive DL using ES:BX",
                          0x08: "read drive DL parameters into ES:DI",
                          0x15: "get drive DL DASD type",
                          0x16: "get drive DL change line status",
                          0x17: "set drive DL DASD type",
                          0x18: "set drive DL media type"
                      },
                      0x15: {
                          0x80: "open device",
                          0x81: "close device",
                          0x82: "program termination",
                          0x83: "wait CX:DXus for event",
                          0x84: "joystick support",
                          0x85: "SYSREQ pressed",
                          0x86: "wait CX:DXus",
                          0x87: "move block (CX words)",
                          0x88: "get extended memory size",
                          0x89: "processor to virtual mode",
                          0x90: "device busy loop",
                          0x91: "interrupt complete flag set"
                      },
                      0x21: {
                          0x00: "terminate program",
                          0x01: "read character (al) from stdin with echo",
                          0x02: "write character DL to stdout",
                          0x03: "read character (al) from stdaux",                            // eg, COM1
                          0x04: "write character DL to stdaux",                               // eg, COM1
                          0x05: "write character DL to stdprn",                               // eg, LPT1
                          0x06: "direct console output (input if DL=FF)",
                          0x07: "direct console input without echo",
                          0x08: "read character (al) from stdin without echo",
                          0x09: "write $-terminated string DS:DX to stdout",
                          0x0A: "buffered input (ds:dx)",                                     // byte 0 is maximum chars, byte 1 is number of previous characters, byte 2 is number of characters read
                          0x0B: "get stdin status",
                          0x0C: "flush buffer and read stdin",                                // AL is a function # (0x01, 0x06, 0x07, 0x08, or 0x0A)
                          0x0D: "disk reset",
                          0x0E: "select default drive DL",                                    // returns # of available drives in AL
                          0x0F: "open file using fcb DS:DX",                                  // DS:DX -> unopened File Control Block
                          0x10: "close file using fcb DS:DX",
                          0x11: "find first matching file using fcb DS:DX",
                          0x12: "find next matching file using fcb DS:DX",
                          0x13: "delete file using fcb DS:DX",
                          0x14: "sequential read from file using fcb DS:DX",
                          0x15: "sequential write to file using fcb DS:DX",
                          0x16: "create or truncate file using fcb DS:DX",
                          0x17: "rename file using fcb DS:DX",
                          0x19: "get current default drive (al)",
                          0x1A: "set disk transfer area (dta) DS:DX",
                          0x1B: "get allocation information for default drive",
                          0x1C: "get allocation information for specific drive DL",
                          0x1F: "get drive parameter block for default drive",
                          0x21: "read random record from file using fcb DS:DX",
                          0x22: "write random record to file using fcb DS:DX",
                          0x23: "get file size using fcb DS:DX",
                          0x24: "set random record number for fcb DS:DX",
                          0x25: "set address DS:DX of interrupt vector AL",
                          0x26: "create new program segment prefix (psp) at segment DX",
                          0x27: "random block read from file using fcb DS:DX",
                          0x28: "random block write to file using fcb DS:DX",
                          0x29: "parse filename DS:SI into fcb ES:DI using AL",
                          0x2A: "get system date (year=cx, mon=dh, day=dl)",
                          0x2B: "set system date (year=CX, mon=DH, day=DL)",
                          0x2C: "get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",
                          0x2D: "set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
                          0x2E: "set verify flag AL",
                          0x2F: "get disk transfer area address (es:bx)",                     // DOS 2.00+
                          0x30: "get DOS version (al=major, ah=minor)",
                          0x31: "terminate and stay resident",
                          0x32: "get drive parameter block (dpb=ds:bx) for drive DL",
                          0x33: "extended break check",
                          0x34: "get address (es:bx) of InDOS flag",
                          0x35: "get address (es:bx) of interrupt vector AL",
                          0x36: "get free disk space of drive DL",
                          0x37: "get(0)/set(1) switch character DL (AL)",
                          0x38: "get country-specific information",
                          0x39: "create subdirectory DS:DX",
                          0x3A: "remove subdirectory DS:DX",
                          0x3B: "set current directory DS:DX",
                          0x3C: "create or truncate file DS:DX with attributes CX",
                          0x3D: "open existing file DS:DX with mode AL",
                          0x3E: "close file BX",
                          0x3F: "read CX bytes from file BX into buffer DS:DX",
                          0x40: "write CX bytes to file BX from buffer DS:DX",
                          0x41: "delete file DS:DX",
                          0x42: "set position CX:DX of file BX relative to AL",
                          0x43: "get(0)/set(1) attributes CX of file DS:DX (AL)",
                          0x44: "get device information (IOCTL)",
                          0x45: "duplicate file handle BX",
                          0x46: "force file handle CX to duplicate file handle BX",
                          0x47: "get current directory (ds:si) for drive DL",
                          0x48: "allocate memory segment with BX paragraphs",
                          0x49: "free memory segment ES",
                          0x4A: "resize memory segment ES to BX paragraphs",
                          0x4B: "load program DS:DX using parameter block ES:BX",
                          0x4C: "terminate with return code AL",
                          0x4D: "get return code (al)",
                          0x4E: "find first matching file DS:DX with attributes CX",
                          0x4F: "find next matching file",
                          0x50: "set current psp BX",
                          0x51: "get current psp (bx)",
                          0x52: "get system variables (es:bx)",
                          0x53: "translate bpb DS:SI to dpb (es:bp)",
                          0x54: "get verify flag (al)",
                          0x55: "create child psp at segment DX",
                          0x56: "rename file DS:DX to name ES:DI",
                          0x57: "get(0)/set(1) file date DX and time CX (AL)",
                          0x58: "get(0)/set(1) memory allocation strategy (AL)",              // DOS 2.11+
                          0x59: "get extended error information",                             // DOS 3.00+
                          0x5A: "create temporary file DS:DX with attributes CX",             // DOS 3.00+
                          0x5B: "create file DS:DX with attributes CX",                       // DOS 3.00+ (doesn't truncate existing files like 0x3C)
                          0x5C: "lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)"    // DOS 3.00+
                      }
                  };
              
                  /**
                   * initBus(bus, cpu, dbg)
                   *
                   * @this {Debugger}
                   * @param {Computer} cmp
                   * @param {Bus} bus
                   * @param {X86CPU} cpu
                   * @param {Debugger} dbg
                   */
                  Debugger.prototype.initBus = function(cmp, bus, cpu, dbg)
                  {
                      this.bus = bus;
                      this.cpu = cpu;
                      this.cmp = cmp;
                      this.fdc = cmp.getComponentByType("FDC");
                      this.hdc = cmp.getComponentByType("HDC");
                      if (MAXDEBUG) this.chipset = cmp.getComponentByType("ChipSet");
              
                      this.cchAddr = bus.getWidth() >> 2;
                      this.maskAddr = bus.nBusLimit;
              
                      this.aaOpDescs = Debugger.aaOpDescs;
                      if (this.cpu.model >= X86.MODEL_80186) {
                          this.aaOpDescs = Debugger.aaOpDescs.slice();
                          this.aaOpDescs[0x0F] = Debugger.aOpDescUndefined;
                          if (this.cpu.model >= X86.MODEL_80286) {
                              this.aaOpDescs[0x0F] = Debugger.aOpDesc0F;
                              if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                  this.cchReg = 8;
                                  this.maskReg = 0xffffffff|0;
                              }
                          }
                      }
              
                      this.messageDump(Messages.BUS,  function onDumpBus(s)  { dbg.dumpBus(s); });
                      this.messageDump(Messages.DESC, function onDumpDesc(s) { dbg.dumpDesc(s); });
                      this.messageDump(Messages.TSS,  function onDumpTSS(s)  { dbg.dumpTSS(s); });
                      this.messageDump(Messages.DOS,  function onDumpDOS(s)  { dbg.dumpDOS(s); });
              
                      this.setReady();
                  };
              
                  /**
                   * setBinding(sHTMLType, sBinding, control)
                   *
                   * @this {Debugger}
                   * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
                   * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "debugInput")
                   * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
                   * @return {boolean} true if binding was successful, false if unrecognized binding request
                   */
                  Debugger.prototype.setBinding = function(sHTMLType, sBinding, control)
                  {
                      var dbg = this;
                      switch (sBinding) {
              
                      case "debugInput":
                          this.bindings[sBinding] = control;
                          this.controlDebug = control;
                          /*
                           * For halted machines, this is fine, but for auto-start machines, it can be annoying.
                           *
                           *      control.focus();
                           */
                          control.onkeydown = function onKeyDownDebugInput(event) {
                              var sInput;
                              if (event.keyCode == Keyboard.KEYCODE.CR) {
                                  sInput = control.value;
                                  control.value = "";
                                  var a = dbg.parseCommand(sInput, true);
                                  for (var s in a) dbg.doCommand(a[s]);
                              }
                              else if (event.keyCode == Keyboard.KEYCODE.ESC) {
                                  control.value = sInput = "";
                              }
                              else {
                                  if (event.keyCode == Keyboard.KEYCODE.UP) {
                                      if (dbg.iPrevCmd < dbg.aPrevCmds.length - 1) {
                                          sInput = dbg.aPrevCmds[++dbg.iPrevCmd];
                                      }
                                  }
                                  else if (event.keyCode == Keyboard.KEYCODE.DOWN) {
                                      if (dbg.iPrevCmd > 0) {
                                          sInput = dbg.aPrevCmds[--dbg.iPrevCmd];
                                      } else {
                                          sInput = "";
                                          dbg.iPrevCmd = -1;
                                      }
                                  }
                                  if (sInput != null) {
                                      var cch = sInput.length;
                                      control.value = sInput;
                                      control.setSelectionRange(cch, cch);
                                  }
                              }
                              if (sInput != null && event.preventDefault) event.preventDefault();
                          };
                          return true;
              
                      case "debugEnter":
                          this.bindings[sBinding] = control;
                          web.onClickRepeat(
                              control,
                              500, 100,
                              function onClickDebugEnter(fRepeat) {
                                  if (dbg.controlDebug) {
                                      var sInput = dbg.controlDebug.value;
                                      dbg.controlDebug.value = "";
                                      var a = dbg.parseCommand(sInput, true);
                                      for (var s in a) dbg.doCommand(a[s]);
                                      return true;
                                  }
                                  if (DEBUG) dbg.log("no debugger input buffer");
                                  return false;
                              }
                          );
                          return true;
              
                      case "step":
                          this.bindings[sBinding] = control;
                          web.onClickRepeat(
                              control,
                              500, 100,
                              function onClickStep(fRepeat) {
                                  var fCompleted = false;
                                  if (!dbg.isBusy(true)) {
                                      dbg.setBusy(true);
                                      fCompleted = dbg.stepCPU(fRepeat? 1 : 0);
                                      dbg.setBusy(false);
                                  }
                                  return fCompleted;
                              }
                          );
                          return true;
              
                      default:
                          break;
                      }
                      return false;
                  };
              
                  /**
                   * setFocus()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.setFocus = function()
                  {
                      if (this.controlDebug) this.controlDebug.focus();
                  };
              
                  /**
                   * getSegment(sel)
                   *
                   * If the selector matches that of any of the CPU segment registers, then return the CPU's segment
                   * register, instead of creating our own dummy segment register.  This makes it possible for us to
                   * see what the CPU is seeing at certain critical junctures, such as after an LMSW instruction has
                   * switched the processor from real to protected mode.  Actually loading the selector from the GDT/LDT
                   * should be done only as a last resort.
                   *
                   * @param {number|null|undefined} sel
                   * @return {X86Seg|null} seg
                   */
                  Debugger.prototype.getSegment = function(sel)
                  {
                      if (sel === this.cpu.getCS()) return this.cpu.segCS;
                      if (sel === this.cpu.getDS()) return this.cpu.segDS;
                      if (sel === this.cpu.getES()) return this.cpu.segES;
                      if (sel === this.cpu.getSS()) return this.cpu.segSS;
                      if (I386 && this.cpu.model >= X86.MODEL_80386) {
                          if (sel === this.cpu.getFS()) return this.cpu.segFS;
                          if (sel === this.cpu.getGS()) return this.cpu.segGS;
                      }
                      if (this.nBreakSuppress) return null;
                      var seg = new X86Seg(this.cpu, X86Seg.ID.DEBUG, "DBG");
                      /*
                       * Note the load() function's fSuppress parameter, which the Debugger should ALWAYS set to true
                       * to avoid triggering a fault.
                       *
                       * TODO: Confirm that it's OK for getSegment() to drop any error from seg.load() on the floor....
                       */
                      seg.load(sel, true);
                      return seg;
                  };
              
                  /**
                   * getAddr(dbgAddr, fWrite, cb)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fWrite]
                   * @param {number} [cb] is number of bytes to check (1, 2 or 4); default is 1
                   * @return {number} is the corresponding linear address, or X86.ADDR_INVALID
                   */
                  Debugger.prototype.getAddr = function(dbgAddr, fWrite, cb)
                  {
                      /*
                       * Some addresses (eg, breakpoint addresses) save their original linear address in dbgAddr.addr,
                       * so we want to use that if it's there, but otherwise, dbgAddr is assumed to be a segmented address
                       * whose linear address must always be (re)calculated based on current machine state (mode, active
                       * descriptor tables, etc).
                       */
                      var addr = dbgAddr.addr;
                      if (addr == null) {
                          addr = X86.ADDR_INVALID;
                          var seg = this.getSegment(dbgAddr.sel);
                          if (seg) {
                              if (!fWrite) {
                                  addr = seg.checkRead(dbgAddr.off, cb || 1, true);
                              } else {
                                  addr = seg.checkWrite(dbgAddr.off, cb || 1, true);
                              }
                              dbgAddr.addr = addr;
                          }
                      }
                      return addr;
                  };
              
                  /**
                   * getByte(dbgAddr, inc)
                   *
                   * We must route all our memory requests through the CPU now, in case paging is enabled.
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} [inc]
                   * @return {number}
                   */
                  Debugger.prototype.getByte = function(dbgAddr, inc)
                  {
                      var b = 0xff;
                      var addr = this.getAddr(dbgAddr, false, 1);
                      if (addr !== X86.ADDR_INVALID) {
                          b = this.cpu.probeAddr(addr) | 0;
                          if (inc) this.incAddr(dbgAddr, inc);
                      }
                      return b;
                  };
              
                  /**
                   * getWord(dbgAddr, fAdvance)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fAdvance]
                   * @return {number}
                   */
                  Debugger.prototype.getWord = function(dbgAddr, fAdvance)
                  {
                      if (!dbgAddr.fData32) {
                          return this.getShort(dbgAddr, fAdvance? 2 : 0);
                      }
                      return this.getLong(dbgAddr, fAdvance? 4 : 0);
                  };
              
                  /**
                   * getShort(dbgAddr, inc)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} [inc]
                   * @return {number}
                   */
                  Debugger.prototype.getShort = function(dbgAddr, inc)
                  {
                      var w = 0xffff;
                      var addr = this.getAddr(dbgAddr, false, 2);
                      if (addr !== X86.ADDR_INVALID) {
                          w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
                          if (inc) this.incAddr(dbgAddr, inc);
                      }
                      return w;
                  };
              
                  /**
                   * getLong(dbgAddr, inc)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} [inc]
                   * @return {number}
                   */
                  Debugger.prototype.getLong = function(dbgAddr, inc)
                  {
                      var l = -1;
                      var addr = this.getAddr(dbgAddr, false, 4);
                      if (addr !== X86.ADDR_INVALID) {
                          l = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8) | (this.cpu.probeAddr(addr + 2) << 16) | (this.cpu.probeAddr(addr + 3) << 24);
                          if (inc) this.incAddr(dbgAddr, inc);
                      }
                      return l;
                  };
              
                  /**
                   * setByte(dbgAddr, b, inc)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} b
                   * @param {number} [inc]
                   */
                  Debugger.prototype.setByte = function(dbgAddr, b, inc)
                  {
                      var addr = this.getAddr(dbgAddr, true, 1);
                      if (addr !== X86.ADDR_INVALID) {
                          this.cpu.setByte(addr, b);
                          if (inc) this.incAddr(dbgAddr, inc);
                          this.cpu.updateCPU();
                      }
                  };
              
                  /**
                   * setShort(dbgAddr, w, inc)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} w
                   * @param {number} [inc]
                   */
                  Debugger.prototype.setShort = function(dbgAddr, w, inc)
                  {
                      var addr = this.getAddr(dbgAddr, true, 2);
                      if (addr !== X86.ADDR_INVALID) {
                          this.cpu.setShort(addr, w);
                          if (inc) this.incAddr(dbgAddr, inc);
                          this.cpu.updateCPU();
                      }
                  };
              
                  /**
                   * newAddr(off, sel, addr, fData32, fAddr32)
                   *
                   * @this {Debugger}
                   * @param {number|null|undefined} [off] (default is zero)
                   * @param {number|null|undefined} [sel] (default is undefined)
                   * @param {number|null|undefined} [addr] (default is undefined)
                   * @param {boolean} [fData32] (default is false)
                   * @param {boolean} [fAddr32] (default is false)
                   * @return {{DbgAddr}}
                   */
                  Debugger.prototype.newAddr = function(off, sel, addr, fData32, fAddr32)
                  {
                      if (fData32 === undefined) fData32 = (this.cpu && this.cpu.segCS.dataSize == 4);
                      if (fAddr32 === undefined) fAddr32 = (this.cpu && this.cpu.segCS.addrSize == 4);
                      return {off: off || 0, sel: sel, addr: addr, fTempBreak: false, fData32: fData32 || false, fAddr32: fAddr32 || false};
                  };
              
                  /**
                   * packAddr(dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @return {Array}
                   */
                  Debugger.prototype.packAddr = function(dbgAddr)
                  {
                      return [dbgAddr.off, dbgAddr.sel, dbgAddr.addr, dbgAddr.fTempBreak, dbgAddr.fData32, dbgAddr.fAddr32, dbgAddr.fOverride, dbgAddr.fComplete];
                  };
              
                  /**
                   * unpackAddr(aAddr)
                   *
                   * @this {Debugger}
                   * @param {Array} aAddr
                   * @return {{DbgAddr}}
                   */
                  Debugger.prototype.unpackAddr = function(aAddr)
                  {
                      return {off: aAddr[0], sel: aAddr[1], addr: aAddr[2], fTempBreak: aAddr[3], fData32: aAddr[4], fAddr32: aAddr[5], fOverride: aAddr[6], fComplete: aAddr[7]};
                  };
              
                  /**
                   * checkLimit(dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   */
                  Debugger.prototype.checkLimit = function(dbgAddr)
                  {
                      if (dbgAddr.sel != null) {
                          var seg = this.getSegment(dbgAddr.sel);
                          if (!seg || dbgAddr.off > seg.limit) {
                              /*
                               * TODO: This automatic wrap-to-zero is OK for normal segments, but for expand-down segments, not so much.
                               */
                              dbgAddr.off = 0;
                              dbgAddr.addr = null;
                          }
                      }
                  };
              
                  /**
                   * incAddr(dbgAddr, inc)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number|undefined} inc contains value to increment dbgAddr by (default is 1)
                   */
                  Debugger.prototype.incAddr = function(dbgAddr, inc)
                  {
                      inc = inc || 1;
                      if (dbgAddr.addr != null) {
                          dbgAddr.addr += inc;
                      }
                      if (dbgAddr.sel != null) {
                          dbgAddr.off += inc;
                          this.checkLimit(dbgAddr);
                      }
                  };
              
                  /**
                   * hexOffset(off, sel, fAddr32)
                   *
                   * @this {Debugger}
                   * @param {number|null} [off]
                   * @param {number|null} [sel]
                   * @param {boolean} [fAddr32] is true for 32-bit ADDRESS size
                   * @return {string} the hex representation of off (or sel:off)
                   */
                  Debugger.prototype.hexOffset = function(off, sel, fAddr32)
                  {
                      if (sel != null) {
                          return str.toHex(sel, 4) + ":" + str.toHex(off, (off & (0xffff0000|0)) || fAddr32? 8 : 4);
                      }
                      return str.toHex(off);
                  };
              
                  /**
                   * hexAddr(dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @return {string} the hex representation of the address
                   */
                  Debugger.prototype.hexAddr = function(dbgAddr)
                  {
                      return dbgAddr.sel == null? ("%" + str.toHex(dbgAddr.addr)) : this.hexOffset(dbgAddr.off, dbgAddr.sel, dbgAddr.fAddr32);
                  };
              
                  /**
                   * dumpSZ(dbgAddr, cchMax)
                   *
                   * Dump helper for zero-terminated strings.
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {number} [cchMax]
                   * @return {string} (and dbgAddr advanced past the terminating zero)
                   */
                  Debugger.prototype.dumpSZ = function(dbgAddr, cchMax)
                  {
                      var sChars = "";
                      cchMax = cchMax || 256;
                      while (sChars.length < cchMax) {
                          var b = this.getByte(dbgAddr, 1);
                          if (!b) break;
                          sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                      }
                      return sChars;
                  };
              
                  /**
                   * dumpDOS(s)
                   *
                   * This dumps DOS MCBs (Memory Control Blocks).
                   *
                   * @this {Debugger}
                   * @param {string} [s]
                   */
                  Debugger.prototype.dumpDOS = function(s)
                  {
                      if (!s) {
                          this.println("no MCB");
                          return;
                      }
              
                      this.println("dumpDOS(" + s + ")");
              
                      /*
                       * If s is provided and str.parseInt(s) succeeds, then we assume it represents a starting
                       * MCB (Memory Control Block) segment, and we dump the corresponding blocks.
                       */
                      var sel = this.parseValue(s);
                      while (sel) {
                          var dbgAddr = this.newAddr(0, sel);
                          var bSig = this.getByte(dbgAddr, 1);
                          var wPID = this.getShort(dbgAddr, 2);
                          var wParas = this.getShort(dbgAddr, 5);
                          if (bSig != 0x4D && bSig != 0x5A) break;
                          this.println(this.hexOffset(0, sel) + ": '" + String.fromCharCode(bSig) + "' PID=" + str.toHexWord(wPID) + " LEN=" + str.toHexWord(wParas) + ' "' + this.dumpSZ(dbgAddr, 8) + '"');
                          sel += 1 + wParas;
                      }
                  };
              
                  Debugger.aTSSFields = {
                      "PREV_TSS":     0x00,
                      "CPL0_SP":      0x02,
                      "CPL0_SS":      0x04,
                      "CPL1_SP":      0x06,
                      "CPL1_SS":      0x08,
                      "CPL2_SP":      0x0a,
                      "CPL2_SS":      0x0c,
                      "TASK_IP":      0x0e,
                      "TASK_PS":      0x10,
                      "TASK_AX":      0x12,
                      "TASK_CX":      0x14,
                      "TASK_DX":      0x16,
                      "TASK_BX":      0x18,
                      "TASK_SP":      0x1a,
                      "TASK_BP":      0x1c,
                      "TASK_SI":      0x1e,
                      "TASK_DI":      0x20,
                      "TASK_ES":      0x22,
                      "TASK_CS":      0x24,
                      "TASK_SS":      0x26,
                      "TASK_DS":      0x28,
                      "TASK_LDT":     0x2a
                  };
              
                  /**
                   * dumpBus(s)
                   *
                   * This dumps Bus allocations.
                   *
                   * @this {Debugger}
                   * @param {string} [s]
                   */
                  Debugger.prototype.dumpBus = function(s)
                  {
                      this.println("id       physaddr   blkaddr   used    size    type");
                      this.println("-------- ---------  --------  ------  ------  ----");
                      for (var i = 0; i < this.cpu.aMemBlocks.length; i++) {
                          var block = this.cpu.aBusBlocks[i];
                          if (block.type === Memory.TYPE.NONE) continue;
                          this.println(str.toHex(block.id) + " %" + str.toHex(i << this.cpu.nBlockShift) + ": " + str.toHex(block.addr) + "  " + str.toHexWord(block.used) + "  " + str.toHexWord(block.size) + "  " + Memory.TYPE.NAMES[block.type]);
                      }
                  };
              
                  /**
                   * dumpDesc(s)
                   *
                   * This dumps a descriptor for the given selector.
                   *
                   * @this {Debugger}
                   * @param {string} [s]
                   */
                  Debugger.prototype.dumpDesc = function(s)
                  {
                      if (!s) {
                          this.println("no selector");
                          return;
                      }
              
                      var sel = this.parseValue(s);
                      if (sel === undefined) {
                          this.println("invalid selector: " + s);
                          return;
                      }
              
                      var seg = this.getSegment(sel);
                      this.println("dumpDesc(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.addrDesc : null, this.cchAddr));
                      if (!seg) return;
              
                      var sType;
                      var fGate = false;
                      if (seg.type & X86.DESC.ACC.TYPE.SEG) {
                          if (seg.type & X86.DESC.ACC.TYPE.CODE) {
                              sType = "code";
                              sType += (seg.type & X86.DESC.ACC.TYPE.READABLE)? ",readable" : ",execonly";
                              if (seg.type & X86.DESC.ACC.TYPE.CONFORMING) sType += ",conforming";
                          }
                          else {
                              sType = "data";
                              sType += (seg.type & X86.DESC.ACC.TYPE.WRITABLE)? ",writable" : ",readonly";
                              if (seg.type & X86.DESC.ACC.TYPE.EXPDOWN) sType += ",expdown";
                          }
                          if (seg.type & X86.DESC.ACC.TYPE.ACCESSED) sType += ",accessed";
                      }
                      else {
                          switch(seg.type) {
                          case X86.DESC.ACC.TYPE.TSS:
                              sType = "tss";
                              break;
                          case X86.DESC.ACC.TYPE.LDT:
                              sType = "ldt";
                              break;
                          case X86.DESC.ACC.TYPE.TSS_BUSY:
                              sType = "busy tss";
                              break;
                          case X86.DESC.ACC.TYPE.GATE_CALL:
                              sType = "call gate";
                              fGate = true;
                              break;
                          case X86.DESC.ACC.TYPE.GATE_TASK:
                              sType = "task gate";
                              fGate = true;
                              break;
                          case X86.DESC.ACC.TYPE.GATE_INT:
                              sType = "int gate";
                              fGate = true;
                              break;
                          case X86.DESC.ACC.TYPE.GATE_TRAP:
                              sType = "trap gate";
                              fGate = true;
                              break;
                          default:
                              break;
                          }
                      }
              
                      if (sType && !(seg.acc & X86.DESC.ACC.PRESENT)) sType += ",not present";
              
                      var sDump;
                      if (fGate) {
                          sDump = "seg=" + str.toHexWord(seg.base & 0xffff) + " off=" + str.toHexWord(seg.limit);
                      } else {
                          sDump = "base=" + str.toHex(seg.base, this.cchAddr) + " limit=" + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4);
                      }
                      /*
                       * When we dump the EXT word, we mask off the LIMIT1619 and BASE2431 bits, because those have already
                       * been incorporated into the limit and base properties of the segment register; all we care about here
                       * are whether EXT contains any of the AVAIL (0x10), BIG (0x40) or LIMITPAGES (0x80) bits.
                       */
                      this.println(sDump + " type=" + str.toHexByte(seg.type >> 8) + " (" + sType + ")" + " ext=" + str.toHexWord(seg.ext & ~(X86.DESC.EXT.LIMIT1619 | X86.DESC.EXT.BASE2431)) + " dpl=" + str.toHexByte(seg.dpl));
                  };
              
                  /**
                   * dumpHistory(sCount)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
                   */
                  Debugger.prototype.dumpHistory = function(sCount)
                  {
                      var sMore = "";
                      var cLines = 10;
                      var iHistory = this.iOpcodeHistory;
                      var aHistory = this.aOpcodeHistory;
                      if (aHistory.length) {
                          var n = (sCount === undefined? this.nextHistory : +sCount);
                          if (isNaN(n))
                              n = cLines;
                          else
                              sMore = "more ";
                          if (n > aHistory.length) {
                              this.println("note: only " + aHistory.length + " available");
                              n = aHistory.length;
                          }
                          iHistory -= n;
                          if (iHistory < 0) {
                              if (aHistory[aHistory.length - 1][1] != null) {
                                  iHistory += aHistory.length;
                              } else {
                                  n = iHistory + n;
                                  iHistory = 0;
                              }
                          }
                          if (sCount !== undefined) {
                              this.println(n + " instructions earlier:");
                          }
                          while (cLines && iHistory != this.iOpcodeHistory) {
                              var dbgAddr = aHistory[iHistory++];
                              if (dbgAddr.sel == null) break;
                              /*
                               * We must create a new dbgAddr from the address we obtained from aHistory, because dbgAddr
                               * was a reference, not a copy, and we don't want getInstruction() modifying the original.
                               */
                              dbgAddr = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
                              this.println(this.getInstruction(dbgAddr, "history", n--));
                              /*
                               * If there was an OPERAND or ADDRESS override on the previous instruction, getInstruction()
                               * will have automatically disassembled the next instruction, so skip one more history entry.
                               */
                              if (dbgAddr.fOverride) {
                                  iHistory++; n--;
                              }
                              if (iHistory >= aHistory.length) iHistory = 0;
                              this.nextHistory = n;
                              cLines--;
                          }
                      }
                      if (cLines == 10) {
                          this.println("no " + sMore + "history available");
                          this.nextHistory = undefined;
                      }
                  };
              
                  /**
                   * dumpTSS(s)
                   *
                   * This dumps a TSS using the given selector.  If none is specified, the current TR is used.
                   *
                   * @this {Debugger}
                   * @param {string} [s]
                   */
                  Debugger.prototype.dumpTSS = function(s)
                  {
                      var seg;
                      if (!s) {
                          seg = this.cpu.segTSS;
                      } else {
                          var sel = this.parseValue(s);
                          if (sel === undefined) {
                              this.println("invalid task selector: " + s);
                              return;
                          }
                          seg = this.getSegment(sel);
                      }
              
                      this.println("dumpTSS(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.base : null, this.cchAddr));
                      if (!seg) return;
              
                      var sDump = "";
                      for (var sField in Debugger.aTSSFields) {
                          var off = Debugger.aTSSFields[sField];
                          var ch = (sField.length < 8? ' ' : '');
                          var addr = seg.base + off;
                          var w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
                          if (sDump) sDump += '\n';
                          sDump += str.toHexWord(off) + " " + sField + ": " + ch + str.toHexWord(w);
                      }
              
                      this.println(sDump);
                  };
              
                  /**
                   * messageInit(sEnable)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sEnable contains zero or more message categories to enable, separated by '|' or ';'
                   */
                  Debugger.prototype.messageInit = function(sEnable)
                  {
                      this.dbg = this;
                      this.bitsMessage = this.bitsWarning = Messages.WARN;
                      this.sMessagePrev = null;
                      this.afnDumpers = [];
                      var aEnable = this.parseCommand(sEnable.replace("keys","key").replace("kbd","keyboard"));
                      if (aEnable.length) {
                          for (var m in Debugger.MESSAGES) {
                              if (usr.indexOf(aEnable, m) >= 0) {
                                  this.bitsMessage |= Debugger.MESSAGES[m];
                                  this.println(m + " messages enabled");
                              }
                          }
                      }
                  };
              
                  /**
                   * messageDump(bitMessage, fnDumper)
                   *
                   * @this {Debugger}
                   * @param {number} bitMessage is one Messages category flag
                   * @param {function(string)} fnDumper is a function the Debugger can use to dump data for that category
                   * @return {boolean} true if successfully registered, false if not
                   */
                  Debugger.prototype.messageDump = function(bitMessage, fnDumper)
                  {
                      for (var m in Debugger.MESSAGES) {
                          if (bitMessage == Debugger.MESSAGES[m]) {
                              this.afnDumpers[m] = fnDumper;
                              return true;
                          }
                      }
                      return false;
                  };
              
                  /**
                   * getRegIndex(sReg)
                   *
                   * @this {Debugger}
                   * @param {string} sReg
                   * @return {number}
                   */
                  Debugger.prototype.getRegIndex = function(sReg) {
                      return usr.indexOf(Debugger.REGS, sReg.toUpperCase());
                  };
              
                  /**
                   * getRegValue(iReg)
                   *
                   * @this {Debugger}
                   * @param {number} iReg
                   * @return {string}
                   */
                  Debugger.prototype.getRegValue = function(iReg) {
                      var s = "??";
                      if (iReg >= 0) {
                          var n, cch;
                          var cpu = this.cpu;
                          switch(iReg) {
                          case Debugger.REG_AL:
                              n = cpu.regEAX;  cch = 2;
                              break;
                          case Debugger.REG_CL:
                              n = cpu.regECX;  cch = 2;
                              break;
                          case Debugger.REG_DL:
                              n = cpu.regEDX;  cch = 2;
                              break;
                          case Debugger.REG_BL:
                              n = cpu.regEBX;  cch = 2;
                              break;
                          case Debugger.REG_AH:
                              n = cpu.regEAX >> 8; cch = 2;
                              break;
                          case Debugger.REG_CH:
                              n = cpu.regECX >> 8; cch = 2;
                              break;
                          case Debugger.REG_DH:
                              n = cpu.regEDX >> 8; cch = 2;
                              break;
                          case Debugger.REG_BH:
                              n = cpu.regEBX >> 8; cch = 2;
                              break;
                          case Debugger.REG_AX:
                              n = cpu.regEAX;  cch = 4;
                              break;
                          case Debugger.REG_CX:
                              n = cpu.regECX;  cch = 4;
                              break;
                          case Debugger.REG_DX:
                              n = cpu.regEDX;  cch = 4;
                              break;
                          case Debugger.REG_BX:
                              n = cpu.regEBX;  cch = 4;
                              break;
                          case Debugger.REG_SP:
                              n = cpu.getSP(); cch = 4;
                              break;
                          case Debugger.REG_BP:
                              n = cpu.regEBP;  cch = 4;
                              break;
                          case Debugger.REG_SI:
                              n = cpu.regESI;  cch = 4;
                              break;
                          case Debugger.REG_DI:
                              n = cpu.regEDI;  cch = 4;
                              break;
                          case Debugger.REG_IP:
                              n = cpu.getIP(); cch = this.cchReg;
                              break;
                          case Debugger.REG_PS:
                              n = cpu.getPS(); cch = this.cchReg;
                              break;
                          case Debugger.REG_SEG + Debugger.REG_ES:
                              n = cpu.getES(); cch = 4;
                              break;
                          case Debugger.REG_SEG + Debugger.REG_CS:
                              n = cpu.getCS(); cch = 4;
                              break;
                          case Debugger.REG_SEG + Debugger.REG_SS:
                              n = cpu.getSS(); cch = 4;
                              break;
                          case Debugger.REG_SEG + Debugger.REG_DS:
                              n = cpu.getDS(); cch = 4;
                              break;
                          }
                          if (!cch) {
                              if (this.cpu.model == X86.MODEL_80286) {
                                  if (iReg == Debugger.REG_CR0) {
                                      n = cpu.regCR0;  cch = 4;
                                  }
                              }
                              else if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                  switch(iReg) {
                                  case Debugger.REG_EAX:
                                      n = cpu.regEAX;  cch = 8;
                                      break;
                                  case Debugger.REG_ECX:
                                      n = cpu.regECX;  cch = 8;
                                      break;
                                  case Debugger.REG_EDX:
                                      n = cpu.regEDX;  cch = 8;
                                      break;
                                  case Debugger.REG_EBX:
                                      n = cpu.regEBX;  cch = 8;
                                      break;
                                  case Debugger.REG_ESP:
                                      n = cpu.getSP(); cch = 8;
                                      break;
                                  case Debugger.REG_EBP:
                                      n = cpu.regEBP;  cch = 8;
                                      break;
                                  case Debugger.REG_ESI:
                                      n = cpu.regESI;  cch = 8;
                                      break;
                                  case Debugger.REG_EDI:
                                      n = cpu.regEDI;  cch = 8;
                                      break;
                                  case Debugger.REG_CR0:
                                      n = cpu.regCR0;  cch = 8;
                                      break;
                                  case Debugger.REG_CR1:
                                      n = cpu.regCR1;  cch = 8;
                                      break;
                                  case Debugger.REG_CR2:
                                      n = cpu.regCR2;  cch = 8;
                                      break;
                                  case Debugger.REG_CR3:
                                      n = cpu.regCR3;  cch = 8;
                                      break;
                                  case Debugger.REG_SEG + Debugger.REG_FS:
                                      n = cpu.getFS(); cch = 4;
                                      break;
                                  case Debugger.REG_SEG + Debugger.REG_GS:
                                      n = cpu.getGS(); cch = 4;
                                      break;
                                  }
                              }
                          }
                          if (cch) s = str.toHex(n, cch);
                      }
                      return s;
                  };
              
                  /**
                   * replaceRegs()
                   *
                   * @this {Debugger}
                   * @param {string} s
                   * @return {string}
                   */
                  Debugger.prototype.replaceRegs = function(s) {
                      for (var iReg = 0; iReg < Debugger.REGS.length; iReg++) {
                          var sReg = Debugger.REGS[iReg];
                          if (s.indexOf(sReg) >= 0) {
                              s = str.replaceAll(sReg, this.getRegValue(iReg), s);
                          }
                      }
                      return s;
                  };
              
                  /**
                   * message(sMessage, fAddress)
                   *
                   * @this {Debugger}
                   * @param {string} sMessage is any caller-defined message string
                   * @param {boolean} [fAddress] is true to display the current CS:IP
                   */
                  Debugger.prototype.message = function(sMessage, fAddress)
                  {
                      if (fAddress) {
                          sMessage += " @" + this.hexOffset(this.cpu.getIP(), this.cpu.getCS());
                      }
              
                      if (this.sMessagePrev && sMessage == this.sMessagePrev) return;
              
                      if (!SAMPLER) this.println(sMessage);   // + " (" + this.cpu.getCycles() + " cycles)"
              
                      this.sMessagePrev = sMessage;
              
                      if (this.cpu) {
                          if (this.bitsMessage & Messages.HALT) {
                              this.stopCPU();
                          }
                          /*
                           * We have no idea what the frequency of println() calls might be; all we know is that they easily
                           * screw up the CPU's careful assumptions about cycles per burst.  So we call yieldCPU() after every
                           * message, to effectively end the current burst and start fresh.
                           *
                           * TODO: See CPU.calcStartTime() for a discussion of why we might want to call yieldCPU() *before*
                           * we display the message.
                           */
                          this.cpu.yieldCPU();
                      }
                  };
              
                  /**
                   * messageInt(nInt, addr)
                   *
                   * @this {Debugger}
                   * @param {number} nInt
                   * @param {number} addr (LIP after the "INT n" instruction has been fetched but not dispatched)
                   * @return {boolean} true if message generated (which in turn triggers addIntReturn() inside checkIntNotify()), false if not
                   */
                  Debugger.prototype.messageInt = function(nInt, addr)
                  {
                      var AH;
                      var fMessage = false;
                      var nCategory = Debugger.INT_MESSAGES[nInt];
                      if (nCategory) {
                          AH = this.cpu.regEAX >> 8;
                          if (this.messageEnabled(nCategory)) {
                              fMessage = true;
                          } else {
                              fMessage = (nCategory == Messages.FDC && this.messageEnabled(nCategory = Messages.HDC));
                          }
                      }
                      if (fMessage) {
                          var DL = this.cpu.regEDX & 0xff;
                          if (nInt == Interrupts.DOS.VECTOR && AH == 0x0b ||
                              nCategory == Messages.FDC && DL >= 0x80 || nCategory == Messages.HDC && DL < 0x80) {
                              fMessage = false;
                          }
                      }
                      if (fMessage) {
                          var aFuncs = Debugger.INT_FUNCS[nInt];
                          var sFunc = (aFuncs && aFuncs[AH]) || "";
                          if (sFunc) sFunc = ' ' + this.replaceRegs(sFunc);
                          /*
                           * For purposes of display only, rewind addr to the address of the responsible "INT n" instruction; we
                           * know it's the two-byte "INT n" instruction because that's the only opcode handler that calls checkIntNotify()
                           * at the moment.  If that changes, then this will have to change as well.
                           */
                          addr -= 2;
                          this.message("INT " + str.toHexByte(nInt) + ": AH=" + str.toHexByte(AH) + " @" + this.hexOffset(addr - this.cpu.segCS.base, this.cpu.getCS()) + sFunc);
                      }
                      return fMessage;
                  };
              
                  /**
                   * messageIntReturn(nInt, nLevel, nCycles)
                   *
                   * @this {Debugger}
                   * @param {number} nInt
                   * @param {number} nLevel
                   * @param {number} nCycles
                   * @param {string} [sResult]
                   */
                  Debugger.prototype.messageIntReturn = function(nInt, nLevel, nCycles, sResult)
                  {
                      this.message("INT " + str.toHexByte(nInt) + ": C=" + (this.cpu.getCF()? 1 : 0) + (sResult || "") + " (cycles=" + nCycles + (nLevel? ",level=" + (nLevel+1) : "") + ")");
                  };
              
                  /**
                   * messageIO(component, port, bOut, addrFrom, name, bIn, bitsMessage)
                   *
                   * @this {Debugger}
                   * @param {Component} component
                   * @param {number} port
                   * @param {number|null} bOut if an output operation
                   * @param {number|null} [addrFrom]
                   * @param {string|null} [name] of the port, if any
                   * @param {number|null} [bIn] is the input value, if known, on an input operation
                   * @param {number} [bitsMessage] is one or more Messages category flag(s)
                   */
                  Debugger.prototype.messageIO = function(component, port, bOut, addrFrom, name, bIn, bitsMessage)
                  {
                      bitsMessage |= Messages.PORT;
                      if (addrFrom == null || (this.bitsMessage & bitsMessage) == bitsMessage) {
                          var selFrom = null;
                          if (addrFrom != null) {
                              selFrom = this.cpu.getCS();
                              addrFrom -= this.cpu.segCS.base;
                          }
                          this.message(component.idComponent + "." + (bOut != null? "outPort" : "inPort") + '(' + str.toHexWord(port) + ',' + (name? name : "unknown") + (bOut != null? ',' + str.toHexByte(bOut) : "") + ")" + (bIn != null? (": " + str.toHexByte(bIn)) : "") + (addrFrom != null? (" @" + this.hexOffset(addrFrom, selFrom)) : ""));
                      }
                  };
              
                  /**
                   * traceInit()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.traceInit = function()
                  {
                      if (DEBUG) {
                          this.traceEnabled = {};
                          for (var prop in Debugger.TRACE) {
                              this.traceEnabled[prop] = false;
                          }
                          this.iTraceBuffer = 0;
                          this.aTraceBuffer = [];     // we now defer TRACE_LIMIT allocation until the first traceLog() call
                      }
                  };
              
                  /**
                   * traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
                   *
                   * @this {Debugger}
                   * @param {string} prop
                   * @param {number} dst
                   * @param {number} src
                   * @param {number|null} flagsIn
                   * @param {number|null} flagsOut
                   * @param {number} resultLo
                   * @param {number} [resultHi]
                   */
                  Debugger.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
                  {
                      if (DEBUG) {
                          if (this.traceEnabled !== undefined && this.traceEnabled[prop]) {
                              var trace = Debugger.TRACE[prop];
                              var len = (trace.size >> 2);
                              var s = this.hexOffset(this.cpu.opLIP - this.cpu.segCS.base, this.cpu.getCS()) + " " + Debugger.INS_NAMES[trace.ins] + "(" + str.toHex(dst, len) + "," + str.toHex(src, len) + "," + (flagsIn === null? "-" : str.toHexWord(flagsIn)) + ") " + str.toHex(resultLo, len) + "," + (flagsOut === null? "-" : str.toHexWord(flagsOut));
                              if (!this.aTraceBuffer.length) this.aTraceBuffer = new Array(Debugger.TRACE_LIMIT);
                              this.aTraceBuffer[this.iTraceBuffer++] = s;
                              if (this.iTraceBuffer >= this.aTraceBuffer.length) {
                                  /*
                                   * Instead of wrapping the buffer, we're going to turn all tracing off.
                                   *
                                   *      this.iTraceBuffer = 0;
                                   */
                                  for (prop in this.traceEnabled) {
                                      this.traceEnabled[prop] = false;
                                  }
                                  this.println("trace buffer full");
                              }
                          }
                      }
                  };
              
                  /**
                   * init()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.init = function()
                  {
                      this.println("Type ? for list of debugger commands");
                      this.updateStatus();
                      if (this.sInitCommands) {
                          var a = this.parseCommand(this.sInitCommands);
                          delete this.sInitCommands;
                          for (var s in a) this.doCommand(a[s]);
                      }
                  };
              
                  /**
                   * historyInit()
                   *
                   * This function is intended to be called by the constructor, reset(), addBreakpoint(), findBreakpoint()
                   * and any other function that changes the checksEnabled() criteria used to decide whether checkInstruction()
                   * should be called.
                   *
                   * That is, if the history arrays need to be allocated and haven't already been allocated, then allocate them,
                   * and if the arrays are no longer needed, then deallocate them.
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.historyInit = function()
                  {
                      var i;
                      if (!this.checksEnabled()) {
                          this.iOpcodeHistory = 0;
                          this.aOpcodeHistory = [];
                          this.aaOpcodeCounts = [];
                          return;
                      }
                      if (!this.aOpcodeHistory || !this.aOpcodeHistory.length) {
                          this.aOpcodeHistory = new Array(10000);
                          for (i = 0; i < this.aOpcodeHistory.length; i++) {
                              /*
                               * Preallocate dummy Addr (Array) objects in every history slot, so that
                               * checkInstruction() doesn't need to call newAddr() on every slot update.
                               */
                              this.aOpcodeHistory[i] = this.newAddr();
                          }
                          this.iOpcodeHistory = 0;
                      }
                      if (!this.aaOpcodeCounts || !this.aaOpcodeCounts.length) {
                          this.aaOpcodeCounts = new Array(256);
                          for (i = 0; i < this.aaOpcodeCounts.length; i++) {
                              this.aaOpcodeCounts[i] = [i, 0];
                          }
                      }
                  };
              
                  /**
                   * runCPU(fOnClick)
                   *
                   * @this {Debugger}
                   * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
                   * @return {boolean} true if run request successful, false if not
                   */
                  Debugger.prototype.runCPU = function(fOnClick)
                  {
                      if (!this.isCPUAvail()) return false;
                      this.cpu.runCPU(fOnClick);
                      return true;
                  };
              
                  /**
                   * stepCPU(nCycles, fRegs, fUpdateCPU)
                   *
                   * @this {Debugger}
                   * @param {number} nCycles (0 for one instruction without checking breakpoints)
                   * @param {boolean} [fRegs] is true to display registers after step (default is false)
                   * @param {boolean} [fUpdateCPU] is false to disable calls to updateCPU() (default is true)
                   * @return {boolean}
                   */
                  Debugger.prototype.stepCPU = function(nCycles, fRegs, fUpdateCPU)
                  {
                      if (!this.isCPUAvail()) return false;
              
                      this.nCycles = 0;
                      do {
                          if (!nCycles) {
                              /*
                               * When single-stepping, the CPU won't call checkInstruction(), which is good for
                               * avoiding breakpoints, but bad for instruction data collection if checks are enabled.
                               * So we call checkInstruction() ourselves.
                               */
                              if (this.checksEnabled()) this.checkInstruction(this.cpu.regLIP, 0);
                          }
                          try {
                              var nCyclesStep = this.cpu.stepCPU(nCycles);
                              if (nCyclesStep > 0) {
                                  this.nCycles += nCyclesStep;
                                  this.cpu.addCycles(nCyclesStep, true);
                                  this.cpu.updateChecksum(nCyclesStep);
                                  this.cInstructions++;
                              }
                          }
                          catch (e) {
                              this.nCycles = 0;
                              this.cpu.setError(e.stack || e.message);
                          }
                      } while (this.cpu.opFlags & X86.OPFLAG_PREFIXES);
              
                      /*
                       * Because we called cpu.stepCPU() and not cpu.runCPU(), we must nudge the cpu's update code,
                       * and then update our own state.  Normally, the only time fUpdateCPU will be false is when doStep()
                       * is calling us in a loop, in which case it will perform its own updateCPU() when it's done.
                       */
                      if (fUpdateCPU !== false) this.cpu.updateCPU();
              
                      this.updateStatus(fRegs || false, false);
                      return (this.nCycles > 0);
                  };
              
                  /**
                   * stopCPU()
                   *
                   * @this {Debugger}
                   * @param {boolean} [fComplete]
                   */
                  Debugger.prototype.stopCPU = function(fComplete)
                  {
                      if (this.cpu) this.cpu.stopCPU(fComplete);
                  };
              
                  /**
                   * updateStatus(fRegs, fCompact)
                   *
                   * @this {Debugger}
                   * @param {boolean} [fRegs] (default is true)
                   * @param {boolean} [fCompact] (default is true)
                   */
                  Debugger.prototype.updateStatus = function(fRegs, fCompact)
                  {
                      if (fRegs === undefined) fRegs = true;
                      if (fCompact === undefined) fCompact = true;
              
                      this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                      /*
                       * this.fProcStep used to be a simple boolean, but now it's 0 (or undefined)
                       * if inactive, 1 if stepping over an instruction without a register dump, or 2
                       * if stepping over an instruction with a register dump.
                       */
                      if (!fRegs || this.fProcStep == 1)
                          this.doUnassemble();
                      else {
                          this.doRegisters(null, fCompact);
                      }
                  };
              
                  /**
                   * isCPUAvail()
                   *
                   * Make sure the CPU is ready (finished initializing), not busy (already running), and not in an error state.
                   *
                   * @this {Debugger}
                   * @return {boolean}
                   */
                  Debugger.prototype.isCPUAvail = function()
                  {
                      if (!this.cpu)
                          return false;
                      if (!this.cpu.isReady())
                          return false;
                      if (!this.cpu.isPowered())
                          return false;
                      if (this.cpu.isBusy())
                          return false;
                      return !this.cpu.isError();
                  };
              
                  /**
                   * powerUp(data, fRepower)
                   *
                   * @this {Debugger}
                   * @param {Object|null} data
                   * @param {boolean} [fRepower]
                   * @return {boolean} true if successful, false if failure
                   */
                  Debugger.prototype.powerUp = function(data, fRepower)
                  {
                      if (!fRepower) {
                          /*
                           * Because Debugger save/restore support is somewhat limited (and didn't always exist),
                           * we deviate from the typical save/restore design pattern: instead of reset OR restore,
                           * we always reset and then perform a (potentially limited) restore.
                           */
                          this.reset(true);
              
                          // this.println(data? "resuming" : "powering up");
              
                          if (data && this.restore) {
                              if (!this.restore(data)) return false;
                          }
                      }
                      return true;
                  };
              
                  /**
                   * powerDown(fSave, fShutdown)
                   *
                   * @this {Debugger}
                   * @param {boolean} fSave
                   * @param {boolean} [fShutdown]
                   * @return {Object|boolean}
                   */
                  Debugger.prototype.powerDown = function(fSave, fShutdown)
                  {
                      if (fShutdown) this.println(fSave? "suspending" : "shutting down");
                      return fSave && this.save? this.save() : true;
                  };
              
                  /**
                   * reset(fQuiet)
                   *
                   * This is a notification handler, called by the Computer, to inform us of a reset.
                   *
                   * @this {Debugger}
                   * @param {boolean} fQuiet (true only when called from our own powerUp handler)
                   */
                  Debugger.prototype.reset = function(fQuiet)
                  {
                      this.historyInit();
                      this.cInstructions = 0;
                      this.sMessagePrev = null;
                      this.nCycles = 0;
                      this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                      /*
                       * fRunning is set by start() and cleared by stop().  In addition, we clear
                       * it here, so that if the CPU is reset while running, we can prevent stop()
                       * from unnecessarily dumping the CPU state.
                       */
                      if (this.aFlags.fRunning !== undefined && !fQuiet) this.println("reset");
                      this.aFlags.fRunning = false;
                      this.clearTempBreakpoint();
                      if (!fQuiet) this.updateStatus();
                  };
              
                  /**
                   * save()
                   *
                   * This implements (very rudimentary) save support for the Debugger component.
                   *
                   * @this {Debugger}
                   * @return {Object}
                   */
                  Debugger.prototype.save = function()
                  {
                      var state = new State(this);
                      state.set(0, this.packAddr(this.dbgAddrNextCode));
                      state.set(1, this.packAddr(this.dbgAddrAssemble));
                      state.set(2, [this.aPrevCmds, this.fAssemble, this.bitsMessage]);
                      return state.data();
                  };
              
                  /**
                   * restore(data)
                   *
                   * This implements (very rudimentary) restore support for the Debugger component.
                   *
                   * @this {Debugger}
                   * @param {Object} data
                   * @return {boolean} true if successful, false if failure
                   */
                  Debugger.prototype.restore = function(data)
                  {
                      var i = 0;
                      if (data[2] !== undefined) {
                          this.dbgAddrNextCode = this.unpackAddr(data[i++]);
                          this.dbgAddrAssemble = this.unpackAddr(data[i++]);
                          this.aPrevCmds = data[i][0];
                          if (typeof this.aPrevCmds == "string") this.aPrevCmds = [this.aPrevCmds];
                          this.fAssemble = data[i][1];
                          if (!this.bitsMessage) {
                              /*
                               * It's actually kind of annoying that a restored (or predefined) state will trump my initial state,
                               * at least in situations where I've changed the initial state, if I want to diagnose something.
                               * Perhaps I should save/restore both the initial and current bitsMessageEnabled, and if the initial
                               * values don't agree, then leave the current value alone.
                               *
                               * But, it's much easier to just leave bitsMessageEnabled alone whenever it already contains set bits.
                               */
                              this.bitsMessage = data[i][2];
                          }
                      }
                      return true;
                  };
              
                  /**
                   * start(ms, nCycles)
                   *
                   * This is a notification handler, called by the Computer, to inform us the CPU has started.
                   *
                   * @this {Debugger}
                   * @param {number} ms
                   * @param {number} nCycles
                   */
                  Debugger.prototype.start = function(ms, nCycles)
                  {
                      if (!this.fProcStep) this.println("running");
                      this.aFlags.fRunning = true;
                      this.msStart = ms;
                      this.nCyclesStart = nCycles;
                  };
              
                  /**
                   * stop(ms, nCycles)
                   *
                   * This is a notification handler, called by the Computer, to inform us the CPU has now stopped.
                   *
                   * @this {Debugger}
                   * @param {number} ms
                   * @param {number} nCycles
                   */
                  Debugger.prototype.stop = function(ms, nCycles)
                  {
                      if (this.aFlags.fRunning) {
                          this.aFlags.fRunning = false;
                          this.nCycles = nCycles - this.nCyclesStart;
                          if (!this.fProcStep) {
                              var sStopped = "stopped";
                              if (this.nCycles) {
                                  var msTotal = ms - this.msStart;
                                  var nCyclesPerSecond = (msTotal > 0? Math.round(this.nCycles * 1000 / msTotal) : 0);
                                  sStopped += " (";
                                  if (this.checksEnabled()) {
                                      sStopped += this.cInstructions + " ops, ";
                                      this.cInstructions = 0;     // remove this line if you want to maintain a longer total
                                  }
                                  sStopped += this.nCycles + " cycles, " + msTotal + " ms, " + nCyclesPerSecond + " hz)";
                                  if (MAXDEBUG && this.chipset) {
                                      var i, c, n;
                                      for (i = 0; i < this.chipset.acInterrupts.length; i++) {
                                          c = this.chipset.acInterrupts[i];
                                          if (!c) continue;
                                          n = c / Math.round(msTotal / 1000);
                                          this.println("IRQ" + i + ": " + c + " interrupts (" + n + " per sec)");
                                          this.chipset.acInterrupts[i] = 0;
                                      }
                                      for (i = 0; i < this.chipset.acTimersFired.length; i++) {
                                          c = this.chipset.acTimersFired[i];
                                          if (!c) continue;
                                          n = c / Math.round(msTotal / 1000);
                                          this.println("TIMER" + i + ": " + c + " fires (" + n + " per sec)");
                                          this.chipset.acTimersFired[i] = 0;
                                      }
                                      n = 0;
                                      for (i = 0; i < this.chipset.acTimer0Counts.length; i++) {
                                          var a = this.chipset.acTimer0Counts[i];
                                          n += a[0];
                                          this.println("TIMER0 update #" + i + ": [" + a[0] + "," + a[1] + "," + a[2] + "]");
                                      }
                                      this.chipset.acTimer0Counts = [];
                                  }
                              }
                              this.println(sStopped);
                          }
                          this.updateStatus(true, this.fProcStep != 2);
                          this.setFocus();
                          this.clearTempBreakpoint(this.cpu.regLIP);
                      }
                  };
              
                  /**
                   * checksEnabled(fRelease)
                   *
                   * This "check" function is called by the CPU; we indicate whether or not every instruction needs to be checked.
                   *
                   * Originally, this returned true even when there were only read and/or write breakpoints, but those breakpoints
                   * no longer require the intervention of checkInstruction(); the Bus component automatically swaps in/out appropriate
                   * functions to deal with those breakpoints in the appropriate memory blocks.  So I've simplified the test below.
                   *
                   * @this {Debugger}
                   * @param {boolean} [fRelease] is true for release criteria only; default is false (any criteria)
                   * @return {boolean} true if every instruction needs to pass through checkInstruction(), false if not
                   */
                  Debugger.prototype.checksEnabled = function(fRelease)
                  {
                      return ((DEBUG && !fRelease)? true : (this.aBreakExec.length > 1 || this.messageEnabled(Messages.INT) /* || this.aBreakRead.length > 1 || this.aBreakWrite.length > 1 */));
                  };
              
                  /**
                   * checkInstruction(addr, nState)
                   *
                   * This "check" function is called by the CPU to inform us about the next instruction to be executed,
                   * giving us an opportunity to look for "exec" breakpoints and update opcode frequencies and instruction history.
                   *
                   * @this {Debugger}
                   * @param {number} addr
                   * @param {number} nState is < 0 if stepping, 0 if starting, or > 0 if running
                   * @return {boolean} true if breakpoint hit, false if not
                   */
                  Debugger.prototype.checkInstruction = function(addr, nState)
                  {
                      if (nState > 0) {
                          if (this.checkBreakpoint(addr, this.aBreakExec)) {
                              return true;
                          }
                          /*
                           * Halt whenever ring 3 code is running with interrupts disabled, because that's likely an
                           * error (TODO: we should also check the IOPL, too, because if IOPL is 3, then this is OK).
                           */
                          if (this.cpu.segCS.cpl == 3 && !(this.cpu.regPS & X86.PS.IF)) {
                              return true;
                          }
                      }
              
                      /*
                       * The rest of the instruction tracking logic can only be performed if historyInit() has allocated the
                       * necessary data structures.  Note that there is no explicit UI for enabling/disabling history, other than
                       * adding/removing breakpoints, simply because it's breakpoints that trigger the call to checkInstruction();
                       * well, OK, and a few other things now, like enabling Messages.INT messages.
                       */
                      if (nState >= 0 && this.aaOpcodeCounts.length) {
                          this.cInstructions++;
                          var bOpcode = this.cpu.probeAddr(addr);
                          if (bOpcode != null) {
                              this.aaOpcodeCounts[bOpcode][1]++;
                              var dbgAddr = this.aOpcodeHistory[this.iOpcodeHistory];
                              dbgAddr.off = this.cpu.getIP();
                              dbgAddr.sel = this.cpu.getCS();
                              dbgAddr.addr = addr;
                              if (++this.iOpcodeHistory == this.aOpcodeHistory.length) this.iOpcodeHistory = 0;
                          }
                      }
                      return false;
                  };
              
                  /**
                   * checkMemoryRead(addr)
                   *
                   * This "check" function is called by a Memory block to inform us that a memory read occurred, giving us an
                   * opportunity to track the read if we want, and look for a matching "read" breakpoint, if any.
                   *
                   * @this {Debugger}
                   * @param {number} addr
                   * @return {boolean} true if breakpoint hit, false if not
                   */
                  Debugger.prototype.checkMemoryRead = function(addr)
                  {
                      if (this.checkBreakpoint(addr, this.aBreakRead)) {
                          this.stopCPU(true);
                          return true;
                      }
                      return false;
                  };
              
                  /**
                   * checkMemoryWrite(addr)
                   *
                   * This "check" function is called by a Memory block to inform us that a memory write occurred, giving us an
                   * opportunity to track the write if we want, and look for a matching "write" breakpoint, if any.
                   *
                   * @this {Debugger}
                   * @param {number} addr
                   * @return {boolean} true if breakpoint hit, false if not
                   */
                  Debugger.prototype.checkMemoryWrite = function(addr)
                  {
                      if (this.checkBreakpoint(addr, this.aBreakWrite)) {
                          this.stopCPU(true);
                          return true;
                      }
                      return false;
                  };
              
                  /**
                   * checkPortInput(port, bIn)
                   *
                   * This "check" function is called by the Bus component to inform us that port input occurred.
                   *
                   * @this {Debugger}
                   * @param {number} port
                   * @param {number} bIn
                   * @return {boolean} true if breakpoint hit, false if not
                   */
                  Debugger.prototype.checkPortInput = function(port, bIn)
                  {
                      /*
                       * We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
                       */
                      this.println("break on input from port " + str.toHexWord(port) + ": " + str.toHexByte(bIn));
                      this.stopCPU(true);
                      return true;
                  };
              
                  /**
                   * checkPortOutput(port, bOut)
                   *
                   * This "check" function is called by the Bus component to inform us that port output occurred.
                   *
                   * @this {Debugger}
                   * @param {number} port
                   * @param {number} bOut
                   * @return {boolean} true if breakpoint hit, false if not
                   */
                  Debugger.prototype.checkPortOutput = function(port, bOut)
                  {
                      /*
                       * We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
                       */
                      this.println("break on output to port " + str.toHexWord(port) + ": " + str.toHexByte(bOut));
                      this.stopCPU(true);
                      return true;
                  };
              
                  /**
                   * clearBreakpoints()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.clearBreakpoints = function()
                  {
                      var i;
                      this.aBreakExec = ["exec"];
                      if (this.aBreakRead !== undefined) {
                          for (i = 1; i < this.aBreakRead.length; i++) {
                              this.bus.removeMemBreak(this.getAddr(this.aBreakRead[i]), false);
                          }
                      }
                      this.aBreakRead = ["read"];
                      if (this.aBreakWrite !== undefined) {
                          for (i = 1; i < this.aBreakWrite.length; i++) {
                              this.bus.removeMemBreak(this.getAddr(this.aBreakWrite[i]), true);
                          }
                      }
                      this.aBreakWrite = ["write"];
                      /*
                       * nBreakSuppress ensures we can't get into an infinite loop where a breakpoint lookup requires
                       * reading a segment descriptor via getSegment(), and that triggers more memory reads, which triggers
                       * more breakpoint checks.
                       */
                      this.nBreakSuppress = 0;
                  };
              
                  /**
                   * addBreakpoint(aBreak, dbgAddr, fTempBreak)
                   *
                   * @this {Debugger}
                   * @param {Array} aBreak
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fTempBreak]
                   * @return {boolean} true if breakpoint added, false if already exists
                   */
                  Debugger.prototype.addBreakpoint = function(aBreak, dbgAddr, fTempBreak)
                  {
                      if (!this.findBreakpoint(aBreak, dbgAddr)) {
                          dbgAddr.fTempBreak = fTempBreak;
                          aBreak.push(dbgAddr);
                          if (aBreak != this.aBreakExec) {
                              this.bus.addMemBreak(this.getAddr(dbgAddr), aBreak == this.aBreakWrite);
                          }
                          if (fTempBreak) {
                              /*
                               * Force temporary breakpoints to be interpreted as linear breakpoints
                               * (hence the assertion that there IS a linear address stored in dbgAddr);
                               * this allows us to step over calls or interrupts that change the processor mode
                               */
                              dbgAddr.sel = null;
                              this.assert(dbgAddr.addr);
                          } else {
                              this.println("breakpoint enabled: " + this.hexAddr(dbgAddr) + " (" + aBreak[0] + ")");
                          }
                          this.historyInit();
                          return true;
                      }
                      return false;
                  };
              
                  /**
                   * findBreakpoint(aBreak, dbgAddr, fRemove)
                   *
                   * @this {Debugger}
                   * @param {Array} aBreak
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fRemove]
                   * @return {boolean} true if found, false if not
                   */
                  Debugger.prototype.findBreakpoint = function(aBreak, dbgAddr, fRemove)
                  {
                      var fFound = false;
                      var addr = this.mapBreakpoint(this.getAddr(dbgAddr));
                      for (var i = 1; i < aBreak.length; i++) {
                          var dbgAddrBreak = aBreak[i];
                          if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
                              fFound = true;
                              if (fRemove) {
                                  aBreak.splice(i, 1);
                                  if (aBreak != this.aBreakExec) {
                                      this.bus.removeMemBreak(addr, aBreak == this.aBreakWrite);
                                  }
                                  if (!dbgAddrBreak.fTempBreak) this.println("breakpoint cleared: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                                  this.historyInit();
                                  break;
                              }
                              this.println("breakpoint exists: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                              break;
                          }
                      }
                      return fFound;
                  };
              
                  /**
                   * listBreakpoints(aBreak)
                   *
                   * TODO: We may need to start listing linear addresses also, because segmented address can be ambiguous.
                   *
                   * @this {Debugger}
                   * @param {Array} aBreak
                   * @return {number} of breakpoints listed, 0 if none
                   */
                  Debugger.prototype.listBreakpoints = function(aBreak)
                  {
                      for (var i = 1; i < aBreak.length; i++) {
                          this.println("breakpoint enabled: " + this.hexAddr(aBreak[i]) + " (" + aBreak[0] + ")");
                      }
                      return aBreak.length - 1;
                  };
              
                  /**
                   * redoBreakpoints()
                   *
                   * This function is for the Memory component: whenever the Bus allocates a new Memory block, it calls
                   * the block's setDebugger() method, which clears the memory block's breakpoint counts.  setDebugger(),
                   * in turn, must call this function to re-apply any existing breakpoints to that block.
                   *
                   * This ensures that, even if a memory region is remapped (which creates new Memory blocks in the process),
                   * any breakpoints that were previously applied to that region will still work.
                   *
                   * @this {Debugger}
                   * @param {number} addr of memory block
                   * @param {number} size of memory block
                   * @param {Array} [aBreak]
                   */
                  Debugger.prototype.redoBreakpoints = function(addr, size, aBreak)
                  {
                      if (aBreak === undefined) {
                          this.redoBreakpoints(addr, size, this.aBreakRead);
                          this.redoBreakpoints(addr, size, this.aBreakWrite);
                          return;
                      }
                      for (var i = 1; i < aBreak.length; i++) {
                          var addrBreak = this.getAddr(aBreak[i]);
                          if (addrBreak >= addr && addrBreak < addr + size) {
                              this.bus.addMemBreak(addrBreak, aBreak == this.aBreakWrite);
                          }
                      }
                  };
              
                  /**
                   * setTempBreakpoint(dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr of new temp breakpoint
                   */
                  Debugger.prototype.setTempBreakpoint = function(dbgAddr)
                  {
                      this.addBreakpoint(this.aBreakExec, dbgAddr, true);
                  };
              
                  /**
                   * clearTempBreakpoint(addr)
                   *
                   * @this {Debugger}
                   * @param {number|undefined} [addr] clear all temp breakpoints if no address specified
                   */
                  Debugger.prototype.clearTempBreakpoint = function(addr)
                  {
                      if (addr !== undefined) {
                          this.checkBreakpoint(addr, this.aBreakExec, true);
                          this.fProcStep = 0;
                      } else {
                          for (var i = 1; i < this.aBreakExec.length; i++) {
                              var dbgAddrBreak = this.aBreakExec[i];
                              if (dbgAddrBreak.fTempBreak) {
                                  if (!this.findBreakpoint(this.aBreakExec, dbgAddrBreak, true)) break;
                                  i = 0;
                              }
                          }
                      }
                  };
              
                  /**
                   * mapBreakpoint(addr)
                   *
                   * @this {Debugger}
                   * @param {number} addr
                   * @return {number}
                   */
                  Debugger.prototype.mapBreakpoint = function(addr)
                  {
                      /*
                       * Map addresses in the top 64Kb at the top of the address space (assuming either a 16Mb or 4Gb
                       * address space) to the top of the 1Mb range.
                       *
                       * The fact that those two 64Kb regions are aliases of each other on an 80286 is a pain in the BUTT,
                       * because any CS-based breakpoint you set immediately after a CPU reset will have a physical address
                       * in the top 16Mb, yet after the first inter-segment JMP, you will be running in the first 1Mb.
                       */
                      var mask = (this.maskAddr & ~0xffff);
                      if ((addr & mask) == mask) addr &= 0x000fffff;
                      return addr;
                  };
              
                  /**
                   * checkBreakpoint(addr, aBreak, fTemp)
                   *
                   * @this {Debugger}
                   * @param {number} addr
                   * @param {Array} aBreak
                   * @param {boolean} [fTemp]
                   * @return {boolean} true if breakpoint has been hit, false if not
                   */
                  Debugger.prototype.checkBreakpoint = function(addr, aBreak, fTemp)
                  {
                      /*
                       * Time to check for execution breakpoints; note that this should be done BEFORE updating frequency
                       * or history data (see checkInstruction), since we might not actually execute the current instruction.
                       */
                      var fBreak = false;
                      if (!this.nBreakSuppress++) {
                          addr = this.mapBreakpoint(addr);
                          for (var i = 1; i < aBreak.length; i++) {
              
                              var dbgAddrBreak = aBreak[i];
              
                              /*
                               * We need to zap the linear address field of the breakpoint address before
                               * calling getAddr(), to force it to recalculate the linear address every time,
                               * unless this is a breakpoint on a linear address (as indicated by a null sel).
                               */
                              if (dbgAddrBreak.sel != null) dbgAddrBreak.addr = null;
              
                              /*
                               * We used to calculate the linear address of the breakpoint at the time the
                               * breakpoint was added, so that a breakpoint set in one mode (eg, in real-mode)
                               * would still work as intended if the mode changed later (eg, to protected-mode).
                               *
                               * However, that created difficulties setting protected-mode breakpoints in segments
                               * that might not be defined yet, or that could move in physical memory.
                               *
                               * If you want to create a real-mode breakpoint that will break regardless of mode,
                               * use the physical address of the real-mode memory location instead.
                               */
                              if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
                                  if (dbgAddrBreak.fTempBreak) {
                                      this.findBreakpoint(aBreak, dbgAddrBreak, true);
                                  } else if (!fTemp) {
                                      this.println("breakpoint hit: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                                  }
                                  fBreak = true;
                                  break;
                              }
                          }
                      }
                      this.nBreakSuppress--;
                      return fBreak;
                  };
              
                  /**
                   * getInstruction(dbgAddr, sComment, nSequence)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {string} [sComment] is an associated comment
                   * @param {number} [nSequence] is an associated sequence number, undefined if none
                   * @return {string} (and dbgAddr is updated to the next instruction)
                   */
                  Debugger.prototype.getInstruction = function(dbgAddr, sComment, nSequence)
                  {
                      var dbgAddrIns = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
              
                      var bOpcode = this.getByte(dbgAddr, 1);
              
                      /*
                       * Incorporate the following prefixes into the current instruction byte stream.
                       * TODO: Determine the actual effect of multiple OS (and/or multiple AS) prefixes.
                       */
                      var cMax = 2;           // let's make sure unfortunate memory contents don't screw us
                      while ((bOpcode == X86.OPCODE.OS || bOpcode == X86.OPCODE.AS) && cMax--) {
                          if (bOpcode == X86.OPCODE.OS) {
                              dbgAddr.fData32 = !dbgAddr.fData32;
                          } else {
                              dbgAddr.fAddr32 = !dbgAddr.fAddr32;
                          }
                          bOpcode = this.getByte(dbgAddr, 1);
                      }
              
                      var aOpDesc = this.aaOpDescs[bOpcode];
                      var iIns = aOpDesc[0];
                      var bModRM = -1;
              
                      if (iIns == Debugger.INS.OP0F) {
                          var b = this.getByte(dbgAddr, 1);
                          aOpDesc = Debugger.aaOp0FDescs[b] || Debugger.aOpDescUndefined;
                          bOpcode |= (b << 8);
                          iIns = aOpDesc[0];
                      }
              
                      if (iIns >= Debugger.INS_NAMES.length) {
                          bModRM = this.getByte(dbgAddr, 1);
                          aOpDesc = Debugger.aaGrpDescs[iIns - Debugger.INS_NAMES.length][(bModRM >> 3) & 0x7];
                      }
              
                      var sOpcode = Debugger.INS_NAMES[aOpDesc[0]];
                      var cOperands = aOpDesc.length - 1;
                      var sOperands = "";
                      if (this.isStringIns(bOpcode)) {
                          cOperands = 0;              // suppress display of operands for string instructions
                          if (dbgAddr.fData32 && sOpcode.slice(-1) == 'W') sOpcode = sOpcode.slice(0, -1) + 'D';
                      }
              
                      var typeCPU = null;
                      var fNonPrefix = true;
              
                      for (var iOperand = 1; iOperand <= cOperands; iOperand++) {
              
                          var disp, offset, cch;
                          var sOperand = "";
                          var type = aOpDesc[iOperand];
                          if (type === undefined) continue;
              
                          if (typeCPU == null) typeCPU = type >> Debugger.TYPE_CPU_SHIFT;
              
                          var typeSize = type & Debugger.TYPE_SIZE;
                          if (typeSize == Debugger.TYPE_NONE) {
                              continue;
                          }
                          if (typeSize == Debugger.TYPE_PREFIX) {
                              fNonPrefix = false;
                              continue;
                          }
                          var typeMode = type & Debugger.TYPE_MODE;
                          if (typeMode >= Debugger.TYPE_MODRM) {
                              if (bModRM < 0) {
                                  bModRM = this.getByte(dbgAddr, 1);
                              }
                              if (typeMode >= Debugger.TYPE_REG) {
                                  sOperand = this.getRegOperand((bModRM >> 3) & 0x7, type, dbgAddr);
                              }
                              else {
                                  sOperand = this.getModRMOperand(bModRM, type, dbgAddr);
                              }
                          }
                          else if (typeMode == Debugger.TYPE_ONE) {
                              sOperand = "1";
                          }
                          else if (typeMode == Debugger.TYPE_IMM) {
                              sOperand = this.getImmOperand(type, dbgAddr);
                          }
                          else if (typeMode == Debugger.TYPE_IMMOFF) {
                              if (!dbgAddr.fAddr32) {
                                  cch = 4;
                                  offset = this.getShort(dbgAddr, 2);
                              } else {
                                  cch = 8;
                                  offset = this.getLong(dbgAddr, 4);
                              }
                              sOperand = "[" + str.toHex(offset, cch) + "]";
                          }
                          else if (typeMode == Debugger.TYPE_IMMREL) {
                              if (typeSize == Debugger.TYPE_BYTE) {
                                  disp = ((this.getByte(dbgAddr, 1) << 24) >> 24);
                              }
                              else {
                                  disp = this.getWord(dbgAddr, true);
                              }
                              offset = (dbgAddr.off + disp) & (dbgAddr.fData32? -1 : 0xffff);
                              var aSymbol = this.findSymbolAtAddr(this.newAddr(offset, dbgAddr.sel));
                              sOperand = aSymbol[0] || str.toHex(offset, dbgAddr.fData32? 8: 4);
                          }
                          else if (typeMode == Debugger.TYPE_IMPREG) {
                              sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, type, dbgAddr);
                          }
                          else if (typeMode == Debugger.TYPE_IMPSEG) {
                              sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, Debugger.TYPE_SEGREG, dbgAddr);
                          }
                          else if (typeMode == Debugger.TYPE_DSSI) {
                              sOperand = "DS:[SI]";
                          }
                          else if (typeMode == Debugger.TYPE_ESDI) {
                              sOperand = "ES:[DI]";
                          }
                          if (!sOperand || !sOperand.length) {
                              sOperands = "INVALID";
                              break;
                          }
                          if (sOperands.length > 0) sOperands += ",";
                          sOperands += sOperand;
                      }
              
                      var sLine = this.hexAddr(dbgAddrIns) + " ";
                      var sBytes = "";
                      do {
                          sBytes += str.toHex(this.getByte(dbgAddrIns, 1), 2);
                      } while (dbgAddrIns.addr != dbgAddr.addr);
              
                      sLine += str.pad(sBytes, 16);
                      sLine += str.pad(sOpcode, 8);
                      if (sOperands) sLine += " " + sOperands;
              
                      if (this.cpu.model < Debugger.CPUS[typeCPU]) {
                          sComment = Debugger.CPUS[typeCPU] + " CPU only";
                      }
              
                      if (sComment && fNonPrefix) {
                          sLine = str.pad(sLine, 56) + ';' + sComment;
                          if (!this.cpu.aFlags.fChecksum) {
                              sLine += (nSequence != null? '=' + nSequence.toString() : "");
                          } else {
                              var nCycles = this.cpu.getCycles();
                              sLine += "cycles=" + nCycles.toString() + " cs=" + str.toHex(this.cpu.aCounts.nChecksum);
                          }
                      }
              
                      this.initAddrSize(dbgAddr, fNonPrefix);
                      return sLine;
                  };
              
                  /**
                   * getImmOperand(type, dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {number} type
                   * @param {{DbgAddr}} dbgAddr
                   * @return {string} operand
                   */
                  Debugger.prototype.getImmOperand = function(type, dbgAddr)
                  {
                      var sOperand = " ";
                      var typeSize = type & Debugger.TYPE_SIZE;
                      switch (typeSize) {
                      case Debugger.TYPE_BYTE:
                          /*
                           * There's the occasional immediate byte we don't need to display (eg, the 0x0A
                           * following an AAM or AAD instruction), so we suppress the byte if it lacks a TYPE_IN
                           * or TYPE_OUT designation (and TYPE_BOTH, as the name implies, includes both).
                           */
                          if (type & Debugger.TYPE_BOTH) {
                              sOperand = str.toHex(this.getByte(dbgAddr, 1), 2);
                          }
                          break;
                      case Debugger.TYPE_SBYTE:
                          sOperand = str.toHex((this.getByte(dbgAddr, 1) << 24) >> 24, 4);
                          break;
                      case Debugger.TYPE_VWORD:
                      case Debugger.TYPE_2WORD:
                          if (dbgAddr.fData32) {
                              sOperand = str.toHex(this.getLong(dbgAddr, 4));
                              break;
                          }
                          /* falls through */
                      case Debugger.TYPE_WORD:
                          sOperand = str.toHex(this.getShort(dbgAddr, 2), 4);
                          break;
                      case Debugger.TYPE_FARP:
                          sOperand = this.hexAddr(this.newAddr(this.getWord(dbgAddr, true), this.getShort(dbgAddr, 2), null, dbgAddr.fData32, dbgAddr.fAddr32));
                          break;
                      default:
                          sOperand = "imm(" + str.toHexWord(type) + ")";
                          break;
                      }
                      return sOperand;
                  };
              
                  /**
                   * getRegOperand(bReg, type, dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {number} bReg
                   * @param {number} type
                   * @param {{DbgAddr}} dbgAddr
                   * @return {string} operand
                   */
                  Debugger.prototype.getRegOperand = function(bReg, type, dbgAddr)
                  {
                      var typeMode = type & Debugger.TYPE_MODE;
                      if (typeMode == Debugger.TYPE_SEGREG) {
                          if (bReg > Debugger.REG_GS ||
                              bReg >= Debugger.REG_FS && this.cpu.model < X86.MODEL_80386) return "??";
                          bReg += Debugger.REG_SEG;
                      }
                      else if (typeMode == Debugger.TYPE_CTLREG) {
                          bReg += Debugger.REG_CR0;
                      }
                      else {
                          var typeSize = type & Debugger.TYPE_SIZE;
                          if (typeSize >= Debugger.TYPE_WORD) {
                              if (bReg < Debugger.REG_AX) {
                                  bReg += Debugger.REG_AX - Debugger.REG_AL;
                              }
                              if (typeSize == Debugger.TYPE_DWORD || typeSize == Debugger.TYPE_VWORD && dbgAddr.fData32) {
                                  bReg += Debugger.REG_EAX - Debugger.REG_AX;
                              }
                          }
                      }
                      return Debugger.REGS[bReg];
                  };
              
                  /**
                   * getSIBOperand(bMod, dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {number} bMod
                   * @param {{DbgAddr}} dbgAddr
                   * @return {string} operand
                   */
                  Debugger.prototype.getSIBOperand = function(bMod, dbgAddr)
                  {
                      var bSIB = this.getByte(dbgAddr, 1);
                      var bScale = bSIB >> 6;
                      var bIndex = (bSIB >> 3) & 0x7;
                      var bBase = bSIB & 0x7;
                      var sOperand = "";
                      if (bMod || bBase != 5) {
                          sOperand = Debugger.RMS[bBase + 8];
                      }
                      if (bIndex != 4) {
                          if (sOperand) sOperand += '+';
                          sOperand += Debugger.RMS[bIndex + 8];
                          if (bScale) sOperand += '*' + (0x1 << bScale);
                      }
                      return sOperand;
                  };
              
                  /**
                   * getModRMOperand(bModRM, type, dbgAddr)
                   *
                   * @this {Debugger}
                   * @param {number} bModRM
                   * @param {number} type
                   * @param {{DbgAddr}} dbgAddr
                   * @return {string} operand
                   */
                  Debugger.prototype.getModRMOperand = function(bModRM, type, dbgAddr)
                  {
                      var sOperand = "";
                      var bMod = bModRM >> 6;
                      var bRM = bModRM & 0x7;
                      if (bMod < 3) {
                          var disp;
                          if (!bMod && (!dbgAddr.fAddr32 && bRM == 6 || dbgAddr.fAddr32 && bRM == 5)) {
                              bMod = 2;
                          } else {
                              if (dbgAddr.fAddr32) {
                                  if (bRM != 4) {
                                      bRM += 8;
                                  } else {
                                      sOperand = this.getSIBOperand(bMod, dbgAddr);
                                  }
                              }
                              if (!sOperand) sOperand = Debugger.RMS[bRM];
                          }
                          if (bMod == 1) {
                              disp = this.getByte(dbgAddr, 1);
                              if (!(disp & 0x80)) {
                                  sOperand += "+" + str.toHex(disp, 2);
                              }
                              else {
                                  disp = ((disp << 24) >> 24);
                                  sOperand += "-" + str.toHex(-disp, 2);
                              }
                          }
                          else if (bMod == 2) {
                              if (sOperand) sOperand += '+';
                              if (!dbgAddr.fAddr32) {
                                  disp = this.getShort(dbgAddr, 2);
                                  sOperand += str.toHex(disp, 4);
                              } else {
                                  disp = this.getLong(dbgAddr, 4);
                                  sOperand += str.toHex(disp);
                              }
                          }
                          sOperand = "[" + sOperand + "]";
                          if ((type & Debugger.TYPE_SIZE) == Debugger.TYPE_FARP) sOperand = "FAR " + sOperand;
                      }
                      else {
                          sOperand = this.getRegOperand(bRM, type, dbgAddr);
                      }
                      return sOperand;
                  };
              
                  /**
                   * parseInstruction(sOp, sOperand, addr)
                   *
                   * This generally requires an exact match of both the operation code (sOp) and mode operand
                   * (sOperand) against the aOps[] and aOpMods[] arrays, respectively; however, the regular
                   * expression built from aOpMods and stored in regexOpModes does relax the matching criteria
                   * slightly; ie, a 4-digit hex value ("nnnn") will be satisfied with either 3 or 4 digits, and
                   * similarly, a 2-digit hex address (nn) will be satisfied with either 1 or 2 digits.
                   *
                   * Note that this function does not actually store the instruction into memory, even though it requires
                   * a target address (addr); that parameter is currently needed ONLY for "branch" instructions, because in
                   * order to calculate the branch displacement, it needs to know where the instruction will ultimately be
                   * stored, relative to its target address.
                   *
                   * Another handy feature of this function is its ability to display all available modes for a particular
                   * operation. For example, while in "assemble mode", if one types:
                   *
                   *      ldy?
                   *
                   * the Debugger will display:
                   *
                   *      supported opcodes:
                   *           A0: LDY nn
                   *           A4: LDY [nn]
                   *           AC: LDY [nnnn]
                   *           B4: LDY [nn+X]
                   *           BC: LDY [nnnn+X]
                   *
                   * Use of a trailing "?" on any opcode will display all variations of that opcode; no instruction will be
                   * assembled, and the operand parameter, if any, will be ignored.
                   *
                   * Although this function is capable of reporting numerous errors, roughly half of them indicate internal
                   * consistency errors, not user errors; the former should really be asserts, but I'm not comfortable bombing
                   * out because of my error as opposed to their error.  The only errors a user should expect to see:
                   *
                   *      "unknown operation":    sOp is not a valid operation (per aOps)
                   *      "unknown operand":      sOperand is not a valid operand (per aOpMods)
                   *      "unknown instruction":  the combination of sOp + sOperand does not exist (per aaOpDescs)
                   *      "branch out of range":  the branch address, relative to addr, is too far away
                   *
                   * @this {Debugger}
                   * @param {string} sOp
                   * @param {string|undefined} sOperand
                   * @param {{DbgAddr}} dbgAddr of memory where this instruction is being assembled
                   * @return {Array.<number>} of opcode bytes; if the instruction can't be parsed, the array will be empty
                   */
                  Debugger.prototype.parseInstruction = function(sOp, sOperand, dbgAddr)
                  {
                      var aOpBytes = [];
                      this.println("not supported yet");
                      return aOpBytes;
                  };
              
                  /**
                   * getFlagStr(sFlag)
                   *
                   * @this {Debugger}
                   * @param {string} sFlag
                   * @return {string} value of flag
                   */
                  Debugger.prototype.getFlagStr = function(sFlag)
                  {
                      var b;
                      switch (sFlag) {
                      case "V":
                          b = this.cpu.getOF();
                          break;
                      case "D":
                          b = this.cpu.getDF();
                          break;
                      case "I":
                          b = this.cpu.getIF();
                          break;
                      case "T":
                          b = this.cpu.getTF();
                          break;
                      case "S":
                          b = this.cpu.getSF();
                          break;
                      case "Z":
                          b = this.cpu.getZF();
                          break;
                      case "A":
                          b = this.cpu.getAF();
                          break;
                      case "P":
                          b = this.cpu.getPF();
                          break;
                      case "C":
                          b = this.cpu.getCF();
                          break;
                      default:
                          b = 0;
                          break;
                      }
                      return sFlag + (b? '1' : '0') + ' ';
                  };
              
                  /**
                   * getRegString(iReg)
                   *
                   * @this {Debugger}
                   * @param {number} iReg
                   * @return {string}
                   */
                  Debugger.prototype.getRegString = function(iReg)
                  {
                      if (iReg >= Debugger.REG_AX && iReg <= Debugger.REG_DI && this.cchReg > 4) iReg += Debugger.REG_EAX - Debugger.REG_AX;
                      var sReg = Debugger.REGS[iReg];
                      if (iReg == Debugger.REG_CR0 && this.cpu.model == X86.MODEL_80286) sReg = "MS";
                      return sReg + '=' + this.getRegValue(iReg) + ' ';
                  };
              
                  /**
                   * getSegString(seg, fProt)
                   *
                   * @this {Debugger}
                   * @param {X86Seg} seg
                   * @param {boolean} [fProt]
                   * @return {string}
                   */
                  Debugger.prototype.getSegString = function(seg, fProt)
                  {
                      return seg.sName + '=' + str.toHex(seg.sel, 4) + (fProt? '[' + str.toHex(seg.base, this.cchAddr) + ',' + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4) + ']' : "");
                  };
              
                  /**
                   * getDTRString(sName, sel, addr, addrLimit)
                   *
                   * @this {Debugger}
                   * @param {string} sName
                   * @param {number|null} sel
                   * @param {number} addr
                   * @param {number} addrLimit
                   * @return {string}
                   */
                  Debugger.prototype.getDTRString = function(sName, sel, addr, addrLimit)
                  {
                      return sName + '=' + (sel != null? str.toHex(sel, 4) : "") + '[' + str.toHex(addr, this.cchAddr) + ',' + str.toHex(addrLimit - addr, 4) + ']';
                  };
              
                  /**
                   * getRegDump(fProt)
                   *
                   * Sample 8086 and 80286 real-mode register dump:
                   *
                   *      AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
                   *      SS=0000 DS=0000 ES=0000 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                   *      F000:FFF0 EA5BE000F0    JMP      F000:E05B
                   *
                   * Sample 80386 real-mode register dump:
                   *
                   *      EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
                   *      ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
                   *      SS=0000 DS=0000 ES=0000 FS=0000 GS=0000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                   *      F000:FFF0 EA05F900F0    JMP      F000:F905
                   *
                   * Sample 80286 protected-mode register dump:
                   *
                   *      AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
                   *      SS=0000[000000,FFFF] DS=0000[000000,FFFF] ES=0000[000000,FFFF] A20=ON
                   *      CS=F000[FF0000,FFFF] LD=0000[000000,FFFF] GD=[000000,FFFF] ID=[000000,03FF]
                   *      TR=0000 MS=FFF0 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                   *      F000:FFF0 EA5BE000F0    JMP      F000:E05B
                   *
                   * Sample 80386 protected-mode register dump:
                   *
                   *      EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
                   *      ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
                   *      SS=0000[00000000,FFFF] DS=0000[00000000,FFFF] ES=0000[00000000,FFFF]
                   *      CS=F000[FFFF0000,FFFF] FS=0000[00000000,FFFF] GS=0000[00000000,FFFF]
                   *      LD=0000[00000000,FFFF] GD=[00000000,FFFF] ID=[00000000,03FF] TR=0000 A20=ON
                   *      CR0=00000010 CR2=00000000 CR3=00000000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                   *      F000:0000FFF0 EA05F900F0    JMP      F000:0000F905
                   *
                   * This no longer includes CS in real-mode (or EIP in any mode), because that information can be obtained from the
                   * first line of disassembly, which an "r" or "rp" command will also display.
                   *
                   * Note that even when the processor is in real mode, you can always use the "rp" command to force a protected-mode
                   * dump, in case you need to verify any selector base or limit values, since those do affect real-mode operation.
                   *
                   * @this {Debugger}
                   * @param {boolean} [fProt]
                   * @return {string}
                   */
                  Debugger.prototype.getRegDump = function(fProt)
                  {
                      var s;
                      if (fProt === undefined) {
                          fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
                      }
                      s = this.getRegString(Debugger.REG_AX) +
                          this.getRegString(Debugger.REG_BX) +
                          this.getRegString(Debugger.REG_CX) +
                          this.getRegString(Debugger.REG_DX) + (this.cchReg > 4? '\n' : '') +
                          this.getRegString(Debugger.REG_SP) +
                          this.getRegString(Debugger.REG_BP) +
                          this.getRegString(Debugger.REG_SI) +
                          this.getRegString(Debugger.REG_DI) + '\n' +
                          this.getSegString(this.cpu.segSS, fProt) + ' ' +
                          this.getSegString(this.cpu.segDS, fProt) + ' ' +
                          this.getSegString(this.cpu.segES, fProt) + ' ';
                      if (fProt) {
                          var sTR = "TR=" + str.toHex(this.cpu.segTSS.sel, 4);
                          var sA20 = "A20=" + (this.bus.getA20()? "ON " : "OFF ");
                          if (this.cpu.model < X86.MODEL_80386) {
                              sTR = '\n' + sTR;
                              s += sA20; sA20 = '';
                          }
                          s += '\n' + this.getSegString(this.cpu.segCS, fProt) + ' ';
                          if (I386 && this.cpu.model >= X86.MODEL_80386) {
                              sA20 += '\n';
                              s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
                                   this.getSegString(this.cpu.segGS, fProt) + '\n';
                          }
                          s += this.getDTRString("LD", this.cpu.segLDT.sel, this.cpu.segLDT.base, this.cpu.segLDT.base + this.cpu.segLDT.limit) + ' ' +
                               this.getDTRString("GD", null, this.cpu.addrGDT, this.cpu.addrGDTLimit) + ' ' +
                               this.getDTRString("ID", null, this.cpu.addrIDT, this.cpu.addrIDTLimit) + ' ';
                          s += sTR + ' ' + sA20;
                          s += this.getRegString(Debugger.REG_CR0);
                          if (I386 && this.cpu.model >= X86.MODEL_80386) {
                              s += this.getRegString(Debugger.REG_CR2) + this.getRegString(Debugger.REG_CR3);
                          }
                      } else {
                          if (I386 && this.cpu.model >= X86.MODEL_80386) {
                              s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
                                   this.getSegString(this.cpu.segGS, fProt) + ' ';
                          }
                      }
                      s += this.getRegString(Debugger.REG_PS) +
                           this.getFlagStr("V") + this.getFlagStr("D") + this.getFlagStr("I") + this.getFlagStr("T") +
                           this.getFlagStr("S") + this.getFlagStr("Z") + this.getFlagStr("A") + this.getFlagStr("P") + this.getFlagStr("C");
                      return s;
                  };
              
                  /**
                   * parseAddr(sAddr, type)
                   *
                   * As discussed above, dbgAddr variables contain one or more of: off, sel, and addr.  They represent
                   * a segmented address (sel:off) when sel is defined or a linear address (addr) when sel is undefined
                   * (or null).
                   *
                   * To create a segmented address, specify two values separated by ":"; for a linear address, use
                   * a "%" prefix.  We check for ":" after "%", so if for some strange reason you specify both, the
                   * address will be treated as segmented, not linear.
                   *
                   * The "%" syntax is similar to that used by the Windows 80386 kernel debugger (wdeb386) for linear
                   * addresses.  If/when we add support for processors with page tables, we will likely adopt the same
                   * convention for linear addresses and provide a different syntax (eg, "%%") physical memory references.
                   *
                   * Address evaluation and validation (eg, range checks) are no longer performed at this stage.  That's
                   * done later, by getAddr(), which returns X86.ADDR_INVALID for invalid segments, out-of-range offsets,
                   * etc.  The Debugger's low-level get/set memory functions verify all getAddr() results, but even if an
                   * invalid address is passed through to the Bus memory interfaces, the address will simply be masked with
                   * Bus.nBusLimit; in the case of X86.ADDR_INVALID, that will generally refer to the top of the physical
                   * address space.
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sAddr
                   * @param {number|undefined} type is the address segment type, in case sAddr doesn't specify a segment
                   * @return {{DbgAddr}}
                   */
                  Debugger.prototype.parseAddr = function(sAddr, type)
                  {
                      var dbgAddr;
                      var dbgAddrNext = (type == Debugger.ADDR_DATA? this.dbgAddrNextData : this.dbgAddrNextCode);
                      var off = dbgAddrNext.off, sel = dbgAddrNext.sel, addr = dbgAddrNext.addr;
              
                      if (sAddr !== undefined) {
              
                          if (sAddr.charAt(0) == '%') {
                              sAddr = sAddr.substr(1);
                              off = 0;
                              sel = null;
                              addr = 0;
                          }
              
                          dbgAddr = this.findSymbolAddr(sAddr);
                          if (dbgAddr && dbgAddr.off != null) return dbgAddr;
              
                          var iColon = sAddr.indexOf(":");
                          if (iColon < 0) {
                              if (sel != null) {
                                  off = this.parseValue(sAddr);
                                  addr = null;
                              } else {
                                  addr = this.parseValue(sAddr);
                              }
                          }
                          else {
                              sel = this.parseValue(sAddr.substring(0, iColon));
                              off = this.parseValue(sAddr.substring(iColon + 1));
                              addr = null;
                          }
                      }
              
                      dbgAddr = this.newAddr(off, sel, addr);
                      this.checkLimit(dbgAddr);
                      return dbgAddr;
                  };
              
                  /**
                   * parseValue(sValue, sName)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sValue
                   * @param {string} [sName] is the name of the value, if any
                   * @return {number|undefined} numeric value, or undefined if sValue is either undefined or invalid
                   */
                  Debugger.prototype.parseValue = function(sValue, sName)
                  {
                      var value;
                      if (sValue !== undefined) {
                          var iReg = this.getRegIndex(sValue);
                          if (iReg >= 0) sValue = this.getRegValue(iReg);
                          value = str.parseInt(sValue);
                          if (value === undefined) this.println("invalid " + (sName? sName : "value") + ": " + sValue);
                      } else {
                          this.println("missing " + (sName || "value"));
                      }
                      return value;
                  };
              
                  /**
                   * addSymbols(addr, size, aSymbols)
                   *
                   * As filedump.js (formerly convrom.php) explains, aSymbols is a JSON-encoded object whose properties consist
                   * of all the symbols (in upper-case), and the values of those properties are objects containing any or all of
                   * the following properties:
                   *
                   *      "v": the value of an absolute (unsized) value
                   *      "b": either 1, 2, 4 or undefined if an unsized value
                   *      "s": either a hard-coded segment or undefined
                   *      "o": the offset of the symbol within the associated address space
                   *      "l": the original-case version of the symbol, present only if it wasn't originally upper-case
                   *      "a": annotation for the specified offset; eg, the original assembly language, with optional comment
                   *
                   * To that list of properties, we also add:
                   *
                   *      "p": the physical address (calculated whenever both "s" and "o" properties are defined)
                   *
                   * Note that values for any "v", "b", "s" and "o" properties are unquoted decimal values, and the values
                   * for any "l" or "a" properties are quoted strings. Also, if double-quotes were used in any of the original
                   * annotation ("a") values, they will have been converted to two single-quotes, so we're responsible for
                   * converting them back to individual double-quotes.
                   *
                   * For example:
                   *      {
                   *          "HF_PORT": {
                   *              "v":800
                   *          },
                   *          "HDISK_INT": {
                   *              "b":4, "s":0, "o":52
                   *          },
                   *          "ORG_VECTOR": {
                   *              "b":4, "s":0, "o":76
                   *          },
                   *          "CMD_BLOCK": {
                   *              "b":1, "s":64, "o":66
                   *          },
                   *          "DISK_SETUP": {
                   *              "o":3
                   *          },
                   *          ".40": {
                   *              "o":40, "a":"MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR"
                   *          }
                   *      }
                   *
                   * If a symbol only has an offset, then that offset value can be assigned to the symbol property directly:
                   *
                   *          "DISK_SETUP": 3
                   *
                   * The last property is an example of an "anonymous" entry, for offsets where there is no associated symbol.
                   * Such entries are identified by a period followed by a unique number (usually the offset of the entry), and
                   * they usually only contain offset ("o") and annotation ("a") properties.  I could eliminate the leading
                   * period, but it offers a very convenient way of quickly discriminating among genuine vs. anonymous symbols.
                   *
                   * We add all these entries to our internal symbol table, which is an array of 4-element arrays, each of which
                   * look like:
                   *
                   *      [addr, size, aSymbols, aOffsetPairs]
                   *
                   * There are two basic symbol operations: findSymbolAddr(), which takes a string and attempts to match it
                   * to a non-anonymous symbol with a matching offset ("o") property, and findSymbolAtAddr(), which takes an
                   * address and finds the symbol, if any, at that address.
                   *
                   * To implement findSymbolAtAddr() efficiently, addSymbols() creates an array of [offset, sSymbol] pairs
                   * (aOffsetPairs), one pair for each symbol that corresponds to an offset within the specified address space.
                   *
                   * We guarantee the elements of aOffsetPairs are in offset order, because we build it using binaryInsert();
                   * it's quite likely that the MAP file already ordered all its symbols in offset order, but since they're
                   * hand-edited files, we can't assume that.  This insures that findSymbolAtAddr()'s binarySearch() will operate
                   * properly.
                   *
                   * @this {Debugger}
                   * @param {number} addr is the physical address of the region where the given symbols are located
                   * @param {number} size is the size of the region, in bytes
                   * @param {Object} aSymbols is the collection of symbols (the format of this object is described below)
                   */
                  Debugger.prototype.addSymbols = function(addr, size, aSymbols)
                  {
                      var dbgAddr = {};
                      var aOffsetPairs = [];
                      var fnComparePairs = function(p1, p2) {
                          return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
                      };
                      for (var sSymbol in aSymbols) {
                          var symbol = aSymbols[sSymbol];
                          if (typeof symbol == "number") {
                              aSymbols[sSymbol] = symbol = {'o': symbol};
                          }
                          var off = symbol['o'];
                          var sel = symbol['s'];
                          var sAnnotation = symbol['a'];
                          if (off !== undefined) {
                              if (sel !== undefined) {
                                  dbgAddr.off = off;
                                  dbgAddr.sel = sel;
                                  dbgAddr.addr = null;
                                  /*
                                   * getAddr() computes the corresponding physical address and saves it in dbgAddr.addr.
                                   */
                                  this.getAddr(dbgAddr);
                                  /*
                                   * The physical address for any symbol located in the top 64Kb of the machine's address space
                                   * should be relocated to the top 64Kb of the first 1Mb, so that we're immune from any changes
                                   * to the A20 line.
                                   */
                                  if ((dbgAddr.addr & ~0xffff) == (this.bus.nBusLimit & ~0xffff)) {
                                      dbgAddr.addr &= 0x000fffff;
                                  }
                                  symbol['p'] = dbgAddr.addr;
                              }
                              usr.binaryInsert(aOffsetPairs, [off, sSymbol], fnComparePairs);
                          }
                          if (sAnnotation) symbol['a'] = sAnnotation.replace(/''/g, "\"");
                      }
                      this.aSymbolTable.push([addr, size, aSymbols, aOffsetPairs]);
                  };
              
                  /**
                   * dumpSymbols()
                   *
                   * TODO: Add "numerical" and "alphabetical" dump options. This is simply dumping them in whatever
                   * order they appeared in the original MAP file.
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.dumpSymbols = function()
                  {
                      for (var i = 0; i < this.aSymbolTable.length; i++) {
                          var addr = this.aSymbolTable[i][0];
                        //var size = this.aSymbolTable[i][1];
                          var aSymbols = this.aSymbolTable[i][2];
                          for (var sSymbol in aSymbols) {
                              if (sSymbol.charAt(0) == '.') continue;
                              var symbol = aSymbols[sSymbol];
                              var off = symbol['o'];
                              if (off === undefined) continue;
                              var sel = symbol['s'];
                              if (sel === undefined) sel = (addr >>> 4);
                              var sSymbolOrig = aSymbols[sSymbol]['l'];
                              if (sSymbolOrig) sSymbol = sSymbolOrig;
                              this.println(this.hexOffset(off, sel) + " " + sSymbol);
                          }
                      }
                  };
              
                  /**
                   * findSymbolAddr(sSymbol)
                   *
                   * Search aSymbolTable for sSymbol, and if found, return a dbgAddr (same as parseAddr())
                   *
                   * @this {Debugger}
                   * @param {string} sSymbol
                   * @return {{DbgAddr}|null} a valid dbgAddr if a valid symbol, an empty dbgAddr if an unknown symbol, or null if not a symbol
                   */
                  Debugger.prototype.findSymbolAddr = function(sSymbol)
                  {
                      var dbgAddr = null;
                      if (sSymbol.match(/^[a-z_][a-z0-9_]*$/i)) {
                          dbgAddr = {};
                          var sUpperCase = sSymbol.toUpperCase();
                          for (var i = 0; i < this.aSymbolTable.length; i++) {
                              var addr = this.aSymbolTable[i][0];
                              //var size = this.aSymbolTable[i][1];
                              var aSymbols = this.aSymbolTable[i][2];
                              var symbol = aSymbols[sUpperCase];
                              if (symbol !== undefined) {
                                  var off = symbol['o'];
                                  if (off !== undefined) {
                                      /*
                                       * We assume that every ROM is ORG'ed at 0x0000, and therefore unless the symbol has an
                                       * explicitly-defined segment, we return the segment as "addr >>> 4".  Down the road, we may
                                       * want/need to support a special symbol entry (eg, ".ORG") that defines an alternate origin.
                                       */
                                      var sel = symbol['s'];
                                      if (sel === undefined) sel = addr >>> 4;
                                      // dbgAddr = this.newAddr(off, sel);
                                      dbgAddr.off = off;
                                      dbgAddr.sel = sel;
                                      if (symbol['p'] !== undefined) dbgAddr.addr = symbol['p'];
                                  }
                                  /*
                                   * The symbol matched, but it wasn't for an address (no "o" offset), and there's no point
                                   * looking any farther, since each symbol appears only once, so we indicate it's an unknown symbol.
                                   */
                                  break;
                              }
                          }
                      }
                      return dbgAddr;
                  };
              
                  /**
                   * findSymbolAtAddr(dbgAddr, fNearest)
                   *
                   * Search aSymbolTable for dbgAddr, and return an Array for the corresponding symbol (empty if not found).
                   *
                   * If fNearest is true, and no exact match was found, then the Array returned will contain TWO sets of
                   * entries: [0]-[3] will refer to closest preceding symbol, and [4]-[7] will refer to the closest subsequent symbol.
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fNearest]
                   * @return {Array|null} where [0] == symbol name, [1] == symbol value, [2] == any annotation, and [3] == any associated comment
                   */
                  Debugger.prototype.findSymbolAtAddr = function(dbgAddr, fNearest)
                  {
                      var aSymbol = [];
                      var addr = this.getAddr(dbgAddr);
                      for (var iTable = 0; iTable < this.aSymbolTable.length; iTable++) {
                          var addrSymbol = this.aSymbolTable[iTable][0];
                          var sizeSymbol = this.aSymbolTable[iTable][1];
                          if (addr >= addrSymbol && addr < addrSymbol + sizeSymbol) {
                              var offset = dbgAddr.off;
                              var aOffsetPairs = this.aSymbolTable[iTable][3];
                              var fnComparePairs = function(p1, p2)
                              {
                                  return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
                              };
                              var result = usr.binarySearch(aOffsetPairs, [offset], fnComparePairs);
                              if (result >= 0) {
                                  this.returnSymbol(iTable, result, aSymbol);
                              }
                              else if (fNearest) {
                                  result = ~result;
                                  this.returnSymbol(iTable, result-1, aSymbol);
                                  this.returnSymbol(iTable, result, aSymbol);
                              }
                              break;
                          }
                      }
                      return aSymbol;
                  };
              
                  /**
                   * returnSymbol(iTable, iOffset, aSymbol)
                   *
                   * Helper function for findSymbolAtAddr().
                   *
                   * @param {number} iTable
                   * @param {number} iOffset
                   * @param {Array} aSymbol is updated with the specified symbol, if it exists
                   */
                  Debugger.prototype.returnSymbol = function(iTable, iOffset, aSymbol)
                  {
                      var symbol = {};
                      var aOffsetPairs = this.aSymbolTable[iTable][3];
                      var offset = 0, sSymbol = null;
                      if (iOffset >= 0 && iOffset < aOffsetPairs.length) {
                          offset = aOffsetPairs[iOffset][0];
                          sSymbol = aOffsetPairs[iOffset][1];
                      }
                      if (sSymbol) {
                          symbol = this.aSymbolTable[iTable][2][sSymbol];
                          sSymbol = (sSymbol.charAt(0) == '.'? null : (symbol['l'] || sSymbol));
                      }
                      aSymbol.push(sSymbol);
                      aSymbol.push(offset);
                      aSymbol.push(symbol['a']);
                      aSymbol.push(symbol['c']);
                  };
              
                  /**
                   * doHelp()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.doHelp = function()
                  {
                      var s = "commands:";
                      for (var sCommand in Debugger.COMMANDS) {
                          s += '\n' + str.pad(sCommand, 7) + Debugger.COMMANDS[sCommand];
                      }
                      if (!this.checksEnabled()) s += "\nnote: frequency/history disabled if no exec breakpoints";
                      this.println(s);
                  };
              
                  /**
                   * doAssemble(asArgs)
                   *
                   * This always receives the complete argument array, where the order of the arguments is:
                   *
                   *      [0]: the assemble command (assumed to be "a")
                   *      [1]: the target address (eg, "200")
                   *      [2]: the operation code, aka instruction name (eg, "adc")
                   *      [3]: the operation mode operand, if any (eg, "14", "[1234]", etc)
                   *
                   * The Debugger enters "assemble mode" whenever only the first (or first and second) arguments are present.
                   * As long as "assemble mode is active, the user can omit the first two arguments on all later assemble commands
                   * until "assemble mode" is cancelled with an empty command line; the command processor automatically prepends "a"
                   * and the next available target address to the argument array.
                   *
                   * Entering "assemble mode" is optional; one could enter a series of fully-qualified assemble commands; eg:
                   *
                   *      a ff00 cld
                   *      a ff01 ldx 28
                   *      ...
                   *
                   * without ever entering "assemble mode", but of course, that requires more typing and doesn't take advantage
                   * of automatic target address advancement (see dbgAddrAssemble).
                   *
                   * NOTE: As the previous example implies, you can even assemble new instructions into ROM address space;
                   * as our setByte() function explains, the ROM write-notification handlers only refuse writes from the CPU.
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs is the complete argument array, beginning with the "a" command in asArgs[0]
                   */
                  Debugger.prototype.doAssemble = function(asArgs)
                  {
                      var dbgAddr = this.parseAddr(asArgs[1], Debugger.ADDR_CODE);
                      if (dbgAddr.off == null) return;
              
                      this.dbgAddrAssemble = dbgAddr;
                      if (asArgs[2] === undefined) {
                          this.println("begin assemble @" + this.hexAddr(dbgAddr));
                          this.fAssemble = true;
                          this.cpu.updateCPU();
                          return;
                      }
              
                      var aOpBytes = this.parseInstruction(asArgs[2], asArgs[3], dbgAddr);
                      if (aOpBytes.length) {
                          for (var i = 0; i < aOpBytes.length; i++) {
                              this.setByte(dbgAddr, aOpBytes[i], 1);
                          }
                          /*
                           * Since getInstruction() also updates the specified address, dbgAddrAssemble is automatically advanced.
                           */
                          this.println(this.getInstruction(this.dbgAddrAssemble));
                      }
                  };
              
                  /**
                   * doBreak(sCmd, sAddr)
                   *
                   * As the "help" output below indicates, the following breakpoint commands are supported:
                   *
                   *      bp [a]  set exec breakpoint on linear addr [a]
                   *      br [a]  set read breakpoint on linear addr [a]
                   *      bw [a]  set write breakpoint on linear addr [a]
                   *      bc [a]  clear breakpoint on linear addr [a] (use "*" for all breakpoints)
                   *      bl      list breakpoints
                   *
                   * to which we have recently added the following I/O breakpoint commands:
                   *
                   *      bi [p]  toggle input breakpoint on port [p] (use "*" for all input ports)
                   *      bo [p]  toggle output breakpoint on port [p] (use "*" for all output ports)
                   *
                   * These two new commands operate as toggles so that if "*" is used to trap all input (or output),
                   * you can also use these commands to NOT trap specific ports.
                   *
                   * @this {Debugger}
                   * @param {string} sCmd
                   * @param {string} [sAddr]
                   */
                  Debugger.prototype.doBreak = function(sCmd, sAddr)
                  {
                      var sParm = sCmd.charAt(1);
                      if (!sParm || sParm == "?") {
                          this.println("\nbreakpoint commands:");
                          this.println("\tbi [p]\ttoggle break on input port [p]");
                          this.println("\tbo [p]\ttoggle break on output port [p]");
                          this.println("\tbp [a]\tset exec breakpoint at addr [a]");
                          this.println("\tbr [a]\tset read breakpoint at addr [a]");
                          this.println("\tbw [a]\tset write breakpoint at addr [a]");
                          this.println("\tbc [a]\tclear breakpoint at addr [a]");
                          this.println("\tbl\tlist all breakpoints");
                          return;
                      }
                      if (sParm == "l") {
                          var cBreaks = 0;
                          cBreaks += this.listBreakpoints(this.aBreakExec);
                          cBreaks += this.listBreakpoints(this.aBreakRead);
                          cBreaks += this.listBreakpoints(this.aBreakWrite);
                          if (!cBreaks) this.println("no breakpoints");
                          return;
                      }
                      if (sAddr === undefined) {
                          this.println("missing breakpoint address");
                          return;
                      }
                      var dbgAddr = {};
                      if (sAddr != "*") {
                          dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                          if (dbgAddr.off == null) return;
                      }
                      sAddr = (dbgAddr.off == null? sAddr : str.toHexWord(dbgAddr.off));
                      if (sParm == "c") {
                          if (dbgAddr.off == null) {
                              this.clearBreakpoints();
                              this.println("all breakpoints cleared");
                              return;
                          }
                          if (this.findBreakpoint(this.aBreakExec, dbgAddr, true))
                              return;
                          if (this.findBreakpoint(this.aBreakRead, dbgAddr, true))
                              return;
                          if (this.findBreakpoint(this.aBreakWrite, dbgAddr, true))
                              return;
                          this.println("breakpoint missing: " + this.hexAddr(dbgAddr));
                          return;
                      }
                      if (sParm == "i") {
                          this.println("breakpoint " + (this.bus.addPortInputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (input)");
                          return;
                      }
                      if (sParm == "o") {
                          this.println("breakpoint " + (this.bus.addPortOutputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (output)");
                          return;
                      }
                      if (dbgAddr.off == null) return;
                      if (sParm == "p") {
                          this.addBreakpoint(this.aBreakExec, dbgAddr);
                          return;
                      }
                      if (sParm == "r") {
                          this.addBreakpoint(this.aBreakRead, dbgAddr);
                          return;
                      }
                      if (sParm == "w") {
                          this.addBreakpoint(this.aBreakWrite, dbgAddr);
                          return;
                      }
                      this.println("unknown breakpoint command: " + sParm);
                  };
              
                  /**
                   * doClear(sCmd)
                   *
                   * @this {Debugger}
                   * @param {string} sCmd (eg, "cls" or "clear")
                   */
                  Debugger.prototype.doClear = function(sCmd)
                  {
                      /*
                       * TODO: There should be a clear() component method that the Control Panel overrides to perform this function.
                       */
                      if (this.controlPrint) this.controlPrint.value = "";
                  };
              
                  /**
                   * doDump(sCmd, sAddr, sLen)
                   *
                   * While sLen is interpreted as a number of bytes or words, it's converted to the appropriate number of lines,
                   * because we always display whole lines.  If sLen is omitted/undefined, then we default to 8 lines, regardless
                   * whether dumping bytes or words.
                   *
                   * Also, unlike sAddr, sLen is interpreted as a decimal number, unless a radix specifier is included (eg, "0x100");
                   * sLen also supports the DEBUG.COM-style syntax of a preceding "l" (eg, "l16").
                   *
                   * @this {Debugger}
                   * @param {string} sCmd
                   * @param {string|undefined} sAddr
                   * @param {string|undefined} sLen (if present, it can be preceded by an "l", which we simply ignore)
                   */
                  Debugger.prototype.doDump = function(sCmd, sAddr, sLen)
                  {
                      var m;
                      if (sAddr == "?") {
                          var sDumpers = "";
                          for (m in Debugger.MESSAGES) {
                              if (this.afnDumpers[m]) {
                                  if (sDumpers) sDumpers += ",";
                                  sDumpers = sDumpers + m;
                              }
                          }
                          sDumpers += ",state,symbols";
                          this.println("\ndump commands:");
                          this.println("\tdb [a] [#]    dump # bytes at address a");
                          this.println("\tdw [a] [#]    dump # words at address a");
                          this.println("\tdd [a] [#]    dump # dwords at address a");
                          this.println("\tdh [#]        dump # instructions prior");
                          if (BACKTRACK) this.println("\tdi [a]        dump backtrack info at address a");
                          if (sDumpers.length) this.println("dump extensions:\n\t" + sDumpers);
                          return;
                      }
                      if (sAddr == "state") {
                          this.println(this.cmp.powerOff(true));
                          return;
                      }
                      if (sAddr == "symbols") {
                          this.dumpSymbols();
                          return;
                      }
                      if (sCmd == "dh") {
                          this.dumpHistory(sAddr);
                          return;
                      }
                      if (sCmd == "ds") {     // transform a "ds" command into a "d desc" command
                          sCmd = 'd';
                          sLen = sAddr;
                          sAddr = "desc";
                      }
                      for (m in Debugger.MESSAGES) {
                          if (sAddr == m) {
                              var fnDumper = this.afnDumpers[m];
                              if (fnDumper) {
                                  fnDumper(sLen);
                              } else {
                                  this.println("no dump registered for " + sAddr);
                              }
                              return;
                          }
                      }
                      var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
                      if (dbgAddr.off == null || dbgAddr.sel == null && dbgAddr.addr == null) return;
              
                      var sDump = "";
                      if (BACKTRACK && sCmd == "di") {
                          var addr = this.getAddr(dbgAddr);
                          sDump += '%' + str.toHex(addr) + ": ";
                          var sInfo = this.bus.getBackTrackInfoFromAddr(addr);
                          sDump += sInfo || "no information";
                      }
                      else {
                          var cLines = 0;
                          var cBytes = (sCmd == "dd"? 4 : (sCmd == "dw"? 2 : 1));
                          var cNumbers = (16 / cBytes)|0;
                          if (sLen) {
                              if (sLen.charAt(0) == "l") sLen = sLen.substr(1);
                              cLines = +sLen;
                              if (cLines) cLines = ((cLines + cNumbers - 1) / cNumbers)|0;
                          }
                          if (!cLines) cLines = 8;
                          for (var iLine = 0; iLine < cLines; iLine++) {
                              var data = 0, iByte = 0;
                              var sData = "", sChars = "";
                              sAddr = this.hexAddr(dbgAddr);
                              for (var i = 0; i < 16; i++) {
                                  var b = this.getByte(dbgAddr, 1);
                                  data |= (b << (iByte++ << 3));
                                  if (iByte == cBytes) {
                                      sData += str.toHex(data, cBytes * 2);
                                      sData += (cBytes == 1? (i == 7? '-' : ' ') : "  ");
                                      data = iByte = 0;
                                  }
                                  sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                              }
                              if (sDump) sDump += "\n";
                              sDump += sAddr + "  " + sData + " " + sChars;
                          }
                      }
                      if (sDump) this.println(sDump);
                      this.dbgAddrNextData = dbgAddr;
                  };
              
                  /**
                   * doEdit(asArgs)
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs
                   */
                  Debugger.prototype.doEdit = function(asArgs)
                  {
                      var sAddr = asArgs[1];
                      if (sAddr === undefined) {
                          this.println("missing address");
                          return;
                      }
                      var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
                      if (dbgAddr.off == null) return;
                      for (var i = 2; i < asArgs.length; i++) {
                          var b = str.parseInt(asArgs[i], 16);
                          if (b === undefined) {
                              this.println("unrecognized value: " + str.toHexByte(b));
                              break;
                          }
                          this.println("setting " + this.hexAddr(dbgAddr) + " to " + str.toHexByte(b));
                          this.setByte(dbgAddr, b, 1);
                      }
                  };
              
                  /**
                   * doFreqs(sParm)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sParm
                   */
                  Debugger.prototype.doFreqs = function(sParm)
                  {
                      if (sParm == "?") {
                          this.println("\nfrequency commands:");
                          this.println("\tclear\tclear all frequency counts");
                          return;
                      }
                      var i;
                      var cData = 0;
                      if (this.aaOpcodeCounts) {
                          if (sParm == "clear") {
                              for (i = 0; i < this.aaOpcodeCounts.length; i++)
                                  this.aaOpcodeCounts[i] = [i, 0];
                              this.println("frequency data cleared");
                              cData++;
                          }
                          else if (sParm !== undefined) {
                              this.println("unknown frequency command: " + sParm);
                              cData++;
                          }
                          else {
                              var aaSortedOpcodeCounts = this.aaOpcodeCounts.slice();
                              aaSortedOpcodeCounts.sort(function(p, q) {
                                  return q[1] - p[1];
                              });
                              for (i = 0; i < aaSortedOpcodeCounts.length; i++) {
                                  var bOpcode = aaSortedOpcodeCounts[i][0];
                                  var cFreq = aaSortedOpcodeCounts[i][1];
                                  if (cFreq) {
                                      this.println((Debugger.INS_NAMES[this.aaOpDescs[bOpcode][0]] + "  ").substr(0, 5) + " (" + str.toHexByte(bOpcode) + "): " + cFreq + " times");
                                      cData++;
                                  }
                              }
                          }
                      }
                      if (!cData) {
                          this.println("no frequency data available");
                      }
                  };
              
                  /**
                   * doHalt(sCount)
                   *
                   * If the CPU is running and no count is provided, we halt the CPU; otherwise we treat this as a history command.
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
                   */
                  Debugger.prototype.doHalt = function(sCount)
                  {
                      if (this.aFlags.fRunning && sCount === undefined) {
                          this.println("halting");
                          this.stopCPU();
                          return;
                      }
                      this.dumpHistory(sCount);
                  };
              
                  /**
                   * doInfo(asArgs)
                   *
                   * Prints the contents of the Debugger's instruction trace buffer.
                   *
                   * Examples:
                   *
                   *      n shl
                   *      n shl on
                   *      n shl off
                   *      n dump 100
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs
                   * @return {boolean} true only if the instruction info command ("n") is supported
                   */
                  Debugger.prototype.doInfo = function(asArgs)
                  {
                      if (DEBUG) {
                          var sCategory = asArgs[1];
                          if (sCategory !== undefined) {
                              sCategory = sCategory.toUpperCase();
                          }
                          var sEnable = asArgs[2];
                          var fPrint = false;
                          if (sCategory == "DUMP") {
                              var sDump = "";
                              var cLines = (sEnable === undefined? -1 : +sEnable);
                              var i = this.iTraceBuffer;
                              do {
                                  var s = this.aTraceBuffer[i++];
                                  if (s !== undefined) {
                                      /*
                                       * The browser is MUCH happier if we buffer all the lines for one single enormous print
                                       *
                                       *      this.println(s);
                                       */
                                      sDump += (sDump? "\n" : "") + s;
                                      cLines--;
                                  }
                                  if (i >= this.aTraceBuffer.length)
                                      i = 0;
                              } while (cLines && i != this.iTraceBuffer);
                              if (!sDump) sDump = "nothing to dump";
                              this.println(sDump);
                              this.println("msPerYield: " + this.cpu.aCounts.msPerYield);
                              this.println("nCyclesPerBurst: " + this.cpu.aCounts.nCyclesPerBurst);
                              this.println("nCyclesPerYield: " + this.cpu.aCounts.nCyclesPerYield);
                              this.println("nCyclesPerVideoUpdate: " + this.cpu.aCounts.nCyclesPerVideoUpdate);
                              this.println("nCyclesPerStatusUpdate: " + this.cpu.aCounts.nCyclesPerStatusUpdate);
                          } else {
                              var fEnable = (sEnable == "on");
                              for (var prop in this.traceEnabled) {
                                  var trace = Debugger.TRACE[prop];
                                  if (sCategory === undefined || sCategory == "ALL" || sCategory == Debugger.INS_NAMES[trace.ins]) {
                                      if (fEnable !== undefined) {
                                          this.traceEnabled[prop] = fEnable;
                                      }
                                      this.println(Debugger.INS_NAMES[trace.ins] + trace.size + ": " + (this.traceEnabled[prop]? "on" : "off"));
                                      fPrint = true;
                                  }
                              }
                              if (!fPrint) this.println("no match");
                          }
                          return true;
                      }
                      return false;
                  };
              
                  /**
                   * doInput(sPort)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sPort
                   */
                  Debugger.prototype.doInput = function(sPort)
                  {
                      if (!sPort || sPort == "?") {
                          this.println("\ninput commands:");
                          this.println("\ti [p]\tread port [p]");
                          /*
                           * TODO: Regarding this warning, consider adding an "unchecked" version of
                           * bus.checkPortInputNotify(), since all Debugger memory accesses are unchecked, too.
                           *
                           * All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
                           * but changing them all to be non-destructive would take time, and situations where you
                           * actually want to affect the hardware state are just as likely as not....
                           */
                          this.println("warning: port accesses can affect hardware state");
                          return;
                      }
                      var port = this.parseValue(sPort);
                      if (port !== undefined) {
                          var bIn = this.bus.checkPortInputNotify(port);
                          this.println(str.toHexWord(port) + ": " + str.toHexByte(bIn));
                      }
                  };
              
                  /**
                   * doList(sSymbol)
                   *
                   * @this {Debugger}
                   * @param {string} sSymbol
                   */
                  Debugger.prototype.doList = function(sSymbol)
                  {
                      var dbgAddr = this.parseAddr(sSymbol, Debugger.ADDR_CODE);
              
                      if (dbgAddr.off == null && dbgAddr.addr == null) return;
              
                      var addr = this.getAddr(dbgAddr);
                      sSymbol = sSymbol? (sSymbol + ": ") : "";
                      this.println(sSymbol + this.hexAddr(dbgAddr) + " (%" + str.toHex(addr, this.cchAddr) + ")");
              
                      var aSymbol = this.findSymbolAtAddr(dbgAddr, true);
                      if (aSymbol.length) {
                          var nDelta, sDelta;
                          if (aSymbol[0]) {
                              sDelta = "";
                              nDelta = dbgAddr.off - aSymbol[1];
                              if (nDelta) sDelta = " + " + str.toHexWord(nDelta);
                              this.println(aSymbol[0] + " (" + this.hexOffset(aSymbol[1], dbgAddr.sel) + ")" + sDelta);
                          }
                          if (aSymbol.length > 4 && aSymbol[4]) {
                              sDelta = "";
                              nDelta = aSymbol[5] - dbgAddr.off;
                              if (nDelta) sDelta = " - " + str.toHexWord(nDelta);
                              this.println(aSymbol[4] + " (" + this.hexOffset(aSymbol[5], dbgAddr.sel) + ")" + sDelta);
                          }
                      } else {
                          this.println("no symbols");
                      }
                  };
              
                  /**
                   * doLoad(asArgs)
                   *
                   * The format of this command mirrors the DOS DEBUG "L" command:
                   *
                   *      l [address] [drive #] [sector #] [# sectors]
                   *
                   * The only optional parameter is the last, which defaults to 1 sector if not specified.
                   *
                   * As a quick-and-dirty way of getting the current contents of a disk image as a JSON dump
                   * (which you can then save as .json disk image file), I also allow this command format:
                   *
                   *      l json [drive #]
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs
                   */
                  Debugger.prototype.doLoad = function(asArgs)
                  {
                      if (asArgs[0] == 'l' && asArgs[1] === undefined || asArgs[1] == "?") {
                          this.println("\nlist/load commands:");
                          this.println("\tl [address] [drive #] [sector #] [# sectors]");
                          this.println("\tln [address] lists symbol(s) nearest to address");
                          return;
                      }
              
                      if (asArgs[0] == "ln") {
                          this.doList(asArgs[1]);
                          return;
                      }
              
                      var fJSON = (asArgs[1] == "json");
                      var iDrive, iSector = 0, nSectors = 0;
                      var dbgAddr = (fJSON? {} : this.parseAddr(asArgs[1], Debugger.ADDR_DATA));
              
                      iDrive = this.parseValue(asArgs[2], "drive #");
                      if (iDrive === undefined) return;
                      if (!fJSON) {
                          iSector = this.parseValue(asArgs[3], "sector #");
                          if (iSector === undefined) return;
                          nSectors = this.parseValue(asArgs[4], "# of sectors");
                          if (nSectors === undefined) nSectors = 1;
                      }
              
                      /*
                       * We choose the disk controller very simplistically: FDC for drives 0 or 1, and HDC for drives 2
                       * and up, unless no HDC is present, in which case we assume FDC for all drive numbers.
                       *
                       * Both controllers must obviously support the same interfaces; ie, copyDrive(), seekDrive(),
                       * and readByte().  We also rely on the disk property to determine whether the drive is "loaded".
                       *
                       * In the case of the HDC, if the drive is valid, then by definition it is also "loaded", since an HDC
                       * drive and its disk are inseparable; it's certainly possible that its disk object may be empty at
                       * this point, but that will only affect whether the read succeeds or not.
                       */
                      var dc = this.fdc;
                      if (iDrive >= 2 && this.hdc) {
                          iDrive -= 2;
                          dc = this.hdc;
                      }
                      if (dc) {
                          var drive = dc.copyDrive(iDrive);
                          if (drive) {
                              if (drive.disk) {
                                  if (fJSON) {
                                      /*
                                       * This is an interim solution to dumping disk images in JSON.  It has many problems, the
                                       * "biggest" being that the large disk images really need to be compressed first, because they
                                       * get "inflated" with use.  See the dump() method in the Disk component for more details.
                                       */
                                      this.println(drive.disk.toJSON());
                                      return;
                                  }
                                  if (dc.seekDrive(drive, iSector, nSectors)) {
                                      var cb = 0;
                                      var fAbort = false;
                                      var sAddr = this.hexAddr(dbgAddr);
                                      while (!fAbort && drive.nBytes-- > 0) {
                                          (function(dbg, dbgAddrCur) {
                                              dc.readByte(drive, function(b, fAsync) {
                                                  if (b < 0) {
                                                      dbg.println("out of data at address " + dbg.hexAddr(dbgAddrCur));
                                                      fAbort = true;
                                                      return;
                                                  }
                                                  dbg.setByte(dbgAddrCur, b, 1);
                                                  cb++;
                                              });
                                          }(this, dbgAddr));
                                      }
                                      this.println(cb + " bytes read at " + sAddr);
                                  } else {
                                      this.println("sector " + iSector + " request out of range");
                                  }
                              } else {
                                  this.println("drive " + iDrive + " not loaded");
                              }
                          } else {
                              this.println("invalid drive: " + iDrive);
                          }
                      } else {
                          this.println("disk controller not present");
                      }
                  };
              
                  /**
                   * doMessages(asArgs)
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs
                   */
                  Debugger.prototype.doMessages = function(asArgs)
                  {
                      var m;
                      var fCriteria = null;
                      var sCategory = asArgs[1];
                      if (sCategory == "?") sCategory = undefined;
              
                      if (sCategory !== undefined) {
                          var bitsMessage = 0;
                          if (sCategory == "all") {
                              bitsMessage = (0xffffffff|0) & ~(Messages.HALT | Messages.KEYS | Messages.LOG);
                              sCategory = null;
                          } else if (sCategory == "on") {
                              fCriteria = true;
                              sCategory = null;
                          } else if (sCategory == "off") {
                              fCriteria = false;
                              sCategory = null;
                          } else {
                              if (sCategory == "keys") sCategory = "key";
                              if (sCategory == "kbd") sCategory = "keyboard";
                              for (m in Debugger.MESSAGES) {
                                  if (sCategory == m) {
                                      bitsMessage = Debugger.MESSAGES[m];
                                      fCriteria = !!(this.bitsMessage & bitsMessage);
                                      break;
                                  }
                              }
                              if (!bitsMessage) {
                                  this.println("unknown message category: " + sCategory);
                                  return;
                              }
                          }
                          if (bitsMessage) {
                              if (asArgs[2] == "on") {
                                  this.bitsMessage |= bitsMessage;
                                  fCriteria = true;
                              }
                              else if (asArgs[2] == "off") {
                                  this.bitsMessage &= ~bitsMessage;
                                  fCriteria = false;
                              }
                          }
                      }
              
                      /*
                       * Display those message categories that match the current criteria (on or off)
                       */
                      var n = 0;
                      var sCategories = "";
                      for (m in Debugger.MESSAGES) {
                          if (!sCategory || sCategory == m) {
                              var bitMessage = Debugger.MESSAGES[m];
                              var fEnabled = !!(this.bitsMessage & bitMessage);
                              if (fCriteria !== null && fCriteria != fEnabled) continue;
                              if (sCategories) sCategories += ",";
                              if (!(++n % 10)) sCategories += "\n\t";     // jshint ignore:line
                              if (m == "key") m = "keys";
                              sCategories += m;
                          }
                      }
              
                      if (sCategory === undefined) {
                          this.println("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");
                      }
              
                      this.println((fCriteria !== null? (fCriteria? "messages on:  " : "messages off: ") : "message categories:\n\t") + (sCategories || "none"));
                  };
              
                  /**
                   * doExecOptions(asArgs)
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} asArgs
                   */
                  Debugger.prototype.doExecOptions = function(asArgs)
                  {
                      if (asArgs[1] === undefined || asArgs[1] == "?") {
                          this.println("\nexecution options:");
                          this.println("\tcs int #\tset checksum cycle interval to #");
                          this.println("\tcs start #\tset checksum cycle start count to #");
                          this.println("\tcs stop #\tset checksum cycle stop count to #");
                          this.println("\tsp #\t\tset speed multiplier to #");
                          return;
                      }
                      switch (asArgs[1]) {
                          case "cs":
                              var nCycles;
                              if (asArgs[3] !== undefined) nCycles = +asArgs[3];
                              switch (asArgs[2]) {
                                  case "int":
                                      this.cpu.aCounts.nCyclesChecksumInterval = nCycles;
                                      break;
                                  case "start":
                                      this.cpu.aCounts.nCyclesChecksumStart = nCycles;
                                      break;
                                  case "stop":
                                      this.cpu.aCounts.nCyclesChecksumStop = nCycles;
                                      break;
                                  default:
                                      this.println("unknown cs option");
                                      return;
                              }
                              if (nCycles !== undefined) {
                                  this.cpu.resetChecksum();
                              }
                              this.println("checksums " + (this.cpu.aFlags.fChecksum? "enabled" : "disabled"));
                              break;
                          case "sp":
                              if (asArgs[2] !== undefined) {
                                  this.cpu.setSpeed(+asArgs[2]);
                              }
                              this.println("target speed: " + this.cpu.getSpeedTarget() + " (" + this.cpu.getSpeed() + "x)");
                              break;
                          default:
                              this.println("unknown option: " + asArgs[1]);
                              break;
                      }
                  };
              
                  /**
                   * doOutput(sPort, sByte)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sPort
                   * @param {string|undefined} sByte (string representation of 1 byte)
                   */
                  Debugger.prototype.doOutput = function(sPort, sByte)
                  {
                      if (!sPort || sPort == "?") {
                          this.println("\noutput commands:");
                          this.println("\to [p] [b]\twrite byte [b] to port [p]");
                          /*
                           * TODO: Regarding this warning, consider adding an "unchecked" version of
                           * bus.checkPortOutputNotify(), since all Debugger memory accesses are unchecked, too.
                           *
                           * All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
                           * but changing them all to be non-destructive would take time, and situations where you
                           * actually want to affect the hardware state are just as likely as not....
                           */
                          this.println("warning: port accesses can affect hardware state");
                          return;
                      }
                      var port = this.parseValue(sPort, "port #");
                      var bOut = this.parseValue(sByte);
                      if (port !== undefined && bOut !== undefined) {
                          this.bus.checkPortOutputNotify(port, bOut);
                          this.println(str.toHexWord(port) + ": " + str.toHexByte(bOut));
                      }
                  };
              
                  /**
                   * doRegisters(asArgs, fCompact)
                   *
                   * @this {Debugger}
                   * @param {Array.<string>} [asArgs]
                   * @param {boolean} [fCompact]
                   */
                  Debugger.prototype.doRegisters = function(asArgs, fCompact)
                  {
                      if (asArgs && asArgs[1] == "?") {
                          this.println("\nregister commands:");
                          this.println("\tr\t\tdisplay all registers");
                          this.println("\tr [target=#]\tmodify target register");
                          this.println("supported targets:");
                          this.println("\tall registers and flags V,D,I,S,Z,A,P,C");
                          return;
                      }
                      var fIns = true, fProt;
                      if (asArgs != null && asArgs.length > 1) {
                          var sReg = asArgs[1];
                          if (sReg == 'p') {
                              fProt = (this.cpu.model >= X86.MODEL_80286);
                          } else {
                           // fIns = false;
                              var sValue = null;
                              var i = sReg.indexOf("=");
                              if (i > 0) {
                                  sValue = sReg.substr(i + 1);
                                  sReg = sReg.substr(0, i);
                              }
                              else if (asArgs.length > 2) {
                                  sValue = asArgs[2];
                              }
                              else {
                                  this.println("missing value for " + asArgs[1]);
                                  return;
                              }
                              var fValid = false;
                              var w = str.parseInt(sValue, 16);
                              if (!isNaN(w)) {
                                  fValid = true;
                                  var sRegMatch = sReg.toUpperCase();
                                  if (sRegMatch.charAt(0) == 'E' && this.cchReg <= 4) {
                                      sRegMatch = null;
                                  }
                                  switch (sRegMatch) {
                                  case "AL":
                                      this.cpu.regEAX = (this.cpu.regEAX & ~0xff) | (w & 0xff);
                                      break;
                                  case "AH":
                                      this.cpu.regEAX = (this.cpu.regEAX & ~0xff00) | ((w << 8) & 0xff);
                                      break;
                                  case "AX":
                                      this.cpu.regEAX = (this.cpu.regEAX & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "BL":
                                      this.cpu.regEBX = (this.cpu.regEBX & ~0xff) | (w & 0xff);
                                      break;
                                  case "BH":
                                      this.cpu.regEBX = (this.cpu.regEBX & ~0xff00) | ((w << 8) & 0xff);
                                      break;
                                  case "BX":
                                      this.cpu.regEBX = (this.cpu.regEBX & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "CL":
                                      this.cpu.regECX = (this.cpu.regECX & ~0xff) | (w & 0xff);
                                      break;
                                  case "CH":
                                      this.cpu.regECX = (this.cpu.regECX & ~0xff00) | ((w << 8) & 0xff);
                                      break;
                                  case "CX":
                                      this.cpu.regECX = (this.cpu.regECX & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "DL":
                                      this.cpu.regEDX = (this.cpu.regEDX & ~0xff) | (w & 0xff);
                                      break;
                                  case "DH":
                                      this.cpu.regEDX = (this.cpu.regEDX & ~0xff00) | ((w << 8) & 0xff);
                                      break;
                                  case "DX":
                                      this.cpu.regEDX = (this.cpu.regEDX & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "SP":
                                      this.cpu.setSP((this.cpu.getSP() & ~0xffff) | (w & 0xffff));
                                      break;
                                  case "BP":
                                      this.cpu.regEBP = (this.cpu.regEBP & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "SI":
                                      this.cpu.regESI = (this.cpu.regESI & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "DI":
                                      this.cpu.regEDI = (this.cpu.regEDI & ~0xffff) | (w & 0xffff);
                                      break;
                                  case "DS":
                                      this.cpu.setDS(w);
                                      break;
                                  case "ES":
                                      this.cpu.setES(w);
                                      break;
                                  case "SS":
                                      this.cpu.setSS(w);
                                      break;
                                  case "CS":
                                   // fIns = true;
                                      this.cpu.setCS(w);
                                      this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                                      break;
                                  case "IP":
                                   // fIns = true;
                                      this.cpu.setIP(w);
                                      this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                                      break;
                                  /*
                                   * I used to alias "PC" to "IP", until I discovered that early (perhaps ALL) versions of
                                   * DEBUG.COM treat "PC" as an alias for the 16-bit flags register.  I, of course, prefer "PS".
                                   */
                                  case "PC":
                                  case "PS":
                                      this.cpu.setPS(w);
                                      break;
                                  case "C":
                                      if (w) this.cpu.setCF(); else this.cpu.clearCF();
                                      break;
                                  case "P":
                                      if (w) this.cpu.setPF(); else this.cpu.clearPF();
                                      break;
                                  case "A":
                                      if (w) this.cpu.setAF(); else this.cpu.clearAF();
                                      break;
                                  case "Z":
                                      if (w) this.cpu.setZF(); else this.cpu.clearZF();
                                      break;
                                  case "S":
                                      if (w) this.cpu.setSF(); else this.cpu.clearSF();
                                      break;
                                  case "I":
                                      if (w) this.cpu.setIF(); else this.cpu.clearIF();
                                      break;
                                  case "D":
                                      if (w) this.cpu.setDF(); else this.cpu.clearDF();
                                      break;
                                  case "V":
                                      if (w) this.cpu.setOF(); else this.cpu.clearOF();
                                      break;
                                  default:
                                      var fUnknown = true;
                                      if (this.cpu.model >= X86.MODEL_80286) {
                                          fUnknown = false;
                                          switch(sRegMatch){
                                          case "MS":
                                              this.cpu.setMSW(w);
                                              break;
                                          case "TR":
                                              if (this.cpu.segTSS.load(w, true) === X86.ADDR_INVALID) {
                                                  fValid = false;
                                              }
                                              break;
                                          /*
                                           * TODO: Add support for GDTR (addr and limit), IDTR (addr and limit), and perhaps
                                           * even the ability to edit descriptor information associated with each segment register.
                                           */
                                          default:
                                              fUnknown = true;
                                              if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                                  fUnknown = false;
                                                  switch(sRegMatch){
                                                  case "EAX":
                                                      this.cpu.regEAX = w;
                                                      break;
                                                  case "EBX":
                                                      this.cpu.regEBX = w;
                                                      break;
                                                  case "ECX":
                                                      this.cpu.regECX = w;
                                                      break;
                                                  case "EDX":
                                                      this.cpu.regEDX = w;
                                                      break;
                                                  case "ESP":
                                                      this.cpu.setSP(w);
                                                      break;
                                                  case "EBP":
                                                      this.cpu.regEBP = w;
                                                      break;
                                                  case "ESI":
                                                      this.cpu.regESI = w;
                                                      break;
                                                  case "EDI":
                                                      this.cpu.regEDI = w;
                                                      break;
                                                  case "FS":
                                                      this.cpu.setFS(w);
                                                      break;
                                                  case "GS":
                                                      this.cpu.setGS(w);
                                                      break;
                                                  case "CR0":
                                                      this.cpu.regCR0 = w;
                                                      break;
                                                  case "CR2":
                                                      this.cpu.regCR2 = w;
                                                      break;
                                                  case "CR3":
                                                      this.cpu.regCR3 = w;
                                                      break;
                                                  /*
                                                   * TODO: Add support for DR0-DR7 and TR6-TR7.
                                                   */
                                                  default:
                                                      fUnknown = true;
                                                      break;
                                                  }
                                              }
                                              break;
                                          }
                                      }
                                      if (fUnknown) {
                                          this.println("unknown register: " + sReg);
                                          return;
                                      }
                                  }
                              }
                              if (!fValid) {
                                  this.println("invalid value: " + sValue);
                                  return;
                              }
                              this.cpu.updateCPU();
                              this.println("\nupdated registers:");
                              fCompact = true;
                          }
                      }
              
                      this.println((fCompact? '' : '\n') + this.getRegDump(fProt));
              
                      if (fIns) {
                          this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                          this.doUnassemble(this.hexAddr(this.dbgAddrNextCode));
                      }
                  };
              
                  /**
                   * doRun(sAddr)
                   *
                   * @this {Debugger}
                   * @param {string} sAddr
                   */
                  Debugger.prototype.doRun = function(sAddr)
                  {
                      if (sAddr !== undefined) {
                          var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                          if (dbgAddr.off == null) return;
                          this.setTempBreakpoint(dbgAddr);
                      }
                      if (!this.runCPU(true)) {
                          this.println('cpu busy, "g" command ignored');
                      }
                  };
              
                  /**
                   * doProcStep(sCmd)
                   *
                   * @this {Debugger}
                   * @param {string} [sCmd] "p" or "pr"
                   */
                  Debugger.prototype.doProcStep = function(sCmd)
                  {
                      var fCallStep = true;
                      var fRegs = (sCmd == "pr"? 1 : 0);
                      /*
                       * Set up the value for this.fProcStep (ie, 1 or 2) depending on whether the user wants
                       * a subsequent register dump ("pr") or not ("p").
                       */
                      var fProcStep = 1 + fRegs;
                      if (!this.fProcStep) {
                          var fPrefix;
                          var fRepeat = false;
                          var dbgAddr = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                          do {
                              fPrefix = false;
                              var bOpcode = this.getByte(dbgAddr);
                              switch (bOpcode) {
                              case X86.OPCODE.ES:
                              case X86.OPCODE.CS:
                              case X86.OPCODE.SS:
                              case X86.OPCODE.DS:
                              case X86.OPCODE.FS:     // I386 only
                              case X86.OPCODE.GS:     // I386 only
                              case X86.OPCODE.OS:     // I386 only
                              case X86.OPCODE.AS:     // I386 only
                              case X86.OPCODE.LOCK:
                                  this.incAddr(dbgAddr, 1);
                                  fPrefix = true;
                                  break;
                              case X86.OPCODE.INT3:
                              case X86.OPCODE.INTO:
                                  this.fProcStep = fProcStep;
                                  this.incAddr(dbgAddr, 1);
                                  break;
                              case X86.OPCODE.INTn:
                              case X86.OPCODE.LOOPNZ:
                              case X86.OPCODE.LOOPZ:
                              case X86.OPCODE.LOOP:
                                  this.fProcStep = fProcStep;
                                  this.incAddr(dbgAddr, 2);
                                  break;
                              case X86.OPCODE.CALL:
                                  if (fCallStep) {
                                      this.fProcStep = fProcStep;
                                      this.incAddr(dbgAddr, 3);
                                  }
                                  break;
                              case X86.OPCODE.CALLF:
                                  if (fCallStep) {
                                      this.fProcStep = fProcStep;
                                      this.incAddr(dbgAddr, 5);
                                  }
                                  break;
                              case X86.OPCODE.GRP4W:
                                  if (fCallStep) {
                                      var w = this.getWord(dbgAddr) & X86.OPCODE.CALLMASK;
                                      this.fProcStep = ((w == X86.OPCODE.CALLW || w == X86.OPCODE.CALLFDW)? fProcStep : 0);
                                  }
                                  break;
                              case X86.OPCODE.REPZ:
                              case X86.OPCODE.REPNZ:
                                  this.incAddr(dbgAddr, 1);
                                  fRepeat = fPrefix = true;
                                  break;
                              case X86.OPCODE.INSB:
                              case X86.OPCODE.INSW:
                              case X86.OPCODE.OUTSB:
                              case X86.OPCODE.OUTSW:
                              case X86.OPCODE.MOVSB:
                              case X86.OPCODE.MOVSW:
                              case X86.OPCODE.CMPSB:
                              case X86.OPCODE.CMPSW:
                              case X86.OPCODE.STOSB:
                              case X86.OPCODE.STOSW:
                              case X86.OPCODE.LODSB:
                              case X86.OPCODE.LODSW:
                              case X86.OPCODE.SCASB:
                              case X86.OPCODE.SCASW:
                                  if (fRepeat) {
                                      this.fProcStep = fProcStep;
                                      this.incAddr(dbgAddr, 1);
                                  }
                                  break;
                              default:
                                  break;
                              }
                          } while (fPrefix);
              
                          if (this.fProcStep) {
                              this.setTempBreakpoint(dbgAddr);
                              if (!this.runCPU()) {
                                  this.cpu.setFocus();
                                  this.fProcStep = 0;
                              }
                              /*
                               * A successful run will ultimately call stop(), which will in turn call clearTempBreakpoint(),
                               * which will clear fProcStep, so there's your assurance that fProcStep will be reset.  Now we may
                               * have stopped for reasons unrelated to the temporary breakpoint, but that's OK.
                               */
                          } else {
                              this.doStep(fRegs? "tr" : "t");
                          }
                      } else {
                          this.println("step in progress");
                      }
                  };
              
                  /**
                   * getCall(dbgAddr, fFar)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} [fFar]
                   * @return {string|null} CALL instruction at or near dbgAddr, or null if none
                   */
                  Debugger.prototype.getCall = function(dbgAddr, fFar)
                  {
                      var sCall = null;
                      var off = dbgAddr.off;
                      var offOrig = off;
                      for (var n = 1; n <= 6; n++) {
                          if (n > 2) {
                              dbgAddr.off = off;
                              dbgAddr.addr = null;
                              var s = this.getInstruction(dbgAddr);
                              if (s.indexOf("CALL") > 0 || fFar && s.indexOf("INT") > 0) {
                                  sCall = s;
                                  break;
                              }
                          }
                          if (!--off) break;
                      }
                      dbgAddr.off = offOrig;
                      return sCall;
                  };
              
                  /**
                   * doStackTrace()
                   *
                   * @this {Debugger}
                   */
                  Debugger.prototype.doStackTrace = function()
                  {
                      var nFrames = 10, cFrames = 0;
                      var selCode = this.cpu.segCS.sel;
                      var dbgAddrCall = this.newAddr();
                      var dbgAddrStack = this.newAddr(this.cpu.getSP(), this.cpu.getSS());
                      this.println("stack trace for " + this.hexAddr(dbgAddrStack));
                      while (cFrames < nFrames) {
                          var sCall = null, cTests = 256;
                          while ((dbgAddrStack.off >>> 0) < (this.cpu.regLSPLimit >>> 0)) {
                              dbgAddrCall.off = this.getWord(dbgAddrStack, true);
                              /*
                               * Because we're using the auto-increment feature of getWord(), and because that will automatically
                               * wrap the offset around the end of the segment, we must also check the addr property to detect the wrap.
                               */
                              if (dbgAddrStack.addr == null || !cTests--) break;
                              dbgAddrCall.sel = selCode;
                              sCall = this.getCall(dbgAddrCall);
                              if (sCall) {
                                  break;
                              }
                              dbgAddrCall.sel = this.getWord(dbgAddrStack);
                              sCall = this.getCall(dbgAddrCall, true);
                              if (sCall) {
                                  selCode = this.getWord(dbgAddrStack, true);
                                  /*
                                   * It's not strictly necessary that we skip over the flags word that's pushed as part of any INT
                                   * instruction, but it reduces the risk of misinterpreting it as a return address on the next iteration.
                                   */
                                  if (sCall.indexOf("INT") > 0) this.getWord(dbgAddrStack, true);
                                  break;
                              }
                          }
                          if (!sCall) break;
                          sCall = str.pad(sCall, 50) + ";stack=" + this.hexAddr(dbgAddrStack) + " return=" + this.hexAddr(dbgAddrCall);
                          this.println(sCall);
                          cFrames++;
                      }
                      if (!cFrames) this.println("no return addresses found");
                  };
              
                  /**
                   * doStep(sCmd, sCount)
                   *
                   * @this {Debugger}
                   * @param {string} [sCmd] "t" or "tr"
                   * @param {string} [sCount] # of instructions to step
                   */
                  Debugger.prototype.doStep = function(sCmd, sCount)
                  {
                      var dbg = this;
                      var fRegs = (sCmd == "tr");
                      var count = (sCount != null? +sCount : 1);
                      var nCycles = (count == 1? 0 : 1);
                      web.onCountRepeat(
                          count,
                          function onCountStep() {
                              return dbg.setBusy(true) && dbg.stepCPU(nCycles, fRegs, false);
                          },
                          function onCountStepComplete() {
                              /*
                               * We explicitly called stepCPU() with fUpdateCPU === false, because repeatedly
                               * calling updateCPU() can be very slow, especially when fDisplayLiveRegs is true,
                               * so once the repeat count has been exhausted, we must perform a final updateCPU().
                               */
                              dbg.cpu.updateCPU();
                              dbg.setBusy(false);
                          }
                      );
                  };
              
                  /**
                   * initAddrSize(dbgAddr, fNonPrefix)
                   *
                   * @this {Debugger}
                   * @param {{DbgAddr}} dbgAddr
                   * @param {boolean} fNonPrefix
                   */
                  Debugger.prototype.initAddrSize = function(dbgAddr, fNonPrefix)
                  {
                      /*
                       * Use dbgAddr.fOverride to record whether we previously processed any OPERAND or ADDRESS overrides.
                       */
                      dbgAddr.fOverride = (dbgAddr.fData32 || dbgAddr.fAddr32);
                      /*
                       * For proper disassembly of instructions preceded by an OPERAND (0x66) size prefix, we set
                       * dbgAddr.fData32 to true whenever the operand size is 32-bit; similarly, for an ADDRESS (0x67)
                       * size prefix, we set dbgAddr.fAddr32 to true whenever the address size is 32-bit.  Initially,
                       * both fields must be set to match the size of the current code segment.
                       */
                      if (fNonPrefix) {
                          dbgAddr.fData32 = (this.cpu.segCS.dataSize == 4);
                          dbgAddr.fAddr32 = (this.cpu.segCS.addrSize == 4);
                      }
                      /*
                       * We also use dbgAddr.fComplete to record whether the caller (ie, getInstruction()) is reporting that
                       * it processed a complete instruction (ie, a non-prefix) or not.
                       */
                      dbgAddr.fComplete = fNonPrefix;
                  };
              
                  /**
                   * isStringIns(bOpcode)
                   *
                   * @this {Debugger}
                   * @param {number} bOpcode
                   * @return {boolean} true if string instruction, false if not
                   */
                  Debugger.prototype.isStringIns = function(bOpcode)
                  {
                      return (bOpcode >= X86.OPCODE.MOVSB && bOpcode <= X86.OPCODE.CMPSW || bOpcode >= X86.OPCODE.STOSB && bOpcode <= X86.OPCODE.SCASW);
                  };
              
                  /**
                   * doUnassemble(sAddr, sAddrEnd, n)
                   *
                   * @this {Debugger}
                   * @param {string} [sAddr]
                   * @param {string} [sAddrEnd]
                   * @param {number} [n]
                   */
                  Debugger.prototype.doUnassemble = function(sAddr, sAddrEnd, n)
                  {
                      var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                      if (dbgAddr.off == null) return;
              
                      if (n === undefined) n = 1;
                      var dbgAddrEnd = this.newAddr(this.maskReg, dbgAddr.sel, this.bus.nBusLimit);
              
                      var cb = 0x100;
                      if (sAddrEnd !== undefined) {
              
                          dbgAddrEnd = this.parseAddr(sAddrEnd, Debugger.ADDR_CODE);
                          if (dbgAddrEnd.off == null || dbgAddrEnd.off < dbgAddr.off) return;
              
                          cb = dbgAddrEnd.off - dbgAddr.off;
                          if (!DEBUG && cb > 0x100) {
                              /*
                               * Limiting the amount of disassembled code to 256 bytes in non-DEBUG builds is partly to
                               * prevent the user from wedging the browser by dumping too many lines, but also a recognition
                               * that, in non-DEBUG builds, this.println() keeps print output buffer truncated to 8Kb anyway.
                               */
                              this.println("range too large");
                              return;
                          }
                          n = -1;
                      }
              
                      var fBlank = (dbgAddr.off != this.dbgAddrNextCode.off);
              
                      var cLines = 0;
                      this.initAddrSize(dbgAddr, true);
              
                      while (cb > 0 && n--) {
              
                          var bOpcode = this.getByte(dbgAddr);
                          var addr = dbgAddr.addr;
                          var nSequence = (this.isBusy(false) || this.fProcStep)? this.nCycles : null;
                          var sComment = (nSequence != null? "cycles" : null);
                          var aSymbol = this.findSymbolAtAddr(dbgAddr);
              
                          if (aSymbol[0]) {
                              var sLabel = aSymbol[0] + ":";
                              fBlank = false;
                              if (aSymbol[2]) sLabel += " " + aSymbol[2];
                              this.println(sLabel);
                          }
              
                          if (fBlank) this.println();
              
                          if (aSymbol[3]) {
                              sComment = aSymbol[3];
                              nSequence = null;
                          }
              
                          var sIns = this.getInstruction(dbgAddr, sComment, nSequence);
              
                          /*
                           * If getInstruction() reported that it did not yet process a complete instruction (via dbgAddr.fComplete),
                           * then bump the instruction count by one, so that we display one more line (and hopefully the complete
                           * instruction).
                           */
                          if (!dbgAddr.fComplete && !n) n++;
              
                          this.println(sIns);
                          this.dbgAddrNextCode = dbgAddr;
                          cb -= dbgAddr.addr - addr;
                          fBlank = false;
                          cLines++;
                      }
                  };
              
                  /**
                   * parseCommand(sCmd, fSave)
                   *
                   * @this {Debugger}
                   * @param {string|undefined} sCmd
                   * @param {boolean} [fSave] is true to save the command, false if not
                   * @return {Array.<string>}
                   */
                  Debugger.prototype.parseCommand = function(sCmd, fSave)
                  {
                      if (fSave) {
                          if (!sCmd) {
                              sCmd = this.aPrevCmds[this.iPrevCmd+1];
                          } else {
                              if (this.iPrevCmd < 0 && this.aPrevCmds.length) {
                                  this.iPrevCmd = 0;
                              }
                              if (this.iPrevCmd < 0 || sCmd != this.aPrevCmds[this.iPrevCmd]) {
                                  this.aPrevCmds.splice(0, 0, sCmd);
                                  this.iPrevCmd = 0;
                              }
                              this.iPrevCmd--;
                          }
                      }
                      var a = (sCmd? sCmd.split(sCmd.indexOf('|') >= 0? '|' : ';') : ['']);
                      for (var s in a) {
                          a[s] = str.trim(a[s]);
                      }
                      return a;
                  };
              
                  /**
                   * doCommand(sCmd, fQuiet)
                   *
                   * @this {Debugger}
                   * @param {string} sCmd
                   * @param {boolean} [fQuiet]
                   * @return {boolean} true if command processed, false if unrecognized
                   */
                  Debugger.prototype.doCommand = function(sCmd, fQuiet)
                  {
                      var result = true;
              
                      try {
                          if (!sCmd.length) {
                              if (this.fAssemble) {
                                  this.println("ended assemble @" + this.hexAddr(this.dbgAddrAssemble));
                                  this.dbgAddrNextCode = this.dbgAddrAssemble;
                                  this.fAssemble = false;
                              } else {
                                  sCmd = '?';
                              }
                          }
              
                          sCmd = sCmd.toLowerCase();
              
                          /*
                           * I'm going to try relaxing the !isBusy() requirement for doCommand(), to maximize our
                           * ability to issue Debugger commands externally.
                           */
                          if (this.isReady() /* && !this.isBusy(true) */ && sCmd.length > 0) {
              
                              if (this.fAssemble) {
                                  sCmd = "a " + this.hexAddr(this.dbgAddrAssemble) + " " + sCmd;
                              }
                              else {
                                  /*
                                   * Process any "whole" commands here first (eg, "debug", "nodebug", "reset", etc.)
                                   *
                                   * For all other commands, if they lack a space between the command and argument portions,
                                   * insert a space before the first non-alpha character, so that split() will have the desired effect.
                                   */
                                  if (!COMPILED) {
                                      if (sCmd == "debug") {
                                          window.DEBUG = true;
                                          this.println("DEBUG checks on");
                                          return true;
                                      }
                                      else if (sCmd == "nodebug") {
                                          window.DEBUG = false;
                                          this.println("DEBUG checks off");
                                          return true;
                                      }
                                  }
              
                                  var ch, ch0, i;
                                  switch (sCmd) {
                                  case "reset":
                                      if (this.cmp) this.cmp.reset();
                                      return true;
                                  case "ver":
                                      this.println((APPNAME || "PCjs") + " version " + APPVERSION + " (" + this.cpu.model + (COMPILED? ",RELEASE" : (DEBUG? ",DEBUG" : ",NODEBUG")) + (PREFETCH? ",PREFETCH" : ",NOPREFETCH") + (TYPEDARRAYS? ",TYPEDARRAYS" : (FATARRAYS? ",FATARRAYS" : ",LONGARRAYS")) + (BACKTRACK? ",BACKTRACK" : ",NOBACKTRACK") + ")");
                                      return true;
                                  default:
                                      ch0 = sCmd.charAt(0);
                                      for (i = 1; i < sCmd.length; i++) {
                                          ch = sCmd.charAt(i);
                                          if (ch == " ") break;
                                          if (ch0 == "r" || ch < "a" || ch > "z") {
                                              sCmd = sCmd.substring(0, i) + " " + sCmd.substring(i);
                                              break;
                                          }
                                      }
                                      break;
                                  }
                              }
              
                              var asArgs = sCmd.split(" ");
                              switch (asArgs[0].charAt(0)) {
                              case "a":
                                  this.doAssemble(asArgs);
                                  break;
                              case "b":
                                  this.doBreak(asArgs[0], asArgs[1]);
                                  break;
                              case "c":
                                  this.doClear(asArgs[0]);
                                  break;
                              case "d":
                                  this.doDump(asArgs[0], asArgs[1], asArgs[2]);
                                  break;
                              case "e":
                                  this.doEdit(asArgs);
                                  break;
                              case "f":
                                  this.doFreqs(asArgs[1]);
                                  break;
                              case "g":
                                  this.doRun(asArgs[1]);
                                  break;
                              case "h":
                                  this.doHalt(asArgs[1]);
                                  break;
                              case "i":
                                  this.doInput(asArgs[1]);
                                  break;
                              case "k":
                                  this.doStackTrace();
                                  break;
                              case "l":
                                  this.doLoad(asArgs);
                                  break;
                              case "m":
                                  this.doMessages(asArgs);
                                  break;
                              case "o":
                                  this.doOutput(asArgs[1], asArgs[2]);
                                  break;
                              case "p":
                              case "pr":
                                  this.doProcStep(asArgs[0]);
                                  break;
                              case "r":
                                  this.doRegisters(asArgs);
                                  break;
                              case "t":
                              case "tr":
                                  this.doStep(asArgs[0], asArgs[1]);
                                  break;
                              case "u":
                                  this.doUnassemble(asArgs[1], asArgs[2], 8);
                                  break;
                              case "x":
                                  this.doExecOptions(asArgs);
                                  break;
                              case "?":
                                  this.doHelp();
                                  break;
                              case "n":
                                  if (this.doInfo(asArgs)) break;
                                  /* falls through */
                              default:
                                  if (!fQuiet) this.println("unknown command: " + sCmd);
                                  result = false;
                                  break;
                              }
                          }
                      } catch(e) {
                          this.println("debugger error: " + (e.stack || e.message));
                          result = false;
                      }
                      return result;
                  };
              
                  /**
                   * Debugger.init()
                   *
                   * This function operates on every HTML element of class "debugger", extracting the
                   * JSON-encoded parameters for the Debugger constructor from the element's "data-value"
                   * attribute, invoking the constructor to create a Debugger component, and then binding
                   * any associated HTML controls to the new component.
                   */
                  Debugger.init = function()
                  {
                      var aeDbg = Component.getElementsByClass(window.document, PCJSCLASS, "debugger");
                      for (var iDbg = 0; iDbg < aeDbg.length; iDbg++) {
                          var eDbg = aeDbg[iDbg];
                          var parmsDbg = Component.getComponentParms(eDbg);
                          var dbg = new Debugger(parmsDbg);
                          Component.bindComponentControls(dbg, eDbg, PCJSCLASS);
                      }
                  };
              
                  /*
                   * Initialize every Debugger module on the page (as IF there's ever going to be more than one ;-))
                   */
                  web.onInit(Debugger.init);
              
              }   // endif DEBUGGER
              
              if (typeof module !== 'undefined') module.exports = Debugger;
              
            • defines.js
              /**
               * @fileoverview PCjs-specific compile-time definitions.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /**
               * @define {string}
               */
              var PCJSCLASS = "pcjs";         // this @define is the default application class (formerly APPCLASS) to use for PCjs
              
              /**
               * @define {boolean}
               *
               * WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded.
               * In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate.  When it's *false*,
               * nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a
               * "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove
               * debugger.js from the compilation process altogether.
               *
               * However, when we're in "development mode" and running uncompiled code in debugger-less configurations,
               * I would like to skip loading debugger.js altogether.  When doing that, we must ALSO arrange for an additional file
               * (nodebugger.js) to be loaded immediately after this file, which *explicitly* overrides DEBUGGER with *false*.
               */
              var DEBUGGER = true;            // this @define is overridden by the Closure Compiler to remove Debugger-related support
              
              /**
               * @define {boolean}
               *
               * PREFETCH enables the use of a prefetch queue.
               *
               * See the Bus component for details.
               */
              var PREFETCH = false;
              
              /**
               * @define {boolean}
               *
               * FATARRAYS is a Closure Compiler compile-time option that allocates an Array of numbers for every Memory block,
               * where each a number represents ONE byte; very wasteful, but potentially slightly faster.
               *
               * See the Memory component for details.
               */
              var FATARRAYS = false;
              
              /**
               * TYPEDARRAYS enables use of typed arrays for Memory blocks.  This used to be a compile-time-only option, but I've
               * added Memory access functions for typed arrays (see Memory.afnTypedArray), so support can be enabled dynamically.
               *
               * See the Memory component for details.
               */
              var TYPEDARRAYS = (typeof ArrayBuffer !== 'undefined');
              
              /**
               * @define {boolean}
               *
               * BACKTRACK enables backtracking (disabled in compiled versions).  Backtracking is a mechanism that allows
               * us to tag every byte of incoming data and follow the flow of that data.
               */
              var BACKTRACK = !COMPILED;
              
              /**
               * @define {boolean}
               *
               * SAMPLER enables instruction sampling (a work-in-progress).  This was used briefly as an internal debugging aid,
               * to periodically record LIP values in a fixed-length sampling buffer, halting execution once the sampling buffer
               * was full, and then compare those sampled LIP values to corresponding LIP values on subsequent runs, to look
               * for deviations.  In theory, every run is supposed to be absolutely identical, even if you interrupt execution
               * with the Debugger or enable/disable different sets of messages, but in practice, that's hard to guarantee.
               */
              var SAMPLER = false;
              
              /**
               * @define {boolean}
               *
               * BUGS_8086 enables support for known 8086 bugs.  It's turned off by default, because 1) it adds overhead, and
               * 2) it's hard to imagine any software actually being dependent on any of the bugs covered by this (eg, the failure
               * to properly restart string instructions with multiple prefixes, or the failure to inhibit hardware interrupts
               * following SS segment loads).
               */
              var BUGS_8086 = false;
              
              /**
               * @define {boolean}
               *
               * I386 enables 80386 support.  My preference continues to be one "binary" that supports all implemented CPUs, but
               * I'm providing this to enable a slimmed-down binary, at least until 80386 support is actually finished; at the
               * moment, there's just a lot of scaffolding that bloats the compiled version without adding any real functionality.
               */
              var I386 = true;
              
              /**
               * @define {boolean}
               *
               * COMPAQ386 enables Compaq DeskPro 386 support.
               */
              var COMPAQ386 = true;
              
              /**
               * @define {boolean}
               *
               * PAGEBLOCKS enables 80386 paging support with assistance from the Bus component.  This affects how the Bus component
               * defines physical memory parameters for a 32-bit bus.  With the 8086 and 80286 processors, the Bus component was free
               * to choose any block size for physical memory allocations that made sense for the bus width (eg, 4Kb blocks for a
               * 20-bit bus, or 16Kb blocks for 24-bit bus).
               *
               * However, for the 80386 processor, it makes more sense to choose a block size that matches the page size (ie, 4Kb),
               * because then we have the option of altering the address-to-memory mapping for any block to match whatever page table
               * mapping is in effect for that address, if any, without requiring another layer of address translation.
               */
              var PAGEBLOCKS = I386;
              
              if (typeof module !== 'undefined') {
                  global.PCJSCLASS = PCJSCLASS;
                  global.DEBUGGER = DEBUGGER;
                  global.PREFETCH = PREFETCH;
                  global.FATARRAYS = FATARRAYS;
                  global.TYPEDARRAYS = TYPEDARRAYS;
                  global.BACKTRACK = BACKTRACK;
                  global.SAMPLER = SAMPLER;
                  global.BUGS_8086 = BUGS_8086;
                  global.I386 = I386;
                  global.COMPAQ386 = COMPAQ386;
                  global.PAGEBLOCKS = PAGEBLOCKS;
                  /*
                   * TODO: When we're "required" by Node, should we return anything via module.exports?
                   */
              }
              
            • disk.js
              /**
               * @fileoverview Implements disk image support for both FDC and HDC.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Nov-26
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               *  The Disk component provides methods for:
               *
               *      1) creating an empty disk: create()
               *      2) loading a disk image: load()
               *      3) getting disk information: info()
               *      4) seeking a disk sector: seek()
               *      5) reading data from a sector: read()
               *      6) writing data to a sector: write()
               *      7) save disk deltas: save()
               *      8) restore disk deltas: restore()
               *      9) converting disk contents: toJSON()
               *
               *  More functionality may be factored out of the FDC and HDC components later and moved here, to
               *  further reduce some of the duplication between them, but the above functionality is a good start.
               */
              
              /*
               * Client/Server Disk I/O
               *
               * To support large disks without consuming large amounts of client-side memory, and to push
               * client-side disk changes back the server, we need a DiskIO API that can be used in place of
               * the DiskDump API.
               *
               * Use of the DiskIO API and any associated disk images must be tightly coupled to per-user
               * storage and specific machine configurations, to prevent the disk images from being corrupted
               * by inconsistent I/O operations.  Our basic User API (userapi.js) already provides some
               * per-user storage that we can use to get the design rolling.
               *
               * The DiskIO API must also provide the ability to create new (empty) hard disk images in per-user
               * storage and automatically associate them with the machine configurations that requested them.
               *
               * Principles
               * ---
               * Originally, when the Disk class was given a disk image to load and mount, it would request the
               * ENTIRE disk image from the DiskDump module.  That works well for small (floppy) disk images, but
               * for larger disks -- let's just say anything stored on the server as an "img" file -- we'd prefer
               * to interact with that disk using "On-Demand I/O".  Any "img" file on the same server as the PCjs
               * application should be a candidate for on-demand access.
               *
               * On-Demand I/O means that nothing is initially transferred from the server.  As sectors are
               * requested by the PCjs machine, PCjs requests them from the server, and maintains an MRU cache
               * of sectors, periodically discarding the least-used clean sectors above a certain memory limit.
               * Dirty sectors (ie, those that the PCjs machine has written to) must be periodically sent
               * back to the server and then marked as clean, so that they can be discarded like any other
               * sector.
               *
               * We also support "local" init-only disk images, which means that dirty sectors are never sent
               * back to the server and are instead retained by the client for the lifetime of the app; such
               * images are "read-only" as far as the server is concerned, but "read-write" as far as the client
               * is concerned.  Reloading/restarting an app with an "local" disk will return the disk to its
               * initial state.
               *
               * Practice
               * ---
               * Let's first look at what we *already* do for the HDC component:
               *
               *  1) Creating new (empty) disk images
               *  2) Pre-loading pre-built JSON-encoded disk images (converting them to JSON on the fly as needed)
               *
               * An example of #1 is in /devices/pc/machine/5160/cga/256kb/demo/machine.xml:
               *
               *      <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",type:3}]'/>
               *
               * and an example of #2 is in /disks/pc/fixed/win101.xml:
               *
               *      <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",path:"/disks/pc/fixed/win101/10mb.json",type:3}]'/>
               *
               * The HDC component expects an array of drive entries.  Array position determines drive numbering
               * (the first entry is drive 0, the second is drive 1, etc), and each entry contains the following
               * properties:
               *
               *      'name': user-friendly name for the disk, if any
               *      'path': URL of the disk image, if any
               *      'type': a drive type
               *
               * Of those properties, only 'type' is required, which provides an index into an HDC "Drive Type"
               * table that determines disk geometry and therefore disk size.  As we add support for larger disks and
               * newer disk controllers, the 'type' parameter will be superseded by either a user-defined 'geometry'
               * parameter that will define number of heads, cylinders, tracks, sectors per track, and (max) bytes per
               * sector, or perhaps a generic 'size' parameter that leaves geometry choices to the HDC component,
               * which will then pass those decisions on to the Disk component.
               *
               * We will enable on-demand I/O for a disk image with a new 'mode' parameter that looks like:
               *
               *      'mode': one of "local", "preload", "demandrw", "demandro"
               *
               * "preload" means the disk image will be completely preloaded, exactly as before; "demandrw" enables
               * full on-demand I/O support; and "demandro" enables on-demand I/O for reads only (all writes are retained
               * and never written back to the server).
               *
               * "ro" will be the fallback for "rw" unless TWO other important criteria are met: 1) the user has a
               * private user key, and therefore per-user storage; and 2) the disk image 'path' contains an asterisk (*)
               * that the server can internally remap to a directory in the user's storage; eg:
               *
               *      'path': <asterisk>/10mb.img (path components following the asterisk are optional)
               *
               * If the disk image does not already exist, it will be created (but not formatted).
               *
               * This preserves the promise that EVERYTHING a user does within a PCjs machine is private (ie, not
               * visible to any other PCjs users).  I don't want to be in the business of saving any user machine
               * states or disk changes, but at least those operations are limited to users who have asked for (and
               * received) a private user key.
               *
               * Another important consideration at this stage is dealing with multiple machines writing to the same
               * disk image; even though we're limiting the "demandrw" mode to per-user images, a single user may still
               * inadvertently start up multiple machines that refer to the same disk image.
               *
               * So, every PCjs machine needs to generate a unique token and include that token with every Disk I/O API
               * operation, so that the server can revoke a previous machine's "rw" access to a disk image when a new
               * machine requests "rw" access to the same disk image.
               *
               * From the client's perspective, revocation can be quietly dealt with by reverting to "demandro" mode;
               * that client becomes stuck with all their dirty sectors until they can reclaim "rw" access, which should
               * only happen if no intervening writes to the disk image on the server have occurred (if I bother allowing
               * reclamation at all).
               *
               * The real challenge here is avoiding revocation of a machine that still has critical changes to commit,
               * but since we can't even solve the problem of a user closing their browser at an inopportune time
               * and potentially leaving a disk image in an inconsistent state, premature revocation is the least of
               * our problems.  Since a real hard disk could suffer the same fate if the machine's power was turned off
               * at the wrong time, you could say that we're simply providing a faithful simulation of reality.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var web         = require("../../shared/lib/weblib");
                  var DiskAPI     = require("../../shared/lib/diskapi");
                  var DumpAPI     = require("../../shared/lib/dumpapi");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
              }
              
              /**
               * Disk(controller, drive, mode)
               *
               * Disk contents are stored as an array (aDiskData) of cylinders, each of which is an array of
               * heads, each of which is an array of sector objects; the latter contain sector numbers and
               * sector data, where sector data is an array of dwords.  The format does not impose any
               * limitations on number of cylinders, number of heads, sectors per track, or bytes per sector.
               *
               * WARNING: All accesses to disk sector properties must be via their string names, not their
               * "dot" names, otherwise code will break after it's been processed by the Closure Compiler,
               * and any dumped disks may be unmountable.  This is a side-effect of how we mount and dump
               * disk images (ie, as JSON-encoded streams).
               *
               * This means, for example, that all references to "track[iSector].data" must actually appear as
               * "track[iSector]['data']".
               *
               * @constructor
               * @extends Component
               * @param {HDC|FDC} controller
               * @param {Object} drive
               * @param {string} mode
               */
              function Disk(controller, drive, mode)
              {
                  Component.call(this, "Disk", {'id': controller.idMachine + ".disk" + (++Disk.nDisks)}, Disk, Messages.DISK);
              
                  /*
                   * Route all non-Debugger messages (eg, notice() and println() calls) through
                   * this.controller (eg, controller.notice() and controller.println()), because
                   * the Computer component is unaware of any Disk objects and therefore will not
                   * set up the usual overrides when a Control Panel is installed.
                   */
                  this.controller = controller;
                  this.cmp = controller.cmp;
                  this.dbg = controller.dbg;
                  this.drive = drive;
              
                  /*
                   * We pull out a number of drive properties that we may or may not need as defaults
                   */
                  this.sDiskName = drive.name;
                  this.fRemovable = drive.fRemovable;
                  this.fOnDemand = this.fRemote = false;
              
                  /*
                   * Initialize the disk contents
                   */
                  this.create(mode, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector);
              
                  /*
                   * The following dirty sector and timer properties are used only with fOnDemand disks,
                   * assuming fRemote was successfully set.
                   */
                  this.aDirtySectors = [];
                  this.aDirtyTimestamps = [];         // this array is parallel to aDirtySectors
                  this.timerWrite = null;             // REMOTE_WRITE_DELAY timer in effect, if any
                  this.msTimerWrite = 0;              // the time that the write timer, if any, is set to fire
                  this.fWriteInProgress = false;
              
                  this.setReady();
              }
              
              /**
               * @typedef {{
               *  sPath:  string,
               *  sName:  string,
               *  bAttr:  number,
               *  cbSize: number,
               *  apba:   Array.<number>,
               *  disk:   Disk
               * }}
               */
              var FileInfo;
              
              /**
               * Every Sector object (once loaded and fully parsed) should have ALL of the following named properties:
               *
               *      'sector':   sector number
               *      'length':   size of the sector, in bytes
               *      'data':     array of dwords
               *      'pattern':  dword pattern to use for empty or partial sectors (or null if sector still needs to be loaded)
               *
               * initSector() also sets the following properties, to help us quickly identify its location within aDiskData:
               *
               *      iCylinder
               *      iHead
               *
               * In addition, we will maintain the following information on a per-sector basis, as sectors are modified:
               *
               *      iModify:    index of first modified dword in sector
               *      cModify:    number of modified dwords in sector
               *      fDirty:     true if sector is dirty, false if clean (or cleaning in progress)
               *
               * fDirty is used in conjunction with "demandrw" disks; it is set to true whenever the sector is modified, and is
               * set to false whenever the sector has been sent to the server.  If the server write succeeds and fDirty is still
               * false, then the sector modifications are removed (cModify is set to zero).  If the write succeeds but fDirty was
               * set to true again in the meantime, then all the sector modifications (even those that were just written) remain
               * in place (since we don't keep track of more than one modification range within a sector).  And if the write failed,
               * then fDirty is set back to true and again all modifications remain in place; the best we can do is schedule another
               * write attempt.
               *
               * TODO: Perhaps we should also maintain a failure count and stop trying to write sectors that reach a certain
               * threshold.  Error-handling, as usual, is the thorniest problem.
               *
               * @typedef {{
               *  sector:     number,
               *  length:     number,
               *  data:       Array.<number>,
               *  pattern:    (number|null),
               *  iCylinder:  number,
               *  iHead:      number,
               *  iModify:    number,
               *  cModify:    number
               * }}
               */
              var SectorData;
              
              /**
               * @class SectorInfo
               * @property {number} 0 contains iCylinder
               * @property {number} 1 contains iHead
               * @property {number} 2 contains iSector
               * @property {number} 3 contains nSectors
               * @property {boolean} 4 contains fAsync
               * @property {function(nErrorCode:number,fAsync:boolean)} 5 contains done
               */
              
              /**
               * The default number of milliseconds to wait before writing a dirty sector back to a remote disk image
               *
               * @const {number}
               */
              Disk.REMOTE_WRITE_DELAY = 2000;         // 2-second delay
              
              /*
               * A global disk count, used to form unique Disk component IDs
               */
              Disk.nDisks = 0;
              
              Component.subclass(Disk);
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * We have no real interest in this notification, other than to obtain a reference to the Debugger
               * for every disk loaded BEFORE the initBus() phase; any disk loaded AFTER that point will get its Debugger
               * reference, if any, from the disk controller passed to the Disk() constructor.
               *
               * @this {ChipSet}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              Disk.prototype.initBus = function(cmp, bus, cpu, dbg) {
                  this.dbg = dbg;
              };
              
              /**
               * isRemote()
               *
               * @this {Disk}
               * @return {boolean} true if remote disk, false if not
               */
              Disk.prototype.isRemote = function() {
                  /*
                   * Ironically, we can't rely on fRemote, because that is cleared and set across disconnect and
                   * reconnect operations.  fOnDemand is the next best thing.
                   */
                  return this.fOnDemand;
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * As with powerDown(), our sole concern here is for REMOTE disks: if a powerDown() call disconnected an
               * "on-demand" disk, we need to get reconnected.  Calling our own load() function should get the job done.
               *
               * The HDC component could have triggered this as well, but its powerUp() function only calls autoMount()
               * in case of page (ie, application) reload, which is fine for local disks but insufficient for remote disks,
               * which have a server connection that must be re-established.
               *
               * @this {Disk}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Disk.prototype.powerUp = function(data, fRepower) {
                  if (!fRepower) {
                      if (this.fOnDemand && !this.fRemote) {
                          this.setReady(false);
                          this.load(this.sDiskName, this.sDiskPath, null, this.donePowerUp, this);
                      }
                  }
                  return true;
              };
              
              /**
               * donePowerUp(drive, disk, sDiskName, sDiskPath)
               *
               * This is a callback issued by the Disk component once the load() from powerUp() has finished.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {Disk} disk is set if the disk was successfully mounted, null if not
               * @param {string} sDiskName
               * @param {string} sDiskPath
               */
              Disk.prototype.donePowerUp = function(drive, disk, sDiskName, sDiskPath)
              {
                  this.setReady(true);
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * Our sole concern here is for REMOTE disks, making sure any unwritten changes get flushed to
               * the server during a shutdown.  No local state is ever returned, so fSave is ignored.
               *
               * Local disks are managed by the controller (ie, FDC or HDC) that mounted them; the controller's
               * powerDown() handler will take care of calling save() as needed.
               *
               * TODO: Consider taking responsibility for saving the state of local disks as well; the only reason
               * the controllers still take care of them is historical, because this component originally didn't
               * exist, and even after it was created, it didn't originally receive powerDown() notifications.
               *
               * @this {Disk}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean}
               */
              Disk.prototype.powerDown = function(fSave, fShutdown)
              {
                  /*
                   * If we're connected to a remote disk, take this opportunity to flush any remaining unwritten
                   * changes and then close the connection.
                   */
                  if (this.fRemote) {
                      var response;
                      var nErrorCode = 0;
                      if (this.fWriteInProgress) {
                          /*
                           * TODO: Verify that the Computer's powerOff() handler will actually honor a false return value.
                           */
                          if (!web.confirmUser("Disk writes are still in progress, shut down anyway?")) {
                              return false;
                          }
                      }
                      while ((response = this.findDirtySectors(false))) {
                          if ((nErrorCode = response[0])) {
                              this.controller.notice('Unable to save "' + this.sDiskName + '" (error ' + nErrorCode + ')');
                              break;
                          }
                      }
                      if (fShutdown) {
                          this.disconnectRemoteDisk();
                      }
                      /*
                       * I only report that changes to the disk have been "saved" if fSave is true, to avoid confusing
                       * users who might not understand the difference between discarding local changes (which should restore
                       * all diskettes to their original state) and discarding remote changes (which could leave the remote disk
                       * in a bad state).
                       */
                      if (!nErrorCode && fSave) this.controller.notice(this.sDiskName + " saved");
                  }
                  return true;
              };
              
              /**
               * create()
               *
               * @param {string} mode
               * @param {number} nCylinders
               * @param {number} nHeads
               * @param {number} nSectors (per track)
               * @param {number} cbSector
               *
               * Initializes the disk contents according to the current drive mode and parameters.
               */
              Disk.prototype.create = function(mode, nCylinders, nHeads, nSectors, cbSector)
              {
                  this.mode = mode;
                  this.nCylinders = nCylinders;
                  this.nHeads = nHeads;
                  this.nSectors = nSectors;
                  this.cbSector = cbSector;
                  this.aDiskData = [];
                  /*
                   * If the drive is using PRELOAD mode, then it will use the load()/mount() process to initialize the disk contents;
                   * it wouldn't hurt to let create() do its thing, too, but it's a waste of time.
                   */
                  if (this.mode != DiskAPI.MODE.PRELOAD) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("blank disk for \"" + this.sDiskName + "\": " + this.nCylinders + " cylinders, " + this.nHeads + " head(s)");
                      }
                      var aCylinders = new Array(this.nCylinders);
                      for (var iCylinder = 0; iCylinder < aCylinders.length; iCylinder++) {
                          var aHeads = new Array(this.nHeads);
                          for (var iHead = 0; iHead < aHeads.length; iHead++) {
                              var aSectors = new Array(this.nSectors);
                              for (var iSector = 1; iSector <= aSectors.length; iSector++) {
                                  /*
                                   * Now that our read() and write() functions can deal with unallocated data
                                   * arrays, and can read/write the specified pattern on-the-fly, we no longer need
                                   * to pre-allocate and pre-initialize the 'data' array.
                                   *
                                   * For "local" disks, we can assume a 'pattern' of 0, but for "demandrw" and "demandro"
                                   * disks, 'pattern' is set to null, as yet another indication that I/O is required to load
                                   * the sector from the server (or to write it back to the server).
                                   */
                                  aSectors[iSector - 1] = this.initSector(null, iCylinder, iHead, iSector, this.cbSector, (this.mode == DiskAPI.MODE.LOCAL? 0 : null));
                              }
                              aHeads[iHead] = aSectors;
                          }
                          aCylinders[iCylinder] = aHeads;
                      }
                      this.aDiskData = aCylinders;
                  }
                  this.dwChecksum = null;
              };
              
              /**
               * load(sDiskName, sDiskPath, file, fnNotify)
               *
               * TODO: Figure out how we can strongly type fnNotify, because the Closure Compiler has issues with:
               *
               *      param {function(Component,Object,Disk,string,string)} fnNotify
               *
               * for:
               *
               *     this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
               *
               * Also, while we're at it, learn if there are ways to:
               *
               *      1) declare a function taking NO parameters (ie, generate a warning if any parameters are specified)
               *      2) declare a type for a function's return value
               *
               * @this {Disk}
               * @param {string} sDiskName
               * @param {string} sDiskPath
               * @param {File} [file] is set if there's an associated File object
               * @param {function(...)} [fnNotify]
               * @param {Component} [controller]
               */
              Disk.prototype.load = function(sDiskName, sDiskPath, file, fnNotify, controller)
              {
                  var sDiskURL = sDiskPath;
              
                  /*
                   * We could use this.log() as well, but it wouldn't display which component initiated the load.
                   */
                  if (DEBUG) {
                      var sMessage = 'load("' + sDiskName + '","' + sDiskPath + '")';
                      this.controller.log(sMessage);
                      this.printMessage(sMessage);
                  }
              
                  if (this.fnNotify) {
                      if (DEBUG) this.controller.log('too many load requests for "' + sDiskName + '" (' + sDiskPath + ')');
                      return;
                  }
              
                  this.sDiskName = sDiskName;
                  this.sDiskPath = sDiskPath;
                  this.fnNotify = fnNotify;
                  this.controllerNotify = controller || this.controller;
              
                  if (file) {
                      var disk = this;
                      var reader = new FileReader();
                      reader.onload = function() {
                          disk.build(reader.result, true);
                      };
                      reader.readAsArrayBuffer(file);
                      return;
                  }
              
                  /*
                   * If there's an occurrence of API_ENDPOINT anywhere in the path, we assume we can use it as-is;
                   * ie, that the user has already formed a URL of the type we use ourselves for unconverted disk images.
                   */
                  if (sDiskPath.indexOf(DumpAPI.ENDPOINT) < 0) {
                      /*
                       * If the selected disk image has a "json" extension, then we assume it's a pre-converted
                       * JSON-encoded disk image, so we load it as-is; otherwise, we ask our server-side disk image
                       * converter to return the corresponding JSON-encoded data.
                       */
                      var sDiskExt = str.getExtension(sDiskPath);
                      if (sDiskExt == DumpAPI.FORMAT.JSON) {
                          sDiskURL = encodeURI(sDiskPath);
                      } else {
                          if (this.mode == DiskAPI.MODE.DEMANDRW || this.mode == DiskAPI.MODE.DEMANDRO) {
                              sDiskURL = this.connectRemoteDisk(sDiskPath);
                              this.fOnDemand = true;
                          } else {
                              var sDiskParm = DumpAPI.QUERY.PATH;
                              var sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=10";
                              /*
                               * 'mbhd' is a new parm added for hard disk support.  In the case of 'file' or 'dir' requests,
                               * 'mbhd' informs DumpAPI.ENDPOINT that it should create a hard disk image, and one not larger than
                               * the specified size (eg, 10mb).  In fact, until DumpAPI.ENDPOINT is changed to create custom hard
                               * disk BPBs, you'll always get a standard PC XT 10mb disk image, so if the 'file' or 'dir' contains
                               * more than 10mb of data, the request will fail.  Ultimately, I want to honor the controller's
                               * driveConfig 'size' parm, or to match the capacity required by the driveConfig 'type' parameter.
                               *
                               * If a 'disk' is specified, we pass mbhd=0, because the actual size will depend on the image.
                               * However, I don't currently have any "dsk" or "img" files containing hard disk images; those formats
                               * were really intended for floppy disk images.  If I never create any hard disk image files, then
                               * we can simply eliminate sSizeParm in the 'disk' case.
                               *
                               * Added more extensions to the list of paths-treated-as-disk-images, so that URLs to files located here:
                               *
                               *      ftp://ftp.oldskool.org/pub/TOPBENCH/dskimage/
                               *
                               * can be used as-is.  TODO: There's a TODO in netlib.getFile() regarding remote support that needs
                               * to be resolved first; DiskDump relies on that function for its remote requests, and it currently
                               * supports only HTTP.
                               */
                              if (!sDiskPath.indexOf("http:") || !sDiskPath.indexOf("ftp:") || ["dsk", "ima", "img", "360", "720", "12", "144"].indexOf(sDiskExt) >= 0) {
                                  sDiskParm = DumpAPI.QUERY.DISK;
                                  sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=0";
                              } else if (str.endsWith(sDiskPath, '/')) {
                                  sDiskParm = DumpAPI.QUERY.DIR;
                              }
                              sDiskURL = web.getHost() + DumpAPI.ENDPOINT + '?' + sDiskParm + '=' + encodeURIComponent(sDiskPath) + (this.fRemovable ? "" : sSizeParm) + "&" + DumpAPI.QUERY.FORMAT + "=" + DumpAPI.FORMAT.JSON;
                          }
                      }
                  }
                  web.loadResource(sDiskURL, true, null, this, this.doneLoad, sDiskPath);
              };
              
              /**
               *
               * build(buffer, fModified)
               *
               * Builds a disk image from an ArrayBuffer (eg, from a FileReader object), rather than from JSON-encoded data.
               *
               * @this {Disk}
               * @param {?} buffer (we KNOW this is an ArrayBuffer, but we can't seem to convince the Closure Compiler)
               * @param {boolean} [fModified] is true if we should mark the entire disk modified (to ensure that we save/restore it)
               */
              Disk.prototype.build = function(buffer, fModified)
              {
                  var disk;
                  var cbDiskData = buffer? buffer.byteLength : 0;
                  var disketteFormat = DiskAPI.DISKETTE_FORMATS[cbDiskData];
              
                  if (disketteFormat) {
                      this.nCylinders = disketteFormat[0];
                      this.nHeads = disketteFormat[1];
                      this.nSectors = disketteFormat[2];
                      this.cbSector = 512;
              
                      var cdw = this.cbSector >> 2, dwPattern = 0, dwChecksum = 0;
                      var ib = 0;
                      var dv = new DataView(buffer, 0, cbDiskData);
              
                      this.aDiskData = new Array(this.nCylinders);
                      for (var iCylinder = 0; iCylinder < this.aDiskData.length; iCylinder++) {
                          var cylinder = this.aDiskData[iCylinder] = new Array(this.nHeads);
                          for (var iHead = 0; iHead < cylinder.length; iHead++) {
                              var head = cylinder[iHead] = new Array(this.nSectors);
                              for (var iSector = 0; iSector < head.length; iSector++) {
                                  var sector = this.initSector(null, iCylinder, iHead, iSector + 1, this.cbSector, dwPattern);
                                  var adw = sector['data'];
                                  for (var idw = 0; idw < cdw; idw++, ib += 4) {
                                      var dw = adw[idw] = dv.getInt32(ib, true);
                                      dwChecksum = (dwChecksum + dw) & (0xffffffff|0);
                                  }
                                  if (fModified) sector.cModify = cdw;
                                  head[iSector] = sector;
                              }
                          }
                      }
                      this.dwChecksum = dwChecksum;
                      disk = this;
                  } else {
                      this.notice("Unrecognized diskette format (" + cbDiskData + " bytes)");
                  }
              
                  if (this.fnNotify) {
                      this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
                      this.fnNotify = null;
                  }
              };
              
              /**
               * doneLoad(sDiskFile, sDiskData, nErrorCode, sDiskPath)
               *
               * This function was originally called mount().  If the mount is successful, we pass the Disk object to the
               * caller's fnNotify handler; otherwise, we pass null.
               *
               * @this {Disk}
               * @param {string} sDiskFile
               * @param {string} sDiskData
               * @param {number} nErrorCode (response from server if anything other than 200)
               * @param {string} sDiskPath (passed through from load() to loadResource())
               */
              Disk.prototype.doneLoad = function(sDiskFile, sDiskData, nErrorCode, sDiskPath)
              {
                  var disk = null;
                  this.fWriteProtected = false;
                  var fPrintOnly = (nErrorCode < 0 && this.cmp && !this.cmp.aFlags.fPowered);
              
                  this.sDiskFile = sDiskFile;
              
                  if (this.fOnDemand) {
                      if (!nErrorCode) {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
                          }
                          this.fRemote = true;
                          this.buildFileTable();
                          disk = this;
                      } else {
                          this.controller.notice('Unable to connect to disk "' + sDiskPath + '" (error ' + nErrorCode + ': ' + sDiskData + ')', fPrintOnly);
                      }
                  }
                  else if (nErrorCode) {
                      /*
                       * This can happen for innocuous reasons, such as the user switching away too quickly, forcing
                       * the request to be cancelled.  And unfortunately, the browser cancels XMLHttpRequest requests
                       * BEFORE it notifies any page event handlers, so if the Computer's being powered down, we won't know
                       * that yet.  For now, we rely on the lack of a specific error (nErrorCode < 0), and suppress the
                       * notify() alert if there's no specific error AND the computer is not powered up yet.
                       */
                      this.controller.notice("Unable to load disk \"" + this.sDiskName + "\" (error " + nErrorCode + ")", fPrintOnly);
                  } else {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
                      }
                      try {
                          /*
                           * The following code was a hack to turn on write-protection for a disk image if there was
                           * an initial comment line containing the string "write-protected".  However, since comments
                           * are technically not allowed in JSON, I needed an alternative solution.  So, if the basename
                           * contains the suffix "-readonly", then I'll turn on write-protection for that disk as well.
                           *
                           * TODO: Provide some UI for turning write-protection on/off for disks at will, and provide
                           * an XML-based solution (ie, a per-disk XML configuration option) for controlling it as well.
                           */
                          var sBaseName = str.getBaseName(sDiskFile, true).toLowerCase();
                          if (sBaseName.indexOf("-readonly") > 0) {
                              this.fWriteProtected = true;
                          } else {
                              var iEOL = sDiskData.indexOf("\n");
                              if (iEOL > 0 && iEOL < 1024) {
                                  var sConfig = sDiskData.substring(0, iEOL);
                                  if (sConfig.indexOf("write-protected") > 0) {
                                      this.fWriteProtected = true;
                                  }
                              }
                          }
                          /*
                           * The most likely source of any exception will be here, where we're parsing the disk data.
                           *
                           * TODO: IE9 is rather unfriendly and restrictive with regard to how much data it's willing to
                           * eval().  In particular, the 10Mb disk image we use for the Windows 1.01 demo config fails in
                           * IE9 with an "Out of memory" exception.  One work-around would be to chop the data into chunks
                           * (perhaps one track per chunk, using regular expressions) and then manually re-assemble it.
                           *
                           * However, it turns out that using JSON.parse(sDiskData) instead of eval("(" + sDiskData + ")")
                           * is a much easier fix. The only drawback is that we must first quote any unquoted property names
                           * and remove any comments, because while eval() was cool with them, JSON.parse() is more particular;
                           * the following RegExp replacements take care of those requirements.
                           *
                           * The use of hex values is something else that eval() was OK with, but JSON.parse() is not, and
                           * while I've stopped using hex values in DumpAPI responses (at least when "format=json" is specified),
                           * I can't guarantee they won't show up in "legacy" images, and there's no simple RegExp replacement
                           * for transforming hex values into decimal values, so I cop out and fall back to eval() if I detect
                           * any hex prefixes ("0x") in the sequence.  Ditto for error messages, which appear like so:
                           *
                           *      ["unrecognized disk path: test.img"]
                           */
                          var aDiskData;
                          if (sDiskData.substr(0, 1) == "<") {        // if the "data" begins with a "<"...
                              /*
                               * Early server configs reported an error (via the nErrorCode parameter) if a disk URL was invalid,
                               * but more recent server configs now display a somewhat friendlier HTML error page.  The downside,
                               * however, is that the original error has been buried, and we've received "data" that isn't actually
                               * disk data.
                               *
                               * So, if the data we've received appears to be "HTML-like", all we can really do is assume that the
                               * disk image is missing.  And so we pretend we received an error message to that effect.
                               */
                              aDiskData = ["Missing disk image: " + this.sDiskName];
                          } else {
                              if (sDiskData.indexOf("0x") < 0 && sDiskData.substr(0, 2) != "[\"") {
                                  aDiskData = JSON.parse(sDiskData.replace(/([a-z]+):/gm, "\"$1\":").replace(/\/\/[^\n]*/gm, ""));
                              } else {
                                  aDiskData = eval("(" + sDiskData + ")");
                              }
                          }
              
                          if (!aDiskData.length) {
                              Component.error("Empty disk image: " + this.sDiskName);
                          }
                          else if (aDiskData.length == 1) {
                              Component.error(aDiskData[0]);
                          }
                          /*
                           * aDiskData is an array of cylinders, each of which is an array of heads, each of which
                           * is an array of sector objects.  The format does not impose any limitations on number of
                           * cylinders, number of heads, or number of bytes in any of the sector object byte-arrays.
                           *
                           * WARNING: All accesses to sector object properties must be via their string names, not their
                           * "dot" names, otherwise code will break after it's been processed by the Closure Compiler.
                           *
                           * Sector object properties include:
                           *
                           *      'sector'    the sector number (1-based, not required to be sequential)
                           *      'length'    the byte-length (ie, formatted length) of the sector
                           *      'data'      the dword-array containing the sector data
                           *      'pattern'   if the dword-array length is less than 'length'/4, this value must be used
                           *                  to pad out the sector; if no 'pattern' is specified, it's assumed to be zero
                           *
                           * We still support the older JSON encoding, where sector data was encoded as an array of 'bytes'
                           * rather than a dword 'data' array.  However, our support is strictly limited to an on-the-fly
                           * conversion to a forward-compatible 'data' array.
                           */
                          else {
                              if (MAXDEBUG && this.messageEnabled()) {
                                  var sCylinders = aDiskData.length + " track" + (aDiskData.length > 1 ? "s" : "");
                                  var nHeads = aDiskData[0].length;
                                  var sHeads = nHeads + " head" + (nHeads > 1 ? "s" : "");
                                  var nSectorsPerTrack = aDiskData[0][0].length;
                                  var sSectorsPerTrack = nSectorsPerTrack + " sector" + (nSectorsPerTrack > 1 ? "s" : "") + "/track";
                                  this.printMessage(sCylinders + ", " + sHeads + ", " + sSectorsPerTrack);
                              }
                              /*
                               * Before the image is usable, we must "normalize" all the sectors.  In the past, this meant
                               * "inflating" them all.  However, that's no longer strictly necessary.  Mainly, it just means
                               * setting 'length', 'data', and 'pattern' properties, so that all the sectors are well-defined.
                               * This includes detecting sector data in older formats (eg, the old array of 'bytes' instead
                               * of the new 'data' array of dwords) and converting them on-the-fly to the current format.
                               */
                              this.nCylinders = aDiskData.length;
                              this.nHeads = aDiskData[0].length;
                              this.nSectors = aDiskData[0][0].length;
                              var sector = aDiskData[0][0][0];
                              this.cbSector = (sector && sector['length']) || 512;
              
                              var dwChecksum = 0;
                              for (var iCylinder = 0; iCylinder < this.nCylinders; iCylinder++) {
                                  for (var iHead = 0; iHead < this.nHeads; iHead++) {
                                      for (var iSector = 0; iSector < this.nSectors; iSector++) {
                                          sector = aDiskData[iCylinder][iHead][iSector];
                                          if (!sector) continue;          // non-standard (eg, XDF) disk images may have "unused" (null) sectors
                                          var length = sector['length'];
                                          if (length === undefined) {     // provide backward-compatibility with older JSON...
                                              length = sector['length'] = 512;
                                          }
                                          length >>= 2;                   // convert length from a byte-length to a dword-length
                                          var dwPattern = sector['pattern'];
                                          if (dwPattern === undefined) {
                                              dwPattern = sector['pattern'] = 0;
                                          }
                                          var adw = sector['data'];
                                          if (adw === undefined) {
                                              var ab = sector['bytes'];
                                              if (ab === undefined || !ab.length) {
                                                  /*
                                                   * It would be odd if there was neither a 'bytes' nor 'data' array; I'm just
                                                   * being paranoid.  It's more likely that the 'bytes' array is simply empty,
                                                   * in which case we need only create an empty 'data' array and turn the byte
                                                   * pattern, if any, into a dword pattern.
                                                   */
                                                  adw = [];
                                                  this.assert((dwPattern & 0xff) == dwPattern);
                                                  dwPattern = sector['pattern'] = (dwPattern | (dwPattern << 8) | (dwPattern << 16) | (dwPattern << 24));
                                                  sector['data'] = adw;
                                              } else {
                                                  /*
                                                   * To keep the conversion code simple, we'll do any necessary pattern-filling first,
                                                   * to fully "inflate" the sector, eliminating the possibility of partial dwords and
                                                   * saving any code downstream from dealing with byte-size patterns.
                                                   */
                                                  var cb = length << 2;
                                                  for (var ib = ab.length; ib < cb; ib++) {
                                                      ab[ib] = dwPattern; // the pattern for byte-arrays was only a byte
                                                  }
                                                  this.fill(sector, ab, 0);
                                              }
                                              delete sector['bytes'];
                                          }
                                          this.initSector(sector, iCylinder, iHead);
                                          /*
                                           * For the disk as a whole, we maintain a checksum of the original unmodified data:
                                           *
                                           *      dwChecksum: summation of all dwords in all non-empty sectors
                                           *
                                           * Pattern-filling of sectors is deferred until absolutely necessary (eg, when a sector is
                                           * being written).  So all we need to do at this point is checksum all the initial sector data.
                                           */
                                          for (var idw = 0; idw < adw.length; idw++) {
                                              dwChecksum = (dwChecksum + adw[idw]) & (0xffffffff|0);
                                          }
                                      }
                                  }
                              }
                              this.aDiskData = aDiskData;
                              this.dwChecksum = dwChecksum;
                              this.buildFileTable();
                              disk = this;
                          }
                      } catch (e) {
                          Component.error("Disk image error: " + e.message);
                      }
                  }
              
                  if (this.fnNotify) {
                      this.fnNotify.call(this.controllerNotify, this.drive, disk, this.sDiskName, this.sDiskPath);
                      this.fnNotify = null;
                  }
              };
              
              /**
               * buildFileTable()
               *
               * This function builds a complete file table from the (first) FAT volume found on the current disk, and
               * then updates all the sector objects to point back to the corresponding file.  Used for BACKTRACK support.
               *
               * Note that while most of the methods in this module use CHS-style parameters, because our primary clients
               * are old disk controllers that deal exclusively with cylinder/head/sector values, here we use 0-based
               * "logical" sector numbers for volume-relative block addresses (aka LBAs or Logical Block Addresses), and
               * 0-based "physical" sector numbers for disk-relative block addresses (aka PBAs or Physical Block Addresses).
               *
               * Also, our use of the term LBA differs from that of more modern disk controllers; in the pre-modern world
               * of PCjs, what we call PBA numbers are what those controllers would later call LBA numbers.
               *
               * @this {Disk}
               */
              Disk.prototype.buildFileTable = function()
              {
                  if (BACKTRACK) {
                      var i, off, dir = {};
              
                      this.aFileTable = [];
              
                      dir.pbaVolume = dir.lbaTotal = 0;
              
                      var cbDisk = this.nCylinders * this.nHeads * this.nSectors * this.cbSector;
              
                      /*
                       * At this point, if this is a remote disk, you may see some warning messages in your browser's console,
                       * like this message from Chrome:
                       *
                       *      "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects
                       *      to the end user's experience. For more help, check http://xhr.spec.whatwg.org/."
                       *
                       * This is because I was lazy and made the buildFileTable() worker function getSector() use the synchronous
                       * form of seek().  For development purposes, that was fine, but...  TODO: Eventually change buildFileTable()
                       * to use async I/O.
                       */
                      if (this.fRemote) this.log("ignore any synchronous XMLHttpRequest warnings here (for now)");
              
                      var sectorBoot = this.getSector(0);
                      if (!sectorBoot) {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("buildFileTable(): unable to read boot sector");
                          }
                          return;
                      }
              
                      dir.cbSector = this.getSectorData(sectorBoot, DiskAPI.BPB.SECTOR_BYTES, 2);
              
                      var fValid = true;
                      if (dir.cbSector != this.cbSector) {
                          /*
                           * When the first sector doesn't appear to contain a valid BPB, the most likely explanations are:
                           *
                           *      1. The image is from a diskette formatted by DOS 1.xx, which didn't use BPBs
                           *      2. The image is a fixed (partitioned) disk and the first sector is actually an MBR
                           *      3. The image is from a diskette that used a non-standard sector size (ie, not 512)
                           *
                           * To start, if this is an 160Kb disk (circa DOS 1.00) or a 320Kb disk (circa DOS 1.10), then we'll
                           * assume it's a 12-bit FAT, set assorted BPB values accordingly, and see if our assumption holds up.
                           */
                          fValid = false;
                          dir.lbaFAT = 1;
                          dir.nFATBits = 12;
                          dir.lbaRoot = dir.lbaFAT + 2;   // both 160Kb and 320Kb disks contained 2 FATs, each containing 1 sector
                          dir.nClusterSecs = 1;
                          dir.cbSector = this.cbSector;
              
                          if (cbDisk == 160 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_160KB) {
                              dir.lbaTotal = 320;
                              dir.nEntries = 64;
                              fValid = true;
                          }
                          else if (cbDisk == 320 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_320KB) {
                              dir.lbaTotal = 640;
                              dir.nEntries = 112;
                              fValid = true;
                          }
                          else {
                              /*
                               * So, this is either a fixed (partitioned) disk, or a disk using a non-standard sector size; let's assume
                               * the former and check for an MBR.  For now, we're only going to process the first active partition we find.
                               */
                              off = DiskAPI.MBR.PARTITIONS.OFFSET;
                              for (i = 0; i < 4; i++) {
                                  var bStatus = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.STATUS, 1);
                                  if (bStatus == DiskAPI.MBR.PARTITIONS.STATUS.ACTIVE) {
                                      dir.pbaVolume = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.LBA_FIRST, 4);
                                      sectorBoot = this.getSector(dir.pbaVolume);
                                      if (sectorBoot) fValid = true;
                                      break;
                                  }
                                  off += DiskAPI.MBR.PARTITIONS.ENTRY.LENGTH;
                              }
                          }
                          if (!fValid) {
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("buildFileTable(): unrecognized " + cbDisk + "-byte disk image with " + this.cbSector + "-byte sectors");
                              }
                              return;
                          }
                      }
              
                      if (!dir.lbaTotal) {
                          dir.lbaTotal = this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_SECS, 2) || this.getSectorData(sectorBoot, DiskAPI.BPB.LARGE_SECS, 4);
                          dir.lbaFAT = this.getSectorData(sectorBoot, DiskAPI.BPB.RESERVED_SECS, 2);
                          dir.lbaRoot = dir.lbaFAT + this.getSectorData(sectorBoot, DiskAPI.BPB.FAT_SECS, 2) * this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_FATS, 1);
                          dir.nEntries = this.getSectorData(sectorBoot, DiskAPI.BPB.ROOT_DIRENTS, 2);
                          dir.nClusterSecs = this.getSectorData(sectorBoot, DiskAPI.BPB.CLUSTER_SECS, 1);
                      }
              
                      dir.lbaData = dir.lbaRoot + (((dir.nEntries * DiskAPI.DIRENT.LENGTH + (dir.cbSector - 1)) / dir.cbSector) | 0);
                      dir.nClusters = (((dir.lbaTotal - dir.lbaData) / dir.nClusterSecs) | 0);
              
                      /*
                       * In all FATs, the first valid cluster number is 2, as 0 is used to indicate a free cluster and 1 is reserved.
                       *
                       * In a 12-bit FAT chain, the largest valid cluster number (iClusterMax) is 0xFF6; 0xFF7 is reserved for marking
                       * bad clusters and should NEVER appear in a cluster chain, and 0xFF8-0xFFF are used to indicate the end of a chain.
                       * Reports that cluster numbers 0xFF0-0xFF6 are "reserved" (eg, http://support.microsoft.com/KB/65541) should be
                       * ignored; those numbers may have been considered "reserved" at some early point in FAT's history, but no longer.
                       *
                       * Since 12 bits yield 4096 possible values, and since 11 of the values (0, 1, and 0xFF7-0xFFF) cannot be used to
                       * refer to an actual cluster, that leaves a theoretical maximum of 4085 clusters for a 12-bit FAT.  However, for
                       * reasons that only a small (and shrinking -- RIP AAR) number of people know, the actual cut-off is 4084.
                       *
                       * So, a FAT volume with 4084 or fewer clusters uses a 12-bit FAT, a FAT volume with 4085 to 65524 clusters uses
                       * a 16-bit FAT, and a FAT volume with more than 65524 clusters uses a 32-bit FAT.
                       *
                       * TODO: Eventually add support for FAT32.
                       */
                      dir.nFATBits = (dir.nClusters <= DiskAPI.FAT12.MAX_CLUSTERS? 12 : 16);
                      dir.iClusterMax = (dir.nFATBits == 12? DiskAPI.FAT12.CLUSNUM_MAX : DiskAPI.FAT16.CLUSNUM_MAX);
              
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("buildFileTable()\n\tlbaFAT: " + dir.lbaFAT + "\n\tlbaRoot: " + dir.lbaRoot + "\n\tlbaData: " + dir.lbaData + "\n\tlbaTotal: " + dir.lbaTotal + "\n\tnClusterSecs: " + dir.nClusterSecs + "\n\tnClusters: " + dir.nClusters);
                      }
              
                      /*
                       * The following assertion is here only to catch anomalies; it is NOT a requirement that the number of data sectors
                       * be a perfect multiple of nClusterSecs, but if it ever happens, it's worth verifying we didn't miscalculate something.
                       */
                      i = (dir.lbaTotal - dir.lbaData) % dir.nClusterSecs;
                      if (i) {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("buildFileTable(): " + cbDisk + "-byte disk image wasting " + i + " sectors");
                          }
                      }
              
                      /*
                       * Similarly, it is NOT a requirement that the size of all root directory entries be a perfect multiple of the sector
                       * size (cbSector), but it may indicate a problem if it's not.  Note that when it comes time to read the root directory,
                       * we treat it exactly like any other directory; that is, we ignore the nEntries value and scan the entire contents of
                       * every sector allocated to the directory.  TODO: Determine whether DOS reads all root sector contents or only nEntries
                       * (ie, create a test volume where nEntries * 32 is NOT a multiple of cbSector and watch what happens).
                       */
                      this.assert(!((dir.nEntries * DiskAPI.DIRENT.LENGTH) % dir.cbSector));
              
                      var apba = [];
                      for (var lba = dir.lbaRoot; lba < dir.lbaData; lba++) apba.push(dir.pbaVolume + lba);
                      this.getDir(dir, this.sDiskFile, "", apba);
              
                      /*
                       * Create the sector-to-file mappings now.
                       */
                      for (i = 0; i < this.aFileTable.length; i++) {
                          var file = this.aFileTable[i];
                          off = 0;
                          for (var iSector = 0; iSector < file.apba.length; iSector++) {
                              this.updateSector(file, file.apba[iSector], off);
                              off += this.cbSector;
                          }
                      }
                  }
              };
              
              /**
               * getDir(dir, sDisk, sDir, apba)
               *
               * @this {Disk}
               * @param {Object} dir
               * @param {string} sDisk
               * @param {string} sDir
               * @param {Array.<number>} apba
               */
              Disk.prototype.getDir = function(dir, sDisk, sDir, apba)
              {
                  var iStart = this.aFileTable.length;
                  var nEntriesPerSector = (dir.cbSector / DiskAPI.DIRENT.LENGTH) | 0;
              
                  dir.sDir = sDir + "\\";
              
                  if (DEBUG && this.messageEnabled()) this.printMessage('getDir("' + sDisk + '","' + dir.sDir + '")');
              
                  for (var iSector = 0; iSector < apba.length; iSector++) {
                      var pba = apba[iSector];
                      for (var iEntry = 0; iEntry < nEntriesPerSector; iEntry++) {
                          if (!this.getDirEntry(dir, pba, iEntry)) {
                              iSector = apba.length;
                              break;
                          }
                          if (dir.sName == null || dir.sName == "." || dir.sName == "..") continue;
                          var sPath = dir.sDir + dir.sName;
                          if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
                              this.printMessage('"' + sPath + '" size=' + dir.cbSize + ' cluster=' + dir.iCluster + ' sectors=' + JSON.stringify(dir.apba));
                              if (dir.apba.length) this.printMessage(this.dumpSector(this.getSector(dir.apba[0]), dir.apba[0], sPath));
                          }
                          this.aFileTable.push({sPath: sPath, sName: dir.sName, bAttr: dir.bAttr, cbSize: dir.cbSize, apba: dir.apba, disk: this});
                      }
                  }
              
                  var iEnd = this.aFileTable.length;
              
                  for (var i = iStart; i < iEnd; i++) {
                      var file = this.aFileTable[i];
                      if (file.bAttr & DiskAPI.ATTR.SUBDIR && file.apba.length) this.getDir(dir, sDisk, sDir + "\\" + file.sName, file.apba);
                  }
              };
              
              /**
               * getDirEntry(dir, pba, i)
               *
               * This sets the following properties on the 'dir' object:
               *
               *      sName (null if invalid/deleted entry)
               *      bAttr
               *      cbSize
               *      iCluster
               *      apba (ie, array of physical block addresses)
               *
               * On return, it's the caller's responsibility to copy out any data into a new object
               * if it wants to preserve any of the above information.
               *
               * This function also caches the following properties in the 'dir' object:
               *
               *      pbaDirCache (of the last directory sector read, if any)
               *      sectorDirCache (of the last directory sector read, if any)
               *
               * Also, the caller must also set the following 'dir' helper properties, so that clusters
               * can be located and converted to sectors (see convertClusterToSectors):
               *
               *      lbaFAT
               *      lbaData
               *      cbSector
               *      iClusterMax
               *      nClusterSecs
               *      nFATBits
               *
               * @this {Disk}
               * @param {Object} dir (to be filled in)
               * @param {number} pba (a sector of the directory)
               * @param {number} i (an entry in the directory sector, 0-based)
               * @returns {boolean} true if entry was returned (even if invalid/deleted), false if no more entries
               */
              Disk.prototype.getDirEntry = function(dir, pba, i)
              {
                  if (!dir.sectorDirCache || !dir.pbaDirCache || dir.pbaDirCache != pba) {
                      dir.pbaDirCache = pba;
                      dir.sectorDirCache = this.getSector(dir.pbaDirCache);
                      if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
                          this.printMessage(this.dumpSector(dir.sectorDirCache, dir.pbaDirCache, dir.sDir));
                      }
                  }
                  if (dir.sectorDirCache) {
                      var off = i * DiskAPI.DIRENT.LENGTH;
                      var b = this.getSectorData(dir.sectorDirCache, off, 1);
                      if (b == DiskAPI.DIRENT.UNUSED) {
                          return false;
                      }
                      if (b == DiskAPI.DIRENT.INVALID) {
                          dir.sName = null;
                          return true;
                      }
                      dir.sName = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.NAME, 8));
                      var s = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.EXT, 3));
                      if (s.length) dir.sName += '.' + s;
                      dir.bAttr = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.ATTR, 1);
                      dir.cbSize = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.SIZE, 2);
                      dir.iCluster = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.CLUSTER, 2);
                      dir.apba = this.convertClusterToSectors(dir);
                      return true;
                  }
                  return false;
              };
              
              /**
               * convertClusterToSectors(dir)
               *
               * @this {Disk}
               * @param {Object} dir
               * @return {Array.<number>} of PBAs (physical block addresses)
               */
              Disk.prototype.convertClusterToSectors = function(dir)
              {
                  var apba = [];
                  var iCluster = dir.iCluster;
                  if (iCluster) {
                      do {
                          if (iCluster < DiskAPI.FAT12.CLUSNUM_MIN) {
                              this.assert(false);
                              break;
                          }
                          var lba = dir.lbaData + ((iCluster - DiskAPI.FAT12.CLUSNUM_MIN) * dir.nClusterSecs);
                          for (var i = 0; i < dir.nClusterSecs; i++) {
                              apba.push(dir.pbaVolume + lba++);
                          }
                          iCluster = this.getClusterEntry(dir, iCluster, 0) | this.getClusterEntry(dir, iCluster, 1);
                      } while (iCluster <= dir.iClusterMax);
                      this.assert(iCluster != dir.iClusterMax + 1);       // make sure we never see CLUSNUM_BAD in a cluster chain
                  }
                  return apba;
              };
              
              /**
               * getClusterEntry(dir, iCluster, iByte)
               *
               * @this {Disk}
               * @param {Object} dir
               * @param {number} iCluster
               * @param {number} iByte (0 for low byte of cluster entry, 1 for high byte)
               * @return {number}
               */
              Disk.prototype.getClusterEntry = function(dir, iCluster, iByte)
              {
                  var w = 0;
                  var cbitsSector = dir.cbSector * 8;
                  var offBits = dir.nFATBits * iCluster + (iByte? 8 : 0);
                  var iSector = (offBits / cbitsSector) | 0;
                  if (!dir.sectorFATCache || !dir.lbaFATCache || dir.lbaFATCache != dir.lbaFAT + iSector) {
                      dir.lbaFATCache = dir.lbaFAT + iSector;
                      dir.sectorFATCache = this.getSector(dir.pbaVolume + dir.lbaFATCache);
                  }
                  if (dir.sectorFATCache) {
                      offBits = (offBits % cbitsSector) | 0;
                      var off = (offBits >> 3);
                      w = this.getSectorData(dir.sectorFATCache, off, 1);
                      if (!iByte) {
                          if (offBits & 0x7) w >>= 4;
                      } else {
                          if (dir.nFATBits == 16) {
                              w <<= 8;
                          } else {
                              this.assert(dir.nFATBits == 12);
                              if (offBits & 0x7) {
                                  w <<= 4;
                              } else {
                                  w = (w & 0xf) << 8;
                              }
                          }
                      }
                  }
                  return w;
              };
              
              /**
               * getSector(pba)
               *
               * @this {Disk}
               * @param {number} pba (physical block address)
               * @return {Object} sector
               */
              Disk.prototype.getSector = function(pba)
              {
                  var nSectorsPerCylinder = this.nHeads * this.nSectors;
                  var iCylinder = (pba / nSectorsPerCylinder) | 0;
                  this.assert(iCylinder < this.nCylinders);
                  var nSectorsRemaining = (pba % nSectorsPerCylinder);
                  var iHead = (nSectorsRemaining / this.nSectors) | 0;
                  /*
                   * PBA numbers are 0-based, but the sector numbers in CHS addressing are 1-based, so add one to iSector
                   */
                  var iSector = (nSectorsRemaining % this.nSectors) + 1;
                  return this.seek(iCylinder, iHead, iSector);
              };
              
              /**
               * updateSector(file, pba, off)
               *
               * Like getSector(), this must convert a PBA into CHS values; consider factoring that conversion code out.
               *
               * @this {Disk}
               * @param {Object} file
               * @param {number} pba (physical block address from the file's apba)
               * @param {number} off (file offset corresponding to the given pba of the given file)
               * @return {boolean} true if successfully updated, false if not
               */
              Disk.prototype.updateSector = function(file, pba, off)
              {
                  var nSectorsPerCylinder = this.nHeads * this.nSectors;
                  var iCylinder = (pba / nSectorsPerCylinder) | 0;
                  var nSectorsRemaining = (pba % nSectorsPerCylinder);
                  var iHead = (nSectorsRemaining / this.nSectors) | 0;
                  var iSector = (nSectorsRemaining % this.nSectors);
                  var cylinder, head, sector;
                  if ((cylinder = this.aDiskData[iCylinder]) && (head = cylinder[iHead]) && (sector = head[iSector])) {
                      this.assert(sector['sector'] == iSector +1);
                      if (sector.file) {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage('"' + sector.file.sPath + '" cross-linked at offset ' + sector.file.offFile + ' with "' + file.sPath + '" at offset ' + off);
                          }
                          return false;
                      }
                      sector.file = file;
                      sector.offFile = off;
                      return true;
                  }
                  if (DEBUG && this.messageEnabled()) this.printMessage("unable to map PBA " + pba + " to CHS");
                  return false;
              };
              
              /**
               * getSectorData(sector, off, len)
               *
               * NOTE: Yes, this function is not the most efficient way to read a byte/word/dword value from within a sector,
               * but given the different states a sector may be in, it's certainly the simplest and safest, and since this is
               * only used by buildFileTable() and its progeny, it's not clear that we need to be superfast anyway.
               *
               * @this {Disk}
               * @param {Object} sector
               * @param {number} off (byte offset)
               * @param {number} len (1 to 4 bytes)
               * @return {number}
               */
              Disk.prototype.getSectorData = function(sector, off, len)
              {
                  var dw = 0;
                  var nShift = 0;
                  this.assert(len > 0 && len <= 4);
                  while (len--) {
                      this.assert(off < sector['length']);
                      var b = this.read(sector, off++);
                      this.assert(b >= 0);
                      if (b < 0) break;
                      dw |= (b << nShift);
                      nShift += 8;
                  }
                  return dw;
              };
              
              /**
               * getSectorString(sector, off, len)
               *
               * @this {Disk}
               * @param {Object} sector
               * @param {number} off (byte offset)
               * @param {number} len (use -1 to read a null-terminated string)
               * @return {string}
               */
              Disk.prototype.getSectorString = function(sector, off, len)
              {
                  var s = "";
                  while (len--) {
                      var b = this.read(sector, off++);
                      if (b <= 0) break;
                      s += String.fromCharCode(b);
                  }
                  return s;
              };
              
              /**
               * initSector(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
               *
               * Ensures every sector has ALL the properties of a proper Sector object; ie:
               *
               *      'sector':   sector number
               *      'length':   size of the sector, in bytes
               *      'data':     array of dwords
               *      'pattern':  dword pattern to use for empty or partial sectors (null for unread remote sectors)
               *
               * In addition, we will maintain the following information on a per-sector basis,
               * as sectors are modified:
               *
               *      iModify:    index of first modified dword in sector
               *      cModify:    number of modified dwords in sector
               *      fDirty:     true if sector is dirty, false if clean (or cleaning in progress)
               *
               * @param {Object} sector
               * @param {number} iCylinder
               * @param {number} iHead
               * @param {number} [iSector]
               * @param {number} [cbSector]
               * @param {number|null} [dwPattern]
               * @return {Object}
               */
              Disk.prototype.initSector = function(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
              {
                  if (!sector) {
                      sector = {'sector': iSector, 'length': cbSector, 'data': [], 'pattern': dwPattern};
                  }
                  sector.iCylinder = iCylinder;
                  sector.iHead = iHead;
                  sector.iModify = sector.cModify = 0;
                  sector.fDirty = false;
                  return sector;
              };
              
              /**
               * connectRemoteDisk(sDiskPath)
               *
               * Unlike disconnect(), we don't issue the connect request ourselves; instead, we piggyback on the existing
               * preload code in load() to establish the connection.  That, in turn, will trigger a call to mount(), which
               * will check fOnDemand and set fRemote if the connection was successful.
               *
               * @this {Disk}
               * @param {string} sDiskPath
               * @return {string} is the URL connection string required to connect to sDiskPath
               */
              Disk.prototype.connectRemoteDisk = function(sDiskPath)
              {
                  var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.OPEN;
                  sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + sDiskPath;
                  sParms += '&' + DiskAPI.QUERY.MODE + '=' + this.mode;
                  sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                  sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                  sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                  return web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
              };
              
              /**
               * readRemoteSectors(iCylinder, iHead, iSector, nSectors, fAsync, done)
               *
               * @param {number} iCylinder
               * @param {number} iHead
               * @param {number} iSector
               * @param {number} nSectors (to read)
               * @param {boolean} fAsync
               * @param {function(number,boolean)} [done]
               */
              Disk.prototype.readRemoteSectors = function(iCylinder, iHead, iSector, nSectors, fAsync, done)
              {
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("readRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
                  }
              
                  if (this.fRemote) {
                      var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.READ;
                      sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
                      sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                      sParms += '&' + DiskAPI.QUERY.ADDR + '=' + iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
                      sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                      sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                      var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
                      web.loadResource(sDiskURL, fAsync, null, this, this.doneReadRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync, done]);
                      return;
                  }
                  if (done) done(-1, false);
              };
              
              /**
               * doneReadRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
               *
               * @param {string} sURLName
               * @param {string} sURLData
               * @param {number} nErrorCode
               * @param {Array} sectorInfo
               */
              Disk.prototype.doneReadRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
              {
                  var fAsync = false;
              
                  var iCylinder = sectorInfo[0];
                  var iHead = sectorInfo[1];
                  var iSector = sectorInfo[2];
                  var nSectors = sectorInfo[3];
              
                  if (!nErrorCode) {
                      var abData = JSON.parse(sURLData);
                      var offData = 0;
                      while (nSectors--) {
                          /*
                           * We call seek with fWrite == true to prevent seek() from triggering another call
                           * to readRemoteSectors() and endlessly recursing.  That also forces seek() to:
                           *
                           *  1) zero the sector's 'pattern'
                           *  2) disable warning about reading an uninitialized sector
                           *
                           * We KNOW this is an uninitialized sector, because we're about to initialize it.
                           */
                          var sector = this.seek(iCylinder, iHead, iSector, true);
                          if (!sector) {
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("doneReadRemoteSectors(): seek(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") failed");
                              }
                              break;
                          }
                          this.fill(sector, abData, offData);
                          offData += sector['length'];
                          /*
                           * We happen to know that when seek() calls readRemoteSectors(), it limits the number of sectors
                           * to the current track, so the only variable we need to advance is iSector.
                           */
                          iSector++;
                      }
                      fAsync = sectorInfo[4];
                  } else {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("doneReadRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ") returned error " + nErrorCode);
                      }
                  }
                  var done = sectorInfo[5];
                  if (done) done(nErrorCode, fAsync);
              };
              
              /**
               * writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
               *
               * Writes to a remote disk are performed on a timer-driven basis.  When a sector is modified for the first time,
               * a reference to that sector is "pushed" onto (ie, appended to the end of) aDirtySectors, and if aDirtySectors was
               * originally empty, then a REMOTE_WRITE_DELAY timer is set.
               *
               * When the timer fires, the first batch of contiguous sectors is sent off the server, and when the server responds
               * (ie, when cleanDirtySectors() is called), if the response indicates success, every sector that was sent is marked
               * clean -- unless one or more writes to the sector occurred in the meantime, which we track through a per-sector
               * fDirty flag.
               *
               * @param {number} iCylinder
               * @param {number} iHead
               * @param {number} iSector
               * @param {number} nSectors (to write)
               * @param {Array.<number>} abSectors
               * @param {boolean} fAsync
               * @return {boolean|Array}
               */
              Disk.prototype.writeRemoteSectors = function(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
              {
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("writeRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
                  }
              
                  if (this.fRemote) {
                      var data = {};
                      this.fWriteInProgress = true;
                      data[DiskAPI.QUERY.ACTION] = DiskAPI.ACTION.WRITE;
                      data[DiskAPI.QUERY.VOLUME] = this.sDiskPath;
                      data[DiskAPI.QUERY.CHS] = this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                      data[DiskAPI.QUERY.ADDR] = iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
                      data[DiskAPI.QUERY.MACHINE] = this.controller.getMachineID();
                      data[DiskAPI.QUERY.USER] = this.controller.getUserID();
                      data[DiskAPI.QUERY.DATA] = JSON.stringify(abSectors);
                      var sDiskURL = web.getHost() + DiskAPI.ENDPOINT;
                      return web.loadResource(sDiskURL, fAsync, data, this, this.doneWriteRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync]);
                  }
                  return false;
              };
              
              /**
               * doneWriteRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
               *
               * @param {string} sURLName
               * @param {string} sURLData
               * @param {number} nErrorCode
               * @param {Array} sectorInfo
               */
              Disk.prototype.doneWriteRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
              {
                  var iCylinder = sectorInfo[0];
                  var iHead = sectorInfo[1];
                  var iSector = sectorInfo[2];
                  var nSectors = sectorInfo[3];
                  var fAsync = sectorInfo[4];
                  this.fWriteInProgress = false;
              
                  if (iCylinder >= 0 && iCylinder < this.aDiskData.length && iHead >= 0 && iHead < this.aDiskData[iCylinder].length) {
                      for (var i = iSector - 1; nSectors-- > 0 && i >= 0 && i < this.aDiskData[iCylinder][iHead].length; i++) {
                          var sector = this.aDiskData[iCylinder][iHead][i];
              
                          if (!nErrorCode) {
                              if (!sector.fDirty) {
                                  sector.iModify = sector.cModify = 0;
                              }
                          } else {
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("doneWriteRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ") returned error " + nErrorCode);
                              }
                              this.queueDirtySector(sector, false);
                          }
                      }
                  }
                  if (fAsync) this.updateWriteTimer();
              };
              
              /**
               * disconnectRemoteDisk()
               *
               * This is called by our powerDown() notification handler.  If fRemote is true, we issue the disconnect
               * request and then immediately set fRemote to false; we don't wait for (or test) the response.
               *
               * @this {Disk}
               */
              Disk.prototype.disconnectRemoteDisk = function()
              {
                  if (this.fRemote) {
                      var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.CLOSE;
                      sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
                      sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                      sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                      var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
                      web.loadResource(sDiskURL, true);
                      this.fRemote = false;
                  }
              };
              
              /**
               * queueDirtySector(sector, fAsync)
               *
               * Mark the specified sector as dirty, add it to the queue (aDirtySectors) if not already added,
               * and establish a timeout handler (findDirtySectors) if not already established.
               *
               * A freshly dirtied sector should sit in the queue for a short period of time (eg, 2 seconds)
               * before we attempt to write it; that is, a REMOTE_WRITE_DELAY timer should start ticking again
               * for any sector that is rewritten.  However, there will be exceptions; for example, when a sector
               * is finally written, we want to take advantage of the write request to write any additional dirty
               * sectors that follow it, even if those additional sectors were written less than 2 seconds ago.
               *
               * @param {Object} sector
               * @param {boolean} fAsync (true to update write timer, false to not)
               * @return {boolean} true if write timer set, false if not
               */
              Disk.prototype.queueDirtySector = function(sector, fAsync)
              {
                  sector.fDirty = true;
              
                  var j = this.aDirtySectors.indexOf(sector);
                  if (j >= 0) {
                      this.aDirtySectors.splice(j, 1);
                      this.aDirtyTimestamps.splice(j, 1);
                  }
                  this.aDirtySectors.push(sector);
                  this.aDirtyTimestamps.push(usr.getTime());
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("queueDirtySector(CHS=" + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + "): " + this.aDirtySectors.length + " dirty");
                  }
              
                  return fAsync && this.updateWriteTimer();
              };
              
              /**
               * updateWriteTimer()
               *
               * If a timer is already active, make sure it's still valid (ie, the time the timer is scheduled to fire is
               * >= the timestamp of the next dirty sector + REMOTE_WRITE_DELAY); if not, cancel the timer and start a new one.
               *
               * @return {boolean} true if write timer set, false if not
               */
              Disk.prototype.updateWriteTimer = function()
              {
                  if (this.aDirtySectors.length) {
                      var msWrite = this.aDirtyTimestamps[0] + Disk.REMOTE_WRITE_DELAY;
                      if (this.timerWrite) {
                          if (this.msTimerWrite < msWrite) {
                              clearTimeout(this.timerWrite);
                              this.timerWrite = null;
                          }
                      }
                      if (!this.timerWrite) {
                          var obj = this;
                          var msNow = usr.getTime();
                          var msDelay = msWrite - msNow;
                          if (msDelay < 0) msDelay = 0;
                          if (msDelay > Disk.REMOTE_WRITE_DELAY) msDelay = Disk.REMOTE_WRITE_DELAY;
                          this.timerWrite = setTimeout(function() {
                              obj.findDirtySectors(true);
                          }, msDelay);
                          this.msTimerWrite = msNow + msDelay;
                      }
                  } else {
                      if (this.timerWrite) {
                          clearTimeout(this.timerWrite);
                          this.timerWrite = null;
                      }
                  }
                  return this.timerWrite !== null;
              };
              
              /**
               * findDirtySectors(fAsync)
               *
               * @param {boolean} fAsync is true if this function is being called asynchronously, false otherwise
               * @return {boolean|Array} false if no dirty sectors, otherwise true (or a response array if not fAsync)
               *
               * Starting with the oldest dirty sector in the queue (aDirtySectors), determine the longest contiguous stretch of
               * dirty sectors (currently limited to the same track), mark them all as not dirty, and then call writeRemoteSectors().
               */
              Disk.prototype.findDirtySectors = function(fAsync)
              {
                  if (fAsync) {
                      this.timerWrite = null;
                  }
                  var sector = this.aDirtySectors[0];
                  if (sector) {
                      var iCylinder = sector.iCylinder;
                      var iHead = sector.iHead;
                      var iSector = sector['sector'];
                      var nSectors = 0;
                      var abSectors = [];
                      for (var i = iSector - 1; i < this.aDiskData[iCylinder][iHead].length; i++) {
                          var sectorNext = this.aDiskData[iCylinder][iHead][i];
                          if (!sectorNext.fDirty) break;
                          var j = this.aDirtySectors.indexOf(sectorNext);
                          this.assert(j >= 0, "findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ") missing from aDirtySectors");
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ")");
                          }
                          this.aDirtySectors.splice(j, 1);
                          this.aDirtyTimestamps.splice(j, 1);
                          abSectors = abSectors.concat(this.toBytes(sectorNext));
                          sectorNext.fDirty = false;
                          nSectors++;
                      }
                      this.assert(!!abSectors.length, "no data for dirty sector (CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ")");
                      var response = this.writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync);
                      return fAsync || response;
                  }
                  return false;
              };
              
              /**
               * info()
               *
               * @this {Disk}
               * @return {Array} containing: [nCylinders, nHeads, nSectorsPerTrack, nBytesPerSector]
               */
              Disk.prototype.info = function()
              {
                  if (!this.aDiskData.length) {
                      return [0, 0, 0, 0];
                  }
                  return [this.aDiskData.length, this.aDiskData[0].length, this.aDiskData[0][0].length, this.aDiskData[0][0][0]['length']];
              };
              
              /**
               * seek(iCylinder, iHead, iSector, fWrite, done)
               *
               * TODO: There's some dodgy code in seek() that allows floppy images to be dynamically
               * reconfigured with more heads and/or sectors/track, and it does so by peeking at more drive
               * properties.  That code used to be in the FDC component, where it was perfectly reasonable
               * to access those properties.  We need a cleaner interface back to the drive, similar to the
               * info() interface we provide to the controller.
               *
               * Whether or not the "dynamic reconfiguration" feature itself is perfectly reasonable is,
               * of course, a separate question.
               *
               * @this {Disk}
               * @param {number} iCylinder
               * @param {number} iHead
               * @param {number} iSector
               * @param {boolean} [fWrite]
               * @param {function(Object,boolean)} [done]
               * @return {Object|null} is the requested sector, or null if not found (or not available yet)
               */
              Disk.prototype.seek = function(iCylinder, iHead, iSector, fWrite, done)
              {
                  var sector = null;
                  var drive = this.drive;
                  var cylinder = this.aDiskData[iCylinder];
                  if (cylinder) {
                      var i;
                      var track = cylinder[iHead];
                      /*
                       * The following code allows a single-sided diskette image to be reformatted (ie, "expanded")
                       * as a double-sided image, provided the drive has more than one head (see drive.nHeads).
                       */
                      if (!track && drive.bFormatting && iHead < drive.nHeads) {
                          track = cylinder[iHead] = new Array(drive.bSectorEnd);
                          for (i = 0; i < track.length; i++) {
                              track[i] = this.initSector(null, iCylinder, iHead, i + 1, drive.nBytes, 0);
                          }
                      }
                      if (track) {
                          for (i = 0; i < track.length; i++) {
                              if (track[i] && track[i]['sector'] == iSector) {
                                  /*
                                   * If the sector's pattern is null, then this sector's true contents have not yet
                                   * been fetched from the server.
                                   */
                                  sector = track[i];
                                  if (sector['pattern'] === null) {
                                      if (fWrite) {
                                          /*
                                           * Optimization: if the caller has explicitly told us that they're about to WRITE to the
                                           * sector, then we shouldn't need to read it from the server; assume a zero pattern and return.
                                           */
                                          sector['pattern'] = 0;
                                      } else {
                                          var nSectors = 1;
                                          /*
                                           * We know we need to read at least 1 sector, but let's count the number of trailing sectors
                                           * on the same track that may also be required.
                                           */
                                          while (++i < track.length) {
                                              if (track[i]['pattern'] === null) nSectors++;
                                          }
                                          this.readRemoteSectors(iCylinder, iHead, iSector, nSectors, done != null, function onReadRemoteComplete(err, fAsync) {
                                              if (err) sector = null;
                                              if (done) { //noinspection JSReferencingMutableVariableFromClosure
                                                  done(sector, fAsync);
                                              }
                                          });
                                          return done? null : sector;
                                      }
                                  }
                                  break;
                              }
                          }
                          /*
                           * The following code allows an 8-sector track to be reformatted (ie, "expanded") as a 9-sector track.
                           */
                          if (!sector && drive.bFormatting && drive.bSector == 9) {
                              sector = track[i] = this.initSector(null, iCylinder, iHead, drive.bSector, drive.nBytes, 0);
                          }
                      }
                  }
                  if (done) done(sector, false);
                  return sector;
              };
              
              /**
               * fill(sector, ab, off)
               *
               * @param {Object} sector
               * @param {*} ab (technically, this should be typed as Array.<number> but I'm having trouble coercing JSON.parse() to that)
               * @param {number} off
               */
              Disk.prototype.fill = function(sector, ab, off)
              {
                  var cdw = sector['length'] >> 2;
                  var adw = new Array(cdw);
                  for (var idw = 0; idw < cdw; idw++) {
                      adw[idw] = ab[off] | (ab[off + 1] << 8) | (ab[off + 2] << 16) | (ab[off + 3] << 24);
                      off += 4;
                  }
                  sector['data'] = adw;
                  /*
                   * TODO: Consider taking this opportunity to shrink 'data' down by the number of dwords at the end of the buffer that
                   * contain the same pattern, and setting 'pattern' accordingly.
                   */
              };
              
              /**
               * toBytes(sector)
               *
               * @param {Object} sector
               * @return {Array.<number>} is an array of bytes
               */
              Disk.prototype.toBytes = function(sector)
              {
                  var cb = sector['length'];
                  var ab = new Array(cb);
                  var ib = 0;
                  var cdw = cb >> 2;
                  var adw = sector['data'];
                  var dwPattern = sector['pattern'];
                  for (var idw = 0; idw < cdw; idw++) {
                      var dw = (idw < adw.length? adw[idw] : dwPattern);
                      ab[ib++] = dw & 0xff;
                      ab[ib++] = (dw >> 8) & 0xff;
                      ab[ib++] = (dw >> 16) & 0xff;
                      ab[ib++] = (dw >> 24) & 0xff;
                  }
                  return ab;
              };
              
              /**
               * read(sector, ibSector, fCompare)
               *
               * @this {Disk}
               * @param {Object} sector (returned from a previous seek)
               * @param {number} ibSector a byte index within the given sector
               * @param {boolean} [fCompare] is true if this write-compare read
               * @return {number} the specified (unsigned) byte, or -1 if no more data in the sector
               */
              Disk.prototype.read = function(sector, ibSector, fCompare)
              {
                  var b = -1;
                  if (sector) {
                      if (DEBUG && !ibSector && !fCompare && this.messageEnabled()) {
                          this.printMessage('read("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
                      }
                      if (ibSector < sector['length']) {
                          var adw = sector['data'];
                          var idw = ibSector >> 2;
                          var dw = (idw < adw.length ? adw[idw] : sector['pattern']);
                          b = ((dw >> ((ibSector & 0x3) << 3)) & 0xff);
                      }
                  }
                  return b;
              };
              
              /**
               * write(sector, ibSector, b)
               *
               * @this {Disk}
               * @param {Object} sector (returned from a previous seek)
               * @param {number} ibSector a byte index within the given sector
               * @param {number} b the byte value to write
               * @return {boolean|null} true if write successful, false if write-protected, null if out of bounds
               */
              Disk.prototype.write = function(sector, ibSector, b)
              {
                  if (this.fWriteProtected)
                      return false;
              
                  if (DEBUG && !ibSector && this.messageEnabled()) {
                      this.printMessage('write("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
                  }
              
                  if (ibSector < sector['length']) {
                      if (b != this.read(sector, ibSector, true)) {
                          var adw = sector['data'];
                          var dwPattern = sector['pattern'];
                          var idw = ibSector >> 2;
                          var nShift = (ibSector & 0x3) << 3;
                          /*
                           * Ensure every byte up to the specified byte is properly initialized.
                           */
                          for (var i = adw.length; i <= idw; i++) adw[i] = dwPattern;
              
                          if (!sector.cModify) {
                              sector.iModify = idw;
                              sector.cModify = 1;
                          } else if (idw < sector.iModify) {
                              sector.cModify += sector.iModify - idw;
                              sector.iModify = idw;
                          } else if (idw >= sector.iModify + sector.cModify) {
                              sector.cModify += idw - (sector.iModify + sector.cModify) + 1;
                          }
                          adw[idw] = (adw[idw] & ~(0xff << nShift)) | (b << nShift);
              
                          if (this.fRemote) this.queueDirtySector(sector, true);
                      }
                      return true;
                  }
                  return null;
              };
              
              /**
               * save()
               *
               * The first array entry contains some disk information:
               *
               *      [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
               *
               * Each subsequent entry in the returned array contains the following:
               *
               *      [iCylinder, iHead, iSector, iModify, [...]]
               *
               * where [...] is an array of modified dword(s) in the corresponding sector.
               *
               * @this {Disk}
               * @return {Array} of modified sectors
               */
              Disk.prototype.save = function()
              {
                  var i = 0;
                  var deltas = [];
                  deltas[i++] = [this.sDiskPath, this.dwChecksum, this.nCylinders, this.nHeads, this.nSectors, this.cbSector];
                  if (!this.fRemote && !this.fWriteProtected) {
                      var aDiskData = this.aDiskData;
                      for (var iCylinder = 0; iCylinder < aDiskData.length; iCylinder++) {
                          for (var iHead = 0; iHead < aDiskData[iCylinder].length; iHead++) {
                              for (var iSector = 0; iSector < aDiskData[iCylinder][iHead].length; iSector++) {
                                  var sector = aDiskData[iCylinder][iHead][iSector];
                                  if (sector && sector.cModify) {
                                      var mods = [], n = 0;
                                      var iModify = sector.iModify, iModifyLimit = sector.iModify + sector.cModify;
                                      while (iModify < iModifyLimit) {
                                          mods[n++] = sector['data'][iModify++];
                                      }
                                      deltas[i++] = [iCylinder, iHead, iSector, sector.iModify, mods];
                                  }
                              }
                          }
                      }
                  }
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage('save("' + this.sDiskName + '"): saved ' + (deltas.length - 1) + ' change(s)');
                  }
                  return deltas;
              };
              
              /**
               * restore(deltas)
               *
               * The first array entry contains some disk information:
               *
               *      [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
               *
               * Each subsequent entry in the supplied array contains the following:
               *
               *      [iCylinder, iHead, iSector, iModify, [...]]
               *
               * where [...] is an array of modified dword(s) in the corresponding sector.
               *
               * @this {Disk}
               * @param {Array} deltas
               * @return {number} 0 if no changes applied, -1 if an error occurred, otherwise the number of sectors modified
               */
              Disk.prototype.restore = function(deltas)
              {
                  /*
                   * If deltas is undefined, that's not necessarily an error;  the controller may simply be (re)initializing
                   * itself (although neither controller should be calling restore() under those conditions anymore).
                   */
                  var nChanges = 0;
                  var sReason = "unsupported restore format";
                  /*
                   * I originally added a check for aDiskData here on the assumption that if there was an error loading
                   * a disk image, we will have already notified the user, so any additional errors about differing checksums,
                   * failure to restore the disk state, etc, would just be annoying.  HOWEVER, HDC will create an empty disk
                   * image if its initialization code discovers that no disk was loaded earlier (see verifyDrive).  So while
                   * checking aDiskData is still a good idea, be aware that it won't necessarily avoid redundant error messages
                   * (at least in the case of HDC).
                   */
                  if (deltas && deltas.length > 0) {
              
                      var i = 0;
                      var aDiskInfo = deltas[i++];
              
                      if (aDiskInfo && aDiskInfo.length >= 2) {
                          /*
                           * Before getting to the checksum, we have to deal with a new situation: restoring an uninitialized
                           * disk image from a complete set of deltas.  And that is only possible if the disk was saved with the
                           * original disk geometry.
                           */
                          if (!this.aDiskData.length && aDiskInfo.length >= 6) {
                              this.create(DiskAPI.MODE.LOCAL, aDiskInfo[2], aDiskInfo[3], aDiskInfo[4], aDiskInfo[5]);
                              /*
                               * TODO: Consider setting a flag here that we can check at the end of the restore() function
                               * that indicates we should recalculate dwChecksum, because we currently have an inconsistency
                               * between local disks that are mounted via build() and the same disks that are "remounted"
                               * later by this code; the former has the correct checksum, while the latter has a null checksum.
                               *
                               * As you can see below, we currently deal with this by simply ignoring null checksums....
                               */
                          }
                          /*
                           * v1.01 failed to indicate an error if either one of these failure conditions occurred.  Although maybe that's
                           * just as well, since v1.01 also failed to properly deal with situations where the user mounted different diskette(s)
                           * prior to exiting (hopefully fixed in v1.02).
                           */
                          else if (aDiskInfo[1] != null && this.dwChecksum != null && aDiskInfo[1] != this.dwChecksum) {
                              sReason = "original checksum (" + aDiskInfo[1] + ") differs from current checksum (" + this.dwChecksum + ")";
                              nChanges = -2;
                          }
                          /*
                           * Checksum is more important than disk path, and for now, I want the flexibility to move disk images.
                           *
                          else if (aDiskInfo[0] != this.sDiskPath) {
                              sReason = "original path '" + aDiskInfo[0] + "' differs from current path '" + this.sDiskPath + "'";
                              nChanges = -1;
                          }
                           */
                      }
              
                      if (!this.aDiskData.length) nChanges = -1;
              
                      while (i < deltas.length && nChanges >= 0) {
                          var m = 0;
                          var mod = deltas[i++];
                          var iCylinder = mod[m++];
                          var iHead = mod[m++];
                          var iSector = mod[m++];
                          /*
                           * Note the buried test for write-protection.  Yes, an invariant condition should be tested
                           * outside the loop, not inside, but (a) it's a trivial test, (b) the test should never fail
                           * because save() should never generate any mods for a write-protected disk, and (c) it
                           * centralizes all the failure conditions we're currently checking (which, admittedly, ain't much).
                           */
                          if (iCylinder >= this.aDiskData.length || iHead >= this.aDiskData[iCylinder].length || iSector >= this.aDiskData[iCylinder][iHead].length) {
                              sReason = "sector (CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") out of range (" + nChanges + " changes applied)";
                              nChanges = -1;
                              break;
                          }
                          if (this.fWriteProtected) {
                              sReason = "unable to modify write-protected disk";
                              nChanges = -1;
                              break;
                          }
                          var iModify = mod[m++];
                          var mods = mod[m++];
                          var iModifyLimit = iModify + mods.length;
                          var sector = this.aDiskData[iCylinder][iHead][iSector];
                          if (!sector) continue;
                          /*
                           * Since write() now deals with empty/partial sectors, we no longer need to completely "inflate" the sector prior
                           * to applying modifications.  So let's just make sure that the sector is "inflated" up to iModify.
                           */
                          var idw = sector['data'].length;
                          while (idw < iModify) {
                              sector['data'][idw++] = sector['pattern'];
                          }
                          var n = 0;
                          sector.iModify = iModify;
                          sector.cModify = mods.length;
                          while (iModify < iModifyLimit) {
                              sector['data'][iModify++] = mods[n++];
                          }
                          nChanges++;
                      }
                  }
              
                  if (nChanges < 0) {
                      /*
                       * We're suppressing checksum messages for the general public for now....
                       */
                      if (DEBUG || nChanges != -2) {
                          this.controller.notice("Unable to restore disk '" + this.sDiskName + ": " + sReason);
                      }
                  } else {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage('restore("' + this.sDiskName + '"): restored ' + nChanges + ' change(s)');
                      }
                  }
                  return nChanges;
              };
              
              /**
               * toJSON()
               *
               * We perform some RegExp massaging on the JSON data to eliminate unnecessary properties
               * (eg, 'length' values of 512, 'pattern' values of 0, quotes around the property names, etc).
               * Sectors that were initially compressed should remain compressed unless/until they were modified.
               *
               * TODO: Check sectors (or at least modified sectors) to see if they can be recompressed.
               *
               * @this {Disk}
               * @return {string} containing the entire disk image as JSON-encoded data
               */
              Disk.prototype.toJSON = function()
              {
                  var s = JSON.stringify(this.aDiskData);
                  s = s.replace(/,"length":512/gm, "").replace(/,"pattern":0/gm, "");
                  /*
                   * I don't really want to strip quotes from disk image property names, since I would have to put them
                   * back again during mount() -- or whenever JSON.parse() is used instead of eval().  But I still remove
                   * them temporarily, so that any remaining property names (eg, "iModify", "cModify", "fDirty") can
                   * easily be stripped out, by virtue of their being the only quoted properties left.  We then "requote"
                   * all the property names that remain.
                   */
                  s = s.replace(/"(sector|length|data|pattern)":/gm, "$1:");
                  /*
                   * The next line will remove any other numeric or boolean properties that were added at runtime, although
                   * they may have completely different ("minified") names if the code has been compiled.
                   */
                  s = s.replace(/,"[^"]*":([0-9]+|true|false)/gm, "");
                  s = s.replace(/(sector|length|data|pattern):/gm, "\"$1\":");
                  return s;
              };
              
              /**
               * dumpSector(sector, pba, sDesc)
               *
               * @param {Object} sector (returned from a previous seek)
               * @param {number} [pba]
               * @param {string} [sDesc]
               * @return {string}
               */
              Disk.prototype.dumpSector = function(sector, pba, sDesc)
              {
                  var sDump = "";
                  if (DEBUG && sector) {
                      if (pba != null) sDump += "sector " + pba + (sDesc? (" for " + sDesc) : "") + ':';
                      var sBytes = "", sChars = "";
                      var cbSector = sector['length'];
                      var cdwData = sector['data'].length;
                      var dw = 0;
                      for (var i = 0; i < cbSector; i++) {
                          if ((i % 16) === 0) {
                              if (sDump) sDump += sBytes + ' ' + sChars + '\n';
                              sDump += str.toHex(i, 4) + ": ";
                              sBytes = sChars = "";
                          }
                          if ((i % 4) === 0) {
                              var idw = i >> 2;
                              dw = (idw < cdwData? sector['data'][idw] : sector['pattern']);
                          }
                          var b = dw & 0xff;
                          dw >>>= 8;
                          sBytes += str.toHex(b, 2) + (i % 16 == 7? "-" : " ");
                          sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                      }
                      if (sBytes) sDump += sBytes + ' ' + sChars;
                  }
                  return sDump;
              };
              
              if (typeof module !== 'undefined') module.exports = Disk;
              
            • fdc.js
              /**
               * @fileoverview Implements the PCjs Floppy Drive Controller (FDC) component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Aug-09
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var DiskAPI     = require("../../shared/lib/diskapi");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var ChipSet     = require("./chipset");
                  var Disk        = require("./disk");
                  var Computer    = require("./computer");
                  var State       = require("./state");
              }
              
              /*
               * FDC Terms (see FDC.TERMS)
               *
               *      C       Cylinder Number         the current or selected cylinder number
               *
               *      D       Data                    the data pattern to be written to a sector
               *
               *      DS      Drive Select            the selected driver number encoded the same as bits 0 and 1 of the Digital Output
               *                                      Register (DOR); eg, DS0, DS1, DS2, or DS3
               *
               *      DTL     Data Length             when N is 00, DTL is the data length to be read from or written to a sector
               *
               *      EOT     End Of Track            the final sector number on a cylinder
               *
               *      GPL     Gap Length              the length of gap 3 (spacing between sectors excluding the VCO synchronous field)
               *
               *      H       Head Address            the head number, either 0 or 1, as specified in the ID field
               *
               *      HD      Head                    the selected head number, 0 or 1 (H = HD in all command words)
               *
               *      HLT     Head Load Time          the head load time in the selected drive (2 to 256 milliseconds in 2-millisecond
               *                                      increments for the 1.2M-byte drive and 4 to 512 milliseconds in 4 millisecond increments
               *                                      for the 320K-byte drive)
               *
               *      HUT     Head Unload Time        the head unload time after a read or write operation (0 to 240 milliseconds in
               *                                      16-millisecond increments for the 1.2M-byte drive and 0 to 480 milliseconds in
               *                                      32-millisecond increments for the 320K-byte drive)
               *
               *      MF      FM or MFM Mode          0 selects FM mode and 1 selects MFM (MFM is selected only if it is implemented)
               *
               *      MT      Multitrack              1 selects multitrack operation (both HD0 and HD1 will be read or written)
               *
               *      N       Number                  the number of data bytes written in a sector
               *
               *      NCN     New Cylinder Number     the new cylinder number for a SEEK operation
               *
               *      ND      Non-Data Mode           indicates an operation in the non-data mode
               *
               *      PCN     Present Cylinder Number the cylinder number at the completion of a SENSE INTERRUPT STATUS command
               *                                      (present position of the head)
               *
               *      R       Record                  the sector number to be read or written
               *
               *      SC      Sectors Per Cylinder    the number of sectors per cylinder
               *
               *      SK      Skip                    this stands for skip deleted-data address mark
               *
               *      SRT     Stepping Rate           this 4 bit byte indicates the stepping rate for the diskette drive as follows:
               *                                      1.2M-Byte Diskette Drive: 1111=1ms, 1110=2ms, 1101=3ms
               *                                      320K-Byte Diskette Drive: 1111=2ms, 1110=4ms, 1101=6ms
               *
               *      STP     STP Scan Test           if STP is 1, the data in contiguous sectors is compared with the data sent
               *                                      by the processor during a scan operation; if STP is 2, then alternate sections
               *                                      are read and compared
               */
              
              /**
               * FDC(parmsFDC)
               *
               * The FDC component simulates a NEC µPD765A or Intel 8272A compatible floppy disk controller, and has one
               * component-specific property:
               *
               *      autoMount: one or more JSON-encoded objects, each containing 'name' and 'path' properties
               *
               * Regarding early diskette drives: the IBM PC Model 5150 originally shipped with single-sided drives,
               * and therefore supported only 160Kb diskettes.  That's the only diskette format PC-DOS 1.00 supported, too.
               *
               * At some point, 5150's started shipping with double-sided drives, but I'm not sure whether the ROMs changed;
               * they probably did NOT change, because the original ROM BIOS already supported drives with multiple heads.
               * However, what the ROM BIOS did NOT do was provide any indication of drive type, which as far as I can tell,
               * meant you had to simply read/write/format tracks with the second head and check for errors.
               *
               * Presumably at the same time double-sided drives started shipping, PC-DOS 1.10 shipped, which added
               * support for 320Kb diskettes.  And the FORMAT command changed as well, defaulting to a double-sided format
               * operation UNLESS you specified "FORMAT /1".  If I run PC-DOS 1.10 and try to simulate a single-sided drive
               * (by setting drive.nHeads = 1 in initDrive), FORMAT will balk with "Track 0 bad - disk unusable".  I have to
               * wonder if everyone with single-sided drives who upgraded to PC-DOS 1.10 also got that error, forcing them
               * to always specify "FORMAT /1", or if I'm doing something wrong wrt single-sided drive simulation.
               *
               * I've noticed that if I turn FDC messages on ("m fdc on"), and then run "FORMAT B:/1", the command still
               * tries to format head 1/track 0, followed by head 0/track 0, and then the FDC is reset, and the format operation
               * proceeds with only head 0 for all tracks 0 through 39.  FORMAT successfully creates a 160Kb single-sided diskette,
               * but why it also tries to initially format track 0 using the second head remains a bit of a mystery.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsFDC
               */
              function FDC(parmsFDC) {
                  /*
                   * TODO: Indicate the type of diskette image being loaded (this might help folks understand what's going
                   * on when they try to load a diskette image that's larger than what the selected operating system supports).
                   */
                  Component.call(this, "FDC", parmsFDC, FDC, Messages.FDC);
              
                  this['dmaRead'] = this.dmaRead;
                  this['dmaWrite'] = this.dmaWrite;
                  this['dmaFormat'] = this.dmaFormat;
              
                  this.configMount = null;
                  if (parmsFDC['autoMount']) {
                      this.configMount = parmsFDC['autoMount'];
                      if (typeof this.configMount == "string") {
                          try {
                              /*
                               * The most likely source of any exception will be right here, where we're parsing
                               * the JSON-encoded diskette data.
                               */
                              this.configMount = eval("(" + parmsFDC['autoMount'] + ")");
                          } catch (e) {
                              Component.error("FDC auto-mount error: " + e.message + " (" + parmsFDC['autoMount'] + ")");
                              this.configMount = null;
                          }
                      }
                  }
              
                  /*
                   * The following array keeps track of every disk image we've ever mounted.  Each entry in the
                   * array is another array whose elements are:
                   *
                   *      [0]: name of disk
                   *      [1]: path of disk
                   *      [2]: array of deltas, uninitialized until the disk is unmounted and/or all state is saved
                   *
                   * See functions addDiskHistory() and updateDiskHistory().
                   */
                  this.aDiskHistory = [];
              
                  /*
                   * Support for local disk images is currently limited to desktop browsers with FileReader support;
                   * when this flag is set, setBinding() allows local disk bindings and informs initBus() to update the
                   * "listDisks" binding accordingly.
                   */
                  this.fLocalDisks = (!web.isMobile() && window && 'FileReader' in window);
              
                  /*
                   * The remainder of FDC initialization now takes place in our initBus() handler, largely because we
                   * want initController() to have access to the ChipSet component, so that it can query switches and/or CMOS
                   * settings that determine the number of drives and their characteristics (eg, 40-track vs. 80-track),
                   * which it can then pass on to initDrive().
                   */
              }
              
              Component.subclass(FDC);
              
              FDC.DEFAULT_DRIVE_NAME = "Floppy Drive";
              
              if (DEBUG) {
                  FDC.TERMS = {
                      C:   "C",       // Cylinder Number
                      D:   "D",       // Data (eg, pattern to be written to a sector)
                      H:   "H",       // Head Address
                      R:   "R",       // Record (ie, sector number to be read or written)
                      N:   "N",       // Number (ie, number of data bytes to write)
                      DS:  "DS",      // Drive Select
                      SC:  "SC",      // Sectors per Cylinder
                      DTL: "DTL",     // Data Length
                      EOT: "EOT",     // End of Track
                      GPL: "GPL",     // Gap Length
                      HLT: "HLT",     // Head Load Time
                      NCN: "NCN",     // New Cylinder Number
                      PCN: "PCN",     // Present Cylinder Number
                      SRT: "SRT",     // Stepping Rate
                      ST0: "ST0",     // Status Register 0
                      ST1: "ST1",     // Status Register 1
                      ST2: "ST2",     // Status Register 2
                      ST3: "ST3"      // Status Register 3
                  };
              } else {
                  FDC.TERMS = {};
              }
              
              /*
               * FDC Digital Output Register (DOR) (0x3F2, write-only)
               *
               * NOTE: Reportedly, a drive's MOTOR had to be ON before the drive could be selected; however, outFDCOutput() no
               * longer verifies that.  Also, motor start time for original drives was 500ms, but we make no attempt to simulate that.
               *
               * On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", this port is called the Digital Output Register
               * or DOR.  It uses the same bit definitions as the original FDC Output Register, except that only two diskette drives
               * are supported, hence bit 1 is always 0 (ie, FDC.REG_OUTPUT.DS2 and FDC.REG_OUTPUT.DS3 are not supported) and bits
               * 6 and 7 are unused (FDC.REG_OUTPUT.MOTOR_D2 and FDC.REG_OUTPUT.MOTOR_D3 are not supported).
               */
              FDC.REG_OUTPUT = {
                  PORT:      0x3F2,
                  DS:         0x03,   // drive select bits
                  DS0:        0x00,
                  DS1:        0x01,
                  DS2:        0x02,   // reserved on the MODEL_5170
                  DS3:        0x03,   // reserved on the MODEL_5170
                  ENABLE:     0x04,   // clearing this bit resets the FDC
                  INT_ENABLE: 0x08,   // enables both FDC and DMA (Channel 2) interrupt requests (IRQ 6)
                  MOTOR_D0:   0x10,
                  MOTOR_D1:   0x20,
                  MOTOR_D2:   0x40,   // reserved on the MODEL_5170
                  MOTOR_D3:   0x80    // reserved on the MODEL_5170
              };
              
              /*
               * FDC Main Status Register (0x3F4, read-only)
               *
               * On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", bits 2 and 3 are reserved, since that adapter
               * supported a maximum of two diskette drives.
               */
              FDC.REG_STATUS = {
                  PORT:      0x3F4,
                  BUSY_A:     0x01,
                  BUSY_B:     0x02,
                  BUSY_C:     0x04,   // reserved on the MODEL_5170
                  BUSY_D:     0x08,   // reserved on the MODEL_5170
                  BUSY:       0x10,   // a read or write command is in progress
                  NON_DMA:    0x20,   // FDC is in non-DMA mode
                  READ_DATA:  0x40,   // transfer is from FDC Data Register to processor (if clear, then transfer is from processor to the FDC Data Register)
                  RQM:        0x80    // indicates FDC Data Register is ready to send or receive data to or from the processor (Request for Master)
              };
              
              /*
               * FDC Data Register (0x3F5, read-write)
               */
              FDC.REG_DATA = {
                  PORT:      0x3F5,
                  /*
                   * FDC Commands
                   *
                   * NOTE: FDC command bytes need to be masked with FDC.REG_DATA.CMD.MASK before comparing to the values below, since a
                   * number of commands use the following additional bits as follows:
                   *
                   *      SK (0x20): Skip Deleted Data Address Mark
                   *      MF (0x40): Modified Frequency Modulation (as opposed to FM or Frequency Modulation)
                   *      MT (0x80): multi-track operation (ie, data processed under both head 0 and head 1)
                   *
                   * We don't support MT (Multi-Track) operations at this time, and the MF and SK designations cannot be supported as long
                   * as our diskette images contain only the original data bytes without any formatting information.
                   */
                  CMD: {
                      READ_TRACK:     0x02,
                      SPECIFY:        0x03,
                      SENSE_DRIVE:    0x04,
                      WRITE_DATA:     0x05,
                      READ_DATA:      0x06,
                      RECALIBRATE:    0x07,
                      SENSE_INT:      0x08,       // this command is used to clear the FDC interrupt following the clearing/setting of FDC.REG_OUTPUT.ENABLE
                      WRITE_DEL_DATA: 0x09,
                      READ_ID:        0x0A,
                      READ_DEL_DATA:  0x0C,
                      FORMAT_TRACK:   0x0D,
                      SEEK:           0x0F,
                      SCAN_EQUAL:     0x11,
                      SCAN_LO_EQUAL:  0x19,
                      SCAN_HI_EQUAL:  0x1D,
                      MASK:           0x1F,
                      SK:             0x20,       // SK (Skip Deleted Data Address Mark)
                      MF:             0x40,       // MF (Modified Frequency Modulation)
                      MT:             0x80        // MT (Multi-Track; ie, data under both heads will be processed)
                  },
                  /*
                   * FDC status/error results, generally assigned according to the corresponding ST0, ST1, ST2 or ST3 status bit.
                   *
                   * TODO: Determine when EQUIP_CHECK is *really* set; also, "77 step pulses" sounds suspiciously like a typo (it's not 79?)
                   */
                  RES: {
                      NONE:           0x00000000, // ST0 (IC): Normal termination of command (NT)
                      NOT_READY:      0x00000008, // ST0 (NR): When the FDD is in the not-ready state and a read or write command is issued, this flag is set; if a read or write command is issued to side 1 of a single sided drive, then this flag is set
                      EQUIP_CHECK:    0x00000010, // ST0 (EC): If a fault signal is received from the FDD, or if the track 0 signal fails to occur after 77 step pulses (recalibrate command), then this flag is set
                      SEEK_END:       0x00000020, // ST0 (SE): When the FDC completes the Seek command, this flag is set to 1 (high)
                      INCOMPLETE:     0x00000040, // ST0 (IC): Abnormal termination of command (AT); execution of command was started, but was not successfully completed
                      RESET:          0x000000C0, // ST0 (IC): Abnormal termination because during command execution the ready signal from the drive changed state
                      INVALID:        0x00000080, // ST0 (IC): Invalid command issue (IC); command which was issued was never started
                      ST0:            0x000000FF,
                      NO_ID_MARK:     0x00000100, // ST1 (MA): If the FDC cannot detect the ID Address Mark, this flag is set; at the same time, the MD (Missing Address Mark in Data Field) of Status Register 2 is set
                      NOT_WRITABLE:   0x00000200, // ST1 (NW): During Execution of a Write Data, Write Deleted Data, or Format a Cylinder command, if the FDC detects a write protect signal from the FDD, then this flag is set
                      NO_DATA:        0x00000400, // ST1 (ND): FDC cannot find specified sector (or specified ID if READ_ID command)
                      DMA_OVERRUN:    0x00001000, // ST1 (OR): If the FDC is not serviced by the main systems during data transfers within a certain time interval, this flag is set
                      CRC_ERROR:      0x00002000, // ST1 (DE): When the FDC detects a CRC error in either the ID field or the data field, this flag is set
                      END_OF_CYL:     0x00008000, // ST1 (EN): When the FDC tries to access a sector beyond the final sector of a cylinder, this flag is set
                      ST1:            0x0000FF00,
                      NO_DATA_MARK:   0x00010000, // ST2 (MD): When data is read from the medium, if the FDC cannot find a Data Address Mark or Deleted Data Address Mark, then this flag is set
                      BAD_CYL:        0x00020000, // ST2 (BC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, and the content of C is FF, then this flag is set
                      SCAN_FAILED:    0x00040000, // ST2 (SN): During execution of the Scan command, if the FDC cannot find a sector on the cylinder which meets the condition, then this flag is set
                      SCAN_EQUAL:     0x00080000, // ST2 (SH): During execution of the Scan command, if the condition of "equal" is satisfied, this flag is set
                      WRONG_CYL:      0x00100000, // ST2 (WC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, this flag is set
                      DATA_FIELD:     0x00200000, // ST2 (DD): If the FDC detects a CRC error in the data, then this flag is set
                      STRL_MARK:      0x00400000, // ST2 (CM): During execution of the Read Data or Scan command, if the FDC encounters a sector which contains a Deleted Data Address Mark, this flag is set
                      ST2:            0x00FF0000,
                      DRIVE:          0x03000000, // ST3 (Ux): Status of the "Drive Select" signals from the diskette drive
                      HEAD:           0x04000000, // ST3 (HD): Status of the "Side Select" signal from the diskette drive
                      TWOSIDE:        0x08000000, // ST3 (TS): Status of the "Two Side" signal from the diskette drive
                      TRACK0:         0x10000000, // ST3 (T0): Status of the "Track 0" signal from the diskette drive
                      READY:          0x20000000, // ST3 (RY): Status of the "Ready" signal from the diskette drive
                      WRITEPROT:      0x40000000, // ST3 (WP): Status of the "Write Protect" signal from the diskette drive
                      FAULT:          0x80000000|0, // ST3 (FT): Status of the "Fault" signal from the diskette drive
                      ST3:            0xFF000000|0
                  }
              };
              
              /*
               * FDC "Fixed Disk" Register (0x3F6, write-only)
               *
               * Since this register's functions are all specific to the Hard Disk Controller, see the HDC component for details.
               * The fact that this HDC register is in the middle of the FDC I/O port range is an oddity of the "HFCOMBO" controller.
               */
              
              /*
               * FDC Digital Input Register (0x3F7, read-only, MODEL_5170 only)
               *
               * Bit 7 indicates a diskette change (the MODEL_5170 introduced change-line support).  Bits 0-6 are for the selected
               * hard disk drive, so this port must be shared with the HDC; bits 0-6 are valid for 50 microseconds after a write to
               * the Drive Head Register.
               */
              FDC.REG_INPUT = {
                  PORT:      0x3F7,
                  DS0:        0x01,   // Drive Select 0
                  DS1:        0x02,   // Drive Select 1
                  HS0:        0x04,   // Head Select 0
                  HS1:        0x08,   // Head Select 1
                  HS2:        0x10,   // Head Select 2
                  HS3:        0x20,   // Head Select 3
                  WRITE_GATE: 0x40,   // Write Gate
                  DISK_CHANGE:0x80    // Diskette Change
              };
              
              /*
               * FDC Diskette Control Register (0x3F7, write-only, MODEL_5170 only)
               *
               * Only bits 0-1 are used; bits 2-7 are reserved.
               */
              FDC.REG_CONTROL = {
                  PORT:      0x3F7,
                  RATE500K:   0x00,   // 500,000 bps
                  RATE300K:   0x02,   // 300,000 bps
                  RATE250K:   0x01,   // 250,000 bps
                  RATEUNUSED: 0x03
              };
              
              /*
               * FDC Command Sequences
               *
               * For each command, cbReq indicates the total number of bytes in the command request sequence,
               * including the first (command) byte; cbRes indicates total number of bytes in the response sequence.
               */
              if (DEBUG) {
                  FDC.CMDS = {
                      SPECIFY:      "SPECIFY",
                      SENSE_DRIVE:  "SENSE DRIVE",
                      WRITE_DATA:   "WRITE DATA",
                      READ_DATA:    "READ DATA",
                      RECALIBRATE:  "RECALIBRATE",
                      SENSE_INT:    "SENSE INTERRUPT",
                      READ_ID:      "READ ID",
                      FORMAT:       "FORMAT",
                      SEEK:         "SEEK"
                  };
              } else {
                  FDC.CMDS = {};
              }
              
              FDC.aCmdInfo = {
                  0x03: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SPECIFY},
                  0x04: {cbReq: 2, cbRes: 1, name: FDC.CMDS.SENSE_DRIVE},
                  0x05: {cbReq: 9, cbRes: 7, name: FDC.CMDS.WRITE_DATA},
                  0x06: {cbReq: 9, cbRes: 7, name: FDC.CMDS.READ_DATA},
                  0x07: {cbReq: 2, cbRes: 0, name: FDC.CMDS.RECALIBRATE},
                  0x08: {cbReq: 1, cbRes: 2, name: FDC.CMDS.SENSE_INT},
                  0x0A: {cbReq: 2, cbRes: 7, name: FDC.CMDS.READ_ID},
                  0x0D: {cbReq: 6, cbRes: 7, name: FDC.CMDS.FORMAT},
                  0x0F: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SEEK}
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {FDC}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              FDC.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var fdc = this;
              
                  switch (sBinding) {
              
                  case "listDisks":
                      this.bindings[sBinding] = control;
              
                      control.onchange = function onChangeListDisks(event) {
                          var controlDesc = fdc.bindings["descDisk"];
                          var controlOption = control.options[control.selectedIndex];
                          if (controlDesc && controlOption) {
                              var dataValue = {};
                              var sValue = controlOption.getAttribute("data-value");
                              if (sValue) {
                                  try {
                                      dataValue = eval("({" + sValue + "})");
                                  } catch (e) {
                                      Component.error("FDC option error: " + e.message);
                                  }
                              }
                              var sHTML = dataValue['desc'];
                              if (sHTML === undefined) sHTML = "";
                              var sHRef = dataValue['href'];
                              if (sHRef !== undefined) sHTML = "<a href=\"" + sHRef + "\" target=\"_blank\">" + sHTML + "</a>";
                              controlDesc.innerHTML = sHTML;
                          }
                      };
                      return true;
              
                  case "descDisk":
                  case "listDrives":
                      this.bindings[sBinding] = control;
                      /*
                       * I tried going with onclick instead of onchange, so that if you wanted to confirm what's
                       * loaded in a particular drive, you could click the drive control without having to change it.
                       * However, that doesn't seem to work for all browsers, so I've reverted to onchange.
                       */
                      control.onchange = function onChangeListDrives(event) {
                          var iDrive = str.parseInt(control.value, 10);
                          if (iDrive != null) fdc.displayDiskette(iDrive);
                      };
                      return true;
              
                  case "loadDrive":
                      this.bindings[sBinding] = control;
                      control.onclick = function onClickLoadDrive(event) {
                          var controlDisks = fdc.bindings["listDisks"];
                          if (controlDisks) {
                              var sDisketteName = controlDisks.options[controlDisks.selectedIndex].text;
                              var sDiskettePath = controlDisks.value;
                              fdc.loadSelectedDrive(sDisketteName, sDiskettePath);
                          }
                      };
                      return true;
              
                  case "mountDrive":
                      if (this.fLocalDisks) {
                          this.bindings[sBinding] = control;
                          /*
                           * Enable "Mount" button only if a file is actually selected
                           */
                          control.addEventListener('change', function() {
                              var fieldset = control.children[0];
                              var files = fieldset.children[0].files;
                              var submit = fieldset.children[1];
                              submit.disabled = !files.length;
                          });
              
                          control.onsubmit = function(event) {
                              var file = event.currentTarget[1].files[0];
                              if (file) {
                                  var sDiskettePath = file.name;
                                  var sDisketteName = str.getBaseName(sDiskettePath, true);
                                  fdc.loadSelectedDrive(sDisketteName, sDiskettePath, file);
                              }
                              /*
                               * Prevent reloading of web page after form submission
                               */
                              return false;
                          };
                      }
                      else {
                          if (DEBUG) this.log("Local file support not available");
                          control.parentNode.removeChild(control);
                      }
                      return true;
              
                  default:
                      break;
                  }
                  return false;
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {FDC}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              FDC.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.cmp = cmp;
              
                  this.chipset = cmp.getComponentByType("ChipSet");
              
                  /*
                   * If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp() notification,
                   * at which point reset() would call initController(), or restore() would restore the controller; in that case, all we'd need
                   * to do here is call setReady().
                   */
                  this.initController();
              
                  bus.addPortInputTable(this, FDC.aPortInput);
                  bus.addPortOutputTable(this, FDC.aPortOutput);
              
                  if (this.fLocalDisks) {
                      this.addDiskette("Local Disk", "?");
                  }
                  this.addDiskette("Remote Disk", "??");
              
                  if (!this.autoMount()) this.setReady();
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {FDC}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              FDC.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.reset();
                          if (this.cmp.fReload) {
                              /*
                               * If the computer's fReload flag is set, we're required to toss all currently
                               * loaded disks and remount all disks specified in the auto-mount configuration.
                               */
                              this.unloadAllDrives(true);
                              this.autoMount(true);
                          }
                      } else {
                          if (!this.restore(data)) return false;
                      }
                      /*
                       * Populate the HTML controls to match the actual (well, um, specified) number of floppy drives.
                       */
                      var controlDrives;
                      if ((controlDrives = this.bindings['listDrives'])) {
                          while (controlDrives.firstChild) {
                              controlDrives.removeChild(controlDrives.firstChild);
                          }
                          controlDrives.textContent = "";
                          for (var iDrive = 0; iDrive < this.nDrives; iDrive++) {
                              var controlOption = window.document.createElement("option");
                              controlOption['value'] = iDrive;
                              /*
                               * TODO: This conversion of drive number to drive letter, starting with A:, is very simplistic
                               * and will NOT match the drive mappings that DOS ultimately uses.  We'll need to spiff this up at
                               * some point.
                               */
                              controlOption.textContent = String.fromCharCode(0x41 + iDrive) + ":";
                              controlDrives.appendChild(controlOption);
                          }
                          if (this.nDrives > 0) {
                              controlDrives.value = "0";
                              this.displayDiskette(0);
                          }
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {FDC}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              FDC.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * reset()
               *
               * NOTE: initController() establishes the maximum possible number of drives, but it's not until
               * we interrogate the current SW1 settings that we will have an ACTUAL number of drives (nDrives),
               * at which point we can also update the contents of the "listDrives" HTML control, if any.
               *
               * @this {FDC}
               */
              FDC.prototype.reset = function()
              {
                  /*
                   * NOTE: The controller is also initialized by the constructor, to assist with auto-mount support,
                   * so think about whether we can skip powerUp initialization.
                   */
                  this.initController();
              };
              
              /**
               * save()
               *
               * This implements save support for the FDC component.
               *
               * @this {FDC}
               * @return {Object}
               */
              FDC.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.saveController());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the FDC component.
               *
               * @this {FDC}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              FDC.prototype.restore = function(data)
              {
                  return this.initController(data[0]);
              };
              
              /**
               * initController(data)
               *
               * @this {FDC}
               * @param {Array} [data]
               * @return {boolean} true if successful, false if failure
               */
              FDC.prototype.initController = function(data)
              {
                  var i = 0, iDrive;
                  var fSuccess = true;
              
                  if (data === undefined) {
                      data = [0, 0, FDC.REG_STATUS.RQM, new Array(9), 0, 0, 0, []];
                  }
              
                  /*
                   * Selected drive (from regOutput), which can only be selected if its motor is on (see regOutput).
                   */
                  this.iDrive = data[i++];
                  i++;                        // unused slot (if reused, bias by +4, since it was formerly a unit #)
              
                  /*
                   * Defaults to FDC.REG_STATUS.RQM set (ready for command) and FDC.REG_STATUS.READ_DATA clear (data direction
                   * is from processor to the FDC Data Register).
                   */
                  this.regStatus = data[i++];
              
                  /*
                   * There can be up to 9 command bytes, and 7 result bytes, so 9 data registers are sufficient for communicating
                   * in both directions (hence, the new Array(9) default above).
                   */
                  this.regDataArray = data[i++];
              
                  /*
                   * Determines the next data byte to be received.
                   */
                  this.regDataIndex = data[i++];
              
                  /*
                   * Determines the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total).
                   */
                  this.regDataTotal = data[i++];
                  this.regOutput = data[i++];
                  var dataDrives = data[i++];
              
                  /*
                   * Initialize the disk history (if available) before initializing the drives, so that any disk deltas can be
                   * applied to disk images that are already loaded.
                   */
                  var aDiskHistory = data[i++];
                  if (aDiskHistory != null) this.aDiskHistory = aDiskHistory;
              
                  if (this.aDrives === undefined) {
                      this.nDrives = 4;                       // default to the maximum number of drives
                      if (this.chipset) this.nDrives = this.chipset.getSWFloppyDrives();
                      /*
                       * I would prefer to allocate only nDrives, but as discussed in the handling of the FDC.REG_DATA.CMD.SENSE_INT
                       * command, we're faced with situations where the controller must respond to any drive in the range 0-3, regardless
                       * how many drives are actually installed.  We still rely upon nDrives to determine the number of drives displayed
                       * to the user, however.
                       */
                      this.aDrives = new Array(4);
                  }
              
                  for (iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      var drive = this.aDrives[iDrive];
                      if (drive === undefined) {
                          /*
                           * The first time each drive is initialized, we query its capacity (based on switches or CMOS) and set
                           * the drive's physical limits accordingly (ie, max tracks, max heads, and max sectors/track).
                           */
                          drive = this.aDrives[iDrive] = {};
                          var nKb = (this.chipset? this.chipset.getSWFloppyDriveSize(iDrive) : 0);
                          switch(nKb) {
                          case 160:
                          case 180:
                              drive.nHeads = 1;       // required for single-sided drives only (all others default to double-sided)
                              /* falls through */
                          case 320:
                          case 360:
                              /* falls through */
                          default:                    // drives that don't have a recognized capacity default to 360
                              drive.nCylinders = 40;
                              drive.nSectors = 9;     // drives capable of writing 8 sectors/track can also write 9 sectors/track
                              break;
                          case 720:
                              drive.nCylinders = 80;
                              drive.nSectors = 9;
                              break;
                          case 1200:
                              drive.nCylinders = 80;
                              drive.nSectors = 15;
                              break;
                          case 1440:
                              drive.nCylinders = 80;
                              drive.nSectors = 18;
                              break;
                          }
                      }
                      if (!this.initDrive(drive, iDrive, dataDrives[iDrive])) {
                          fSuccess = false;
                      }
                  }
              
                  /*
                   * regInput and regControl (port 0x3F7) were not present on controllers prior to MODEL_5170, which is why
                   * we don't include initializers for them in the default data array; we could eliminate them on older models,
                   * but we don't have access to the model info right now, and there's no real cost to always including them
                   * in the FDC state.
                   *
                   * The bigger compatibility question is whether to always include hooks for them (see aPortInput and aPortOutput).
                   */
                  this.regInput = data[i++] || 0;                             // TODO: Determine if we should default to FDC.REG_INPUT.DISK_CHANGE instead of 0
                  this.regControl = data[i] || FDC.REG_CONTROL.RATE500K;      // default to maximum data rate
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("FDC initialized for " + this.aDrives.length + " drive(s)");
                  }
                  return fSuccess;
              };
              
              /**
               * saveController()
               *
               * @this {FDC}
               * @return {Array}
               */
              FDC.prototype.saveController = function()
              {
                  var i = 0;
                  var data = [];
                  data[i++] = this.iDrive;
                  data[i++] = 0;
                  data[i++] = this.regStatus;
                  data[i++] = this.regDataArray;
                  data[i++] = this.regDataIndex;
                  data[i++] = this.regDataTotal;
                  data[i++] = this.regOutput;
                  data[i++] = this.saveDrives();
                  data[i++] = this.saveDeltas();
                  data[i++] = this.regInput;
                  data[i] = this.regControl;
                  return data;
              };
              
              /**
               * initDrive(drive, iDrive, data)
               *
               * TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
               * between the drive objects created by both controllers.  This will clean up overall drive management and allow
               * us to factor out some common Drive methods (eg, advanceSector()).
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} iDrive
               * @param {Array|undefined} data
               * @return {boolean} true if successful, false if failure
               */
              FDC.prototype.initDrive = function(drive, iDrive, data)
              {
                  var i = 0;
                  var fSuccess = true;
              
                  drive.iDrive = iDrive;
                  drive.fBusy = drive.fLocal = false;
              
                  if (data === undefined) {
                      /*
                       * We set a default of two heads (MODEL_5150 PCs originally shipped with single-sided drives,
                       * but the ROM BIOS appears to have always supported both drive types).
                       */
                      data = [FDC.REG_DATA.RES.RESET, true, 0, 2, 0];
                  }
              
                  if (typeof data[1] == "boolean") {
                      /*
                       * Note that when no data is provided (eg, when the controller is being reinitialized), we now take
                       * care to preserve any drive defaults that initController() already obtained for us, falling back to
                       * bare minimums only when all else fails.
                       */
                      data[1] = [
                          FDC.DEFAULT_DRIVE_NAME, // a[0]
                          drive.nCylinders || 40, // a[1]
                          drive.nHeads || data[3],// a[2]
                          drive.nSectors || 9,    // a[3]
                          drive.cbSector || 512,  // a[4]
                          data[1],                // a[5]
                          drive.nDiskCylinders,   // a[6]
                          drive.nDiskHeads,       // a[7]
                          drive.nDiskSectors      // a[8]
                      ];
                  }
              
                  /*
                   * resCode used to be an FDC global, but in order to insulate FDC state from the operation of various functions
                   * that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable.  This choice,
                   * similar to my choice for handling PCN, may be contrary to how the actual hardware works, but I prefer this
                   * approach, as long as it doesn't expose any incompatibilities that any software actually cares about.
                   */
                  drive.resCode = data[i++];
              
                  /*
                   * Some additional drive properties/defaults that are largely for the Disk component's benefit.
                   */
                  var a = data[i++];
                  drive.name = a[0];
                  drive.nCylinders = a[1];          // cylinders
                  drive.nHeads = a[2];              // heads/cylinders
                  drive.nSectors = a[3];            // sectors/track
                  drive.cbSector = a[4];            // bytes/sector
                  drive.fRemovable = a[5];
                  /*
                   * If we have current media parameters, restore them; otherwise, default to the drive's physical parameters.
                   */
                  if (drive.nDiskCylinders = a[6]) {
                      drive.nDiskHeads = a[7];
                      drive.nDiskSectors = a[8];
                  } else {
                      drive.nDiskCylinders = drive.nCylinders;
                      drive.nDiskHeads = drive.nHeads;
                      drive.nDiskSectors = drive.nSectors;
                  }
              
                  /*
                   * The next group of properties are set by various FDC command sequences.
                   *
                   * We initialize this.iDrive (above) and drive.bHead and drive.bCylinder (below) to zero, but leave the rest undefined,
                   * awaiting their first FDC command.  We do this because the initial SENSE_INT command returns a PCN, which will also
                   * be undefined unless we have at least zeroed both the current drive and the "present" cylinder on that drive.
                   *
                   * Alternatively, I could make PCN a global FDC variable.  That may be closer to how the actual hardware operates,
                   * but I'm using per-drive variables so that the FDC component can be a good client to both the CPU and other components.
                   *
                   * COMPATIBILITY ALERT: The MODEL_5170 BIOS ("DSKETTE_SETUP") attempts to discern the drive type (double-density vs.
                   * high-capacity) by "slapping" the heads around -- "litrally" (it uses a constant named "TRK_SLAP" equal to 48).
                   * After seeking to "TRK_SLAP", the BIOS performs a series of seeks, looking for the precise point where the heads
                   * return to track 0.
                   *
                   * Here's how it works: the BIOS seeks to track 48 (which is fine on an 80-track 1.2Mb high-capacity drive, but 9 tracks
                   * too far on a 40-track 360Kb double-density drive), then seeks to track 10, and then seeks in single-track increments
                   * up to 10 more times until the SENSE_DRIVE command returns ST3 with the TRACK0 bit set.
                   *
                   * This implies that SEEK isn't really seeking to a specified cylinder, but rather it is calculating a delta from
                   * the previous cylinder to the specified cylinder, and stepping over that number of tracks.  Which means that SEEK
                   * is updating a "logical" cylinder number, not the "physical" (actual) cylinder number.  Presumably a RECALIBRATE
                   * command will bring the logical and physical values into sync, but once an out-of-bounds cylinder is requested, they
                   * will be out of sync.
                   *
                   * To simulate this, bCylinder is now treated as the "physical" cylinder (since that's how it's ALWAYS been used here),
                   * and bCylinderSeek will now track (pun intended) the "logical" cylinder that's programmed via SEEK commands.
                   */
                  drive.bHead = data[i++];
                  drive.bCylinderSeek = data[i++];        // the data[] slot where we used to store drive.nHeads (or -1)
                  drive.bCylinder = data[i++];
                  if (drive.bCylinderSeek >= 100) {       // verify that the saved bCylinderSeek is valid, otherwise sync it with bCylinder
                      drive.bCylinderSeek -= 100;
                  } else {
                      drive.bCylinderSeek -= drive.bCylinder;
                  }
                  drive.bSector = data[i++];
                  drive.bSectorEnd = data[i++];           // aka EOT
                  drive.nBytes = data[i++];
              
                  /*
                   * We no longer reinitialize drive.disk, in order to retain previously mounted diskette across resets.
                   */
              
                  /*
                   * The next group of properties are managed by worker functions (eg, doRead()) to maintain state across DMA requests.
                   */
                  drive.ibSector = data[i++];             // location of the next byte to be accessed in the current sector
                  drive.sector = null;
              
                  if (!drive.disk) {
                      drive.sDiskettePath = "";           // ensure this is initialized to a default that displayDiskette() can deal with
                  }
              
                  var deltas = data[i++];
                  if (deltas == 102) deltas = false;      // v1.02 backward-compatibility
              
                  if (typeof deltas == "boolean") {
                      var fLocal = deltas;
                      var sDisketteName = data[i++];
                      var sDiskettePath = data[i];
                      /*
                       * If we're restoring a local disk image, then the entire disk contents should be captured in aDiskHistory,
                       * so all we have to do is mount a blank diskette and let disk.restore() do the rest; ie, there's nothing to
                       * "load" (it's a purely synchronous operation).
                       *
                       * Otherwise, we must call loadDiskette(); in the common case, loadDiskette() will have already "auto-mounted"
                       * the diskette, so it will return true, and then we restore any deltas to the current image.
                       *
                       * However, if loadDiskette() returns false, then it has initiated the load for a *different* disk image,
                       * so we must mark ourselves as "not ready" again, and add another "wait for ready" test in Computer before
                       * finally powering the CPU.
                       */
                      if (fLocal) {
                          this.mountDiskette(iDrive, sDisketteName, sDiskettePath);
                      }
                      else if (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, true)) {
                          if (drive.disk) {
                              if (sDiskettePath) {
                                  this.addDiskHistory(sDisketteName, sDiskettePath, drive.disk);
                              } else {
                                  if (DEBUG) Component.warning("Disk '" + (drive.disk.sDiskName || sDisketteName) + "' not recorded properly in drive " + iDrive);
                              }
                          }
                      } else {
                          this.setReady(false);
                      }
                  } else if (deltas !== undefined) {
                      /*
                       * If there's any data at all (ie, if this is a restore and not a reset), then it must be in the
                       * pre-v1.02 save/restore format, so we'll restore as best we can, but be aware that if disk.restore()
                       * notices that the currently mounted disk image differs from the disk image that these deltas belong to,
                       * it will return false, and the restore operation will be aborted.
                       */
                      if (drive.disk && drive.disk.restore(deltas) < 0) {
                          fSuccess = false;
                      }
                  }
              
                  /*
                   * TODO: If loadDiskette() returned true, then this can happen immediately.  Otherwise, loadDiskette()
                   * will have merely "queued up" the load request and drive.disk won't be ready yet, so figure out how/when
                   * we can properly restore drive.sector in that case.
                   */
                  if (fSuccess && drive.disk && drive.ibSector !== undefined) {
                      drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                  }
                  return fSuccess;
              };
              
              /**
               * saveDrives()
               *
               * @this {FDC}
               * @return {Array}
               */
              FDC.prototype.saveDrives = function()
              {
                  var i = 0;
                  var data = [];
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      data[i++] = this.saveDrive(this.aDrives[iDrive]);
                  }
                  return data;
              };
              
              /**
               * saveDrive(drive)
               *
               * @this {FDC}
               * @return {Array}
               */
              FDC.prototype.saveDrive = function(drive)
              {
                  var i = 0;
                  var data = [];
                  data[i++] = drive.resCode;
                  data[i++] = [drive.name, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector, drive.fRemovable, drive.nDiskCylinders, drive.nDiskHeads, drive.nDiskSectors];
                  data[i++] = drive.bHead;
                  /*
                   * We used to store drive.nHeads in the next slot, but now we store bCylinderSeek,
                   * and we bias it by +100 so that initDrive() can distinguish it from older values.
                   */
                  data[i++] = drive.bCylinderSeek + 100;
                  data[i++] = drive.bCylinder;
                  data[i++] = drive.bSector;
                  data[i++] = drive.bSectorEnd;
                  data[i++] = drive.nBytes;
                  data[i++] = drive.ibSector;
                  /*
                   * Now we deviate from the 1.01a save format: instead of next storing all the deltas for the
                   * currently mounted disk (if any), we store only the name and path of the currently mounted disk
                   * (if any).  Deltas for ALL disks, both currently mounted and previously mounted, are stored later.
                   *
                   *      data[i++] = drive.disk? drive.disk.save() : null;
                   *
                   * To indicate this deviation, we store neither a null nor a delta array, but a boolean (fLocal);
                   * if that boolean is not present, then the restore code will know it's dealing with a pre-v1.02 state.
                   */
                  data[i++] = drive.fLocal;
                  data[i++] = drive.sDisketteName;
                  data[i] = drive.sDiskettePath;
                  if (DEBUG && !drive.sDiskettePath && drive.disk && drive.disk.sDiskPath) {
                      Component.warning("Disk '" + drive.disk.sDiskName + "' not saved properly in drive " + drive.iDrive);
                  }
                  return data;
              };
              
              /**
               * saveDeltas()
               *
               * This returns an array of entries, one for each disk image we've ever mounted, including any deltas; ie:
               *
               *      [name, path, deltas]
               *
               * aDiskHistory contains exactly that, except that deltas may not be up-to-date for any currently mounted
               * disk image(s), so we call updateHistory() for all those disks, and then aDiskHistory is ready to be saved.
               *
               * @this {FDC}
               * @return {Array}
               */
              FDC.prototype.saveDeltas = function()
              {
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      var drive = this.aDrives[iDrive];
                      if (drive.disk) {
                          this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
                      }
                  }
                  return this.aDiskHistory;
              };
              
              /**
               * copyDrive(iDrive)
               *
               * @this {FDC}
               * @param {number} iDrive
               * @return {Object|undefined} drive (which may be undefined if the requested drive does not exist)
               */
              FDC.prototype.copyDrive = function(iDrive)
              {
                  var driveNew;
                  var driveOld = this.aDrives[iDrive];
                  if (driveOld !== undefined) {
                      driveNew = {};
                      for (var p in driveOld) {
                          driveNew[p] = driveOld[p];
                      }
                  }
                  return driveNew;
              };
              
              /**
               * seekDrive(drive, iSector, nSectors)
               *
               * The FDC doesn't need this function, since all FDC requests from the CPU are handled by doCmd().  This function
               * is used by other components (eg, Debugger) to mimic an FDC request, using a drive object obtained from copyDrive(),
               * to avoid disturbing the internal state of the FDC's drive objects.
               *
               * Also note that in an actual FDC request, drive.nBytes is initialized to the size of a single sector; the extent
               * of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller.  The FDC
               * isn't even aware of the extent of the transfer, so in the case of a read request, all readData() can do is return
               * bytes until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
               * @param {number} nSectors
               * @return {boolean} true if successful, false if invalid position request
               */
              FDC.prototype.seekDrive = function(drive, iSector, nSectors)
              {
                  if (drive.disk) {
                      var aDiskInfo = drive.disk.info();
                      var nCylinders = aDiskInfo[0];
                      var nHeads = aDiskInfo[1];
                      var nSectorsPerTrack = aDiskInfo[2];
                      var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
                      var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
                      if (iSector + nSectors <= nSectorsPerDisk) {
                          drive.bCylinder = Math.floor(iSector / nSectorsPerCylinder);
                          iSector %= nSectorsPerCylinder;
                          drive.bHead = Math.floor(iSector / nSectorsPerTrack);
                          drive.bSector = (iSector % nSectorsPerTrack) + 1;
                          drive.nBytes = nSectors * aDiskInfo[3];
                          /*
                           * NOTE: We don't set bSectorEnd, as an FDC command would, but it's irrelevant, because we don't actually
                           * do anything with bSectorEnd at this point.  Perhaps someday, when we faithfully honor/restrict requests
                           * to a single track (or a single cylinder, in the case of multi-track requests).
                           */
                          drive.resCode = FDC.REG_DATA.RES.NONE;
                          /*
                           * At this point, we've finished simulating what an FDC.REG_DATA.CMD.READ_DATA command would have performed,
                           * up through doRead().  Now it's the caller responsibility to call readData(), just like the DMA Controller would.
                           */
                          return true;
                      }
                  }
                  return false;
              };
              
              /**
               * autoMount(fRemount)
               *
               * @this {FDC}
               * @param {boolean} [fRemount] is true if we're remounting all auto-mounted diskettes
               * @return {boolean} true if one or more diskette images are being auto-mounted, false if none
               */
              FDC.prototype.autoMount = function(fRemount)
              {
                  if (!fRemount) this.cAutoMount = 0;
                  if (this.configMount) {
                      for (var sDrive in this.configMount) {
                          var configDrive = this.configMount[sDrive];
                          if (configDrive['name'] && configDrive['path']) {
                              /*
                               * WARNING: This conversion of drive letter to drive number, starting with A:, is very simplistic
                               * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                               */
                              var iDrive = sDrive.charCodeAt(0) - 0x41;
                              if (iDrive >= 0 && iDrive < this.aDrives.length) {
                                  if (!this.loadDiskette(iDrive, configDrive['name'], configDrive['path'], true) && fRemount)
                                      this.setReady(false);
                                  continue;
                              }
                          }
                          this.notice("Unrecognized auto-mount specification for drive " + sDrive);
                      }
                  }
                  return !!this.cAutoMount;
              };
              
              /**
               * loadSelectedDrive(sDisketteName, sDiskettePath, file)
               *
               * @this {FDC}
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               * @param {File} [file] is set if there's an associated File object
               */
              FDC.prototype.loadSelectedDrive = function(sDisketteName, sDiskettePath, file)
              {
                  var iDrive;
                  var controlDrives = this.bindings["listDrives"];
                  if (controlDrives && !isNaN(iDrive = str.parseInt(controlDrives.value, 10)) && iDrive >= 0 && iDrive < this.aDrives.length) {
              
                      if (!sDiskettePath) {
                          this.unloadDrive(iDrive);
                          return;
                      }
              
                      if (sDiskettePath == "?") {
                          this.notice('Use "Choose File" and "Mount" to select and load a local disk.');
                          return;
                      }
              
                      /*
                       * If the special path of "??" is selected, then we want to prompt the user for a URL.  Oh, and
                       * make sure we pass an empty string as the 2nd parameter to prompt(), so that IE won't display
                       * "undefined" -- because after all, undefined and "undefined" are EXACTLY the same thing, right?
                       *
                       * TODO: This is literally all I've done to support remote disk images. There's probably more
                       * I should do, like dynamically updating "listDisks" to include new entries, and adding new entries
                       * to the save/restore data.
                       */
                      if (sDiskettePath == "??") {
                          sDiskettePath = window.prompt("Enter the URL of a remote disk image.", "") || "";
                          if (!sDiskettePath) return;
                          sDisketteName = str.getBaseName(sDiskettePath);
                          this.println("Attempting to load " + sDiskettePath + " as \"" + sDisketteName + "\"");
                      }
              
                      this.println("loading disk " + sDiskettePath + "...");
              
                      while (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, false, file)) {
                          if (!window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)")) {
                              return;
                          }
                          /*
                           * So here's the story: loadDiskette() returned true, which it does ONLY if the specified disk is already
                           * mounted, AND the user clicked OK to reload the original disk image.  So we must toss any history we have
                           * for the disk, unload it, and then loop back around to loadDiskette().
                           *
                           * loadDiskette() should NEVER return true the second time, since no disk is loaded. In other words,
                           * this isn't really a loop so much as a one-time retry operation.
                           */
                          this.removeDiskHistory(sDisketteName, sDiskettePath);
                          this.unloadDrive(iDrive, false, true);
                      }
                      return;
                  }
                  this.notice("Nothing to load");
              };
              
              /**
               * mountDiskette(iDrive, sDisketteName, sDiskettePath)
               *
               * @this {FDC}
               * @param {number} iDrive
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               */
              FDC.prototype.mountDiskette = function(iDrive, sDisketteName, sDiskettePath)
              {
                  var drive = this.aDrives[iDrive];
                  this.unloadDrive(iDrive, true, true);
                  drive.fLocal = true;
                  var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
                  this.doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, true);
              };
              
              /**
               * loadDiskette(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
               *
               * NOTE: If sDiskettePath is already loaded in the drive, nothing needs to be done.
               *
               * @this {FDC}
               * @param {number} iDrive
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               * @param {boolean} [fAutoMount]
               * @param {File} [file] is set if there's an associated File object
               * @return {boolean} true if diskette (already) loaded, false if queued up (or busy)
               */
              FDC.prototype.loadDiskette = function(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
              {
                  var drive = this.aDrives[iDrive];
                  if (sDiskettePath && drive.sDiskettePath != sDiskettePath) {
                      this.unloadDrive(iDrive, fAutoMount, true);
                      if (drive.fBusy) {
                          this.notice("Drive " + iDrive + " busy");
                          return true;
                      }
                      drive.fBusy = true;
                      if (fAutoMount) {
                          drive.fAutoMount = true;
                          this.cAutoMount++;
                          if (this.messageEnabled()) this.printMessage("loading diskette '" + sDisketteName + "'");
                      }
                      drive.fLocal = !!file;
                      var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
                      disk.load(sDisketteName, sDiskettePath, file, this.doneLoadDiskette);
                      return false;
                  }
                  return true;
              };
              
              /**
               * doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {Disk} disk is set if the disk was successfully loaded, null if not
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               * @param {boolean} [fAutoMount]
               */
              FDC.prototype.doneLoadDiskette = function onFDCLoadNotify(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
              {
                  var aDiskInfo;
              
                  drive.fBusy = false;
              
                  if (disk) {
                      /*
                       * We shouldn't mount the diskette unless the drive is able to handle it; for example, FD360 (40-track)
                       * drives cannot read FD1200 (80-track) diskettes.  However, I no longer require that the diskette's
                       * sectors/track fall within the drive's standard maximum, because XDF diskettes use 19 physical sectors/track
                       * on the first cylinder (1 more than the typical 18 sectors/track found on 1.44Mb diskettes) but declare
                       * a larger logical size (23 512-byte sectors/track) to reflect the actual capacity of XDF tracks beyond the
                       * first cylinder (ie, one 8Kb sector, one 2Kb sector, one 1Kb sector, and one 512-byte sector).
                       */
                      aDiskInfo = disk.info();
                      if (disk && aDiskInfo[0] > drive.nCylinders || aDiskInfo[1] > drive.nHeads /* || aDiskInfo[2] > drive.nSectors */) {
                          this.notice("Diskette \"" + sDisketteName + "\" too large for drive " + String.fromCharCode(0x41 + drive.iDrive));
                          disk = null;
                      }
                  }
              
                  if (disk) {
                      drive.disk = disk;
                      drive.sDisketteName = sDisketteName;
                      drive.sDiskettePath = sDiskettePath;
              
                      /*
                       * Adding local disk image names to the disk list seems like a nice idea, but it's too confusing,
                       * because then it looks like the "Mount" button should be able to (re)load them, and that can NEVER
                       * happen, for security reasons; local disk images can ONLY be loaded via the "Mount" button after
                       * the user has selected them via the "Choose File" button.
                       *
                       *      this.addDiskette(sDisketteName, sDiskettePath);
                       *
                       * So we're going to take a different approach: when displayDiskette() is asked to display the name
                       * of a local disk image, it will map all such disks to "Local Disk", and any attempt to "Mount" such
                       * a disk, will essentially result in a "Disk not found" error.
                       */
              
                      this.addDiskHistory(sDisketteName, sDiskettePath, disk);
              
                      /*
                       * For a local disk (ie, one loaded via mountDiskette()), the disk.restore() performed by addDiskHistory()
                       * may have altered the disk geometry, so refresh the disk info.
                       */
                      aDiskInfo = disk.info();
              
                      /*
                       * Clearly, a successful mount implies a disk change, and I suppose that, technically, an *unsuccessful*
                       * mount should imply the same, but what would the real-world analog be?  Inserting a piece of cardboard
                       * instead of an actual diskette?  In any case, if we can do the user a favor by pretending (as far as the
                       * disk change line is concerned) that an unsuccessful mount never happened, let's do it.
                       *
                       * Successful unmounts are a different story, however; those *do* trigger a change. See unloadDrive().
                       */
                      this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
              
                      /*
                       * With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
                       * notify() is selective about its output, using print() if a print window is open, alert() otherwise.
                       *
                       * WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
                       * and will not match the drive mappings that DOS ultimately uses (ie, for drives beyond B:).
                       */
                      this.notice("Mounted diskette \"" + sDisketteName + "\" in drive " + String.fromCharCode(0x41 + drive.iDrive), drive.fAutoMount || fAutoMount);
              
                      /*
                       * Update the drive's current media parameters to match the disk's.
                       */
                      drive.nDiskCylinders = aDiskInfo[0];
                      drive.nDiskHeads = aDiskInfo[1];
                      drive.nDiskSectors = aDiskInfo[2];
                  }
                  else {
                      drive.fLocal = false;
                  }
              
                  if (drive.fAutoMount) {
                      drive.fAutoMount = false;
                      if (!--this.cAutoMount) this.setReady();
                  }
              
                  this.displayDiskette(drive.iDrive);
              };
              
              /**
               * addDiskette(sName, sPath)
               *
               * @param {string} sName
               * @param {string} sPath
               */
              FDC.prototype.addDiskette = function(sName, sPath)
              {
                  var controlDisks = this.bindings["listDisks"];
                  if (controlDisks) {
                      for (var i = 0; i < controlDisks.options.length; i++) {
                          if (controlDisks.options[i].value == sPath) return;
                      }
                      var controlOption = window.document.createElement("option");
                      controlOption['value'] = sPath;
                      controlOption.textContent = sName;
                      controlDisks.appendChild(controlOption);
                  }
              };
              
              /**
               * displayDiskette(iDrive, fUpdateDrive)
               *
               * @this {FDC}
               * @param {number} iDrive (unvalidated)
               * @param {boolean} [fUpdateDrive] is true to update the drive list to match the specified drive (eg, the auto-mount case)
               */
              FDC.prototype.displayDiskette = function(iDrive, fUpdateDrive)
              {
                  /*
                   * First things first: validate iDrive.
                   */
                  if (iDrive >= 0 && iDrive < this.aDrives.length) {
                      var drive = this.aDrives[iDrive];
                      var controlDisks = this.bindings["listDisks"];
                      var controlDrives = this.bindings["listDrives"];
                      /*
                       * Next, make sure controls for both drives and disks exist.
                       */
                      if (controlDisks && controlDrives) {
                          /*
                           * Next, make sure the drive whose disk we're updating is the currently selected drive.
                           */
                          var i;
                          var iDriveSelected = str.parseInt(controlDrives.value, 10);
                          var sTargetPath = (drive.fLocal? "?" : drive.sDiskettePath);
                          if (!isNaN(iDriveSelected) && iDriveSelected == iDrive) {
                              for (i = 0; i < controlDisks.options.length; i++) {
                                  if (controlDisks.options[i].value == sTargetPath) {
                                      if (controlDisks.selectedIndex != i) {
                                          controlDisks.selectedIndex = i;
                                      }
                                      break;
                                  }
                              }
                              if (i == controlDisks.options.length) controlDisks.selectedIndex = 0;
                          }
                          if (fUpdateDrive) {
                              for (i = 0; i < controlDrives.options.length; i++) {
                                  if (str.parseInt(controlDrives.options[i].value, 10) == drive.iDrive) {
                                      if (controlDrives.selectedIndex != i) {
                                          controlDrives.selectedIndex = i;
                                      }
                                      break;
                                  }
                              }
                          }
                      }
                  }
              };
              
              /**
               * unloadDrive(iDrive, fAutoUnload, fQuiet)
               *
               * @this {FDC}
               * @param {number} iDrive (pre-validated)
               * @param {boolean} [fAutoUnload] is true if this unload is being forced as part of an automount and/or restored mount
               * @param {boolean} [fQuiet]
               */
              FDC.prototype.unloadDrive = function(iDrive, fAutoUnload, fQuiet)
              {
                  var drive = this.aDrives[iDrive];
                  if (drive.disk) {
                      /*
                       * Before we toss the disk's information, capture any deltas that may have occurred.
                       */
                      this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
                      drive.sDisketteName = "";
                      drive.sDiskettePath = "";
                      drive.disk = null;
                      drive.fLocal = false;
              
                      this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
              
                      /*
                       * WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
                       * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                       */
                      if (!fQuiet) {
                          this.notice("Drive " + String.fromCharCode(0x41 + iDrive) + " unloaded", fAutoUnload);
                      }
                      /*
                       * Try to avoid any unnecessary hysteresis regarding the diskette display if this unload is merely
                       * a prelude to another load.
                       */
                      if (!fAutoUnload && !fQuiet) {
                          this.displayDiskette(iDrive);
                      }
                  }
              };
              
              /**
               * unloadAllDrives(fDiscard)
               *
               * @this {FDC}
               * @param {boolean} fDiscard to discard all disk history before unloading
               */
              FDC.prototype.unloadAllDrives = function(fDiscard)
              {
                  if (fDiscard) {
                      this.aDiskHistory = [];
                  }
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      this.unloadDrive(iDrive, true);
                  }
              };
              
              /**
               * addDiskHistory(sDisketteName, sDiskettePath, disk)
               *
               * @this {FDC}
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               * @param {Disk} disk containing corresponding disk image
               */
              FDC.prototype.addDiskHistory = function(sDisketteName, sDiskettePath, disk)
              {
                  var i;
                  this.assert(!!sDiskettePath);
                  for (i = 0; i < this.aDiskHistory.length; i++) {
                      if (this.aDiskHistory[i][1] == sDiskettePath) {
                          var nChanges = disk.restore(this.aDiskHistory[i][2]);
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("disk '" + sDisketteName + "' restored from history (" + nChanges + " changes)");
                          }
                          return;
                      }
                  }
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("disk '" + sDisketteName + "' added to history (nothing to restore)");
                  }
                  this.aDiskHistory[i] = [sDisketteName, sDiskettePath, []];
              };
              
              /**
               * removeDiskHistory(sDisketteName, sDiskettePath)
               *
               * @this {FDC}
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               */
              FDC.prototype.removeDiskHistory = function(sDisketteName, sDiskettePath)
              {
                  var i;
                  for (i = 0; i < this.aDiskHistory.length; i++) {
                      if (this.aDiskHistory[i][1] == sDiskettePath) {
                          this.aDiskHistory.splice(i, 1);
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("disk '" + sDisketteName + "' removed from history");
                          }
                          return;
                      }
                  }
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("unable to remove disk '" + sDisketteName + "' from history (" + sDiskettePath + ")");
                  }
              };
              
              /**
               * updateDiskHistory(sDisketteName, sDiskettePath, disk)
               *
               * @this {FDC}
               * @param {string} sDisketteName
               * @param {string} sDiskettePath
               * @param {Disk} disk containing corresponding disk image, with possible deltas
               */
              FDC.prototype.updateDiskHistory = function(sDisketteName, sDiskettePath, disk)
              {
                  var i;
                  for (i = 0; i < this.aDiskHistory.length; i++) {
                      if (this.aDiskHistory[i][1] == sDiskettePath) {
                          this.aDiskHistory[i][2] = disk.save();
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("disk '" + sDisketteName + "' updated in history");
                          }
                          return;
                      }
                  }
                  /*
                   * I used to report this as an error (at least in the DEBUG release), but it's no longer really
                   * an error, because if we're trying to re-mount a clean copy of a disk, we toss its history, then
                   * unload, and then reload/remount.  And since unloadDrive's normal behavior is to call updateDiskHistory()
                   * before unloading, the fact that the disk is no longer listed here can't be treated as an error.
                   */
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("unable to update disk '" + sDisketteName + "' in history (" + sDiskettePath + ")");
                  }
              };
              
              /**
               * outFDCOutput(port, bOut, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F2, output only)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              FDC.prototype.outFDCOutput = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "OUTPUT");
                  if (!(bOut & FDC.REG_OUTPUT.ENABLE)) {
                      this.initController();
                      /*
                       * initController() resets, among other things, the selected drive (this.iDrive), so if we were
                       * still updating this.iDrive below based on the "drive select" bits in regOutput, we would want
                       * to make sure those bits now match what initController() set.  But since we no longer do that
                       * (see below), this is no longer needed either.
                       *
                       *      bOut = (bOut & ~FDC.REG_OUTPUT.DS) | this.iDrive;
                       */
                  }
                  else if (!(this.regOutput & FDC.REG_OUTPUT.ENABLE)) {
                      /*
                       * When FDC.REG_OUTPUT.ENABLE transitions from 0 to 1, generate an interrupt.
                       */
                      if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                          if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
                      }
                  }
                  /*
                   * This no longer updates the internally selected drive (this.iDrive) based on regOutput, because (a) there seems
                   * to be no point, as all drive-related commands include their own "drive select" bits, and (b) it breaks the
                   * MODEL_5170 boot code.  Here's why:
                   *
                   * Unlike previous models, the MODEL_5170 BIOS probes all installed diskette drives to determine drive type;
                   * ie, FD360 (40-track) or FD1200 (80-track).  So if there are two drives, the last selected drive will be drive 1.
                   * Immediately before booting, the BIOS issues an INT 0x13/AH=0 reset, which writes regOutput two times: first
                   * with FDC.REG_OUTPUT.ENABLE clear, and then with it set.  However, both times, it ALSO loads the last selected
                   * drive number into regOutput's "drive select" bits.
                   *
                   * If we switched our selected drive to match regOutput, then the ST0 value we returned on an SENSE_INT command
                   * following the regOutput reset operation would indicate drive 1 instead of drive 0.  But the BIOS requires
                   * the ST0 result from the SENSE_INT command ALWAYS be 0xC0 (not 0xC1), so the controller must not be propagating
                   * regOutput's "drive select" bits in the way I originally assumed.
                   *
                   *      var iDrive = bOut & FDC.REG_OUTPUT.DS;
                   *      if (bOut & (FDC.REG_OUTPUT.MOTOR_D0 << iDrive)) this.iDrive = iDrive;
                   */
                  this.regOutput = bOut;
              };
              
              /**
               * inFDCStatus(port, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F4, input only)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              FDC.prototype.inFDCStatus = function(port, addrFrom)
              {
                  this.printMessageIO(port, null, addrFrom, "STATUS", this.regStatus);
                  return this.regStatus;
              };
              
              /**
               * inFDCData(port, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F5, input/output)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              FDC.prototype.inFDCData = function(port, addrFrom)
              {
                  var bIn = 0;
                  if (this.regDataIndex < this.regDataTotal) {
                      bIn = this.regDataArray[this.regDataIndex];
                  }
                  /*
                   * As per the discussion in doCmd(), once the first byte of the Result Phase has been read, the interrupt must be cleared.
                   */
                  if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                      if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.FDC);
                  }
                  if (this.messageEnabled()) {
                      this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
                  }
                  if (++this.regDataIndex >= this.regDataTotal) {
                      this.regStatus &= ~(FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
                      this.regDataIndex = this.regDataTotal = 0;
                  }
                  return bIn;
              };
              
              /**
               * outFDCData(port, bOut, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F5, input/output)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              FDC.prototype.outFDCData = function(port, bOut, addrFrom)
              {
                  if (this.messageEnabled()) {
                      this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
                  }
              
                  if (this.regDataTotal < this.regDataArray.length) {
                      this.regDataArray[this.regDataTotal++] = bOut;
                  }
                  var bCmd = this.regDataArray[0];
                  var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
                  if (FDC.aCmdInfo[bCmdMasked] !== undefined) {
                      if (this.regDataTotal >= FDC.aCmdInfo[bCmdMasked].cbReq) {
                          this.doCmd();
                      }
                      return;
                  }
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("unsupported FDC command: " + str.toHexByte(bCmd));
                      this.dbg.stopCPU();
                  }
              };
              
              /**
               * inFDCInput(port, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F7, input only, MODEL_5170 only)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              FDC.prototype.inFDCInput = function(port, addrFrom)
              {
                  var bIn = this.regInput;
                  /*
                   * TODO: Determine when the DISK_CHANGE bit is *really* cleared (this is just a guess)
                   */
                  this.regInput &= ~FDC.REG_INPUT.DISK_CHANGE;
                  this.printMessageIO(port, null, addrFrom, "INPUT", bIn);
                  return bIn;
              };
              
              /**
               * outFDCControl(port, bOut, addrFrom)
               *
               * @this {FDC}
               * @param {number} port (0x3F7, output only, MODEL_5170 only)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              FDC.prototype.outFDCControl = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "CONTROL");
                  this.regControl  = bOut;
              };
              
              /**
               * doCmd()
               *
               * @this {FDC}
               */
              FDC.prototype.doCmd = function()
              {
                  var fIRQ = false;
                  this.regDataIndex = 0;
                  var bCmd = this.popCmd();
                  var drive, bDrive, bHead, c, h, r, n;
              
                  /*
                   * NOTE: We currently ignore the FDC.REG_DATA.CMD.SK, FDC.REG_DATA.CMD.MF and FDC.REG_DATA.CMD.MT bits of every command.
                   * The only command bit of possible interest down the road might be the FDC.REG_DATA.CMD.MT (Multi-Track); the rest relate
                   * to storage format details that we cannot emulate as long as our diskette images contain nothing more than sector
                   * data without any formatting data.
                   *
                   * Similarly, we ignore parameters like SRT, HUT, HLT and the like, since our "motors" don't require physical delays;
                   * however, if timing issues become compatibility issues, we'll have to revisit those delays.  In any case, the maximum
                   * speed of the simulation will still be limited by various spin-loops in the ROM BIOS that wait prescribed times, so even
                   * with infinitely fast hardware, the simulation will never run as fast as it theoretically could, unless we opt to identify
                   * those spin-loops and either patch them or skip over them.
                   */
                  var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
              
                  switch (bCmdMasked) {
                  case FDC.REG_DATA.CMD.SPECIFY:                      // 0x03
                      this.popSRT();                                  // SRT and HUT (encodings?)
                      this.popHLT();                                  // HLT and ND (encodings?)
                      this.beginResult();
                      /*
                       * No results are provided by this command, and fIRQ should remain false
                       */
                      break;
              
                  case FDC.REG_DATA.CMD.SENSE_DRIVE:                  // 0x04
                      bDrive = this.popCmd(FDC.TERMS.DS);
                      bHead = (bDrive >> 2) & 0x1;
                      this.iDrive = (bDrive & 0x3);
                      drive = this.aDrives[this.iDrive];
                      this.beginResult();
                      this.pushST3(drive);
                      break;
              
                  case FDC.REG_DATA.CMD.WRITE_DATA:                   // 0x05
                  case FDC.REG_DATA.CMD.READ_DATA:                    // 0x06
                      bDrive = this.popCmd(FDC.TERMS.DS);             // Drive Select
                      bHead = (bDrive >> 2) & 0x1;                    // isolate HD (Head Select) bits
                      this.iDrive = (bDrive & 0x3);                   // isolate DS (Drive Select, aka Unit Select) bits
                      drive = this.aDrives[this.iDrive];
                      drive.bHead = bHead;
                      c = drive.bCylinder = this.popCmd(FDC.TERMS.C); // C
                      h = this.popCmd(FDC.TERMS.H);                   // H
                      /*
                       * Controller docs say that H should always match HD, so I assert that, but what if someone
                       * made a mistake and didn't program them identically -- what would happen?  Which should we honor?
                       */
                      this.assert(h == bHead);
                      r = drive.bSector = this.popCmd(FDC.TERMS.R);   // R
                      n = this.popCmd(FDC.TERMS.N);                   // N
                      drive.nBytes = 128 << n;                        // 0 => 128, 1 => 256, 2 => 512, 3 => 1024
                      drive.bSectorEnd = this.popCmd(FDC.TERMS.EOT);  // EOT (final sector number on a cylinder)
                      this.popCmd(FDC.TERMS.GPL);                     // GPL (spacing between sectors, excluding VCO Sync Field; 3)
                      this.popCmd(FDC.TERMS.DTL);                     // DTL (when N is 0, DTL stands for the data length to read out or write into the sector)
                      if (bCmdMasked == FDC.REG_DATA.CMD.READ_DATA)
                          this.doRead(drive);
                      else
                          this.doWrite(drive);
                      this.pushResults(drive, bCmd, bHead, c, h, r, n);
                      fIRQ = true;
                      break;
              
                  case FDC.REG_DATA.CMD.RECALIBRATE:                  // 0x07
                      bDrive = this.popCmd(FDC.TERMS.DS);
                      this.iDrive = (bDrive & 0x3);
                      drive = this.aDrives[this.iDrive];
                      drive.bCylinder = drive.bCylinderSeek = 0;
                      drive.resCode = FDC.REG_DATA.RES.SEEK_END | FDC.REG_DATA.RES.TRACK0;
                      this.beginResult();                             // no results provided; this command is typically followed by FDC.REG_DATA.CMD.SENSE_INT
                      fIRQ = true;
                      break;
              
                  case FDC.REG_DATA.CMD.SENSE_INT:                    // 0x08
                      drive = this.aDrives[this.iDrive];
                      drive.bHead = 0;                                // this command is documented as ALWAYS returning a head address of 0 in ST0; see pushST0()
                      this.beginResult();
                      this.pushST0(drive);
                      this.pushResult(drive.bCylinder, FDC.TERMS.PCN);
                      /*
                       * For some strange reason, the "DISK_RESET" function in the MODEL_5170_REV3 BIOS resets the
                       * adapter and then issues FOUR -- that's right, not ONE but FOUR -- SENSE INTERRUPT STATUS commands
                       * in a row, and expects ST0 to contain a different drive number after each command (first 0, then 1,
                       * then 2, and finally 3).  What makes this doubly weird is SENSE INTERRUPT STATUS (unlike SENSE
                       * DRIVE STATUS) is a drive-agnostic command.
                       *
                       * Didn't the original PC AT "HFCOMBO" controller limit support to TWO diskette drives max?
                       * And even if the PC AT supported other FDC controllers that DID support up to FOUR diskette drives,
                       * why should "DISK_RESET" hard-code a 4-drive loop?
                       *
                       * Well, whatever.  All this head-scratching doesn't change the fact that I apparently have to
                       * "auto-increment" the internal drive number (this.iDrive) after each SENSE INTERRUPT STATUS command.
                       */
                      this.iDrive = (this.iDrive + 1) & 0x3;
                      /*
                       * No interrupt is generated by this command, so fIRQ should remain false.
                       */
                      break;
              
                  case FDC.REG_DATA.CMD.READ_ID:                      // 0x0A
                      /*
                       * This command is used by "SETUP_DBL" in the MODEL_5170_REV3 BIOS to determine if a double-density
                       * (40-track) diskette has been inserted in a high-density (80-track) drive; ie, whether "double stepping"
                       * is required, since only 40 of the 80 possible "steps" are valid for a double-density diskette.
                       *
                       * To start, we'll focus on making this work in the normal case (80-track diskette in 80-track drive).
                       */
                      bDrive = this.popCmd(FDC.TERMS.DS);
                      bHead = (bDrive >> 2) & 0x1;
                      this.iDrive = (bDrive & 0x3);
                      drive = this.aDrives[this.iDrive];
                      c = drive.bCylinder;
                      h = drive.bHead = bHead;
                      r = drive.bSector = 1;
                      n = 0;
                      drive.resCode = FDC.REG_DATA.RES.NONE;
                      if (drive.disk && (drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector))) {
                          n = drive.sector.length;
                      } else {
                          /*
                           * TODO: Determine the appropriate response code(s) for the possible errors that can occur here.
                           */
                          drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
                      }
                      this.pushResults(drive, bCmd, bHead, c, h, r, n);
                      fIRQ = true;
                      break;
              
                  case FDC.REG_DATA.CMD.FORMAT_TRACK:                 // 0x0D
                      bDrive = this.popCmd(FDC.TERMS.DS);
                      bHead = (bDrive >> 2) & 0x1;
                      this.iDrive = (bDrive & 0x3);
                      drive = this.aDrives[this.iDrive];
                      c = drive.bCylinder;
                      h = drive.bHead = bHead;
                      r = 1;
                      n = this.popCmd(FDC.TERMS.N);                   // N
                      drive.nBytes = 128 << n;                        // 0 => 128, 1 => 256, 2 => 512, 3 => 1024 (bytes/sector)
                      drive.bSectorEnd = this.popCmd(FDC.TERMS.SC);   // SC (sectors/track)
                      this.popCmd(FDC.TERMS.GPL);                     // GPL (spacing between sectors, excluding VCO Sync Field; 3)
                      drive.bFiller = this.popCmd(FDC.TERMS.D);       // D (filler byte)
                      this.doFormat(drive);
                      this.pushResults(drive, bCmd, bHead, c, h, r, n);
                      fIRQ = true;
                      break;
              
                  case FDC.REG_DATA.CMD.SEEK:                         // 0x0F
                      bDrive = this.popCmd(FDC.TERMS.DS);
                      bHead = (bDrive >> 2) & 0x1;
                      this.iDrive = (bDrive & 0x3);
                      drive = this.aDrives[this.iDrive];
                      drive.bHead = bHead;
                      /*
                       * As discussed in initDrive(), we can no longer simply set bCylinder to the specified NCN;
                       * instead, we must calculate the delta between bCylinderSeek and the NCN, and adjust bCylinder
                       * by that amount.  Then we simply move the NCN into bCylinderSeek without any range checking.
                       *
                       * Since bCylinder is now expressly defined as the "physical" cylinder number, it must never
                       * be allowed to exceed the physical boundaries of the drive (ie, never lower than 0, and never
                       * greater than or equal to nCylinders).
                       */
                      c = this.popCmd(FDC.TERMS.NCN);
                      drive.bCylinder += c - drive.bCylinderSeek;
                      if (drive.bCylinder < 0) drive.bCylinder = 0;
                      if (drive.bCylinder >= drive.nCylinders) drive.bCylinder = drive.nCylinders - 1;
                      drive.bCylinderSeek = c;
                      drive.resCode = FDC.REG_DATA.RES.SEEK_END;
                      /*
                       * TODO: To properly support ALL the ST3 result bits (not just TRACK0), we need a resCode
                       * update() function that all FDC commands can use.  This code is merely sufficient to get us
                       * through the "DSKETTE_SETUP" gauntlet in the MODEL_5170 BIOS.
                       */
                      if (!drive.bCylinder) {
                          drive.resCode |= FDC.REG_DATA.RES.TRACK0;
                      }
                      this.beginResult();                             // like FDC.REG_DATA.CMD.RECALIBRATE, no results are provided
                      fIRQ = true;
                      break;
              
                  default:
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("FDC operation unsupported (command=" + str.toHexByte(bCmd) + ")");
                          this.dbg.stopCPU();
                      }
                      break;
                  }
              
                  if (this.regDataTotal > 0) this.regStatus |= (FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
              
                  /*
                   * After the Execution Phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
                   * an interrupt is supposed to occur, signaling the beginning of the Result Phase.  Once the first byte of the
                   * result has been read, the interrupt is cleared (see inFDCData).
                   *
                   * TODO: Technically, interrupt request status should be cleared by the FDC.REG_DATA.CMD.SENSE_INT command; in fact,
                   * if that command is issued and no interrupt was pending, then FDC.REG_DATA.RES.INVALID should be returned (via ST0).
                   */
                  if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                      if (drive && !(drive.resCode & FDC.REG_DATA.RES.NOT_READY) && fIRQ) {
                          if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
                      }
                  }
              };
              
              /**
               * pushResults(drive, bCmd, bHead, c, h, r, n)
               *
               * @param {Object} drive
               * @param {number} bCmd
               * @param {number} bHead
               * @param {number} c
               * @param {number} h
               * @param {number} r
               * @param {number} n
               */
              FDC.prototype.pushResults = function(drive, bCmd, bHead, c, h, r, n)
              {
                  this.beginResult();
                  this.pushST0(drive);
                  this.pushST1(drive);
                  this.pushST2(drive);
                  /*
                   * NOTE: I used to set the following C/H/R/N results using the values that advanceSector() had "advanced"
                   * them to, which seemed logical but was technically incorrect.  For non-multi-track reads, they should match
                   * the programmed C/H/R/N values, except when EOT has been reached, in which case C = C + 1 and R = 1.
                   *
                   * For multi-track, the LSB of H should be complemented whenever EOT has been reached, which I "informally"
                   * detect by testing if the drive's current bCylinder and/or bHead positions advanced to a new cylinder or head,
                   * and apparently, C should never be advanced if H was initially 0.
                   *
                   * I don't do strict EOT comparisons here or elsewhere, because it allows the controller to work with a wider
                   * range of disks (eg, "fake" XDF disk images that contain 23 512-byte sectors/track).
                   */
                  var i = 0;
                  if (c != drive.bCylinder || h != drive.bHead) {
                      i = r = 1;
                  }
                  if (bCmd & FDC.REG_DATA.CMD.MT) {
                      h ^= i;
                      if (!bHead) i = 0;
                  }
                  c += i;
                  this.pushResult(c, FDC.TERMS.C);                // formerly drive.bCylinder
                  this.pushResult(h, FDC.TERMS.H);                // formerly drive.bHead
                  this.pushResult(r, FDC.TERMS.R);                // formerly drive.bSector
                  this.pushResult(n, FDC.TERMS.N);
              };
              
              /**
               * popCmd(name)
               *
               * @this {FDC}
               * @param {string|undefined} [name]
               * @return {number}
               */
              FDC.prototype.popCmd = function(name)
              {
                  this.assert((!this.regDataIndex || name !== undefined) && this.regDataIndex < this.regDataTotal);
                  var bCmd = this.regDataArray[this.regDataIndex];
                  if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
                      var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
                      if (!name && !this.regDataIndex && FDC.aCmdInfo[bCmdMasked]) name = FDC.aCmdInfo[bCmdMasked].name;
                      this.printMessage("FDC.CMD[" + (name || this.regDataIndex) + "]: " + str.toHexByte(bCmd), true);
                  }
                  this.regDataIndex++;
                  return bCmd;
              };
              
              /**
               * popHLT()
               *
               * NOTE: This byte is actually a combination of HLT (Head Load Time) and ND (Non-DMA Mode)
               *
               * @this {FDC}
               */
              FDC.prototype.popHLT = function()
              {
                  this.popCmd(FDC.TERMS.HLT);
               // this.nHLT = this.popCmd(FDC.TERMS.HLT);
              };
              
              /**
               * popSRT()
               *
               * NOTE: This byte is actually a combination of SRT (Step Rate Time) and HUT (Head Unload Time)
               *
               * @this {FDC}
               */
              FDC.prototype.popSRT = function()
              {
                  this.popCmd(FDC.TERMS.SRT);
               // this.nSRT = this.popCmd(FDC.TERMS.SRT);
              };
              
              /**
               * beginResult()
               *
               * @this {FDC}
               */
              FDC.prototype.beginResult = function()
              {
                  this.regDataIndex = this.regDataTotal = 0;
              };
              
              /**
               * pushResult(bResult, name)
               *
               * @this {FDC}
               * @param {number} bResult
               * @param {string|undefined} [name]
               */
              FDC.prototype.pushResult = function(bResult, name)
              {
                  if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
                      this.printMessage("FDC.RES[" + (name || this.regDataTotal) + "]: " + str.toHexByte(bResult), true);
                  }
                  this.regDataArray[this.regDataTotal++] = bResult;
              };
              
              /**
               * pushST0(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.pushST0 = function(drive)
              {
                  this.pushResult(drive.iDrive | (drive.bHead << 2) | (drive.resCode & FDC.REG_DATA.RES.ST0), FDC.TERMS.ST0);
              };
              
              /**
               * pushST1(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.pushST1 = function(drive)
              {
                  this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST1) >>> 8, FDC.TERMS.ST1);
              };
              
              /**
               * pushST2(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.pushST2 = function(drive)
              {
                  this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST2) >>> 16, FDC.TERMS.ST2);
              };
              
              /**
               * pushST3(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.pushST3 = function(drive)
              {
                  this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST3) >>> 24, FDC.TERMS.ST3);
              };
              
              /**
               * dmaRead(drive, b, done)
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} b
               * @param {function(number,boolean)} done
               */
              FDC.prototype.dmaRead = function(drive, b, done)
              {
                  if (b === undefined || b < 0) {
                      this.readData(drive, done);
                      return;
                  }
                  /*
                   * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
                  done(-1, false);
              };
              
              /**
               * dmaWrite(drive, b)
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} b
               * @return {number}
               */
              FDC.prototype.dmaWrite = function(drive, b)
              {
                  if (b !== undefined && b >= 0)
                      return this.writeData(drive, b);
                  /*
                   * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
                  return -1;
              };
              
              /**
               * dmaFormat(drive, b)
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} b
               * @returns {number}
               */
              FDC.prototype.dmaFormat = function(drive, b)
              {
                  if (b !== undefined && b >= 0)
                      return this.writeFormat(drive, b);
                  /*
                   * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaFormat(): invalid DMA acknowledgement");
                  return -1;
              };
              
              /**
               * doRead(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.doRead = function(drive)
              {
                  /*
                   * With only NOT_READY and INCOMPLETE set, an empty drive causes DOS to report "General Failure";
                   * with the addition of NO_DATA, DOS reports "Sector not found".  The traditional "Drive not ready"
                   * error message is not triggered by anything we return here, but simply by BIOS commands timing out.
                   */
                  drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
              
                  if (drive.disk) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("FDC.doRead(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
                      }
                      drive.sector = null;
                      drive.resCode = FDC.REG_DATA.RES.NONE;
                      if (this.chipset) {
                          this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaRead', drive);
                          this.chipset.requestDMA(ChipSet.DMA_FDC);
                      }
                  }
              };
              
              /**
               * doWrite(drive)
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.doWrite = function(drive)
              {
                  drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
              
                  if (drive.disk) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("FDC.doWrite(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
                      }
                      if (drive.disk.fWriteProtected) {
                          drive.resCode = FDC.REG_DATA.RES.NOT_WRITABLE | FDC.REG_DATA.RES.INCOMPLETE;
                          return;
                      }
                      drive.sector = null;
                      drive.resCode = FDC.REG_DATA.RES.NONE;
                      if (this.chipset) {
                          this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaWrite', drive);
                          this.chipset.requestDMA(ChipSet.DMA_FDC);
                      }
                  }
              };
              
              /**
               * doFormat(drive)
               *
               * drive is initialized by doCmd() to the following extent:
               *
               *      drive.bHead (ignored)
               *      drive.nBytes (bytes/sector)
               *      drive.bSectorEnd (sectors/track)
               *      drive.bFiller (fill byte)
               *
               * and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.doFormat = function(drive)
              {
                  drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
              
                  if (drive.disk) {
                      drive.sector = null;
                      drive.resCode = FDC.REG_DATA.RES.NONE;
                      if (this.chipset) {
                          drive.cbFormat = 0;
                          drive.abFormat = new Array(4);
                          drive.bFormatting = true;
                          drive.cSectorsFormatted = 0;
                          this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaFormat', drive);
                          this.chipset.requestDMA(ChipSet.DMA_FDC);
                          drive.bFormatting = false;
                      }
                  }
              };
              
              /**
               * readData(drive, done)
               *
               * The following drive properties must have been setup prior to our first call:
               *
               *      drive.bHead
               *      drive.bCylinder
               *      drive.bSector
               *      drive.sector (initialized to null)
               *
               * On the first readData() request, since drive.sector will be null, we ask the Disk object to look
               * up the first sector of the request.  We then ask the Disk for bytes from that sector until the sector
               * is exhausted, and then we look up the next sector and continue the process.
               *
               * NOTE: Since the FDC isn't aware of the extent of the transfer, all readData() can do is return bytes
               * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {function(number,boolean,Object,number)} done (number is next available byte from drive, or -1 if no more bytes available)
               */
              FDC.prototype.readData = function(drive, done)
              {
                  var b = -1;
                  var obj = null, off = 0;    // these variables are purely for BACKTRACK purposes
              
                  if (!drive.resCode && drive.disk) {
                      do {
                          if (drive.sector) {
                              off = drive.ibSector;
                              if ((b = drive.disk.read(drive.sector, drive.ibSector++)) >= 0) {
                                  obj = drive.sector;
                                  break;
                              }
                          }
                          /*
                           * Locate the next sector, and then try reading again.
                           */
                          drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                          if (!drive.sector) {
                              drive.resCode = FDC.REG_DATA.RES.NO_DATA | FDC.REG_DATA.RES.INCOMPLETE;
                              break;
                          }
                          drive.ibSector = 0;
                          /*
                           * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                           * This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
                           */
                          this.advanceSector(drive);
                      } while (true);
                  }
                  done(b, false, obj, off);
              };
              
              /**
               * writeData(drive, b)
               *
               * The following drive properties must have been setup prior to our first call:
               *
               *      drive.bHead
               *      drive.bCylinder
               *      drive.bSector
               *      drive.sector (initialized to null)
               *
               * On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
               * up the first sector of the request.  We then send the Disk bytes for that sector until the sector
               * is full, and then we look up the next sector and continue the process.
               *
               * NOTE: Since the FDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
               * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} b containing next byte to write
               * @return {number} (b unchanged; return -1 if command should be terminated)
               */
              FDC.prototype.writeData = function(drive, b)
              {
                  if (drive.resCode || !drive.disk) return -1;
                  do {
                      if (drive.sector) {
                          if (drive.disk.write(drive.sector, drive.ibSector++, b))
                              break;
                      }
                      /*
                       * Locate the next sector, and then try writing again.
                       */
                      drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                      if (!drive.sector) {
                          /*
                           * TODO: Determine whether this should be FDC.REG_DATA.RES.CRC_ERROR or FDC.REG_DATA.RES.DATA_FIELD
                           */
                          drive.resCode = FDC.REG_DATA.RES.CRC_ERROR | FDC.REG_DATA.RES.INCOMPLETE;
                          b = -1;
                          break;
                      }
                      drive.ibSector = 0;
                      /*
                       * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                       * This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
                       */
                      this.advanceSector(drive);
                  } while (true);
                  return b;
              };
              
              /**
               * advanceSector(drive)
               *
               * This increments the sector number; when the sector number reaches drive.nDiskSectors on the current track, we
               * increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nDiskHeads, we reset drive.bHead
               * and increment drive.bCylinder.
               *
               * @this {FDC}
               * @param {Object} drive
               */
              FDC.prototype.advanceSector = function(drive)
              {
                  this.assert(drive.bCylinder < drive.nDiskCylinders);
                  drive.bSector++;
                  var bSectorStart = 1;
                  if (drive.bSector >= drive.nDiskSectors + bSectorStart) {
                      drive.bSector = bSectorStart;
                      drive.bHead++;
                      if (drive.bHead >= drive.nDiskHeads) {
                          drive.bHead = 0;
                          drive.bCylinder++;
                      }
                  }
              };
              
              /**
               * writeFormat(drive, b)
               *
               * @this {FDC}
               * @param {Object} drive
               * @param {number} b containing a format command byte
               * @return {number} (b if successful, -1 if command should be terminated)
               */
              FDC.prototype.writeFormat = function(drive, b)
              {
                  if (drive.resCode) return -1;
                  drive.abFormat[drive.cbFormat++] = b;
                  if (drive.cbFormat == drive.abFormat.length) {
                      drive.bCylinder = drive.abFormat[0];    // C
                      drive.bHead = drive.abFormat[1];        // H
                      drive.bSector = drive.abFormat[2];      // R
                      drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
                      drive.cbFormat = 0;
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("writeFormat(head=" + str.toHexByte(drive.bHead) + ",cyl=" + str.toHexByte(drive.bCylinder) + ",sec=" + str.toHexByte(drive.bSector) + ",len=" + str.toHexWord(drive.nBytes) + ")");
                      }
                      for (var i = 0; i < drive.nBytes; i++) {
                          if (this.writeData(drive, drive.bFiller) < 0) {
                              return -1;
                          }
                      }
                      drive.cSectorsFormatted++;
                  }
                  if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
                  return b;
              };
              
              /*
               * Port input notification table
               *
               * TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
               * way out and always emulating it.  So, consider an FDC parameter to disable that feature for stricter compatibility.
               */
              FDC.aPortInput = {
                  0x3F4: FDC.prototype.inFDCStatus,
                  0x3F5: FDC.prototype.inFDCData,
                  0x3F7: FDC.prototype.inFDCInput
              };
              
              /*
               * Port output notification table
               *
               * TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
               * way out and always emulating it.  So, consider an FDC parameter to disable that feature for stricter compatibility.
               */
              FDC.aPortOutput = {
                  0x3F2: FDC.prototype.outFDCOutput,
                  0x3F5: FDC.prototype.outFDCData,
                  0x3F7: FDC.prototype.outFDCControl
              };
              
              /**
               * FDC.init()
               *
               * This function operates on every HTML element of class "fdc", extracting the
               * JSON-encoded parameters for the FDC constructor from the element's "data-value"
               * attribute, invoking the constructor to create a FDC component, and then binding
               * any associated HTML controls to the new component.
               */
              FDC.init = function() {
                  var aeFDC = Component.getElementsByClass(window.document, PCJSCLASS, "fdc");
                  for (var iFDC = 0; iFDC < aeFDC.length; iFDC++) {
                      var eFDC = aeFDC[iFDC];
                      var parmsFDC = Component.getComponentParms(eFDC);
                      var fdc = new FDC(parmsFDC);
                      Component.bindComponentControls(fdc, eFDC, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every Floppy Drive Controller (FDC) module on the page.
               */
              web.onInit(FDC.init);
              
              if (typeof module !== 'undefined') module.exports = FDC;
              
            • hdc.js
              /**
               * @fileoverview Implements the PCjs Hard Drive Controller (HDC) component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Nov-26
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var DiskAPI     = require("../../shared/lib/diskapi");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var ChipSet     = require("./chipset");
                  var Disk        = require("./disk");
                  var State       = require("./state");
              }
              
              /**
               * HDC(parmsHDC)
               *
               * The HDC component simulates an STC-506/412 interface to an IBM-compatible fixed disk drive. The first
               * such drive was a 10Mb 5.25-inch drive containing two platters and 4 heads. Data spanned 306 cylinders
               * for a total of 1224 tracks, with 17 sectors/track and 512 bytes/sector.  Support has since been expanded
               * to include the original PC AT Western Digital controller.
               *
               * HDC supports the following component-specific properties:
               *
               *      drives: an array of driveConfig objects, each containing 'name', 'path', 'size' and 'type' properties
               *      type:   either 'xt' (for the PC XT Xebec controller) or 'at' (for the PC AT Western Digital controller)
               *
               * The 'type' parameter defaults to 'xt'.  All ports for the PC XT controller are referred to as XTC ports,
               * and similarly, all PC AT controller ports are referred to as ATC ports.
               *
               * If 'path' is empty, a scratch disk image is created; otherwise, we make a note of the path, but we will NOT
               * pre-load it like we do for floppy disk images.
               *
               * My current plan is to read all disk data on-demand, keeping a cache of what we've read, and possibly adding
               * some read-ahead as well. Any portions of the disk image that are written before being read will never be read.
               *
               * TRIVIA: On p.1-179 of the PC XT Technical Reference Manual (revised APR83), it reads:
               *
               *      "WARNING: The last cylinder on the fixed disk drive is reserved for diagnostic use.
               *      Diagnostic write tests will destroy any data on this cylinder."
               *
               * Does FDISK insure that the last cylinder is reserved?  I'm sure we'll eventually find out.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsHDC
               */
              function HDC(parmsHDC) {
              
                  Component.call(this, "HDC", parmsHDC, HDC, Messages.HDC);
              
                  this['dmaRead'] = this.dmaRead;
                  this['dmaWrite'] = this.dmaWrite;
                  this['dmaWriteBuffer'] = this.dmaWriteBuffer;
                  this['dmaWriteFormat'] = this.dmaWriteFormat;
              
                  this.aDriveConfigs = [];
              
                  if (parmsHDC['drives']) {
                      try {
                          /*
                           * The most likely source of any exception will be right here, where we're parsing
                           * the JSON-encoded drive data.
                           */
                          this.aDriveConfigs = eval("(" + parmsHDC['drives'] + ")");
                          /*
                           * Nothing more to do with aDriveConfigs now. initController() and autoMount() (if there are
                           * any disk image "path" properties to process) will take care of the rest.
                           */
                      } catch (e) {
                          Component.error("HDC drive configuration error: " + e.message + " (" + parmsHDC['drives'] + ")");
                      }
                  }
              
                  /*
                   * Set fATC (AT Controller flag) according to the 'type' parameter.  This in turn determines other
                   * defaults.  For example, the default XT drive type is 3 (for a 10Mb disk drive), whereas the default
                   * AT drive type is 2 (for a 20Mb disk drive).
                   */
                  this.fATC = (parmsHDC['type'] == "at");
                  this.iHDC = this.fATC? 1 : 0;
                  this.iDriveTypeDefault = this.fATC? 2 : 3;
              
                  /*
                   * The remainder of HDC initialization now takes place in our initBus() handler
                   */
              }
              
              Component.subclass(HDC);
              
              /*
               * HDC defaults, in case drive parameters weren't specified
               */
              HDC.DEFAULT_DRIVE_NAME = "Hard Drive";
              
              /*
               * Each of the following DriveType entries contain (up to) 4 values:
               *
               *      [0]: total cylinders
               *      [1]: total heads
               *      [2]: total sectors/tracks (optional; default is 17)
               *      [3]: total bytes/sector (optional; default is 512)
               *
               * verifyDrive() attempts to confirm that these values agree with the programmed drive characteristics.
               */
              HDC.aDriveTypes = [
                  {
                      0x00: [306, 2],
                      0x01: [375, 8],
                      0x02: [306, 6],
                      0x03: [306, 4]         // 10Mb (default XTC drive type)
                  },
                  /*
                   * Sadly, drive types differ across controller models (XTC drive types don't match ATC drive types),
                   * so aDriveTypes must first be indexed by a controller index (this.iHDC).
                   *
                   * The following is a more complete description of the drive types supported by the MODEL_5170, where C is
                   * Cylinders, H is Heads, WP is Write Pre-Comp, and LZ is Landing Zone (in practice, we don't need WP or LZ).
                   *
                   * Type    C    H   WP   LZ
                   * ----  ---   --  ---  ---
                   *   1   306    4  128  305
                   *   2   615    4  300  615
                   *   3   615    6  300  615
                   *   4   940    8  512  940
                   *   5   940    6  512  940
                   *   6   615    4   no  615
                   *   7   462    8  256  511
                   *   8   733    5   no  733
                   *   9   900   15  no8  901
                   *  10   820    3   no  820
                   *  11   855    5   no  855
                   *  12   855    7   no  855
                   *  13   306    8  128  319
                   *  14   733    7   no  733
                   *  15  (reserved--all zeros)
                   */
                  {
                      0x01: [306, 4],         // 10Mb
                      0x02: [615, 4],         // 20Mb (default ATC drive type)
                      0x03: [615, 6],
                      0x04: [940, 8],
                      0x05: [940, 6],
                      0x06: [615, 4],
                      0x07: [462, 8],
                      0x08: [733, 5],
                      0x09: [900,15],
                      0x0A: [820, 3],
                      0x0B: [855, 5],
                      0x0C: [855, 7],
                      0x0D: [306, 8],
                      0x0E: [733, 7]
                  }
              ];
              
              /*
               * ATC (AT Controller) Registers
               *
               * The "IBM Personal Computer AT Fixed Disk and Diskette Drive Adapter", aka the HFCOMBO card, contains what we refer
               * to here as the ATC (AT Controller).  Even though that card contains both Fixed Disk and Diskette Drive controllers,
               * this component (HDC) still deals only with the "Fixed Disk" portion.  Fortunately, the "Diskette Drive Adapter"
               * portion of the card is compatible with the existing FDC component, so that component continues to be responsible
               * for all diskette operations.
               *
               * ATC ports default to their primary addresses; secondary port addresses are 0x80 lower (eg, 0x170 instead of 0x1F0).
               *
               * It's important to know that the MODEL_5170 BIOS has a special relationship with the "Combo Hard File/Diskette
               * (HFCOMBO) Card" (see @F000:144C).  Initially, the ChipSet component intercepted reads for HFCOMBO's STATUS port
               * and returned the BUSY bit clear to reduce boot time; however, it turned out that was also a prerequisite for the
               * BIOS to write test patterns to the CYLLO port and set the "DUAL" bit (bit 0) of the "HFCNTRL" byte at 40:8Fh if
               * those CYLLO operations succeeded (now that the HDC is "ATC-aware", those ChipSet port intercepts have been removed).
               *
               * Without the "DUAL" bit set, when it came time later to report the diskette drive type, the "DISK_TYPE" function
               * (@F000:273D) would branch to one of two almost-identical blocks of code -- specifically, a block that disallowed
               * diskette drive types >= 2 (ChipSet.CMOS.FDRIVE.FD360) instead of >= 3 (ChipSet.CMOS.FDRIVE.FD1200).
               *
               * In other words, the "Fixed Disk" portion of the HFCOMBO controller has to be present and operational if the user
               * wants to use high-capacity (80-track) diskettes with "Diskette Drive" portion of the controller.  This may not be
               * immediately obvious to anyone creating a 5170 machine configuration with the FDC component but no HDC component.
               *
               * TODO: Investigate what a MODEL_5170 can do, if anything, with diskettes if an "HFCOMBO card" was NOT installed
               * (eg, was there Diskette-only Controller that could be installed, and if so, did it support high-capacity diskettes?)
               * Also, consider making the FDC component able to detect when the HDC is missing and provide the same minimal HFCOMBO
               * port intercepts that ChipSet once provided (this is not a compatibility requirement, just a usability improvement).
               */
              HDC.ATC = {
                  DATA:   { PORT: 0x1F0},     // no register (read-write)
                  DIAG:   {                   // this.regError (read-only)
                      PORT:       0x1F1,
                      NO_ERROR:    0x01,
                      CTRL_ERROR:  0x02,
                      SEC_ERROR:   0x03,
                      ECC_ERROR:   0x04,
                      PROC_ERROR:  0x05
                  },
                  ERROR: {                    // this.regError (read-only)
                      PORT:       0x1F1,
                      NONE:        0x00,
                      NO_DAM:      0x01,      // Data Address Mark (DAM) not found
                      NO_TRK0:     0x02,      // Track 0 not detected
                      CMD_ABORT:   0x04,      // Aborted Command
                      NO_CHS:      0x10,      // ID field with the specified C:H:S not found
                      ECC_ERR:     0x40,      // Data ECC Error
                      BAD_BLOCK:   0x80       // Bad Block Detect
                  },
                  WPREC:  { PORT: 0x1F1},     // this.regWPreC (write-only)
                  SECCNT: { PORT: 0x1F2},     // this.regSecCnt (read-write; 0 implies a 256-sector request)
                  SECNUM: { PORT: 0x1F3},     // this.regSecNum (read-write)
                  CYLLO:  { PORT: 0x1F4},     // this.regCylLo (read-write; all 8 bits are used)
                  CYLHI:  {                   // this.regCylHi (read-write; only bits 0-1 are used, for a total of 10 bits, or 1024 max cylinders)
                      PORT:       0x1F5,
                      MASK:        0x03
                  },
                  DRVHD:  {                   // this.regDrvHd (read-write)
                      PORT:       0x1F6,
                      HEAD_MASK:   0x0F,      // set this to the max number of heads before issuing a SET PARAMETERS command
                      DRIVE_MASK:  0x10,
                      SET_MASK:    0xE0,
                      SET_BITS:    0xA0       // for whatever reason, these bits must always be set
                  },
                  STATUS: {                   // this.regStatus (read-only; reading clears IRQ.ATC)
                      PORT:       0x1F7,
                      BUSY:        0x80,      // if this is set, no other STATUS bits are valid
                      READY:       0x40,      // if this is set (along with the SEEK_OK bit), the drive is ready to read/write/seek again
                      WFAULT:      0x20,      // write fault
                      SEEK_OK:     0x10,      // seek operation complete
                      DATA_REQ:    0x08,      // indicates that "the sector buffer requires servicing during a Read or Write command. If either bit 7 (BUSY) or this bit is active, a command is being executed. Upon receipt of any command, this bit is reset."
                      CORRECTED:   0x04,
                      INDEX:       0x02,      // set once for every revolution of the disk
                      ERROR:       0x01       // set when the previous command ended in an error; one or more bits are set in the ERROR register (the next command to the controller resets the ERROR bit)
                  },
                  COMMAND: {                  // this.regCommand (write-only)
                      PORT:       0x1F7,
                      RESTORE:     0x10,      // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us) (aka RECALIBRATE)
                      READ_DATA:   0x20,      // also supports NO_RETRIES and WITH_ECC
                      WRITE_DATA:  0x30,      // also supports NO_RETRIES and WITH_ECC
                      READ_VERF:   0x40,      // also supports NO_RETRIES
                      FORMAT_TRK:  0x50,
                      SEEK:        0x70,      // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us)
                      DIAGNOSE:    0x90,
                      SETPARMS:    0x91,
                      NO_RETRIES:  0x01,
                      WITH_ECC:    0x02,
                      MASK:        0xF0
                  },
                  FDR: {                      // this.regFDR
                      PORT:       0x3F6,
                      INT_DISABLE: 0x02,      // a logical 0 enables fixed disk interrupts
                      RESET:       0x04,      // a logical 1 enables reset fixed disk function
                      HS3:         0x08,      // a logical 1 enables head select 3 (a logical 0 enables reduced write current)
                      RESERVED:    0xF1
                  }
              };
              
              /*
               * XTC (XT Controller) Registers
               */
              HDC.XTC = {
                  /*
                   * XTC Data Register (0x320, read-write)
                   *
                   * Writes to this register are discussed below; see HDC Commands.
                   *
                   * Reads from this register after a command has been executed retrieve a "status byte",
                   * which must NOT be confused with the Status Register (see below).  This data "status byte"
                   * contains only two bits of interest: XTC.DATA.STATUS.ERROR and XTC.DATA.STATUS.UNIT.
                   */
                  DATA: {
                      PORT:          0x320,   // port address
                      STATUS: {
                          OK:         0x00,   // no error
                          ERROR:      0x02,   // error occurred during command execution
                          UNIT:       0x20    // logical unit number of the drive
                      },
                      /*
                       * XTC Commands, as issued to XTC_DATA
                       *
                       * Commands are multi-byte sequences sent to XTC_DATA, starting with a XTC_DATA.CMD byte,
                       * and followed by 5 more bytes, for a total of 6 bytes, which collectively are called a
                       * Device Control Block (DCB).  Not all commands use all 6 bytes, but all 6 bytes must be present;
                       * unused bytes are simply ignored.
                       *
                       *      XTC_DATA.CMD    (3-bit class code, 5-bit operation code)
                       *      XTC_DATA.HEAD   (1-bit drive number, 5-bit head number)
                       *      XTC_DATA.CLSEC  (upper bits of 10-bit cylinder number, 6-bit sector number)
                       *      XTC_DATA.CH     (lower bits of 10-bit cylinder number)
                       *      XTC_DATA.COUNT  (8-bit interleave or block count)
                       *      XTC_DATA.CTRL   (8-bit control field)
                       *
                       * One command, HDC.XTC.DATA.CMD.INIT_DRIVE, must include 8 additional bytes following the DCB:
                       *
                       *      maximum number of cylinders (high)
                       *      maximum number of cylinders (low)
                       *      maximum number of heads
                       *      start reduced write current cylinder (high)
                       *      start reduced write current cylinder (low)
                       *      start write precompensation cylinder (high)
                       *      start write precompensation cylinder (low)
                       *      maximum ECC data burst length
                       *
                       * Note that the 3 word values above are stored in "big-endian" format (high byte followed by low byte),
                       * rather than the more typical "little-endian" format (low byte followed by high byte).
                       */
                      CMD: {
                          TEST_READY:     0x00,       // Test Drive Ready
                          RECALIBRATE:    0x01,       // Recalibrate
                          REQUEST_SENSE:  0x03,       // Request Sense Status
                          FORMAT_DRIVE:   0x04,       // Format Drive
                          READ_VERF:      0x05,       // Read Verify
                          FORMAT_TRK:     0x06,       // Format Track
                          FORMAT_BAD:     0x07,       // Format Bad Track
                          READ_DATA:      0x08,       // Read
                          WRITE_DATA:     0x0A,       // Write
                          SEEK:           0x0B,       // Seek
                          INIT_DRIVE:     0x0C,       // Initialize Drive Characteristics
                          READ_ECC_BURST: 0x0D,       // Read ECC Burst Error Length
                          READ_BUFFER:    0x0E,       // Read Data from Sector Buffer
                          WRITE_BUFFER:   0x0F,       // Write Data to Sector Buffer
                          RAM_DIAGNOSTIC: 0xE0,       // RAM Diagnostic
                          DRV_DIAGNOSTIC: 0xE3,       // HDC BIOS: CHK_DRV_CMD
                          CTL_DIAGNOSTIC: 0xE4,       // HDC BIOS: CNTLR_DIAG_CMD
                          READ_LONG:      0xE5,       // HDC BIOS: RD_LONG_CMD
                          WRITE_LONG:     0xE6        // HDC BIOS: WR_LONG_CMD
                      },
                      ERR: {
                          /*
                           * HDC error conditions, as returned in byte 0 of the (4) bytes returned by the Request Sense Status command
                           */
                          NONE:           0x00,
                          NO_INDEX:       0x01,       // no index signal detected
                          SEEK_INCOMPLETE:0x02,       // no seek-complete signal
                          WRITE_FAULT:    0x03,
                          NOT_READY:      0x04,       // after the controller selected the drive, the drive did not respond with a ready signal
                          NO_TRACK:       0x06,       // after stepping the max number of cylinders, the controller did not receive the track 00 signal from the drive
                          STILL_SEEKING:  0x08,
                          ECC_ID_ERROR:   0x10,
                          ECC_DATA_ERROR: 0x11,
                          NO_ADDR_MARK:   0x12,
                          NO_SECTOR:      0x14,
                          BAD_SEEK:       0x15,       // seek error: the cylinder and/or head address did not compare with the expected target address
                          ECC_CORRECTABLE:0x18,       // correctable data error
                          BAD_TRACK:      0x19,
                          BAD_CMD:        0x20,
                          BAD_DISK_ADDR:  0x21,
                          RAM:            0x30,
                          CHECKSUM:       0x31,
                          POLYNOMIAL:     0x32,
                          MASK:           0x3F
                      },
                      SENSE: {
                          ADDR_VALID:     0x80
                      }
                  },
                  /*
                   * XTC Status Register (0x321, read-only)
                   *
                   * WARNING: The IBM Technical Reference Manual *badly* confuses the XTC_DATA "status byte" (above)
                   * that the controller sends following an HDC.XTC.DATA.CMD operation with the Status Register (below).
                   * In fact, it's so badly confused that it completely fails to document any of the Status Register
                   * bits below; I'm forced to guess at their meanings from the HDC BIOS listing.
                   */
                  STATUS: {
                      PORT:          0x321,   // port address
                      NONE:           0x00,
                      REQ:            0x01,   // HDC BIOS: request bit
                      IOMODE:         0x02,   // HDC BIOS: mode bit (GUESS: set whenever XTC_DATA contains a response?)
                      BUS:            0x04,   // HDC BIOS: command/data bit (GUESS: set whenever XTC_DATA ready for request?)
                      BUSY:           0x08,   // HDC BIOS: busy bit
                      INTERRUPT:      0x20    // HDC BIOS: interrupt bit
                  }
              };
              
              /*
               * XTC Config Register (0x322, read-only)
               *
               * This register is used to read HDC card switch settings that defined the "Drive Type" for
               * drives 0 and 1.  SW[1],SW[2] (for drive 0) and SW[3],SW[4] (for drive 1) are set as follows:
               *
               *      ON,  ON     Drive Type 0   (306 cylinders, 2 heads)
               *      ON,  OFF    Drive Type 1   (375 cylinders, 8 heads)
               *      OFF, ON     Drive Type 2   (306 cylinders, 6 heads)
               *      OFF, OFF    Drive Type 3   (306 cylinders, 4 heads)
               */
              
              /*
               * HDC Command Sequences
               *
               * Unlike the FDC, all the HDC commands have fixed-length command request sequences (well, OK, except for
               * HDC.XTC.DATA.CMD.INIT_DRIVE) and fixed-length response sequences (well, OK, except for HDC.XTC.DATA.CMD.REQUEST_SENSE),
               * so a table of byte-lengths isn't much use, but having names for all the commands is still handy for debugging.
               */
              if (DEBUG) {
                  HDC.aATCCommands = {
                      0x10: "Restore (Recalibrate)",
                      0x20: "Read",
                      0x30: "Write",
                      0x40: "Read Verify",
                      0x50: "Format Track",
                      0x70: "Seek",
                      0x90: "Diagnose",
                      0x91: "Set Parameters"
                  };
                  HDC.aXTCCommands = {
                      0x00: "Test Drive Ready",
                      0x01: "Recalibrate",
                      0x03: "Request Sense Status",
                      0x04: "Format Drive",
                      0x05: "Read Verify",
                      0x06: "Format Track",
                      0x07: "Format Bad Track",
                      0x08: "Read",
                      0x0A: "Write",
                      0x0B: "Seek",
                      0x0C: "Initialize Drive Characteristics",
                      0x0D: "Read ECC Burst Error Length",
                      0x0E: "Read Data from Sector Buffer",
                      0x0F: "Write Data to Sector Buffer",
                      0xE0: "RAM Diagnostic",
                      0xE3: "Drive Diagnostic",
                      0xE4: "Controller Diagnostic",
                      0xE5: "Read Long",
                      0xE6: "Write Long"
                  };
              }
              
              /*
               * HDC BIOS interrupts, functions, and other parameters
               *
               * When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
               * in the INT 0x40 vector.
               */
              HDC.BIOS = {
                  INT_DISK:       0x13,
                  INT_DISKETTE:   0x40
              };
              
              /*
               * NOTE: These are useful values for reference, but they're not actually used for anything at the moment.
               */
              HDC.BIOS.DISK_CMD = {
                  RESET:          0x00,
                  GET_STATUS:     0x01,
                  READ_SECTORS:   0x02,
                  WRITE_SECTORS:  0x03,
                  VERIFY_SECTORS: 0x04,
                  FORMAT_TRK:     0x05,
                  FORMAT_BAD:     0x06,
                  FORMAT_DRIVE:   0x07,
                  GET_DRIVEPARMS: 0x08,
                  SET_DRIVEPARMS: 0x09,
                  READ_LONG:      0x0A,
                  WRITE_LONG:     0x0B,
                  SEEK:           0x0C,
                  ALT_RESET:      0x0D,
                  READ_BUFFER:    0x0E,
                  WRITE_BUFFER:   0x0F,
                  TEST_READY:     0x10,
                  RECALIBRATE:    0x11,
                  RAM_DIAGNOSTIC: 0x12,
                  DRV_DIAGNOSTIC: 0x13,
                  CTL_DIAGNOSTIC: 0x14
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {HDC}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              HDC.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  /*
                   * This is reserved for future use; for now, hard disk images can be specified during initialization only (no "hot-swapping")
                   */
                  return false;
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {HDC}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              HDC.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.cmp = cmp;
              
                  /*
                   * We need access to the ChipSet component, because we need to communicate with
                   * the PIC and DMA controller.
                   */
                  this.chipset = cmp.getComponentByType("ChipSet");
              
                  bus.addPortInputTable(this, this.fATC? HDC.aATCPortInput : HDC.aXTCPortInput);
                  bus.addPortOutputTable(this, this.fATC? HDC.aATCPortOutput : HDC.aXTCPortOutput);
              
                  cpu.addIntNotify(HDC.BIOS.INT_DISK, this, this.intBIOSDisk);
                  cpu.addIntNotify(HDC.BIOS.INT_DISKETTE, this, this.intBIOSDiskette);
              
                  /*
                   * The following code used to be performed in the HDC constructor, but now we need to wait for information
                   * about the Computer to be available (eg, getMachineID() and getUserID()) before we start loading and/or
                   * connecting to disk images.
                   *
                   * If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp()
                   * notification, at which point reset() would call initController(), or restore() would restore the controller;
                   * in that case, all we'd need to do here is call setReady().
                   */
                  this.reset();
              
                  if (!this.autoMount()) this.setReady();
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {HDC}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              HDC.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.initController();
                          if (this.cmp.fReload) {
                              /*
                               * If the computer's fReload flag is set, we're required to toss all currently
                               * loaded disks and remount all disks specified in the auto-mount configuration.
                               */
                              this.autoMount(true);
                          }
                      } else {
                          if (!this.restore(data)) return false;
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {HDC}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean}
               */
              HDC.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * getMachineID()
               *
               * @return {string}
               */
              HDC.prototype.getMachineID = function()
              {
                  return this.cmp? this.cmp.getMachineID() : "";
              };
              
              /**
               * getUserID()
               *
               * @return {string}
               */
              HDC.prototype.getUserID = function()
              {
                  return this.cmp? this.cmp.getUserID() : "";
              };
              
              /**
               * reset()
               *
               * @this {HDC}
               */
              HDC.prototype.reset = function()
              {
                  /*
                   * TODO: The controller is also initialized by the constructor, to assist with auto-mount support,
                   * so think about whether we can skip powerUp initialization.
                   */
                  this.initController(null, true);
              };
              
              /**
               * save()
               *
               * This implements save support for the HDC component.
               *
               * @this {HDC}
               * @return {Object}
               */
              HDC.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.saveController());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the HDC component.
               *
               * @this {HDC}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              HDC.prototype.restore = function(data)
              {
                  return this.initController(data[0]);
              };
              
              /**
               * initController(data, fHard)
               *
               * @this {HDC}
               * @param {Array} [data]
               * @param {boolean} [fHard] true if a machine reset (not just a controller reset)
               * @return {boolean} true if successful, false if failure
               */
              HDC.prototype.initController = function(data, fHard)
              {
                  var i = 0;
                  var fSuccess = true;
              
                  /*
                   * At this point, it's worth calling into question my decision to NOT split the HDC component into separate XTC
                   * and ATC components, given all the differences, and given that I'm about to write some "if (ATC) else (XTC) ..."
                   * code.  And all I can say in my defense is, yes, it's definitely worth calling that into question.
                   *
                   * However, there's also some common code, mostly in the area of disk management rather than controller management,
                   * and if the components were split, then I'd have to create a third component for that common code (although again,
                   * disk management probably belongs in its own component anyway).
                   *
                   * However, let's not forget that since my overall plan is to have only one PCjs "binary", everything's going to end
                   * up in the same bucket anyway, so let's not be too obsessive about organizational details.  As long as the number
                   * of these conditionals is small and they're not performance-critical, this seems much ado about nothing.
                   */
                  if (this.fATC) {
                      /*
                       * Since there's no way (and never will be a way) for an HDC to change its "personality" (from 'xt' to 'at'
                       * or vice versa), we're under no obligation to use the same number of registers, or save/restore format, etc,
                       * as the original XT controller.
                       */
                      if (data == null) data = [0, 0, 0, 0, 0, 0, 0, 0, HDC.ATC.STATUS.READY, 0];
                      this.regError   = data[i++];
                      this.regWPreC   = data[i++];
                      this.regSecCnt  = data[i++];
                      this.regSecNum  = data[i++];
                      this.regCylLo   = data[i++];
                      this.regCylHi   = data[i++];
                      this.regDrvHd   = data[i++];
                      this.regStatus  = data[i++];
                      this.regCommand = data[i++];
                      this.regFDR     = data[i++];
                      /*
                       * Additional state is maintained by the Drive object (eg, abSector, ibSector)
                       */
                  } else {
                      if (data == null) data = [0, HDC.XTC.STATUS.NONE, new Array(14), 0, 0];
                      this.regConfig    = data[i++];
                      this.regStatus    = data[i++];
                      this.regDataArray = data[i++];  // there can be up to 14 command bytes (6 for normal commands, plus 8 more for HDC.XTC.DATA.CMD.INIT_DRIVE)
                      this.regDataIndex = data[i++];  // used to control the next data byte to be received
                      this.regDataTotal = data[i++];  // used to control the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total)
                      this.regReset     = data[i++];
                      this.regPulse     = data[i++];
                      this.regPattern   = data[i++];
                      /*
                       * Initialize iDriveAllowFail only if it's never been initialized, otherwise its entire purpose will be defeated.
                       * See the related HACK in intBIOSDisk() for more details.
                       */
                      var iDriveAllowFail = data[i++];
                      if (iDriveAllowFail !== undefined) {
                          this.iDriveAllowFail = iDriveAllowFail;
                      } else {
                          if (this.iDriveAllowFail === undefined) this.iDriveAllowFail = -1;
                      }
                  }
              
                  if (this.aDrives === undefined) {
                      this.aDrives = new Array(this.aDriveConfigs.length);
                  }
              
                  var dataDrives = data[i];
                  if (dataDrives === undefined) dataDrives = [];
              
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      if (this.aDrives[iDrive] === undefined) {
                          this.aDrives[iDrive] = {};
                      }
                      var drive = this.aDrives[iDrive];
                      var driveConfig = this.aDriveConfigs[iDrive];
                      if (!this.initDrive(iDrive, drive, driveConfig, dataDrives[iDrive], fHard)) {
                          fSuccess = false;
                      }
                      /*
                       * XTC only: the original STC-506/412 controller had two pairs of DIP switches to indicate a drive
                       * type (0, 1, 2 or 3) for drives 0 and 1.  Those switch settings are recorded in regConfig, now that
                       * drive.type has been validated by initDrive().
                       */
                      if (this.regConfig != null && iDrive <= 1) {
                          this.regConfig |= (drive.type & 0x3) << ((1 - iDrive) << 1);
                      }
                  }
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("HDC initialized for " + this.aDrives.length + " drive(s)");
                  }
                  return fSuccess;
              };
              
              /**
               * saveController()
               *
               * @this {HDC}
               * @return {Array}
               */
              HDC.prototype.saveController = function()
              {
                  var i = 0;
                  var data = [];
                  if (this.fATC) {
                      data[i++] = this.regError;
                      data[i++] = this.regWPreC;
                      data[i++] = this.regSecCnt;
                      data[i++] = this.regSecNum;
                      data[i++] = this.regCylLo;
                      data[i++] = this.regCylHi;
                      data[i++] = this.regDrvHd;
                      data[i++] = this.regStatus;
                      data[i++] = this.regCommand;
                      data[i++] = this.regFDR;
                  } else {
                      data[i++] = this.regConfig;
                      data[i++] = this.regStatus;
                      data[i++] = this.regDataArray;
                      data[i++] = this.regDataIndex;
                      data[i++] = this.regDataTotal;
                      data[i++] = this.regReset;
                      data[i++] = this.regPulse;
                      data[i++] = this.regPattern;
                      data[i++] = this.iDriveAllowFail;
                  }
                  data[i] = this.saveDrives();
                  return data;
              };
              
              /**
               * initDrive(iDrive, drive, driveConfig, data, fHard)
               *
               * TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
               * between the drive objects created by both controllers.  This will clean up overall drive management and allow
               * us to factor out some common Drive methods (eg, advanceSector()).
               *
               * @this {HDC}
               * @param {number} iDrive
               * @param {Object} drive
               * @param {Object} driveConfig (contains one or more of the following properties: 'name', 'path', 'size', 'type')
               * @param {Array} [data]
               * @param {boolean} [fHard] true if a machine reset (not just a controller reset)
               * @return {boolean} true if successful, false if failure
               */
              HDC.prototype.initDrive = function(iDrive, drive, driveConfig, data, fHard)
              {
                  var i = 0;
                  var fSuccess = true;
                  if (data === undefined) data = [HDC.XTC.DATA.ERR.NONE, 0, false, new Array(8)];
              
                  drive.iDrive = iDrive;
              
                  /*
                   * errorCode could be an HDC global, but in order to insulate HDC state from the operation of various functions
                   * that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable.  This choice may
                   * be contrary to how the actual hardware works, but I prefer this approach, as long as it doesn't expose any
                   * incompatibilities that any software actually cares about.
                   */
                  drive.errorCode = data[i++];
                  drive.senseCode = data[i++];
                  drive.fRemovable = data[i++];
                  drive.abDriveParms = data[i++];         // captures drive parameters programmed via HDC.XTC.DATA.CMD.INIT_DRIVE
              
                  /*
                   * TODO: Make abSector a DWORD array rather than a BYTE array (we could even allocate a Memory block for it);
                   * alternatively, eliminate the buffer entirely and re-establish a reference to the appropriate Disk sector object.
                   */
                  drive.abSector = data[i++];
              
                  /*
                   * The next group of properties are set by various HDC command sequences.
                   */
                  drive.bHead = data[i++];
                  drive.nHeads = data[i++];
                  drive.wCylinder = data[i++];
                  drive.bSector = data[i++];
                  drive.bSectorEnd = data[i++];           // aka EOT
                  drive.nBytes = data[i++];
                  drive.bSectorBias = (this.fATC? 0: 1);
              
                  drive.name = driveConfig['name'];
                  if (drive.name === undefined) drive.name = HDC.DEFAULT_DRIVE_NAME;
                  drive.path = driveConfig['path'];
              
                  /*
                   * If no 'mode' is specified, we fall back to the original behavior, which is to completely preload
                   * any specific disk image, or create an empty (purely local) disk image.
                   */
                  drive.mode = driveConfig['mode'] || (drive.path? DiskAPI.MODE.PRELOAD : DiskAPI.MODE.LOCAL);
              
                  /*
                   * On-demand I/O of raw disk images is supported only if there's a valid user ID; fall back to an empty
                   * local disk image if there's not.
                   */
                  if (drive.mode == DiskAPI.MODE.DEMANDRO || drive.mode == DiskAPI.MODE.DEMANDRW) {
                      if (!this.getUserID()) drive.mode = DiskAPI.MODE.LOCAL;
                  }
              
                  drive.type = driveConfig['type'];
                  if (drive.type === undefined || HDC.aDriveTypes[this.iHDC][drive.type] === undefined) drive.type = this.iDriveTypeDefault;
              
                  var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
                  drive.nSectors = driveType[2] || 17;    // sectors/track
                  drive.cbSector = driveType[3] || 512;   // bytes/sector (default is 512 if unspecified in the table)
              
                  /*
                   * On a full machine reset, pass the current drive type to setCMOSDriveType() (a no-op on pre-CMOS machines)
                   */
                  if (fHard && this.chipset) {
                      this.chipset.setCMOSDriveType(iDrive, drive.type);
                  }
              
                  /*
                   * The next group of properties are set by user requests to load/unload disk images.
                   *
                   * We no longer reinitialize drive.disk, in order to retain previously mounted disk across resets.
                   */
                  if (drive.disk === undefined) {
                      drive.disk = null;
                      this.notice("Type " + drive.type + " \"" + drive.name + "\" is fixed disk " + iDrive, true);
                  }
              
                  /*
                   * With the advent of save/restore, we need to verify every drive at initialization, not just whenever
                   * drive characteristics are initialized.  Thus, if we've restored a sensible set of drive characteristics,
                   * then verifyDrive will create an empty disk if none has been provided, insuring we are ready for
                   * disk.restore().
                   */
                  this.verifyDrive(drive);
              
                  /*
                   * The next group of properties are managed by worker functions (eg, doDMARead()) to maintain state across DMA requests.
                   */
                  drive.ibSector = data[i++];             // location of the next byte to be accessed in the above sector
                  drive.sector = null;                    // initialized to null by worker, and then set to the next sector satisfying the request
              
                  if (drive.disk) {
                      var deltas = data[i];
                      if (deltas !== undefined && drive.disk.restore(deltas) < 0) {
                          fSuccess = false;
                      }
                      if (fSuccess && drive.ibSector !== undefined) {
                          drive.sector = drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias);
                      }
                  }
                  return fSuccess;
              };
              
              /**
               * saveDrives()
               *
               * @this {HDC}
               * @return {Array}
               */
              HDC.prototype.saveDrives = function()
              {
                  var i = 0;
                  var data = [];
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      data[i++] = this.saveDrive(this.aDrives[iDrive]);
                  }
                  return data;
              };
              
              /**
               * saveDrive(drive)
               *
               * @this {HDC}
               * @return {Array}
               */
              HDC.prototype.saveDrive = function(drive)
              {
                  var i = 0;
                  var data = [];
                  data[i++] = drive.errorCode;
                  data[i++] = drive.senseCode;
                  data[i++] = drive.fRemovable;
                  data[i++] = drive.abDriveParms;
                  data[i++] = drive.abSector;
                  data[i++] = drive.bHead;
                  data[i++] = drive.nHeads;
                  data[i++] = drive.wCylinder;
                  data[i++] = drive.bSector;
                  data[i++] = drive.bSectorEnd;
                  data[i++] = drive.nBytes;
                  data[i++] = drive.ibSector;
                  data[i] = drive.disk? drive.disk.save() : null;
                  return data;
              };
              
              /**
               * copyDrive(iDrive)
               *
               * @this {HDC}
               * @param {number} iDrive
               * @return {Object|undefined} (undefined if the requested drive does not exist)
               */
              HDC.prototype.copyDrive = function(iDrive)
              {
                  var driveNew;
                  var driveOld = this.aDrives[iDrive];
                  if (driveOld !== undefined) {
                      driveNew = {};
                      for (var p in driveOld) {
                          driveNew[p] = driveOld[p];
                      }
                  }
                  return driveNew;
              };
              
              /**
               * verifyDrive(drive, type)
               *
               * If no disk image is attached, create an empty disk with the specified drive characteristics.
               * Normally, we'd rely on the drive characteristics programmed via the HDC.XTC.DATA.CMD.INIT_DRIVE
               * command, but if an explicit drive type is specified, then we use the characteristics (geometry)
               * associated with that type.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} [type] to create a disk of the specified type, if no disk exists yet
               */
              HDC.prototype.verifyDrive = function(drive, type)
              {
                  if (drive) {
                      var nHeads = 0, nCylinders = 0;
                      if (type == null) {
                          /*
                           * If the caller wants us to use the programmed drive parameters, we use those,
                           * but if there aren't any drive parameters (yet), then use default parameters based
                           * on drive.type.
                           *
                           * We used to do the last step ONLY if there was no drive.path -- otherwise, we'd waste
                           * time creating an empty disk if autoMount() was going to load an image from drive.path;
                           * but hopefully the Disk component is smarter now.
                           */
                          nHeads = drive.abDriveParms[2];
                          if (nHeads) {
                              nCylinders = (drive.abDriveParms[0] << 8) | drive.abDriveParms[1];
                          } else {
                              type = drive.type;
                          }
                      }
                      if (type != null && !nHeads) {
                          nHeads = HDC.aDriveTypes[this.iHDC][type][1];
                          nCylinders = HDC.aDriveTypes[this.iHDC][type][0];
                      }
                      if (nHeads) {
                          /*
                           * The assumption here is that if the 3rd drive parameter byte (abDriveParms[2]) has been set
                           * (ie, if nHeads is valid) then the first two bytes (ie, the low and high cylinder byte values)
                           * must have been set as well.
                           *
                           * Do these values agree with those for the given drive type?  Even if they don't, all we do is warn.
                           */
                          var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
                          if (driveType) {
                              if (nCylinders != driveType[0] && nHeads != driveType[1]) {
                                  this.notice("Warning: drive parameters (" + nCylinders + "," + nHeads + ") do not match drive type " + drive.type + " (" + driveType[0] + "," + driveType[1] + ")");
                              }
                          }
                          drive.nCylinders = nCylinders;
                          drive.nHeads = nHeads;
                          if (drive.disk == null) {
                              drive.disk = new Disk(this, drive, drive.mode);
                          }
                      }
                  }
              };
              
              /**
               * seekDrive(drive, iSector, nSectors)
               *
               * The HDC doesn't need this function, since all HDC requests from the CPU are handled by doXTCmd().  This function
               * is used by other components (eg, Debugger) to mimic an HDC request, using a drive object obtained from copyDrive(),
               * to avoid disturbing the internal state of the HDC's drive objects.
               *
               * Also note that in an actual HDC request, drive.nBytes is initialized to the size of a single sector; the extent
               * of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller.  The HDC
               * isn't aware of the extent of the transfer, so in the case of a read request, all readData() can do is return bytes
               * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
               * @param {number} nSectors
               * @return {boolean} true if successful, false if invalid position request
               */
              HDC.prototype.seekDrive = function(drive, iSector, nSectors)
              {
                  if (drive.disk) {
                      var aDiskInfo = drive.disk.info();
                      var nCylinders = aDiskInfo[0];
                      /*
                       * If nCylinders is zero, we probably have an empty disk image, awaiting initialization (see verifyDrive())
                       */
                      if (nCylinders) {
                          var nHeads = aDiskInfo[1];
                          var nSectorsPerTrack = aDiskInfo[2];
                          var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
                          var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
                          if (iSector + nSectors <= nSectorsPerDisk) {
                              drive.wCylinder = Math.floor(iSector / nSectorsPerCylinder);
                              iSector %= nSectorsPerCylinder;
                              drive.bHead = Math.floor(iSector / nSectorsPerTrack);
                              /*
                               * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers, so unlike
                               * FDC.seekDrive(), we must NOT add 1 to bSector below.  I could change how sector numbers are stored in
                               * hard disk images, but it seems preferable to keep the image format consistent and controller-independent.
                               */
                              drive.bSector = (iSector % nSectorsPerTrack);
                              drive.nBytes = nSectors * aDiskInfo[3];
                              /*
                               * NOTE: We don't set nSectorEnd, as an HDC command would, but it's irrelevant, because we don't actually
                               * do anything with nSectorEnd at this point.  Perhaps someday, when we faithfully honor/restrict requests
                               * to a single track (or a single cylinder, in the case of multi-track requests).
                               */
                              drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                              /*
                               * At this point, we've finished simulating what an HDC.XTC.DATA.CMD.READ_DATA command would have performed,
                               * up through doDMARead().  Now it's the caller responsibility to call readData(), like the DMA Controller would.
                               */
                              return true;
                          }
                      }
                  }
                  return false;
              };
              
              /**
               * autoMount(fRemount)
               *
               * @this {HDC}
               * @param {boolean} [fRemount] is true if we're remounting all auto-mounted disks
               * @return {boolean} true if one or more disk images are being auto-mounted, false if none
               */
              HDC.prototype.autoMount = function(fRemount)
              {
                  if (!fRemount) this.cAutoMount = 0;
              
                  for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                      var drive = this.aDrives[iDrive];
                      if (drive.name && drive.path) {
              
                          if (fRemount && drive.disk && drive.disk.isRemote()) {
                              /*
                               * The Disk component has its own logic for remounting remote disks, so skip this disk.
                               *
                               * TODO: Consider rewriting how ALL disks are automounted/remounted, now that the Disk component
                               * is receiving its own powerDown() and powerUp() notifications (originally, it didn't receive them).
                               */
                              continue;
                          }
              
                          if (!this.loadDisk(iDrive, drive.name, drive.path, true) && fRemount)
                              this.setReady(false);
                          continue;
                      }
                      if (fRemount && drive.type !== undefined) {
                          drive.disk = null;
                          this.verifyDrive(drive, drive.type);
                      }
                  }
                  return !!this.cAutoMount;
              };
              
              /**
               * loadDisk(iDrive, sDiskName, sDiskPath, fAutoMount)
               *
               * @this {HDC}
               * @param {number} iDrive
               * @param {string} sDiskName
               * @param {string} sDiskPath
               * @param {boolean} fAutoMount
               * @return {boolean} true if disk (already) loaded, false if queued up (or busy)
               */
              HDC.prototype.loadDisk = function(iDrive, sDiskName, sDiskPath, fAutoMount)
              {
                  var drive = this.aDrives[iDrive];
                  if (drive.fBusy) {
                      this.notice("Drive " + iDrive + " busy");
                      return true;
                  }
                  drive.fBusy = true;
                  if (fAutoMount) {
                      drive.fAutoMount = true;
                      this.cAutoMount++;
                      if (this.messageEnabled()) this.printMessage("loading " + sDiskName);
                  }
                  var disk = drive.disk || new Disk(this, drive, drive.mode);
                  disk.load(sDiskName, sDiskPath, null, this.doneLoadDisk);
                  return false;
              };
              
              /**
               * doneLoadDisk(drive, disk, sDiskName, sDiskPath)
               *
               * This is a callback issued by the Disk component once the load() operation has finished.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {Disk} disk is set if the disk was successfully mounted, null if not
               * @param {string} sDiskName
               * @param {string} sDiskPath
               */
              HDC.prototype.doneLoadDisk = function(drive, disk, sDiskName, sDiskPath)
              {
                  drive.fBusy = false;
                  if ((drive.disk = disk)) {
                      /*
                       * With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
                       * notify() is selective about its output, using print() if a print window is open, otherwise alert().
                       *
                       * WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
                       * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                       */
                      this.notice("Mounted disk \"" + sDiskName + "\" in drive " + String.fromCharCode(0x43 + drive.iDrive), drive.fAutoMount);
                  }
                  if (drive.fAutoMount) {
                      drive.fAutoMount = false;
                      if (!--this.cAutoMount) this.setReady();
                  }
              };
              
              /**
               * unloadDrive(iDrive)
               *
               * NOTE: At the moment, we support only auto-mounts; there is no user interface for selecting hard disk images,
               * let alone unloading them, so there is currently no need for the following function.
               *
               * @this {HDC}
               * @param {number} iDrive
               *
               HDC.prototype.unloadDrive = function(iDrive)
               {
                  this.aDrives[iDrive].disk = null;
                  //
                  // WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
                  // and is not guaranteed to match the drive mapping that DOS ultimately uses.
                  //
                  this.notice("Drive " + String.fromCharCode(0x43 + iDrive) + " unloaded");
              };
               */
              
              /**
               * intXTCData(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x320)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inXTCData = function(port, addrFrom)
              {
                  var bIn = 0;
                  if (this.regDataIndex < this.regDataTotal) {
                      bIn = this.regDataArray[this.regDataIndex];
                  }
                  if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
                  this.regStatus &= ~HDC.XTC.STATUS.INTERRUPT;
              
                  this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
                  if (++this.regDataIndex >= this.regDataTotal) {
                      this.regDataIndex = this.regDataTotal = 0;
                      this.regStatus &= ~(HDC.XTC.STATUS.IOMODE | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY);
                  }
                  return bIn;
              };
              
              /**
               * outXTCData(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x320)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outXTCData = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
                  if (this.regDataTotal < this.regDataArray.length) {
                      this.regDataArray[this.regDataTotal++] = bOut;
                  }
                  var bCmd = this.regDataArray[0];
                  var cbCmd = (bCmd != HDC.XTC.DATA.CMD.INIT_DRIVE? 6 : this.regDataArray.length);
                  if (this.regDataTotal == 6) {
                      /*
                       * XTC.STATUS.REQ must be CLEAR following any 6-byte command sequence that the HDC BIOS "COMMAND" function outputs,
                       * yet it must also be SET before the HDC BIOS will proceed with the remaining the 8-byte sequence that's part of
                       * HDC.XTC.DATA.CMD.INIT_DRIVE command. See inXTCStatus() for HACK details.
                       */
                      this.regStatus &= ~HDC.XTC.STATUS.REQ;
                  }
                  if (this.regDataTotal >= cbCmd) {
                      /*
                       * It's essential that XTC.STATUS.IOMODE be set here, at least after the final 8-byte HDC.XTC.DATA.CMD.INIT_DRIVE sequence.
                       */
                      this.regStatus |= HDC.XTC.STATUS.IOMODE;
                      this.regStatus &= ~HDC.XTC.STATUS.REQ;
                      this.doXTC();
                  }
              };
              
              /**
               * inXTCStatus(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x321)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inXTCStatus = function(port, addrFrom)
              {
                  var b = this.regStatus;
                  this.printMessageIO(port, null, addrFrom, "STATUS", b);
                  /*
                   * HACK: The HDC BIOS will not finish the HDC.XTC.DATA.CMD.INIT_DRIVE sequence unless it sees XTC.STATUS.REQ set again, nor will
                   * it read any of the XTC.DATA bytes returned from a HDC.XTC.DATA.CMD.REQUEST_SENSE command unless XTC.STATUS.REQ is set again, so
                   * we turn it back on if there are unprocessed data bytes.
                   */
                  if (this.regDataIndex < this.regDataTotal) {
                      this.regStatus |= HDC.XTC.STATUS.REQ;
                  }
                  return b;
              };
              
              /**
               * outXTCReset(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x321)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outXTCReset = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "RESET");
                  /*
                   * Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
                   */
                  this.regReset = bOut;
                  if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
                  this.initController();
              };
              
              /**
               * inXTCConfig(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x322)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inXTCConfig = function(port, addrFrom)
              {
                  this.printMessageIO(port, null, addrFrom, "CONFIG", this.regConfig);
                  return this.regConfig;
              };
              
              /**
               * outXTCPulse(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x322)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outXTCPulse = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PULSE");
                  /*
                   * Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
                   */
                  this.regPulse = bOut;
                  /*
                   * The HDC BIOS "COMMAND" function (@C800:0562) waits for these ALL status bits after writing to both regPulse
                   * and regPattern, so we must oblige it.
                   *
                   * TODO: Figure out exactly when either XTC.STATUS.BUS or XTC.STATUS.BUSY are supposed to be cleared.
                   * The HDC BIOS doesn't care much about them, except for the one location mentioned above. However, MS-DOS 4.0
                   * (aka the unreleased "multitasking" version of MS-DOS) cares, so I'm going to start by clearing them at the
                   * same point I clear XTC.STATUS.IOMODE.
                   */
                  this.regStatus = HDC.XTC.STATUS.REQ | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY;
              };
              
              /**
               * outXTCPattern(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x323)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outXTCPattern = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "PATTERN");
                  this.regPattern = bOut;
              };
              
              /**
               * outXTCNoise(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x327, 0x32B or 0x32F)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outXTCNoise = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "NOISE");
              };
              
              /**
               * inATCData(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F0)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCData = function(port, addrFrom)
              {
                  var bIn = -1;
              
                  if (this.drive) {
                      /*
                       * We use the synchronous form of readData() at this point because we have no choice; an I/O instruction
                       * has just occurred and cannot be delayed.  The good news is that doATCommand() should have already primed
                       * the pump; all we can do is assert that the pump has something in it.  If bIn is inexplicably negative,
                       * well, then the caller will get 0xff.
                       */
                      var hdc = this;
                      bIn = this.readData(this.drive, function(b, fAsync, obj, off) {
                          hdc.assert(!fAsync);
                          if (BACKTRACK) {
                              if (!off && obj.file && hdc.messageEnabled(Messages.DISK)) {
                                  hdc.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] via port " + str.toHexWord(port), true);
                              }
                              /*
                               * TODO: We could define a cached BTO that's reset prior to a new ATC command, and then pass that
                               * to addBackTrackObject() here instead of null; but for now, we're going to rely on that function's
                               * simplistic MRU logic.  If that fails, the worst that will (or should) happen is we'll burn through
                               * more BackTrack wrapper objects than necessary, and risk running out.
                               */
                              var bto = hdc.bus.addBackTrackObject(obj, null, off);
                              hdc.cpu.backTrack.btiIO = hdc.bus.getBackTrackIndex(bto, off);
                          }
                      });
                      this.assert(bIn >= 0);
              
                      if (this.drive.ibSector == 1) {
                          /*
                           * printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
                           * of each sector.
                           */
                          if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
                              this.printMessageIO(port, null, addrFrom, "DATA[" + this.drive.ibSector + "]", bIn);
                          }
                      }
                      else if (this.drive.ibSector == this.drive.cbSector) {
                          /*
                           * Now that we've supplied a full sector of data, see if the caller's expecting additional sectors;
                           * if so, prime the pump again.  The caller should not poll us again until another interrupt's been delivered.
                           */
                          if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
                              var sDump = this.drive.disk.dumpSector(this.drive.sector);
                              if (sDump) this.dbg.message(sDump);
                          }
              
                          this.drive.nBytes -= this.drive.cbSector;
                          this.regSecCnt = (this.regSecCnt - 1) & 0xff;
                          /*
                           * TODO: If the WITH_ECC bit is set in the READ_DATA command, then we need to support "stuffing" 4
                           * additional bytes into the inATCData() stream.  And we must first set DATA_REQ in the STATUS register.
                           */
                          if (this.drive.nBytes >= this.drive.cbSector) {
                              hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
                              this.readData(this.drive, function(b, fAsync) {
                                  if (b >= 0) {
                                      hdc.setATCIRR();
                                      hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                                  } else {
                                      /*
                                       * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                                       * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                                       */
                                       hdc.regStatus = HDC.ATC.STATUS.ERROR;
                                       hdc.regError = HDC.ATC.ERROR.NO_CHS;
                                      if (DEBUG) hdc.printMessage("HDC.inATCData(): read failed");
                                  }
                              }, false);
                          } else {
                              this.assert(!this.drive.nBytes);
                              this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                          }
                      }
                  }
                  return bIn;
              };
              
              /**
               * outATCData(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F0)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCData = function(port, bOut, addrFrom)
              {
                  if (this.drive) {
                      if (this.drive.nBytes >= this.drive.cbSector) {
                          if (this.writeData(this.drive, bOut) < 0) {
                              /*
                               * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                               * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                               */
                              this.regStatus = HDC.ATC.STATUS.ERROR;
                              this.regError = HDC.ATC.ERROR.NO_CHS;
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write failed");
                              }
                          }
                          else if (this.drive.ibSector == 1) {
                              /*
                               * printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
                               * of each sector.
                               */
                              if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
                                  this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.drive.ibSector + "]");
                              }
                          }
                          else if (this.drive.ibSector == this.drive.cbSector) {
              
                              if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
                                  var sDump = this.drive.disk.dumpSector(this.drive.sector);
                                  if (sDump) this.dbg.message(sDump);
                              }
              
                              this.drive.nBytes -= this.drive.cbSector;
                              this.regSecCnt = (this.regSecCnt - 1) & 0xff;
                              this.setATCIRR(true);
                              this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                              if (this.drive.nBytes >= this.drive.cbSector) {
                                  this.regStatus |= HDC.ATC.STATUS.DATA_REQ;
                              } else {
                                  this.assert(!this.drive.nBytes);
                              }
                          }
                      } else {
                          /*
                           * TODO: What to do about unexpected writes? The number of bytes has exceeded what the command specified.
                           */
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write exceeds count (" + this.drive.nBytes + ")");
                          }
                      }
                  } else {
                      /*
                       * TODO: What to do about unexpected writes? No command was specified.
                       */
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write without command");
                      }
                  }
              };
              
              /**
               * inATCError(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F1)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCError = function(port, addrFrom)
              {
                  var bIn = this.regError;
                  this.printMessageIO(port, null, addrFrom, "ERROR", bIn);
                  return bIn;
              };
              
              /**
               * outATCWPreC(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F1)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCWPreC = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "WPREC");
                  this.regWPreC = bOut;
              };
              
              /**
               * inATCSecCnt(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F2)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCSecCnt = function(port, addrFrom)
              {
                  var bIn = this.regSecCnt;
                  this.printMessageIO(port, null, addrFrom, "SECCNT", bIn);
                  return bIn;
              };
              
              /**
               * outATCSecCnt(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F2)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCSecCnt = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "SECCNT");
                  this.regSecCnt = bOut;
              };
              
              /**
               * inATCSecNum(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F3)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCSecNum = function(port, addrFrom)
              {
                  var bIn = this.regSecNum;
                  this.printMessageIO(port, null, addrFrom, "SECNUM", bIn);
                  return bIn;
              };
              
              /**
               * outATCSecNum(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F3)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCSecNum = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "SECNUM");
                  this.regSecNum = bOut;
              };
              
              /**
               * inATCCylLo(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F4)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCCylLo = function(port, addrFrom)
              {
                  var bIn = this.regCylLo;
                  this.printMessageIO(port, null, addrFrom, "CYLLO", bIn);
                  return bIn;
              };
              
              /**
               * outATCCylLo(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F4)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCCylLo = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "CYLLO");
                  this.regCylLo = bOut;
              };
              
              /**
               * inATCCylHi(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F5)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCCylHi = function(port, addrFrom)
              {
                  var bIn = this.regCylHi;
                  this.printMessageIO(port, null, addrFrom, "CYLHI", bIn);
                  return bIn;
              };
              
              /**
               * outATCCylHi(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F5)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCCylHi = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "CYLHI");
                  this.regCylHi = bOut;
              };
              
              /**
               * inATCDrvHd(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F6)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCDrvHd = function(port, addrFrom)
              {
                  var bIn = this.regDrvHd;
                  this.printMessageIO(port, null, addrFrom, "DRVHD", bIn);
                  return bIn;
              };
              
              /**
               * outATCDrvHd(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F6)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCDrvHd = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "DRVHD");
                  this.regDrvHd = bOut;
                  /*
                   * The MODEL_5170_REV3 BIOS (see "POST2_CHK_HF2" @F000:14FC) probes for a 2nd hard drive when the number
                   * of configured hard drives is something other than 2, using INT 0x13/AH=0x10.  This in turn calls the
                   * BIOS "TST_RDY" function, which selects the drive in this register (see DRIVE_MASK), and then immediately
                   * expects regStatus to reflect success or failure.
                   *
                   * We were always returning success, because no ATC command was actually issued, and so the user would
                   * always get a spurious CMOS configuration error: "System Options Not Set-(Run SETUP)".
                   *
                   * So now we update regStatus here.  I'm not sure which status bits are normally set to indicate failure,
                   * but it should be sufficient to set or clear the READY bit according to whether the drive exists or not.
                   *
                   * TODO: Dig into the ATC documentation some more, and determine what other situations, if any, regStatus
                   * needs to be updated.
                   */
                  var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
                  if (this.aDrives[iDrive]) {
                      this.regStatus |= HDC.ATC.STATUS.READY;
                  } else {
                      this.regStatus &= ~HDC.ATC.STATUS.READY;
                  }
              };
              
              /**
               * inATCStatus(port, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F7)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              HDC.prototype.inATCStatus = function(port, addrFrom)
              {
                  var bIn = this.regStatus;
                  this.printMessageIO(port, null, addrFrom, "STATUS", bIn);
                  /*
                   * Despite what IBM's documentation for the "Personal Computer AT Fixed Disk and Diskette Drive Adapter"
                   * (August 31, 1984) says (ie, "A read of the status register clears interrupt request 14"), we cannot
                   * unilaterally clear the IRQ on any read of STATUS.  For starters, that would completely break the PC AT
                   * ROM BIOS; here's what it does for multi-sector reads:
                   *
                   *      (1) read sector (REP INSW)
                   *      (2) check STATUS
                   *      (3) check sector count, exit if done
                   *      (4) wait for interrupt
                   *      (5) repeat
                   *
                   * Since we set the IRR immediately after (1), we cannot immediately clear the IRR at (2), otherwise the
                   * interrupt at (4) never happens.  So, maybe there are SOME situations where IRR should be cleared on
                   * a read, but I don't know what they are.
                   *
                   *      if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
                   */
                  return bIn;
              };
              
              /**
               * outATCCommand(port, bOut, addrFrom)
               *
               * @this {HDC}
               * @param {number} port (0x1F7)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCCommand = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "COMMAND");
                  this.regCommand = bOut;
                  if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
                  this.doATC();
              };
              
              /**
               * outATCFDR(port, bOut, addrFrom)
               *
               * This is referred to in IBM's docs as the "Fixed Disk Register" (write-only)
               *
               * @this {HDC}
               * @param {number} port (0x3F6)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              HDC.prototype.outATCFDR = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "FDR");
                  /*
                   * I'm not really sure if I should set HDC.ATC.DIAG.NO_ERROR in regError after *every* write where
                   * HDC.ATC.FDR.RESET is clear, or only after it has transitioned from set to clear; since the BIOS only
                   * requires the latter, I'm going to be conservative and restrict regError updates to the latter.
                   */
                  if ((this.regFDR & HDC.ATC.FDR.RESET) && !(bOut & HDC.ATC.FDR.RESET)) this.regError = HDC.ATC.DIAG.NO_ERROR;
                  this.regFDR = bOut;
              };
              
              /**
               * doATC()
               *
               * Handles ATC (AT Controller) commands
               *
               * @this {HDC}
               */
              HDC.prototype.doATC = function()
              {
                  var hdc = this;
                  var fInterrupt = false;
                  var bCmd = this.regCommand;
                  var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
                  var nHead = this.regDrvHd & HDC.ATC.DRVHD.HEAD_MASK;
                  var nCylinder = this.regCylLo | ((this.regCylHi & HDC.ATC.CYLHI.MASK) << 8);
                  var nSector = this.regSecNum;
                  var nSectors = this.regSecCnt || 256;
              
                  this.drive = null;
                  this.regError = HDC.ATC.ERROR.NONE;
                  this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
              
                  var drive = this.aDrives[iDrive];
                  if (!drive) {
                      bCmd = -1;
                  } else {
                      /*
                       * Update the Drive object with the new positional information associated with this command.
                       */
                      drive.wCylinder = nCylinder;
                      drive.bHead = nHead;
                      drive.bSector = nSector;
                      drive.nBytes = nSectors * drive.cbSector;
                      bCmd = (bCmd >= HDC.ATC.COMMAND.DIAGNOSE? bCmd : (bCmd & HDC.ATC.COMMAND.MASK));
                      /*
                       * Since the ATC doesn't use DMA, we must now set some additional Drive state for the benefit of any
                       * follow-up I/O instructions.  For example, any subsequent inATCData() and outATCData() calls need to
                       * know which drive to talk to ("this.drive"), to issue their own readData() and writeData() calls.
                       *
                       * The XTC didn't need this, because it used doDMARead(), doDMAWrite(), doDMAFormat() helper functions,
                       * which reset the current drive's "sector" and "errorCode" properties themselves and then used DMA
                       * functions that delivered drive data with direct calls to readData() and writeData().
                       */
                      drive.sector = null;
                      drive.ibSector = 0;
                      drive.errorCode = 0;
                      this.drive = drive;
                  }
              
                  if (DEBUG && this.messageEnabled(Messages.HDC)) {
                      this.printMessage("HDC.doATC(" + str.toHexByte(bCmd) + "): " + HDC.aATCCommands[bCmd], true);
                  }
              
                  switch (bCmd & HDC.ATC.COMMAND.MASK) {
              
                  case HDC.ATC.COMMAND.READ_DATA:
                      if (DEBUG && this.messageEnabled(Messages.HDC)) {
                          this.printMessage("HDC.doRead(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
                      }
                      /*
                       * We're using a call to readData() that disables auto-increment, so that once we've got the first
                       * byte of the next sector, we can signal an interrupt without also consuming the first byte, allowing
                       * inATCData() to begin with that byte.
                       *
                       * As with the WRITE_DATA command, I'm not sure which of BUSY and DATA_REQ (or both) should be set here,
                       * so I'm setting both of them for now.  I clear them as soon as I have data.
                       */
                      hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
              
                      this.readData(drive, function(b, fAsync) {
                          if (b >= 0 && hdc.chipset) {
                              hdc.setATCIRR();
                              hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                          } else {
                              /*
                               * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                               * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                               */
                              hdc.regStatus = HDC.ATC.STATUS.ERROR;
                              hdc.regError = HDC.ATC.ERROR.NO_CHS;
                          }
                      }, false);
                      break;
              
                  case HDC.ATC.COMMAND.WRITE_DATA:
                      if (DEBUG && this.messageEnabled(Messages.HDC)) {
                          this.printMessage("HDC.doWrite(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
                      }
                      this.regStatus = HDC.ATC.STATUS.DATA_REQ;
                      break;
              
                  case HDC.ATC.COMMAND.RESTORE:
                      /*
                       * Physically, this retracts the heads to cylinder 0, but logically, there isn't anything to do.
                       */
                      fInterrupt = true;
                      break;
              
                  case HDC.ATC.COMMAND.READ_VERF:
                      /*
                       * Since the READ VERIFY command returns no data, once again, logically, there isn't much we HAVE to
                       * to do, but... TODO: Verify that all the disk parameters are valid, and return an error if they're not.
                       */
                      fInterrupt = true;
                      break;
              
                  case HDC.ATC.COMMAND.DIAGNOSE:
                      this.regError = HDC.ATC.DIAG.NO_ERROR;
                      fInterrupt = true;
                      break;
              
                  case HDC.ATC.COMMAND.SETPARMS:
                      /*
                       * The documentation implies that the only parameters this command really affects are the number
                       * of heads (from regDrvHd) and sectors/track (from regSecCnt) -- this despite the fact that the BIOS
                       * programs all the other registers.  For a type 2 drive, that includes:
                       *
                       *      WPREC:   0x4B
                       *      SECCNT:  0x11 (for 17 sectors per track)
                       *      CYL:    0x100 (256 -- huh?)
                       *      SECNUM:  0x0C (12 -- huh?)
                       *      DRVHD:   0xA3 (max head of 0x03, for 4 total heads)
                       *
                       * The importance of SECCNT (nSectors) and DRVHD (nHeads) is controlling how multi-sector operations
                       * advance to the next sector; see advanceSector().
                       */
                      this.assert(drive.nHeads == nHead + 1);
                      this.assert(drive.nSectors == nSectors);
                      drive.nHeads = nHead + 1;
                      drive.nSectors = nSectors;
                      fInterrupt = true;
                      break;
              
                  default:
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("HDC.doATC(" + str.toHexByte(this.regCommand) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
                          if (bCmd >= 0) this.dbg.stopCPU();
                      }
                      break;
                  }
              
                  if (fInterrupt) this.setATCIRR();
              };
              
              /**
               * setATCIRR(fWrite)
               *
               * Raise the ATC's IRQ, provided ATC interrupts are enabled.
               *
               * @this {HDC}
               * @param {boolean} [fWrite] is true on completion of a write to the sector buffer
               */
              HDC.prototype.setATCIRR = function(fWrite)
              {
                  if (this.chipset) {
                      if (!(this.regFDR & HDC.ATC.FDR.INT_DISABLE)) {
                          /*
                           * TODO: Determine what the "correct" instruction delay should be here.  When the OS/2 1.0 Install Disk
                           * begins copying files to the hard disk, at one point it performs the following 125-sector write (use the
                           * Debugger's "m hdc on" and "m pic on" commands to enable HDC and PIC messages, along with "m data on"
                           * if you also want to see the actual sector data being written):
                           *
                           *      HDC.doATC(0x30): Write
                           *      HDC.doWrite(0,2:0:5,125)
                           *
                           * As the write progresses, you'll notice that the HDC interrupt after each sector occurs at decreasingly
                           * lower points in the stack, until we eventually start overwriting non-stack data:
                           *
                           *      getIRRVector(): IRQ 14 interrupting @0090:52A6 stack=0050:1906
                           *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18D6
                           *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18A6
                           *      ...
                           *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:1156
                           *
                           * At roughly this point, very bad things start happening.  I decided to try an arbitrarily large delay
                           * on the setIRR() call here (120), and the problem vanished, so it seems likely that the OS/2 disk driver
                           * has a low tolerance for fast controller interrupts during multi-sector operations.
                           */
                          this.chipset.setIRR(ChipSet.IRQ.ATC, 120);
                          if (DEBUG) this.printMessage("HDC.setATCIRR(): enabled", Messages.PIC | Messages.HDC);
                      } else {
                          if (DEBUG) this.printMessage("HDC.setATCIRR(): disabled", Messages.PIC | Messages.HDC);
                      }
                  }
              };
              
              /**
               * doXTC()
               *
               * Handles XTC (XT Controller) commands
               *
               * @this {HDC}
               */
              HDC.prototype.doXTC = function()
              {
                  var hdc = this;
                  this.regDataIndex = 0;
              
                  var bCmd = this.popCmd();
                  var bCmdOrig = bCmd;
                  var b1 = this.popCmd();
                  var bDrive = b1 & 0x20;
                  var iDrive = (bDrive >> 5);
              
                  var bHead = b1 & 0x1f;
                  var b2 = this.popCmd();
                  var b3 = this.popCmd();
                  var wCylinder = ((b2 << 2) & 0x300) | b3;
                  var bSector = b2 & 0x3f;
                  var bCount = this.popCmd();             // block count or interleave count, depending on the command
                  var bControl = this.popCmd();
                  var bParm, bDataStatus;
              
                  var drive = this.aDrives[iDrive];
                  if (drive) {
                      drive.wCylinder = wCylinder;
                      drive.bHead = bHead;
                      drive.bSector = bSector;
                      drive.nBytes = bCount * drive.cbSector;
                  }
              
                  /*
                   * I tried to save normal command processing from having to deal with invalid drives,
                   * but the HDC BIOS initializes both drive 0 AND drive 1 on a HDC.XTC.DATA.CMD.INIT_DRIVE command,
                   * and apparently that particular command has no problem with non-existent drives.
                   *
                   * So I've separated the commands into two groups: drive-ambivalent commands should be
                   * processed in the first group, and all the rest should be processed in the second group.
                   */
                  switch (bCmd) {
              
                  case HDC.XTC.DATA.CMD.REQUEST_SENSE:        // 0x03
                      this.beginResult(drive? drive.errorCode : HDC.XTC.DATA.ERR.NOT_READY);
                      this.pushResult(b1);
                      this.pushResult(b2);
                      this.pushResult(b3);
                      /*
                       * Although not terribly clear from IBM's "Fixed Disk Adapter" documentation, a data "status byte"
                       * also follows the 4 "sense bytes".  Interestingly, The HDC BIOS checks that data status byte for
                       * XTC.DATA.STATUS.ERROR, but I have to wonder if it would have ever been set for this command....
                       *
                       * The whole point of the HDC.XTC.DATA.CMD.REQUEST_SENSE command is to obtain details about a
                       * previous error, so if HDC.XTC.DATA.CMD.REQUEST_SENSE itself reports an error, what would that mean?
                       */
                      this.pushResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                      bCmd = -1;                              // mark the command as complete
                      break;
              
                  case HDC.XTC.DATA.CMD.INIT_DRIVE:           // 0x0C
                      /*
                       * Pop off all the extra "Initialize Drive Characteristics" bytes and store them, for the benefit of
                       * other functions, like verifyDrive().
                       */
                      var i = 0;
                      while ((bParm = this.popCmd()) >= 0) {
                          if (drive && i < drive.abDriveParms.length) {
                              drive.abDriveParms[i++] = bParm;
                          }
                      }
                      if (drive) this.verifyDrive(drive);
                      bDataStatus = HDC.XTC.DATA.STATUS.OK;
                      if (!drive && this.iDriveAllowFail == iDrive) {
                          this.iDriveAllowFail = -1;
                          if (DEBUG) this.printMessage("HDC.doXTC(): fake failure triggered");
                          bDataStatus = HDC.XTC.DATA.STATUS.ERROR;
                      }
                      this.beginResult(bDataStatus | bDrive);
                      bCmd = -1;                              // mark the command as complete
                      break;
              
                  case HDC.XTC.DATA.CMD.RAM_DIAGNOSTIC:       // 0xE0
                  case HDC.XTC.DATA.CMD.CTL_DIAGNOSTIC:       // 0xE4
                      this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                      bCmd = -1;                              // mark the command as complete
                      break;
              
                  default:
                      break;
                  }
              
                  if (bCmd >= 0) {
                      if (drive === undefined) {
                          bCmd = -1;
                      } else {
                          /*
                           * In preparation for this command, zero out the drive's errorCode and senseCode.
                           * Commands that require a disk address should update senseCode with HDC.XTC.DATA.SENSE_ADDR_VALID.
                           * And of course, any command that encounters an error should set the appropriate error code.
                           */
                          drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                          drive.senseCode = 0;
                      }
                      switch (bCmd) {
                      case HDC.XTC.DATA.CMD.TEST_READY:       // 0x00
                          this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                          break;
              
                      case HDC.XTC.DATA.CMD.RECALIBRATE:      // 0x01
                          drive.bControl = bControl;
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("HDC.doXTC(): drive " + iDrive + " control byte: " + str.toHexByte(bControl));
                          }
                          this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                          break;
              
                      case HDC.XTC.DATA.CMD.READ_VERF:        // 0x05
                          /*
                           * This is a non-DMA operation, so we simply pretend everything is OK for now.  TODO: Revisit.
                           */
                          this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                          break;
              
                      case HDC.XTC.DATA.CMD.READ_DATA:        // 0x08
                          this.doDMARead(drive, function(bStatus) {
                              hdc.beginResult(bStatus | bDrive);
                          });
                          break;
              
                      case HDC.XTC.DATA.CMD.WRITE_DATA:       // 0x0A
                          /*
                           * QUESTION: The IBM TechRef (p.1-188) implies that bCount is used as part of HDC.XTC.DATA.CMD.WRITE_DATA command,
                           * but it is omitted from the HDC.XTC.DATA.CMD.READ_DATA command.  Is that correct?  Note that, as far as the length
                           * of the transfer is concerned, we rely exclusively on the DMA controller being programmed with the appropriate byte count.
                           */
                          this.doDMAWrite(drive, function(bStatus) {
                              hdc.beginResult(bStatus | bDrive);
                          });
                          break;
              
                      case HDC.XTC.DATA.CMD.WRITE_BUFFER:     // 0x0F
                          this.doDMAWriteBuffer(drive, function(bStatus) {
                              hdc.beginResult(bStatus | bDrive);
                          });
                          break;
              
                      default:
                          this.beginResult(HDC.XTC.DATA.STATUS.ERROR | bDrive);
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("HDC.doXTC(" + str.toHexByte(bCmdOrig) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
                              if (bCmd >= 0) this.dbg.stopCPU();
                          }
                          break;
                      }
                  }
              };
              
              /**
               * popCmd()
               *
               * @this {HDC}
               * @return {number}
               */
              HDC.prototype.popCmd = function()
              {
                  var bCmd = -1;
                  var bCmdIndex = this.regDataIndex;
                  if (bCmdIndex < this.regDataTotal) {
                      bCmd = this.regDataArray[this.regDataIndex++];
                      if (DEBUG && this.messageEnabled((bCmdIndex > 0? Messages.PORT : 0) | Messages.HDC)) {
                          this.printMessage("HDC.CMD[" + bCmdIndex + "]: " + str.toHexByte(bCmd) + (!bCmdIndex && HDC.aXTCCommands[bCmd]? (" (" + HDC.aXTCCommands[bCmd] + ")") : ""), true);
                      }
                  }
                  return bCmd;
              };
              
              /**
               * beginResult(bResult)
               *
               * @this {HDC}
               * @param {number} [bResult]
               */
              HDC.prototype.beginResult = function(bResult)
              {
                  this.regDataIndex = this.regDataTotal = 0;
              
                  if (bResult !== undefined) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("HDC.beginResult(" + str.toHexByte(bResult) + ")");
                      }
                      this.pushResult(bResult);
                  }
                  /*
                   * After the Execution phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
                   * an interrupt is supposed to occur, signaling the beginning of the Result Phase.  Once the data "status byte"
                   * has been read from XTC.DATA, the interrupt is cleared (see inXTCData).
                   */
                  if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.XTC);
                  this.regStatus |= HDC.XTC.STATUS.INTERRUPT;
              };
              
              /**
               * pushResult(bResult)
               *
               * @this {HDC}
               * @param {number} bResult
               */
              HDC.prototype.pushResult = function(bResult)
              {
                  if (DEBUG && this.messageEnabled((this.regDataTotal > 0? Messages.PORT : 0) | Messages.HDC)) {
                      this.printMessage("HDC.RES[" + this.regDataTotal + "]: " + str.toHexByte(bResult), true);
                  }
                  this.regDataArray[this.regDataTotal++] = bResult;
              };
              
              /**
               * dmaRead(drive, b, done)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b
               * @param {function(number,boolean)} done
               */
              HDC.prototype.dmaRead = function(drive, b, done)
              {
                  if (b === undefined || b < 0) {
                      this.readData(drive, done);
                      return;
                  }
                  /*
                   * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
                  done(-1, false);
              };
              
              /**
               * dmaWrite(drive, b)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b
               * @return {number}
               */
              HDC.prototype.dmaWrite = function(drive, b)
              {
                  if (b !== undefined && b >= 0)
                      return this.writeData(drive, b);
                  /*
                   * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
                  return -1;
              };
              
              /**
               * dmaWriteBuffer(drive, b)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b
               * @return {number}
               */
              HDC.prototype.dmaWriteBuffer = function(drive, b)
              {
                  if (b !== undefined && b >= 0)
                      return this.writeBuffer(drive, b);
                  /*
                   * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaWriteBuffer(): invalid DMA acknowledgement");
                  return -1;
              };
              
              /**
               * dmaWriteFormat(drive, b)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b
               * @returns {number}
               */
              HDC.prototype.dmaWriteFormat = function(drive, b)
              {
                  if (b !== undefined && b >= 0)
                      return this.writeFormat(drive, b);
                  /*
                   * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                   */
                  if (DEBUG) this.printMessage("dmaWriteFormat(): invalid DMA acknowledgement");
                  return -1;
              };
              
              /**
               * doDMARead(drive, done)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
               */
              HDC.prototype.doDMARead = function(drive, done)
              {
                  drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("HDC.doDMARead(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
                  }
              
                  if (drive.disk) {
                      drive.sector = null;
                      if (this.chipset) {
                          /*
                           * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                           * otherwise dmaRead()/readData() will bail on us.  The original approach used to work because requestDMA()
                           * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                           * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                           */
                          drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                          this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaRead', drive);
                          this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                              if (!fComplete) {
                                  /*
                                   * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                   * (ie, revert to the default failure code that we originally set above).
                                   */
                                  if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                      drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                  }
                              }
                              done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                          });
                          return;
                      }
                  }
                  done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
              };
              
              /**
               * doDMAWrite(drive, done)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
               */
              HDC.prototype.doDMAWrite = function(drive, done)
              {
                  drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
              
                  if (DEBUG && this.messageEnabled()) {
                      this.printMessage("HDC.doDMAWrite(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
                  }
              
                  if (drive.disk) {
                      drive.sector = null;
                      if (this.chipset) {
                          /*
                           * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                           * otherwise dmaWrite()/writeData() will bail on us.  The original approach would work because requestDMA()
                           * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                           * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                           */
                          drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                          this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWrite', drive);
                          this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                              if (!fComplete) {
                                  /*
                                   * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                   * (ie, revert to the default failure code that we originally set above).
                                   */
                                  if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                      drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                  }
                                  /*
                                   * Mask any error that's the result of an attempt to write beyond the end of the track (which is
                                   * something the MS-DOS 4.0M's FORMAT utility seems to like to do).
                                   */
                                  if (drive.errorCode == HDC.XTC.DATA.ERR.NO_SECTOR) {
                                      drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                                  }
                              }
                              done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                          });
                          return;
                      }
                  }
                  done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
              };
              
              /**
               * doDMAWriteBuffer(drive, done)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
               */
              HDC.prototype.doDMAWriteBuffer = function(drive, done)
              {
                  drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
              
                  if (DEBUG) this.printMessage("HDC.doDMAWriteBuffer()");
              
                  if (!drive.abSector || drive.abSector.length != drive.nBytes) {
                      drive.abSector = new Array(drive.nBytes);
                  }
                  drive.ibSector = 0;
                  if (this.chipset) {
                      /*
                       * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                       * otherwise dmaWriteBuffer() will bail on us.  The original approach would work because requestDMA()
                       * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                       * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                       */
                      drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                      this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteBuffer', drive);
                      this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                          if (!fComplete) {
                              /*
                               * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                               * (ie, revert to the default failure code that we originally set above).
                               */
                              if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                  drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                              }
                          }
                          done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                      });
                      return;
                  }
                  done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
              };
              
              /**
               * doDMAFormat(drive, done)
               *
               * The drive variable is initialized by doXTC() to the following extent:
               *
               *      drive.bHead (ignored)
               *      drive.nBytes (bytes/sector)
               *      drive.bSectorEnd (sectors/track)
               *      drive.bFiller (fill byte)
               *
               * and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
               *
               * NOTE: This function is not currently used.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
               *
              HDC.prototype.doDMAFormat = function(drive, done)
              {
                  drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
              
                  if (drive.disk) {
                      drive.sector = null;
                      if (this.chipset) {
                          drive.cbFormat = 0;
                          drive.abFormat = new Array(4);
                          drive.bFormatting = true;
                          drive.cSectorsFormatted = 0;
                          //
                          // We need to reverse the original logic, and default to success unless/until an actual error occurs;
                          // otherwise dmaWriteFormat() will bail on us.  The original approach would work because requestDMA()
                          // would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                          // now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                          //
                          drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                          this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteFormat', drive);
                          this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                              if (!fComplete) {
                                  //
                                  // If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                  // (ie, revert to the default failure code that we originally set above).
                                  //
                                  if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                      drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                  }
                              }
                              drive.bFormatting = false;
                              done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                          });
                          return;
                      }
                  }
                  done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
              };
               */
              
              /**
               * readData(drive, done)
               *
               * The following drive variable properties must have been setup prior to our first call:
               *
               *      drive.wCylinder
               *      drive.bHead
               *      drive.bSector
               *      drive.sector (initialized to null)
               *
               * On the first readData() request, since drive.sector will be null, we ask the Disk object to look
               * up the first sector of the request.  We then ask the Disk for bytes from that sector until the sector
               * is exhausted, and then we look up the next sector and continue the process.
               *
               * NOTE: Since the HDC isn't aware of the extent of the transfer, all readData() can do is return bytes
               * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {function(number,boolean,Object,number)} [done] (number is next available byte from drive, or -1 if no more bytes available)
               * @param {boolean} [fAutoInc] (default is true to auto-increment)
               * @return {number} the requested byte, or -1 if unavailable
               */
              HDC.prototype.readData = function(drive, done, fAutoInc)
              {
                  var b = -1;
                  var obj = null, off = 0;    // these variables are purely for BACKTRACK purposes
              
                  if (drive.errorCode) {
                      if (done) done(b, false, obj, off);
                      return b;
                  }
              
                  var inc = (fAutoInc !== false? 1 : 0);
              
                  if (drive.sector) {
                      off = drive.ibSector;
                      b = drive.disk.read(drive.sector, drive.ibSector);
                      drive.ibSector += inc;
                      if (b >= 0) {
                          obj = drive.sector;
                          if (done) done(b, false, obj, off);
                          return b;
                      }
                  }
              
                  /*
                   * Locate the next sector, and then try reading again.
                   *
                   * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
                   * hence the bSectorBias below.  I could change how sector numbers are stored in the image,
                   * but it seems preferable to keep the image format consistent and controller-independent.
                   */
                  if (done) {
                      var hdc = this;
                      if (drive.disk) {
                          drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, false, function(sector, fAsync) {
                              if ((drive.sector = sector)) {
                                  obj = sector;
                                  off = drive.ibSector = 0;
                                  /*
                                   * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                                   * This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
                                   */
                                  hdc.advanceSector(drive);
                                  b = drive.disk.read(drive.sector, drive.ibSector);
                                  drive.ibSector += inc;
                              } else {
                                  drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                              }
                              done(b, fAsync, obj, off);
                          });
                          return b;
                      }
                      drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                      done(b, false, obj, off);
                  }
                  return b;
              };
              
              /**
               * writeData(drive, b)
               *
               * The following drive variable properties must have been setup prior to our first call:
               *
               *      drive.wCylinder
               *      drive.bHead
               *      drive.bSector
               *      drive.sector (initialized to null)
               *
               * On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
               * up the first sector of the request.  We then send the Disk bytes for that sector until the sector
               * is full, and then we look up the next sector and continue the process.
               *
               * NOTE: Since the HDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
               * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b containing next byte to write
               * @return {number} (b unchanged; return -1 if command should be terminated)
               */
              HDC.prototype.writeData = function(drive, b)
              {
                  if (drive.errorCode) return -1;
                  do {
                      if (drive.sector) {
                          if (drive.disk.write(drive.sector, drive.ibSector++, b))
                              break;
                      }
                      /*
                       * Locate the next sector, and then try writing again.
                       *
                       * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
                       * hence the bSectorBias below.  I could change how sector numbers are stored in the image,
                       * but it seems preferable to keep the image format consistent and controller-independent.
                       */
                      if (drive.disk) {
                          drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, true, function(sector, fAsync) {
                              drive.sector = sector;
                          });
                      }
                      if (!drive.sector) {
                          drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                          b = -1;
                          break;
                      }
                      drive.ibSector = 0;
                      /*
                       * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                       * This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
                       */
                      this.advanceSector(drive);
                  } while (true);
                  return b;
              };
              
              /**
               * advanceSector(drive)
               *
               * This increments the sector number; when the sector number reaches drive.nSectors on the current track, we
               * increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nHeads, we reset drive.bHead
               * and increment drive.wCylinder.
               *
               * One wrinkle is that the ATC uses 1-based sector numbers (bSectorBias is 0), whereas the XTC uses 0-based sector
               * numbers (bSectorBias is 1).  Thus, the correct "reset" value for bSector is (1 - bSectorBias), and the correct
               * limit for bSector is (nSectors + bSectorStart).
               *
               * @this {HDC}
               * @param {Object} drive
               */
              HDC.prototype.advanceSector = function(drive)
              {
                  this.assert(drive.wCylinder < drive.nCylinders);
                  drive.bSector++;
                  var bSectorStart = (1 - drive.bSectorBias);
                  if (drive.bSector >= drive.nSectors + bSectorStart) {
                      drive.bSector = bSectorStart;
                      drive.bHead++;
                      if (drive.bHead >= drive.nHeads) {
                          drive.bHead = 0;
                          drive.wCylinder++;
                      }
                  }
              };
              
              /**
               * writeBuffer(drive, b)
               *
               * NOTE: Since the HDC isn't aware of the extent of the transfer, all writeBuffer() can do is accept bytes
               * until the buffer is full.
               *
               * TODO: Support for HDC.XTC.DATA.CMD.READ_BUFFER is missing, and support for HDC.XTC.DATA.CMD.WRITE_BUFFER may not be complete;
               * tests required.
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b containing next byte to write
               * @return {number} (b unchanged; return -1 if command should be terminated)
               */
              HDC.prototype.writeBuffer = function(drive, b)
              {
                  if (drive.ibSector < drive.abSector.length) {
                      drive.abSector[drive.ibSector++] = b;
                  } else {
                      /*
                       * TODO: Determine the proper error code to return here.
                       */
                      drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                      b = -1;
                  }
                  return b;
              };
              
              /**
               * writeFormat(drive, b)
               *
               * @this {HDC}
               * @param {Object} drive
               * @param {number} b containing a format command byte
               * @return {number} (b if successful, -1 if command should be terminated)
               */
              HDC.prototype.writeFormat = function(drive, b)
              {
                  if (drive.errorCode) return -1;
                  drive.abFormat[drive.cbFormat++] = b;
                  if (drive.cbFormat == drive.abFormat.length) {
                      drive.wCylinder = drive.abFormat[0];    // C
                      drive.bHead = drive.abFormat[1];        // H
                      drive.bSector = drive.abFormat[2];      // R
                      drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
                      drive.cbFormat = 0;
              
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("HDC.writeFormat(" + drive.wCylinder + ":" + drive.bHead + ":" + drive.bSector + ":" + drive.nBytes + ")");
                      }
              
                      for (var i = 0; i < drive.nBytes; i++) {
                          if (this.writeData(drive, drive.bFiller) < 0) {
                              return -1;
                          }
                      }
                      drive.cSectorsFormatted++;
                  }
                  if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
                  return b;
              };
              
              /**
               * intBIOSDisk(addr)
               *
               * NOTE: This function differentiates HDC requests from FDC requests, based on whether the INT 0x13 drive number
               * in DL is >= 0x80.
               *
               * HACK: The HDC BIOS code for both INT 0x13/AH=0x00 and INT 0x13/AH=0x09 calls "INIT_DRV" @C800:0427, which is
               * hard-coded to issue the HDC.XTC.DATA.CMD.INIT_DRIVE command for BOTH drives 0 and 1 (aka drive numbers 0x80 and
               * 0x81), regardless of the drive number specified in DL; this means that the HDC.XTC.DATA.CMD.INIT_DRIVE command
               * must always succeed for drive 1 if it also succeeds for drive 0 -- even if there is no drive 1.  Bizarre, but OK,
               * whatever.
               *
               * So assuming we a have drive 0, when the power-on diagnostics in "DISK_SETUP" @C800:0003 call INT 0x13/AH=0x09
               * (@C800:00DB) for drive 0, it must succeed.  No problem.  But when "DISK_SETUP" starts probing for additional drives,
               * it first issues INT 0x13/AH=0x00, followed by INT 0x13/AH=0x11, and finally INT 0x13/AH=0x09.  If the first
               * (AH=0x00) or third (AH=0x09) INT 0x13 fails, it quickly moves on (ie, it jumps to "POD_DONE").  But as we just
               * discussed, both those operations call "INIT_DRV", which can't return an error.  This means the only function that
               * can return an error in this context is the recalibrate function (AH=0x11).  That sucks, because the way the HDC
               * BIOS is written, it will loop for anywhere from 1.5 seconds to 25 seconds (depending on whether the controller
               * is part of the "System Unit" or not; see port 0x213), attempting to recalibrate drive 1 until it finally times out.
               *
               * Normally, you'll only experience the 1.5 second delay, but even so, it's a ridiculous waste of time and a lot of
               * useless INT 0x13 calls.  So I monitor INT 0x13/AH=0x00 for DL >= 0x80 and set a special HDC.XTC.DATA.CMD.INIT_DRIVE
               * override flag (iDriveAllowFail) that will allow that command to fail, and in theory, make the the HDC BIOS
               * "DISK_SETUP" code much more efficient.
               *
               * @this {HDC}
               * @param {number} addr
               * @return {boolean} true to proceed with the INT 0x13 software interrupt, false to skip
               */
              HDC.prototype.intBIOSDisk = function(addr)
              {
                  var AH = this.cpu.regEAX >> 8;
                  var DL = this.cpu.regEDX & 0xff;
                  if (!AH && DL > 0x80) this.iDriveAllowFail = DL - 0x80;
                  return true;
              };
              
              /**
               * intBIOSDiskette(addr)
               *
               * When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
               * in the INT 0x40 vector.  This function intercepts calls to that vector to work around a minor nuisance.
               *
               * The HDC BIOS's plan was simple, albeit slightly flawed: assign fixed disks drive numbers >= 0x80,
               * and whenever someone calls INT 0x13 with a drive number < 0x80, invoke the original INT 0x13 diskette
               * code via INT 0x40 and return via RET 2.
               *
               * Unfortunately, not all original INT 0x13 functions required a drive number in DL (eg, the "reset"
               * function, where AH=0).  And the HDC BIOS knew this, which is why, in the case of the "reset" function,
               * the HDC BIOS performs BOTH an INT 0x40 diskette reset AND an HDC reset -- it can't be sure which
               * controller the caller really wants to reset.
               *
               * An unfortunate side-effect of this behavior: when the HDC BIOS is initialized for the first time, it may
               * issue several resets internally, depending on whether there are 0, 1 or 2 hard disks installed, and each
               * of those resets also triggers completely useless diskette resets, each wasting up to two seconds waiting
               * for the FDC to interrupt.  The FDC tries to interrupt, but it can't, because at this early stage of
               * ROM BIOS initialization, IRQ.FDC hasn't been unmasked yet.
               *
               * My work-around: have the HDC component hook INT 0x40, and every time an INT 0x40 is issued with AH=0 and
               * IRQ.FDC masked, bypass the INT 0x40 interrupt.  This is as close as PCjs has come to patching any BIOS code
               * (something I've refused to do), and even here, I'm not doing it out of necessity, just annoyance.
               *
               * @this {HDC}
               * @param {number} addr
               * @return {boolean} true to proceed with the INT 0x40 software interrupt, false to skip
               */
              HDC.prototype.intBIOSDiskette = function(addr)
              {
                  var AH = this.cpu.regEAX >> 8;
                  if ((!AH && this.chipset && this.chipset.checkIMR(ChipSet.IRQ.FDC))) {
                      if (DEBUG) this.printMessage("HDC.intBIOSDiskette(): skipping useless INT 0x40 diskette reset");
                      return false;
                  }
                  return true;
              };
              
              /*
               * Port input notification tables
               */
              HDC.aXTCPortInput = {
                  0x320:  HDC.prototype.inXTCData,
                  0x321:  HDC.prototype.inXTCStatus,
                  0x322:  HDC.prototype.inXTCConfig
              };
              
              HDC.aATCPortInput = {
                  0x1F0:  HDC.prototype.inATCData,
                  0x1F1:  HDC.prototype.inATCError,
                  0x1F2:  HDC.prototype.inATCSecCnt,
                  0x1F3:  HDC.prototype.inATCSecNum,
                  0x1F4:  HDC.prototype.inATCCylLo,
                  0x1F5:  HDC.prototype.inATCCylHi,
                  0x1F6:  HDC.prototype.inATCDrvHd,
                  0x1F7:  HDC.prototype.inATCStatus
              };
              
              /*
               * Port output notification tables
               */
              HDC.aXTCPortOutput = {
                  0x320:  HDC.prototype.outXTCData,
                  0x321:  HDC.prototype.outXTCReset,
                  0x322:  HDC.prototype.outXTCPulse,
                  0x323:  HDC.prototype.outXTCPattern,
                  /*
                   * The PC XT Fixed Disk BIOS includes some additional "housekeeping" that it performs
                   * not only on port 0x323 but also on three additional ports, at increments of 4 (see all
                   * references to "RESET INT/DMA MASK" in the Fixed Disk BIOS).  It's not clear to me if
                   * those ports refer to additional HDC controllers, and I haven't seen other references to
                   * them, but in any case, they represent a lot of "I/O noise" that we simply squelch here.
                   */
                  0x327:  HDC.prototype.outXTCNoise,
                  0x32B:  HDC.prototype.outXTCNoise,
                  0x32F:  HDC.prototype.outXTCNoise
              };
              
              HDC.aATCPortOutput = {
                  0x1F0:  HDC.prototype.outATCData,
                  0x1F1:  HDC.prototype.outATCWPreC,
                  0x1F2:  HDC.prototype.outATCSecCnt,
                  0x1F3:  HDC.prototype.outATCSecNum,
                  0x1F4:  HDC.prototype.outATCCylLo,
                  0x1F5:  HDC.prototype.outATCCylHi,
                  0x1F6:  HDC.prototype.outATCDrvHd,
                  0x1F7:  HDC.prototype.outATCCommand,
                  0x3F6:  HDC.prototype.outATCFDR
              };
              
              /**
               * HDC.init()
               *
               * This function operates on every HTML element of class "hdc", extracting the
               * JSON-encoded parameters for the HDC constructor from the element's "data-value"
               * attribute, invoking the constructor to create a HDC component, and then binding
               * any associated HTML controls to the new component.
               */
              HDC.init = function()
              {
                  var aeHDC = Component.getElementsByClass(window.document, PCJSCLASS, "hdc");
                  for (var iHDC = 0; iHDC < aeHDC.length; iHDC++) {
                      var eHDC = aeHDC[iHDC];
                      var parmsHDC = Component.getComponentParms(eHDC);
                      var hdc = new HDC(parmsHDC);
                      Component.bindComponentControls(hdc, eHDC, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every Hard Drive Controller (HDC) module on the page.
               */
              web.onInit(HDC.init);
              
              if (typeof module !== 'undefined') module.exports = HDC;
              
            • interrupts.js
              /**
               * @fileoverview PCjs-specific BIOS/DOS interrupt definitions.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Dec-11
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * Components that previously used Debugger interrupt definitions by including:
               *
               *     var Debugger = require("./debugger");
               *
               * and using:
               *
               *      Debugger.INT.FOO
               *
               * must now instead include:
               *
               *      var Interrupts = require("./interrupts");
               *
               * and then replace all occurrences of "Debugger.INT.FOO" with "Interrupts.FOO.VECTOR".
               */
              
              var Interrupts = {
                  VIDEO: {
                      VECTOR: 0x10
                  },
                  DISK: {
                      VECTOR: 0x13
                  },
                  CASSETTE: {
                      VECTOR: 0x15
                  },
                  KBD: {
                      VECTOR: 0x16
                  },
                  RTC: {
                      VECTOR: 0x1a
                  },
                  TIMER_TICK: {
                      VECTOR: 0x1c
                  },
                  DOS: {
                      VECTOR: 0x21
                  },
                  MOUSE: {
                      VECTOR: 0x33
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = Interrupts;
              
            • keyboard.js
              /**
               * @fileoverview Implements the PCjs Keyboard component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-20
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var ChipSet     = require("./chipset");
                  var State       = require("./state");
                  var CPU         = require("./cpu");
              }
              
              /**
               * Keyboard(parmsKbd)
               *
               * The Keyboard component can be configured with the following (parmsKbd) properties:
               *
               *      model: model string; should be one of:
               *
               *          us83 (default)
               *          us84 (TODO: awaiting implementation)
               *          us101 (TODO: awaiting implementation)
               *
               * Its main purpose is to receive binding requests for various keyboard events, and to use those events
               * to simulate the PC's keyboard hardware.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsKbd
               */
              function Keyboard(parmsKbd)
              {
                  Component.call(this, "Keyboard", parmsKbd, Keyboard, Messages.KEYBOARD);
              
                  this.nDefaultModel = parmsKbd['model'];
              
                  this.fMobile = web.isMobile();
                  this.fMSIE = web.isUserAgent("MSIE");
                  this.printMessage("mobile keyboard support: " + (this.fMobile? "true" : "false"));
              
                  /*
                   * This is count of the number of "soft keyboard" keys present.  At the moment, its only
                   * purpose is to signal findBinding() whether to waste any time looking for SOFTCODE matches.
                   */
                  this.cSoftCodes = 0;
              
                  /*
                   * Updated by onFocusChange()
                   */
                  this.fHasFocus = true;
              
                  /*
                   * This is true whenever the physical Escape key is disabled (eg, by pointer locking code),
                   * giving us the opportunity to map a different physical key to machine's virtual Escape key.
                   */
                  this.fEscapeDisabled = false;
              
                  /*
                   * This is set whenever we notice a discrepancy between our internal CAPS_LOCK state and its
                   * apparent state; we check whenever aKeysActive has been emptied.
                   */
                  this.fToggleCapsLock = false;
              
                  /*
                   * New unified approach to key event processing: When we process a key on the "down" event,
                   * we check the aKeysActive array: if the key is already active, do nothing; otherwise, insert
                   * it into the table, generate the "make" scan code(s), and set a timeout for "repeat" if it's
                   * a repeatable key (most are).
                   *
                   * Similarly, when a key goes "up", if it's already not active, do nothing; otherwise, generate
                   * the "break" scan code(s), cancel any pending timeout, and remove it from the active key table.
                   *
                   * If a "press" event is received, then if the key is already active, remove it and (re)insert
                   * it at the head of the table, generate the "make" scan code(s), set nRepeat to -1, and set a
                   * timeout for "break".
                   *
                   * This requires an aKeysActive array that keeps track of the status of every active key; only the
                   * first entry in the array is allowed to repeat.  Each entry is a key object with the following
                   * properties:
                   *
                   *      simCode:    our simulated keyCode from onKeyDown, onKeyUp, or onKeyPress
                   *      fDown:      next state to simulate (true for down, false for up)
                   *      nRepeat:    > 0 if timer should generate more "make" scan code(s), -1 for "break" scan code(s)
                   *      timer:      timer for next key operation, if any
                   *
                   * Keys are inserted at the head of aKeysActive, using splice(0, 0, key), but not before zeroing
                   * nRepeat of any repeating key that already occupies the head (index 0), so that at most only one
                   * key (ie, the most recent) will ever be in a repeating state.
                   *
                   * IBM PC keyboard repeat behavior: when pressing CTRL, then C, and then releasing CTRL while still
                   * holding C, the repeated CTRL_C characters turn into 'c' characters.  We emulate that behavior.
                   * However, when pressing C, then CTRL, all repeating stops: not a single CTRL_C is generated, and
                   * even if the CTRL is released before the C, no more more 'c' characters are generated either.
                   * We do NOT fully emulate that behavior -- we DO stop the repeating, but we also generate one CTRL_C.
                   * More investigation is required, because I need to confirm whether the IBM keyboard automatically
                   * "breaks" all non-shift keys before it "makes" the CTRL.
                   */
                  this.aKeysActive = [];
              
                  this.msAutoRepeat   = 500;
                  this.msNextRepeat   = 100;
                  this.msAutoRelease  = 50;
                  this.msInjectDelay  = 300;          // number of milliseconds between injected keystrokes
              
                  /*
                   * HACK: We set fAllDown to false to ignore all down/up events for keys not explicitly marked as ONDOWN;
                   * even though that prevents those keys from being repeated properly (ie, at the simulation's repeat rate
                   * rather than the browser's repeat rate), it's the safest thing to do when dealing with international keyboards,
                   * because our mapping tables are designed for US keyboards, and testing all the permutations of international
                   * keyboards and web browsers is more work than I can take on right now.  TODO: Dig into this some day.
                   */
                  this.fAllDown = false;
              
                  this.setReady();
              }
              
              Component.subclass(Keyboard);
              
              /**
               * Alphanumeric and other common (printable) ASCII codes.
               *
               * TODO: Determine what we can do to get ALL constants like these inlined (enum doesn't seem to
               * get the job done); the problem seems to be limited to property references that use quotes, which
               * is why I've 'unquoted' as many of them as possible.
               *
               * @enum {number}
               */
              Keyboard.ASCII = {
               CTRL_A:  1, CTRL_C:  3, CTRL_Z: 26,
                  ' ': 32,    '!': 33,    '"': 34,    '#': 35,    '$': 36,    '%': 37,    '&': 38,    "'": 39,
                  '(': 40,    ')': 41,    '*': 42,    '+': 43,    ',': 44,    '-': 45,    '.': 46,    '/': 47,
                  '0': 48,    '1': 49,    '2': 50,    '3': 51,    '4': 52,    '5': 53,    '6': 54,    '7': 55,
                  '8': 56,    '9': 57,    ':': 58,    ';': 59,    '<': 60,    '=': 61,    '>': 62,    '?': 63,
                  '@': 64,     A:  65,     B:  66,     C:  67,     D:  68,     E:  69,     F:  70,     G:  71,
                   H:  72,     I:  73,     J:  74,     K:  75,     L:  76,     M:  77,     N:  78,     O:  79,
                   P:  80,     Q:  81,     R:  82,     S:  83,     T:  84,     U:  85,     V:  86,     W:  87,
                   X:  88,     Y:  89,     Z:  90,    '[': 91,    '\\':92,    ']': 93,    '^': 94,    '_': 95,
                  '`': 96,     a:  97,     b:  98,     c:  99,     d: 100,     e: 101,     f: 102,     g: 103,
                   h:  104,    i: 105,     j: 106,     k: 107,     l: 108,     m: 109,     n: 110,     o: 111,
                   p:  112,    q: 113,     r: 114,     s: 115,     t: 116,     u: 117,     v: 118,     w: 119,
                   x:  120,    y: 121,     z: 122,    '{':123,    '|':124,    '}':125,    '~':126
              };
              
              /**
               * Browser keyCodes we must pay particular attention to.  For the most part, these are
               * non-alphanumeric or function keys, some which may require special treatment (eg,
               * preventDefault() if returning false on the initial keyDown event is insufficient).
               *
               * keyCodes for most common ASCII keys can simply use the appropriate ASCII code above.
               *
               * Most of these represent non-ASCII keys (eg, the LEFT arrow key), yet for some reason,
               * browsers defined them using ASCII codes (eg, the LEFT arrow key uses the ASCII code
               * for '%' or 37).  This conflict is discussed further in the definition of CLICKCODE below.
               *
               * @enum {number}
               */
              Keyboard.KEYCODE = {
                  /* 0x08 */ BS:          8,
                  /* 0x09 */ TAB:         9,
                  /* 0x0A */ LF:          10,
                  /* 0x0D */ CR:          13,
                  /* 0x10 */ SHIFT:       16,
                  /* 0x11 */ CTRL:        17,
                  /* 0x12 */ ALT:         18,
                  /* 0x13 */ PAUSE:       19,         // PAUSE/BREAK
                  /* 0x14 */ CAPS_LOCK:   20,
                  /* 0x1B */ ESC:         27,
                  /* 0x21 */ PGUP:        33,
                  /* 0x22 */ PGDN:        34,
                  /* 0x23 */ END:         35,
                  /* 0x24 */ HOME:        36,
                  /* 0x25 */ LEFT:        37,
                  /* 0x26 */ UP:          38,
                  /* 0x27 */ RIGHT:       39,
                  /* 0x27 */ FF_QUOTE:    39,
                  /* 0x28 */ DOWN:        40,
                  /* 0x2C */ FF_COMMA:    44,
                  /* 0x2C */ PRTSC:       44,
                  /* 0x2D */ INS:         45,
                  /* 0x2E */ DEL:         46,
                  /* 0x2E */ FF_PERIOD:   46,
                  /* 0x2F */ FF_SLASH:    47,
                  /* 0x3B */ FF_SEMI:     59,
                  /* 0x3D */ FF_EQUALS:   61,
                  /* 0x5B */ CMD:         91,         // aka WIN
                  /* 0x5B */ FF_LBRACK:   91,
                  /* 0x5C */ FF_BSLASH:   92,
                  /* 0x5D */ RCMD:        93,         // aka MENU
                  /* 0x5D */ FF_RBRACK:   93,
                  /* 0x60 */ NUM_INS:     96,         // 0
                  /* 0x60 */ FF_BQUOTE:   96,
                  /* 0x61 */ NUM_END:     97,         // 1
                  /* 0x62 */ NUM_DOWN:    98,         // 2
                  /* 0x63 */ NUM_PGDN:    99,         // 3
                  /* 0x64 */ NUM_LEFT:    100,        // 4
                  /* 0x65 */ NUM_CENTER:  101,        // 5
                  /* 0x66 */ NUM_RIGHT:   102,        // 6
                  /* 0x67 */ NUM_HOME:    103,        // 7
                  /* 0x68 */ NUM_UP:      104,        // 8
                  /* 0x69 */ NUM_PGUP:    105,        // 9
                  /* 0x6A */ NUM_MUL:     106,
                  /* 0x6B */ NUM_ADD:     107,
                  /* 0x6D */ NUM_SUB:     109,
                  /* 0x6E */ NUM_DEL:     110,        // .
                  /* 0x6F */ NUM_DIV:     111,
                  /* 0x70 */ F1:          112,
                  /* 0x71 */ F2:          113,
                  /* 0x72 */ F3:          114,
                  /* 0x73 */ F4:          115,
                  /* 0x74 */ F5:          116,
                  /* 0x75 */ F6:          117,
                  /* 0x76 */ F7:          118,
                  /* 0x77 */ F8:          119,
                  /* 0x78 */ F9:          120,
                  /* 0x79 */ F10:         121,
                  /* 0x7A */ F11:         122,
                  /* 0x7B */ F12:         123,
                  /* 0x90 */ NUM_LOCK:    144,
                  /* 0x91 */ SCROLL_LOCK: 145,
                  /* 0xAD */ FF_DASH:     173,
                  /* 0xBA */ SEMI:        186,        // Firefox: 59
                  /* 0xBB */ EQUALS:      187,        // Firefox: 61
                  /* 0xBC */ COMMA:       188,        // Firefox: 44
                  /* 0xBD */ DASH:        189,        // Firefox: 173
                  /* 0xBE */ PERIOD:      190,        // Firefox: 46
                  /* 0xBF */ SLASH:       191,        // Firefox: 47
                  /* 0xC0 */ BQUOTE:      192,        // Firefox: 96
                  /* 0xDB */ LBRACK:      219,        // Firefox: 91
                  /* 0xDC */ BSLASH:      220,        // Firefox: 92
                  /* 0xDD */ RBRACK:      221,        // Firefox: 93
                  /* 0xDE */ QUOTE:       222,        // Firefox: 39
                  /* 0xE0 */ FF_CMD:      224,        // Firefox only (used for both CMD and RCMD)
                  //
                  // The following biases use what I'll call Decimal Coded Binary or DCB (the opposite of BCD),
                  // where the thousands digit is used to store the sum of "binary" digits 1 and/or 2 and/or 4.
                  //
                  // Technically, that makes it DCO (Decimal Coded Octal), but then again, BCD should have really
                  // been called HCD (Hexadecimal Coded Decimal), so if "they" can take liberties, so can I.
                  //
                  // ONDOWN is a bias we add to browser keyCodes that we want to handle on "down" rather than on "press".
                  //
                  ONDOWN:                 1000,
                  //
                  // ONRIGHT is a bias we add to browser keyCodes that need to check for a "right" location (default is "left")
                  //
                  ONRIGHT:                2000,
                  //
                  // FAKE is a bias we add to signal these are fake keyCodes corresponding to internal keystroke combinations.
                  // The actual values are for internal use only and merely need to be unique and used consistently.
                  //
                  FAKE:                   4000
              };
              
              /*
               * Maps "stupid" keyCodes to their "non-stupid" counterparts
               */
              Keyboard.STUPID_KEYCODES = {};
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SEMI]    = Keyboard.ASCII[';'];   // 186 -> 59
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.EQUALS]  = Keyboard.ASCII['='];   // 187 -> 61
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.COMMA]   = Keyboard.ASCII[','];   // 188 -> 44
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.DASH]    = Keyboard.ASCII['-'];   // 189 -> 45
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.PERIOD]  = Keyboard.ASCII['.'];   // 190 -> 46
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SLASH]   = Keyboard.ASCII['/'];   // 191 -> 47
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BQUOTE]  = Keyboard.ASCII['`'];   // 192 -> 96
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.LBRACK]  = Keyboard.ASCII['['];   // 219 -> 91
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BSLASH]  = Keyboard.ASCII['\\'];  // 220 -> 92
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.RBRACK]  = Keyboard.ASCII[']'];   // 221 -> 93
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.QUOTE]   = Keyboard.ASCII["'"];   // 222 -> 39
              Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.FF_DASH] = Keyboard.ASCII['-'];
              
              /*
               * Maps unshifted keyCodes to their shifted counterparts; to be used when a shift-key is down.
               * Alphabetic characters are handled in code, since they must also take CAPS_LOCK into consideration.
               */
              Keyboard.SHIFTED_KEYCODES = {};
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['1']]     = Keyboard.ASCII['!'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['2']]     = Keyboard.ASCII['@'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['3']]     = Keyboard.ASCII['#'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['4']]     = Keyboard.ASCII['$'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['5']]     = Keyboard.ASCII['%'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['6']]     = Keyboard.ASCII['^'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['7']]     = Keyboard.ASCII['&'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['8']]     = Keyboard.ASCII['*'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['9']]     = Keyboard.ASCII['('];
              Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['0']]     = Keyboard.ASCII[')'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SEMI]   = Keyboard.ASCII[':'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.EQUALS] = Keyboard.ASCII['+'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.COMMA]  = Keyboard.ASCII['<'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.DASH]   = Keyboard.ASCII['_'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.PERIOD] = Keyboard.ASCII['>'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SLASH]  = Keyboard.ASCII['?'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BQUOTE] = Keyboard.ASCII['~'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.LBRACK] = Keyboard.ASCII['{'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BSLASH] = Keyboard.ASCII['|'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.RBRACK] = Keyboard.ASCII['}'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.QUOTE]  = Keyboard.ASCII['"'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_DASH]   = Keyboard.ASCII['_'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_EQUALS] = Keyboard.ASCII['+'];
              Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_SEMI]   = Keyboard.ASCII[':'];
              
              Keyboard.SIMCODE = {
                  BS:           Keyboard.KEYCODE.BS          + Keyboard.KEYCODE.ONDOWN,
                  TAB:          Keyboard.KEYCODE.TAB         + Keyboard.KEYCODE.ONDOWN,
                  SHIFT:        Keyboard.KEYCODE.SHIFT       + Keyboard.KEYCODE.ONDOWN,
                  RSHIFT:       Keyboard.KEYCODE.SHIFT       + Keyboard.KEYCODE.ONDOWN + Keyboard.KEYCODE.ONRIGHT,
                  CTRL:         Keyboard.KEYCODE.CTRL        + Keyboard.KEYCODE.ONDOWN,
                  ALT:          Keyboard.KEYCODE.ALT         + Keyboard.KEYCODE.ONDOWN,
                  CAPS_LOCK:    Keyboard.KEYCODE.CAPS_LOCK   + Keyboard.KEYCODE.ONDOWN,
                  ESC:          Keyboard.KEYCODE.ESC         + Keyboard.KEYCODE.ONDOWN,
                  F1:           Keyboard.KEYCODE.F1          + Keyboard.KEYCODE.ONDOWN,
                  F2:           Keyboard.KEYCODE.F2          + Keyboard.KEYCODE.ONDOWN,
                  F3:           Keyboard.KEYCODE.F3          + Keyboard.KEYCODE.ONDOWN,
                  F4:           Keyboard.KEYCODE.F4          + Keyboard.KEYCODE.ONDOWN,
                  F5:           Keyboard.KEYCODE.F5          + Keyboard.KEYCODE.ONDOWN,
                  F6:           Keyboard.KEYCODE.F6          + Keyboard.KEYCODE.ONDOWN,
                  F7:           Keyboard.KEYCODE.F7          + Keyboard.KEYCODE.ONDOWN,
                  F8:           Keyboard.KEYCODE.F8          + Keyboard.KEYCODE.ONDOWN,
                  F9:           Keyboard.KEYCODE.F9          + Keyboard.KEYCODE.ONDOWN,
                  F10:          Keyboard.KEYCODE.F10         + Keyboard.KEYCODE.ONDOWN,
                  F11:          Keyboard.KEYCODE.F11         + Keyboard.KEYCODE.ONDOWN,
                  F12:          Keyboard.KEYCODE.F12         + Keyboard.KEYCODE.ONDOWN,
                  NUM_LOCK:     Keyboard.KEYCODE.NUM_LOCK    + Keyboard.KEYCODE.ONDOWN,
                  SCROLL_LOCK:  Keyboard.KEYCODE.SCROLL_LOCK + Keyboard.KEYCODE.ONDOWN,
                  PRTSC:        Keyboard.KEYCODE.PRTSC       + Keyboard.KEYCODE.ONDOWN,
                  HOME:         Keyboard.KEYCODE.HOME        + Keyboard.KEYCODE.ONDOWN,
                  UP:           Keyboard.KEYCODE.UP          + Keyboard.KEYCODE.ONDOWN,
                  PGUP:         Keyboard.KEYCODE.PGUP        + Keyboard.KEYCODE.ONDOWN,
                  NUM_SUB:      Keyboard.KEYCODE.NUM_SUB     + Keyboard.KEYCODE.ONDOWN,
                  LEFT:         Keyboard.KEYCODE.LEFT        + Keyboard.KEYCODE.ONDOWN,
                  NUM_CENTER:   Keyboard.KEYCODE.NUM_CENTER  + Keyboard.KEYCODE.ONDOWN,
                  RIGHT:        Keyboard.KEYCODE.RIGHT       + Keyboard.KEYCODE.ONDOWN,
                  NUM_ADD:      Keyboard.KEYCODE.NUM_ADD     + Keyboard.KEYCODE.ONDOWN,
                  END:          Keyboard.KEYCODE.END         + Keyboard.KEYCODE.ONDOWN,
                  DOWN:         Keyboard.KEYCODE.DOWN        + Keyboard.KEYCODE.ONDOWN,
                  PGDN:         Keyboard.KEYCODE.PGDN        + Keyboard.KEYCODE.ONDOWN,
                  INS:          Keyboard.KEYCODE.INS         + Keyboard.KEYCODE.ONDOWN,
                  DEL:          Keyboard.KEYCODE.DEL         + Keyboard.KEYCODE.ONDOWN,
                  CMD:          Keyboard.KEYCODE.CMD         + Keyboard.KEYCODE.ONDOWN,
                  RCMD:         Keyboard.KEYCODE.RCMD        + Keyboard.KEYCODE.ONDOWN,
                  FF_CMD:       Keyboard.KEYCODE.FF_CMD      + Keyboard.KEYCODE.ONDOWN,
                  CTRL_C:       Keyboard.ASCII.CTRL_C        + Keyboard.KEYCODE.FAKE,
                  CTRL_BREAK:   Keyboard.KEYCODE.BS          + Keyboard.KEYCODE.FAKE,
                  CTRL_ALT_DEL: Keyboard.KEYCODE.DEL         + Keyboard.KEYCODE.FAKE
              };
              
              /*
               * Scan code constants
               */
              Keyboard.SCANCODE = {
                  /* 0x01 */ ESC:         1,
                  /* 0x02 */ ONE:         2,
                  /* 0x03 */ TWO:         3,
                  /* 0x04 */ THREE:       4,
                  /* 0x05 */ FOUR:        5,
                  /* 0x06 */ FIVE:        6,
                  /* 0x07 */ SIX:         7,
                  /* 0x08 */ SEVEN:       8,
                  /* 0x09 */ EIGHT:       9,
                  /* 0x0A */ NINE:        10,
                  /* 0x0B */ ZERO:        11,
                  /* 0x0C */ DASH:        12,
                  /* 0x0D */ EQUALS:      13,
                  /* 0x0E */ BS:          14,
                  /* 0x0F */ TAB:         15,
                  /* 0x10 */ Q:           16,
                  /* 0x11 */ W:           17,
                  /* 0x12 */ E:           18,
                  /* 0x13 */ R:           19,
                  /* 0x14 */ T:           20,
                  /* 0x15 */ Y:           21,
                  /* 0x16 */ U:           22,
                  /* 0x17 */ I:           23,
                  /* 0x18 */ O:           24,
                  /* 0x19 */ P:           25,
                  /* 0x1A */ LBRACK:      26,
                  /* 0x1B */ RBRACK:      27,
                  /* 0x1C */ ENTER:       28,
                  /* 0x1D */ CTRL:        29,
                  /* 0x1E */ A:           30,
                  /* 0x1F */ S:           31,
                  /* 0x20 */ D:           32,
                  /* 0x21 */ F:           33,
                  /* 0x22 */ G:           34,
                  /* 0x23 */ H:           35,
                  /* 0x24 */ J:           36,
                  /* 0x25 */ K:           37,
                  /* 0x26 */ L:           38,
                  /* 0x27 */ SEMI:        39,
                  /* 0x28 */ QUOTE:       40,
                  /* 0x29 */ BQUOTE:      41,
                  /* 0x2A */ SHIFT:       42,
                  /* 0x2B */ BSLASH:      43,
                  /* 0x2C */ Z:           44,
                  /* 0x2D */ X:           45,
                  /* 0x2E */ C:           46,
                  /* 0x2F */ V:           47,
                  /* 0x30 */ B:           48,
                  /* 0x31 */ N:           49,
                  /* 0x32 */ M:           50,
                  /* 0x33 */ COMMA:       51,
                  /* 0x34 */ PERIOD:      52,
                  /* 0x35 */ SLASH:       53,
                  /* 0x36 */ RSHIFT:      54,
                  /* 0x37 */ PRTSC:       55,         // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
                  /* 0x38 */ ALT:         56,
                  /* 0x39 */ SPACE:       57,
                  /* 0x3A */ CAPS_LOCK:   58,
                  /* 0x3B */ F1:          59,
                  /* 0x3C */ F2:          60,
                  /* 0x3D */ F3:          61,
                  /* 0x3E */ F4:          62,
                  /* 0x3F */ F5:          63,
                  /* 0x40 */ F6:          64,
                  /* 0x41 */ F7:          65,
                  /* 0x42 */ F8:          66,
                  /* 0x43 */ F9:          67,
                  /* 0x44 */ F10:         68,
                  /* 0x45 */ NUM_LOCK:    69,
                  /* 0x46 */ SCROLL_LOCK: 70,
                  /* 0x47 */ NUM_HOME:    71,
                  /* 0x48 */ NUM_UP:      72,
                  /* 0x49 */ NUM_PGUP:    73,
                  /* 0x4A */ NUM_SUB:     74,
                  /* 0x4B */ NUM_LEFT:    75,
                  /* 0x4C */ NUM_CENTER:  76,
                  /* 0x4D */ NUM_RIGHT:   77,
                  /* 0x4E */ NUM_ADD:     78,
                  /* 0x4F */ NUM_END:     79,
                  /* 0x50 */ NUM_DOWN:    80,
                  /* 0x51 */ NUM_PGDN:    81,
                  /* 0x52 */ NUM_INS:     82,
                  /* 0x53 */ NUM_DEL:     83,
                  /* 0x54 */ SYSREQ:      84,         // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
                  /* 0x54 */ PAUSE:       84,         // 101-key keyboard only
                  /* 0x57 */ F11:         87,
                  /* 0x58 */ F12:         88,
                  /* 0x5B */ WIN:         91,         // aka CMD
                  /* 0x5C */ RWIN:        92,
                  /* 0x5D */ MENU:        93,         // aka CMD + ONRIGHT
                  /* 0x7F */ MAKE:        127,
                  /* 0x80 */ BREAK:       128,
                  /* 0xE0 */ EXTEND1:     224,
                  /* 0xE1 */ EXTEND2:     225
              };
              
              /**
               * The set of values that a browser may store in the 'location' property of a keyboard event object
               * which we also support.
               *
               * @enum {number}
               */
              Keyboard.LOCATION = {
                  LEFT:           1,
                  RIGHT:          2,
                  NUMPAD:         3
              };
              
              /**
               * These internal "shift key" states are used to indicate BOTH the physical shift-key states (in bitsState)
               * and the simulated shift-key states (in bitsStateSim).  The LOCK keys are problematic in both cases: the
               * browsers give us no way to query the LOCK key states, so we can only infer them, and because they are "soft"
               * locks, the machine's notion of their state is subject to change at any time as well.  Granted, the IBM PC
               * ROM BIOS will store its LOCK states in the ROM BIOS Data Area (@0040:0017), but that's just a BIOS convention.
               *
               * Also, because this is purely for internal use, don't make the mistake of thinking that these bits have any
               * connection to the ROM BIOS bits @0040:0017 (they don't).  We emulate hardware, not ROMs.
               *
               * TODO: Consider taking notice of the ROM BIOS Data Area state anyway, even though I'd rather remain ROM-agnostic;
               * at the very least, it would help us keep our LOCK LEDs in sync with the machine's LOCK states.  However, the LED
               * issue will be largely moot (at least for MODEL_5170 machines) once we add support for PC AT keyboard LED commands.
               *
               * Note that right-hand state bits are equal to the left-hand bits shifted right 1 bit; makes sense, "right"? ;-)
               *
               * @enum {number}
               */
              Keyboard.STATE = {
                  RSHIFT:         0x0001,
                  SHIFT:          0x0002,
                  RCTRL:          0x0004,             // 101-key keyboard only
                  CTRL:           0x0008,
                  CTRLS:          0x000c,
                  RALT:           0x0010,             // 101-key keyboard only
                  ALT:            0x0020,
                  ALTS:           0x0030,
                  RCMD:           0x0040,             // 101-key keyboard only
                  CMD:            0x0080,             // 101-key keyboard only
                  CMDS:           0x00c0,
                  ALL_RIGHT:      0x0055,             // RSHIFT | RCTRL | RALT | RCMD
                  ALL_SHIFT:      0x00ff,             // SHIFT | RSHIFT | CTRL | RCTRL | ALT | RALT | CMD | RCMD
                  INSERT:         0x0100,             // TODO: Placeholder (we currently have no notion of any "insert" states)
                  CAPS_LOCK:      0x0200,
                  NUM_LOCK:       0x0400,
                  SCROLL_LOCK:    0x0800,
                  ALL_LOCKS:      0x0e00              // CAPS_LOCK | NUM_LOCK | SCROLL_LOCK
              };
              
              /**
               * Maps KEYCODES of shift/modifier keys to their corresponding (default) STATES bit above.
               *
               * @enum {number}
               */
              Keyboard.KEYSTATES = {};
              Keyboard.KEYSTATES[Keyboard.SIMCODE.RSHIFT]      = Keyboard.STATE.RSHIFT;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.SHIFT]       = Keyboard.STATE.SHIFT;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.CTRL]        = Keyboard.STATE.CTRL;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.ALT]         = Keyboard.STATE.ALT;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.CMD]         = Keyboard.STATE.CMD;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.RCMD]        = Keyboard.STATE.RCMD;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.FF_CMD]      = Keyboard.STATE.CMD;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.CAPS_LOCK]   = Keyboard.STATE.CAPS_LOCK;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.NUM_LOCK]    = Keyboard.STATE.NUM_LOCK;
              Keyboard.KEYSTATES[Keyboard.SIMCODE.SCROLL_LOCK] = Keyboard.STATE.SCROLL_LOCK;
              
              /**
               * Maps CLICKCODE (string) to SIMCODE (number).
               *
               * @enum {number}
               */
              Keyboard.CLICKCODES = {
                  'TAB':          Keyboard.SIMCODE.TAB,
                  'ESC':          Keyboard.SIMCODE.ESC,
                  'F1':           Keyboard.SIMCODE.F1,
                  'F2':           Keyboard.SIMCODE.F2,
                  'F3':           Keyboard.SIMCODE.F3,
                  'F4':           Keyboard.SIMCODE.F4,
                  'F5':           Keyboard.SIMCODE.F5,
                  'F6':           Keyboard.SIMCODE.F6,
                  'F7':           Keyboard.SIMCODE.F7,
                  'F8':           Keyboard.SIMCODE.F8,
                  'F9':           Keyboard.SIMCODE.F9,
                  'F10':          Keyboard.SIMCODE.F10,
                  'LEFT':         Keyboard.SIMCODE.LEFT,      // formerly "left-arrow"
                  'UP':           Keyboard.SIMCODE.UP,        // formerly "up-arrow"
                  'RIGHT':        Keyboard.SIMCODE.RIGHT,     // formerly "right-arrow"
                  'DOWN':         Keyboard.SIMCODE.DOWN,      // formerly "down-arrow"
                  /*
                   * These bindings are for convenience (common key combinations that can be bound to a single control)
                   */
                  'CTRL_C':       Keyboard.SIMCODE.CTRL_C,
                  'CTRL_BREAK':   Keyboard.SIMCODE.CTRL_BREAK,
                  'CTRL_ALT_DEL': Keyboard.SIMCODE.CTRL_ALT_DEL
              };
              
              /**
               * Maps SOFTCODE (string) to KEYCODE or SIMCODE (number).
               *
               * We define identifiers for all possible keys, based on their primary (unshifted) character or function.
               * This also serves as a definition of all supported keys, making it possible to create full-featured
               * "soft keyboards".
               *
               * One exception to the (unshifted) rule above is 'prtsc': on the original IBM 83-key and 84-key keyboards,
               * its primary (unshifted) character was '*', but on 101-key keyboards, it became a separate key ('prtsc',
               * now labeled "Print Screen"), as did the num-pad '*' ('num-mul'), so 'prtsc' seems worthy of an exception
               * to the rule.
               *
               * On 83-key and 84-key keyboards, 'ctrl'+'num-lock' triggered a "pause" operation and 'ctrl'+'scroll-lock'
               * triggered a "break" operation.
               *
               * On 101-key keyboards, IBM decided to move both those special operations to a new 'pause' ("Pause/Break")
               * key, near the new dedicated 'prtsc' ("Print Screen/SysRq") key -- and to drop the "e" from "SysReq".
               * Those keys behave as follows:
               *
               *      When 'pause' is pressed alone, it generates 0xe1 0x1d 0x45 0xe1 0x9d 0xc5 on make (nothing on break),
               *      which essentially simulates the make-and-break of the 'ctrl' and 'num-lock' keys (ignoring the 0xe1),
               *      triggering a "pause" operation.
               *
               *      When 'pause' is pressed with 'ctrl', it generates 0xe0 0x46 0xe0 0xc6 on make (nothing on break) and
               *      does not repeat, which essentially simulates the make-and-break of 'scroll-lock', which, in conjunction
               *      with the separate make-and-break of 'ctrl', triggers a "break" operation.
               *
               *      When 'prtsc' is pressed alone, it generates 0xe0 0x2a 0xe0 0x37, simulating the make of both 'shift'
               *      and 'prtsc'; when pressed with 'shift' or 'ctrl', it generates only 0xe0 0x37; and when pressed with
               *      'alt', it generates only 0x54 (to simulate 'sysreq').
               *
               *      TODO: Implement the above behaviors.
               *
               * All key identifiers must be quotable using single-quotes, because that's how components.xsl will encode them
               * *inside* the "data-value" attribute of the corresponding HTML control.  Which, in turn, is why the single-quote
               * key is defined as 'quote' rather than "'".  Similarly, if there was unshifted "double-quote" key, it could
               * not be called '"', because components.xsl quotes the *entire* "data-value" attribute using double-quotes.
               *
               * In the (informal) numbering of keys below, two keys are deliberately numbered 84, reflecting the fact that
               * the 'sysreq' key was added to the 84-key keyboard but then dropped from the 101-key keyboard as a stand-alone key.
               *
               * @enum {number}
               */
              Keyboard.SOFTCODES = {
                  /*  1 */    'esc':          Keyboard.SIMCODE.ESC,
                  /*  2 */    '1':            Keyboard.ASCII['1'],
                  /*  3 */    '2':            Keyboard.ASCII['2'],
                  /*  4 */    '3':            Keyboard.ASCII['3'],
                  /*  5 */    '4':            Keyboard.ASCII['4'],
                  /*  6 */    '5':            Keyboard.ASCII['5'],
                  /*  7 */    '6':            Keyboard.ASCII['6'],
                  /*  8 */    '7':            Keyboard.ASCII['7'],
                  /*  9 */    '8':            Keyboard.ASCII['8'],
                  /* 10 */    '9':            Keyboard.ASCII['9'],
                  /* 11 */    '0':            Keyboard.ASCII['0'],
                  /* 12 */    '-':            Keyboard.ASCII['-'],
                  /* 13 */    '=':            Keyboard.ASCII['='],
                  /* 14 */    'bs':           Keyboard.SIMCODE.BS,
                  /* 15 */    'tab':          Keyboard.SIMCODE.TAB,
                  /* 16 */    'q':            Keyboard.ASCII.Q,
                  /* 17 */    'w':            Keyboard.ASCII.W,
                  /* 18 */    'e':            Keyboard.ASCII.E,
                  /* 19 */    'r':            Keyboard.ASCII.R,
                  /* 20 */    't':            Keyboard.ASCII.T,
                  /* 21 */    'y':            Keyboard.ASCII.Y,
                  /* 22 */    'u':            Keyboard.ASCII.U,
                  /* 23 */    'i':            Keyboard.ASCII.I,
                  /* 24 */    'o':            Keyboard.ASCII.O,
                  /* 25 */    'p':            Keyboard.ASCII.P,
                  /* 26 */    '[':            Keyboard.ASCII['['],
                  /* 27 */    ']':            Keyboard.ASCII[']'],
                  /* 28 */    'enter':        Keyboard.KEYCODE.CR,
                  /* 29 */    'ctrl':         Keyboard.SIMCODE.CTRL,
                  /* 30 */    'a':            Keyboard.ASCII.A,
                  /* 31 */    's':            Keyboard.ASCII.S,
                  /* 32 */    'd':            Keyboard.ASCII.D,
                  /* 33 */    'f':            Keyboard.ASCII.F,
                  /* 34 */    'g':            Keyboard.ASCII.G,
                  /* 35 */    'h':            Keyboard.ASCII.H,
                  /* 36 */    'j':            Keyboard.ASCII.J,
                  /* 37 */    'k':            Keyboard.ASCII.K,
                  /* 38 */    'l':            Keyboard.ASCII.L,
                  /* 39 */    ';':            Keyboard.ASCII[';'],
                  /* 40 */    'quote':        Keyboard.ASCII["'"],            // formerly "squote"
                  /* 41 */    '`':            Keyboard.ASCII['`'],            // formerly "bquote"
                  /* 42 */    'shift':        Keyboard.SIMCODE.SHIFT,         // formerly "lshift"
                  /* 43 */    '\\':           Keyboard.ASCII['\\'],           // formerly "bslash"
                  /* 44 */    'z':            Keyboard.ASCII.Z,
                  /* 45 */    'x':            Keyboard.ASCII.X,
                  /* 46 */    'c':            Keyboard.ASCII.C,
                  /* 47 */    'v':            Keyboard.ASCII.V,
                  /* 48 */    'b':            Keyboard.ASCII.B,
                  /* 49 */    'n':            Keyboard.ASCII.N,
                  /* 50 */    'm':            Keyboard.ASCII.M,
                  /* 51 */    ',':            Keyboard.ASCII[','],
                  /* 52 */    '.':            Keyboard.ASCII['.'],
                  /* 53 */    '/':            Keyboard.ASCII['/'],
                  /* 54 */    'right-shift':  Keyboard.SIMCODE.RSHIFT,        // formerly "rshift"
                  /* 55 */    'prtsc':        Keyboard.SIMCODE.PRTSC,         // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
                  /* 56 */    'alt':          Keyboard.SIMCODE.ALT,
                  /* 57 */    'space':        Keyboard.ASCII[' '],
                  /* 58 */    'caps-lock':    Keyboard.SIMCODE.CAPS_LOCK,
                  /* 59 */    'f1':           Keyboard.SIMCODE.F1,
                  /* 60 */    'f2':           Keyboard.SIMCODE.F2,
                  /* 61 */    'f3':           Keyboard.SIMCODE.F3,
                  /* 62 */    'f4':           Keyboard.SIMCODE.F4,
                  /* 63 */    'f5':           Keyboard.SIMCODE.F5,
                  /* 64 */    'f6':           Keyboard.SIMCODE.F6,
                  /* 65 */    'f7':           Keyboard.SIMCODE.F7,
                  /* 66 */    'f8':           Keyboard.SIMCODE.F8,
                  /* 67 */    'f9':           Keyboard.SIMCODE.F9,
                  /* 68 */    'f10':          Keyboard.SIMCODE.F10,
                  /* 69 */    'num-lock':     Keyboard.SIMCODE.NUM_LOCK,
                  /* 70 */    'scroll-lock':  Keyboard.SIMCODE.SCROLL_LOCK,   // TODO: 0xe046 on 101-key keyboards?
                  /* 71 */    'num-home':     Keyboard.SIMCODE.HOME,          // formerly "home"
                  /* 72 */    'num-up':       Keyboard.SIMCODE.UP,            // formerly "up-arrow"
                  /* 73 */    'num-pgup':     Keyboard.SIMCODE.PGUP,          // formerly "page-up"
                  /* 74 */    'num-sub':      Keyboard.SIMCODE.NUM_SUB,       // formerly "num-minus"
                  /* 75 */    'num-left':     Keyboard.SIMCODE.LEFT,          // formerly "left-arrow"
                  /* 76 */    'num-center':   Keyboard.SIMCODE.NUM_CENTER,    // formerly "center"
                  /* 77 */    'num-right':    Keyboard.SIMCODE.RIGHT,         // formerly "right-arrow"
                  /* 78 */    'num-add':      Keyboard.SIMCODE.NUM_ADD,       // formerly "num-plus"
                  /* 79 */    'num-end':      Keyboard.SIMCODE.END,           // formerly "end"
                  /* 80 */    'num-down':     Keyboard.SIMCODE.DOWN,          // formerly "down-arrow"
                  /* 81 */    'num-pgdn':     Keyboard.SIMCODE.PGDN,          // formerly "page-down"
                  /* 82 */    'num-ins':      Keyboard.SIMCODE.INS,           // formerly "ins"
                  /* 83 */    'num-del':      Keyboard.SIMCODE.DEL            // formerly "del"
              //  /* 84 */    'sysreq':       Keyboard.SCANCODE.SYSREQ,       // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
              //  /* 84 */    'pause':        Keyboard.SCANCODE.PAUSE,        // 101-key keyboard only
              //  /* 85 */    'f11':          Keyboard.SCANCODE.F11,
              //  /* 86 */    'f12':          Keyboard.SCANCODE.F12,
              //  /* 87 */    'num-enter':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ENTER << 8),
              //  /* 88 */    'right-ctrl':   Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.CTRL << 8),
              //  /* 89 */    'num-div':      Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.SLASH << 8),
              //  /* 90 */    'num-mul':      Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.PRTSC << 8),
              //  /* 91 */    'right-alt':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ALT << 8),
              //  /* 92 */    'home':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_HOME << 8),
              //  /* 93 */    'up':           Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_UP << 8),
              //  /* 94 */    'pgup':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGUP << 8),
              //  /* 95 */    'left':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_LEFT << 8),
              //  /* 96 */    'right':        Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_RIGHT << 8),
              //  /* 97 */    'end':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_END << 8),
              //  /* 98 */    'down':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DOWN << 8),
              //  /* 99 */    'pgdn':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGDN << 8),
              //  /*100 */    'ins':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_INS << 8),
              //  /*101 */    'del':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DEL << 8),
              //              'win':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.WIN << 8),
              //              'right-win':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.RWIN << 8),
              //              'menu':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.MENU << 8)
              };
              
              /**
               * Maps "soft-key" definitions (above) of shift/modifier keys to their corresponding (default) STATES bit.
               *
               * @enum {number}
               */
              Keyboard.LEDSTATES = {
                  'caps-lock':    Keyboard.STATE.CAPS_LOCK,
                  'num-lock':     Keyboard.STATE.NUM_LOCK,
                  'scroll-lock':  Keyboard.STATE.SCROLL_LOCK
              };
              
              /**
               * Maps SIMCODE (number) to SCANCODE (number(s)).
               *
               * This array is used by keySimulate() to lookup a given SIMCODE and convert it to a SCANCODE
               * (lower byte), plus any required shift key SCANCODES (upper bytes).
               *
               * Using keyCodes from keyPress events proved to be more robust than using keyCodes from keyDown and
               * keyUp events, in part because of differences in the way browsers generate the keyDown and keyUp events.
               * For example, Safari on iOS devices will not generate up/down events for shift keys, and for other keys,
               * the up/down events are usually generated after the actual press is complete, and in rapid succession.
               *
               * The other problem (which is more of a problem with keyboards like the C1P than any IBM keyboards) is
               * that the shift/modifier state for a character on the "source" keyboard may not match the shift/modifier
               * state for the same character on the "target" keyboard.  And since this code is inherited from C1Pjs,
               * we've inherited the same solution: keySimulate() has the ability to "undo" any states in bitsState
               * that conflict with the state(s) required for the character in question.
               *
               * @enum {number}
               */
              Keyboard.SIMCODES = {};
              Keyboard.SIMCODES[Keyboard.SIMCODE.ESC]          = Keyboard.SCANCODE.ESC;
              Keyboard.SIMCODES[Keyboard.ASCII['1']]           = Keyboard.SCANCODE.ONE;
              Keyboard.SIMCODES[Keyboard.ASCII['!']]           = Keyboard.SCANCODE.ONE    | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['2']]           = Keyboard.SCANCODE.TWO;
              Keyboard.SIMCODES[Keyboard.ASCII['@']]           = Keyboard.SCANCODE.TWO    | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['3']]           = Keyboard.SCANCODE.THREE;
              Keyboard.SIMCODES[Keyboard.ASCII['#']]           = Keyboard.SCANCODE.THREE  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['4']]           = Keyboard.SCANCODE.FOUR;
              Keyboard.SIMCODES[Keyboard.ASCII['$']]           = Keyboard.SCANCODE.FOUR   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['5']]           = Keyboard.SCANCODE.FIVE;
              Keyboard.SIMCODES[Keyboard.ASCII['%']]           = Keyboard.SCANCODE.FIVE   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['6']]           = Keyboard.SCANCODE.SIX;
              Keyboard.SIMCODES[Keyboard.ASCII['^']]           = Keyboard.SCANCODE.SIX    | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['7']]           = Keyboard.SCANCODE.SEVEN;
              Keyboard.SIMCODES[Keyboard.ASCII['&']]           = Keyboard.SCANCODE.SEVEN  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['8']]           = Keyboard.SCANCODE.EIGHT;
              Keyboard.SIMCODES[Keyboard.ASCII['*']]           = Keyboard.SCANCODE.EIGHT  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['9']]           = Keyboard.SCANCODE.NINE;
              Keyboard.SIMCODES[Keyboard.ASCII['(']]           = Keyboard.SCANCODE.NINE   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['0']]           = Keyboard.SCANCODE.ZERO;
              Keyboard.SIMCODES[Keyboard.ASCII[')']]           = Keyboard.SCANCODE.ZERO   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['-']]           = Keyboard.SCANCODE.DASH;
              Keyboard.SIMCODES[Keyboard.ASCII['_']]           = Keyboard.SCANCODE.DASH   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['=']]           = Keyboard.SCANCODE.EQUALS;
              Keyboard.SIMCODES[Keyboard.ASCII['+']]           = Keyboard.SCANCODE.EQUALS | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.SIMCODE.BS]           = Keyboard.SCANCODE.BS;
              Keyboard.SIMCODES[Keyboard.SIMCODE.TAB]          = Keyboard.SCANCODE.TAB;
              Keyboard.SIMCODES[Keyboard.ASCII.q]              = Keyboard.SCANCODE.Q;
              Keyboard.SIMCODES[Keyboard.ASCII.Q]              = Keyboard.SCANCODE.Q      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.w]              = Keyboard.SCANCODE.W;
              Keyboard.SIMCODES[Keyboard.ASCII.W]              = Keyboard.SCANCODE.W      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.e]              = Keyboard.SCANCODE.E;
              Keyboard.SIMCODES[Keyboard.ASCII.E]              = Keyboard.SCANCODE.E      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.r]              = Keyboard.SCANCODE.R;
              Keyboard.SIMCODES[Keyboard.ASCII.R]              = Keyboard.SCANCODE.R      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.t]              = Keyboard.SCANCODE.T;
              Keyboard.SIMCODES[Keyboard.ASCII.T]              = Keyboard.SCANCODE.T      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.y]              = Keyboard.SCANCODE.Y;
              Keyboard.SIMCODES[Keyboard.ASCII.Y]              = Keyboard.SCANCODE.Y      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.u]              = Keyboard.SCANCODE.U;
              Keyboard.SIMCODES[Keyboard.ASCII.U]              = Keyboard.SCANCODE.U      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.i]              = Keyboard.SCANCODE.I;
              Keyboard.SIMCODES[Keyboard.ASCII.I]              = Keyboard.SCANCODE.I      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.o]              = Keyboard.SCANCODE.O;
              Keyboard.SIMCODES[Keyboard.ASCII.O]              = Keyboard.SCANCODE.O      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.p]              = Keyboard.SCANCODE.P;
              Keyboard.SIMCODES[Keyboard.ASCII.P]              = Keyboard.SCANCODE.P      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['[']]           = Keyboard.SCANCODE.LBRACK;
              Keyboard.SIMCODES[Keyboard.ASCII['{']]           = Keyboard.SCANCODE.LBRACK | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII[']']]           = Keyboard.SCANCODE.RBRACK;
              Keyboard.SIMCODES[Keyboard.ASCII['}']]           = Keyboard.SCANCODE.RBRACK | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.KEYCODE.CR]           = Keyboard.SCANCODE.ENTER;
              Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL]         = Keyboard.SCANCODE.CTRL;
              Keyboard.SIMCODES[Keyboard.ASCII.a]              = Keyboard.SCANCODE.A;
              Keyboard.SIMCODES[Keyboard.ASCII.A]              = Keyboard.SCANCODE.A      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.s]              = Keyboard.SCANCODE.S;
              Keyboard.SIMCODES[Keyboard.ASCII.S]              = Keyboard.SCANCODE.S      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.d]              = Keyboard.SCANCODE.D;
              Keyboard.SIMCODES[Keyboard.ASCII.D]              = Keyboard.SCANCODE.D      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.f]              = Keyboard.SCANCODE.F;
              Keyboard.SIMCODES[Keyboard.ASCII.F]              = Keyboard.SCANCODE.F      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.g]              = Keyboard.SCANCODE.G;
              Keyboard.SIMCODES[Keyboard.ASCII.G]              = Keyboard.SCANCODE.G      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.h]              = Keyboard.SCANCODE.H;
              Keyboard.SIMCODES[Keyboard.ASCII.H]              = Keyboard.SCANCODE.H      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.j]              = Keyboard.SCANCODE.J;
              Keyboard.SIMCODES[Keyboard.ASCII.J]              = Keyboard.SCANCODE.J      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.k]              = Keyboard.SCANCODE.K;
              Keyboard.SIMCODES[Keyboard.ASCII.K]              = Keyboard.SCANCODE.K      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.l]              = Keyboard.SCANCODE.L;
              Keyboard.SIMCODES[Keyboard.ASCII.L]              = Keyboard.SCANCODE.L      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII[';']]           = Keyboard.SCANCODE.SEMI;
              Keyboard.SIMCODES[Keyboard.ASCII[':']]           = Keyboard.SCANCODE.SEMI   | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII["'"]]           = Keyboard.SCANCODE.QUOTE;
              Keyboard.SIMCODES[Keyboard.ASCII['"']]           = Keyboard.SCANCODE.QUOTE  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['`']]           = Keyboard.SCANCODE.BQUOTE;
              Keyboard.SIMCODES[Keyboard.ASCII['~']]           = Keyboard.SCANCODE.BQUOTE | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.SIMCODE.SHIFT]        = Keyboard.SCANCODE.SHIFT;
              Keyboard.SIMCODES[Keyboard.ASCII['\\']]          = Keyboard.SCANCODE.BSLASH;
              Keyboard.SIMCODES[Keyboard.ASCII['|']]           = Keyboard.SCANCODE.BSLASH | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.z]              = Keyboard.SCANCODE.Z;
              Keyboard.SIMCODES[Keyboard.ASCII.Z]              = Keyboard.SCANCODE.Z      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.x]              = Keyboard.SCANCODE.X;
              Keyboard.SIMCODES[Keyboard.ASCII.X]              = Keyboard.SCANCODE.X      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.c]              = Keyboard.SCANCODE.C;
              Keyboard.SIMCODES[Keyboard.ASCII.C]              = Keyboard.SCANCODE.C      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.v]              = Keyboard.SCANCODE.V;
              Keyboard.SIMCODES[Keyboard.ASCII.V]              = Keyboard.SCANCODE.V      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.b]              = Keyboard.SCANCODE.B;
              Keyboard.SIMCODES[Keyboard.ASCII.B]              = Keyboard.SCANCODE.B      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.n]              = Keyboard.SCANCODE.N;
              Keyboard.SIMCODES[Keyboard.ASCII.N]              = Keyboard.SCANCODE.N      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII.m]              = Keyboard.SCANCODE.M;
              Keyboard.SIMCODES[Keyboard.ASCII.M]              = Keyboard.SCANCODE.M      | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII[',']]           = Keyboard.SCANCODE.COMMA;
              Keyboard.SIMCODES[Keyboard.ASCII['<']]           = Keyboard.SCANCODE.COMMA  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['.']]           = Keyboard.SCANCODE.PERIOD;
              Keyboard.SIMCODES[Keyboard.ASCII['>']]           = Keyboard.SCANCODE.PERIOD | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.ASCII['/']]           = Keyboard.SCANCODE.SLASH;
              Keyboard.SIMCODES[Keyboard.ASCII['?']]           = Keyboard.SCANCODE.SLASH  | (Keyboard.SCANCODE.SHIFT << 8);
              Keyboard.SIMCODES[Keyboard.SIMCODE.RSHIFT]       = Keyboard.SCANCODE.RSHIFT;
              Keyboard.SIMCODES[Keyboard.SIMCODE.PRTSC]        = Keyboard.SCANCODE.PRTSC;
              Keyboard.SIMCODES[Keyboard.SIMCODE.ALT]          = Keyboard.SCANCODE.ALT;
              Keyboard.SIMCODES[Keyboard.ASCII[' ']]           = Keyboard.SCANCODE.SPACE;
              Keyboard.SIMCODES[Keyboard.SIMCODE.CAPS_LOCK]    = Keyboard.SCANCODE.CAPS_LOCK;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F1]           = Keyboard.SCANCODE.F1;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F2]           = Keyboard.SCANCODE.F2;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F3]           = Keyboard.SCANCODE.F3;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F4]           = Keyboard.SCANCODE.F4;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F5]           = Keyboard.SCANCODE.F5;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F6]           = Keyboard.SCANCODE.F6;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F7]           = Keyboard.SCANCODE.F7;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F8]           = Keyboard.SCANCODE.F8;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F9]           = Keyboard.SCANCODE.F9;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F10]          = Keyboard.SCANCODE.F10;
              Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_LOCK]     = Keyboard.SCANCODE.NUM_LOCK;
              Keyboard.SIMCODES[Keyboard.SIMCODE.SCROLL_LOCK]  = Keyboard.SCANCODE.SCROLL_LOCK;
              Keyboard.SIMCODES[Keyboard.SIMCODE.HOME]         = Keyboard.SCANCODE.NUM_HOME;
              Keyboard.SIMCODES[Keyboard.SIMCODE.UP]           = Keyboard.SCANCODE.NUM_UP;
              Keyboard.SIMCODES[Keyboard.SIMCODE.PGUP]         = Keyboard.SCANCODE.NUM_PGUP;
              Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_SUB]      = Keyboard.SCANCODE.NUM_SUB;
              Keyboard.SIMCODES[Keyboard.SIMCODE.LEFT]         = Keyboard.SCANCODE.NUM_LEFT;
              Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_CENTER]   = Keyboard.SCANCODE.NUM_CENTER;
              Keyboard.SIMCODES[Keyboard.SIMCODE.RIGHT]        = Keyboard.SCANCODE.NUM_RIGHT;
              Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_ADD]      = Keyboard.SCANCODE.NUM_ADD;
              Keyboard.SIMCODES[Keyboard.SIMCODE.END]          = Keyboard.SCANCODE.NUM_END;
              Keyboard.SIMCODES[Keyboard.SIMCODE.DOWN]         = Keyboard.SCANCODE.NUM_DOWN;
              Keyboard.SIMCODES[Keyboard.SIMCODE.PGDN]         = Keyboard.SCANCODE.NUM_PGDN;
              Keyboard.SIMCODES[Keyboard.SIMCODE.INS]          = Keyboard.SCANCODE.NUM_INS;
              Keyboard.SIMCODES[Keyboard.SIMCODE.DEL]          = Keyboard.SCANCODE.NUM_DEL;
              /*
               * Entries beyond this point are for keys that existed only on 101-key keyboards (well, except for 'sysreq',
               * which also existed on the 84-key keyboard), which ALSO means that these keys essentially did not exist
               * for a MODEL_5150 or MODEL_5160 machine, because those machines could use only 83-key keyboards.  Remember
               * that IBM machines and IBM keyboards are our reference point here, so while there were undoubtedly 5150/5160
               * clones that could use newer keyboards, as well as 3rd-party keyboards that could work with older machines,
               * support for non-IBM configurations is left for another day.
               *
               * TODO: The only relevance of newer keyboards to older machines is the fact that you're probably using a newer
               * keyboard with your browser, which raises the question of what to do with newer keys that older machines
               * wouldn't understand.  I don't attempt to filter out any of the entries below based on machine model, but that
               * would seem like a wise thing to do.
               *
               * TODO: Add entries for 'num-mul', 'num-div', 'num-enter', the stand-alone arrow keys, etc, AND at the same time,
               * make sure that keys with multi-byte sequences (eg, 0xe0 0x1c) work properly.
               */
              Keyboard.SIMCODES[Keyboard.SIMCODE.F11]          = Keyboard.SCANCODE.F11;
              Keyboard.SIMCODES[Keyboard.SIMCODE.F12]          = Keyboard.SCANCODE.F12;
              Keyboard.SIMCODES[Keyboard.SIMCODE.CMD]          = Keyboard.SCANCODE.WIN;
              Keyboard.SIMCODES[Keyboard.SIMCODE.RCMD]         = Keyboard.SCANCODE.MENU;
              Keyboard.SIMCODES[Keyboard.SIMCODE.FF_CMD]       = Keyboard.SCANCODE.WIN;
              
              Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_C]       = Keyboard.SCANCODE.C           | (Keyboard.SCANCODE.CTRL << 8);
              Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_BREAK]   = Keyboard.SCANCODE.SCROLL_LOCK | (Keyboard.SCANCODE.CTRL << 8);
              Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_ALT_DEL] = Keyboard.SCANCODE.NUM_DEL     | (Keyboard.SCANCODE.CTRL << 8) | (Keyboard.SCANCODE.ALT << 16);
              
              /**
               * Commands that can be sent to the Keyboard via the 8042; see sendCmd()
               *
               * @enum {number}
               */
              Keyboard.CMD = {
                  RESET:      0xFF,
                  RESEND:     0xFE,
                  DEF_ON:     0xF6,
                  DEF_OFF:    0xF5,
                  ENABLE:     0xF4,
                  SET_RATE:   0xF3,
                  ECHO:       0xEE,
                  SET_LEDS:   0xED
              };
              
              /**
               * Command responses returned to the Keyboard via the 8042; see sendCmd()
               *
               * @enum {number}
               */
              Keyboard.CMDRES = {
                  OVERRUN:    0x00,
                  LOAD_TEST:  0x65,   // undocumented "LOAD MANUFACTURING TEST REQUEST" response code
                  BAT_OK:     0xAA,   // Basic Assurance Test (BAT) succeeded
                  ECHO:       0xEE,
                  BREAK_PREF: 0xF0,   // break prefix
                  ACK:        0xFA,
                  BAT_FAIL:   0xFC,   // Basic Assurance Test (BAT) failed
                  DIAG_FAIL:  0xFD,
                  RESEND:     0xFE,
                  BUFF_FULL:  0xFF    // TODO: Verify this response code (is it just for older 83-key keyboards?)
              };
              
              Keyboard.LIMIT = {
                  MAX_SCANCODES: 20   // TODO: Verify this limit for newer keyboards (84-key and up)
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {Keyboard}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "esc")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              Keyboard.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  /*
                   * There's a special binding that the Video component uses ("kbd") to effectively bind its
                   * screen to the entire keyboard, in Video.powerUp(); ie:
                   *
                   *      video.kbd.setBinding("canvas", "kbd", video.canvasScreen);
                   * or:
                   *      video.kbd.setBinding("textarea", "kbd", video.textareaScreen);
                   *
                   * However, it's also possible for the keyboard XML definition to define a control that serves
                   * a similar purpose; eg:
                   *
                   *      <control type="text" binding="kbd" width="2em">Kbd</control>
                   *
                   * The latter is purely experimental, while we work on finding ways to trigger the soft keyboard on
                   * certain pesky devices (like the Kindle Fire).  Note that even if you use the latter, the former will
                   * still be enabled (there's currently no way to configure the Video component to not bind its screen,
                   * but we could certainly add one if the need ever arose).
                   */
                  var kbd = this;
                  var id = sHTMLType + '-' + sBinding;
              
                  if (this.bindings[id] === undefined) {
                      switch (sBinding) {
                      case "kbd":
                          /*
                           * Recording the binding ID prevents multiple controls (or components) from attempting to erroneously
                           * bind a control to the same ID, but in the case of a "dual display" configuration, we actually want
                           * to allow BOTH video components to call setBinding() for "kbd", so that it doesn't matter which
                           * display the user gives focus to.
                           *
                           *      this.bindings[id] = control;
                           */
                          control.onkeydown = function onKeyDown(event) {
                              return kbd.onKeyDown(event, true);
                          };
                          control.onkeypress = function onKeyPressKbd(event) {
                              return kbd.onKeyPress(event);
                          };
                          control.onkeyup = function onKeyUp(event) {
                              return kbd.onKeyDown(event, false);
                          };
                          return true;
              
                      case "caps-lock":
                          this.bindings[id] = control;
                          control.onclick = function onClickCapsLock(event) {
                              if (kbd.cpu) kbd.cpu.setFocus();
                              return kbd.toggleCapsLock();
                          };
                          return true;
              
                      case "num-lock":
                          this.bindings[id] = control;
                          control.onclick = function onClickNumLock(event) {
                              if (kbd.cpu) kbd.cpu.setFocus();
                              return kbd.toggleNumLock();
                          };
                          return true;
              
                      case "scroll-lock":
                          this.bindings[id] = control;
                          control.onclick = function onClickScrollLock(event) {
                              if (kbd.cpu) kbd.cpu.setFocus();
                              return kbd.toggleScrollLock();
                          };
                          return true;
              
                      default:
                          /*
                           * Maintain support for older button codes; eg, map button code "ctrl-c" to CLICKCODE "CTRL_C"
                           */
                          var sCode = sBinding.toUpperCase().replace(/-/g, '_');
                          if (Keyboard.CLICKCODES[sCode] !== undefined && sHTMLType == "button") {
                              this.bindings[id] = control;
                              control.onclick = function(kbd, sKey, simCode) {
                                  return function onClickKeyboard(event) {
                                      if (!COMPILED && kbd.messageEnabled()) kbd.printMessage(sKey + " clicked", Messages.KEYS);
                                      if (kbd.cpu) kbd.cpu.setFocus();
                                      kbd.updateShiftState(simCode, true);    // future-proofing if/when any LOCK keys are added to CLICKCODES
                                      kbd.addActiveKey(simCode, true);
                                  };
                              }(this, sCode, Keyboard.CLICKCODES[sCode]);
                              return true;
                          } else if (Keyboard.SOFTCODES[sBinding] !== undefined) {
                              this.cSoftCodes++;
                              this.bindings[id] = control;
                              var fnDown = function(kbd, sKey, simCode) {
                                  return function onMouseOrTouchDownKeyboard(event) {
                                      kbd.addActiveKey(simCode);
                                  };
                              }(this, sBinding, Keyboard.SOFTCODES[sBinding]);
                              var fnUp = function (kbd, sKey, simCode) {
                                  return function onMouseOrTouchUpKeyboard(event) {
                                      kbd.removeActiveKey(simCode);
                                  };
                              }(this, sBinding, Keyboard.SOFTCODES[sBinding]);
                              if ('ontouchstart' in window) {
                                  control.ontouchstart = fnDown;
                                  control.ontouchend = fnUp;
                              } else {
                                  control.onmousedown = fnDown;
                                  control.onmouseup = control.onmouseout = fnUp;
                              }
                              return true;
                          }
                          break;
                      }
                  }
                  return false;
              };
              
              /**
               * findBinding(simCode, sType, fDown)
               *
               * TODO: This function is woefully inefficient, because the SOFTCODES table is designed for converting
               * soft key presses into SIMCODES, whereas this function is doing the reverse: looking for the soft key,
               * if any, that corresponds to a SIMCODE, simply so we can provide visual feedback of keys activated
               * by other means (eg, real keyboard events, button clicks that generate key sequences like CTRL_ALT_DEL,
               * etc).
               *
               * To minimize this function's cost, we would want to dynamically create a reverse-lookup table after
               * all the setBinding() calls for the soft keys have been established; note that the reverse-lookup table
               * would contain MORE entries than the SOFTCODES table, because there are multiple simCodes that correspond
               * to a given soft key (eg, '1' and '!' both map to the same soft key).
               *
               * @this {Keyboard}
               * @param {number} simCode
               * @param {string} sType is the type of control (eg, "button" or "key")
               * @param {boolean} [fDown] is true if the key is going down, false if up, or undefined if unchanged
               * @return {Object} is the HTML control DOM object (eg, HTMLButtonElement), or undefined if no such control exists
               */
              Keyboard.prototype.findBinding = function(simCode, sType, fDown)
              {
                  var control;
                  if (this.cSoftCodes) {
                      for (var code in Keyboard.SHIFTED_KEYCODES) {
                          if (simCode == Keyboard.SHIFTED_KEYCODES[code]) {
                              simCode = +code;
                              code = Keyboard.STUPID_KEYCODES[code];
                              if (code) simCode = code;
                              break;
                          }
                      }
                      for (var sBinding in Keyboard.SOFTCODES) {
                          if (Keyboard.SOFTCODES[sBinding] == simCode || Keyboard.SOFTCODES[sBinding] == this.toUpperKey(simCode)) {
                              var id = sType + '-' + sBinding;
                              control = this.bindings[id];
                              if (control && fDown !== undefined) {
                                  this.setSoftKeyState(control, fDown);
                              }
                              break;
                          }
                      }
                  }
                  return control;
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {Keyboard}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              Keyboard.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.chipset = cmp.getComponentByType("ChipSet");
              };
              
              /**
               * notifyEscape(fDisabled, fAllDown)
               *
               * When ESC is used by the browser to disable pointer lock, this gives us the option of mapping a different key to ESC.
               *
               * @this {Keyboard}
               * @param {boolean} fDisabled
               * @param {boolean} [fAllDown] (an experimental option to re-enable processing of all onkeydown/onkeyup events)
               */
              Keyboard.prototype.notifyEscape = function(fDisabled, fAllDown)
              {
                  this.fEscapeDisabled = fDisabled;
                  if (fAllDown !== undefined) this.fAllDown = fAllDown;
              };
              
              /**
               * setModel(nModel)
               *
               * @this {Keyboard}
               * @param {number} nModel
               */
              Keyboard.prototype.setModel = function(nModel)
              {
              };
              
              /**
               * resetDevice(fNotify)
               *
               * @this {Keyboard}
               * @param {boolean} [fNotify]
               */
              Keyboard.prototype.resetDevice = function(fNotify)
              {
                  /*
                   * TODO: There's more to reset, like LED indicators, default type rate, and emptying the scan code buffer.
                   */
                  this.printMessage("keyboard reset", Messages.KEYBOARD | Messages.PORT);
                  this.abBuffer = [Keyboard.CMDRES.BAT_OK];
                  this.fAdvance = true;
                  if (fNotify && this.chipset) this.chipset.notifyKbdData(this.abBuffer[0]);
              };
              
              /**
               * setEnabled(fData, fClock)
               *
               * This is the ChipSet's primary interface for toggling keyboard "data" and "clock" lines.
               * For MODEL_5150 and MODEL_5160 machines, this function is called from the ChipSet's PPI_B
               * output handler.  For MODEL_5170 machines, this function is called when selected CMD
               * "data bytes" have been written.
               *
               * @this {Keyboard}
               * @param {boolean} fData is true if the keyboard simulated data line should be enabled
               * @param {boolean} fClock is true if the keyboard's simulated clock line should be enabled
               * @return {boolean} true if keyboard was re-enabled, false if not (or no change)
               */
              Keyboard.prototype.setEnabled = function(fData, fClock)
              {
                  var fReset = false;
                  if (this.fClock !== fClock) {
                      if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                          this.printMessage("keyboard clock line changing to " + fClock, true);
                      }
                      /*
                       * Toggling the clock line low and then high signals a "reset", which we acknowledge once the
                       * data line is high as well.
                       */
                      this.fClock = this.fResetOnEnable = fClock;
                      /*
                       * Allow the next buffered scan code, if any, to advance.
                       */
                      if (fClock) this.fAdvance = true;
                  }
                  if (this.fData !== fData) {
                      if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                          this.printMessage("keyboard data line changing to " + fData, true);
                      }
                      this.fData = fData;
                      /*
                       * TODO: Review this code; it was added during the early days of MODEL_5150 testing and may not be
                       * *exactly* what's called for here.
                       */
                      if (fData && !this.fResetOnEnable) {
                          this.shiftScanCode(true);
                      }
                  }
                  if (this.fData && this.fResetOnEnable) {
                      this.resetDevice(true);
                      this.fResetOnEnable = false;
                      fReset = true;
                  }
                  return fReset;
              };
              
              /**
               * sendCmd(bCmd)
               *
               * This is the ChipSet's primary interface for controlling "Model M" keyboards (ie, those used
               * with MODEL_5170 machines).  Commands are delivered through the ChipSet's 8042 Keyboard Controller.
               *
               * @this {Keyboard}
               * @param {number} bCmd should be one of the Keyboard.CMD.* command codes (Model M keyboards only)
               * @return {number} response should be one of the Keyboard.CMDRES.* response codes, or -1 if unrecognized
               */
              Keyboard.prototype.sendCmd = function(bCmd)
              {
                  var b = -1;
                  switch(bCmd) {
                  case Keyboard.CMD.RESET:
                      b = Keyboard.CMDRES.ACK;
                      this.resetDevice();
                      break;
                  default:
                      break;
                  }
                  return b;
              };
              
              /**
               * checkScanCode()
               *
               * This is the ChipSet's interface for checking data availability.
               *
               * Note that even if we have data, we don't provide it unless fAdvance is set as well.
               * This ensures that we wait until the ROM to disable and re-enable the controller before
               * making more data available.
               *
               * @this {Keyboard}
               * @return {number} next scan code, or 0 if none
               */
              Keyboard.prototype.checkScanCode = function()
              {
                  var b = 0;
                  if (this.abBuffer.length && this.fAdvance) {
                      b = this.abBuffer[0];
                      if (this.chipset) this.chipset.notifyKbdData(b);
                  }
                  if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " available");
                  return b;
              };
              
              /**
               * readScanCode()
               *
               * This is the ChipSet's interface for reading scan codes.
               *
               * @this {Keyboard}
               * @return {number} next scan code, or 0 if none
               */
              Keyboard.prototype.readScanCode = function()
              {
                  var b = 0;
                  if (this.abBuffer.length) {
                      b = this.abBuffer[0];
                  }
                  if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " delivered");
                  return b;
              };
              
              /**
               * flushScanCode()
               *
               * This is the ChipSet's interface to flush scan codes.
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.flushScanCode = function()
              {
                  this.abBuffer = [];
                  if (this.messageEnabled()) this.printMessage("scan codes flushed");
              };
              
              /**
               * shiftScanCode(fNotify)
               *
               * This is the ChipSet's interface to advance scan codes.
               *
               * @this {Keyboard}
               * @param {boolean} [fNotify] is true to notify ChipSet if more data is available.
               */
              Keyboard.prototype.shiftScanCode = function(fNotify)
              {
                  if (this.abBuffer.length > 0) {
                      /*
                       * The keyboard interrupt service routine toggles the enable bit after reading a scan code, so
                       * presumably this is the proper point at which to shift the last scan code out, and then assert
                       * another interrupt if more scan codes exist.
                       */
                      this.abBuffer.shift();
                      this.fAdvance = fNotify;
                      if (fNotify) {
                          if (!this.abBuffer.length || !this.chipset) {
                              fNotify = false;
                          } else {
                              this.chipset.notifyKbdData(this.abBuffer[0]);
                          }
                      }
                      if (this.messageEnabled()) this.printMessage("scan codes shifted, notify " + (fNotify? "true" : "false"));
                  }
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {Keyboard}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Keyboard.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      /*
                       * TODO: Save/restore support for Keyboard is the barest minimum.  In fact, originally, I wasn't
                       * saving/restoring anything, and that was OK, but if we don't at least re-initialize fClock/fData,
                       * we can get a spurious reset following a restore.  In an ideal world, we might choose to save/restore
                       * abBuffer as well, but realistically, I think it's going to be safer to always start with an
                       * empty buffer--and who's going to notice anyway?
                       *
                       * So, like Debugger, we deviate from the typical save/restore pattern: instead of reset OR restore,
                       * we always reset and then perform a (very limited) restore.
                       */
                      this.reset();
                      if (data && this.restore) {
                          if (!this.restore(data)) return false;
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {Keyboard}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              Keyboard.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * reset()
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.reset = function()
              {
                  this.setModel(this.nDefaultModel);
              
                  this.initState();
              
                  /*
                   * The current (assumed) physical (and simulated) states of the various shift/lock keys.
                   *
                   * TODO: Determine how (or whether) we can query the browser's initial shift/lock key states.
                   */
                  this.bitsState = this.bitsStateSim = 0;
              
                  /*
                   * New scan codes are "pushed" onto abBuffer and then "shifted" off.
                   */
                  this.abBuffer = [];
                  this.fAdvance = true;
              
                  this.prevCharDown = 0;
                  this.prevKeyDown = 0;
              
                  /*
                   * Make sure the auto-injection buffer is empty (an injection could have been in progress on any reset after the first).
                   */
                  this.sInjectBuffer = "";
              };
              
              /**
               * save()
               *
               * This implements save support for the Keyboard component.
               *
               * @this {Keyboard}
               * @return {Object}
               */
              Keyboard.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.saveState());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the Keyboard component.
               *
               * @this {Keyboard}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              Keyboard.prototype.restore = function(data)
              {
                  return this.initState(data[0]);
              };
              
              /**
               * initState(data)
               *
               * @this {Keyboard}
               * @param {Array} [data]
               * @return {boolean} true if successful, false if failure
               */
              Keyboard.prototype.initState = function(data)
              {
                  var i = 0;
                  if (data === undefined) data = [];
                  this.fClock = this.fAdvance = data[i++];
                  this.fData = data[i];
                  return true;
              };
              
              /**
               * saveState()
               *
               * @this {Keyboard}
               * @return {Array}
               */
              Keyboard.prototype.saveState = function()
              {
                  var i = 0;
                  var data = [];
                  data[i++] = this.fClock;
                  data[i] = this.fData;
                  return data;
              };
              
              /**
               * setSoftKeyState(control, f)
               *
               * @this {Keyboard}
               * @param {Object} control is an HTML control DOM object
               * @param {boolean} f is true if the key represented by e should be "on", false if "off"
               */
              Keyboard.prototype.setSoftKeyState = function(control, f)
              {
                  control.style.color = (f? "#ffffff" : "#000000");
                  control.style.backgroundColor = (f? "#000000" : "#ffffff");
              };
              
              /**
               * addScanCode(bScan)
               *
               * @this {Keyboard}
               * @param {number} bScan
               */
              Keyboard.prototype.addScanCode = function(bScan)
              {
                  /*
                   * Prepare for the possibility that our reset() function may not have been called yet.
                   *
                   * TODO: Determine whether we need to reset() the Keyboard sooner (ie, in the constructor),
                   * or if we need to protect other methods from prematurely accessing certain Keyboard structures,
                   * as a result of calls from any of the key event handlers established by setBinding().
                   */
                  if (this.abBuffer) {
                      if (this.abBuffer.length < Keyboard.LIMIT.MAX_SCANCODES) {
                          if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(bScan) + " buffered");
                          this.abBuffer.push(bScan);
                          if (this.abBuffer.length == 1) {
                              if (this.chipset) this.chipset.notifyKbdData(bScan);
                          }
                          return;
                      }
                      if (this.abBuffer.length == Keyboard.LIMIT.MAX_SCANCODES) {
                          this.abBuffer.push(Keyboard.CMDRES.BUFF_FULL);
                      }
                      this.printMessage("scan code buffer overflow");
                  }
              };
              
              /**
               * injectKeys(sKeyCodes, msDelay)
               *
               * @this {Keyboard}
               * @param {string} sKeyCodes
               * @param {number|undefined} [msDelay] is an optional injection delay (default is msInjectDelay)
               */
              Keyboard.prototype.injectKeys = function(sKeyCodes, msDelay)
              {
                  this.sInjectBuffer = sKeyCodes;
                  if (!COMPILED) this.log("injectKeys(" + this.sInjectBuffer.split("\n").join("\\n") + ")");
                  this.injectKeysFromBuffer(msDelay || this.msInjectDelay);
              };
              
              /**
               * injectKeysFromBuffer(msDelay)
               *
               * @this {Keyboard}
               * @param {number} msDelay is the delay between injected keys
               */
              Keyboard.prototype.injectKeysFromBuffer = function(msDelay)
              {
                  if (this.sInjectBuffer.length > 0) {
                      var ch = this.sInjectBuffer.charCodeAt(0);
                      /*
                       * I could require all callers to supply CRs instead of LFs, but this is friendlier.
                       */
                      if (ch == 0x0a) ch = 0x0d;
              
                      this.sInjectBuffer = this.sInjectBuffer.substr(1);
                      this.addActiveKey(ch, true);
                  }
                  if (this.sInjectBuffer.length > 0) {
                      setTimeout(function (kbd) {
                          return function onInjectKeyTimeout() {
                              kbd.injectKeysFromBuffer(msDelay);
                          };
                      }(this), msDelay);
                  }
              };
              
              /**
               * setLED(control, f)
               *
               * @this {Keyboard}
               * @param {Object} control is an HTML control DOM object
               * @param {boolean} f is true if the LED represented by control should be "on", false if "off"
               */
              Keyboard.prototype.setLED = function(control, f)
              {
                  control.style.backgroundColor = (f? "#00ff00" : "#000000");
              };
              
              /**
               * updateLEDs(bitState)
               *
               * Updates any and all shift-related LEDs with the corresponding state in bitsStateSim.
               *
               * @this {Keyboard}
               * @param {number} [bitState] is the bit in bitsStateSim that may have changed, if known; undefined if not
               */
              Keyboard.prototype.updateLEDs = function(bitState)
              {
                  var control;
                  for (var sBinding in Keyboard.LEDSTATES) {
                      var id = "led-" + sBinding;
                      var bitLED = Keyboard.LEDSTATES[sBinding];
                      if ((!bitState || bitState == bitLED) && (control = this.bindings[id])) {
                          this.setLED(control, !!(this.bitsStateSim & bitLED));
                      }
                  }
              };
              
              /**
               * toggleCapsLock()
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.toggleCapsLock = function()
              {
                  this.addActiveKey(Keyboard.SIMCODE.CAPS_LOCK, true);
              };
              
              /**
               * toggleNumLock()
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.toggleNumLock = function()
              {
                  this.addActiveKey(Keyboard.SIMCODE.NUM_LOCK, true);
              };
              
              /**
               * toggleScrollLock()
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.toggleScrollLock = function()
              {
                  this.addActiveKey(Keyboard.SIMCODE.SCROLL_LOCK, true);
              };
              
              /**
               * updateShiftState(simCode, fSim, fDown)
               *
               * For non-locking shift keys, this function is straightforward: when fDown is true, the corresponding bitState
               * is set, and when fDown is false, it's cleared.  However, for LOCK keys, fDown true means toggle, and fDown false
               * means no change.
               *
               * @this {Keyboard}
               * @param {number} simCode (includes any ONDOWN and/or ONRIGHT modifiers)
               * @param {boolean} [fSim] is true to update simulated state only
               * @param {boolean|null} [fDown] is true for down, false for up, undefined for toggle
               * @return {boolean} true if simCode was a shift key, false if not
               */
              Keyboard.prototype.updateShiftState = function(simCode, fSim, fDown)
              {
                  if (Keyboard.SIMCODES[simCode]) {
                      var fRight = (Math.floor(simCode / 1000) & 2);
                      var bitState = Keyboard.KEYSTATES[simCode] || 0;
                      if (bitState) {
                          if (fRight && !(bitState & Keyboard.STATE.ALL_RIGHT)) {
                              bitState >>= 1;
                          }
                          if (bitState & Keyboard.STATE.ALL_LOCKS) {
                              if (fDown === false) return true;
                              fDown = null;
                          }
                          if (fDown == null) {        // ie, null or undefined
                              fDown = !((fSim? this.bitsStateSim : this.bitsState) & bitState);
                          }
                          else if (!fDown) {
                              /*
                               * In current webkit browsers, pressing and then releasing both left and right shift keys together
                               * (or both alt keys, or both cmd/windows keys, or presumably both ctrl keys) results in 4 events, as
                               * you would expect, but 3 of the 4 are "down" events; only the last of the 4 is an "up" event.
                               *
                               * Perhaps this is a browser accessibility feature (ie, deliberately suppressing the "up" event
                               * of one of the shift keys to implement a "sticky shift mode"?), but in any case, to maintain our
                               * internal consistency, if this is an "up" event and the shift state bit is any of ALL_SHIFT, then
                               * we set it to ALL_SHIFT, so that we'll automatically clear ALL shift states.
                               *
                               * TODO: The only downside to this work-around is that the simulation will still think a shift key is
                               * down.  So in effect, we have enabled a "sticky shift mode" inside the simulation, whether or not that
                               * was the browser's intent.  To fix that, we would have to identify the shift key that never went up
                               * and simulate the "up".  That's more work than I think the problem merits.  The user just needs to tap
                               * a single shift key to get out that mode.
                               */
                              if (bitState & Keyboard.STATE.ALL_SHIFT) bitState = Keyboard.STATE.ALL_SHIFT;
                          }
                          if (!fSim) {
                              this.bitsState &= ~bitState;
                              if (fDown) this.bitsState |= bitState;
                          } else {
                              this.bitsStateSim &= ~bitState;
                              if (fDown) this.bitsStateSim |= bitState;
                              this.updateLEDs(bitState);
                          }
                          return true;
                      }
                  }
                  return false;
              };
              
              /**
               * addActiveKey(simCode, fPress)
               *
               * @this {Keyboard}
               * @param {number} simCode
               * @param {boolean} [fPress]
               */
              Keyboard.prototype.addActiveKey = function(simCode, fPress)
              {
                  if (!Keyboard.SIMCODES[simCode]) {
                      if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                          this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): unrecognized", true);
                      }
                      return;
                  }
              
                  /*
                   * Ignore all active keys if the CPU is not running.
                   */
                  if (!this.cpu || !this.cpu.isRunning()) return;
              
                  /*
                   * If this simCode is in the KEYSTATE table, then stop all repeating.
                   */
                  if (Keyboard.KEYSTATES[simCode] && this.aKeysActive.length) {
                      if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
                  }
              
                  var key;
                  for (var i = 0; i < this.aKeysActive.length; i++) {
                      key = this.aKeysActive[i];
                      if (key.simCode == simCode) {
                          /*
                           * This key is already active, so if this a "down" request (or a "press" for a key we already
                           * processed as a "down"), ignore it.
                           */
                          if (!fPress || key.nRepeat >= 0) {
                              i = -1;
                              break;
                          }
                          if (i > 0) {
                              if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
                              this.aKeysActive.splice(i, 1);
                          }
                          break;
                      }
                  }
              
                  if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): " + (i < 0? "already active" : (i == this.aKeysActive.length? "adding" : "updating")), true);
                  }
              
                  if (i < 0) return;
              
                  if (i == this.aKeysActive.length) {
                      key = {};
                      key.simCode = simCode;
                      key.bitsState = this.bitsState;
                      this.findBinding(simCode, "key", true);
                      i++;
                  }
                  if (i > 0) {
                      this.aKeysActive.splice(0, 0, key);
                  }
              
                  key.fDown = true;
                  key.nRepeat = (fPress? -1: (Keyboard.KEYSTATES[simCode]? 0 : 1));
              
                  this.updateActiveKey(key);
              };
              
              /**
               * checkActiveKey()
               *
               * @this {Keyboard}
               * @return {number} simCode of active key, 0 if none
               */
              Keyboard.prototype.checkActiveKey = function()
              {
                  return this.aKeysActive.length? this.aKeysActive[0].simCode : 0;
              };
              
              /**
               * checkActiveKeyShift()
               *
               * @this {Keyboard}
               * @return {number|null} bitsState for active key, null if none
               *
              Keyboard.prototype.checkActiveKeyShift = function()
              {
                  return this.aKeysActive.length? this.aKeysActive[0].bitsState : null;
              };
               */
              
              /**
               * isAlphaKey(code)
               *
               * @this {Keyboard}
               * @param {number} code
               * @returns {boolean} true if alpha key, false if not
               */
              Keyboard.prototype.isAlphaKey = function(code)
              {
                  return (code >= Keyboard.ASCII.A && code <= Keyboard.ASCII.Z || code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z);
              };
              
              /**
               * toUpperKey(code)
               *
               * @this {Keyboard}
               * @param {number} code
               * @returns {number}
               */
              Keyboard.prototype.toUpperKey = function(code)
              {
                  if (code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z) {
                      code -= (Keyboard.ASCII.a - Keyboard.ASCII.A);
                  }
                  return code;
              };
              
              /**
               * clearActiveKeys()
               *
               * Force all active keys to "self-deactivate".
               *
               * TODO: Consider limiting this to non-shift keys only.
               *
               * @this {Keyboard}
               */
              Keyboard.prototype.clearActiveKeys = function()
              {
                  for (var i = 0; i < this.aKeysActive.length; i++) {
                      var key = this.aKeysActive[i];
                      key.fDown = false;
                      if (key.nRepeat > 0) key.nRepeat = 0;
                  }
              };
              
              /**
               * removeActiveKey(simCode, fFlush)
               *
               * @param {number} simCode
               * @param {boolean} [fFlush] is true whenever the key must be removed, independent of other factors
               * @return {boolean} true if successfully removed, false if not
               */
              Keyboard.prototype.removeActiveKey = function(simCode, fFlush)
              {
                  if (!Keyboard.SIMCODES[simCode]) {
                      if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                          this.printMessage("removeActiveKey(" + simCode + "): unrecognized", true);
                      }
                      return false;
                  }
              
                  /*
                   * Ignore all active keys if the CPU is not running.
                   */
                  if (!fFlush && (!this.cpu || !this.cpu.isRunning())) return false;
              
                  var fRemoved = false;
                  for (var i = 0; i < this.aKeysActive.length; i++) {
                      var key = this.aKeysActive[i];
                      if (key.simCode == simCode || key.simCode == Keyboard.SHIFTED_KEYCODES[simCode]) {
                          this.aKeysActive.splice(i, 1);
                          if (key.timer) clearTimeout(key.timer);
                          if (key.fDown && !fFlush) this.keySimulate(key.simCode, false);
                          this.findBinding(simCode, "key", false);
                          fRemoved = true;
                          break;
                      }
                  }
                  if (!COMPILED && !fFlush && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("removeActiveKey(" + simCode + "): " + (fRemoved? "removed" : "not active"), true);
                  }
                  if (!this.aKeysActive.length && this.fToggleCapsLock) {
                      if (!COMPILED) this.printMessage("removeActiveKey(): inverting caps-lock now", Messages.KEYS);
                      this.updateShiftState(Keyboard.SIMCODE.CAPS_LOCK);
                      this.fToggleCapsLock = false;
                  }
                  return fRemoved;
              };
              
              /**
               * updateActiveKey(key, msTimer)
               *
               * @param {Object} key
               * @param {number} [msTimer]
               */
              Keyboard.prototype.updateActiveKey = function(key, msTimer)
              {
                  /*
                   * All active keys are automatically removed once the CPU stops running.
                   */
                  if (!this.cpu || !this.cpu.isRunning()) {
                      this.removeActiveKey(key.simCode, true);
                      return;
                  }
              
                  if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage((msTimer? '\n' : "") + "updateActiveKey(" + key.simCode + (msTimer? "," + msTimer + "ms" : "") + "): " + (key.fDown? "down" : "up"), true);
                  }
              
                  this.keySimulate(key.simCode, key.fDown);
              
                  if (!key.nRepeat) return;
              
                  var ms;
                  if (key.nRepeat < 0) {
                      if (!key.fDown) {
                          this.removeActiveKey(key.simCode);
                          return;
                      }
                      key.fDown = false;
                      ms = this.msAutoRelease;
                  }
                  else {
                      ms = (key.nRepeat++ == 1? this.msAutoRepeat : this.msNextRepeat);
                  }
                  key.timer = setTimeout(function(kbd) {
                      return function onUpdateActiveKey() {
                          kbd.updateActiveKey(key, ms);
                      };
                  }(this), ms);
              };
              
              /**
               * getSimCode(keyCode)
               *
               * @this {Keyboard}
               * @param {number} keyCode
               * @param {boolean} fShifted
               * @return {number} simCode
               */
              Keyboard.prototype.getSimCode = function(keyCode, fShifted)
              {
                  var code;
                  var simCode = keyCode;
              
                  if (keyCode >= Keyboard.ASCII.A && keyCode <= Keyboard.ASCII.Z) {
                      if (!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
                          simCode = keyCode + (Keyboard.ASCII.a - Keyboard.ASCII.A);
                      }
                  }
                  else if (keyCode >= Keyboard.ASCII.a && keyCode <= Keyboard.ASCII.z) {
                      if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
                          simCode = keyCode - (Keyboard.ASCII.a - Keyboard.ASCII.A);
                      }
                  }
                  else if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT)) == fShifted) {
                      if (code = Keyboard.SHIFTED_KEYCODES[keyCode]) {
                          simCode = code;
                      }
                  }
                  else {
                      if (code = Keyboard.STUPID_KEYCODES[keyCode]) {
                          simCode = code;
                      }
                  }
                  return simCode;
              };
              
              /**
               * onFocusChange(fFocus)
               *
               * @this {Keyboard}
               * @param {boolean} fFocus is true if gaining focus, false if losing it
               */
              Keyboard.prototype.onFocusChange = function(fFocus)
              {
                  if (this.fHasFocus != fFocus && !COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("onFocusChange(" + (fFocus? "true" : "false") + ")", true);
                  }
                  this.fHasFocus = fFocus;
                  /*
                   * Since we can't be sure of any shift states after losing focus, we clear them all.
                   */
                  if (!fFocus) this.bitsState &= ~Keyboard.STATE.ALL_SHIFT;
              };
              
              /**
               * onKeyDown(event, fDown)
               *
               * @this {Keyboard}
               * @param {Object} event
               * @param {boolean} fDown is true for a keyDown event, false for a keyUp event
               * @return {boolean} true to pass the event along, false to consume it
               */
              Keyboard.prototype.onKeyDown = function(event, fDown)
              {
                  var fPass = true;
                  var fPress = false;
                  var fIgnore = false;
              
                  var keyCode = event.keyCode;
              
                  /*
                   * Although it would be nice to pay attention ONLY to these "up" and "down" events, and ignore "press"
                   * events, iOS devices force us to process "press" events, because they don't give us shift-key events,
                   * so we have to infer the shift state from the character code in the "press" event.
                   *
                   * So, to seamlessly blend "up" and "down" events with "press" events, we must convert any keyCodes we
                   * receive here to a compatibly shifted simCode.
                   */
                  var simCode = this.getSimCode(keyCode, true);
              
                  if (this.fEscapeDisabled && simCode == Keyboard.ASCII['`']) {
                      keyCode = simCode = Keyboard.KEYCODE.ESC;
                  }
              
                  if (Keyboard.SIMCODES[keyCode + Keyboard.KEYCODE.ONDOWN]) {
              
                      simCode += Keyboard.KEYCODE.ONDOWN;
                      if (event.location == Keyboard.LOCATION.RIGHT) {
                          simCode += Keyboard.KEYCODE.ONRIGHT;
                      }
              
                      if (this.updateShiftState(simCode, false, fDown)) {
              
                          if (keyCode == Keyboard.KEYCODE.CAPS_LOCK || keyCode == Keyboard.KEYCODE.NUM_LOCK || keyCode == Keyboard.KEYCODE.SCROLL_LOCK) {
                              /*
                               * FYI, "lock" keys generate a "down" event ONLY when getting locked and an "up" event ONLY
                               * when getting unlocked--which is a little odd, since the key did go UP and DOWN each time.
                               *
                               * We must treat each event like a "down", and also as a "press", so that addActiveKey() will
                               * automatically generate both the "make" and "break".
                               *
                               * Of course, there have to be exceptions, most notably MSIE, which sends both "up" and down"
                               * on every press, so there's no need for trickery.
                               */
                              if (!this.fMSIE) {
                                  fDown = fPress = true;
                              }
                          }
                          /*
                           * As a safeguard, whenever the CMD key goes up, clear all active keys, because there appear to be
                           * cases where we don't always get notification of a CMD key's companion key going up (this probably
                           * overlaps with most if not all situations where we also lose focus).
                           */
                          if (!fDown && (keyCode == Keyboard.KEYCODE.CMD || keyCode == Keyboard.KEYCODE.RCMD)) {
                              this.clearActiveKeys();
                          }
                      }
                      else {
                          /*
                           * Here we have all the non-shift keys in the ONDOWN category; eg, BS, TAB, ESC, UP, DOWN, LEFT, RIGHT,
                           * and many more.
                           *
                           * For various reasons (some of which are discussed below), we don't want to pass these on (ie, we want
                           * to suppress their "press" event), which means we must perform all key simulation on the "up" and "down"
                           * events.
                           *
                           * Regarding BS: I never want the browser to act on BS, since it does double-duty as the BACK button,
                           * leaving the current page.
                           *
                           * Regarding TAB: If I don't consume TAB on the "down" event, then that's all I'll see, because the browser
                           * act on it by giving focus to the next control.
                           *
                           * Regarding ESC: This key generates "down" and "up" events (LOTS of "down" events for that matter), but no
                           * "press" event.
                           */
              
                          /*
                           * HACK for simulating CTRL_BREAK using CTRL_DEL (Mac) or CTRL_BS (Windows)
                           */
                          if (keyCode == Keyboard.KEYCODE.BS && (this.bitsState & (Keyboard.STATE.CTRL|Keyboard.STATE.ALT)) == Keyboard.STATE.CTRL) {
                              simCode = Keyboard.SIMCODE.CTRL_BREAK;
                          }
              
                          /*
                           * There are a number of other common key sequences that interfere with our machines; for example,
                           * the up/down arrows have a "default" behavior of scrolling the web page up and down, which is
                           * definitely NOT a behavior we want.  Since we mark those keys as ONDOWN, we'll catch them all here.
                           */
                          fPass = false;
                      }
                  }
                  else {
                      /*
                       * When I have defined system-wide CTRL-key sequences to perform common editing operations (eg, CTRL_W
                       * and CTRL_Z to scroll pages of text), the browser likes to act on those operations, so let's set fPass
                       * to false to prevent that.
                       *
                       * Also, we don't want to set fIgnore in such cases, because the browser may not give us a press event for
                       * these CTRL-key sequences, so we can't risk ignoring them.
                       */
                      if (Keyboard.SIMCODES[simCode] && (this.bitsState & (Keyboard.STATE.CTRLS | Keyboard.STATE.ALTS))) {
                          fPass = false;
                      }
              
                      /*
                       * Don't simulate any key not explicitly marked ONDOWN, as well as any key sequence with the CMD key held.
                       */
                      if (!this.fAllDown && fPass && fDown || !!(this.bitsState & Keyboard.STATE.CMDS)) fIgnore = true;
                  }
              
                  if (!fPass) {
                      event.preventDefault();
                  }
              
                  if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("\nonKey" + (fDown? "Down" : "Up") + "(" + keyCode + "): " + (fIgnore? "ignore" : (fPass? "true" : "false")), true);
                  }
              
                  /*
                   * Mobile (eg, iOS) keyboards don't fully support onKeyDown/onKeyUp events; for example, they usually
                   * don't generate ANY events when a shift key is pressed, and even for normal keys, they seem to generate
                   * rapid (ie, fake) "up" and "down" events around "press" events, probably more to satisfy compatibility
                   * issues rather than making a serious effort to indicate when a key ACTUALLY went down or up.
                   */
                  if (!fIgnore && (!this.fMobile || !fPass)) {
                      if (fDown) {
                          this.addActiveKey(simCode, fPress);
                      } else {
                          if (!this.removeActiveKey(simCode)) {
                              var code = this.getSimCode(keyCode, false);
                              if (code != simCode) this.removeActiveKey(code);
                          }
                      }
                  }
              
                  return fPass;
              };
              
              /**
               * onKeyPress(event)
               *
               * @this {Keyboard}
               * @param {Object} event
               * @return {boolean} true to pass the event along, false to consume it
               */
              Keyboard.prototype.onKeyPress = function(event)
              {
                  event = event || window.event;
                  var keyCode = event.which || event.keyCode;
              
                  if (this.fAllDown) {
                      var simCode = this.checkActiveKey();
                      if (simCode && this.isAlphaKey(simCode) && this.isAlphaKey(keyCode) && simCode != keyCode) {
                          if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                              this.printMessage("onKeyPress(" + keyCode + ") out of sync with " + simCode + ", invert caps-lock", true);
                          }
                          this.fToggleCapsLock = true;
                          keyCode = simCode;
                      }
                  }
              
                  /*
                   * Let's stop any injection currently in progress, too
                   */
                  this.sInjectBuffer = "";
              
                  var fPass = !Keyboard.SIMCODES[keyCode] || !!(this.bitsState & Keyboard.STATE.CMD);
              
                  if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("\nonKeyPress(" + keyCode + "): " + (fPass? "true" : "false"), true);
                  }
              
                  if (!fPass) {
                      this.addActiveKey(keyCode, true);
                  }
              
                  return fPass;
              };
              
              /**
               * keySimulate(simCode, fDown)
               *
               * @this {Keyboard}
               * @param {number} simCode
               * @param {boolean} fDown
               * @return {boolean} true if successfully simulated, false if unrecognized/unsupported key
               */
              Keyboard.prototype.keySimulate = function(simCode, fDown)
              {
                  var fSimulated = false;
              
                  this.updateShiftState(simCode, true, fDown);
              
                  var wCode = Keyboard.SIMCODES[simCode] || Keyboard.SIMCODES[simCode + Keyboard.KEYCODE.ONDOWN];
              
                  if (wCode !== undefined) {
              
                      /*
                       * Hack to transform the IBM "BACKSPACE" key (which we normally map to KEYCODE_DELETE) to the IBM "DEL" key
                       * whenever both CTRL and ALT are pressed as well, so that it's easier to simulate that old favorite: CTRL_ALT_DEL
                       */
                      if (wCode == Keyboard.SCANCODE.BS) {
                          if ((this.bitsState & (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) == (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) {
                              wCode = Keyboard.SCANCODE.NUM_DEL;
                          }
                      }
              
                      var abScanCodes = [];
                      var bCode = wCode & 0xff;
                      abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
              
                      var fAlpha = (simCode >= Keyboard.ASCII.A && simCode <= Keyboard.ASCII.Z || simCode >= Keyboard.ASCII.a && simCode <= Keyboard.ASCII.z);
              
                      while (wCode >>>= 8) {
                          var bShift = 0;
                          var bScan = wCode & 0xff;
                          /*
                           * TODO: The handling of SIMCODE entries with "extended" codes still needs to be tested, and
                           * moreover, if any of them need to perform any shift-state modifications, those modifications
                           * may need to be encoded differently.
                           */
                          if (bCode == Keyboard.SCANCODE.EXTEND1 || bCode == Keyboard.SCANCODE.EXTEND2) {
                              abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
                              continue;
                          }
                          if (bScan == Keyboard.SCANCODE.SHIFT) {
                              if (!(this.bitsStateSim & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT))) {
                                  if (!(this.bitsStateSim & Keyboard.STATE.CAPS_LOCK) || !fAlpha) {
                                      bShift = bScan;
                                  }
                              }
                          } else if (bScan == Keyboard.SCANCODE.CTRL) {
                              if (!(this.bitsStateSim & (Keyboard.STATE.CTRL | Keyboard.STATE.RCTRL))) {
                                  bShift = bScan;
                              }
                          } else if (bScan == Keyboard.SCANCODE.ALT) {
                              if (!(this.bitsStateSim & (Keyboard.STATE.ALT | Keyboard.STATE.RALT))) {
                                  bShift = bScan;
                              }
                          } else {
                              abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
              
                          }
                          if (bShift) {
                              if (fDown)
                                  abScanCodes.unshift(bShift);
                              else
                                  abScanCodes.push(bShift | Keyboard.SCANCODE.BREAK);
                          }
                      }
              
                      for (var i = 0; i < abScanCodes.length; i++) {
                          this.addScanCode(abScanCodes[i]);
                      }
              
                      fSimulated = true;
                  }
              
                  if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                      this.printMessage("keySimulate(" + simCode + "," + (fDown? "down" : "up") + "): " + (fSimulated? "true" : "false"), true);
                  }
              
                  return fSimulated;
              };
              
              /**
               * Keyboard.init()
               *
               * This function operates on every HTML element of class "keyboard", extracting the
               * JSON-encoded parameters for the Keyboard constructor from the element's "data-value"
               * attribute, invoking the constructor to create a Keyboard component, and then binding
               * any associated HTML controls to the new component.
               */
              Keyboard.init = function()
              {
                  var aeKbd = Component.getElementsByClass(window.document, PCJSCLASS, "keyboard");
                  for (var iKbd = 0; iKbd < aeKbd.length; iKbd++) {
                      var eKbd = aeKbd[iKbd];
                      var parmsKbd = Component.getComponentParms(eKbd);
                      var kbd = new Keyboard(parmsKbd);
                      Component.bindComponentControls(kbd, eKbd, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every Keyboard module on the page.
               */
              web.onInit(Keyboard.init);
              
              if (typeof module !== 'undefined') module.exports = Keyboard;
              
            • memory.js
              /**
               * @fileoverview Implements the PCjs "physical" Memory component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var X86         = require("./x86");
              }
              
              /**
               * @class DataView
               * @property {function(number,boolean):number} getUint8
               * @property {function(number,number,boolean)} setUint8
               * @property {function(number,boolean):number} getUint16
               * @property {function(number,number,boolean)} setUint16
               * @property {function(number,boolean):number} getInt32
               * @property {function(number,number,boolean)} setInt32
               */
              
              var littleEndian = (TYPEDARRAYS? (function() {
                  var buffer = new ArrayBuffer(2);
                  new DataView(buffer).setUint16(0, 256, true);
                  return new Uint16Array(buffer)[0] === 256;
              })() : false);
              
              /**
               * Memory(addr, used, size, type, controller)
               *
               * The Bus component allocates Memory objects so that each has a memory buffer with a
               * block-granular starting address and an address range equal to bus.nBlockSize; however,
               * the size of any given Memory object's underlying buffer can be either zero or bus.nBlockSize;
               * memory read/write functions for empty (buffer-less) blocks are mapped to readNone/writeNone.
               *
               * The Bus allocates empty blocks for the entire address space during initialization, so that
               * any reads/writes to undefined addresses will have no effect.  Later, the ROM and RAM
               * components will ask the Bus to allocate memory for specific ranges, and the Bus will allocate
               * as many new blockSize Memory objects as the ranges require.  Partial Memory blocks could
               * also be supported in theory, but in practice, they're not.
               *
               * Because Memory blocks now allow us to have a "sparse" address space, we could choose to
               * take the memory hit of allocating 4K arrays per block, where each element stores only one byte,
               * instead of the more frugal but slightly slower approach of allocating arrays of 32-bit dwords
               * (LONGARRAYS) and shifting/masking bytes/words to/from dwords; in theory, byte accesses would
               * be faster and word accesses somewhat less faster.
               *
               * However, preliminary testing of that feature (FATARRAYS) did not yield significantly faster
               * performance, so it is OFF by default to minimize our memory consumption.  Using TYPEDARRAYS
               * would seem best, but as discussed in defines.js, it's off by default, because it doesn't perform
               * as well as LONGARRAYS; the other advantage of TYPEDARRAYS is that it should theoretically use
               * about 1/2 the memory of LONGARRAYS (32-bit elements vs 64-bit numbers), but I value speed over
               * size at this point.  Also, not all JavaScript implementations support TYPEDARRAYS (IE9 is probably
               * the only real outlier: it lacks typed arrays but otherwise has all the necessary HTML5 support).
               *
               * WARNING: Since Memory blocks are low-level objects that have no UI requirements, they
               * do not inherit from the Component class, so if you want to use any Component class methods,
               * such as Component.assert(), use the corresponding Debugger methods instead (assuming a debugger
               * is available).
               *
               * @constructor
               * @param {number|null} [addr] of lowest used address in block
               * @param {number} [used] portion of block in bytes (0 for none); must be a multiple of 4
               * @param {number} [size] of block's buffer in bytes (0 for none); must be a multiple of 4
               * @param {number} [type] is one of the Memory.TYPE constants (default is Memory.TYPE.NONE)
               * @param {Object} [controller] is an optional memory controller component
               * @param {X86CPU} [cpu] is required for UNPAGED memory blocks, so that the CPU can map it to a PAGED block
               */
              function Memory(addr, used, size, type, controller, cpu)
              {
                  var i;
                  this.id = (Memory.idBlock += 2);
                  this.adw = null;
                  this.offset = 0;
                  this.addr = addr;
                  this.used = used;
                  this.size = size || 0;
                  this.type = type || Memory.TYPE.NONE;
                  this.fReadOnly = (type == Memory.TYPE.ROM);
                  this.controller = null;
                  this.cpu = cpu;
                  this.fDirty = this.fDirtyEver = false;
                  this.setPhysBlock();
              
                  if (BACKTRACK) {
                      if (!size || controller) {
                          this.fModBackTrack = false;
                          this.readBackTrack = this.readBackTrackNone;
                          this.writeBackTrack = this.writeBackTrackNone;
                          this.modBackTrack = this.modBackTrackNone;
                      } else {
                          this.fModBackTrack = true;
                          this.readBackTrack = this.readBackTrackIndex;
                          this.writeBackTrack = this.writeBackTrackIndex;
                          this.modBackTrack = this.modBackTrackIndex;
                          this.abtIndexes = new Array(size);
                          for (i = 0; i < size; i++) this.abtIndexes[i] = 0;
                      }
                  }
              
                  /*
                   * For empty memory blocks, all we need to do is ensure all access functions
                   * are mapped to "none" handlers (or "unpaged" handlers if paging is enabled).
                   */
                  if (!size) {
                      this.setAccess();
                      return;
                  }
              
                  /*
                   * When a controller is specified, the controller must provide a buffer,
                   * via getMemoryBuffer(), and memory access functions, via getMemoryAccess().
                   */
                  if (controller) {
                      this.controller = controller;
                      var a = controller.getMemoryBuffer(addr);
                      this.adw = a[0];
                      this.offset = a[1];
                      this.setAccess(controller.getMemoryAccess());
                      return;
                  }
              
                  /*
                   * This is the normal case: allocate a buffer that provides 8 bits of data per address;
                   * no controller is required because our default memory access functions (see afnMemory)
                   * know how to deal with this simple 1-1 mapping of addresses to bytes and words.
                   *
                   * TODO: Consider initializing the memory array to random (or pseudo-random) values in DEBUG
                   * mode; pseudo-random might be best, to help make any bugs reproducible.
                   */
                  if (TYPEDARRAYS) {
                      this.buffer = new ArrayBuffer(size);
                      this.dv = new DataView(this.buffer, 0, size);
                      /*
                       * If littleEndian is true, we can use ab[], aw[] and adw[] directly; well, we can use them
                       * whenever the offset is a multiple of 1, 2 or 4, respectively.  Otherwise, we must fallback to
                       * dv.getUint8()/dv.setUint8(), dv.getUint16()/dv.setUint16() and dv.getInt32()/dv.setInt32().
                       */
                      this.ab = new Uint8Array(this.buffer, 0, size);
                      this.aw = new Uint16Array(this.buffer, 0, size >> 1);
                      this.adw = new Int32Array(this.buffer, 0, size >> 2);
                      this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
                  } else {
                      if (FATARRAYS) {
                          this.ab = new Array(size);
                      } else {
                          /*
                           * NOTE: This is the default mode of operation (!TYPEDARRAYS && !FATARRAYS), because it
                           * seems to provide the best performance; and although in theory, that performance might
                           * come at twice the overhead of TYPEDARRAYS, it's increasingly likely that the JavaScript
                           * runtime will notice that all we ever store are 32-bit values, and optimize accordingly.
                           */
                          this.adw = new Array(size >> 2);
                          for (i = 0; i < this.adw.length; i++) this.adw[i] = 0;
                      }
                      this.setAccess(Memory.afnMemory);
                  }
              }
              
              /*
               * Basic memory types
               *
               * RAM is the most conventional memory type, providing full read/write capability to x86-compatible (ie,
               * 'little endian") storage.  ROM is equally conventional, except that the fReadOnly property is set,
               * disabling writes.  VIDEO is treated exactly like RAM, unless a controller is provided.  Both RAM and
               * VIDEO memory are always considered writable, and even ROM can be written using the Bus setByteDirect()
               * interface (which in turn uses the Memory writeByteDirect() interface), allowing the ROM component to
               * initialize its own memory.  The CTRL type is used to identify memory-mapped devices that do not need
               * any default storage and always provide their own controller.
               *
               * UNPAGED and PAGED blocks are created by the CPU when paging is enabled; the role of an UNPAGED block
               * is simply to perform page translation and replace itself with a PAGED block, which redirects read/write
               * requests to the physical page located during translation.  UNPAGED and PAGED blocks are considered
               * "logical" blocks that don't contain any storage of their own; all other block types represent "physical"
               * memory (or a memory-mapped device).
               *
               * Unallocated regions of the address space contain a special memory block of type NONE that contains
               * no storage.  Mapping every addressible location to a memory block allows all accesses to be routed in
               * exactly the same manner, without resorting to any range or processor checks.
               *
               * Originally, the Debugger always went through the Bus interfaces, and could therefore modify ROMs as well,
               * but with the introduction of protected mode memory segmentation (and later paging), where logical and
               * phsycial addresses were no longer the same, that is no longer true.  For coherency, all Debugger memory
               * accesses now go through the X86Seg and X86CPU memory interfaces, so that the user sees the same segment
               * and page translation that the CPU sees.  However, the Debugger uses special "fSuppress" flags to prevent
               * those X86 interfaces from triggering segment and/or page faults when invalid or not-present segments
               * or pages are accessed.
               *
               * These types are not mutually exclusive.  For example, VIDEO memory could be allocated as RAM, with or
               * without a custom controller (the original Monochrome and CGA video cards used read/write storage that
               * was indistiguishable from RAM), and CTRL memory could be allocated as an empty block of any type, with
               * a custom controller.  A few types are required for certain features (eg, ROM is required if you want
               * read-only memory), but the larger purpose of these types is to help document the caller's intent and to
               * provide the Control Panel with the ability to highlight memory regions accordingly.
               */
              Memory.TYPE = {
                  NONE:       0,
                  RAM:        1,
                  ROM:        2,
                  VIDEO:      3,
                  CTRL:       4,
                  UNPAGED:    5,
                  PAGED:      6,
                  NAMES:      ["NONE",  "RAM",  "ROM",   "VIDEO", "H/W", "UNPAGED", "PAGED"],
                  COLORS:     ["black", "blue", "green", "cyan"]
              };
              
              /*
               * Last used block ID (used for debugging only)
               */
              Memory.idBlock = 0;
              
              /**
               * adjustEndian(dw)
               *
               * @param {number} dw
               * @return {number}
               */
              Memory.adjustEndian = function(dw) {
                  if (TYPEDARRAYS && !littleEndian) {
                      dw = (dw << 24) | ((dw << 8) & 0x00ff0000) | ((dw >> 8) & 0x0000ff00) | (dw >>> 24);
                  }
                  return dw;
              };
              
              Memory.prototype = {
                  constructor: Memory,
                  parent: null,
                  /**
                   * clone(mem, type)
                   *
                   * Converts the current Memory block (this) into a clone of the given Memory block (mem),
                   * and optionally overrides the current block's type with the specified type.
                   *
                   * @this {Memory}
                   * @param {Memory} mem
                   * @param {number} [type]
                   */
                  clone: function(mem, type) {
                      /*
                       * Original memory block IDs are even; cloned memory block IDs are odd;
                       * the original ID of the current block is lost, but that's OK, since it was presumably
                       * produced merely to become a clone.
                       */
                      this.id = mem.id | 0x1;
                      this.used = mem.used;
                      this.size = mem.size;
                      if (type) {
                          this.type = type;
                          this.fReadOnly = (type == Memory.TYPE.ROM);
                      }
                      if (TYPEDARRAYS) {
                          this.buffer = mem.buffer;
                          this.dv = mem.dv;
                          this.ab = mem.ab;
                          this.aw = mem.aw;
                          this.adw = mem.adw;
                          this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
                      } else {
                          if (FATARRAYS) {
                              this.ab = mem.ab;
                          } else {
                              this.adw = mem.adw;
                          }
                          this.setAccess(Memory.afnMemory);
                      }
                  },
                  /**
                   * save()
                   *
                   * This gets the contents of a Memory block as an array of 32-bit values;
                   * used by Bus.saveMemory(), which in turn is called by X86CPU.save().
                   *
                   * Memory blocks with custom memory controllers do NOT save their contents;
                   * that's the responsibility of the controller component.
                   *
                   * @this {Memory}
                   * @return {Array|Int32Array|null}
                   */
                  save: function() {
                      var adw, i;
                      if (this.controller) {
                          adw = null;
                      }
                      else if (FATARRAYS) {
                          adw = new Array(this.size >> 2);
                          var off = 0;
                          for (i = 0; i < adw.length; i++) {
                              adw[i] = this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
                              off += 4;
                          }
                      }
                      else if (TYPEDARRAYS) {
                          /*
                           * It might be tempting to just return a copy of Int32Array(this.buffer, 0, this.size >> 2),
                           * but we can't be sure of the "endianness" of an Int32Array -- which would be OK if the array
                           * was always saved/restored on the same machine, but there's no guarantee of that, either.
                           * So we use getInt32() and require little-endian values.
                           *
                           * Moreover, an Int32Array isn't treated by JSON.stringify() and JSON.parse() exactly like
                           * a normal array; it's serialized as an Object rather than an Array, so it lacks a "length"
                           * property and causes problems for State.store() and State.parse().
                           */
                          adw = new Array(this.size >> 2);
                          for (i = 0; i < adw.length; i++) {
                              adw[i] = this.dv.getInt32(i << 2, true);
                          }
                      }
                      else {
                          adw = this.adw;
                      }
                      return adw;
                  },
                  /**
                   * restore(adw)
                   *
                   * This restores the contents of a Memory block from an array of 32-bit values;
                   * used by Bus.restoreMemory(), which is called by X86CPU.restore(), after all other
                   * components have been restored and thus all Memory blocks have been allocated
                   * by their respective components.
                   *
                   * @this {Memory}
                   * @param {Array|null} adw
                   * @return {boolean} true if successful, false if block size mismatch
                   */
                  restore: function(adw) {
                      if (this.controller) {
                          return (adw == null);
                      }
                      /*
                       * At this point, it's a consistency error for adw to be null; it's happened once already,
                       * when there was a restore bug in the Video component that added the frame buffer at the video
                       * card's "spec'ed" address instead of the programmed address, so there were no controller-owned
                       * memory blocks installed at the programmed address, and so we arrived here at a block with
                       * no controller AND no data.
                       */
                      Component.assert(adw != null);
                      if (adw && this.size == adw.length << 2) {
                          var i;
                          if (FATARRAYS) {
                              var off = 0;
                              for (i = 0; i < adw.length; i++) {
                                  this.ab[off] = adw[i] & 0xff;
                                  this.ab[off + 1] = (adw[i] >> 8) & 0xff;
                                  this.ab[off + 2] = (adw[i] >> 16) & 0xff;
                                  this.ab[off + 3] = (adw[i] >> 24) & 0xff;
                                  off += 4;
                              }
                          } else if (TYPEDARRAYS) {
                              for (i = 0; i < adw.length; i++) {
                                  this.dv.setInt32(i << 2, adw[i], true);
                              }
                          } else {
                              this.adw = adw;
                          }
                          this.fDirty = true;
                          return true;
                      }
                      return false;
                  },
                  /**
                   * setAccess(afn)
                   *
                   * If no function table is specified, a default is selected based on the Memory type.
                   *
                   * @this {Memory}
                   * @param {Array.<function()>} [afn] function table
                   */
                  setAccess: function(afn) {
                      if (!afn) {
                          if (this.type == Memory.TYPE.UNPAGED) {
                              afn = Memory.afnUnpaged;
                          }
                          else if (this.type == Memory.TYPE.PAGED) {
                              afn = Memory.afnPaged;
                          } else {
                              Component.assert(this.type == Memory.TYPE.NONE);
                              afn = Memory.afnNone;
                          }
                      }
                      this.setReadAccess(afn, true);
                      this.setWriteAccess(afn, true);
                  },
                  /**
                   * setReadAccess(afn, fDirect)
                   *
                   * @this {Memory}
                   * @param {Array.<function()>} afn
                   * @param {boolean} [fDirect]
                   */
                  setReadAccess: function(afn, fDirect) {
                      this.readByte = afn[0] || this.readNone;
                      this.readShort = afn[1] || this.readShortDefault;
                      this.readLong = afn[2] || this.readLongDefault;
                      if (fDirect) {
                          this.readByteDirect = afn[0] || this.readNone;
                          this.readShortDirect = afn[1] || this.readShortDefault;
                          this.readLongDirect = afn[2] || this.readLongDefault;
                      }
                  },
                  /**
                   * setWriteAccess(afn, fDirect)
                   *
                   * @this {Memory}
                   * @param {Array.<function()>} afn
                   * @param {boolean} [fDirect]
                   */
                  setWriteAccess: function(afn, fDirect) {
                      this.writeByte = !this.fReadOnly && afn[3] || this.writeNone;
                      this.writeShort = !this.fReadOnly && afn[4] || this.writeShortDefault;
                      this.writeLong = !this.fReadOnly && afn[5] || this.writeLongDefault;
                      if (fDirect) {
                          this.writeByteDirect = afn[3] || this.writeNone;
                          this.writeShortDirect = afn[4] || this.writeShortDefault;
                          this.writeLongDirect = afn[5] || this.writeLongDefault;
                      }
                  },
                  /**
                   * resetReadAccess()
                   *
                   * @this {Memory}
                   */
                  resetReadAccess: function() {
                      this.readByte = this.readByteDirect;
                      this.readShort = this.readShortDirect;
                      this.readLong = this.readLongDirect;
                  },
                  /**
                   * resetWriteAccess()
                   *
                   * @this {Memory}
                   */
                  resetWriteAccess: function() {
                      this.writeByte = this.fReadOnly? this.writeNone : this.writeByteDirect;
                      this.writeShort = this.fReadOnly? this.writeNone : this.writeShortDirect;
                      this.writeLong = this.fReadOnly? this.writeNone : this.writeLongDirect;
                  },
                  /**
                   * setDebugger(dbg, addr, size)
                   *
                   * @this {Memory}
                   * @param {Debugger} dbg
                   * @param {number} addr of block
                   * @param {number} size of block
                   */
                  setDebugger: function(dbg, addr, size) {
                      if (DEBUGGER) {
                          this.dbg = dbg;
                          this.cReadBreakpoints = this.cWriteBreakpoints = 0;
                          Component.assert(this.dbg);
                          this.dbg.redoBreakpoints(addr, size);
                      }
                  },
                  /**
                   * getPageBlock(addr, fWrite)
                   *
                   * @this {Memory}
                   * @param {number} addr
                   * @param {boolean} fWrite (true if called for a write, false if for a read)
                   * @return {Memory}
                   */
                  getPageBlock: function(addr, fWrite) {
                      var block = this.cpu.mapPageBlock(addr, fWrite);
                      /*
                       * If mapPageBlock() fails -- which can easily happen if the page is not present or has insufficient
                       * privileges -- then a fault will be triggered and block will be null.  We still have to return a block,
                       * but it will be our old "unpaged" self.
                       */
                      return block || this;
                  },
                  /**
                   * setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE)
                   *
                   * @this {Memory}
                   * @param {Memory|null} [blockPhys]
                   * @param {Memory|null} [blockPDE]
                   * @param {number} [offPDE]
                   * @param {Memory|null} [blockPTE]
                   * @param {number} [offPTE]
                   */
                  setPhysBlock: function(blockPhys, blockPDE, offPDE, blockPTE, offPTE) {
                      this.blockPhys = blockPhys;
                      this.blockPDE = blockPDE;
                      this.iPDE = offPDE >> 2;    // convert offPDE into iPDE (an adw index)
                      this.blockPTE = blockPTE;
                      this.iPTE = offPTE >> 2;    // convert offPTE into iPTE (an adw index)
                      this.bitPTEDirty = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED | X86.PTE.DIRTY) : 0;
                      this.bitPTEAccessed = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED) : 0;
                  },
                  /**
                   * addBreakpoint(off, fWrite)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {boolean} fWrite
                   */
                  addBreakpoint: function(off, fWrite) {
                      if (DEBUGGER && this.dbg) {
                          if (!fWrite) {
                              if (this.cReadBreakpoints++ === 0) {
                                  this.setReadAccess(Memory.afnChecked);
                              }
                              if (DEBUG) this.dbg.println("read breakpoint added to memory block " + str.toHex(this.addr));
                          }
                          else {
                              if (this.cWriteBreakpoints++ === 0) {
                                  this.setWriteAccess(Memory.afnChecked);
                              }
                              if (DEBUG) this.dbg.println("write breakpoint added to memory block " + str.toHex(this.addr));
                          }
                      }
                  },
                  /**
                   * removeBreakpoint(off, fWrite)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {boolean} fWrite
                   */
                  removeBreakpoint: function(off, fWrite) {
                      if (DEBUGGER && this.dbg) {
                          if (!fWrite) {
                              if (--this.cReadBreakpoints === 0) {
                                  this.resetReadAccess();
                                  if (DEBUG) this.dbg.println("all read breakpoints removed from memory block " + str.toHex(this.addr));
                              }
                              this.dbg.assert(this.cReadBreakpoints >= 0);
                          }
                          else {
                              if (--this.cWriteBreakpoints === 0) {
                                  this.resetWriteAccess();
                                  if (DEBUG) this.dbg.println("all write breakpoints removed from memory block " + str.toHex(this.addr));
                              }
                              this.dbg.assert(this.cWriteBreakpoints >= 0);
                          }
                      }
                  },
                  /**
                   * readNone(off)
                   *
                   * Previously, this always returned 0x00, but the initial memory probe by the Compaq DeskPro 386 ROM BIOS
                   * writes 0x0000 to the first word of every 64Kb block in the nearly 16Mb address space it supports, and
                   * if it reads back 0x0000, it will initially think that LOTS of RAM exists, only to be disappointed later
                   * when it performs a more exhaustive memory test, generating unwanted error messages in the process.
                   *
                   * TODO: Determine if we should have separate readByteNone(), readShortNone() and readLongNone() functions
                   * to return 0xff, 0xffff and 0xffffffff|0, respectively.  This seems sufficient for now, as it seems unlikely
                   * that a system would require nonexistent memory locations to return ALL bits set.
                   *
                   * Also, I'm reluctant to address that potential issue by simply returning -1, because to date, the above
                   * Memory interfaces have always returned values that are properly masked to 8, 16 or 32 bits, respectively.
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readNone: function readNone(off, addr) {
                      if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
                          this.dbg.message("attempt to read invalid block %" + str.toHex(this.addr), true);
                      }
                      return 0xff;
                  },
                  /**
                   * writeNone(off, v, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} v (could be either a byte or word value, since we use the same handler for both kinds of accesses)
                   * @param {number} addr
                   */
                  writeNone: function writeNone(off, v, addr) {
                      if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
                          this.dbg.message("attempt to write " + str.toHexWord(v) + " to invalid block %" + str.toHex(this.addr), true);
                      }
                  },
                  /**
                   * readShortDefault(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortDefault: function readShortDefault(off, addr) {
                      return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8);
                  },
                  /**
                   * readLongDefault(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongDefault: function readLongDefault(off, addr) {
                      return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8) | (this.readByte(off + 2, addr) << 16) | (this.readByte(off + 3, addr) << 24);
                  },
                  /**
                   * writeShortDefault(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} w
                   * @param {number} addr
                   */
                  writeShortDefault: function writeShortDefault(off, w, addr) {
                      Component.assert(!(w & ~0xffff));
                      this.writeByte(off, w & 0xff);
                      this.writeByte(off + 1, w >> 8);
                  },
                  /**
                   * writeLongDefault(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} w
                   * @param {number} addr
                   */
                  writeLongDefault: function writeLongDefault(off, w, addr) {
                      this.writeByte(off, w & 0xff);
                      this.writeByte(off + 1, (w >> 8) & 0xff);
                      this.writeByte(off + 2, (w >> 16) & 0xff);
                      this.writeByte(off + 3, (w >>> 24));
                  },
                  /**
                   * readByteMemory(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readByteMemory: function readByteMemory(off, addr) {
                      Component.assert(off >= 0 && off < this.size);
                      if (FATARRAYS) {
                          return this.ab[off];
                      }
                      return ((this.adw[off >> 2] >>> ((off & 0x3) << 3)) & 0xff);
                  },
                  /**
                   * readShortMemory(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortMemory: function readShortMemory(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 1);
                      if (FATARRAYS) {
                          return this.ab[off] | (this.ab[off + 1] << 8);
                      }
                      var w;
                      var idw = off >> 2;
                      var nShift = (off & 0x3) << 3;
                      var dw = (this.adw[idw] >> nShift);
                      if (nShift < 24) {
                          w = dw & 0xffff;
                      } else {
                          w = (dw & 0xff) | ((this.adw[idw + 1] & 0xff) << 8);
                      }
                      return w;
                  },
                  /**
                   * readLongMemory(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongMemory: function readLongMemory(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      if (FATARRAYS) {
                          return this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
                      }
                      var idw = off >> 2;
                      var nShift = (off & 0x3) << 3;
                      var l = this.adw[idw];
                      if (nShift) {
                          l >>>= nShift;
                          l |= this.adw[idw + 1] << (32 - nShift);
                      }
                      return l;
                  },
                  /**
                   * writeByteMemory(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} b
                   * @param {number} addr
                   */
                  writeByteMemory: function writeByteMemory(off, b, addr) {
                      Component.assert(off >= 0 && off < this.size && (b & 0xff) == b);
                      if (FATARRAYS) {
                          this.ab[off] = b;
                      } else {
                          var idw = off >> 2;
                          var nShift = (off & 0x3) << 3;
                          this.adw[idw] = (this.adw[idw] & ~(0xff << nShift)) | (b << nShift);
                      }
                      this.fDirty = true;
                  },
                  /**
                   * writeShortMemory(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} w
                   * @param {number} addr
                   */
                  writeShortMemory: function writeShortMemory(off, w, addr) {
                      Component.assert(off >= 0 && off < this.size - 1 && (w & 0xffff) == w);
                      if (FATARRAYS) {
                          this.ab[off] = (w & 0xff);
                          this.ab[off + 1] = (w >> 8);
                      } else {
                          var idw = off >> 2;
                          var nShift = (off & 0x3) << 3;
                          if (nShift < 24) {
                              this.adw[idw] = (this.adw[idw] & ~(0xffff << nShift)) | (w << nShift);
                          } else {
                              this.adw[idw] = (this.adw[idw] & 0x00ffffff) | (w << 24);
                              idw++;
                              this.adw[idw] = (this.adw[idw] & (0xffffff00|0)) | (w >> 8);
                          }
                      }
                      this.fDirty = true;
                  },
                  /**
                   * writeLongMemory(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongMemory: function writeLongMemory(off, l, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      if (FATARRAYS) {
                          this.ab[off] = (l & 0xff);
                          this.ab[off + 1] = (l >> 8) & 0xff;
                          this.ab[off + 2] = (l >> 16) & 0xff;
                          this.ab[off + 3] = (l >> 24) & 0xff;
                      } else {
                          var idw = off >> 2;
                          var nShift = (off & 0x3) << 3;
                          if (!nShift) {
                              this.adw[idw] = l;
                          } else {
                              var mask = (0xffffffff|0) << nShift;
                              this.adw[idw] = (this.adw[idw] & ~mask) | (l << nShift);
                              idw++;
                              this.adw[idw] = (this.adw[idw] & mask) | (l >>> (32 - nShift));
                          }
                      }
                      this.fDirty = true;
                  },
                  /**
                   * readByteChecked(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readByteChecked: function readByteChecked(off, addr) {
                      if (DEBUGGER && this.dbg) this.dbg.checkMemoryRead(addr);
                      return this.readByteDirect(off, addr);
                  },
                  /**
                   * readShortChecked(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortChecked: function readShortChecked(off, addr) {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.checkMemoryRead(addr) ||
                          this.dbg.checkMemoryRead(addr + 1);
                      }
                      return this.readShortDirect(off, addr);
                  },
                  /**
                   * readLongChecked(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongChecked: function readLongChecked(off, addr) {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.checkMemoryRead(addr) ||
                          this.dbg.checkMemoryRead(addr + 1) ||
                          this.dbg.checkMemoryRead(addr + 2) ||
                          this.dbg.checkMemoryRead(addr + 3);
                      }
                      return this.readLongDirect(off, addr);
                  },
                  /**
                   * writeByteChecked(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @param {number} b
                   */
                  writeByteChecked: function writeByteChecked(off, b, addr) {
                      if (DEBUGGER && this.dbg) this.dbg.checkMemoryWrite(addr);
                      if (this.fReadOnly) this.writeNone(off, b, addr); else this.writeByteDirect(off, b, addr);
                  },
                  /**
                   * writeShortChecked(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @param {number} w
                   */
                  writeShortChecked: function writeShortChecked(off, w, addr) {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.checkMemoryWrite(addr) ||
                          this.dbg.checkMemoryWrite(addr + 1);
                      }
                      if (this.fReadOnly) this.writeNone(off, w, addr); else this.writeShortDirect(off, w, addr);
                  },
                  /**
                   * writeLongChecked(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongChecked: function writeLongChecked(off, l, addr) {
                      if (DEBUGGER && this.dbg) {
                          this.dbg.checkMemoryWrite(this.addr + off) ||
                          this.dbg.checkMemoryWrite(this.addr + off + 1) ||
                          this.dbg.checkMemoryWrite(this.addr + off + 2) ||
                          this.dbg.checkMemoryWrite(this.addr + off + 3);
                      }
                      if (this.fReadOnly) this.writeNone(off, l, addr); else this.writeLongDirect(off, l, addr);
                  },
                  /**
                   * readBytePaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readBytePaged: function readBytePaged(off, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                      return this.blockPhys.readByte(off, addr);
                  },
                  /**
                   * readShortPaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortPaged: function readShortPaged(off, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                      return this.blockPhys.readShort(off, addr);
                  },
                  /**
                   * readLongPaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongPaged: function readLongPaged(off, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                      return this.blockPhys.readLong(off, addr);
                  },
                  /**
                   * writeBytePaged(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} b
                   * @param {number} addr
                   */
                  writeBytePaged: function writeBytePaged(off, b, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                      this.blockPhys.writeByte(off, b, addr);
                  },
                  /**
                   * writeShortPaged(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} w
                   * @param {number} addr
                   */
                  writeShortPaged: function writeShortPaged(off, w, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                      this.blockPhys.writeShort(off, w, addr);
                  },
                  /**
                   * writeLongPaged(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongPaged: function writeLongPaged(off, l, addr) {
                      this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                      this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                      this.blockPhys.writeLong(off, l, addr);
                  },
                  /**
                   * readByteUnpaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readByteUnpaged: function readByteUnpaged(off, addr) {
                      return this.getPageBlock(addr, false).readByte(off, addr);
                  },
                  /**
                   * readShortUnpaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortUnpaged: function readShortUnpaged(off, addr) {
                      return this.getPageBlock(addr, false).readShort(off, addr);
                  },
                  /**
                   * readLongUnpaged(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongUnpaged: function readLongUnpaged(off, addr) {
                      return this.getPageBlock(addr, false).readLong(off, addr);
                  },
                  /**
                   * writeByteUnpaged(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} b
                   * @param {number} addr
                   */
                  writeByteUnpaged: function writeByteUnpaged(off, b, addr) {
                      this.getPageBlock(addr, true).writeByte(off, b, addr);
                  },
                  /**
                   * writeShortUnpaged(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} w
                   * @param {number} addr
                   */
                  writeShortUnpaged: function writeShortUnpaged(off, w, addr) {
                      this.getPageBlock(addr, true).writeShort(off, w, addr);
                  },
                  /**
                   * writeLongUnpaged(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongUnpaged: function writeLongUnpaged(off, l, addr) {
                      this.getPageBlock(addr, true).writeLong(off, l, addr);
                  },
                  /**
                   * readByteBigEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readByteBigEndian: function readByteBigEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size);
                      return this.ab[off];
                  },
                  /**
                   * readByteLittleEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readByteLittleEndian: function readByteLittleEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size);
                      return this.ab[off];
                  },
                  /**
                   * readShortBigEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortBigEndian: function readShortBigEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 1);
                      return this.dv.getUint16(off, true);
                  },
                  /**
                   * readShortLittleEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readShortLittleEndian: function readShortLittleEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 1);
                      /*
                       * TODO: It remains to be seen if there's any advantage to checking the offset
                       * for an aligned read vs. always reading the bytes separately; it seems a safe bet
                       * for longs, but it's less clear for shorts.
                       */
                      return (off & 0x1)? (this.ab[off] | (this.ab[off+1] << 8)) : this.aw[off >> 1];
                  },
                  /**
                   * readLongBigEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongBigEndian: function readLongBigEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      return this.dv.getInt32(off, true);
                  },
                  /**
                   * readLongLittleEndian(off, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @return {number}
                   */
                  readLongLittleEndian: function readLongLittleEndian(off, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      /*
                       * TODO: It remains to be seen if there's any advantage to checking the offset
                       * for an aligned read vs. always reading the bytes separately; it seems a safe bet
                       * for longs, but it's less clear for shorts.
                       */
                      return (off & 0x3)? (this.ab[off] | (this.ab[off+1] << 8) | (this.ab[off+2] << 16) | (this.ab[off+3] << 24)) : this.adw[off >> 2];
                  },
                  /**
                   * writeByteBigEndian(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} b
                   * @param {number} addr
                   */
                  writeByteBigEndian: function writeByteBigEndian(off, b, addr) {
                      Component.assert(off >= 0 && off < this.size);
                      this.ab[off] = b;
                      this.fDirty = true;
                  },
                  /**
                   * writeByteLittleEndian(off, b, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @param {number} b
                   */
                  writeByteLittleEndian: function writeByteLittleEndian(off, b, addr) {
                      Component.assert(off >= 0 && off < this.size);
                      this.ab[off] = b;
                      this.fDirty = true;
                  },
                  /**
                   * writeShortBigEndian(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @param {number} w
                   */
                  writeShortBigEndian: function writeShortBigEndian(off, w, addr) {
                      Component.assert(off >= 0 && off < this.size - 1);
                      this.dv.setUint16(off, w, true);
                      this.fDirty = true;
                  },
                  /**
                   * writeShortLittleEndian(off, w, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} addr
                   * @param {number} w
                   */
                  writeShortLittleEndian: function writeShortLittleEndian(off, w, addr) {
                      Component.assert(off >= 0 && off < this.size - 1);
                      /*
                       * TODO: It remains to be seen if there's any advantage to checking the offset
                       * for an aligned write vs. always writing the bytes separately; it seems a safe bet
                       * for longs, but it's less clear for shorts.
                       */
                      if (off & 0x1) {
                          this.ab[off] = w;
                          this.ab[off+1] = w >> 8;
                      } else {
                          this.aw[off >> 1] = w;
                      }
                      this.fDirty = true;
                  },
                  /**
                   * writeLongBigEndian(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongBigEndian: function writeLongBigEndian(off, l, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      this.dv.setInt32(off, l, true);
                      this.fDirty = true;
                  },
                  /**
                   * writeLongLittleEndian(off, l, addr)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} l
                   * @param {number} addr
                   */
                  writeLongLittleEndian: function writeLongLittleEndian(off, l, addr) {
                      Component.assert(off >= 0 && off < this.size - 3);
                      /*
                       * TODO: It remains to be seen if there's any advantage to checking the offset
                       * for an aligned write vs. always writing the bytes separately; it seems a safe bet
                       * for longs, but it's less clear for shorts.
                       */
                      if (off & 0x3) {
                          this.ab[off] = l;
                          this.ab[off+1] = (l >> 8);
                          this.ab[off+2] = (l >> 16);
                          this.ab[off+3] = (l >> 24);
                      } else {
                          this.adw[off >> 2] = l;
                      }
                      this.fDirty = true;
                  },
                  /**
                   * readBackTrackNone(off)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @return {number}
                   */
                  readBackTrackNone: function readBackTrackNone(off) {
                      return 0;
                  },
                  /**
                   * writeBackTrackNone(off, bti)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} bti
                   */
                  writeBackTrackNone: function writeBackTrackNone(off, bti) {
                  },
                  /**
                   * modBackTrackNone(fMod)
                   *
                   * @this {Memory}
                   * @param {boolean} fMod
                   */
                  modBackTrackNone: function modBackTrackNone(fMod) {
                      return false;
                  },
                  /**
                   * readBackTrackIndex(off)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @return {number}
                   */
                  readBackTrackIndex: function readBackTrackIndex(off) {
                      Component.assert(off >= 0 && off < this.size);
                      return this.abtIndexes[off];
                  },
                  /**
                   * writeBackTrackIndex(off, bti)
                   *
                   * @this {Memory}
                   * @param {number} off
                   * @param {number} bti
                   * @return {number} previous bti (0 if none)
                   */
                  writeBackTrackIndex: function writeBackTrackIndex(off, bti) {
                      var btiPrev;
                      Component.assert(off >= 0 && off < this.size);
                      btiPrev = this.abtIndexes[off];
                      this.abtIndexes[off] = bti;
                      return btiPrev;
                  },
                  /**
                   * modBackTrackIndex(fMod)
                   *
                   * @this {Memory}
                   * @param {boolean} fMod
                   * @return {boolean} previous value
                   */
                  modBackTrackIndex: function modBackTrackIndex(fMod) {
                      var fModPrev = this.fModBackTrack;
                      this.fModBackTrack = fMod;
                      return fModPrev;
                  }
              };
              
              /*
               * This is the effective definition of afnNone, but we need not fully define it, because setAccess()
               * uses these defaults when any of the 6 handlers (ie, 3 read handlers and 3 write handlers) are undefined.
               *
              Memory.afnNone              = [Memory.prototype.readNone,        Memory.prototype.readShortDefault, Memory.prototype.readLongDefault, Memory.prototype.writeNone,        Memory.prototype.writeShortDefault, Memory.prototype.writeLongDefault];
               */
              
              Memory.afnNone              = [];
              Memory.afnMemory            = [Memory.prototype.readByteMemory,  Memory.prototype.readShortMemory,  Memory.prototype.readLongMemory,  Memory.prototype.writeByteMemory,  Memory.prototype.writeShortMemory,  Memory.prototype.writeLongMemory];
              Memory.afnChecked           = [Memory.prototype.readByteChecked, Memory.prototype.readShortChecked, Memory.prototype.readLongChecked, Memory.prototype.writeByteChecked, Memory.prototype.writeShortChecked, Memory.prototype.writeLongChecked];
              
              if (PAGEBLOCKS) {
                  Memory.afnPaged         = [Memory.prototype.readBytePaged,   Memory.prototype.readShortPaged,   Memory.prototype.readLongPaged,   Memory.prototype.writeBytePaged,   Memory.prototype.writeShortPaged,   Memory.prototype.writeLongPaged];
                  Memory.afnUnpaged       = [Memory.prototype.readByteUnpaged, Memory.prototype.readShortUnpaged, Memory.prototype.readLongUnpaged, Memory.prototype.writeByteUnpaged, Memory.prototype.writeShortUnpaged, Memory.prototype.writeLongUnpaged];
              }
              
              if (TYPEDARRAYS) {
                  Memory.afnBigEndian     = [Memory.prototype.readByteBigEndian,    Memory.prototype.readShortBigEndian,    Memory.prototype.readLongBigEndian,    Memory.prototype.writeByteBigEndian,    Memory.prototype.writeShortBigEndian,    Memory.prototype.writeLongBigEndian];
                  Memory.afnLittleEndian  = [Memory.prototype.readByteLittleEndian, Memory.prototype.readShortLittleEndian, Memory.prototype.readLongLittleEndian, Memory.prototype.writeByteLittleEndian, Memory.prototype.writeShortLittleEndian, Memory.prototype.writeLongLittleEndian];
              }
              
              if (typeof module !== 'undefined') module.exports = Memory;
              
            • messages.js
              /**
               * @fileoverview PCjs-specific message definitions.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Dec-11
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * Components that previously used Debugger messages definitions by including:
               *
               *     var Debugger = require("./debugger");
               *
               * and using:
               *
               *      Debugger.MESSAGE.FOO
               *
               * must now instead include:
               *
               *      var Messages = require("./messages");
               *
               * and then replace all occurrences of "Debugger.MESSAGE.FOO" with "Messages.FOO".
               */
              
              var Messages = {
                  CPU:        0x00000001,
                  SEG:        0x00000002,
                  DESC:       0x00000004,
                  TSS:        0x00000008,
                  INT:        0x00000010,
                  FAULT:      0x00000020,
                  BUS:        0x00000040,
                  MEM:        0x00000080,
                  PORT:       0x00000100,
                  DMA:        0x00000200,
                  PIC:        0x00000400,
                  TIMER:      0x00000800,
                  CMOS:       0x00001000,
                  RTC:        0x00002000,
                  C8042:      0x00004000,
                  CHIPSET:    0x00008000,
                  KEYBOARD:   0x00010000,
                  KEYS:       0x00020000,
                  VIDEO:      0x00040000,
                  FDC:        0x00080000,
                  HDC:        0x00100000,
                  DISK:       0x00200000,
                  SERIAL:     0x00400000,
                  SPEAKER:    0x00800000,
                  STATE:      0x01000000,
                  MOUSE:      0x02000000,
                  COMPUTER:   0x04000000,
                  DOS:        0x08000000,
                  DATA:       0x10000000,
                  LOG:        0x20000000,
                  WARN:       0x40000000,
                  HALT:       0x80000000|0
              };
              
              if (typeof module !== 'undefined') module.exports = Messages;
              
            • mouse.js
              /**
               * @fileoverview Implements the PCjs Mouse component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jul-01
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var SerialPort  = require("./serialport");
                  var State       = require("./state");
              }
              
              /**
               * Mouse(parmsMouse)
               *
               * The Mouse component has the following component-specific (parmsMouse) properties:
               *
               *      serial: the ID of the corresponding serial component
               *
               * Since the first version of this component supports ONLY emulation of the original Microsoft
               * serial mouse, a valid serial component ID is required.  It's possible that future versions
               * of this component may support other types of simulated hardware (eg, the Microsoft InPort
               * bus mouse adapter), or a virtual driver interface that would eliminate the need for any
               * intermediate hardware simulation (at the expense of writing an intermediate software layer or
               * virtual driver for each supported operating system).  However, those possibilities are extremely
               * unlikely in the near term.
               *
               * If the 'serial' property is specified, then communication will be established with the
               * SerialPort component, requesting access to the corresponding serial component ID.  If the
               * SerialPort component is not installed and/or the specified serial component ID is not present,
               * a configuration error will be reported.
               *
               * TODO: Just out of curiosity, verify that the Microsoft Bus Mouse used ports 0x23D and 0x23F,
               * because I saw Windows v1.01 probing those ports immediately prior to probing COM2 (and then COM1)
               * for a serial mouse.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsMouse
               */
              function Mouse(parmsMouse)
              {
                  Component.call(this, "Mouse", parmsMouse, Mouse, Messages.MOUSE);
              
                  this.idAdapter = parmsMouse['serial'];
                  if (this.idAdapter) {
                      this.sAdapterType = "SerialPort";
                  }
                  this.setActive(false);
                  this.fCaptured = this.fLocked = false;
              
                  /*
                   * Initially, no video devices, and therefore no input devices, are attached.  initBus() will update aVideo,
                   * and powerUp() will update aInput.
                   */
                  this.aVideo = [];
                  this.aInput = [];
                  this.setReady();
              }
              
              /*
               * From http://paulbourke.net/dataformats/serialmouse:
               *
               *      The old MicroSoft serial mouse, while no longer in general use, can be employed to provide a low cost input device,
               *      for example, coupling the internal mechanism to other moving objects. The serial protocol for the mouse is:
               *
               *          1200 baud, 7 bit, 1 stop bit, no parity.
               *
               *      The pinout of the connector follows the standard serial interface, as shown below:
               *
               *          Pin     Abbr    Description
               *          1       DCD     Data Carrier Detect
               *          2       RD      Receive Data            [serial data from mouse to host]
               *          3       TD      Transmit Data
               *          4       DTR     Data Terminal Ready     [used to provide positive voltage to mouse, plus reset/detection]
               *          5       SG      Signal Ground
               *          6       DSR     Data Set Ready
               *          7       RTS     Request To Send         [used to provide positive voltage to mouse]
               *          8       CTS     Clear To Send
               *          9       RI      Ring
               *
               *      Every time the mouse changes state (moved or button pressed) a three byte "packet" is sent to the serial interface.
               *      For reasons known only to the engineers, the data is arranged as follows, most notably the two high order bits for the
               *      x and y coordinates share the first byte with the button status.
               *
               *                      D6  D5  D4  D3  D2  D1  D0
               *          1st byte    1   LB  RB  Y7  Y6  X7  X6
               *          2nd byte    0   X5  X4  X3  X2  X1  X0
               *          3rd byte    0   Y5  Y4  Y3  Y2  Y1  Y0
               *
               *      where:
               *
               *          LB is the state of the left button, 1 = pressed, 0 = released.
               *          RB is the state of the right button, 1 = pressed, 0 = released
               *          X0-7 is movement of the mouse in the X direction since the last packet. Positive movement is toward the right.
               *          Y0-7 is movement of the mouse in the Y direction since the last packet. Positive movement is back, toward the user.
               *
               * From http://www.kryslix.com/nsfaq/Q.12.html:
               *
               *      The Microsoft serial mouse is the most popular 2-button mouse. It is supported by all major operating systems.
               *      The maximum tracking rate for a Microsoft mouse is 40 reports/second * 127 counts per report, in other words, 5080 counts
               *      per second. The most common range for mice is is 100 to 400 CPI (counts per inch) but can be up to 1000 CPI. A 100 CPI mouse
               *      can discriminate motion up to 50.8 inches/second while a 400 CPI mouse can only discriminate motion up to 12.7 inches/second.
               *
               *          9-pin  25-pin    Line    Comments
               *          shell  1         GND
               *          3      2         TD      Serial data from host to mouse (only for power)
               *          2      3         RD      Serial data from mouse to host
               *          7      4         RTS     Positive voltage to mouse
               *          8      5         CTS
               *          6      6         DSR
               *          5      7         SGND
               *          4      20        DTR     Positive voltage to mouse and reset/detection
               *
               *      To function correctly, both the RTS and DTR lines must be positive. DTR/DSR and RTS/CTS must NOT be shorted.
               *      RTS may be toggled negative for at least 100ms to reset the mouse. (After a cold boot, the RTS line is usually negative.
               *      This provides an automatic toggle when RTS is brought positive). When DTR is toggled the mouse should send a single byte
               *      (0x4D, ASCII 'M').
               *
               *      Serial data parameters: 1200bps, 7 data bits, 1 stop bit
               *
               *      Data is sent in 3 byte packets for each event (a button is pressed or released, or the mouse moves):
               *
               *                  D7  D6  D5  D4  D3  D2  D1  D0
               *          Byte 1  X   1   LB  RB  Y7  Y6  X7  X6
               *          Byte 2  X   0   X5  X4  X3  X2  X1  X0
               *          Byte 3  X   0   Y5  Y4  Y3  Y2  Y1  Y0
               *
               *      LB is the state of the left button (1 means down).
               *      RB is the state of the right button (1 means down).
               *      X7-X0 movement in X direction since last packet (signed byte).
               *      Y7-Y0 movement in Y direction since last packet (signed byte).
               *      The high order bit of each byte (D7) is ignored. Bit D6 indicates the start of an event, which allows the software to
               *      synchronize with the mouse.
               */
              
              Component.subclass(Mouse);
              
              Mouse.ID_SERIAL = 0x4D;
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {Mouse}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              Mouse.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.cmp = cmp;
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  /*
                   * Attach the Video component to the CPU, so that the CPU can periodically update
                   * the video display via updateVideo(), as cycles permit.
                   */
                  for (var video = null; (video = cmp.getComponentByType("Video", video));) {
                      this.aVideo.push(video);
                  }
              };
              
              /**
               * isActive()
               *
               * @this {Mouse}
               * @return {boolean} true if active, false if not
               */
              Mouse.prototype.isActive = function()
              {
                  return this.fActive && (this.cpu? this.cpu.isRunning() : false);
              };
              
              /**
               * setActive(fActive)
               *
               * @this {Mouse}
               * @param {boolean} fActive is true if active, false if not
               */
              Mouse.prototype.setActive = function(fActive)
              {
                  this.fActive = fActive;
                  /*
                   * It's currently not possible to automatically lock the pointer outside the context of a user action
                   * (eg, a button or screen click), so this code is for naught.
                   *
                   *      if (this.aVideo.length) this.aVideo[0].notifyPointerActive(fActive);
                   *
                   * We now rely on similar code in clickMouse().
                   */
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {Mouse}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Mouse.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.reset();
                      } else {
                          if (!this.restore(data)) return false;
                      }
                      if (this.sAdapterType && !this.componentAdapter) {
                          var componentAdapter = null;
                          while ((componentAdapter = this.cmp.getComponentByType(this.sAdapterType, componentAdapter))) {
                              if (componentAdapter.attachMouse) {
                                  this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this);
                                  if (this.componentAdapter) {
                                      /*
                                       * It's possible that the SerialPort we've just attached to might want to bring us "up to speed"
                                       * on the adapter's state, which is why I envisioned a subsequent syncMouse() call.  And you would
                                       * want to do that as a separate call, not as part of attachMouse(), because componentAdapter
                                       * isn't set until attachMouse() returns.
                                       *
                                       * However, syncMouse() seems unnecessary, given that SerialPort initializes its MCR to an "inactive"
                                       * state, and even when restoring a previous state, if we've done our job properly, both SerialPort
                                       * and Mouse should be restored in sync, making any explicit attempt at sync'ing unnecessary (or so I hope).
                                       */
                                      // this.componentAdapter.syncMouse();
                                      break;
                                  }
                              }
                          }
                          if (this.componentAdapter) {
                              this.aInput = [];       // ensure the input device array is empty before (re)filling it
                              for (var i = 0; i < this.aVideo.length; i++) {
                                  var input = this.aVideo[i].getInput(this);
                                  if (input) this.aInput.push(input);
                              }
                          } else {
                              Component.warning(this.id + ": " + this.sAdapterType + " " + this.idAdapter + " unavailable");
                          }
                      }
                      if (this.fActive) {
                          this.captureAll();
                      } else {
                          this.releaseAll();
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {Mouse}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              Mouse.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * reset()
               *
               * @this {Mouse}
               */
              Mouse.prototype.reset = function()
              {
                  this.initState();
              };
              
              /**
               * save()
               *
               * This implements save support for the Mouse component.
               *
               * @this {Mouse}
               * @return {Object}
               */
              Mouse.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.saveState());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the Mouse component.
               *
               * @this {Mouse}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              Mouse.prototype.restore = function(data)
              {
                  return this.initState(data[0]);
              };
              
              /**
               * initState(data)
               *
               * @this {Mouse}
               * @param {Array} [data]
               * @return {boolean} true if successful, false if failure
               */
              Mouse.prototype.initState = function(data)
              {
                  var i = 0;
                  if (data === undefined) data = [false, -1, -1, 0, 0, false, false, 0];
                  this.setActive(data[i++]);
                  this.xMouse = data[i++];
                  this.yMouse = data[i++];
                  this.xDelta = data[i++];
                  this.yDelta = data[i++];
                  this.fButton1 = data[i++];      // FYI, we consider button1 to be the LEFT button
                  this.fButton2 = data[i++];      // FYI, we consider button2 to be the RIGHT button
                  this.bMCR = data[i];
                  return true;
              };
              
              /**
               * saveState()
               *
               * @this {Mouse}
               * @return {Array}
               */
              Mouse.prototype.saveState = function()
              {
                  var i = 0;
                  var data = [];
                  data[i++] = this.fActive;
                  data[i++] = this.xMouse;
                  data[i++] = this.yMouse;
                  data[i++] = this.xDelta;
                  data[i++] = this.yDelta;
                  data[i++] = this.fButton1;
                  data[i++] = this.fButton2;
                  data[i] = this.bMCR;
                  return data;
              };
              
              /**
               * notifyPointerLocked()
               *
               * @this {Mouse}
               * @param {boolean} fLocked
               */
              Mouse.prototype.notifyPointerLocked = function(fLocked)
              {
                  this.fLocked = fLocked;
              };
              
              /**
               * captureAll()
               *
               * @this {Mouse}
               */
              Mouse.prototype.captureAll = function()
              {
                  if (!this.fCaptured) {
                      for (var i = 0; i < this.aInput.length; i++) {
                          if (this.captureMouse(this.aInput[i])) this.fCaptured = true;
                      }
                  }
              };
              
              /**
               * releaseAll()
               *
               * @this {Mouse}
               */
              Mouse.prototype.releaseAll = function()
              {
                  if (this.fCaptured) {
                      for (var i = 0; i < this.aInput.length; i++) {
                          if (this.releaseMouse(this.aInput[i])) this.fCaptured = false;
                      }
                  }
              };
              
              /**
               * captureMouse(control)
               *
               * NOTE: addEventListener() wasn't supported in Internet Explorer until IE9, but that's OK, because
               * IE9 is the oldest IE we support anyway (since versions prior to IE9 lack the necessary HTML5 support).
               *
               * @this {Mouse}
               * @param {Object} control from the HTML DOM (eg, the control for the simulated screen)
               * @return {boolean} true if event handlers were actually added, false if not
               */
              Mouse.prototype.captureMouse = function(control)
              {
                  if (control) {
                      var mouse = this;
                      control.addEventListener(
                          'mousemove',
                          function onMouseMove(event) {
                              mouse.moveMouse(event);
                          },
                          false               // we'll specify false for the 'useCapture' parameter for now...
                      );
                      control.addEventListener(
                          'mousedown',
                          function onMouseDown(event) {
                              mouse.clickMouse(event.button, true);
                          },
                          false               // we'll specify false for the 'useCapture' parameter for now...
                      );
                      control.addEventListener(
                          'mouseup',
                          function onMouseUp(event) {
                              mouse.clickMouse(event.button, false);
                          },
                          false               // we'll specify false for the 'useCapture' parameter for now...
                      );
                      /*
                       * None of these tricks seemed to work for IE10, so I'm giving up hiding the browser's mouse pointer in IE for now.
                       *
                       *      control['style']['cursor'] = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAADUlEQVQYV2P4//8/IwAI/QL/+TZZdwAAAABJRU5ErkJggg=='), url('/versions/images/current/blank.cur'), none";
                       *
                       * Setting the cursor style to "none" may not be a standard, but it works in Safari, Firefox and Chrome, so that's pretty
                       * good for a non-standard!
                       *
                       * TODO: The reference to '/versions/images/current/blank.cur' is also problematic for anyone who might want
                       * to run this app from a different server, so think about that as well.
                       */
                      control['style']['cursor'] = "none";
                      return true;
                  }
                  return false;
              };
              
              /**
               * releaseMouse(control)
               *
               * TODO: Use removeEventListener() to clean up our handlers; since I'm currently using anonymous functions,
               * and since I'm not seeing any compelling reason to remove the handlers once they've been established, it's
               * less code to leave them in place.
               *
               * @this {Mouse}
               * @param {Object} control from the HTML DOM
               * @return {boolean} true if event handlers were actually released, false if not
               */
              Mouse.prototype.releaseMouse = function(control)
              {
                  if (control) {
                      control['style']['cursor'] = "auto";
                  }
                  return false;
              };
              
              /**
               * moveMouse(event)
               *
               * MouseEvent objects contain, among other things, the following properties:
               *
               *      clientX
               *      clientY
               *
               * I've selected the above properties because they're widely supported, not because I need
               * client-area coordinates.  In fact, layerX and layerY are probably closer to what I really want,
               * but I don't think they're available in all browsers.  screenX and screenY would work as well.
               *
               * This is because all we care about are deltas.  We record clientX and clientY (as xMouse and yMouse)
               * merely to calculate xDelta and yDelta.
               *
               * @this {Mouse}
               * @param {Object} event object from a 'mousemove' event (specifically, a MouseEvent object)
               */
              Mouse.prototype.moveMouse = function(event)
              {
                  if (this.isActive()) {
                      if (this.xMouse < 0 || this.yMouse < 0) {
                          this.xMouse = event.clientX;
                          this.yMouse = event.clientY;
                      }
                      if (this.fLocked) {
                          this.xDelta = event['movementX'] || event['mozMovementX'] || event['webkitMovementX'] || 0;
                          this.yDelta = event['movementY'] || event['mozMovementY'] || event['webkitMovementY'] || 0;
                      } else {
                          this.xDelta = event.clientX - this.xMouse;
                          this.yDelta = event.clientY - this.yMouse;
                      }
                      if (this.xDelta || this.yDelta) {
                          /*
                           * As sendPacket() indicates, any x and y coordinates we supply are for diagnostic purposes only.
                           * sendPacket() only cares about the xDelta and yDelta properties, which it then zeroes on completion.
                           */
                          this.sendPacket(null, event.clientX, event.clientY);
                      }
                      this.xMouse = event.clientX;
                      this.yMouse = event.clientY;
                  }
              };
              
              /**
               * clickMouse(iButton, fDown)
               *
               * @this {Mouse}
               * @param {number} iButton is 0 for fButton1 (the LEFT button), 2 for fButton2 (the RIGHT button)
               * @param {boolean} fDown
               */
              Mouse.prototype.clickMouse = function(iButton, fDown)
              {
                  if (this.isActive()) {
                      if (this.fLocked === false) {
                          /*
                           * If there's no support for automatic pointer locking in the Video component, then notifyPointerActive()
                           * will return false, and we will set fLocked to null, ensuring that we never attempt this again.
                           */
                          if (!this.aVideo.length || !this.aVideo[0].notifyPointerActive(true)) {
                              this.fLocked = null;
                          }
                      }
                      var sDiag = DEBUGGER? ("mouse button" + iButton + ' ' + (fDown? "dn" : "up")) : null;
                      switch (iButton) {
                      case 0:
                          if (this.fButton1 != fDown) {
                              this.fButton1 = fDown;
                              this.sendPacket(sDiag);
                          }
                          break;
                      case 2:
                          if (this.fButton2 != fDown) {
                              this.fButton2 = fDown;
                              this.sendPacket(sDiag);
                          }
                          break;
                      default:
                          break;
                      }
                  }
              };
              
              /**
               * sendPacket(sDiag, xDiag, yDiag)
               *
               * If we're called, something changed.
               *
               * Let's review the 3-byte packet format:
               *
               *              D7  D6  D5  D4  D3  D2  D1  D0
               *      Byte 1  X   1   LB  RB  Y7  Y6  X7  X6
               *      Byte 2  X   0   X5  X4  X3  X2  X1  X0
               *      Byte 3  X   0   Y5  Y4  Y3  Y2  Y1  Y0
               *
               * @this {Mouse}
               * @param {string|null} [sDiag] diagnostic message
               * @param {number} [xDiag] original x-coordinate (optional; for diagnostic use only)
               * @param {number} [yDiag] original y-coordinate (optional; for diagnostic use only)
               */
              Mouse.prototype.sendPacket = function(sDiag, xDiag, yDiag)
              {
                  var b1 = 0x40 | (this.fButton1? 0x20 : 0) | (this.fButton2? 0x10 : 0) | ((this.yDelta & 0xC0) >> 4) | ((this.xDelta & 0xC0) >> 6);
                  var b2 = this.xDelta & 0x3F;
                  var b3 = this.yDelta & 0x3F;
                  if (this.messageEnabled(Messages.SERIAL)) {
                      this.printMessage((sDiag? (sDiag + ": ") : "") + (yDiag !== undefined? ("mouse (" + xDiag + "," + yDiag + "): ") : "") + "serial packet [" + str.toHexByte(b1) + "," + str.toHexByte(b2) + "," + str.toHexByte(b3) + "]", 0, true);
                  }
                  this.componentAdapter.sendRBR([b1, b2, b3]);
                  this.xDelta = this.yDelta = 0;
              };
              
              /**
               * notifyMCR(bMCR)
               *
               * The SerialPort notifies us whenever SerialPort.MCR.DTR or SerialPort.MCR.RTS changes.
               *
               * During normal serial mouse operation, both RTS and DTR must be "positive".
               *
               * Setting RTS "negative" for 100ms resets the mouse.  Toggling DTR requests an identification byte (ID_SERIAL).
               *
               * NOTES: The above 3rd-party information notwithstanding, I've observed that Windows v1.01 initially writes 0x01
               * to the MCR (DTR on, RTS off), spins in a loop that reads the RBR (probably to avoid a bogus identification byte
               * sitting in the RBR), and then writes 0x0B to the MCR (DTR on, RTS on).  This last step is consistent with making
               * the mouse "active", but it is NOT consistent with "toggling DTR", so I conclude that a reset is ALSO sufficient
               * for sending the identification byte.  Right or wrong, this gets the ball rolling for Windows v1.01.
               *
               * @this {Mouse}
               * @param {number} bMCR
               */
              Mouse.prototype.notifyMCR = function(bMCR)
              {
                  var fActive = ((bMCR & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) == (SerialPort.MCR.DTR | SerialPort.MCR.RTS));
                  if (fActive) {
                      if (!this.fActive) {
                          var fIdentify = false;
                          if (!(this.bMCR & SerialPort.MCR.RTS)) {
                              this.reset();
                              this.printMessage("serial mouse reset");
                              fIdentify = true;
                          }
                          if (!(this.bMCR & SerialPort.MCR.DTR)) {
                              this.printMessage("serial mouse ID requested");
                              fIdentify = true;
                          }
                          if (fIdentify) {
                              /*
                               * HEADS UP: Everything I'd read about the (original) Microsoft Serial Mouse "reset" protocol says
                               * that the device sends a single byte (0x4D aka 'M').  It's not surprising to think that newer mice
                               * might send additional bytes, but you would think that newer mouse drivers (eg, MOUSE.COM v8.20)
                               * would always be able to deal with mice that sent only one byte.
                               *
                               * You would be wrong.  On an INT 0x33 reset, the v8.20 driver looks for an 'M', then it waits for
                               * another byte (0x42 aka 'B').  If it doesn't receive a 'B', it will accept another 'M'.  But if it
                               * receives something else (or nothing at all), it will spend a long time waiting for it, and then
                               * return an error.
                               *
                               * It's entirely possible that I've done something wrong and inadvertently "tricked" MOUSE.COM into
                               * using the wrong detection logic.  But given the other problems I've seen in MOUSE.COM v8.20, including
                               * its failure to properly terminate-and-stay-resident when its initial INT 0x33 reset returns an error,
                               * I'm not in the mood to give it the benefit of the doubt.
                               *
                               * So, anyway, I solve the terminate-and-stay-resident bug in MOUSE.COM v8.20 by feeding it *two* ID_SERIAL
                               * bytes on a reset.  This doesn't seem to adversely affect serial mouse emulation for Windows 1.01, so
                               * I'm calling this good enough for now.
                               */
                              this.componentAdapter.sendRBR([Mouse.ID_SERIAL, Mouse.ID_SERIAL]);
                              this.printMessage("serial mouse ID sent");
                          }
                          this.captureAll();
                          this.setActive(fActive);
                      }
                  } else {
                      if (this.fActive) {
                          /*
                           * Although this would seem nice (ie, for the Windows v1.01 mouse driver to turn RTS off when its mouse
                           * driver shuts down and Windows exits, since it DID turn RTS on), that doesn't appear to actually happen.
                           * At the very least, Windows will have (re)masked the serial port's IRQ, so what does it matter?  Not much,
                           * I just would have preferred that fActive properly reflect whether we should continue dispatching mouse
                           * events, displaying MOUSE messages, etc.
                           *
                           * We could ask the ChipSet component to notify the SerialPort component whenever its IRQ is masked/unmasked,
                           * and then have the SerialPort pass that notification on to us, but I'm assuming that in the real world,
                           * a mouse device that's still powered may still send event data to the serial port, and if there was software
                           * polling the serial port, it might expect to see that data.  Unlikely, but not impossible.
                           */
                          this.printMessage("serial mouse inactive");
                          this.releaseAll();
                          this.setActive(fActive);
                      }
                  }
                  this.bMCR = bMCR;
              };
              
              /**
               * Mouse.init()
               *
               * This function operates on every HTML element of class "mouse", extracting the
               * JSON-encoded parameters for the Mouse constructor from the element's "data-value"
               * attribute, invoking the constructor to create a Mouse component, and then binding
               * any associated HTML controls to the new component.
               */
              Mouse.init = function()
              {
                  var aeMouse = Component.getElementsByClass(window.document, PCJSCLASS, "mouse");
                  for (var iMouse = 0; iMouse < aeMouse.length; iMouse++) {
                      var eMouse = aeMouse[iMouse];
                      var parmsMouse = Component.getComponentParms(eMouse);
                      var mouse = new Mouse(parmsMouse);
                      Component.bindComponentControls(mouse, eMouse, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every Mouse module on the page.
               */
              web.onInit(Mouse.init);
              
              if (typeof module !== 'undefined') module.exports = Mouse;
              
            • nodebugger.js
              /**
               * @fileoverview Compile-time definitions for Debugger-less configurations.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded.
               * In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate.  When it's *false*,
               * nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a
               * "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove
               * debugger.js from the compilation process altogether.
               *
               * However, when we're in "development mode" and running uncompiled code in debugger-less configurations,
               * I would still like to skip loading debugger.js altogether.  To do that, we must arrange for this additional file,
               * nodebugger.js, to be loaded as early as possible, which explicitly UPDATES the value of DEBUGGER to false.
               */
              var DEBUGGER = false;
              
            • panel.js
              /**
               * @fileoverview Implements the PCjs Panel component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-19
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var usr         = require("../../shared/lib/usrlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Bus         = require("./bus");
                  var Memory      = require("./memory");
                  var X86         = require("./x86");
              }
              
              /**
               * Panel(parmsPanel)
               *
               * The Panel component has no required (parmsPanel) properties.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsPanel
               */
              function Panel(parmsPanel)
              {
                  Component.call(this, "Panel", parmsPanel, Panel);
              
                  this.canvas = null;
                  this.lockMouse = -1;
                  this.fMouseDown = false;
                  this.xMouse = this.yMouse = -1;
                  if (BACKTRACK) {
                      this.busInfo = null;
                      this.fBackTrack = false;
                  }
              }
              
              Component.subclass(Panel);
              
              /*
               * The "Live" canvases that we create internally have the following fixed dimensions, to make drawing
               * simpler.  We then render, via drawImage(), these canvases onto the supplied canvas, which will automatically
               * stretch the live images to fit.
               */
              Panel.LIVECANVAS = {
                  CX:         1280,
                  CY:         720,
                  FONT:       {
                      CY:     18,
                      FACE:   "Monaco, Lucida Console, Courier New"
                  }
              };
              
              Panel.LIVEMEM = {
                  CX: (Panel.LIVECANVAS.CX * 3) >> 2,
                  CY: (Panel.LIVECANVAS.CY)
              };
              
              Panel.LIVEREGS = {
                  CX:     (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
                  CY:     (Panel.LIVECANVAS.CY),
                  COLOR:  "black"
              };
              
              Panel.LIVEDUMP = {
                  CX: (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
                  CY: (Panel.LIVECANVAS.CY >> 1)
              };
              
              /*
               * findRegions() records block numbers in bits 0-14, a BackTrack "mod" bit in bit 15, and the block type at bit 16.
               */
              Panel.REGION = {
                  MASK:           0x7fff,
                  BTMOD_SHIFT:    15,
                  TYPE_SHIFT:     16
              };
              
              /**
               * Color(r, g, b, a)
               *
               * @constructor
               * @param {number} [r]
               * @param {number} [g]
               * @param {number} [b]
               * @param {number} [a]
               */
              function Color(r, g, b, a)
              {
                  this.rgb = [r, g, b, a];
                  this.sValue = null;
                  if (r === undefined) this.randomize();
              }
              
              /**
               * getRandom(nLimit)
               *
               * @this {Color}
               * @param {number} [nLimit]
               */
              Color.prototype.getRandom = function(nLimit)
              {
                  return (Math.random() * (nLimit || 0x100)) | 0;
              };
              
              /**
               * randomize()
               *
               * @this {Color}
               */
              Color.prototype.randomize = function()
              {
                  this.rgb[0] = this.getRandom(); this.rgb[1] = this.getRandom(); this.rgb[2] = this.getRandom(); this.rgb[3] = 0xff;
                  this.sValue = null;
              };
              
              /**
               * toString()
               *
               * @this {Color}
               * @return {string}
               */
              Color.prototype.toString = function()
              {
                  if (!this.sValue) this.sValue = '#' + str.toHex(this.rgb[0], 2) + str.toHex(this.rgb[1], 2) + str.toHex(this.rgb[2], 2);
                  return this.sValue;
              };
              
              /**
               * Rectangle(x, y, cx, cy)
               *
               * @constructor
               * @param {number} x
               * @param {number} y
               * @param {number} cx
               * @param {number} cy
               */
              function Rectangle(x, y, cx, cy)
              {
                  this.x = x;
                  this.y = y;
                  this.cx = cx;
                  this.cy = cy;
              }
              
              /**
               * contains(x, y)
               *
               * @param {number} x
               * @param {number} y
               * @return {boolean} true if (x,y) lies within the rectangle, false if not
               */
              Rectangle.prototype.contains = function(x, y)
              {
                  return (x >= this.x && x < this.x + this.cx && y >= this.y && y < this.y + this.cy);
              };
              
              /**
               * subDivide(units, unitsTotal, fHorizontal)
               *
               * Return a new rectangle that is a subset of the current rectangle, based on the ratio of
               * units to unitsTotal, and then update the dimensions of the current rectangle.  Whether the
               * original rectangle is divided horizontally or vertically is entirely arbitrary; currently,
               * the criteria is horizontal if the ratio is 1/4 or more, vertical otherwise.
               *
               * @this {Rectangle}
               * @param {number} units
               * @param {number} unitsTotal
               * @param {boolean} [fHorizontal]
               * @return {Rectangle}
               */
              Rectangle.prototype.subDivide = function(units, unitsTotal, fHorizontal)
              {
                  var rect;
                  if (fHorizontal === undefined) {
                      fHorizontal = units >= (unitsTotal >> 2);
                  }
                  if (fHorizontal) {
                      rect = new Rectangle(this.x, this.y, this.cx, ((this.cy * units) / unitsTotal) | 0);
                      this.y += rect.cy;
                      this.cy -= rect.cy;
                      Component.assert(this.cy >= 0);
                  } else {
                      rect = new Rectangle(this.x, this.y, ((this.cx * units) / unitsTotal) | 0, this.cy);
                      this.x += rect.cx;
                      this.cx -= rect.cx;
                      Component.assert(this.cx >= 0);
                  }
                  return rect;
              };
              
              /**
               * drawWith(context, color)
               *
               * @param {Object} context
               * @param {Color|string} [color]
               */
              Rectangle.prototype.drawWith = function(context, color)
              {
                  if (!color) color = new Color();
                  context.strokeStyle = "black";
                  context.strokeRect(this.x, this.y, this.cx, this.cy);
                  context.fillStyle = (typeof color == "string"? color : color.toString());
                  context.fillRect(this.x, this.y, this.cx, this.cy);
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * Most panel layouts don't have bindings of their own, so we pass along all binding requests to the
               * Computer, CPU, Keyboard and Debugger components first.  The order shouldn't matter, since any component
               * that doesn't recognize the specified binding should simply ignore it.
               *
               * @this {Panel}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              Panel.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  if (this.cmp && this.cmp.setBinding(sHTMLType, sBinding, control)) return true;
                  if (this.cpu && this.cpu.setBinding(sHTMLType, sBinding, control)) return true;
                  if (this.kbd && this.kbd.setBinding(sHTMLType, sBinding, control)) return true;
                  if (DEBUGGER && this.dbg && this.dbg.setBinding(sHTMLType, sBinding, control)) return true;
              
                  if (!this.canvas && sHTMLType == "canvas") {
              
                      var panel = this;
                      var fPanel = false;
              
                      if (BACKTRACK && sBinding == "btpanel") {
                          this.fBackTrack = fPanel = true;
                      }
              
                      if (fPanel) {
                          this.canvas = control;
                          this.context = this.canvas.getContext("2d");
              
                          /*
                           * Employ the same gross onresize() hack for IE9/IE10 that we had to use for the Video canvas
                           */
                          if (web.getUserAgent().indexOf("MSIE") >= 0) {
                              this.canvas.onresize = function(canvas, cx, cy) {
                                  return function onResizeVideo() {
                                      canvas.style.height = (((canvas.clientWidth * cy) / cx) | 0) + "px";
                                  };
                              }(this.canvas, this.canvas.width, this.canvas.height);
                              this.canvas.onresize();
                          }
              
                          this.xMem = this.yMem = 0;
                          this.cxMem = ((this.canvas.width * Panel.LIVEMEM.CX) / Panel.LIVECANVAS.CX) | 0;
                          this.cyMem = this.canvas.height;
              
                          this.xReg = this.cxMem;
                          this.yReg = 0;
                          this.cxReg = this.canvas.width - this.cxMem;
                          this.cyReg = this.canvas.height;
              
                          this.xDump = this.xReg;
                          this.yDump = ((this.canvas.height * (Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY)) / Panel.LIVECANVAS.CY) | 0;
                          this.cxDump = this.cxReg;
                          this.cyDump = ((this.canvas.height * Panel.LIVEDUMP.CY) / Panel.LIVECANVAS.CY) | 0;
              
                          this.canvasLiveMem = window.document.createElement("canvas");
                          this.canvasLiveMem.width = Panel.LIVEMEM.CX;
                          this.canvasLiveMem.height = Panel.LIVEMEM.CY;
                          this.contextLiveMem = this.canvasLiveMem.getContext("2d");
                          this.imageLiveMem = this.contextLiveMem.createImageData(this.canvasLiveMem.width, this.canvasLiveMem.height);
              
                          this.canvasLiveRegs = window.document.createElement("canvas");
                          this.canvasLiveRegs.width = Panel.LIVEREGS.CX;
                          this.canvasLiveRegs.height = Panel.LIVEREGS.CY;
                          this.contextLiveRegs = this.canvasLiveRegs.getContext("2d");
              
                          this.canvas.addEventListener(
                              'mousemove',
                              function onMouseMove(event) {
                                  panel.moveMouse(event);
                              },
                              false               // we'll specify false for the 'useCapture' parameter for now...
                          );
                          this.canvas.addEventListener(
                              'mousedown',
                              function onMouseDown(event) {
                                  panel.clickMouse(event, true);
                              },
                              false               // we'll specify false for the 'useCapture' parameter for now...
                          );
                          this.canvas.addEventListener(
                              'mouseup',
                              function onMouseUp(event) {
                                  panel.clickMouse(event, false);
                              },
                              false               // we'll specify false for the 'useCapture' parameter for now...
                          );
              
                          this.fRedraw = true;
                          return true;
                      }
                  }
                  return this.parent.setBinding.call(this, sHTMLType, sBinding, control);
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {Panel}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              Panel.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.cmp = cmp;
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.kbd = cmp.getComponentByType("Keyboard");
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {Panel}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Panel.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) Panel.init();
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {Panel}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              Panel.prototype.powerDown = function(fSave, fShutdown)
              {
                  return true;
              };
              
              /**
               * clickMouse(event, fDown)
               *
               * @this {Panel}
               * @param {Object} event object from a 'mousedown' or 'mouseup' event
               * @param {boolean} fDown
               */
              Panel.prototype.clickMouse = function(event, fDown)
              {
                  /*
                   * event.button is 0 for the LEFT button and 2 for the RIGHT button
                   */
                  if (!event.button) {
                      this.lockMouse = fDown? 0 : -1;
                      this.fMouseDown = fDown;
                      this.updateMouse(event, fDown);
                  }
              };
              
              /**
               * moveMouse(event)
               *
               * @this {Panel}
               * @param {Object} event object from a 'mousemove' event
               */
              Panel.prototype.moveMouse = function(event)
              {
                  this.updateMouse(event);
              };
              
              /**
               * updateMouse(event, fDown)
               *
               * MouseEvent objects contain, among other things, the following properties:
               *
               *      clientX
               *      clientY
               *
               * I've selected the above properties because they're widely supported, not because I need
               * client-area coordinates.  In fact, layerX and layerY are probably closer to what I really want,
               * but I don't think they're available in all browsers.  screenX and screenY would work as well.
               *
               * @this {Panel}
               * @param {Object} event object from a mouse event (specifically, a MouseEvent object)
               * @param {boolean} [fDown] is true or false if this was a click event, otherwise it's just a move event
               */
              Panel.prototype.updateMouse = function(event, fDown)
              {
                  /*
                   * Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
                   * allocated size, and the coordinates we receive from mouse events are based on the currently displayed size.
                   */
                  var xScale = Panel.LIVECANVAS.CX / this.canvas.offsetWidth;
                  var yScale = Panel.LIVECANVAS.CY / this.canvas.offsetHeight;
              
                  var rect = this.canvas.getBoundingClientRect();
                  var x = ((event.clientX - rect.left) * xScale) | 0;
                  var y = ((event.clientY - rect.top) * yScale) | 0;
              
                  if (fDown == null) {
                      if (!this.lockMouse) {
                          this.lockMouse = Math.abs(this.xMouse - x) > Math.abs(this.yMouse - y)? 1 : 2;
                      }
                      if (this.lockMouse == 1) {
                          y = this.yMouse;
                      } else if (this.lockMouse == 2) {
                          x = this.xMouse;
                      }
                  }
              
                  this.xMouse = x;
                  this.yMouse = y;
              
                  if (MAXDEBUG) this.log("Panel.moveMouse(" + x + "," + y + ")");
              
                  if (x >= 0 && x < Panel.LIVECANVAS.CX && y >= 0 && y < Panel.LIVECANVAS.CY) {
                      /*
                       * Convert the mouse position into the corresponding memory address, assuming it's over the live memory area
                       */
                      var addr = this.findAddress(x, y);
                      if (addr !== X86.ADDR_INVALID) {
                          addr &= ~0xf;
                          if (addr != this.addrDumpLast) {
                              this.dumpMemory(addr, true);
                              this.addrDumpLast = addr;
                          }
                      }
                  }
              };
              
              /**
               * findAddress(x, y)
               *
               * @this {Panel}
               * @param {number} x
               * @param {number} y
               * @return {number} address corresponding to (x,y) canvas coordinates, or ADDR_INVALID if none
               */
              Panel.prototype.findAddress = function(x, y)
              {
                  if (x < Panel.LIVEMEM.CX && this.busInfo && this.busInfo.aRects) {
                      var i, rect;
                      for (i = 0; i < this.busInfo.aRects.length; i++) {
                          rect = this.busInfo.aRects[i];
                          if (rect.contains(x, y)) {
                              x -= rect.x;
                              y -= rect.y;
                              var region = this.busInfo.aRegions[i];
                              var iBlock = usr.getBitField(Bus.BlockInfo.num, this.busInfo.aBlocks[region.iBlock]);
                              var addr = iBlock * this.bus.nBlockSize;
                              var addrLimit = (iBlock + region.cBlocks) * this.bus.nBlockSize - 1;
              
                              /*
                               * If you want memory to be arranged "vertically" instead of "horizontally", do this:
                               *
                               *      if (x > 0) addr += rect.cy * (x - 1) * this.ratioMemoryToPixels;
                               *      addr += (y * this.ratioMemoryToPixels);
                               */
                              if (y > 0) addr += rect.cx * (y - 1) * this.ratioMemoryToPixels;
                              addr += (x * this.ratioMemoryToPixels);
              
                              addr |= 0;
                              if (addr > addrLimit) addr = addrLimit;
                              if (MAXDEBUG) this.log("Panel.findAddress(" + x + "," + y + ") found type " + Memory.TYPE.NAMES[region.type] + ", address %" + str.toHex(addr));
                              return addr;
                          }
                      }
                  }
                  return X86.ADDR_INVALID;
              };
              
              /**
               * updateAnimation()
               *
               * If the given Control Panel contains a canvas requiring animation (eg, "btpanel"), then this is where that happens.
               *
               * @this {Panel}
               */
              Panel.prototype.updateAnimation = function()
              {
                  if (this.fRedraw) {
              
                      this.initPen(10, Panel.LIVECANVAS.FONT.CY, this.canvasLiveMem, this.contextLiveMem, this.canvas.style.color);
              
                      if (this.fBackTrack) {
                          if (DEBUG) this.log("begin scanMemory()");
                          this.busInfo = this.bus.scanMemory(this.busInfo);
                          /*
                           * Calculate the pixel-to-memory-address ratio
                           */
                          this.ratioMemoryToPixels = (this.busInfo.cBlocks * this.bus.nBlockSize) / (Panel.LIVEMEM.CX * Panel.LIVEMEM.CY);
                          /*
                           * Update the BusInfo object with region information (cRegions and aRegions); return true if region
                           * information has changed since the last call.
                           */
                          if (this.findRegions()) {
                              /*
                               * For each region, I choose a slice of the LiveMem canvas and record the corresponding rectangle
                               * within an aRects array (parallel to the aRegions array) in the BusInfo object.
                               *
                               * I don't need a sophisticated Treemap algorithm, because at this level, the data is not hierarchical.
                               * subDivide() makes a simple horizontal or vertical slicing decision based on the ratio of region blocks
                               * to remaining blocks.
                               */
                              var i, rect;
                              var rectAvail = new Rectangle(0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height);
                              this.busInfo.aRects = [];
                              var cBlocksRemaining = this.busInfo.cBlocks;
              
                              for (i = 0; i < this.busInfo.cRegions; i++) {
                                  var cBlocksRegion = this.busInfo.aRegions[i].cBlocks;
                                  this.busInfo.aRects.push(rect = rectAvail.subDivide(cBlocksRegion, cBlocksRemaining, !i));
                                  if (MAXDEBUG) this.log("region " + i + " rectangle: (" + rect.x + "," + rect.y + " " + rect.cx + "," + rect.cy + ")");
                                  cBlocksRemaining -= cBlocksRegion;
                              }
              
                              /*
                               * Assert that not only did all the specified regions account for all the specified blocks, but also that
                               * the series of subDivide() calls exhausted the original rectangle to one of either zero width or zero height.
                               */
                              this.assert(!cBlocksRemaining && (!rectAvail.cx || !rectAvail.cy));
              
                              /*
                               * Now draw all the rectangles produced by the series of subDivide() calls.
                               */
                              for (i = 0; i < this.busInfo.aRects.length; i++) {
                                  var region = this.busInfo.aRegions[i];
                                  rect = this.busInfo.aRects[i];
                                  rect.drawWith(this.contextLiveMem, Memory.TYPE.COLORS[region.type]);
                                  this.centerPen(rect);
                                  this.centerText(Memory.TYPE.NAMES[region.type] + " (" + (((region.cBlocks * this.bus.nBlockSize) / 1024) | 0) + "Kb)");
                              }
                          }
                          if (DEBUG) this.log("end scanMemory(): total bytes: " + this.busInfo.cbTotal + ", total blocks: " + this.busInfo.cBlocks + ", total regions: " + this.busInfo.cRegions);
                      } else {
                          this.drawText("This space intentionally left blank");
                      }
                      this.context.drawImage(this.canvasLiveMem, 0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height, this.xMem, this.yMem, this.cxMem, this.cyMem);
                      this.fRedraw = false;
                  }
              };
              
              /**
               * updateStatus()
               *
               * Update function for Control Panels containing DOM elements with low-frequencyxt display requirements.
               *
               * For the time being, the X86CPU component has its own updateStatus() handler, and displays all CPU registers itself.
               *
               * @this {Panel}
               */
              Panel.prototype.updateStatus = function()
              {
                  if (this.canvas) {
                      this.dumpRegisters();
                  }
              };
              
              /**
               * findRegions()
               *
               * This takes the BusInfo object produced by scanMemory() and adds the following:
               *
               *      cRegions:   number of contiguous memory regions
               *      aRegions:   array of aBlocks [index, count, type] objects
               *
               * It calls addRegion() for each discrete region (set of contiguous blocks with the same type) that it finds.
               *
               * @this {Panel}
               * @return {boolean} true if current region checksum differed from previous checksum (ie, one or more regions changed)
               */
              Panel.prototype.findRegions = function()
              {
                  var checksum = 0;
                  this.busInfo.cRegions = 0;
                  if (!this.busInfo.aRegions) this.busInfo.aRegions = [];
              
                  var typeRegion = -1, iBlockRegion = 0, addrRegion = 0, nBlockPrev = -1;
              
                  for (var iBlock = 0; iBlock < this.busInfo.cBlocks; iBlock++) {
                      var blockInfo = this.busInfo.aBlocks[iBlock];
                      var typeBlock = usr.getBitField(Bus.BlockInfo.type, blockInfo);
                      var nBlockCurr = usr.getBitField(Bus.BlockInfo.num, blockInfo);
                      if (typeBlock != typeRegion || nBlockCurr != nBlockPrev + 1) {
                          var cBlocks = iBlock - iBlockRegion;
                          if (cBlocks) {
                              checksum += this.addRegion(addrRegion, iBlockRegion, cBlocks, typeRegion);
                          }
                          typeRegion = typeBlock;
                          iBlockRegion = iBlock;
                          addrRegion = nBlockCurr << this.bus.nBlockShift;
                      }
                      nBlockPrev = nBlockCurr;
                  }
              
                  checksum += this.addRegion(addrRegion, iBlockRegion, iBlock - iBlockRegion, typeRegion);
              
                  var fChanged = (this.busInfo.checksumRegions != checksum);
                  this.busInfo.checksumRegions = checksum;
                  return fChanged;
              };
              
              /**
               * Region object definition
               *
               *  iBlock:     starting block number
               *  cBlocks:    number of blocks spanned by region
               *  type:       type of all blocks in the region (see Memory.TYPE.*)
               *
               * @typedef {{
               *  iBlock:     number,
               *  cBlocks:    number,
               *  type:       number
               * }}
               */
              var Region;
              
              /**
               * addRegion(addr, iBlock, cBlocks, type)
               *
               * @this {Panel}
               * @param {number} addr
               * @param {number} iBlock
               * @param {number} cBlocks
               * @param {number} type
               * @return {number} bitfield containing the above values (used for checksum)
               */
              Panel.prototype.addRegion = function(addr, iBlock, cBlocks, type)
              {
                  if (DEBUG) this.log("region " + this.busInfo.cRegions + " (addr " + str.toHexLong(addr) + ", type " + Memory.TYPE.NAMES[type] + ") contains " + cBlocks + " blocks");
                  this.busInfo.aRegions[this.busInfo.cRegions++] = {iBlock: iBlock, cBlocks: cBlocks, type: type};
                  return usr.initBitFields(Bus.BlockInfo, iBlock, cBlocks, 0, type);
              };
              
              /**
               * dumpRegisters()
               *
               * Updates the live register portion of the panel.
               *
               * @this {Panel}
               */
              Panel.prototype.dumpRegisters = function()
              {
                  if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
              
                      var x = 0, y = 0, cx = this.canvasLiveRegs.width, cy = this.canvasLiveRegs.height;
              
                      this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
                      this.contextLiveRegs.fillRect(x, y, cx, cy);
              
                      this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
                      this.initCols(3);
                      this.drawText("CPU");
                      this.drawText("Target");
                      this.drawText("Current");
                      this.skipLines();
                      this.drawText(this.cpu.model);
                      this.drawText(this.cpu.getSpeedTarget());
                      this.drawText(this.cpu.getSpeedCurrent());
                      this.skipLines(2);
                      this.initCols(8);
                      this.initNumberFormat(16, this.cpu.model < X86.MODEL_80386? 4 : 8);
                      this.drawText("AX", this.cpu.regEAX, 2);
                      this.drawText("DS", this.cpu.getDS(), 0, 1);
                      this.drawText("DX", this.cpu.regEDX, 2);
                      this.drawText("SI", this.cpu.regESI, 0, 1.5);
                      this.drawText("BX", this.cpu.regEBX, 2);
                      this.drawText("ES", this.cpu.getES(), 0, 1);
                      this.drawText("CX", this.cpu.regECX, 2);
                      this.drawText("DI", this.cpu.regEDI, 0, 1.5);
                      this.drawText("CS", this.cpu.getCS(), 2);
                      this.drawText("SS", this.cpu.getSS(), 0, 1);
                      this.drawText("IP", this.cpu.getIP(), 2);
                      this.drawText("SP", this.cpu.getSP(), 0, 1.5);
                      var regPS;
                      this.drawText("PS", regPS = this.cpu.getPS(), 2);
                      this.drawText("BP", this.cpu.regEBP, 0, 1.5);
                      if (this.cpu.model >= X86.MODEL_80386) {
                          this.drawText("FS", this.cpu.getFS(), 2);
                          this.drawText("CR0", this.cpu.regCR0, 0, 1);
                          this.drawText("GS", this.cpu.getGS(), 2);
                          this.drawText("CR3", this.cpu.regCR3, 0, 1.5);
                      }
                      this.initCols(9);
                      this.drawText("V" + ((regPS & X86.PS.OF)? 1 : 0));
                      this.drawText("D" + ((regPS & X86.PS.DF)? 1 : 0));
                      this.drawText("I" + ((regPS & X86.PS.IF)? 1 : 0));
                      this.drawText("T" + ((regPS & X86.PS.TF)? 1 : 0));
                      this.drawText("S" + ((regPS & X86.PS.SF)? 1 : 0));
                      this.drawText("Z" + ((regPS & X86.PS.ZF)? 1 : 0));
                      this.drawText("A" + ((regPS & X86.PS.AF)? 1 : 0));
                      this.drawText("P" + ((regPS & X86.PS.PF)? 1 : 0));
                      this.drawText("C" + ((regPS & X86.PS.CF)? 1 : 0), 0, 2);
              
                      this.dumpMemory(this.addrDumpLast);
              
                      this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xReg, this.yReg, this.cxReg, this.cyReg);
                  }
              };
              
              /**
               * dumpMemory(addr, fDraw)
               *
               * @this {Panel}
               * @param {number} addr
               * @param {boolean} [fDraw]
               */
              Panel.prototype.dumpMemory = function(addr, fDraw)
              {
                  if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
              
                      var x = 0, y = Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY, cx = this.canvasLiveRegs.width, cy = Panel.LIVEDUMP.CY;
              
                      this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
                      this.contextLiveRegs.fillRect(x, y, cx, cy);
              
                      this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
                      this.initCols(24);
                      if (addr == null) {
                          this.drawText("Mouse over memory to dump");
                      } else {
                          this.drawText(str.toHexLong(addr), null, 0, 1);
                          for (var iLine = 1; iLine <= 16; iLine++) {
                              var sChars = "";
                              for (var iCol = 1; iCol <= 8; iCol++) {
                                  var b = this.bus.getByteDirect(addr++);
                                  this.drawText(str.toHex(b, 2), null, 1);
                                  sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                              }
                              this.drawText(sChars, null, 0, 1);
                          }
                      }
              
                      if (fDraw) this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xDump, this.yDump, this.cxDump, this.cyDump);
                  }
              };
              
              /**
               * initPen(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
               *
               * @this {Panel}
               * @param {number} xLeft
               * @param {number} yTop
               * @param {HTMLCanvasElement} [canvas]
               * @param {Object} [context]
               * @param {string} [sColor]
               * @param {number} [cyFont]
               * @param {string} [sFontFace]
               */
              Panel.prototype.initPen = function(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
              {
                  this.setPen(this.xLeftMargin = xLeft, yTop);
                  this.heightText = this.heightDefault = cyFont || Panel.LIVECANVAS.FONT.CY;
                  if (!sFontFace) sFontFace = this.fontDefault || (this.heightDefault + "px " + Panel.LIVECANVAS.FONT.FACE);
                  this.fontText = this.fontDefault = sFontFace;
                  if (canvas) {
                      this.canvasText = canvas;
                  }
                  if (context) {
                      this.contextText = context;
                      this.colorText = sColor || "white";
                  }
              };
              
              /**
               * setPen(x, y)
               *
               * @this {Panel}
               * @param {number} x
               * @param {number} y
               */
              Panel.prototype.setPen = function(x, y)
              {
                  this.xText = x;
                  this.yText = y;
              };
              
              /**
               * centerPen(rect)
               *
               * @this {Panel}
               * @param {Rectangle} rect
               */
              Panel.prototype.centerPen = function(rect)
              {
                  this.fontText = this.fontDefault;
                  this.heightText = this.heightDefault;
                  var x = rect.x + (rect.cx >> 1);
                  var y = rect.y + (rect.cy >> 1);
                  var maxText = rect.cy;
                  if (rect.cx < rect.cy) {
                      maxText = rect.cx;
                      this.fVerticalText = true;
                      this.contextText.save();
                      this.contextText.translate(x, y);
                      this.contextText.rotate(-Math.PI/2);
                      x = y = 0;
                  }
                  if (maxText < this.heightText) {
                      this.heightText = maxText;
                      this.fontText = this.heightText + "px " + Panel.LIVECANVAS.FONT.FACE;
                  }
                  this.setPen(x, y);
              };
              
              /**
               * initCols(nCols)
               *
               * @this {Panel}
               * @param {number} nCols
               */
              Panel.prototype.initCols = function(nCols)
              {
                  this.cxColumn = (this.canvasText.width / nCols) | 0;
              };
              
              /**
               * skipCols(nCols)
               *
               * @this {Panel}
               * @param {number} nCols
               */
              Panel.prototype.skipCols = function(nCols)
              {
                  this.xText += this.cxColumn * nCols;
              };
              
              /**
               * skipLines(nLines)
               *
               * @this {Panel}
               * @param {number} [nLines]
               */
              Panel.prototype.skipLines = function(nLines)
              {
                  this.xText = this.xLeftMargin;
                  this.yText += (this.heightText + 2) * (nLines || 1);
              };
              
              /**
               * initNumberFormat(nBase, nDigits)
               *
               * @this {Panel}
               * @param {number} nBase
               * @param {number} nDigits
               */
              Panel.prototype.initNumberFormat = function(nBase, nDigits)
              {
                  this.nDefaultBase = nBase;
                  this.nDefaultDigits = nDigits;
              };
              
              /**
               * drawText(sText)
               *
               * @this {Panel}
               * @param {string} sText
               * @param {number|null} [nValue]
               * @param {number} [nColsSkip]
               * @param {number} [nLinesSkip]
               */
              Panel.prototype.drawText = function(sText, nValue, nColsSkip, nLinesSkip)
              {
                  this.contextText.font = this.fontText;
                  this.contextText.fillStyle = this.colorText;
                  this.contextText.fillText(sText, this.xText, this.yText);
                  this.xText += this.cxColumn;
                  if (nValue != null) {
                      var sValue;
                      if (this.nDefaultBase != 16) {
                          sValue = nValue.toString();
                      } else {
                          sValue = this.nDefaultDigits < 8? "0x" : "";
                          sValue += str.toHex(nValue, this.nDefaultDigits);
                      }
                      this.contextText.fillText(sValue, this.xText, this.yText);
                      this.xText += this.cxColumn;
                  }
                  if (nColsSkip) this.skipCols(nColsSkip);
                  if (nLinesSkip) this.skipLines(nLinesSkip);
              };
              
              /**
               * centerText(sText)
               *
               * To center text within a given Rectangle:
               *
               *      centerPen(rect)
               *      centerText(sText)
               *
               * centerPen() sets xLeft and yTop to the center of the specified rectangle, and centerText() calculates
               * the width of the text, adjusting the horizontal centering by its width and the vertical centering by the
               * default font height.  Then it calls drawText().
               *
               * @this {Panel}
               * @param {string} sText
               */
              Panel.prototype.centerText = function(sText)
              {
                  this.contextText.font = this.fontText;
                  var tm = this.contextText.measureText(sText);
                  this.xText -= tm.width >> 1;
                  this.yText += (this.heightText >> 1) - 2;
                  this.drawText(sText);
                  if (this.fVerticalText) {
                      this.contextText.restore();
                      this.fVerticalText = false;
                  }
              };
              
              /**
               * Panel.init()
               *
               * This function operates on every HTML element of class "panel", extracting the
               * JSON-encoded parameters for the Panel constructor from the element's "data-value"
               * attribute, invoking the constructor to create a Panel component, and then binding
               * any associated HTML controls to the new component.
               *
               * NOTE: Unlike most other component init() functions, this one is designed to be
               * called multiple times: once at load time, so that we can binding our print()
               * function to the panel's output control ASAP, and again when the Computer component
               * is verifying that all components are ready and invoking their powerUp() functions.
               *
               * Our powerUp() method gives us a second opportunity to notify any components that
               * that might care (eg, CPU, Keyboard, and Debugger) that we have some controls they
               * might want to use.
               */
              Panel.init = function()
              {
                  var fReady = false;
                  var aePanels = Component.getElementsByClass(window.document, PCJSCLASS, "panel");
                  for (var iPanel=0; iPanel < aePanels.length; iPanel++) {
                      var ePanel = aePanels[iPanel];
                      var parmsPanel = Component.getComponentParms(ePanel);
                      var panel = Component.getComponentByID(parmsPanel['id']);
                      if (!panel) {
                          fReady = true;
                          panel = new Panel(parmsPanel);
                      }
                      Component.bindComponentControls(panel, ePanel, PCJSCLASS);
                      if (fReady) panel.setReady();
                  }
              };
              
              /*
               * Initialize every Panel module on the page.
               */
              web.onInit(Panel.init);
              
              if (typeof module !== 'undefined') module.exports = Panel;
              
            • ram.js
              /**
               * @fileoverview Implements the PCjs RAM component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-15
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Memory      = require("./memory");
                  var ROM         = require("./rom");
              }
              
              /**
               * RAM(parmsRAM)
               *
               * The RAM component expects the following (parmsRAM) properties:
               *
               *      addr: starting physical address of RAM
               *      size: amount of RAM, in bytes (optional)
               *
               * NOTE: We make a note of the specified size, but no memory is initially allocated
               * for the RAM until the Computer component calls powerUp().
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsRAM
               */
              function RAM(parmsRAM)
              {
                  Component.call(this, "RAM", parmsRAM, RAM);
              
                  this.addrRAM = parmsRAM['addr'];
                  this.sizeRAM = parmsRAM['size'];
                  this.fTestRAM = parmsRAM['test'];
                  this.fInstalled = (!!this.sizeRAM); // 0 is the default value for 'size' when none is specified
                  this.fAllocated = false;
              }
              
              Component.subclass(RAM);
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {RAM}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              RAM.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.chipset = cmp.getComponentByType("ChipSet");
                  this.setReady();
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {RAM}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              RAM.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      /*
                       * The Computer powers up the CPU last, at which point the X86 state is restored,
                       * which includes the Bus state, and since we use the Bus to allocate all our memory,
                       * memory contents are already restored for us, so we don't need the usual restore
                       * logic.  We just need to call reset(), to allocate memory for the RAM.
                       *
                      if (!data || !this.restore) {
                          this.reset();
                      } else {
                          if (!this.restore(data)) return false;
                      }
                       */
                      this.reset();
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {RAM}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              RAM.prototype.powerDown = function(fSave, fShutdown)
              {
                  /*
                   * The Computer powers down the CPU first, at which point the X86 state is saved,
                   * which includes the Bus state, and since we use the Bus component to allocate all
                   * our memory, memory contents are already saved for us, so we don't need the usual
                   * save logic.
                   *
                  return fSave && this.save ? this.save() : true;
                   */
                  return true;
              };
              
              /**
               * reset()
               *
               * NOTE: When we were initialized, we were given an amount of INSTALLED memory (see sizeRAM above).
               * The ChipSet component, on the other hand, tells us how much SPECIFIED memory there is -- which,
               * like a real PC, may not match the amount of installed memory (due to either user error or perhaps
               * an attempt to prevent some portion of the installed memory from being used).
               *
               * However, since we're a virtual machine, we can defer allocation of RAM until we're able to query the
               * ChipSet component, and then allocate an amount of memory that matches the SPECIFIED memory, making
               * it easy to reconfigure the machine on the fly and prevent mismatches.
               *
               * But, we do that ONLY for the RAM instance configured with an addrRAM of 0x0000, and ONLY if that RAM
               * object was not given a specific size (see fInstalled).  If there are other RAM objects in the system,
               * they must necessarily specify a non-conflicting, non-zero start address, in which case their sizeRAM
               * value will never be affected by the ChipSet settings.
               *
               * @this {RAM}
               */
              RAM.prototype.reset = function()
              {
                  if (!this.addrRAM && !this.fInstalled && this.chipset) {
                      var baseRAM = this.chipset.getSWMemorySize() * 1024;
                      if (this.sizeRAM && baseRAM != this.sizeRAM) {
                          this.bus.removeMemory(this.addrRAM, this.sizeRAM);
                          this.fAllocated = false;
                      }
                      this.sizeRAM = baseRAM;
                  }
                  if (!this.fAllocated && this.sizeRAM) {
                      if (this.bus.addMemory(this.addrRAM, this.sizeRAM, Memory.TYPE.RAM)) {
                          this.fAllocated = true;
              
                          this.status(Math.floor(this.sizeRAM / 1024) + "Kb allocated");
              
                          /*
                           * NOTE: I'm specifying MAXDEBUG for status() messages because I'm not yet sure I want these
                           * messages buried in the app, since they're seen only when a Control Panel is active.  Another
                           * and perhaps better alternative is to add "comment" attributes to the XML configuration file
                           * for these components, which the Computer component will display as it "powers up" components.
                           */
                          if (MAXDEBUG && this.fInstalled) this.status("specified size overrides SW1");
              
                          /*
                           * Memory with an ID of "ramCPQ" is reserved for built-in memory located just below the 16Mb
                           * boundary on Compaq DeskPro 386 machines.
                           *
                           * Technically, that memory is part of the first 1Mb of memory that also provides up to 640Kb
                           * of conventional memory (ie, memory below 1Mb).
                           *
                           * However, PCjs doesn't support individual memory allocations that (a) are discontiguous
                           * or (b) dynamically change location.  Components must simulate those features by performing
                           * a separate allocation for each starting address, and removing/adding memory allocations
                           * whenever their starting address changes.
                           *
                           * Therefore, a DeskPro 386's first 1Mb of physical memory is allocated by PCjs in two pieces,
                           * and the second piece must have an ID of "ramCPQ", triggering the additional allocation of
                           * Compaq-specific memory-mapped registers.
                           *
                           * See CompaqController for more details.
                           */
                          if (COMPAQ386) {
                              if (this.idComponent == "ramCPQ") {
                                  this.controller = new CompaqController(this);
                                  this.bus.addMemory(CompaqController.ADDR, 1, Memory.TYPE.CTRL, this.controller);
                              }
                          }
                      }
                  }
                  if (this.fAllocated) {
                      if (!this.fTestRAM) {
                          /*
                           * HACK: Set the word at 40:72 in the ROM BIOS Data Area (RBDA) to 0x1234 to bypass the ROM BIOS
                           * memory storage tests. See rom.js for all RBDA definitions.
                           */
                          if (MAXDEBUG) this.status("ROM BIOS memory test has been disabled");
                          this.bus.setShortDirect(ROM.BIOS.RESET_FLAG, ROM.BIOS.RESET_FLAG_WARMBOOT);
                      }
                      /*
                       * Don't add the "ramCPQ" memory to the CMOS total, because addCMOSMemory() will add it to the extended
                       * memory total, which will just confuse the Compaq BIOS.
                       */
                      if (!COMPAQ386 || this.idComponent != "ramCPQ") {
                          if (this.chipset) this.chipset.addCMOSMemory(this.addrRAM, this.sizeRAM);
                      }
                  } else {
                      Component.error("No RAM allocated");
                  }
              };
              
              /**
               * RAM.init()
               *
               * This function operates on every HTML element of class "ram", extracting the
               * JSON-encoded parameters for the RAM constructor from the element's "data-value"
               * attribute, invoking the constructor to create a RAM component, and then binding
               * any associated HTML controls to the new component.
               */
              RAM.init = function()
              {
                  var aeRAM = Component.getElementsByClass(window.document, PCJSCLASS, "ram");
                  for (var iRAM = 0; iRAM < aeRAM.length; iRAM++) {
                      var eRAM = aeRAM[iRAM];
                      var parmsRAM = Component.getComponentParms(eRAM);
                      var ram = new RAM(parmsRAM);
                      Component.bindComponentControls(ram, eRAM, PCJSCLASS);
                  }
              };
              
              /**
               * CompaqController(ram)
               *
               * DeskPro 386 machines came with a minimum of 1Mb of RAM, which could be configured (via jumpers)
               * for 256Kb, 512Kb or 640Kb of conventional memory, starting at address 0x00000000, with the
               * remainder (768Kb, 512Kb, or 384Kb) accessible only at an address just below 0x01000000.  In PCjs,
               * this second chunk of RAM must be separately allocated, with an ID of "ramCPQ".
               *
               * The typical configuration was 640Kb of conventional memory, leaving 384Kb accessible at 0x00FA0000.
               * Presumably, the other configurations (256Kb and 512Kb) would leave 768Kb and 512Kb accessible at
               * 0x00F40000 and 0x00F80000, respectively.
               *
               * The DeskPro 386 also contained two memory-mapped registers at 0x80C00000.  The first is a write-only
               * mapping register that provides the ability to map the 128Kb at 0x00FE0000 to 0x000E0000, replacing
               * any ROMs in the range 0x000E0000-0x000FFFFF, and optionally write-protecting that 128Kb; internally,
               * this register corresponds to wMappings.
               *
               * The second register is a read-only diagnostics register that indicates jumper configuration and
               * parity errors; internally, this register corresponds to wSettings.
               *
               * To emulate the memory-mapped registers at 0x80C00000, the RAM component allocates a block at that
               * address using this custom controller once it sees an allocation for "ramCPQ".
               *
               * Later, when the addressibility of "ramCPQ" memory is altered, we record the blocks in all the
               * memory slots spanning 0x000E0000-0x000FFFFF, and then update those slots with the blocks from
               * 0x00FE0000-0x00FFFFFF.  Note that only the top 128Kb of "ramCPQ" addressibility is affected; the
               * rest of that memory, ranging anywhere from 256Kb to 640Kb, remains addressible at its original
               * location.  Compaq's CEMM and VDISK utilities were generally the only software able to access that
               * remaining memory (what Compaq refers to as "Compaq Built-in Memory").
               *
               * @constructor
               * @param {RAM} ram
               */
              function CompaqController(ram)
              {
                  this.ram = ram;
                  this.wMappings = CompaqController.MAPPINGS.DEFAULT;
                  /*
                   * TODO: wSettings needs to reflect the actual amount of configured memory....
                   */
                  this.wSettings = CompaqController.SETTINGS.DEFAULT;
                  this.wRAMSetup = CompaqController.RAMSETUP.DEFAULT;
                  this.aBlocksDst = null;
              }
              
              CompaqController.ADDR       = 0x80C00000|0;
              CompaqController.MAP_SRC    = 0x00FE0000;
              CompaqController.MAP_DST    = 0x000E0000;
              CompaqController.MAP_SIZE   = 0x00020000;
              
              /*
               * Bit definitions for the 16-bit write-only memory-mapping register (wMappings)
               *
               * NOTE: Although Compaq says the memory at %FE0000 is "relocated", it actually remains addressable
               * at %FE0000; it simply becomes addressable at %0E0000 as well, displacing any ROMs that used to be
               * addressable at %0E0000 through %0FFFFF.
               */
              CompaqController.MAPPINGS = {
                  UNMAPPED:   0x0001,             // is this bit is CLEAR, the last 128Kb (at 0x00FE0000) is mapped to 0x000E0000
                  READWRITE:  0x0002,             // if this bit is CLEAR, the last 128Kb (at 0x00FE0000) is read-only (ie, write-protected)
                  RESERVED:   0xFFFC,             // the remaining 6 bits are reserved and should always be SET
                  DEFAULT:    0xFFFF              // our default settings (no mapping, no write-protection)
              };
              
              /*
               * Bit definitions for the 16-bit read-only settings/diagnostics register (wSettings)
               *
               * SW1-7 and SW1-8 are mapped to bits 5 and 4 of wSettings, respectively, as follows:
               *
               *      SW1-7   SW1-8   Bit5    Bit4    Amount (of base memory provided by the Compaq 32-bit memory board)
               *      -----   -----   ----    ----    ------
               *        ON      ON      0       0     640Kb
               *        ON      OFF     0       1     Invalid
               *        OFF     ON      1       0     512Kb
               *        OFF     OFF     1       1     256Kb
               *
               * Other SW1 switches include:
               *
               *      SW1-1:  ON enables fail-safe timer
               *      SW1-2:  ON indicates 80387 coprocessor installed
               *      SW1-3:  ON sets memory from 0xC00000 to 0xFFFFFF (between 12 and 16 megabytes) non-cacheable
               *      SW1-4:  ON selects AUTO system speed (OFF selects HIGH system speed)
               *      SW1-5:  RESERVED (however, the system can read its state; see below)
               *      SW1-6:  Compaq Dual-Mode Monitor or Color Monitor (OFF selects Monochrome monitor other than Compaq)
               *
               * While SW1-7 and SW1-8 are connected to this memory-mapped register, other SW1 DIP switches are accessible
               * through the 8042 Keyboard Controller's KBC.INPORT register, as follows:
               *
               *      SW1-1:  TODO: Determine
               *      SW1-2:  ChipSet.KBC.INPORT.COMPAQ_NO80387 clear if ON, set (0x04) if OFF
               *      SW1-3:  TODO: Determine
               *      SW1-4:  ChipSet.KBC.INPORT.COMPAQ_HISPEED clear if ON, set (0x10) if OFF
               *      SW1-5:  ChipSet.KBC.INPORT.COMPAQ_DIP5OFF clear if ON, set (0x20) if OFF
               *      SW1-6:  ChipSet.KBC.INPORT.COMPAQ_NONDUAL clear if ON, set (0x40) if OFF
               */
              CompaqController.SETTINGS = {
                  B0_PARITY:  0x0001,         // parity OK in byte 0
                  B1_PARITY:  0x0002,         // parity OK in byte 1
                  B2_PARITY:  0x0004,         // parity OK in byte 2
                  B3_PARITY:  0x0008,         // parity OK in byte 3
                  BASE_640KB: 0x0000,         // SW1-7,8: ON  ON   Bits 5,4: 00
                  BASE_ERROR: 0x0010,         // SW1-7,8: ON  OFF  Bits 5,4: 01
                  BASE_512KB: 0x0020,         // SW1-7,8: OFF ON   Bits 5,4: 10
                  BASE_256KB: 0x0030,         // SW1-7,8: OFF OFF  Bits 5,4: 11
                  /*
                   * TODO: The DeskPro 386/25 TechRef says bit 6 (0x40) is always set,
                   * but setting it results in memory configuration errors; review.
                   */
                  ADDED_1MB:  0x0040,
                  /*
                   * TODO: The DeskPro 386/25 TechRef says bit 7 (0x80) is always clear; review.
                   */
                  PIGGYBACK:  0x0080,
                  SYS_4MB:    0x0100,         // 4Mb on system board
                  SYS_1MB:    0x0200,         // 1Mb on system board
                  SYS_NONE:   0x0300,         // no memory on system board
                  MODA_4MB:   0x0400,         // 4Mb on module A board
                  MODA_1MB:   0x0800,         // 1Mb on module A board
                  MODA_NONE:  0x0C00,         // no memory on module A board
                  MODB_4MB:   0x1000,         // 4Mb on module B board
                  MODB_1MB:   0x2000,         // 1Mb on module B board
                  MODB_NONE:  0x3000,         // no memory on module B board
                  MODC_4MB:   0x4000,         // 4Mb on module C board
                  MODC_1MB:   0x8000,         // 1Mb on module C board
                  MODC_NONE:  0xC000,         // no memory on module C board
                  /*
                   * NOTE: It doesn't seem to matter to the ROM whether I set any of bits 8-15 or not....
                   */
                  DEFAULT:    0x0A0F          // our default settings (ie, parity OK, 640Kb base memory, 1Mb system memory, 1Mb module A memory)
              };
              
              CompaqController.RAMSETUP = {
                  SETUP:      0x000F,
                  CACHE:      0x0040,
                  RESERVED:   0xFFB0,
                  DEFAULT:    0x0002          // our default settings (ie, 2Mb, cache disabled)
              };
              
              /**
               * readByte(off, addr)
               *
               * @this {Memory}
               * @param {number} off (relative to 0x80C00000)
               * @param {number} [addr]
               * @return {number}
               */
              CompaqController.readByte = function readCompaqControllerByte(off, addr)
              {
                  var b = 0xff;
                  if (off < 0x02) {
                      b = (off & 0x1)? (this.controller.wSettings >> 8) : (this.controller.wSettings & 0xff);
                  }
                  else if (off < 0x4) {
                      b = (off & 0x1)? (this.controller.wRAMSetup >> 8) : (this.controller.wRAMSetup & 0xff);
                  }
                  if (DEBUG) {
                      this.controller.ram.printMessage("CompaqController.readByte(" + str.toHexWord(off) + ") returned " + str.toHexByte(b), true, true);
                      if (MAXDEBUG && DEBUGGER && off >= 0x2) this.dbg.stopCPU();
                  }
                  return b;
              };
              
              /**
               * writeByte(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off (relative to 0x80C00000)
               * @param {number} b
               * @param {number} [addr]
               */
              CompaqController.writeByte = function writeCompaqControllerByte(off, b, addr)
              {
                  var controller = this.controller;
              
                  /*
                   * Check for write to 0x80C00000
                   */
                  if (!off) {
                      if (b != (controller.wMappings & 0xff)) {
                          var bus = controller.ram.bus;
                          if (!(b & CompaqController.MAPPINGS.UNMAPPED)) {
                              if (!controller.aBlocksDst) {
                                  controller.aBlocksDst = bus.getMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE);
                              }
                              /*
                               * You might think that the next three lines could ALSO be moved to the preceding IF,
                               * but it's possible for the write-protection feature to be enabled/disabled separately
                               * from the mapping feature.  We could avoid executing this code as well by checking the
                               * current read-write state, but this is an infrequent operation, so there's no point.
                               */
                              var aBlocks = bus.getMemoryBlocks(CompaqController.MAP_SRC, CompaqController.MAP_SIZE);
                              var type = (b & CompaqController.MAPPINGS.READWRITE)? Memory.TYPE.RAM : Memory.TYPE.ROM;
                              bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, aBlocks, type);
                          }
                          else {
                              if (controller.aBlocksDst) {
                                  bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, controller.aBlocksDst);
                                  controller.aBlocksDst = null;
                              }
                          }
                          controller.wMappings = (controller.wMappings & ~0xff) | b;
                          if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
                      }
                  }
                  /*
                   * Check for write to 0x80C00002
                   */
                  else if (off == 0x2) {
                      controller.wRAMSetup = (controller.wRAMSetup & ~0xff) | b;
                      if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
                  }
                  /*
                   * All bits in 0x80C00001 and 0x80C00003 are reserved, so we can simply ignore those writes.
                   */
                  if (DEBUG) {
                      this.controller.ram.printMessage("CompaqController.writeByte(" + str.toHexWord(off) + "," + str.toHexByte(b) + ")", true, true);
                  }
              };
              
              CompaqController.BUFFER = [null, 0];
              CompaqController.ACCESS = [CompaqController.readByte, null, null, CompaqController.writeByte, null, null];
              
              /**
               * getMemoryBuffer(addr)
               *
               * @this {CompaqController}
               * @param {number} addr
               * @return {Array} containing the buffer (and an offset within that buffer)
               */
              CompaqController.prototype.getMemoryBuffer = function(addr)
              {
                  return CompaqController.BUFFER;
              };
              
              /**
               * getMemoryAccess()
               *
               * @this {CompaqController}
               * @return {Array.<function()>}
               */
              CompaqController.prototype.getMemoryAccess = function()
              {
                  return CompaqController.ACCESS;
              };
              
              /*
               * Initialize all the RAM modules on the page.
               */
              web.onInit(RAM.init);
              
              if (typeof module !== 'undefined') module.exports = RAM;
              
            • rom.js
              /**
               * @fileoverview Implements the PCjs ROM component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-15
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var DumpAPI     = require("../../shared/lib/dumpapi");
                  var Component   = require("../../shared/lib/component");
                  var Memory      = require("./memory");
              }
              
              /**
               * ROM(parmsROM)
               *
               * The ROM component expects the following (parmsROM) properties:
               *
               *      addr: physical address of ROM
               *      size: amount of ROM, in bytes
               *      alias: physical alias address (null if none)
               *      file: name of ROM data file
               *      notify: ID of a component to notify once the ROM is in place (optional)
               *
               * NOTE: The ROM data will not be copied into place until the Bus is ready (see initBus()) AND the
               * ROM data file has finished loading (see onLoadROM()).
               *
               * Also, while the size parameter may seem redundant, I consider it useful to confirm that the ROM you received
               * is the ROM you expected.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsROM
               */
              function ROM(parmsROM)
              {
                  Component.call(this, "ROM", parmsROM, ROM);
              
                  this.abROM = null;
                  this.addrROM = parmsROM['addr'];
                  this.sizeROM = parmsROM['size'];
              
                  /*
                   * The new 'alias' property can now be EITHER a single physical address (like 'addr') OR an array of
                   * physical addresses; eg:
                   *
                   *      [0xf0000,0xffff0000,0xffff8000]
                   *
                   * We could have overloaded 'addr' to accomplish the same thing, but I think it's better to have any
                   * aliased locations listed under a separate property.
                   *
                   * Most ROMs are not aliased, in which case the 'alias' property should have the default value of null.
                   */
                  this.addrAlias = parmsROM['alias'];
              
                  this.sFilePath = parmsROM['file'];
                  this.sFileName = str.getBaseName(this.sFilePath);
              
                  /*
                   * The 'notify' property can now (as of v1.18.2) contain an array of parameters that the notified
                   * component (typically Video) may use as it sees fit.  For example, the Video component is generally
                   * interested in knowing the offsets of specific font tables within the ROM, which used to be hard-coded
                   * when all we supported were a few specific IBM video cards, but that's no longer feasible as we move
                   * beyond the original handful of IBM cards.
                   *
                   * It's up to the notified component to decide how to interpret the parameters it receives, if any.
                   */
                  this.idNotify = parmsROM['notify'];
                  this.aNotifyParms = null;
                  if (this.idNotify) {
                      var i = this.idNotify.indexOf('[');
                      if (i > 0) {
                          try {
                              this.aNotifyParms = eval(this.idNotify.substr(i));
                          } catch (e) {}
                          this.idNotify = this.idNotify.substr(0, i);
                      }
                  }
                  if (this.sFilePath) {
                      var sFileURL = this.sFilePath;
                      if (DEBUG) this.log('load("' + sFileURL + '")');
                      /*
                       * If the selected ROM file has a ".json" extension, then we assume it's pre-converted
                       * JSON-encoded ROM data, so we load it as-is; ditto for ROM files with a ".hex" extension.
                       * Otherwise, we ask our server-side ROM converter to return the file in a JSON-compatible format.
                       */
                      var sFileExt = str.getExtension(this.sFileName);
                      if (sFileExt != DumpAPI.FORMAT.JSON && sFileExt != DumpAPI.FORMAT.HEX) {
                          sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + this.sFilePath + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES + '&' + DumpAPI.QUERY.DECIMAL + '=true';
                      }
                      web.loadResource(sFileURL, true, null, this, ROM.prototype.onLoadROM);
                  }
              }
              
              Component.subclass(ROM);
              
              /*
               * ROM BIOS Data Area (RBDA) definitions, in physical address form, using the same ALL-CAPS names
               * found in the original IBM PC ROM BIOS listing.  TODO: Fill in remaining RBDA holes.
               */
              ROM.BIOS = {
                  RS232_BASE:     0x400,              // 4 (word) I/O addresses of RS-232 adapters
                  PRINTER_BASE:   0x408,              // 4 (word) I/O addresses of printer adapters
                  EQUIP_FLAG:     0x410,              // installed hardware (word)
                  MFG_TEST:       0x412,              // initialization flag (byte)
                  MEMORY_SIZE:    0x413,              // memory size in K-bytes (word)
                  RESET_FLAG:     0x472               // set to 0x1234 if keyboard reset underway (word)
              };
              
              // RESET_FLAG is the traditional end of the RBDA, as originally defined at real-mode segment 0x40.
              
              ROM.BIOS.RESET_FLAG_WARMBOOT = 0x1234;  // value stored at ROM.BIOS.RESET_FLAG to indicate a "warm boot", bypassing memory tests
              
              /*
               * NOTE: There's currently no need for this component to have a reset() function, since
               * once the ROM data is loaded, it can't be changed, so there's nothing to reinitialize.
               *
               * OK, well, I take that back, because the Debugger, if installed, has the ability to modify
               * ROM contents, so in that case, having a reset() function that restores the original ROM data
               * might be useful; then again, it might not, depending on what you're trying to debug.
               *
               * If we do add reset(), then we'll want to change copyROM() to hang onto the original
               * ROM data; currently, we release it after copying it into the read-only memory allocated
               * via bus.addMemory().
               */
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {ROM}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              ROM.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.copyROM();
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {ROM}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              ROM.prototype.powerUp = function(data, fRepower)
              {
                  if (this.aSymbols) {
                      if (this.dbg) {
                          this.dbg.addSymbols(this.addrROM, this.sizeROM, this.aSymbols);
                      }
                      /*
                       * Our only role in the handling of symbols is to hand them off to the Debugger at our
                       * first opportunity. Now that we've done that, our copy of the symbols, if any, are toast.
                       */
                      delete this.aSymbols;
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * Since we have nothing to do on powerDown(), and no state to return, we could simply omit
               * this function.  But it doesn't hurt anything, and maybe we'll use our state to save something
               * useful down the road, like user-defined symbols (ie, symbols that the Debugger may have
               * created, above and beyond those symbols we automatically loaded, if any, along with the ROM).
               *
               * @this {ROM}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              ROM.prototype.powerDown = function(fSave, fShutdown)
              {
                  return true;
              };
              
              /**
               * onLoadROM(sROMFile, sROMData, nErrorCode)
               *
               * @this {ROM}
               * @param {string} sROMFile
               * @param {string} sROMData
               * @param {number} nErrorCode (response from server if anything other than 200)
               */
              ROM.prototype.onLoadROM = function(sROMFile, sROMData, nErrorCode)
              {
                  if (nErrorCode) {
                      this.notice("Unable to load system ROM (error " + nErrorCode + ")");
                      return;
                  }
                  if (sROMData.charAt(0) == "[" || sROMData.charAt(0) == "{") {
                      try {
                          /*
                           * The most likely source of any exception will be here: parsing the JSON-encoded ROM data.
                           */
                          var rom = eval("(" + sROMData + ")");
                          var ab = rom['bytes'];
                          var adw = rom['data'];
              
                          if (ab) {
                              this.abROM = ab;
                          }
                          else if (adw) {
                              /*
                               * Convert all the DWORDs into BYTEs, so that subsequent code only has to deal with abROM.
                               */
                              this.abROM = new Array(adw.length * 4);
                              for (var idw = 0, ib = 0; idw < adw.length; idw++) {
                                  this.abROM[ib++] = adw[idw] & 0xff;
                                  this.abROM[ib++] = (adw[idw] >> 8) & 0xff;
                                  this.abROM[ib++] = (adw[idw] >> 16) & 0xff;
                                  this.abROM[ib++] = (adw[idw] >> 24) & 0xff;
                              }
                          }
                          else {
                              this.abROM = rom;
                          }
              
                          this.aSymbols = rom['symbols'];
              
                          if (!this.abROM.length) {
                              Component.error("Empty ROM: " + sROMFile);
                              return;
                          }
                          else if (this.abROM.length == 1) {
                              Component.error(this.abROM[0]);
                              return;
                          }
                      } catch (e) {
                          this.notice("ROM data error: " + e.message);
                          return;
                      }
                  }
                  else {
                      /*
                       * Parse the ROM data manually; we assume it's in "simplified" hex form (a series of hex byte-values
                       * separated by whitespace).
                       */
                      var sHexData = sROMData.replace(/\n/gm, " ").replace(/ +$/, "");
                      var asHexData = sHexData.split(" ");
                      this.abROM = new Array(asHexData.length);
                      for (var i = 0; i < asHexData.length; i++) {
                          this.abROM[i] = str.parseInt(asHexData[i], 16);
                      }
                  }
                  this.copyROM();
              };
              
              /**
               * copyROM()
               *
               * This function is called by both initBus() and onLoadROM(), but it cannot copy the the ROM data into place
               * until after initBus() has received the Bus component AND onloadROM() has received the abROM data.  When both
               * those criteria are satisfied, the component becomes "ready".
               *
               * @this {ROM}
               */
              ROM.prototype.copyROM = function()
              {
                  if (!this.isReady()) {
                      if (!this.sFilePath) {
                          this.setReady();
                      }
                      else if (this.abROM && this.bus) {
                          if (this.abROM.length != this.sizeROM) {
                              /*
                               * Note that setError() sets the component's fError flag, which in turn prevents setReady() from
                               * marking the component ready.  TODO: Revisit this decision.  On the one hand, it sounds like a
                               * good idea to stop the machine in its tracks whenever a setError() occurs, but there may also be
                               * times when we'd like to forge ahead anyway.
                               */
                              this.setError("ROM size (" + str.toHexLong(this.abROM.length) + ") does not match specified size (" + str.toHexLong(this.sizeROM) + ")");
                          }
                          else if (this.addROM(this.addrROM)) {
              
                              var aliases = [];
                              if (typeof this.addrAlias == "number") {
                                  aliases.push(this.addrAlias);
                              } else if (this.addrAlias != null && this.addrAlias.length) {
                                  aliases = this.addrAlias;
                              }
                              for (var i = 0; i < aliases.length; i++) {
                                  this.cloneROM(aliases[i]);
                              }
                              /*
                               * If there's a component we should notify, notify it now, and give it the internal byte array, so that
                               * it doesn't have to ask the CPU for the data.  Currently, the only component that uses this notification
                               * option is the Video component, and only when the associated ROM contains font data that it needs.
                               */
                              if (this.idNotify) {
                                  var component = Component.getComponentByID(this.idNotify, this.id);
                                  if (component) {
                                      component.onROMLoad(this.abROM, this.aNotifyParms);
                                  } else {
                                      this.notice("Unable to find component: " + this.idNotify);
                                  }
                              }
                              /*
                               * We used to hang onto the original ROM data so that we could restore any bytes the CPU overwrote,
                               * using memory write-notification handlers, but with the introduction of read-only memory blocks, that's
                               * no longer necessary.
                               *
                               * TODO: Consider an option to retain the ROM data, and give the user some way of restoring ROMs.
                               * That may be useful for "resumable" machines that save/restore all dirty block of memory, regardless
                               * whether they're ROM or RAM.  However, the only way to modify a machine's ROM is with the Debugger,
                               * and Debugger users should know better.
                               */
                              delete this.abROM;
                          }
                          this.setReady();
                      }
                  }
              };
              
              /**
               * addROM(addr)
               *
               * @this {ROM}
               * @param {number} addr
               * @return {boolean}
               */
              ROM.prototype.addROM = function(addr)
              {
                  if (this.bus.addMemory(addr, this.sizeROM, Memory.TYPE.ROM)) {
                      if (DEBUG) this.log("addROM(): copying ROM to " + str.toHexLong(addr) + " (" + str.toHexLong(this.abROM.length) + " bytes)");
                      var bto = null;
                      for (var off = 0; off < this.abROM.length; off++) {
                          this.bus.setByteDirect(addr + off, this.abROM[off]);
                          if (BACKTRACK) {
                              bto = this.bus.addBackTrackObject(this, bto, off);
                              this.bus.writeBackTrackObject(addr + off, bto, off);
                          }
                      }
                      return true;
                  }
                  /*
                   * We don't need to report an error here, because addMemory() already takes care of that.
                   */
                  return false;
              };
              
              /**
               * cloneROM(addr)
               *
               * For ROMs with one or more alias addresses, we used to call addROM() for each address.  However,
               * that obviously wasted memory, since each alias was an independent copy, and if you used the
               * Debugger to edit the ROM in one location, the changes would not appear in the other location(s).
               *
               * Now that the Bus component provides low-level getMemoryBlocks() and setMemoryBlocks() methods
               * to manually get and set the blocks of any memory range, it is now possible to create true aliases.
               *
               * @this {ROM}
               * @param {number} addr
               */
              ROM.prototype.cloneROM = function(addr)
              {
                  var aBlocks = this.bus.getMemoryBlocks(this.addrROM, this.sizeROM);
                  this.bus.setMemoryBlocks(addr, this.sizeROM, aBlocks);
              };
              
              /**
               * ROM.init()
               *
               * This function operates on every HTML element of class "rom", extracting the
               * JSON-encoded parameters for the ROM constructor from the element's "data-value"
               * attribute, invoking the constructor to create a ROM component, and then binding
               * any associated HTML controls to the new component.
               */
              ROM.init = function()
              {
                  var aeROM = Component.getElementsByClass(window.document, PCJSCLASS, "rom");
                  for (var iROM = 0; iROM < aeROM.length; iROM++) {
                      var eROM = aeROM[iROM];
                      var parmsROM = Component.getComponentParms(eROM);
                      var rom = new ROM(parmsROM);
                      Component.bindComponentControls(rom, eROM, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize all the ROM modules on the page.
               */
              web.onInit(ROM.init);
              
              if (typeof module !== 'undefined') module.exports = ROM;
              
            • serialport.js
              /**
               * @fileoverview Implements the PCjs SerialPort component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jul-01
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var ChipSet     = require("./chipset");
                  var State       = require("./state");
              }
              
              /**
               * SerialPort(parmsSerial)
               *
               * The SerialPort component has the following component-specific (parmsSerial) properties:
               *
               *      adapter: 1 (for port 0x3F8) or 2 (for port 0x2F8); 0 if not defined
               *
               * WARNING: Since the XSL file defines 'adapter' as a number, not a string, there's no need to
               * use parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal
               * format was used.
               *
               * This hard-coded approach mimics the original IBM PC Asynchronous Adapter configuration, which
               * contained a pair of "shunt modules" that allowed the user to select a port address of either
               * 0x3F8 ("Primary") or 0x2F8 ("Secondary").
               *
               * DOS typically names the Primary adapter "COM1" and the Secondary adapter "COM2", but I prefer
               * to stick to adapter numbers, since not all operating systems follow those naming conventions.
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsSerial
               */
              function SerialPort(parmsSerial) {
              
                  this.iAdapter = parmsSerial['adapter'];
              
                  switch (this.iAdapter) {
                  case 1:
                      this.portBase = 0x3F8;
                      this.nIRQ = ChipSet.IRQ.COM1;
                      break;
                  case 2:
                      this.portBase = 0x2F8;
                      this.nIRQ = ChipSet.IRQ.COM2;
                      break;
                  default:
                      Component.warning("Unrecognized serial adapter #" + this.iAdapter);
                      return;
                  }
              
                  /**
                   * controlIOBuffer is a DOM element, if any, bound to the port (currently for output purposes only; see echoByte())
                   *
                   * @type {Object}
                   */
                  this.controlIOBuffer = null;
              
                  Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
              
                  Component.bindExternalControl(this, parmsSerial['binding'], SerialPort.sIOBuffer);
              }
              
              /*
               * class SerialPort
               * property {number} iAdapter
               * property {number} portBase
               * property {number} nIRQ
               * property {Object} controlIOBuffer is a DOM element, if any, bound to the port (for rudimentary output; see echoByte())
               *
               * NOTE: This class declaration started as a way of informing the code inspector of the controlIOBuffer property,
               * which remained undefined until a setBinding() call set it later, but I've since decided that explicitly
               * initializing such properties in the constructor is a better way to go -- even though it's more code -- because
               * JavaScript compilers are supposed to be happier when the underlying object structures aren't constantly changing.
               *
               * Besides, I'm not sure I want to get into documenting every property this way, for this or any/every other class,
               * let alone getting into which ones should be considered private or protected, because PCjs isn't really a library
               * for third-party apps.
               */
              
              Component.subclass(SerialPort);
              
              /*
               * Internal name used for the I/O buffer control, if any, that we bind to the SerialPort.
               *
               * Alternatively, if SerialPort wants to use another component's control (eg, the Panel's
               * "print" control), it can specify the name of that control with the 'binding' property.
               *
               * For that binding to succeed, we also need to know the target component; for now, that's
               * been hard-coded to "Panel", in part because that's one of the few components we can rely
               * upon initializing before we do, but it would be a simple matter to include a component type
               * or ID as part of the 'binding' property as well, if we need more flexibility later.
               */
              SerialPort.sIOBuffer = "buffer";
              
              /*
               * 8250 I/O register offsets (add these to a I/O base address to obtain an I/O port address)
               *
               * NOTE: DLL.REG and DLM.REG form a 16-bit divisor into a clock input frequency of 1.8432Mhz.  The following
               * values should be used for the corresponding baud rates.  Rates above 9600 are discouraged by the IBM Tech Ref,
               * but rates as high as 128000 are listed on the NS8250A data sheet.
               *
               *      Divisor     Rate        Percent Error
               *      0x0900      50
               *      0x0600      75
               *      0x0417      110         0.026%
               *      0x0359      134.5       0.058%
               *      0x0300      150
               *      0x0180      300
               *      0x00C0      600
               *      0x0060      1200
               *      0x0040      1800
               *      0x003A      2000        0.69%
               *      0x0030      2400
               *      0x0020      3600
               *      0x0018      4800
               *      0x0010      7200
               *      0x000C      9600
               *      0x0006      19200
               *      0x0003      38400
               *      0x0002      56000       2.86%
               *      0x0001      128000
               */
              SerialPort.DLL = {REG: 0};              // Divisor Latch LSB (only when SerialPort.LCR.DLAB is set)
              SerialPort.THR = {REG: 0};              // Transmitter Holding Register (write)
              SerialPort.DL_DEFAULT       = 0x180;    // we select an arbitrary default Divisor Latch equivalent to 300 baud
              
              /*
               * The divisor is stored in wDL.  If we take the frequency value 1843200 and divide it by wDL*128, we get the
               * maximum number of bytes per second that the SerialPort interface should generate.  For example, if a baud
               * rate of 1200 is being used, the divisor will be 0x60 (96), so we calculate 1843200/(96*128) = 150, which means
               * there should be a 1000ms/150 or 6.667ms delay between bytes delivered.
               *
               * TODO: Enforce that delay.  However, the delay should be converted from real-world milliseconds to the
               * appropriate number of CPU cycles we can pass to setBurstCycles().  This will also require the CPU to call
               * us at the start of each burst, to see if advanceRBR() has more data to deliver.  For now, I'm throttling
               * SerialPort interrupts by passing a hard-coded delay to setIRR().  The setIRR() delay does not ensure any
               * particular baud rate, it simply gives the underlying Interrupt Service Routine (ISR) some breathing room.
               *
               * The Microsoft Windows 1.01 serial mouse driver ISR issues an EOI before it has safely exited, relying solely
               * on the fact that a 1200 baud serial device would not normally interrupt frequently enough to blow the stack.
               * However, in PCjs, all you have to do is enable Debugger messages on every serial interrupt and mouse event,
               * eg:
               *
               *      m serial on;m pic on;m mouse on
               *
               * to slow the machine down to the point where serial mouse interrupts overwhelm the ISR.  The Debugger messages
               * display the current stack pointer, which you can watch drop to zero and then wrap around, no doubt trampling
               * lots of code and data along the way.
               *
               * This problem can also occur without being forced by the Debugger; eg, whenever the physical machine's mouse is
               * configured for a high interrupt rate.
               */
              
              /*
               * Receiver Buffer Register (RBR.REG, offset 0; eg, 0x3F8 or 0x2F8)
               */
              SerialPort.RBR = {REG: 0};              // (read)
              
              /*
               * Interrupt Enable Register (IER.REG, offset 1; eg, 0x3F9 or 0x2F9)
               */
              SerialPort.IER = {};
              SerialPort.IER.REG          = 1;        // Interrupt Enable Register
              SerialPort.IER.RBR_AVAIL    = 0x01;
              SerialPort.IER.THR_EMPTY    = 0x02;
              SerialPort.IER.LSR_DELTA    = 0x04;
              SerialPort.IER.MSR_DELTA    = 0x08;
              SerialPort.IER.UNUSED       = 0xF0;     // always zero
              
              SerialPort.DLM = {REG: 1};              // Divisor Latch MSB (only when SerialPort.LCR.DLAB is set)
              
              /*
               * Interrupt ID Register (IIR.REG, offset 2; eg, 0x3FA or 0x2FA)
               *
               * All interrupt conditions cleared by reading the corresponding register (or, in the case of IRR_INT_THR, writing a new value to THR.REG)
               */
              SerialPort.IIR = {};
              SerialPort.IIR.REG          = 2;        // Interrupt ID Register (read-only)
              SerialPort.IIR.NO_INT       = 0x01;
              SerialPort.IIR.INT_LSR      = 0x06;     // Line Status (highest priority: Overrun error, Parity error, Framing error, or Break Interrupt)
              SerialPort.IIR.INT_RBR      = 0x04;     // Receiver Data Available
              SerialPort.IIR.INT_THR      = 0x02;     // Transmitter Holding Register Empty
              SerialPort.IIR.INT_MSR      = 0x00;     // Modem Status Register (lowest priority: Clear To Send, Data Set Ready, Ring Indicator, or Data Carrier Detect)
              SerialPort.IIR.INT_BITS     = 0x06;
              SerialPort.IIR.UNUSED       = 0xF8;     // always zero (the ROM BIOS relies on these bits "floating to 1" when no SerialPort is present)
              
              /*
               * Line Control Register (LCR.REG, offset 3; eg, 0x3FB or 0x2FB)
               */
              SerialPort.LCR = {};
              SerialPort.LCR.REG          = 3;        // Line Control Register
              SerialPort.LCR.DATA_5BITS   = 0x00;
              SerialPort.LCR.DATA_6BITS   = 0x01;
              SerialPort.LCR.DATA_7BITS   = 0x02;
              SerialPort.LCR.DATA_8BITS   = 0x03;
              SerialPort.LCR.STOP_BITS    = 0x04;     // clear: 1 stop bit; set: 1.5 stop bits for LCR_DATA_5BITS, 2 stop bits for all other data lengths
              SerialPort.LCR.PARITY_BIT   = 0x08;     // if set, a parity bit is inserted/expected between the last data bit and the first stop bit; no parity bit if clear
              SerialPort.LCR.PARITY_EVEN  = 0x10;     // if set, even parity is selected (ie, the parity bit insures an even number of set bits); if clear, odd parity
              SerialPort.LCR.PARITY_STICK = 0x20;     // if set, parity bit is transmitted inverted; if clear, parity bit is transmitted normally
              SerialPort.LCR.BREAK        = 0x40;     // if set, serial output (SOUT) signal is forced to logical 0 for the duration
              SerialPort.LCR.DLAB         = 0x80;     // Divisor Latch Access Bit; if set, DLL.REG and DLM.REG can be read or written
              
              /*
               * Modem Control Register (MCR.REG, offset 4; eg, 0x3FC or 0x2FC)
               */
              SerialPort.MCR = {};
              SerialPort.MCR.REG          = 4;        // Modem Control Register
              SerialPort.MCR.DTR          = 0x01;     // when set, DTR goes high, indicating ready to establish link (looped back to DSR in loop-back mode)
              SerialPort.MCR.RTS          = 0x02;     // when set, RTS goes high, indicating ready to exchange data (looped back to CTS in loop-back mode)
              SerialPort.MCR.OUT1         = 0x04;     // when set, OUT1 goes high (looped back to RI in loop-back mode)
              SerialPort.MCR.OUT2         = 0x08;     // when set, OUT2 goes high (looped back to RLSD in loop-back mode)
              SerialPort.MCR.LOOPBACK     = 0x10;     // when set, enables loop-back mode
              SerialPort.MCR.UNUSED       = 0xE0;     // always zero
              
              /*
               * Line Status Register (LSR.REG, offset 5; eg, 0x3FD or 0x2FD)
               *
               * NOTE: I've seen different specs for the LSR_TSRE.  I'm following the IBM Tech Ref's lead here, but the data sheet I have calls it TEMT
               * instead of TSRE, and claims that it is set whenever BOTH the THR and TSR are empty, and clear whenever EITHER the THR or TSR contain data.
               */
              SerialPort.LSR = {};
              SerialPort.LSR.REG          = 5;        // Line Status Register
              SerialPort.LSR.DR           = 0x01;     // Data Ready (set when new data in RBR.REG; cleared when RBR.REG read)
              SerialPort.LSR.OE           = 0x02;     // Overrun Error (set when new data arrives in RBR.REG before previous data read; cleared when LSR.REG read)
              SerialPort.LSR.PE           = 0x04;     // Parity Error (set when new data has incorrect parity; cleared when LSR.REG read)
              SerialPort.LSR.FE           = 0x08;     // Framing Error (set when new data has invalid stop bit; cleared when LSR.REG read)
              SerialPort.LSR.BI           = 0x10;     // Break Interrupt (set when new data exceeded normal transmission time; cleared LSR.REG when read)
              SerialPort.LSR.THRE         = 0x20;     // Transmitter Holding Register Empty (set when UART ready to accept new data; cleared when THR.REG written)
              SerialPort.LSR.TSRE         = 0x40;     // Transmitter Shift Register Empty (set when the TSR is empty; cleared when the THR is transferred to the TSR)
              SerialPort.LSR.UNUSED       = 0x80;     // always zero
              
              /*
               * Modem Status Register (MSR.REG, offset 6; eg, 0x3FE or 0x2FE)
               */
              SerialPort.MSR = {};
              SerialPort.MSR.REG          = 6;        // Modem Status Register
              SerialPort.MSR.DCTS         = 0x01;     // when set, CTS (Clear To Send) has changed since last read
              SerialPort.MSR.DDSR         = 0x02;     // when set, DSR (Data Set Ready) has changed since last read
              SerialPort.MSR.TERI         = 0x04;     // when set, TERI (Trailing Edge Ring Indicator) indicates RI has changed from 1 to 0
              SerialPort.MSR.DRLSD        = 0x08;     // when set, RLSD (Received Line Signal Detector) has changed
              SerialPort.MSR.CTS          = 0x10;     // when set, the modem or data set is ready to exchange data (complement of the Clear To Send input signal)
              SerialPort.MSR.DSR          = 0x20;     // when set, the modem or data set is ready to establish link (complement of the Data Set Ready input signal)
              SerialPort.MSR.RI           = 0x40;     // complement of the RI (Ring Indicator) input
              SerialPort.MSR.RLSD         = 0x80;     // complement of the RLSD (Received Line Signal Detect) input
              
              /*
               * Scratch Register (SCR.REG, offset 7; eg, 0x3FF or 0x2FF)
               */
              SerialPort.SCR = {REG: 7};
              
              /**
               * attachMouse(id, mouse)
               *
               * @this {SerialPort}
               * @param {string} id
               * @param {Mouse} mouse component
               * @return {Component} this or null, based on whether or not the specified ID matches
               */
              SerialPort.prototype.attachMouse = function(id, mouse)
              {
                  if (id == this.idComponent) {
                      this.mouse = mouse;
                      return this;
                  }
                  return null;
              };
              
              /**
               * syncMouse()
               *
               * NOTE: This is probably obsolete, but the Mouse component still might discover a need for it.  See Mouse.powerUp().
               *
               * @this {SerialPort}
               *
              SerialPort.prototype.syncMouse = function()
               {
                  if (this.mouse) this.mouse.notifyMCR(this.bMCR);
              };
               */
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {SerialPort}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "buffer")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              SerialPort.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var serial = this;
              
                  switch (sBinding) {
                  case SerialPort.sIOBuffer:
                      this.bindings[sBinding] = this.controlIOBuffer = control;
                      /*
                       * By establishing an onkeypress handler here, we make it possible for DOS commands like
                       * "CTTY COM1" to more or less work (use "CTTY CON" to restore control to the DOS console).
                       *
                       * WARNING: This isn't really a supported feature yet; very much a work-in-progress.
                       */
                      control.onkeydown = function onKeyDownSerial(event) {
                          /*
                           * This is required in addition to onkeypress, because it's the only way to prevent
                           * BACKSPACE from being interpreted by the browser as a "Back" operation.
                           */
                          event = event || window.event;
                          var keyCode = event.keyCode;
                          if (keyCode === 8) {
                              if (event.preventDefault) event.preventDefault();
                              serial.sendRBR([keyCode]);
                          }
                      };
                      control.onkeypress = function onKeyPressSerial(event) {
                          /*
                           * Browser-independent keyCode extraction (refer to keyPress() and the other key
                           * event handlers in keyboard.js).
                           */
                          event = event || window.event;
                          var keyCode = event.which || event.keyCode;
                          serial.sendRBR([keyCode]);
                      };
                      return true;
              
                  default:
                      break;
                  }
                  return false;
              };
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * @this {SerialPort}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
                  this.chipset = cmp.getComponentByType("ChipSet");
                  bus.addPortInputTable(this, SerialPort.aPortInput, this.portBase);
                  bus.addPortOutputTable(this, SerialPort.aPortOutput, this.portBase);
                  this.setReady();
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {SerialPort}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              SerialPort.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.reset();
                      } else {
                          if (!this.restore(data)) return false;
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * @this {SerialPort}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              SerialPort.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save ? this.save() : true;
              };
              
              /**
               * reset()
               *
               * @this {SerialPort}
               */
              SerialPort.prototype.reset = function()
              {
                  this.initState();
              };
              
              /**
               * save()
               *
               * This implements save support for the SerialPort component.
               *
               * @this {SerialPort}
               * @return {Object}
               */
              SerialPort.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.saveRegisters());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the SerialPort component.
               *
               * @this {SerialPort}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              SerialPort.prototype.restore = function(data)
              {
                  return this.initState(data[0]);
              };
              
              /**
               * initState(data)
               *
               * @this {SerialPort}
               * @param {Array} [data]
               * @return {boolean} true if successful, false if failure
               */
              SerialPort.prototype.initState = function(data)
              {
                  /*
                   * The NS8250A spec doesn't explicitly say what the RBR and THR are initialized to on a reset,
                   * but I think we can safely assume zeros.  Similarly, we reset the baud rate Divisor Latch (wDL)
                   * to an arbitrary but consistent default (DL_DEFAULT).
                   */
                  var i = 0;
                  if (data === undefined) {
                      data = [
                          0,                                          // RBR
                          0,                                          // THR
                          SerialPort.DL_DEFAULT,                      // DL
                          0,                                          // IER
                          SerialPort.IIR.NO_INT,                      // IIR
                          0,                                          // LCR
                          0,                                          // MCR
                          SerialPort.LSR.THRE | SerialPort.LSR.TSRE,  // LSR
                          SerialPort.MSR.CTS | SerialPort.MSR.DSR,    // MSR (instead of the normal 0 default, we indicate a state of readiness -- to be revisited)
                          []
                      ];
                  }
                  this.bRBR = data[i++];
                  this.bTHR = data[i++];
                  this.wDL =  data[i++];
                  this.bIER = data[i++];
                  this.bIIR = data[i++];
                  this.bLCR = data[i++];
                  this.bMCR = data[i++];
                  this.bLSR = data[i++];
                  this.bMSR = data[i++];
                  this.abReceive = data[i];
                  return true;
              };
              
              /**
               * saveRegisters()
               *
               * @this {SerialPort}
               * @return {Array}
               */
              SerialPort.prototype.saveRegisters = function()
              {
                  var i = 0;
                  var data = [];
                  data[i++] = this.bRBR;
                  data[i++] = this.bTHR;
                  data[i++] = this.wDL;
                  data[i++] = this.bIER;
                  data[i++] = this.bIIR;
                  data[i++] = this.bLCR;
                  data[i++] = this.bMCR;
                  data[i++] = this.bLSR;
                  data[i++] = this.bMSR;
                  data[i] = this.abReceive;
                  return data;
              };
              
              /**
               * sendRBR(ab)
               *
               * @this {SerialPort}
               * @param {Array} ab is an array of bytes to propagate to the bRBR (Receiver Buffer Register)
               */
              SerialPort.prototype.sendRBR = function(ab)
              {
                  this.abReceive = this.abReceive.concat(ab);
                  this.advanceRBR();
              };
              
              /**
               * advanceRBR()
               *
               * @this {SerialPort}
               */
              SerialPort.prototype.advanceRBR = function()
              {
                  if (this.abReceive.length > 0 && !(this.bLSR & SerialPort.LSR.DR)) {
                      this.bRBR = this.abReceive.shift();
                      this.bLSR |= SerialPort.LSR.DR;
                  }
                  this.updateIRR();
              };
              
              /**
               * inRBR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3F8 or 0x2F8)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inRBR = function(port, addrFrom)
              {
                  var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL & 0xff) : this.bRBR);
                  this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "RBR", b);
                  this.bLSR &= ~SerialPort.LSR.DR;
                  this.advanceRBR();
                  return b;
              };
              
              /**
               * inIER(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3F9 or 0x2F9)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inIER = function(port, addrFrom)
              {
                  var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL >> 8) : this.bIER);
                  this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER", b);
                  return b;
              };
              
              /**
               * inIIR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FA or 0x2FA)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inIIR = function(port, addrFrom)
              {
                  var b = this.bIIR;
                  this.printMessageIO(port, null, addrFrom, "IIR", b);
                  return b;
              };
              
              /**
               * inLCR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FB or 0x2FB)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inLCR = function(port, addrFrom)
              {
                  var b = this.bLCR;
                  this.printMessageIO(port, null, addrFrom, "LCR", b);
                  return b;
              };
              
              /**
               * inMCR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FC or 0x2FC)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inMCR = function(port, addrFrom)
              {
                  var b = this.bMCR;
                  this.printMessageIO(port, null, addrFrom, "MCR", b);
                  return b;
              };
              
              /**
               * inLSR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FD or 0x2FD)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inLSR = function(port, addrFrom)
              {
                  var b = this.bLSR;
                  this.printMessageIO(port, null, addrFrom, "LSR", b);
                  return b;
              };
              
              /**
               * inMSR(port, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FE or 0x2FE)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number} simulated port value
               */
              SerialPort.prototype.inMSR = function(port, addrFrom)
              {
                  var b = this.bMSR;
                  this.printMessageIO(port, null, addrFrom, "MSR", b);
                  return b;
              };
              
              /**
               * outTHR(port, bOut, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3F8 or 0x2F8)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              SerialPort.prototype.outTHR = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "THR");
                  if (this.bLCR & SerialPort.LCR.DLAB) {
                      this.wDL = (this.wDL & ~0xff) | bOut;
                  } else {
                      this.bTHR = bOut;
                      this.bLSR &= ~(SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
                      if (this.echoByte(bOut)) {
                          this.bLSR |= (SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
                          /*
                           * QUESTION: Does this mean we should also flush/zero bTHR?
                           */
                      }
                  }
              };
              
              /**
               * outIER(port, bOut, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3F9 or 0x2F9)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              SerialPort.prototype.outIER = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER");
                  if (this.bLCR & SerialPort.LCR.DLAB) {
                      this.wDL = (this.wDL & 0xff) | (bOut << 8);
                  } else {
                      this.bIER = bOut;
                  }
              };
              
              /**
               * outLCR(port, bOut, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FB or 0x2FB)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              SerialPort.prototype.outLCR = function(port, bOut, addrFrom)
              {
                  this.printMessageIO(port, bOut, addrFrom, "LCR");
                  this.bLCR = bOut;
              };
              
              /**
               * outMCR(port, bOut, addrFrom)
               *
               * @this {SerialPort}
               * @param {number} port (0x3FC or 0x2FC)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
               */
              SerialPort.prototype.outMCR = function(port, bOut, addrFrom)
              {
                  var bPrev = this.bMCR;
                  this.printMessageIO(port, bOut, addrFrom, "MCR");
                  this.bMCR = bOut;
                  if (this.mouse && (bPrev ^ bOut) & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
                      this.mouse.notifyMCR(this.bMCR);
                  }
              };
              
              /**
               * updateIRR()
               *
               * @this {SerialPort}
               */
              SerialPort.prototype.updateIRR = function()
              {
                  var bIIR = -1;
                  if ((this.bLSR & SerialPort.LSR.DR) && (this.bIER & SerialPort.IER.RBR_AVAIL)) {
                      bIIR = SerialPort.IIR.INT_RBR;
                  }
                  if (bIIR >= 0) {
                      this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
                      this.bIIR |= bIIR;
                      /*
                       * TODO: Remove this arbitrary 100-instruction delay once we've added support for baud rate throttling
                       * (see TODO above regarding baud rate).
                       */
                      if (this.chipset && this.nIRQ) this.chipset.setIRR(this.nIRQ, 100);
                  } else {
                      this.bIIR |= SerialPort.IIR.NO_INT;
                      if (this.chipset && this.nIRQ) this.chipset.clearIRR(this.nIRQ);
                  }
              };
              
              /**
               * echoByte(b)
               *
               * @this {SerialPort}
               * @param {number} b
               * @return {boolean} true if echoed, false if not
               */
              SerialPort.prototype.echoByte = function(b)
              {
                  if (this.controlIOBuffer) {
                      if (b != 0x0D) {
                          if (b == 0x08) {
                              this.controlIOBuffer.value = this.controlIOBuffer.value.slice(0, -1);
                          } else {
                              this.controlIOBuffer.value += String.fromCharCode(b);
                              this.controlIOBuffer.scrollTop = this.controlIOBuffer.scrollHeight;
                          }
                      }
                      return true;
                  }
                  return false;
              };
              
              /*
               * Port input notification table
               */
              SerialPort.aPortInput = {
                  0x0: SerialPort.prototype.inRBR,    // or DLL if DLAB set
                  0x1: SerialPort.prototype.inIER,    // or DLM if DLAB set
                  0x2: SerialPort.prototype.inIIR,
                  0x3: SerialPort.prototype.inLCR,
                  0x4: SerialPort.prototype.inMCR,
                  0x5: SerialPort.prototype.inLSR,
                  0x6: SerialPort.prototype.inMSR
              };
              
              /*
               * Port output notification table
               */
              SerialPort.aPortOutput = {
                  0x0: SerialPort.prototype.outTHR,   // or DLL if DLAB set
                  0x1: SerialPort.prototype.outIER,   // or DLM if DLAB set
                  0x3: SerialPort.prototype.outLCR,
                  0x4: SerialPort.prototype.outMCR
              };
              
              /**
               * SerialPort.init()
               *
               * This function operates on every HTML element of class "serial", extracting the
               * JSON-encoded parameters for the SerialPort constructor from the element's "data-value"
               * attribute, invoking the constructor to create a SerialPort component, and then binding
               * any associated HTML controls to the new component.
               */
              SerialPort.init = function()
              {
                  var aeSerial = Component.getElementsByClass(window.document, PCJSCLASS, "serial");
                  for (var iSerial = 0; iSerial < aeSerial.length; iSerial++) {
                      var eSerial = aeSerial[iSerial];
                      var parmsSerial = Component.getComponentParms(eSerial);
                      var serial = new SerialPort(parmsSerial);
                      Component.bindComponentControls(serial, eSerial, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every SerialPort module on the page.
               */
              web.onInit(SerialPort.init);
              
              if (typeof module !== 'undefined') module.exports = SerialPort;
              
            • state.js
              /**
               * @fileoverview The State class used by C1Pjs and PCjs.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-May-14
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var web       = require("./../../shared/lib/weblib");
                  var Component = require("./../../shared/lib/component");
                  var Messages  = require("./messages");
              }
              
              /**
               * State(component, sVersion, sSuffix)
               *
               * State objects are used by components to save/restore their state.
               *
               * During a save operation, components add data to a State object via set(),
               * and then return the resulting data using data().
               *
               * During a restore operation, the Computer component passes the results of each
               * data() call back to the originating component.
               *
               * WARNING: Since State objects are low-level objects that have no UI requirements,
               * they do not inherit from the Component class, so you should only use class methods
               * of Component, such as Component.assert(), or Debugger methods if the Debugger
               * is available.
               *
               * @constructor
               * @param {Component} component
               * @param {string} [sVersion] is used to append a major version number to the key
               * @param {string} [sSuffix] is used to append any additional suffixes to the key
               */
              function State(component, sVersion, sSuffix) {
                  this.id = component.id;
                  this.key = State.key(component, sVersion, sSuffix);
                  this.dbg = component.dbg;
                  this.unload(component.parms);
              }
              
              /**
               * State.key(component, sVersion, sSuffix)
               *
               * This encapsulates the key generation code.
               *
               * @param {Component} component
               * @param {string} [sVersion] is used to append a major version number to the key
               * @param {string} [sSuffix] is used to append any additional suffixes to the key
               * @return {string} key
               */
              State.key = function(component, sVersion, sSuffix) {
                  var key = component.id;
                  if (sVersion) {
                      var i = sVersion.indexOf('.');
                      if (i > 0) key += ".v" + sVersion.substr(0, i);
                  }
                  if (sSuffix) {
                      key += "." + sSuffix;
                  }
                  return key;
              };
              
              /**
               * State.compress(aSrc)
               *
               * @param {Array.<number>|null} aSrc
               * @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
               */
              State.compress = function(aSrc) {
                  if (aSrc) {
                      var iSrc = 0;
                      var iComp = 0;
                      var aComp = [];
                      while (iSrc < aSrc.length) {
                          var n = aSrc[iSrc];
                          Component.assert(n !== undefined);
                          var iCompare = iSrc + 1;
                          while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare++;
                          aComp[iComp++] = iCompare - iSrc;
                          aComp[iComp++] = n;
                          iSrc = iCompare;
                      }
                      if (aComp.length < aSrc.length) return aComp;
                  }
                  return aSrc;
              };
              
              /**
               * State.decompress(aComp)
               *
               * @param {Array.<number>} aComp
               * @param {number} nLength is expected length of decompressed data
               * @return {Array.<number>}
               */
              State.decompress = function(aComp, nLength) {
                  var iDst = 0;
                  var aDst = new Array(nLength);
                  var iComp = 0;
                  while (iComp < aComp.length - 1) {
                      var c = aComp[iComp++];
                      var n = aComp[iComp++];
                      while (c--) {
                          aDst[iDst++] = n;
                      }
                  }
                  Component.assert(aDst.length == nLength);
                  return aDst;
              };
              
              /**
               * State.compressEvenOdd(aSrc)
               *
               * This is a very simple variation on compress() that compresses all the EVEN elements of aSrc first,
               * followed by all the ODD elements.  This tends to work better on EGA video memory, because when odd/even
               * addressing is enabled (eg, for text modes), the DWORD values tend to alternate, which is the worst case
               * for compress(), but the best case for compressEvenOdd().
               *
               * One wrinkle we support: if the first element is uninitialized, then we assume the entire array is undefined,
               * and return an empty compressed array.  Conversely, decompressEvenOdd() will take an empty compressed array
               * and return an uninitialized array.
               *
               * @param {Array.<number>|null} aSrc
               * @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
               */
              State.compressEvenOdd = function(aSrc) {
                  if (aSrc) {
                      var iComp = 0, aComp = [];
                      if (aSrc[0] !== undefined) {
                          for (var off = 0; off < 2; off++) {
                              var iSrc = off;
                              while (iSrc < aSrc.length) {
                                  var n = aSrc[iSrc];
                                  var iCompare = iSrc + 2;
                                  while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare += 2;
                                  aComp[iComp++] = (iCompare - iSrc) >> 1;
                                  aComp[iComp++] = n;
                                  iSrc = iCompare;
                              }
                          }
                      }
                      if (aComp.length < aSrc.length) return aComp;
                  }
                  return aSrc;
              };
              
              /**
               * State.decompressEvenOdd(aComp, nLength)
               *
               * This is the counterpart to compressEvenOdd().  Note that because there's nothing in the compressed sequence
               * that differentiates a compress() sequence from a compressEvenOdd() sequence, you simply have to be consistent:
               * if you used even/odd compression, then you must use even/odd decompression.
               *
               * @param {Array.<number>} aComp
               * @param {number} nLength is expected length of decompressed data
               * @return {Array.<number>}
               */
              State.decompressEvenOdd = function(aComp, nLength) {
                  var iDst = 0;
                  var aDst = new Array(nLength);
                  var iComp = 0;
                  while (iComp < aComp.length - 1) {
                      var c = aComp[iComp++];
                      var n = aComp[iComp++];
                      while (c--) {
                          aDst[iDst] = n;
                          iDst += 2;
                      }
                      /*
                       * The output of a "count,value" pair will never exceed the end of the output array, so as soon as we reach it
                       * the first time, we know it's time to switch to ODD elements, and as soon as we reach it again, we should be
                       * done.
                       */
                      Component.assert(iDst <= nLength || iComp == aComp.length);
                      if (iDst == nLength) iDst = 1;
                  }
                  Component.assert(aDst.length == nLength);
                  return aDst;
              };
              
              State.prototype = {
                  constructor: State,
                  /**
                   * set(id, data)
                   *
                   * @this {State}
                   * @param {number|string} id
                   * @param {Object|string} data
                   */
                  set: function(id, data) {
                      try {
                          this[this.id][id] = data;
                      } catch(e) {
                          Component.log(e.message);
                      }
                  },
                  /**
                   * get(id)
                   *
                   * @this {State}
                   * @param {number|string} id
                   * @return {Object|string|null}
                   */
                  get: function(id) {
                      return this[this.id][id] || null;
                  },
                  /**
                   * value()
                   *
                   * Use this instead of data() if you haven't called parse() yet.
                   *
                   * @this {State}
                   * @return {string}
                   */
                  value: function() {
                      return this[this.id];
                  },
                  /**
                   * data()
                   *
                   * @this {State}
                   * @return {Object}
                   */
                  data: function() {
                      return this[this.id];
                  },
                  /**
                   * load(s)
                   *
                   * WARNING: Make sure you follow this call with either a call to parse() or unload(),
                   * because any stringified data that we've loaded isn't usable until it's been parsed.
                   *
                   * @this {State}
                   * @param {Object|string|null} [s]
                   * @return {boolean} true if state exists in localStorage, false if not
                   */
                  load: function(s) {
                      if (s) {
                          this[this.id] = s;
                          this.fLoaded = true;
                          return true;
                      }
                      if (this.fLoaded) {
                          /*
                           * This is assumed to be a redundant load().
                           */
                          return true;
                      }
                      if (web.hasLocalStorage()) {
                          s = web.getLocalStorageItem(this.key);
                          if (s) {
                              this[this.id] = s;
                              this.fLoaded = true;
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes loaded");
                              }
                              return true;
                          }
                      }
                      return false;
                  },
                  /**
                   * parse()
                   *
                   * This completes the load() operation, by parsing what was loaded, on the assumption there
                   * might be some benefit to deferring parsing until we've given the user a chance to confirm.
                   * Otherwise, load() could have just as easily done this, too.
                   *
                   * @this {State}
                   * @return {boolean} true if successful, false if error
                   */
                  parse: function() {
                      var fSuccess = true;
                      try {
                          this[this.id] = JSON.parse(this[this.id]);
                      } catch (e) {
                          Component.error(e.message || e);
                          fSuccess = false;
                      }
                      return fSuccess;
                  },
                  /**
                   * store()
                   *
                   * @this {State}
                   * @return {boolean} true if successful, false if error
                   */
                  store: function() {
                      var fSuccess = true;
                      if (web.hasLocalStorage()) {
                          var s = JSON.stringify(this[this.id]);
                          if (web.setLocalStorageItem(this.key, s)) {
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes stored");
                              }
                          } else {
                              /*
                               * WARNING: Because browsers tend to disable all alerts() during an "unload" operation,
                               * it's unlikely anyone will ever see the "quota" errors that occur at this point.  Need to
                               * think of some way to notify the user that there's a problem, and offer a way of cleaning
                               * up old states.
                               */
                              Component.error("Unable to store " + s.length + " bytes in browser local storage");
                              fSuccess = false;
                          }
                      }
                      return fSuccess;
                  },
                  /**
                   * toString()
                   *
                   * We can't know whether this might be called before parse() or after parse(), so we check.
                   * If before, then this[this.id] will still be in string form; if after, it will be an Object.
                   *
                   * @this {State}
                   * @return {string} JSON-encoded state
                   */
                  toString: function() {
                      var value = this[this.id];
                      return (typeof value == "string"? value : JSON.stringify(value));
                  },
                  /**
                   * unload(parms)
                   *
                   * This discards any data saved via set() or loaded via load(), creating an empty State object.
                   * Note that you have to follow this call with an explicit call to store() if you want to remove
                   * the state from localStorage as well.
                   *
                   * @this {State}
                   * @param {Object} [parms]
                   */
                  unload: function(parms) {
                      this[this.id] = {};
                      if (parms) this.set("parms", parms);
                      this.fLoaded = false;
                  },
                  /**
                   * clear(fAll)
                   *
                   * This unloads the current state, and then clears ALL localStorage for the current machine,
                   * independent of version, to reduce the chance of orphaned states wasting part of our limited allocation.
                   *
                   * @this {State}
                   * @param {boolean} [fAll] true to unconditionally clear ALL localStorage for the current domain
                   */
                  clear: function(fAll) {
                      this.unload();
                      var aKeys = web.getLocalStorageKeys();
                      for (var i = 0; i < aKeys.length; i++) {
                          var sKey = aKeys[i];
                          if (sKey && (fAll || sKey.substr(0, this.key.length) == this.key)) {
                              web.removeLocalStorageItem(sKey);
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("localStorage(" + sKey + ") removed");
                              }
                              aKeys.splice(i, 1);
                              i = 0;
                          }
                      }
                  },
                  /**
                   * messageEnabled(bitsMessage)
                   *
                   * @this {State}
                   * @param {number} [bitsMessage] is one or more Messages category flag(s)
                   * @return {boolean}
                   */
                  messageEnabled: function(bitsMessage) {
                      if (DEBUGGER && this.dbg) {
                          if (bitsMessage == null) {
                              bitsMessage = Messages.STATE;
                          } else {
                              bitsMessage |= Messages.STATE;
                          }
                          return this.dbg.messageEnabled(bitsMessage);
                      }
                      return false;
                  },
                  /**
                   * printMessage(sMessage)
                   *
                   * @this {State}
                   * @param {string} sMessage is any caller-defined message string
                   */
                  printMessage: function(sMessage) {
                      if (DEBUGGER && this.dbg) this.dbg.message(sMessage);
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = State;
              
            • video.js
              /**
               * @fileoverview Implements the PCjs Video component.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Jun-15
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var DumpAPI     = require("../../shared/lib/dumpapi");
                  var Component   = require("../../shared/lib/component");
                  var Memory      = require("./memory");
                  var Messages    = require("./messages");
                  var ChipSet     = require("./chipset");
                  var Keyboard    = require("./keyboard");
                  var State       = require("./state");
              }
              
              /**
               * Video(parmsVideo, canvas, context, textarea, container)
               *
               * The Video component can be configured with the following (parmsVideo) properties:
               *
               *      model: model (eg, "mda" for Monochrome Display Adapter)
               *      mode: mode number (hardware-specific, 7 is the default)
               *      memory: amount of installed memory (ignored for MDA/CGA)
               *      screenWidth: width of the screen canvas, in pixels
               *      screenHeight: height of the screen canvas, in pixels
               *      scale: true for font scaling, false (default) to center the display on the screen
               *      charCols: number of character columns
               *      charRows: number of character rows
               *      fontROM: path to .rom file (or a JSON representation) that defines the character set
               *      screenColor: background color of the screen canvas (default is black)
               *      autoLock: true to (attempt to) automatically lock the mouse to the canvas (default is false)
               *
               * An EGA may specify the following additional properties:
               *
               *      switches: string representing EGA switches (see "SW1-SW4" documentation below)
               *      memory: the size of the EGA's on-board memory (overrides EGA's Video.cardSpecs)
               *
               * This calls the Bus to allocate a video buffer at the appropriate memory location whenever
               * a reset() or setMode() occurs; setMode() is called whenever a mode change is detected at
               * the port level, and whenever reset() is called.  setMode() also invokes updateScreen(true),
               * which forces reallocation of our internal buffer (aCellCache) that mirrors the video buffer.
               *
               * The CPU periodically calls updateScreen(), at an assumed rate of 60 times/second,
               * to update any blinking elements (the cursor and any characters with the blink attribute),
               * to compare/update the contents of our internal buffer with the video buffer, and to render
               * any differences between the two buffers into the associated screen canvas, via either
               * updateChar() or setPixel().
               *
               * Thanks to the CPU's new block-based memory manager that allows us to sparse-allocate memory
               * (in 4Kb increments on 20-bit buses, 16Kb increments on 24-bit buses), updateScreen()
               * can also ask the CPU for the "dirty" state of all the blocks underlying the video buffer,
               * bypassing the update completely if the buffer is still clean.
               *
               * Unfortunately, that optimization is defeated if our count of active blink elements is non-zero,
               * because we must rescan the entire buffer to locate and redraw them all; I'm assuming for now
               * that, more often than not, blink attributes will not be present, and therefore they're not worth
               * a separate caching mechanism.  If the only blinking element is the cursor, that's no problem,
               * as we redraw only the one cell containing the cursor (assuming the buffer is otherwise clean).
               *
               * @constructor
               * @extends Component
               * @param {Object} parmsVideo
               * @param {Object} [canvas]
               * @param {Object} [context]
               * @param {Object} [textarea]
               * @param {Object} [container]
               */
              function Video(parmsVideo, canvas, context, textarea, container)
              {
                  Component.call(this, "Video", parmsVideo, Video, Messages.VIDEO);
              
                  /*
                   * This records the model specified (eg, "mda", "cga", "ega", "vga" or "" if none specified);
                   * when a model is specified, it overrides whatever model we infer from the ChipSet's switches
                   * (since those motherboard switches tell us only the type of monitor, not the type of card).
                   */
                  this.model = parmsVideo['model'];
                  this.nCard = Video.CARD.NAMES[this.model] || Video.CARD.MDA;
              
                  this.cbMemory = parmsVideo['memory'] || 0;  // zero means fallback to the cardSpec's default size
                  this.sSwitches = parmsVideo['switches'];
              
                  /*
                   * powerUp() uses the default mode ONLY if ChipSet doesn't give us a default.
                   */
                  this.nModeDefault = parmsVideo['mode'];
                  if (this.nModeDefault === undefined || Video.aModeParms[this.nModeDefault] === undefined) {
                      this.nModeDefault = Video.MODE.MDA_80X25;
                  }
              
                  /*
                   * setDimensions() uses these values ONLY if it doesn't recognize the video mode.
                   */
                  this.nColsDefault = parmsVideo['charCols'];
                  this.nRowsDefault = parmsVideo['charRows'];
                  if (this.nColsDefault === undefined || this.nRowsDefault === undefined) {
                      this.nColsDefault = Video.aModeParms[this.nModeDefault][0];
                      this.nRowsDefault = Video.aModeParms[this.nModeDefault][1];
                  }
              
                  /*
                   * setDimensions() uses these values unconditionally, as the machine has no idea what the
                   * physical screen size should be.
                   */
                  this.cxScreen = parmsVideo['screenWidth'];
                  this.cyScreen = parmsVideo['screenHeight'];
              
                  /*
                   * We might consider another component parameter to specify the font-doubling setting.
                   * For now, it's based on whether the default SCREEN cell size is sufficiently larger than
                   * the default FONT cell size.
                   */
                  this.fScaleFont = parmsVideo['scale'];
                  this.fDoubleFont = Math.round(this.cxScreen / this.nColsDefault) >= 12;
              
                  this.fTouchScreen = parmsVideo['touchScreen'];
              
                  this.canvasScreen = canvas;
                  this.contextScreen = context;
                  this.textareaScreen = textarea;
                  this.inputScreen = textarea || canvas || null;
              
                  /*
                   * If a Mouse exists, we'll be notified when it requests our canvas, and we make a note of it
                   * so that if lockPointer() is ever invoked, we can notify the Mouse.
                   */
                  this.mouse = null;
                  this.fAutoLock = parmsVideo['autoLock'];
              
                  /*
                   * Originally, setMode() would map/unmap the video buffer ONLY when the active card changed,
                   * because as long as an MDA or CGA remained active, its video buffer never changed.  However,
                   * since the EGA can change its video buffer on the fly, setMode() must also compare the card's
                   * hard-coded and/or programmed buffer address/size to the "active" address/size; the latter
                   * is recorded here.
                   */
                  this.addrBuffer = this.sizeBuffer = 0;
              
                  /*
                   * aFonts is an array of font objects indexed by FONT ID.  Font characters are arranged
                   * in 16x16 grids, with one grid per canvas object in the aCanvas array of each font object.
                   *
                   * Each element is a Font object that describes the font size and provides bitmaps for all the font
                   * color permutations.  aFonts.length will be non-zero if ANY fonts are loaded, but do NOT assume
                   * that EVERY font has been loaded; check for the existence of a font by checking for its unique ID
                   * within this sparse array.
                   */
                  this.aFonts = [];
              
                  /*
                   * Instead of (re)allocating a new color array every time getCardColors() is called, we preallocate
                   * an array now and simply update the entries as needed.
                   */
                  this.aRGB = new Array(16);
              
                  /*
                   * Since I've not found clear documentation on a reliable way to check whether a particular DOM element
                   * (other than the BODY element) has focus at any given time, I've added onfocus() and onblur() handlers
                   * to the screen to maintain my own focus state.
                   */
                  this.fHasFocus = false;
              
                  var video = this;
              
                  /*
                   * Here's the gross code to handle full-screen support across all supported browsers.  The lack of standards
                   * is exasperating; browsers can't agree on 'full' or 'Full, 'request' or 'Request', 'screen' or 'Screen', and
                   * while some browsers honor other browser prefixes, most browsers don't.
                   */
                  this.fGecko = web.isUserAgent("Gecko/");
                  var i, sEvent, asPrefixes = ['', 'moz', 'webkit', 'ms'];
              
                  this.container = container;
                  if (this.container) {
                      this.container.doFullScreen = container['requestFullscreen'] || container['msRequestFullscreen'] || container['mozRequestFullScreen'] || container['webkitRequestFullscreen'];
                      if (this.container.doFullScreen) {
                          for (i = 0; i < asPrefixes.length; i++) {
                              sEvent = asPrefixes[i] + 'fullscreenchange';
                              if ('on' + sEvent in document) {
                                  var onFullScreenChange = function() {
                                      var fFullScreen = (document['fullscreenElement'] || document['mozFullScreenElement'] || document['webkitFullscreenElement'] || document['msFullscreenElement']);
                                      video.notifyFullScreen(fFullScreen? true : false);
                                  };
                                  document.addEventListener(sEvent, onFullScreenChange, false);
                                  break;
                              }
                          }
                          for (i = 0; i < asPrefixes.length; i++) {
                              sEvent = asPrefixes[i] + 'fullscreenerror';
                              if ('on' + sEvent in document) {
                                  var onFullScreenError = function() {
                                      video.notifyFullScreen(null);
                                  };
                                  document.addEventListener(sEvent, onFullScreenError, false);
                                  break;
                              }
                          }
                      }
                  }
              
                  /*
                   * More gross code to handle pointer-locking support across all supported browsers.
                   *
                   * TODO: Consider "upgrading" this code to use the same asPrefixes array as above, especially once Microsoft
                   * finally releases a browser that supports pointer-locking (post-Windows 10?)
                   */
                  if (this.inputScreen) {
                      this.inputScreen.onfocus = function onFocusScreen() {
                          return video.onFocusChange(true);
                      };
                      this.inputScreen.onblur = function onBlurScreen() {
                          return video.onFocusChange(false);
                      };
                      this.inputScreen.lockPointer = this.inputScreen['requestPointerLock'] || this.inputScreen['mozRequestPointerLock'] || this.inputScreen['webkitRequestPointerLock'];
                      this.inputScreen.unlockPointer = this.inputScreen['exitPointerLock'] || this.inputScreen['mozExitPointerLock'] || this.inputScreen['webkitExitPointerLock'];
                      if (this.inputScreen.lockPointer) {
                          var onPointerLockChange = function() {
                              var fLocked = (
                                  document['pointerLockElement'] === video.inputScreen ||
                                  document['mozPointerLockElement'] === video.inputScreen ||
                                  document['webkitPointerLockElement'] === video.inputScreen);
                              video.notifyPointerLocked(fLocked);
                          };
                          if ('onpointerlockchange' in document) {
                              document.addEventListener('pointerlockchange', onPointerLockChange, false);
                          } else if ('onmozpointerlockchange' in document) {
                              document.addEventListener('mozpointerlockchange', onPointerLockChange, false);
                          } else if ('onwebkitpointerlockchange' in document) {
                              document.addEventListener('webkitpointerlockchange', onPointerLockChange, false);
                          }
                      }
                  }
              
                  /*
                   * As far as overall image quality of scaled fonts, these options don't seem necessary for Safari (and
                   * don't have any discernible effect anyway). Turning 'webkitImageSmoothingEnabled' off DOES have an effect
                   * on Chrome, but it's not really a positive effect overall, so I'm leaving these off for now.
                   *
                   *  if (this.contextScreen) {
                   *      this.contextScreen['mozImageSmoothingEnabled'] = false;
                   *      this.contextScreen['webkitImageSmoothingEnabled'] = false;
                   *  }
                   */
              
                  var sFileURL = parmsVideo['fontROM'];
                  if (sFileURL) {
                      var sFileExt = str.getExtension(sFileURL);
                      if (sFileExt != "json") {
                          sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + sFileURL + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES;
                      }
                      web.loadResource(sFileURL, true, null, this, this.onLoadSetFonts);
                  }
              }
              
              Component.subclass(Video);
              
              Video.TRAPALL = true;           // monitor all I/O by default (not just deltas)
              
              /*
               * MDA/CGA Support
               *
               * Since there's a lot of similarity between the MDA and CGA (eg, their text-mode video buffer
               * format, and their use of the 6845 CRT controller), since the MDA ROM contains the fonts used
               * by both devices, and since the same ROM BIOS supports both (in fact, the BIOS indiscriminately
               * initializes both, regardless which is actually installed), this same component emulates both
               * devices.
               *
               * When no model is specified, this component supports the ability to dynamically switch between
               * MDA and CGA emulation, by simply toggling the SW1 motherboard "monitor type" switch settings
               * and resetting the machine.  In that model-less configuration, we install I/O port handlers for
               * both MDA and CGA cards, regardless which monitor type is initially selected.
               *
               * To simulate an IBM PC containing both an MDA and CGA (ie, a "dual display" system), the machine
               * configuration simply defines two video components, one with model "mda" and the other with model
               * "cga", resulting in two displays; setting a specific model forces each instance of this component
               * to register only those I/O ports belonging to that model.
               *
               * In a single-display system, dynamically switching cards (ie, between MDA and CGA) creates some
               * visual challenges.  For one, the MDA prefers a native screen size of 720x350, as it supports only
               * one video mode, 80x25, with a 9x14 cell size.  The CGA, on the other hand, has an 8x8 cell size,
               * so when using an MDA-size screen, an 80x25 CGA screen will end up with 40-pixel borders on the
               * left and right, and 75-pixel borders on the top and bottom.  The result is a rather tiny CGA font
               * surrounded by lots of wasted space, so it's best to turn on font scaling (see the "scale" property)
               * and go with a larger screen size of, say, 960x400 (50% larger in width, 100% larger in height).
               *
               * I've also added support for font-doubling in createFont().  We use the 8x8 font for 80-column
               * modes and the "doubled" 16x16 font for 40-column modes OR whenever the screen is large enough
               * to use the 16x16 font, since font rendering without scaling provides the sharpest results.
               * In fact, there's special logic in setDimensions() to ignore fScaleFont in certain cases (eg,
               * 40-column modes, to improve sharpness and avoid stretching the font beyond readability).
               *
               * Graphics modes, on the other hand, are always scaled to the screen size.  Pixels are captured
               * in an off-screen buffer, which is then drawn to match the size of the virtual screen.
               *
               * TODO: Whenever there are borders, they should be filled with the CGA's overscan colors.  However,
               * in the case of graphics modes (and text modes whenever font scaling is enabled), we don't reserve
               * any space for borders, so if borders are important, explicit border support will be required.
               */
              
              /*
               * EGA Support
               *
               * EGA support piggy-backs on the existing MDA/CGA support.  All the existing MDA/CGA port handlers
               * now refer to either cardMono or cardColor (instead of directly to cardMDA or cardCGA), enabling
               * the handlers to be redirected to cardMDA, cardCGA or cardEGA as appropriate.
               *
               * Note that an MDA card supported only a Monochrome Display and a CGA card supported only a Color
               * Display (well, OK, *or* a TV monitor, which we don't currently support), but the EGA is much
               * more flexible: the Enhanced Color Display was the preferred display, but the EGA also supported
               * older displays; a Color Display on EGA wasn't ideal (same low resolutions but with more colors),
               * but the EGA also brought high-resolution graphics to Monochrome displays, which was nice.  Anyway,
               * while all those EGA/monitor combinations will be nice to support, our virtual display support
               * will focus initially on the Enhanced Color Display.
               *
               * TODO: Add support for jumpers P1 and P3 (see EGA TechRef p.85).  P1 selects either 5-color-output
               * for a CGA monitor or 6-color-output for an EGA monitor; we would presumably use this only to
               * control certain assumptions about the virtual display's capabilities (ie, Color Display vs. Enhanced
               * Color Display).  P3 can switch all the I/O ports from 0x3nn to 0x2nn; the default is 0x3nn, and
               * that's the only port range the EGA ROM supports as well.
               */
              
              /*
               * VGA Support
               *
               * More will be said here about PCjs VGA support later.  But first, a word from IBM: "Video Graphics Array [VGA]
               * Programming Considerations":
               *
               *      Certain internal timings must be guaranteed by the user, in order to have the CRTC perform properly.
               *      This is due to the physical design of the chip. These timings can be guaranteed by ensuring that the
               *      rules listed below are followed when programming the CRTC.
               *
               *           1. The Horizontal Total [HORZ_TOTAL] register (R0) must be greater than or equal to a value of
               *              25 decimal.
               *
               *           2. The minimum positive pulse width of the HSYNC output must be four character clock units.
               *
               *           3. Register R5, Horizontal Sync End [HORZ_RETRACE_END], must be programmed such that the HSYNC
               *              output goes to a logic 0 a minimum of one character clock time before the 'horizontal display enable'
               *              signal goes to a logical 1.
               *
               *           4. Register R16, Vsync Start [VERT_RETRACE_START], must be a minimum of one horizontal scan line greater
               *              than register R18 [VERT_DISP_END].  Register R18 defines where the 'vertical display enable' signal ends.
               *
               *     When bit 5 of the Attribute Mode Control register equals 1, a successful line compare (see Line Compare
               *     [LINE_COMPARE] register) in the CRT Controller forces the output of the PEL Panning register to 0's until Vsync
               *     occurs.  When Vsync occurs, the output returns to the programmed value.  This allows the portion of the screen
               *     indicated by the Line Compare register to be operated on by the PEL Panning register.
               *
               *     A write to the Character Map Select register becomes valid on the next whole character line.  No deformed
               *     characters are displayed by changing character generators in the middle of a character scan line.
               *
               *     For 256-color 320 x 200 graphics mode hex 13, the attribute controller is configured so that the 8-bit attribute
               *     stored in video memory for each PEL becomes the 8-bit address (P0 - P7) into the integrated DAC.  The user should
               *     not modify the contents of the internal Palette registers when using this mode.
               *
               *     The following sequence should be followed when accessing any of the Attribute Data registers pointed to by the
               *     Attribute Index register:
               *
               *           1. Disable interrupts
               *           2. Reset read/write flip/flop
               *           3. Write to Index register
               *           4. Read from or write to a data register
               *           5. Enable interrupts
               *
               *      The Color Select register in the Attribute Controller section may be used to rapidly switch between sets of colors
               *      in the video DAC.  When bit 7 of the Attribute Mode Control register equals 0, the 8-bit color value presented to the
               *      video DAC is composed of 6 bits from the internal Palette registers and bits 2 and 3 from the Color Select register.
               *      When bit 7 of the Attribute Mode Control register equals 1, the 8-bit color value presented to the video DAC is
               *      composed of the lower four bits from the internal Palette registers and the four bits in the Color Select register.
               *      By changing the value in the Color Select register, software rapidly switches between sets of colors in the video DAC.
               *      Note that BIOS does not support multiple sets of colors in the video DAC.  The user must load these colors if this
               *      function is to be used.  Also see the Attribute Controller block diagram on page 4-26.  Note that the above discussion
               *      applies to all modes except 256 Color Graphics mode.  In this mode the Color Select register is not used to switch
               *      between sets of colors.
               *
               *      An application that saves the "Video State" must store the 4 bytes of information contained in the system microprocessor
               *      latches in the graphics controller subsection. These latches are loaded with 32 bits from video memory (8 bits per map)
               *      each time the system microprocessor does a read from video memory.  The application needs to:
               *
               *           1. Use write mode 1 to write the values in the latches to a location in video memory that is not part of
               *              the display buffer.  The last location in the address range is a good choice.
               *
               *           2. Save the values of the latches by reading them back from video memory.
               *
               *           Note: If in a chain 4 or odd/even mode, it will be necessary to reconfigure the memory organization as four
               *           sequential maps prior to performing the sequence above.  BIOS provides support for completely saving and
               *           restoring video state.  See the IBM Personal System/2 and Personal Computer BIOS Interface Technical Reference
               *           for more information.
               *
               *      The description of the Horizontal PEL Panning register includes a figure showing the number of PELs shifted left
               *      for each valid value of the PEL Panning register and each valid video mode.  Further panning beyond that shown in
               *      the figure may be accomplished by changing the start address in the CRT Controller registers, Start Address High
               *      and Start Address Low.  The sequence involved in further panning would be as follows:
               *
               *           1. Use the PEL Panning register to shift the maximum number of bits to the left. See Figure 4-103 on page
               *              4-106 for the appropriate values.
               *
               *           2. Increment the start address.
               *
               *           3. If you are not using Modes 0 + , 1 + , 2 + , 3 + ,7, or7 + , set the PEL Panning register to 0.  If you
               *              are using these modes, set the PEL Panning register to 8.  The screen will now be shifted one PEL left
               *              of the position it was in at the end of step 1.  Step 1 through Step 3 may be repeated as desired.
               *
               *      The Line Compare register (CRTC register hex 18) should be programmed with even values in 200 line modes when
               *      used in split screen applications that scroll a second screen on top of a first screen.  This is a requirement
               *      imposed by the scan doubling logic in the CRTC.
               *
               *      If the Cursor Start register (CRTC register hex 0A) is programmed with a value greater than that in the Cursor End
               *      register (CRTC register hex 0B), then no cursor is displayed.  A split cursor is not possible.
               *
               *      In 8-dot character modes, the underline attribute produces a solid line across adjacent characters, as in the IBM
               *      Color/Graphics Monitor Adapter, Monochrome Display Adapter and the Enhanced Graphics Adapter.  In 9-dot modes, the
               *      underline across adjacent characters is dashed, as in the IBM 327X display terminals.  In 9-dot modes, the line
               *      graphics characters (C0 - DF character codes) have solid underlines.
               *
               *      For compatibility with the IBM Enhanced Graphics Adapter (EGA), the internal VGA palette is programmed the same
               *      as the EGA.  The video DAC is programmed by BIOS so that the compatible values in the internal VGA palette produce
               *      a color compatible with what was produced by EGA.  Mode hex 13 (256 colors) is programmed so that the first 16
               *      locations in the DAC produce compatible colors.
               *
               *      Summing: When BIOS is used to load the video DAC palette for a color mode and a monochrome display is connected
               *      to the system unit, the color palette is changed.  The colors are summed to produce shades of gray that allow
               *      color applications to produce a readable screen.
               *
               *      There are 4 bits that should not be modified unless the sequencer is reset by setting bit 1 of the Reset register
               *      to 0.  These bits are:
               *
               *           • Bit 3, or bit 0 of the Clocking Mode register
               *           • Bit 3, or bit 2 of the Miscellaneous Output register
               */
              
              /*
               * Supported Cards
               *
               * Note that we choose IDs that match the default font ID for each card as well, for convenience.
               */
              Video.CARD = {
                  MDA: 1,
                  CGA: 3,
                  EGA: 5,
                  VGA: 7,
                  NAMES: {
                      "mda": 1,
                      "cga": 3,
                      "ega": 5,
                      "vga": 7
                  }
              };
              
              /*
               * Supported Modes
               *
               * Although this component is designed to be a video hardware emulation, not a BIOS simulation, we DO
               * look for changes to the hardware state that correspond to standard BIOS mode settings, so our internal
               * mode setting will normally match the current BIOS mode setting; however, this a debugging convenience,
               * not an attempt to monitor or emulate the BIOS.
               *
               * We do have some BIOS awareness (eg, when loading ROM-based fonts, and some special code to ensure all
               * the BIOS diagnostics pass), but for the most part, we treat the BIOS like any other application code.
               *
               * As we expand support to include more programmable cards like the EGA, it becomes quite easy for the card
               * to enter a "mode" that has no BIOS counterpart (eg, non-standard combinations of video buffer address,
               * memory access modes, fonts, display regions, etc).  Our hardware emulation routines will cope with those
               * situations as best they can (and when they don't, it should be considered a bug if some application is
               * broken as a result), but realistically, our hardware emulation is never likely to be 100% accurate.
               */
              Video.MODE = {
                  CGA_40X25_BW:       0,
                  CGA_40X25:          1,
                  CGA_80X25_BW:       2,
                  CGA_80X25:          3,
                  CGA_320X200:        4,
                  CGA_320X200_BW:     5,
                  CGA_640X200:        6,
                  MDA_80X25:          7,
                  EGA_320X200:        0x0D,   // mapped at A000:0000
                  EGA_640X200:        0x0E,   // mapped at A000:0000
                  EGA_640X350_MONO:   0x0F,   // mapped at A000:0000, monochrome
                  EGA_640X350:        0x10,   // mapped at A000:0000, color
                  VGA_640X480_MONO:   0x11,   // mapped at A000:0000, monochrome
                  VGA_640X480:        0x12,   // mapped at A000:0000, color
                  VGA_320X200:        0x13,   // mapped at A000:0000, color
                  UNKNOWN:            0xFF
              };
              
              /*
               * Supported Monitors
               *
               * The MDA monitor displays 350 lines of vertical resolution, 720 lines of horizontal resolution, and refreshes
               * at ~50Hz.  The CGA monitor displays 200 lines vertically, 640 horizontally, and refreshes at ~60Hz.
               *
               * Based on actual MDA timings (see http://diylab.atwebpages.com/pressureDev.htm), the total horizontal
               * period (drawing a line and retracing) is ~54.25uSec (1000000uSec / 18432) and the horizontal retrace interval
               * is about 15% of that, or ~8.14uSec.  Vertical sync occurs once every 370 horizontal periods.  Of those 370,
               * only 354 represent actively drawn lines (and of those, only 350 are visible); the remaining 16 horizontal
               * periods, or 4% of the 370 total, represent the vertical retrace interval.
               *
               * I don't have similar numbers for the CGA or EGA, so for now, I assume similar percentages; ie, 15% of
               * the horizontal period will represent horizontal retrace, and 4% of the vertical pixel maximum (262) will
               * represent vertical retrace.  However, 24% of the CGA's 262 vertical maximum represents non-visible lines,
               * whereas only 5% of the MDA's 370 maximum represents non-visible lines; is there really that much "overscan"
               * on the CGA?
               *
               * For each monitor type, there's a Video.monitorSpecs object that describes the horizontal and vertical
               * timings, along with my assumptions about the percentage of time that drawing is "active" within those periods,
               * and then based on the selected monitor type, I compute the number of CPU cycles that each period lasts,
               * as well as the number of CPU cycles that drawing lasts within each period, so that the horizontal and vertical
               * retrace status flags can be quickly calculated.
               *
               * For reference, here are some important numbers to know (from https://github.com/reenigne/reenigne/blob/master/8088/cga/register_values.txt):
               *
               *              CGA          MDA
               *  Pixel clock 14.318 MHz   16.257 MHz (aka "maximum video bandwidth", as IBM Tech Refs sometimes call it)
               *  Horizontal  15.700 KHz   18.432 KHz (aka "horizontal drive", as IBM Tech Refs sometimes call it)
               *  Vertical    59.923 Hz    49.816 Hz
               *  Usage       53.69%       77.22%
               *  H pix       912 = 114*8  882 = 98*9
               *  V pix       262          370
               *  Dots        238944       326340
               */
              
              /**
               * @class MonitorSpecs
               * @property {number} nHorzPeriodsPerSec
               * @property {number} nHorzPeriodsPerFrame
               * @property {number} percentHorzActive
               * @property {number} percentVertActive
               *
               * From these monitor specs, we calculate the following values for a given Card:
               *
               *      nCyclesPerSecond = cpu.getCyclesPerSecond();      // eg, 4772727
               *      nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec) | 0;
               *      nCyclesHorzActive = (nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100) | 0;
               *      nCyclesVertPeriod = nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame;
               *      nCyclesVertActive = (nCyclesVertPeriod * monitorSpecs.percentVertActive / 100) | 0;
               */
              
              /**
               * @type {Object}
               */
              Video.monitorSpecs = {};
              
              /**
               * NOTE: Based on trial-and-error, 208 is the magic number of horizontal syncs per vertical sync that
               * yielded the necessary number of "horizontal enables" (200 or 0xC8) in the EGA ROM BIOS at C000:03D0.
               *
               * @type {{MonitorSpecs}}
               */
              Video.monitorSpecs[ChipSet.MONITOR.COLOR] = {
                  nHorzPeriodsPerSec: 15700,
                  nHorzPeriodsPerFrame: 208,
                  percentHorzActive: 85,
                  percentVertActive: 96
              };
              
              /**
               * NOTE: Based on trial-and-error, 364 is the magic number of horizontal syncs per vertical sync that
               * yielded the necessary number of "horizontal enables" (350 or 0x15E) in the EGA ROM BIOS at C000:03D0.
               *
               * @type {{MonitorSpecs}}
               */
              Video.monitorSpecs[ChipSet.MONITOR.MONO] = {
                  nHorzPeriodsPerSec: 18432,
                  nHorzPeriodsPerFrame: 364,
                  percentHorzActive: 85,
                  percentVertActive: 96
              };
              
              /**
               * @type {{MonitorSpecs}}
               */
              Video.monitorSpecs[ChipSet.MONITOR.EGACOLOR] = {
                  nHorzPeriodsPerSec: 21850,
                  nHorzPeriodsPerFrame: 364,
                  percentHorzActive: 85,
                  percentVertActive: 96
              };
              
              /**
               * NOTE: As above, the following values are based purely on trial-and-error, to yield results that fall
               * squarely within the bounds of the IBM VGA ROM timing requirements; see the IBM VGA ROM code at C000:024A.
               *
               * @type {{MonitorSpecs}}
               */
              Video.monitorSpecs[ChipSet.MONITOR.VGACOLOR] = {
                  nHorzPeriodsPerSec: 16700,
                  nHorzPeriodsPerFrame: 480,
                  percentHorzActive: 85,
                  percentVertActive: 83
              };
              
              /*
               * EGA Miscellaneous ports and SW1-Sw4
               *
               * The Card.MISC.CLOCK_SELECT bits determine which of the EGA board's 4 configuration switches are
               * returned via Card.STATUS0.SWSENSE (when SWSENSE is zero, the switch is closed):
               *
               *      0xC: return SW1
               *      0x8: return SW2
               *      0x4: return SW3
               *      0x0: return SW4
               *
               * These 4 bits are also copied to the byte at 40:88h by the EGA BIOS, where bit 0 is SW1, bit 1 is SW2,
               * bit 2 is SW3 and bit 3 is SW4.  Our switch settings come from bEGASwitches, which in turn comes from sSwitches,
               * which in turn comes from the "switches" property passed to the Video component, if any.
               *
               * As usual, the switch settings are reversed in both direction and sense from the switch settings; the
               * good news, however, is that we can use the parseSwitches() method in the ChipSet component to parse them.
               *
               * The set of valid EGA switch values, after conversion, is stored in the table below.  For each value,
               * there is an array that defines the corresponding monitor type(s) for the EGA adapter and any secondary
               * adapter.  The third value is a boolean indicating whether the EGA is the primary adapter.
               */
              Video.aEGAMonitorSwitches = {
                  0x06: [ChipSet.MONITOR.TV,           ChipSet.MONITOR.MONO,  true],  // "1001"
                  0x07: [ChipSet.MONITOR.COLOR,        ChipSet.MONITOR.MONO,  true],  // "0001"
                  0x08: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO,  true],  // "1110"
                  0x09: [ChipSet.MONITOR.EGACOLOR,     ChipSet.MONITOR.MONO,  true],  // "0110" [our default; see bEGASwitches below]
                  0x0a: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.TV,    true],  // "1010"
                  0x0b: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.COLOR, true],  // "0010"
                  0x00: [ChipSet.MONITOR.TV,           ChipSet.MONITOR.MONO,  false], // "1111"
                  0x01: [ChipSet.MONITOR.COLOR,        ChipSet.MONITOR.MONO,  false], // "0111"
                  0x02: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO,  false], // "1011"
                  0x03: [ChipSet.MONITOR.EGACOLOR,     ChipSet.MONITOR.MONO,  false], // "0011"
                  0x04: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.TV,    false], // "1101"
                  0x05: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.COLOR, false]  // "0101"
              };
              
              /**
               * @class Font
               * @property {number} cxCell
               * @property {number} cyCell
               * @property {Array} aCSSColors
               * @property {Array} aRGBColors
               * @property {Array} aColorMap
               * @property {Array} aCanvas
               */
              
              /*
               * Supported Fonts
               *
               * Once we've finished loading the standard 8K font file, aFonts[] should contain one or more of the
               * fonts listed below.  For the standard MDA/CGA font ROM, the first (MDA) font resides in the first 4Kb,
               * and the second and third (CGA) fonts reside in the two 2K halves of the second 4Kb.
               *
               * It may seem odd that the cell size for FONT_CGAD is *larger* than the cell size for FONT_CGA,
               * since 40-column mode is actually lower resolution, but since we don't shrink the screen canvas when we
               * shrink the mode, the characters must be drawn larger, and they look better if we don't have to scale them.
               *
               * From the IBM EGA Manual (p.5):
               *
               *     "In alphanumeric modes, characters are formed from one of two ROM (Read Only Memory) character
               *      generators on the adapter. One character generator defines 7x9 characters in a 9x14 character box.
               *      For Enhanced Color Display support, the 9x14 character set is modified to provide an 8x14 character set.
               *      The second character generator defines 7x7 characters in an 8x8 character box. These generators contain
               *      dot patterns for 256 different characters. The character sets are identical to those provided by the
               *      IBM Monochrome Display Adapter and the IBM Color/Graphics Monitor Adapter."
               */
              Video.FONT = {
                  MDA:    1,          // 9x14 monochrome font
                  MDAD:   2,          // 18x28 monochrome font (this is the 9x14 font doubled)
                  CGA:    3,          // 8x8 color font
                  CGAD:   6,          // 16x16 color font (this is the 8x8 CGA font doubled)
                  EGA:    5,          // 8x14 color font
                  EGAD:   10,         // 16x28 color font (this is the 8x14 EGA font doubled)
                  VGA:    7,          // 8x16 color font
                  VGAD:   14          // 16x32 color font (this is the 8x16 VGA font doubled)
              };
              
              /*
               * For each video mode, we need to know the following pieces of information:
               *
               *      0: # of columns (nCols)
               *      1: # of rows (nRows)
               *      2: # cells per word (nCellsPerWord: # of characters or pixels per word)
               *      3: # bytes of visible screen padding, if any (used for CGA graphics modes only)
               *      4: font ID (nFont: undefined if graphics mode)
               *
               * By calculating ([0] * [1]) / [2], we obtain the number of 16-bit words that mode actively displays;
               * for example, the amount of visible memory used by mode 0x04 is (320 * 200) / 4, or 16000.
               *
               * The MODES.CGA_40X25 modes specify FONT_CGA instead of FONT_CGAD because we don't automatically
               * load the FONT_CGAD unless the screen is large enough to accommodate it (see the fDoubleFont calculation).
               *
               * To compensate, we have code in setDimensions() that automatically switches to FONT_CGAD if it's loaded AND
               * the cell size warrants the larger font.  We could hard-code FONT_CGAD here, but then we'd always load it,
               * and it might not always be the best fit.
               */
              Video.aModeParms = [];                                                                              // Mode
              Video.aModeParms[Video.MODE.CGA_40X25]          = [ 40,  25,  1,   0, Video.FONT.CGA];              // 0x00
              Video.aModeParms[Video.MODE.CGA_80X25]          = [ 80,  25,  1,   0, Video.FONT.CGA];              // 0x02
              Video.aModeParms[Video.MODE.CGA_320X200]        = [320, 200,  8, 192];                              // 0x04
              Video.aModeParms[Video.MODE.CGA_640X200]        = [640, 200, 16, 192];                              // 0x06
              Video.aModeParms[Video.MODE.MDA_80X25]          = [ 80,  25,  1,   0, Video.FONT.MDA];              // 0x07
              Video.aModeParms[Video.MODE.EGA_320X200]        = [320, 200, 16];                                   // 0x0D
              Video.aModeParms[Video.MODE.EGA_640X200]        = [640, 200, 16];                                   // 0x0E
              Video.aModeParms[Video.MODE.EGA_640X350_MONO]   = [640, 350, 16];                                   // 0x0F
              Video.aModeParms[Video.MODE.EGA_640X350]        = [640, 350, 16];                                   // 0x10
              Video.aModeParms[Video.MODE.VGA_640X480_MONO]   = [640, 480, 16];                                   // 0x11
              Video.aModeParms[Video.MODE.VGA_640X480]        = [640, 480, 16];                                   // 0x12
              Video.aModeParms[Video.MODE.VGA_320X200]        = [320, 200, 16];                                   // 0x13
              
              Video.aModeParms[Video.MODE.CGA_40X25_BW]       = Video.aModeParms[Video.MODE.CGA_40X25];           // 0x01
              Video.aModeParms[Video.MODE.CGA_80X25_BW]       = Video.aModeParms[Video.MODE.CGA_80X25];           // 0x03
              Video.aModeParms[Video.MODE.CGA_320X200_BW]     = Video.aModeParms[Video.MODE.CGA_320X200];         // 0x05
              
              /*
               * MDA attribute byte definitions
               *
               * For MDA, only the following group of ATTR definitions are supported; any FGND/BGND value combinations
               * outside this group will be treated as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK).
               *
               * NOTE: Assuming MDA.MODE.BLINK_ENABLE is set (which the ROM BIOS sets by default), ATTR_BGND_BLINK will
               * cause the *foreground* element of the cell to blink, even though it is part of the *background* attribute bits.
               *
               * Regarding blink rate, characters are supposed to blink every 16 vertical frames, which amounts to .26667 blinks
               * per second, assuming a 60Hz vertical refresh rate.  So roughly every 267ms, we need to take care of any blinking
               * characters.  updateScreen() maintains a global count (cBlinkVisible) of blinking characters, to simplify the
               * decision of when to redraw the screen.
               */
              Video.ATTRS = {};
              Video.ATTRS.FGND_BLACK  = 0x00;
              Video.ATTRS.FGND_ULINE  = 0x01;
              Video.ATTRS.FGND_WHITE  = 0x07;
              Video.ATTRS.FGND_BRIGHT = 0x08;
              Video.ATTRS.BGND_BLACK  = 0x00;
              Video.ATTRS.BGND_WHITE  = 0x70;
              Video.ATTRS.BGND_BLINK  = 0x80;
              Video.ATTRS.BGND_BRIGHT = 0x80;
              Video.ATTRS.DRAW_FGND   = 0x100;        // this is an internal attribute bit, indicating the foreground should be drawn
              Video.ATTRS.DRAW_CURSOR = 0x200;        // this is an internal attribute bit, indicating when the cursor should be drawn
              
              /*
               * Here's a "cheat sheet" for attribute byte combinations that the IBM MDA could have supported.  The original (Aug 1981)
               * IBM Tech Ref is very terse and implies that only those marked with * are actually supported.
               *
               *     *0x00: non-display                       ATTR_FGND_BLACK |                    ATTR_BGND_BLACK
               *     *0x01: underline                         ATTR_FGND_ULINE |                    ATTR_BGND_BLACK
               *     *0x07: normal (white on black)           ATTR_FGND_WHITE |                    ATTR_BGND_BLACK
               *    **0x09: bright underline                  ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
               *    **0x0F: bold (bright white on black)      ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
               *     *0x70: reverse (black on white)          ATTR_FGND_BLACK |                  | ATTR_BGND_WHITE
               *      0x81: blinking underline                ATTR_FGND_ULINE |                  | ATTR_BGND_BLINK (or dim background if blink disabled)
               *    **0x87: blinking normal                   ATTR_FGND_WHITE |                  | ATTR_BGND_BLINK (or dim background if blink disabled)
               *      0x89: blinking bright underline         ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
               *    **0x8F: blinking bold                     ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
               *    **0xF0: blinking reverse                  ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or bright background if blink disabled)
               *
               * Unsupported attributes reportedly display as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK).  However, precisely which
               * attributes are unsupported on the MDA varies depending on the source. Some sources (eg, the IBM Tech Ref) imply that
               * only those marked by * are supported, while others (eg, some--but not all--Peter Norton guides) include those marked
               * by **, and still others include ALL the combinations listed above.
               *
               * Furthermore, according to http://www.seasip.info/VintagePC/mda.html:
               *
               *      Attributes 0x00, 0x08, 0x80 and 0x88 display as black space;
               *      Attribute 0x78 displays as dark green on green; depending on the monitor, there may be a green "halo" where the dark and bright bits meet;
               *      Attribute 0xF0 displays as a blinking version of 0x70 if blink enabled, and black on bright green otherwise;
               *      Attribute 0xF8 displays as a blinking version of 0x78 if blink enabled, and as dark green on bright green otherwise.
               *
               * However, I'm rather skeptical about supporting 0x78 and 0xF8, until I see some evidence that "bright black" actually
               * produced dark green on IBM equipment; it also doesn't sound like a combination many people would have used.  I'll probably
               * treat all of 0x08, 0x80 and 0x88 the same as 0x00, only because it seems logical (they're all "black on black" combinations
               * with only BRIGHT and/or BLINK bits set). Beyond that, I'll likely treat any other combination not listed in the above cheat
               * sheet as "normal".
               *
               * All the discrepancies/disagreements I've found are probably due in part to the proliferation of IBM and non-IBM MDA
               * cards, combined with IBM and non-IBM monochrome monitors, and people assuming that their non-IBM card and/or monitor
               * behaved exactly like the original IBM equipment, which probably wasn't true in all cases.
               *
               * I would like to limit my MDA display support to EXACTLY everything that the IBM MDA supported and nothing more, but
               * since there will be combinations that will logically "fall out" unless I specifically exclude them, it's very likely
               * this implementation will end up being a superset.
               */
              
              /*
               * CGA attribute byte definitions;  these simply extend the set of MDA attributes, with the exception of ATTR_FNGD_ULINE,
               * which the CGA can treat only as ATTR_FGND_BLUE.
               */
              Video.ATTRS.FGND_BLUE       = 0x01;
              Video.ATTRS.FGND_GREEN      = 0x02;
              Video.ATTRS.FGND_CYAN       = 0x03;
              Video.ATTRS.FGND_RED        = 0x04;
              Video.ATTRS.FGND_MAGENTA    = 0x05;
              Video.ATTRS.FGND_BROWN      = 0x06;
              
              Video.ATTRS.BGND_BLUE       = 0x10;
              Video.ATTRS.BGND_GREEN      = 0x20;
              Video.ATTRS.BGND_CYAN       = 0x30;
              Video.ATTRS.BGND_RED        = 0x40;
              Video.ATTRS.BGND_MAGENTA    = 0x50;
              Video.ATTRS.BGND_BROWN      = 0x60;
              
              /* For the MDA, the length of aMDAColors is 5, based on the following supported FGND attribute values:
               *
               *      0x0: black font (attribute value 0x8 is mapped to 0x0)
               *      0x1: green font with underline
               *      0x7: green font without underline (attribute values 0x2-0x6 are mapped to 0x7)
               *      0x9: bright green font with underline
               *      0xf: bright green font without underline (attribute values 0xa-0xe are mapped to 0xf)
               *
               * I'm still not sure about 0x8 (dark green?); for now, I'm mapping it to 0x0, but it may become a 6th supported color.
               */
              Video.aMDAColors = new Array(5);
              Video.aMDAColors[0] = [0x00, 0x00, 0x00, 0xff];
              Video.aMDAColors[1] = [0x7f, 0xc0, 0x7f, 0xff];
              Video.aMDAColors[2] = [0x7f, 0xc0, 0x7f, 0xff];
              Video.aMDAColors[3] = [0x7f, 0xff, 0x7f, 0xff];
              Video.aMDAColors[4] = [0x7f, 0xff, 0x7f, 0xff];
              Video.aMDAColorMap  = [0x0, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4];
              
              Video.aCGAColors = new Array(16);
              Video.aCGAColors[0]  = [0x00, 0x00, 0x00, 0xff];    // ATTR_FGND_BLACK
              Video.aCGAColors[1]  = [0x00, 0x00, 0xaa, 0xff];    // ATTR_FGND_BLUE
              Video.aCGAColors[2]  = [0x00, 0xaa, 0x00, 0xff];    // ATTR_FGND_GREEN
              Video.aCGAColors[3]  = [0x00, 0xaa, 0xaa, 0xff];    // ATTR_FGND_CYAN
              Video.aCGAColors[4]  = [0xaa, 0x00, 0x00, 0xff];    // ATTR_FGND_RED
              Video.aCGAColors[5]  = [0xaa, 0x00, 0xaa, 0xff];    // ATTR_FGND_MAGENTA
              Video.aCGAColors[6]  = [0xaa, 0x55, 0x00, 0xff];    // ATTR_FGND_BROWN
              Video.aCGAColors[7]  = [0xaa, 0xaa, 0xaa, 0xff];    // ATTR_FGND_WHITE                      (aka light gray)
              Video.aCGAColors[8]  = [0x55, 0x55, 0x55, 0xff];    // ATTR_FGND_BLACK   | ATTR_FGND_BRIGHT (aka gray)
              Video.aCGAColors[9]  = [0x55, 0x55, 0xff, 0xff];    // ATTR_FGND_BLUE    | ATTR_FGND_BRIGHT
              Video.aCGAColors[10] = [0x55, 0xff, 0x55, 0xff];    // ATTR_FGND_GREEN   | ATTR_FGND_BRIGHT
              Video.aCGAColors[11] = [0x55, 0xff, 0xff, 0xff];    // ATTR_FGND_CYAN    | ATTR_FGND_BRIGHT
              Video.aCGAColors[12] = [0xff, 0x55, 0x55, 0xff];    // ATTR_FGND_RED     | ATTR_FGND_BRIGHT
              Video.aCGAColors[13] = [0xff, 0x55, 0xff, 0xff];    // ATTR_FGND_MAGENTA | ATTR_FGND_BRIGHT
              Video.aCGAColors[14] = [0xff, 0xff, 0x55, 0xff];    // ATTR_FGND_BROWN   | ATTR_FGND_BRIGHT (aka yellow)
              Video.aCGAColors[15] = [0xff, 0xff, 0xff, 0xff];    // ATTR_FGND_WHITE   | ATTR_FGND_BRIGHT (aka white)
              
              Video.aCGAColorSet1 = [Video.ATTRS.FGND_GREEN, Video.ATTRS.FGND_RED,     Video.ATTRS.FGND_BROWN];
              Video.aCGAColorSet2 = [Video.ATTRS.FGND_CYAN,  Video.ATTRS.FGND_MAGENTA, Video.ATTRS.FGND_WHITE];
              
              /*
               * Here is the EGA BIOS default ATC palette register set for color text modes, from which getCardColors()
               * builds a default RGB array, similar to aCGAColors above.
               */
              Video.aEGAPalDef = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F];
              
              Video.aEGAByteToDW = [
                    0x00000000,   0x000000ff,   0x0000ff00,   0x0000ffff,
                    0x00ff0000,   0x00ff00ff,   0x00ffff00,   0x00ffffff,
                    0xff000000|0, 0xff0000ff|0, 0xff00ff00|0, 0xff00ffff|0,
                    0xffff0000|0, 0xffff00ff|0, 0xffffff00|0, 0xffffffff|0
              ];
              
              Video.aEGADWToByte = [];
              Video.aEGADWToByte[0x00000000] = 0x0;
              Video.aEGADWToByte[0x00000080] = 0x1;
              Video.aEGADWToByte[0x00008000] = 0x2;
              Video.aEGADWToByte[0x00008080] = 0x3;
              Video.aEGADWToByte[0x00800000] = 0x4;
              Video.aEGADWToByte[0x00800080] = 0x5;
              Video.aEGADWToByte[0x00808000] = 0x6;
              Video.aEGADWToByte[0x00808080] = 0x7;
              Video.aEGADWToByte[0x80000000|0] = 0x8;
              Video.aEGADWToByte[0x80000080|0] = 0x9;
              Video.aEGADWToByte[0x80008000|0] = 0xa;
              Video.aEGADWToByte[0x80008080|0] = 0xb;
              Video.aEGADWToByte[0x80800000|0] = 0xc;
              Video.aEGADWToByte[0x80800080|0] = 0xd;
              Video.aEGADWToByte[0x80808000|0] = 0xe;
              Video.aEGADWToByte[0x80808080|0] = 0xf;
              
              /**
               * Card(video, iCard, data, cbMemory)
               *
               * Creates an object representing an initial video card state;
               * can also restore a video card from state data created by saveCard().
               *
               * WARNING: Since Card objects are low-level objects that have no UI requirements,
               * they do not inherit from the Component class, so you should only use class methods
               * of Component, such as Component.assert(), or methods of the parent (video) object.
               *
               * @constructor
               * @param {Video} [video]
               * @param {number} [iCard] (see Video.CARD.*)
               * @param {Array|null} [data]
               * @param {number} [cbMemory] is specified if the card must allocate its own memory buffer
               */
              function Card(video, iCard, data, cbMemory)
              {
                  /*
                   * If a card was originally not present (eg, EGA), then the state will be empty,
                   * so we need to detect that case and continue indicating that the card is not present.
                   */
                  if (iCard !== undefined && (!data || data.length)) {
              
                      this.video = video;
              
                      var specs = Video.cardSpecs[iCard];
                      var nMonitorType = video.nMonitorType || specs[5];
              
                      if (!data || data.length < 6) {
                          data = [false, 0, null, null, 0, new Array(iCard < Video.CARD.EGA? Card.CRTC.TOTAL_REGS : Card.CRTC.EGA.TOTAL_REGS)];
                      }
              
                      /*
                       * If a Debugger is present, we want to stash a bit more info in each Card.
                       */
                      if (DEBUGGER) {
                          this.dbg = video.dbg;
                          this.type = specs[0];
                          this.port = specs[1];
                      }
              
                      this.nCard = iCard;
                      this.addrBuffer = specs[2];     // default (physical) video buffer address
                      this.sizeBuffer = specs[3];     // default video buffer length (this is the total size, not the current visible size; this.cbScreen is calculated on the fly to reflect the latter)
              
                      /*
                       * If no memory size is specified, then setMode() will use addMemory() to automatically add enough
                       * memory blocks to cover the video buffer specified above; otherwise, it instructs addMemory() to call
                       * getMemoryBuffer(), which will return a portion of the buffer (adwMemory) allocated below.  This allows
                       * a card like the EGA to move/resize its video buffer as needed, as well as giving it total control over
                       * the underlying memory.
                       */
                      this.cbMemory = cbMemory || specs[4];
              
                      /*
                       * All of our cardSpec video buffer sizes are based on the default text mode (eg, 4Kb for an MDA, 16Kb for
                       * a CGA), but for a card with 64Kb or more of memory (ie, any EGA card), the default text mode video buffer
                       * size should be dynamically recalculated as the smaller of: cbMemory divided by 4, or 32Kb.
                       */
                      if (this.cbMemory >= 0x10000 && this.addrBuffer >= 0xB0000) {
                          this.sizeBuffer = Math.min(this.cbMemory >> 2, 0x8000);
                      }
              
                      this.fActive    = data[0];
                      this.regMode    = data[1];      // see MDA.MODE* or CGA.MODE_* (use (MDA.MODE.HIRES | MDA.MODE.VIDEO_ENABLE | MDA.MODE.BLINK_ENABLE) if you want to test blinking immediately after the initial power-on reset)
                      this.regColor   = data[2];      // see CGA.COLOR.* (undefined on MDA)
                      this.regStatus  = data[3];      // see MDA.STATUS.* or CGA.STATUS.*
                      this.regCRTIndx = data[4] & 0xff;
                      this.regCRTPrev = (data[4] >> 8) & 0xff;
                      this.regCRTData = data[5];
                      this.nCRTCRegs  = Card.CRTC.TOTAL_REGS;
                      this.asCRTCRegs = DEBUGGER? Card.CRTC.REGS : [];
              
                      if (iCard >= Video.CARD.EGA) {
                          this.nCRTCRegs = Card.CRTC.EGA.TOTAL_REGS;
                          this.asCRTCRegs = DEBUGGER? Card.CRTC.EGA_REGS : [];
                          this.initEGA(data[6], nMonitorType);
                      }
              
                      var monitorSpecs = Video.monitorSpecs[nMonitorType] || Video.monitorSpecs[ChipSet.MONITOR.MONO];
              
                      var nCyclesPerSecond = video.cpu.getCyclesPerSecond();      // eg, 4772727
                      this.nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec) | 0;
                      this.nCyclesHorzActive = (this.nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100) | 0;
                      this.nCyclesVertPeriod = this.nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame;
                      this.nCyclesVertActive = (this.nCyclesVertPeriod * monitorSpecs.percentVertActive / 100) | 0;
                      this.nInitCycles = (data[7] == null? 0 : data[7]);
                  }
              }
              
              /*
               * MDA Registers (ports 0x3B4, 0x3B5, 0x3B8, and 0x3BA)
               */
              Card.MDA = {
                  CRTC: {
                      INDX: {
                          PORT:           0x3B4,      // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
                          MASK:           0x1F
                      },
                      DATA: {
                          PORT:           0x3B5
                      }
                  },
                  MODE: {
                      PORT:               0x3B8,      // Mode Select Register, aka CRT Control Port 1 (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
                      HIRES:              0x01,
                      VIDEO_ENABLE:       0x08,
                      BLINK_ENABLE:       0x20
                  },
                  STATUS: {
                      PORT:               0x3BA,
                      HDRIVE:             0x01,
                      BWVIDEO:            0x08
                  },
                  /*
                   * TODO: Add support for parallel port(s) someday....
                   */
                  PRT_DATA: {
                      PORT:               0x3BC
                  },
                  PRT_STATUS: {
                      PORT:               0x3BD
                  },
                  PRT_CTRL: {
                      PORT:               0x3BE
                  }
              };
              
              /*
               * CGA Registers (ports 0x3D4, 0x3D5, 0x3D8, 0x3D9, and 0x3DA)
               */
              Card.CGA = {
                  CRTC: {
                      INDX: {
                          PORT:           0x3D4,      // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
                          MASK:           0x1F
                      },
                      DATA: {
                          PORT:           0x3D5
                      }
                  },
                  MODE: {
                      PORT:               0x3D8,      // Mode Select Register (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
                      _80X25:             0x01,
                      GRAPHIC_SEL:        0x02,
                      BW_SEL:             0x04,
                      VIDEO_ENABLE:       0x08,       // same as MDA.MODE.VIDEO_ENABLE
                      HIRES_BW:           0x10,
                      BLINK_ENABLE:       0x20        // same as MDA.MODE.BLINK_ENABLE
                  },
                  COLOR: {
                      PORT:               0x3D9,      // write-only
                      BORDER:             0x07,
                      BRIGHT:             0x08,
                      BGND_ALT:           0x10,       // alternate, intensified background colors in text mode
                      COLORSET2:          0x20        // selects aCGAColorSet2 colors for 320x200 graphics mode; aCGAColorSet1 otherwise
                  },
                  STATUS: {
                      PORT:               0x3DA,      // read-only; same for EGA (although the EGA calls this STATUS1, to distinguish it from STATUS0)
                      DISP_RETRACE:       0x01,
                      PEN_TRIGGER:        0x02,
                      PEN_ON:             0x04,
                      VERT_RETRACE:       0x08        // when set, this indicates the CGA is performing a vertical retrace
                  },
                  /*
                   * TODO: Add support for light pen port(s) someday....
                   */
                  CLEAR_PEN: {
                      PORT:               0x3DB
                  },
                  PRESET_PEN: {
                      PORT:               0x3DC
                  }
              };
              
              /*
               * Common CRT hardware registers (ports 0x3B4/0x3B5 or 0x3D4/0x3D5)
               *
               * NOTE: In this implementation, because we have to make at least two of the registers readable (CURSOR_ADDR_HI and CURSOR_ADDR_LO),
               * we end up making ALL the registers readable, otherwise we would have to explicitly block any register marked write-only.  I don't
               * think making the CRT registers fully readable presents any serious compatibility issues, and it actually offers some benefits
               * (eg, improved debugging).
               *
               * However, some things are broken: the (readable) light pen registers on the EGA are overloaded as (writable) vertical retrace
               * registers, so the vertical retrace registers cannot actually be read that way.  I'm sure the VGA solved that problem, but I haven't
               * looked into it yet.
               */
              Card.CRTC = {
                  HORZ_TOTAL:             0x00,
                  HORZ_DISP:              0x01,
                  HORZ_SYNC_POS:          0x02,
                  HORZ_SYNC_WIDTH:        0x03,
                  VERT_TOTAL:             0x04,
                  VERT_TOTAL_ADJ:         0x05,
                  VERT_DISP_TOTAL:        0x06,
                  VERT_SYNC_POS:          0x07,
                  INTERLACE_POS:          0x08,
                  MAX_SCAN_LINE:          0x09,
                  CURSOR_START: {
                      INDX:               0x0A,
                      MASK:               0x1F,
                      /*
                       * I don't entirely understand these cursor blink control bits.  Here's what the MC6845 datasheet says:
                       *
                       *      Bit 5 is the blink timing control.  When bit 5 is low, the blink frequency is 1/16 of the vertical field rate,
                       *      and when bit 5 is high, the blink frequency is 1/32 of the vertical field rate.  Bit 6 is used to enable a blink.
                       */
                      BLINKON:            0x00,       // (supposedly, 0x04 has the same effect as 0x00)
                      BLINKOFF:           0x20,       // if blinking is disabled, the cursor is effectively hidden
                      BLINKFAST:          0x60        // default is 1/16 of the frame rate; this switches to 1/32 of the frame rate
                  },
                  CURSOR_END: {
                      INDX:               0x0B,
                      MASK:               0x1F
                  },
                  START_ADDR_HI:          0x0C,
                  START_ADDR_LO:          0x0D,
                  CURSOR_ADDR_HI:         0x0E,
                  CURSOR_ADDR_LO:         0x0F,
                  LIGHT_PEN_HI:           0x10,
                  LIGHT_PEN_LO:           0x11,
                  TOTAL_REGS:             0x12,       // total CRT registers on MDA/CGA
                  EGA: {
                      HORZ_DISP_END:      0x01,
                      HORZ_BLANK_START:   0x02,
                      HORZ_BLANK_END:     0x03,
                      HORZ_RETRACE_START: 0x04,
                      HORZ_RETRACE_END:   0x05,
                      VERT_TOTAL:         0x06,
                      OVERFLOW: {
                          INDX:                   0x07,
                          VERT_TOTAL_BIT8:        0x01,   // bit 8 of register 0x06
                          VERT_DISP_END_BIT8:     0x02,   // bit 8 of register 0x12
                          VERT_RETRACE_START_BIT8:0x04,   // bit 8 of register 0x10
                          VERT_BLANK_START_BIT8:  0x08,   // bit 8 of register 0x15
                          LINE_COMPARE_BIT8:      0x10,   // bit 8 of register 0x18
                          CURSOR_START_BIT8:      0x20,   // bit 8 of register 0x0A (EGA only)
                          VERT_TOTAL_BIT9:        0x20,   // bit 9 of register 0x06 (VGA only)
                          VERT_DISP_END_BIT9:     0x40,   // bit 9 of register 0x12 (VGA only, unused on EGA)
                          VERT_RETRACE_START_BIT9:0x80    // bit 9 of register 0x10 (VGA only, unused on EGA)
                      },
                      PRESET_ROW_SCAN:    0x08,
                      /* EGA/VGA CRTC registers 0x09-0x0F are the same as the MDA/CGA CRTC registers defined above */
                      VERT_RETRACE_START: 0x10,
                      VERT_RETRACE_END:   0x11,
                      VERT_DISP_END:      0x12,
                      /*
                       * The OFFSET register (bits 0-7) specifies the logical line width of the screen.  The starting memory address
                       * for the next character row is larger than the current character row by two or four times this amount.
                       * The OFFSET register is programmed with a word address.  Depending on the method of clocking the CRT Controller,
                       * this word address is [effectively] either a word or doubleword address. #IBMVGATechRef
                       */
                      OFFSET:             0x13,
                      UNDERLINE:          0x14,
                      VERT_BLANK_START:   0x15,
                      VERT_BLANK_END:     0x16,
                      MODE_CTRL: {
                          INDX:           0x17,
                          CMS:            0x01,       // Compatibility Mode Support (CGA A13 control)
                          SRSC:           0x02,       // Select Row Scan Counter
                          HRS:            0x04,       // Horizontal Retrace Select
                          CBT:            0x08,       // Count By Two
                          OC:             0x10,       // Output Control
                          AW:             0x20,       // Address Wrap (in Word mode, 1 maps A15 to A0 and 0 maps A13; use the latter when only 64Kb is installed)
                          BM:             0x40,       // Byte Mode (1 selects Byte Mode; 0 selects Word Mode)
                          HR:             0x80        // Hardware Reset
                      },
                      LINE_COMPARE:       0x18,
                      TOTAL_REGS:         0x19        // total CRT registers on EGA/VGA
                  },
                  ADDR_HI_MASK:           0x3F
              };
              
              if (DEBUGGER) {
                  Card.CRTC.REGS      = ["HORZ_TOTAL","HORZ_DISP","HORZ_SYNC_POS","HORZ_SYNC_WIDTH","VERT_TOTAL","VERT_TOTAL_ADJ",
                                         "VERT_DISP","VERT_SYNC_POS","INTERLACE_POS","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
                                         "START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","LIGHT_PEN_HI","LIGHT_PEN_LO"];
              
                  Card.CRTC.EGA_REGS  = ["HORZ_TOTAL","HORZ_DISP_END","HORZ_BLANK_START","HORZ_BLANK_END","HORZ_RETRACE_START","HORZ_RETRACE_END",
                                         "VERT_TOTAL","OVERFLOW","PRESET_ROW_SCAN","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
                                         "START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","VERT_RETRACE_START","VERT_RETRACE_END",
                                         "VERT_DISP_END","OFFSET","UNDERLINE","VERT_BLANK_START","VERT_BLANK_END","MODE_CTRL","LINE_COMPARE"];
              }
              
              /*
               * EGA/VGA Input Status 1 Register (port 0x3DA)
               *
               * STATUS1 bit 0 has confusing documentation: the EGA Tech Ref says "Logical 0 indicates the CRT raster is in a
               * horizontal or vertical retrace interval", whereas the VGA Tech Ref says "Logical 1 indicates a horizontal or
               * vertical retrace interval," but then clarifies: "This bit is the real-time status of the INVERTED display enable
               * signal".  So, instead of calling bit 0 DISP_ENABLE (or more precisely, DISP_ENABLE_INVERTED), it's simply DISP_RETRACE.
               *
               * STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
               *
               *      MUX     Bit 5   Bit 4
               *      ---     ----    ----
               *      00:     Red     Blue
               *      01:     SecBlue Green
               *      10:     SecRed  SecGreen
               *      11:     unused  unused
               */
              Card.STATUS1 = {
                  PORT:                   0x3DA,
                  DISP_RETRACE:           0x01,       // bit 0: logical OR of horizontal and vertical retrace
                  VERT_RETRACE:           0x08,       // bit 3: set during vertical retrace interval
                  DIAGNOSTIC:             0x30,       // bits 5,4 are controlled by the Card.ATC.PLANES.MUX bits
                  RESERVED:               0xC6
              };
              
              /*
               * EGA/VGA Attribute Controller Registers (port 0x3C0: regATCIndx and regATCData)
               *
               * The current ATC INDX value is stored in cardEGA.regATCIndx (including the Card.ATC.INDX_ENABLE bit), and the
               * ATC DATA values are stored in cardEGA.regATCData.  The state of the ATC INDX/DATA flip-flop is stored in fATCData.
               *
               * Note that the ATC palette registers (0x0-0xf) all use the following 6 bit assignments, with bits 6 and 7 unused:
               *
               *      0: Blue
               *      1: Green
               *      2: Red
               *      3: SecBlue (or mono video)
               *      4: SecGreen (or intensity)
               *      5: SecRed
               */
              Card.ATC = {
                  PORT:                   0x3C0,      // ATC Index/Data Port
                  INDX_MASK:              0x1F,
                  INDX_PAL_ENABLE:        0x20,       // must be clear when loading palette registers
                  PALETTE: {
                      INDX:               0x00,       // 16 registers: 0x00 - 0x0F
                      BLUE:               0x01,
                      GREEN:              0x02,
                      RED:                0x04,
                      SECBLUE:            0x08,
                      BRIGHT:             0x10,       // NOTE: The IBM EGA manual (p.56) also calls this the "intensity" bit
                      SECGREEN:           0x10,
                      SECRED:             0x20
                  },
                  PALETTE_REGS:           0x10,       // 16 total palette registers
                  MODE: {
                      INDX:               0x10,       // ATC Mode Control Register
                      GRAPHICS:           0x01,       // bit 0: set for graphics mode, clear for alphanumeric mode
                      MONOEM:             0x02,       // bit 1: set for monochrome emulation mode, clear for color emulation
                      TEXTGRCC:           0x04,       // bit 2: set for line graphics in character codes 0xC0-0xDF, clear otherwise
                      TEXTBLINK:          0x08,       // bit 3: set for text blink attribute, clear for background intensity attribute
                      RESERVED:           0x10,       // bit 4: reserved
                      PANCOMPAT:          0x20,       // bit 5: set for PEL panning compatibility
                      PELWIDTH:           0x40,       // bit 6: set for 256-color modes, clear for all other modes
                      COLORSEL:           0x80        // bit 7: set for P5,P4 mapped to bits 1,0 of the Color Select register
                  },
                  OVERSCAN: {
                      INDX:               0x11        // ATC Overscan Color Register
                  },
                  PLANES: {
                      INDX:               0x12,       // ATC Color Plane Enable Register
                      MASK:               0x0F,
                      MUX:                0x30,
                      RESERVED:           0xC0
                  },
                  HORZPAN: {
                      INDX:               0x13,       // ATC Horizontal PEL Panning Register
                      SHIFT_LEFT:         0x0F        // bits 0-3 indicate # of PELs to shift left
                  },
                  COLORSEL: {
                      INDX:               0x14,       // ATC Color Select Register (VGA only)
                      S_COLOR_7:          0x08,       // selects bit 7 of 8-bit color values sent to DAC (except 256-color modes)
                      S_COLOR_6:          0x04,       // selects bit 6 of 8-bit color values sent to DAC (except 256-color modes)
                      S_COLOR_5:          0x02,       // selects bit 5 of 8-bit color values sent to DAC
                      S_COLOR_4:          0x01        // selects bit 4 of 8-bit color values sent to DAC
                  },
                  TOTAL_REGS:             0x14
              };
              
              if (DEBUGGER) {
                  Card.ATC.REGS = ["PAL00","PAL01","PAL02","PAL03","PAL04","PAL05","PAL06","PAL07",
                                   "PAL08","PAL09","PAL0A","PAL0B","PAL0C","PAL0D","PAL0E","PAL0F",
                                   "MODE","OVERSCAN","PLANES","HORZPAN"];
              }
              
              /*
               * EGA/VGA Feature Control Register (port 0x3BA or 0x3DA: regFeat)
               *
               * The EGA BIOS writes 0x1 to Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT, then writes 0x2 to
               * Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT.  The bits from the first and second reads are shifted
               * into the high nibble of the byte at 40:88h.
               */
              Card.FEAT_CTRL = {
                  PORT_MONO:              0x3BA,      // write port address (other than the two bits below, the rest are reserved and/or unused)
                  PORT_COLOR:             0x3DA,      // write port address (other than the two bits below, the rest are reserved and/or unused)
                  PORT_READ:              0x3CA,      // read port address (VGA only)
                  BITS:                   0x03        // feature control bits
              };
              
              /*
               * EGA/VGA Miscellaneous Output Register (port 0x3C2: regMisc)
               */
              Card.MISC = {
                  PORT_WRITE:             0x3C2,      // write port address (EGA and VGA)
                  PORT_READ:              0x3CC,      // read port addresss (VGA only)
                  IO_SELECT:              0x01,       // 0 sets CRT ports to 0x3Bn, 1 sets CRT ports to 0x3Dn
                  ENABLE_RAM:             0x02,       // 0 disables video RAM, 1 enables
                  CLOCK_SELECT:           0x0C,       // 0x0: 14Mhz I/O clock, 0x4: 16Mhz on-board clock, 0x8: external clock, 0xC: unused
                  DISABLE_DRV:            0x10,       // 0 activates internal video drivers, 1 activates feature connector direct drive outputs
                  PAGE_ODD_EVEN:          0x20,       // 0 selects the low 64Kb page of video RAM for text modes, 1 selects the high page
                  HORZ_POLARITY:          0x40,       // 0 selects positive horizontal retrace
                  VERT_POLARITY:          0x80        // 0 selects positive vertical retrace
              };
              
              /*
               * EGA/VGA Input Status 0 Register (port 0x3C2: regStatus0)
               */
              Card.STATUS0 = {
                  PORT:                   0x3C2,      // read-only (aka STATUS0, to distinguish it from PORT_CGA_STATUS)
                  RESERVED:               0x0F,
                  SWSENSE:                0x10,
                  SWSENSE_SHIFT:          4,
                  FEAT:                   0x60,       // VGA: reserved
                  INTERRUPT:              0x80        // 1: video is being displayed; 0: vertical retrace is occurring
              };
              
              /*
               * VGA Subsystem Enable Register (port 0x3C3: regVGAEnable)
               */
              Card.VGA_ENABLE = {
                  PORT:                   0x3C3,
                  ENABLED:                0x01,       // when set, all VGA I/O and memory decoding is enabled; otherwise disabled (TODO: Implement)
                  RESERVED:               0xFE
              };
              
              /*
               * EGA/VGA Sequencer Registers (ports 0x3C4/0x3C5: regSEQIndx and regSEQData)
               */
              Card.SEQ = {
                  INDX: {
                      PORT:               0x3C4,      // Sequencer Index Port
                      MASK:               0x07
                  },
                  DATA: {
                      PORT:               0x3C5       // Sequencer Data Port
                  },
                  RESET: {
                      INDX:               0x00,       // Sequencer Reset Register
                      ASYNC:              0x01,
                      SYNC:               0x02
                  },
                  CLOCKING: {
                      INDX:               0x01,       // Sequencer Clocking Mode Register
                      DOTS8:              0x01,       // 1: 8 dots; 0: 9 dots
                      BANDWIDTH:          0x02,       // 0: CRTC has access 4 out of every 5 cycles (for high-res modes); 1: CRTC has access 2 out of 5 (VGA: reserved)
                      SHIFTLOAD:          0x04,
                      DOTCLOCK:           0x08,       // 0: normal dot clock; 1: master clock divided by two (used for 320x200 modes: 0, 1, 4, 5, and D)
                      SHIFT4:             0x10,       // VGA only
                      SCREEN_OFF:         0x20,       // VGA only
                      RESERVED:           0xC0
                  },
                  MAPMASK: {
                      INDX:               0x02,       // Sequencer Map Mask Register
                      PL0:                0x01,
                      PL1:                0x02,
                      PL2:                0x04,
                      PL3:                0x08,
                      MAPS:               0x0F,
                      RESERVED:           0xF0
                  },
                  CHARMAP: {
                      INDX:               0x03,       // Sequencer Character Map Select Register
                      SELB:               0x03,       // 0x0: 1st 8Kb of plane 2; 0x1: 2nd 8Kb; 0x2: 3rd 8Kb; 0x3: 4th 8Kb
                      SELA:               0x0C,       // 0x0: 1st 8Kb of plane 2; 0x4: 2nd 8Kb; 0x8: 3rd 8Kb; 0xC: 4th 8Kb
                      SELB_HIGH:          0x10,       // VGA only
                      SELA_HIGH:          0x20        // VGA only
                  },
                  MEMMODE: {
                      INDX:               0x04,       // Sequencer Memory Mode Register
                      ALPHA:              0x01,       // set for alphanumeric (A/N) mode, clear for graphics (APA or "All Points Addressable") mode (EGA only)
                      EXT:                0x02,       // set if memory expansion installed, clear if not installed
                      SEQUENTIAL:         0x04,       // set for sequential memory access, clear for mapping even addresses to planes 0/2, odd addresses to planes 1/3
                      CHAIN4:             0x08        // VGA only: set to select memory map (plane) based on low 2 bits of address
                  },
                  TOTAL_REGS:             0x05
              };
              
              if (DEBUGGER) Card.SEQ.REGS = ["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"];
              
              /*
               * VGA Digital-to-Analog Converter (DAC) Registers (regDACMask, regDACState, regDACAddr, and regDACData)
               *
               * To write PEL data, write an address to DAC.ADDR.PORT_WRITE, then write 3 bytes to DAC.DATA.PORT; the low 6 bits
               * of each byte will be concatenated to form an 18-bit DAC value (red is least significant, followed by green, then blue).
               * When the final byte is received, the 18-bit DAC value is updated and regDACAddr is auto-incremented.
               *
               * To read PEL data, the process is similar, but the initial address is written to DAC.ADDR.PORT_READ instead.
               *
               * DAC.STATE.PORT and DAC.ADDR.PORT_WRITE can be read at any time and will not interfere with a read or write operation
               * in progress.  To prevent "snow", reading or writing DAC values should be limited to retrace intervals (see regStatus1),
               * or by using the SCREEN_OFF bit in the SEQ.CLOCKING register.
               */
              Card.DAC = {
                  MASK: {
                      PORT:               0x3C6,      // initialized to 0xFF and should not be changed
                      DEFAULT:            0xFF
                  },
                  STATE: {
                      PORT:               0x3C7,
                      MODE_WRITE:         0x00,       // the DAC is in write mode if bits 0 and 1 are clear
                      MODE_READ:          0x03        // the DAC is in read mode if bits 0 and 1 are set
                  },
                  ADDR: {
                      PORT_READ:          0x3C7,      // write to initiate a read
                      PORT_WRITE:         0x3C8       // write to initiate a write; read to determine the current ADDR
                  },
                  DATA: {
                      PORT:               0x3C9
                  },
                  TOTAL_REGS:             0x100
              };
              
              /*
               * EGA/VGA Graphics Controller Registers (ports 0x3CE/0x3CF: regGRCIndx and regGRCData)
               *
               * The VGA added Write Mode 3, which is described as follows:
               *
               *      "Each map is written with 8 bits of the value contained in the Set/Reset register for that map
               *      (the Enable Set/Reset register has no effect). Rotated system microprocessor data is ANDed with the
               *      Bit Mask register data to form an 8-bit value that performs the same function as the Bit Mask register
               *      does in write modes 0 and 2."
               */
              Card.GRC = {
                  POS1_PORT:              0x3CC,      // EGA only, write-only
                  POS2_PORT:              0x3CA,      // EGA only, write-only
                  INDX: {
                      PORT:               0x3CE,      // GRC Index Port
                      MASK:               0x0F
                  },
                  DATA: {
                      PORT:               0x3CF       // GRC Data Port
                  },
                  SRESET: {
                      INDX:               0x00        // GRC Set/Reset Register (write-only; each bit used only if WRITE_MODE is 0 and corresponding ESR bit set)
                  },
                  ESRESET: {
                      INDX:               0x01        // GRC Enable Set/Reset Register
                  },
                  COLORCMP: {
                      INDX:               0x02        // GRC Color Compare Register
                  },
                  DATAROT: {
                      INDX:               0x03,       // GRC Data Rotate Register
                      COUNT:              0x07,
                      AND:                0x08,
                      OR:                 0x10,
                      XOR:                0x18,
                      FUNC:               0x18,
                      MASK:               0x1F
                  },
                  READMAP: {
                      INDX:               0x04,       // GRC Read Map Select Register
                      NUM:                0x03
                  },
                  MODE: {
                      INDX:               0x05,       // GRC Mode Register
                      WRITE_MODE0:        0x00,       // write mode 0x0: each plane written with CPU data, rotated as needed, unless SR enabled
                      WRITE_MODE1:        0x01,       // write mode 0x1: each plane written with contents of the processor latches (loaded by a read)
                      WRITE_MODE2:        0x02,       // write mode 0x2: memory plane N is written with 8 bits matching data bit N
                      WRITE_MODE3:        0x03,       // write mode 0x3: VGA only
                      WRITE:              0x03,
                      TEST:               0x04,
                      READ_MODE0:         0x00,       // read mode 0x0: read map mode
                      READ_MODE1:         0x08,       // read mode 0x1: color compare mode
                      EVENODD:            0x10,
                      SHIFT:              0x20,
                      COLOR256:           0x40        // VGA only
                  },
                  MISC: {
                      INDX:               0x06,       // GRC Miscellaneous Register
                      GRAPHICS:           0x01,       // set for graphics mode addressing, clear for text mode addressing
                      CHAIN:              0x02,       // set for odd/even planes selected with odd/even values of the processor AO bit
                      MAPMEM:             0x0C,       //
                      MAPA0128:           0x00,       //
                      MAPA064:            0x04,       //
                      MAPB032:            0x08,       //
                      MAPB832:            0x0C        //
                  },
                  COLORDC: {
                      INDX:               0x07        // GRC Color "Don't Care" Register
                  },
                  BITMASK: {
                      INDX:               0x08        // GRC Bit Mask Register
                  },
                  TOTAL_REGS:             0x09
              };
              
              if (DEBUGGER) Card.GRC.REGS = ["SRESET","ESRESET","COLORCMP","DATAROT","READMAP","MODE","MISC","COLORDC","BITMASK"];
              
              /*
               * EGA Memory Access Functions
               *
               * Here's where we define all the getMemoryAccess() functions that know how to deal with "planar" EGA memory,
               * which consists of 32-bit values for every byte of address space, allowing us to internally store plane 0
               * bytes in bits 0-7, plane 1 bytes in bits 8-15, plane 2 bytes in bits 16-23, and plane 3 bytes in bits 24-31.
               *
               * All our functions have slightly more overhead than the standard Bus memory access functions, because the
               * offset (off) parameter is block-relative, which we must transform into a buffer-relative offset.  Fortunately,
               * all our Memory objects know this and have already recorded their buffer-relative offset in "this.offset".
               *
               * Also, the EGA includes a set of latches, one for each plane, which must be updated on most reads/writes;
               * we rely on the Memory object's "this.controller" property to give us access to the Card's state.
               *
               * And we take a little extra time to conditionally set fDirty on writes, meaning if a write did not actually
               * change the value of the memory, we will not set fDirty.  The default write functions in memory.js don't take
               * that performance hit, but here, it may be worthwhile, because if it results in fewer dirty blocks, display
               * updates may be faster.
               *
               * Note that we don't have to worry about dealing with word accesses that straddle block boundaries, because
               * the Bus component automatically breaks those accesses into separate byte requests.  Similarly, byte and word
               * values for the write functions have already been pre-masked by the Bus component to 8 and 16 bits, respectively.
               *
               * My motto: Be paranoid, but also be careful not to do any more work than you absolutely have to.
               *
               *
               * CGA Emulation on the EGA
               *
               * Modes 4/5 (320x200 low-res graphics) emulate the same buffer format that the CGA uses.  To recap: 1 byte contains
               * 4 pixels (pixel 0 in bits 7-6, pixel 1 in bits 5-4, etc), and thus one row of pixels is 80 (0x50) bytes long.
               * Moreover, all even rows are stored in the first 8K of the video buffer (at 0xB8000), and all odd rows are stored
               * in the second 8K (at 0xBA000).  Of each 8K, only 8000 (0x1F40) bytes are used (80 bytes X 100 rows); the remaining
               * 192 bytes of each 8K are unused.
               *
               * For these modes, the EGA's GRC.MODE is programmed with 0x30: Card.GRC.MODE.EVENODD and Card.GRC.MODE.SHIFT.
               * The latter claims to work by forming each 2-bit pixel with even bits from plane 0 and odd bits from plane 1;
               * however, I'm unclear how that works if even bytes are only written to plane 0 and odd bytes are only written to
               * plane 1, as Card.GRC.MODE.EVENODD implies, because plane 0 would never have any bits for the odd bytes, and
               * plane 1 would never have any bits for the even bytes.  TODO: Figure this out.
               *
               *
               * Even/Odd Memory Access Functions
               *
               * The "EVENODD" functions deal with the EGA's default text-mode addressing, where EVEN addresses are mapped to
               * plane 0 (and 2) and ODD addresses are mapped to plane 1 (and 3).  This occurs when SEQ.MEMMODE.SEQUENTIAL
               * is clear (and GRC.MODE.EVENODD is set), turning address bit 0 (A0) into a "plane select" bit.  Whether A0 is
               * also used as a memory address bit depends on CRTC.MODE_CTRL.BM: if it's set, then we're in "Byte Mode" and A0 is
               * used as-is; if it's clear, then we're in "Word Mode", and either A15 (when CRTC.MODE_CTRL.AW is set) or A13
               * (when CRTC.MODE_CTRL.AW is clear, typically when only 64Kb of EGA memory is installed) is substituted for A0.
               *
               * Note that A13 remains clear until addresses reach 8K, at which point we've spanned 32Kb of EGA memory, so it makes
               * sense to propagate A13 to A0 at that point, so that the next 8K of addresses start using ODD instead of EVEN bytes,
               * and no memory is wasted on a 64Kb EGA card.
               *
               * These functions, however, don't yet deal with all those subtleties: A0 is currently used only as a "plane select"
               * bit and set to zero for addressing purposes, meaning that only the EVEN bytes in EGA memory will ever be used.
               * TODO: Implement the subtleties.
               */
              
              /*
               * Values returned by getAccess(); the high byte describes the read mode, and the low byte describes the write mode.
               *
               * V2 should never appear in any values used by getAccess() or setAccess()/setMemoryAccess(); the sole purpose of V2 is
               * to distinguish newer (V2) access values from older (V1) access values in saved contexts.  It's set when the context
               * is saved, and cleared when the context is restored.  Thus, if V2 is not set on restore, we assume we're dealing with
               * a V1 value, so we run it through the V1 table (below) to produce a V2 value.  Hopefully at some point V1 contexts
               * can be deprecated, and the V2 bit can be eliminated/repurposed.
               */
              Card.ACCESS = {
                  READ: {                             // READ values are designed to be OR'ed with WRITE values
                      MODE0:              0x0400,
                      MODE1:              0x0500,
                      EVENODD:            0x1000,
                      MASK:               0xFF00
                  },
                  WRITE: {                            // and WRITE values are designed to be OR'ed with READ values
                      MODE0:              0x0000,
                      MODE1:              0x0001,
                      MODE2:              0x0002,
                      MODE3:              0x0003,     // VGA only
                      EVENODD:            0x0010,
                      ROT:                0x0020,
                      AND:                0x0060,
                      OR:                 0x00A0,
                      XOR:                0x00E0,
                      MASK:               0x00F7      // 0xF7 ensures we strip any lingering V2 bit from the value
                  },
                  V2:                     0x0008      // this is a signature bit used ONLY to differentiate V2 access values from V1
              };
              
              /*
               * Table of older (V1) access values and their corresponding new values; the new values are similar but a little
               * more rational (for example, using common values for all the logical operations across modes).
               */
              Card.ACCESS.V1 = [];
              Card.ACCESS.V1[0x0002] = Card.ACCESS.READ.MODE0;
              Card.ACCESS.V1[0x0003] = Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD;
              Card.ACCESS.V1[0x0010] = Card.ACCESS.READ.MODE1;
              Card.ACCESS.V1[0x0200] = Card.ACCESS.WRITE.MODE0;
              Card.ACCESS.V1[0x0400] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
              Card.ACCESS.V1[0x0600] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
              Card.ACCESS.V1[0x0A00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
              Card.ACCESS.V1[0x0E00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
              Card.ACCESS.V1[0x0300] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD;
              Card.ACCESS.V1[0x1000] = Card.ACCESS.WRITE.MODE1;
              Card.ACCESS.V1[0x2000] = Card.ACCESS.WRITE.MODE2;
              Card.ACCESS.V1[0x6000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
              Card.ACCESS.V1[0xA000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
              Card.ACCESS.V1[0xE000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
              
              /**
               * readByteMode0(off, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} [addr]
               * @return {number}
               */
              Card.ACCESS.readByteMode0 = function readByteMode0(off, addr)
              {
                  off += this.offset;
                  var dw = this.controller.latches = this.adw[off];
                  return (dw >> this.controller.nReadMapShift) & 0xff;
              };
              
              /**
               * readByteMode0EvenOdd(off, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} [addr]
               * @return {number}
               */
              Card.ACCESS.readByteMode0EvenOdd = function readByteMode0EvenOdd(off, addr)
              {
                  /*
                   * TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to determine
                   * exactly what gets latched (ie, from which address) when EVENODD is in effect.  Whatever we learn may
                   * also dictate a special EVENODD function for Read Mode 1 as well.
                   */
                  off += this.offset;
                  var idw = off & ~0x1;
                  var dw = this.controller.latches = this.adw[idw];
                  return (!(off & 1)? dw : (dw >> 8)) & 0xff;
              };
              
              /**
               * readByteMode1(off, addr)
               *
               * This mode requires us to step through each of the 8 sets of 4 bits in the specified DWORD of video memory,
               * returning a 1 wherever all 4 match the Color Compare (COLORCMP) Register and a 0 otherwise.  An added wrinkle
               * is that the Color Don't Care (COLORDC) Register can specify that any/all/none of the 4 bits must be ignored.
               *
               * We perform the comparison from most to least significant bit, because that matches how the nColorCompare and
               * nColorDontCare masks are initialized; we could have gone either way, but this is more consistent with the rest
               * of the component (eg, pixels are drawn across the screen from left to right, starting with the most significant
               * bit of each byte).
               *
               * Also note that, while not well-documented, this mode also affects the internal latches, so we make sure those
               * are updated as well.
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} [addr]
               * @return {number}
               */
              Card.ACCESS.readByteMode1 = function readByteMode1(off, addr)
              {
                  off += this.offset;
                  var dw = this.controller.latches = this.adw[off];
                  /*
                   * Minor optimization: we could pre-mask nColorCompare with nColorDontCare, whenever either register is updated,
                   * but that's a drop in the bucket compared to all the other work this function must do.
                   */
                  var mask = this.controller.nColorDontCare;
                  var color = this.controller.nColorCompare & mask;
                  var b = 0, bit = 0x80;
                  while (bit) {
                      if ((dw & mask) == color) b |= bit;
                      color >>>= 1;  mask >>>= 1;  bit >>= 1;
                  }
                  return b;
              };
              
              /**
               * writeByteMode0(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0 = function writeByteMode0(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  dw = (this.adw[idw] & ~this.controller.nWriteMapMask) | (dw & this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode0EvenOdd(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0EvenOdd = function writeByteMode0EvenOdd(off, b, addr)
              {
                  off += this.offset;
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  //
                  // When even/odd addressing is enabled, nWriteMapMask must be cleared for planes 1 and 3 if
                  // the address is even, and cleared for planes 0 and 2 if the address is odd.
                  //
                  var idw = off & ~0x1;
                  var maskMaps = this.controller.nWriteMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
                  dw = (dw & maskMaps) | (this.adw[idw] & ~maskMaps);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode0Rot(off, b, addr)
               *
               * Supporting Set/Reset means that for every plane for which Set/Reset is enabled, we must
               * replace the corresponding byte in "dw" with a byte of zeros or ones.  This is accomplished with
               * nSetMapMask, nSetMapData, and nSetMapBits.  nSetMapMask is the inverse of the ESRESET bits,
               * because we use it to mask the processor data; nSetMapData records the desired SRESET bits; and
               * nSetMapBits contains the bits to replace those that we masked in the processor data.
               *
               * We could have done this:
               *
               *      dw = (dw & this.controller.nSetMapMask) | (this.controller.nSetMapData & ~this.controller.nSetMapMask)
               *
               * but by maintaining nSetMapBits equal to (nSetMapData & ~nSetMapMask), we are able to make the writes
               * slightly more efficient.
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0Rot = function writeByteMode0Rot(off, b, addr)
              {
                  var idw = off + this.offset;
                  b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode0And(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0And = function writeByteMode0And(off, b, addr)
              {
                  var idw = off + this.offset;
                  b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                  dw &= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode0Or(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0Or = function writeByteMode0Or(off, b, addr)
              {
                  var idw = off + this.offset;
                  b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                  dw |= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode0Xor(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode0Xor = function writeByteMode0Xor(off, b, addr)
              {
                  var idw = off + this.offset;
                  b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                  var dw = b | (b << 8) | (b << 16) | (b << 24);
                  dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                  dw ^= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode1(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (ignored; the EGA latches provide the source data)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode1 = function writeByteMode1(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = (this.adw[idw] & ~this.controller.nWriteMapMask) | (this.controller.latches & this.controller.nWriteMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode1EvenOdd(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (ignored; the EGA latches provide the source data)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode1EvenOdd = function writeByteMode1EvenOdd(off, b, addr)
              {
                  /*
                   * TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to determine
                   * exactly where latches are written (ie, to which address) when EVENODD is in effect.
                   */
                  off += this.offset;
                  //
                  // When even/odd addressing is enabled, nWriteMapMask must be cleared for planes 1 and 3 if
                  // the address is even, and cleared for planes 0 and 2 if the address is odd.
                  //
                  var idw = off & ~0x1;
                  var maskMaps = this.controller.nWriteMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
                  var dw = (this.adw[idw] & ~maskMaps) | (this.controller.latches & maskMaps);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode2(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode2 = function writeByteMode2(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = Video.aEGAByteToDW[b & 0xf];
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode2And(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode2And = function writeByteMode2And(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = Video.aEGAByteToDW[b & 0xf];
                  dw &= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode2Or(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode2Or = function writeByteMode2Or(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = Video.aEGAByteToDW[b & 0xf];
                  dw |= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /**
               * writeByteMode2Xor(off, b, addr)
               *
               * @this {Memory}
               * @param {number} off
               * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
               * @param {number} [addr]
               */
              Card.ACCESS.writeByteMode2Xor = function writeByteMode2Xor(off, b, addr)
              {
                  var idw = off + this.offset;
                  var dw = Video.aEGAByteToDW[b & 0xf];
                  dw ^= this.controller.latches;
                  dw = (dw & this.controller.nWriteMapMask) | (this.adw[idw] & ~this.controller.nWriteMapMask);
                  dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                  if (this.adw[idw] != dw) {
                      this.adw[idw] = dw;
                      this.fDirty = true;
                  }
              };
              
              /*
               * Mappings from getAccess() values to access functions above
               */
              Card.ACCESS.afn = [];
              
              Card.ACCESS.afn[Card.ACCESS.READ.MODE0]  = Card.ACCESS.readByteMode0;
              Card.ACCESS.afn[Card.ACCESS.READ.MODE0  |  Card.ACCESS.READ.EVENODD]  = Card.ACCESS.readByteMode0EvenOdd;
              Card.ACCESS.afn[Card.ACCESS.READ.MODE1]  = Card.ACCESS.readByteMode1;
              
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0] = Card.ACCESS.writeByteMode0;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.ROT] = Card.ACCESS.writeByteMode0Rot;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode0And;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.OR]  = Card.ACCESS.writeByteMode0Or;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode0Xor;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode0EvenOdd;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1] = Card.ACCESS.writeByteMode1;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1 |  Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode1EvenOdd;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2] = Card.ACCESS.writeByteMode2;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode2And;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.OR]  = Card.ACCESS.writeByteMode2Or;
              Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode2Xor;
              
              /**
               * initEGA(data)
               *
               * Another one of my frustrations with JSON is that it encodes empty arrays with non-zero lengths as
               * arrays of nulls, which means that any uninitialized register arrays whose elements were all originally
               * undefined come back via the JSON round-trip as *initialized* arrays whose elements are now all null.
               *
               * I'm a bit surprised, because JavaScript purists tell us to always use the '===' operator (eg, use
               * 'aReg[i] === undefined' to determine if an element is initialized), but because of this JSON stupidity,
               * that would require all such tests to become 'aReg[i] === undefined || aReg[i] === null'.  I'm puzzled
               * why the coercion of '==' is considered evil but JSON's coercion of undefined to null is perfectly fine.
               *
               * The simple solution is to change such comparisons to 'aReg[i] == null', because undefined is coerced
               * to null, whereas numeric values are not.
               *
               * [What do I mean by "another" frustration?  Let me talk to you some day about disallowing hex constants,
               * or insisting that property names be quoted, or refusing to allow comments.  I think it's fine for
               * JSON.stringify() to produce output that adheres to rules like that -- although some parameters to control
               * the output would be nice -- but it's completely unnecessary for JSON.parse() to refuse to parse objects
               * that are perfectly valid.]
               *
               * @this {Card}
               * @param {Array|undefined} data
               * @param {number} nMonitorType
               */
              Card.prototype.initEGA = function(data, nMonitorType)
              {
                  if (data === undefined) {
                      data = [
                          /* 0*/  false,
                          /* 1*/  0,
                          /* 2*/  new Array(Card.ATC.TOTAL_REGS),
                          /* 3*/  0,
                          /* 4*/  (nMonitorType == ChipSet.MONITOR.MONO? 0: Card.MISC.IO_SELECT),
                          /* 5*/  0,
                          /* 6*/  0,
                          /* 7*/  new Array(Card.SEQ.TOTAL_REGS),
                          /* 8*/  0,
                          /* 9*/  0,
                          /*10*/  0,
                          /*11*/  new Array(Card.GRC.TOTAL_REGS),
                          /*12*/  0,
                          /*13*/  [this.addrBuffer, this.sizeBuffer, this.cbMemory],
                          /*14*/  new Array(this.cbMemory >> 2),      // divide cbMemory by 4 since this is an array of DWORDs (8 bits for each of 4 planes)
                          /*
                           * Card.ACCESS.WRITE.MODE0 by itself is a pretty good default, but if we choose to "randomize" the screen with
                           * text characters prior to starting the machine, defaulting to Card.ACCESS.WRITE.EVENODD is more faithful to how
                           * characters and attributes are typically stored (ie, in planes 0 and 1, respectively).  As soon as the machine
                           * starts up and initializes the hardware itself, these defaults won't matter.
                           */
                          /*15*/  Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD | Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD | Card.ACCESS.V2,
                          /*16*/  0,
                          /*17*/  0xffffffff|0,
                          /*18*/  0,
                          /*19*/  0xffffffff|0,
                          /*20*/  0,
                          /*21*/  0xffffffff|0,
                          /*22*/  0,
                          /*23*/  0,
                          /*24*/  0,
                          /*25*/  Card.VGA_ENABLE.ENABLED,
                          /*26*/  Card.DAC.MASK.DEFAULT,
                          /*27*/  0,
                          /*28*/  0,
                          /*29*/  Card.DAC.STATE.MODE_WRITE,
                          /*30*/  new Array(Card.DAC.TOTAL_REGS)
                      ];
                  }
              
                  this.fATCData   = data[0];
                  this.regATCIndx = data[1];
                  this.regATCData = data[2];
                  this.asATCRegs  = DEBUGGER? Card.ATC.REGS : [];
                  this.regStatus0 = data[3];      // aka STATUS0 (not to be confused with this.regStatus, which the EGA refers to as STATUS1)
                  this.regMisc    = data[4];
                  this.regFeat    = data[5];      // for feature control bits, see Card.FEAT_CTRL.BITS; for feature status bits, see Card.STATUS0.FEAT
                  this.regSEQIndx = data[6];
                  this.regSEQData = data[7];
                  this.asSEQRegs  = DEBUGGER? Card.SEQ.REGS : [];
                  this.regGRCPos1 = data[8];
                  this.regGRCPos2 = data[9];
                  this.regGRCIndx = data[10];
                  this.regGRCData = data[11];
                  this.asGRCRegs  = DEBUGGER? Card.GRC.REGS : [];
                  this.latches    = data[12];
              
                  /*
                   * Since we originally neglected to save/restore the card's active video buffer address and length,
                   * we're now stashing all that information in data[13].  So if we're presented with an old data entry
                   * that contains only the card's memory size, fix it up.
                   *
                   * TODO: This code just creates the required array; the correct video buffer address and length would
                   * still need to be calculated from the current GRC registers; checkMode() knows how to do that, but I'm
                   * not prepared to shoehorn in a call to checkMode() here, and potentially create more issues, for an
                   * old problem that will eventually disappear anyway.
                   */
                  var a = data[13];
                  if (typeof a == "number") {
                      a = [this.addrBuffer, this.sizeBuffer, a];
                  }
                  this.addrBuffer = a[0];
                  this.sizeBuffer = a[1];
                  this.video.assert(this.cbMemory === a[2]);
              
                  var cdw = this.cbMemory >> 2;
                  this.adwMemory  = data[14];
                  if (this.adwMemory && this.adwMemory.length < cdw) {
                      this.adwMemory = State.decompressEvenOdd(this.adwMemory, cdw);
                  }
              
                  var nAccess = data[15];
                  if (nAccess) {
                      if (nAccess & Card.ACCESS.V2) {
                          nAccess &= ~Card.ACCESS.V2;
                      } else {
                          this.video.assert(Card.ACCESS.V1[nAccess & 0xff00] !== undefined && Card.ACCESS.V1[nAccess & 0xff] !== undefined);
                          nAccess = Card.ACCESS.V1[nAccess & 0xff00] | Card.ACCESS.V1[nAccess & 0xff];
                      }
                  }
                  this.setMemoryAccess(nAccess);
              
                  /*
                   * nReadMapShift must perfectly track how the GRC.READMAP register is programmed, so that Card.ACCESS.READ.MODE0
                   * memory read functions read the appropriate plane.  This default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
                   * is chosen as our default AND you want the screen randomizer to work.
                   */
                  this.nReadMapShift  = data[16];
              
                  /*
                   * Similarly, nWriteMapMask must perfectly track how the SEQ.MAPMASK register is programmed, so that memory write
                   * functions write the appropriate plane(s).  Again, this default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
                   * is chosen as our default AND you want the screen randomizer to work.
                   */
                  this.nWriteMapMask  = data[17];
                  this.nDataRotate    = data[18];
                  this.nBitMapMask    = data[19];
                  this.nSetMapData    = data[20];
                  this.nSetMapMask    = data[21];
                  this.nSetMapBits    = data[22];
                  this.nColorCompare  = data[23];
                  this.nColorDontCare = data[24];
              
                  if (this.nCard == Video.CARD.VGA) {
                      this.regVGAEnable   = data[25];
                      this.regDACMask     = data[26];
                      this.regDACAddr     = data[27];
                      this.regDACShift    = data[28];
                      this.regDACState    = data[29];
                      this.regDACData     = data[30];
                  }
              };
              
              /**
               * saveCard()
               *
               * @this {Card}
               * @return {Array}
               */
              Card.prototype.saveCard = function()
              {
                  var data = [];
                  if (this.nCard !== undefined) {
                      data[0] = this.fActive;
                      data[1] = this.regMode;
                      data[2] = this.regColor;
                      data[3] = this.regStatus;
                      data[4] = this.regCRTIndx | (this.regCRTPrev << 8);
                      data[5] = this.regCRTData;
                      if (this.nCard >= Video.CARD.EGA) {
                          data[6] = this.saveEGA();
                      }
                      data[7] = this.nInitCycles;
                  }
                  return data;
              };
              
              /**
               * saveEGA()
               *
               * @this {Card}
               * @return {Array}
               */
              Card.prototype.saveEGA = function()
              {
                  var data = [];
                  data[0]  = this.fATCData;
                  data[1]  = this.regATCIndx;
                  data[2]  = this.regATCData;
                  data[3]  = this.regStatus0;
                  data[4]  = this.regMisc;
                  data[5]  = this.regFeat;
                  data[6]  = this.regSEQIndx;
                  data[7]  = this.regSEQData;
                  data[8]  = this.regGRCPos1;
                  data[9]  = this.regGRCPos2;
                  data[10] = this.regGRCIndx;
                  data[11] = this.regGRCData;
                  data[12] = this.latches;
                  data[13] = [this.addrBuffer, this.sizeBuffer, this.cbMemory];
                  data[14] = State.compressEvenOdd(this.adwMemory);
                  data[15] = this.nAccess | Card.ACCESS.V2;
                  data[16] = this.nReadMapShift;
                  data[17] = this.nWriteMapMask;
                  data[18] = this.nDataRotate;
                  data[19] = this.nBitMapMask;
                  data[20] = this.nSetMapData;
                  data[21] = this.nSetMapMask;
                  data[22] = this.nSetMapBits;
                  data[23] = this.nColorCompare;
                  data[24] = this.nColorDontCare;
              
                  if (this.nCard == Video.CARD.VGA) {
                      data[25] = this.regVGAEnable;
                      data[26] = this.regDACMask;
                      data[27] = this.regDACAddr;
                      data[28] = this.regDACShift;
                      data[29] = this.regDACState;
                      data[30] = this.regDACData;
                  }
                  return data;
              };
              
              /**
               * dumpRegs()
               *
               * Since we don't pre-allocate the register arrays (eg, ATC, CRTC, GRC, etc) on a Card, we can't
               * rely on their array length, so we instead rely on the number of register names supplied in asRegs.
               *
               * @this {Card}
               * @param {string} sName
               * @param {number} iReg
               * @param {Array} [aRegs]
               * @param {Array} [asRegs]
               */
              Card.prototype.dumpRegs = function(sName, iReg, aRegs, asRegs)
              {
                  if (DEBUGGER) {
                      if (!aRegs) {
                          this.dbg.println(sName + ": " + str.toHexByte(iReg));
                          return;
                      }
                      var i, cchMax = 19, s = "";
                      /*
                      var s = "", i, cchMax = 0;
                      for (i = 0; i < asRegs.length; i++) {
                          if (cchMax < asRegs[i].length) cchMax = asRegs[i].length;
                      }
                      cchMax++;
                       */
                      for (i = 0; i < asRegs.length; i++) {
                          if (s) s += '\n';
                          s += sName + "[" + str.toHexByte(i) + "]: " + str.pad(asRegs[i], cchMax) + str.toHexByte(aRegs[i]) + (i === iReg? "*" : "");
                      }
                      this.dbg.println(s);
                  }
              };
              
              /**
               * dumpCard()
               *
               * @this {Card}
               */
              Card.prototype.dumpCard = function()
              {
                  if (DEBUGGER) {
                      /*
                       * Start with registers that are common to all cards....
                       */
                      this.dumpRegs("CRTC", this.regCRTIndx, this.regCRTData, this.asCRTCRegs);
              
                      if (this.nCard >= Video.CARD.EGA) {
                          this.dumpRegs(" GRC", this.regGRCIndx, this.regGRCData, this.asGRCRegs);
                          this.dumpRegs(" SEQ", this.regSEQIndx, this.regSEQData, this.asSEQRegs);
                          this.dumpRegs(" ATC", this.regATCIndx, this.regATCData, this.asATCRegs);
                          this.dbg.println("   ATCDATA: " + this.fATCData);
                          this.dumpRegs("      FEAT", this.regFeat);
                          this.dumpRegs("      MISC", this.regMisc);
                          this.dumpRegs("   STATUS0", this.regStatus0);
                          /*
                           * There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
                           */
                      }
              
                      this.dumpRegs("   STATUS1", this.regStatus);
              
                      if (this.nCard == Video.CARD.MDA || this.nCard == Video.CARD.CGA) {
                          this.dumpRegs("   MODEREG", this.regMode);
                      }
              
                      if (this.nCard == Video.CARD.CGA) {
                          this.dumpRegs("     COLOR", this.regColor);
                      }
              
                      if (this.nCard >= Video.CARD.EGA) {
                          this.dbg.println("   LATCHES: 0x" + str.toHex(this.latches));
                          this.dbg.println("    ACCESS: " + str.toHexWord(this.nAccess));
                          this.dbg.println("Use 'dump video [addr]' to dump video memory");
                          /*
                           * There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
                           */
                      }
                  }
              };
              
              /**
               * dumpBuffer()
               *
               * @this {Card}
               * @param {string} sParm
               */
              Card.prototype.dumpBuffer = function(sParm)
              {
                  if (DEBUGGER) {
                      if (!this.adwMemory) {
                          this.dbg.println("no buffer");
                          return;
                      }
                      var idw = str.parseInt(sParm);
                      idw = (idw !== undefined? idw - this.addrBuffer : (this.prevDump || 0));
                      if (idw < 0) idw = 0;
                      var cLines = 8, sDump = "";
                      for (var iLine = 0; iLine < cLines; iLine++) {
                          var sData = str.toHex(this.addrBuffer + idw) + ":";
                          for (var i = 0; i < 8 && idw < this.adwMemory.length; i++) {
                              var dw = this.adwMemory[idw++];
                              sData += " " + str.toHex(dw);
                          }
                          if (sDump) sDump += "\n";
                          sDump += sData;
                      }
                      if (sDump) this.dbg.println(sDump);
                      this.prevDump = idw;
                  }
              };
              
              /**
               * getMemoryBuffer(addr)
               *
               * If we passed a controller object (ie, this card) to addMemory(), then each allocated Memory block
               * will call this function to obtain a buffer.
               *
               * @this {Card}
               * @param {number} addr
               * @return {Array} containing the buffer (and the offset within that buffer that corresponds to the requested block)
               */
              Card.prototype.getMemoryBuffer = function(addr)
              {
                  return [this.adwMemory, addr - this.addrBuffer];
              };
              
              /**
               * getMemoryAccess()
               *
               * Return the last set of memory access functions recorded by setMemoryAccess().
               *
               * @this {Card}
               * @return {Array.<function()>}
               */
              Card.prototype.getMemoryAccess = function()
              {
                  return this.afnAccess;
              };
              
              /**
               * setMemoryAccess(nAccess)
               *
               * This transforms the memory access value that getAccess() returns into the best available set of
               * memory access functions, which are then returned via getMemoryAccess() to any memory blocks we allocate
               * or modify.
               *
               * @this {Card}
               * @param {number|undefined} nAccess
               */
              Card.prototype.setMemoryAccess = function(nAccess)
              {
                  if (nAccess != null && nAccess != this.nAccess) {
              
                      var nReadAccess = nAccess & Card.ACCESS.READ.MASK;
                      var fnReadByte = Card.ACCESS.afn[nReadAccess];
                      if (!fnReadByte) {
                          if (DEBUG && this.dbg) {
                              this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing readByte handler");
                              this.dbg.stopCPU();     // let's take a look
                          }
                          if (nReadAccess & Card.ACCESS.READ.EVENODD) {
                              fnReadByte = Card.ACCESS.afn[Card.ACCESS.READ.EVENODD];
                          }
                      }
                      var nWriteAccess = nAccess & Card.ACCESS.WRITE.MASK;
                      var fnWriteByte = Card.ACCESS.afn[nWriteAccess];
                      if (!fnWriteByte) {
                          if (DEBUG && this.dbg) {
                              this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing writeByte handler");
                              this.dbg.stopCPU();     // let's take a look
                          }
                          if (nWriteAccess & Card.ACCESS.WRITE.EVENODD) {
                              fnWriteByte = Card.ACCESS.afn[Card.ACCESS.WRITE.EVENODD];
                          }
                      }
                      if (!this.afnAccess) this.afnAccess = new Array(6);
                      this.afnAccess[0] = fnReadByte;
                      this.afnAccess[3] = fnWriteByte;
                      this.nAccess = nAccess;
                  }
              };
              
              /*
               * Card Specifications
               *
               * We support dynamically switching between MDA and CGA cards by simply flipping switches on
               * the virtual SW1 switch block and resetting the machine.  However, I'm not sure I'll support
               * dynamically switching the EGA card the same way; there's certainly no UI for it at this point.
               *
               * For each supported card, there is a cardSpec array that the Card class uses to initialize the
               * card's defaults:
               *
               *      [0]: card descriptor
               *      [1]: default CRTC port address
               *      [2]: default video buffer address
               *      [3]: default video buffer size
               *      [4]: total on-board memory (if no "memory" parm was specified)
               *      [5]: default monitor type
               *
               * If total on-board memory is zero, then addMemory() will simply add the specified video buffer
               * to the address space; otherwise, we will allocate an internal buffer (adwMemory) and tell addMemory()
               * to map it to the video buffer address.  The latter approach gives us total control over the buffer;
               * refer to getMemoryAccess().
               *
               * TODO: Consider allocating our own buffer for all video cards, not just EGA/VGA.  For MDA/CGA, I'm not
               * sure it would offer any benefits, other than allowing our internal update functions, like updateScreen(),
               * to access the buffer directly, instead of going through the Bus memory interface.
               */
              Video.cardSpecs = [];
              Video.cardSpecs[Video.CARD.MDA] = ["MDA", Card.MDA.CRTC.INDX.PORT, 0xB0000, 0x01000, 0, ChipSet.MONITOR.MONO];
              Video.cardSpecs[Video.CARD.CGA] = ["CGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0, ChipSet.MONITOR.COLOR];
              Video.cardSpecs[Video.CARD.EGA] = ["EGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x10000, ChipSet.MONITOR.EGACOLOR];
              Video.cardSpecs[Video.CARD.VGA] = ["VGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x40000, ChipSet.MONITOR.VGACOLOR];
              
              /**
               * initBus(cmp, bus, cpu, dbg)
               *
               * This is a notification issued by the Computer component, after all the other components (notably the CPU)
               * have had a chance to initialize.
               *
               * @this {Video}
               * @param {Computer} cmp
               * @param {Bus} bus
               * @param {X86CPU} cpu
               * @param {Debugger} dbg
               */
              Video.prototype.initBus = function(cmp, bus, cpu, dbg)
              {
                  this.bus = bus;
                  this.cpu = cpu;
                  this.dbg = dbg;
              
                  /*
                   * The only time we do NOT want to trap MDA ports is when the model has been specifically set to CGA.
                   */
                  if (Video.CARD.NAMES[this.model] != Video.CARD.CGA) {
                      bus.addPortInputTable(this, Video.aMDAPortInput);
                      bus.addPortOutputTable(this, Video.aMDAPortOutput);
                  }
              
                  /*
                   * Similarly, the only time we do NOT want to trap CGA ports is when the model has been specifically set to MDA.
                   */
                  if (Video.CARD.NAMES[this.model] != Video.CARD.MDA) {
                      bus.addPortInputTable(this, Video.aCGAPortInput);
                      bus.addPortOutputTable(this, Video.aCGAPortOutput);
                  }
              
                  /*
                   * Note that in the case of EGA and VGA models, the above code ensures that we will trap both MDA and CGA
                   * port ranges -- which is good, because both the EGA and VGA can be reprogrammed to respond to those ports,
                   * but also potentially bad if you want to simulate a "dual display" system, where one of the displays is
                   * driven by either an MDA or CGA.
                   *
                   * However, you should still be able to make that work by loading the MDA or CGA video component first, because
                   * components should be initialized in the order they appear in the machine configuration file.  Any attempt
                   * by another component to trap the same ports should be ignored.
                   */
                  if (this.nCard >= Video.CARD.EGA) {
                      bus.addPortInputTable(this, Video.aEGAPortInput);
                      bus.addPortOutputTable(this, Video.aEGAPortOutput);
                  }
              
                  if (this.nCard == Video.CARD.VGA) {
                      bus.addPortInputTable(this, Video.aVGAPortInput);
                      bus.addPortOutputTable(this, Video.aVGAPortOutput);
                  }
              
                  if (DEBUGGER && dbg) {
                      var video = this;
                      dbg.messageDump(Messages.VIDEO, function onDumpVideo(sParm) {
                          video.dumpVideo(sParm);
                      });
                  }
              
                  /*
                   * If we have an associated keyboard, then ensure that the keyboard will be notified whenever
                   * the canvas gets focus and receives input.
                   */
                  this.kbd = cmp.getComponentByType("Keyboard");
                  if (this.kbd && this.canvasScreen) {
                      for (var s in this.bindings) {
                          if (s.indexOf("lock") > 0) this.kbd.setBinding("led", s, this.bindings[s]);
                      }
                      this.kbd.setBinding(this.textareaScreen? "textarea" : "canvas", "kbd", this.inputScreen);
                  }
              
                  this.bEGASwitches = 0x09;   // our default "switches" setting (see aEGAMonitorSwitches)
                  this.chipset = cmp.getComponentByType("ChipSet");
                  if (this.chipset && this.sSwitches) {
                      if (this.nCard == Video.CARD.EGA) this.bEGASwitches = this.chipset.parseSwitches(this.sSwitches, this.bEGASwitches);
                  }
              
                  if (this.kbd && this.fTouchScreen) this.captureTouch();
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {Video}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "refresh")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              Video.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var video = this;
              
                  if (!this.bindings[sBinding]) {
              
                      /*
                       * We now save every binding that comes in, so that if there are bindings for "caps-lock' and the like,
                       * we can forward them to the Keyboard.
                       */
                      this.bindings[sBinding] = control;
              
                      switch (sBinding) {
              
                      case "fullScreen":
                          if (this.container && this.container.doFullScreen) {
                              control.onclick = function onClickFullScreen() {
                                  if (DEBUG) video.printMessage("fullScreen()");
                                  video.doFullScreen();
                              };
                          } else {
                              if (DEBUG) this.log("FullScreen API not available");
                              control.parentNode.removeChild(control);
                          }
                          return true;
              
                      case "lockPointer":
                          this.sLockMessage = control.textContent;
                          if (this.inputScreen && this.inputScreen.lockPointer) {
                              control.onclick = function onClickLockPointer() {
                                  if (DEBUG) video.printMessage("lockPointer()");
                                  video.lockPointer(true);
                              };
                          } else {
                              if (DEBUG) this.log("Pointer Lock API not available");
                              control.parentNode.removeChild(control);
                          }
                          return true;
              
                      case "refresh":
                          control.onclick = function onClickRefresh() {
                              if (DEBUG) video.printMessage("refreshScreen()");
                              video.updateScreen(true);
                          };
                          return true;
              
                      default:
                          break;
                      }
                  }
                  return false;
              };
              
              /**
               * setFocus()
               *
               * @this {Video}
               */
              Video.prototype.setFocus = function()
              {
                  if (this.inputScreen) this.inputScreen.focus();
              };
              
              /**
               * getInput()
               *
               * This is an interface used by the Mouse component, so that it can invoke capture/release mouse events from the screen element.
               *
               * @this {Video}
               * @param {Mouse} [mouse]
               * @return {Object|undefined}
               */
              Video.prototype.getInput = function(mouse)
              {
                  this.mouse = mouse;
                  return this.inputScreen;
              };
              
              /**
               * doFullScreen()
               *
               * @this {Video}
               * @return {boolean} true if request successful, false if not (eg, failed OR not supported)
               */
              Video.prototype.doFullScreen = function()
              {
                  var fSuccess = false;
                  if (this.container) {
                      if (this.container.doFullScreen) {
                          /*
                           * Styling the container with a width of "100%" and a height of "auto" works great when the aspect ratio
                           * of our virtual screen is at least roughly equivalent to the physical screen's aspect ratio, but now that
                           * we support virtual VGA screens with an aspect ratio of 1.33, that's very much out of step with modern
                           * wide-screen monitors, which usually have an aspect ratio of 1.6 or greater.
                           *
                           * And unfortunately, none of the browsers I've tested appear to make any attempt to scale our container to
                           * the physical screen's dimensions, so the bottom of our screen gets clipped.  To prevent that, I reduce
                           * the width from 100% to whatever percentage will accommodate the entire height of the virtual screen.
                           *
                           * NOTE: Mozilla recommends both a width and a height of "100%", but all my tests suggest that using "auto"
                           * for height works equally well, so I'm sticking with it, because "auto" is also consistent with how I've
                           * implemented a responsive canvas when the browser window is being resized.
                           */
                          var sWidth = "100%";
                          var sHeight = "auto";
                          if (screen && screen.width && screen.height) {
                              var aspectPhys = screen.width / screen.height;
                              var aspectVirt = this.cxScreen / this.cyScreen;
                              if (aspectPhys > aspectVirt) {
                                  sWidth = Math.round(aspectVirt / aspectPhys * 100) + '%';
                              }
                              // TODO: We may need to someday consider the case of a physical screen with an aspect ratio < 1.0....
                          }
                          if (!this.fGecko) {
                              this.container.style.width = sWidth;
                              this.container.style.height = sHeight;
                          } else {
                              /*
                               * Sadly, the above code doesn't work for Firefox, because as http://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
                               * explains:
                               *
                               *      'It's worth noting a key difference here between the Gecko and WebKit implementations at this time:
                               *      Gecko automatically adds CSS rules to the element to stretch it to fill the screen: "width: 100%; height: 100%".
                               *
                               * Which would be OK if Gecko did that BEFORE we're called, but apparently it does that AFTER, effectively
                               * overwriting our careful calculations.  So we style the inner element (canvasScreen) instead, which
                               * requires even more work to ensure that the canvas is properly centered.  FYI, this solution is consistent
                               * with Mozilla's recommendation for working around their automatic CSS rules:
                               *
                               *      '[I]f you're trying to emulate WebKit's behavior on Gecko, you need to place the element you want
                               *      to present inside another element, which you'll make fullscreen instead, and use CSS rules to adjust
                               *      the inner element to match the appearance you want.'
                               */
                              this.canvasScreen.style.width = sWidth;
                              this.canvasScreen.style.width = sWidth;
                              this.canvasScreen.style.display = "block";
                              this.canvasScreen.style.margin = "auto";
                          }
                          this.container.style.backgroundColor = "black";
                          this.container.doFullScreen();
                          fSuccess = true;
                      }
                      this.setFocus();
                  }
                  return fSuccess;
              };
              
              /**
               * notifyFullScreen(fFullScreen)
               *
               * @this {Video}
               * @param {boolean|null} fFullScreen (null if there was a full-screen error)
               */
              Video.prototype.notifyFullScreen = function(fFullScreen)
              {
                  if (!fFullScreen && this.container) {
                      if (!this.fGecko) {
                          this.container.style.width = this.container.style.height = "";
                      } else {
                          this.canvasScreen.style.width = this.canvasScreen.style.height = "";
                      }
                  }
                  this.printMessage("notifyFullScreen(" + fFullScreen + ")", true);
                  if (this.kbd) this.kbd.notifyEscape(fFullScreen);
              };
              
              /**
               * lockPointer()
               *
               * @this {Video}
               * @param {boolean} fLock
               * @return {boolean} true if request successful, false if not (eg, failed OR not supported)
               */
              Video.prototype.lockPointer = function(fLock)
              {
                  var fSuccess = false;
                  if (this.inputScreen) {
                      if (fLock) {
                          if (this.inputScreen.lockPointer) {
                              this.inputScreen.lockPointer();
                              this.mouse.notifyPointerLocked(true);
                              fSuccess = true;
                          }
                      } else {
                          if (this.inputScreen.unlockPointer) {
                              this.inputScreen.unlockPointer();
                              this.mouse.notifyPointerLocked(false);
                              fSuccess = true;
                          }
                      }
                      this.setFocus();
                  }
                  return fSuccess;
              };
              
              /**
               * notifyPointerActive(fActive)
               *
               * @this {Video}
               * @param {boolean} fActive
               * @return {boolean} true if autolock enabled AND pointer lock supported, false if not
               */
              Video.prototype.notifyPointerActive = function(fActive)
              {
                  if (this.fAutoLock) {
                      return this.lockPointer(fActive);
                  }
                  return false;
              };
              
              /**
               * notifyPointerLocked(fLocked)
               *
               * @this {Video}
               * @param {boolean} fLocked
               */
              Video.prototype.notifyPointerLocked = function(fLocked)
              {
                  if (this.mouse) {
                      this.mouse.notifyPointerLocked(fLocked);
                      if (this.kbd) this.kbd.notifyEscape(fLocked);
                  }
                  var control = this.bindings["lockPointer"];
                  if (control) control.textContent = (fLocked? "Press Esc to Unlock Pointer" : this.sLockMessage);
              };
              
              /**
               * captureTouch()
               *
               * @this {Video}
               */
              Video.prototype.captureTouch = function()
              {
                  var control = this.inputScreen;
                  if (control) {
                      var video = this;
                      if (!this.fCaptured) {
                          control.addEventListener(
                              'touchstart',
                              function onTouchStart(event) { video.onTouchStart(event); },
                              false                   // we'll specify false for the 'useCapture' parameter for now...
                          );
                          control.addEventListener(
                              'touchmove',
                              function onTouchMove(event) { video.onTouchMove(event); },
                              true
                          );
                          control.addEventListener(
                              'touchend',
                              function onTouchEnd(event) { video.onTouchEnd(event); },
                              false                   // we'll specify false for the 'useCapture' parameter for now...
                          );
                          if (DEBUG) {
                              /*
                               */
                              control.addEventListener(
                                  'mousedown',
                                  function onMouseDown(event) { video.onTouchStart(event); },
                                  false               // we'll specify false for the 'useCapture' parameter for now...
                              );
                              /*
                              control.addEventListener(
                                  'mousemove',
                                  function onMouseMove(event) { video.onTouchMove(event); },
                                  true
                              );
                              control.addEventListener(
                                  'mouseup',
                                  function onMouseUp(event) { video.onTouchEnd(event); },
                                  false               // we'll specify false for the 'useCapture' parameter for now...
                              );
                               */
                          }
                          // this.log("touch events captured");
                          this.fCaptured = true;
                      }
                  }
              };
              
              /**
               * onFocusChange(fFocus)
               *
               * @this {Video}
               * @param {boolean} fFocus is true if gaining focus, false if losing it
               */
              Video.prototype.onFocusChange = function(fFocus)
              {
                  /*
                   * As per http://stackoverflow.com/questions/6740253/disable-scrolling-when-changing-focus-form-elements-ipad-web-app,
                   * I decided to try this work-around to prevent the webpage from scrolling around whenever the canvas is given
                   * focus.  That sort of scrolling-into-view sounds great in principle, but in practice, if you were reading some other
                   * portion of the page, it can be irritating to be scrolled away from that portion when refreshing/returning to the page.
                   *
                   * However, this work-around doesn't seem to work with the latest version of Safari (or else I misunderstood something).
                   *
                   *  if (fFocus) {
                   *      window.scrollTo(0, 0);
                   *      window.document.body.scrollTop = 0;
                   *  }
                   */
                  this.fHasFocus = fFocus;
                  if (this.kbd) this.kbd.onFocusChange(fFocus);
              };
              
              /*
              Video.prototype.releaseTouch = function()
              {
              };
              */
              
              /**
               * onTouchStart(event)
               *
               * @this {Video}
               * @param {Event} event object from a 'touch' event
               */
              Video.prototype.onTouchStart = function(event)
              {
                  if (DEBUG) this.printMessage("onTouchStart()");
                  this.processTouchEvent(event, true);
              };
              
              /**
               * onTouchMove(event)
               *
               * @this {Video}
               * @param {Event} event object from a 'touch' event
               */
              Video.prototype.onTouchMove = function(event)
              {
                  if (DEBUG) this.printMessage("onTouchMove()");
                  this.processTouchEvent(event, false);
              };
              
              /**
               * onTouchEnd(event)
               *
               * @this {Video}
               * @param {Event} event object from a 'touch' event
               */
              Video.prototype.onTouchEnd = function(event)
              {
                  if (DEBUG) this.printMessage("onTouchEnd()");
              };
              
              /**
               * processTouchEvent(event, fStart)
               *
               * @this {Video}
               * @param {Event} event object from a 'touch' event
               * @param {boolean} fStart if this is a 'touchstart' event
               */
              Video.prototype.processTouchEvent = function(event, fStart)
              {
                  // if (!event) event = window.event;
                  /*
                   * My thinking here is that if the canvas does NOT yet have focus, then we should actually SKIP
                   * the usual preventDefault() call, so that everything the user has come to expect (eg, activation of
                   * the soft keyboard) will work as before.
                   *
                   * The process of touching the canvas means it should ultimately receive focus, and as long as it
                   * retains focus, preventDefault() will always be called.
                   */
                  if (this.fHasFocus) event.preventDefault();
              
                  /*
                   * Touch coordinates (that is, the pageX and pageY properties) are relative to the page, so to make
                   * them relative to the canvas, we must subtract the canvas's left and top positions.  This Apple web page:
                   *
                   *      https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingMouseandTouchControlstoCanvas/AddingMouseandTouchControlstoCanvas.html
                   *
                   * makes it sound simple, but it turns out we have to walk the canvas' entire "parentage" of DOM elements
                   * to get the exact offsets.
                   *
                   * TODO: Determine whether the getBoundingClientRect() code used in panel.js for mouse events can also
                   * be used here to simplify this annoyingly complicated code for touch events.
                   */
                  var xTouchOffset = 0;
                  var yTouchOffset = 0;
                  var eCurrent = this.canvasScreen;
                  do {
                      if (!isNaN(eCurrent.offsetLeft)) {
                          xTouchOffset += eCurrent.offsetLeft;
                          yTouchOffset += eCurrent.offsetTop;
                      }
                  } while ((eCurrent = eCurrent.offsetParent));
              
                  /*
                   * Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
                   * allocated size, and the coordinates we receive from touch events are based on the currently displayed size.
                   */
                  var xScale =  this.cxScreen / this.canvasScreen.offsetWidth;
                  var yScale = this.cyScreen / this.canvasScreen.offsetHeight;
              
                  /**
                   * @name Event
                   * @property {Array} targetTouches
                   */
                  var xTouch, yTouch;
                  if (!event.targetTouches) {
                      xTouch = event.pageX;
                      yTouch = event.pageY;
                  } else {
                      xTouch = event.targetTouches[0].pageX;
                      yTouch = event.targetTouches[0].pageY;
                  }
                  xTouch = ((xTouch - xTouchOffset) * xScale);
                  yTouch = ((yTouch - yTouchOffset) * yScale);
                  var xThird = (xTouch / (this.cxScreen / 3)) | 0;
                  var yThird = (yTouch / (this.cyScreen / 3)) | 0;
              
                  /*
                   * At this point, xThird and yThird should both be one of 0, 1 or 2, indicating which horizontal and vertical
                   * third of the virtual screen the touch event occurred.
                   */
                  if (/* xThird == 1 && */ yThird != 1) {
                      if (!yThird) {
                          this.kbd.addActiveKey(Keyboard.CLICKCODES.UP, true);
                      } else {
                          this.kbd.addActiveKey(Keyboard.CLICKCODES.DOWN, true);
                      }
                  } else if (/* yThird == 1 && */ xThird != 1) {
                      if (!xThird) {
                          this.kbd.addActiveKey(Keyboard.CLICKCODES.LEFT, true);
                      } else {
                          this.kbd.addActiveKey(Keyboard.CLICKCODES.RIGHT, true);
                      }
                  }
              };
              
              /**
               * powerUp(data, fRepower)
               *
               * @this {Video}
               * @param {Object|null} data
               * @param {boolean} [fRepower]
               * @return {boolean} true if successful, false if failure
               */
              Video.prototype.powerUp = function(data, fRepower)
              {
                  if (!fRepower) {
                      if (!data || !this.restore) {
                          this.reset();
                      } else {
                          if (!this.restore(data)) return false;
                      }
                  }
                  return true;
              };
              
              /**
               * powerDown(fSave, fShutdown)
               *
               * This is where we might add some method of blanking the display, without the disturbing the video
               * buffer contents, and blocking all further updates to the display.
               *
               * @this {Video}
               * @param {boolean} fSave
               * @param {boolean} [fShutdown]
               * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
               */
              Video.prototype.powerDown = function(fSave, fShutdown)
              {
                  return fSave && this.save? this.save() : true;
              };
              
              /**
               * reset()
               *
               * @this {Video}
               */
              Video.prototype.reset = function()
              {
                  var fRandomize = true;
                  var nMonitorType = ChipSet.MONITOR.NONE;
              
                  /*
                   * We'll ask the ChipSet what SW1 indicates for monitor type, but we may override it if a specific
                   * video card model is set.  For EGA, SW1 is supposed to be set to indicate NO monitor, and we rely
                   * on the EGA's own switch settings instead.
                   */
                  if (this.chipset) {
                      nMonitorType = this.chipset.getSWVideoMonitor();
                  }
              
                  /*
                   * As we noted in the constructor, when a model is specified, that takes precedence over any monitor
                   * switch settings.  Conversely, when no model is specified, the nCard setting is considered provisional,
                   * so the monitor switch settings, if any, are allowed to determine the card type.
                   */
                  if (!this.model) {
                      this.nCard = (nMonitorType == ChipSet.MONITOR.MONO? Video.CARD.MDA : Video.CARD.CGA);
                  }
              
                  this.nModeDefault = Video.MODE.CGA_80X25;
              
                  switch (this.nCard) {
                  case Video.CARD.VGA:
                      nMonitorType = ChipSet.MONITOR.VGACOLOR;
                      break;
                  case Video.CARD.EGA:
                      var aMonitors = Video.aEGAMonitorSwitches[this.bEGASwitches];
                      /*
                       * TODO: Figure out how to deal with aMonitors[2], the boolean which indicates
                       * whether the EGA is driving the primary monitor (true) or the secondary monitor (false).
                       */
                      if (aMonitors) nMonitorType = aMonitors[0];
                      if (!nMonitorType) nMonitorType = ChipSet.MONITOR.EGACOLOR;
                      break;
                  case Video.CARD.MDA:
                      nMonitorType = ChipSet.MONITOR.MONO;
                      this.nModeDefault = Video.MODE.MDA_80X25;
                      break;
                  case Video.CARD.CGA:
                      /* falls through */
                  default:
                      nMonitorType = ChipSet.MONITOR.COLOR;
                      break;
                  }
              
                  if (this.nMonitorType !== nMonitorType) {
                      this.nMonitorType = nMonitorType;
                      fRandomize = true;
                  }
              
                  this.cardActive = null;
                  this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA);
                  this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA);
              
                  if (this.nCard < Video.CARD.EGA) {
                      this.cardEGA = new Card();      // define a dummy (uninitialized) EGA card for now
                  }
                  else {
                      this.cardEGA = new Card(this, this.nCard, null, this.cbMemory);
                      this.enableEGA();
                  }
              
                  /*
                   * We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
                   */
                  this.buildFonts();
              
                  this.nMode = null;
                  this.iCellCursor = -1;  // initially, there is no visible cursor cell
                  this.cBlinks = -1;      // initially, blinking is not active
                  this.cBlinkVisible = 0; // no visible blinking characters (yet)
              
                  this.setMode(this.nModeDefault);
              
                  if (this.cardActive.addrBuffer && fRandomize) {
                      /*
                       * On the initial power-on, we initialize the video buffer to random characters, as a way of testing
                       * whether our font(s) were successfully loaded.  It's assumed that our default display mode is a text mode,
                       * and that since this is a reset, the CRTC.START_ADDR registers are zero as well.
                       *
                       * If this is an MDA device, then the buffer should reside at 0xB0000 through 0xB0FFF, for a total length
                       * of 4Kb (0x1000), where every even byte contains a character code, and every odd byte contains an attribute
                       * code.  See the ATTR bit definitions above for applicable color, intensity, and blink values.  On a CGA
                       * device, the buffer resides at 0xB8000 through 0xBBFFF, for a total length of 16Kb.
                       *
                       * Note that the only valid MDA display mode (7) is the 80x25 text mode, which uses 4000 bytes (2000 character
                       * bytes + 2000 attribute bytes), not all 4096 bytes; addrScreenLimit reflects the visible limit, not the
                       * physical limit.  Also, as noted in updateScreen(), this simplistic calculation of the extent of visible
                       * screen memory is valid only for text modes; in general, it's safer to use cardActive.sizeBuffer as the extent.
                       */
                      var addrScreenLimit = this.cardActive.addrBuffer + this.cbScreen;
                      for (var addrScreen = this.cardActive.addrBuffer; addrScreen < addrScreenLimit; addrScreen += 2) {
                          var dataRandom = (Math.random() * 0x10000)|0;
                          var bChar, bAttr;
                          if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
                              /*
                               * For the EGA, we choose sequential characters; for random characters, copy the MDA/CGA code below.
                               */
                              bChar = (addrScreen >> 1) & 0xff;
                              bAttr = (dataRandom >> 8) & ~Video.ATTRS.BGND_BLINK;    // TODO: turn blink attributes off unless we can ensure blinking is initially disabled
                              if ((bAttr >> 4) == (bAttr & 0xf)) {
                                  bAttr ^= 0x0f;      // if background matches foreground, invert foreground to ensure character visibility
                              }
                          } else {
                              bChar = dataRandom & 0xff;
                              bAttr = ((dataRandom & 0x100)? (Video.ATTRS.FGND_WHITE | Video.ATTRS.BGND_BLACK) : (Video.ATTRS.FGND_BLACK | Video.ATTRS.BGND_WHITE)) | ((Video.ATTRS.FGND_BRIGHT /* | Video.ATTRS.BGND_BLINK */) & (dataRandom >> 8));
                          }
                          this.bus.setShortDirect(addrScreen, bChar | (bAttr << 8));
                      }
                      this.updateScreen(true);
                  }
              };
              
              /**
               * enableEGA()
               *
               * Redirect cardMono or cardColor to cardEGA as appropriate.
               *
               * @this {Video}
               */
              Video.prototype.enableEGA = function()
              {
                  if (!(this.cardEGA.regMisc & Card.MISC.IO_SELECT)) {
                      this.cardMono = this.cardEGA;
                      this.cardColor = this.cardCGA;  // this is done mainly to siphon away any CGA I/O
                  } else {
                      this.cardMono = this.cardMDA;   // similarly, this is done to siphon away any MDA I/O
                      this.cardColor = this.cardEGA;
                  }
              };
              
              /**
               * save()
               *
               * This implements save support for the Video component.
               *
               * @this {Video}
               * @return {Object}
               */
              Video.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, this.cardMDA.saveCard());
                  state.set(1, this.cardCGA.saveCard());
                  state.set(2, [this.nMonitorType, this.nModeDefault, this.nMode]);
                  state.set(3, this.cardEGA.saveCard());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the Video component.
               *
               * @this {Video}
               * @param {Object} data
               * @return {boolean} true if successful, false if failure
               */
              Video.prototype.restore = function(data)
              {
                  var a = data[2];
                  this.nMonitorType = a[0];
                  this.nModeDefault = a[1];
                  this.nMode = a[2];
              
                  this.cardActive = null;
                  this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA, data[0]);
                  this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA, data[1]);
              
                  /*
                   * If no EGA was originally initialized, then cardEGA will remain uninitialized.
                   */
                  this.cardEGA = new Card(this, this.nCard, data[3], this.cbMemory);
                  if (this.cardEGA.fActive) this.enableEGA();
              
                  /*
                   * We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
                   */
                  this.buildFonts();
              
                  /*
                   * While I could restore the active card here, it's better for setMode() to do it, because
                   * setMode() will also take care of mapping the appropriate video buffer.  So, after restore() has
                   * finished, we call checkMode(), because the current video mode (nMode) is determined by the
                   * active card state.
                   *
                   * Unfortunately, that creates a chicken-and-egg problem, since I just said I didn't want to select
                   * the active card here.
                   *
                   * So, we'll add some "cop-out" code to checkMode(): if there's no active card, then fall-back
                   * to the last known video mode (nMode) and force a call to setMode().
                   *
                   *      this.cardActive = (this.cardMDA.fActive? this.cardMDA : (this.cardCGA.fActive? this.cardCGA : undefined));
                   */
                  if (!this.checkMode()) return false;
              
                  this.checkCursor();
                  return true;
              };
              
              /**
               * onLoadSetFonts(sFontFile, sFontData, nErrorCode)
               *
               * @this {Video}
               * @param {string} sFontFile
               * @param {string} sFontData
               * @param {number} nErrorCode (response from server if anything other than 200)
               */
              Video.prototype.onLoadSetFonts = function(sFontFile, sFontData, nErrorCode)
              {
                  if (nErrorCode) {
                      this.notice("Unable to load font ROM image (error " + nErrorCode + ")");
                      return;
                  }
                  try {
                      /*
                       * The most likely source of any exception will be right here, where we're parsing the JSON-encoded data.
                       */
                      var abFontData = eval("(" + sFontData + ")");
              
                      if (!abFontData.length) {
                          Component.error("Empty font ROM image: " + sFontFile);
                          return;
                      }
                      else if (abFontData.length == 1) {
                          Component.error(abFontData[0]);
                          return;
                      }
                      /*
                       * Translate the character data into separate "fonts", each of which will be a separate canvas object, with all
                       * 256 characters arranged in a 16x16 grid.
                       */
                      if (abFontData.length == 8192) {
                          /*
                           * Here are the first few rows of MDA font data, at the 0K and 2K boundaries:
                           *
                           *      00000000  00 00 00 00 00 00 00 00  00 00 7e 81 a5 81 81 bd  |..........~.....|
                           *      00000010  00 00 7e ff db ff ff c3  00 00 00 36 7f 7f 7f 7f  |..~........6....|
                           *      ...
                           *      00000800  00 00 00 00 00 00 00 00  99 81 7e 00 00 00 00 00  |..........~.....|
                           *      00000810  e7 ff 7e 00 00 00 00 00  3e 1c 08 00 00 00 00 00  |..~.....>.......|
                           *
                           * 8 bytes of data from a row in each of the 2K chunks are combined to form a 8-bit wide character with
                           * a maximum height of 16 bits.  Assembling the bits for character 0x01 (a happy face), we observe the following:
                           *
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x0008
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x0009
                           *      0 1 1 1 1 1 1 0  <== 7e from offset 0x000A
                           *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000B
                           *      1 0 1 0 0 1 0 1  <== a5 from offset 0x000C
                           *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000D
                           *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000E
                           *      1 0 1 1 1 1 0 1  <== bd from offset 0x000F
                           *      1 0 0 1 1 0 0 1  <== 99 from offset 0x0808
                           *      1 0 0 0 0 0 0 1  <== 81 from offset 0x0809
                           *      0 1 1 1 1 1 1 0  <== 7e from offset 0x080A
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080B
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080C
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080D
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080E
                           *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080F
                           *
                           * In the second 2K chunk, we observe that the last two bytes of every font cell definition are zero;
                           * this confirms our understanding that MDA font cell size is 8x14.
                           *
                           * Finally, there's the issue of screen cell size, which is actually 9x14 on the MDA.  We compensate for that
                           * by building a 9x14 font, even though there's only 8x14 bits of data. As http://www.seasip.info/VintagePC/mda.html
                           * explains:
                           *
                           *      "For characters C0h-DFh, the ninth pixel column is a duplicate of the eighth; for others, it's blank."
                           *
                           * This last point is confirmed by "The IBM Personal Computer From The Inside Out", p.295:
                           *
                           *      "Another unique feature of the monochrome adapter is a set of line-drawing and area-fill characters
                           *      that give continuous lines and filled areas. This is unusual for a display with a 9x14 character box
                           *      because the character generator provides a row only eight dots wide. On most displays, a blank 9th
                           *      dot is then inserted between characters. On the monochrome display, there is circuitry that duplicates
                           *      the 8th dot into the 9th dot position for characters whose ASCII codes are 0xB0 [sic] through 0xDF."
                           *
                           * However, the above text is mistaken about the start of the range.  While there ARE line-drawing characters
                           * in the range 0xB0-0xBF, none of them extend all the way to the right edge; IBM carefully segregated them.
                           * And in fact, characters 0xB0-0xB2 contain hash patterns that you would NOT want extended into the 9th column.
                           *
                           * The CGA font is part of the same ROM.  In fact, there are TWO CGA fonts in the ROM: a thin 5x7 "single dot"
                           * font located at offset 0x1000, and a thick 7x7 "double dot" font at offset 0x1800.  The latter is the default
                           * font, unless overridden by a jumper setting on the CGA card, so it is our default CGA font as well (although
                           * someday we may provide a virtual jumper setting that allows you to select the thinner font).
                           *
                           * The first offset we must pass to setFontData() is the offset of the CGA font; we choose the thicker "double dot"
                           * CGA font at 0x1800 (which was the PC's default font as well), instead of the thinner "single dot" font at 0x1000.
                           * The second offset is for the MDA font.
                           */
                          this.setFontData(abFontData, [0x1800, 0x0000]);
                      }
                      else {
                          this.notice("Unrecognized font data length (" + abFontData.length + ")");
                          return;
                      }
              
                  } catch (e) {
                      this.notice("Font ROM data error: " + e.message);
                      return;
                  }
                  /*
                   * If we're still here, then we're ready!
                   *
                   * UPDATE: Per issue #21, I'm issuing setReady() *only* if a valid contextScreen exists *or* a Debugger is attached.
                   *
                   * TODO: Consider a more general-purpose solution for deciding whether or not the user wants to run in a "headless" mode.
                   */
                  if (this.contextScreen || this.dbg) this.setReady();
              };
              
              /**
               * onROMLoad(abRom, aParms)
               *
               * Called by the ROM's copyROM() function whenever a ROM component with a 'notify' attribute containing
               * our component ID has been loaded.
               *
               * @this {Video}
               * @param {Array.<number>} abROM
               * @param {Array.<number>} [aParms]
               */
              Video.prototype.onROMLoad = function(abROM, aParms)
              {
                  if (this.nCard == Video.CARD.EGA) {
                      /*
                       * TODO: Unlike the MDA/CGA font data, we may want to hang onto this data, so that we can
                       * regenerate the color font(s) whenever the foreground and/or background colors have changed.
                       */
                      if (DEBUG) this.printMessage("onROMLoad(): EGA fonts loaded");
                      /*
                       * For EGA cards, in the absence of any parameters, we assume that we're receiving the original
                       * IBM EGA ROM, which stores its 8x14 font data at 0x2230 as a contiguous stream; the total size
                       * of the 8x14 font is 0xE00 bytes.
                       *
                       * At 0x3030, there is an "ALPHA SUPPLEMENT" table, which contains 15 bytes per row instead of 14,
                       * because each row is preceded by one byte containing the corresponding ASCII code; there are 20
                       * entries in the supplemental table, for a total size of 0x12C bytes.
                       *
                       * Finally, at 0x3160, we have the 8x8 font data (also known as the thicker "double dot" CGA font);
                       * the total size of the 8x8 font is 0x800 bytes.  No other font data is present in the EGA ROM;
                       * the thin 5x7 "single dot" CGA font is notably absent, which is fine, because we never loaded it for
                       * the MDA/CGA either.
                       *
                       * TODO: Determine how the supplemental table is used and whether we need to add some "run-time"
                       * font generation to support it (as opposed to "init-time" generation, which is all we do now).
                       * There's probably a similar need for user-defined fonts; for now, they're simply not supported.
                       */
                      this.setFontData(abROM, aParms || [0x3160, 0x2230], 8);
                  }
                  else if (this.nCard == Video.CARD.VGA) {
                      if (DEBUG) this.printMessage("onROMLoad(): VGA fonts loaded");
                      /*
                       * For VGA cards, in the absence of any parameters, we assume that we're receiving the original
                       * IBM VGA ROM, which contains an 8x14 font at 0x3F8D (and corresponding supplemental table at 0x4D8D)
                       * and an 8x8 font at 0x378D; however, it also contains an 8x16 font at 0x4EBA (and corresponding
                       * supplemental table at 0x5EBA).  See our reconstructed source code in ibm-vga.nasm.
                       */
                      this.setFontData(abROM, aParms || [0x378d, 0x3f8d], 8);
                  }
                  this.setReady();
              };
              
              /**
               * getCardColors(nBitsPerPixel)
               *
               * @this {Video}
               * @param {number} [nBitsPerPixel]
               * @returns {Array}
               */
              Video.prototype.getCardColors = function(nBitsPerPixel)
              {
                  if (nBitsPerPixel == 1) {
                      /*
                       * Only 2 total colors.
                       */
                      this.aRGB[0] = Video.aCGAColors[Video.ATTRS.FGND_BLACK];
                      this.aRGB[1] = Video.aCGAColors[Video.ATTRS.FGND_WHITE];
                      return this.aRGB;
                  }
              
                  if (nBitsPerPixel == 2) {
                      /*
                       * Of the 4 colors returned, the first color comes from regColor and the other 3 come from one of
                       * the two hard-coded CGA color sets:
                       *
                       *      Color Set 1             Color Set 2
                       *      -----------             -----------
                       *      Background (0x00)       Background (0x00)
                       *      Green      (0x12)       Cyan       (0x13)
                       *      Red        (0x14)       Magenta    (0x15)
                       *      Brown      (0x16)       White      (0x17)
                       *
                       * The numbers in parentheses are the EGA ATC palette register values that the EGA BIOS uses for each
                       * color set; on an EGA, I synthesize a fake CGA regColor value, until I figure out exactly how the EGA
                       * simulates the CGA color palette.  TODO: Figure it out.
                       */
                      var regColor = this.cardActive.regColor;
                      if (this.cardActive === this.cardEGA) {
                          var bBackground = this.cardEGA.regATCData[0];
                          regColor = bBackground & Card.CGA.COLOR.BORDER;
                          if (bBackground & Card.ATC.PALETTE.BRIGHT) regColor |= Card.CGA.COLOR.BRIGHT;
                          if (this.cardEGA.regATCData[1] != 0x12) regColor |= Card.CGA.COLOR.COLORSET2;
                      }
                      this.aRGB[0] = Video.aCGAColors[regColor & (Card.CGA.COLOR.BORDER | Card.CGA.COLOR.BRIGHT)];
                      var aColorSet = (regColor & Card.CGA.COLOR.COLORSET2)? Video.aCGAColorSet2 : Video.aCGAColorSet1;
                      for (var iColor = 0; iColor < aColorSet.length; iColor++) {
                          this.aRGB[iColor+1] = Video.aCGAColors[aColorSet[iColor]];
                      }
                      return this.aRGB;
                  }
              
                  if (this.cardColor === this.cardCGA) {
                      /*
                       * There's no need to update this.aRGB if we simply want to return a hard-coded set of 16 colors.
                       */
                      return Video.aCGAColors;
                  }
              
                  this.assert(this.cardColor === this.cardEGA);
              
                  var aRegs = (this.cardEGA.regATCData[15] != null? this.cardEGA.regATCData : Video.aEGAPalDef);
                  for (var i = 0; i < this.aRGB.length; i++) {
                      var b = aRegs[i] || 0;
                      var bRed =   (((b & 0x04)? 0xaa : 0) | ((b & 0x20)? 0x55 : 0));
                      var bGreen = (((b & 0x02)? 0xaa : 0) | ((b & 0x10)? 0x55 : 0));
                      var bBlue =  (((b & 0x01)? 0xaa : 0) | ((b & 0x08)? 0x55 : 0));
                      this.aRGB[i] = [bRed, bGreen, bBlue, 0xff];
                  }
                  return this.aRGB;
              };
              
              /**
               * setFontData(abFontData, aFontOffsets, cxFontChar)
               *
               * To support partial font rebuilds (required for the EGA), we now preserve the original font data (abFontData),
               * font offsets (aFontOffsets), and font character width (8 for the EGA, undefined for the MDA/CGA).
               *
               * TODO: Ultimately, we want to have exactly one dedicated font for the EGA, the data for which we'll read directly
               * from plane 2 of video memory, instead of relying on the original font data in ROM.  Relying on the ROM data was
               * originally just a crutch to help get EGA support bootstrapped.
               *
               * Also, for the MDA/CGA, we should be discarding the font data after the first buildFonts() call, because we
               * should not need to ever rebuild the fonts for those cards (both their font patterns and colors were hard-coded).
               *
               * @this {Video}
               * @param {*} abFontData is the raw font data, from the ROM font file
               * @param {Array.<number>} aFontOffsets contains offsets into abFontData: [0] for CGA, [1] for MDA
               * @param {number} [cxFontChar] is a fixed character width to use for all fonts; undefined to use MDA/CGA defaults
               */
              Video.prototype.setFontData = function(abFontData, aFontOffsets, cxFontChar)
              {
                  this.abFontData = abFontData;
                  this.aFontOffsets = aFontOffsets;
                  this.cxFontChar = cxFontChar;
              };
              
              /**
               * buildFonts()
               *
               * buildFonts() is called whenever the Video component is reset or restored; we used to build the fonts as soon
               * as the ROM containing them was loaded, and then throw away the underlying font data, but with the EGA's ability
               * to change the color of any font, font building must now be deferred until the reset or restore notifications,
               * ensuring we have access to all the colors the card is currently programmed to use.
               *
               * We're also called whenever EGA palette registers are modified, since one or more fonts will likely need
               * to be rebuilt (this is because our fonts contain pre-rendered images of all glyphs for all 16 active colors).
               * Calls to buildFonts() should not be expensive though: the underlying createFont() function rebuilds a font only
               * if its color has actually changed.
               *
               * TODO: We should avoid rebuilding fonts when palette registers change in graphics modes.  More importantly, our
               * font code is still written with the assumption that, like the MDA/CGA, the underlying font data never changes.
               * The EGA, however, stores its fonts in plane 2, which means fonts are dynamic; this needs to be fixed.
               *
               * Supporting dynamic EGA fonts should not be hard though.  We can get rid of abFontData and simply build a
               * temporary snapshot of all the font bytes in plane 2 of the EGA's video buffer (adwMemory), and pass that on to
               * buildFont() instead.  We'll also need to either invalidate the existing font's color (to trigger a rebuild) or
               * pass a new "force rebuild" flag.
               *
               * Once that's done, an added benefit will be that we can build just the font(s) that have been loaded into plane 2,
               * instead of the multitude of fonts that we now build on a just-in-case basis (eg, the MDA font, the 8x8 CGA font
               * for 43-line mode, and so on).
               *
               * @this {Video}
               * @return {boolean} true if any or all fonts were (re)built, false if nothing changed
               */
              Video.prototype.buildFonts = function()
              {
                  var fChanges = false;
              
                  /*
                   * There's no point building any fonts if we're in a non-windowed (eg, command-line) environment or no font data was loaded.
                   */
                  if (window && this.abFontData) {
              
                      var aRGBColors = this.getCardColors();
                      var offSplit = 0x0000;
                      var cxChar = this.cxFontChar? this.cxFontChar : 8;
                      if (this.buildFont(Video.FONT.CGA, this.aFontOffsets[0], offSplit, cxChar, 8, this.abFontData, aRGBColors)) {
                          fChanges = true;
                      }
              
                      offSplit = this.cxFontChar? 0 : 0x0800;
                      cxChar = this.cxFontChar? this.cxFontChar : 9;
                      if (this.buildFont(Video.FONT.MDA, this.aFontOffsets[1], offSplit, cxChar, 14, this.abFontData, Video.aMDAColors, Video.aMDAColorMap)) {
                          fChanges = true;
                      }
              
                      if (this.cxFontChar) {
                          if (this.buildFont(this.nCard, this.aFontOffsets[1], 0, this.cxFontChar, 14, this.abFontData, aRGBColors)) {
                              fChanges = true;
                          }
                      }
                  }
                  return fChanges;
              };
              
              /**
               * buildFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
               *
               * This is a wrapper for createFont() which also takes care loading double-size fonts when fDoubleFont is set.
               *
               * @this {Video}
               * @param {number} nFont
               * @param {number|null} offData is the offset of the font data, null if none
               * @param {number} offSplit is the offset of any split font data, or zero if not split
               * @param {number} cxChar is the width of the font characters
               * @param {number} cyChar is the height of the font characters
               * @param {*} abFontData is the raw font data, from the ROM font file
               * @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
               * @param {Array} [aColorMap] contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
               * @return {boolean} true if any or all fonts were (re)built, false if nothing changed
               */
              Video.prototype.buildFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
              {
                  var fChanges = false;
              
                  if (offData != null) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont][0] + " font");
                      }
                      if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
                      /*
                       * If font-doubling is enabled, then load a double-size version of the font as well, as it provides
                       * sharper rendering, especially when the screen cell size is a multiple of the above font cell size;
                       * in the case of the CGA, this may also be useful for 40-column modes.
                       */
                      if (this.fDoubleFont) {
                          nFont <<= 1;
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont >> 1][0] + " double-size font");
                          }
                          if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
                      }
                  }
                  return fChanges;
              };
              
              /**
               * createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
               *
               * All color variations are stored on the same font canvas, arranged vertically as a series of grids, where each
               * grid is a 16x16 character glyph array.
               *
               * Since every character must be drawn first with its background color and then with the foreground shape on top,
               * I used to include a series of empty cells at the top every font canvas containing all supported background colors
               * (ie, before the character grids).  But now createFont() also creates an aCSSColors array that is saved alongside
               * the font canvas, and updateChar() uses that array in conjunction with fillRect() to draw character backgrounds.
               *
               * @this {Video}
               * @param {number} nFont
               * @param {number} offData is the offset of the font data
               * @param {number} offSplit is the offset of any split font data, or zero if not split
               * @param {number} cxChar is the width of the font characters
               * @param {number} cyChar is the height of the font characters
               * @param {*} abFontData is the raw font data, from the ROM font file
               * @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
               * @param {Array|undefined} aColorMap contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
               * @return {boolean} true if any or all fonts were (re)created, false if nothing changed
               */
              Video.prototype.createFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
              {
                  var fChanges = false;
                  var nDouble = (nFont & 0x1)? 0 : 1;
                  var font = this.aFonts[nFont];
                  if (!font) {
                      font = {
                          cxCell:     cxChar << nDouble,
                          cyCell:     cyChar << nDouble,
                          aCSSColors: new Array(aRGBColors.length),
                          aRGBColors: aRGBColors.slice(),     // using the Array slice() method to simply make a copy
                          aColorMap:  aColorMap,
                          aCanvas:    new Array(aRGBColors.length)
                      };
                  }
                  for (var iColor = 0; iColor < aRGBColors.length; iColor++) {
                      var rgbColor = aRGBColors[iColor];
                      var rgbColorOrig = font.aCSSColors[iColor]? font.aRGBColors[iColor] : [];
                      if (rgbColor[0] !== rgbColorOrig[0] || rgbColor[1] !== rgbColorOrig[1] || rgbColor[2] !== rgbColorOrig[2]) {
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("creating font color " + iColor + " for font " + nFont);
                          }
                          this.createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData);
                          fChanges = true;
                      }
                  }
                  this.aFonts[nFont] = font;
                  return fChanges;
              };
              
              /**
               * createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
               *
               * @this {Video}
               * @param {Object} font
               * @param {number} iColor
               * @param {Array} rgbColor contains the RGB values for iColor
               * @param {number} nDouble is 1 to double output font dimensions, 0 to match input dimensions
               * @param {number} offData is the offset of the font data
               * @param {number} offSplit is the offset of any split font data, or zero if not split
               * @param {number} cxChar is the width of the font characters
               * @param {number} cyChar is the height of the font characters
               * @param {*} abFontData is the raw font data, from the ROM font file
               */
              Video.prototype.createFontColor = function(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
              {
                  /*
                   * Now we're ready to create a 16x16 character grid for the specified color.  Note that all
                   * the character bits are opaque (alpha=0xff) while all the surrounding bits are transparent
                   * (alpha=0x00, as specified in the 4th byte of rgbOff).
                   *
                   * Originally, I created 256 ImageData objects, using context.createImageData(cxChar,cyChar),
                   * then setting its pixels to match those of an individual character, and then drawing characters
                   * with contextFont.putImageData().  But putImageData() is relatively slow....
                   *
                   * Now I create a new canvas, with dimensions that allow me to arrange all 256 characters in an
                   * 16x16 grid -- much like the "chargen.png" bitmap used in the C1Pjs version of the Video component.
                   * Then drawing becomes much the same as before, because it turns out that drawImage() accepts either
                   * an image object OR a canvas object.
                   *
                   * This also yields better performance, since drawImage() is much faster than putImageData().
                   * We still have to use putImageData() to build the font canvas, but that's a one-time operation.
                   */
                  var rgbOff = [0x00, 0x00, 0x00, 0x00];
                  var canvasFont = window.document.createElement("canvas");
                  canvasFont.width = font.cxCell << 4;
                  canvasFont.height = (font.cyCell << 4);
                  var contextFont = canvasFont.getContext("2d");
              
                  /*
                   * See notes above regarding ImageSmoothingEnabled....
                   *
                   contextFont['mozImageSmoothingEnabled'] = false;
                   contextFont['webkitImageSmoothingEnabled'] = false;
                   */
              
                  var iChar, x, y;
                  var cyLimit = (cyChar < 8 || !offSplit)? cyChar : 8;
                  var imageChar = contextFont.createImageData(font.cxCell, font.cyCell);
              
                  for (iChar = 0; iChar < 256; iChar++) {
                      for (y = 0; y < cyChar; y++) {
                          /*
                           * fUnderline should be true only in the FONT_MDA case, and only for the odd color variations
                           * (1 and 3, out of variations 0 to 4), and only for the two bottom-most rows of the character cell
                           * (which I still need to confirm)
                           */
                          var fUnderline = (font.aColorMap && (iColor & 0x1) && y >= cyChar - 2);
                          var offChar = (y < cyLimit? offData + iChar * cyLimit + y : offSplit + iChar * cyLimit + y - cyLimit);
                          var b = abFontData[offChar];
                          for (var nRowDoubler = 0; nRowDoubler <= nDouble; nRowDoubler++) {
                              for (x = 0; x < cxChar; x++) {
                                  /*
                                   * This "bit" of logic takes care of those characters (0xC0-0xDF) whose 9th bit must mirror the 8th bit;
                                   * in all other cases, any bit past the 8th bit is automatically zero.  It also takes care of embedding a solid
                                   * row of bits whenever fUnderline is true.
                                   */
                                  var bit = (fUnderline? 1 : (b & (0x80 >> (x >= 8 && iChar >= 0xC0 && iChar <= 0xDF? 7 : x))));
                                  var xDst = (x << nDouble);
                                  var yDst = (y << nDouble) + nRowDoubler;
                                  var rgb = (bit? rgbColor : rgbOff);
                                  this.setPixel(imageChar, xDst, yDst, rgb);
                                  if (nDouble) this.setPixel(imageChar, xDst + 1, yDst, rgb);
                              }
                          }
                      }
                      /*
                       * (iChar >> 4) performs the integer equivalent of Math.floor(iChar / 16), and (iChar & 0xf) is the equivalent of (iChar % 16).
                       */
                      contextFont.putImageData(imageChar, x = (iChar & 0xf) * font.cxCell, y = (iChar >> 4) * font.cyCell);
                  }
              
                  /*
                   * The colors for cell backgrounds and cursor elements must be converted to CSS color strings.
                   */
                  font.aCSSColors[iColor] = "#" + str.toHex(rgbColor[0], 2) + str.toHex(rgbColor[1], 2) + str.toHex(rgbColor[2], 2);
                  font.aRGBColors[iColor] = rgbColor;
              
                  /*
                   * Enable this code if you want to see what the generated font looks like....
                   *
                  if (MAXDEBUG) {
                      var iSrcColor = (iColor == 15? 0 : iColor + 1);
                      this.contextScreen.fillStyle = aCSSColors[iSrcColor];
                      this.contextScreen.fillRect(iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
                      this.contextScreen.drawImage(canvasFont, 0, iColor*(font.cyCell<<4), canvasFont.width>>2, font.cyCell<<4, iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
                  }
                   */
              
                  font.aCanvas[iColor] = canvasFont;
              };
              
              /**
               * checkBlink()
               *
               * Called at the end of every updateScreen(), which may have updated cBlinkVisible to a non-zero value.
               *
               * Also called at the end of every checkCursor(); ie, whenever the CRT register(s) affecting the position or shape
               * of the hardware cursor have been modified, and any of iCellCursor, yCursor or cyCursor have been modified as a result.
               *
               * Note that the cursor always blinks when it's ON; it can only be turned OFF, moved off-screen, or its rate set to half
               * the normal blink rate (by default, it blinks at the normal blink rate).  Bits 5-6 of the CRTC.CURSOR_START register can
               * be set as follows:
               *
               *    00: Cursor blinks at normal blink rate
               *    01: Cursor is off
               *    10: (Same as 00)
               *    11: Cursor blinks at half the normal blink rate
               *
               * According to documentation, the normal blink rate is 1/16 of the frame rate (8 frames on, 8 off).
               *
               * TODO: As an aside, I've observed in the "real world" that the MDA cursor cycles about 3 times per second, and by "cycle"
               * I mean one full off-and-on-again cycle.  I'm assuming that's the normal rate (00), not the slower "half rate" (11).
               * Since that's faster than our current cursor blink rate, we should look into an option to boost our rate, without adversely
               * affecting the attribute blink rate (which is currently hard-coded at half the cursor blink rate), and we should look into
               * supporting "half rate" blinking, too.
               *
               * @this {Video}
               * @return {boolean} true if there are things to blink, false if not
               */
              Video.prototype.checkBlink = function()
              {
                  if (this.cBlinkVisible > 0 || this.iCellCursor >= 0) {
                      if (this.cBlinks < 0) {
                          this.cBlinks = 0;
                          /*
                           * At this point, we can either fire up our own timer (doBlink), or rely on updateScreen()
                           * being called by the CPU at a regular rate (eg, CPU.VIDEO_UPDATES_PER_SECOND = 60) and advance
                           * cBlinks at the start of updateScreen() accordingly.
                           *
                           * doBlink() wants to increment cBlinks every 266ms.  On the other hand, if updateScreen() is being
                           * called 60 times per second, that's about once every 16ms, so if every 16th updateScreen() increments
                           * cBlinks, cBlinks should advance at the same rate.
                           *
                           * The only downside to relying on the CPU driving our blink count is that whenever the CPU is halted
                           * (eg, by the PCjs debugger) all blinking stops -- all characters with the blink attribute AND the cursor.
                           *
                           * But we can simply say that when we halt, we mean "halt everything" (ie, call it a feature).
                           *
                           *      this.doBlink(true);
                           */
                      }
                      return true;
                  }
                  this.cBlinks = -1;
                  return false;
              };
              
              /**
               * checkCursor()
               *
               * Called whenever a CRT data register is updated, since there are multiple registers that can affect the
               * visibility of the cursor (more than these, actually, but I'm going to limit my initial support to standard
               * ROM BIOS controller settings):
               *
               *      CRTC.MAX_SCAN_LINE
               *      CRTC.CURSOR_START
               *      CRTC.CURSOR_END
               *      CRTC.START_ADDR_HI
               *      CRTC.START_ADDR_LO
               *      CRTC.CURSOR_ADDR_HI
               *      CRTC.CURSOR_ADDR_LO
               *
               * @this {Video}
               * @return {boolean} true if the cursor is visible, false if not
               */
              Video.prototype.checkCursor = function()
              {
                  /*
                   * The "hardware cursor" is never visible in graphics modes.
                   */
                  if (!this.nFont) return false;
              
                  for (var i = Card.CRTC.CURSOR_START.INDX; i <= Card.CRTC.CURSOR_ADDR_LO; i++) {
                      if (this.cardActive.regCRTData[i] == null)
                          return false;
                  }
              
                  var bCursorFlags = this.cardActive.regCRTData[Card.CRTC.CURSOR_START.INDX];
                  var bCursorStart = bCursorFlags & Card.CRTC.CURSOR_START.MASK;
                  var bCursorEnd = this.cardActive.regCRTData[Card.CRTC.CURSOR_END.INDX] & Card.CRTC.CURSOR_END.MASK;
                  var bCursorMax = this.cardActive.regCRTData[Card.CRTC.MAX_SCAN_LINE] & Card.CRTC.CURSOR_END.MASK;
              
                  /*
                   * HACK: The original EGA BIOS has a cursor emulation bug when 43-line mode is enabled, so we attempt to detect
                   * that particular combination of bad values and automatically fix them (we're so thoughtful!)
                   */
                  var fEGAHack = false;
                  if (this.cardActive === this.cardEGA) {
                      fEGAHack = true;
                      if (bCursorMax == 7 && bCursorStart == 4 && !bCursorEnd) bCursorEnd = 7;
                  }
              
                  /*
                   * One way of disabling the cursor is to set bit 5 (Card.CRTC.CURSOR_START.BLINKOFF) of the CRTC.CURSOR_START flags;
                   * another way is setting bCursorStart > bCursorEnd (unless it's an EGA, in which case we must actually draw a
                   * "split block" cursor instead).
                   *
                   * TODO: Verify whether the second test (bCursorStart > bCursorMax) should also result in a hidden cursor;
                   * ThinkTank sets both start and end values to 0x0f, which doesn't make sense on a CGA, where the max is 0x07.
                   */
                  if ((bCursorFlags & Card.CRTC.CURSOR_START.BLINKOFF) || bCursorStart > bCursorEnd && !fEGAHack || bCursorStart > bCursorMax) {
                      this.removeCursor();
                      return false;
                  }
              
                  /*
                   * The most compatible way of disabling the cursor is to simply move the cursor to an off-screen position.
                   */
                  var iCellCursor = (this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_LO] + ((this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_HI] & Card.CRTC.ADDR_HI_MASK) << 8));
                  if (this.iCellCursor != iCellCursor) {
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("checkCursor(): cursor moved from " + this.iCellCursor + " to " + iCellCursor);
                      }
                      this.removeCursor();
                      this.iCellCursor = iCellCursor;
                  }
              
                  /*
                   * yCursor and cyCursor are no longer scaled at this point, because the necessary scaling will depend on whether we're
                   * drawing the cursor to the on-screen or off-screen buffer, and updateChar() is in the best position to determine that.
                   *
                   * We also record cyCursorCell, the hardware cell height, since we'll need to know what the yCursor and cyCursor values
                   * are relative to when it's time to scale them.
                   */
                  var bCursorSize = bCursorEnd - bCursorStart + 1;
                  if (this.yCursor != bCursorStart || this.cyCursor != bCursorSize) {
                      this.yCursor = bCursorStart;
                      this.cyCursor = bCursorSize;
                  }
                  this.cyCursorCell = bCursorMax + 1;
              
                  this.checkBlink();
                  return true;
              };
              
              /**
               * removeCursor()
               *
               * @this {Video}
               */
              Video.prototype.removeCursor = function()
              {
                  if (this.iCellCursor >= 0) {
                      if (this.aCellCache !== undefined) {
                          var drawCursor = (Video.ATTRS.DRAW_CURSOR << 8);
                          var data = this.aCellCache[this.iCellCursor];
                          if (data & drawCursor) {
                              data &= ~drawCursor;
                              var col = this.iCellCursor % this.nCols;
                              var row = (this.iCellCursor / this.nCols)|0;
                              if (this.nFont && this.aFonts[this.nFont]) {
                                  /*
                                   * If we're using an off-screen buffer in text mode, then we need to keep it in sync with "reality".
                                   */
                                  if (this.contextScreenBuffer) {
                                      this.updateChar(col, row, data, this.contextScreenBuffer);
                                  }
                                  /*
                                   * While updating the on-screen canvas directly could open us up to potential subpixel artifacts again,
                                   * I'm hopeful that won't be the case, since removeCursor() is called only during certain well-defined
                                   * events.  The alternative to this simple updateChar() call is unappealing: redrawing the ENTIRE off-screen
                                   * buffer to the on-screen canvas, just as updateScreen() does.
                                   */
                                  this.updateChar(col, row, data);
                              }
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("removeCursor(): removed from " + row + "," + col);
                              }
                              this.aCellCache[this.iCellCursor] = data;
                          }
                      }
                      this.iCellCursor = -1;
                  }
              };
              
              /**
               * getAccess()
               *
               * @this {Video}
               * @return {number|undefined} current memory access setting, or undefined if unknown
               */
              Video.prototype.getAccess = function()
              {
                  var nAccess;
                  var card = this.cardActive;
              
                  var regGRCMode = card.regGRCData[Card.GRC.MODE.INDX];
                  if (regGRCMode != null) {
                      var nReadAccess = Card.ACCESS.READ.MODE0;
                      var nWriteAccess = Card.ACCESS.WRITE.MODE0;
                      var nWriteMode = regGRCMode & Card.GRC.MODE.WRITE;
                      var regDataRotate = card.regGRCData[Card.GRC.DATAROT.INDX] & Card.GRC.DATAROT.MASK;
                      switch (nWriteMode) {
                      case Card.GRC.MODE.WRITE_MODE0:
                          if (regDataRotate) {
                              nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
                              switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
                              case Card.GRC.DATAROT.AND:
                                  nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
                                  break;
                              case Card.GRC.DATAROT.OR:
                                  nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
                                  break;
                              case Card.GRC.DATAROT.XOR:
                                  nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
                                  break;
                              default:
                                  break;
                              }
                              card.nDataRotate = regDataRotate & Card.GRC.DATAROT.COUNT;
                          }
                          break;
                      case Card.GRC.MODE.WRITE_MODE1:
                          nWriteAccess = Card.ACCESS.WRITE.MODE1;
                          break;
                      case Card.GRC.MODE.WRITE_MODE2:
                          switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
                          default:
                              nWriteAccess = Card.ACCESS.WRITE.MODE2;
                              break;
                          case Card.GRC.DATAROT.AND:
                              nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
                              break;
                          case Card.GRC.DATAROT.OR:
                              nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
                              break;
                          case Card.GRC.DATAROT.XOR:
                              nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
                              break;
                          }
                          break;
                      default:
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("getAccess(): invalid GRC mode (" + str.toHexByte(regGRCMode) + ")");
                          }
                          break;
                      }
                      if (regGRCMode & Card.GRC.MODE.READ_MODE1) {
                          nReadAccess = Card.ACCESS.READ.MODE1;
                      }
                      /*
                       * I discovered that when the IBM EGA ROM scrolls the screen in graphics modes 0x0D and 0x0E, it
                       * reprograms this register for WRITE_MODE1 (which is fine) *and* EVENODD (which is, um, very odd).
                       * Moreover, it does NOT make the complementary change to the SEQ.MEMMODE.SEQUENTIAL bit; under
                       * "normal" circumstances, those two bits are always supposed to programmed oppositely.
                       *
                       * Until I can perform some tests on real hardware, I have to assume that the EGA scroll operation
                       * is supposed to actually WORK in modes 0x0D and 0x0E, so I've decided to tie the trigger for my own
                       * EVENODD functions to SEQ.MEMMODE.SEQUENTIAL being clear, instead of GRC.MODE.EVENODD being set.
                       *
                       * It's also possible that my EVENODD read/write functions are not implemented properly; when EVENODD
                       * is in effect, which addresses get latched by a read, and to which addresses are latches written?
                       * If EVENODD has no effect on the effective address used with the latches, then I should change the
                       * EVENODD read/write functions accordingly.
                       *
                       * However, I've also done some limited testing with an emulated VGA running in text mode, and I've
                       * discovered that toggling the GRC.MODE.EVENODD bit *alone* doesn't seem to affect the delivery of
                       * text mode attributes from plane 1.  So maybe this is the wiser change after all.
                       *
                       * TODO: Perform some tests on actual EGA/VGA hardware, to determine the proper course of action.
                       *
                       *  if (regGRCMode & Card.GRC.MODE.EVENODD) {
                       *      nReadAccess |= Card.ACCESS.READ.EVENODD;
                       *      nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
                       *  }
                       */
                      var regSEQMode = card.regSEQData[Card.SEQ.MEMMODE.INDX];
                      if (regSEQMode != null) {
                          if (!(regSEQMode & Card.SEQ.MEMMODE.SEQUENTIAL)) {
                              nReadAccess |= Card.ACCESS.READ.EVENODD;
                              nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
                          }
                      }
                      nAccess = nReadAccess | nWriteAccess;
                  }
                  return nAccess;
              };
              
              /**
               * setAccess(nAccess)
               *
               * @this {Video}
               * @param {number|undefined} nAccess (one of the Card.ACCESS.* constants)
               */
              Video.prototype.setAccess = function(nAccess)
              {
                  var card = this.cardActive;
                  if (card && nAccess != null && nAccess != card.nAccess) {
              
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("setAccess(" + str.toHexWord(nAccess) + ")");
                      }
              
                      card.setMemoryAccess(nAccess);
              
                      /*
                       * Note that setMemoryAccess() can fail, in which case it will an report error, indicating either a
                       * misconfiguration or some sort of internal inconsistency; in any case, there's not much we can do about
                       * it at this point, other than possibly reverting the current access setting.  There's probably not much
                       * point, however, because there's no guarantee that setMemoryAccess() didn't modify one or more blocks
                       * before choking.
                       */
                      this.bus.setMemoryAccess(card.addrBuffer, card.sizeBuffer, card.getMemoryAccess());
                  }
              };
              
              /**
               * setDimensions()
               *
               * @this {Video}
               */
              Video.prototype.setDimensions = function()
              {
                  this.nFont = 0;
                  this.nCols = this.nColsDefault;
                  this.nRows = this.nRowsDefault;
                  this.nColsLogical = this.nCols;
                  this.nCellsPerWord = Video.aModeParms[Video.MODE.MDA_80X25][2];
              
                  this.cbPadding = 0;
                  var modeParms = Video.aModeParms[this.nMode];
                  if (modeParms) {
              
                      this.nCols = modeParms[0];
                      this.nRows = modeParms[1];
                      this.nCellsPerWord = modeParms[2];
                      this.cbPadding = modeParms[3] || 0;
                      this.nFont = modeParms[4];      // this will be undefined for graphics modes
              
                      if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
                          /*
                           * When an EGA is connected to a CGA monitor, the old aModeParms table is correct: we must
                           * use the hard-coded 8x8 "CGA_80" font.  But when it's connected to an EGA monitor, we want
                           * to use the 9x14 "EGA" color font instead.
                           *
                           * TODO: Can an EGA with a monochrome monitor be programmed for 43-line mode as well?  If so,
                           * then we'll need to load another MDA font variation, because we only load an 9x14 font for MDA.
                           */
                          if (this.cardActive === this.cardEGA && this.nFont == Video.FONT.CGA) {
                              if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 7) {
                                  /*
                                   * Vertical resolution of 350 divided by 8 (ie, scan lines 0-7) yields 43 whole rows.
                                   */
                                  this.nRows = 43;
                              }
                              /*
                               * Since we can also be called before any hardware registers have been initialized,
                               * it may be best to not perform the following test (which is why it's commented out).
                               */
                              else /* if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 13) */ {
                                  /*
                                   * Vertical resolution of 350 divided by 14 (ie, scan lines 0-13) yields exactly 25 rows.
                                   *
                                   * Note that a card's default font matches its card ID (eg, Video.CARD.EGA == Video.FONT.EGA,
                                   * and Video.CARD.VGA == Video.FONT.VGA)
                                   */
                                  this.nFont = this.nCard;
                              }
                          }
                      }
                  }
              
                  this.nCells = (this.nCols * this.nRows)|0;
                  this.nCellCache = (this.nCells / this.nCellsPerWord)|0;
                  this.cbScreen = ((this.nCellCache << 1) + this.cbPadding)|0;
                  this.cbSplit = (this.cbPadding? ((this.cbScreen + this.cbPadding) >> 1) : 0);
                  if (this.nMode >= Video.MODE.EGA_320X200) {
                      /*
                       * Double nCellCache when every cell is a byte rather than a word, and add an extra byte for every row
                       * to handle instances where horizontal panning is used.
                       */
                      this.nCellCache += (this.nCellCache + this.nRows);
                  }
              
                  /*
                   * If no fonts were successfully loaded, there's no point in initializing the remaining drawing parameters.
                   */
                  if (!this.aFonts.length) return;
              
                  this.cxScreenCell = (this.cxScreen / this.nCols)|0;
                  this.cyScreenCell = (this.cyScreen / this.nRows)|0;
              
                  /*
                   * Now we make the all-important scaling determination: if the font cell dimensions (cxCell, cyCell)
                   * don't match the physical screen cell dimensions (cxCell, cyCell), then we look at the caller's
                   * fScaleFont setting: if it's false, we draw the characters as-is, with a border if the characters
                   * are smaller than the cells; and if fScaleFont is true, we simply tell drawImage to draw the
                   * characters to fit.
                   *
                   * WARNING: The only problem with fScaleFont is that any stretching or shrinking tends to be accompanied
                   * by subpixel artifacts along the boundaries of the font images.  Definitely annoying, and apparently
                   * there are no standard mechanisms for turning that behavior off. So, for now, I've "neutered" the
                   * fScaleFont test slightly, by adding the "nCols == 80" test that prevents scaling from kicking in for
                   * 40-column modes.
                   *
                   * Also, whether scaling or not, if it makes sense to use a "doubled" font, we'll switch the font as
                   * well.  Note that the doubled font for any existing font also has an ID that is double the existing ID,
                   * making it easy to check for the existence of a font's "double" (shift the ID left by 1).
                   *
                   * TODO: Since we now use an off-screen buffer for ALL modes, both text and graphics, we should
                   * revisit changes that were made to work around subpixel artifacts; those should no longer be an issue.
                   */
                  if (this.nFont) {
                      var font = this.aFonts[this.nFont];
                      var fontDoubled = this.aFonts[this.nFont << 1];
              
                      if (this.fScaleFont && this.nCols == 80) {
                          if (fontDoubled) {
                              if (this.cxScreenCell >= (fontDoubled.cxCell * 3) >> 2) { // && this.cyScreenCell > (fontDoubled.cyCell * 3) >> 2) {
                                  this.nFont <<= 1;
                                  font = fontDoubled;
                                  if (DEBUG) this.log("setDimensions(): switching to double-size font, scaled");
                              }
                          }
                      } else {
                          if (fontDoubled) {
                              if (this.cxScreenCell >= fontDoubled.cxCell) { // && this.cyScreenCell == fontDoubled.cyCell) {
                                  this.nFont <<= 1;
                                  font = fontDoubled;
                                  if (DEBUG) this.log("setDimensions(): switching to double-size font, unscaled");
                              }
                          }
                          if (font) {
                              this.cxScreenCell = font.cxCell;
                              this.cyScreenCell = font.cyCell;
                          }
                      }
              
                      /*
                       * In text modes, we have the option of setting all the *ScreenBuffer variables to null instead of
                       * allocating them, because updateChar(), as currently written, is capable of writing characters to
                       * either an off-screen or on-screen context.
                       *
                       *      this.imageScreenBuffer = this.canvasScreenBuffer = this.contextScreenBuffer = null;
                       */
                      this.cxBuffer = this.cyBuffer = 0;
                      if (font) {
                          this.cxBuffer = this.nCols * font.cxCell;
                          this.cyBuffer = this.nRows * font.cyCell;
                      }
                  } else {
                      /*
                       * CGA graphics modes have their "cells" (pixels) split evenly across two halves of the video buffer, with
                       * EVEN scan lines in the first half and ODD scan lines in the second half, so unlike text modes, we can't set a
                       * limit of what's visible on-screen to "columns * rows", so the screen limit is set to match the buffer limit.
                       *
                       * In addition, updateScreen() requires an off-screen imageData buffer that matches the size of the entire screen,
                       * so that updateScreen() can set all pixels that have changed and then update the screen with a single drawImage().
                       *
                       * An alternative approach, with a smaller footprint, would be to allocate an off-screen buffer large enough for a
                       * single scan line, and redraw one scan line at a time, but given how EVEN and ODD scan lines are spread across the
                       * entire buffer, it's not clear there would be enough unchanged scan lines on average to make that approach faster.
                       */
                      this.cxScreenCell = this.cyScreenCell = 1;  // in graphics mode, a cell is exactly one pixel
                      this.cxBuffer = this.nCols;
                      this.cyBuffer = this.nRows;
                  }
              
                  /*
                   * Allocate the off-screen buffers
                   */
                  this.imageScreenBuffer = this.contextScreen.createImageData(this.cxBuffer, this.cyBuffer);
                  this.canvasScreenBuffer = window.document.createElement("canvas");
                  this.canvasScreenBuffer.width = this.cxBuffer;
                  this.canvasScreenBuffer.height = this.cyBuffer;
                  this.contextScreenBuffer = this.canvasScreenBuffer.getContext("2d");
              
                  /*
                   * Since cxCell and cyCell were originally defined in terms of cxScreen/nCols and cyScreen/nRows, you might think
                   * these border calculations would always be zero, but that would mean you overlooked the code above which tries to
                   * avoid stretching 40-column modes into an unpleasantly wide shape.
                   */
                  this.xScreenOffset = this.yScreenOffset = 0;
                  this.cxScreenOffset = this.cxScreen;
                  this.cyScreenOffset = this.cyScreen;
              
                  var cxBorder = this.cxScreen - (this.nCols * this.cxScreenCell);
                  var cyBorder = this.cyScreen - (this.nRows * this.cyScreenCell);
                  if (cxBorder > 0) {
                      this.xScreenOffset = (cxBorder >> 1);
                      this.cxScreenOffset -= cxBorder;
                  }
                  if (cyBorder > 0) {
                      this.yScreenOffset = (cyBorder >> 1);
                      this.cyScreenOffset -= cyBorder;
                  }
                  if (cxBorder || cyBorder) {
                      this.contextScreen.fillStyle = this.canvasScreen.style.backgroundColor;
                      this.contextScreen.fillRect(0, 0, this.cxScreen, this.cyScreen);
                  }
              };
              
              /**
               * checkMode(fForce)
               *
               * Called whenever the MDA/CGA's mode register (eg, Card.MDA.MODE.PORT, Card.CGA.MODE.PORT) is updated,
               * or whenever the EGA's GRC Misc register is updated, or when we've just finished a restore().
               *
               * @this {Video}
               * @param {boolean} [fForce] is used to force a mode update, if we recognize the current mode
               * @return {boolean} true if successful, false if not
               */
              Video.prototype.checkMode = function(fForce)
              {
                  var nAccess;
                  var nMode = this.nMode;
                  var card = this.cardActive;
              
                  if (!card) {
                      /*
                       * We are likely being called after a restore(), which needs us to call setMode() to insure the proper video
                       * buffer is mapped in.  So we unset this.nMode to guarantee that setMode() will be called, and if it wasn't set
                       * to anything before, then we fall-back to the default mode.
                       */
                      this.nMode = null;
                      if (nMode == null) nMode = this.nModeDefault;
                  }
                  else {
                      if (card.nCard == Video.CARD.MDA) {
                          nMode = Video.MODE.MDA_80X25;
                      }
                      else if (card.nCard >= Video.CARD.EGA) {
                          /*
                           * The sizeBuffer we choose reflects the amount of physical address space that all 4 planes
                           * of EGA memory normally span, NOT the total amount of EGA memory.  So for a 64Kb EGA card,
                           * we would set card.sizeBuffer to 16Kb (0x4000).
                           *
                           * TODO: Need to take into account modes that "chain" planes together (eg, mode 0x0F, and
                           * presumably mode 0x10, on an EGA card with only 64Kb).
                           */
                          nMode = null;
                          var cbBuffer = card.cbMemory >> 2;
                          var cbBufferText = (cbBuffer > 0x8000? 0x8000 : cbBuffer);
              
                          var regGRCMisc = card.regGRCData[Card.GRC.MISC.INDX];
                          if (regGRCMisc != null) {
              
                              switch(regGRCMisc & Card.GRC.MISC.MAPMEM) {
                              case Card.GRC.MISC.MAPA0128:
                                  card.addrBuffer = 0xA0000;
                                  card.sizeBuffer = cbBuffer;     // 0x20000
                                  nMode = Video.MODE.UNKNOWN;     // no BIOS mode uses this mapping, but we don't want to leave nMode null if we've come this far
                                  break;
                              case Card.GRC.MISC.MAPA064:
                                  card.addrBuffer = 0xA0000;
                                  card.sizeBuffer = cbBuffer;     // 0x10000
                                  nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.EGA_640X350_MONO : Video.MODE.EGA_640X350);
                                  break;
                              case Card.GRC.MISC.MAPB032:
                                  card.addrBuffer = 0xB0000;
                                  card.sizeBuffer = cbBufferText;
                                  nMode = Video.MODE.MDA_80X25;
                                  break;
                              case Card.GRC.MISC.MAPB832:
                                  card.addrBuffer = 0xB8000;
                                  card.sizeBuffer = cbBufferText;
                                  nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.CGA_80X25_BW : Video.MODE.CGA_80X25);
                                  break;
                              default:
                                  break;
                              }
              
                              var fSEQDotClock = (card.regSEQData[Card.SEQ.CLOCKING.INDX] & Card.SEQ.CLOCKING.DOTCLOCK);
                              var nCRTCVertTotal = card.regCRTData[Card.CRTC.EGA.VERT_TOTAL];
                              nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT8)? 0x100 : 0);
                              if (card.nCard == Video.CARD.VGA) {
                                  nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT9)? 0x200 : 0);
                              }
              
                              if (nMode != Video.MODE.UNKNOWN) {
                                  if (!(regGRCMisc & Card.GRC.MISC.GRAPHICS)) {
                                      if (fSEQDotClock) nMode -= 2;
                                  } else {
                                      if (card.addrBuffer == 0xB8000) {
                                          //
                                          // Since nMode will have been assigned a default of either 0x02 or 0x03, convert that to either
                                          // 0x05 or 0x04 if we're in a low-res graphics mode, 0x06 otherwise.
                                          //
                                          nMode = fSEQDotClock? (7 - nMode) : Video.MODE.CGA_640X200;
                                      } else {
                                          //
                                          // card.addrBuffer must be 0xA0000, so we need to discriminate between modes 0x0D through 0x10;
                                          // we've already defaulted to 0x0F or 0x10, so determine if it's 0x0D or 0x0E (ie, a 200-row mode)
                                          // and then which one (ie, 320 wide or 640 wide).
                                          //
                                          if (nCRTCVertTotal < 500) {
                                              if (nCRTCVertTotal < 350) {
                                                  nMode = (fSEQDotClock? Video.MODE.EGA_320X200 : Video.MODE.EGA_640X200);
                                              }
                                          } else {
                                              nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.VGA_640X480_MONO : Video.MODE.VGA_640X480);
                                          }
                                          if (DEBUG && this.messageEnabled()) {
                                              this.printMessage("checkMode(): nCRTCVertTotal=" + nCRTCVertTotal + ", mode=" + str.toHexByte(nMode));
                                              this.cpu.stopCPU();
                                          }
                                      }
                                  }
                              }
              
                              nAccess = this.getAccess();
                          }
                      }
                      else if (card.regMode & Card.CGA.MODE.VIDEO_ENABLE) {
                          /*
                           * NOTE: For the CGA, we precondition any mode change on CGA.MODE.VIDEO_ENABLE being set, otherwise
                           * we'll get spoofed by the ROM BIOS scroll code, which waits for vertical retrace and then turns CGA.MODE.VIDEO_ENABLE
                           * off, using a hard-coded mode value (0x25) that does NOT necessarily match the the CGA video mode currently in effect.
                           */
                          if (!(card.regMode & Card.CGA.MODE.GRAPHIC_SEL)) {
                              nMode = ((card.regMode & Card.CGA.MODE._80X25)? Video.MODE.CGA_80X25 : Video.MODE.CGA_40X25);
                              if (card.regMode & Card.CGA.MODE.BW_SEL) nMode -= 1;
                          } else {
                              nMode = ((card.regMode & Card.CGA.MODE.HIRES_BW)? Video.MODE.CGA_640X200 : Video.MODE.CGA_320X200_BW);
                              if (!(card.regMode & Card.CGA.MODE.BW_SEL)) nMode -= 1;
                          }
                      }
                  }
              
                  /*
                   * NOTE: If setMode() remaps the video memory, that will trigger calls to getMemoryAccess() to also update the
                   * memory's access functions.  However, if the memory access setting (nAccess) is about to change as well, those
                   * changes will be moot until the setAccess() call that follows.  Basically, whenever both memory mapping AND access
                   * functions are changing, the memory will be in an inconsistent state until both setMode() and setAccess() are
                   * finished.
                   *
                   * The setMode() call takes precedence; if we called setAccess() first, it might attempt to modify memory access
                   * functions based on the card's addrBuffer setting, and if that doesn't match what's currently mapped, assertions
                   * will be triggered (probably not fatal, but it would defeat the point of the assertions).
                   */
                  if (!this.setMode(nMode, fForce)) return false;
              
                  this.setAccess(nAccess);
              
                  return true;
              };
              
              /**
               * setMode(nMode, fForce)
               *
               * Set fForce to true to update the mode regardless of previous mode, or false to perform a normal update
               * that bypasses updateScreen() but still calls initCellCache().
               *
               * @this {Video}
               * @param {number|null} nMode
               * @param {boolean|undefined} [fForce] is set when checkMode() wants to force a mode update
               * @return {boolean} true if successful, false if failure
               */
              Video.prototype.setMode = function(nMode, fForce)
              {
                  if (nMode != null && (nMode != this.nMode || fForce)) {
              
                      if (DEBUG && this.messageEnabled()) {
                          this.printMessage("setMode(" + str.toHexByte(nMode) + (fForce? ",force" : "") + ")");
                      }
              
                      this.cUpdates = 0;      // count updateScreen() calls as a means of driving blink updates
                      this.nMode = nMode;
              
                      /*
                       * On an EGA, it's CRITICAL that a reset() invalidate cardActive, to ensure that the code below
                       * releases the previous video buffer and installs a new one, even if there was no change in the
                       * video buffer address or size, because otherwise the Memory blocks installed at the video buffer
                       * address may still be using blocks of the EGA's previous memory buffer.
                       *
                       * When the EGA is reinitialized, a new memory buffer (adwMemory) is allocated (see initEGA()), and
                       * this is where the mapping of that EGA memory buffer to the video buffer occurs.  Other cards
                       * (MDA or CGA) don't allocate/manage their own memory buffer, but even then, it's still a good idea
                       * to always force this operation (eg, in case a switch setting changed the active video card).
                       */
                      var card = this.cardActive || (nMode == Video.MODE.MDA_80X25? this.cardMono : this.cardColor);
              
                      if (card != this.cardActive || card.addrBuffer != this.addrBuffer || card.sizeBuffer != this.sizeBuffer) {
              
                          this.removeCursor();
              
                          if (this.addrBuffer) {
              
                              if (DEBUG && this.messageEnabled()) {
                                  this.printMessage("setMode(" + str.toHexByte(nMode) + "): removing " + str.toHexLong(this.sizeBuffer) + " bytes from " + str.toHexLong(this.addrBuffer));
                              }
              
                              if (!this.bus.removeMemory(this.addrBuffer, this.sizeBuffer)) {
                                  /*
                                   * TODO: Force this failure case and see how well the Video component deals with it.
                                   */
                                  return false;
                              }
                              if (this.cardActive) this.cardActive.fActive = false;
                          }
              
                          this.cardActive = card;
                          card.fActive = true;
              
                          this.addrBuffer = card.addrBuffer;
                          this.sizeBuffer = card.sizeBuffer;
              
                          if (DEBUG && this.messageEnabled()) {
                              this.printMessage("setMode(" + str.toHexByte(nMode) + "): adding " + str.toHexLong(this.sizeBuffer) + " bytes to " + str.toHexLong(this.addrBuffer));
                          }
              
                          var controller = (card === this.cardEGA? card : null);
              
                          if (!this.bus.addMemory(card.addrBuffer, card.sizeBuffer, Memory.TYPE.VIDEO, controller)) {
                              /*
                               * TODO: Force this failure case and see how well the Video component deals with it.
                               */
                              return false;
                          }
                      }
              
                      this.setDimensions();
              
                      if (fForce !== false) {
                          this.updateScreen(true);
                      } else {
                          this.initCellCache(true);
                      }
                  }
                  return true;
              };
              
              /**
               * setPixel(imageData, x, y, rgb)
               *
               * Worker function used by createFontColor() and updateScreen() (graphics modes only).
               *
               * @this {Video}
               * @param {Object} imageData
               * @param {number} x
               * @param {number} y
               * @param {Array.<number>} rgb is a 4-element array containing the red, green, blue and alpha values
               */
              Video.prototype.setPixel = function(imageData, x, y, rgb)
              {
                  var index = (x + y * imageData.width) * rgb.length;
                  imageData.data[index]   = rgb[0];
                  imageData.data[index+1] = rgb[1];
                  imageData.data[index+2] = rgb[2];
                  imageData.data[index+3] = rgb[3];
              };
              
              /**
               * initCellCache(fNew)
               *
               * Invalidates the contents of our internal cell cache.
               *
               * @this {Video}
               * @param {boolean} fNew is true to reallocate/resize the cell cache; in any case, it's still reinitialized
               */
              Video.prototype.initCellCache = function(fNew)
              {
                  var nCells;
                  if (!fNew) {
                      if (this.aCellCache === undefined) return;
                      nCells = this.aCellCache.length;
                  } else {
                      nCells = this.nCellCache;
                      if (this.aCellCache === undefined || this.aCellCache.length != nCells) {
                          this.aCellCache = new Array(nCells);
                      }
                  }
                  for (var iCell = 0; iCell < nCells; iCell++) {
                      this.aCellCache[iCell] = -1;        // invalidate every cell of our internal cell cache (-1 is an invalid cell value)
                  }
                  this.cBlinkVisible = -1;                // also invalidate the visible blinking character count, to force updateScreen() to recount
              };
              
              /**
               * doBlink()
               *
               * This function is obsolete, now that the checkBlink() function is called on every updateScreen()
               * and checkCursor() call.  updateScreen() is driven by the CPU timer, so piggy-backing on that to
               * drive blink updates seems preferable to having another active timer in the system.
               *
               * @this {Video}
               * @param {boolean} [fStart]
               *
               Video.prototype.doBlink = function(fStart)
               {
                  if (this.cBlinks >= 0) {
                      this.cBlinks++;
                      if (this.cBlinkVisible || this.iCellCursor >= 0) {
                          if (!fStart && !this.cpu.isRunning()) {
                              this.updateScreen();
                          }
                          setTimeout(function(video) { return function onBlinkTimeout() {video.doBlink();}; }(this), 266);
                          return;
                      }
                      this.cBlinks = -1;
                  }
              },
               */
              
              /**
               * updateChar(col, row, data, context)
               *
               * Updates a particular character cell (row,col) in the associated window.
               *
               * The data parameter is the attribute byte from the display buffer (fgnd attribute in the low nibble,
               * bgnd attribute in the high nibble), but updateScreen() supplements data with a couple internal attribute bits:
               *
               *      ATTRS.DRAW_FGND:    set for every cell whose fgnd element is currently on (ie, non-blinking, or whenever blink is on)
               *      ATTRS.DRAW_CURSOR:  set only for the cell containing the cursor, if any
               *
               * To make a character blink, we alternately draw its cell with ATTRS.DRAW_FGND set, and then again with
               * ATTRS.DRAW_FGND clear (meaning only the cell background is drawn).
               *
               * To make the cursor blink, we must alternately draw its entire cell with ATTRS.DRAW_CURSOR set, and then
               * draw it again with ATTRS.DRAW_CURSOR clear.
               *
               * @this {Video}
               * @param {number} col
               * @param {number} row
               * @param {number} data (if text mode, character code in low byte, attribute code in high byte)
               * @param {Object} [context]
               */
              Video.prototype.updateChar = function(col, row, data, context)
              {
                  /*
                   * The caller MUST promise this.nFont is defined, and that the font in this.aFonts[this.nFont] has been loaded.
                   */
                  var bChar = data & 0xff;
                  var bAttr = data >> 8;
                  var iFgnd = bAttr & 0xf;
                  var font = this.aFonts[this.nFont];
                  if (font.aColorMap) iFgnd = font.aColorMap[iFgnd];
              
                  /*
                   * Just as aColorMap maps the foreground attribute to the appropriate foreground character grid,
                   * it also maps the background attribute to the appropriate background color.
                   */
                  var xDst, yDst;
                  var iBgnd = (bAttr >> 4) & 0xf;
                  if (font.aColorMap) iBgnd = font.aColorMap[iBgnd];
              
                  if (context) {
                      xDst = col * font.cxCell;
                      yDst = row * font.cyCell;
                      context.fillStyle = font.aCSSColors[iBgnd];
                      context.fillRect(xDst, yDst, font.cxCell, font.cyCell);
                  } else {
                      xDst = col * this.cxScreenCell + this.xScreenOffset;
                      yDst = row * this.cyScreenCell + this.yScreenOffset;
                      this.contextScreen.fillStyle = font.aCSSColors[iBgnd];
                      this.contextScreen.fillRect(xDst, yDst, this.cxScreenCell, this.cyScreenCell);
                  }
              
                  if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
                      this.log("updateCharBgnd(" + col + "," + row + "," + bChar + "): filled " + xDst + "," + yDst);
                  }
              
                  if (bAttr & Video.ATTRS.DRAW_FGND) {
                      /*
                       * (bChar & 0xf) is the equivalent of (bChar % 16), and (bChar >> 4) is the equivalent of Math.floor(bChar / 16)
                       */
                      var xSrcFgnd = (bChar & 0xf) * font.cxCell;
                      var ySrcFgnd = (bChar >> 4) * font.cyCell;
              
                      if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
                          this.log("updateCharFgnd(" + col + "," + row + "," + bChar + "): draw from " + xSrcFgnd + "," + ySrcFgnd + " (" + font.cxCell + "," + font.cyCell + ") to " + xDst + "," + yDst);
                      }
              
                      if (context) {
                          context.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, font.cxCell, font.cyCell);
                      } else {
                          this.contextScreen.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, this.cxScreenCell, this.cyScreenCell);
                      }
                  }
              
                  if (bAttr & Video.ATTRS.DRAW_CURSOR) {
                      /*
                       * Drawing the cursor with lineTo() seemed logical, but it was complicated by the fact that the
                       * TOP of the line must appear at "yDst + this.yCursor", whereas lineTo() wants to know the CENTER
                       * of the line. So it's simpler to draw the cursor with another fillRect().  Here's the old code:
                       *
                       *      this.contextScreen.strokeStyle = font.aCSSColors[iFgnd];
                       *      this.contextScreen.lineWidth = this.cyCursor;
                       *      this.contextScreen.beginPath();
                       *      this.contextScreen.moveTo(xDst, yDst + this.yCursor);
                       *      this.contextScreen.lineTo(xDst + this.cxScreenCell, yDst + this.yCursor);
                       *      this.contextScreen.stroke();
                       *
                       * Also, note that we're scaling the yCursor and cyCursor values here, instead of in checkCursor(), because
                       * this is where we have all the required information: in the first case (off-screen buffer), the scaling must
                       * be based on the font cell size (cxCell, cyCell), whereas in the second case (on-screen buffer), the scaling
                       * must be based on the screen cell size (cxScreenCell,cyScreenCell).
                       *
                       * yCursor and cyCursor are actual hardware values, both relative to another hardware value: cyCursorCell.
                       */
                      var yCursor = this.yCursor;
                      var cyCursor = this.cyCursor;
                      if (context) {
                          if (this.cyCursorCell && this.cyCursorCell !== font.cyCell) {
                              yCursor = ((yCursor * font.cyCell) / this.cyCursorCell)|0;
                              cyCursor = ((cyCursor * font.cyCell) / this.cyCursorCell)|0;
                          }
                          context.fillStyle = font.aCSSColors[iFgnd];
                          context.fillRect(xDst, yDst + yCursor, font.cxCell, cyCursor);
                      } else {
                          if (this.cyCursorCell && this.cyCursorCell !== this.cyScreenCell) {
                              yCursor = ((yCursor * this.cyScreenCell) / this.cyCursorCell)|0;
                              cyCursor = ((cyCursor * this.cyScreenCell) / this.cyCursorCell)|0;
                          }
                          this.contextScreen.fillStyle = font.aCSSColors[iFgnd];
                          this.contextScreen.fillRect(xDst, yDst + yCursor, this.cxScreenCell, cyCursor);
                      }
                  }
              };
              
              /**
               * updateScreen(fForce)
               *
               * Propagates the video buffer to the cell cache and updates the screen with any changes.  Forced updates
               * are generally internal updates triggered by an I/O operation or other state change, while non-forced updates
               * are the periodic updates coming from the CPU.
               *
               * For every cell in the video buffer, compare it to the cell stored in the cell cache, render if it differs,
               * and then update the cell cache to match.  Since initCellCache() sets every cell in the cell cache to an
               * invalid value, we're assured that the next call to updateScreen() will redraw the entire (visible) video buffer.
               *
               * @this {Video}
               * @param {boolean} [fForce] is used by setMode() to reset the cell cache and force a redraw
               */
              Video.prototype.updateScreen = function(fForce)
              {
                  /*
                   * The Computer component maintains the fPowered setting on our behalf, so we use it.
                   */
                  if (!this.aFlags.fPowered) return;
              
                  /*
                   * If the card's video signal is disabled (eg, during a mode change), then skip the update,
                   * unless fForce is set.
                   */
                  var fEnabled = false;
                  if (this.cardActive) {
                      if (this.cardActive === this.cardEGA) {
                          if (this.cardEGA.regATCIndx & Card.ATC.INDX_PAL_ENABLE) fEnabled = true;
                      }
                      else {
                          if (this.cardActive.regMode & Card.CGA.MODE.VIDEO_ENABLE) fEnabled = true;
                      }
                  }
              
                  if (!fEnabled && !fForce) return;
              
                  if (fForce) {
                      this.initCellCache(true);
                  }
                  else {
                      /*
                       * This should never happen, but since updateScreen() is also called by CPU.updateVideo(),
                       * better safe than sorry.
                       */
                      if (this.aCellCache === undefined) return;
                  }
              
                  /*
                   * If cBlinks is "enabled" (ie, >= 0), then advance it once every 16 updateScreen() calls
                   * (assuming an updateScreen() frequency of 60 per second; see CPU.VIDEO_UPDATES_PER_SECOND).
                   *
                   * We assume that the CPU is calling us whenever fForce is undefined.
                   */
                  var fBlinkUpdate = false;
                  if (!fForce && !(++this.cUpdates & 0xf) && this.cBlinks >= 0) {
                      this.cBlinks++;
                      fBlinkUpdate = true;
                  }
              
                  var iCell = 0;
                  var nCells = this.nCells;
              
                  /*
                   * Calculate the VISIBLE start of screen memory (addrScreen), not merely the PHYSICAL start,
                   * as well as the extent of it (cbScreen) and use those values for all addressing operations
                   * to follow.  FYI, in these calculations, offScreen does not refer to "off-screen" memory,
                   * but rather the "offset" of the start of visible screen memory.
                   */
                  var addrScreen = this.cardActive.addrBuffer;
                  var addrScreenLimit = addrScreen + this.cardActive.sizeBuffer;
                  var offScreen = ((this.cardActive.regCRTData[Card.CRTC.START_ADDR_HI] << 8) + this.cardActive.regCRTData[Card.CRTC.START_ADDR_LO])|0;
              
                  /*
                   * Any screen (aka "page") offset must be doubled for text modes, due to the attribute bytes.
                   *
                   * TODO: Come up with a more robust method of deciding when any screen offset should be doubled.
                   */
                  if (this.nFont) offScreen <<= 1;
              
                  addrScreen += offScreen;
                  var cbScreen = this.cbScreen;
              
                  if (this.nCard >= Video.CARD.EGA && this.cardActive.regCRTData[Card.CRTC.EGA.OFFSET]) {
                      /*
                       * Pre-EGA, the extent of visible screen memory (cbScreen) was derived from nCols * nRows, but since
                       * then, the logical width of screen memory (nColsLogical) can differ from the visible width (nCols).
                       * We now calculate the logical width, and the compute a new cbScreen in much the same way the original
                       * cbScreen was computed (but without any CGA-related padding considerations).
                       */
                      this.nColsLogical = this.cardActive.regCRTData[Card.CRTC.EGA.OFFSET] << (this.nFont? 1 : 4);
                      cbScreen = ((((this.nColsLogical * (this.nRows-1) + this.nCols) / this.nCellsPerWord) << 1) + this.cbPadding)|0;
                  }
              
                  if (addrScreen + cbScreen > addrScreenLimit) {
                      cbScreen = addrScreenLimit - addrScreen;
                      if (cbScreen < 0) cbScreen = 0;
                  }
              
                  /*
                   * addrScreenLimit was initially the limit of the entire video buffer, but we now adjust it
                   * to the limit of what's visible, since that's all we want to draw.
                   */
                  addrScreenLimit = addrScreen + cbScreen;
              
                  /*
                   * This next bit of code can be completely disabled if we discover problems with the dirty
                   * memory block tracking feature, or if we need to remove or disable that feature in the future.
                   *
                   * We use cleanMemory() to check the video buffer's dirty state.  If the buffer is clean
                   * AND there are no visible blinking characters (as of the last updateScreen) AND there is
                   * no visible cursor, then we're done; simply return.  Otherwise, if there's only a blinking
                   * cursor, then update JUST that one cell.
                   *
                   * When dealing with blinking characters, note that we need to run through the entire buffer
                   * ONLY if the low bits of the blink count just transitioned to 2 or 0; hence, we could return if
                   * the blink count was ODD.  But we'd still have to worry about the cursor, so it's simpler to blow
                   * that small optimization off.  Further optimizations are certainly possible, such as a hash table
                   * of all blinking character locations, but all those optimizations are saved for a rainy day.
                   */
                  if (!fForce && this.bus.cleanMemory(addrScreen, cbScreen)) {
                      if (!fBlinkUpdate) return;
                      if (!this.cBlinkVisible) {
                          if (this.iCellCursor < 0) return;
                          iCell = this.iCellCursor;
                          nCells = iCell + 1;
                      }
                      // else if (this.cBlinks & 0x1) return;
                  }
              
                  if (this.nFont) {
                      /*
                       * This is the text-mode update case.  We're required to FIRST verify that the current font
                       * has been successfully loaded, because we're not allowed to call updateChar() if there's no font.
                       */
                      if (this.aFonts[this.nFont]) {
                          this.updateScreenText(addrScreen, addrScreenLimit, iCell, nCells);
                          this.checkBlink();
                      }
                  }
                  else if (this.cbSplit) {
                      this.updateScreenGraphicsCGA(addrScreen, addrScreenLimit);
                  }
                  else {
                      this.updateScreenGraphicsEGA(addrScreen, addrScreenLimit);
                  }
              };
              
              /**
               * updateScreenText(addrScreen, addrScreenLimit, iCell, nCells)
               *
               * @param addrScreen
               * @param addrScreenLimit
               * @param iCell
               * @param nCells
               */
              Video.prototype.updateScreenText = function(addrScreen, addrScreenLimit, iCell, nCells)
              {
                  var addr, data, dataCache, cUpdated = 0;
              
                  /*
                   * If MDA.MODE.BLINK_ENABLE is set and a cell's blink bit is set, then if (cBlinks & 0x2) != 0,
                   * we want the foreground element of the cell to be drawn; otherwise we don't.  So every 16-bit
                   * data word we pull from the video buffer will be supplemented with our own special attribute bit
                   * (ATTRS.DRAW_FGND = 0x100) accordingly; and to simplify the drawing code, we will also mask the
                   * blink bit from the cell's attribute bits.
                   *
                   * If MDA.MODE.BLINK_ENABLE is clear, then we always set ATTRS.DRAW_FGND and never mask the blink
                   * bit in a cell's attributes bits, since it's actually an intensity bit in that case.
                   */
                  this.cBlinkVisible = 0;
                  var dataBlink = 0;
                  var dataDraw = (Video.ATTRS.DRAW_FGND << 8);
                  var dataMask = 0xfffff;
                  if (this.cardActive.regMode & Card.MDA.MODE.BLINK_ENABLE) {
                      dataBlink = (Video.ATTRS.BGND_BLINK << 8);
                      dataMask &= ~dataBlink;
                      if (!(this.cBlinks & 0x2)) dataMask &= ~dataDraw;
                  }
                  addr = addrScreen + (iCell << 1);
                  while (addr < addrScreenLimit && iCell < nCells) {
                      data = this.bus.getShortDirect(addr);
                      data |= dataDraw;
                      if (data & dataBlink) {
                          this.cBlinkVisible++;
                          data &= dataMask;
                      }
                      if (iCell == this.iCellCursor) {
                          data |= ((this.cBlinks & 0x1)? (Video.ATTRS.DRAW_CURSOR << 8) : 0);
                      }
                      this.assert(iCell < this.aCellCache.length);
                      dataCache = this.aCellCache[iCell];
                      if (dataCache != data) {
                          var col = iCell % this.nCols;
                          var row = (iCell / this.nCols)|0;
                          this.updateChar(col, row, data, this.contextScreenBuffer);
                          this.aCellCache[iCell] = data;
                          cUpdated++;
                      }
                      addr += 2;
                      iCell++;
                  }
                  if (cUpdated && this.contextScreenBuffer) {
                      this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.cxBuffer, this.cyBuffer, this.xScreenOffset, this.yScreenOffset, this.cxScreenOffset, this.cyScreenOffset);
                  }
              };
              
              /**
               * updateScreenGraphicsCGA(addrScreen, addrScreenLimit)
               *
               * @param addrScreen
               * @param addrScreenLimit
               */
              Video.prototype.updateScreenGraphicsCGA = function(addrScreen, addrScreenLimit)
              {
                  var addr, data, dataCache;
              
                  /*
                   * This is the CGA graphics-mode update case, where cells are pixels spread across two halves of the buffer.
                   */
                  addr = addrScreen;
                  this.cBlinkVisible = 0;
                  var iCell = 0, nPixelsPerCell = this.nCellsPerWord;
                  var wPixelMask = (nPixelsPerCell == 16? 0x10000 : 0x30000);
                  var nPixelShift = (nPixelsPerCell == 16? 1 : 2);
                  var aPixelColors = this.getCardColors(nPixelShift);
              
                  var x = 0, y = 0;
                  var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
                  while (addr < addrScreenLimit) {
                      data = this.bus.getShortDirect(addr);
                      this.assert(iCell < this.aCellCache.length);
                      dataCache = this.aCellCache[iCell];
                      if (dataCache === data) {
                          x += nPixelsPerCell;
                      } else {
                          this.aCellCache[iCell] = data;
                          var wPixels = (data >> 8) | ((data & 0xff) << 8);
                          var wMask = wPixelMask, nShift = 16;
                          if (x < xDirty) xDirty = x;
                          for (var iPixel = 0; iPixel < nPixelsPerCell; iPixel++) {
                              var bPixel = (wPixels & (wMask >>= nPixelShift)) >> (nShift -= nPixelShift);
                              this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
                          }
                          if (x > xMaxDirty) xMaxDirty = x;
                          if (y < yDirty) yDirty = y;
                          if (y >= yMaxDirty) yMaxDirty = y + 1;
                      }
                      addr += 2;
                      iCell++;
                      if (x >= this.nCols) {
                          x = 0;
                          y += 2;
                          if (y > this.nRows)
                              break;
                          if (y == this.nRows) {
                              y = 1;
                              addr = addrScreen + this.cbSplit;
                          }
                      }
                  }
                  /*
                   * Instead of blasting the ENTIRE imageScreenBuffer into contextScreenBuffer, and then blasting the ENTIRE
                   * canvasScreenBuffer onto contextScreen, even for the smallest change, let's try to be a bit smarter about
                   * the update (well, to the extent that the canvas APIs permit).
                   */
                  if (xDirty < this.nCols) {
                      var cxDirty = xMaxDirty - xDirty;
                      var cyDirty = yMaxDirty - yDirty;
                      // this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0);
                      this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
                      /*
                       * While ideally I would draw only the dirty portion of canvasScreenBuffer, there usually isn't a 1-1 pixel mapping
                       * between canvasScreenBuffer and contextScreen.  In fact, the WHOLE POINT of the canvasScreenBuffer is to leverage
                       * drawImage()'s scaling ability; for example, a CGA graphics mode might be 640x200, whereas the canvas representing
                       * the screen might be 960x400.  In those situations, if we draw interior rectangles, we often end up with subpixel
                       * artifacts along the edges of those rectangles.  So it appears I must continue to redraw the entire canvasScreenBuffer
                       * on every change.
                       *
                      var xScreen = (((xDirty * this.cxScreen) / this.nCols) | 0);
                      var yScreen = (((yDirty * this.cyScreen) / this.nRows) | 0);
                      var cxScreen = (((cxDirty * this.cxScreen) / this.nCols) | 0);
                      var cyScreen = (((cyDirty * this.cyScreen) / this.nRows) | 0);
                      this.contextScreen.drawImage(this.canvasScreenBuffer, xDirty, yDirty, cxDirty, cyDirty, xScreen, yScreen, cxScreen, cyScreen);
                       */
                      this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
                  }
              };
              
              /**
               * updateScreenGraphicsEGA(addrScreen, addrScreenLimit)
               *
               * @param addrScreen
               * @param addrScreenLimit
               */
              Video.prototype.updateScreenGraphicsEGA = function(addrScreen, addrScreenLimit)
              {
                  var addr, data, dataCache;
              
                  addr = addrScreen;
                  this.cBlinkVisible = 0;
              
                  var iCell = 0;
                  var aPixelColors = this.getCardColors();
                  var adwMemory = this.cardActive.adwMemory;
              
                  var x = 0, y = 0;
                  var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
              
                  var iPixelFirst = this.cardActive.regATCData[Card.ATC.HORZPAN.INDX] & Card.ATC.HORZPAN.SHIFT_LEFT;
                  /*
                   * TODO: What should happen if the card is programmed such that nColsLogical is LESS THAN nCols?
                   */
                  var nRowAdjust = (this.nColsLogical > this.nCols? ((this.nColsLogical - this.nCols - iPixelFirst) >> 3) : 0);
                  var nCellAdjust = (iPixelFirst == 0? 1 : 0);
              
                  while (addr < addrScreenLimit) {
                      var idw = addr++ - this.addrBuffer;
                      this.assert(idw >= 0 && idw < adwMemory.length);
                      data = adwMemory[idw];
                      this.assert(iCell < this.aCellCache.length);
                      dataCache = this.aCellCache[iCell];
              
                      /*
                       * Figure out how many visible pixels this byte represents; usually 8, unless panning is being used.
                       */
                      var iPixel, nPixels = 8;
                      if (!x) {
                          data <<= iPixelFirst;
                          dataCache <<= iPixelFirst;
                          nPixels -= iPixelFirst;
                          this.assert(iCell == y * ((this.nCols >> 3) + 1));
                      } else {
                          iPixel = this.nCols - x;
                          if (nPixels > iPixel) nPixels = iPixel;
                      }
              
                      if (data === dataCache) {
                          x += nPixels;
                      } else {
                          this.aCellCache[iCell] = data;
                          if (x < xDirty) xDirty = x;
                          for (iPixel = 0; iPixel < nPixels; iPixel++) {
                              /*
                               * We must follow the golden JavaScript rule of appending "|0" to all hex constants with bit 31 set.
                               * The innocuous use of the bit-wise OR operator has the side-effect of producing a negative value,
                               * matching how entries in Video.aEGADWToByte are initialized (eg, "Video.aEGADWToByte[0x80000000|0]").
                               */
                              var dwPixel = data & (0x80808080|0);
                              /*
                               * This was the old approach to dealing with negative hex values, by converting them to positive
                               * values that didn't alter the low 32 bits.  But it's not ideal, because it requires using values here
                               * and in the array that are outside the signed 32-bit range, potentially triggering floating-point.
                               *
                               *      if (dwPixel < 0) dwPixel += 0x100000000;
                               */
                              this.assert(Video.aEGADWToByte[dwPixel] !== undefined);
                              /*
                               * Since assertions don't fix problems (only catch them, and only in DEBUG builds), I'm also ensuring
                               * that bPixel will always default to 0 if an undefined value ever slips through again.
                               */
                              var bPixel = Video.aEGADWToByte[dwPixel] || 0;
                              this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
                              data <<= 1;
                          }
                          if (x > xMaxDirty) xMaxDirty = x;
                          if (y < yDirty) yDirty = y;
                          if (y >= yMaxDirty) yMaxDirty = y + 1;
                      }
              
                      iCell++;
                      this.assert(x <= this.nCols);
              
                      if (x >= this.nCols) {
                          x = 0;
                          if (++y > this.nRows) break;
                          addr += nRowAdjust;
                          iCell += nCellAdjust;
                      }
                  }
                  /*
                   * For a fascinating discussion of the best way to update the screen canvas at this point, see updateScreenGraphicsCGA().
                   */
                  if (xDirty < this.nCols) {
                      var cxDirty = xMaxDirty - xDirty;
                      var cyDirty = yMaxDirty - yDirty;
                      this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
                      this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
                  }
              };
              
              /**
               * inMDAIndx(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B4)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inMDAIndx = function(port, addrFrom)
              {
                  return this.inCRTCIndx(this.cardMono, port, addrFrom);
              };
              
              /**
               * outMDAIndx(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B4)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outMDAIndx = function(port, bOut, addrFrom)
              {
                  this.outCRTCIndx(this.cardMono, port, bOut, addrFrom);
              };
              
              /**
               * inMDAData(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B5)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inMDAData = function(port, addrFrom)
              {
                  return this.inCRTCData(this.cardMono, port, addrFrom);
              };
              
              /**
               * outMDAData(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B5)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outMDAData = function(port, bOut, addrFrom)
              {
                  this.outCRTCData(this.cardMono, port, bOut, addrFrom);
              };
              
              /**
               * inMDAMode(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B8)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inMDAMode = function(port, addrFrom)
              {
                  return this.inCardMode(this.cardMono, addrFrom);
              };
              
              /**
               * outMDAMode(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3B8)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outMDAMode = function(port, bOut, addrFrom)
              {
                  this.outCardMode(this.cardMono, bOut, addrFrom);
              };
              
              /**
               * inMDAStatus(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3BA)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inMDAStatus = function(port, addrFrom)
              {
                  return this.inCardStatus(this.cardMono, addrFrom);
              };
              
              /**
               * outFeat(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3BA or 0x3DA)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               *
               * NOTE: While this port also existed on the MDA and CGA, it existed only as an INPUT port, not an OUTPUT port.
               */
              Video.prototype.outFeat = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regFeat = (this.cardEGA.regFeat & ~Card.FEAT_CTRL.BITS) | (bOut & Card.FEAT_CTRL.BITS);
                  this.printMessageIO(port, bOut, addrFrom, "FEAT");
              };
              
              /**
               * inATC(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C0)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inATC = function(port, addrFrom)
              {
                  var b = this.cardEGA.fATCData? this.cardEGA.regATCData[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : this.cardEGA.regATCIndx;
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.ATC.PORT, null, addrFrom, "ATC." + (this.cardEGA.fATCData? this.cardEGA.asATCRegs[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : "INDX"), b);
                  }
                  this.cardEGA.fATCData = !this.cardEGA.fATCData;
                  return b;
              };
              
              /**
               * outATC(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C0)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outATC = function(port, bOut, addrFrom)
              {
                  var fPalEnabled = (this.cardEGA.regATCIndx & Card.ATC.INDX_PAL_ENABLE);
                  if (!this.cardEGA.fATCData) {
                      this.cardEGA.regATCIndx = bOut;
                      this.printMessageIO(port, bOut, addrFrom, "ATC.INDX");
                      this.cardEGA.fATCData = true;
                      if ((bOut & Card.ATC.INDX_PAL_ENABLE) && !fPalEnabled) {
                          if (!this.buildFonts()) {
                              if (DEBUG && (!addrFrom || this.messageEnabled())) {
                                  this.printMessage("outATC(" + str.toHexByte(bOut) + "): no font changes required");
                              }
                          } else {
                              if (DEBUG && (!addrFrom || this.messageEnabled())) {
                                  this.printMessage("outATC(" + str.toHexByte(bOut) + "): redraw screen for font changes");
                              }
                              this.updateScreen(true);
                          }
                      }
                  } else {
                      var iReg = this.cardEGA.regATCIndx & Card.ATC.INDX_MASK;
                      if (iReg >= Card.ATC.PALETTE_REGS || !fPalEnabled) {
                          if (Video.TRAPALL || this.cardEGA.regATCData[iReg] !== bOut) {
                              if (!addrFrom || this.messageEnabled()) {
                                  this.printMessageIO(port, bOut, addrFrom, "ATC." + this.cardEGA.asATCRegs[iReg]);
                              }
                              this.cardEGA.regATCData[iReg] = bOut;
                          }
                      }
                      this.cardEGA.fATCData = false;
                  }
              };
              
              /**
               * inStatus0(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C2)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inStatus0 = function(port, addrFrom)
              {
                  var bSWBit = 0;
                  if (this.nCard == Video.CARD.EGA) {
                      var iBit = 3 - ((this.cardEGA.regMisc & Card.MISC.CLOCK_SELECT) >> 2);    // this is the desired SW # (0-3)
                      bSWBit = (this.bEGASwitches & (1 << iBit)) << (Card.STATUS0.SWSENSE_SHIFT - iBit);
                  } else {
                      /*
                       * The IBM VGA ROM expects the SWSENSE bit to change according to how the DAC is programmed.
                       *
                       * At C000:0391, the ROM selects the following array at 0x0454:
                       *
                       *      db  0x12,0x12,0x12,0x10
                       *
                       * and writes the first 3 bytes to DAC register #0, and then compares SWSENSE to the 4th byte (0x10).
                       *
                       * If the 4th byte matches, then the ROM clears the BIOS "monochrome monitor" bit, and does the same
                       * thing again with 5 more arrays, expecting the 4th byte in all 5 arrays to match SWSENSE, and being
                       * very unhappy if they don't:
                       *
                       *      db	0x14,0x14,0x14,0x10
                       *      db	0x2D,0x14,0x14,0x00
                       *      db	0x14,0x2D,0x14,0x00
                       *      db	0x14,0x14,0x2D,0x00
                       *      db	0x2D,0x2D,0x2D,0x00
                       *
                       * So I ensure happiness by setting SWSENSE unless any of the three 6-bit DAC values contain 0x2D.
                       *
                       * This hard-coded behavior assumes a color monitor.  If you really want to simulate a monochrome monitor,
                       * then the 1st array (above) must mismatch, and a different set of arrays must all match:
                       *
                       *      db	0x04,0x12,0x04,0x10
                       *      db	0x1E,0x12,0x04,0x00
                       *      db	0x04,0x2D,0x04,0x00
                       *      db	0x04,0x16,0x15,0x00
                       *      db	0x00,0x00,0x00,0x10
                       *
                       * In other words, for a monochrome monitor, set SWSENSE only when DAC register #0 matches the first and last
                       * sets of values.
                       */
                      var dwDAC = this.cardEGA.regDACData[0];
                      if ((dwDAC & 0x3f) != 0x2d && (dwDAC & (0x3f << 6)) != (0x2d << 6) && (dwDAC & (0x3f << 12)) != (0x2d << 12)) {
                          bSWBit |= Card.STATUS0.SWSENSE;
                      }
                  }
                  var b = ((this.cardEGA.regStatus0 & ~Card.STATUS0.SWSENSE) | bSWBit);
                  /*
                   * TODO: Figure out where Card.STATUS0.FEAT bits should come from....
                   */
                  this.cardEGA.regStatus0 = b;
                  this.printMessageIO(Card.STATUS0.PORT, null, addrFrom, "STATUS0", b);
                  return b;
              };
              
              /**
               * @this {Video}
               * @param {number} port (0x3C2)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outMisc = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regMisc = bOut;
                  this.enableEGA();
                  this.printMessageIO(Card.MISC.PORT_WRITE, bOut, addrFrom, "MISC");
              };
              
              /**
               * inVGAEnable(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C3)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inVGAEnable = function(port, addrFrom)
              {
                  var b = this.cardEGA.regVGAEnable;
                  this.printMessageIO(Card.VGA_ENABLE.PORT, null, addrFrom, "VGA_ENABLE", b);
                  return b;
              };
              
              /**
               * outVGAEnable(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C3)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outVGAEnable = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regVGAEnable = bOut;
                  this.printMessageIO(Card.VGA_ENABLE.PORT, bOut, addrFrom, "VGA_ENABLE");
              };
              
              /**
               * inSEQIndx(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C4)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inSEQIndx = function(port, addrFrom)
              {
                  var b = this.cardEGA.regSEQIndx;
                  this.printMessageIO(Card.SEQ.INDX.PORT, null, addrFrom, "SEQ.INDX", b);
                  return b;
              };
              
              /**
               * outSEQIndx(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C4)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outSEQIndx = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regSEQIndx = bOut;
                  this.printMessageIO(Card.SEQ.INDX.PORT, bOut, addrFrom, "SEQ.INDX");
              };
              
              /**
               * inSEQData(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C5)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inSEQData = function(port, addrFrom)
              {
                  var b = this.cardEGA.regSEQData[this.cardEGA.regSEQIndx];
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.SEQ.DATA.PORT, null, addrFrom, "SEQ" + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx], b);
                  }
                  return b;
              };
              
              /**
               * outSEQData(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C5)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outSEQData = function(port, bOut, addrFrom)
              {
                  if (Video.TRAPALL || this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] !== bOut) {
                      if (!addrFrom || this.messageEnabled()) {
                          this.printMessageIO(Card.SEQ.DATA.PORT, bOut, addrFrom, "SEQ." + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx]);
                      }
                      this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] = bOut;
                  }
                  switch(this.cardEGA.regSEQIndx) {
                  case Card.SEQ.MAPMASK.INDX:
                      this.cardEGA.nWriteMapMask = Video.aEGAByteToDW[bOut & Card.SEQ.MAPMASK.MAPS];
                      break;
                  case Card.SEQ.MEMMODE.INDX:
                      this.setAccess(this.getAccess());
                      break;
                  default:
                      break;
                  }
              };
              
              /**
               * inDACMask(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C6)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inDACMask = function(port, addrFrom)
              {
                  var b = this.cardEGA.regDACMask;
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.MASK.PORT, null, addrFrom, "DAC.MASK", b);
                  }
                  return b;
              };
              
              /**
               * outDACMask(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C6)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outDACMask = function(port, bOut, addrFrom)
              {
                  if (Video.TRAPALL || this.cardEGA.regDACMask !== bOut) {
                      if (!addrFrom || this.messageEnabled()) {
                          this.printMessageIO(Card.DAC.MASK.PORT, bOut, addrFrom, "DAC.MASK");
                      }
                      this.cardEGA.regDACMask = bOut;
                  }
              };
              
              /**
               * inDACState(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C7)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inDACState = function(port, addrFrom)
              {
                  var b = this.cardEGA.regDACState;
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.STATE.PORT, null, addrFrom, "DAC.STATE", b);
                  }
                  return b;
              };
              
              /**
               * outDACRead(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C7)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outDACRead = function(port, bOut, addrFrom)
              {
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.ADDR.PORT_READ, bOut, addrFrom, "DAC.READ");
                  }
                  this.cardEGA.regDACAddr = bOut;
                  this.cardEGA.regDACState = Card.DAC.STATE.MODE_READ;
                  this.cardEGA.regDACShift = 0;
              };
              
              /**
               * outDACWrite(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C8)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outDACWrite = function(port, bOut, addrFrom)
              {
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.ADDR.PORT_WRITE, bOut, addrFrom, "DAC.WRITE");
                  }
                  this.cardEGA.regDACAddr = bOut;
                  this.cardEGA.regDACState = Card.DAC.STATE.MODE_WRITE;
                  this.cardEGA.regDACShift = 0;
              };
              
              /**
               * inDACData(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C9)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inDACData = function(port, addrFrom)
              {
                  var b = (this.cardEGA.regDACData[this.cardEGA.regDACAddr] >> this.cardEGA.regDACShift) & 0x3f;
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.DATA.PORT, null, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]", b);
                  }
                  this.cardEGA.regDACShift += 6;
                  if (this.cardEGA.regDACShift > 12) {
                      this.cardEGA.regDACShift = 0;
                      this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
                  }
                  return b;
              };
              
              /**
               * outDACData(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3C9)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outDACData = function(port, bOut, addrFrom)
              {
                  var dw = this.cardEGA.regDACData[this.cardEGA.regDACAddr];
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.DAC.DATA.PORT, bOut, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]");
                  }
                  this.cardEGA.regDACData[this.cardEGA.regDACAddr] = (dw & ~(0x3f << this.cardEGA.regDACShift)) | ((bOut & 0x3f) << this.cardEGA.regDACShift);
                  this.cardEGA.regDACShift += 6;
                  if (this.cardEGA.regDACShift > 12) {
                      this.cardEGA.regDACShift = 0;
                      this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
                  }
              };
              
              /**
               * inVGAFeat(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CA)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inVGAFeat = function(port, addrFrom)
              {
                  var b = this.cardEGA.regFeat;
                  this.printMessageIO(Card.FEAT_CTRL.PORT_READ, null, addrFrom, "FEAT", b);
                  return b;
              };
              
              /**
               * outGRCPos2(port, bOut, addrFrom)
               *
               * "The EGA was originally implemented by IBM using two Graphics Controller Chips. This register is used to program
               * the Graphics #2 chip. See the Graphics #1 Position Register for details."
               *
               * "A one should be loaded into this location to map host data bus bits 2 and 3 to display planes 2 and 3, respectively."
               *
               * @this {Video}
               * @param {number} port (0x3CA)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outGRCPos2 = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regGRCPos2 = bOut;
                  this.printMessageIO(Card.GRC.POS2_PORT, bOut, addrFrom, "GRC2");
              };
              
              /**
               * inVGAMisc(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CC)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inVGAMisc = function(port, addrFrom)
              {
                  var b = this.cardEGA.regMisc;
                  this.printMessageIO(Card.MISC.PORT_READ, null, addrFrom, "MISC", b);
                  return b;
              };
              
              /**
               * outGRCPos1(port, bOut, addrFrom)
               *
               * "The EGA was originally implemented by IBM using two Graphics Controller Chips. It was necessary to program
               * each to respond to a different set of two consecutive bits of the 8-bit host data bus. In the IBM EGA implementation,
               * a 0 must be loaded into this register. In the VGA, there is no analogous register."
               *
               * "A zero should be loaded into this location to map host data bus bits 0 and 1 to display planes 0 and 1 respectively."
               *
               * Note that this register was not readable on the EGA, and when the VGA came along, reads of this port read the Misc reg.
               *
               * @this {Video}
               * @param {number} port (0x3CC)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outGRCPos1 = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regGRCPos1 = bOut;
                  this.printMessageIO(Card.GRC.POS1_PORT, bOut, addrFrom, "GRC1");
              };
              
              /**
               * inGRCIndx(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CE)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inGRCIndx = function(port, addrFrom)
              {
                  var b = this.cardEGA.regGRCIndx;
                  this.printMessageIO(Card.GRC.INDX.PORT, null, addrFrom, "GRC.INDX", b);
                  return b;
              };
              
              /**
               * outGRCIndx(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CE)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outGRCIndx = function(port, bOut, addrFrom)
              {
                  this.cardEGA.regGRCIndx = bOut;
                  this.printMessageIO(Card.GRC.INDX.PORT, bOut, addrFrom, "GRC.INDX");
              };
              
              /**
               * inGRCData(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CF)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inGRCData = function(port, addrFrom)
              {
                  var b = this.cardEGA.regGRCData[this.cardEGA.regGRCIndx];
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(Card.GRC.DATA.PORT, null, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx], b);
                  }
                  return b;
              };
              
              /**
               * outGRCData(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3CF)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outGRCData = function(port, bOut, addrFrom)
              {
                  if (Video.TRAPALL || this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] !== bOut) {
                      if (!addrFrom || this.messageEnabled()) {
                          this.printMessageIO(Card.GRC.DATA.PORT, bOut, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx]);
                      }
                      this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] = bOut;
                  }
                  switch(this.cardEGA.regGRCIndx) {
                  case Card.GRC.SRESET.INDX:
                      this.cardEGA.nSetMapData = Video.aEGAByteToDW[bOut & 0xf];
                      this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
                      break;
                  case Card.GRC.ESRESET.INDX:
                      this.cardEGA.nSetMapMask = ~Video.aEGAByteToDW[bOut & 0xf];
                      this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
                      break;
                  case Card.GRC.COLORCMP.INDX:
                      this.cardEGA.nColorCompare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
                      break;
                  case Card.GRC.DATAROT.INDX:
                  case Card.GRC.MODE.INDX:
                      this.setAccess(this.getAccess());
                      break;
                  case Card.GRC.READMAP.INDX:
                      this.cardEGA.nReadMapShift = (bOut & Card.GRC.READMAP.NUM) << 3;
                      break;
                  case Card.GRC.MISC.INDX:
                      this.checkMode(false);
                      break;
                  case Card.GRC.COLORDC.INDX:
                      this.cardEGA.nColorDontCare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
                      break;
                  case Card.GRC.BITMASK.INDX:
                      this.cardEGA.nBitMapMask = bOut | (bOut << 8) | (bOut << 16) | (bOut << 24);
                      break;
                  default:
                      break;
                  }
              };
              
              /**
               * inCGAIndx(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D4)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inCGAIndx = function(port, addrFrom)
              {
                  return this.inCRTCIndx(this.cardColor, port, addrFrom);
              };
              
              /**
               * outCGAIndx(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D4)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCGAIndx = function(port, bOut, addrFrom)
              {
                  this.outCRTCIndx(this.cardColor, port, bOut, addrFrom);
              };
              
              /**
               * inCGAData(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D5)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inCGAData = function(port, addrFrom)
              {
                  return this.inCRTCData(this.cardColor, port, addrFrom);
              };
              
              /**
               * outCGAData(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D5)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCGAData = function(port, bOut, addrFrom)
              {
                  this.outCRTCData(this.cardColor, port, bOut, addrFrom);
              };
              
              /**
               * inCGAMode(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D8)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inCGAMode = function(port, addrFrom)
              {
                  return this.inCardMode(this.cardColor, addrFrom);
              };
              
              /**
               * outCGAMode(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D8)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCGAMode = function(port, bOut, addrFrom)
              {
                  this.outCardMode(this.cardColor, bOut, addrFrom);
              };
              
              /**
               * inCGAColor(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D9)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inCGAColor = function(port, addrFrom)
              {
                  var b = this.cardColor.regColor;
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(port /* this.cardColor.port + 5 */, null, addrFrom, this.cardColor.type + ".COLOR", b);
                  }
                  return b;
              };
              
              /**
               * outCGAColor(port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3D9)
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCGAColor = function(port, bOut, addrFrom)
              {
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(port /* this.cardColor.port + 5 */, bOut, addrFrom, this.cardColor.type + ".COLOR");
                  }
                  if (this.cardColor.regColor !== bOut) {
                      this.cardColor.regColor = bOut;
                      /*
                       * When this color register changes, it can automatically change the appearance of any number of cells, so we make
                       * a special call to initCellCache() to invalidate every cell, forcing all cells to be redrawn on the next updateScreen().
                       */
                      this.initCellCache(false);
                  }
              };
              
              /**
               * inCGAStatus(port, addrFrom)
               *
               * @this {Video}
               * @param {number} port (0x3DA)
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inCGAStatus = function(port, addrFrom)
              {
                  return this.inCardStatus(this.cardColor, addrFrom);
              };
              
              /**
               * inCRTCIndx(card, port, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} port
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inCRTCIndx = function(card, port, addrFrom)
              {
                  var b;
                  /*
                   * The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
                   * the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
                   * 0x3B? are decoded and ports 0x3D? are ignored.  We didn't used to bother ignoring them, but the
                   * VGA ROM's logic requires it, so now we also check fActive.  However, we ignore only CTRC reads;
                   * we retain any writes in case that information proves useful later.
                   *
                   * Note that returning an undefined value now signals the Bus component to return whatever default value
                   * it prefers (normally 0xff).
                   */
                  if (card.fActive) b = card.regCRTIndx;
                  this.printMessageIO(port, null, addrFrom, "CRTC.INDX", b);
                  return b;
              };
              
              /**
               * outCRTCIndx(card, port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} port
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCRTCIndx = function(card, port, bOut, addrFrom)
              {
                  card.regCRTPrev = card.regCRTIndx;
                  card.regCRTIndx = bOut & Card.CGA.CRTC.INDX.MASK;
                  this.printMessageIO(port /* card.port */, bOut, addrFrom, "CRTC.INDX");
              };
              
              /**
               * inCRTCData(card, port, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} port
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number|undefined}
               */
              Video.prototype.inCRTCData = function(card, port, addrFrom)
              {
                  var b;
                  /*
                   * The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
                   * the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
                   * 0x3B? are decoded and ports 0x3D? are ignored.  We didn't used to bother ignoring them, but the
                   * VGA ROM's logic requires it, so now we also check fActive.  However, we ignore only CTRC reads;
                   * we retain any writes in case that information proves useful later.
                   *
                   * Note that returning an undefined value now signals the Bus component to return whatever default value
                   * it prefers (normally 0xff).
                   */
                  if (card.fActive && card.regCRTIndx < card.nCRTCRegs) b = card.regCRTData[card.regCRTIndx];
                  if (!addrFrom || this.messageEnabled()) {
                      this.printMessageIO(port /* card.port + 1 */, null, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx], b);
                  }
                  return b;
              };
              
              /**
               * outCRTCData(card, port, bOut, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} port
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCRTCData = function(card, port, bOut, addrFrom)
              {
                  if (card.regCRTIndx < card.nCRTCRegs) {
                      if (Video.TRAPALL || card.regCRTData[card.regCRTIndx] !== bOut) {
                          if (!addrFrom || this.messageEnabled()) {
                              this.printMessageIO(port /* card.port + 1 */, bOut, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx]);
                          }
                          card.regCRTData[card.regCRTIndx] = bOut;
                      }
                      /*
                       * During mode changes on the EGA, all the CRTC regs are typically programmed in sequence,
                       * and if that's all that's happening with Card.CRTC.MAX_SCAN_LINE, then we don't want to treat
                       * it special; let the mode change be detected normally (eg, when the GRC regs are written later).
                       *
                       * On the other hand, if this was an out-of-sequence write to Card.CRTC.MAX_SCAN_LINE, then
                       * yes, we want to force setMode() to call setDimensions(), which is key to setting the proper
                       * number of screen rows.
                       */
                      if (card.regCRTIndx == Card.CRTC.MAX_SCAN_LINE && card.regCRTPrev != Card.CRTC.MAX_SCAN_LINE-1) {
                          this.checkMode(true);
                      }
                      this.checkCursor();
                  } else {
                      if (DEBUG && (!addrFrom || this.messageEnabled())) {
                          this.printMessage("outCRTCData(): ignoring unexpected write to CRTC[" + str.toHexByte(card.regCRTIndx) + "]: " + str.toHexByte(bOut));
                      }
                  }
              };
              
              /**
               * inCardMode(card, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inCardMode = function(card, addrFrom)
              {
                  var b = card.regMode;
                  this.printMessageIO(card.port + 4, null, addrFrom, "MODE", b);
                  return b;
              };
              
              /**
               * outCardMode(card, bOut, addrFrom)
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} bOut
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               */
              Video.prototype.outCardMode = function(card, bOut, addrFrom)
              {
                  this.printMessageIO(card.port + 4, bOut, addrFrom, "MODE");
                  card.regMode = bOut;
                  this.checkMode(false);
              };
              
              /**
               * inCardStatus(card, addrFrom)
               *
               * On an EGA, this register is called "Status Register One" (0x3BA/0x3DA aka STATUS1), to distinguish it from
               * "Status Register Zero" (0x3C2 aka STATUS0).  One of the side-effects of reading STATUS1 is that it resets the
               * ATC address/data flip-flop to "address" mode, which we emulate by setting cardEGA.fATCData to false, indicating
               * that the ATC is not in "data" mode.
               *
               * @this {Video}
               * @param {Object} card
               * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
               * @return {number}
               */
              Video.prototype.inCardStatus = function(card, addrFrom)
              {
                  var b = 0;
              
                  /*
                   * NOTE: The CGA bits CGA.STATUS.DISP_RETRACE (0x01) and CGA.STATUS.VERT_RETRACE (0x08) match the EGA definitions,
                   * and they also correspond to the MDA bits MDA.STATUS.HDRIVE (0x01) and MDA.STATUS.BWVIDEO (0x08); I'm not sure why
                   * the MDA uses different designations, but the bits appear to serve the same purpose.
                   *
                   * TODO: Decide whether this more faithful emulation of the retrace bits should be extended to the MDA/CGA, too;
                   * doing so might slow down the BIOS scroll code a bit, though.
                   */
                  var nCycles = this.cpu.getCycles();
                  var nElapsedCycles = nCycles - card.nInitCycles;
                  if (nElapsedCycles < 0) nElapsedCycles = 0;         // TODO: Determine if this ever happens
                  var nCyclesHorzRemain = nElapsedCycles % card.nCyclesHorzPeriod;
                  if (nCyclesHorzRemain > card.nCyclesHorzActive) b |= Card.CGA.STATUS.DISP_RETRACE;
                  var nCyclesVertRemain = nElapsedCycles % card.nCyclesVertPeriod;
                  if (nCyclesVertRemain > card.nCyclesVertActive) b |= Card.CGA.STATUS.VERT_RETRACE;
                  /*
                   * This is optional: the number of CPU cycles that remain in the current vertical period is all we need to keep
                   * track of (the number of cycles since the card was initialized is fine, too, but that delta can become extremely
                   * large after a while).
                   */
                  card.nInitCycles = nCycles - nCyclesVertRemain;
              
                  if (card === this.cardEGA) {
                      /*
                       * STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
                       *
                       *      MUX     Bit 5   Bit 4
                       *      ---     ----    ----
                       *      00:     Red     Blue
                       *      01:     SecBlue Green
                       *      10:     SecRed  SecGreen
                       *      11:     unused  unused
                       *
                       * Depending on where we are in the horizontal and vertical periods (which can be inferred from the
                       * same elapsed cycle count that we used to simulate the retrace bits above), we could extract 4 bits
                       * from a corresponding region of the video buffer, "and" them with Card.ATC.PLANES.MASK, use
                       * that to index into the palette registers (cardEGA.regATCData), and use the resulting palette register
                       * bits to set these diagnostics bits.  However, that's all rather tedious, and the process of extracting
                       * 4 appropriate bits from the video buffer varies depending on the video mode.
                       *
                       * Why are we even considering this?  Because the EGA BIOS diagnostic code draws a bright reverse-video
                       * line of text blocks across the top of the screen, writes 0x3F to palette register 0x0f, and then
                       * monitors the STATUS1 diagnostic bits, waiting for those palette bits to show up.  It turns out, however,
                       * that we can easily fool the EGA BIOS by simply toggling the diagnostic bits.  So we take the easy way out.
                       *
                       * TODO: Faithful emulation of these bits is certainly doable, so consider doing that at some point.
                       */
                      b |= ((card.regStatus & Card.STATUS1.DIAGNOSTIC) ^ Card.STATUS1.DIAGNOSTIC);
              
                      /*
                       * Last but not least, we must reset the EGA's ATC flip-flop whenever this register is read.
                       */
                      card.fATCData = false;
                  }
                  else {
                      /*
                       * On the MDA/CGA, to satisfy ROM BIOS testing ("TEST.10"), it's sufficient to do a simple toggle of
                       * bits 0 and 3 on every read.
                       *
                       * Also, according to http://www.seasip.info/VintagePC/mda.html, on an MDA, bits 7-4 are always ON and
                       * bits 2-1 are always OFF, hence the "OR" of 0xf0.
                       */
                      b = (card.regStatus ^= (Card.CGA.STATUS.DISP_RETRACE | Card.CGA.STATUS.VERT_RETRACE)) | 0xf0;
                  }
                  card.regStatus = b;
                  this.printMessageIO(card.port + 6, null, addrFrom, (card === this.cardEGA? "STATUS1" : "STATUS"), b);
                  return b;
              };
              
              /**
               * dumpVideo(sParm)
               *
               * @this {Video}
               * @param {string|undefined} sParm
               */
              Video.prototype.dumpVideo = function(sParm)
              {
                  if (DEBUGGER) {
                      if (!this.cardActive) {
                          this.dbg.println("no active video card");
                          return;
                      }
                      if (sParm) {
                          this.cardActive.dumpBuffer(sParm);
                          return;
                      }
                      this.dbg.println("BIOSMODE: " + str.toHexByte(this.nMode));
                      this.cardActive.dumpCard();
                  }
              };
              
              /*
               * Port input/output notification tables
               *
               * TODO: At one point, I'd added some "duplicate" entries for the MDA because, according to docs I'd read,
               * MDA ports are decoded at multiple addresses.  However, if this is important, then it should be verified
               * and implemented consistently (eg, for CGA as well).  For now, I'm decoding only the standard port addresses.
               *
               * For example, 0x3B5 is apparently also decoded at 0x3B1, 0x3B3, and 0x3B7, while 0x3B4 is also decoded at
               * 0x3B0, 0x3B2, and 0x3B6.
               */
              Video.aMDAPortInput = {
                  0x3B4: Video.prototype.inMDAIndx,           // technically, not actually readable, but I want the Debugger to be able to read this
                  0x3B5: Video.prototype.inMDAData,           // technically, the only Data registers that are readable are R14-R17
                  0x3B8: Video.prototype.inMDAMode,           // technically, not actually readable, but I want the Debugger to be able to read this
                  0x3BA: Video.prototype.inMDAStatus
              };
              
              Video.aMDAPortOutput = {
                  0x3B4: Video.prototype.outMDAIndx,
                  0x3B5: Video.prototype.outMDAData,
                  0x3B8: Video.prototype.outMDAMode
              };
              
              Video.aCGAPortInput = {
                  0x3D4: Video.prototype.inCGAIndx,           // technically, not actually readable, but I want the Debugger to be able to read this
                  0x3D5: Video.prototype.inCGAData,           // technically, the only Data registers that are readable are R14-R17
                  0x3D8: Video.prototype.inCGAMode,           // technically, not actually readable, but I want the Debugger to be able to read this
                  0x3D9: Video.prototype.inCGAColor,          // technically, not actually readable, but I want the Debugger to be able to read this
                  0x3DA: Video.prototype.inCGAStatus
              };
              
              Video.aCGAPortOutput = {
                  0x3D4: Video.prototype.outCGAIndx,
                  0x3D5: Video.prototype.outCGAData,
                  0x3D8: Video.prototype.outCGAMode,
                  0x3D9: Video.prototype.outCGAColor
              };
              
              Video.aEGAPortInput = {
                  0x3C0: Video.prototype.inATC,               // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                  0x3C1: Video.prototype.inATC,               // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                  0x3C2: Video.prototype.inStatus0,
                  0x3C4: Video.prototype.inSEQIndx,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                  0x3C5: Video.prototype.inSEQData,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                  0x3CE: Video.prototype.inGRCIndx,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                  0x3CF: Video.prototype.inGRCData            // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
              };
              
              /*
               * WARNING: Unlike the EGA, a standard VGA does not support writes to 0x3C1, but it's easier for me to leave that
               * ability in place, treating the VGA as a superset of the EGA as much as possible; will any code break because word
               * I/O to port 0x3C0 actually works?  Possibly, but highly unlikely.
               */
              Video.aEGAPortOutput = {
                  0x3BA: Video.prototype.outFeat,
                  0x3C0: Video.prototype.outATC,
                  0x3C1: Video.prototype.outATC,              // the EGA BIOS writes to this port (see C000:0416), implying that 0x3C0 and 0x3C1 both decode the same register
                  0x3C2: Video.prototype.outMisc,             // FYI, since this overlaps with STATUS0.PORT, there's currently no way for the Debugger to read the Misc register
                  0x3C4: Video.prototype.outSEQIndx,
                  0x3C5: Video.prototype.outSEQData,
                  0x3CA: Video.prototype.outGRCPos2,
                  0x3CC: Video.prototype.outGRCPos1,
                  0x3CE: Video.prototype.outGRCIndx,
                  0x3CF: Video.prototype.outGRCData,
                  0x3DA: Video.prototype.outFeat
              };
              
              Video.aVGAPortInput = {
                  0x3C3: Video.prototype.inVGAEnable,
                  0x3C6: Video.prototype.inDACMask,
                  0x3C7: Video.prototype.inDACState,
                  0x3C9: Video.prototype.inDACData,
                  0x3CA: Video.prototype.inVGAFeat,
                  0x3CC: Video.prototype.inVGAMisc
              };
              
              Video.aVGAPortOutput = {
                  0x3C3: Video.prototype.outVGAEnable,
                  0x3C6: Video.prototype.outDACMask,
                  0x3C7: Video.prototype.outDACRead,
                  0x3C8: Video.prototype.outDACWrite,
                  0x3C9: Video.prototype.outDACData
              };
              
              /**
               * Video.init()
               *
               * This function operates on every HTML element of class "video", extracting the
               * JSON-encoded parameters for the Video constructor from the element's "data-value"
               * attribute, invoking the constructor to create a Video component, and then binding
               * any associated HTML controls to the new component.
               */
              Video.init = function()
              {
                  var aeVideo = Component.getElementsByClass(window.document, PCJSCLASS, "video");
                  for (var iVideo = 0; iVideo < aeVideo.length; iVideo++) {
                      var eVideo = aeVideo[iVideo];
                      var parmsVideo = Component.getComponentParms(eVideo);
              
                      var eCanvas = window.document.createElement("canvas");
                      if (eCanvas === undefined || !eCanvas.getContext) {
                          eVideo.innerHTML = "<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";
                          return;
                      }
              
                      eCanvas.setAttribute("class", PCJSCLASS + "-canvas");
                      eCanvas.setAttribute("width", parmsVideo['screenWidth']);
                      eCanvas.setAttribute("height", parmsVideo['screenHeight']);
                      eCanvas.style.backgroundColor = parmsVideo['screenColor'];
              
                      /*
                       * The "contenteditable" attribute on a canvas element NOTICEABLY slows down canvas drawing on
                       * Safari as soon as you give the canvas focus (ie, click away from the canvas, and drawing speeds
                       * up; click on the canvas, and drawing slows down).  So the "transparent textarea hack" that we
                       * once employed as only a work-around for Android devices is now our default.
                       *
                       *      eCanvas.setAttribute("contenteditable", "true");
                       */
              
                      /*
                       * HACK: A canvas style of "auto" provides for excellent responsive canvas scaling in EVERY browser
                       * except IE9/IE10, so I recalculate the appropriate CSS height every time the parent DIV is resized;
                       * IE11 works without this hack, so we take advantage of the fact that IE11 doesn't report itself as "MSIE".
                       */
                      eCanvas.style.height = "auto";
                      if (web.getUserAgent().indexOf("MSIE") >= 0) {
                          eVideo.onresize = function(eParent, eChild, cx, cy) {
                              return function onResizeVideo() {
                                  eChild.style.height = (((eParent.clientWidth * cy) / cx) | 0) + "px";
                              };
                          }(eVideo, eCanvas, parmsVideo['screenWidth'], parmsVideo['screenHeight']);
                          eVideo.onresize();
                      }
                      eVideo.appendChild(eCanvas);
              
                      /*
                       * HACK: Android-based browsers, like the Silk (Amazon) browser and Chrome for Android, don't honor the
                       * "contenteditable" attribute; that is, when the canvas receives focus, they don't activate the on-screen
                       * keyboard.  So my fallback is to create a transparent textarea on top of the canvas.
                       *
                       * The parent DIV must have a style of "position:relative" (alternatively, a class of "pcjs-container"),
                       * so that we can position the textarea using absolute coordinates.  Also, we don't want the textarea to be
                       * visible, but we must use "opacity:0" instead of "visibility:hidden", because the latter seems to prevent
                       * the element from receiving events.  These styling requirements are taken care of in components.css
                       * (see references to the "pcjs-video-object" class).
                       *
                       * UPDATE: Unfortunately, Android keyboards like to compose whole words before transmitting any of the
                       * intervening characters; our textarea's keyDown/keyUp event handlers DO receive intervening key events,
                       * but their keyCode property is ZERO.  Virtually the only usable key event we receive is the Enter key.
                       * Android users will have to use machines that include their own on-screen "soft keyboard", or use an
                       * external keyboard.
                       *
                       * The following attempt to use a password-enabled input field didn't work any better on Android.  You could
                       * clearly see the overlaid semi-transparent input field, but none of the input characters were passed along,
                       * with the exception of the "Go" (Enter) key.
                       *
                       *      var eInput = window.document.createElement("input");
                       *      eInput.setAttribute("type", "password");
                       *      eInput.setAttribute("style", "position:absolute; left:0; top:0; width:100%; height:100%; opacity:0.5");
                       *      eVideo.appendChild(eInput);
                       *
                       * See this Chromium issue for more information: https://code.google.com/p/chromium/issues/detail?id=118639
                       */
                      var eTextArea = window.document.createElement("textarea");
              
                      /*
                       * As noted in keyboard.js, the keyboard on an iOS device pops up with the SHIFT key depressed,
                       * which is not the initial keyboard state that the Keyboard component expects.
                       */
                      if (web.isUserAgent("iOS")) {
                          eTextArea.setAttribute("autocapitalize", "off");
                          eTextArea.setAttribute("autocorrect", "off");
                      }
                      eVideo.appendChild(eTextArea);
              
                      /*
                       * Now we can create the Video object, record it, and wire it up to the associated document elements.
                       */
                      var eContext = eCanvas.getContext("2d");
                      var video = new Video(parmsVideo, eCanvas, eContext, eTextArea /* || eInput */, eVideo);
              
                      /*
                       * Bind any video-specific controls (eg, the Refresh button). There are no essential controls, however;
                       * even the "Refresh" button is just a diagnostic tool, to ensure that the screen contents are up-to-date.
                       */
                      Component.bindComponentControls(video, eVideo, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every Video module on the page.
               */
              web.onInit(Video.init);
              
              if (typeof module !== 'undefined') module.exports = Video;
              
            • x86.js
              /**
               * @fileoverview Defines PCjs x86 constants.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var X86 = {
                  /*
                   * CPU model numbers
                   */
                  MODEL_8086:     8086,
                  MODEL_8088:     8088,
                  MODEL_80186:    80186,
                  MODEL_80188:    80188,
                  MODEL_80286:    80286,
                  MODEL_80386:    80386,
              
                  /*
                   * This constant is used to mark points in the code where the physical address being returned
                   * is invalid and should not be used.  TODO: There are still functions that will use an invalid
                   * address, which is why we've tried to choose a value that causes the least harm, but ultimately,
                   * we must add checks to those functions or throw special JavaScript exceptions to bypass them.
                   *
                   * This value is also used to indicate non-existent EA address calculations, which are usually
                   * detected with "regEA === ADDR_INVALID" and "regEAWrite === ADDR_INVALID" tests.  In a 32-bit
                   * CPU, -1 (ie, 0xffffffff) could actually be a valid address, so consider changing ADDR_INVALID
                   * to NaN or null (which is also why all ADDR_INVALID tests should use strict equality operators).
                   *
                   * The main reason I'm NOT using NaN or null now is my concern that, by mixing non-numbers
                   * (specifically, values outside the range of signed 32-bit integers), performance may suffer.
                   */
                  ADDR_INVALID:   -1,
              
                  /*
                   * Processor Status flag definitions (stored in regPS)
                   */
                  PS: {
                      CF:     0x0001,     // bit 0: Carry flag
                      BIT1:   0x0002,     // bit 1: reserved, always set
                      PF:     0x0004,     // bit 2: Parity flag
                      BIT3:   0x0008,     // bit 3: reserved, always clear
                      AF:     0x0010,     // bit 4: Auxiliary Carry flag (aka Arithmetic flag)
                      BIT5:   0x0020,     // bit 5: reserved, always clear
                      ZF:     0x0040,     // bit 6: Zero flag
                      SF:     0x0080,     // bit 7: Sign flag
                      TF:     0x0100,     // bit 8: Trap flag
                      IF:     0x0200,     // bit 9: Interrupt flag
                      DF:     0x0400,     // bit 10: Direction flag
                      OF:     0x0800,     // bit 11: Overflow flag
                      IOPL: {
                       MASK:  0x3000,     // bits 12-13: I/O Privilege Level (always set on 8086/80186, clear on 80286 reset)
                       SHIFT: 12
                      },
                      NT:     0x4000,     // bit 14: Nested Task flag (always set on 8086/80186, clear on 80286 reset)
                      BIT15:  0x8000      // bit 15: reserved (always set on 8086/80186, clear otherwise)
                  },
                  CR0: {
                      /*
                       * Machine Status Word (MSW) bit definitions
                       */
                      MSW: {
                          PE:     0x0001, // protected-mode enabled
                          MP:     0x0002, // monitor processor extension (ie, coprocessor)
                          EM:     0x0004, // emulate processor extension
                          TS:     0x0008, // task switch indicator
                          ON:     0xfff0, // on the 80286, these bits are always on (TODO: Verify)
                          MASK:   0xffff  // these are the only (MSW) bits that the 80286 can access (within CR0)
                      },
                      ET: 0x00000010,     // coprocessor type (80287 or 80387); always 1 on post-80386 CPUs
                      PG: 0x80000000|0    // 0: paging disabled
                  },
                  SEL: {
                      RPL:    0x0003,     // requested privilege level (0-3)
                      LDT:    0x0004,     // table indicator (0: GDT, 1: LDT)
                      MASK:   0xfff8      // table index
                  },
                  DESC: {                 // Descriptor Table Entry
                      LIMIT: {            // LIMIT bits 0-15 (or OFFSET if this is an INTERRUPT or TRAP gate)
                          OFFSET:     0x0
                      },
                      BASE: {             // BASE bits 0-15 (or SELECTOR if this is a TASK, INTERRUPT or TRAP gate)
                          OFFSET:     0x2
                      },
                      ACC: {              // bit definitions for the access word (offset 0x4)
                          OFFSET:     0x4,
                          BASE1623:                       0x00ff,     // (not used if this a TASK, INTERRUPT or TRAP gate; bits 0-5 are parm count for CALL gates)
                          TYPE: {
                              OFFSET: 0x5,
                              MASK:                       0x1f00,
                              SEG:                        0x1000,
                              NONSEG:                     0x0f00,
                              /*
                               * The following bits apply only when SEG is set
                               */
                              CODE:                       0x0800,     // set for CODE, clear for DATA
                              ACCESSED:                   0x0100,     // set if accessed, clear if not accessed
                              READABLE:                   0x0200,     // CODE: set if readable, clear if exec-only
                              WRITABLE:                   0x0200,     // DATA: set if writable, clear if read-only
                              CONFORMING:                 0x0400,     // CODE: set if conforming, clear if not
                              EXPDOWN:                    0x0400,     // DATA: set if expand-down, clear if not
                              /*
                               * The following are all the possible (valid) types (well, except for the variations
                               * of DATA and CODE where the ACCESSED bit (0x0100) may also be set)
                               */
                              TSS:                        0x0100,
                              LDT:                        0x0200,
                              TSS_BUSY:                   0x0300,
                              GATE_CALL:                  0x0400,
                              GATE_TASK:                  0x0500,
                              GATE_INT:                   0x0600,
                              GATE_TRAP:                  0x0700,
                              DATA_READONLY:              0x1000,
                              DATA_WRITABLE:              0x1200,
                              DATA_EXPDOWN_READONLY:      0x1400,
                              DATA_EXPDOWN_WRITABLE:      0x1600,
                              CODE_EXECONLY:              0x1800,
                              CODE_READABLE:              0x1a00,
                              CODE_CONFORMING:            0x1c00,
                              CODE_CONFORMING_READABLE:   0x1e00
                          },
                          DPL: {
                              MASK:                       0x6000,
                              SHIFT:                      13
                          },
                          PRESENT:                        0x8000,
                          INVALID:    0   // use X86.DESC.ACC.INVALID for invalid ACC values
                      },
                      EXT: {              // descriptor extension word (reserved on the 80286; "must be zero")
                          OFFSET:     0x6,
                          LIMIT1619:                      0x000f,
                          AVAIL:                          0x0010,     // NOTE: set in various descriptors in OS/2
                          /*
                           * The BIG bit is known as the D bit for code segments; when set, all addresses and operands
                           * in that code segment are assumed to be 32-bit.
                           *
                           * The BIG bit is known as the B bit for data segments; when set, it indicates: 1) all pushes,
                           * pops, calls and returns use ESP instead of SP, and 2) the upper bound of an expand-down segment
                           * is 0xffffffff instead of 0xffff.
                           */
                          BIG:                            0x0040,     // clear if default operand/address size is 16-bit, set if 32-bit
                          LIMITPAGES:                     0x0080,     // clear if limit granularity is bytes, set if limit granularity is 4Kb pages
                          BASE2431:                       0xff00
                      },
                      INVALID: 0          // use X86.DESC.INVALID for invalid DESC values
                  },
                  LADDR: {                // linear address
                      PDE: {              // index of page directory entry
                          MASK:   0xffc00000|0,
                          SHIFT:  20      // (addr & DIR.MASK) >>> DIR.SHIFT yields a page directory offset (ie, index * 4)
                      },
                      PTE: {              // index of page table entry
                          MASK:   0x003ff000,
                          SHIFT:  10      // (addr & PAGE.MASK) >>> PAGE.SHIFT yields a page table offset (ie, index * 4)
                      },
                      OFFSET:     0x00000fff
                  },
                  PTE: {
                      FRAME:      0xfffff000|0,
                      DIRTY:      0x00000040,         // page has been modified
                      ACCESSED:   0x00000020,         // page has been accessed
                      USER:       0x00000004,         // set for user level (CPL 3), clear for supervisor level (CPL 0-2)
                      READWRITE:  0x00000002,         // set for read/write, clear for read-only (affects CPL 3 only)
                      PRESENT:    0x00000001          // set for present page, clear for not-present page
                  },
                  TSS: {
                      PREV_TSS:   0x00,
                      CPL0_SP:    0x02,   // start of values altered by task switches
                      CPL0_SS:    0x04,
                      CPL1_SP:    0x06,
                      CPL1_SS:    0x08,
                      CPL2_SP:    0x0a,
                      CPL2_SS:    0x0c,
                      TASK_IP:    0x0e,
                      TASK_PS:    0x10,
                      TASK_AX:    0x12,
                      TASK_CX:    0x14,
                      TASK_DX:    0x16,
                      TASK_BX:    0x18,
                      TASK_SP:    0x1a,
                      TASK_BP:    0x1c,
                      TASK_SI:    0x1e,
                      TASK_DI:    0x20,
                      TASK_ES:    0x22,
                      TASK_CS:    0x24,
                      TASK_SS:    0x26,
                      TASK_DS:    0x28,   // end of values altered by task switches
                      TASK_LDT:   0x2a
                  },
                  /*
                   * Processor Exception Interrupts
                   *
                   * Of the following exceptions, all are designed to be restartable, except for 0x08 and 0x09 (and 0x0D
                   * after an attempt to write to a read-only segment).
                   *
                   * Error codes are pushed onto the stack for 0x08 (always 0) and 0x0A through 0x0D.
                   *
                   * Priority: Instruction exception, TRAP, NMI, Processor Extension Segment Overrun, and finally INTR.
                   *
                   * All exceptions can also occur in real-mode, except where noted.  A GP_FAULT in real-mode can be triggered
                   * by "any memory reference instruction that attempts to reference [a] 16-bit word at offset 0FFFFH".
                   *
                   * Interrupts beyond 0x10 (up through 0x1F) are reserved for future exceptions.
                   *
                   * Implementation Detail: For any opcode we know must generate a UD_FAULT interrupt, we invoke opInvalid(),
                   * NOT opUndefined().  UD_FAULT is for INVALID opcodes, Intel's choice of "UD" notwithstanding.
                   *
                   * We reserve the term "undefined" for opcodes that require more investigation, and we invoke opUndefined()
                   * ONLY until an opcode's behavior has finally been defined, at which point it becomes either valid or invalid.
                   * The term "illegal" seems completely superfluous; we don't need a third way of describing invalid opcodes.
                   *
                   * The term "undocumented" should be limited to operations that are valid but Intel simply never documented.
                   */
                  EXCEPTION: {
                      DIV_ERR:    0x00,       // Divide Error Interrupt
                      TRAP:       0x01,       // Single Step (aka Trap) Interrupt
                      NMI:        0x02,       // Non-Maskable Interrupt
                      BREAKPOINT: 0x03,       // Breakpoint Interrupt
                      OVERFLOW:   0x04,       // INTO Overflow Interrupt (FYI, return address does NOT point to offending instruction)
                      BOUND_ERR:  0x05,       // BOUND Error Interrupt
                      UD_FAULT:   0x06,       // Invalid (aka Undefined or Illegal) Opcode (see implementation detail above)
                      NM_FAULT:   0x07,       // No Math Unit Available (see ESC or WAIT)
                      DF_FAULT:   0x08,       // Double Fault (see LIDT)
                      MP_FAULT:   0x09,       // Math Unit Protection Fault (see ESC)
                      TS_FAULT:   0x0A,       // Invalid Task State Segment Fault (protected-mode only)
                      NP_FAULT:   0x0B,       // Not Present Fault (protected-mode only)
                      SS_FAULT:   0x0C,       // Stack Fault (protected-mode only)
                      GP_FAULT:   0x0D,       // General Protection Fault
                      PG_FAULT:   0x0E,       // Page Fault
                      MF_FAULT:   0x10        // Math Fault (see ESC or WAIT)
                  },
                  ERRCODE: {
                      EXT:        0x0001,
                      IDT:        0x0002,
                      LDT:        0x0004,
                      MASK:       0xfff8      // index of corresponding entry in GDT, LDT or IDT
                  },
                  RESULT: {
                      /*
                       * Flags were originally computed using 16-bit result registers:
                       *
                       *      CF: resultZeroCarry & resultSize (ie, 0x100 or 0x10000)
                       *      PF: resultParitySign & 0xff
                       *      AF: (resultParitySign ^ resultAuxOverflow) & 0x0010
                       *      ZF: resultZeroCarry & (resultSize - 1)
                       *      SF: resultParitySign & (resultSize >> 1)
                       *      OF: (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
                       *
                       * I386 support requires that we now rely on 32-bit result registers:
                       *
                       *      resultDst, resultSrc, resultArith, resultLogic and resultType
                       *
                       * and flags are now computed as follows:
                       *
                       *      CF: ((resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType)
                       *      PF: (resultLogic & 0xff)
                       *      AF: ((resultArith ^ (resultDst ^ resultSrc)) & 0x0010)
                       *      ZF: (resultLogic & ((resultType - 1) | resultType))
                       *      SF: (resultLogic & resultType)
                       *      OF: (((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType)
                       *
                       * where resultType contains both a size, which must be one of BYTE (0x80), WORD (0x8000),
                       * or DWORD (0x80000000), along with bits for each of the arithmetic and/or logical flags that
                       * are currently "cached" in the result registers (eg, X86.RESULT.CF for carry, X86.RESULT.OF
                       * for overflow, etc).
                       *
                       * WARNING: Do not confuse these RESULT flag definitions with the PS flag definitions.  RESULT
                       * flags are used only as "cached" flag indicators, packed into bits 0-5 of resultType; they do
                       * not match the actual flag bit definitions within the Processor Status (PS) register.
                       *
                       * Arithmetic operations should call:
                       *
                       *      setArithResult(dst, src, value, type)
                       * eg:
                       *      setArithResult(dst, src, dst+src, X86.RESULT.BYTE | X86.RESULT.ALL)
                       *
                       * and logical operations should call:
                       *
                       *      setLogicResult(value, type [, carry [, overflow]])
                       *
                       * Since most logical operations clear both CF and OF, most calls to setLogicResult() can omit the
                       * last two optional parameters.
                       *
                       * The type parameter of these methods indicates both the size of the result (BYTE, WORD or DWORD)
                       * and which of the flags should now be considered "cached" by the result registers.  If the previous
                       * resultType specifies any flags not present in the new type parameter, then those flags are
                       * calculated and written to the appropriate regPS bit(s) *before* the result registers are updated.
                       *
                       * Arithmetic operations are assumed to represent an "added" result; if a "subtracted" result is
                       * provided instead (eg, from CMP, DEC, SUB, etc), then setArithResult() must include a 5th parameter
                       * (fSubtract); eg:
                       *
                       *      setArithResult(dst, src, dst-src, X86.RESULT.BYTE | X86.RESULT.ALL, true)
                       *
                       * TODO: Consider separating setArithResult() into two functions: setAddResult() and setSubResult().
                       */
                      BYTE:       0x80,       // result is byte value
                      WORD:       0x8000,     // result is word value
                      DWORD:      0x80000000|0,
                      TYPE:       0x80008080|0,
                      CF:         0x01,       // carry flag is cached
                      PF:         0x02,       // parity flag is cached
                      AF:         0x04,       // aux carry flag is cached
                      ZF:         0x08,       // zero flag is cached
                      SF:         0x10,       // sign flag is cached
                      OF:         0x20,       // overflow flag is cached
                      ALL:        0x3F,       // all result flags are cached
                      LOGIC:      0x1A,       // all logical flags are cached; see setLogicResult()
                      NOTCF:      0x3E        // all result flags EXCEPT carry are cached
                  },
                  /*
                   * Bit values for opFlags, which are all reset to zero prior to each instruction
                   */
                  OPFLAG: {
                      NOREAD:     0x0001,
                      NOWRITE:    0x0002,
                      NOINTR:     0x0004,     // indicates a segreg has been set, or a prefix, or an STI (delay INTR acknowledgement)
                      SEG:        0x0010,     // segment override
                      LOCK:       0x0020,     // lock prefix
                      REPZ:       0x0040,     // repeat while Z (NOTE: this value MUST match PS.ZF; see opCMPSb/opCMPSw/opSCASb/opSCASw)
                      REPNZ:      0x0080,     // repeat while NZ
                      REPEAT:     0x0100,     // indicates that an instruction is being repeated (ie, some iteration AFTER the first)
                      PUSHSP:     0x0200,     // the SP register is potentially being referenced by a PUSH SP opcode, adjustment may be required
                      DATASIZE:   0x1000,     // data size override
                      ADDRSIZE:   0x2000      // address size override
                  },
                  /*
                   * Bit values for intFlags
                   */
                  INTFLAG: {
                      NONE:       0x00,
                      INTR:       0x01,       // h/w interrupt requested
                      TRAP:       0x02,       // trap (INT 0x01) requested
                      HALT:       0x04,       // halt (HLT) requested
                      DMA:        0x08        // async DMA operation in progress
                  },
                  /*
                   * Common opcodes (and/or any opcodes we need to refer to explicitly)
                   */
                  OPCODE: {
                      ES:         0x26,       // opES()
                      CS:         0x2E,       // opCS()
                      SS:         0x36,       // opSS()
                      DS:         0x3E,       // opDS()
                      PUSHSP:     0x54,       // opPUSHSP()
                      PUSHA:      0x60,       // opPUHSA()    (80186 and up)
                      POPA:       0x61,       // opPOPA()     (80186 and up)
                      BOUND:      0x62,       // opBOUND()    (80186 and up)
                      ARPL:       0x63,       // opARPL()     (80286 and up)
                      FS:         0x64,       // opFS()       (80386 and up)
                      GS:         0x65,       // opGS()       (80386 and up)
                      OS:         0x66,       // opOS()       (80386 and up)
                      AS:         0x67,       // opAS()       (80386 and up)
                      PUSHN:      0x68,       // opPUSHn()    (80186 and up)
                      IMULN:      0x69,       // opIMULn()    (80186 and up)
                      PUSH8:      0x6A,       // opPUSH8()    (80186 and up)
                      IMUL8:      0x6B,       // opIMUL8()    (80186 and up)
                      INSB:       0x6C,       // opINSb()     (80186 and up)
                      INSW:       0x6D,       // opINSw()     (80186 and up)
                      OUTSB:      0x6E,       // opOUTSb()    (80186 and up)
                      OUTSW:      0x6F,       // opOUTSw()    (80186 and up)
                      ENTER:      0xC8,       // opENTER()    (80186 and up)
                      LEAVE:      0xC9,       // opLEAVE()    (80186 and up)
                      CALLF:      0x9A,       // opCALLF()
                      MOVSB:      0xA4,       // opMOVSb()
                      MOVSW:      0xA5,       // opMOVSw()
                      CMPSB:      0xA6,       // opCMPSb()
                      CMPSW:      0xA7,       // opCMPSw()
                      STOSB:      0xAA,       // opSTOSb()
                      STOSW:      0xAB,       // opSTOSw()
                      LODSB:      0xAC,       // opLODSb()
                      LODSW:      0xAD,       // opLODSw()
                      SCASB:      0xAE,       // opSCASb()
                      SCASW:      0xAF,       // opSCASw()
                      INT3:       0xCC,       // opINT3()
                      INTn:       0xCD,       // opINTn()
                      INTO:       0xCE,       // opINTO()
                      LOOPNZ:     0xE0,       // opLOOPNZ()
                      LOOPZ:      0xE1,       // opLOOPZ()
                      LOOP:       0xE2,       // opLOOP()
                      CALL:       0xE8,       // opCALL()
                      JMP:        0xE9,       // opJMP()      (2-byte displacement)
                      JMPF:       0xEA,       // opJMPF()
                      JMPS:       0xEB,       // opJMPs()     (1-byte displacement)
                      LOCK:       0xF0,       // opLOCK()
                      REPNZ:      0xF2,       // opREPNZ()
                      REPZ:       0xF3,       // opREPZ()
                      GRP4W:      0xFF,
                      CALLW:      0x10FF,     // GRP4W: fnCALLw()
                      CALLFDW:    0x18FF,     // GRP4W: fnCALLFdw()
                      CALLMASK:   0x38FF,     // mask 2-byte GRP4W opcodes with this before comparing to CALLW or CALLFDW
                      UD2:        0x0B0F      // UD2 (invalid opcode "guaranteed" to generate UD_FAULT on all post-8086 processors)
                  }
              };
              
              /*
               * BACKTRACK-related definitions (used only if BACKTRACK is defined)
               */
              X86.BACKTRACK = {
                  SP_LO:  0,
                  SP_HI:  0
              };
              
              /*
               * These PS flags are always stored directly in regPS for the 8086/8088, hence the
               * "direct" designation; other processors must adjust these bits accordingly.  The final
               * adjusted value is stored in PS_DIRECT.
               */
              X86.PS_DIRECT_8086 = (X86.PS.TF | X86.PS.IF | X86.PS.DF);
              
              /*
               * These are the default "always set" PS bits for the 8086/8088; other processors must
               * adjust these bits accordingly.  The final adjusted value is stored in PS_SET.
               */
              X86.PS_SET_8086 = (X86.PS.BIT1 | X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
              
              /*
               * These PS arithmetic and logical flags may be "cached" across several result registers;
               * whether or not they're currently cached depends on the RESULT bits in resultType.
               */
              X86.PS_CACHED = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF | X86.PS.OF);
              
              /*
               * PS_SAHF is a subset of the arithmetic flags, and refers only to those flags that the
               * SAHF and LAHF "8080 legacy" opcodes affect.
               */
              X86.PS_SAHF = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF);
              
              /*
               * Before we zero opFlags, we first see if any of the following PREFIX bits were set.  If any were set,
               * they are OR'ed into opPrefixes; otherwise, opPrefixes is zeroed as well.  This gives prefix-conscious
               * instructions like LODS, MOVS, STOS, CMPS, etc, a way of determining which prefixes, if any, immediately
               * preceded them.
               */
              X86.OPFLAG_PREFIXES = (X86.OPFLAG.SEG | X86.OPFLAG.LOCK | X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ | X86.OPFLAG.DATASIZE | X86.OPFLAG.ADDRSIZE);
              
              if (typeof module !== 'undefined') module.exports = X86;
              
            • x86cpu.js
              /**
               * @fileoverview Implements PCjs 8086/8088 CPU logic.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var web         = require("../../shared/lib/weblib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var Bus         = require("./bus");
                  var Memory      = require("./memory");
                  var State       = require("./state");
                  var CPU         = require("./cpu");
                  var X86         = require("./x86");
                  var X86Seg      = require("./x86seg");
              }
              
              if (!I386) {
                  /*
                   * These are the original ModRM decoders, which were simpler and faster because they could treat all
                   * word instructions as 16-bit, assume bits 15-31 of all registers were always zero, and use masking
                   * constants instead of variables.  If I386 is enabled, these decoders are not used, and the compiler
                   * will eliminate them from the compiled code.
                   */
                  if (typeof module !== 'undefined') {
                      var X86ModB     = require("./x86modb");
                      var X86ModW     = require("./x86modw");
                  }
              } else {
                  /*
                   * These are the more general-purpose ModRM decoders, required for I386 suppport.  The current addressing
                   * mode (16-bit or 32-bit) dynamically selects the appropriate byte and word decoders.
                   */
                  if (typeof module !== 'undefined') {
                      var X86ModB16   = require("./x86modb16");
                      var X86ModW16   = require("./x86modw16");
                      var X86ModB32   = require("./x86modb32");
                      var X86ModW32   = require("./x86modw32");
                      var X86ModSIB   = require("./x86modsib");
                  }
              }
              
              /**
               * X86CPU(parmsCPU)
               *
               * The X86CPU class uses the following (parmsCPU) properties:
               *
               *      model: a number (eg, 8088) that should match one of the X86.MODEL values
               *
               * This extends the CPU class and passes any remaining parmsCPU properties to the CPU class
               * constructor, along with a default speed (cycles per second) based on the specified (or default)
               * CPU model number.
               *
               * The X86CPU class was initially written to simulate a 8086/8088 microprocessor, although over time
               * it has evolved to support later microprocessors (eg, the 80186/80188 and the 80286, including
               * protected-mode support).
               *
               * This is a logical simulation, not a physical simulation, and performance is critical, second only
               * to the accuracy of the simulation when running real-world x86 software.  Consequently, it takes a
               * few liberties with the operation of the simulated hardware, especially with regard to timings,
               * little-used features, etc.  We do make an effort to maintain accurate instruction cycle counts,
               * but there are many other obstacles (eg, prefetch queue, wait states) to achieving perfect timings.
               *
               * For example, our 8237 DMA controller performs all DMA transfers immediately, since internally
               * they are all memory-to-memory, and attempting to interleave DMA cycles with instruction execution
               * cycles would hurt overall performance.  Similarly, 8254 timer counters are updated only on-demand.
               *
               * The 8237 and 8254, along with the 8259 interrupt controller and several other "chips", are combined
               * into a single ChipSet component, to keep the number of components we juggle to a minimum.
               *
               * All that being said, this does not change the overall goal: to produce as accurate a simulation as
               * possible, within the limits of what JavaScript allows and how precisely/predictably it behaves.
               *
               * @constructor
               * @extends CPU
               * @param {Object} parmsCPU
               */
              function X86CPU(parmsCPU)
              {
                  this.model = parmsCPU['model'] || X86.MODEL_8088;
              
                  var nCyclesDefault = 0;
                  switch(this.model) {
                  case X86.MODEL_8088:
                  default:
                      nCyclesDefault = 4772727;
                      break;
                  case X86.MODEL_80286:
                      nCyclesDefault = 6000000;
                      break;
                  case X86.MODEL_80386:
                      nCyclesDefault = 16000000;
                      break;
                  }
              
                  CPU.call(this, parmsCPU, nCyclesDefault);
              
                  /*
                   * Initialize processor operation to match the requested model
                   */
                  this.initProcessor();
              
                  /*
                   * List of software interrupt notification functions: aIntNotify is an array, indexed by
                   * interrupt number, of 2-element sub-arrays that, in turn, contain:
                   *
                   *      [0]: registered component
                   *      [1]: registered function to call for every software interrupt
                   *
                   * The registered function is called with the linear address (LIP) following the software interrupt;
                   * if any function returns false, the software interrupt will be skipped (presumed to be emulated),
                   * and no further notification functions will be called.
                   *
                   * NOTE: Registered functions are called only for "INT N" instructions -- NOT "INT 3" or "INTO" or the
                   * "INT 0x00" generated by a divide-by-zero or any other kind of interrupt (nor any interrupt simulated
                   * with "PUSHF/CALLF").
                   *
                   * aIntReturn is a hash of return address notifications set up by software interrupt notification
                   * functions that want to receive return notifications.  A software interrupt function must call
                   * cpu.addIntReturn(fn).
                   *
                   * WARNING: There's no mechanism in place to insure that software interrupt return notifications don't
                   * get "orphaned" if an interrupt handler bypasses the normal return path (INT 0x24 is one example of an
                   * "evil" software interrupt).
                   */
                  this.aIntNotify = [];
                  this.aIntReturn = [];
              
                  /*
                   * Since aReturnNotify is a "sparse array", this global count gives the CPU a quick way of knowing whether
                   * or not RETF or IRET instructions need to bother calling checkIntReturn().
                   */
                  this.cIntReturn = 0;
              
                  /*
                   * A variety of stepCPU() state variables that don't strictly need to be initialized before the first
                   * stepCPU() call, but it's good form to do so.
                   */
                  this.nBurstCycles = 0;
                  this.aFlags.fComplete = this.aFlags.fDebugCheck = false;
              
                  /*
                   * If there are no live registers to display, then updateStatus() can skip a bit....
                   */
                  this.cLiveRegs = 0;
              
                  /*
                   * We're just declaring aMemBlocks and associated Bus parameters here; they'll be initialized by initMemory()
                   * when the Bus is initialized.
                   */
                  this.aBusBlocks = this.aMemBlocks = [];
                  this.nBusMask = this.nMemMask = 0;
                  this.nBlockShift = this.nBlockSize = this.nBlockLimit = this.nBlockTotal = this.nBlockMask = 0;
              
                  if (SAMPLER) {
                      /*
                       * For now, we're just going to sample LIP values (well, LIP + cycle count)
                       */
                      this.nSamples = 50000;
                      this.nSampleFreq = 1000;
                      this.nSampleSkip = 0;
                      this.aSamples = new Array(this.nSamples);
                      for (var i = 0; i < this.nSamples; i++) this.aSamples[i] = -1;
                      this.iSampleNext = 0;
                      this.iSampleFreq = 0;
                      this.iSampleSkip = 0;
                  }
              
                  /*
                   * This initial resetRegs() call is important to create all the registers (eg, the X86Seg registers),
                   * so that if/when we call restore(), it will have something to fill in.
                   */
                  this.resetRegs();
              }
              
              Component.subclass(X86CPU, CPU);
              
              X86CPU.CYCLES_8088 = {
                  nWordCyclePenalty:          4,      // NOTE: accurate for the 8088/80188 only (on the 8086/80186, it applies to odd addresses only)
                  nEACyclesBase:              5,      // base or index only (BX, BP, SI or DI)
                  nEACyclesDisp:              6,      // displacement only
                  nEACyclesBaseIndex:         7,      // base + index (BP+DI and BX+SI)
                  nEACyclesBaseIndexExtra:    8,      // base + index (BP+SI and BX+DI require an extra cycle)
                  nEACyclesBaseDisp:          9,      // base or index + displacement
                  nEACyclesBaseIndexDisp:     11,     // base + index + displacement (BP+DI+n and BX+SI+n)
                  nEACyclesBaseIndexDispExtra:12,     // base + index + displacement (BP+SI+n and BX+DI+n require an extra cycle)
                  nOpCyclesAAA:               4,      // AAA, AAS, DAA, DAS, TEST acc,imm
                  nOpCyclesAAD:               60,
                  nOpCyclesAAM:               83,
                  nOpCyclesArithRR:           3,      // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP reg,reg cycle time
                  nOpCyclesArithRM:           9,      // ADC, ADD, AND, OR, SBB, SUB, and XOR reg,mem (and CMP mem,reg) cycle time
                  nOpCyclesArithMR:           16,     // ADC, ADD, AND, OR, SBB, SUB, and XOR mem,reg cycle time
                  nOpCyclesArithMID:          1,      // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP mem,imm cycle delta
                  nOpCyclesCall:              19,
                  nOpCyclesCallF:             28,
                  nOpCyclesCallWR:            16,
                  nOpCyclesCallWM:            21,
                  nOpCyclesCallDM:            37,
                  nOpCyclesCLI:               2,
                  nOpCyclesCompareRM:         9,      // CMP reg,mem cycle time (same as nOpCyclesArithRM on an 8086 but not on a 80286)
                  nOpCyclesCWD:               5,
                  nOpCyclesBound:             33,     // N/A if 8086/8088, 33-35 if 80186/80188 (TODO: Determine what the range means for an 80186/80188)
                  nOpCyclesInP:               10,
                  nOpCyclesInDX:              8,
                  nOpCyclesIncR:              3,      // INC reg, DEC reg
                  nOpCyclesIncM:              15,     // INC mem, DEC mem
                  nOpCyclesInt:               51,
                  nOpCyclesInt3D:             1,
                  nOpCyclesIntOD:             2,
                  nOpCyclesIntOFall:          4,
                  nOpCyclesIRet:              32,
                  nOpCyclesJmp:               15,
                  nOpCyclesJmpF:              15,
                  nOpCyclesJmpC:              16,
                  nOpCyclesJmpCFall:          4,
                  nOpCyclesJmpWR:             11,
                  nOpCyclesJmpWM:             18,
                  nOpCyclesJmpDM:             24,
                  nOpCyclesLAHF:              4,      // LAHF, SAHF, MOV reg,imm
                  nOpCyclesLEA:               2,
                  nOpCyclesLS:                16,     // LDS, LES
                  nOpCyclesLoop:              17,     // LOOP, LOOPNZ
                  nOpCyclesLoopZ:             18,     // LOOPZ, JCXZ
                  nOpCyclesLoopNZ:            19,     // LOOPNZ
                  nOpCyclesLoopFall:          5,      // LOOP
                  nOpCyclesLoopZFall:         6,      // LOOPZ, JCXZ
                  nOpCyclesMovRR:             2,
                  nOpCyclesMovRM:             8,
                  nOpCyclesMovMR:             9,
                  nOpCyclesMovRI:             10,
                  nOpCyclesMovMI:             10,
                  nOpCyclesMovAM:             10,
                  nOpCyclesMovMA:             10,
                  nOpCyclesDivBR:             80,     // range of 80-90
                  nOpCyclesDivWR:             144,    // range of 144-162
                  nOpCyclesDivBM:             86,     // range of 86-96
                  nOpCyclesDivWM:             154,    // range of 154-172
                  nOpCyclesIDivBR:            101,    // range of 101-112
                  nOpCyclesIDivWR:            165,    // range of 165-184
                  nOpCyclesIDivBM:            107,    // range of 107-118
                  nOpCyclesIDivWM:            171,    // range of 171-190
                  nOpCyclesMulBR:             70,     // range of 70-77
                  nOpCyclesMulWR:             113,    // range of 113-118
                  nOpCyclesMulBM:             76,     // range of 76-83
                  nOpCyclesMulWM:             124,    // range of 124-139
                  nOpCyclesIMulBR:            80,     // range of 80-98
                  nOpCyclesIMulWR:            128,    // range of 128-154
                  nOpCyclesIMulBM:            86,     // range of 86-104
                  nOpCyclesIMulWM:            134,    // range of 134-160
                  nOpCyclesNegR:              3,      // NEG reg, NOT reg
                  nOpCyclesNegM:              16,     // NEG mem, NOT mem
                  nOpCyclesOutP:              10,
                  nOpCyclesOutDX:             8,
                  nOpCyclesPopAll:            51,     // N/A if 8086/8088, 51 if 80186, 83 if 80188 (TODO: Verify)
                  nOpCyclesPopReg:            8,
                  nOpCyclesPopMem:            17,
                  nOpCyclesPushAll:           36,     // N/A if 8086/8088, 36 if 80186, 68 if 80188 (TODO: Verify)
                  nOpCyclesPushReg:           11,     // NOTE: "The 8086 Book" claims this is 10, but it's an outlier....
                  nOpCyclesPushMem:           16,
                  nOpCyclesPushSeg:           10,
                  nOpCyclesPrefix:            2,
                  nOpCyclesCmpS:              18,
                  nOpCyclesCmpSr0:            9-2,    // reduced by nOpCyclesPrefix
                  nOpCyclesCmpSrn:            17-2,   // reduced by nOpCyclesPrefix
                  nOpCyclesLodS:              12,
                  nOpCyclesLodSr0:            9-2,    // reduced by nOpCyclesPrefix
                  nOpCyclesLodSrn:            13-2,   // reduced by nOpCyclesPrefix
                  nOpCyclesMovS:              18,
                  nOpCyclesMovSr0:            9-2,    // reduced by nOpCyclesPrefix
                  nOpCyclesMovSrn:            17-2,   // reduced by nOpCyclesPrefix
                  nOpCyclesScaS:              15,
                  nOpCyclesScaSr0:            9-2,    // reduced by nOpCyclesPrefix
                  nOpCyclesScaSrn:            15-2,   // reduced by nOpCyclesPrefix
                  nOpCyclesStoS:              11,
                  nOpCyclesStoSr0:            9-2,    // reduced by nOpCyclesPrefix
                  nOpCyclesStoSrn:            10-2,   // reduced by nOpCyclesPrefix
                  nOpCyclesRet:               8,
                  nOpCyclesRetn:              12,
                  nOpCyclesRetF:              18,
                  nOpCyclesRetFn:             17,
                  nOpCyclesShift1M:           15,     // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,1
                  nOpCyclesShiftCR:           8,      // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,CL
                  nOpCyclesShiftCM:           20,     // ROL/ROR/RCL/RCR/SHL/SHR/SAR mem,CL
                  nOpCyclesShiftCS:           2,      // this is the left-shift value used to convert the count to the cycle cost
                  nOpCyclesTestRR:            3,
                  nOpCyclesTestRM:            9,
                  nOpCyclesTestRI:            5,
                  nOpCyclesTestMI:            11,
                  nOpCyclesXchgRR:            4,
                  nOpCyclesXchgRM:            17,
                  nOpCyclesXLAT:              11
              };
              
              X86CPU.CYCLES_80286 = {
                  nWordCyclePenalty:          0,
                  nEACyclesBase:              0,
                  nEACyclesDisp:              0,
                  nEACyclesBaseIndex:         0,
                  nEACyclesBaseIndexExtra:    0,
                  nEACyclesBaseDisp:          0,
                  nEACyclesBaseIndexDisp:     1,
                  nEACyclesBaseIndexDispExtra:1,
                  nOpCyclesAAA:               3,
                  nOpCyclesAAD:               14,
                  nOpCyclesAAM:               16,
                  nOpCyclesArithRR:           2,
                  nOpCyclesArithRM:           7,
                  nOpCyclesArithMR:           7,
                  nOpCyclesArithMID:          0,
                  nOpCyclesCall:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallF:             13,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallWR:            7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallWM:            11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallDM:            16,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCLI:               3,
                  nOpCyclesCompareRM:         6,
                  nOpCyclesCWD:               2,
                  nOpCyclesBound:             13,
                  nOpCyclesInP:               5,
                  nOpCyclesInDX:              5,
                  nOpCyclesIncR:              2,
                  nOpCyclesIncM:              7,
                  nOpCyclesInt:               23,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesInt3D:             0,
                  nOpCyclesIntOD:             1,
                  nOpCyclesIntOFall:          3,
                  nOpCyclesIRet:              17,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmp:               7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpF:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpC:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpCFall:          3,
                  nOpCyclesJmpWR:             7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpWM:             11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpDM:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLAHF:              2,
                  nOpCyclesLEA:               3,
                  nOpCyclesLS:                7,
                  nOpCyclesLoop:              8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopZ:             8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopNZ:            8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopFall:          4,
                  nOpCyclesLoopZFall:         4,
                  nOpCyclesMovRR:             2,      // this is actually the same as the 8086...
                  nOpCyclesMovRM:             3,
                  nOpCyclesMovMR:             5,
                  nOpCyclesMovRI:             2,
                  nOpCyclesMovMI:             3,
                  nOpCyclesMovAM:             5,      // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
                  nOpCyclesMovMA:             3,
                  nOpCyclesDivBR:             14,
                  nOpCyclesDivWR:             22,
                  nOpCyclesDivBM:             17,
                  nOpCyclesDivWM:             25,
                  nOpCyclesIDivBR:            17,
                  nOpCyclesIDivWR:            25,
                  nOpCyclesIDivBM:            20,
                  nOpCyclesIDivWM:            28,
                  nOpCyclesMulBR:             13,
                  nOpCyclesMulWR:             21,
                  nOpCyclesMulBM:             16,
                  nOpCyclesMulWM:             24,
                  nOpCyclesIMulBR:            13,
                  nOpCyclesIMulWR:            21,
                  nOpCyclesIMulBM:            16,
                  nOpCyclesIMulWM:            24,
                  nOpCyclesNegR:              2,
                  nOpCyclesNegM:              7,
                  nOpCyclesOutP:              5,
                  nOpCyclesOutDX:             5,
                  nOpCyclesPopAll:            19,
                  nOpCyclesPopReg:            5,
                  nOpCyclesPopMem:            5,
                  nOpCyclesPushAll:           17,
                  nOpCyclesPushReg:           3,
                  nOpCyclesPushMem:           5,
                  nOpCyclesPushSeg:           3,
                  nOpCyclesPrefix:            0,
                  nOpCyclesCmpS:              8,
                  nOpCyclesCmpSr0:            5,
                  nOpCyclesCmpSrn:            9,
                  nOpCyclesLodS:              5,
                  nOpCyclesLodSr0:            5,
                  nOpCyclesLodSrn:            4,
                  nOpCyclesMovS:              5,
                  nOpCyclesMovSr0:            5,
                  nOpCyclesMovSrn:            4,
                  nOpCyclesScaS:              7,
                  nOpCyclesScaSr0:            5,
                  nOpCyclesScaSrn:            8,
                  nOpCyclesStoS:              3,
                  nOpCyclesStoSr0:            4,
                  nOpCyclesStoSrn:            3,
                  nOpCyclesRet:               11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetn:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetF:              15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetFn:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesShift1M:           7,
                  nOpCyclesShiftCR:           5,
                  nOpCyclesShiftCM:           8,
                  nOpCyclesShiftCS:           0,
                  nOpCyclesTestRR:            2,
                  nOpCyclesTestRM:            6,
                  nOpCyclesTestRI:            3,
                  nOpCyclesTestMI:            6,
                  nOpCyclesXchgRR:            3,
                  nOpCyclesXchgRM:            5,
                  nOpCyclesXLAT:              5
              };
              
              /*
               * TODO: Except for the cycle counts at the end of this table (ie, those marked "unique to the 80386"), all these
               * values were simply copied from the 80286 table and still need to be modified and verified.
               */
              X86CPU.CYCLES_80386 = {
                  nWordCyclePenalty:          0,
                  nEACyclesBase:              0,
                  nEACyclesDisp:              0,
                  nEACyclesBaseIndex:         0,
                  nEACyclesBaseIndexExtra:    0,
                  nEACyclesBaseDisp:          0,
                  nEACyclesBaseIndexDisp:     1,
                  nEACyclesBaseIndexDispExtra:1,
                  nOpCyclesAAA:               3,
                  nOpCyclesAAD:               14,
                  nOpCyclesAAM:               16,
                  nOpCyclesArithRR:           2,
                  nOpCyclesArithRM:           7,
                  nOpCyclesArithMR:           7,
                  nOpCyclesArithMID:          0,
                  nOpCyclesCall:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallF:             13,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallWR:            7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallWM:            11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCallDM:            16,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesCLI:               3,
                  nOpCyclesCompareRM:         6,
                  nOpCyclesCWD:               2,
                  nOpCyclesBound:             13,
                  nOpCyclesInP:               5,
                  nOpCyclesInDX:              5,
                  nOpCyclesIncR:              2,
                  nOpCyclesIncM:              7,
                  nOpCyclesInt:               23,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesInt3D:             0,
                  nOpCyclesIntOD:             1,
                  nOpCyclesIntOFall:          3,
                  nOpCyclesIRet:              17,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmp:               7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpF:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpC:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpCFall:          3,
                  nOpCyclesJmpWR:             7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpWM:             11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesJmpDM:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLAHF:              2,
                  nOpCyclesLEA:               3,
                  nOpCyclesLS:                7,
                  nOpCyclesLoop:              8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopZ:             8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopNZ:            8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesLoopFall:          4,
                  nOpCyclesLoopZFall:         4,
                  nOpCyclesMovRR:             2,      // this is actually the same as the 8086...
                  nOpCyclesMovRM:             3,
                  nOpCyclesMovMR:             5,
                  nOpCyclesMovRI:             2,
                  nOpCyclesMovMI:             3,
                  nOpCyclesMovAM:             5,      // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
                  nOpCyclesMovMA:             3,
                  nOpCyclesDivBR:             14,
                  nOpCyclesDivWR:             22,
                  nOpCyclesDivBM:             17,
                  nOpCyclesDivWM:             25,
                  nOpCyclesIDivBR:            17,
                  nOpCyclesIDivWR:            25,
                  nOpCyclesIDivBM:            20,
                  nOpCyclesIDivWM:            28,
                  nOpCyclesMulBR:             13,
                  nOpCyclesMulWR:             21,
                  nOpCyclesMulBM:             16,
                  nOpCyclesMulWM:             24,
                  nOpCyclesIMulBR:            13,
                  nOpCyclesIMulWR:            21,
                  nOpCyclesIMulBM:            16,
                  nOpCyclesIMulWM:            24,
                  nOpCyclesNegR:              2,
                  nOpCyclesNegM:              7,
                  nOpCyclesOutP:              5,
                  nOpCyclesOutDX:             5,
                  nOpCyclesPopAll:            19,
                  nOpCyclesPopReg:            5,
                  nOpCyclesPopMem:            5,
                  nOpCyclesPushAll:           17,
                  nOpCyclesPushReg:           3,
                  nOpCyclesPushMem:           5,
                  nOpCyclesPushSeg:           3,
                  nOpCyclesPrefix:            0,
                  nOpCyclesCmpS:              8,
                  nOpCyclesCmpSr0:            5,
                  nOpCyclesCmpSrn:            9,
                  nOpCyclesLodS:              5,
                  nOpCyclesLodSr0:            5,
                  nOpCyclesLodSrn:            4,
                  nOpCyclesMovS:              5,
                  nOpCyclesMovSr0:            5,
                  nOpCyclesMovSrn:            4,
                  nOpCyclesScaS:              7,
                  nOpCyclesScaSr0:            5,
                  nOpCyclesScaSrn:            8,
                  nOpCyclesStoS:              3,
                  nOpCyclesStoSr0:            4,
                  nOpCyclesStoSrn:            3,
                  nOpCyclesRet:               11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetn:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetF:              15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesRetFn:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                  nOpCyclesShift1M:           7,
                  nOpCyclesShiftCR:           5,
                  nOpCyclesShiftCM:           8,
                  nOpCyclesShiftCS:           0,
                  nOpCyclesTestRR:            2,
                  nOpCyclesTestRM:            6,
                  nOpCyclesTestRI:            3,
                  nOpCyclesTestMI:            6,
                  nOpCyclesXchgRR:            3,
                  nOpCyclesXchgRM:            5,
                  nOpCyclesXLAT:              5,
                  /*
                   * Cycle counts unique to the 80386
                   */
                  nOpCyclesBitScan:           11,
                  nOpCyclesBitSetR:           6,
                  nOpCyclesBitSetM:           8,
                  nOpCyclesBitSetMExtra:      5,      // extra cycle cost for non-immediate BTC/BTR/BTS opcodes
                  nOpCyclesBitTestR:          3,
                  nOpCyclesBitTestM:          6,
                  nOpCyclesBitTestMExtra:     6,      // extra cycle cost for non-immediate BT opcode
                  nOpCyclesIMulR:             9,
                  nOpCyclesIMulM:             12,
                  nOpCyclesMovXR:             3,
                  nOpCyclesMovXM:             6,
                  nOpCyclesSetR:              4,
                  nOpCyclesSetM:              5,
                  nOpCyclesShiftDR:           3,
                  nOpCyclesShiftDM:           7
              };
              
              /**
               * Memory Simulation Notes
               *
               * Memory accesses are currently hard-coded to simulate 8088 characteristics.
               * For example, every 16-bit memory access is assumed to require an additional 4 cycles
               * for the upper byte; on an 8086, that would be true only when the memory address was odd.
               *
               * Similarly, the effective prefetch queue size is 4 bytes (same as an 8088), although
               * that can easily be changed to 6 bytes if/when we decide to fully implement 8086 support
               * (see X86CPU.PREFETCH.QUEUE).  It's just not clear whether that support will be a goal.
               */
              X86CPU.PREFETCH = {
                  QUEUE:      4,
                  ARRAY:      8,              // smallest power-of-two > PREFETCH.QUEUE
                  MASK:       0x7             // (X86CPU.PREFETCH.ARRAY - 1)
              };
              
              /**
               * initMemory(aMemBlocks, nBlockShift)
               *
               * Notification from Bus.initMemory(), giving us direct access to the entire memory space
               * (aMemBlocks).
               *
               * We also initialize an instruction byte prefetch queue, aPrefetch, which is an N-element
               * array with slots that look like:
               *
               *      0:  [tag, b]    <-- iPrefetchTail
               *      1:  [tag, b]
               *      2:  [ -1, 0]    <-- iPrefetchHead  (eg, when cbPrefetchQueued == 2)
               *      ...
               *      7:  [ -1, 0]
               *
               * where tag is the linear address of the byte that's been prefetched, and b is the
               * value of the byte.  N is currently 8 (PREFETCH.ARRAY), but it can be any power-of-two
               * that is equal to or greater than (PREFETCH.QUEUE), the effective size of the prefetch
               * queue (6 on an 8086, 4 on an 8088; currently hard-coded to the latter).  All slots
               * are initialized to [-1, 0] when preallocating the prefetch queue, but those initial
               * values are quickly overwritten and never seen again.
               *
               * iPrefetchTail is the index (0-7) of the next prefetched byte to be returned to the CPU,
               * and iPrefetchHead is the index (0-7) of the next slot to be filled.  The prefetch queue
               * is empty IFF the two indexes are equal and IFF cbPrefetchQueued is zero. cbPrefetchQueued
               * is simply the number of bytes between the tail and the head (from 0 to PREFETCH.QUEUE).
               *
               * cbPrefetchValid indicates how many bytes behind iPrefetchHead are still valid, allowing us
               * to "rewind" the tail up to that many bytes.  For example, let's imagine that we prefetched
               * 2 bytes, and then we immediately consumed both bytes, leaving iPrefetchTail == iPrefetchHead
               * again; however, those previous 2 bytes are still valid, and if, for example, we wanted to
               * rewind the IP by 2 (which we might want to do in the case of a repeated string instruction),
               * we could rewind the prefetch queue tail as well.
               *
               * Corresponding to iPrefetchHead is addrPrefetchHead; both are incremented in lock-step.
               * Whenever the prefetch queue is flushed, it's typically because a new, non-incremental
               * regLIP has been set, so flushPrefetch() expects to receive that address.
               *
               * If the prefetch queue does not contain any (or enough) bytes to satisfy a getBytePrefetch()
               * or getShortPrefetch() request, we force the queue to be filled with the necessary number
               * of bytes first.
               *
               * @this {X86CPU}
               * @param {Array} aMemBlocks
               * @param {number} nBlockShift
               */
              X86CPU.prototype.initMemory = function(aMemBlocks, nBlockShift)
              {
                  /*
                   * aBusBlocks preserves the Bus block array for the life of the machine, whereas aMemBlocks
                   * will be altered if/when the CPU enables paging.  PAGEBLOCKS must be true when using Memory
                   * blocks to simulate paging, ensuring that physical blocks and pages have the same size (4Kb).
                   */
                  this.aBusBlocks = aMemBlocks;
                  this.aMemBlocks = aMemBlocks;
                  this.nBlockShift = nBlockShift;
                  this.nBlockSize = 1 << this.nBlockShift;
                  this.nBlockLimit = this.nBlockSize - 1;
                  this.nBlockTotal = aMemBlocks.length;
                  this.nBlockMask = this.nBlockTotal - 1;
                  if (PREFETCH) {
                      this.nBusCycles = 0;
                      this.aPrefetch = new Array(X86CPU.PREFETCH.ARRAY);
                      for (var i = 0; i < X86CPU.PREFETCH.ARRAY; i++) {
                          this.aPrefetch[i] = 0;
                      }
                      this.flushPrefetch(0);
                  }
              };
              
              /**
               * setAddressMask(nBusMask)
               *
               * Notification from Bus.initMemory() and Bus.setA20(); the latter calls us whenever the physical
               * A20 line changes (note that on a 20-bit bus machine, address lines A20 and higher are always zero).
               *
               * For 32-bit bus machines (eg, 80386), nBusMask is never changed after the initial call, because A20
               * wrap-around is simulated by changing the physical memory map rather than altering the A20 bit in nBusMask.
               *
               * We maintain nMemMask separate from nBusMask, because when paging is enabled on the 80386, the CPU memory
               * functions are now dealing with linear addresses rather than physical addresses, so it would be incorrect
               * to apply nBusMask to those addresses; nMemMask must remain 0xffffffff (-1) for the duration.  If we change
               * how A20 is simulated on the 80386, then enablePageBlocks() and disablePageBlocks() will need to override
               * nMemMask appropriately.
               *
               * TODO: Ideally, we would eliminate masking altogether of 32-bit addresses, but that would require different
               * sets of memory access functions for different machines (ie, those with 20-bit or 24-bit buses).
               *
               * @this {X86CPU}
               * @param {number} nBusMask
               */
              X86CPU.prototype.setAddressMask = function(nBusMask)
              {
                  this.nBusMask = this.nMemMask = nBusMask;
              };
              
              /**
               * enablePageBlocks()
               *
               * Whenever the CPU turns on paging and/or updates CR3, this function is called to update our copy
               * of the Bus block array, to simulate paging.  Whenever the CPU turns paging off, disablePageBlocks()
               * must be called to restore our copy of the Bus block array to its original (physical) mapping.
               *
               * This also requires PAGEBLOCKS be enabled, ensuring that the Bus is configured with a 4Kb block size.
               *
               * The first time this function is called, aMemBlocks and aBusBlocks are identical, so aMemBlocks is
               * reinitialized with special UNPAGED Memory blocks that know how to perform page directory/page table
               * lookup and replace themselves with special PAGED Memory blocks that reference memory from the
               * appropriate block in aBusBlocks.  A parallel array, aBlocksPaged, keeps track (by block number) of
               * which blocks have been PAGED, so that whenever CR3 is updated, those blocks can be quickly UNPAGED.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.enablePageBlocks = function()
              {
                  if (!PAGEBLOCKS) {
                      this.setError("PAGEBLOCK support required");
                      return;
                  }
                  if (this.aMemBlocks === this.aBusBlocks) {
                      this.aMemBlocks = new Array(this.nBlockTotal);
                      this.blockUnpaged = new Memory(null, 0, 0, Memory.TYPE.UNPAGED, null, this);
                      for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                          this.aMemBlocks[iBlock] = this.blockUnpaged;
                      }
                  } else {
                      for (var i = 0; i < this.aBlocksPaged.length; i++) {
                          this.aMemBlocks[this.aBlocksPaged[i]] = this.blockUnpaged;
                      }
                  }
                  this.aBlocksPaged = [];
              };
              
              /**
               * mapPageBlock(addr, fWrite)
               *
               * Locate the corresponding physical PDE, PTE and memory blocks for the given linear address, and then
               * upgrade the block from an UNPAGED Memory block to a new PAGED Memory block; all future accesses to
               * the current page will go directly to that block, instead of coming here through the UNPAGED block
               * handlers.
               *
               * Note that since the incoming address (addr) is a linear address, we never need to mask it with nBusMask,
               * but all the intermediate (PDE, PTE) and final physical addresses we calculate should still be masked.
               *
               * Granted, nBusMask on a 32-bit bus is generally going to be 0xffffffff (-1), so making might seem like
               * a waste of time; however, if we decide to once again rely on nBusMask for emulating A20 wrap-around
               * (instead of changing the physical memory map to alias the 2nd Mb to the 1st Mb), then performing
               * consistent masking will be important.
               *
               * Also, addrPDE, addrPTE and addrPhys do not need any offsets added to them, because we immediately shift
               * the offset portion of those addresses out.  But for now, at least for debugging and documentation purposes,
               * my preference is to perform full address calculations.
               *
               * Besides, this should not be a performance-critical function; it's normally called only once per UNPAGED
               * page.  Obviously, if CR3 is constantly being updated, that will trigger repeated calls to enablePageBlocks(),
               * which will perform our equivalent of a TLB flush (ie, resetting all PAGED blocks back to UNPAGED blocks).
               * That would hurt our performance, but it would hurt performance on a real machine as well, so let's see
               * what real-world scenarios we run into.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @param {boolean} fWrite (true if called for a write, false if for a read)
               * @param {boolean} [fSuppress] (true if any faults, remapping, etc should be suppressed)
               * @return {Memory|null}
               */
              X86CPU.prototype.mapPageBlock = function(addr, fWrite, fSuppress)
              {
                  var offPDE = (addr & X86.LADDR.PDE.MASK) >>> X86.LADDR.PDE.SHIFT;
                  var addrPDE = this.regCR3 + offPDE;
              
                  /*
                   * bus.getLong(addrPDE) would be simpler, but setPhysBlock() needs to know blockPDE and offPDE, too.
                   * TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPDE.
                   */
                  var blockPDE = this.aBusBlocks[(addrPDE & this.nBusMask) >>> this.nBlockShift];
                  var pde = blockPDE.readLong(offPDE);
              
                  if (!(pde & X86.PTE.PRESENT)) {
                      if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
                      return null;
                  }
              
                  if (!(pde & X86.PTE.USER) && this.segCS.cpl == 3) {
                      if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
                      return null;
                  }
              
                  var offPTE = (addr & X86.LADDR.PTE.MASK) >>> X86.LADDR.PTE.SHIFT;
                  var addrPTE = (pde & X86.PTE.FRAME) + offPTE;
              
                  /*
                   * bus.getLong(addrPTE) would be simpler, but setPhysBlock() needs to know blockPTE and offPTE, too.
                   * TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPTE.
                   */
                  var blockPTE = this.aBusBlocks[(addrPTE & this.nBusMask) >>> this.nBlockShift];
                  var pte = blockPTE.readLong(offPTE);
              
                  if (!(pte & X86.PTE.PRESENT) && !fSuppress) {
                      if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
                      return null;
                  }
              
                  if (!(pte & X86.PTE.USER) && this.segCS.cpl == 3) {
                      if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
                      return null;
                  }
              
                  var addrPhys = (pte & X86.PTE.FRAME) + (addr & X86.LADDR.OFFSET);
                  /*
                   * TODO: Since we're immediately shifting addrPhys by nBlockShift, we could also skip adding the addr's offset.
                   */
                  var blockPhys = this.aBusBlocks[(addrPhys & this.nBusMask) >>> this.nBlockShift];
                  if (fSuppress) return blockPhys;
              
                  /*
                   * So we have the block containing the physical memory corresponding to the given linear address.
                   *
                   * Now we can create a new PAGED Memory block and record the physical block info using setPhysBlock().
                   */
                  var addrPage = addr & ~X86.LADDR.OFFSET;
                  var blockPage = new Memory(addrPage, 0, 0, Memory.TYPE.PAGED);
                  blockPage.setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE);
              
                  var iBlock = addr >>> this.nBlockShift;
                  this.aMemBlocks[iBlock] = blockPage;
                  this.aBlocksPaged.push(iBlock);
                  return blockPage;
              };
              
              /**
               * disablePageBlocks()
               *
               * Whenever the CPU turns off paging, this function restores the CPU's original aMemBlocks.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.disablePageBlocks = function()
              {
                  if (this.aMemBlocks != this.aBusBlocks) {
                      this.aMemBlocks = this.aBusBlocks;
                      this.blockUnpaged = null;
                      this.aBlocksPaged = null;
                  }
              };
              
              /**
               * initProcessor()
               *
               * This isolates 80186/80188/80286/80386 support, so that it can be selectively enabled/tested.
               *
               * Here's a summary of 80186/80188 differences according to "AP-186: Introduction to the 80186
               * Microprocessor, March 1983" (pp.55-56).  "The iAPX 86,88 and iAPX 186,188 User's Manual Programmer's
               * Reference", p.3-38, apparently contains the same information, but I've not seen that document.
               *
               * Undefined [Invalid] Opcodes:
               *
               *      When the opcodes 63H, 64H, 65H, 66H, 67H, F1H, FEH/xx111xxxB and FFH/xx111xxxB are executed,
               *      the 80186 will execute an illegal [invalid] instruction exception, interrupt 0x06.
               *      The 8086 will ignore the opcode.
               *
               * 0FH opcode:
               *
               *      When the opcode 0FH is encountered, the 8086 will execute a POP CS, while the 80186 will
               *      execute an illegal [invalid] instruction exception, interrupt 0x06.
               *
               * Word Write at Offset FFFFH:
               *
               *      When a word write is performed at offset FFFFH in a segment, the 8086 will write one byte
               *      at offset FFFFH, and the other at offset 0, while the 80186 will write one byte at offset
               *      FFFFH, and the other at offset 10000H (one byte beyond the end of the segment). One byte segment
               *      underflow will also occur (on the 80186) if a stack PUSH is executed and the Stack Pointer
               *      contains the value 1.
               *
               * Shift/Rotate by Value Greater Then [sic] 31:
               *
               *      Before the 80186 performs a shift or rotate by a value (either in the CL register, or by an
               *      immediate value) it ANDs the value with 1FH, limiting the number of bits rotated to less than 32.
               *      The 8086 does not do this.
               *
               * LOCK prefix:
               *
               *      The 8086 activates its LOCK signal immediately after executing the LOCK prefix. The 80186 does
               *      not activate the LOCK signal until the processor is ready to begin the data cycles associated
               *      with the LOCKed instruction.
               *
               * Interrupted String Move Instructions:
               *
               *      If an 8086 is interrupted during the execution of a repeated string move instruction, the return
               *      value it will push on the stack will point to the last prefix instruction before the string move
               *      instruction. If the instruction had more than one prefix (e.g., a segment override prefix in
               *      addition to the repeat prefix), it will not be re-executed upon returning from the interrupt.
               *      The 80186 will push the value of the first prefix to the repeated instruction, so long as prefixes
               *      are not repeated, allowing the string instruction to properly resume.
               *
               * Conditions causing divide error with an integer divide:
               *
               *      The 8086 will cause a divide error whenever the absolute value of the quotient is greater then
               *      [sic] 7FFFH (for word operations) or if the absolute value of the quotient is greater than 7FH
               *      (for byte operations). The 80186 has expanded the range of negative numbers allowed as a quotient
               *      by 1 to include 8000H and 80H. These numbers represent the most negative numbers representable
               *      using 2's complement arithmetic (equaling -32768 and -128 in decimal, respectively).
               *
               * ESC Opcode:
               *
               *      The 80186 may be programmed to cause an interrupt type 7 whenever an ESCape instruction (used for
               *      co-processors like the 8087) is executed. The 8086 has no such provision. Before the 80186 performs
               *      this trap, it must be programmed to do so. [The details of this "programming" are not included.]
               *
               * Here's a summary of 80286 differences according to "80286 and 80287 Programmer's Reference Manual",
               * Appendix C, p.C-1 (p.329):
               *
               *   1. Add Six Interrupt Vectors
               *
               *      The 80286 adds six interrupts which arise only if the 8086 program has a hidden bug. These interrupts
               *      occur only for instructions which were undefined on the 8086/8088 or if a segment wraparound is attempted.
               *      It is recommended that you add an interrupt handler to the 8086 software that is to be run on the 80286,
               *      which will treat these interrupts as invalid operations.
               *
               *      This additional software does not significantly effect the existing 8086 software because the interrupts
               *      do not normally occur and should not already have been used since they are in the interrupt group reserved
               *      by Intel. [Note to Intel: IBM caaaaaaan't hear you].
               *
               *   2. Do not Rely on 8086/8088 Instruction Clock Counts
               *
               *      The 80286 takes fewer clocks for most instructions than the 8086/8088. The areas to look into are delays
               *      between I/0 operations, and assumed delays in 8086/8088 operating in parallel with an 8087.
               *
               *   3. Divide Exceptions Point at the DIV Instruction
               *
               *      Any interrupt on the 80286 will always leave the saved CS:IP value pointing at the beginning of the
               *      instruction that failed (including prefixes). On the 8086, the CS:IP value saved for a divide exception
               *      points at the next instruction.
               *
               *   4. Use Interrupt 16 (0x10) for Numeric Exceptions
               *
               *      Any 80287 system must use interrupt vector 16 for the numeric error interrupt. If an 8086/8087 or 8088/8087
               *      system uses another vector for the 8087 interrupt, both vectors should point at the numeric error interrupt
               *      handler.
               *
               *   5. Numeric Exception Handlers Should allow Prefixes
               *
               *      The saved CS:IP value in the NPX environment save area will point at any leading prefixes before an ESC
               *      instruction. On 8086/8088 systems, this value points only at the ESC instruction.
               *
               *   6. Do Not Attempt Undefined 8086/8088 Operations
               *
               *      Instructions like POP CS or MOV CS,op will either cause exception 6 (undefined [invalid] opcode) or perform
               *      a protection setup operation like LIDT on the 80286. Undefined bit encodings for bits 5-3 of the second byte
               *      of POP MEM or PUSH MEM will cause exception 13 on the 80286.
               *
               *   7. Place a Far JMP Instruction at FFFF0H
               *
               *      After reset, CS:IP = F000:FFF0 on the 80286 (versus FFFF:0000 on the 8086/8088). This change was made to allow
               *      sufficient code space to enter protected mode without reloading CS. Placing a far JMP instruction at FFFF0H
               *      will avoid this difference. Note that the BOOTSTRAP option of LOC86 will automatically generate this jump
               *      instruction.
               *
               *   8. Do not Rely on the Value Written by PUSH SP
               *
               *      The 80286 will push a different value on the stack for PUSH SP than the 8086/8088. If the value pushed is
               *      important [and when would it NOT be???], replace PUSH SP instructions with the following three instructions:
               *
               *          PUSH    BP
               *          MOV     BP,SP
               *          XCHG    BP,[BP]
               *
               *      This code functions as the 8086/8088 PUSH SP instruction on the 80286.
               *
               *   9. Do not Shift or Rotate by More than 31 Bits
               *
               *      The 80286 masks all shift/rotate counts to the low 5 bits. This MOD 32 operation limits the count to a maximum
               *      of 31 bits. With this change, the longest shift/rotate instruction is 39 clocks. Without this change, the longest
               *      shift/rotate instruction would be 264 clocks, which delays interrupt response until the instruction completes
               *      execution.
               *
               *  10. Do not Duplicate Prefixes
               *
               *      The 80286 sets an instruction length limit of 10 bytes. The only way to violate this limit is by duplicating
               *      a prefix two or more times before an instruction. Exception 6 occurs if the instruction length limit is violated.
               *      The 8086/8088 has no instruction length limit.
               *
               *  11. Do not Rely on Odd 8086/8088 LOCK Characteristics
               *
               *      The LOCK prefix and its corresponding output signal should only be used to prevent other bus masters from
               *      interrupting a data movement operation. The 80286 will always assert LOCK during an XCHG instruction with memory
               *      (even if the LOCK prefix was not used). LOCK should only be used with the XCHG, MOV, MOVS, INS, and OUTS instructions.
               *
               *      The 80286 LOCK signal will not go active during an instruction prefetch.
               *
               *  12. Do not Single Step External Interrupt Handlers
               *
               *      The priority of the 80286 single step interrupt is different from that of the 8086/8088. This change was made
               *      to prevent an external interrupt from being single-stepped if it occurs while single stepping through a program.
               *      The 80286 single step interrupt has higher priority than any external interrupt.
               *
               *      The 80286 will still single step through an interrupt handler invoked by INT instructions or an instruction
               *      exception.
               *
               *  13. Do not Rely on IDIV Exceptions for Quotients of 80H or 8000H
               *
               *      The 80286 can generate the largest negative number as a quotient for IDIV instructions. The 8086 will instead
               *      cause exception O.
               *
               *  14. Do not Rely on NMI Interrupting NMI Handlers
               *
               *      After an NMI is recognized, the NMI input and processor extension limit error interrupt is masked until the
               *      first IRET instruction is executed.
               *
               *  15. The NPX error signal does not pass through an interrupt controller (an 8087 INT signal does). Any interrupt
               *      controller-oriented instructions for the 8087 may have to be deleted.
               *
               *  16. If any real-mode program relies on address space wrap-around (e.g., FFF0:0400=0000:0300), then external hardware
               *      should be used to force the upper 4 addresses to zero during real mode.
               *
               *  17. Do not use I/O ports 00F8-00FFH. These are reserved for controlling 80287 and future processor extensions.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.initProcessor = function()
              {
                  this.PS_SET = X86.PS_SET_8086;
                  this.PS_DIRECT = X86.PS_DIRECT_8086;
              
                  this.OPFLAG_NOINTR_8086 = X86.OPFLAG.NOINTR;
                  this.nShiftCountMask = 0xff;            // on an 8086/8088, all shift counts are used as-is
              
                  this.cycleCounts = (this.model == X86.MODEL_80386? X86CPU.CYCLES_80386 : (this.model == X86.MODEL_80286? X86CPU.CYCLES_80286 : X86CPU.CYCLES_8088));
              
                  this.aOps     = X86.aOps;
                  this.aOpGrp4b = X86.aOpGrp4b;
                  this.aOpGrp4w = X86.aOpGrp4w;
                  this.aOpGrp6  = X86.aOpGrp6Real;        // setProtMode() will ensure that aOpGrp6 is switched
              
                  if (this.model >= X86.MODEL_80186) {
                      /*
                       * I don't go out of my way to make 80186/80188 cycle times accurate, since I'm not aware of any
                       * IBM PC models that used those processors; beyond the 8086, my next priorities are the 80286 and
                       * 80386, but I might revisit the 80186 someday.
                       *
                       * Instruction handlers that contain "hard-coded" 80286 cycle times include: opINSb, opINSw, opOUTSb,
                       * opOUTSw, opENTER, and opLEAVE.
                       */
                      this.aOps = X86.aOps.slice();       // make copies of aOps and others before modifying them
                      this.aOpGrp4b = X86.aOpGrp4b.slice();
                      this.aOpGrp4w = X86.aOpGrp4w.slice();
                      this.nShiftCountMask = 0x1f;        // on newer processors, all shift counts are MOD 32
                      this.aOps[0x0F]                 = X86.opInvalid;
                      this.aOps[X86.OPCODE.PUSHA]     = X86.opPUSHA;      // 0x60
                      this.aOps[X86.OPCODE.POPA]      = X86.opPOPA;       // 0x61
                      this.aOps[X86.OPCODE.BOUND]     = X86.opBOUND;      // 0x62
                      this.aOps[X86.OPCODE.ARPL]      = X86.opInvalid;    // 0x63
                      this.aOps[X86.OPCODE.FS]        = X86.opInvalid;    // 0x64
                      this.aOps[X86.OPCODE.GS]        = X86.opInvalid;    // 0x65
                      this.aOps[X86.OPCODE.OS]        = X86.opInvalid;    // 0x66
                      this.aOps[X86.OPCODE.AS]        = X86.opInvalid;    // 0x67
                      this.aOps[X86.OPCODE.PUSHN]     = X86.opPUSHn;      // 0x68
                      this.aOps[X86.OPCODE.IMULN]     = X86.opIMULn;      // 0x69
                      this.aOps[X86.OPCODE.PUSH8]     = X86.opPUSH8;      // 0x6A
                      this.aOps[X86.OPCODE.IMUL8]     = X86.opIMUL8;      // 0x6B
                      this.aOps[X86.OPCODE.INSB]      = X86.opINSb;       // 0x6C
                      this.aOps[X86.OPCODE.INSW]      = X86.opINSw;       // 0x6D
                      this.aOps[X86.OPCODE.OUTSB]     = X86.opOUTSb;      // 0x6E
                      this.aOps[X86.OPCODE.OUTSW]     = X86.opOUTSw;      // 0x6F
                      this.aOps[0xC0]                 = X86.opGRP2bn;     // 0xC0
                      this.aOps[0xC1]                 = X86.opGRP2wn;     // 0xC1
                      this.aOps[X86.OPCODE.ENTER]     = X86.opENTER;      // 0xC8
                      this.aOps[X86.OPCODE.LEAVE]     = X86.opLEAVE;      // 0xC9
                      this.aOps[0xF1]                 = X86.opINT1;       // 0xF1
                      this.aOpGrp4b[0x07]             = X86.fnGRPInvalid;
                      this.aOpGrp4w[0x07]             = X86.fnGRPInvalid;
              
                      if (this.model >= X86.MODEL_80286) {
              
                          this.PS_SET = X86.PS.BIT1;      // on the 80286, only BIT1 of Processor Status (flags) is always set
                          this.PS_DIRECT |= X86.PS.IOPL.MASK | X86.PS.NT;
              
                          this.OPFLAG_NOINTR_8086 = 0;    // used with instructions that should *not* set NOINTR on an 80286 (eg, non-SS segment loads)
              
                          this.aOps[0x0F] = X86.op0F;
                          this.aOps0F = X86.aOps0F.slice();
                          for (var i = 0; i < this.aOps0F.length; i++) {
                              if (!this.aOps0F[i]) this.aOps0F[i] = X86.opUndefined;
                          }
                          this.aOps[X86.OPCODE.PUSHSP] = X86.opPUSHSP;    // 0x54
                          this.aOps[X86.OPCODE.ARPL]   = X86.opARPL;      // 0x63
              
                          if (I386 && this.model >= X86.MODEL_80386) {
                              var bOpcode;
                              this.aOps[X86.OPCODE.FS] = X86.opFS;        // 0x64
                              this.aOps[X86.OPCODE.GS] = X86.opGS;        // 0x65
                              this.aOps[X86.OPCODE.OS] = X86.opOS;        // 0x66
                              this.aOps[X86.OPCODE.AS] = X86.opAS;        // 0x67
                              for (bOpcode in X86.aOps0F386) {
                                  this.aOps0F[+bOpcode] = X86.aOps0F386[bOpcode];
                              }
                          }
                      }
                  }
              };
              
              /**
               * reset()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.reset = function()
              {
                  if (this.aFlags.fRunning) this.stopCPU();
                  this.resetRegs();
                  this.resetCycles();
                  this.clearError();      // clear any fatal error/exception that setError() may have flagged
                  if (SAMPLER) this.iSampleNext = this.iSampleFreq = this.iSampleSkip = 0;
              };
              
              /**
               * resetRegs()
               *
               * According to "The 8086 Book", p.7-5, a RESET signal initializes the following registers:
               *
               *      PS          =   0x0000 (which has the important side-effect of disabling interrupts and traps)
               *      IP          =   0x0000
               *      CS          =   0xFFFF
               *      DS/ES/SS    =   0x0000
               *
               * It is silent as to whether the remaining registers are initialized to any particular values.
               *
               * According to the "80286 and 80287 Programmer's Reference Manual", these 80286 registers are reset:
               *
               *      PS          =   0x0002
               *      MSW         =   0xFFF0
               *      IP          =   0xFFF0
               *      CS Selector =   0xF000      DS/ES/SS Selector =   0x0000
               *      CS Base     = 0xFF0000      DS/ES/SS Base     = 0x000000        IDT Base  = 0x000000
               *      CS Limit    =   0xFFFF      DS/ES/SS Limit    =   0xFFFF        IDT Limit =   0x03FF
               *
               * And from the "INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986", section 10.1:
               *
               *      The contents of EAX depend upon the results of the power-up self test. The self-test may be requested
               *      externally by assertion of BUSY# at the end of RESET. The EAX register holds zero if the 80386 passed
               *      the test. A nonzero value in EAX after self-test indicates that the particular 80386 unit is faulty.
               *      If the self-test is not requested, the contents of EAX after RESET is undefined.
               *
               *      DX holds a component identifier and revision number after RESET as Figure 10-1 illustrates. DH contains
               *      3, which indicates an 80386 component. DL contains a unique identifier of the revision level.
               *
               *      EFLAGS      =   0x00000002
               *      IP          =   0x0000FFF0
               *      CS selector =   0xF000 (base of 0xFFFF0000 and limit of 0xFFFF)
               *      DS selector =   0x0000
               *      ES selector =   0x0000
               *      SS selector =   0x0000
               *      FS selector =   0x0000
               *      GS selector =   0x0000
               *      IDTR        =   base of 0 and limit of 0x3FF
               *
               * All other 80386 registers are undefined after a reset (ie, Intel did not document how or if they are set).
               *
               * We've elected to set DX to 0x0304 on a reset, which is consistent with a 80386-C0, since we have no desire to
               * try to emulate all the bugs in older (eg, B1) steppings -- at least not initially.  We leave stepping-accurate
               * emulation for another day.  It's also known that the B1 (and possibly B0) reported 0x0303 in DX, and that
               * the D0 stepping reported 0x0305; beyond that, it's not known exactly what revision numbers Intel used for all
               * 80386 revisions.
               *
               * We define some additional "registers", such as regLIP. which mirrors the linear address corresponding to
               * CS:IP (the address of the next opcode byte).  In fact, regLIP functions as our internal IP register, so any
               * code that needs the real IP must call getIP().  This, in turn, means that whenever CS or IP must be modified,
               * regLIP must be recalculated, so you must use either setCSIP(), which takes both an offset and a segment,
               * or setIP(), whichever is appropriate; in unusual cases where only segCS is changing (eg, undocumented 8086
               * opcodes), use setCS().
               *
               * Similarly, regLSP mirrors the linear address corresponding to SS:SP, and therefore you must rely on getSP()
               * to read the current SP, and setSP() and setSS() to update SP and SS.
               *
               * The other segment registers, such as segDS and segES, have similar getters and setters, but they do not mirror
               * any segment:offset values in the same way that regLIP mirrors CS:IP, or that regLSP mirrors SS:SP.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.resetRegs = function()
              {
                  this.regEAX = 0;
                  this.regEBX = 0;
                  this.regECX = 0;
                  this.regEDX = 0;
                  this.regESP = 0;            // this isn't needed in a 16-bit environment, but is required for I386
                  this.regEBP = 0;
                  this.regESI = 0;
                  this.regEDI = 0;
              
                  /*
                   * The following are internal "registers" used to capture intermediate values inside selected helper
                   * functions and use them if they've been modified (or are known to change); for example, the MUL and DIV
                   * instructions perform calculations that must be propagated to specific registers (eg, AX and/or DX), which
                   * the ModRM decoder functions don't know about.  We initialize them here mainly for documentation purposes.
                   */
                  this.fMDSet = false;        // regMDHi and/or regMDLo are invalid unless fMDSet is true
                  this.regMDLo = this.regMDHi = 0;
                  this.regXX = 0;             // internal register for segment register and control register moves
              
                  /*
                   * Another internal "register" we occasionally need is an interim copy of bModRM, set inside selected opcode
                   * handlers so that the helper function can have access to the instruction's bModRM without resorting to a
                   * closure (which, in the Chrome V8 engine, for example, may cause constant recompilation).
                   */
                  this.bModRM = 0;
              
                  /*
                   * NOTE: Even though the 8086 doesn't have CR0 (aka MSW) and IDTR, we initialize them for ALL CPUs, so
                   * that functions like X86.fnINT() can use the same code for both.  The 8086/8088 have no direct way
                   * of accessing or changing them, so this is an implementation detail those processors are unaware of.
                   */
                  this.regCR0 = X86.CR0.MSW.ON;
                  this.addrIDT = 0; this.addrIDTLimit = 0x03FF;
                  this.regPS = this.nIOPL = 0;        // these should be set before the first setPS() call
              
                  /*
                   * Define all the result registers that can be used to "cache" arithmetic and logical flags.
                   *
                   * In addition, setPS() will initialize resultType, which keeps track of which flags are cached,
                   * and resultSize, which maintains the size of the last result; initially, no flags are cached.
                   */
                  this.resultDst = this.resultSrc = this.resultArith = this.resultLogic = 0;
              
                  /*
                   * This is set by fnFault() and reset (to -1) by resetRegs() and opIRET(); its initial purpose is to
                   * "help" fnFault() determine when a nested fault should be converted into either a double-fault (DF_FAULT)
                   * or a triple-fault (ie, a processor reset).
                   */
                  this.nFault = -1;
              
                  /*
                   * Segment registers used to be defined as separate variables (eg, regCS and regCS0 stored the segment
                   * number and base linear address, respectively), but segment registers are now defined as X86Seg objects.
                   */
                  this.segCS     = new X86Seg(this, X86Seg.ID.CODE,  "CS");
                  this.segDS     = new X86Seg(this, X86Seg.ID.DATA,  "DS");
                  this.segES     = new X86Seg(this, X86Seg.ID.DATA,  "ES");
                  this.segSS     = new X86Seg(this, X86Seg.ID.STACK, "SS");
                  this.setSP(0);
                  this.setSS(0);
              
                  if (I386 && this.model >= X86.MODEL_80386) {
                      this.regEDX = 0x0304;           // Intel errata sheets indicate this is what an 80386-C0 reported
                      this.regCR0 = X86.CR0.ET;       // formerly MSW
                      this.regCR1 = 0;                // reserved
                      this.regCR2 = 0;                // page fault linear address (PFLA)
                      this.regCR3 = 0;                // page directory base register (PDBR)
                      this.aRegDR = new Array(8);     // Debug Registers DR0-DR7
                      this.aRegTR = new Array(8);     // Test Registers TR0-TR7
                      this.segFS = new X86Seg(this, X86Seg.ID.DATA,  "FS");
                      this.segGS = new X86Seg(this, X86Seg.ID.DATA,  "GS");
                  }
              
                  this.segNULL = new X86Seg(this, X86Seg.ID.NULL,  "NULL");
              
                  /*
                   * The next few initializations mirror what we must do prior to each instruction (ie, inside the stepCPU() function);
                   * note that opPrefixes, along with segData and segStack, are reset only after we've executed a non-prefix instruction.
                   */
                  this.segData = this.segDS;
                  this.segStack = this.segSS;
                  this.opFlags = this.opPrefixes = 0;
                  this.regEA = this.regEAWrite = X86.ADDR_INVALID;
              
                  /*
                   * intFlags contains some internal states we use to indicate whether a hardware interrupt (INTFLAG.INTR) or
                   * Trap software interrupt (INTR.TRAP) has been requested, as well as when we're in a "HLT" state (INTFLAG.HALT)
                   * that requires us to wait for a hardware interrupt (INTFLAG.INTR) before continuing execution.
                   *
                   * intFlags must be cleared only by checkINTR(), whereas opFlags must be cleared prior to every CPU operation.
                   */
                  this.intFlags = X86.INTFLAG.NONE;
              
                  this.setCSIP(0, 0xffff);    // this should be called before the first setPS() call
              
                  if (!I386) this.resetSizes();
              
                  if (BACKTRACK) {
                      /*
                       * Initialize the backtrack indexes for all registers to zero.  And while, yes, it IS possible
                       * for raw data to flow through segment registers as well, it's not common enough in real-mode
                       * (and too difficult in protected-mode) to merit the overhead.  Ditto for SP, which can't really
                       * be considered a general-purpose register.
                       *
                       * Every time getByte() is called, btMemLo is filled with the matching backtrack info; similarly,
                       * every time getWord() is called, btMemLo and btMemHi are filled with the matching backtrack info
                       * for the low and high bytes, respectively.
                       */
                      this.backTrack = {
                          btiAL:      0,
                          btiAH:      0,
                          btiBL:      0,
                          btiBH:      0,
                          btiCL:      0,
                          btiCH:      0,
                          btiDL:      0,
                          btiDH:      0,
                          btiBPLo:    0,
                          btiBPHi:    0,
                          btiSILo:    0,
                          btiSIHi:    0,
                          btiDILo:    0,
                          btiDIHi:    0,
                          btiMemLo:   0,
                          btiMemHi:   0,
                          btiEALo:    0,
                          btiEAHi:    0,
                          btiIO:      0
                      };
                  }
              
                  /*
                   * Assorted 80286-specific registers.  The GDTR and IDTR registers are stored as the following pieces:
                   *
                   *      GDTR:   addrGDT (24 bits) and addrGDTLimit (24 bits)
                   *      IDTR:   addrIDT (24 bits) and addrIDTLimit (24 bits)
                   *
                   * while the LDTR and TR are stored as special segment registers: segLDT and segTSS.
                   *
                   * So, yes, our GDTR and IDTR "registers" differ from other segment registers in that we do NOT record
                   * the 16-bit limit specified by the LGDT or LIDT instructions; instead, we immediately calculate the limiting
                   * address, and record that instead.
                   *
                   * In addition to different CS:IP reset values, the CS base address must be set to the top of the 16Mb
                   * address space rather than the top of the first 1Mb (which is why the MODEL_5170 ROM must be addressable
                   * at both 0x0F0000 and 0xFF0000; see the ROM component's "alias" parameter).
                   */
                  if (this.model >= X86.MODEL_80286) {
                      /*
                       * TODO: Verify what the 80286 actually sets addrGDT and addrGDTLimit to on reset (or if it leaves them alone).
                       */
                      this.addrGDT = 0; this.addrGDTLimit = 0xffff;                   // GDTR
                      this.segLDT = new X86Seg(this, X86Seg.ID.LDT,   "LDT", true);   // LDTR
                      this.segTSS = new X86Seg(this, X86Seg.ID.TSS,   "TSS", true);   // TR
                      this.segVER = new X86Seg(this, X86Seg.ID.OTHER, "VER", true);   // a scratch segment register for VERR and VERW instructions
                      this.setCSIP(0xfff0, 0xf000);                   // on an 80286 or 80386, the default CS:IP is 0xF000:0xFFF0 instead of 0xFFFF:0x0000
                      this.setCSBase(0xffff0000|0);                   // on an 80286 or 80386, all CS base address bits above bit 15 must be set
                  }
              
                  /*
                   * This resets the Processor Status flags (regPS), along with all the internal "result registers";
                   * we've taken care to ensure that both segCS.cpl and nIOPL are initialized before this first setPS() call.
                   */
                  this.setPS(0);
              
                  /*
                   * Now that all the segment registers have been created, it's safe to set the current addressing mode.
                   */
                  this.setProtMode();
              };
              
              /**
               * updateAddrSize()
               *
               * Select the appropriate ModRM dispatch tables, based on the current ADDRESS size (addrSize), which
               * is based foremost on segCS.addrSize, but can also be overridden by an ADDRESS size instruction prefix.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.updateAddrSize = function()
              {
                  if (!I386) {
                      this.getAddr = this.getShort;
                      this.aOpModRegByte = X86ModB.aOpModReg;
                      this.aOpModMemByte = X86ModB.aOpModMem;
                      this.aOpModGrpByte = X86ModB.aOpModGrp;
                      this.aOpModRegWord = X86ModW.aOpModReg;
                      this.aOpModMemWord = X86ModW.aOpModMem;
                      this.aOpModGrpWord = X86ModW.aOpModGrp;
                  } else {
                      if (this.addrSize == 2) {
                          this.getAddr = this.getShort;
                          this.aOpModRegByte = X86ModB16.aOpModReg;
                          this.aOpModMemByte = X86ModB16.aOpModMem;
                          this.aOpModGrpByte = X86ModB16.aOpModGrp;
                          this.aOpModRegWord = X86ModW16.aOpModReg;
                          this.aOpModMemWord = X86ModW16.aOpModMem;
                          this.aOpModGrpWord = X86ModW16.aOpModGrp;
                      } else {
                          this.getAddr = this.getLong;
                          this.aOpModRegByte = X86ModB32.aOpModReg;
                          this.aOpModMemByte = X86ModB32.aOpModMem;
                          this.aOpModGrpByte = X86ModB32.aOpModGrp;
                          this.aOpModRegWord = X86ModW32.aOpModReg;
                          this.aOpModMemWord = X86ModW32.aOpModMem;
                          this.aOpModGrpWord = X86ModW32.aOpModGrp;
                      }
                  }
              };
              
              /**
               * setDataSize(size)
               *
               * This is used by opcodes that require a particular OPERAND size, which we enforce by
               * internally simulating an OPERAND size override, if needed.
               *
               * @this {X86CPU}
               * @param {number} size (2 for 2-byte/16-bit operands, or 4 for 4-byte/32-bit operands)
               */
              X86CPU.prototype.setDataSize = function(size)
              {
                  if (this.dataSize != size) {
                      this.opPrefixes |= X86.OPFLAG.DATASIZE;
                      this.dataSize = size;
                      this.dataMask = (size == 2? 0xffff : (0xffffffff|0));
                      this.updateDataSize();
                  }
              };
              
              /**
               * updateDataSize()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.updateDataSize = function()
              {
                  if (this.dataSize == 2) {
                      this.dataType = X86.RESULT.WORD;
                      this.getWord = this.getShort;
                      this.setWord = this.setShort;
                  } else {
                      this.dataType = X86.RESULT.DWORD;
                      this.getWord = this.getLong;
                      this.setWord = this.setLong;
                  }
              };
              
              /**
               * resetSizes()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.resetSizes = function()
              {
                  /*
                   * The following contain the (default) ADDRESS size (2 for 16 bits, 4 for 32 bits), and the corresponding
                   * masks for isolating the (src) bits of an address and clearing the (dst) bits of an address.  Like the
                   * OPERAND size properties, these are reset to their segCS counterparts at the start of every new instruction.
                   */
                  this.addrSize = this.segCS.addrSize;
                  this.addrMask = this.segCS.addrMask;
              
                  /*
                   * It's also worth noting that instructions that implicitly use the stack also rely on STACK size,
                   * which is based on the BIG bit of the last descriptor loaded into SS; use the following segSS properties:
                   *
                   *      segSS.addrSize      (2 or 4)
                   *      segSS.addrMask      (0xffff or 0xffffffff)
                   *
                   * As there is no STACK size instruction prefix override, there's no need to propagate these segSS properties
                   * to separate X86CPU properties, as we do for the OPERAND size and ADDRESS size properties.
                   */
              
                  this.updateAddrSize();
              
                  /*
                   * The following contain the (default) OPERAND size (2 for 16 bits, 4 for 32 bits), and the corresponding masks
                   * for isolating the (src) bits of an OPERAND and clearing the (dst) bits of an OPERAND.  These are reset to
                   * their segCS counterparts at the start of every new instruction, but are also set here for documentation purposes.
                   */
                  this.dataSize = this.segCS.dataSize;
                  this.dataMask = this.segCS.dataMask;
              
                  this.updateDataSize();
              
                  this.opPrefixes &= ~(X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE);
              };
              
              /**
               * getChecksum()
               *
               * @this {X86CPU}
               * @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
               */
              X86CPU.prototype.getChecksum = function()
              {
                  var sum = (this.regEAX + this.regEBX + this.regECX + this.regEDX + this.getSP() + this.regEBP + this.regESI + this.regEDI) | 0;
                  sum = (sum + this.getIP() + this.getCS() + this.getDS() + this.getSS() + this.getES() + this.getPS()) | 0;
                  return sum;
              };
              
              /**
               * addIntNotify(nInt, component, fn)
               *
               * Add an software interrupt notification handler to the CPU's list of such handlers.
               *
               * @this {X86CPU}
               * @param {number} nInt
               * @param {Component} component
               * @param {function(number)} fn is called with the LIP value following the software interrupt
               */
              X86CPU.prototype.addIntNotify = function(nInt, component, fn)
              {
                  if (fn !== undefined) {
                      if (this.aIntNotify[nInt] === undefined) {
                          this.aIntNotify[nInt] = [];
                      }
                      this.aIntNotify[nInt].push([component, fn]);
                      if (MAXDEBUG) this.log("addIntNotify(" + str.toHexWord(nInt) + "," + component.id + ")");
                  }
              };
              
              /**
               * checkIntNotify(nInt)
               *
               * NOTE: This is called ONLY for "INT N" instructions -- not "INTO" or breakpoint or single-step interrupts
               * or divide exception interrupts, or hardware interrupts, or any simulation of an interrupt (eg, "PUSHF/CALLF").
               *
               * @this {X86CPU}
               * @param {number} nInt
               * @return {boolean} true if software interrupt may proceed, false if software interrupt should be skipped
               */
              X86CPU.prototype.checkIntNotify = function(nInt)
              {
                  var aNotify = this.aIntNotify[nInt];
                  if (aNotify !== undefined) {
                      for (var i = 0; i < aNotify.length; i++) {
                          if (!aNotify[i][1].call(aNotify[i][0], this.regLIP)) {
                              return false;
                          }
                      }
                  }
                  /*
                   * The enabling of INT messages is one of the criteria that's also included in the Debugger's
                   * checksEnabled() function, and therefore in fDebugCheck, so for maximum speed, we check fDebugCheck first.
                   */
                  if (DEBUGGER && this.aFlags.fDebugCheck) {
                      if (this.messageEnabled(Messages.INT) && this.dbg.messageInt(nInt, this.regLIP)) {
                          this.addIntReturn(this.regLIP, function(cpu, nCycles) {
                              return function onIntReturn(nLevel) {
                                  cpu.dbg.messageIntReturn(nInt, nLevel, cpu.getCycles() - nCycles);
                              };
                          }(this, this.getCycles()));
                      }
                  }
                  return true;
              };
              
              /**
               * addIntReturn(addr, fn)
               *
               * Add a return notification handler to the CPU's list of such handlers.
               *
               * When fn(n) is called, it's passed a "software interrupt level", which will normally be 0,
               * unless it's a return from a nested software interrupt (eg, return from INT 0x10 Video BIOS
               * call issued inside another INT 0x10 Video BIOS call).
               *
               * Note that the nesting could be due to a completely different software interrupt that
               * another interrupt notification function is intercepting, so use it as an advisory value only.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @param {function(number)} fn is an interrupt-return notification function
               */
              X86CPU.prototype.addIntReturn = function(addr, fn)
              {
                  if (fn !== undefined) {
                      if (this.aIntReturn[addr] == null) {
                          this.cIntReturn++;
                      }
                      this.aIntReturn[addr] = fn;
                  }
              };
              
              /**
               * checkIntReturn(addr)
               *
               * We check for possible "INT n" software interrupt returns in the cases of "IRET" (fnIRET), "RETF 2"
               * (fnRETF) and "JMPF [DWORD]" (fnJMPFdw).
               *
               * "JMPF [DWORD]" is an unfortunate choice that newer versions of DOS (as of at least 3.20, and probably
               * earlier) employed in their INT 0x13 hooks; I would have preferred not making this call for that opcode.
               *
               * It is expected (though not required) that callers will check cIntReturn and avoid calling this function
               * if the count is zero, for maximum performance.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               */
              X86CPU.prototype.checkIntReturn = function(addr)
              {
                  var fn = this.aIntReturn[addr];
                  if (fn != null) {
                      fn(--this.cIntReturn);
                      delete this.aIntReturn[addr];
                  }
              };
              
              /**
               * setProtMode(fProt)
               *
               * Update any opcode handlers that operate significantly differently in real-mode vs. protected-mode, and
               * notify all the segment registers about the mode change as well -- but only those that are "bi-modal"; internal
               * segment registers like segLDT and segTSS do not need to be notified, because they cannot be accessed in real-mode
               * (ie, LLDT, LTR, SLDT, STR are invalid instructions in real-mode, and are among the opcode handlers that we
               * update here).
               *
               * NOTE: Ideally, this function would do its work ONLY on mode *transitions*, but we assume calls to setProtMode()
               * are sufficiently infrequent that it doesn't really matter.
               *
               * @this {X86CPU}
               * @param {boolean} [fProt] (use the current MSW PE bit if not specified)
               */
              X86CPU.prototype.setProtMode = function(fProt)
              {
                  if (fProt === undefined) {
                      fProt = !!(this.regCR0 & X86.CR0.MSW.PE);
                  }
                  if (!fProt != !(this.regCR0 & X86.CR0.MSW.PE) && this.messageEnabled()) {
                      this.printMessage("CPU switching to " + (fProt? "protected" : "real") + "-mode", this.bitsMessage, true);
                  }
                  this.aOpGrp6 = (fProt? X86.aOpGrp6Prot : X86.aOpGrp6Real);
                  this.segCS.updateMode();
                  this.segDS.updateMode();
                  this.segSS.updateMode();
                  this.segES.updateMode();
                  if (I386 && this.model >= X86.MODEL_80386) {
                      this.segFS.updateMode();
                      this.segGS.updateMode();
                      this.resetSizes();
                  }
              };
              
              /**
               * saveProtMode()
               *
               * Save CPU state related to protected-mode, for save()
               *
               * @this {X86CPU}
               * @return {Array}
               */
              X86CPU.prototype.saveProtMode = function()
              {
                  if (this.addrGDT != null) {
                      var a = [
                          this.regCR0,
                          this.addrGDT,
                          this.addrGDTLimit,
                          this.addrIDT,
                          this.addrIDTLimit,
                          this.segLDT.save(),
                          this.segTSS.save(),
                          this.nIOPL
                      ];
                      if (I386) {
                          a.push(this.regCR1);
                          a.push(this.regCR2);
                          a.push(this.regCR3);
                          a.push(this.aRegDR);
                          a.push(this.aRegTR);
                      }
                      return a;
                  }
                  return null;
              };
              
              /**
               * restoreProtMode()
               *
               * Restore CPU state related to protected-mode, for restore()
               *
               * @this {X86CPU}
               * @param {Array} a
               */
              X86CPU.prototype.restoreProtMode = function(a)
              {
                  if (a && a.length) {
                      this.regCR0 = a[0];
                      this.addrGDT = a[1];
                      this.addrGDTLimit = a[2];
                      this.addrIDT = a[3];
                      this.addrIDTLimit = a[4];
                      this.segLDT.restore(a[5]);
                      this.segTSS.restore(a[6]);
                      this.nIOPL = a[7];
                      if (I386 && this.model >= X86.MODEL_80386) {
                          this.regCR1 = a[8];
                          this.regCR2 = a[9];
                          this.regCR3 = a[10];
                          this.aRegDR = a[11];
                          this.aRegTR = a[12];
                      }
                      this.setProtMode();
                  }
              };
              
              /**
               * save()
               *
               * This implements save support for the X86 component.
               *
               * UPDATES: The current speed multiplier from getSpeed() is now saved in group #3, so that your speed is preserved.
               *
               * @this {X86CPU}
               * @return {Object|null}
               */
              X86CPU.prototype.save = function()
              {
                  var state = new State(this);
                  state.set(0, [this.regEAX, this.regEBX, this.regECX, this.regEDX, this.getSP(), this.regEBP, this.regESI, this.regEDI]);
                  var a = [this.getIP(), this.segCS.save(), this.segDS.save(), this.segSS.save(), this.segES.save(), this.saveProtMode(), this.getPS()];
                  if (I386 && this.model >= X86.MODEL_80386) {
                      a.push(this.segFS.save());
                      a.push(this.segGS.save());
                  }
                  state.set(1, a);
                  state.set(2, [this.segData.sName, this.segStack.sName, this.opFlags, this.opPrefixes, this.intFlags, this.regEA, this.regEAWrite]);
                  state.set(3, [0, this.nTotalCycles, this.getSpeed()]);
                  state.set(4, this.bus.saveMemory());
                  return state.data();
              };
              
              /**
               * restore(data)
               *
               * This implements restore support for the X86 component.
               *
               * @this {X86CPU}
               * @param {Object} data
               * @return {boolean} true if restore successful, false if not
               */
              X86CPU.prototype.restore = function(data)
              {
                  var a = data[0];
                  this.regEAX = a[0];
                  this.regEBX = a[1];
                  this.regECX = a[2];
                  this.regEDX = a[3];
                  var regESP = a[4];
                  this.regEBP = a[5];
                  this.regESI = a[6];
                  this.regEDI = a[7];
              
                  a = data[1];
                  this.segCS.restore(a[1]);
                  this.segDS.restore(a[2]);
                  this.segSS.restore(a[3]);
                  this.segES.restore(a[4]);
                  this.restoreProtMode(a[5]);
                  this.setPS(a[6]);
              
                  /*
                   * It's important to call setCSIP(), both to ensure that the CPU's linear IP register (regLIP) is updated
                   * properly AND to ensure the CPU's default ADDRESS and OPERAND sizes are set properly.
                   */
                  this.setCSIP(a[0], this.segCS.sel);
              
                  /*
                   * It's also important to call setSP(), so that the linear SP register (regLSP) will be updated properly;
                   * we also need to call setSS(), to ensure that the lower and upper stack limits are properly initialized.
                   */
                  this.setSP(regESP);
                  this.setSS(this.segSS.sel);
              
                  if (I386 && this.model >= X86.MODEL_80386) {
                      this.segFS.restore(a[7]);
                      this.segGS.restore(a[8]);
                  }
              
                  a = data[2];
                  this.segData  = a[0] != null && this.getSeg(a[0]) || this.segDS;
                  this.segStack = a[1] != null && this.getSeg(a[1]) || this.segSS;
                  this.opFlags = a[2];
                  this.opPrefixes = a[3];
                  this.intFlags = a[4];
                  this.regEA = a[5];
                  this.regEAWrite = a[6];     // save/restore of last EA calculation(s) isn't strictly necessary, but they may be of some interest to, say, the Debugger
              
                  a = data[3];                // a[0] was previously nBurstDivisor (no longer used)
                  this.nTotalCycles = a[1];
                  this.setSpeed(a[2]);        // if we're restoring an old state that doesn't contain a value from getSpeed(), that's OK; setSpeed() checks for an undefined value
                  return this.bus.restoreMemory(data[4]);
              };
              
              /**
               * getSeg(sName)
               *
               * @param {string} sName
               * @return {Array}
               */
              X86CPU.prototype.getSeg = function(sName)
              {
                  switch(sName) {
                  case "CS":
                      return this.segCS;
                  case "DS":
                      return this.segDS;
                  case "SS":
                      return this.segSS;
                  case "ES":
                      return this.segES;
                  case "NULL":
                      return this.segNULL;
                  default:
                      /*
                       * HACK: We return a fake segment register object in which only the base linear address is valid,
                       * because that's all the caller provided (ie, we must be restoring from an older state).
                       */
                      this.assert(typeof sName == "number");
                      return [0, sName, 0, 0, ""];
                  }
              };
              
              /**
               * getCS()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getCS = function()
              {
                  return this.segCS.sel;
              };
              
              /**
               * setCS(sel)
               *
               * NOTE: This is used ONLY by those few undocumented 8086/8088/80186/80188 instructions that "MOV" or "POP" a value
               * into CS, which we assume have the same behavior as any other instruction that moves or pops a segment register
               * (ie, suppresses h/w interrupts for one instruction).  Instructions that "JMP" or "CALL" or "INT" or "IRET" a new
               * value into CS are always accompanied by a new IP value, so they use setCSIP() instead, which does NOT suppress
               * h/w interrupts.
               *
               * @this {X86CPU}
               * @param {number} sel
               */
              X86CPU.prototype.setCS = function(sel)
              {
                  var regEIP = this.getIP();
                  this.regLIP = (this.segCS.load(sel) + regEIP)|0;
                  this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
                  if (I386) this.resetSizes();
                  if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
                  if (PREFETCH) this.flushPrefetch(this.regLIP);
              };
              
              /**
               * getDS()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getDS = function()
              {
                  return this.segDS.sel;
              };
              
              /**
               * setDS(sel)
               *
               * @this {X86CPU}
               * @param {number} sel
               */
              X86CPU.prototype.setDS = function(sel)
              {
                  this.segDS.load(sel);
                  if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
              };
              
              /**
               * getSS()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getSS = function()
              {
                  return this.segSS.sel;
              };
              
              /**
               * setSS(sel)
               *
               * @this {X86CPU}
               * @param {number} sel
               * @param {boolean} [fInterruptable]
               */
              X86CPU.prototype.setSS = function(sel, fInterruptable)
              {
                  var regESP = this.getSP();
                  this.regLSP = (this.segSS.load(sel) + regESP)|0;
                  if (this.segSS.fExpDown) {
                      this.regLSPLimit = (this.segSS.base + this.segSS.addrMask)|0;
                      this.regLSPLimitLow = (this.segSS.base + this.segSS.limit)|0;
                  } else {
                      this.regLSPLimit = (this.segSS.base + this.segSS.limit)|0;
                      this.regLSPLimitLow = this.segSS.base;
                  }
                  if (!BUGS_8086 && !fInterruptable) this.opFlags |= X86.OPFLAG.NOINTR;
              };
              
              /**
               * getES()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getES = function()
              {
                  return this.segES.sel;
              };
              
              /**
               * setES(sel)
               *
               * @this {X86CPU}
               * @param {number} sel
               */
              X86CPU.prototype.setES = function(sel)
              {
                  this.segES.load(sel);
                  if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
              };
              
              /**
               * getFS()
               *
               * NOTE: segFS is defined for I386 only.
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getFS = function()
              {
                  return this.segFS.sel;
              };
              
              /**
               * setFS(sel)
               *
               * NOTE: segFS is defined for I386 only.
               *
               * @this {X86CPU}
               * @param {number} sel
               */
              X86CPU.prototype.setFS = function(sel)
              {
                  this.segFS.load(sel);
              };
              
              /**
               * getGS()
               *
               * NOTE: segGS is defined for I386 only.
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getGS = function()
              {
                  return this.segGS.sel;
              };
              
              /**
               * setGS(sel)
               *
               * NOTE: segGS is defined for I386 only.
               *
               * @this {X86CPU}
               * @param {number} sel
               */
              X86CPU.prototype.setGS = function(sel)
              {
                  this.segGS.load(sel);
              };
              
              /**
               * getIP()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getIP = function()
              {
                  return (this.regLIP - this.segCS.base)|0;
              };
              
              /**
               * setIP(off)
               *
               * With the addition of flushPrefetch(), this function should only be called
               * for non-incremental IP updates; setIP(this.getIP()+1) is no longer appropriate.
               *
               * In fact, for performance reasons, it's preferable to increment regLIP yourself,
               * but you can also call advanceIP() if speed is not important.
               *
               * @this {X86CPU}
               * @param {number} off
               */
              X86CPU.prototype.setIP = function(off)
              {
                  this.regLIP = (this.segCS.base + (off & (I386? this.dataMask : 0xffff)))|0;
                  if (PREFETCH) this.flushPrefetch(this.regLIP);
              };
              
              /**
               * setCSIP(off, sel, fCall)
               *
               * This function is a little different from the other segment setters, only because it turns out that CS is
               * never set without an accompanying IP (well, except for a few undocumented instructions, like POP CS, which
               * were available ONLY on the 8086/8088/80186/80188; see setCS() for details).
               *
               * And even though this function is called setCSIP(), please note the order of the parameters is IP,CS,
               * which matches the order that CS:IP values are normally stored in memory, allowing us to make calls like this:
               *
               *      this.setCSIP(this.popWord(), this.popWord());
               *
               * @this {X86CPU}
               * @param {number} off
               * @param {number} sel
               * @param {boolean} [fCall] is true if CALLF in progress, false if RETF/IRET in progress, null/undefined otherwise
               * @return {boolean|null} true if a stack switch occurred; the only opcode that really needs to pay attention is opRETFn()
               */
              X86CPU.prototype.setCSIP = function(off, sel, fCall)
              {
                  this.segCS.fCall = fCall;
                  /*
                   * We break this operation into the following discrete steps (eg, set IP, load CS, and then update IP) so
                   * that segCS.load(sel) has the ability to modify IP when sel refers to a gate (call, interrupt, trap, etc).
                   *
                   * NOTE: regEIP acts merely as a conduit for the IP, if any, that segCS.load() may load; regLIP is still our
                   * internal instruction pointer.  Callers that need the real IP must call getIP().
                   */
                  this.regEIP = off;
                  var base = this.segCS.load(sel);
                  if (base !== X86.ADDR_INVALID) {
                      this.regLIP = (base + (this.regEIP & (I386? this.dataMask : 0xffff)))|0;
                      this.regLIPLimit = (base + this.segCS.limit)|0;
                      if (I386) this.resetSizes();
                      if (PREFETCH) this.flushPrefetch(this.regLIP);
                      return this.segCS.fStackSwitch;
                  }
                  return null;
              };
              
              /**
               * setCSBase(addr)
               *
               * Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls to setBase()
               * for segCS need to go through here.
               *
               * @param {number} addr
               */
              X86CPU.prototype.setCSBase = function(addr)
              {
                  var regIP = this.getIP();
                  addr = this.segCS.setBase(addr);
                  this.regLIP = (addr + regIP)|0;
                  this.regLIPLimit = (addr + this.segCS.limit)|0;
              };
              
              /**
               * advanceIP(inc)
               *
               * @this {X86CPU}
               * @param {number} inc (positive)
               */
              X86CPU.prototype.advanceIP = function(inc)
              {
                  this.assert(inc > 0);
                  this.regLIP = (this.regLIP + inc)|0;
                  /*
                   * Properly comparing regLIP to regLIPLimit would normally require coercing both to unsigned
                   * (ie, floating-point) values.  But instead, we do a subtraction, (regLIPLimit - regLIP), and
                   * if the result is negative, we need only be concerned if the signs of both numbers are the same
                   * (ie, the sign of their XOR'ed union is positive).
                   *
                   * TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
                   * even though the correct time to do the latter is immediately BEFORE a fetch, not AFTER; eg,
                   * consider the following code:
                   *
                   *      AX=0100 BX=0015 CX=0080 DX=F859 SP=0A62 BP=0A98 SI=0000 DI=0000
                   *      SS=0038[1759E0,0B5F] DS=02E8[0107A0,017F] ES=0970[009700,6949] A20=ON
                   *      CS=02E0[010080,06FB] LD=0028[000000,0000] GD=[11AEE0,4977] ID=[120082,03FF]
                   *      TR=0010 MS=FFF3 PS=3202 V0 D0 I1 T0 S0 Z0 A0 P0 C0
                   *      02E0:06F9 C20400          RET      0004
                   *
                   * After fetching the 3rd byte of the "RET 0004" instruction at CS:06FB, the CPU wants to automatically
                   * advance IP to 06FC, which of course, exceeds the limit, but that doesn't matter unless we actually
                   * fetch a byte from 06FC, which won't happen.  I'm working around this for now by applying a -1
                   * fudge factor to the fault check below.
                   */
                  var off = (this.regLIPLimit - this.regLIP)|0;
                  if (off < 0 && (this.regLIPLimit ^ this.regLIP) >= 0) {
                      /*
                       * There's no such thing as a GP fault on the 8086/8088, and I'm assuming that, on newer
                       * processors, when the segment limit is set to the maximum, it's OK for IP to wrap.
                       */
                      if (this.model <= X86.MODEL_8088 || this.segCS.limit == this.segCS.addrMask) {
                          this.setIP(this.regLIP - this.segCS.base);
                      } else if (off < -1) {          // fudge factor
                          X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                      }
                  }
              };
              
              /**
               * rewindIP(dec)
               *
               * @this {X86CPU}
               * @param {number} dec (negative)
               */
              X86CPU.prototype.rewindIP = function(dec)
              {
                  this.assert(dec < 0);
                  this.regLIP = (this.regLIP + dec)|0;
                  /*
                   * Since rewindIP() is used only for discrete "intra-instruction" IP adjustments, there should be no need
                   * to perform all the same limit checks as advanceIP().
                   */
                  if (PREFETCH) this.advancePrefetch(dec);
              };
              
              /**
               * getSP()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getSP = function()
              {
                  if (I386) {
                      // assert(!((this.regLSP - this.segSS.base) & ~this.segSS.addrMask));
                      return (this.regESP & ~this.segSS.addrMask) | (this.regLSP - this.segSS.base);
                  }
                  return (this.regLSP - this.segSS.base)|0;
              };
              
              /**
               * setSP(off)
               *
               * @this {X86CPU}
               * @param {number} off
               */
              X86CPU.prototype.setSP = function(off)
              {
                  if (I386) {
                      this.regESP = off;
                      this.regLSP = (this.segSS.base + (off & this.segSS.addrMask))|0;
                  } else {
                      this.regLSP = (this.segSS.base + off)|0;
                  }
              };
              
              /**
               * setArithResult(dst, src, value, type, fSubtract)
               *
               * Updates the flags for arithmetic instructions; use setLogicResult() for logical instructions.
               *
               * The type parameter indicates both the size of the result (BYTE, WORD or DWORD) and which of the
               * flags should now be considered "cached" by the new result variables.  If the previous resultType
               * specifies any flags not contained in the new type parameter, then those flags must be immediately
               * calculated and written to the appropriate bit(s) in regPS.
               *
               * The fSubtract parameter is used to indicate a "subtracted" result (eg, CMP, DEC, SUB, SBB); the
               * default assumes an "added" result (eg, ADD, ADC, INC).
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @param {number} value
               * @param {number} type
               * @param {boolean} [fSubtract]
               */
              X86CPU.prototype.setArithResult = function(dst, src, value, type, fSubtract)
              {
                  if ((type & X86.RESULT.ALL) != X86.RESULT.ALL && type != this.resultType) {
                      var diff = ((type ^ this.resultType) & this.resultType);
                      if (diff) {
                          if (diff & X86.RESULT.CF) this.getCF();
                          if (diff & X86.RESULT.PF) this.getPF();
                          if (diff & X86.RESULT.AF) this.getAF();
                          if (diff & X86.RESULT.ZF) this.getZF();
                          if (diff & X86.RESULT.SF) this.getSF();
                          if (diff & X86.RESULT.OF) this.getOF();
                      }
                  }
                  if (!fSubtract) {
                      this.resultDst = dst;
                      this.resultArith = value;
                  } else {
                      this.resultDst = value;
                      this.resultArith = dst;
                  }
                  this.resultSrc = src;
                  this.resultLogic = value;
                  this.resultType = type;
              };
              
              /**
               * setLogicResult(value, type, carry, overflow)
               *
               * Updates the flags for logical instructions (eg, AND, OR, TEST, XOR); ie, instructions
               * that update PF, ZF, and SF, while clearing CF and OF (although CF and OF can be explicitly
               * set via the carry and overflow parameters as needed).  AF is always considered undefined.
               *
               * TODO: We should observe the behavior of AF on real CPUs, and determine if there is a
               * well-defined behavior, even though none is documented.  Ditto for OF on shift instructions
               * when the shift count > 1.
               *
               * @this {X86CPU}
               * @param {number} value
               * @param {number} type
               * @param {number} [carry]
               * @param {number} [overflow]
               * @return {number} value
               */
              X86CPU.prototype.setLogicResult = function(value, type, carry, overflow)
              {
                  this.resultType = type | X86.RESULT.LOGIC;
                  this.resultLogic = value;
                  if (carry) this.setCF(); else this.clearCF();
                  if (overflow) this.setOF(); else this.clearOF();
                  return value;
              };
              
              /**
               * setRotateResult(result, carry, size)
               *
               * Used by all rotate instructions (ie, RCL, RCR, ROL, ROR) to update CF and OF.
               *
               * TODO: We should observe the behavior of OF on real CPUs whenever the rotate count > 1,
               * and determine if there is a well-defined behavior, even though none is documented.
               *
               * @this {X86CPU}
               * @param {number} result
               * @param {number} carry
               * @param {number} size
               */
              X86CPU.prototype.setRotateResult = function(result, carry, size)
              {
                  if (carry & size) this.setCF(); else this.clearCF();
                  if ((result ^ carry) & size) this.setOF(); else this.clearOF();
              };
              
              /**
               * getCarry()
               *
               * @this {X86CPU}
               * @return {number} 0 or 1, depending on whether CF is clear or set
               */
              X86CPU.prototype.getCarry = function()
              {
                  return this.getCF()? 1 : 0;
              };
              
              /**
               * getCF()
               *
               * Notes regarding carry following an I386 addition:
               *
               * The following table summarizes bit 31 of dst, src, and result, along with the expected carry:
               *
               *      dst src res carry
               *      --- --- --- -----
               *      0   0   0   0       no
               *      0   0   1   0       no (there must have been a carry out of bit 30, but it was "absorbed")
               *      0   1   0   1       yes (there must have been a carry out of bit 30, but it was NOT "absorbed")
               *      0   1   1   0       no
               *      1   0   0   1       yes (same as the preceding "yes" case)
               *      1   0   1   0       no
               *      1   1   0   1       yes (since the addition of two ones must always produce a carry)
               *      1   1   1   1       yes (since the addition of two ones must always produce a carry)
               *
               * So, we use the following calculation:
               *
               *      (resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.CF
               */
              X86CPU.prototype.getCF = function()
              {
                  if (this.resultType & X86.RESULT.CF) {
                      this.regPS &= ~X86.PS.CF;
                      if ((this.resultDst ^ ((this.resultDst ^ this.resultSrc) & (this.resultSrc ^ this.resultArith))) & (this.resultType & X86.RESULT.TYPE)) {
                          this.regPS |= X86.PS.CF;
                      }
                      this.resultType &= ~X86.RESULT.CF;
                  }
                  return this.regPS & X86.PS.CF;
              };
              
              /**
               * getPF()
               *
               * From http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel:
               *
               *      unsigned int v;  // word value to compute the parity of
               *      v ^= v >> 16;
               *      v ^= v >> 8;
               *      v ^= v >> 4;
               *      v &= 0xf;
               *      return (0x6996 >> v) & 1;
               *
               *      The method above takes around 9 operations, and works for 32-bit words.  It may be optimized to work just on
               *      bytes in 5 operations by removing the two lines immediately following "unsigned int v;".  The method first shifts
               *      and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v.  Next,
               *      the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the
               *      lowest nibble of v.  This number is like a miniature 16-bit parity-table indexed by the low four bits in v.
               *      The result has the parity of v in bit 1, which is masked and returned.
               *
               * The x86 parity flag (PF) is based exclusively on the low 8 bits of resultParitySign, and PF must be SET if that byte
               * has EVEN parity; the above calculation yields ODD parity, so we use the conditional operator to invert the result.
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.PF
               */
              X86CPU.prototype.getPF = function()
              {
                  if (this.resultType & X86.RESULT.PF) {
                      this.regPS &= ~X86.PS.PF;
                      if ((0x9669 >> ((this.resultLogic ^ (this.resultLogic >> 4)) & 0xf)) & 1) {
                          this.regPS |= X86.PS.PF;
                      }
                      this.resultType &= ~X86.RESULT.PF;
                  }
                  return this.regPS & X86.PS.PF;
              };
              
              /**
               * getAF()
               *
               * To determine if there's been a carry out of the low 4 bits of an arithmetic operation,
               * we look at all the possible inputs for bit 4, and calculate AF = PS^(D^S):
               *
               *      D   S   A   D^S AF
               *      -   -   -   --- --
               *      0   0   0   0   0
               *      0   0   1   0   1
               *      0   1   0   1   1
               *      0   1   1   1   0
               *      1   0   0   1   1
               *      1   0   1   1   0
               *      1   1   0   0   0
               *      1   1   1   0   1
               *
               * The final calculation looks like:
               *
               *      (resultArith ^ (resultDst ^ resultSrc)) & 0x0010
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.AF
               */
              X86CPU.prototype.getAF = function()
              {
                  if (this.resultType & X86.RESULT.AF) {
                      this.regPS &= ~X86.PS.AF;
                      if ((this.resultArith ^ (this.resultDst ^ this.resultSrc)) & 0x0010) {
                          this.regPS |= X86.PS.AF;
                      }
                      this.resultType &= ~X86.RESULT.AF;
                  }
                  return this.regPS & X86.PS.AF;
              };
              
              /**
               * getZF()
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.ZF
               */
              X86CPU.prototype.getZF = function()
              {
                  if (this.resultType & X86.RESULT.ZF) {
                      this.regPS &= ~X86.PS.ZF;
                      if (!(this.resultLogic & (((this.resultType & X86.RESULT.TYPE) - 1) | (this.resultType & X86.RESULT.TYPE)))) {
                          this.regPS |= X86.PS.ZF;
                      }
                      this.resultType &= ~X86.RESULT.ZF;
                  }
                  return this.regPS & X86.PS.ZF;
              };
              
              /**
               * getSF()
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.SF
               */
              X86CPU.prototype.getSF = function()
              {
                  if (this.resultType & X86.RESULT.SF) {
                      this.regPS &= ~X86.PS.SF;
                      if (this.resultLogic & (this.resultType & X86.RESULT.TYPE)) {
                          this.regPS |= X86.PS.SF;
                      }
                      this.resultType &= ~X86.RESULT.SF;
                  }
                  return this.regPS & X86.PS.SF;
              };
              
              /**
               * getOF()
               *
               * Overflow was originally calculated as:
               *
               *      (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
               *
               * but as you can see, that calculation depends on the carry out of the 8/16/32-bit result in
               * resultParitySign, which we don't have access to for 32-bit results.  So we fall-back to the
               * following:
               *
               *      ((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType
               *
               * which you can verify from the following table of sign bits (where x1 is resultDst ^ resultArith,
               * and x2 is resultSrc ^ resultArith):
               *
               *      D   S   A   x1  x2  OF
               *      -   -   -   --  --  --
               *      0   0   0   0   0   0
               *      0   0   1   1   1   1 (adding two positive values yielded a negative value)
               *      0   1   0   0   1   0
               *      0   1   1   1   0   0
               *      1   0   0   1   0   0
               *      1   0   1   0   1   0
               *      1   1   0   1   1   1 (adding two negative values yielded a positive value)
               *      1   1   1   0   0   0
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.OF
               */
              X86CPU.prototype.getOF = function()
              {
                  if (this.resultType & X86.RESULT.OF) {
                      this.regPS &= ~X86.PS.OF;
                      if (((this.resultDst ^ this.resultArith) & (this.resultSrc ^ this.resultArith)) & (this.resultType & X86.RESULT.TYPE)) {
                          this.regPS |= X86.PS.OF;
                      }
                      this.resultType &= ~X86.RESULT.OF;
                  }
                  return this.regPS & X86.PS.OF;
              };
              
              /**
               * getTF()
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.TF
               */
              X86CPU.prototype.getTF = function()
              {
                  return (this.regPS & X86.PS.TF);
              };
              
              /**
               * getIF()
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.IF
               */
              X86CPU.prototype.getIF = function()
              {
                  return (this.regPS & X86.PS.IF);
              };
              
              /**
               * getDF()
               *
               * @this {X86CPU}
               * @return {number} 0 or X86.PS.DF
               */
              X86CPU.prototype.getDF = function()
              {
                  return (this.regPS & X86.PS.DF);
              };
              
              /**
               * clearCF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearCF = function()
              {
                  this.resultType &= ~X86.RESULT.CF;
                  this.regPS &= ~X86.PS.CF;
              };
              
              /**
               * clearPF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearPF = function()
              {
                  this.resultType &= ~X86.RESULT.PF;
                  this.regPS &= ~X86.PS.PF;
              };
              
              /**
               * clearAF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearAF = function()
              {
                  this.resultType &= ~X86.RESULT.AF;
                  this.regPS &= ~X86.PS.AF;
              };
              
              /**
               * clearZF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearZF = function()
              {
                  this.resultType &= ~X86.RESULT.ZF;
                  this.regPS &= ~X86.PS.ZF;
              };
              
              /**
               * clearSF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearSF = function()
              {
                  this.resultType &= ~X86.RESULT.SF;
                  this.regPS &= ~X86.PS.SF;
              };
              
              /**
               * clearIF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearIF = function()
              {
                  this.regPS &= ~X86.PS.IF;
              };
              
              /**
               * clearDF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearDF = function()
              {
                  this.regPS &= ~X86.PS.DF;
              };
              
              /**
               * clearOF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.clearOF = function()
              {
                  this.resultType &= ~X86.RESULT.OF;
                  this.regPS &= ~X86.PS.OF;
              };
              
              /**
               * setCF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setCF = function()
              {
                  this.resultType &= ~X86.RESULT.CF;
                  this.regPS |= X86.PS.CF;
              };
              
              /**
               * setPF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setPF = function()
              {
                  this.resultType &= ~X86.RESULT.PF;
                  this.regPS |= X86.PS.PF;
              };
              
              /**
               * setAF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setAF = function()
              {
                  this.resultType &= ~X86.RESULT.AF;
                  this.regPS |= X86.PS.AF;
              };
              
              /**
               * setZF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setZF = function()
              {
                  this.resultType &= ~X86.RESULT.ZF;
                  this.regPS |= X86.PS.ZF;
              };
              
              /**
               * setSF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setSF = function()
              {
                  this.resultType &= ~X86.RESULT.SF;
                  this.regPS |= X86.PS.SF;
              };
              
              /**
               * setIF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setIF = function()
              {
                  this.regPS |= X86.PS.IF;
              };
              
              /**
               * setDF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setDF = function()
              {
                  this.regPS |= X86.PS.DF;
              };
              
              /**
               * setOF()
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.setOF = function()
              {
                  this.resultType &= ~X86.RESULT.OF;
                  this.regPS |= X86.PS.OF;
              };
              
              /**
               * getPS()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86CPU.prototype.getPS = function()
              {
                  return (this.regPS & ~X86.PS_CACHED) | (this.getCF() | this.getPF() | this.getAF() | this.getZF() | this.getSF() | this.getOF());
              };
              
              /**
               * setMSW(w)
               *
               * Factored out of x86op0f.js, since both opLMSW and opLOADALL are capable of setting a new MSW.
               * The caller is responsible for assessing the appropriate cycle cost.
               *
               * @this {X86CPU}
               * @param {number} w
               */
              X86CPU.prototype.setMSW = function(w)
              {
                  /*
                   * This instruction is always allowed to set MSW.PE, but it cannot clear MSW.PE once set;
                   * therefore, we always OR the previous value of MSW.PE into the new value before loading.
                   */
                  w |= (this.regCR0 & X86.CR0.MSW.PE) | X86.CR0.MSW.ON;
                  this.regCR0 = (this.regCR0 & ~X86.CR0.MSW.MASK) | (w & X86.CR0.MSW.MASK);
                  /*
                   * Since the 80286 cannot return to real-mode via this instruction, the only transition we
                   * must worry about is to protected-mode.  And there's no harm calling setProtMode() if the
                   * CPU is already in protected-mode; we could certainly optimize out the call in that case,
                   * but the instruction isn't used frequently enough to warrant it.
                   */
                  if (this.regCR0 & X86.CR0.MSW.PE) this.setProtMode(true);
              };
              
              /**
               * setPS(regPS)
               *
               * @this {X86CPU}
               * @param {number} regPS
               * @param {number} [cpl]
               */
              X86CPU.prototype.setPS = function(regPS, cpl)
              {
                  /*
                   * OS/2 1.0 discriminates between an 80286 and an 80386 based on whether an IRET in real-mode that
                   * pops 0xF000 into the flags is able to set *any* of flag bits 12-15: if it can, then OS/2 declares
                   * the CPU an 80386.  Therefore, in real-mode, we must zero all incoming bits 12-15.
                   *
                   * This has the added benefit of relieving us from zeroing the effective IOPL (this.nIOPL) whenever
                   * we're in real-mode, since we're zeroing the incoming IOPL bits up front now.
                   */
                  if (!(this.regCR0 & X86.CR0.MSW.PE)) {
                      regPS &= ~(X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
                  }
              
                  /*
                   * There are some cases (eg, an IRET returning to a less privileged code segment) where the CPL
                   * we compare against should come from the outgoing code segment, so if the caller provided it, use it.
                   */
                  if (cpl === undefined) cpl = this.segCS.cpl;
              
                  /*
                   * Since PS.IOPL and PS.IF are part of PS_DIRECT, we need to take care of any 80286-specific behaviors
                   * before setting the PS_DIRECT bits from the incoming regPS bits.
                   *
                   * Specifically, PS.IOPL is unchanged if CPL > 0, and PS.IF is unchanged if CPL > IOPL.
                   */
                  if (!cpl) {
                      this.nIOPL = (regPS & X86.PS.IOPL.MASK) >> X86.PS.IOPL.SHIFT;           // IOPL allowed to change
                  } else {
                      regPS = (regPS & ~X86.PS.IOPL.MASK) | (this.regPS & X86.PS.IOPL.MASK);  // IOPL not allowed to change
                  }
              
                  if (cpl > this.nIOPL) {
                      regPS = (regPS & ~X86.PS.IF) | (this.regPS & X86.PS.IF);                // IF not allowed to change
                  }
              
                  this.resultType = X86.RESULT.BYTE;
                  this.regPS = (this.regPS & ~(this.PS_DIRECT|X86.PS_CACHED)) | (regPS & (this.PS_DIRECT|X86.PS_CACHED)) | this.PS_SET;
              
                  if (this.regPS & X86.PS.TF) {
                      this.intFlags |= X86.INTFLAG.TRAP;
                      this.opFlags |= X86.OPFLAG.NOINTR;
                  }
              };
              
              /**
               * traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
               *
               * @this {X86CPU}
               * @param {string} prop
               * @param {number} dst
               * @param {number} src
               * @param {number|null} flagsIn
               * @param {number|null} flagsOut
               * @param {number} resultLo
               * @param {number} [resultHi]
               */
              X86CPU.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
              {
                  if (DEBUG && this.dbg) {
                      this.dbg.traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi);
                  }
              };
              
              /**
               * setBinding(sHTMLType, sBinding, control)
               *
               * @this {X86CPU}
               * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
               * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "AX")
               * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
               * @return {boolean} true if binding was successful, false if unrecognized binding request
               */
              X86CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
              {
                  var fBound = false;
                  switch (sBinding) {
                  case "EAX":
                  case "EBX":
                  case "ECX":
                  case "EDX":
                  case "ESP":
                  case "EBP":
                  case "ESI":
                  case "EDI":
                  case "EIP":
                  case "AX":
                  case "BX":
                  case "CX":
                  case "DX":
                  case "SP":
                  case "BP":
                  case "SI":
                  case "DI":
                  case "IP":
                  case "PC":      // deprecated as an alias for "IP" (still used by older XML files, like the one at http://tpoindex.github.io/crobots/)
                  case "CS":
                  case "DS":
                  case "SS":
                  case "ES":
                  case "PS":      // this refers to "Processor Status", aka the 16-bit flags register (although DEBUG.COM refers to this as "PC", surprisingly)
                  case "C":
                  case "P":
                  case "A":
                  case "Z":
                  case "S":
                  case "T":
                  case "I":
                  case "D":
                  case "V":
                      this.bindings[sBinding] = control;
                      this.cLiveRegs++;
                      fBound = true;
                      break;
                  default:
                      fBound = this.parent.setBinding.call(this, sHTMLType, sBinding, control);
                      break;
                  }
                  return fBound;
              };
              
              /**
               * probeAddr(addr)
               *
               * Used by the Debugger to probe addresses without risk of triggering a page fault, and by internal
               * functions, like fnFaultMessage(), that also need to avoid triggering faults, since they're not part
               * of standard CPU operation.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number|null} byte (8-bit) value at that address, or null if invalid
               */
              X86CPU.prototype.probeAddr = function(addr)
              {
                  var block = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift];
                  if (block.type == Memory.TYPE.UNPAGED) {
                      block = this.mapPageBlock(addr, false, true);
                      if (!block) return null;
                  }
                  return block.readByteDirect(addr & this.nBlockLimit, addr);
              };
              
              /**
               * getByte(addr)
               *
               * Use bus.getByte() for physical addresses, and cpu.getByte() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getByte = function getByte(addr)
              {
                  if (BACKTRACK) this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                  return this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
              };
              
              /**
               * getShort(addr)
               *
               * Use bus.getShort() for physical addresses, and cpu.getShort() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.getShort = function getShort(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                  /*
                   * On the 8088, it takes 4 cycles to read the additional byte REGARDLESS whether the address is odd or even.
                   * TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
                   */
                  this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
              
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                      this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
                  }
                  if (off < this.nBlockLimit) {
                      return this.aMemBlocks[iBlock].readShort(off, addr);
                  }
                  return this.aMemBlocks[iBlock].readByte(off, addr) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readByte(0, addr + 1) << 8);
              };
              
              /**
               * getLong(addr)
               *
               * Use bus.getLong() for physical addresses, and cpu.getLong() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} long (32-bit) value at that address
               */
              X86CPU.prototype.getLong = function getLong(addr)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                      this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
                  }
                  if (off < this.nBlockLimit - 2) {
                      return this.aMemBlocks[iBlock].readLong(off, addr);
                  }
                  var nShift = (off & 0x3) << 3;
                  return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
              };
              
              /**
               * setByte(addr, b)
               *
               * Use bus.setByte() for physical addresses, and cpu.setByte() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @param {number} b is the byte (8-bit) value to write (which we truncate to 8 bits; required by opSTOSb)
               */
              X86CPU.prototype.setByte = function setByte(addr, b)
              {
                  if (BACKTRACK) this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                  this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
              };
              
              /**
               * setShort(addr, w)
               *
               * Use bus.setShort() for physical addresses, and cpu.setShort() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @param {number} w is the word (16-bit) value to write (which we truncate to 16 bits to be safe)
               */
              X86CPU.prototype.setShort = function setShort(addr, w)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                  /*
                   * On the 8088, it takes 4 cycles to write the additional byte REGARDLESS whether the address is odd or even.
                   * TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
                   */
                  this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
              
                  if (BACKTRACK) {
                      this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                      this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
                  }
                  if (off < this.nBlockLimit) {
                      this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
                      return;
                  }
                  this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
                  this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
              };
              
              /**
               * setLong(addr, l)
               *
               * Use bus.setLong() for physical addresses, and cpu.setLong() for linear addresses; the latter takes care
               * of paging, cycle counts, and BACKTRACK states, if any.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @param {number} l is the long (32-bit) value to write
               */
              X86CPU.prototype.setLong = function setLong(addr, l)
              {
                  var off = addr & this.nBlockLimit;
                  var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                  this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
              
                  if (BACKTRACK) {
                      this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                      this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
                  }
                  if (off < this.nBlockLimit - 2) {
                      this.aMemBlocks[iBlock].writeLong(off, l, addr);
                      return;
                  }
                  var lPrev, nShift = (off & 0x3) << 3;
                  off &= ~0x3;
                  lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
                  this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~(-1 << nShift)) | (l << nShift), addr);
                  iBlock = (iBlock + 1) & this.nBlockMask;
                  addr += 3;
                  lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
                  this.aMemBlocks[iBlock].writeLong(0, (lPrev & (-1 << nShift)) | (l >>> (32 - nShift)), addr);
              };
              
              /**
               * getEAByte(seg, off)
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getEAByte = function(seg, off)
              {
                  this.segEA = seg;
                  this.regEA = seg.checkRead(this.offEA = off, 1);
                  if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                  var b = this.getByte(this.regEA);
                  if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
                  return b;
              };
              
              /**
               * getEAByteData(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getEAByteData = function(off)
              {
                  return this.getEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * getEAByteStack(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getEAByteStack = function(off)
              {
                  return this.getEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * getEAWord(seg, off)
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.getEAWord = function(seg, off)
              {
                  this.segEA = seg;
                  this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
                  if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                  var w = this.getWord(this.regEA);
                  if (BACKTRACK) {
                      this.backTrack.btiEALo = this.backTrack.btiMemLo;
                      this.backTrack.btiEAHi = this.backTrack.btiMemHi;
                  }
                  return w;
              };
              
              /**
               * getEAWordData(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.getEAWordData = function(off)
              {
                  return this.getEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * getEAWordStack(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.getEAWordStack = function(off)
              {
                  return this.getEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * modEAByte(seg, off)
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.modEAByte = function(seg, off)
              {
                  this.segEA = seg;
                  this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, 1);
                  if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                  var b = this.getByte(this.regEA);
                  if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
                  return b;
              };
              
              /**
               * modEAByteData(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.modEAByteData = function(off)
              {
                  return this.modEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * modEAByteStack(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.modEAByteStack = function(off)
              {
                  return this.modEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * modEAWord(seg, off)
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.modEAWord = function(seg, off)
              {
                  this.segEA = seg;
                  this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
                  if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                  var w = this.getWord(this.regEA);
                  if (BACKTRACK) {
                      this.backTrack.btiEALo = this.backTrack.btiMemLo;
                      this.backTrack.btiEAHi = this.backTrack.btiMemHi;
                  }
                  return w;
              };
              
              /**
               * modEAWordData(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.modEAWordData = function(off)
              {
                  return this.modEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * modEAWordStack(off)
               *
               * @this {X86CPU}
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.modEAWordStack = function(off)
              {
                  return this.modEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
              };
              
              /**
               * setEAByte(b)
               *
               * @this {X86CPU}
               * @param {number} b is the byte (8-bit) value to write
               */
              X86CPU.prototype.setEAByte = function(b)
              {
                  if (this.opFlags & X86.OPFLAG.NOWRITE) return;
                  if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiEALo;
                  this.setByte(this.segEA.checkWrite(this.offEA, 1), b);
              };
              
              /**
               * setEAWord(w)
               *
               * @this {X86CPU}
               * @param {number} w is the word (16-bit) value to write
               */
              X86CPU.prototype.setEAWord = function(w)
              {
                  if (this.opFlags & X86.OPFLAG.NOWRITE) return;
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiEALo;
                      this.backTrack.btiMemHi = this.backTrack.btiEAHi;
                  }
                  if (!I386) {
                      this.setShort(this.segEA.checkWrite(this.offEA, 2), w);
                  } else {
                      this.setWord(this.segEA.checkWrite(this.offEA, this.dataSize), w);
                  }
              };
              
              /**
               * getSOByte(seg, off)
               *
               * This is like getEAByte(), but it does NOT update regEA.
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getSOByte = function(seg, off)
               {
                  return this.getByte(seg.checkRead(off, 1));
              };
              
              /**
               * getSOWord(seg, off)
               *
               * This is like getEAWord(), but it does NOT update regEA.
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @return {number} word (16-bit) value at that address
               */
              X86CPU.prototype.getSOWord = function(seg, off)
              {
                  if (!I386) {
                      return this.getShort(seg.checkRead(off, 2));
                  } else {
                      return this.getWord(seg.checkRead(off, this.dataSize));
                  }
              };
              
              /**
               * setSOByte(seg, off, b)
               *
               * This is like setEAByte(), but it does NOT update regEAWrite.
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @param {number} b is the byte (8-bit) value to write
               */
              X86CPU.prototype.setSOByte = function(seg, off, b)
              {
                  this.setByte(seg.checkWrite(off, 1), b);
              };
              
              /**
               * setSOWord(seg, off, w)
               *
               * This is like setEAWord(), but it does NOT update regEAWrite.
               *
               * @this {X86CPU}
               * @param {X86Seg} seg register (eg, segDS)
               * @param {number} off is a segment-relative offset
               * @param {number} w is the word (16-bit) value to write
               */
              X86CPU.prototype.setSOWord = function(seg, off, w)
              {
                  if (!I386) {
                      this.setShort(seg.checkWrite(off, 2), w);
                  } else {
                      this.setWord(seg.checkWrite(off, this.dataSize), w);
                  }
              };
              
              /**
               * getBytePrefetch(addr)
               *
               * Return the next byte from the prefetch queue, prefetching it now if necessary.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} byte (8-bit) value at that address
               */
              X86CPU.prototype.getBytePrefetch = function(addr)
              {
                  if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                  var b;
                  if (!this.cbPrefetchQueued) {
                      if (MAXDEBUG) {
                          this.printMessage("  getBytePrefetch[" + this.iPrefetchTail + "]: filling");
                          this.assert(addr == this.addrPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid head address (" + str.toHex(this.addrPrefetchHead) + ")");
                          this.assert(this.iPrefetchTail == this.iPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): head (" + this.iPrefetchHead + ") does not match tail (" + this.iPrefetchTail + ")");
                      }
                      this.fillPrefetch(1);
                      this.nBusCycles += 4;
                      /*
                       * This code effectively inlines this.fillPrefetch(1), but without queueing the byte, so it's an optimization
                       * with side-effects we may not want, and in any case, while it seemed to improve Safari's performance slightly,
                       * it did nothing for the oddball Chrome performance I'm seeing with PREFETCH enabled.
                       *
                       *      b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
                       *      this.nBusCycles += 4;
                       *      this.cbPrefetchValid = 0;
                       *      this.addrPrefetchHead = (addr + 1) & this.nMemMask;
                       *      return b;
                       */
                  }
                  b = this.aPrefetch[this.iPrefetchTail] & 0xff;
                  if (MAXDEBUG) {
                      this.printMessage("  getBytePrefetch[" + this.iPrefetchTail + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
                      this.assert(addr == (this.aPrefetch[this.iPrefetchTail] >> 8), "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid tail address (" + str.toHex(this.aPrefetch[this.iPrefetchTail] >> 8) + ")");
                  }
                  this.iPrefetchTail = (this.iPrefetchTail + 1) & X86CPU.PREFETCH.MASK;
                  this.cbPrefetchQueued--;
                  return b;
              };
              
              /**
               * getShortPrefetch(addr)
               *
               * Return the next short from the prefetch queue.  There are 3 cases to consider:
               *
               *  1) Both bytes have been prefetched; no bytes need be fetched from memory
               *  2) Only the low byte has been prefetched; the high byte must be fetched from memory
               *  3) Neither byte has been prefetched; both bytes must be fetched from memory
               *
               * However, since we want to mirror getBytePrefetch's behavior of fetching all bytes through
               * the prefetch queue, we're taking the easy way out and simply calling getBytePrefetch() twice.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} short (16-bit) value at that address
               */
              X86CPU.prototype.getShortPrefetch = function(addr)
              {
                  return this.getBytePrefetch(addr) | (this.getBytePrefetch(addr + 1) << 8);
              };
              
              /**
               * getLongPrefetch(addr)
               *
               * Return the next long from the prefetch queue.  Similar to getShortPrefetch(), we take the
               * easy way out and call getShortPrefetch() twice.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} long (32-bit) value at that address
               */
              X86CPU.prototype.getLongPrefetch = function(addr)
              {
                  return this.getShortPrefetch(addr) | (this.getShortPrefetch(addr + 2) << 16);
              };
              
              /**
               * getWordPrefetch(addr)
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address
               * @return {number} short (16-bit) or long (32-bit value as appropriate
               */
              X86CPU.prototype.getWordPrefetch = function(addr)
              {
                  return (I386 && this.dataSize == 4? this.getLongPrefetch(addr) : this.getShortPrefetch(addr));
              };
              
              /**
               * fillPrefetch(n)
               *
               * Fill the prefetch queue with n instruction bytes.
               *
               * @this {X86CPU}
               * @param {number} n is the number of instruction bytes to fetch
               */
              X86CPU.prototype.fillPrefetch = function(n)
              {
                  while (n-- > 0 && this.cbPrefetchQueued < X86CPU.PREFETCH.QUEUE) {
                      var addr = this.addrPrefetchHead;
                      var b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
                      this.aPrefetch[this.iPrefetchHead] = b | (addr << 8);
                      if (MAXDEBUG) this.printMessage("     fillPrefetch[" + this.iPrefetchHead + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
                      this.addrPrefetchHead = (addr + 1) & this.nMemMask;
                      this.iPrefetchHead = (this.iPrefetchHead + 1) & X86CPU.PREFETCH.MASK;
                      this.cbPrefetchQueued++;
                      /*
                       * We could probably allow cbPrefetchValid to grow as large as X86CPU.PREFETCH.ARRAY-1, but I'm not
                       * sure there's any advantage to that; certainly the tiny values we expect to see from advancePrefetch()
                       * wouldn't justify that.
                       */
                      if (this.cbPrefetchValid < X86CPU.PREFETCH.QUEUE) this.cbPrefetchValid++;
                  }
              };
              
              /**
               * flushPrefetch(addr)
               *
               * Empty the prefetch queue.
               *
               * @this {X86CPU}
               * @param {number} addr is a linear address of the current program counter (regLIP)
               */
              X86CPU.prototype.flushPrefetch = function(addr)
              {
                  this.addrPrefetchHead = addr;
                  this.iPrefetchTail = this.iPrefetchHead = this.cbPrefetchQueued = this.cbPrefetchValid = 0;
                  if (MAXDEBUG && addr !== undefined) this.printMessage("    flushPrefetch[-]: " + str.toHex(addr));
              };
              
              /**
               * advancePrefetch(inc)
               *
               * Advance the prefetch queue tail.  This is used, for example, in cases where the IP is rewound
               * to the start of a repeated string instruction (ie, a string instruction with a REP and possibly
               * other prefixes).
               *
               * If a negative increment takes us beyond what's still valid in the prefetch queue, or if a positive
               * increment takes us beyond what's been queued so far, then we simply flush the queue.
               *
               * @this {X86CPU}
               * @param {number} inc (may be +/-)
               */
              X86CPU.prototype.advancePrefetch = function(inc)
              {
                  if (inc < 0 && this.cbPrefetchQueued - inc <= this.cbPrefetchValid || inc > 0 && inc < this.cbPrefetchQueued) {
                      this.iPrefetchTail = (this.iPrefetchTail + inc) & X86CPU.PREFETCH.MASK;
                      this.cbPrefetchQueued -= inc;
                  } else {
                      this.flushPrefetch(this.regLIP);
                      if (MAXDEBUG) this.printMessage("advancePrefetch(" + inc + "): flushed");
                  }
              };
              
              /**
               * getIPByte()
               *
               * @this {X86CPU}
               * @return {number} byte at the current IP; IP advanced by 1
               */
              X86CPU.prototype.getIPByte = function()
              {
                  var b = (PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP));
                  if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                  this.advanceIP(1);
                  return b;
              };
              
              /**
               * getIPShort()
               *
               * @this {X86CPU}
               * @return {number} short at the current IP; IP advanced by 2
               */
              X86CPU.prototype.getIPShort = function()
              {
                  var w = (PREFETCH? this.getShortPrefetch(this.regLIP) : this.getShort(this.regLIP));
                  if (BACKTRACK) {
                      this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                      this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                  }
                  this.advanceIP(2);
                  return w;
              };
              
              /**
               * getIPLong()
               *
               * @this {X86CPU}
               * @return {number} long at the current IP; IP advanced by 4
               */
              X86CPU.prototype.getIPLong = function()
              {
                  var l = (PREFETCH? this.getLongPrefetch(this.regLIP) : this.getLong(this.regLIP));
                  if (BACKTRACK) {
                      this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                      this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                  }
                  this.advanceIP(4);
                  return l;
              };
              
              /**
               * getIPAddr()
               *
               * @this {X86CPU}
               * @return {number} word at the current IP; IP advanced by 2 or 4, depending on address size
               */
              X86CPU.prototype.getIPAddr = function()
              {
                  /*
                   * TODO: Add PREFETCH support to this function
                   */
                  var w = this.getAddr(this.regLIP);
                  if (BACKTRACK) {
                      this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                      this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                  }
                  this.advanceIP(this.addrSize);
                  return w;
              };
              
              /**
               * getIPWord()
               *
               * @this {X86CPU}
               * @return {number} word at the current IP; IP advanced by 2 or 4, depending on operand size
               */
              X86CPU.prototype.getIPWord = function()
              {
                  var w = (PREFETCH? this.getWordPrefetch(this.regLIP) : this.getWord(this.regLIP));
                  if (BACKTRACK) {
                      this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                      this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                  }
                  this.advanceIP(this.dataSize);
                  return w;
              };
              
              /**
               * getIPDisp()
               *
               * @this {X86CPU}
               * @return {number} sign-extended value from the byte at the current IP; IP advanced by 1
               */
              X86CPU.prototype.getIPDisp = function()
              {
                  var w = ((PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP)) << 24) >> 24;
                  if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                  this.advanceIP(1);
                  return w;
              };
              
              /**
               * getSIBAddr(mod)
               *
               * @this {X86CPU}
               * @param {number} mod
               * @return {number}
               */
              X86CPU.prototype.getSIBAddr = function(mod)
              {
                  var b = PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP);
                  if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                  this.advanceIP(1);
                  return X86ModSIB.aOpModSIB[b].call(this, mod);
              };
              
              /**
               * popWord()
               *
               * @this {X86CPU}
               * @return {number} word popped from the current SP; SP increased by 2 or 4
               */
              X86CPU.prototype.popWord = function()
              {
                  var w = this.getWord(this.regLSP);
                  this.regLSP = (this.regLSP + (I386? this.dataSize : 2))|0;
                  /*
                   * Properly comparing regLSP to regLSPLimit would normally require coercing both to unsigned
                   * (ie, floating-point) values.  But instead, we do a subtraction, (regLSPLimit - regLSP), and
                   * if the result is negative, we need only be concerned if the signs of both numbers are the same
                   * (ie, the sign of their XOR'ed union is positive).
                   *
                   * TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
                   * even though the correct time to do the latter is immediately BEFORE the fetch, not AFTER;
                   * I'm working around this for now by applying a -1 fudge factor to the fault check below.
                   */
                  var off = ((this.regLSPLimit - this.regLSP)|0);
                  if (off < 0 && (this.regLSPLimit ^ this.regLSP) >= 0) {
                      /*
                       * There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
                       * processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
                       */
                      if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
                          this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
                      } else if (off < -1) {          // fudge factor
                          X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
                      }
                  }
                  return w;
              };
              
              /**
               * pushWord(w)
               *
               * @this {X86CPU}
               * @param {number} w is the word (16-bit) value to push at current SP; SP decreased by 2 or 4
               */
              X86CPU.prototype.pushWord = function(w)
              {
                  this.assert((w & this.dataMask) == w);
                  this.regLSP = (this.regLSP - (I386? this.dataSize : 2))|0;
                  /*
                   * Properly comparing regLSP to regLSPLimitLow would normally require coercing both to unsigned
                   * (ie, floating-point) values.  But instead, we do a subtraction, (regLSP - regLSPLimitLow), and
                   * if the result is negative, we need only be concerned if the signs of both numbers are the same
                   * (ie, the sign of their XOR'ed union is positive).
                   */
                  if (((this.regLSP - this.regLSPLimitLow)|0) < 0 && (this.regLSPLimitLow ^ this.regLSP) >= 0) {
                      /*
                       * There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
                       * processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
                       */
                      if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
                          this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
                      } else {
                          X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
                      }
                  }
                  this.setWord(this.regLSP, w);
              };
              
              /**
               * setDMA(fActive)
               *
               * This is called by the ChipSet component to update DMA status.
               *
               * @this {X86CPU}
               * @param {boolean} fActive is true to set INTFLAG.DMA, false to clear
               *
               X86CPU.prototype.setDMA = function(fActive)
               {
                  if (this.chipset) {
                      if (fActive) {
                          this.intFlags |= X86.INTFLAG.DMA;
                      } else {
                          this.intFlags &= ~X86.INTFLAG.DMA;
                      }
                  }
              };
               */
              
              /**
               * checkINTR()
               *
               * This must only be called when intFlags (containing the simulated INTFLAG.INTR signal) is known to be set.
               * Note that it's perfectly possible that between the time updateINTR(true) was called and we request the
               * interrupt vector number below, the interrupt could have been cleared or masked, in which case getIRRVector()
               * will return -1 and we'll simply clear INTFLAG.INTR.
               *
               * intFlags has been overloaded with the INTFLAG.TRAP bit as well, since the acknowledgment of h/w interrupts
               * and the Trap flag are similar; they must both honor the NOINTR suppression flag, and stepCPU() shouldn't
               * have to check multiple variables when deciding whether to simulate an interrupt.
               *
               * This function also includes a check for the new async INTFLAG.DMA flag, which is triggered by a ChipSet call
               * to setDMA().  This DMA flag actually has nothing to do with interrupts; it's simply an expedient way to
               * piggy-back on the CPU's execution logic, to help drive async DMA requests.
               *
               * Originally, DMA requests (eg, FDC or HDC I/O operations) were all handled synchronously, since no actual
               * I/O was required to satisfy the request; from the CPU's perspective, this meant DMA operations were virtually
               * instantaneous.  However, with the introduction of remote disk connections, some actual I/O may now be required;
               * in practice, this means that the FIRST byte requested as part of a DMA operation may require a callback to
               * finish, while all remaining bytes will be retrieved during subsequent checkINTR() calls -- unless of course
               * additional remote I/O operations are required to complete the DMA operation.
               *
               * As a result, the CPU will run slightly slower while an async DMA request is in progress, but the slowdown
               * should be negligible.  One downside is that this slowdown will be in effect for the entire duration of the
               * I/O (ie, even while we're waiting for the remote I/O to finish), so the ChipSet component should avoid
               * calling setDMA() whenever possible.
               *
               * TODO: While comparing SYMDEB tracing in both PCjs and VMware, I noticed that after single-stepping ANY
               * segment-load instruction, SYMDEB would get control immediately after that instruction in VMware, whereas
               * I delay acknowledgment of the Trap flag until the *following* instruction, so in PCjs, SYMDEB doesn't get
               * control until the following instruction.  I think PCjs behavior is correct, at least for SS.
               *
               * ERRATA: Early revisions of the 8086/8088 failed to suppress hardware interrupts (and possibly also Trap
               * acknowledgements) after an SS load, but Intel corrected the problem at some point; however, I don't know when
               * that change was made or which IBM PC models may have been affected, if any.  TODO: More research required.
               *
               * WARNING: There is also a priority consideration here.  On the 8086/8088, hardware interrupts have higher
               * priority than Trap interrupts (which is why the code below is written the way it is).  A potentially
               * undesirable side-effect is that a hardware interrupt handler could end up being single-stepped if an
               * external interrupt occurs immediately after the Trap flag is set.  This is why some 8086 debuggers temporarily
               * mask all hardware interrupts during a single-step operation (although that doesn't help with NMIs generated
               * by a coprocessor).  As of the 80286, those priorities were inverted, giving the Trap interrupt higher priority
               * than external interrupts.
               *
               * TODO: Determine the priorities for the 80186.
               *
               * @this {X86CPU}
               * @return {boolean} true if h/w interrupt (or trap) has just been acknowledged, false if not
               */
              X86CPU.prototype.checkINTR = function()
              {
                  this.assert(this.intFlags);
                  if (!(this.opFlags & X86.OPFLAG.NOINTR)) {
                      /*
                       * As discussed above, the 8086/8088 give hardware interrupts higher priority than the TRAP interrupt,
                       * whereas the 80286 and up give TRAPs higher priority.
                       */
                      var iPriority = (this.model < X86.MODEL_80286? 0 : 1);
                      for (var cPriorities = 0; cPriorities < 2; cPriorities++) {
                          switch(iPriority) {
                          case 0:
                              if ((this.intFlags & X86.INTFLAG.INTR) && (this.regPS & X86.PS.IF)) {
                                  var nIDT = this.chipset.getIRRVector();
                                  if (nIDT >= -1) {
                                      this.intFlags &= ~X86.INTFLAG.INTR;
                                      if (nIDT >= 0) {
                                          this.intFlags &= ~X86.INTFLAG.HALT;
                                          X86.fnINT.call(this, nIDT, null, 11);
                                          return true;
                                      }
                                  }
                              }
                              break;
                          case 1:
                              if ((this.intFlags & X86.INTFLAG.TRAP)) {
                                  this.intFlags &= ~X86.INTFLAG.TRAP;
                                  X86.fnINT.call(this, X86.EXCEPTION.TRAP, null, 11);
                                  return true;
                              }
                              break;
                          }
                          iPriority = 1 - iPriority;
                      }
                  }
                  if (this.intFlags & X86.INTFLAG.DMA) {
                      if (!this.chipset.checkDMA()) {
                          this.intFlags &= ~X86.INTFLAG.DMA;
                      }
                  }
                  return false;
              };
              
              /**
               * updateINTR(fRaise)
               *
               * This is called by the ChipSet component whenever a h/w interrupt needs to be simulated.
               * This is how the PIC component simulates raising the INTFLAG.INTR signal.  We will honor the request
               * only if we have a reference back to the ChipSet component.  The CPU will then "respond" by calling
               * checkINTR() and request the corresponding interrupt vector from the ChipSet.
               *
               * @this {X86CPU}
               * @param {boolean} fRaise is true to raise INTFLAG.INTR, false to lower
               */
              X86CPU.prototype.updateINTR = function(fRaise)
              {
                  if (this.chipset) {
                      if (fRaise) {
                          this.intFlags |= X86.INTFLAG.INTR;
                      } else {
                          this.intFlags &= ~X86.INTFLAG.INTR;
                      }
                  }
              };
              
              /**
               * delayINTR()
               *
               * This is called by the ChipSet component whenever the IMR register is being unmasked, to avoid
               * interrupts being simulated too quickly. This works around a problem in the ROM BIOS "KBD_RESET"
               * (F000:E688) function, which is called with interrupts enabled by the "TST8" (F000:E30D) code.
               *
               * "KBD_RESET" appears to be written with the assumption that CLI is in effect, because it issues an
               * STI immediately after unmasking the keyboard IRQ.  And normally, the STI would delay INTFLAG.INTR
               * long enough to allow AH to be set to 0. But if interrupts are already enabled, an interrupt could
               * theoretically occur before the STI.  And since AH isn't initialized until after the STI, such an
               * interrupt would be missed.
               *
               * I'm assuming this never happens in practice because the PIC isn't that fast.  But for us to
               * guarantee that, we need to provide this function to the ChipSet component.
               *
               * @this {X86CPU}
               */
              X86CPU.prototype.delayINTR = function()
              {
                  this.opFlags |= X86.OPFLAG.NOINTR;
              };
              
              /**
               * updateReg(sReg, nValue)
               *
               * This function helps updateStatus() by massaging the register names and values according to
               * CPU type before passing the call to displayValue(); in the "old days", updateStatus() called
               * displayValue() directly (although then it was called displayReg()).
               *
               * @this {X86CPU}
               * @param {string} sReg
               * @param {number} nValue
               */
              X86CPU.prototype.updateReg = function(sReg, nValue)
              {
                  var cch = 4;
                  if (sReg.length == 1) {
                      cch = 1;
                      nValue = nValue? 1 : 0;
                  }
                  if (this.model < 80386) {
                      if (sReg.length > 2) {
                          sReg = sReg.substr(1, 2);
                      }
                  } else {
                      if (sReg == "PS" || sReg.length > 2) {
                          cch = 8;
                      }
                  }
                  this.displayValue(sReg, nValue, cch);
              };
              
              /**
               * updateStatus()
               *
               * This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
               * this is where we take care of any DOM updates (eg, register values) while the CPU is running.
               *
               * Any high-frequency updates should be performed in updateVideo(), which should avoid DOM updates, since updateVideo()
               * can be called up to 60 times per second (see VIDEO_UPDATES_PER_SECOND).
               *
               * @this {X86CPU}
               * @param {boolean} [fForce] (true will display registers even if the CPU is running and "live" registers are not enabled)
               */
              X86CPU.prototype.updateStatus = function(fForce)
              {
                  if (this.cLiveRegs) {
                      if (fForce || !this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
                          this.updateReg("EAX", this.regEAX);
                          this.updateReg("EBX", this.regEBX);
                          this.updateReg("ECX", this.regECX);
                          this.updateReg("EDX", this.regEDX);
                          this.updateReg("ESP", this.getSP());
                          this.updateReg("EBP", this.regEBP);
                          this.updateReg("ESI", this.regESI);
                          this.updateReg("EDI", this.regEDI);
                          this.updateReg("CS", this.getCS());
                          this.updateReg("DS", this.getDS());
                          this.updateReg("SS", this.getSS());
                          this.updateReg("ES", this.getES());
                          this.updateReg("EIP", this.getIP());
                          var regPS = this.getPS();
                          this.updateReg("PS", regPS);
                          this.updateReg("V", (regPS & X86.PS.OF));
                          this.updateReg("D", (regPS & X86.PS.DF));
                          this.updateReg("I", (regPS & X86.PS.IF));
                          this.updateReg("T", (regPS & X86.PS.TF));
                          this.updateReg("S", (regPS & X86.PS.SF));
                          this.updateReg("Z", (regPS & X86.PS.ZF));
                          this.updateReg("A", (regPS & X86.PS.AF));
                          this.updateReg("P", (regPS & X86.PS.PF));
                          this.updateReg("C", (regPS & X86.PS.CF));
                      }
                  }
              
                  var controlSpeed = this.bindings["speed"];
                  if (controlSpeed) controlSpeed.textContent = this.getSpeedCurrent();
              
                  this.parent.updateStatus.call(this, fForce);
              };
              
              /**
               * stepCPU(nMinCycles)
               *
               * NOTE: Single-stepping should not be confused with the Trap flag; single-stepping is a Debugger
               * operation that's completely independent of Trap status.  The CPU can go in and out of Trap mode,
               * in and out of h/w interrupt service routines (ISRs), etc, but from the Debugger's perspective,
               * they're all one continuous stream of instructions that can be stepped or run at will.  Moreover,
               * stepping vs. running should never change the behavior of the simulation.
               *
               * Similarly, the Debugger's execution breakpoints have no involvement with the x86 breakpoint instruction
               * (0xCC); the Debugger monitors changes to the regLIP register to implement its own execution breakpoints.
               *
               * As a result, the Debugger's complete independence means you can run other 8086/8088 debuggers
               * (eg, DEBUG) inside the simulation without interference; you can even "debug" them with the Debugger.
               *
               * @this {X86CPU}
               * @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
               * @return {number} of cycles executed; 0 indicates a pre-execution condition (ie, an execution breakpoint
               * was hit), -1 indicates a post-execution condition (eg, a read or write breakpoint was hit), and a positive
               * number indicates successful completion of that many cycles (which should always be >= nMinCycles).
               */
              X86CPU.prototype.stepCPU = function(nMinCycles)
              {
                  /*
                   * The Debugger uses fComplete to determine if the instruction completed (true) or was interrupted
                   * by a breakpoint or some other exceptional condition (false).  NOTE: this does NOT include JavaScript
                   * exceptions, which stepCPU() expects the caller to catch using its own exception handler.
                   *
                   * The CPU relies on the use of stopCPU() rather than fComplete, because the CPU never single-steps
                   * (ie, nMinCycles is always some large number), whereas the Debugger does.  And conversely, when the
                   * Debugger is single-stepping (even when performing multiple single-steps), fRunning is never set,
                   * so stopCPU() would have no effect as far as the Debugger is concerned.
                   */
                  this.aFlags.fComplete = true;
              
                  /*
                   * fDebugCheck is true if we need to "check" every instruction with the Debugger.
                   */
                  var fDebugCheck = this.aFlags.fDebugCheck = (DEBUGGER && this.dbg && this.dbg.checksEnabled());
              
                  /*
                   * nDebugState is checked only when fDebugCheck is true, and its sole purpose is to tell the first call
                   * to checkInstruction() that it can skip breakpoint checks, and that will be true ONLY when fStarting is
                   * true OR nMinCycles is zero (the latter means the Debugger is single-stepping).
                   *
                   * Once we snap fStarting, we clear it, because technically, we've moved beyond "starting" and have
                   * officially "started" now.
                   */
                  var nDebugState = (!nMinCycles)? -1 : (this.aFlags.fStarting? 0 : 1);
                  this.aFlags.fStarting = false;
              
                  /*
                   * We move the minimum cycle count to nStepCycles (the number of cycles left to step), so that other
                   * functions have the ability to force that number to zero (eg, stopCPU()), and thus we don't have to check
                   * any other criteria to determine whether we should continue stepping or not.
                   */
                  this.nBurstCycles = this.nStepCycles = nMinCycles;
              
                  /*
                   * NOTE: Even though runCPU() calls updateAllTimers(), we need an additional call here if we're being
                   * called from the Debugger, so that any single-stepping will update the timers as well.
                   */
                  if (this.chipset && !nMinCycles) this.chipset.updateAllTimers();
              
                  /*
                   * Let's also suppress h/w interrupts whenever the Debugger is single-stepping an instruction; I'm loathe
                   * to allow Debugger interactions to affect the behavior of the virtual machine in ANY way, but I'm making
                   * this small concession to avoid the occasional and sometimes unexpected Debugger command that ends up
                   * stepping into a hardware interrupt service routine (ISR).
                   *
                   * Note that this is similar to the problem discussed in checkINTR() regarding the priority of external h/w
                   * interrupts vs. Trap interrupts, but they require different solutions, because our Debugger operates
                   * independently of the CPU.
                   *
                   * One exception I make here is when you've asked the Debugger to display PIC messages, the idea being that
                   * if you're watching the PIC that closely, then you want to hardware interrupts to occur regardless.
                   */
                  if (!nMinCycles && !this.messageEnabled(Messages.PIC)) this.opFlags |= X86.OPFLAG.NOINTR;
              
                  do {
                      var opPrefixes = this.opFlags & X86.OPFLAG_PREFIXES;
                      if (opPrefixes) {
                          this.opPrefixes |= opPrefixes;
                      } else {
                          /*
                           * opLIP is used, among other things, to help string instructions rewind to the first prefix
                           * byte whenever the instruction needs to be repeated.  Repeating string instructions in this
                           * manner (essentially restarting them) is a bit heavy-handed, but ultimately it's more compatible,
                           * because it allows hardware interrupts (as well as Trap processing and Debugger single-stepping)
                           * to occur at any point during the string operation, without any additional effort.
                           *
                           * NOTE: The way we restart string instructions actually fixes an 8086/8088 flaw, because string
                           * instructions with multiple prefixes (eg, a REP and a segment override) would not be restarted
                           * properly following a hardware interrupt.  The recommended workarounds were to either turn off
                           * interrupts or to follow the string instruction with a LOOPNZ back to the first prefix byte.
                           * To emulate the flawed behavior, turn on BUGS_8086.
                           */
                          this.opLIP = this.regLIP;
                          this.segData = this.segDS;
                          this.segStack = this.segSS;
                          this.regEA = this.regEAWrite = X86.ADDR_INVALID;
              
                          if (I386 && (this.opPrefixes & (X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE))) {
                              this.resetSizes();
                          }
              
                          this.opPrefixes = this.opFlags & X86.OPFLAG.REPEAT;
              
                          if (this.intFlags) {
                              if (this.checkINTR()) {
                                  if (!nMinCycles) {
                                      this.assert(DEBUGGER);  // nMinCycles of zero should be generated ONLY by the Debugger
                                      if (DEBUGGER) {
                                          this.println("interrupt dispatched");
                                          this.opFlags = 0;
                                          break;
                                      }
                                  }
                              }
                              if (this.intFlags & X86.INTFLAG.HALT) {
                                  /*
                                   * As discussed in opHLT(), the CPU is never REALLY halted by a HLT instruction; instead,
                                   * opHLT() sets X86.INTFLAG.HALT, signalling to us that we're free to end the current burst
                                   * AND that we should not execute any more instructions until checkINTR() indicates a hardware
                                   * interrupt has been requested.
                                   *
                                   * One downside to this approach is that it *might* appear to the careful observer that we
                                   * executed a full complement of instructions during bursts where X86.INTFLAG.HALT was set,
                                   * when in fact we did not.  However, the steady advance of the overall cycle count, and thus
                                   * the steady series calls to stepCPU(), is needed to ensure that timer updates, video updates,
                                   * etc, all continue to occur at the expected rates.
                                   *
                                   * If necessary, we can add another bookkeeping cycle counter (eg, one that keeps tracks of the
                                   * number of cycles during which we did not actually execute any instructions).
                                   */
                                  this.nStepCycles = 0;
                                  this.opFlags = 0;
                                  break;
                              }
                          }
                      }
              
                      if (DEBUGGER && fDebugCheck) {
                          if (this.dbg.checkInstruction(this.regLIP, nDebugState)) {
                              this.stopCPU();
                              break;
                          }
                          nDebugState = 1;
                      }
              
                      if (SAMPLER) {
                          if (++this.iSampleFreq >= this.nSampleFreq) {
                              this.iSampleFreq = 0;
                              if (this.iSampleSkip < this.nSampleSkip) {
                                  this.iSampleSkip++;
                              } else {
                                  if (this.iSampleNext == this.nSamples) {
                                      this.println("sample buffer full");
                                      this.stopCPU();
                                      break;
                                  }
                                  var t = this.regLIP + this.getCycles();
                                  var n = this.aSamples[this.iSampleNext];
                                  if (n !== -1) {
                                      if (n !== t) {
                                          this.println("sample deviation at index " + this.iSampleNext + ": current LIP=" + str.toHex(this.regLIP));
                                          this.stopCPU();
                                          break;
                                      }
                                  } else {
                                      this.aSamples[this.iSampleNext] = t;
                                  }
                                  this.iSampleNext++;
                              }
                          }
                      }
              
                      this.opFlags = 0;
              
                      if (DEBUG || PREFETCH) {
                          this.nBusCycles = 0;
                          this.nSnapCycles = this.nStepCycles;
                      }
              
                      this.aOps[this.getIPByte()].call(this);
              
                      if (PREFETCH) {
                          var nSpareCycles = (this.nSnapCycles - this.nStepCycles) - this.nBusCycles;
                          if (nSpareCycles >= 4) {
                              this.fillPrefetch(nSpareCycles >> 2);   // for every 4 spare cycles, fetch 1 instruction byte
                          }
                      }
              
                      if (DEBUG) {
                          /*
                           * Make sure that every instruction is assessing a cycle cost, and that the cost is a net positive.
                           */
                          if (this.aFlags.fComplete && this.nStepCycles >= this.nSnapCycles && !(this.opFlags & X86.OPFLAG_PREFIXES)) {
                              this.println("cycle miscount: " + (this.nSnapCycles - this.nStepCycles));
                              this.setIP(this.opLIP - this.segCS.base);
                              this.stopCPU();
                              break;
                          }
                      }
              
                  } while (this.nStepCycles > 0);
              
                  return (this.aFlags.fComplete? this.nBurstCycles - this.nStepCycles : (this.aFlags.fComplete === undefined? 0 : -1));
              };
              
              /**
               * X86CPU.init()
               *
               * This function operates on every HTML element of class "cpu", extracting the
               * JSON-encoded parameters for the X86CPU constructor from the element's "data-value"
               * attribute, invoking the constructor (which in turn invokes the CPU constructor)
               * to create a X86CPU component, and then binding any associated HTML controls to the
               * new component.
               */
              X86CPU.init = function()
              {
                  var aeCPUs = Component.getElementsByClass(window.document, PCJSCLASS, "cpu");
                  for (var iCPU = 0; iCPU < aeCPUs.length; iCPU++) {
                      var eCPU = aeCPUs[iCPU];
                      var parmsCPU = Component.getComponentParms(eCPU);
                      var cpu = new X86CPU(parmsCPU);
                      Component.bindComponentControls(cpu, eCPU, PCJSCLASS);
                  }
              };
              
              /*
               * Initialize every CPU module on the page
               */
              web.onInit(X86CPU.init);
              
              if (typeof module !== 'undefined') module.exports = X86CPU;
              
            • x86func.js
              /**
               * @fileoverview Implements PCjs 8086 opcode helpers.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var Messages    = require("./messages");
                  var X86         = require("./x86");
              }
              
              /**
               * fnADCb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnADCb = function ADCb(dst, src)
              {
                  var b = (dst + src + this.getCarry())|0;
                  this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b & 0xff;
              };
              
              /**
               * fnADCw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnADCw = function ADCw(dst, src)
              {
                  var w = (dst + src + this.getCarry())|0;
                  this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return w & this.dataMask;
              };
              
              /**
               * fnADDb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnADDb = function ADDb(dst, src)
              {
                  var b = (dst + src)|0;
                  this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b & 0xff;
              };
              
              /**
               * fnADDw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnADDw = function ADDw(dst, src)
              {
                  var w = (dst + src)|0;
                  this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return w & this.dataMask;
              };
              
              /**
               * fnANDb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnANDb = function ANDb(dst, src)
              {
                  var b = dst & src;
                  this.setLogicResult(b, X86.RESULT.BYTE);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b;
              };
              
              /**
               * fnANDw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnANDw = function ANDw(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return this.setLogicResult(dst & src, this.dataType);
              };
              
              /**
               * fnARPL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnARPL = function ARPL(dst, src)
              {
                  this.nStepCycles -= (10 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                  if ((dst & X86.SEL.RPL) < (src & X86.SEL.RPL)) {
                      dst = (dst & ~X86.SEL.RPL) | (src & X86.SEL.RPL);
                      this.setZF();
                      return dst;
                  }
                  this.clearZF();
                  return dst;
              };
              
              /**
               * fnBOUND(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBOUND = function BOUND(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      /*
                       * Generate UD_FAULT (INT 0x06: Invalid Opcode) if src is not a memory operand.
                       */
                      X86.opInvalid.call(this);
                      return dst;
                  }
                  /*
                   * Note that BOUND performs signed comparisons, so we must transform all arguments into signed values.
                   */
                  var wIndex = dst;
                  var wLower = this.getWord(this.regEA);
                  var wUpper = this.getWord(this.regEA + this.dataSize);
                  if (this.dataSize == 2) {
                      wIndex = (dst << 16) >> 16;
                      wLower = (wLower << 16) >> 16;
                      wUpper = (wUpper << 16) >> 16;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesBound;
                  if (wIndex < wLower || wIndex > wUpper) {
                      /*
                       * The INT 0x05 handler must be called with CS:IP pointing to the BOUND instruction.
                       *
                       * TODO: Determine the cycle cost when a BOUND exception is triggered, over and above nCyclesBound.
                       */
                      this.setIP(this.opLIP - this.segCS.base);
                      X86.fnINT.call(this, X86.EXCEPTION.BOUND_ERR, null, 0);
                  }
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnBSF(dst, src)
               *
               * Scan src starting at bit 0.  If a set bit is found, the bit index is stored in dst and ZF is cleared;
               * otherwise, ZF is set and dst is unchanged.
               *
               * NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared.  Also, Intel insists that
               * dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
               * unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBSF = function BSF(dst, src)
              {
                  var n = 0;
                  if (!src) {
                      this.setZF();
                  } else {
                      this.clearZF();
                      var bit = 0x1;
                      while (bit & this.dataMask) {
                          if (src & bit) {
                              dst = n;
                              break;
                          }
                          bit <<= 1;
                          n++;                // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
                      }
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
                  return dst;
              };
              
              /**
               * fnBSR(dst, src)
               *
               * Scan src starting from the highest bit.  If a set bit is found, the bit index is stored in dst and ZF is
               * cleared; otherwise, ZF is set and dst is unchanged.
               *
               * NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared.  Also, Intel insists that
               * dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
               * unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBSR = function BSR(dst, src)
              {
                  var n = 0;
                  if (!src) {
                      this.setZF();
                  } else {
                      this.clearZF();
                      var i = (this.dataSize == 2? 15 : 31), bit = 1 << i;
                      while (bit) {
                          if (src & bit) {
                              dst = i;
                              break;
                          }
                          bit >>>= 1;
                          n++; i--;           // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
                      }
              
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
                  return dst;
              };
              
              /**
               * fnBT(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBT = function BT(dst, src)
              {
                  if (dst & (1 << (src & 0x1f))) this.setCF(); else this.clearCF();
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitTestR : this.cycleCounts.nOpCyclesBitTestM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnBTC(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBTC = function BTC(dst, src)
              {
                  var bit = 1 << (src & 0x1f);
                  if (dst & bit) this.setCF(); else this.clearCF();
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                  return dst ^ bit;
              };
              
              /**
               * fnBTR(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBTR = function BTR(dst, src)
              {
                  var bit = 1 << (src & 0x1f);
                  if (dst & bit) this.setCF(); else this.clearCF();
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                  return dst & ~bit;
              };
              
              /**
               * fnBTS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnBTS = function BTS(dst, src)
              {
                  var bit = 1 << (src & 0x1f);
                  if (dst & bit) this.setCF(); else this.clearCF();
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                  return dst | bit;
              };
              
              /**
               * fnCALLw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnCALLw = function CALLw(dst, src)
              {
                  if (DEBUG) this.printMessage("calling " + str.toHex(dst, this.dataSize << 1), this.bitsMessage, true);
                  this.pushWord(this.getIP());
                  this.setIP(dst);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesCallWR : this.cycleCounts.nOpCyclesCallWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnCALLF(off, sel)
               *
               * For protected-mode, this function must attempt to load the new code segment first, because if the new segment
               * requires a change in privilege level, the return address must be pushed on the NEW stack, not the current stack.
               *
               * @this {X86CPU}
               * @param {number} off
               * @param {number} sel
               */
              X86.fnCALLF = function CALLF(off, sel)
              {
                  if (DEBUG) this.printMessage("calling " + str.toHex(sel, 4) + ':' + str.toHex(off, this.dataSize << 1), this.bitsMessage, true);
                  var oldCS = this.getCS();
                  var oldIP = this.getIP();
                  if (this.setCSIP(off, sel, true) != null) {
                      this.pushWord(oldCS);
                      this.pushWord(oldIP);
                  }
              };
              
              /**
               * fnCALLFdw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnCALLFdw = function CALLFdw(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      return X86.fnGRPUndefined.call(this, dst, src);
                  }
                  X86.fnCALLF.call(this, dst, this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesCallDM;
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnCMPb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number} dst unchanged
               */
              X86.fnCMPb = function CMPb(dst, src)
              {
                  var b = (dst - src)|0;
                  this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnCMPw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number} dst unchanged
               */
              X86.fnCMPw = function CMPw(dst, src)
              {
                  var w = (dst - src)|0;
                  this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnDECb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnDECb = function DECb(dst, src)
              {
                  var b = (dst - 1)|0;
                  this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF, true);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                  return b & 0xff;
              };
              
              /**
               * fnDECr(w)
               *
               * @this {X86CPU}
               * @param {number} w
               * @return {number}
               */
              X86.fnDECr = function DECr(w)
              {
                  var result = ((w & this.dataMask) - 1)|0;
                  this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
                  this.nStepCycles -= 2;                          // the register form of INC takes 2 cycles on all CPUs
                  return (w & ~this.dataMask) | (result & this.dataMask);
              };
              
              /**
               * fnDECw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnDECw = function DECw(dst, src)
              {
                  var w = (dst - 1)|0;
                  this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                  return w & 0xffff;
              };
              
              /**
               * fnSet64(lo, hi)
               *
               * @param {number} lo
               * @param {number} hi
               */
              X86.fnSet64 = function Set64(lo, hi)
              {
                  return [lo >>> 0, hi >>> 0];
              };
              
              /**
               * fnAdd64(dst, src)
               *
               * Adds src to dst.
               *
               * @param {Array} dst is a 64-bit value
               * @param {Array} src is a 64-bit value
               */
              X86.fnAdd64 = function Add64(dst, src)
              {
                  dst[0] += src[0];
                  dst[1] += src[1];
                  if (dst[0] > 0xffffffff) {
                      dst[0] >>>= 0;          // truncate dst[0] to 32 bits AND keep it unsigned
                      dst[1]++;
                  }
              };
              
              /**
               * fnCmp64(dst, src)
               *
               * Compares dst to src, by computing dst - src.
               *
               * @param {Array} dst is a 64-bit value
               * @param {Array} src is a 64-bit value
               * @return {number} > 0 if dst > src, == 0 if dst == src, < 0 if dst < src
               */
              X86.fnCmp64 = function Cmp64(dst, src)
              {
                  var result = dst[1] - src[1];
                  if (!result) result = dst[0] - src[0];
                  return result;
              };
              
              /**
               * fnSub64(dst, src)
               *
               * Subtracts src from dst.
               *
               * @param {Array} dst is a 64-bit value
               * @param {Array} src is a 64-bit value
               */
              X86.fnSub64 = function Sub64(dst, src)
              {
                  dst[0] -= src[0];
                  dst[1] -= src[1];
                  if (dst[0] < 0) {
                      dst[0] >>>= 0;          // truncate dst[0] to 32 bits AND keep it unsigned
                      dst[1]--;
                  }
              };
              
              /**
               * fnShr64(dst)
               *
               * Shifts dst right one bit.
               *
               * @param {Array} dst is a 64-bit value
               */
              X86.fnShr64 = function Shr64(dst)
              {
                  dst[0] >>>= 1;
                  if (dst[1] & 0x1) {
                      dst[0] = (dst[0] | 0x80000000) >>> 0;
                  }
                  dst[1] >>>= 1;
              };
              
              /**
               * fnDIV32(dstLo, dstHi, src)
               *
               * This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as unsigned.
               *
               * If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
               *
               * Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
               *
               * @this {X86CPU}
               * @param {number} dstLo (low 32-bit portion of dividend)
               * @param {number} dstHi (high 32-bit portion of dividend)
               * @param {number} src (32-bit divisor)
               */
              X86.fnDIV32 = function DIV32(dstLo, dstHi, src)
              {
                  this.fMDSet = false;
              
                  src >>>= 0;
                  if (!src || src <= (dstHi >>> 0)) return;
              
                  var result = 0, bit = 1;
              
                  var div = X86.fnSet64(src, 0);
                  var rem = X86.fnSet64(dstLo, dstHi);
              
                  while (X86.fnCmp64(rem, div) > 0) {
                      X86.fnAdd64(div, div);
                      bit += bit;
                  }
                  do {
                      if (X86.fnCmp64(rem, div) >= 0) {
                          X86.fnSub64(rem, div);
                          result += bit;
                      }
                      X86.fnShr64(div);
                      bit >>>= 1;
                  } while (bit);
              
                  this.assert(result <= 0xffffffff && !rem[1]);
              
                  this.regMDLo = result;              // result is the quotient, which callers expect in the low MD register
                  this.regMDHi = rem[0];              // rem[0] is the remainder, which callers expect in the high MD register
                  this.fMDSet = true;
              };
              
              /**
               * fnIDIV32(dstLo, dstHi, src)
               *
               * This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as signed.
               *
               * If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
               *
               * Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
               *
               * @this {X86CPU}
               * @param {number} dstLo (low 32-bit portion of dividend)
               * @param {number} dstHi (high 32-bit portion of dividend)
               * @param {number} src (32-bit divisor)
               */
              X86.fnIDIV32 = function IDIV32(dstLo, dstHi, src)
              {
                  var fNegLo = false, fNegHi = false;
                  if (src < 0) {
                      src = -src|0;
                      fNegLo = !fNegLo;
                  }
                  if (dstHi < 0) {
                      dstLo = -dstLo|0;
                      dstHi = (~dstHi + (dstLo? 0 : 1))|0;
                      fNegHi = true;
                      fNegLo = !fNegLo;
                  }
                  X86.fnDIV32.call(this, dstLo, dstHi, src);
                  if (this.regMDLo > 0x7fffffff) this.fMDSet = false;
                  if (fNegLo) this.regMDLo = -this.regMDLo;
                  if (fNegHi) this.regMDHi = -this.regMDHi;
              };
              
              /**
               * fnDIVb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (the divisor)
               * @param {number} src (null; AX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually AX that's modified)
               */
              X86.fnDIVb = function DIVb(dst, src)
              {
                  /*
                   * Detect zero divisor
                   */
                  if (!dst) {
                      X86.fnDIVOverflow.call(this);
                      return dst;
                  }
              
                  /*
                   * Detect too-small divisor (quotient overflow)
                   */
                  var result = ((src = this.regEAX & 0xffff) / dst);
                  if (result > 0xff) {
                      X86.fnDIVOverflow.call(this);
                      return dst;
                  }
              
                  this.fMDSet = true;
                  this.regMDLo = (result & 0xff) | (((src % dst) & 0xff) << 8);
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) this.traceLog('DIVb', src, dst, null, this.getPS(), this.regMDLo);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivBR : this.cycleCounts.nOpCyclesDivBM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnDIVw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (the divisor)
               * @param {number} src (null; DX:AX or EDX:EAX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
               */
              X86.fnDIVw = function DIVw(dst, src)
              {
                  if (this.dataSize == 2) {
                      /*
                       * Detect zero divisor
                       */
                      if (!dst) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
                      /*
                       * Detect too-small divisor (quotient overflow)
                       *
                       * WARNING: We CANNOT simply do "src = (this.regEDX << 16) | this.regEAX", because if bit 15 of DX
                       * is set, JavaScript will create a negative 32-bit number.  So we instead use non-bit-wise operators
                       * to force JavaScript to create a floating-point value that won't suffer from 32-bit-math side-effects.
                       */
                      src = (this.regEDX & 0xffff) * 0x10000 + (this.regEAX & 0xffff);
                      var result = (src / dst)|0;
                      if (result >= 0x10000) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
                      this.fMDSet = true;
                      this.regMDLo = (result & 0xffff);
                      this.regMDHi = (src % dst) & 0xffff;
                  }
                  else {
                      X86.fnDIV32.call(this, this.regEAX, this.regEDX, dst);
                      if (!this.fMDSet) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
                      this.regMDLo |= 0;
                      this.regMDHi |= 0;
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) {
                      if (this.dataSize == 2) {
                          this.traceLog('DIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                      } else {
                          this.traceLog('DIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                      }
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivWR : this.cycleCounts.nOpCyclesDivWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnESC(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number} dst unchanged
               */
              X86.fnESC = function ESC(dst, src)
              {
                  return dst;
              };
              
              /**
               * fnIDIVb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (the divisor)
               * @param {number} src (null; AX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually AX that's modified)
               */
              X86.fnIDIVb = function IDIVb(dst, src)
              {
                  /*
                   * Detect zero divisor
                   */
                  if (!dst) {
                      X86.fnDIVOverflow.call(this);
                      return dst;
                  }
              
                  /*
                   * Detect too-small divisor (quotient overflow)
                   */
                  var div = ((dst << 24) >> 24);
                  var result = ((src = (this.regEAX << 16) >> 16) / div)|0;
              
                  /*
                   * Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
                   *
                   *      "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
                   *      (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
                   *      The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
                   *      These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
                   *      -32768 and -128 in decimal, respectively)."
                   */
                  if (result != ((result << 24) >> 24) || this.model == X86.MODEL_8086 && result == -128) {
                      X86.fnDIVOverflow.call(this);
                      return dst;
                  }
              
                  this.fMDSet = true;
                  this.regMDLo = (result & 0xff) | (((src % div) & 0xff) << 8);
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) this.traceLog('IDIVb', src, dst, null, this.getPS(), this.regMDLo);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivBR : this.cycleCounts.nOpCyclesIDivBM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnIDIVw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (the divisor)
               * @param {number} src (null; DX:AX or EDX:EAX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
               */
              X86.fnIDIVw = function IDIVw(dst, src)
              {
                  if (this.dataSize == 2) {
                      /*
                       * Detect zero divisor
                       */
                      if (!dst) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
              
                      /*
                       * Detect too-small divisor (quotient overflow)
                       */
                      var div = ((dst << 16) >> 16);
                      var result = ((src = (this.regEDX << 16) | (this.regEAX & 0xffff)) / div)|0;
              
                      /*
                       * Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
                       *
                       *      "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
                       *      (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
                       *      The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
                       *      These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
                       *      -32768 and -128 in decimal, respectively)."
                       */
                      if (result != ((result << 16) >> 16) || this.model == X86.MODEL_8086 && result == -32768) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
              
                      this.fMDSet = true;
                      this.regMDLo = (result & 0xffff);
                      this.regMDHi = (src % div) & 0xffff;
                  }
                  else {
                      X86.fnIDIV32.call(this, this.regEAX, this.regEDX, dst);
                      if (!this.fMDSet) {
                          X86.fnDIVOverflow.call(this);
                          return dst;
                      }
                      this.regMDLo |= 0;
                      this.regMDHi |= 0;
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) {
                      if (this.dataSize == 2) {
                          this.traceLog('IDIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                      } else {
                          this.traceLog('IDIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                      }
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivWR : this.cycleCounts.nOpCyclesIDivWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnIMUL8(dst, src)
               *
               * 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
               *
               *      "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
               *      unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
               *
               * However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
               *
               * (80186/80188 and up)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnIMUL8 = function IMUL8(dst, src)
              {
                  dst = this.getIPByte();
                  var result = (((src << 16) >> 16) * ((dst << 24) >> 24))|0;
              
                  if (result > 32767 || result < -32768) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  result &= 0xffff;
                  if (DEBUG && DEBUGGER) this.traceLog('IMUL8', dst, src, null, this.getPS(), result);
              
                  /*
                   * NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
                   * 22-25 and 29-32 instead of 21 and 24, respectively.  However, accurate cycle counts for the 80186/80188 is
                   * not super-critical. TODO: Fix this someday.
                   */
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
                  return result;
              };
              
              /**
               * fnIMULb(dst, src)
               *
               * This 16-bit multiplication must indicate when the upper 8 bits are simply a sign-extension of the
               * lower 8 bits (carry clear) and when the upper 8 bits contain significant bits (carry set).  The latter
               * will occur whenever a positive result is > 127 (0x007f) and whenever a negative result is < -128
               * (0xff80).
               *
               * Example 1: 16 * 4 = 64 (0x0040): carry is clear
               * Example 2: 16 * 8 = 128 (0x0080): carry is set (the sign bit no longer fits in the lower 8 bits)
               * Example 3: 16 * -8 (0xf8) = -128 (0xff80): carry is clear (the sign bit *still* fits in the lower 8 bits)
               * Example 4: 16 * -16 (0xf0) = -256 (0xff00): carry is set (the sign bit no longer fits in the lower 8 bits)
               *
               * An earlier version of this function assumed it simply needed to check bit 7 of the result to determine carry,
               * which was completely broken.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null; AL is the implied src)
               * @return {number} (we return dst unchanged, since it's actually AX that's modified)
               */
              X86.fnIMULb = function IMULb(dst, src)
              {
                  var result = ((((src = this.regEAX) << 24) >> 24) * ((dst << 24) >> 24))|0;
              
                  this.fMDSet = true;
                  this.regMDLo = result & 0xffff;
              
                  if (result > 127 || result < -128) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) this.traceLog('IMULb', src, dst, null, this.getPS(), this.regMDLo);
              
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulBR : this.cycleCounts.nOpCyclesIMulBM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnIMULn(dst, src)
               *
               * 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
               *
               *      "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
               *      unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
               *
               * However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
               *
               * (80186/80188 and up)
               *
               * @this {X86CPU}
               * @param {number} dst (not used)
               * @param {number} src
               * @return {number}
               */
              X86.fnIMULn = function IMULn(dst, src)
              {
                  var fOverflow, result;
                  dst = this.getIPWord();
                  if (this.dataSize == 2) {
                      result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
                      fOverflow = (result > 32767 || result < -32768);
                  } else {
                      result = (src * dst);
                      fOverflow = (result > 2147483647 || result < -2147483648);
                      this.assert(fOverflow == (result != (result|0)));
                  }
              
                  if (fOverflow) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  result &= this.dataMask;
                  if (DEBUG && DEBUGGER) this.traceLog('IMULn', dst, src, null, this.getPS(), result);
              
                  /*
                   * NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
                   * 22-25 and 29-32 instead of 21 and 24, respectively.  However, accurate cycle counts for the 80186/80188 is
                   * not super-critical. TODO: Fix this someday.
                   */
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
                  return result;
              };
              
              /**
               * fnIMUL32(dst, src)
               *
               * This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as signed.
               *
               * TODO: Some potential optimizations include:
               *
               *  1) Early outs if either parameter is zero, since the result will obviously be zero
               *  2) Using "normal" JavaScript multiplication if both parameters are >= -32768 && <= 32767
               *
               * Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
               *
               * @this {X86CPU}
               * @param {number} dst (any 32-bit number, treated as signed)
               * @param {number} src (any 32-bit number, treated as signed)
               */
              X86.fnIMUL32 = function IMUL32(dst, src)
              {
                  var fNeg = false;
                  if (src < 0) {
                      src = -src|0;
                      fNeg = !fNeg;
                  }
                  if (dst < 0) {
                      dst = -dst|0;
                      fNeg = !fNeg;
                  }
                  X86.fnMUL32.call(this, dst, src);
                  if (fNeg) {
                      this.regMDLo = (~this.regMDLo + 1)|0;
                      this.regMDHi = (~this.regMDHi + (this.regMDLo? 0 : 1))|0;
                  }
              };
              
              /**
               * fnIMULw(dst, src)
               *
               * regMDHi:regMDLo = dst * regEAX
               *
               * This 32-bit multiplication must indicate when the upper 16 bits are simply a sign-extension of the
               * lower 16 bits (carry clear) and when the upper 16 bits contain significant bits (carry set).  The latter
               * will occur whenever a positive result is > 32767 (0x00007fff) and whenever a negative result is < -32768
               * (0xffff8000).
               *
               * Example 1: 256 * 64 = 16384 (0x00004000): carry is clear
               * Example 2: 256 * 128 = 32768 (0x00008000): carry is set (the sign bit no longer fits in the lower 16 bits)
               * Example 3: 256 * -128 (0xff80) = -32768 (0xffff8000): carry is clear (the sign bit *still* fits in the lower 16 bits)
               * Example 4: 256 * -256 (0xff00) = -65536 (0xffff0000): carry is set (the sign bit no longer fits in the lower 16 bits)
               *
               * An earlier version of this function assumed it simply needed to check bit 15 of the result to determine carry,
               * which was completely broken.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null; AX or EAX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
               */
              X86.fnIMULw = function IMULw(dst, src)
              {
                  var fOverflow;
                  if (this.dataSize == 2) {
                      src = this.regEAX & 0xffff;
                      var result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
                      this.fMDSet = true;
                      this.regMDLo = result & 0xffff;
                      this.regMDHi = (result >> 16) & 0xffff;
                      fOverflow = (result > 32767 || result < -32768);
                  } else {
                      X86.fnIMUL32.call(this, dst, this.regEAX);
                      fOverflow = (this.regMDHi != (this.regMDLo >> 31));
                  }
              
                  if (fOverflow) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) {
                      if (this.dataSize == 2) {
                          this.traceLog('IMULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                      } else {
                          this.traceLog('IMULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                      }
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulWR : this.cycleCounts.nOpCyclesIMulWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnIMULrw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnIMULrw = function IMULrw(dst, src)
              {
                  var result = (((dst << 16) >> 16) * ((src << 16) >> 16))|0;
                  if (result > 32767 || result < -32768) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
                  result &= 0xffff;
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
                  return result;
              };
              
              /**
               * fnIMULrd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnIMULrd = function IMULrd(dst, src)
              {
                  var result = dst * src;
                  if (result > 2147483647 || result < -2147483648) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
                  result |= 0;
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
                  return result;
              };
              
              /**
               * fnINCb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnINCb = function INCb(dst, src)
              {
                  var b = (dst + 1)|0;
                  this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                  return b & 0xff;
              };
              
              /**
               * fnINCr(w)
               *
               * @this {X86CPU}
               * @param {number} w
               * @return {number}
               */
              X86.fnINCr = function INCr(w)
              {
                  var result = ((w & this.dataMask) + 1)|0;
                  this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF);
                  this.nStepCycles -= 2;                          // the register form of INC takes 2 cycles on all CPUs
                  return (w & ~this.dataMask) | (result & this.dataMask);
              };
              
              /**
               * fnINCw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnINCw = function INCw(dst, src)
              {
                  var w = (dst + 1)|0;
                  this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                  return w & 0xffff;
              };
              
              /**
               * fnINT(nIDT, nError, nCycles)
               *
               * NOTE: We no longer use setCSIP(), because it always loads the new CS using segCS.load(), which
               * only knows how to load GDT and LDT descriptors, whereas interrupts must use setCS.loadIDT(), which
               * deals exclusively with IDT descriptors.
               *
               * This means we must take care to replicate critical features of setCSIP(); ie, setting segCS.fCall
               * BEFORE calling loadIDT(), and updating regLIP and regLIPLimit, resetting default operand and address sizes,
               * and flushing the prefetch queue AFTER calling loadIDT().
               *
               * @this {X86CPU}
               * @param {number} nIDT
               * @param {number|null|undefined} nError
               * @param {number} nCycles (in addition to the default of nOpCyclesInt)
               */
              X86.fnINT = function INT(nIDT, nError, nCycles)
              {
                  /*
                   * TODO: We assess the cycle cost up front, because otherwise, if loadIDT() fails, no cost may be assessed.
                   */
                  this.nStepCycles -= this.cycleCounts.nOpCyclesInt + nCycles;
                  this.segCS.fCall = true;
                  var oldPS = this.getPS();
                  var oldCS = this.getCS();
                  var oldIP = this.getIP();
                  var addr = this.segCS.loadIDT(nIDT);
                  if (addr !== X86.ADDR_INVALID) {
                      this.pushWord(oldPS);
                      this.pushWord(oldCS);
                      this.pushWord(oldIP);
                      if (nError != null) this.pushWord(nError);
                      this.nFault = -1;
                      this.regLIP = addr;
                      this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
                      if (I386) this.resetSizes();
                      if (PREFETCH) this.flushPrefetch(this.regLIP);
                  }
              };
              
              /**
               * fnIRET()
               *
               * @this {X86CPU}
               */
              X86.fnIRET = function IRET()
              {
                  /*
                   * TODO: We assess a fixed cycle cost up front, because at the moment, switchTSS() doesn't assess anything.
                   */
                  this.nStepCycles -= this.cycleCounts.nOpCyclesIRet;
                  if (this.regCR0 & X86.CR0.MSW.PE) {
                      if (this.regPS & X86.PS.NT) {
                          var addrNew = this.segTSS.base;
                          var sel = this.getShort(addrNew + X86.TSS.PREV_TSS);
                          this.segCS.switchTSS(sel, false);
                          return;
                      }
                  }
                  var cpl = this.segCS.cpl;
                  var newIP = this.popWord();
                  var newCS = this.popWord();
                  var newPS = this.popWord();
                  if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                  if (this.setCSIP(newIP, newCS, false) != null) {
                      this.setPS(newPS, cpl);
                      if (this.cIntReturn) this.checkIntReturn(this.regLIP);
                  }
              };
              
              /**
               * fnJMPw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnJMPw = function JMPw(dst, src)
              {
                  this.setIP(dst);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesJmpWR : this.cycleCounts.nOpCyclesJmpWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnJMPFdw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnJMPFdw = function JMPFdw(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      return X86.fnGRPUndefined.call(this, dst, src);
                  }
                  this.setCSIP(dst, this.getShort(this.regEA + this.dataSize));
                  if (this.cIntReturn) this.checkIntReturn(this.regLIP);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpDM;
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnLAR(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLAR = function LAR(dst, src)
              {
                  this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  /*
                   * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                   * descriptor table or the descriptor is not for a segment.
                   *
                   * TODO: This instruction's 80286 documentation does not discuss conforming code segments; determine
                   * if we need a special check for them.
                   */
                  this.clearZF();
                  if (this.segVER.load(src, true) !== X86.ADDR_INVALID) {
                      if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (src & X86.SEL.RPL)) {
                          this.setZF();
                          dst = this.segVER.acc & ~X86.DESC.ACC.BASE1623;
                          if (this.dataSize > 2) {
                              dst |= ((this.segVER.ext & ~X86.DESC.EXT.BASE2431) << 16);
                          }
                      }
                  }
                  return dst;
              };
              
              /**
               * fnLCR0(l)
               *
               * This is called by an 80386 control instruction (ie, MOV CR0,reg).
               *
               * TODO: Determine which CR0 bits, if any, cannot be modified by MOV CR0,reg.
               *
               * @this {X86CPU}
               * @param {number} l
               */
              X86.fnLCR0 = function LCR0(l)
              {
                  this.regCR0 = l;
                  this.setProtMode();
                  if (this.regCR0 & X86.CR0.PG) {
                      this.enablePageBlocks();
                  } else {
                      this.disablePageBlocks();
                  }
              };
              
              /**
               * fnLCR3(l)
               *
               * This is called by an 80386 control instruction (ie, MOV CR3,reg) or an 80386 task switch.
               *
               * @this {X86CPU}
               * @param {number} l
               */
              X86.fnLCR3 = function LCR3(l)
              {
                  this.regCR3 = l;
                  /*
                   * Normal use of regCR3 involves adding a 0-4K (12-bit) offset to obtain a page directory entry,
                   * so let's ensure that the low 12 bits of regCR3 are always zero.
                   */
                  this.assert(!(this.regCR3 & X86.LADDR.OFFSET));
                  if (this.regCR0 & X86.CR0.PG) this.enablePageBlocks();
              };
              
              /**
               * fnLDS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLDS = function LDS(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.setDS(this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                  return src;
              };
              
              /**
               * fnLEA(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLEA = function LEA(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      /*
                       * TODO: After reading http://www.os2museum.com/wp/undocumented-8086-opcodes/, it seems that this
                       * form of LEA (eg, "LEA AX,DX") simply returns the last calculated EA.  Since we always reset regEA
                       * at the start of a new instruction, we would need to preserve the previous EA if we want to mimic
                       * that (undocumented) behavior.
                       *
                       * And for completeness, we would have to extend EA tracking beyond the usual ModRM instructions
                       * (eg, XLAT, instructions that modify the stack pointer, and string instructions).  Anything else?
                       */
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLEA;
                  return this.regEA;
              };
              
              /**
               * fnLES(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLES = function LES(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.setES(this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                  return src;
              };
              
              /**
               * fnLFS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLFS = function LFS(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.setFS(this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                  return src;
              };
              
              /**
               * fnLGDT(dst, src)
               *
               * op=0x0F,0x01,reg=0x2 (GRP7:LGDT)
               *
               * The 80286 LGDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
               * the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
               * the limit, so we must fetch the remaining bits ourselves.
               *
               * The 80386 LGDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
               * but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
               * mean that the 24-bit base address should be zero-extended to 32 bits.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnLGDT = function LGDT(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opInvalid.call(this);
                  } else {
                      /*
                       * Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
                       * mask apppropriately.
                       */
                      this.addrGDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
                      /*
                       * An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
                       * fetched a 32-bit dst operand; we mask off those extra bits now.
                       */
                      dst &= 0xffff;
                      this.addrGDTLimit = this.addrGDT + dst;
                      this.opFlags |= X86.OPFLAG.NOWRITE;
                      this.nStepCycles -= 11;
                  }
                  return dst;
              };
              
              /**
               * fnLGS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLGS = function LGS(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.setGS(this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                  return src;
              };
              
              /**
               * fnLIDT(dst, src)
               *
               * op=0x0F,0x01,reg=0x3 (GRP7:LIDT)
               *
               * The 80286 LIDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
               * the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
               * the limit, so we must fetch the remaining bits ourselves.
               *
               * The 80386 LIDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
               * but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
               * mean that the 24-bit base address should be zero-extended to 32 bits.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnLIDT = function LIDT(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opInvalid.call(this);
                  } else {
                      /*
                       * Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
                       * mask apppropriately.
                       */
                      this.addrIDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
                      /*
                       * An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
                       * fetched a 32-bit dst operand; we mask off those extra bits now.
                       */
                      dst &= 0xffff;
                      this.addrIDTLimit = this.addrIDT + dst;
                      this.opFlags |= X86.OPFLAG.NOWRITE;
                      this.nStepCycles -= 12;
                  }
                  return dst;
              };
              
              /**
               * fnLLDT(dst, src)
               *
               * op=0x0F,0x00,reg=0x2 (GRP6:LLDT)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnLLDT = function LLDT(dst, src) {
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  this.segLDT.load(dst);
                  this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  return dst;
              };
              
              /**
               * fnLMSW(dst, src)
               *
               * op=0x0F,0x01,reg=0x6 (GRP7:LMSW)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnLMSW = function LMSW(dst, src)
              {
                  this.setMSW(dst);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 6);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnLSL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (the selector)
               * @return {number}
               */
              X86.fnLSL = function LSL(dst, src)
              {
                  /*
                   * TODO: Is this an invalid operation if regEAWrite is set?  dst is required to be a register.
                   */
                  this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  /*
                   * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                   * descriptor table or the descriptor is not for a segment.
                   *
                   * TODO: LSL is explicitly documented as ALSO requiring a non-null selector, so we check X86.SEL.MASK;
                   * are there any other instructions that were, um, less explicit but also require a non-null selector?
                   */
                  if ((src & X86.SEL.MASK) && this.segVER.load(src, true) !== X86.ADDR_INVALID) {
                      var fConforming = ((this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING);
                      if ((fConforming || this.segVER.dpl >= this.segCS.cpl) && this.segVER.dpl >= (src & X86.SEL.RPL)) {
                          this.setZF();
                          return this.segVER.limit;
                      }
                  }
                  this.clearZF();
                  return dst;
              };
              
              /**
               * fnLSS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnLSS = function LSS(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opUndefined.call(this);
                      return dst;
                  }
                  this.setSS(this.getShort(this.regEA + this.dataSize));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                  return src;
              };
              
              /**
               * fnLTR(dst, src)
               *
               * op=0x0F,0x00,reg=0x3 (GRP6:LTR)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnLTR = function LTR(dst, src)
              {
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  if (this.segTSS.load(dst) !== X86.ADDR_INVALID) {
                      this.setShort(this.segTSS.addrDesc + X86.DESC.ACC.OFFSET, this.segTSS.acc |= X86.DESC.ACC.TYPE.LDT);
                      this.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
                  }
                  this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  return dst;
              };
              
              /**
               * fnMOV(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (current value, ignored)
               * @param {number} src (new value)
               * @return {number} dst (updated value, from src)
               */
              X86.fnMOV = function MOV(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRR : this.cycleCounts.nOpCyclesMovRM) : this.cycleCounts.nOpCyclesMovMR);
                  return src;
              };
              
              /**
               * fnMOVX(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (current value, ignored)
               * @param {number} src (new value)
               * @return {number} dst (updated value, from src)
               */
              X86.fnMOVX = function MOVX(dst, src)
              {
                  return src;
              };
              
              /**
               * fnMOVn(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (current value, ignored)
               * @param {number} src (new value)
               * @return {number} dst (updated value, from src)
               */
              X86.fnMOVn = function MOVn(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRI : this.cycleCounts.nOpCyclesMovMI);
                  return src;
              };
              
              /**
               * fnMOVxx(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (current value, ignored)
               * @param {number} src (new value)
               * @return {number} dst (src is overridden, replaced with regXX, as specified by opMOVwsr() or opMOVrc())
               */
              X86.fnMOVxx = function MOVxx(dst, src)
              {
                  if (this.regEAWrite !== X86.ADDR_INVALID) {
                      /*
                       * When a 32-bit OPERAND size is in effect, opMOVwsr() will write 32 bits (zero-extended) if the destination
                       * is a register, but only 16 bits if the destination is memory.  The only other caller, opMOVrc(), is not
                       * affected, because it writes only to register destinations.
                       */
                      this.setDataSize(2);
                  }
                  return X86.fnMOV.call(this, dst, this.regXX);
              };
              
              /**
               * fnMULb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number} (we return dst unchanged, since it's actually AX that's modified)
               */
              X86.fnMULb = function MULb(dst, src)
              {
                  this.fMDSet = true;
                  this.regMDLo = ((src = this.regEAX & 0xff) * dst) & 0xffff;
              
                  if (this.regMDLo & 0xff00) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) this.traceLog('MULb', src, dst, null, this.getPS(), this.regMDLo);
              
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulBR : this.cycleCounts.nOpCyclesMulBM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnMUL32(dst, src)
               *
               * This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as unsigned.
               *
               * TODO: Some potential optimizations include:
               *
               *  1) Early outs if either parameter is zero, since the result will obviously be zero
               *  2) Using "normal" JavaScript multiplication if both parameters are < 32767
               *
               * Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
               *
               * @this {X86CPU}
               * @param {number} dst (any 32-bit number, treated as unsigned)
               * @param {number} src (any 32-bit number, treated as unsigned)
               */
              X86.fnMUL32 = function MUL32(dst, src)
              {
                  var srcLo = src & 0xffff;
                  var srcHi = src >>> 16;
                  var dstLo = dst & 0xffff;
                  var dstHi = dst >>> 16;
              
                  var mul00 = srcLo * dstLo;
                  var mul16 = ((mul00 >>> 16) + (srcHi * dstLo));
                  var mul32 = mul16 >>> 16;
                  mul16 = ((mul16 & 0xffff) + (srcLo * dstHi));
                  mul32 += ((mul16 >>> 16) + (srcHi * dstHi));
              
                  this.fMDSet = true;
                  this.regMDLo = (mul16 << 16) | (mul00 & 0xffff);
                  this.regMDHi = mul32|0;
              };
              
              /**
               * fnMULw(dst, src)
               *
               * regMDHi:regMDLo = dst * regEAX
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null; AX or EAX is the implied src)
               * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
               */
              X86.fnMULw = function MULw(dst, src)
              {
                  if (this.dataSize == 2) {
                      src = this.regEAX & 0xffff;
                      var result = (src * dst)|0;
                      this.fMDSet = true;
                      this.regMDLo = result & 0xffff;
                      this.regMDHi = (result >> 16) & 0xffff;
                  } else {
                      X86.fnMUL32.call(this, dst, this.regEAX);
                  }
              
                  if (this.regMDHi) {
                      this.setCF(); this.setOF();
                  } else {
                      this.clearCF(); this.clearOF();
                  }
              
                  /*
                   * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                   * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                   * However, src is technically an output, and dst is merely an input (which is why we must return
                   * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                   */
                  if (DEBUG && DEBUGGER) {
                      if (this.dataSize == 2) {
                          this.traceLog('MULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                      } else {
                          this.traceLog('MULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                      }
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulWR : this.cycleCounts.nOpCyclesMulWM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnNEGb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnNEGb = function NEGb(dst, src)
              {
                  var b = (-dst)|0;
                  this.setArithResult(0, dst, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                  return b & 0xff;
              };
              
              /**
               * fnNEGw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnNEGw = function NEGw(dst, src)
              {
                  var w = (-dst)|0;
                  this.setArithResult(0, dst, w, X86.RESULT.WORD | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                  return w & 0xffff;
              };
              
              /**
               * fnNOTb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnNOTb = function NOTb(dst, src)
              {
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                  return dst ^ 0xff;
              };
              
              /**
               * fnNOTw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnNOTw = function NOTw(dst, src)
              {
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                  return dst ^ 0xffff;
              };
              
              /**
               * fnORb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnORb = function ORb(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return this.setLogicResult(dst | src, X86.RESULT.BYTE);
              };
              
              /**
               * fnORw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnORw = function ORw(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return this.setLogicResult(dst | src, this.dataType);
              };
              
              /**
               * fnPOPw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (current value, ignored)
               * @param {number} src (new value)
               * @return {number} dst (updated value, from src)
               */
              X86.fnPOPw = function POPw(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPopReg : this.cycleCounts.nOpCyclesPopMem);
                  return src;
              };
              
              /**
               * fnPUSHw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnPUSHw = function PUSHw(dst, src)
              {
                  var w = dst;
                  if (this.opFlags & X86.OPFLAG.PUSHSP) {
                      /*
                       * This is the one case where must actually modify dst, so that the ModRM function will
                       * not put a stale value back into the SP register.
                       */
                      dst = (dst - 2) & 0xffff;
                      /*
                       * And on the 8086/8088, the value we just calculated also happens to be the value that must
                       * be pushed.
                       */
                      if (this.model < X86.MODEL_80286) w = dst;
                  }
                  this.pushWord(w);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPushReg : this.cycleCounts.nOpCyclesPushMem);
                  /*
                   * The PUSH is the only write that needs to occur; dst was the source operand and does not need to be rewritten.
                   */
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnRCLb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCLb = function RCLb(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = this.getCarry();
                      count %= 9;
                      if (!count) {
                          carry <<= 7;
                      } else {
                          result = ((dst << count) | (carry << (count - 1)) | (dst >> (9 - count))) & 0xff;
                          carry = dst << (count - 1);
                      }
                      this.setRotateResult(result, carry, X86.RESULT.BYTE);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCLb', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRCLw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCLw = function RCLw(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = this.getCarry();
                      count %= 17;
                      if (!count) {
                          carry <<= 15;
                      } else {
                          result = ((dst << count) | (carry << (count - 1)) | (dst >> (17 - count))) & 0xffff;
                          carry = dst << (count - 1);
                      }
                      this.setRotateResult(result, carry, X86.RESULT.WORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCLw', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRCLd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCLd = function RCLd(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                  if (count) {
                      var carry = this.getCarry();
                      /*
                       * JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
                       * so "dst >>> 32" is equivalent to "dst >>> 0", which doesn't shift any bits at all.  To
                       * compensate, we shift one bit less than the maximum, and then shift one bit farther.
                       */
                      result = (dst << count) | (carry << (count - 1)) | ((dst >>> (32 - count)) >>> 1);
                      carry = dst << (count - 1);
                      this.setRotateResult(result, carry, X86.RESULT.DWORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCLd', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRCRb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCRb = function RCRb(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = this.getCarry();
                      count %= 9;
                      if (!count) {
                          carry <<= 7;
                      } else {
                          result = ((dst >> count) | (carry << (8 - count)) | (dst << (9 - count))) & 0xff;
                          carry = dst << (8 - count);
                      }
                      this.setRotateResult(result, carry, X86.RESULT.BYTE);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCRb', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRCRw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCRw = function RCRw(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = this.getCarry();
                      count %= 17;
                      if (!count) {
                          carry <<= 15;
                      } else {
                          result = ((dst >> count) | (carry << (16 - count)) | (dst << (17 - count))) & 0xffff;
                          carry = dst << (16 - count);
                      }
                      this.setRotateResult(result, carry, X86.RESULT.WORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCRw', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRCRd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRCRd = function RCRd(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                  if (count) {
                      var carry = this.getCarry();
                      /*
                       * JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
                       * so "dst << 32" is equivalent to "dst << 0", which doesn't shift any bits at all.  To
                       * compensate, we shift one bit less than the maximum, and then shift one bit farther.
                       */
                      result = (dst >>> count) | (carry << (32 - count)) | ((dst << (32 - count)) << 1);
                      carry = dst << (32 - count);
                      this.setRotateResult(result, carry, X86.RESULT.DWORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RCRd', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRETF(n)
               *
               * For protected-mode, this function must be prepared to pop any arguments off the current stack AND
               * whatever stack we may have switched to (setCSIP() returns true only when a stack switch has occurred).
               *
               * @this {X86CPU}
               * @param {number} n
               */
              X86.fnRETF = function RETF(n)
              {
                  var newIP = this.popWord();
                  var newCS = this.popWord();
                  if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                  n <<= (this.dataSize >> 2);
                  if (n) this.setSP(this.getSP() + n);            // TODO: optimize
                  if (this.setCSIP(newIP, newCS, false)) {
                      if (n) this.setSP(this.getSP() + n);        // TODO: optimize
                      /*
                       * As per Intel documentation: "If any of [the DS or ES] registers refer to segments whose DPL is
                       * less than the new CPL (excluding conforming code segments), the segment register is loaded with
                       * the null selector."
                       *
                       * TODO: I'm not clear on whether a conforming code segment must also be marked readable, so I'm playing
                       * it safe and using CODE_CONFORMING instead of CODE_CONFORMING_READABLE.  Also, for the record, I've not
                       * seen this situation occur yet (eg, in OS/2 1.0).
                       */
                      if ((this.segDS.sel & X86.SEL.MASK) && this.segDS.dpl < this.segCS.cpl && (this.segDS.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                          this.assert(false);         // I'm not asserting this is bad, I just want to see it in action
                          this.segDS.load(0);
                      }
                      if ((this.segES.sel & X86.SEL.MASK) && this.segES.dpl < this.segCS.cpl && (this.segES.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                          this.assert(false);         // I'm not asserting this is bad, I just want to see it in action
                          this.segES.load(0);
                      }
                  }
                  if (n == 2 && this.cIntReturn) this.checkIntReturn(this.regLIP);
              };
              
              /**
               * fnROLb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnROLb = function ROLb(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry;
                      count &= 0x7;
                      if (!count) {
                          carry = dst << 7;
                      } else {
                          carry = dst << (count - 1);
                          result = ((dst << count) | (dst >> (8 - count))) & 0xff;
                      }
                      this.setRotateResult(result, carry, X86.RESULT.BYTE);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('ROLb', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnROLw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnROLw = function ROLw(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry;
                      count &= 0xf;
                      if (!count) {
                          carry = dst << 15;
                      } else {
                          carry = dst << (count - 1);
                          result = ((dst << count) | (dst >> (16 - count))) & 0xffff;
                      }
                      this.setRotateResult(result, carry, X86.RESULT.WORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('ROLw', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnROLd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnROLd = function ROLd(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = dst << (count - 1);
                      result = (dst << count) | (dst >>> (32 - count));
                      this.setRotateResult(result, carry, X86.RESULT.DWORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('ROLd', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRORb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRORb = function RORb(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry;
                      count &= 0x7;
                      if (!count) {
                          carry = dst;
                      } else {
                          carry = dst << (8 - count);
                          result = ((dst >>> count) | carry) & 0xff;
                      }
                      this.setRotateResult(result, carry, X86.RESULT.BYTE);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RORb', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRORw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRORw = function RORw(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry;
                      count &= 0xf;
                      if (!count) {
                          carry = dst;
                      } else {
                          carry = dst << (16 - count);
                          result = ((dst >>> count) | carry) & 0xffff;
                      }
                      this.setRotateResult(result, carry, X86.RESULT.WORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RORw', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnRORd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL)
               * @return {number}
               */
              X86.fnRORd = function RORd(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = dst << (32 - count);
                      result = (dst >>> count) | carry;
                      this.setRotateResult(result, carry, X86.RESULT.DWORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('RORd', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnSARb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSARb = function SARb(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      if (count > 9) count = 9;
                      var carry = ((dst << 24) >> 24) >> (count - 1);
                      dst = (carry >> 1) & 0xff;
                      this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1);
                  }
                  return dst;
              };
              
              /**
               * fnSARw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSARw = function SARw(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      if (count > 17) count = 17;
                      var carry = ((dst << 16) >> 16) >> (count - 1);
                      dst = (carry >> 1) & 0xffff;
                      this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
                  }
                  return dst;
              };
              
              /**
               * fnSARd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSARd = function SARd(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = dst >> (count - 1);
                      dst = (carry >> 1);
                      this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
                  }
                  return dst;
              };
              
              /**
               * fnSBBb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSBBb = function SBBb(dst, src)
              {
                  var b = (dst - src - this.getCarry())|0;
                  this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b & 0xff;
              };
              
              /**
               * fnSBBw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSBBw = function SBBw(dst, src)
              {
                  var w = (dst - src - this.getCarry())|0;
                  this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return w & this.dataMask;
              };
              
              /**
               * fnSETcc()
               *
               * @this {X86CPU}
               * @param {function(number,number)} fnSet
               */
              X86.fnSETcc = function SETcc(fnSet)
              {
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModMemByte[this.getIPByte()].call(this, fnSet);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesSetR : this.cycleCounts.nOpCyclesSetM);
              };
              
              /**
               * fnSETO(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETO = function SETO(dst, src)
              {
                  return (this.getOF()? 1 : 0);
              };
              
              /**
               * fnSETNO(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNO = function SETNO(dst, src)
              {
                  return (this.getOF()? 0 : 1);
              };
              
              /**
               * fnSETC(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETC = function SETC(dst, src)
              {
                  return (this.getCF()? 1 : 0);
              };
              
              /**
               * fnSETNC(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNC = function SETNC(dst, src)
              {
                  return (this.getCF()? 0 : 1);
              };
              
              /**
               * fnSETZ(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETZ = function SETZ(dst, src)
              {
                  return (this.getZF()? 1 : 0);
              };
              
              /**
               * fnSETNZ(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNZ = function SETNZ(dst, src)
              {
                  return (this.getZF()? 0 : 1);
              };
              
              /**
               * fnSETBE(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETBE = function SETBE(dst, src)
              {
                  return (this.getCF() || this.getZF()? 1 : 0);
              };
              
              /**
               * fnSETNBE(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNBE = function SETNBE(dst, src)
              {
                  return (this.getCF() || this.getZF()? 0 : 1);
              };
              
              /**
               * fnSETS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETS = function SETS(dst, src)
              {
                  return (this.getSF()? 1 : 0);
              };
              
              /**
               * fnSETNS(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNS = function SETNS(dst, src)
              {
                  return (this.getSF()? 0 : 1);
              };
              
              /**
               * fnSETP(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETP = function SETP(dst, src)
              {
                  return (this.getPF()? 1 : 0);
              };
              
              /**
               * fnSETNP(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNP = function SETNP(dst, src)
              {
                  return (this.getPF()? 0 : 1);
              };
              
              /**
               * fnSETL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETL = function SETL(dst, src)
              {
                  return (!this.getSF() != !this.getOF()? 1 : 0);
              };
              
              /**
               * fnSETNL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNL = function SETNL(dst, src)
              {
                  return (!this.getSF() != !this.getOF()? 0 : 1);
              };
              
              /**
               * fnSETLE(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETLE = function SETLE(dst, src)
              {
                  return (this.getZF() || !this.getSF() != !this.getOF()? 1 : 0);
              };
              
              /**
               * fnSETNLE(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst (ignored)
               * @param {number} src (ignored)
               * @return {number}
               */
              X86.fnSETNLE = function SETNLE(dst, src)
              {
                  return (this.getZF() || !this.getSF() != !this.getOF()? 0 : 1);
              };
              
              /**
               * fnSGDT(dst, src)
               *
               * op=0x0F,0x01,reg=0x0 (GRP7:SGDT)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnSGDT = function SGDT(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opInvalid.call(this);
                  } else {
                      /*
                       * We don't need to setShort() the first word of the operand, because the ModRM group decoder that
                       * calls us does that automatically with the value we return (dst).
                       */
                      dst = this.addrGDTLimit - this.addrGDT;
                      this.assert(!(dst & ~0xffff));
                      /*
                       * We previously left the 6th byte of the target operand "undefined".  But it turns out we have to set
                       * it to *something*, because there's processor detection in PC-DOS 7.0 (at least in the SETUP portion)
                       * that looks like this:
                       *
                       *      145E:4B84 9C            PUSHF
                       *      145E:4B85 55            PUSH     BP
                       *      145E:4B86 8BEC          MOV      BP,SP
                       *      145E:4B88 B80000        MOV      AX,0000
                       *      145E:4B8B 50            PUSH     AX
                       *      145E:4B8C 9D            POPF
                       *      145E:4B8D 9C            PUSHF
                       *      145E:4B8E 58            POP      AX
                       *      145E:4B8F 2500F0        AND      AX,F000
                       *      145E:4B92 3D00F0        CMP      AX,F000
                       *      145E:4B95 7511          JNZ      4BA8
                       *      145E:4BA8 C8060000      ENTER    0006,00
                       *      145E:4BAC 0F0146FA      SGDT     [BP-06]
                       *      145E:4BB0 807EFFFF      CMP      [BP-01],FF
                       *      145E:4BB4 C9            LEAVE
                       *      145E:4BB5 BA8603        MOV      DX,0386
                       *      145E:4BB8 7503          JNZ      4BBD
                       *      145E:4BBA BA8602        MOV      DX,0286
                       *      145E:4BBD 89163004      MOV      [0430],DX
                       *      145E:4BC1 5D            POP      BP
                       *      145E:4BC2 9D            POPF
                       *      145E:4BC3 CB            RETF
                       *
                       * This code is expecting SGDT on an 80286 to set the 6th "undefined" byte to 0xFF.
                       *
                       * The 80386 adds an additional wrinkle: the 6th byte must be 0x00 if the OPERAND size is 2, whereas
                       * it must passed through if the OPERAND size is 4.
                       *
                       * In addition, when the OPERAND size is 4, the ModRM group decoder will call setLong(dst) rather than
                       * setShort(dst); we could fix that by forcing the dataSize to 2, but it seems simpler to set the high
                       * bits (16-31) of dst to match the low bits (0-15) of addr, so that the caller will harmlessly rewrite
                       * what we already wrote with the setLong() below.
                       */
                      var addr = this.addrGDT;
                      if (this.model == X86.MODEL_80286) {
                          addr |= (0xff000000|0);
                      }
                      else if (this.model >= X86.MODEL_80386) {
                          if (this.dataSize == 2) {
                              addr &= 0x00ffffff;
                          } else {
                              dst |= (addr << 16);
                          }
                      }
                      this.setLong(this.regEA + 2, addr);
                      this.nStepCycles -= 11;
                  }
                  return dst;
              };
              
              /**
               * fnSHLb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHLb = function SHLb(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = 0;
                      if (count > 8) {
                          result = 0;
                      } else {
                          carry = dst << (count - 1);
                          result = (carry << 1) & 0xff;
                      }
                      this.setLogicResult(result, X86.RESULT.BYTE, carry & X86.RESULT.BYTE, (result ^ carry) & X86.RESULT.BYTE);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('SHLb', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnSHLw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHLw = function SHLw(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = 0;
                      if (count > 16) {
                          result = 0;
                      } else {
                          carry = dst << (count - 1);
                          result = (carry << 1) & 0xffff;
                      }
                      this.setLogicResult(result, X86.RESULT.WORD, carry & X86.RESULT.WORD, (result ^ carry) & X86.RESULT.WORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('SHLw', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnSHLd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHLd = function SHLd(dst, src)
              {
                  var result = dst;
                  var flagsIn = (DEBUG? this.getPS() : 0);
                  var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                  if (count) {
                      var carry = dst << (count - 1);
                      result = (carry << 1);
                      this.setLogicResult(result, X86.RESULT.DWORD, carry & X86.RESULT.DWORD, (result ^ carry) & X86.RESULT.DWORD);
                  }
                  if (DEBUG && DEBUGGER) this.traceLog('SHLd', dst, src, flagsIn, this.getPS(), result);
                  return result;
              };
              
              /**
               * fnSHLDw(dst, src, count)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @param {number} count (0-31)
               * @return {number}
               */
              X86.fnSHLDw = function SHLDw(dst, src, count)
              {
                  if (count) {
                      if (count > 16) {
                          dst = src;
                          count -= 16;
                      }
                      var carry = dst << (count - 1);
                      dst = ((carry << 1) | (src >> (16 - count))) & 0xffff;
                      this.setLogicResult(dst, X86.RESULT.WORD, carry & X86.RESULT.WORD);
                  }
                  return dst;
              };
              
              /**
               * fnSHLDd(dst, src, count)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @param {number} count
               * @return {number}
               */
              X86.fnSHLDd = function SHLDd(dst, src, count)
              {
                  if (count) {
                      var carry = dst << (count - 1);
                      dst = (carry << 1) | (src >> (32 - count));
                      this.setLogicResult(dst, X86.RESULT.DWORD, carry & X86.RESULT.DWORD);
                  }
                  return dst;
              };
              
              /**
               * fnSHLDwi(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHLDwi = function SHLDwi(dst, src)
              {
                  return X86.fnSHLDw.call(this, dst, src, this.getIPByte());
              };
              
              /**
               * fnSHLDdi(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHLDdi = function SHLDdi(dst, src)
              {
                  return X86.fnSHLDd.call(this, dst, src, this.getIPByte());
              };
              
              /**
               * fnSHLDwCL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHLDwCL = function SHLDwCL(dst, src)
              {
                  return X86.fnSHLDw.call(this, dst, src, this.regECX & 0x1f);
              };
              
              /**
               * fnSHLDdCL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHLDdCL = function SHLDdCL(dst, src)
              {
                  return X86.fnSHLDd.call(this, dst, src, this.regECX & 0x1f);
              };
              
              /**
               * fnSHRb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHRb = function SHRb(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = (count > 8? 0 : (dst >>> (count - 1)));
                      dst = (carry >>> 1) & 0xff;
                      this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1, dst & X86.RESULT.BYTE);
                  }
                  return dst;
              };
              
              /**
               * fnSHRw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHRw = function SHRw(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = (count > 16? 0 : (dst >>> (count - 1)));
                      dst = (carry >>> 1) & 0xffff;
                      this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1, dst & X86.RESULT.WORD);
                  }
                  return dst;
              };
              
              /**
               * fnSHRd(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
               * @return {number}
               */
              X86.fnSHRd = function SHRd(dst, src)
              {
                  var count = src & this.nShiftCountMask;
                  if (count) {
                      var carry = (dst >>> (count - 1));
                      dst = (carry >>> 1);
                      this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1, dst & X86.RESULT.DWORD);
                  }
                  return dst;
              };
              
              /**
               * fnSHRDw(dst, src, count)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @param {number} count (0-31)
               * @return {number}
               */
              X86.fnSHRDw = function SHRDw(dst, src, count)
              {
                  if (count) {
                      if (count > 16) {
                          dst = src;
                          count -= 16;
                      }
                      var carry = dst >> (count - 1);
                      dst = ((carry >> 1) | (src << (16 - count))) & 0xffff;
                      this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
                  }
                  return dst;
              };
              
              /**
               * fnSHRDd(dst, src, count)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @param {number} count
               * @return {number}
               */
              X86.fnSHRDd = function SHRDd(dst, src, count)
              {
                  if (count) {
                      var carry = dst >> (count - 1);
                      dst = (carry >> 1) | (src << (32 - count));
                      this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
                  }
                  return dst;
              };
              
              /**
               * fnSHRDwi(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHRDwi = function SHRDwi(dst, src)
              {
                  return X86.fnSHRDw.call(this, dst, src, this.getIPByte());
              };
              
              /**
               * fnSHRDdi(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHRDdi = function SHRDdi(dst, src)
              {
                  return X86.fnSHRDd.call(this, dst, src, this.getIPByte());
              };
              
              /**
               * fnSHRDwCL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHRDwCL = function SHRDwCL(dst, src)
              {
                  return X86.fnSHRDw.call(this, dst, src, this.regECX & 0x1f);
              };
              
              /**
               * fnSHRDdCL(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSHRDdCL = function SHRDdCL(dst, src)
              {
                  return X86.fnSHRDd.call(this, dst, src, this.regECX & 0x1f);
              };
              
              /**
               * fnSIDT(dst, src)
               *
               * op=0x0F,0x01,reg=0x1 (GRP7:SIDT)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnSIDT = function SIDT(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      X86.opInvalid.call(this);
                  } else {
                      /*
                       * We don't need to setShort() the first word of the operand, because the ModRM group decoder that calls
                       * us does that automatically with the value we return (dst).
                       */
                      dst = this.addrIDTLimit - this.addrIDT;
                      this.assert(!(dst & ~0xffff));
                      /*
                       * As with SGDT, the 6th byte is technically "undefined" on an 80286, but we now set it to 0xFF, for the
                       * same reasons discussed in SGDT (above).
                       */
                      var addr = this.addrIDT;
                      if (this.model == X86.MODEL_80286) {
                          addr |= (0xff000000|0);
                      }
                      else if (this.model >= X86.MODEL_80386) {
                          if (this.dataSize == 2) {
                              addr &= 0x00ffffff;
                          } else {
                              dst |= (addr << 16);
                          }
                      }
                      this.setLong(this.regEA + 2, addr);
                      this.nStepCycles -= 12;
                  }
                  return dst;
              };
              
              /**
               * fnSLDT(dst, src)
               *
               * op=0x0F,0x00,reg=0x0 (GRP6:SLDT)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnSLDT = function SLDT(dst, src)
              {
                  this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                  return this.segLDT.sel;
              };
              
              /**
               * fnSMSW(dst, src)
               *
               * op=0x0F,0x01,reg=0x4 (GRP7:SMSW)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnSMSW = function SMSW(dst, src)
              {
                  this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                  return this.regCR0;
              };
              
              /**
               * fnSTR(dst, src)
               *
               * op=0x0F,0x00,reg=0x1 (GRP6:STR)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnSTR = function STR(dst, src)
              {
                  this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                  return this.segTSS.sel;
              };
              
              /**
               * fnSUBb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSUBb = function SUBb(dst, src)
              {
                  var b = (dst - src)|0;
                  this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b & 0xff;
              };
              
              /**
               * fnSUBw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnSUBw = function SUBw(dst, src)
              {
                  var w = (dst - src)|0;
                  this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return w & this.dataMask;
              };
              
              /**
               * fnTEST8(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null; we have to supply the source ourselves)
               * @return {number}
               */
              X86.fnTEST8 = function TEST8(dst, src)
              {
                  src = this.getIPByte();
                  this.setLogicResult(dst & src, X86.RESULT.BYTE);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnTEST16(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null; we have to supply the source ourselves)
               * @return {number}
               */
              X86.fnTEST16 = function TEST16(dst, src)
              {
                  src = this.getIPWord();
                  this.setLogicResult(dst & src, X86.RESULT.WORD);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnTESTb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnTESTb = function TESTb(dst, src)
              {
                  this.setLogicResult(dst & src, X86.RESULT.BYTE);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnTESTw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnTESTw = function TESTw(dst, src)
              {
                  this.setLogicResult(dst & src, X86.RESULT.WORD);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  return dst;
              };
              
              /**
               * fnVERR(dst, src)
               *
               * op=0x0F,0x00,reg=0x4 (GRP6:VERR)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnVERR = function VERR(dst, src)
              {
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  /*
                   * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                   * descriptor table or the descriptor is not for a segment.
                   */
                  this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
                      /*
                       * Verify that this is a readable segment; that is, of these four combinations (code+readable,
                       * code+nonreadable, data+writable, date+nonwritable), make sure we're not the second combination.
                       */
                      if ((this.segVER.acc & (X86.DESC.ACC.TYPE.READABLE | X86.DESC.ACC.TYPE.CODE)) != X86.DESC.ACC.TYPE.CODE) {
                          /*
                           * For VERR, if the code segment is readable and conforming, the descriptor privilege level
                           * (DPL) can be any value.
                           *
                           * Otherwise, DPL must be greater than or equal to (have less or the same privilege as) both the
                           * current privilege level and the selector's RPL.
                           */
                          if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL) ||
                              (this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                              this.setZF();
                              return dst;
                          }
                      }
                  }
                  this.clearZF();
                  return dst;
              };
              
              /**
               * fnVERW(dst, src)
               *
               * op=0x0F,0x00,reg=0x5 (GRP6:VERW)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src (null)
               * @return {number}
               */
              X86.fnVERW = function VERW(dst, src)
              {
                  this.opFlags |= X86.OPFLAG.NOWRITE;
                  /*
                   * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                   * descriptor table or the descriptor is not for a segment.
                   */
                  this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                  if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
                      /*
                       * Verify that this is a writable data segment
                       */
                      if ((this.segVER.acc & (X86.DESC.ACC.TYPE.WRITABLE | X86.DESC.ACC.TYPE.CODE)) == X86.DESC.ACC.TYPE.WRITABLE) {
                          /*
                           * DPL must be greater than or equal to (have less or the same privilege as) both the current
                           * privilege level and the selector's RPL.
                           */
                          if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL)) {
                              this.setZF();
                              return dst;
                          }
                      }
                  }
                  this.clearZF();
                  return dst;
              };
              
              /**
               * fnXCHGrb(dst, src)
               *
               * If an instruction like "XCHG AL,AH" was a traditional "op dst,src" instruction, dst would contain AL,
               * src would contain AH, and we would return src, which the caller would then store in AL, and we'd be done.
               *
               * However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
               * example, that means storing the original AL (dst) into AH (src).
               *
               * BACKTRACK support is incomplete without also passing bti values as parameters, because the caller will
               * store btiAH in btiAL, but the original btiAL will be lost.  Similarly, if src is a memory operand, the
               * caller will store btiEALo in btiAL, but again, the original btiAL will be lost.
               *
               * BACKTRACK support for memory operands could be fixed by decoding the dst register in order to determine the
               * corresponding bti and then temporarily storing it in btiEALo around the setEAByte() call below.  Register-only
               * XCHGs would require a more extensive hack.  For now, I'm going to live with one-way BACKTRACK support here.
               *
               * TODO: Implement full BACKTRACK support for XCHG instructions.
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnXCHGrb = function XCHGRb(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      /*
                       * Decode which register was src
                       */
                      switch (this.bModRM & 0x7) {
                      case 0x0:       // AL
                          this.regEAX = (this.regEAX & ~0xff) | dst;
                          break;
                      case 0x1:       // CL
                          this.regECX = (this.regECX & ~0xff) | dst;
                          break;
                      case 0x2:       // DL
                          this.regEDX = (this.regEDX & ~0xff) | dst;
                          break;
                      case 0x3:       // BL
                          this.regEBX = (this.regEBX & ~0xff) | dst;
                          break;
                      case 0x4:       // AH
                          this.regEAX = (this.regEAX & 0xff) | (dst << 8);
                          break;
                      case 0x5:       // CH
                          this.regECX = (this.regECX & 0xff) | (dst << 8);
                          break;
                      case 0x6:       // DH
                          this.regEDX = (this.regEDX & 0xff) | (dst << 8);
                          break;
                      case 0x7:       // BH
                          this.regEBX = (this.regEBX & 0xff) | (dst << 8);
                          break;
                      default:
                          break;      // there IS no other case, but JavaScript inspections don't know that
                      }
                      this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
                  } else {
                      /*
                       * This is a case where the ModRM decoder that's calling us didn't know it should have called modEAByte()
                       * instead of getEAByte(), so we compensate by updating regEAWrite.  However, setEAByte() has since been
                       * changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
                       */
                      this.regEAWrite = this.regEA;
                      this.setEAByte(dst);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
                  }
                  return src;
              };
              
              /**
               * fnXCHGrw(dst, src)
               *
               * If an instruction like "XCHG AX,DX" was a traditional "op dst,src" instruction, dst would contain AX,
               * src would contain DX, and we would return src, which the caller would then store in AX, and we'd be done.
               *
               * However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
               * example, that means storing the original AX (dst) into DX (src).
               *
               * TODO: Implement full BACKTRACK support for XCHG instructions (see fnXCHGrb comments).
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnXCHGrw = function XCHGRw(dst, src)
              {
                  if (this.regEA === X86.ADDR_INVALID) {
                      /*
                       * Decode which register was src
                       */
                      switch (this.bModRM & 0x7) {
                      case 0x0:       // AX
                          this.regEAX = dst;
                          break;
                      case 0x1:       // CX
                          this.regECX = dst;
                          break;
                      case 0x2:       // DX
                          this.regEDX = dst;
                          break;
                      case 0x3:       // BX
                          this.regEBX = dst;
                          break;
                      case 0x4:       // SP
                          this.setSP(dst);
                          break;
                      case 0x5:       // BP
                          this.regEBP = dst;
                          break;
                      case 0x6:       // SI
                          this.regESI = dst;
                          break;
                      case 0x7:       // DI
                          this.regEDI = dst;
                          break;
                      default:
                          break;      // there IS no other case, but JavaScript inspections don't know that
                      }
                      this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
                  } else {
                      /*
                       * This is a case where the ModRM decoder that's calling us didn't know it should have called modEAWord()
                       * instead of getEAWord(), so we compensate by updating regEAWrite.  However, setEAWord() has since been
                       * changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
                       */
                      this.regEAWrite = this.regEA;
                      this.setEAWord(dst);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
                  }
                  return src;
              };
              
              /**
               * fnXORb(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnXORb = function XORb(dst, src)
              {
                  var b = dst ^ src;
                  this.setLogicResult(b, X86.RESULT.BYTE);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return b;
              };
              
              /**
               * fnXORw(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnXORw = function XORw(dst, src)
              {
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                  return this.setLogicResult(dst ^ src, this.dataType);
              };
              
              /**
               * fnGRPFault(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnGRPFault = function GRPFault(dst, src)
              {
                  X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                  return dst;
              };
              
              /**
               * fnGRPInvalid(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnGRPInvalid = function GRPInvalid(dst, src)
              {
                  X86.opInvalid.call(this);
                  return dst;
              };
              
              /**
               * fnGRPUndefined(dst, src)
               *
               * @this {X86CPU}
               * @param {number} dst
               * @param {number} src
               * @return {number}
               */
              X86.fnGRPUndefined = function GRPUndefined(dst, src)
              {
                  X86.opUndefined.call(this);
                  return dst;
              };
              
              /**
               * fnDIVOverflow()
               *
               * @this {X86CPU}
               */
              X86.fnDIVOverflow = function DIVOverflow()
              {
                  this.setIP(this.opLIP - this.segCS.base);
                  /*
                   * TODO: Determine the proper cycle cost.
                   */
                  X86.fnINT.call(this, X86.EXCEPTION.DIV_ERR, null, 2);
              };
              
              /**
               * fnSrcCount1()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86.fnSrcCount1 = function SrcCount1()
              {
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 2 : this.cycleCounts.nOpCyclesShift1M);
                  return 1;
              };
              
              /**
               * fnSrcCountCL()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86.fnSrcCountCL = function SrcCountCL()
              {
                  var count = this.regECX & 0xff;
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
                  return count;
              };
              
              /**
               * fnSrcCountN()
               *
               * @this {X86CPU}
               * @return {number}
               */
              X86.fnSrcCountN = function SrcCountN()
              {
                  var count = this.getIPByte();
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
                  return count;
              };
              
              /**
               * fnSrcNone()
               *
               * @this {X86CPU}
               * @return {number|null}
               */
              X86.fnSrcNone = function SrcNone()
              {
                  return null;
              };
              
              /**
               * fnFault(nFault, nError, fHalt)
               *
               * Helper to dispatch faults.
               *
               * @this {X86CPU}
               * @param {number} nFault
               * @param {number} [nError] (if omitted, no error code will be pushed)
               * @param {boolean} [fHalt] will halt the CPU if true *and* a Debugger is loaded
               */
              X86.fnFault = function(nFault, nError, fHalt)
              {
                  if (!this.aFlags.fComplete) {
                      this.printMessage("Fault " + str.toHexByte(nFault) + " blocked by Debugger", Messages.WARN);
                      this.setIP(this.opLIP - this.segCS.base);
                      return;
                  }
              
                  var fDispatch = false;
                  if (this.model >= X86.MODEL_80186) {
                      if (this.nFault < 0) {
                          /*
                           * Single-fault (error code is passed through, and the responsible instruction is restartable)
                           */
                          this.setIP(this.opLIP - this.segCS.base);
                          fDispatch = true;
                      } else if (this.nFault != X86.EXCEPTION.DF_FAULT) {
                          /*
                           * Double-fault (error code is always zero, and the responsible instruction is not restartable)
                           */
                          nError = 0;
                          nFault = X86.EXCEPTION.DF_FAULT;
                          fDispatch = true;
                      } else {
                          /*
                           * Triple-fault (usually referred to in Intel literature as a "shutdown", but at least on the 80286,
                           * it's actually a "reset")
                           */
                          X86.fnFaultMessage.call(this, -1, 0, fHalt);
                          this.resetRegs();
                          return;
                      }
                  }
              
                  if (X86.fnFaultMessage.call(this, nFault, nError, fHalt)) {
                      fDispatch = false;
                  }
              
                  if (fDispatch) X86.fnINT.call(this, this.nFault = nFault, nError, 0);
              
                  /*
                   * Since this fault is likely being issued in the context of an instruction that hasn't finished
                   * executing, and since we currently don't do anything to interrupt that execution (eg, throw a
                   * JavaScript exception), we should shut off all further reads/writes for the current instruction.
                   *
                   * That's easy for any EA-based memory accesses: simply set both the NOREAD and NOWRITE flags.
                   * However, there are also direct, non-EA-based memory accesses to consider.  A perfect example is
                   * opPUSHA(): if a GP fault occurs on any PUSH other than the last, a subsequent PUSH is likely to
                   * cause another fault, which we will misinterpret as a double-fault.
                   *
                   * TODO: Throw a special JavaScript exception that cpu.js must intercept and quietly ignore.
                   */
                  this.opFlags |= (X86.OPFLAG.NOREAD | X86.OPFLAG.NOWRITE);
              };
              
              /**
               * fnPageFault(addr, fPresent, fWrite)
               *
               * Helper to dispatch page faults.
               *
               * @this {X86CPU}
               * @param {number} addr
               * @param {boolean} fPresent
               * @param {boolean} fWrite
               */
              X86.fnPageFault = function(addr, fPresent, fWrite)
              {
                  this.regCR2 = addr;
                  var nError = 0;
                  if (fPresent) nError |= X86.PTE.PRESENT;
                  if (fWrite) nError |= X86.PTE.READWRITE;
                  if (this.segCS.cpl == 3) nError |= X86.PTE.USER;
                  X86.fnFault.call(this, X86.EXCEPTION.PG_FAULT, nError);
              };
              
              /**
               * fnFaultMessage()
               *
               * Aside from giving the Debugger an opportunity to report every fault, this also gives us the ability to
               * halt exception processing in tracks: return true to prevent the fault handler from being dispatched.
               *
               * At the moment, the only Debugger control you have over fault interception is setting MESSAGE.FAULT, which
               * will display faults as they occur, and MESSAGE.HALT, which will halt after any Debugger message, including
               * MESSAGE.FAULT.  If you want execution to continue after halting, clear MESSAGE.FAULT and/or MESSAGE.HALT,
               * or single-step over the offending instruction, which will allow the fault to be dispatched.
               *
               * @this {X86CPU}
               * @param {number} nFault
               * @param {number} [nError] (if omitted, no error code will be reported)
               * @param {boolean} [fHalt] true if the CPU should always be halted, false if "it depends"
               * @return {boolean|undefined} true to block the fault (often desirable when fHalt is true), otherwise dispatch it
               */
              X86.fnFaultMessage = function(nFault, nError, fHalt)
              {
                  var bitsMessage = Messages.FAULT;
              
                  var bOpcode = this.probeAddr(this.regLIP);
              
                  /*
                   * OS/2 1.0 uses an INT3 (0xCC) opcode in conjunction with an invalid IDT to trigger a triple-fault
                   * reset and return to real-mode, and these resets happen quite frequently during boot; for example,
                   * OS/2 startup messages are displayed using a series of INT 0x10 BIOS calls for each character, and
                   * each series of BIOS calls requires a round-trip mode switch.
                   *
                   * Since we really only want to halt on "bad" faults, not "good" (ie, intentional) faults, we take
                   * advantage of the fact that all 3 faults comprising the triple-fault point to an INT3 (0xCC) opcode,
                   * and so whenever we see that opcode, we ignore the caller's fHalt flag, and suppress FAULT messages
                   * unless CPU messages are also enabled.
                   *
                   * When a triple fault shows up, nFault is -1; it displays as 0xff only because we use toHexByte().
                   */
                  if (bOpcode == X86.OPCODE.INT3) {
                      fHalt = false;
                      bitsMessage |= Messages.CPU;
                  }
              
                  /*
                   * Similarly, the PC AT ROM BIOS deliberately generates a couple of GP faults as part of the POST
                   * (Power-On Self Test); we don't want to ignore those, but we don't want to halt on them either.  We
                   * detect those faults by virtue of the LIP being in the range 0x0F0000 to 0x0FFFFF.
                   */
                  if (this.regLIP >= 0x0F0000 && this.regLIP <= 0x0FFFFF) {
                      fHalt = false;
                  }
              
                  /*
                   * However, the foregoing notwithstanding, if MESSAGE.HALT is enabled along with all the other required
                   * MESSAGE bits, then we want to halt regardless.
                   */
                  if (this.messageEnabled(bitsMessage | Messages.HALT)) {
                      fHalt = true;
                  }
              
                  if (this.messageEnabled(bitsMessage) || fHalt) {
                      var sMessage = (fHalt? '\n' : '') + "Fault " + str.toHexByte(nFault) + (nError != null? " (" + str.toHexWord(nError) + ")" : "") + " on opcode " + str.toHexByte(bOpcode) + " at " + this.dbg.hexOffset(this.getIP(), this.getCS()) + " (%" + str.toHex(this.regLIP, 6) + ")";
                      var fRunning = this.aFlags.fRunning;
                      if (this.printMessage(sMessage, bitsMessage)) {
                          if (fHalt) {
                              /*
                               * By setting fHalt to fRunning (which is true while running but false while single-stepping),
                               * this allows a fault to be dispatched when you single-step over a faulting instruction; you can
                               * then continue single-stepping into the fault handler, or start running again.
                               *
                               * Note that we had to capture fRunning before calling printMessage(), because if MESSAGE.HALT
                               * is set, printMessage() will have already halted the CPU.
                               */
                              fHalt = fRunning;
                              this.dbg.stopCPU();
                          }
                      } else {
                          /*
                           * If printMessage() returned false, then messageEnabled() must have returned false as well, which
                           * means that fHalt must be true.  Which means we should shut the machine down.
                           */
                          this.assert(fHalt);
                          this.notice(sMessage);
                          this.stopCPU();
                      }
                  }
                  return fHalt;
              };
              
            • x86modb.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModB = {};
              
              X86ModB.aOpModReg = [
                  /**
                   * opModRegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte00(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte01(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte02(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte03(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte04(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte05(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte06(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte07(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte08(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte09(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte0F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte10(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte11(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte12(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte13(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte14(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte15(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte16(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte17(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte18(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte19(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte1F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte20(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte21(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte22(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte23(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte24(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte25(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte26(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte27(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte28(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte29(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2A(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2B(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2C(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2D(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2E(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte2F(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte30(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte31(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte32(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte33(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte34(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte35(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte36(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte37(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte38(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte39(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3A(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3B(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3C(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3D(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3E(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte3F(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte40(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte41(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte42(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte43(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte44(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte45(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte46(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte47(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte48(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte49(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte4F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte50(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte51(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte52(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte53(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte54(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte55(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte56(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte57(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte58(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte59(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte5F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte60(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte61(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte62(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte63(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte64(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte65(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte66(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte67(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte68(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte69(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6A(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6B(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6C(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6D(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6E(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte6F(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte70(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte71(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte72(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte73(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte74(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte75(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte76(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte77(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte78(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte79(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7A(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7B(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7C(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7D(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7E(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte7F(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte80(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte81(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte82(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte83(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte84(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte85(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte86(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte87(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte88(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte89(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte8F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte90(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte91(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte92(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte93(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte94(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte95(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte96(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte97(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte98(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte99(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByte9F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA0(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA1(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA2(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA3(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA4(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA5(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA6(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA7(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA8(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteA9(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAA(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAB(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAC(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAD(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAE(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteAF(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB0(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB1(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB2(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB3(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB4(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB5(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB6(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB7(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB8(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteB9(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBA(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBB(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBC(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBD(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBE(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteBF(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC0(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                  },
                  /**
                   * opModRegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC1(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC2(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC3(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC4(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC5(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC6(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC7(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC8(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteC9(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                  },
                  /**
                   * opModRegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCA(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCB(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCC(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCD(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCE(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteCF(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD0(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD1(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD2(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                  },
                  /**
                   * opModRegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD3(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD4(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD5(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD6(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD7(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD8(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteD9(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDA(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDB(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                  },
                  /**
                   * opModRegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDC(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDD(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDE(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteDF(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE0(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE1(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE2(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE3(fn) {
                      var b = fn.call(this, this.regEAX >> 8, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE4(fn) {
                      var b = fn.call(this, this.regEAX >> 8, (this.regEAX >> 8));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                  },
                  /**
                   * opModRegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE5(fn) {
                      var b = fn.call(this, this.regEAX >> 8, (this.regECX >> 8));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE6(fn) {
                      var b = fn.call(this, this.regEAX >> 8, (this.regEDX >> 8));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE7(fn) {
                      var b = fn.call(this, this.regEAX >> 8, (this.regEBX >> 8));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE8(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.regEAX & 0xff);
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteE9(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.regECX & 0xff);
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteEA(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.regEDX & 0xff);
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteEB(fn) {
                      var b = fn.call(this, this.regECX >> 8, this.regEBX & 0xff);
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteEC(fn) {
                      var b = fn.call(this, this.regECX >> 8, (this.regEAX >> 8));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteED(fn) {
                      var b = fn.call(this, this.regECX >> 8, (this.regECX >> 8));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                  },
                  /**
                   * opModRegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteEE(fn) {
                      var b = fn.call(this, this.regECX >> 8, (this.regEDX >> 8));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteEF(fn) {
                      var b = fn.call(this, this.regECX >> 8, (this.regEBX >> 8));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF0(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF1(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF2(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF3(fn) {
                      var b = fn.call(this, this.regEDX >> 8, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF4(fn) {
                      var b = fn.call(this, this.regEDX >> 8, (this.regEAX >> 8));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF5(fn) {
                      var b = fn.call(this, this.regEDX >> 8, (this.regECX >> 8));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF6(fn) {
                      var b = fn.call(this, this.regEDX >> 8, (this.regEDX >> 8));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                  },
                  /**
                   * opModRegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF7(fn) {
                      var b = fn.call(this, this.regEDX >> 8, (this.regEBX >> 8));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                  },
                  /**
                   * opModRegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF8(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                  },
                  /**
                   * opModRegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteF9(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                  },
                  /**
                   * opModRegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFA(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                  },
                  /**
                   * opModRegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFB(fn) {
                      var b = fn.call(this, this.regEBX >> 8, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                  },
                  /**
                   * opModRegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFC(fn) {
                      var b = fn.call(this, this.regEBX >> 8, (this.regEAX >> 8));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                  },
                  /**
                   * opModRegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFD(fn) {
                      var b = fn.call(this, this.regEBX >> 8, (this.regECX >> 8));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                  },
                  /**
                   * opModRegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFE(fn) {
                      var b = fn.call(this, this.regEBX >> 8, (this.regEDX >> 8));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                  },
                  /**
                   * opModRegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegByteFF(fn) {
                      var b = fn.call(this, this.regEBX >> 8, (this.regEBX >> 8));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                  }
              ];
              
              X86ModB.aOpModMem = [
                  /**
                   * opModMemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte00(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte01(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte02(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte03(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte04(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte05(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte06(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte07(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte08(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte09(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte0F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte10(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte11(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte12(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte13(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte14(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte15(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte16(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte17(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte18(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte19(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte1F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte20(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte21(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte22(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte23(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte24(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte25(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte26(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte27(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte28(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte29(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte2F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte30(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte31(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte32(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte33(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte34(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte35(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte36(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte37(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte38(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte39(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte3F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte40(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte41(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte42(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte43(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte44(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte45(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte46(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte47(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte48(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte49(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte4F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte50(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte51(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte52(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte53(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte54(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte55(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte56(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte57(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte58(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte59(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte5F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte60(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte61(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte62(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte63(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte64(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte65(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte66(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte67(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte68(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte69(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte6F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte70(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte71(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte72(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte73(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte74(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte75(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte76(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte77(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte78(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte79(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte7F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte80(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte81(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte82(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte83(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte84(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte85(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte86(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte87(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte88(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte89(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte8F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte90(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte91(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte92(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte93(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte94(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte95(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte96(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte97(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte98(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte99(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByte9F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA2(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA3(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA5(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA6(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteA9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAA(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAB(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAD(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAE(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteAF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB2(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB3(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB5(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB6(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteB9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBA(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBB(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBD(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBE(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemByteBF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX >> 8);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModB.aOpModReg[0xC0],    X86ModB.aOpModReg[0xC8],    X86ModB.aOpModReg[0xD0],    X86ModB.aOpModReg[0xD8],
                  X86ModB.aOpModReg[0xE0],    X86ModB.aOpModReg[0xE8],    X86ModB.aOpModReg[0xF0],    X86ModB.aOpModReg[0xF8],
                  X86ModB.aOpModReg[0xC1],    X86ModB.aOpModReg[0xC9],    X86ModB.aOpModReg[0xD1],    X86ModB.aOpModReg[0xD9],
                  X86ModB.aOpModReg[0xE1],    X86ModB.aOpModReg[0xE9],    X86ModB.aOpModReg[0xF1],    X86ModB.aOpModReg[0xF9],
                  X86ModB.aOpModReg[0xC2],    X86ModB.aOpModReg[0xCA],    X86ModB.aOpModReg[0xD2],    X86ModB.aOpModReg[0xDA],
                  X86ModB.aOpModReg[0xE2],    X86ModB.aOpModReg[0xEA],    X86ModB.aOpModReg[0xF2],    X86ModB.aOpModReg[0xFA],
                  X86ModB.aOpModReg[0xC3],    X86ModB.aOpModReg[0xCB],    X86ModB.aOpModReg[0xD3],    X86ModB.aOpModReg[0xDB],
                  X86ModB.aOpModReg[0xE3],    X86ModB.aOpModReg[0xEB],    X86ModB.aOpModReg[0xF3],    X86ModB.aOpModReg[0xFB],
                  X86ModB.aOpModReg[0xC4],    X86ModB.aOpModReg[0xCC],    X86ModB.aOpModReg[0xD4],    X86ModB.aOpModReg[0xDC],
                  X86ModB.aOpModReg[0xE4],    X86ModB.aOpModReg[0xEC],    X86ModB.aOpModReg[0xF4],    X86ModB.aOpModReg[0xFC],
                  X86ModB.aOpModReg[0xC5],    X86ModB.aOpModReg[0xCD],    X86ModB.aOpModReg[0xD5],    X86ModB.aOpModReg[0xDD],
                  X86ModB.aOpModReg[0xE5],    X86ModB.aOpModReg[0xED],    X86ModB.aOpModReg[0xF5],    X86ModB.aOpModReg[0xFD],
                  X86ModB.aOpModReg[0xC6],    X86ModB.aOpModReg[0xCE],    X86ModB.aOpModReg[0xD6],    X86ModB.aOpModReg[0xDE],
                  X86ModB.aOpModReg[0xE6],    X86ModB.aOpModReg[0xEE],    X86ModB.aOpModReg[0xF6],    X86ModB.aOpModReg[0xFE],
                  X86ModB.aOpModReg[0xC7],    X86ModB.aOpModReg[0xCF],    X86ModB.aOpModReg[0xD7],    X86ModB.aOpModReg[0xDF],
                  X86ModB.aOpModReg[0xE7],    X86ModB.aOpModReg[0xEF],    X86ModB.aOpModReg[0xF7],    X86ModB.aOpModReg[0xFF]
              ];
              
              X86ModB.aOpModGrp = [
                  /**
                   * opModGrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte00(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte01(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte02(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte03(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte04(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte05(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte06(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte07(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte08(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte09(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte0F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte10(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte11(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte12(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte13(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte14(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte15(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte16(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte17(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte18(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte19(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte1F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte20(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte21(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte22(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte23(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte24(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte25(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte26(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte27(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte28(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte29(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte2F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte30(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte31(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte32(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte33(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte34(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte35(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte36(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte37(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte38(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte39(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte3F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte40(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte41(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte42(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte43(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte44(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte45(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte46(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte47(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte48(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte49(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte4F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte50(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte51(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte52(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte53(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte54(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte55(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte56(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte57(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte58(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte59(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte5F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte60(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte61(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte62(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte63(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte64(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte65(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte66(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte67(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte68(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte69(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte6F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte70(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte71(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte72(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte73(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte74(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte75(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte76(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte77(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte78(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte79(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte7F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte80(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte81(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte82(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte83(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte84(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte85(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte86(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte87(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte88(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte89(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte8F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte90(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte91(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte92(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte93(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte94(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte95(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte96(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte97(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte98(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte99(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByte9F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteA9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAD(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteAF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteB9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteBF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC0(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC1(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC2(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC3(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC4(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC5(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC6(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC7(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC8(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteC9(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCA(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCB(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCC(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCD(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCE(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteCF(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD0(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD1(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD2(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD3(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD4(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD5(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD6(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD7(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD8(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteD9(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDA(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDB(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDC(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDD(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDE(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteDF(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteE9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteEA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteEB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteEC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteED(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteEE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteEF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteF9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEAX >> 8), fnSrc.call(this));
                      this.regEAX = (this.regEAX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regECX >> 8), fnSrc.call(this));
                      this.regECX = (this.regECX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEDX >> 8), fnSrc.call(this));
                      this.regEDX = (this.regEDX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opModGrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpByteFF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEBX >> 8), fnSrc.call(this));
                      this.regEBX = (this.regEBX & 0xff) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModB;
              
            • x86modb16.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModB16 = {};
              
              X86ModB16.aOpModReg = [
                  /**
                   * opMod16RegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte00(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte01(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte02(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte03(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte04(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte05(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte06(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte07(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte08(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte09(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte0F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte10(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte11(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte12(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte13(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte14(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte15(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte16(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte17(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte18(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte19(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte1F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte20(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte21(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte22(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte23(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte24(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte25(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte26(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte27(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte28(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte29(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2A(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2B(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2C(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2D(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2E(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte2F(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte30(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte31(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte32(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte33(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte34(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte35(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte36(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte37(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte38(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte39(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3A(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3B(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3C(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3D(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3E(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte3F(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte40(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte41(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte42(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte43(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte44(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte45(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte46(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte47(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte48(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte49(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte4F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte50(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte51(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte52(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte53(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte54(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte55(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte56(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte57(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte58(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte59(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte5F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte60(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte61(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte62(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte63(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte64(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte65(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte66(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte67(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte68(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte69(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6A(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6B(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6C(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6D(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6E(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte6F(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte70(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte71(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte72(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte73(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte74(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte75(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte76(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte77(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte78(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte79(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7A(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7B(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7C(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7D(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7E(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte7F(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte80(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte81(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte82(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte83(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte84(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte85(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte86(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte87(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte88(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte89(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte8F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte90(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte91(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte92(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte93(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte94(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte95(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte96(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte97(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte98(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte99(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByte9F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA0(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA1(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA2(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA3(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA4(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA5(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA6(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA7(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA8(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteA9(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAA(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAB(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAC(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAD(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAE(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteAF(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB0(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB1(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB2(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB3(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB4(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB5(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB6(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB7(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB8(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteB9(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBA(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBB(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBC(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBD(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBE(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteBF(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC0(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                  },
                  /**
                   * opMod16RegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC1(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC2(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC3(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC4(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC5(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC6(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC7(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC8(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteC9(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                  },
                  /**
                   * opMod16RegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCA(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCB(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCC(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCD(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCE(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteCF(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD0(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD1(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD2(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                  },
                  /**
                   * opMod16RegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD3(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD4(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD5(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD6(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD7(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD8(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteD9(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDA(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDB(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                  },
                  /**
                   * opMod16RegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDC(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDD(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDE(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteDF(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE0(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE1(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE2(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE3(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE4(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod16RegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE5(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE6(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE7(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE8(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteE9(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteEA(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteEB(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteEC(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteED(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod16RegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteEE(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteEF(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF0(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF1(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF2(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF3(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF4(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF5(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF6(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod16RegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF7(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod16RegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF8(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod16RegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteF9(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod16RegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFA(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod16RegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFB(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod16RegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFC(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod16RegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFD(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod16RegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFE(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod16RegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegByteFF(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                  }
              ];
              
              X86ModB16.aOpModMem = [
                  /**
                   * opMod16MemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte00(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte01(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte02(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte03(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte04(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte05(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte06(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte07(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte08(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte09(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte0F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte10(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte11(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte12(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte13(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte14(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte15(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte16(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte17(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte18(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte19(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte1F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte20(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte21(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte22(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte23(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte24(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte25(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte26(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte27(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte28(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte29(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte2F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte30(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte31(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte32(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte33(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte34(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte35(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte36(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte37(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte38(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte39(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte3F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte40(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte41(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte42(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte43(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte44(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte45(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte46(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte47(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte48(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte49(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte4F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte50(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte51(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte52(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte53(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte54(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte55(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte56(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte57(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte58(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte59(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte5F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte60(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte61(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte62(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte63(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte64(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte65(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte66(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte67(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte68(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte69(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte6F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte70(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte71(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte72(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte73(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte74(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte75(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte76(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte77(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte78(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte79(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte7F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte80(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte81(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte82(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte83(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte84(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte85(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte86(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte87(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte88(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte89(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte8F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte90(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte91(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte92(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte93(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte94(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte95(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte96(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte97(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte98(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte99(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9A(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9B(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9E(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByte9F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA2(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA3(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA5(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA6(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteA9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAA(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAB(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAD(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAE(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteAF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB2(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB3(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB5(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB6(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteB9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBA(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBB(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBD(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBE(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemByteBF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModB16.aOpModReg[0xC0],  X86ModB16.aOpModReg[0xC8],  X86ModB16.aOpModReg[0xD0],  X86ModB16.aOpModReg[0xD8],
                  X86ModB16.aOpModReg[0xE0],  X86ModB16.aOpModReg[0xE8],  X86ModB16.aOpModReg[0xF0],  X86ModB16.aOpModReg[0xF8],
                  X86ModB16.aOpModReg[0xC1],  X86ModB16.aOpModReg[0xC9],  X86ModB16.aOpModReg[0xD1],  X86ModB16.aOpModReg[0xD9],
                  X86ModB16.aOpModReg[0xE1],  X86ModB16.aOpModReg[0xE9],  X86ModB16.aOpModReg[0xF1],  X86ModB16.aOpModReg[0xF9],
                  X86ModB16.aOpModReg[0xC2],  X86ModB16.aOpModReg[0xCA],  X86ModB16.aOpModReg[0xD2],  X86ModB16.aOpModReg[0xDA],
                  X86ModB16.aOpModReg[0xE2],  X86ModB16.aOpModReg[0xEA],  X86ModB16.aOpModReg[0xF2],  X86ModB16.aOpModReg[0xFA],
                  X86ModB16.aOpModReg[0xC3],  X86ModB16.aOpModReg[0xCB],  X86ModB16.aOpModReg[0xD3],  X86ModB16.aOpModReg[0xDB],
                  X86ModB16.aOpModReg[0xE3],  X86ModB16.aOpModReg[0xEB],  X86ModB16.aOpModReg[0xF3],  X86ModB16.aOpModReg[0xFB],
                  X86ModB16.aOpModReg[0xC4],  X86ModB16.aOpModReg[0xCC],  X86ModB16.aOpModReg[0xD4],  X86ModB16.aOpModReg[0xDC],
                  X86ModB16.aOpModReg[0xE4],  X86ModB16.aOpModReg[0xEC],  X86ModB16.aOpModReg[0xF4],  X86ModB16.aOpModReg[0xFC],
                  X86ModB16.aOpModReg[0xC5],  X86ModB16.aOpModReg[0xCD],  X86ModB16.aOpModReg[0xD5],  X86ModB16.aOpModReg[0xDD],
                  X86ModB16.aOpModReg[0xE5],  X86ModB16.aOpModReg[0xED],  X86ModB16.aOpModReg[0xF5],  X86ModB16.aOpModReg[0xFD],
                  X86ModB16.aOpModReg[0xC6],  X86ModB16.aOpModReg[0xCE],  X86ModB16.aOpModReg[0xD6],  X86ModB16.aOpModReg[0xDE],
                  X86ModB16.aOpModReg[0xE6],  X86ModB16.aOpModReg[0xEE],  X86ModB16.aOpModReg[0xF6],  X86ModB16.aOpModReg[0xFE],
                  X86ModB16.aOpModReg[0xC7],  X86ModB16.aOpModReg[0xCF],  X86ModB16.aOpModReg[0xD7],  X86ModB16.aOpModReg[0xDF],
                  X86ModB16.aOpModReg[0xE7],  X86ModB16.aOpModReg[0xEF],  X86ModB16.aOpModReg[0xF7],  X86ModB16.aOpModReg[0xFF]
              ];
              
              X86ModB16.aOpModGrp = [
                  /**
                   * opMod16GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte00(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte01(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte02(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte03(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte04(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte05(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte06(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte07(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte08(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte09(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte0F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte10(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte11(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte12(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte13(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte14(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte15(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte16(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte17(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte18(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte19(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte1F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte20(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte21(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte22(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte23(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte24(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte25(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte26(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte27(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte28(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte29(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte2F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte30(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte31(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte32(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte33(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte34(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte35(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte36(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte37(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte38(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte39(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte3F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte40(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte41(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte42(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte43(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte44(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte45(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte46(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte47(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte48(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte49(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte4F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte50(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte51(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte52(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte53(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte54(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte55(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte56(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte57(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte58(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte59(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte5F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte60(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte61(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte62(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte63(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte64(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte65(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte66(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte67(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte68(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte69(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte6F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte70(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte71(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte72(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte73(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte74(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte75(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte76(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte77(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte78(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte79(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte7F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte80(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte81(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte82(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte83(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte84(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte85(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte86(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte87(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte88(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte89(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte8F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte90(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte91(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte92(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte93(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte94(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte95(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte96(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte97(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte98(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte99(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByte9F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteA9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAD(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteAF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteB9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteBF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC0(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC1(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC2(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC3(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC4(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC5(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC6(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC7(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC8(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteC9(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCA(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCB(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCC(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCD(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCE(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteCF(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD0(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD1(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD2(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD3(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD4(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD5(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD6(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD7(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD8(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteD9(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDA(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDB(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDC(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDD(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDE(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteDF(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteE9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteEA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteEB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteEC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteED(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteEE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteEF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteF9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod16GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpByteFF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModB16;
              
            • x86modb32.js
              /**
               * @fileoverview Implements PCjs 80386 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2015-Jan-20
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModB32 = {};
              
              X86ModB32.aOpModReg = [
                  /**
                   * opMod32RegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte00(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte01(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte02(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte03(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte04(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte05(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte06(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte07(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte08(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte09(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte0F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte10(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte11(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte12(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte13(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte14(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte15(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte16(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte17(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte18(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte19(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte1F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte20(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte21(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte22(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte23(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte24(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte25(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte26(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte27(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte28(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte29(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2A(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2B(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2C(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2D(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2E(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte2F(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte30(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte31(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte32(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte33(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte34(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte35(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte36(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte37(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte38(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte39(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3A(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3B(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3C(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3D(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3E(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte3F(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte40(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte41(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte42(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte43(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte44(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte45(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte46(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte47(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte48(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte49(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte4F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte50(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte51(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte52(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte53(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte54(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte55(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte56(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte57(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte58(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte59(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte5F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte60(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte61(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte62(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte63(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte64(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte65(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte66(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte67(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte68(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte69(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6A(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6B(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6C(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6D(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6E(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte6F(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte70(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte71(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte72(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte73(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte74(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte75(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte76(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte77(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte78(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte79(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7A(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7B(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7C(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7D(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7E(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte7F(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte80(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte81(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte82(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte83(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte84(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte85(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte86(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte87(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte88(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte89(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8A(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8B(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8C(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8D(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8E(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte8F(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte90(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte91(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte92(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte93(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte94(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte95(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte96(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte97(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte98(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte99(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9A(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9B(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9C(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9D(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9E(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByte9F(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA0(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA1(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA2(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA3(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA4(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA5(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA6(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA7(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA8(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteA9(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAA(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAB(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAC(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAD(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAE(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteAF(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB0(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB1(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB2(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB3(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB4(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB5(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB6(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB7(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB8(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteB9(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBA(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBB(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBC(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBD(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBE(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteBF(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC0(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                  },
                  /**
                   * opMod32RegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC1(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC2(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC3(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC4(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC5(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC6(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC7(fn) {
                      var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC8(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteC9(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                  },
                  /**
                   * opMod32RegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCA(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCB(fn) {
                      var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCC(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCD(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCE(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteCF(fn) {
                      var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD0(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD1(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD2(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                  },
                  /**
                   * opMod32RegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD3(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD4(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD5(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD6(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD7(fn) {
                      var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD8(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteD9(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDA(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDB(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                  },
                  /**
                   * opMod32RegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDC(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDD(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDE(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteDF(fn) {
                      var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE0(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE1(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE2(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE3(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE4(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod32RegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE5(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE6(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE7(fn) {
                      var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE8(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteE9(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteEA(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteEB(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteEC(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteED(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod32RegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteEE(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteEF(fn) {
                      var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF0(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF1(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF2(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF3(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF4(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF5(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF6(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                  },
                  /**
                   * opMod32RegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF7(fn) {
                      var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                  },
                  /**
                   * opMod32RegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF8(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                  },
                  /**
                   * opMod32RegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteF9(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                  },
                  /**
                   * opMod32RegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFA(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                  },
                  /**
                   * opMod32RegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFB(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                  },
                  /**
                   * opMod32RegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFC(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                  },
                  /**
                   * opMod32RegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFD(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                  },
                  /**
                   * opMod32RegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFE(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                  },
                  /**
                   * opMod32RegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegByteFF(fn) {
                      var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                  }
              ];
              
              X86ModB32.aOpModMem = [
                  /**
                   * opMod32MemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte00(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte01(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte02(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte03(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte04(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte05(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte06(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte07(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte08(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte09(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte0F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte10(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte11(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte12(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte13(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte14(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte15(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte16(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte17(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte18(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte19(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte1F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte20(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte21(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte22(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte23(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte24(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte25(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte26(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte27(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte28(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte29(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte2F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte30(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte31(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte32(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte33(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte34(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte35(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte36(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte37(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte38(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte39(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3D(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte3F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte40(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte41(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte42(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte43(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte44(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte45(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte46(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte47(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte48(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte49(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte4F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte50(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte51(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte52(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte53(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte54(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte55(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte56(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte57(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte58(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte59(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte5F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte60(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte61(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte62(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte63(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte64(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte65(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte66(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte67(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte68(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte69(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte6F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte70(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte71(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte72(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte73(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte74(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte75(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte76(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte77(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte78(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte79(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte7F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte80(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte81(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte82(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte83(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte84(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte85(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte86(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte87(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte88(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte89(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte8F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte90(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte91(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte92(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte93(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte94(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte95(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte96(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte97(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte98(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte99(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9A(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9B(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9C(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9D(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9E(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByte9F(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA2(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA3(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA5(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA6(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteA9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAA(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAB(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAD(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAE(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteAF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB0(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB1(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB2(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB3(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB4(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB5(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB6(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB7(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB8(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteB9(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBA(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBB(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBC(fn) {
                      var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBD(fn) {
                      var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBE(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemByteBF(fn) {
                      var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                      if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModB32.aOpModReg[0xC0],    X86ModB32.aOpModReg[0xC8],    X86ModB32.aOpModReg[0xD0],    X86ModB32.aOpModReg[0xD8],
                  X86ModB32.aOpModReg[0xE0],    X86ModB32.aOpModReg[0xE8],    X86ModB32.aOpModReg[0xF0],    X86ModB32.aOpModReg[0xF8],
                  X86ModB32.aOpModReg[0xC1],    X86ModB32.aOpModReg[0xC9],    X86ModB32.aOpModReg[0xD1],    X86ModB32.aOpModReg[0xD9],
                  X86ModB32.aOpModReg[0xE1],    X86ModB32.aOpModReg[0xE9],    X86ModB32.aOpModReg[0xF1],    X86ModB32.aOpModReg[0xF9],
                  X86ModB32.aOpModReg[0xC2],    X86ModB32.aOpModReg[0xCA],    X86ModB32.aOpModReg[0xD2],    X86ModB32.aOpModReg[0xDA],
                  X86ModB32.aOpModReg[0xE2],    X86ModB32.aOpModReg[0xEA],    X86ModB32.aOpModReg[0xF2],    X86ModB32.aOpModReg[0xFA],
                  X86ModB32.aOpModReg[0xC3],    X86ModB32.aOpModReg[0xCB],    X86ModB32.aOpModReg[0xD3],    X86ModB32.aOpModReg[0xDB],
                  X86ModB32.aOpModReg[0xE3],    X86ModB32.aOpModReg[0xEB],    X86ModB32.aOpModReg[0xF3],    X86ModB32.aOpModReg[0xFB],
                  X86ModB32.aOpModReg[0xC4],    X86ModB32.aOpModReg[0xCC],    X86ModB32.aOpModReg[0xD4],    X86ModB32.aOpModReg[0xDC],
                  X86ModB32.aOpModReg[0xE4],    X86ModB32.aOpModReg[0xEC],    X86ModB32.aOpModReg[0xF4],    X86ModB32.aOpModReg[0xFC],
                  X86ModB32.aOpModReg[0xC5],    X86ModB32.aOpModReg[0xCD],    X86ModB32.aOpModReg[0xD5],    X86ModB32.aOpModReg[0xDD],
                  X86ModB32.aOpModReg[0xE5],    X86ModB32.aOpModReg[0xED],    X86ModB32.aOpModReg[0xF5],    X86ModB32.aOpModReg[0xFD],
                  X86ModB32.aOpModReg[0xC6],    X86ModB32.aOpModReg[0xCE],    X86ModB32.aOpModReg[0xD6],    X86ModB32.aOpModReg[0xDE],
                  X86ModB32.aOpModReg[0xE6],    X86ModB32.aOpModReg[0xEE],    X86ModB32.aOpModReg[0xF6],    X86ModB32.aOpModReg[0xFE],
                  X86ModB32.aOpModReg[0xC7],    X86ModB32.aOpModReg[0xCF],    X86ModB32.aOpModReg[0xD7],    X86ModB32.aOpModReg[0xDF],
                  X86ModB32.aOpModReg[0xE7],    X86ModB32.aOpModReg[0xEF],    X86ModB32.aOpModReg[0xF7],    X86ModB32.aOpModReg[0xFF]
              ];
              
              X86ModB32.aOpModGrp = [
                  /**
                   * opMod32GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte00(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte01(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte02(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte03(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte04(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte05(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte06(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte07(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte08(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte09(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte0F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte10(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte11(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte12(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte13(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte14(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte15(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte16(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte17(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte18(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte19(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte1F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte20(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte21(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte22(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte23(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte24(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte25(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte26(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte27(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte28(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte29(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte2F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte30(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte31(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte32(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte33(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte34(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte35(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte36(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte37(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte38(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte39(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte3F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte40(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte41(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte42(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte43(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte44(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte45(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte46(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte47(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte48(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte49(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte4F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte50(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte51(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte52(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte53(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte54(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte55(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte56(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte57(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte58(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte59(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte5F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte60(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte61(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte62(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte63(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte64(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte65(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte66(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte67(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte68(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte69(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6A(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6B(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6C(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6D(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6E(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte6F(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte70(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte71(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte72(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte73(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte74(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte75(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte76(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte77(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte78(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte79(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7A(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7B(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7C(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7D(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7E(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte7F(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte80(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte81(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte82(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte83(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte84(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte85(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte86(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte87(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte88(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte89(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8A(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8B(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8C(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8D(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8E(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte8F(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte90(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte91(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte92(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte93(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte94(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte95(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte96(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte97(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte98(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte99(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9A(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9B(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9C(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9D(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9E(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByte9F(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteA9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAD(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteAF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteB9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteBF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAByte(b);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC0(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC1(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC2(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC3(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC4(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC5(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC6(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC7(afnGrp, fnSrc) {
                      var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC8(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteC9(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCA(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCB(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCC(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCD(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCE(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteCF(afnGrp, fnSrc) {
                      var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD0(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD1(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD2(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD3(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD4(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD5(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD6(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD7(afnGrp, fnSrc) {
                      var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD8(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteD9(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDA(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDB(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDC(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDD(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDE(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteDF(afnGrp, fnSrc) {
                      var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE0(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE1(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE2(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE3(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE4(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE5(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE6(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE7(afnGrp, fnSrc) {
                      var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE8(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteE9(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteEA(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteEB(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteEC(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteED(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteEE(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteEF(afnGrp, fnSrc) {
                      var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF0(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF1(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF2(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF3(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF4(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF5(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF6(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF7(afnGrp, fnSrc) {
                      var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF8(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteF9(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFA(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFB(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff) | b;
                      if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFC(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFD(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                      this.regECX = (this.regECX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFE(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                  },
                  /**
                   * opMod32GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpByteFF(afnGrp, fnSrc) {
                      var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                      if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModB32;
              
            • x86modsib.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2015-Jan-20
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModSIB = {};
              
              /*
               * TODO: Factor out the SIB (scale=1) decoders that are functionally equivalent to one another,
               * just as I've already done for all the ModRM (register-to-register) decoders.  For example:
               *
               *      opModSIB01():   this.regECX + this.regEAX
               *
               * is functionally equivalent to:
               *
               *      opModSIB08():   this.regEAX + this.regECX
               *
               * This isn't super critical, since the SIB decoders are much smaller/simpler than the ModRM decoders,
               * but still, it's wasteful.
               */
              
              X86ModSIB.aOpModSIB = [
                  /**
                   * opModSIB00(): scale=00 (1)  index=000 (EAX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB00(mod) {
                      return this.regEAX + this.regEAX;
                  },
                  /**
                   * opModSIB01(): scale=00 (1)  index=000 (EAX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB01(mod) {
                      return this.regECX + this.regEAX;
                  },
                  /**
                   * opModSIB02(): scale=00 (1)  index=000 (EAX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB02(mod) {
                      return this.regEDX + this.regEAX;
                  },
                  /**
                   * opModSIB03(): scale=00 (1)  index=000 (EAX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB03(mod) {
                      return this.regEBX + this.regEAX;
                  },
                  /**
                   * opModSIB04(): scale=00 (1)  index=000 (EAX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB04(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regEAX;
                  },
                  /**
                   * opModSIB05(): scale=00 (1)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB05(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEAX;
                  },
                  /**
                   * opModSIB06(): scale=00 (1)  index=000 (EAX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB06(mod) {
                      return this.regESI + this.regEAX;
                  },
                  /**
                   * opModSIB07(): scale=00 (1)  index=000 (EAX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB07(mod) {
                      return this.regEDI + this.regEAX;
                  },
                  /**
                   * opModSIB08(): scale=00 (1)  index=001 (ECX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB08(mod) {
                      return this.regEAX + this.regECX;
                  },
                  /**
                   * opModSIB09(): scale=00 (1)  index=001 (ECX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB09(mod) {
                      return this.regECX + this.regECX;
                  },
                  /**
                   * opModSIB0A(): scale=00 (1)  index=001 (ECX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0A(mod) {
                      return this.regEDX + this.regECX;
                  },
                  /**
                   * opModSIB0B(): scale=00 (1)  index=001 (ECX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0B(mod) {
                      return this.regEBX + this.regECX;
                  },
                  /**
                   * opModSIB0C(): scale=00 (1)  index=001 (ECX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regECX;
                  },
                  /**
                   * opModSIB0D(): scale=00 (1)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regECX;
                  },
                  /**
                   * opModSIB0E(): scale=00 (1)  index=001 (ECX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0E(mod) {
                      return this.regESI + this.regECX;
                  },
                  /**
                   * opModSIB0F(): scale=00 (1)  index=001 (ECX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB0F(mod) {
                      return this.regEDI + this.regECX;
                  },
                  /**
                   * opModSIB10(): scale=00 (1)  index=010 (EDX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB10(mod) {
                      return this.regEAX + this.regEDX;
                  },
                  /**
                   * opModSIB11(): scale=00 (1)  index=010 (EDX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB11(mod) {
                      return this.regECX + this.regEDX;
                  },
                  /**
                   * opModSIB12(): scale=00 (1)  index=010 (EDX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB12(mod) {
                      return this.regEDX + this.regEDX;
                  },
                  /**
                   * opModSIB13(): scale=00 (1)  index=010 (EDX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB13(mod) {
                      return this.regEBX + this.regEDX;
                  },
                  /**
                   * opModSIB14(): scale=00 (1)  index=010 (EDX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB14(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regEDX;
                  },
                  /**
                   * opModSIB15(): scale=00 (1)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB15(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDX;
                  },
                  /**
                   * opModSIB16(): scale=00 (1)  index=010 (EDX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB16(mod) {
                      return this.regESI + this.regEDX;
                  },
                  /**
                   * opModSIB17(): scale=00 (1)  index=010 (EDX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB17(mod) {
                      return this.regEDI + this.regEDX;
                  },
                  /**
                   * opModSIB18(): scale=00 (1)  index=011 (EBX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB18(mod) {
                      return this.regEAX + this.regEBX;
                  },
                  /**
                   * opModSIB19(): scale=00 (1)  index=011 (EBX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB19(mod) {
                      return this.regECX + this.regEBX;
                  },
                  /**
                   * opModSIB1A(): scale=00 (1)  index=011 (EBX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1A(mod) {
                      return this.regEDX + this.regEBX;
                  },
                  /**
                   * opModSIB1B(): scale=00 (1)  index=011 (EBX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1B(mod) {
                      return this.regEBX + this.regEBX;
                  },
                  /**
                   * opModSIB1C(): scale=00 (1)  index=011 (EBX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regEBX;
                  },
                  /**
                   * opModSIB1D(): scale=00 (1)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBX;
                  },
                  /**
                   * opModSIB1E(): scale=00 (1)  index=011 (EBX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1E(mod) {
                      return this.regESI + this.regEBX;
                  },
                  /**
                   * opModSIB1F(): scale=00 (1)  index=011 (EBX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB1F(mod) {
                      return this.regEDI + this.regEBX;
                  },
                  /**
                   * opModSIB20(): scale=00 (1)  index=100 (none)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB20(mod) {
                      return this.regEAX;
                  },
                  /**
                   * opModSIB21(): scale=00 (1)  index=100 (none)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB21(mod) {
                      return this.regECX;
                  },
                  /**
                   * opModSIB22(): scale=00 (1)  index=100 (none)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB22(mod) {
                      return this.regEDX;
                  },
                  /**
                   * opModSIB23(): scale=00 (1)  index=100 (none)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB23(mod) {
                      return this.regEBX;
                  },
                  /**
                   * opModSIB24(): scale=00 (1)  index=100 (none)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB24(mod) {
                      this.segData = this.segStack;
                      return this.getSP();
                  },
                  /**
                   * opModSIB25(): scale=00 (1)  index=100 (none)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB25(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                  },
                  /**
                   * opModSIB26(): scale=00 (1)  index=100 (none)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB26(mod) {
                      return this.regESI;
                  },
                  /**
                   * opModSIB27(): scale=00 (1)  index=100 (none)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB27(mod) {
                      return this.regEDI;
                  },
                  /**
                   * opModSIB28(): scale=00 (1)  index=101 (EBP)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB28(mod) {
                      return this.regEAX + this.regEBP;
                  },
                  /**
                   * opModSIB29(): scale=00 (1)  index=101 (EBP)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB29(mod) {
                      return this.regECX + this.regEBP;
                  },
                  /**
                   * opModSIB2A(): scale=00 (1)  index=101 (EBP)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2A(mod) {
                      return this.regEDX + this.regEBP;
                  },
                  /**
                   * opModSIB2B(): scale=00 (1)  index=101 (EBP)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2B(mod) {
                      return this.regEBX + this.regEBP;
                  },
                  /**
                   * opModSIB2C(): scale=00 (1)  index=101 (EBP)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regEBP;
                  },
                  /**
                   * opModSIB2D(): scale=00 (1)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBP;
                  },
                  /**
                   * opModSIB2E(): scale=00 (1)  index=101 (EBP)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2E(mod) {
                      return this.regESI + this.regEBP;
                  },
                  /**
                   * opModSIB2F(): scale=00 (1)  index=101 (EBP)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB2F(mod) {
                      return this.regEDI + this.regEBP;
                  },
                  /**
                   * opModSIB30(): scale=00 (1)  index=110 (ESI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB30(mod) {
                      return this.regEAX + this.regESI;
                  },
                  /**
                   * opModSIB31(): scale=00 (1)  index=110 (ESI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB31(mod) {
                      return this.regECX + this.regESI;
                  },
                  /**
                   * opModSIB32(): scale=00 (1)  index=110 (ESI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB32(mod) {
                      return this.regEDX + this.regESI;
                  },
                  /**
                   * opModSIB33(): scale=00 (1)  index=110 (ESI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB33(mod) {
                      return this.regEBX + this.regESI;
                  },
                  /**
                   * opModSIB34(): scale=00 (1)  index=110 (ESI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB34(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regESI;
                  },
                  /**
                   * opModSIB35(): scale=00 (1)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB35(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regESI;
                  },
                  /**
                   * opModSIB36(): scale=00 (1)  index=110 (ESI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB36(mod) {
                      return this.regESI + this.regESI;
                  },
                  /**
                   * opModSIB37(): scale=00 (1)  index=110 (ESI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB37(mod) {
                      return this.regEDI + this.regESI;
                  },
                  /**
                   * opModSIB38(): scale=00 (1)  index=111 (EDI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB38(mod) {
                      return this.regEAX + this.regEDI;
                  },
                  /**
                   * opModSIB39(): scale=00 (1)  index=111 (EDI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB39(mod) {
                      return this.regECX + this.regEDI;
                  },
                  /**
                   * opModSIB3A(): scale=00 (1)  index=111 (EDI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3A(mod) {
                      return this.regEDX + this.regEDI;
                  },
                  /**
                   * opModSIB3B(): scale=00 (1)  index=111 (EDI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3B(mod) {
                      return this.regEBX + this.regEDI;
                  },
                  /**
                   * opModSIB3C(): scale=00 (1)  index=111 (EDI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + this.regEDI;
                  },
                  /**
                   * opModSIB3D(): scale=00 (1)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDI;
                  },
                  /**
                   * opModSIB3E(): scale=00 (1)  index=111 (EDI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3E(mod) {
                      return this.regESI + this.regEDI;
                  },
                  /**
                   * opModSIB3F(): scale=00 (1)  index=111 (EDI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB3F(mod) {
                      return this.regEDI + this.regEDI;
                  },
                  /**
                   * opModSIB40(): scale=01 (2)  index=000 (EAX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB40(mod) {
                      return this.regEAX + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB41(): scale=01 (2)  index=000 (EAX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB41(mod) {
                      return this.regECX + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB42(): scale=01 (2)  index=000 (EAX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB42(mod) {
                      return this.regEDX + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB43(): scale=01 (2)  index=000 (EAX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB43(mod) {
                      return this.regEBX + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB44(): scale=01 (2)  index=000 (EAX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB44(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB45(): scale=01 (2)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB45(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB46(): scale=01 (2)  index=000 (EAX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB46(mod) {
                      return this.regESI + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB47(): scale=01 (2)  index=000 (EAX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB47(mod) {
                      return this.regEDI + (this.regEAX << 1);
                  },
                  /**
                   * opModSIB48(): scale=01 (2)  index=001 (ECX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB48(mod) {
                      return this.regEAX + (this.regECX << 1);
                  },
                  /**
                   * opModSIB49(): scale=01 (2)  index=001 (ECX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB49(mod) {
                      return this.regECX + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4A(): scale=01 (2)  index=001 (ECX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4A(mod) {
                      return this.regEDX + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4B(): scale=01 (2)  index=001 (ECX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4B(mod) {
                      return this.regEBX + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4C(): scale=01 (2)  index=001 (ECX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4D(): scale=01 (2)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4E(): scale=01 (2)  index=001 (ECX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4E(mod) {
                      return this.regESI + (this.regECX << 1);
                  },
                  /**
                   * opModSIB4F(): scale=01 (2)  index=001 (ECX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB4F(mod) {
                      return this.regEDI + (this.regECX << 1);
                  },
                  /**
                   * opModSIB50(): scale=01 (2)  index=010 (EDX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB50(mod) {
                      return this.regEAX + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB51(): scale=01 (2)  index=010 (EDX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB51(mod) {
                      return this.regECX + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB52(): scale=01 (2)  index=010 (EDX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB52(mod) {
                      return this.regEDX + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB53(): scale=01 (2)  index=010 (EDX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB53(mod) {
                      return this.regEBX + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB54(): scale=01 (2)  index=010 (EDX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB54(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB55(): scale=01 (2)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB55(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB56(): scale=01 (2)  index=010 (EDX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB56(mod) {
                      return this.regESI + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB57(): scale=01 (2)  index=010 (EDX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB57(mod) {
                      return this.regEDI + (this.regEDX << 1);
                  },
                  /**
                   * opModSIB58(): scale=01 (2)  index=011 (EBX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB58(mod) {
                      return this.regEAX + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB59(): scale=01 (2)  index=011 (EBX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB59(mod) {
                      return this.regECX + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5A(): scale=01 (2)  index=011 (EBX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5A(mod) {
                      return this.regEDX + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5B(): scale=01 (2)  index=011 (EBX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5B(mod) {
                      return this.regEBX + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5C(): scale=01 (2)  index=011 (EBX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5D(): scale=01 (2)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5E(): scale=01 (2)  index=011 (EBX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5E(mod) {
                      return this.regESI + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB5F(): scale=01 (2)  index=011 (EBX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB5F(mod) {
                      return this.regEDI + (this.regEBX << 1);
                  },
                  /**
                   * opModSIB60(): scale=01 (2)  index=100 (none)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB60(mod) {
                      return this.regEAX;
                  },
                  /**
                   * opModSIB61(): scale=01 (2)  index=100 (none)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB61(mod) {
                      return this.regECX;
                  },
                  /**
                   * opModSIB62(): scale=01 (2)  index=100 (none)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB62(mod) {
                      return this.regEDX;
                  },
                  /**
                   * opModSIB63(): scale=01 (2)  index=100 (none)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB63(mod) {
                      return this.regEBX;
                  },
                  /**
                   * opModSIB64(): scale=01 (2)  index=100 (none)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB64(mod) {
                      this.segData = this.segStack;
                      return this.getSP();
                  },
                  /**
                   * opModSIB65(): scale=01 (2)  index=100 (none)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB65(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                  },
                  /**
                   * opModSIB66(): scale=01 (2)  index=100 (none)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB66(mod) {
                      return this.regESI;
                  },
                  /**
                   * opModSIB67(): scale=01 (2)  index=100 (none)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB67(mod) {
                      return this.regEDI;
                  },
                  /**
                   * opModSIB68(): scale=01 (2)  index=101 (EBP)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB68(mod) {
                      return this.regEAX + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB69(): scale=01 (2)  index=101 (EBP)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB69(mod) {
                      return this.regECX + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6A(): scale=01 (2)  index=101 (EBP)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6A(mod) {
                      return this.regEDX + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6B(): scale=01 (2)  index=101 (EBP)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6B(mod) {
                      return this.regEBX + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6C(): scale=01 (2)  index=101 (EBP)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6D(): scale=01 (2)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6E(): scale=01 (2)  index=101 (EBP)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6E(mod) {
                      return this.regESI + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB6F(): scale=01 (2)  index=101 (EBP)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB6F(mod) {
                      return this.regEDI + (this.regEBP << 1);
                  },
                  /**
                   * opModSIB70(): scale=01 (2)  index=110 (ESI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB70(mod) {
                      return this.regEAX + (this.regESI << 1);
                  },
                  /**
                   * opModSIB71(): scale=01 (2)  index=110 (ESI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB71(mod) {
                      return this.regECX + (this.regESI << 1);
                  },
                  /**
                   * opModSIB72(): scale=01 (2)  index=110 (ESI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB72(mod) {
                      return this.regEDX + (this.regESI << 1);
                  },
                  /**
                   * opModSIB73(): scale=01 (2)  index=110 (ESI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB73(mod) {
                      return this.regEBX + (this.regESI << 1);
                  },
                  /**
                   * opModSIB74(): scale=01 (2)  index=110 (ESI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB74(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regESI << 1);
                  },
                  /**
                   * opModSIB75(): scale=01 (2)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB75(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 1);
                  },
                  /**
                   * opModSIB76(): scale=01 (2)  index=110 (ESI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB76(mod) {
                      return this.regESI + (this.regESI << 1);
                  },
                  /**
                   * opModSIB77(): scale=01 (2)  index=110 (ESI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB77(mod) {
                      return this.regEDI + (this.regESI << 1);
                  },
                  /**
                   * opModSIB78(): scale=01 (2)  index=111 (EDI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB78(mod) {
                      return this.regEAX + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB79(): scale=01 (2)  index=111 (EDI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB79(mod) {
                      return this.regECX + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7A(): scale=01 (2)  index=111 (EDI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7A(mod) {
                      return this.regEDX + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7B(): scale=01 (2)  index=111 (EDI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7B(mod) {
                      return this.regEBX + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7C(): scale=01 (2)  index=111 (EDI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7D(): scale=01 (2)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7E(): scale=01 (2)  index=111 (EDI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7E(mod) {
                      return this.regESI + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB7F(): scale=01 (2)  index=111 (EDI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB7F(mod) {
                      return this.regEDI + (this.regEDI << 1);
                  },
                  /**
                   * opModSIB80(): scale=10 (4)  index=000 (EAX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB80(mod) {
                      return this.regEAX + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB81(): scale=10 (4)  index=000 (EAX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB81(mod) {
                      return this.regECX + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB82(): scale=10 (4)  index=000 (EAX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB82(mod) {
                      return this.regEDX + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB83(): scale=10 (4)  index=000 (EAX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB83(mod) {
                      return this.regEBX + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB84(): scale=10 (4)  index=000 (EAX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB84(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB85(): scale=10 (4)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB85(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB86(): scale=10 (4)  index=000 (EAX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB86(mod) {
                      return this.regESI + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB87(): scale=10 (4)  index=000 (EAX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB87(mod) {
                      return this.regEDI + (this.regEAX << 2);
                  },
                  /**
                   * opModSIB88(): scale=10 (4)  index=001 (ECX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB88(mod) {
                      return this.regEAX + (this.regECX << 2);
                  },
                  /**
                   * opModSIB89(): scale=10 (4)  index=001 (ECX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB89(mod) {
                      return this.regECX + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8A(): scale=10 (4)  index=001 (ECX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8A(mod) {
                      return this.regEDX + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8B(): scale=10 (4)  index=001 (ECX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8B(mod) {
                      return this.regEBX + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8C(): scale=10 (4)  index=001 (ECX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8D(): scale=10 (4)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8E(): scale=10 (4)  index=001 (ECX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8E(mod) {
                      return this.regESI + (this.regECX << 2);
                  },
                  /**
                   * opModSIB8F(): scale=10 (4)  index=001 (ECX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB8F(mod) {
                      return this.regEDI + (this.regECX << 2);
                  },
                  /**
                   * opModSIB90(): scale=10 (4)  index=010 (EDX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB90(mod) {
                      return this.regEAX + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB91(): scale=10 (4)  index=010 (EDX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB91(mod) {
                      return this.regECX + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB92(): scale=10 (4)  index=010 (EDX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB92(mod) {
                      return this.regEDX + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB93(): scale=10 (4)  index=010 (EDX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB93(mod) {
                      return this.regEBX + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB94(): scale=10 (4)  index=010 (EDX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB94(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB95(): scale=10 (4)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB95(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB96(): scale=10 (4)  index=010 (EDX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB96(mod) {
                      return this.regESI + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB97(): scale=10 (4)  index=010 (EDX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB97(mod) {
                      return this.regEDI + (this.regEDX << 2);
                  },
                  /**
                   * opModSIB98(): scale=10 (4)  index=011 (EBX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB98(mod) {
                      return this.regEAX + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB99(): scale=10 (4)  index=011 (EBX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB99(mod) {
                      return this.regECX + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9A(): scale=10 (4)  index=011 (EBX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9A(mod) {
                      return this.regEDX + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9B(): scale=10 (4)  index=011 (EBX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9B(mod) {
                      return this.regEBX + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9C(): scale=10 (4)  index=011 (EBX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9C(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9D(): scale=10 (4)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9D(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9E(): scale=10 (4)  index=011 (EBX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9E(mod) {
                      return this.regESI + (this.regEBX << 2);
                  },
                  /**
                   * opModSIB9F(): scale=10 (4)  index=011 (EBX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIB9F(mod) {
                      return this.regEDI + (this.regEBX << 2);
                  },
                  /**
                   * opModSIBA0(): scale=10 (4)  index=100 (none)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA0(mod) {
                      return this.regEAX;
                  },
                  /**
                   * opModSIBA1(): scale=10 (4)  index=100 (none)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA1(mod) {
                      return this.regECX;
                  },
                  /**
                   * opModSIBA2(): scale=10 (4)  index=100 (none)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA2(mod) {
                      return this.regEDX;
                  },
                  /**
                   * opModSIBA3(): scale=10 (4)  index=100 (none)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA3(mod) {
                      return this.regEBX;
                  },
                  /**
                   * opModSIBA4(): scale=10 (4)  index=100 (none)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA4(mod) {
                      this.segData = this.segStack;
                      return this.getSP();
                  },
                  /**
                   * opModSIBA5(): scale=10 (4)  index=100 (none)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                  },
                  /**
                   * opModSIBA6(): scale=10 (4)  index=100 (none)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA6(mod) {
                      return this.regESI;
                  },
                  /**
                   * opModSIBA7(): scale=10 (4)  index=100 (none)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA7(mod) {
                      return this.regEDI;
                  },
                  /**
                   * opModSIBA8(): scale=10 (4)  index=101 (EBP)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA8(mod) {
                      return this.regEAX + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBA9(): scale=10 (4)  index=101 (EBP)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBA9(mod) {
                      return this.regECX + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAA(): scale=10 (4)  index=101 (EBP)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAA(mod) {
                      return this.regEDX + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAB(): scale=10 (4)  index=101 (EBP)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAB(mod) {
                      return this.regEBX + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAC(): scale=10 (4)  index=101 (EBP)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAD(): scale=10 (4)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAD(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAE(): scale=10 (4)  index=101 (EBP)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAE(mod) {
                      return this.regESI + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBAF(): scale=10 (4)  index=101 (EBP)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBAF(mod) {
                      return this.regEDI + (this.regEBP << 2);
                  },
                  /**
                   * opModSIBB0(): scale=10 (4)  index=110 (ESI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB0(mod) {
                      return this.regEAX + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB1(): scale=10 (4)  index=110 (ESI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB1(mod) {
                      return this.regECX + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB2(): scale=10 (4)  index=110 (ESI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB2(mod) {
                      return this.regEDX + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB3(): scale=10 (4)  index=110 (ESI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB3(mod) {
                      return this.regEBX + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB4(): scale=10 (4)  index=110 (ESI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB4(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB5(): scale=10 (4)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB6(): scale=10 (4)  index=110 (ESI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB6(mod) {
                      return this.regESI + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB7(): scale=10 (4)  index=110 (ESI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB7(mod) {
                      return this.regEDI + (this.regESI << 2);
                  },
                  /**
                   * opModSIBB8(): scale=10 (4)  index=111 (EDI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB8(mod) {
                      return this.regEAX + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBB9(): scale=10 (4)  index=111 (EDI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBB9(mod) {
                      return this.regECX + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBA(): scale=10 (4)  index=111 (EDI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBA(mod) {
                      return this.regEDX + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBB(): scale=10 (4)  index=111 (EDI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBB(mod) {
                      return this.regEBX + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBC(): scale=10 (4)  index=111 (EDI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBD(): scale=10 (4)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBD(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBE(): scale=10 (4)  index=111 (EDI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBE(mod) {
                      return this.regESI + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBBF(): scale=10 (4)  index=111 (EDI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBBF(mod) {
                      return this.regEDI + (this.regEDI << 2);
                  },
                  /**
                   * opModSIBC0(): scale=11 (8)  index=000 (EAX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC0(mod) {
                      return this.regEAX + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC1(): scale=11 (8)  index=000 (EAX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC1(mod) {
                      return this.regECX + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC2(): scale=11 (8)  index=000 (EAX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC2(mod) {
                      return this.regEDX + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC3(): scale=11 (8)  index=000 (EAX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC3(mod) {
                      return this.regEBX + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC4(): scale=11 (8)  index=000 (EAX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC4(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC5(): scale=11 (8)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC6(): scale=11 (8)  index=000 (EAX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC6(mod) {
                      return this.regESI + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC7(): scale=11 (8)  index=000 (EAX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC7(mod) {
                      return this.regEDI + (this.regEAX << 3);
                  },
                  /**
                   * opModSIBC8(): scale=11 (8)  index=001 (ECX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC8(mod) {
                      return this.regEAX + (this.regECX << 3);
                  },
                  /**
                   * opModSIBC9(): scale=11 (8)  index=001 (ECX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBC9(mod) {
                      return this.regECX + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCA(): scale=11 (8)  index=001 (ECX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCA(mod) {
                      return this.regEDX + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCB(): scale=11 (8)  index=001 (ECX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCB(mod) {
                      return this.regEBX + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCC(): scale=11 (8)  index=001 (ECX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCD(): scale=11 (8)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCD(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCE(): scale=11 (8)  index=001 (ECX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCE(mod) {
                      return this.regESI + (this.regECX << 3);
                  },
                  /**
                   * opModSIBCF(): scale=11 (8)  index=001 (ECX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBCF(mod) {
                      return this.regEDI + (this.regECX << 3);
                  },
                  /**
                   * opModSIBD0(): scale=11 (8)  index=010 (EDX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD0(mod) {
                      return this.regEAX + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD1(): scale=11 (8)  index=010 (EDX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD1(mod) {
                      return this.regECX + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD2(): scale=11 (8)  index=010 (EDX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD2(mod) {
                      return this.regEDX + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD3(): scale=11 (8)  index=010 (EDX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD3(mod) {
                      return this.regEBX + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD4(): scale=11 (8)  index=010 (EDX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD4(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD5(): scale=11 (8)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD6(): scale=11 (8)  index=010 (EDX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD6(mod) {
                      return this.regESI + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD7(): scale=11 (8)  index=010 (EDX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD7(mod) {
                      return this.regEDI + (this.regEDX << 3);
                  },
                  /**
                   * opModSIBD8(): scale=11 (8)  index=011 (EBX)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD8(mod) {
                      return this.regEAX + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBD9(): scale=11 (8)  index=011 (EBX)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBD9(mod) {
                      return this.regECX + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDA(): scale=11 (8)  index=011 (EBX)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDA(mod) {
                      return this.regEDX + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDB(): scale=11 (8)  index=011 (EBX)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDB(mod) {
                      return this.regEBX + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDC(): scale=11 (8)  index=011 (EBX)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDD(): scale=11 (8)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDD(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDE(): scale=11 (8)  index=011 (EBX)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDE(mod) {
                      return this.regESI + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBDF(): scale=11 (8)  index=011 (EBX)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBDF(mod) {
                      return this.regEDI + (this.regEBX << 3);
                  },
                  /**
                   * opModSIBE0(): scale=11 (8)  index=100 (none)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE0(mod) {
                      return this.regEAX;
                  },
                  /**
                   * opModSIBE1(): scale=11 (8)  index=100 (none)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE1(mod) {
                      return this.regECX;
                  },
                  /**
                   * opModSIBE2(): scale=11 (8)  index=100 (none)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE2(mod) {
                      return this.regEDX;
                  },
                  /**
                   * opModSIBE3(): scale=11 (8)  index=100 (none)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE3(mod) {
                      return this.regEBX;
                  },
                  /**
                   * opModSIBE4(): scale=11 (8)  index=100 (none)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE4(mod) {
                      this.segData = this.segStack;
                      return this.getSP();
                  },
                  /**
                   * opModSIBE5(): scale=11 (8)  index=100 (none)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                  },
                  /**
                   * opModSIBE6(): scale=11 (8)  index=100 (none)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE6(mod) {
                      return this.regESI;
                  },
                  /**
                   * opModSIBE7(): scale=11 (8)  index=100 (none)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE7(mod) {
                      return this.regEDI;
                  },
                  /**
                   * opModSIBE8(): scale=11 (8)  index=101 (EBP)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE8(mod) {
                      return this.regEAX + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBE9(): scale=11 (8)  index=101 (EBP)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBE9(mod) {
                      return this.regECX + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBEA(): scale=11 (8)  index=101 (EBP)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBEA(mod) {
                      return this.regEDX + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBEB(): scale=11 (8)  index=101 (EBP)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBEB(mod) {
                      return this.regEBX + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBEC(): scale=11 (8)  index=101 (EBP)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBEC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBED(): scale=11 (8)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBED(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBEE(): scale=11 (8)  index=101 (EBP)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBEE(mod) {
                      return this.regESI + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBEF(): scale=11 (8)  index=101 (EBP)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBEF(mod) {
                      return this.regEDI + (this.regEBP << 3);
                  },
                  /**
                   * opModSIBF0(): scale=11 (8)  index=110 (ESI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF0(mod) {
                      return this.regEAX + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF1(): scale=11 (8)  index=110 (ESI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF1(mod) {
                      return this.regECX + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF2(): scale=11 (8)  index=110 (ESI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF2(mod) {
                      return this.regEDX + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF3(): scale=11 (8)  index=110 (ESI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF3(mod) {
                      return this.regEBX + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF4(): scale=11 (8)  index=110 (ESI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF4(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF5(): scale=11 (8)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF5(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF6(): scale=11 (8)  index=110 (ESI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF6(mod) {
                      return this.regESI + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF7(): scale=11 (8)  index=110 (ESI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF7(mod) {
                      return this.regEDI + (this.regESI << 3);
                  },
                  /**
                   * opModSIBF8(): scale=11 (8)  index=111 (EDI)  base=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF8(mod) {
                      return this.regEAX + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBF9(): scale=11 (8)  index=111 (EDI)  base=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBF9(mod) {
                      return this.regECX + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFA(): scale=11 (8)  index=111 (EDI)  base=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFA(mod) {
                      return this.regEDX + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFB(): scale=11 (8)  index=111 (EDI)  base=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFB(mod) {
                      return this.regEBX + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFC(): scale=11 (8)  index=111 (EDI)  base=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFC(mod) {
                      this.segData = this.segStack;
                      return this.getSP() + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFD(): scale=11 (8)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFD(mod) {
                      return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFE(): scale=11 (8)  index=111 (EDI)  base=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFE(mod) {
                      return this.regESI + (this.regEDI << 3);
                  },
                  /**
                   * opModSIBFF(): scale=11 (8)  index=111 (EDI)  base=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {number} mod
                   */
                  function opModSIBFF(mod) {
                      return this.regEDI + (this.regEDI << 3);
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModSIB;
              
            • x86modw.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModW = {};
              
              X86ModW.aOpModReg = [
                  /**
                   * opModRegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord00(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord01(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord02(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord03(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord04(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord05(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord06(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord07(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord08(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord09(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0A(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0B(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0C(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0D(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0E(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord0F(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord10(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord11(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord12(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord13(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord14(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord15(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord16(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord17(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord18(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord19(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1A(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1B(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1C(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1D(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1E(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord1F(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord20(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord21(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord22(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord23(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord24(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord25(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord26(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord27(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX)));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord28(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord29(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2A(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2B(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2C(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2D(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2E(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord2F(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord30(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord31(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord32(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord33(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord34(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord35(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord36(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord37(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord38(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord39(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3A(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModRegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3B(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModRegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3C(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3D(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3E(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModRegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord3F(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModRegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord40(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord41(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord42(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord43(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord44(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord45(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord46(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord47(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord48(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord49(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4A(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4B(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4C(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4D(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4E(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord4F(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord50(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord51(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord52(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord53(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord54(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord55(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord56(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord57(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord58(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord59(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5A(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5B(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5C(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5D(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5E(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord5F(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord60(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord61(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord62(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord63(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord64(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord65(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord66(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord67(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPDisp())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord68(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord69(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6A(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6B(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6C(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6D(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6E(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord6F(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord70(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord71(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord72(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord73(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord74(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord75(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord76(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord77(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord78(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord79(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7A(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7B(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7C(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7D(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7E(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord7F(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord80(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord81(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord82(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord83(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord84(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord85(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord86(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord87(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord88(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord89(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8A(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8B(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8C(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8D(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8E(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord8F(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord90(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord91(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord92(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord93(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord94(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord95(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord96(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord97(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord98(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord99(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9A(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9B(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9C(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9D(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9E(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWord9F(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA0(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA1(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA2(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA3(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA4(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA5(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA6(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA7(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPAddr())));
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA8(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordA9(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAA(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAB(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAC(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAD(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAE(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordAF(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB0(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB1(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB2(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB3(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB4(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB5(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB6(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB7(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB8(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordB9(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBA(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModRegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBB(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModRegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBC(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBD(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBE(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordBF(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModRegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC0(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regEAX);
                  },
                  /**
                   * opModRegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC1(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC2(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC3(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC4(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC5(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC6(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC7(fn) {
                      this.regEAX = fn.call(this, this.regEAX, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC8(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordC9(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regECX);
                  },
                  /**
                   * opModRegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCA(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCB(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCC(fn) {
                      this.regECX = fn.call(this, this.regECX, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCD(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCE(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordCF(fn) {
                      this.regECX = fn.call(this, this.regECX, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD0(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD1(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD2(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regEDX);
                  },
                  /**
                   * opModRegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD3(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD4(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD5(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD6(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD7(fn) {
                      this.regEDX = fn.call(this, this.regEDX, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD8(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordD9(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDA(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDB(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regEBX);
                  },
                  /**
                   * opModRegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDC(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDD(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDE(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordDF(fn) {
                      this.regEBX = fn.call(this, this.regEBX, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE0(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regEAX));
                  },
                  /**
                   * opModRegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE1(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regECX));
                  },
                  /**
                   * opModRegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE2(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regEDX));
                  },
                  /**
                   * opModRegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE3(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regEBX));
                  },
                  /**
                   * opModRegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE4(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.getSP()));
                  },
                  /**
                   * opModRegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE5(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regEBP));
                  },
                  /**
                   * opModRegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE6(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regESI));
                  },
                  /**
                   * opModRegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE7(fn) {
                      this.setSP(fn.call(this, this.getSP(), this.regEDI));
                  },
                  /**
                   * opModRegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE8(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordE9(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordEA(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordEB(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordEC(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordED(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regEBP);
                  },
                  /**
                   * opModRegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordEE(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordEF(fn) {
                      this.regEBP = fn.call(this, this.regEBP, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF0(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF1(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF2(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF3(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF4(fn) {
                      this.regESI = fn.call(this, this.regESI, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF5(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF6(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regESI);
                  },
                  /**
                   * opModRegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF7(fn) {
                      this.regESI = fn.call(this, this.regESI, this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opModRegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF8(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opModRegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordF9(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opModRegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFA(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opModRegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFB(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opModRegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFC(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opModRegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFD(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opModRegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFE(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opModRegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModRegWordFF(fn) {
                      this.regEDI = fn.call(this, this.regEDI, this.regEDI);
                  }
              ];
              
              X86ModW.aOpModMem = [
                  /**
                   * opModMemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord00(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord01(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord02(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord03(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord04(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord05(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord06(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord07(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord08(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord09(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord0F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord10(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord11(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord12(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord13(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord14(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord15(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord16(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord17(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord18(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord19(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord1F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord20(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord21(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord22(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord23(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord24(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord25(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord26(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord27(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord28(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord29(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord2F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord30(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord31(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord32(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord33(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord34(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord35(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord36(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord37(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord38(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord39(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModMemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModMemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModMemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord3F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModMemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord40(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord41(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord42(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord43(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord44(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord45(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord46(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord47(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord48(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord49(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord4F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord50(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord51(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord52(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord53(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord54(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord55(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord56(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord57(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord58(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord59(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord5F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord60(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord61(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord62(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord63(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord64(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord65(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord66(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord67(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord68(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord69(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord6F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord70(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord71(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord72(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord73(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord74(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord75(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord76(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord77(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord78(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord79(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord7F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord80(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord81(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord82(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord83(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord84(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord85(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord86(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord87(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord88(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord89(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord8F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord90(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord91(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord92(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord93(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord94(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord95(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord96(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord97(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord98(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord99(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWord9F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA2(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA3(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA5(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA6(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP());
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordA9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAA(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAB(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAD(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAE(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordAF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB2(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB3(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB5(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB6(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordB9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBA(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModMemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBB(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModMemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBD(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBE(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModMemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opModMemWordBF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModW.aOpModReg[0xC0],    X86ModW.aOpModReg[0xC8],    X86ModW.aOpModReg[0xD0],    X86ModW.aOpModReg[0xD8],
                  X86ModW.aOpModReg[0xE0],    X86ModW.aOpModReg[0xE8],    X86ModW.aOpModReg[0xF0],    X86ModW.aOpModReg[0xF8],
                  X86ModW.aOpModReg[0xC1],    X86ModW.aOpModReg[0xC9],    X86ModW.aOpModReg[0xD1],    X86ModW.aOpModReg[0xD9],
                  X86ModW.aOpModReg[0xE1],    X86ModW.aOpModReg[0xE9],    X86ModW.aOpModReg[0xF1],    X86ModW.aOpModReg[0xF9],
                  X86ModW.aOpModReg[0xC2],    X86ModW.aOpModReg[0xCA],    X86ModW.aOpModReg[0xD2],    X86ModW.aOpModReg[0xDA],
                  X86ModW.aOpModReg[0xE2],    X86ModW.aOpModReg[0xEA],    X86ModW.aOpModReg[0xF2],    X86ModW.aOpModReg[0xFA],
                  X86ModW.aOpModReg[0xC3],    X86ModW.aOpModReg[0xCB],    X86ModW.aOpModReg[0xD3],    X86ModW.aOpModReg[0xDB],
                  X86ModW.aOpModReg[0xE3],    X86ModW.aOpModReg[0xEB],    X86ModW.aOpModReg[0xF3],    X86ModW.aOpModReg[0xFB],
                  X86ModW.aOpModReg[0xC4],    X86ModW.aOpModReg[0xCC],    X86ModW.aOpModReg[0xD4],    X86ModW.aOpModReg[0xDC],
                  X86ModW.aOpModReg[0xE4],    X86ModW.aOpModReg[0xEC],    X86ModW.aOpModReg[0xF4],    X86ModW.aOpModReg[0xFC],
                  X86ModW.aOpModReg[0xC5],    X86ModW.aOpModReg[0xCD],    X86ModW.aOpModReg[0xD5],    X86ModW.aOpModReg[0xDD],
                  X86ModW.aOpModReg[0xE5],    X86ModW.aOpModReg[0xED],    X86ModW.aOpModReg[0xF5],    X86ModW.aOpModReg[0xFD],
                  X86ModW.aOpModReg[0xC6],    X86ModW.aOpModReg[0xCE],    X86ModW.aOpModReg[0xD6],    X86ModW.aOpModReg[0xDE],
                  X86ModW.aOpModReg[0xE6],    X86ModW.aOpModReg[0xEE],    X86ModW.aOpModReg[0xF6],    X86ModW.aOpModReg[0xFE],
                  X86ModW.aOpModReg[0xC7],    X86ModW.aOpModReg[0xCF],    X86ModW.aOpModReg[0xD7],    X86ModW.aOpModReg[0xDF],
                  X86ModW.aOpModReg[0xE7],    X86ModW.aOpModReg[0xEF],    X86ModW.aOpModReg[0xF7],    X86ModW.aOpModReg[0xFF]
              ];
              
              X86ModW.aOpModGrp = [
                  /**
                   * opModGrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord00(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord01(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord02(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord03(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord04(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord05(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord06(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord07(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord08(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord09(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord0F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord10(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord11(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord12(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord13(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord14(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord15(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord16(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord17(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord18(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord19(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord1F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord20(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord21(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord22(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord23(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord24(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord25(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord26(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord27(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord28(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord29(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord2F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord30(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord31(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord32(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord33(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord34(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord35(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord36(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord37(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord38(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord39(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opModGrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opModGrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opModGrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord3F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opModGrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord40(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord41(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord42(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord43(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord44(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord45(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord46(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord47(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord48(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord49(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord4F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord50(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord51(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord52(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord53(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord54(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord55(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord56(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord57(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord58(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord59(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord5F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord60(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord61(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord62(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord63(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord64(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord65(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord66(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord67(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord68(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord69(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord6F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord70(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord71(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord72(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord73(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord74(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord75(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord76(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord77(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord78(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord79(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord7F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord80(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord81(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord82(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord83(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord84(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord85(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord86(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord87(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord88(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord89(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord8F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord90(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord91(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord92(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord93(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord94(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord95(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord96(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord97(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord98(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord99(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWord9F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA0(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA1(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA2(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA3(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA4(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA5(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA6(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA7(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA8(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordA9(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAA(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAB(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAC(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAD(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAE(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordAF(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB0(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB1(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB2(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB3(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB4(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB5(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB6(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB7(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB8(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordB9(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBA(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opModGrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBB(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opModGrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBC(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBD(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBE(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordBF(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opModGrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC0(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[0].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC1(afnGrp, fnSrc) {
                      this.regECX = afnGrp[0].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC2(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[0].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC3(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[0].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC4(afnGrp, fnSrc) {
                      this.setSP(afnGrp[0].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC5(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[0].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC6(afnGrp, fnSrc) {
                      this.regESI = afnGrp[0].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC7(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[0].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC8(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[1].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordC9(afnGrp, fnSrc) {
                      this.regECX = afnGrp[1].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCA(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[1].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCB(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[1].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCC(afnGrp, fnSrc) {
                      this.setSP(afnGrp[1].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCD(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[1].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCE(afnGrp, fnSrc) {
                      this.regESI = afnGrp[1].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordCF(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[1].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD0(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[2].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD1(afnGrp, fnSrc) {
                      this.regECX = afnGrp[2].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD2(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[2].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD3(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[2].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD4(afnGrp, fnSrc) {
                      this.setSP(afnGrp[2].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD5(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[2].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD6(afnGrp, fnSrc) {
                      this.regESI = afnGrp[2].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD7(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[2].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD8(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[3].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordD9(afnGrp, fnSrc) {
                      this.regECX = afnGrp[3].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDA(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[3].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDB(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[3].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDC(afnGrp, fnSrc) {
                      this.setSP(afnGrp[3].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDD(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[3].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDE(afnGrp, fnSrc) {
                      this.regESI = afnGrp[3].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordDF(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[3].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE0(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[4].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE1(afnGrp, fnSrc) {
                      this.regECX = afnGrp[4].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE2(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[4].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE3(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[4].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE4(afnGrp, fnSrc) {
                      this.setSP(afnGrp[4].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE5(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[4].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE6(afnGrp, fnSrc) {
                      this.regESI = afnGrp[4].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE7(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[4].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE8(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[5].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordE9(afnGrp, fnSrc) {
                      this.regECX = afnGrp[5].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordEA(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[5].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordEB(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[5].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordEC(afnGrp, fnSrc) {
                      this.setSP(afnGrp[5].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordED(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[5].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordEE(afnGrp, fnSrc) {
                      this.regESI = afnGrp[5].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordEF(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[5].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF0(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[6].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF1(afnGrp, fnSrc) {
                      this.regECX = afnGrp[6].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF2(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[6].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF3(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[6].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF4(afnGrp, fnSrc) {
                      this.setSP(afnGrp[6].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF5(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[6].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF6(afnGrp, fnSrc) {
                      this.regESI = afnGrp[6].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF7(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[6].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF8(afnGrp, fnSrc) {
                      this.regEAX = afnGrp[7].call(this, this.regEAX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordF9(afnGrp, fnSrc) {
                      this.regECX = afnGrp[7].call(this, this.regECX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFA(afnGrp, fnSrc) {
                      this.regEDX = afnGrp[7].call(this, this.regEDX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFB(afnGrp, fnSrc) {
                      this.regEBX = afnGrp[7].call(this, this.regEBX, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFC(afnGrp, fnSrc) {
                      this.setSP(afnGrp[7].call(this, this.getSP(), fnSrc.call(this)));
                  },
                  /**
                   * opModGrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFD(afnGrp, fnSrc) {
                      this.regEBP = afnGrp[7].call(this, this.regEBP, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFE(afnGrp, fnSrc) {
                      this.regESI = afnGrp[7].call(this, this.regESI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opModGrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opModGrpWordFF(afnGrp, fnSrc) {
                      this.regEDI = afnGrp[7].call(this, this.regEDI, fnSrc.call(this));
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModW;
              
            • x86modw16.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModW16 = {};
              
              X86ModW16.aOpModReg = [
                  /**
                   * opMod16RegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord00(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord01(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord02(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord03(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord04(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord05(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord06(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord07(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord08(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord09(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord0F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord10(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord11(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord12(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord13(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord14(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord15(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord16(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord17(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord18(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord19(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord1F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord20(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord21(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord22(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord23(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord24(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord25(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord26(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord27(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord28(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord29(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2A(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2B(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2C(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2D(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2E(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord2F(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord30(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord31(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord32(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord33(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord34(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord35(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord36(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord37(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord38(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord39(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3A(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16RegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3B(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16RegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3C(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3D(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3E(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16RegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord3F(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16RegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord40(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord41(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord42(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord43(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord44(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord45(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord46(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord47(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord48(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord49(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord4F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord50(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord51(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord52(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord53(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord54(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord55(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord56(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord57(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord58(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord59(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord5F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord60(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord61(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord62(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord63(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord64(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord65(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord66(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord67(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord68(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord69(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6A(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6B(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6C(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6D(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6E(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord6F(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord70(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord71(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord72(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord73(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord74(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord75(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord76(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord77(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord78(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord79(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7A(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7B(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7C(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7D(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7E(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord7F(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord80(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord81(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord82(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord83(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord84(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord85(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord86(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord87(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord88(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord89(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord8F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord90(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord91(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord92(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord93(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord94(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord95(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord96(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord97(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord98(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord99(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWord9F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA0(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA1(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA2(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA3(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA4(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA5(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA6(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA7(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA8(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordA9(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAA(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAB(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAC(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAD(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAE(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordAF(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB0(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB1(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB2(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB3(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB4(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB5(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB6(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB7(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB8(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordB9(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBA(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16RegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBB(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16RegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBC(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBD(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBE(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordBF(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16RegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC0(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC1(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC2(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC3(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC4(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC5(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC6(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC7(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC8(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordC9(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCA(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCB(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCC(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCD(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCE(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordCF(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD0(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD1(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD2(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD3(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD4(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD5(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD6(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD7(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD8(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordD9(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDA(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDB(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDC(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDD(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDE(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordDF(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE0(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE1(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE2(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE3(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE4(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE5(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE6(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE7(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16RegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE8(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordE9(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordEA(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordEB(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordEC(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordED(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordEE(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordEF(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF0(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF1(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF2(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF3(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF4(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF5(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF6(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                  },
                  /**
                   * opMod16RegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF7(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod16RegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF8(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod16RegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordF9(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod16RegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFA(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod16RegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFB(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod16RegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFC(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod16RegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFD(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod16RegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFE(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod16RegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16RegWordFF(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                  }
              ];
              
              X86ModW16.aOpModMem = [
                  /**
                   * opMod16MemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord00(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord01(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord02(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord03(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord04(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord05(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord06(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord07(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord08(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord09(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord0F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord10(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord11(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord12(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord13(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord14(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord15(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord16(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord17(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord18(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord19(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord1F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord20(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord21(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord22(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord23(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord24(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord25(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord26(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord27(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord28(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord29(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord2F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord30(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord31(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord32(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord33(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord34(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord35(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord36(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord37(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord38(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord39(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16MemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16MemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16MemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord3F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16MemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord40(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord41(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord42(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord43(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord44(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord45(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord46(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord47(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord48(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord49(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord4F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord50(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord51(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord52(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord53(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord54(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord55(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord56(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord57(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord58(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord59(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord5F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord60(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord61(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord62(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord63(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord64(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord65(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord66(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord67(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord68(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord69(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord6F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord70(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord71(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord72(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord73(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord74(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord75(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord76(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord77(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord78(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord79(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord7F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord80(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord81(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord82(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord83(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord84(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord85(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord86(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord87(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord88(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord89(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord8F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord90(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord91(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord92(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord93(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord94(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord95(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord96(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord97(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord98(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord99(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9A(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9B(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9E(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWord9F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA2(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA3(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA5(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA6(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordA9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAA(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAB(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAD(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAE(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordAF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB2(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB3(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB5(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB6(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordB9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBA(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16MemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBB(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16MemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBD(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBE(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16MemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod16MemWordBF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModW16.aOpModReg[0xC0],  X86ModW16.aOpModReg[0xC8],  X86ModW16.aOpModReg[0xD0],  X86ModW16.aOpModReg[0xD8],
                  X86ModW16.aOpModReg[0xE0],  X86ModW16.aOpModReg[0xE8],  X86ModW16.aOpModReg[0xF0],  X86ModW16.aOpModReg[0xF8],
                  X86ModW16.aOpModReg[0xC1],  X86ModW16.aOpModReg[0xC9],  X86ModW16.aOpModReg[0xD1],  X86ModW16.aOpModReg[0xD9],
                  X86ModW16.aOpModReg[0xE1],  X86ModW16.aOpModReg[0xE9],  X86ModW16.aOpModReg[0xF1],  X86ModW16.aOpModReg[0xF9],
                  X86ModW16.aOpModReg[0xC2],  X86ModW16.aOpModReg[0xCA],  X86ModW16.aOpModReg[0xD2],  X86ModW16.aOpModReg[0xDA],
                  X86ModW16.aOpModReg[0xE2],  X86ModW16.aOpModReg[0xEA],  X86ModW16.aOpModReg[0xF2],  X86ModW16.aOpModReg[0xFA],
                  X86ModW16.aOpModReg[0xC3],  X86ModW16.aOpModReg[0xCB],  X86ModW16.aOpModReg[0xD3],  X86ModW16.aOpModReg[0xDB],
                  X86ModW16.aOpModReg[0xE3],  X86ModW16.aOpModReg[0xEB],  X86ModW16.aOpModReg[0xF3],  X86ModW16.aOpModReg[0xFB],
                  X86ModW16.aOpModReg[0xC4],  X86ModW16.aOpModReg[0xCC],  X86ModW16.aOpModReg[0xD4],  X86ModW16.aOpModReg[0xDC],
                  X86ModW16.aOpModReg[0xE4],  X86ModW16.aOpModReg[0xEC],  X86ModW16.aOpModReg[0xF4],  X86ModW16.aOpModReg[0xFC],
                  X86ModW16.aOpModReg[0xC5],  X86ModW16.aOpModReg[0xCD],  X86ModW16.aOpModReg[0xD5],  X86ModW16.aOpModReg[0xDD],
                  X86ModW16.aOpModReg[0xE5],  X86ModW16.aOpModReg[0xED],  X86ModW16.aOpModReg[0xF5],  X86ModW16.aOpModReg[0xFD],
                  X86ModW16.aOpModReg[0xC6],  X86ModW16.aOpModReg[0xCE],  X86ModW16.aOpModReg[0xD6],  X86ModW16.aOpModReg[0xDE],
                  X86ModW16.aOpModReg[0xE6],  X86ModW16.aOpModReg[0xEE],  X86ModW16.aOpModReg[0xF6],  X86ModW16.aOpModReg[0xFE],
                  X86ModW16.aOpModReg[0xC7],  X86ModW16.aOpModReg[0xCF],  X86ModW16.aOpModReg[0xD7],  X86ModW16.aOpModReg[0xDF],
                  X86ModW16.aOpModReg[0xE7],  X86ModW16.aOpModReg[0xEF],  X86ModW16.aOpModReg[0xF7],  X86ModW16.aOpModReg[0xFF]
              ];
              
              X86ModW16.aOpModGrp = [
                  /**
                   * opMod16GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord00(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord01(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord02(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord03(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord04(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord05(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord06(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord07(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord08(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord09(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord0F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord10(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord11(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord12(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord13(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord14(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord15(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord16(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord17(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord18(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord19(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord1F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord20(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord21(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord22(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord23(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord24(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord25(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord26(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord27(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord28(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord29(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord2F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord30(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord31(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord32(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord33(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord34(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord35(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord36(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord37(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord38(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord39(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                  },
                  /**
                   * opMod16GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                  },
                  /**
                   * opMod16GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod16GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord3F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod16GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord40(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord41(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord42(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord43(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord44(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord45(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord46(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord47(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord48(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord49(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord4F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord50(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord51(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord52(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord53(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord54(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord55(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord56(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord57(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord58(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord59(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord5F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord60(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord61(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord62(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord63(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord64(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord65(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord66(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord67(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord68(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord69(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord6F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord70(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord71(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord72(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord73(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord74(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord75(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord76(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord77(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord78(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord79(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord7F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord80(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord81(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord82(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord83(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord84(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord85(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord86(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord87(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord88(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord89(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord8F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord90(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord91(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord92(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord93(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord94(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord95(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord96(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord97(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord98(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord99(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWord9F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA0(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA1(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA2(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA3(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA4(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA5(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA6(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA7(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA8(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordA9(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAA(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAB(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAC(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAD(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAE(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordAF(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB0(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB1(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB2(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB3(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB4(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB5(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB6(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB7(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB8(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordB9(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBA(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                  },
                  /**
                   * opMod16GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBB(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                  },
                  /**
                   * opMod16GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBC(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBD(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBE(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordBF(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod16GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC0(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC1(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC2(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC3(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC4(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC5(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC6(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC7(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC8(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordC9(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCA(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCB(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCC(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCD(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCE(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordCF(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD0(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD1(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD2(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD3(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD4(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD5(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD6(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD7(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD8(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordD9(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDA(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDB(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDC(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDD(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDE(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordDF(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE0(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE1(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE2(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE3(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE4(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE5(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE6(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE7(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE8(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordE9(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordEA(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordEB(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordEC(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordED(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordEE(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordEF(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF0(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF1(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF2(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF3(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF4(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF5(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF6(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF7(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF8(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordF9(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFA(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFB(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (SP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFC(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod16GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (BP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFD(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (SI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFE(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod16GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (DI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod16GrpWordFF(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModW16;
              
            • x86modw32.js
              /**
               * @fileoverview Implements PCjs 8086 mode-byte decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2015-Jan-20
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              var X86ModW32 = {};
              
              X86ModW32.aOpModReg = [
                  /**
                   * opMod32RegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord00(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord01(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord02(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord03(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord04(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord05(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord06(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord07(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord08(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord09(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord0F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord10(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord11(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord12(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord13(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord14(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord15(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord16(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord17(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord18(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord19(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord1F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord20(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord21(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord22(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord23(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord24(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord25(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord26(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord27(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord28(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord29(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2A(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2B(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2C(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2D(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2E(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord2F(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord30(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord31(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord32(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord33(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord34(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord35(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord36(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord37(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord38(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord39(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3A(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3B(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3C(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3D(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32RegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3E(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord3F(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32RegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord40(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord41(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord42(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord43(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord44(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord45(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord46(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord47(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord48(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord49(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord4F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord50(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord51(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord52(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord53(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord54(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord55(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord56(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord57(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord58(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord59(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord5F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord60(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord61(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord62(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord63(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord64(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord65(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord66(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord67(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord68(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord69(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6A(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6B(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6C(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6D(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6E(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord6F(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord70(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord71(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord72(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord73(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord74(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord75(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord76(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord77(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord78(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord79(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7A(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7B(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7C(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7D(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7E(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord7F(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord80(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord81(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord82(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord83(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord84(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord85(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord86(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord87(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord88(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord89(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8A(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8B(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8C(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8D(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8E(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord8F(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord90(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord91(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord92(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord93(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord94(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord95(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord96(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord97(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord98(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord99(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9A(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9B(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9C(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9D(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9E(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWord9F(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA0(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA1(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA2(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA3(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA4(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA5(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA6(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA7(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA8(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordA9(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAA(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAB(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAC(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAD(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAE(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordAF(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB0(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB1(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB2(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB3(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB4(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB5(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB6(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB7(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB8(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordB9(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBA(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBB(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBC(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBD(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBE(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordBF(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32RegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC0(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC1(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC2(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC3(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC4(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC5(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC6(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC7(fn) {
                      var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC8(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordC9(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCA(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCB(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCC(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCD(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCE(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordCF(fn) {
                      var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD0(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD1(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD2(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD3(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD4(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD5(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD6(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD7(fn) {
                      var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD8(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordD9(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDA(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDB(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDC(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDD(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDE(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordDF(fn) {
                      var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE0(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE1(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE2(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE3(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE4(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE5(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE6(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE7(fn) {
                      var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32RegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE8(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordE9(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordEA(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordEB(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordEC(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordED(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordEE(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordEF(fn) {
                      var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF0(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF1(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF2(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF3(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF4(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF5(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF6(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                  },
                  /**
                   * opMod32RegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF7(fn) {
                      var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                      }
                  },
                  /**
                   * opMod32RegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF8(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                      }
                  },
                  /**
                   * opMod32RegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordF9(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                      }
                  },
                  /**
                   * opMod32RegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFA(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                      }
                  },
                  /**
                   * opMod32RegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFB(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                      }
                  },
                  /**
                   * opMod32RegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFC(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                      }
                  },
                  /**
                   * opMod32RegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFD(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                      }
                  },
                  /**
                   * opMod32RegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFE(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                      }
                  },
                  /**
                   * opMod32RegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32RegWordFF(fn) {
                      var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                  }
              ];
              
              X86ModW32.aOpModMem = [
                  /**
                   * opMod32MemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord00(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord01(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord02(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord03(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord04(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord05(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord06(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord07(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord08(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord09(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord0F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord10(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord11(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord12(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord13(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord14(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord15(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord16(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord17(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord18(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord19(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord1F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord20(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord21(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord22(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord23(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord24(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord25(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord26(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord27(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord28(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord29(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord2F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord30(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord31(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord32(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord33(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord34(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord35(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord36(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord37(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord38(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord39(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3D(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32MemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord3F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32MemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord40(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord41(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord42(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord43(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord44(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord45(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord46(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord47(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord48(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord49(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord4F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord50(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord51(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord52(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord53(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord54(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord55(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord56(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord57(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord58(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord59(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord5F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord60(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord61(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord62(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord63(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord64(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord65(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord66(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord67(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord68(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord69(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord6F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord70(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord71(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord72(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord73(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord74(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord75(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord76(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord77(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord78(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord79(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord7F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord80(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord81(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord82(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord83(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord84(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord85(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord86(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord87(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord88(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord89(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord8F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord90(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord91(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord92(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord93(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord94(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord95(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord96(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord97(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord98(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord99(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9A(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9B(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9C(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9D(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9E(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWord9F(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA2(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA3(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA5(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA6(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordA9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAA(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAB(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAD(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAE(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordAF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB0(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB1(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB2(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB3(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB4(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB5(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB6(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB7(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB8(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordB9(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBA(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBB(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBC(fn) {
                      var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBD(fn) {
                      var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBE(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32MemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {function(number,number)} fn (dst,src)
                   */
                  function opMod32MemWordBF(fn) {
                      var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                      if (BACKTRACK) {
                          this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                      }
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  X86ModW32.aOpModReg[0xC0],    X86ModW32.aOpModReg[0xC8],    X86ModW32.aOpModReg[0xD0],    X86ModW32.aOpModReg[0xD8],
                  X86ModW32.aOpModReg[0xE0],    X86ModW32.aOpModReg[0xE8],    X86ModW32.aOpModReg[0xF0],    X86ModW32.aOpModReg[0xF8],
                  X86ModW32.aOpModReg[0xC1],    X86ModW32.aOpModReg[0xC9],    X86ModW32.aOpModReg[0xD1],    X86ModW32.aOpModReg[0xD9],
                  X86ModW32.aOpModReg[0xE1],    X86ModW32.aOpModReg[0xE9],    X86ModW32.aOpModReg[0xF1],    X86ModW32.aOpModReg[0xF9],
                  X86ModW32.aOpModReg[0xC2],    X86ModW32.aOpModReg[0xCA],    X86ModW32.aOpModReg[0xD2],    X86ModW32.aOpModReg[0xDA],
                  X86ModW32.aOpModReg[0xE2],    X86ModW32.aOpModReg[0xEA],    X86ModW32.aOpModReg[0xF2],    X86ModW32.aOpModReg[0xFA],
                  X86ModW32.aOpModReg[0xC3],    X86ModW32.aOpModReg[0xCB],    X86ModW32.aOpModReg[0xD3],    X86ModW32.aOpModReg[0xDB],
                  X86ModW32.aOpModReg[0xE3],    X86ModW32.aOpModReg[0xEB],    X86ModW32.aOpModReg[0xF3],    X86ModW32.aOpModReg[0xFB],
                  X86ModW32.aOpModReg[0xC4],    X86ModW32.aOpModReg[0xCC],    X86ModW32.aOpModReg[0xD4],    X86ModW32.aOpModReg[0xDC],
                  X86ModW32.aOpModReg[0xE4],    X86ModW32.aOpModReg[0xEC],    X86ModW32.aOpModReg[0xF4],    X86ModW32.aOpModReg[0xFC],
                  X86ModW32.aOpModReg[0xC5],    X86ModW32.aOpModReg[0xCD],    X86ModW32.aOpModReg[0xD5],    X86ModW32.aOpModReg[0xDD],
                  X86ModW32.aOpModReg[0xE5],    X86ModW32.aOpModReg[0xED],    X86ModW32.aOpModReg[0xF5],    X86ModW32.aOpModReg[0xFD],
                  X86ModW32.aOpModReg[0xC6],    X86ModW32.aOpModReg[0xCE],    X86ModW32.aOpModReg[0xD6],    X86ModW32.aOpModReg[0xDE],
                  X86ModW32.aOpModReg[0xE6],    X86ModW32.aOpModReg[0xEE],    X86ModW32.aOpModReg[0xF6],    X86ModW32.aOpModReg[0xFE],
                  X86ModW32.aOpModReg[0xC7],    X86ModW32.aOpModReg[0xCF],    X86ModW32.aOpModReg[0xD7],    X86ModW32.aOpModReg[0xDF],
                  X86ModW32.aOpModReg[0xE7],    X86ModW32.aOpModReg[0xEF],    X86ModW32.aOpModReg[0xF7],    X86ModW32.aOpModReg[0xFF]
              ];
              
              X86ModW32.aOpModGrp = [
                  /**
                   * opMod32GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord00(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord01(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord02(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord03(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord04(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord05(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord06(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord07(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord08(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord09(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord0F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord10(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord11(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord12(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord13(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord14(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord15(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord16(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord17(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord18(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord19(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord1F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord20(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord21(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord22(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord23(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord24(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord25(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord26(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord27(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord28(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord29(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord2F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord30(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord31(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord32(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord33(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord34(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord35(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord36(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord37(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord38(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord39(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (sib)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                  },
                  /**
                   * opMod32GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord3F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                  },
                  /**
                   * opMod32GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord40(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord41(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord42(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord43(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord44(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord45(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord46(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord47(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord48(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord49(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord4F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord50(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord51(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord52(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord53(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord54(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord55(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord56(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord57(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord58(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord59(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord5F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord60(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord61(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord62(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord63(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord64(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord65(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord66(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord67(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord68(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord69(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6A(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6B(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6C(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6D(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6E(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord6F(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord70(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord71(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord72(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord73(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord74(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord75(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord76(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord77(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (EAX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord78(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (ECX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord79(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (EDX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7A(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (EBX+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7B(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (sib+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7C(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (EBP+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7D(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (ESI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7E(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (EDI+d8)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord7F(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord80(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord81(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord82(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord83(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord84(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord85(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord86(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord87(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord88(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord89(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8A(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8B(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8C(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8D(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8E(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord8F(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord90(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord91(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord92(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord93(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord94(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord95(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord96(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord97(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord98(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord99(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9A(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9B(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9C(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9D(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9E(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWord9F(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA0(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA1(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA2(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA3(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA4(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA5(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA6(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA7(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA8(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordA9(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAA(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAB(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAC(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAD(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAE(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordAF(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB0(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB1(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB2(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB3(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB4(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB5(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB6(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB7(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (EAX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB8(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (ECX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordB9(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (EDX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBA(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (EBX+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBB(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (sib+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBC(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (EBP+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBD(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (ESI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBE(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (EDI+d32)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordBF(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                      this.setEAWord(w);
                      this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                  },
                  /**
                   * opMod32GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC0(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC1(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC2(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC3(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC4(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC5(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC6(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC7(afnGrp, fnSrc) {
                      var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC8(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordC9(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCA(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCB(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCC(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCD(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCE(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordCF(afnGrp, fnSrc) {
                      var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD0(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD1(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD2(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD3(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD4(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD5(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD6(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD7(afnGrp, fnSrc) {
                      var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD8(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordD9(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDA(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDB(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDC(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDD(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDE(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordDF(afnGrp, fnSrc) {
                      var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE0(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE1(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE2(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE3(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE4(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE5(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE6(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE7(afnGrp, fnSrc) {
                      var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE8(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordE9(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordEA(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordEB(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordEC(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordED(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordEE(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordEF(afnGrp, fnSrc) {
                      var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF0(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF1(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF2(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF3(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF4(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF5(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF6(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF7(afnGrp, fnSrc) {
                      var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF8(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                      this.regEAX = (this.regEAX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordF9(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                      this.regECX = (this.regECX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFA(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                      this.regEDX = (this.regEDX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFB(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                      this.regEBX = (this.regEBX & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (ESP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFC(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                      this.setSP((this.getSP() & ~this.dataMask) | w);
                  },
                  /**
                   * opMod32GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (EBP)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFD(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                      this.regEBP = (this.regEBP & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFE(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                      this.regESI = (this.regESI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                      }
                  },
                  /**
                   * opMod32GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                   *
                   * @this {X86CPU}
                   * @param {Array.<function(number,number)>} afnGrp
                   * @param {function()} fnSrc
                   */
                  function opMod32GrpWordFF(afnGrp, fnSrc) {
                      var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                      this.regEDI = (this.regEDI & ~this.dataMask) | w;
                      if (BACKTRACK) {
                          this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                      }
                  }
              ];
              
              if (typeof module !== 'undefined') module.exports = X86ModW32;
              
            • x86op0f.js
              /**
               * @fileoverview Implements PCjs 0x0F two-byte opcodes
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var X86         = require("./x86");
              }
              
              /**
               * op=0x0F,0x00 (GRP6 mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opGRP6 = function GRP6()
              {
                  var bModRM = this.getIPByte();
                  if ((bModRM & 0x38) < 0x10) {   // possible reg values: 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
                      this.opFlags |= X86.OPFLAG.NOREAD;
                  }
                  this.aOpModGrpWord[bModRM].call(this, this.aOpGrp6, X86.fnSrcNone);
              };
              
              /**
               * op=0x0F,0x01 (GRP7 mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opGRP7 = function GRP7()
              {
                  var bModRM = this.getIPByte();
                  if (!(bModRM & 0x10)) {
                      this.opFlags |= X86.OPFLAG.NOREAD;
                  }
                  this.aOpModGrpWord[bModRM].call(this, X86.aOpGrp7, X86.fnSrcNone);
              };
              
              /**
               * opLAR()
               *
               * op=0x0F,0x02 (LAR reg,mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opLAR = function LAR()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLAR);
              };
              
              /**
               * opLSL()
               *
               * op=0x0F,0x03 (LSL reg,mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opLSL = function LSL()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSL);
              };
              
              /**
               * opLOADALL()
               *
               * op=0x0F,0x05 (LOADALL)
               *
               * From the "Undocumented iAPX 286 Test Instruction" document at http://www.pcjs.org/pubs/pc/reference/intel/80286/loadall/:
               *
               *  Physical Address (Hex)        Associated CPU Register
               *          800-805                        None
               *          806-807                        MSW
               *          808-815                        None
               *          816-817                        TR
               *          818-819                        Flag word
               *          81A-81B                        IP
               *          81C-81D                        LDT
               *          81E-81F                        DS
               *          820-821                        SS
               *          822-823                        CS
               *          824-825                        ES
               *          826-827                        DI
               *          828-829                        SI
               *          82A-82B                        BP
               *          82C-82D                        SP
               *          82E-82F                        BX
               *          830-831                        DX
               *          832-833                        CX
               *          834-835                        AX
               *          836-83B                        ES descriptor cache
               *          83C-841                        CS descriptor cache
               *          842-847                        SS descriptor cache
               *          848-84D                        DS descriptor cache
               *          84E-853                        GDTR
               *          854-859                        LDT descriptor cache
               *          85A-85F                        IDTR
               *          860-865                        TSS descriptor cache
               *
               * Oddly, the above document gives two contradictory cycle counts for LOADALL: 190 and 195.  I'll go with 195, for
               * no particular reason.
               *
               * @this {X86CPU}
               */
              X86.opLOADALL = function LOADALL()
              {
                  if (this.segCS.cpl) {
                      /*
                       * You're not allowed to use LOADALL if the current privilege level is something other than zero.
                       */
                      X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0, true);
                      return;
                  }
                  this.setMSW(this.getShort(0x806));
                  this.regEDI = this.getShort(0x826);
                  this.regESI = this.getShort(0x828);
                  this.regEBP = this.getShort(0x82A);
                  this.regEBX = this.getShort(0x82E);
                  this.regEDX = this.getShort(0x830);
                  this.regECX = this.getShort(0x832);
                  this.regEAX = this.getShort(0x834);
                  this.segES.loadDesc6(0x836, this.getShort(0x824));
                  this.segCS.loadDesc6(0x83C, this.getShort(0x822));
                  this.segSS.loadDesc6(0x842, this.getShort(0x820));
                  this.segDS.loadDesc6(0x848, this.getShort(0x81E));
                  this.setPS(this.getShort(0x818));
                  /*
                   * It's important to call setIP() and setSP() *after* the segCS and segSS loads, so that the CPU's
                   * linear IP and SP registers (regLIP and regLSP) will be updated properly.  Ordinarily that would be
                   * taken care of by simply using the CPU's setCS() and setSS() functions, but those functions call the
                   * default descriptor load() functions, and obviously here we must use loadDesc6() instead.
                   */
                  this.setIP(this.getShort(0x81A));
                  this.setSP(this.getShort(0x82C));
                  /*
                   * The bytes at 0x851 and 0x85D "should be zeroes", as per the "Undocumented iAPX 286 Test Instruction"
                   * document, but the LOADALL issued by RAMDRIVE in PC-DOS 7.0 contains 0xFF in both of those bytes, resulting
                   * in very large addrGDT and addrIDT values.  Obviously, we can't have that, so we load only the low byte
                   * of the second word for both of those registers.
                   */
                  this.addrGDT = this.getShort(0x84E) | (this.getByte(0x850) << 16);
                  this.addrGDTLimit = this.addrGDT + this.getShort(0x852);
                  this.segLDT.loadDesc6(0x854, this.getShort(0x81C));
                  this.addrIDT = this.getShort(0x85A) | (this.getByte(0x85C) << 16);
                  this.addrIDTLimit = this.addrIDT + this.getShort(0x85E);
                  this.segTSS.loadDesc6(0x860, this.getShort(0x816));
                  this.nStepCycles -= 195;
                  /*
                   * TODO: LOADALL operation still needs to be verified in protected mode....
                   */
                  if (DEBUG && DEBUGGER && (this.regCR0 & X86.CR0.MSW.PE)) this.stopCPU();
              };
              
              /**
               * opCLTS()
               *
               * op=0x0F,0x06 (CLTS)
               *
               * @this {X86CPU}
               */
              X86.opCLTS = function CLTS()
              {
                  if (this.segCS.cpl) {
                      X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                      return;
                  }
                  this.regCR0 &= ~X86.CR0.MSW.TS;
                  this.nStepCycles -= 2;
              };
              
              /**
               * opMOVrc()
               *
               * op=0x0F,0x20 (MOV reg,creg)
               *
               * NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
               * the appropriate control register into a special variable (regXX), which our helper function
               * (fnMOVxx) will use to replace the decoder's src operand.
               *
               * From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
               * regardless of the setting of the MOD field.  The MOD field should be set to 0b11, but an early
               * 80386 documentation error indicated that the MOD field value was a don't care.  Early versions
               * of the 80486 detect a MOD != 0b11 as an illegal opcode.  This was changed in later versions to
               * ignore the value of MOD.  Assemblers that generate MOD != 0b11 for these instructions will fail
               * on some 80486s."
               *
               * @this {X86CPU}
               */
              X86.opMOVrc = function MOVrc()
              {
                  /*
                   * We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
                   *
                   * TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
                   * it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
                   * value.  I assume not.
                   */
                  var bModRM = this.getIPByte() | 0xc0;
              
                  if (this.segCS.cpl) {
                      /*
                       * You're not allowed to read control registers if the current privilege level is not zero
                       * (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
                       */
                      X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                      return;
                  }
              
                  var reg = (bModRM & 0x38) >> 3;
                  switch(reg) {
                  case 0x0:
                      this.regXX = this.regCR0;
                      break;
                  case 0x1:
                      this.regXX = this.regCR1;
                      break;
                  case 0x2:
                      this.regXX = this.regCR2;
                      break;
                  case 0x3:
                      this.regXX = this.regCR3;
                      break;
                  default:
                      X86.opUndefined.call(this);
                      return;
                  }
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written;
                   * however, it's moot, because we've already restricted this opcode to registers only.
                   *
                   *      this.opFlags |= X86.OPFLAG.NOREAD;
                   *
                   * Another issue, however, is that this instruction always assumes a 32-bit OPERAND size,
                   * so we must call setDataSize(4) first.
                   */
                  this.setDataSize(4);
                  this.aOpModRegWord[bModRM].call(this, X86.fnMOVxx);
              };
              
              /**
               * opMOVcr()
               *
               * op=0x0F,0x22 (MOV creg,reg)
               *
               * NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to make a note
               * of which general-purpose register will be overwritten, so that we can restore it after moving the
               * modified value to the correct control register.
               *
               * From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
               * regardless of the setting of the MOD field.  The MOD field should be set to 0b11, but an early
               * 80386 documentation error indicated that the MOD field value was a don't care.  Early versions
               * of the 80486 detect a MOD != 0b11 as an illegal opcode.  This was changed in later versions to
               * ignore the value of MOD.  Assemblers that generate MOD != 0b11 for these instructions will fail
               * on some 80486s."
               *
               * @this {X86CPU}
               */
              X86.opMOVcr = function MOVcr()
              {
                  var temp;
                  /*
                   * We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
                   *
                   * TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
                   * it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
                   * value.  I assume not.
                   */
                  var bModRM = this.getIPByte() | 0xc0;
              
                  if (this.segCS.cpl) {
                      /*
                       * You're not allowed to write control registers if the current privilege level is not zero
                       * (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
                       */
                      X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                      return;
                  }
              
                  var reg = (bModRM & 0x38) >> 3;
                  switch(reg) {
                  case 0x0:
                      temp = this.regEAX;
                      break;
                  case 0x1:
                      temp = this.regECX; // TODO: Is setting CR1 actually allowed on an 80386?
                      break;
                  case 0x2:
                      temp = this.regEDX;
                      break;
                  case 0x3:
                      temp = this.regEBX;
                      break;
                  default:
                      X86.opInvalid.call(this);
                      return;
                  }
              
                  /*
                   * This instruction always assumes a 32-bit OPERAND size, so we must call setDataSize(4) first.
                   */
                  this.setDataSize(4);
                  this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
              
                  switch(reg) {
                  case 0x0:
                      reg = this.regEAX;
                      this.regEAX = temp;
                      X86.fnLCR0.call(this, reg);
                      break;
                  case 0x1:
                      this.regCR1 = this.regECX;
                      this.regECX = temp;
                      break;
                  case 0x2:
                      this.regCR2 = this.regEDX;
                      this.regEDX = temp;
                      break;
                  case 0x3:
                      reg = this.regEBX;
                      this.regEBX = temp;
                      X86.fnLCR3.call(this, reg);
                      break;
                  }
              };
              
              /*
               * NOTE: The following 16 new conditional jumps actually rely on the OPERAND override setting
               * for determining whether a signed 16-bit or 32-bit displacement will be fetched, even though
               * the ADDRESS override might seem more intuitive.  Think of them as instructions that are loading
               * a new operand into IP/EIP.
               *
               * Also, in 16-bit code, even though a signed rel16 value would seem to imply a range of -32768
               * to +32767, any location within a 64Kb code segment outside that range can be reached by choosing
               * a displacement in the opposite direction, causing the 16-bit value in EIP to underflow or overflow;
               * any underflow or overflow doesn't matter, because only the low 16 bits of EIP are updated when a
               * 16-bit OPERAND size is in effect.
               *
               * In fact, for 16-bit jumps, it's simpler to always think of rel16 as an UNSIGNED value added to
               * the current EIP, where the result is then truncated to a 16-bit value.  This is why we don't have
               * to sign-extend rel16 before adding it to the current EIP.
               */
              
              /**
               * opJOw()
               *
               * op=0x0F,0x80 (JO rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJOw = function JOw()
              {
                  var disp = this.getIPWord();
                  if (this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNOw()
               *
               * op=0x0F,0x81 (JNO rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNOw = function JNOw()
              {
                  var disp = this.getIPWord();
                  if (!this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJCw()
               *
               * op=0x0F,0x82 (JC rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJCw = function JCw()
              {
                  var disp = this.getIPWord();
                  if (this.getCF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNCw()
               *
               * op=0x0F,0x83 (JNC rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNCw = function JNCw()
              {
                  var disp = this.getIPWord();
                  if (!this.getCF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJZw()
               *
               * op=0x0F,0x84 (JZ rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJZw = function JZw()
              {
                  var disp = this.getIPWord();
                  if (this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNZw()
               *
               * op=0x0F,0x85 (JNZ rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNZw = function JNZw()
              {
                  var disp = this.getIPWord();
                  if (!this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJBEw()
               *
               * op=0x0F,0x86 (JBE rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJBEw = function JBEw()
              {
                  var disp = this.getIPWord();
                  if (this.getCF() || this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNBEw()
               *
               * op=0x0F,0x87 (JNBE rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNBEw = function JNBEw()
              {
                  var disp = this.getIPWord();
                  if (!this.getCF() && !this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJSw()
               *
               * op=0x0F,0x88 (JS rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJSw = function JSw()
              {
                  var disp = this.getIPWord();
                  if (this.getSF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNSw()
               *
               * op=0x0F,0x89 (JNS rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNSw = function JNSw()
              {
                  var disp = this.getIPWord();
                  if (!this.getSF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJPw()
               *
               * op=0x0F,0x8A (JP rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJPw = function JPw()
              {
                  var disp = this.getIPWord();
                  if (this.getPF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNPw()
               *
               * op=0x0F,0x8B (JNP rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNPw = function JNPw()
              {
                  var disp = this.getIPWord();
                  if (!this.getPF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJLw()
               *
               * op=0x0F,0x8C (JL rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJLw = function JLw()
              {
                  var disp = this.getIPWord();
                  if (!this.getSF() != !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNLw()
               *
               * op=0x0F,0x8D (JNL rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNLw = function JNLw()
              {
                  var disp = this.getIPWord();
                  if (!this.getSF() == !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJLEw()
               *
               * op=0x0F,0x8E (JLE rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJLEw = function JLEw()
              {
                  var disp = this.getIPWord();
                  if (this.getZF() || !this.getSF() != !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opJNLEw()
               *
               * op=0x0F,0x8F (JNLE rel16/rel32)
               *
               * @this {X86CPU}
               */
              X86.opJNLEw = function JNLEw()
              {
                  var disp = this.getIPWord();
                  if (!this.getZF() && !this.getSF() == !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * opSETO()
               *
               * op=0x0F,0x90 (SETO b)
               *
               * @this {X86CPU}
               */
              X86.opSETO = function SETO()
              {
                  X86.fnSETcc.call(this, X86.fnSETO);
              };
              
              /**
               * opSETNO()
               *
               * op=0x0F,0x91 (SETNO b)
               *
               * @this {X86CPU}
               */
              X86.opSETNO = function SETNO()
              {
                  X86.fnSETcc.call(this, X86.fnSETO);
              };
              
              /**
               * opSETC()
               *
               * op=0x0F,0x92 (SETC b)
               *
               * @this {X86CPU}
               */
              X86.opSETC = function SETC()
              {
                  X86.fnSETcc.call(this, X86.fnSETC);
              };
              
              /**
               * opSETNC()
               *
               * op=0x0F,0x93 (SETNC b)
               *
               * @this {X86CPU}
               */
              X86.opSETNC = function SETNC()
              {
                  X86.fnSETcc.call(this, X86.fnSETNC);
              };
              
              /**
               * opSETZ()
               *
               * op=0x0F,0x94 (SETZ b)
               *
               * @this {X86CPU}
               */
              X86.opSETZ = function SETZ()
              {
                  X86.fnSETcc.call(this, X86.fnSETZ);
              };
              
              /**
               * opSETNZ()
               *
               * op=0x0F,0x95 (SETNZ b)
               *
               * @this {X86CPU}
               */
              X86.opSETNZ = function SETNZ()
              {
                  X86.fnSETcc.call(this, X86.fnSETNZ);
              };
              
              /**
               * opSETBE()
               *
               * op=0x0F,0x96 (SETBE b)
               *
               * @this {X86CPU}
               */
              X86.opSETBE = function SETBE()
              {
                  X86.fnSETcc.call(this, X86.fnSETBE);
              };
              
              /**
               * opSETNBE()
               *
               * op=0x0F,0x97 (SETNBE b)
               *
               * @this {X86CPU}
               */
              X86.opSETNBE = function SETNBE()
              {
                  X86.fnSETcc.call(this, X86.fnSETNBE);
              };
              
              /**
               * opSETS()
               *
               * op=0x0F,0x98 (SETS b)
               *
               * @this {X86CPU}
               */
              X86.opSETS = function SETS()
              {
                  X86.fnSETcc.call(this, X86.fnSETS);
              };
              
              /**
               * opSETNS()
               *
               * op=0x0F,0x99 (SETNS b)
               *
               * @this {X86CPU}
               */
              X86.opSETNS = function SETNS()
              {
                  X86.fnSETcc.call(this, X86.fnSETNS);
              };
              
              /**
               * opSETP()
               *
               * op=0x0F,0x9A (SETP b)
               *
               * @this {X86CPU}
               */
              X86.opSETP = function SETP()
              {
                  X86.fnSETcc.call(this, X86.fnSETP);
              };
              
              /**
               * opSETNP()
               *
               * op=0x0F,0x9B (SETNP b)
               *
               * @this {X86CPU}
               */
              X86.opSETNP = function SETNP()
              {
                  X86.fnSETcc.call(this, X86.fnSETNP);
              };
              
              /**
               * opSETL()
               *
               * op=0x0F,0x9C (SETL b)
               *
               * @this {X86CPU}
               */
              X86.opSETL = function SETL()
              {
                  X86.fnSETcc.call(this, X86.fnSETL);
              };
              
              /**
               * opSETNL()
               *
               * op=0x0F,0x9D (SETNL b)
               *
               * @this {X86CPU}
               */
              X86.opSETNL = function SETNL()
              {
                  X86.fnSETcc.call(this, X86.fnSETNL);
              };
              
              /**
               * opSETLE()
               *
               * op=0x0F,0x9E (SETLE b)
               *
               * @this {X86CPU}
               */
              X86.opSETLE = function SETLE()
              {
                  X86.fnSETcc.call(this, X86.fnSETLE);
              };
              
              /**
               * opSETNLE()
               *
               * op=0x0F,0x9F (SETNLE b)
               *
               * @this {X86CPU}
               */
              X86.opSETNLE = function SETNLE()
              {
                  X86.fnSETcc.call(this, X86.fnSETNLE);
              };
              
              /**
               * opPUSHFS()
               *
               * op=0x0F,0xA0 (PUSH FS)
               *
               * @this {X86CPU}
               */
              X86.opPUSHFS = function PUSHFS()
              {
                  this.pushWord(this.segFS.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * opPOPFS()
               *
               * op=0x0F,0xA1 (POP FS)
               *
               * @this {X86CPU}
               */
              X86.opPOPFS = function POPFS()
              {
                  this.setFS(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * opBT()
               *
               * op=0x0F,0xA3 (BT mem/reg,reg)
               *
               * @this {X86CPU}
               */
              X86.opBT = function BT()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBT);
                  if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitTestMExtra;
              };
              
              /**
               * opSHLDn()
               *
               * op=0x0F,0xA4 (SHLD mem/reg,reg,imm8)
               *
               * @this {X86CPU}
               */
              X86.opSHLDn = function SHLDn()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwi : X86.fnSHLDdi);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
              };
              
              /**
               * opSHLDcl()
               *
               * op=0x0F,0xA5 (SHLD mem/reg,reg,CL)
               *
               * @this {X86CPU}
               */
              X86.opSHLDcl = function SHLDcl()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwCL : X86.fnSHLDdCL);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
              };
              
              /**
               * opPUSHGS()
               *
               * op=0x0F,0xA8 (PUSH GS)
               *
               * @this {X86CPU}
               */
              X86.opPUSHGS = function PUSHGS()
              {
                  this.pushWord(this.segGS.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * opPOPGS()
               *
               * op=0x0F,0xA9 (POP GS)
               *
               * @this {X86CPU}
               */
              X86.opPOPGS = function POPGS()
              {
                  this.setGS(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * opBTS()
               *
               * op=0x0F,0xAB (BTC mem/reg,reg)
               *
               * @this {X86CPU}
               */
              X86.opBTS = function BTS()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTS);
                  if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
              };
              
              /**
               * opSHRDn()
               *
               * op=0x0F,0xAC (SHRD mem/reg,reg,imm8)
               *
               * @this {X86CPU}
               */
              X86.opSHRDn = function SHRDn()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwi : X86.fnSHRDdi);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
              };
              
              /**
               * opSHRDcl()
               *
               * op=0x0F,0xAD (SHRD mem/reg,reg,CL)
               *
               * @this {X86CPU}
               */
              X86.opSHRDcl = function SHRDcl()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwCL : X86.fnSHRDdCL);
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
              };
              
              /**
               * opIMUL()
               *
               * op=0x0F,0xAF (IMUL reg,mem/reg) (80386 and up)
               *
               * @this {X86CPU}
               */
              X86.opIMUL = function IMUL()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnIMULrw : X86.fnIMULrd);
              };
              
              /**
               * opLSS()
               *
               * op=0x0F,0xB2 (LSS reg,word)
               *
               * This is like a "MOV reg,rm" operation, but it also loads SS from the next word.
               *
               * @this {X86CPU}
               */
              X86.opLSS = function LSS()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSS);
              };
              
              /**
               * opBTR()
               *
               * op=0x0F,0xB3 (BTC mem/reg,reg) (80386 and up)
               *
               * @this {X86CPU}
               */
              X86.opBTR = function BTR()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTR);
                  if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
              };
              
              /**
               * opLFS()
               *
               * op=0x0F,0xB4 (LFS reg,word)
               *
               * This is like a "MOV reg,rm" operation, but it also loads FS from the next word.
               *
               * @this {X86CPU}
               */
              X86.opLFS = function LFS()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLFS);
              };
              
              /**
               * opLGS()
               *
               * op=0x0F,0xB5 (LGS reg,word)
               *
               * This is like a "MOV reg,rm" operation, but it also loads GS from the next word.
               *
               * @this {X86CPU}
               */
              X86.opLGS = function LGS()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLGS);
              };
              
              /**
               * opMOVZXb()
               *
               * op=0x0F,0xB6 (MOVZX reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opMOVZXb = function MOVZXb()
              {
                  /*
                   * The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
                   *
                   *      000:    AL      ->      000:    AX
                   *      001:    CL      ->      001:    CX
                   *      010:    DL      ->      010:    DX
                   *      011:    BL      ->      011:    BX
                   *      100:    AH      ->      100:    SP
                   *      101:    CH      ->      101:    BP
                   *      110:    DH      ->      110:    SI
                   *      111:    BH      ->      111:    DI
                   */
                  var temp;
                  var bModRM = this.getIPByte();
                  var reg = (bModRM & 0x38) >> 3;
                  switch(reg) {
                  case 0x4:
                      temp = this.regEAX;
                      break;
                  case 0x5:
                      temp = this.regECX;
                      break;
                  case 0x6:
                      temp = this.regEDX;
                      break;
                  case 0x7:
                      temp = this.regEBX;
                      break;
                  }
                  this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
                  switch(reg) {
                  case 0x0:
                      this.regEAX = (this.regEAX & ~this.dataMask) | (this.regEAX & 0xff);
                      break;
                  case 0x1:
                      this.regECX = (this.regECX & ~this.dataMask) | (this.regECX & 0xff);
                      break;
                  case 0x2:
                      this.regEDX = (this.regEDX & ~this.dataMask) | (this.regEDX & 0xff);
                      break;
                  case 0x3:
                      this.regEBX = (this.regEBX & ~this.dataMask) | (this.regEBX & 0xff);
                      break;
                  case 0x4:
                      this.regESP = (this.regESP & ~this.dataMask) | ((this.regEAX >> 8) & 0xff);
                      this.regEAX = temp;
                      break;
                  case 0x5:
                      this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regECX >> 8) & 0xff);
                      this.regECX = temp;
                      break;
                  case 0x6:
                      this.regESI = (this.regESI & ~this.dataMask) | ((this.regEDX >> 8) & 0xff);
                      this.regEDX = temp;
                      break;
                  case 0x7:
                      this.regEDI = (this.regEDI & ~this.dataMask) | ((this.regEBX >> 8) & 0xff);
                      this.regEBX = temp;
                      break;
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
              };
              
              /**
               * opMOVZXw()
               *
               * op=0x0F,0xB7 (MOVZX reg,word)
               *
               * @this {X86CPU}
               */
              X86.opMOVZXw = function MOVZXw()
              {
                  var bModRM = this.getIPByte();
                  this.setDataSize(2);
                  this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
                  switch((bModRM & 0x38) >> 3) {
                  case 0x0:
                      this.regEAX = (this.regEAX & 0xffff);
                      break;
                  case 0x1:
                      this.regECX = (this.regECX & 0xffff);
                      break;
                  case 0x2:
                      this.regEDX = (this.regEDX & 0xffff);
                      break;
                  case 0x3:
                      this.regEBX = (this.regEBX & 0xffff);
                      break;
                  case 0x4:
                      this.regESP = (this.regESP & 0xffff);
                      break;
                  case 0x5:
                      this.regEBP = (this.regEBP & 0xffff);
                      break;
                  case 0x6:
                      this.regESI = (this.regESI & 0xffff);
                      break;
                  case 0x7:
                      this.regEDI = (this.regEDI & 0xffff);
                      break;
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
              };
              
              /**
               * op=0x0F,0xBA (GRP8 mem/reg) (80386 and up)
               *
               * @this {X86CPU}
               */
              X86.opGRP8 = function GRP8()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp8, this.getIPByte);
              };
              
              /**
               * opBTC()
               *
               * op=0x0F,0xBB (BTC mem/reg,reg)
               *
               * @this {X86CPU}
               */
              X86.opBTC = function BTC()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTC);
                  if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
              };
              
              /**
               * opBSF()
               *
               * op=0x0F,0xBC (BSF reg,mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opBSF = function BSF()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSF);
              };
              
              /**
               * opBSR()
               *
               * op=0x0F,0xBD (BSR reg,mem/reg)
               *
               * @this {X86CPU}
               */
              X86.opBSR = function BSR()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSR);
              };
              
              /**
               * opMOVSXb()
               *
               * op=0x0F,0xBE (MOVSX reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opMOVSXb = function MOVSXb()
              {
                  /*
                   * The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
                   *
                   *      000:    AL      ->      000:    AX
                   *      001:    CL      ->      001:    CX
                   *      010:    DL      ->      010:    DX
                   *      011:    BL      ->      011:    BX
                   *      100:    AH      ->      100:    SP
                   *      101:    CH      ->      101:    BP
                   *      110:    DH      ->      110:    SI
                   *      111:    BH      ->      111:    DI
                   */
                  var temp;
                  var bModRM = this.getIPByte();
                  var reg = (bModRM & 0x38) >> 3;
                  switch(reg) {
                  case 0x4:
                      temp = this.regEAX;
                      break;
                  case 0x5:
                      temp = this.regECX;
                      break;
                  case 0x6:
                      temp = this.regEDX;
                      break;
                  case 0x7:
                      temp = this.regEBX;
                      break;
                  }
                  this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
                  switch(reg) {
                  case 0x0:
                      this.regEAX = (this.regEAX & ~this.dataMask) | ((((this.regEAX & 0xff) << 24) >> 24) & this.dataMask);
                      break;
                  case 0x1:
                      this.regECX = (this.regECX & ~this.dataMask) | ((((this.regECX & 0xff) << 24) >> 24) & this.dataMask);
                      break;
                  case 0x2:
                      this.regEDX = (this.regEDX & ~this.dataMask) | ((((this.regEDX & 0xff) << 24) >> 24) & this.dataMask);
                      break;
                  case 0x3:
                      this.regEBX = (this.regEBX & ~this.dataMask) | ((((this.regEBX & 0xff) << 24) >> 24) & this.dataMask);
                      break;
                  case 0x4:
                      this.regESP = (this.regESP & ~this.dataMask) | (((this.regEAX << 16) >> 24) & this.dataMask);
                      this.regEAX = temp;
                      break;
                  case 0x5:
                      this.regEBP = (this.regEBP & ~this.dataMask) | (((this.regECX << 16) >> 24) & this.dataMask);
                      this.regECX = temp;
                      break;
                  case 0x6:
                      this.regESI = (this.regESI & ~this.dataMask) | (((this.regEDX << 16) >> 24) & this.dataMask);
                      this.regEDX = temp;
                      break;
                  case 0x7:
                      this.regEDI = (this.regEDI & ~this.dataMask) | (((this.regEBX << 16) >> 24) & this.dataMask);
                      this.regEBX = temp;
                      break;
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
              };
              
              /**
               * opMOVSXw()
               *
               * op=0x0F,0xBF (MOVSX reg,word)
               *
               * @this {X86CPU}
               */
              X86.opMOVSXw = function MOVSXw()
              {
                  var bModRM = this.getIPByte();
                  this.setDataSize(2);
                  this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
                  switch((bModRM & 0x38) >> 3) {
                  case 0x0:
                      this.regEAX = ((this.regEAX << 16) >> 16);
                      break;
                  case 0x1:
                      this.regECX = ((this.regECX << 16) >> 16);
                      break;
                  case 0x2:
                      this.regEDX = ((this.regEDX << 16) >> 16);
                      break;
                  case 0x3:
                      this.regEBX = ((this.regEBX << 16) >> 16);
                      break;
                  case 0x4:
                      this.regESP = ((this.regESP << 16) >> 16);
                      break;
                  case 0x5:
                      this.regEBP = ((this.regEBP << 16) >> 16);
                      break;
                  case 0x6:
                      this.regESI = ((this.regESI << 16) >> 16);
                      break;
                  case 0x7:
                      this.regEDI = ((this.regEDI << 16) >> 16);
                      break;
                  }
                  this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
              };
              
              X86.aOps0F = new Array(256);
              
              X86.aOps0F[0x00] = X86.opGRP6;
              X86.aOps0F[0x01] = X86.opGRP7;
              X86.aOps0F[0x02] = X86.opLAR;
              X86.aOps0F[0x03] = X86.opLSL;
              X86.aOps0F[0x05] = X86.opLOADALL;
              X86.aOps0F[0x06] = X86.opCLTS;
              
              /*
               * On all processors (except the 8086/8088, of course), X86.OPCODE.UD2 (0x0F,0x0B), aka "UD2", is an
               * instruction guaranteed to raise a #UD (Invalid Opcode) exception (INT 0x06) on all post-8086 processors.
               */
              X86.aOps0F[0x0B] = X86.opInvalid;
              
              if (I386) {
                  X86.aOps0F386 = [];
                  X86.aOps0F386[0x20] = X86.opMOVrc;
                  X86.aOps0F386[0x22] = X86.opMOVcr;
                  X86.aOps0F386[0x80] = X86.opJOw;
                  X86.aOps0F386[0x81] = X86.opJNOw;
                  X86.aOps0F386[0x82] = X86.opJCw;
                  X86.aOps0F386[0x83] = X86.opJNCw;
                  X86.aOps0F386[0x84] = X86.opJZw;
                  X86.aOps0F386[0x85] = X86.opJNZw;
                  X86.aOps0F386[0x86] = X86.opJBEw;
                  X86.aOps0F386[0x87] = X86.opJNBEw;
                  X86.aOps0F386[0x88] = X86.opJSw;
                  X86.aOps0F386[0x89] = X86.opJNSw;
                  X86.aOps0F386[0x8A] = X86.opJPw;
                  X86.aOps0F386[0x8B] = X86.opJNPw;
                  X86.aOps0F386[0x8C] = X86.opJLw;
                  X86.aOps0F386[0x8D] = X86.opJNLw;
                  X86.aOps0F386[0x8E] = X86.opJLEw;
                  X86.aOps0F386[0x8F] = X86.opJNLEw;
                  X86.aOps0F386[0x90] = X86.opSETO;
                  X86.aOps0F386[0x91] = X86.opSETNO;
                  X86.aOps0F386[0x92] = X86.opSETC;
                  X86.aOps0F386[0x93] = X86.opSETNC;
                  X86.aOps0F386[0x94] = X86.opSETZ;
                  X86.aOps0F386[0x95] = X86.opSETNZ;
                  X86.aOps0F386[0x96] = X86.opSETBE;
                  X86.aOps0F386[0x97] = X86.opSETNBE;
                  X86.aOps0F386[0x98] = X86.opSETS;
                  X86.aOps0F386[0x99] = X86.opSETNS;
                  X86.aOps0F386[0x9A] = X86.opSETP;
                  X86.aOps0F386[0x9B] = X86.opSETNP;
                  X86.aOps0F386[0x9C] = X86.opSETL;
                  X86.aOps0F386[0x9D] = X86.opSETNL;
                  X86.aOps0F386[0x9E] = X86.opSETLE;
                  X86.aOps0F386[0x9F] = X86.opSETNLE;
                  X86.aOps0F386[0xA0] = X86.opPUSHFS;
                  X86.aOps0F386[0xA1] = X86.opPOPFS;
                  X86.aOps0F386[0xA3] = X86.opBT;
                  X86.aOps0F386[0xA4] = X86.opSHLDn;
                  X86.aOps0F386[0xA5] = X86.opSHLDcl;
                  X86.aOps0F386[0xA8] = X86.opPUSHGS;
                  X86.aOps0F386[0xA9] = X86.opPOPGS;
                  X86.aOps0F386[0xAB] = X86.opBTS;
                  X86.aOps0F386[0xAC] = X86.opSHRDn;
                  X86.aOps0F386[0xAD] = X86.opSHRDcl;
                  X86.aOps0F386[0xAF] = X86.opIMUL;
                  X86.aOps0F386[0xB2] = X86.opLSS;
                  X86.aOps0F386[0xB3] = X86.opBTR;
                  X86.aOps0F386[0xB4] = X86.opLFS;
                  X86.aOps0F386[0xB5] = X86.opLGS;
                  X86.aOps0F386[0xB6] = X86.opMOVZXb;
                  X86.aOps0F386[0xB7] = X86.opMOVZXw;
                  X86.aOps0F386[0xBA] = X86.opGRP8;
                  X86.aOps0F386[0xBB] = X86.opBTC;
                  X86.aOps0F386[0xBC] = X86.opBSF;
                  X86.aOps0F386[0xBD] = X86.opBSR;
                  X86.aOps0F386[0xBE] = X86.opMOVSXb;
                  X86.aOps0F386[0xBF] = X86.opMOVSXw;
              }
              
              /*
               * These instruction groups are not as orthogonal as the original 8086/8088 groups (Grp1 through Grp4); some of
               * the instructions in Grp6 and Grp7 only read their dst operand (eg, LLDT), which means the ModRM helper function
               * must insure that setEAWord() is disabled, while others only write their dst operand (eg, SLDT), which means that
               * getEAWord() should be disabled *prior* to calling the ModRM helper function.  This latter case requires that
               * we decode the reg field of the ModRM byte before dispatching.
               */
              X86.aOpGrp6Prot = [
                  X86.fnSLDT,             X86.fnSTR,              X86.fnLLDT,             X86.fnLTR,              // 0x0F,0x00(reg=0x0-0x3)
                  X86.fnVERR,             X86.fnVERW,             X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0x0F,0x00(reg=0x4-0x7)
              ];
              
              X86.aOpGrp6Real = [
                  X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPInvalid,       // 0x0F,0x00(reg=0x0-0x3)
                  X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0x0F,0x00(reg=0x4-0x7)
              ];
              
              /*
               * Unlike Grp6, Grp7 and Grp8 do not require separate real-mode and protected-mode dispatch tables, because
               * all Grp7 and Grp8 instructions are valid in both modes.
               */
              X86.aOpGrp7 = [
                  X86.fnSGDT,             X86.fnSIDT,             X86.fnLGDT,             X86.fnLIDT,             // 0x0F,0x01(reg=0x0-0x3)
                  X86.fnSMSW,             X86.fnGRPUndefined,     X86.fnLMSW,             X86.fnGRPUndefined      // 0x0F,0x01(reg=0x4-0x7)
              ];
              
              X86.aOpGrp8 = [
                  X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0x0F,0xBA(reg=0x0-0x3)
                  X86.fnBT,               X86.fnBTS,              X86.fnBTR,              X86.fnBTC               // 0x0F,0xBA(reg=0x4-0x7)
              ];
              
            • x86ops.js
              /**
               * @fileoverview Implements PCjs 8086 opcode decoding.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Sep-05
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var Component   = require("../../shared/lib/component");
                  var Messages    = require("./messages");
                  var X86         = require("./x86");
              }
              
              /**
               * op=0x00 (ADD byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opADDmb = function ADDmb()
              {
                  var b = this.getIPByte();
                  /*
                   * Opcode bytes 0x00 0x00 are sufficiently uncommon that it's more likely we've started
                   * executing in the weeds, so we'll print a warning if you're in DEBUG mode, and optionally
                   * stop the CPU if a Debugger is available.
                   */
                  if (DEBUG && !b) {
                      this.printMessage("suspicious opcode: 0x00 0x00", DEBUGGER || this.bitsMessage);
                      if (DEBUGGER && this.dbg) this.stopCPU();
                  }
                  this.aOpModMemByte[b].call(this, X86.fnADDb);
              };
              
              /**
               * op=0x01 (ADD word,reg)
               *
               * @this {X86CPU}
               */
              X86.opADDmw = function ADDmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADDw);
              };
              
              /**
               * op=0x02 (ADD reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opADDrb = function ADDrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADDb);
              };
              
              /**
               * op=0x03 (ADD reg,word)
               *
               * @this {X86CPU}
               */
              X86.opADDrw = function ADDrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADDw);
              };
              
              /**
               * op=0x04 (ADD AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opADDALb = function ADDALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnADDb.call(this, this.regEAX & 0xff, this.getIPByte());
                  /*
                   * NOTE: Whenever the result is "blended" value (eg, of btiAL and btiMemLo), a new bti should be
                   * allocated to reflect that fact; however, I'm leaving "perfect" BACKTRACK support for another day.
                   */
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x05 (ADD AX,imm16 or ADD EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opADDAX = function ADDAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x06 (PUSH ES)
               *
               * @this {X86CPU}
               */
              X86.opPUSHES = function PUSHES()
              {
                  this.pushWord(this.segES.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * op=0x07 (POP ES)
               *
               * @this {X86CPU}
               */
              X86.opPOPES = function POPES()
              {
                  this.setES(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x08 (OR byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opORmb = function ORmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnORb);
              };
              
              /**
               * op=0x09 (OR word,reg)
               *
               * @this {X86CPU}
               */
              X86.opORmw = function ORmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnORw);
              };
              
              /**
               * op=0x0A (OR reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opORrb = function ORrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnORb);
              };
              
              /**
               * op=0x0B (OR reg,word)
               *
               * @this {X86CPU}
               */
              X86.opORrw = function ORrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnORw);
              };
              
              /**
               * op=0x0C (OR AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opORALb = function ORALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnORb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x0D (OR AX,imm16 or OR EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opORAX = function ORAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x0E (PUSH CS)
               *
               * @this {X86CPU}
               */
              X86.opPUSHCS = function PUSHCS()
              {
                  this.pushWord(this.segCS.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * op=0x0F (POP CS) (undocumented on 8086/8088; replaced with opInvalid on 80186/80188, and op0F on 80286 and up)
               *
               * @this {X86CPU}
               */
              X86.opPOPCS = function POPCS()
              {
                  this.setCS(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x0F (handler for two-byte opcodes; 80286 and up)
               *
               * @this {X86CPU}
               */
              X86.op0F = function OP0F()
              {
                  this.aOps0F[this.getIPByte()].call(this);
              };
              
              /**
               * op=0x10 (ADC byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opADCmb = function ADCmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnADCb);
              };
              
              /**
               * op=0x11 (ADC word,reg)
               *
               * @this {X86CPU}
               */
              X86.opADCmw = function ADCmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADCw);
              };
              
              /**
               * op=0x12 (ADC reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opADCrb = function ADCrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADCb);
              };
              
              /**
               * op=0x13 (ADC reg,word)
               *
               * @this {X86CPU}
               */
              X86.opADCrw = function ADCrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADCw);
              };
              
              /**
               * op=0x14 (ADC AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opADCALb = function ADCALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnADCb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x15 (ADC AX,imm16 or ADC EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opADCAX = function ADCAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADCw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x16 (PUSH SS)
               *
               * @this {X86CPU}
               */
              X86.opPUSHSS = function PUSHSS()
              {
                  this.pushWord(this.segSS.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * op=0x17 (POP SS)
               *
               * @this {X86CPU}
               */
              X86.opPOPSS = function POPSS()
              {
                  this.setSS(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x18 (SBB byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opSBBmb = function SBBmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSBBb);
              };
              
              /**
               * op=0x19 (SBB word,reg)
               *
               * @this {X86CPU}
               */
              X86.opSBBmw = function SBBmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSBBw);
              };
              
              /**
               * op=0x1A (SBB reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opSBBrb = function SBBrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSBBb);
              };
              
              /**
               * op=0x1B (SBB reg,word)
               *
               * @this {X86CPU}
               */
              X86.opSBBrw = function SBBrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSBBw);
              };
              
              /**
               * op=0x1C (SBB AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opSBBALb = function SBBALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnSBBb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x1D (SBB AX,imm16 or SBB EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opSBBAX = function SBBAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSBBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x1E (PUSH DS)
               *
               * @this {X86CPU}
               */
              X86.opPUSHDS = function PUSHDS()
              {
                  this.pushWord(this.segDS.sel);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
              };
              
              /**
               * op=0x1F (POP DS)
               *
               * @this {X86CPU}
               */
              X86.opPOPDS = function POPDS()
              {
                  this.setDS(this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x20 (AND byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opANDmb = function ANDmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnANDb);
              };
              
              /**
               * op=0x21 (AND word,reg)
               *
               * @this {X86CPU}
               */
              X86.opANDmw = function ANDmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnANDw);
              };
              
              /**
               * op=0x22 (AND reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opANDrb = function ANDrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnANDb);
              };
              
              /**
               * op=0x23 (AND reg,word)
               *
               * @this {X86CPU}
               */
              X86.opANDrw = function ANDrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnANDw);
              };
              
              /**
               * op=0x24 (AND AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opANDAL = function ANDAL()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnANDb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x25 (AND AX,imm16 or AND EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opANDAX = function ANDAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnANDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x26 (ES:)
               *
               * @this {X86CPU}
               */
              X86.opES = function ES()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segES;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0x27 (DAA)
               *
               * @this {X86CPU}
               */
              X86.opDAA = function DAA()
              {
                  var AL = this.regEAX & 0xff;
                  var AF = this.getAF();
                  var CF = this.getCF();
                  if ((AL & 0xf) > 9 || AF) {
                      AL += 0x6;
                      AF = X86.PS.AF;
                  }
                  if (AL > 0x9f || CF) {
                      AL += 0x60;
                      CF = X86.PS.CF;
                  }
                  var b = (AL & 0xff);
                  this.regEAX = (this.regEAX & ~0xff) | b;
                  this.setLogicResult(b, X86.RESULT.BYTE);
                  if (CF) this.setCF(); else this.clearCF();
                  if (AF) this.setAF(); else this.clearAF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;          // AAA and DAA have the same cycle times
              };
              
              /**
               * op=0x28 (SUB byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opSUBmb = function SUBmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSUBb);
              };
              
              /**
               * op=0x29 (SUB word,reg)
               *
               * @this {X86CPU}
               */
              X86.opSUBmw = function SUBmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSUBw);
              };
              
              /**
               * op=0x2A (SUB reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opSUBrb = function SUBrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSUBb);
              };
              
              /**
               * op=0x2B (SUB reg,word)
               *
               * @this {X86CPU}
               */
              X86.opSUBrw = function SUBrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSUBw);
              };
              
              /**
               * op=0x2C (SUB AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opSUBALb = function SUBALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnSUBb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x2D (SUB AX,imm16 or SUB EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opSUBAX = function SUBAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSUBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x2E (CS:)
               *
               * @this {X86CPU}
               */
              X86.opCS = function CS()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segCS;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0x2F (DAS)
               *
               * @this {X86CPU}
               */
              X86.opDAS = function DAS()
              {
                  var AL = this.regEAX & 0xff;
                  var AF = this.getAF();
                  var CF = this.getCF();
                  if ((AL & 0xf) > 9 || AF) {
                      AL -= 0x6;
                      AF = X86.PS.AF;
                  }
                  if (AL > 0x9f || CF) {
                      AL -= 0x60;
                      CF = X86.PS.CF;
                  }
                  var b = (AL & 0xff);
                  this.regEAX = (this.regEAX & ~0xff) | b;
                  this.setLogicResult(b, X86.RESULT.BYTE);
                  if (CF) this.setCF(); else this.clearCF();
                  if (AF) this.setAF(); else this.clearAF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;          // AAA and DAS have the same cycle times
              };
              
              /**
               * op=0x30 (XOR byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opXORmb = function XORmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnXORb);
              };
              
              /**
               * op=0x31 (XOR word,reg)
               *
               * @this {X86CPU}
               */
              X86.opXORmw = function XORmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnXORw);
              };
              
              /**
               * op=0x32 (XOR reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opXORrb = function XORrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnXORb);
              };
              
              /**
               * op=0x33 (XOR reg,word)
               *
               * @this {X86CPU}
               */
              X86.opXORrw = function XORrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnXORw);
              };
              
              /**
               * op=0x34 (XOR AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opXORALb = function XORALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | X86.fnXORb.call(this, this.regEAX & 0xff, this.getIPByte());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x35 (XOR AX,imm16 or XOR EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opXORAX = function XORAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnXORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x36 (SS:)
               *
               * @this {X86CPU}
               */
              X86.opSS = function SS()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segSS;      // QUESTION: Is there a case where segStack would not already be segSS? (eg, multiple segment overrides?)
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0x37 (AAA)
               *
               * @this {X86CPU}
               */
              X86.opAAA = function AAA()
              {
                  var CF, AF;
                  var AL = this.regEAX & 0xff;
                  var AH = (this.regEAX >> 8) & 0xff;
                  if ((AL & 0xf) > 9 || this.getAF()) {
                      AL = (AL + 0x6) & 0xf;
                      AH = (AH + 1) & 0xff;
                      CF = AF = 1;
                  } else {
                      CF = AF = 0;
                  }
                  this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
                  if (CF) this.setCF(); else this.clearCF();
                  if (AF) this.setAF(); else this.clearAF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
              };
              
              /**
               * op=0x38 (CMP byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opCMPmb = function CMPmb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnCMPb);
              };
              
              /**
               * op=0x39 (CMP word,reg)
               *
               * @this {X86CPU}
               */
              X86.opCMPmw = function CMPmw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnCMPw);
              };
              
              /**
               * op=0x3A (CMP reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opCMPrb = function CMPrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnCMPb);
              };
              
              /**
               * op=0x3B (CMP reg,word)
               *
               * @this {X86CPU}
               */
              X86.opCMPrw = function CMPrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnCMPw);
              };
              
              /**
               * op=0x3C (CMP AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opCMPALb = function CMPALb()
              {
                  X86.fnCMPb.call(this, this.regEAX & 0xff, this.getIPByte());
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x3D (CMP AX,imm16 or CMP EAX,imm32)
               *
               * @this {X86CPU}
               */
              X86.opCMPAX = function CMPAX()
              {
                  X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                  this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
              };
              
              /**
               * op=0x3E (DS:)
               *
               * @this {X86CPU}
               */
              X86.opDS = function DS()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segDS;      // QUESTION: Is there a case where segData would not already be segDS? (eg, multiple segment overrides?)
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0x3D (AAS)
               *
               * @this {X86CPU}
               */
              X86.opAAS = function AAS()
              {
                  var CF, AF;
                  var AL = this.regEAX & 0xff;
                  var AH = (this.regEAX >> 8) & 0xff;
                  if ((AL & 0xf) > 9 || this.getAF()) {
                      AL = (AL - 0x6) & 0xf;
                      AH = (AH - 1) & 0xff;
                      CF = AF = 1;
                  } else {
                      CF = AF = 0;
                  }
                  this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
                  if (CF) this.setCF(); else this.clearCF();
                  if (AF) this.setAF(); else this.clearAF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;   // AAA and AAS have the same cycle times
              };
              
              /**
               * op=0x40 (INC [E]AX)
               *
               * @this {X86CPU}
               */
              X86.opINCAX = function INCAX()
              {
                  this.regEAX = X86.fnINCr.call(this, this.regEAX);
              };
              
              /**
               * op=0x41 (INC [E]CX)
               *
               * @this {X86CPU}
               */
              X86.opINCCX = function INCCX()
              {
                  this.regECX = X86.fnINCr.call(this, this.regECX);
              };
              
              /**
               * op=0x42 (INC [E]DX)
               *
               * @this {X86CPU}
               */
              X86.opINCDX = function INCDX()
              {
                  this.regEDX = X86.fnINCr.call(this, this.regEDX);
              };
              
              /**
               * op=0x43 (INC [E]BX)
               *
               * @this {X86CPU}
               */
              X86.opINCBX = function INCBX()
              {
                  this.regEBX = X86.fnINCr.call(this, this.regEBX);
              };
              
              /**
               * op=0x44 (INC [E]SP)
               *
               * @this {X86CPU}
               */
              X86.opINCSP = function INCSP()
              {
                  this.setSP(X86.fnINCr.call(this, this.getSP()));
              };
              
              /**
               * op=0x45 (INC [E]BP)
               *
               * @this {X86CPU}
               */
              X86.opINCBP = function INCBP()
              {
                  this.regEBP = X86.fnINCr.call(this, this.regEBP);
              };
              
              /**
               * op=0x46 (INC [E]SI)
               *
               * @this {X86CPU}
               */
              X86.opINCSI = function INCSI()
              {
                  this.regESI = X86.fnINCr.call(this, this.regESI);
              };
              
              /**
               * op=0x47 (INC [E]DI)
               *
               * @this {X86CPU}
               */
              X86.opINCDI = function INCDI()
              {
                  this.regEDI = X86.fnINCr.call(this, this.regEDI);
              };
              
              /**
               * op=0x48 (DEC [E]AX)
               *
               * @this {X86CPU}
               */
              X86.opDECAX = function DECAX()
              {
                  this.regEAX = X86.fnDECr.call(this, this.regEAX);
              };
              
              /**
               * op=0x49 (DEC [E]CX)
               *
               * @this {X86CPU}
               */
              X86.opDECCX = function DECCX()
              {
                  this.regECX = X86.fnDECr.call(this, this.regECX);
              };
              
              /**
               * op=0x4A (DEC [E]DX)
               *
               * @this {X86CPU}
               */
              X86.opDECDX = function DECDX()
              {
                  this.regEDX = X86.fnDECr.call(this, this.regEDX);
              };
              
              /**
               * op=0x4B (DEC [E]BX)
               *
               * @this {X86CPU}
               */
              X86.opDECBX = function DECBX()
              {
                  this.regEBX = X86.fnDECr.call(this, this.regEBX);
              };
              
              /**
               * op=0x4C (DEC [E]SP)
               *
               * @this {X86CPU}
               */
              X86.opDECSP = function DECSP()
              {
                  this.setSP(X86.fnDECr.call(this, this.getSP()));
              };
              
              /**
               * op=0x4D (DEC [E]BP)
               *
               * @this {X86CPU}
               */
              X86.opDECBP = function DECBP()
              {
                  this.regEBP = X86.fnDECr.call(this, this.regEBP);
              };
              
              /**
               * op=0x4E (DEC [E]SI)
               *
               * @this {X86CPU}
               */
              X86.opDECSI = function DECSI()
              {
                  this.regESI = X86.fnDECr.call(this, this.regESI);
              };
              
              /**`
               * op=0x4F (DEC [E]DI)
               *
               * @this {X86CPU}
               */
              X86.opDECDI = function DECDI()
              {
                  this.regEDI = X86.fnDECr.call(this, this.regEDI);
              };
              
              /**
               * op=0x50 (PUSH [E]AX)
               *
               * @this {X86CPU}
               */
              X86.opPUSHAX = function PUSHAX()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                  }
                  this.pushWord(this.regEAX & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x51 (PUSH [E]CX)
               *
               * @this {X86CPU}
               */
              X86.opPUSHCX = function PUSHCX()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
                  }
                  this.pushWord(this.regECX & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x52 (PUSH [E]DX)
               *
               * @this {X86CPU}
               */
              X86.opPUSHDX = function PUSHDX()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
                  }
                  this.pushWord(this.regEDX & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x53 (PUSH [E]BX)
               *
               * @this {X86CPU}
               */
              X86.opPUSHBX = function PUSHBX()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
                  }
                  this.pushWord(this.regEBX & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x54 (PUSH SP)
               *
               * @this {X86CPU}
               */
              X86.opPUSHSP_8086 = function PUSHSP_8086()
              {
                  var w = (this.getSP() - 2) & 0xffff;
                  this.pushWord(w);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x54 (PUSH [E]SP)
               *
               * @this {X86CPU}
               */
              X86.opPUSHSP = function PUSHSP()
              {
                  this.pushWord(this.getSP() & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x55 (PUSH [E]BP)
               *
               * @this {X86CPU}
               */
              X86.opPUSHBP = function PUSHBP()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
                  }
                  this.pushWord(this.regEBP & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x56 (PUSH [E]SI)
               *
               * @this {X86CPU}
               */
              X86.opPUSHSI = function PUSHSI()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
                  }
                  this.pushWord(this.regESI & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x57 (PUSH [E]DI)
               *
               * @this {X86CPU}
               */
              X86.opPUSHDI = function PUSHDI()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
                  }
                  this.pushWord(this.regEDI & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x58 (POP [E]AX)
               *
               * @this {X86CPU}
               */
              X86.opPOPAX = function POPAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x59 (POP [E]CX)
               *
               * @this {X86CPU}
               */
              X86.opPOPCX = function POPCX()
              {
                  this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5A (POP [E]DX)
               *
               * @this {X86CPU}
               */
              X86.opPOPDX = function POPDX()
              {
                  this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5B (POP [E]BX)
               *
               * @this {X86CPU}
               */
              X86.opPOPBX = function POPBX()
              {
                  this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5C (POP [E]SP)
               *
               * @this {X86CPU}
               */
              X86.opPOPSP = function POPSP()
              {
                  this.setSP((this.getSP() & ~this.dataMask) | this.popWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5D (POP [E]BP)
               *
               * @this {X86CPU}
               */
              X86.opPOPBP = function POPBP()
              {
                  this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5E (POP [E]SI)
               *
               * @this {X86CPU}
               */
              X86.opPOPSI = function POPSI()
              {
                  this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x5F (POP [E]DI)
               *
               * @this {X86CPU}
               */
              X86.opPOPDI = function POPDI()
              {
                  this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x60 (PUSHA) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opPUSHA = function PUSHA()
              {
                  /*
                   * TODO: regLSP needs to be pre-bounds-checked against regLSPLimitLow
                   */
                  var temp = this.getSP() & this.dataMask;
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                  }
                  this.pushWord(this.regEAX & this.dataMask);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
                  }
                  this.pushWord(this.regECX & this.dataMask);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
                  }
                  this.pushWord(this.regEDX & this.dataMask);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
                  }
                  this.pushWord(this.regEBX & this.dataMask);
                  this.pushWord(temp);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
                  }
                  this.pushWord(this.regEBP & this.dataMask);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
                  }
                  this.pushWord(this.regESI & this.dataMask);
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
                  }
                  this.pushWord(this.regEDI & this.dataMask);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushAll;
              };
              
              /**
               * op=0x61 (POPA) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opPOPA = function POPA()
              {
                  this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                  }
                  this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                  }
                  this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                  }
                  /*
                   * TODO: regLSP needs to be pre-bounds-checked against regLSPLimit at the start
                   */
                  this.setSP(this.getSP() + this.dataSize);
                  // this.regLSP += (I386? this.dataSize : 2);
                  this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                  }
                  this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                  }
                  this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                  }
                  this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopAll;
              };
              
              /**
               * op=0x62 (BOUND reg,word) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opBOUND = function BOUND()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBOUND);
              };
              
              /**
               * op=0x63 (ARPL word,reg) (80286 and up)
               *
               * @this {X86CPU}
               */
              X86.opARPL = function ARPL()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnARPL);
              };
              
              /**
               * op=0x64 (FS:)
               *
               * @this {X86CPU}
               */
              X86.opFS = function FS()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segFS;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                  this.stopCPU();
              };
              
              /**
               * op=0x65 (GS:)
               *
               * @this {X86CPU}
               */
              X86.opGS = function GS()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                  this.segData = this.segStack = this.segGS;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                  this.stopCPU();
              };
              
              /**
               * op=0x66 (OS:) (80386 and up)
               *
               * TODO: Review other effective operand-size criteria, cycle count, etc.
               *
               * @this {X86CPU}
               */
              X86.opOS = function OS()
              {
                  if (I386) {
                      this.opFlags |= X86.OPFLAG.DATASIZE;
                      this.dataSize ^= 0x6;               // that which is 2 shall become 4, and vice versa
                      this.dataMask ^= (0xffff0000|0);    // that which is 0x0000ffff shall become 0xffffffff, and vice versa
                      this.updateDataSize();
                      this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                  }
              };
              
              /**
               * op=0x67 (AS:) (80386 and up)
               *
               * TODO: Review other effective address-size criteria, cycle count, etc.
               *
               * @this {X86CPU}
               */
              X86.opAS = function AS()
              {
                  if (I386) {
                      this.opFlags |= X86.OPFLAG.ADDRSIZE;
                      this.addrSize ^= 0x06;              // that which is 2 shall become 4, and vice versa
                      this.addrMask ^= (0xffff0000|0);    // that which is 0x0000ffff shall become 0xffffffff, and vice versa
                      this.updateAddrSize();
                      this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                  }
              };
              
              /**
               * op=0x68 (PUSH imm) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opPUSHn = function PUSHn()
              {
                  this.pushWord(this.getIPWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x69 (IMUL reg,word,imm) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opIMULn = function IMULn()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMULn);
              };
              
              /**
               * op=0x6A (PUSH imm8) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opPUSH8 = function PUSH8()
              {
                  if (BACKTRACK) this.backTrack.btiMemHi = 0;
                  this.pushWord(this.getIPByte());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x6B (IMUL reg,word,imm8) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opIMUL8 = function IMUL8()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMUL8);
              };
              
              /**
               * op=0x6C (INSB) (80186/80188 and up)
               *
               * NOTE: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opINSb = function INSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
              
                  /*
                   * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                   * an unrepeated INS, and 8 + 8n for a repeated INS.  However, accurate cycle times for the 80186/80188 is
                   * low priority.
                   */
                  var nCycles = 5;
              
                  /*
                   * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                   */
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                  }
              
                  if (nReps--) {
                      var b = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - nDelta - 1);
                      if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiIO;
                      this.setSOByte(this.segES, this.regEDI & this.addrMask, b);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0x6D (INSW) (80186/80188 and up)
               *
               * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opINSw = function INSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
              
                  /*
                   * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                   * an unrepeated INS, and 8 + 8n for a repeated INS.  However, accurate cycle times for the 80186/80188 is
                   * low priority.
                   */
                  var nCycles = 5;
              
                  /*
                   * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                   */
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                  }
                  if (nReps--) {
                      var addrFrom = this.regLIP - nDelta - 1;
                      var w = 0, shift = 0;
                      for (var n = 0; n < this.dataSize; n++) {
                          w |= this.bus.checkPortInputNotify(this.regEDX, addrFrom) << shift;
                          shift += 8;
                          if (BACKTRACK) {
                              if (!n) {
                                  this.backTrack.btiMemLo = this.backTrack.btiIO;
                              } else if (n == 1) {
                                  this.backTrack.btiMemHi = this.backTrack.btiIO;
                              }
                          }
                      }
                      this.setSOWord(this.segES, this.regEDI & this.addrMask, w);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0x6E (OUTSB) (80186/80188 and up)
               *
               * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opOUTSb = function OUTSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
              
                  /*
                   * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                   * an unrepeated INS, and 8 + 8n for a repeated INS.  TODO: Fix this someday.
                   */
                  var nCycles = 5;
              
                  /*
                   * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                   */
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                  }
                  if (nReps--) {
                      var b = this.getSOByte(this.segDS, this.regESI & this.addrMask);
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiMemLo;
                      this.bus.checkPortOutputNotify(this.regEDX, b, this.regLIP - nDelta - 1);
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0x6F (OUTSW) (80186/80188 and up)
               *
               * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opOUTSw = function OUTSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
              
                  /*
                   * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                   * an unrepeated INS, and 8 + 8n for a repeated INS.  TODO: Fix this someday.
                   */
                  var nCycles = 5;
              
                  /*
                   * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                   */
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                  }
                  if (nReps--) {
                      var w = this.getSOWord(this.segDS, this.regESI & this.addrMask);
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      var addrFrom = this.regLIP - nDelta - 1, shift = 0;
                      for (var n = 0; n < this.dataSize; n++) {
                          if (BACKTRACK) {
                              if (!n) {
                                  this.backTrack.btiIO = this.backTrack.btiMemLo;
                              } else if (n == 1) {
                                  this.backTrack.btiIO = this.backTrack.btiMemHi;
                              }
                          }
                          this.bus.checkPortOutputNotify(this.regEDX, (w >> shift) & 0xff, addrFrom);
                          shift += 8;
                      }
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0x70 (JO disp)
               *
               * @this {X86CPU}
               */
              X86.opJO = function JO()
              {
                  var disp = this.getIPDisp();
                  if (this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x71 (JNO disp)
               *
               * @this {X86CPU}
               */
              X86.opJNO = function JNO()
              {
                  var disp = this.getIPDisp();
                  if (!this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x72 (JC disp, aka JB disp)
               *
               * @this {X86CPU}
               */
              X86.opJC = function JC()
              {
                  var disp = this.getIPDisp();
                  if (this.getCF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x73 (JNC disp, aka JAE disp)
               *
               * @this {X86CPU}
               */
              X86.opJNC = function JNC()
              {
                  var disp = this.getIPDisp();
                  if (!this.getCF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x74 (JZ disp)
               *
               * @this {X86CPU}
               */
              X86.opJZ = function JZ()
              {
                  var disp = this.getIPDisp();
                  if (this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x75 (JNZ disp)
               *
               * @this {X86CPU}
               */
              X86.opJNZ = function JNZ()
              {
                  var disp = this.getIPDisp();
                  if (!this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x76 (JBE disp)
               *
               * @this {X86CPU}
               */
              X86.opJBE = function JBE()
              {
                  var disp = this.getIPDisp();
                  if (this.getCF() || this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x77 (JNBE disp, JA disp)
               *
               * @this {X86CPU}
               */
              X86.opJNBE = function JNBE()
              {
                  var disp = this.getIPDisp();
                  if (!this.getCF() && !this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x78 (JS disp)
               *
               * @this {X86CPU}
               */
              X86.opJS = function JS()
              {
                  var disp = this.getIPDisp();
                  if (this.getSF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x79 (JNS disp)
               *
               * @this {X86CPU}
               */
              X86.opJNS = function JNS()
              {
                  var disp = this.getIPDisp();
                  if (!this.getSF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7A (JP disp)
               *
               * @this {X86CPU}
               */
              X86.opJP = function JP()
              {
                  var disp = this.getIPDisp();
                  if (this.getPF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7B (JNP disp)
               *
               * @this {X86CPU}
               */
              X86.opJNP = function JNP()
              {
                  var disp = this.getIPDisp();
                  if (!this.getPF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7C (JL disp)
               *
               * @this {X86CPU}
               */
              X86.opJL = function JL()
              {
                  var disp = this.getIPDisp();
                  if (!this.getSF() != !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7D (JNL disp, aka JGE disp)
               *
               * @this {X86CPU}
               */
              X86.opJNL = function JNL()
              {
                  var disp = this.getIPDisp();
                  if (!this.getSF() == !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7E (JLE disp)
               *
               * @this {X86CPU}
               */
              X86.opJLE = function JLE()
              {
                  var disp = this.getIPDisp();
                  if (this.getZF() || !this.getSF() != !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x7F (JNLE disp, aka JG disp)
               *
               * @this {X86CPU}
               */
              X86.opJNLE = function JNLE()
              {
                  var disp = this.getIPDisp();
                  if (!this.getZF() && !this.getSF() == !this.getOF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
              };
              
              /**
               * op=0x80/0x82 (GRP1 byte,imm8)
               *
               * @this {X86CPU}
               */
              X86.opGRP1b = function GRP1b()
              {
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp1b, this.getIPByte);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
              };
              
              /**
               * op=0x81 (GRP1 word,imm)
               *
               * @this {X86CPU}
               */
              X86.opGRP1w = function GRP1w()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPWord);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
              };
              
              /**
               * op=0x83 (GRP1 word,disp)
               *
               * @this {X86CPU}
               */
              X86.opGRP1sw = function GRP1sw()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPDisp);
                  this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
              };
              
              /**
               * op=0x84 (TEST reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opTESTrb = function TESTrb()
              {
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnTESTb);
              };
              
              /**
               * op=0x85 (TEST reg,word)
               *
               * @this {X86CPU}
               */
              X86.opTESTrw = function TESTrw()
              {
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnTESTw);
              };
              
              /**
               * op=0x86 (XCHG reg,byte)
               *
               * NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
               * see fnXCHGrb() for how we deal with this special case.
               *
               * @this {X86CPU}
               */
              X86.opXCHGrb = function XCHGrb()
              {
                  /*
                   * If the second operand is a register, then the ModRegByte decoder must use separate "get" and
                   * "set" assignments, otherwise instructions like "XCHG DH,DL" will end up using a stale DL instead of
                   * the updated DL.
                   *
                   * To be clear, a single assignment like this will fail:
                   *
                   *      opModRegByteF2: function(fn)
              {
                   *          this.regEDX = (this.regEDX & 0xff) | (fn.call(this, this.regEDX >> 8, this.regEDX & 0xff) << 8);
                   *      }
                   *
                   * which is why all affected decoders now use separate assignments; eg:
                   *
                   *      opModRegByteF2: function(fn)
              {
                   *          var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
                   *          this.regEDX = (this.regEDX & 0xff) | (b << 8);
                   *      }
                   */
                  this.aOpModRegByte[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrb);
              };
              
              /**
               * op=0x87 (XCHG reg,word)
               *
               * NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
               * see fnXCHGrw() for how we deal with this special case.
               *
               * @this {X86CPU}
               */
              X86.opXCHGrw = function XCHGrw()
              {
                  this.aOpModRegWord[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrw);
              };
              
              /**
               * op=0x88 (MOV byte,reg)
               *
               * @this {X86CPU}
               */
              X86.opMOVmb = function MOVmb()
              {
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModMemByte[this.getIPByte()].call(this, X86.fnMOV);
              };
              
              /**
               * op=0x89 (MOV word,reg)
               *
               * @this {X86CPU}
               */
              X86.opMOVmw = function MOVmw()
              {
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModMemWord[this.getIPByte()].call(this, X86.fnMOV);
              };
              
              /**
               * op=0x8A (MOV reg,byte)
               *
               * @this {X86CPU}
               */
              X86.opMOVrb = function MOVrb()
              {
                  this.aOpModRegByte[this.getIPByte()].call(this, X86.fnMOV);
              };
              
              /**
               * op=0x8B (MOV reg,word)
               *
               * @this {X86CPU}
               */
              X86.opMOVrw = function MOVrw()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnMOV);
              };
              
              /**
               * op=0x8C (MOV word,sreg)
               *
               * NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
               * the appropriate segment register into a special variable (regXX), which our helper function
               * (fnMOVxx) will use to replace the decoder's src operand.
               *
               * @this {X86CPU}
               */
              X86.opMOVwsr = function MOVwsr()
              {
                  var bModRM = this.getIPByte();
                  var reg = (bModRM & 0x38) >> 3;
                  switch (reg) {
                  case 0x0:
                      this.regXX = this.segES.sel;
                      break;
                  case 0x1:
                      this.regXX = this.segCS.sel;
                      break;
                  case 0x2:
                      this.regXX = this.segSS.sel;
                      break;
                  case 0x3:
                      this.regXX = this.segDS.sel;
                      break;
                  case 0x4:
                      if (I386 && this.model >= X86.MODEL_80386) {
                          this.regXX = this.segFS.sel;
                          break;
                      }
                      X86.opInvalid.call(this);
                      break;
                  case 0x5:
                      if (I386 && this.model >= X86.MODEL_80386) {
                          this.regXX = this.segGS.sel;
                          break;
                      }
                      /* falls through */
                  default:
                      X86.opInvalid.call(this);
                      break;
                  }
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModMemWord[bModRM].call(this, X86.fnMOVxx);
              };
              
              /**
               * op=0x8D (LEA reg,word)
               *
               * @this {X86CPU}
               */
              X86.opLEA = function LEA()
              {
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.segData = this.segStack = this.segNULL;    // we can't have the EA calculation, if any, "polluted" by segment arithmetic
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLEA);
              };
              
              /**
               * op=0x8E (MOV sreg,word)
               *
               * NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to
               * make a note of which general-purpose register will be overwritten, so that we can restore it
               * after moving the modified value to the correct segment register.
               *
               * @this {X86CPU}
               */
              X86.opMOVsrw = function MOVsrw()
              {
                  var temp;
                  var bModRM = this.getIPByte();
                  var reg = (bModRM & 0x38) >> 3;
                  switch(reg) {
                  case 0x0:
                      temp = this.regEAX;
                      break;
                  case 0x2:
                      temp = this.regEDX;
                      break;
                  case 0x3:
                      temp = this.regEBX;
                      break;
                  default:
                      if (this.model == X86.MODEL_80286 || this.model == X86.MODEL_80386 && reg != 0x4 && reg != 0x5) {
                          X86.opInvalid.call(this);
                          return;
                      }
                      switch(reg) {
                      case 0x1:           // MOV to CS is undocumented on 8086/8088/80186/80188, and invalid on 80286 and up
                          temp = this.regECX;
                          break;
                      case 0x4:           // this form of MOV to ES is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses FS starting with 80386
                          temp = this.getSP();
                          break;
                      case 0x5:           // this form of MOV to CS is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses GS starting with 80386
                          temp = this.regEBP;
                          break;
                      case 0x6:           // this form of MOV to SS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
                          temp = this.regESI;
                          break;
                      case 0x7:           // this form of MOV to DS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
                          temp = this.regEDI;
                          break;
                      default:
                          break;
                      }
                      break;
                  }
                  this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
                  switch (reg) {
                  case 0x0:
                      this.setES(this.regEAX);
                      this.regEAX = temp;
                      break;
                  case 0x1:
                      this.setCS(this.regECX);
                      this.regECX = temp;
                      break;
                  case 0x2:
                      this.setSS(this.regEDX);
                      this.regEDX = temp;
                      break;
                  case 0x3:
                      this.setDS(this.regEBX);
                      this.regEBX = temp;
                      break;
                  case 0x4:
                      if (I386 && this.model >= X86.MODEL_80386) {
                          this.setFS(this.getSP());
                      } else {
                          this.setES(this.getSP());
                      }
                      this.setSP(temp);
                      break;
                  case 0x5:
                      if (I386 && this.model >= X86.MODEL_80386) {
                          this.setGS(this.regEBP);
                      } else {
                          this.setCS(this.regEBP);
                      }
                      this.regEBP = temp;
                      break;
                  case 0x6:
                      this.setSS(this.regESI);
                      this.regESI = temp;
                      break;
                  case 0x7:
                      this.setDS(this.regEDI);
                      this.regEDI = temp;
                      break;
                  }
              };
              
              /**
               * op=0x8F (POP word)
               *
               * @this {X86CPU}
               */
              X86.opPOPmw = function POPmw()
              {
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpPOPw, this.popWord);
              };
              
              /**
               * op=0x90 (NOP, aka XCHG AX,AX)
               *
               * @this {X86CPU}
               */
              X86.opNOP = function NOP()
              {
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x91 (XCHG AX,CX)
               *
               * @this {X86CPU}
               */
              X86.opXCHGCX = function XCHGCX()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regECX & this.dataMask) : this.regECX);
                  this.regECX = (I386? (this.regECX & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiCL = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiCH; this.backTrack.btiCH = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x92 (XCHG AX,DX)
               *
               * @this {X86CPU}
               */
              X86.opXCHGDX = function XCHGDX()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDX & this.dataMask) : this.regEDX);
                  this.regEDX = (I386? (this.regEDX & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiDL = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDH; this.backTrack.btiDH = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x93 (XCHG AX,BX)
               *
               * @this {X86CPU}
               */
              X86.opXCHGBX = function XCHGBX()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBX & this.dataMask) : this.regEBX);
                  this.regEBX = (I386? (this.regEBX & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiBL = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBH; this.backTrack.btiBH = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x94 (XCHG AX,SP)
               *
               * @this {X86CPU}
               */
              X86.opXCHGSP = function XCHGSP()
              {
                  var temp = this.regEAX;
                  var regESP = this.getSP();
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (regESP & this.dataMask) : regESP);
                  this.setSP((I386? (regESP & ~this.dataMask) | (temp & this.dataMask) : temp));
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH = 0;
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x95 (XCHG AX,BP)
               *
               * @this {X86CPU}
               */
              X86.opXCHGBP = function XCHGBP()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBP & this.dataMask) : this.regEBP);
                  this.regEBP = (I386? (this.regEBP & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiBPLo = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBPHi; this.backTrack.btiBPHi = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x96 (XCHG AX,SI)
               *
               * @this {X86CPU}
               */
              X86.opXCHGSI = function XCHGSI()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regESI & this.dataMask) : this.regESI);
                  this.regESI = (I386? (this.regESI & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiSILo = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiSIHi; this.backTrack.btiSIHi = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x97 (XCHG AX,DI)
               *
               * @this {X86CPU}
               */
              X86.opXCHGDI = function XCHGDI()
              {
                  var temp = this.regEAX;
                  this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDI & this.dataMask) : this.regEDI);
                  this.regEDI = (I386? (this.regEDI & ~this.dataMask) | (temp & this.dataMask) : temp);
                  if (BACKTRACK) {
                      temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiDILo = temp;
                      temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDIHi; this.backTrack.btiDIHi = temp;
                  }
                  this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
              };
              
              /**
               * op=0x98 (CBW/CWDE)
               *
               * NOTE: The 16-bit form (CBW) sign-extends AL into AX, whereas the 32-bit form (CWDE) sign-extends AX into EAX;
               * CWDE is similar to CWD, except that the destination is EAX rather than DX:AX.
               *
               * @this {X86CPU}
               */
              X86.opCBW = function CBW()
              {
                  if (this.dataSize == 2) {   // CBW
                      this.regEAX = (this.regEAX & ~0xffff) | (((this.regEAX << 24) >> 24) & 0xffff);
                      if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                  }
                  else {                      // CWDE
                      this.regEAX = ((this.regEAX << 16) >> 16);
                  }
                  this.nStepCycles -= 2;                          // CBW takes 2 cycles on all CPUs through 80286
              };
              
              /**
               * op=0x99 (CWD/CDQ)
               *
               * NOTE: The 16-bit form (CWD) sign-extends AX, producing a 32-bit result in DX:AX, while the 32-bit form (CDQ)
               * sign-extends EAX, producing a 64-bit result in EDX:EAX.
               *
               * @this {X86CPU}
               */
              X86.opCWD = function CWD()
              {
                  if (this.dataSize == 2) {   // CWD
                      this.regEDX = (this.regEDX & ~0xffff) | ((this.regEAX & 0x8000)? 0xffff : 0);
                      if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH = this.backTrack.btiAH;
                  }
                  else {                      // CDQ
                      this.regEDX = (this.regEAX & (0x80000000|0))? -1 : 0;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesCWD;
              };
              
              /**
               * op=0x9A (CALL seg:off)
               *
               * @this {X86CPU}
               */
              X86.opCALLF = function CALLF()
              {
                  X86.fnCALLF.call(this, this.getIPWord(), this.getIPShort());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesCallF;
              };
              
              /**
               * op=0x9B (WAIT)
               *
               * @this {X86CPU}
               */
              X86.opWAIT = function WAIT()
              {
                  this.printMessage("WAIT not implemented");
                  this.nStepCycles--;
              };
              
              /**
               * op=0x9C (PUSHF)
               *
               * @this {X86CPU}
               */
              X86.opPUSHF = function PUSHF()
              {
                  this.pushWord(this.getPS());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
              };
              
              /**
               * op=0x9D (POPF)
               *
               * @this {X86CPU}
               */
              X86.opPOPF = function POPF()
              {
                  this.setPS(this.popWord());
                  /*
                   * NOTE: I'm assuming that neither POPF nor IRET are required to set NOINTR like STI does.
                   */
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
              };
              
              /**
               * op=0x9E (SAHF)
               *
               * @this {X86CPU}
               */
              X86.opSAHF = function SAHF()
              {
                  /*
                   * NOTE: While it make seem more efficient to do this:
                   *
                   *      this.setPS((this.getPS() & ~X86.PS_SAHF) | ((this.regEAX >> 8) & X86.PS_SAHF));
                   *
                   * getPS() forces any "cached" flags to be resolved first, and setPS() must do extra work above
                   * and beyond setting the arithmetic and logical flags, so on balance, the code below may be more
                   * efficient, and may also avoid unexpected side-effects of updating the entire PS register.
                   */
                  var ah = (this.regEAX >> 8) & 0xff;
                  if (ah & X86.PS.CF) this.setCF(); else this.clearCF();
                  if (ah & X86.PS.PF) this.setPF(); else this.clearPF();
                  if (ah & X86.PS.AF) this.setAF(); else this.clearAF();
                  if (ah & X86.PS.ZF) this.setZF(); else this.clearZF();
                  if (ah & X86.PS.SF) this.setSF(); else this.clearSF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
                  this.assert((this.getPS() & X86.PS_SAHF) == (ah & X86.PS_SAHF));
              };
              
              /**
               * op=0x9F (LAHF)
               *
               * @this {X86CPU}
               */
              X86.opLAHF = function LAHF()
              {
                  this.regEAX = (this.regEAX & ~0xff00) | (this.getPS() & X86.PS_SAHF) << 8;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xA0 (MOV AL,mem)
               *
               * @this {X86CPU}
               */
              X86.opMOVALm = function MOVALm()
              {
                  this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.getIPAddr());
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
              };
              
              /**
               * op=0xA1 (MOV [E]AX,mem)
               *
               * @this {X86CPU}
               */
              X86.opMOVAXm = function MOVAXm()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.getIPAddr());
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
              };
              
              /**
               * op=0xA2 (MOV mem,AL)
               *
               * @this {X86CPU}
               */
              X86.opMOVmAL = function MOVmAL()
              {
                  if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
                  /*
                   * setSOByte() truncates the value as appropriate
                   */
                  this.setSOByte(this.segData, this.getIPAddr(), this.regEAX);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
              };
              
              /**
               * op=0xA3 (MOV mem,AX)
               *
               * @this {X86CPU}
               */
              X86.opMOVmAX = function MOVmAX()
              {
                  if (BACKTRACK) {
                      this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                  }
                  /*
                   * setSOWord() truncates the value as appropriate
                   */
                  this.setSOWord(this.segData, this.getIPAddr(), this.regEAX);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
              };
              
              /**
               * op=0xA4 (MOVSB)
               *
               * @this {X86CPU}
               */
              X86.opMOVSb = function MOVSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesMovS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesMovSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
                  }
                  if (nReps--) {
                      var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
                      this.setSOByte(this.segES, this.regEDI & this.addrMask, this.getSOByte(this.segData, this.regESI));
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xA5 (MOVSW)
               *
               * @this {X86CPU}
               */
              X86.opMOVSw = function MOVSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesMovS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesMovSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
                  }
                  if (nReps--) {
                      var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
                      this.setSOWord(this.segES, this.regEDI & this.addrMask, this.getSOWord(this.segData, this.regESI));
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xA6 (CMPSB)
               *
               * @this {X86CPU}
               */
              X86.opCMPSb = function CMPSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesCmpS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesCmpSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
                  }
                  if (nReps--) {
                      var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
                      var bDst = this.getEAByte(this.segData, this.regESI & this.addrMask);
                      var bSrc = this.modEAByte(this.segES, this.regEDI & this.addrMask);
                      X86.fnCMPb.call(this, bDst, bSrc);
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                      /*
                       * NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
                       */
                      this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      /*
                       * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                       * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                       * two values are equal, we must continue.
                       */
                      if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xA7 (CMPSW)
               *
               * @this {X86CPU}
               */
              X86.opCMPSw = function CMPSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesCmpS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesCmpSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
                  }
                  if (nReps--) {
                      var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
                      var wDst = this.getEAWord(this.segData, this.regESI & this.addrMask);
                      var wSrc = this.modEAWord(this.segES, this.regEDI & this.addrMask);
                      X86.fnCMPw.call(this, wDst, wSrc);
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                      /*
                       * NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
                       */
                      this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      /*
                       * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                       * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                       * two values are equal, we must continue.
                       */
                      if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xA8 (TEST AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opTESTALb = function TESTALb()
              {
                  this.setLogicResult(this.regEAX & this.getIPByte(), X86.RESULT.BYTE);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
              };
              
              /**
               * op=0xA9 (TEST [E]AX,imm)
               *
               * @this {X86CPU}
               */
              X86.opTESTAX = function TESTAX()
              {
                  this.setLogicResult(this.regEAX & this.getIPWord(), this.dataType);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
              };
              
              /**
               * op=0xAA (STOSB)
               *
               * NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opSTOSb = function STOSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesStoS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesStoSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
                  }
                  if (nReps--) {
                      if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
                      this.setSOByte(this.segES, this.regEDI & this.addrMask, this.regEAX);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xAB (STOSW)
               *
               * NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
               *
               * @this {X86CPU}
               */
              X86.opSTOSw = function STOSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesStoS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesStoSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
                  }
                  if (nReps--) {
                      /*
                       * NOTE: Storing a word imposes another 4-cycle penalty on the 8088, so consider that
                       * if you think the cycle times here are too high.
                       */
                      if (BACKTRACK) {
                          this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                      }
                      this.setSOWord(this.segES, this.regEDI & this.addrMask, this.regEAX);
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xAC (LODSB)
               *
               * @this {X86CPU}
               */
              X86.opLODSb = function LODSb()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesLodS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesLodSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
                  }
                  if (nReps--) {
                      this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.regESI & this.addrMask);
                      if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xAD (LODSW)
               *
               * @this {X86CPU}
               */
              X86.opLODSw = function LODSw()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesLodS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesLodSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
                  }
                  if (nReps--) {
                      this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.regESI & this.addrMask);
                      if (BACKTRACK) {
                          this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                      }
                      this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                      this.nStepCycles -= nCycles;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      if (nReps) {
                          if (BUGS_8086) {
                              this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xAE (SCASB)
               *
               * @this {X86CPU}
               */
              X86.opSCASb = function SCASb()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesScaS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesScaSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
                  }
                  if (nReps--) {
                      X86.fnCMPb.call(this, this.regEAX & 0xff, this.modEAByte(this.segES, this.regEDI & this.addrMask));
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                      /*
                       * NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
                       */
                      this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      /*
                       * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                       * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                       * two values are equal, we must continue.
                       */
                      if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xAF (SCASW)
               *
               * @this {X86CPU}
               */
              X86.opSCASw = function SCASw()
              {
                  var nReps = 1;
                  var nDelta = 0;
                  var nCycles = this.cycleCounts.nOpCyclesScaS;
                  if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                      nReps = this.regECX & this.addrMask;
                      nDelta = 1;
                      nCycles = this.cycleCounts.nOpCyclesScaSrn;
                      if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
                  }
                  if (nReps--) {
                      X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.modEAWord(this.segES, this.regEDI & this.addrMask));
                      this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                      /*
                       * NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
                       */
                      this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                      this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                      /*
                       * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                       * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                       * two values are equal, we must continue.
                       */
                      if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                          if (BUGS_8086) {
                              this.rewindIP(-2);              // this instruction does not support multiple overrides
                              this.assert(this.regLIP == this.opLIP);
                          } else {
                              this.regLIP = this.opLIP;
                          }
                          this.opFlags |= X86.OPFLAG.REPEAT;
                      }
                  }
              };
              
              /**
               * op=0xB0 (MOV AL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVALb = function MOVALb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | this.getIPByte();
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB1 (MOV CL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVCLb = function MOVCLb()
              {
                  this.regECX = (this.regECX & ~0xff) | this.getIPByte();
                  if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB2 (MOV DL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVDLb = function MOVDLb()
              {
                  this.regEDX = (this.regEDX & ~0xff) | this.getIPByte();
                  if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB3 (MOV BL,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVBLb = function MOVBLb()
              {
                  this.regEBX = (this.regEBX & ~0xff) | this.getIPByte();
                  if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB4 (MOV AH,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVAHb = function MOVAHb()
              {
                  this.regEAX = (this.regEAX & 0xff) | (this.getIPByte() << 8);
                  if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB5 (MOV CH,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVCHb = function MOVCHb()
              {
                  this.regECX = (this.regECX & 0xff) | (this.getIPByte() << 8);
                  if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB6 (MOV DH,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVDHb = function MOVDHb()
              {
                  this.regEDX = (this.regEDX & 0xff) | (this.getIPByte() << 8);
                  if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB7 (MOV BH,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVBHb = function MOVBHb()
              {
                  this.regEBX = (this.regEBX & 0xff) | (this.getIPByte() << 8);
                  if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiMemLo;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB8 (MOV [E]AX,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVAX = function MOVAX()
              {
                  this.regEAX = (this.regEAX & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xB9 (MOV [E]CX,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVCX = function MOVCX()
              {
                  this.regECX = (this.regECX & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBA (MOV [E]DX,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVDX = function MOVDX()
              {
                  this.regEDX = (this.regEDX & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBB (MOV [E]BX,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVBX = function MOVBX()
              {
                  this.regEBX = (this.regEBX & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBC (MOV [E]SP,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVSP = function MOVSP()
              {
                  this.setSP((this.getSP() & ~this.dataMask) | this.getIPWord());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBD (MOV [E]BP,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVBP = function MOVBP()
              {
                  this.regEBP = (this.regEBP & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBE (MOV [E]SI,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVSI = function MOVSI()
              {
                  this.regESI = (this.regESI & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xBF (MOV [E]DI,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVDI = function MOVDI()
              {
                  this.regEDI = (this.regEDI & ~this.dataMask) | this.getIPWord();
                  if (BACKTRACK) {
                      this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
              };
              
              /**
               * op=0xC0 (GRP2 byte,imm8) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opGRP2bn = function GRP2bn()
              {
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountN);
              };
              
              /**
               * op=0xC1 (GRP2 word,imm) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opGRP2wn = function GRP2wn()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountN);
              };
              
              /**
               * op=0xC2 (RET n)
               *
               * @this {X86CPU}
               */
              X86.opRETn = function RETn()
              {
                  var n = this.getIPShort() << (this.dataSize >> 2);
                  var newIP = this.popWord();
                  if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                  this.setIP(newIP);
                  if (n) this.setSP(this.getSP() + n);            // TODO: optimize
                  this.nStepCycles -= this.cycleCounts.nOpCyclesRetn;
              };
              
              /**
               * op=0xC3 (RET)
               *
               * @this {X86CPU}
               */
              X86.opRET = function RET()
              {
                  var newIP = this.popWord();
                  if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                  this.setIP(newIP);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesRet;
              };
              
              /**
               * op=0xC4 (LES reg,word)
               *
               * This is like a "MOV reg,rm" operation, but it also loads ES from the next word.
               *
               * @this {X86CPU}
               */
              X86.opLES = function LES()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLES);
              };
              
              /**
               * op=0xC5 (LDS reg,word)
               *
               * This is like a "MOV reg,rm" operation, but it also loads DS from the next word.
               *
               * @this {X86CPU}
               */
              X86.opLDS = function LDS()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLDS);
              };
              
              /**
               * op=0xC6 (MOV byte,imm8)
               *
               * @this {X86CPU}
               */
              X86.opMOVb = function MOVb()
              {
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPByte);
              };
              
              /**
               * op=0xC7 (MOV word,imm)
               *
               * @this {X86CPU}
               */
              X86.opMOVw = function MOVw()
              {
                  /*
                   * Like other MOV operations, the destination does not need to be read, just written.
                   */
                  this.opFlags |= X86.OPFLAG.NOREAD;
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPWord);
              };
              
              /**
               * op=0xC8 (ENTER imm16,imm8) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opENTER = function ENTER()
              {
                  var wLocal = this.getIPShort();
                  var bLevel = this.getIPByte() & 0x1f;
                  /*
                   * NOTE: 11 is the minimum cycle time for the 80286; the 80186/80188 has different cycle times: 15, 25 and
                   * 22 + 16 * (bLevel - 1) for bLevel 0, 1 and > 1, respectively.  TODO: Fix this someday.
                   */
                  this.nStepCycles -= 11;
                  this.pushWord(this.regEBP);
                  var wFrame = this.getSP() & this.dataMask;
                  if (bLevel > 0) {
                      this.nStepCycles -= (bLevel << 2) + (bLevel > 1? 1 : 0);
                      while (--bLevel) {
                          this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regEBP - this.dataSize) & this.dataMask);
                          this.pushWord(this.getSOWord(this.segSS, this.regEBP & this.dataMask));
                      }
                      this.pushWord(wFrame);
                  }
                  this.regEBP = (this.regEBP & ~this.dataMask) | wFrame;
                  this.setSP((this.getSP() & ~this.segSS.addrMask) | ((this.getSP() - wLocal) & this.segSS.addrMask));
              };
              
              /**
               * op=0xC9 (LEAVE) (80186/80188 and up)
               *
               * @this {X86CPU}
               */
              X86.opLEAVE = function LEAVE()
              {
                  this.setSP((this.getSP() & ~this.segSS.addrMask) | (this.regEBP & this.segSS.addrMask));
                  this.regEBP = (this.regEBP & ~this.dataMask) | (this.popWord() & this.dataMask);
                  /*
                   * NOTE: 5 is the cycle time for the 80286; the 80186/80188 has a cycle time of 8.  TODO: Fix this someday.
                   */
                  this.nStepCycles -= 5;
              };
              
              /**
               * op=0xCA (RETF n)
               *
               * @this {X86CPU}
               */
              X86.opRETFn = function RETFn()
              {
                  X86.fnRETF.call(this, this.getIPShort());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesRetFn;
              };
              
              /**
               * op=0xCB (RETF)
               *
               * @this {X86CPU}
               */
              X86.opRETF = function RETF()
              {
                  X86.fnRETF.call(this, 0);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesRetF;
              };
              
              /**
               * op=0xCC (INT 3)
               *
               * @this {X86CPU}
               */
              X86.opINT3 = function INT3()
              {
                  X86.fnINT.call(this, X86.EXCEPTION.BREAKPOINT, null, this.cycleCounts.nOpCyclesInt3D);
              };
              
              /**
               * op=0xCD (INT n)
               *
               * @this {X86CPU}
               */
              X86.opINTn = function INTn()
              {
                  var nInt = this.getIPByte();
                  if (this.checkIntNotify(nInt)) {
                      X86.fnINT.call(this, nInt, null, 0);
                      return;
                  }
                  this.nStepCycles--;     // we don't need to assess the full cost of nOpCyclesInt, but we need to assess something...
              };
              
              /**
               * op=0xCE (INTO: INT 4 if OF set)
               *
               * @this {X86CPU}
               */
              X86.opINTO = function INTO()
              {
                  if (this.getOF()) {
                      X86.fnINT.call(this, X86.EXCEPTION.OVERFLOW, null, this.cycleCounts.nOpCyclesIntOD);
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesIntOFall;
              };
              
              /**
               * op=0xCF (IRET)
               *
               * @this {X86CPU}
               */
              X86.opIRET = function IRET()
              {
                  X86.fnIRET.call(this);
              };
              
              /**
               * op=0xD0 (GRP2 byte,1)
               *
               * @this {X86CPU}
               */
              X86.opGRP2b1 = function GRP2b1()
              {
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCount1);
              };
              
              /**
               * op=0xD1 (GRP2 word,1)
               *
               * @this {X86CPU}
               */
              X86.opGRP2w1 = function GRP2w1()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCount1);
              };
              
              /**
               * op=0xD2 (GRP2 byte,CL)
               *
               * @this {X86CPU}
               */
              X86.opGRP2bCL = function GRP2bCL()
              {
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountCL);
              };
              
              /**
               * op=0xD3 (GRP2 word,CL)
               *
               * @this {X86CPU}
               */
              X86.opGRP2wCL = function GRP2wCL()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountCL);
              };
              
              /**
               * op=0xD4 0x0A (AAM)
               *
               * From "The 8086 Book":
               *
               *  1. Divide AL by 0x0A; store the quotient in AH and the remainder in AL
               *  2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
               *
               * @this {X86CPU}
               */
              X86.opAAM = function AAM()
              {
                  var bDivisor = this.getIPByte();
                  if (!bDivisor) {
                      /*
                       * TODO: Generate a divide-by-zero exception, if appropriate for the current CPU
                       */
                      return;
                  }
                  var AL = this.regEAX & 0xff;
                  this.regEAX = (this.regEAX & ~0xffff) | ((AL / bDivisor) << 8) | (AL % bDivisor);
                  /*
                   * setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
                   */
                  this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAM;
              };
              
              /**
               * op=0xD5 (AAD)
               *
               * From "The 8086 Book":
               *
               *  1. Multiply AH by 0x0A, add AH to AL, and store 0x00 in AH
               *  2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
               *
               * @this {X86CPU}
               */
              X86.opAAD = function AAD()
              {
                  var bMultiplier = this.getIPByte();
                  this.regEAX = (this.regEAX & ~0xffff) | (((((this.regEAX >> 8) & 0xff) * bMultiplier) + this.regEAX) & 0xff);
                  /*
                   * setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
                   */
                  this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesAAD;
              };
              
              /**
               * op=0xD6 (SALC aka SETALC) (undocumented until Pentium Pro)
               *
               * Sets AL to 0xFF if CF=1, 0x00 otherwise; no flags are affected (similar to SBB AL,AL, but without side-effects)
               *
               * WARNING: I have no idea how many clocks this instruction originally required, so for now, I'm going with a minimum of 2.
               *
               * @this {X86CPU}
               */
              X86.opSALC = function SALC()
              {
                  this.regEAX = (this.regEAX & ~0xff) | (this.getCF()? 0xFF : 0);
                  this.nStepCycles -= 2;
              };
              
              /**
               * op=0xD7 (XLAT)
               *
               * @this {X86CPU}
               */
              X86.opXLAT = function XLAT()
              {
                  /*
                   * NOTE: I have no idea whether XLAT actually wraps the 16-bit address calculation;
                   * I'm masking it as if it does, but I need to run a test on real hardware to be sure.
                   */
                  this.regEAX = (this.regEAX & ~0xff) | this.getEAByte(this.segData, ((this.regEBX + (this.regEAX & 0xff)) & 0xffff));
                  this.nStepCycles -= this.cycleCounts.nOpCyclesXLAT;
              };
              
              /**
               * op=0xD8-0xDF (ESC)
               *
               * @this {X86CPU}
               */
              X86.opESC = function ESC()
              {
                  this.aOpModRegWord[this.getIPByte()].call(this, X86.fnESC);
                  this.nStepCycles -= 8;      // TODO: Fix
              };
              
              /**
               * op=0xE0 (LOOPNZ disp)
               *
               * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
               * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
               * even though it seems counter-intuitive; ditto for the REP prefix.
               *
               * @this {X86CPU}
               */
              X86.opLOOPNZ = function LOOPNZ()
              {
                  var disp = this.getIPDisp();
                  if ((this.regECX = (this.regECX - 1) & this.addrMask) && !this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesLoopNZ;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
              };
              
              /**
               * op=0xE1 (LOOPZ disp)
               *
               * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
               * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
               * even though it seems counter-intuitive; ditto for the REP prefix.
               *
               * @this {X86CPU}
               */
              X86.opLOOPZ = function LOOPZ()
              {
                  var disp = this.getIPDisp();
                  if ((this.regECX = (this.regECX - 1) & this.addrMask) && this.getZF()) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
              };
              
              /**
               * op=0xE2 (LOOP disp)
               *
               * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
               * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
               * even though it seems counter-intuitive; ditto for the REP prefix.
               *
               * @this {X86CPU}
               */
              X86.opLOOP = function LOOP()
              {
                  var disp = this.getIPDisp();
                  if ((this.regECX = (this.regECX - 1) & this.addrMask)) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesLoop;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
              };
              
              /**
               * op=0xE3 (JCXZ/JECXZ disp)
               *
               * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
               * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
               * even though it seems counter-intuitive; ditto for the REP prefix.
               *
               * @this {X86CPU}
               */
              X86.opJCXZ = function JCXZ()
              {
                  var disp = this.getIPDisp();
                  if (!(this.regECX & this.addrMask)) {
                      this.setIP(this.getIP() + disp);
                      this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
                      return;
                  }
                  this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
              };
              
              /**
               * op=0xE4 (IN AL,port)
               *
               * @this {X86CPU}
               */
              X86.opINb = function INb()
              {
                  var port = this.getIPByte();
                  this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(port, this.regLIP - 2);
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
              };
              
              /**
               * op=0xE5 (IN AX,port)
               *
               * @this {X86CPU}
               */
              X86.opINw = function INw()
              {
                  var port = this.getIPByte();
                  this.regEAX = this.bus.checkPortInputNotify(port, this.regLIP - 2);
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                  this.regEAX |= (this.bus.checkPortInputNotify((port + 1) & 0xffff, this.regLIP - 2) << 8);
                  if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
              };
              
              /**
               * op=0xE6 (OUT port,AL)
               *
               * @this {X86CPU}
               */
              X86.opOUTb = function OUTb()
              {
                  var port = this.getIPByte();
                  this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
              };
              
              /**
               * op=0xE7 (OUT port,AX)
               *
               * @this {X86CPU}
               */
              X86.opOUTw = function OUTw()
              {
                  var port = this.getIPByte();
                  this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
                  this.bus.checkPortOutputNotify((port + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 2);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
              };
              
              /**
               * op=0xE8 (CALL disp16)
               *
               * @this {X86CPU}
               */
              X86.opCALL = function CALL()
              {
                  var disp = this.getIPWord();
                  var oldIP = this.getIP();
                  var newIP = oldIP + disp;
                  if (DEBUG) this.printMessage("calling " + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                  this.pushWord(oldIP);
                  this.setIP(newIP);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesCall;
              };
              
              /**
               * op=0xE9 (JMP disp16)
               *
               * @this {X86CPU}
               */
              X86.opJMP = function JMP()
              {
                  var disp = this.getIPWord();
                  this.setIP(this.getIP() + disp);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
              };
              
              /**
               * op=0xEA (JMP seg:off)
               *
               * @this {X86CPU}
               */
              X86.opJMPF = function JMPF()
              {
                  this.setCSIP(this.getIPWord(), this.getIPShort());
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmpF;
              };
              
              /**
               * op=0xEB (JMP short disp8)
               *
               * @this {X86CPU}
               */
              X86.opJMPs = function JMPs()
              {
                  var disp = this.getIPDisp();
                  this.setIP(this.getIP() + disp);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
              };
              
              /**
               * op=0xEC (IN AL,dx)
               *
               * @this {X86CPU}
               */
              X86.opINDXb = function INDXb()
              {
                  this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
              };
              
              /**
               * op=0xED (IN AX,dx)
               *
               * @this {X86CPU}
               */
              X86.opINDXw = function INDXw()
              {
                  this.regEAX = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
                  if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                  this.regEAX |= (this.bus.checkPortInputNotify((this.regEDX + 1) & 0xffff, this.regLIP - 1) << 8);
                  if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
              };
              
              /**
               * op=0xEE (OUT dx,AL)
               *
               * @this {X86CPU}
               */
              X86.opOUTDXb = function OUTDXb()
              {
                  if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
                  this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
              };
              
              /**
               * op=0xEF (OUT dx,AX)
               *
               * @this {X86CPU}
               */
              X86.opOUTDXw = function OUTDXw()
              {
                  if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
                  this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
                  if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAH;
                  this.bus.checkPortOutputNotify((this.regEDX + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 1);
                  this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
              };
              
              /**
               * op=0xF0 (LOCK:)
               *
               * @this {X86CPU}
               */
              X86.opLOCK = function LOCK()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with LOCK is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.LOCK | X86.OPFLAG.NOINTR;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0xF1 (INT1; undocumented; 80186/80188 and up; TODO: Verify)
               *
               * I still treat this as undefined, until I can verify the behavior on real hardware.
               *
               * @this {X86CPU}
               */
              X86.opINT1 = function INT1()
              {
                  X86.opUndefined.call(this);
              };
              
              /**
               * op=0xF2 (REPNZ:) (repeat CMPS or SCAS until NZ; repeat MOVS, LODS, or STOS unconditionally)
               *
               * @this {X86CPU}
               */
              X86.opREPNZ = function REPNZ()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with REPNZ is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.REPNZ | X86.OPFLAG.NOINTR;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0xF3 (REPZ:) (repeat CMPS or SCAS until Z; repeat MOVS, LODS, or STOS unconditionally)
               *
               * @this {X86CPU}
               */
              X86.opREPZ = function REPZ()
              {
                  /*
                   * NOTE: The fact that we're setting NOINTR along with REPZ is really just for documentation purposes;
                   * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                   */
                  this.opFlags |= X86.OPFLAG.REPZ | X86.OPFLAG.NOINTR;
                  this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
              };
              
              /**
               * op=0xF4 (HLT)
               *
               * @this {X86CPU}
               */
              X86.opHLT = function HLT()
              {
                  /*
                   * The CPU is never REALLY halted by a HLT instruction; instead, by setting X86.INTFLAG.HALT,
                   * we are signalling to stepCPU() that it's free to end the current burst AND that it should not
                   * execute any more instructions until checkINTR() indicates a hardware interrupt is requested.
                   */
                  this.intFlags |= X86.INTFLAG.HALT;
                  this.nStepCycles -= 2;
                  /*
                   * If a Debugger is present and the HALT message category is enabled, then we REALLY halt the CPU,
                   * on the theory that whoever's using the Debugger would like to see HLTs.
                   */
                  if (DEBUGGER && this.dbg && this.messageEnabled(Messages.HALT)) {
                      this.rewindIP(-1);      // this is purely for the Debugger's benefit, to show the HLT
                      this.stopCPU();
                      return;
                  }
                  /*
                   * We also REALLY halt the machine if interrupts have been disabled, since that means it's dead
                   * in the water (we have no NMI generation mechanism at the moment).
                   */
                  if (!this.getIF()) {
                      if (DEBUGGER && this.dbg) this.rewindIP(-1);
                      this.stopCPU();
                  }
              };
              
              /**
               * op=0xF5 (CMC)
               *
               * @this {X86CPU}
               */
              X86.opCMC = function CMC()
              {
                  if (this.getCF()) this.clearCF(); else this.setCF();
                  this.nStepCycles -= 2;                          // CMC takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xF6 (GRP3 byte)
               *
               * The MUL byte instruction is problematic in two cases:
               *
               *      0xF6 0xE0:  MUL AL
               *      0xF6 0xE4:  MUL AH
               *
               * because the OpModGrpByte decoder function will attempt to put the fnMULb() function's
               * return value back into AL or AH, undoing fnMULb's update of AX.  And since fnMULb doesn't
               * know what the target is (only the target's value), it cannot easily work around the problem.
               *
               * A simple, albeit kludgy, solution is for fnMULb to always save its result in a special
               * "register" (eg, regMDLo), which we will then put back into regEAX if it's been updated.
               * This also relieves us from having to decode any part of the ModRM byte, so maybe it's not
               * such a bad work-around after all.
               *
               * Similar issues with IMUL (and DIV and IDIV) are resolved using the same special variable(s).
               *
               * @this {X86CPU}
               */
              X86.opGRP3b = function GRP3b()
              {
                  this.fMDSet = false;
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp3b, X86.fnSrcNone);
                  if (this.fMDSet) this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
              };
              
              /**
               * op=0xF7 (GRP3 word)
               *
               * The MUL word instruction is problematic in two cases:
               *
               *      0xF7 0xE0:  MUL AX
               *      0xF7 0xE2:  MUL DX
               *
               * because the OpModGrpWord decoder function will attempt to put the fnMULw() function's
               * return value back into AX or DX, undoing fnMULw's update of DX:AX.  And since fnMULw doesn't
               * know what the target is (only the target's value), it cannot easily work around the problem.
               *
               * A simple, albeit kludgey, solution is for fnMULw to always save its result in a special
               * "register" (eg, regMDLo/regMDHi), which we will then put back into regEAX/regEDX if it's been
               * updated.  This also relieves us from having to decode any part of the ModRM byte, so maybe
               * it's not such a bad work-around after all.
               *
               * @this {X86CPU}
               */
              X86.opGRP3w = function GRP3w()
              {
                  this.fMDSet = false;
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp3w, X86.fnSrcNone);
                  if (this.fMDSet) {
                      this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
                      this.regEDX = (this.regEDX & ~this.dataMask) | (this.regMDHi & this.dataMask);
                  }
              };
              
              /**
               * op=0xF8 (CLC)
               *
               * @this {X86CPU}
               */
              X86.opCLC = function CLC()
              {
                  this.clearCF();
                  this.nStepCycles -= 2;                          // CLC takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xF9 (STC)
               *
               * @this {X86CPU}
               */
              X86.opSTC = function STC()
              {
                  this.setCF();
                  this.nStepCycles -= 2;                          // STC takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xFA (CLI)
               *
               * @this {X86CPU}
               */
              X86.opCLI = function CLI()
              {
                  this.clearIF();
                  this.nStepCycles -= this.cycleCounts.nOpCyclesCLI;   // CLI takes LONGER on an 80286
              };
              
              /**
               * op=0xFB (STI)
               *
               * @this {X86CPU}
               */
              X86.opSTI = function STI()
              {
                  this.setIF();
                  this.opFlags |= X86.OPFLAG.NOINTR;
                  this.nStepCycles -= 2;                          // STI takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xFC (CLD)
               *
               * @this {X86CPU}
               */
              X86.opCLD = function CLD()
              {
                  this.clearDF();
                  this.nStepCycles -= 2;                          // CLD takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xFD (STD)
               *
               * @this {X86CPU}
               */
              X86.opSTD = function STD()
              {
                  this.setDF();
                  this.nStepCycles -= 2;                          // STD takes 2 cycles on all CPUs
              };
              
              /**
               * op=0xFE (GRP4 byte)
               *
               * @this {X86CPU}
               */
              X86.opGRP4b = function GRP4b()
              {
                  this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp4b, X86.fnSrcNone);
              };
              
              /**
               * op=0xFF (GRP4 word)
               *
               * @this {X86CPU}
               */
              X86.opGRP4w = function GRP4w()
              {
                  this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp4w, X86.fnSrcNone);
              };
              
              /**
               * opInvalid()
               *
               * @this {X86CPU}
               */
              X86.opInvalid = function opInvalid()
              {
                  X86.fnFault.call(this, X86.EXCEPTION.UD_FAULT);
                  this.stopCPU();
              };
              
              /**
               * opUndefined()
               *
               * @this {X86CPU}
               */
              X86.opUndefined = function opUndefined()
              {
                  this.setIP(this.opLIP - this.segCS.base);
                  this.setError("Undefined opcode " + str.toHexByte(this.bus.getByteDirect(this.regLIP)) + " at " + str.toHexLong(this.regLIP));
                  this.stopCPU();
              };
              
              /**
               * opTBD()
               *
               * @this {X86CPU}
               */
              X86.opTBD = function opTBD()
              {
                  this.setIP(this.opLIP - this.segCS.base);
                  this.printMessage("unimplemented 80386 opcode", true);
                  this.stopCPU();
              };
              
              /*
               * This 256-entry array of opcode functions is at the heart of the CPU engine: stepCPU(n).
               *
               * It might be worth trying a switch() statement instead, to see how the performance compares,
               * but I suspect that would vary quite a bit across JavaScript engines; for now, I'm putting my
               * money on array lookup.
               */
              X86.aOps = [
                  X86.opADDmb,            X86.opADDmw,            X86.opADDrb,            X86.opADDrw,        // 0x00-0x03
                  X86.opADDALb,           X86.opADDAX,            X86.opPUSHES,           X86.opPOPES,        // 0x04-0x07
                  X86.opORmb,             X86.opORmw,             X86.opORrb,             X86.opORrw,         // 0x08-0x0B
                  X86.opORALb,            X86.opORAX,             X86.opPUSHCS,           X86.opPOPCS,        // 0x0C-0x0F
                  X86.opADCmb,            X86.opADCmw,            X86.opADCrb,            X86.opADCrw,        // 0x10-0x13
                  X86.opADCALb,           X86.opADCAX,            X86.opPUSHSS,           X86.opPOPSS,        // 0x14-0x17
                  X86.opSBBmb,            X86.opSBBmw,            X86.opSBBrb,            X86.opSBBrw,        // 0x18-0x1B
                  X86.opSBBALb,           X86.opSBBAX,            X86.opPUSHDS,           X86.opPOPDS,        // 0x1C-0x1F
                  X86.opANDmb,            X86.opANDmw,            X86.opANDrb,            X86.opANDrw,        // 0x20-0x23
                  X86.opANDAL,            X86.opANDAX,            X86.opES,               X86.opDAA,          // 0x24-0x27
                  X86.opSUBmb,            X86.opSUBmw,            X86.opSUBrb,            X86.opSUBrw,        // 0x28-0x2B
                  X86.opSUBALb,           X86.opSUBAX,            X86.opCS,               X86.opDAS,          // 0x2C-0x2F
                  X86.opXORmb,            X86.opXORmw,            X86.opXORrb,            X86.opXORrw,        // 0x30-0x33
                  X86.opXORALb,           X86.opXORAX,            X86.opSS,               X86.opAAA,          // 0x34-0x37
                  X86.opCMPmb,            X86.opCMPmw,            X86.opCMPrb,            X86.opCMPrw,        // 0x38-0x3B
                  X86.opCMPALb,           X86.opCMPAX,            X86.opDS,               X86.opAAS,          // 0x3C-0x3F
                  X86.opINCAX,            X86.opINCCX,            X86.opINCDX,            X86.opINCBX,        // 0x40-0x43
                  X86.opINCSP,            X86.opINCBP,            X86.opINCSI,            X86.opINCDI,        // 0x44-0x47
                  X86.opDECAX,            X86.opDECCX,            X86.opDECDX,            X86.opDECBX,        // 0x48-0x4B
                  X86.opDECSP,            X86.opDECBP,            X86.opDECSI,            X86.opDECDI,        // 0x4C-0x4F
                  X86.opPUSHAX,           X86.opPUSHCX,           X86.opPUSHDX,           X86.opPUSHBX,       // 0x50-0x53
                  X86.opPUSHSP_8086,      X86.opPUSHBP,           X86.opPUSHSI,           X86.opPUSHDI,       // 0x54-0x57
                  X86.opPOPAX,            X86.opPOPCX,            X86.opPOPDX,            X86.opPOPBX,        // 0x58-0x5B
                  X86.opPOPSP,            X86.opPOPBP,            X86.opPOPSI,            X86.opPOPDI,        // 0x5C-0x5F
                  /*
                   * On an 8086/8088, opcodes 0x60-0x6F are aliases for the conditional jumps 0x70-0x7F.  Sometimes you'll see
                   * references to these opcodes (like 0x60) being a "two-byte NOP" and using them differentiate an 8088 from newer
                   * CPUs, but they're only a "two-byte NOP" if the second byte is zero, resulting in zero displacement.
                   */
                  X86.opJO,               X86.opJNO,              X86.opJC,               X86.opJNC,          // 0x60-0x63
                  X86.opJZ,               X86.opJNZ,              X86.opJBE,              X86.opJNBE,         // 0x64-0x67
                  X86.opJS,               X86.opJNS,              X86.opJP,               X86.opJNP,          // 0x68-0x6B
                  X86.opJL,               X86.opJNL,              X86.opJLE,              X86.opJNLE,         // 0x6C-0x6F
                  X86.opJO,               X86.opJNO,              X86.opJC,               X86.opJNC,          // 0x70-0x73
                  X86.opJZ,               X86.opJNZ,              X86.opJBE,              X86.opJNBE,         // 0x74-0x77
                  X86.opJS,               X86.opJNS,              X86.opJP,               X86.opJNP,          // 0x78-0x7B
                  X86.opJL,               X86.opJNL,              X86.opJLE,              X86.opJNLE,         // 0x7C-0x7F
                  /*
                   * On all processors, opcode groups 0x80 and 0x82 perform identically (0x82 opcodes sign-extend their
                   * immediate data, but since both 0x80 and 0x82 are byte operations, the sign extension has no effect).
                   *
                   * WARNING: Intel's "Pentium Processor User's Manual (Volume 3: Architecture and Programming Manual)" refers
                   * to opcode 0x82 as a "reserved" instruction, but also cryptically refers to it as "MOVB AL,imm".  This is
                   * assumed to be an error in the manual, because as far as I know, 0x82 has always mirrored 0x80.
                   */
                  X86.opGRP1b,            X86.opGRP1w,            X86.opGRP1b,            X86.opGRP1sw,       // 0x80-0x83
                  X86.opTESTrb,           X86.opTESTrw,           X86.opXCHGrb,           X86.opXCHGrw,       // 0x84-0x87
                  X86.opMOVmb,            X86.opMOVmw,            X86.opMOVrb,            X86.opMOVrw,        // 0x88-0x8B
                  X86.opMOVwsr,           X86.opLEA,              X86.opMOVsrw,           X86.opPOPmw,        // 0x8C-0x8F
                  X86.opNOP,              X86.opXCHGCX,           X86.opXCHGDX,           X86.opXCHGBX,       // 0x90-0x93
                  X86.opXCHGSP,           X86.opXCHGBP,           X86.opXCHGSI,           X86.opXCHGDI,       // 0x94-0x97
                  X86.opCBW,              X86.opCWD,              X86.opCALLF,            X86.opWAIT,         // 0x98-0x9B
                  X86.opPUSHF,            X86.opPOPF,             X86.opSAHF,             X86.opLAHF,         // 0x9C-0x9F
                  X86.opMOVALm,           X86.opMOVAXm,           X86.opMOVmAL,           X86.opMOVmAX,       // 0xA0-0xA3
                  X86.opMOVSb,            X86.opMOVSw,            X86.opCMPSb,            X86.opCMPSw,        // 0xA4-0xA7
                  X86.opTESTALb,          X86.opTESTAX,           X86.opSTOSb,            X86.opSTOSw,        // 0xA8-0xAB
                  X86.opLODSb,            X86.opLODSw,            X86.opSCASb,            X86.opSCASw,        // 0xAC-0xAF
                  X86.opMOVALb,           X86.opMOVCLb,           X86.opMOVDLb,           X86.opMOVBLb,       // 0xB0-0xB3
                  X86.opMOVAHb,           X86.opMOVCHb,           X86.opMOVDHb,           X86.opMOVBHb,       // 0xB4-0xB7
                  X86.opMOVAX,            X86.opMOVCX,            X86.opMOVDX,            X86.opMOVBX,        // 0xB8-0xBB
                  X86.opMOVSP,            X86.opMOVBP,            X86.opMOVSI,            X86.opMOVDI,        // 0xBC-0xBF
                  /*
                   * On an 8086/8088, opcodes 0xC0 -> 0xC2, 0xC1 -> 0xC3, 0xC8 -> 0xCA and 0xC9 -> 0xCB.
                   */
                  X86.opRETn,             X86.opRET,              X86.opRETn,             X86.opRET,          // 0xC0-0xC3
                  X86.opLES,              X86.opLDS,              X86.opMOVb,             X86.opMOVw,         // 0xC4-0xC7
                  X86.opRETFn,            X86.opRETF,             X86.opRETFn,            X86.opRETF,         // 0xC8-0xCB
                  X86.opINT3,             X86.opINTn,             X86.opINTO,             X86.opIRET,         // 0xCC-0xCF
                  X86.opGRP2b1,           X86.opGRP2w1,           X86.opGRP2bCL,          X86.opGRP2wCL,      // 0xD0-0xD3
                  /*
                   * Even as of the Pentium, opcode 0xD6 is still marked as "reserved", but it's always been SALC (aka SETALC).
                   */
                  X86.opAAM,              X86.opAAD,              X86.opSALC,             X86.opXLAT,         // 0xD4-0xD7
                  X86.opESC,              X86.opESC,              X86.opESC,              X86.opESC,          // 0xD8-0xDB
                  X86.opESC,              X86.opESC,              X86.opESC,              X86.opESC,          // 0xDC-0xDF
                  X86.opLOOPNZ,           X86.opLOOPZ,            X86.opLOOP,             X86.opJCXZ,         // 0xE0-0xE3
                  X86.opINb,              X86.opINw,              X86.opOUTb,             X86.opOUTw,         // 0xE4-0xE7
                  X86.opCALL,             X86.opJMP,              X86.opJMPF,             X86.opJMPs,         // 0xE8-0xEB
                  X86.opINDXb,            X86.opINDXw,            X86.opOUTDXb,           X86.opOUTDXw,       // 0xEC-0xEF
                  /*
                   * On an 8086/8088, opcode 0xF1 is believed to be an alias for 0xF0; in any case, it definitely behaves like
                   * a prefix on those processors, so we treat it as such.  On the 80186 and up, we treat as opINT1().
                   *
                   * As of the Pentium, opcode 0xF1 is still marked "reserved".
                   */
                  X86.opLOCK,             X86.opLOCK,             X86.opREPNZ,            X86.opREPZ,         // 0xF0-0xF3
                  X86.opHLT,              X86.opCMC,              X86.opGRP3b,            X86.opGRP3w,        // 0xF4-0xF7
                  X86.opCLC,              X86.opSTC,              X86.opCLI,              X86.opSTI,          // 0xF8-0xFB
                  X86.opCLD,              X86.opSTD,              X86.opGRP4b,            X86.opGRP4w         // 0xFC-0xFF
              ];
              
              /*
               * A word (or two) on instruction groups (eg, Grp1, Grp2), which are groups of instructions that
               * use a mod/reg/rm byte, where the reg field of that byte selects a function rather than a register.
               *
               * I start with the groupings used by Intel's "Pentium Processor User's Manual (Volume 3: Architecture
               * and Programming Manual)", but I deviate slightly, mostly by subdividing their groups with letter suffixes:
               *
               *      Opcodes     Intel       PCjs                                                PC Mag TechRef
               *      -------     -----       ----                                                --------------
               *      0x80-0x83   Grp1        Grp1b and Grp1w                                     Group A
               *      0xC0-0xC1   Grp2        Grp2b and Grp2w (opGRP2bn/wn)                       Group B
               *      0xD0-0xD3   Grp2        Grp2b and Grp2w (opGRP2b1/w1 and opGRP2bCL/wCL)     Group B
               *      0xF6-0xF7   Grp3        Grp3b and Grp3w                                     Group C
               *      0xFE        Grp4        Grp4b                                               Group D
               *      0xFF        Grp5        Grp4w                                               Group E
               *      0x0F,0x00   Grp6        Grp6 (SLDT, STR, LLDT, LTR, VERR, VERW)             Group F
               *      0x0F,0x01   Grp7        Grp7 (SGDT, SIDT, LGDT, LIDT, SMSW, LMSW, INVLPG)   Group G
               *      0x0F,0xBA   Grp8        Grp8 (BT, BTS, BTR, BTC)                            Group H
               *      0x0F,0xC7   Grp9        Grp9 (CMPXCH)                                       (N/A, 80486 and up)
               *
               * My only serious deviation is Grp5, which I refer to as Grp4w, because it contains word forms of
               * the INC and DEC instructions found in Grp4b.  Granted, Grp4w also contains versions of the CALL,
               * JMP and PUSH instructions, which are not in Grp4b, but there's nothing in Grp4b that conflicts with
               * Grp4w, so I think my nomenclature makes more sense.  To compensate, I don't use Grp5, so that the
               * remaining group numbers remain in sync with Intel's.
               *
               * To the above list, I've added a few "single-serving" groups: opcode 0x8F uses GrpPOPw, and opcodes 0xC6/0xC7
               * use GrpMOVn.  In both of these groups, the only valid (documented) instruction is where reg=0x0.
               *
               * TODO: Test what happens on real hardware when the reg field is non-zero for opcodes 0x8F and 0xC6/0xC7.
               */
              X86.aOpGrp1b = [
                  X86.fnADDb,             X86.fnORb,              X86.fnADCb,             X86.fnSBBb,             // 0x80/0x82(reg=0x0-0x3)
                  X86.fnANDb,             X86.fnSUBb,             X86.fnXORb,             X86.fnCMPb              // 0x80/0x82(reg=0x4-0x7)
              ];
              
              X86.aOpGrp1w = [
                  X86.fnADDw,             X86.fnORw,              X86.fnADCw,             X86.fnSBBw,             // 0x81/0x83(reg=0x0-0x3)
                  X86.fnANDw,             X86.fnSUBw,             X86.fnXORw,             X86.fnCMPw              // 0x81/0x83(reg=0x4-0x7)
              ];
              
              X86.aOpGrpPOPw = [
                  X86.fnPOPw,             X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault,         // 0x8F(reg=0x0-0x3)
                  X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault          // 0x8F(reg=0x4-0x7)
              ];
              
              X86.aOpGrpMOVn = [
                  X86.fnMOVn,             X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0xC6/0xC7(reg=0x0-0x3)
                  X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0xC6/0xC7(reg=0x4-0x7)
              ];
              
              X86.aOpGrp2b = [
                  X86.fnROLb,             X86.fnRORb,             X86.fnRCLb,             X86.fnRCRb,             // 0xC0/0xD0/0xD2(reg=0x0-0x3)
                  X86.fnSHLb,             X86.fnSHRb,             X86.fnGRPUndefined,     X86.fnSARb              // 0xC0/0xD0/0xD2(reg=0x4-0x7)
              ];
              
              X86.aOpGrp2w = [
                  X86.fnROLw,             X86.fnRORw,             X86.fnRCLw,             X86.fnRCRw,             // 0xC1/0xD1/0xD3(reg=0x0-0x3)
                  X86.fnSHLw,             X86.fnSHRw,             X86.fnGRPUndefined,     X86.fnSARw              // 0xC1/0xD1/0xD3(reg=0x4-0x7)
              ];
              
              X86.aOpGrp2d = [
                  X86.fnROLd,             X86.fnRORd,             X86.fnRCLd,             X86.fnRCRd,             // 0xC1/0xD1/0xD3(reg=0x0-0x3)
                  X86.fnSHLd,             X86.fnSHRd,             X86.fnGRPUndefined,     X86.fnSARd              // 0xC1/0xD1/0xD3(reg=0x4-0x7)
              ];
              
              X86.aOpGrp3b = [
                  X86.fnTEST8,            X86.fnGRPUndefined,     X86.fnNOTb,             X86.fnNEGb,             // 0xF6(reg=0x0-0x3)
                  X86.fnMULb,             X86.fnIMULb,            X86.fnDIVb,             X86.fnIDIVb             // 0xF6(reg=0x4-0x7)
              ];
              
              X86.aOpGrp3w = [
                  X86.fnTEST16,           X86.fnGRPUndefined,     X86.fnNOTw,             X86.fnNEGw,             // 0xF7(reg=0x0-0x3)
                  X86.fnMULw,             X86.fnIMULw,            X86.fnDIVw,             X86.fnIDIVw             // 0xF7(reg=0x4-0x7)
              ];
              
              X86.aOpGrp4b = [
                  X86.fnINCb,             X86.fnDECb,             X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0xFE(reg=0x0-0x3)
                  X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0xFE(reg=0x4-0x7)
              ];
              
              X86.aOpGrp4w = [
                  X86.fnINCw,             X86.fnDECw,             X86.fnCALLw,            X86.fnCALLFdw,          // 0xFF(reg=0x0-0x3)
                  X86.fnJMPw,             X86.fnJMPFdw,           X86.fnPUSHw,            X86.fnGRPFault          // 0xFF(reg=0x4-0x7)
              ];
              
            • x86seg.js
              /**
               * @fileoverview Implements PCjs X86 Segment Registers
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Sep-10
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              if (typeof module !== 'undefined') {
                  var str         = require("../../shared/lib/strlib");
                  var Messages    = require("./messages");
                  var Memory      = require("./memory");
                  var X86         = require("./x86");
              }
              
              /**
               * @class X86Seg
               * @property {number} sel
               * @property {number} limit (in protected-mode, this comes from descriptor word 0x0)
               * @property {number} base (in protected-mode, this comes from descriptor word 0x2)
               * @property {number} acc (in protected-mode, this comes from descriptor word 0x4; bits 0-7 supplement base bits 16-23)
               * @property {number} ext (in protected-mode, this is descriptor word 0x6, 80386 only; supplements limit bits 16-19 and base bits 24-31)
               *
               * TODO: Determine what good, if any, these class annotations are for either an IDE like WebStorm or a tool like
               * the Closure Compiler.  More importantly, what good do they do at runtime?  Is it better to simply ensure that all
               * object properties are explicitly initialized in the constructor, and document them there instead?
               */
              
              /**
               * X86Seg(cpu, sName)
               *
               * @constructor
               * @param {X86CPU} cpu
               * @param {number} id
               * @param {string} [sName] segment register name
               * @param {boolean} [fProt] true if segment register used exclusively in protected-mode (eg, segLDT)
               */
              function X86Seg(cpu, id, sName, fProt)
              {
                  this.cpu = cpu;
                  this.dbg = cpu.dbg;
                  this.id = id;
                  this.sName = sName || "";
                  this.sel = 0;
                  this.limit = 0xffff;
                  this.offMax = this.limit + 1;
                  this.base = 0;
                  this.acc = this.type = 0;
                  this.ext = 0;
                  this.cpl = this.dpl = 0;
                  this.addrDesc = X86.ADDR_INVALID;
                  this.dataSize = this.addrSize = 2;
                  this.dataMask = this.addrMask = 0xffff;
                  /*
                   * The following properties are used for CODE segments only (ie, segCS); if the process of loading
                   * CS also requires a stack switch, then fStackSwitch will be set to true; additionally, if the stack
                   * switch was the result of a CALL (ie, fCall is true) and one or more (up to 32) parameters are on
                   * the old stack, they will be copied to awParms, and then once the stack is switched, the parameters
                   * will be pushed from awParms onto the new stack.
                   *
                   * The typical ways of loading a new segment into CS are JMPF, CALLF (or INT), and RETF (or IRET);
                   * prior to calling segCS.load(), each of those operations must first set segCS.fCall to one of null,
                   * true, or false, respectively.
                   *
                   * It's critical that fCall be properly set prior to calling segCS.load(); fCall === null means NO
                   * privilege level transition may occur, fCall === true allows a stack switch and a privilege transition
                   * to a numerically lower privilege, and fCall === false allows a stack restore and a privilege transition
                   * to a numerically greater privilege.
                   *
                   * As long as setCSIP() or fnINT() are used for all CS changes, fCall is set automatically.
                   *
                   * TODO: Consider making fCall a parameter to load(), instead of a property that must be set prior to
                   * calling load(); the downside is that such a parameter is meaningless for segments other than segCS.
                   */
                  this.awParms = (this.id == X86Seg.ID.CODE? new Array(32) : []);
                  this.fCall = null;
                  this.fStackSwitch = false;
                  this.updateMode(true, fProt);
              }
              
              X86Seg.ID = {
                  NULL:   0,          // "NULL"
                  CODE:   1,          // "CS"
                  DATA:   2,          // "DS", "ES", "FS", "GS"
                  STACK:  3,          // "SS"
                  TSS:    4,          // "TSS"
                  LDT:    5,          // "LDT"
                  OTHER:  6,          // "VER"
                  DEBUG:  7           // "DBG"
              };
              
              /**
               * loadReal(sel, fSuppress)
               *
               * The default segment load() function for real-mode.
               *
               * @this {X86Seg}
               * @param {number} sel
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} base address of selected segment, or ADDR_INVALID if error (TODO: No error conditions yet)
               */
              X86Seg.prototype.loadReal = function loadReal(sel, fSuppress)
              {
                  this.sel = sel & 0xffff;
                  /*
                   * Loading a new value into a segment register in real-mode alters ONLY the selector and the base;
                   * all other attributes (eg, limit, operand size, address size, etc) are unchanged.  If you run any
                   * code that switches to protected-mode, loads a 32-bit code segment, and then switches back to
                   * real-mode, it is THAT code's responsibility to load a 16-bit segment into CS before returning to
                   * real-mode; otherwise, your machine will probably be toast.
                   */
                  return this.base = this.sel << 4;
              };
              
              /**
               * loadProt(sel, fSuppress)
               *
               * This replaces the segment's default load() function whenever the segment is notified via updateMode() by the
               * CPU's setProtMode() that the processor is now in protected-mode.
               *
               * Segments in protected-mode are referenced by selectors, which are indexes into descriptor tables (GDT or LDT)
               * whose descriptors are 4-word (8-byte) entries:
               *
               *      word 0: segment limit (0-15)
               *      word 1: base address low
               *      word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
               *      word 3: used only on 80386 and up (should be set to zero for upward compatibility)
               *
               * See X86.DESC for offset and bit definitions.
               *
               * IDT descriptor entries are handled separately by loadIDT(), which is mapped to loadIDTReal() or loadIDTProt().
               *
               * @this {X86Seg}
               * @param {number} sel
               * @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
               * @return {number} base address of selected segment, or ADDR_INVALID if error
               */
              X86Seg.prototype.loadProt = function loadProt(sel, fSuppress)
              {
                  var addrDT;
                  var addrDTLimit;
                  var cpu = this.cpu;
              
                  /*
                   * Some instructions (eg, CALLF) load a 32-bit value for the selector, while others (eg, LDS) do not;
                   * however, in ALL cases, only the low 16 bits are significant.
                   */
                  sel &= 0xffff;
              
                  if (!(sel & X86.SEL.LDT)) {
                      addrDT = cpu.addrGDT;
                      addrDTLimit = cpu.addrGDTLimit;
                  } else {
                      addrDT = cpu.segLDT.base;
                      addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
                  }
                  /*
                   * The ROM BIOS POST executes some test code in protected-mode without properly initializing the LDT,
                   * which has no bearing on the ROM's own code, because it never loads any LDT selectors, but if at the same
                   * time our Debugger attempts to validate a selector in one of its breakpoints, that could cause some
                   * grief here.  We avoid that grief by 1) relying on the Debugger setting fSuppress to true, and 2) skipping
                   * segment lookup if the descriptor table being referenced is zero.  Both tests are required, because
                   * there's nothing in the design of the CPU that prevents the GDT or LDT being at linear address zero.
                   */
                  if (!fSuppress || addrDT) {
                      var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
                      if ((addrDTLimit - addrDesc)|0 >= 7) {
                          /*
                           * TODO: This is the first of many steps toward accurately counting cycles in protected mode;
                           * I simply noted that "POP segreg" takes 5 cycles in real mode and 20 in protected mode, so I'm
                           * starting with a 15-cycle difference.  Obviously the difference will vary with the instruction,
                           * and will be much greater whenever the load fails.
                           */
                          if (!fSuppress) cpu.nStepCycles -= 15;
                          return this.loadDesc8(addrDesc, sel, fSuppress);
                      }
                      if (!fSuppress) {
                          X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
                      }
                  }
                  return X86.ADDR_INVALID;
              };
              
              /**
               * loadIDTReal(nIDT)
               *
               * @this {X86Seg}
               * @param {number} nIDT
               * @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
               */
              X86Seg.prototype.loadIDTReal = function loadIDTReal(nIDT)
              {
                  var cpu = this.cpu;
                  /*
                   * NOTE: The Compaq DeskPro 386 ROM loads the IDTR for the real-mode IDT with a limit of 0xffff instead
                   * of the normal 0x3ff.  A limit higher than 0x3ff is OK, since all real-mode IDT entries are 4 bytes, and
                   * there's no way to issue an interrupt with a vector > 0xff.  Just something to be aware of.
                   */
                  cpu.assert(nIDT >= 0 && nIDT < 256 && !cpu.addrIDT && cpu.addrIDTLimit >= 0x3ff);
                  /*
                   * Intel documentation for INT/INTO under "REAL ADDRESS MODE EXCEPTIONS" says:
                   *
                   *      "[T]he 80286 will shut down if the SP = 1, 3, or 5 before executing the INT or INTO instruction--due to lack of stack space"
                   *
                   * TODO: Verify that 80286 real-mode actually enforces the above.  See http://localhost:8088/pubs/pc/reference/intel/80286/progref/#page-260
                   */
                  var addrIDT = cpu.addrIDT + (nIDT << 2);
                  var off = cpu.getShort(addrIDT);
                  cpu.regPS &= ~(X86.PS.TF | X86.PS.IF);
                  return (this.load(cpu.getShort(addrIDT + 2)) + off)|0;
              };
              
              /**
               * loadIDTProt(nIDT)
               *
               * @this {X86Seg}
               * @param {number} nIDT
               * @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
               */
              X86Seg.prototype.loadIDTProt = function loadIDTProt(nIDT)
              {
                  var cpu = this.cpu;
                  cpu.assert(nIDT >= 0 && nIDT < 256);
              
                  nIDT <<= 3;
                  var addrDesc = (cpu.addrIDT + nIDT)|0;
                  if (((cpu.addrIDTLimit - addrDesc)|0) >= 7) {
                      return this.loadDesc8(addrDesc, nIDT) + cpu.regEIP;
                  }
                  X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nIDT | X86.ERRCODE.IDT | X86.ERRCODE.EXT, true);
                  return X86.ADDR_INVALID;
              };
              
              /**
               * checkReadReal(off, cb, fSuppress)
               *
               * TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
               * also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
               */
              X86Seg.prototype.checkReadReal = function checkReadReal(off, cb, fSuppress)
              {
                  return (this.base + off)|0;
              };
              
              /**
               * checkWriteReal(off, cb, fSuppress)
               *
               * TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
               * also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
               */
              X86Seg.prototype.checkWriteReal = function checkWriteReal(off, cb, fSuppress)
              {
                  return (this.base + off)|0;
              };
              
              /**
               * checkReadProt(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, or ADDR_INVALID if not
               */
              X86Seg.prototype.checkReadProt = function checkReadProt(off, cb, fSuppress)
              {
                  /*
                   * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                   * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                   */
                  if ((off >>> 0) + cb <= this.offMax) {
                      return (this.base + off)|0;
                  }
                  return this.checkReadProtDisallowed(off, cb, fSuppress);
              };
              
              /**
               * checkReadProtDown(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, ADDR_INVALID if not
               */
              X86Seg.prototype.checkReadProtDown = function checkReadProtDown(off, cb, fSuppress)
              {
                  /*
                   * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                   * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                   */
                  if ((off >>> 0) + cb > this.offMax) {
                      return (this.base + off)|0;
                  }
                  return this.checkReadProtDisallowed(off, cb, fSuppress);
              };
              
              /**
               * checkReadProtDisallowed(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, ADDR_INVALID if not
               */
              X86Seg.prototype.checkReadProtDisallowed = function checkReadProtDisallowed(off, cb, fSuppress)
              {
                  if (!fSuppress) {
                      X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
                  }
                  return X86.ADDR_INVALID;
              };
              
              /**
               * checkWriteProt(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, ADDR_INVALID if not
               */
              X86Seg.prototype.checkWriteProt = function checkWriteProt(off, cb, fSuppress)
              {
                  /*
                   * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                   * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                   */
                  if ((off >>> 0) + cb <= this.offMax) {
                      return (this.base + off)|0;
                  }
                  return this.checkWriteProtDisallowed(off, cb, fSuppress);
              };
              
              /**
               * checkWriteProtDown(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, ADDR_INVALID if not
               */
              X86Seg.prototype.checkWriteProtDown = function checkWriteProtDown(off, cb, fSuppress)
              {
                  /*
                   * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                   * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                   */
                  if ((off >>> 0) + cb > this.offMax) {
                      return (this.base + off)|0;
                  }
                  return this.checkWriteProtDisallowed(off, cb, fSuppress);
              };
              
              /**
               * checkWriteProtDisallowed(off, cb, fSuppress)
               *
               * @this {X86Seg}
               * @param {number} off is a segment-relative offset
               * @param {number} cb is number of bytes to check (1, 2 or 4)
               * @param {boolean} [fSuppress] is true to suppress any errors
               * @return {number} corresponding linear address if valid, ADDR_INVALID if not
               */
              X86Seg.prototype.checkWriteProtDisallowed = function checkWriteProtDisallowed(off, cb, fSuppress)
              {
                  if (!fSuppress) {
                      X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
                  }
                  return X86.ADDR_INVALID;
              };
              
              /**
               * loadAcc(sel, fGDT)
               *
               * @this {X86Seg}
               * @param {number} sel (protected-mode only)
               * @param {boolean} [fGDT] is true if sel must be in the GDT
               * @return {number} acc field from descriptor, or X86.DESC.ACC.INVALID if error
               */
              X86Seg.prototype.loadAcc = function(sel, fGDT)
              {
                  var addrDT;
                  var addrDTLimit;
                  var cpu = this.cpu;
              
                  if (!(sel & X86.SEL.LDT)) {
                      addrDT = cpu.addrGDT;
                      addrDTLimit = cpu.addrGDTLimit;
                  } else if (!fGDT) {
                      addrDT = cpu.segLDT.base;
                      addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
                  }
                  if (addrDT !== undefined) {
                      var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
                      if (((addrDTLimit - addrDesc)|0) >= 7) {
                          return cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
                      }
                  }
                  X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
                  return X86.DESC.ACC.INVALID;
              };
              
              /**
               * loadDesc6(addrDesc, sel)
               *
               * Used to load a protected-mode selector that refers to a 6-byte "descriptor cache" (aka LOADALL) entry:
               *
               *      word 0: base address low
               *      word 1: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
               *      word 2: segment limit (0-15)
               *
               * @this {X86Seg}
               * @param {number} addrDesc is the descriptor address
               * @param {number} sel is the associated selector
               * @return {number} base address of selected segment
               */
              X86Seg.prototype.loadDesc6 = function(addrDesc, sel)
              {
                  var cpu = this.cpu;
                  var acc = cpu.getShort(addrDesc + 2);
                  var base = cpu.getShort(addrDesc) | ((acc & 0xff) << 16);
                  var limit = cpu.getShort(addrDesc + 4);
              
                  this.sel = sel;
                  this.base = base;
                  this.limit = limit;
                  this.offMax = (limit >>> 0) + 1;
                  this.acc = acc;
                  this.type = (acc & X86.DESC.ACC.TYPE.MASK);
                  this.ext = 0;
                  this.addrDesc = addrDesc;
                  this.updateMode(true);
              
                  this.messageSeg(sel, base, limit, this.type);
              
                  return base;
              };
              
              /**
               * loadDesc8(addrDesc, sel, fSuppress)
               *
               * Used to load a protected-mode selector that refers to an 8-byte "descriptor table" (GDT, LDT, IDT) entry:
               *
               *      word 0: segment limit (0-15)
               *      word 1: base address low
               *      word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
               *      word 3: used only on 80386 and up (should be set to zero for upward compatibility)
               *
               * See X86.DESC for offset and bit definitions.
               *
               * @this {X86Seg}
               * @param {number} addrDesc is the descriptor address
               * @param {number} sel is the associated selector, or nIDT*8 if IDT descriptor
               * @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
               * @return {number} base address of selected segment, or ADDR_INVALID if error
               */
              X86Seg.prototype.loadDesc8 = function(addrDesc, sel, fSuppress)
              {
                  var cpu = this.cpu;
                  var limit = cpu.getShort(addrDesc + X86.DESC.LIMIT.OFFSET);
                  var acc = cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
                  var type = (acc & X86.DESC.ACC.TYPE.MASK);
                  var base = cpu.getShort(addrDesc + X86.DESC.BASE.OFFSET) | ((acc & X86.DESC.ACC.BASE1623) << 16);
                  var ext = cpu.getShort(addrDesc + X86.DESC.EXT.OFFSET);
                  var selMasked = sel & X86.SEL.MASK;
              
                  if (I386 && cpu.model >= X86.MODEL_80386) {
                      base |= (ext & X86.DESC.EXT.BASE2431) << 16;
                      limit |= (ext & X86.DESC.EXT.LIMIT1619) << 16;
                      if (ext & X86.DESC.EXT.LIMITPAGES) limit = (limit << 12) | 0xfff;
                  }
              
                  while (true) {
              
                      var selCode, cplPrev, addrTSS, offSP, offSS, regSPPrev, regSSPrev;
              
                      /*
                       * TODO: Consider moving the following chunks of code into worker functions for each X86Seg.ID;
                       * however, it's not clear that these tests are more costly than making additional function calls.
                       */
                      if (this.id == X86Seg.ID.CODE) {
                          this.fStackSwitch = false;
                          var fCall = this.fCall;
                          var fGate, regPSMask, nFaultError, regSP;
                          var rpl = sel & X86.SEL.RPL;
                          var dpl = (acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
              
                          if (selMasked && !(acc & X86.DESC.ACC.PRESENT)) {
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
              
                          /*
                           * Since we are X86Seg.ID.CODE, we can use this.cpl instead of the more generic cpu.segCS.cpl
                           */
                          if (type >= X86.DESC.ACC.TYPE.CODE_EXECONLY) {
                              rpl = sel & X86.SEL.RPL;
                              if (rpl > this.cpl) {
                                  /*
                                   * If fCall is false, then we must have a RETF to a less privileged segment, which is OK.
                                   *
                                   * Otherwise, we must be dealing with a CALLF or JMPF to a less privileged segment, in which
                                   * case either DPL == CPL *or* the new segment is conforming and DPL <= CPL.
                                   */
                                  if (fCall !== false && !(dpl == this.cpl || (type & X86.DESC.ACC.TYPE.CONFORMING) && dpl <= this.cpl)) {
                                      base = addrDesc = X86.ADDR_INVALID;
                                      break;
                                  }
                                  regSP = cpu.popWord();
                                  cpu.setSS(cpu.popWord(), true);
                                  cpu.setSP(regSP);
                                  this.fStackSwitch = true;
                              }
                              fGate = false;
                          }
                          else if (type == X86.DESC.ACC.TYPE.TSS) {
                              if (!this.switchTSS(sel, fCall)) {
                                  base = addrDesc = X86.ADDR_INVALID;
                                  break;
                              }
                              return this.base;
                          }
                          else if (type == X86.DESC.ACC.TYPE.GATE_CALL) {
                              fGate = true;
                              regPSMask = ~0;
                              nFaultError = sel;
                              if (rpl < this.cpl) rpl = this.cpl;     // set RPL to max(RPL,CPL) for call gates
                          }
                          else if (type == X86.DESC.ACC.TYPE.GATE_INT) {
                              fGate = true;
                              regPSMask = ~(X86.PS.NT | X86.PS.TF | X86.PS.IF);
                              nFaultError = sel | X86.ERRCODE.EXT;
                              cpu.assert(!(acc & 0x1f));
                          }
                          else if (type == X86.DESC.ACC.TYPE.GATE_TRAP) {
                              fGate = true;
                              regPSMask = ~(X86.PS.NT | X86.PS.TF);
                              nFaultError = sel | X86.ERRCODE.EXT;
                              cpu.assert(!(acc & 0x1f));
                          }
                          else if (type == X86.DESC.ACC.TYPE.GATE_TASK) {
                              if (!this.switchTSS(base & 0xffff, fCall)) {
                                  base = addrDesc = X86.ADDR_INVALID;
                                  break;
                              }
                              return this.base;
                          }
                          if (fGate) {
                              /*
                               * Note that since GATE_INT/GATE_TRAP descriptors should appear in the IDT only, that means sel
                               * will actually be nIDT * 8, which means the rpl will always be zero; additionally, the nWords
                               * portion of acc should always be zero, but that's really dependent on the descriptor being properly
                               * set (which we assert above).
                               */
                              selCode = base & 0xffff;
                              if (rpl <= dpl) {
                                  /*
                                   * TODO: Verify the PRESENT bit of the gate descriptor, and issue NP_FAULT as appropriate.
                                   */
                                  cplPrev = this.cpl;
                                  if (this.load(selCode, true) === X86.ADDR_INVALID) {
                                      cpu.assert(false);
                                      base = addrDesc = X86.ADDR_INVALID;
                                      break;
                                  }
                                  cpu.regEIP = limit;
                                  if (this.cpl < cplPrev) {
                                      if (fCall !== true) {
                                          cpu.assert(false);
                                          base = addrDesc = X86.ADDR_INVALID;
                                          break;
                                      }
                                      regSP = cpu.getSP();
                                      var i = 0, nWords = (acc & 0x1f);
                                      while (nWords--) {
                                          this.awParms[i++] = cpu.getSOWord(cpu.segSS, regSP);
                                          regSP += 2;
                                      }
                                      addrTSS = cpu.segTSS.base;
                                      offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
                                      offSS = offSP + 2;
                                      regSSPrev = cpu.getSS();
                                      regSPPrev = cpu.getSP();
                                      cpu.setSS(cpu.getShort(addrTSS + offSS), true);
                                      cpu.setSP(cpu.getShort(addrTSS + offSP));
                                      cpu.pushWord(regSSPrev);
                                      cpu.pushWord(regSPPrev);
                                      while (i) cpu.pushWord(this.awParms[--i]);
                                      this.fStackSwitch = true;
                                  }
                                  cpu.regPS &= regPSMask;
                                  return this.base;
                              }
                              cpu.assert(false);
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nFaultError, true);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                          else if (fGate !== false) {
                              cpu.assert(false);
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                      }
                      else if (this.id == X86Seg.ID.DATA) {
                          if (selMasked) {
                              if (!(acc & X86.DESC.ACC.PRESENT)) {
                                  if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
                                  base = addrDesc = X86.ADDR_INVALID;
                                  break;
                              }
                              if (type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.READABLE)) == X86.DESC.ACC.TYPE.CODE) {
                                  /*
                                   * OS/2 1.0 triggers this "Empty Descriptor" GP_FAULT multiple times during boot; eg:
                                   *
                                   *      Fault 0D (002F) on opcode 0x8E at 3190:3A05 (%112625)
                                   *      stopped (11315208 ops, 41813627 cycles, 498270 ms, 83918 hz)
                                   *      AX=0000 BX=0970 CX=0300 DX=0300 SP=0ABE BP=0ABA SI=0000 DI=001A
                                   *      DS=19C0[177300,2C5F] ES=001F[1743A0,07FF] SS=0038[175CE0,0B5F]
                                   *      CS=3190[10EC20,B89F] IP=3A05 V0 D0 I1 T0 S0 Z1 A0 P1 C0 PS=3246 MS=FFF3
                                   *      LD=0028[174BC0,003F] GD=[11A4E0,490F] ID=[11F61A,03FF]  TR=0010 A20=ON
                                   *      3190:3A05 8E4604        MOV      ES,[BP+04]
                                   *      0038:0ABE  002F  19C0  0000  067C - 07FC  0AD2  0010  C420   /.....|....... .
                                   *      dumpDesc(002F): %174BE8
                                   *      base=000000 limit=0000 dpl=00 type=00 (undefined)
                                   *
                                   * If we allow the GP fault to be dispatched, it recovers, so until I'm able to investigate this
                                   * further, I'm going to assume this is normal behavior.  If the segment (0x002F in the example)
                                   * simply needed to be "faulted" into memory, I would have expected OS/2 to build a descriptor
                                   * with the PRESENT bit clear, and rely on NP_FAULT rather than GP_FAULT, but maybe this was simpler.
                                   *
                                   * Anyway, because of this, if acc is zero, we won't set fHalt on this GP_FAULT.
                                   */
                                  if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, !!acc);
                                  base = addrDesc = X86.ADDR_INVALID;
                                  break;
                              }
                          }
                      }
                      else if (this.id == X86Seg.ID.STACK) {
                          if (!(acc & X86.DESC.ACC.PRESENT)) {
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.SS_FAULT, sel);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                          if (!selMasked || type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.WRITABLE)) != X86.DESC.ACC.TYPE.WRITABLE) {
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                      }
                      else if (this.id == X86Seg.ID.TSS) {
                          if (!selMasked || type != X86.DESC.ACC.TYPE.TSS && type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                              if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, sel, true);
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                      }
                      else if (this.id == X86Seg.ID.OTHER) {
                          /*
                           * For LSL, we must support any descriptor marked X86.DESC.ACC.TYPE.SEG, as well as TSS and LDT descriptors.
                           */
                          if (!(type & X86.DESC.ACC.TYPE.SEG) && type > X86.DESC.ACC.TYPE.TSS_BUSY) {
                              base = addrDesc = X86.ADDR_INVALID;
                              break;
                          }
                      }
                      this.sel = sel;
                      this.base = base;
                      this.limit = limit;
                      this.offMax = (limit >>> 0) + 1;
                      this.acc = acc;
                      this.type = type;
                      this.ext = ext;
                      this.addrDesc = addrDesc;
                      this.updateMode(true);
                      break;
                  }
                  if (!fSuppress) this.messageSeg(sel, base, limit, type, ext);
                  return base;
              };
              
              /**
               * switchTSS(selNew, fNest)
               *
               * Implements TSS (Task State Segment) task switching.
               *
               * NOTES: This typically occurs during double-fault processing, because the IDT entry for DF_FAULT normally
               * contains a task gate.  Interestingly, if we force a GP_FAULT to occur at a sufficiently early point in the
               * OS/2 1.0 initialization code, OS/2 does a nice job of displaying the GP fault and then shutting down:
               *
               *      0090:067B FB            STI
               *      0090:067C EBFD          JMP      067B
               *
               * but it may not have yet reprogrammed the master PIC to re-vector hardware interrupts to IDT entries 0x50-0x57,
               * so when the next timer interrupt (IRQ 0) occurs, it vectors through IDT entry 0x08, which is the DF_FAULT
               * vector. A spurious double-fault is generated, and a clean shutdown turns into a messy crash.
               *
               * Of course, that all could have been avoided if IBM had heeded Intel's advice and not used Intel-reserved IDT
               * entries for PC interrupts.
               *
               * TODO: Add 80386 TSS support (including CR3 support).
               *
               * @this {X86Seg}
               * @param {number} selNew
               * @param {boolean|null} [fNest] is true if nesting, false if un-nesting, null if neither
               * @return {boolean} true if successful, false if error
               */
              X86Seg.prototype.switchTSS = function switchTSS(selNew, fNest)
              {
                  var cpu = this.cpu;
                  cpu.assert(this === cpu.segCS);
              
                  var addrOld = cpu.segTSS.base;
                  var cplOld = this.cpl;
                  var selOld = cpu.segTSS.sel;
              
                  if (!fNest) {
                      /*
                       * TODO: Verify that it is (always) correct to require that the BUSY bit be currently set.
                       */
                      if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                          X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, selNew, true);
                          return false;
                      }
                      cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, (cpu.segTSS.acc & ~X86.DESC.ACC.TYPE.TSS_BUSY) | X86.DESC.ACC.TYPE.TSS);
                  }
              
                  if (cpu.segTSS.load(selNew) === X86.ADDR_INVALID) {
                      return false;
                  }
              
                  var addrNew = cpu.segTSS.base;
                  if (DEBUG && DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.TSS)) {
                      this.dbg.message((fNest? "Task switch" : "Task return") + ": TR " + str.toHexWord(selOld) + " (%" + str.toHex(addrOld, 6) + "), new TR " + str.toHexWord(selNew) + " (%" + str.toHex(addrNew, 6) + ")");
                  }
                  if (fNest === false) {
                      if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                          X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
                          return false;
                      }
                  } else {
                      if (cpu.segTSS.type == X86.DESC.ACC.TYPE.TSS_BUSY) {
                          X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
                          return false;
                      }
                      cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, cpu.segTSS.acc |= X86.DESC.ACC.TYPE.TSS_BUSY);
                      cpu.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
                  }
              
                  /*
                   * Update the old TSS
                   */
                  cpu.setShort(addrOld + X86.TSS.TASK_IP, cpu.getIP());
                  cpu.setShort(addrOld + X86.TSS.TASK_PS, cpu.getPS());
                  cpu.setShort(addrOld + X86.TSS.TASK_AX, cpu.regEAX);
                  cpu.setShort(addrOld + X86.TSS.TASK_CX, cpu.regECX);
                  cpu.setShort(addrOld + X86.TSS.TASK_DX, cpu.regEDX);
                  cpu.setShort(addrOld + X86.TSS.TASK_BX, cpu.regEBX);
                  cpu.setShort(addrOld + X86.TSS.TASK_SP, cpu.getSP());
                  cpu.setShort(addrOld + X86.TSS.TASK_BP, cpu.regEBP);
                  cpu.setShort(addrOld + X86.TSS.TASK_SI, cpu.regESI);
                  cpu.setShort(addrOld + X86.TSS.TASK_DI, cpu.regEDI);
                  cpu.setShort(addrOld + X86.TSS.TASK_ES, cpu.segES.sel);
                  cpu.setShort(addrOld + X86.TSS.TASK_CS, cpu.segCS.sel);
                  cpu.setShort(addrOld + X86.TSS.TASK_SS, cpu.segSS.sel);
                  cpu.setShort(addrOld + X86.TSS.TASK_DS, cpu.segDS.sel);
              
                  /*
                   * Reload all registers from the new TSS; it's important to reload the LDTR sooner
                   * rather than later, so that as segment registers are reloaded, any LDT selectors will
                   * will be located in the correct table.
                   */
                  cpu.segLDT.load(cpu.getShort(addrNew + X86.TSS.TASK_LDT));
                  cpu.setPS(cpu.getShort(addrNew + X86.TSS.TASK_PS) | (fNest? X86.PS.NT : 0));
                  cpu.assert(!fNest || !!(cpu.regPS & X86.PS.NT));
                  cpu.regEAX = cpu.getShort(addrNew + X86.TSS.TASK_AX);
                  cpu.regECX = cpu.getShort(addrNew + X86.TSS.TASK_CX);
                  cpu.regEDX = cpu.getShort(addrNew + X86.TSS.TASK_DX);
                  cpu.regEBX = cpu.getShort(addrNew + X86.TSS.TASK_BX);
                  cpu.regEBP = cpu.getShort(addrNew + X86.TSS.TASK_BP);
                  cpu.regESI = cpu.getShort(addrNew + X86.TSS.TASK_SI);
                  cpu.regEDI = cpu.getShort(addrNew + X86.TSS.TASK_DI);
                  cpu.segES.load(cpu.getShort(addrNew + X86.TSS.TASK_ES));
                  cpu.segDS.load(cpu.getShort(addrNew + X86.TSS.TASK_DS));
                  cpu.setCSIP(cpu.getShort(addrNew + X86.TSS.TASK_IP), cpu.getShort(addrNew + X86.TSS.TASK_CS));
              
                  var offSS = X86.TSS.TASK_SS;
                  var offSP = X86.TSS.TASK_SP;
                  if (this.cpl < cplOld) {
                      offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
                      offSS = offSP + 2;
                  }
                  cpu.setSS(cpu.getShort(addrNew + offSS), true);
                  cpu.setSP(cpu.getShort(addrNew + offSP));
              
                  if (fNest) cpu.setShort(addrNew + X86.TSS.PREV_TSS, selOld);
              
                  cpu.regCR0 |= X86.CR0.MSW.TS;
                  return true;
              };
              
              /**
               * setBase(addr)
               *
               * This is used in unusual situations where the base must be set independently; normally, the base
               * is set according to the selector provided to load(), but there are a few cases where setBase()
               * is required.
               *
               * For example, in resetRegs(), the real-mode CS selector must be reset to 0xF000 for an 80286 or 80386,
               * but the CS base must be set to 0x00FF0000 or 0xFFFF0000, respectively.  To simplify life for setBase()
               * callers, we allow them to specify 32-bit bases, which we then truncate to 24 bits as needed.
               *
               * WARNING: Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls
               * to segCS.setBase() need to go through setCSBase().
               *
               * @this {X86Seg}
               * @param {number} addr
               * @return {number} addr, truncated as needed
               */
              X86Seg.prototype.setBase = function(addr)
              {
                  if (this.cpu.model < X86.MODEL_80386) addr &= 0xffffff;
                  return this.base = addr;
              };
              
              /**
               * save()
               *
               * Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
               * newer versions need to save/restore all the "defining" properties of the X86Seg object.
               *
               * @this {X86Seg}
               * @return {Array}
               */
              X86Seg.prototype.save = function()
              {
                  return [
                      this.sel,
                      this.base,
                      this.limit,
                      this.acc,
                      this.id,
                      this.sName,
                      this.cpl,
                      this.dpl,
                      this.addrDesc,
                      this.addrSize,
                      this.addrMask,
                      this.dataSize,
                      this.dataMask,
                      this.type,
                      this.offMax
                  ];
              };
              
              /**
               * restore(a)
               *
               * Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
               * newer versions need to save/restore all the "defining" properties of the X86Seg object.
               *
               * @this {X86Seg}
               * @param {Array|number} a
               */
              X86Seg.prototype.restore = function(a)
              {
                  if (typeof a == "number") {
                      this.load(a);
                  } else {
                      this.sel      = a[0];
                      this.base     = a[1];
                      this.limit    = a[2];
                      this.acc      = a[3];
                      this.id       = a[4];
                      this.sName    = a[5];
                      this.cpl      = a[6];
                      this.dpl      = a[7];
                      this.addrDesc = a[8];
                      this.addrSize = a[9]  || 2;
                      this.addrMask = a[10] || 0xffff;
                      this.dataSize = a[11] || 2;
                      this.dataMask = a[12] || 0xffff;
                      this.type     = a[13] || (this.acc & X86.DESC.ACC.TYPE.MASK);
                      this.offMax   = a[14] || (this.limit >>> 0) + 1;
                  }
              };
              
              /**
               * updateMode(fLoad, fProt)
               *
               * Ensures that the segment register's access (ie, load and check methods) matches the specified (or current)
               * operating mode (real or protected).
               *
               * @this {X86Seg}
               * @param {boolean} [fLoad] true if the segment was just (re)loaded, false if not
               * @param {boolean} [fProt] true for protected-mode access, false for real-mode access, undefined for current mode
               * @return {boolean}
               */
              X86Seg.prototype.updateMode = function(fLoad, fProt)
              {
                  if (fProt === undefined) {
                      fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
                  }
              
                  /*
                   * The following properties are used for STACK segments only (ie, segSS); we want to make it easier
                   * for setSS() to set stack lower and upper limits, which requires knowing whether or not the segment is
                   * marked as EXPDOWN.
                   */
                  this.fExpDown = false;
              
                  if (fProt) {
                      this.load = this.loadProt;
                      this.loadIDT = this.loadIDTProt;
                      this.checkRead = this.checkReadProt;
                      this.checkWrite = this.checkWriteProt;
              
                      /*
                       * TODO: For null GDT selectors, should we rely on the descriptor being invalid, or should we assume that
                       * the null descriptor might contain uninitialized (or other) data?  I'm assuming the latter, hence the
                       * following null selector test.  However, if we're not going to consult the descriptor, is there anything
                       * else we should (or should not) be doing for null GDT selectors?
                       */
                      if (!(this.sel & ~X86.SEL.RPL)) {
                          this.checkRead = this.checkReadProtDisallowed;
                          this.checkWrite = this.checkWriteProtDisallowed;
              
                      }
                      else if (this.type & X86.DESC.ACC.TYPE.SEG) {
                          /*
                           * If the READABLE bit of CODE_READABLE is not set, then disallow reads.
                           */
                          if ((this.type & X86.DESC.ACC.TYPE.CODE_READABLE) == X86.DESC.ACC.TYPE.CODE_EXECONLY) {
                              this.checkRead = this.checkReadProtDisallowed;
                          }
                          /*
                           * If the CODE bit is set, or the the WRITABLE bit is not set, then disallow writes.
                           */
                          if ((this.type & X86.DESC.ACC.TYPE.CODE) || !(this.type & X86.DESC.ACC.TYPE.WRITABLE)) {
                              this.checkWrite = this.checkWriteProtDisallowed;
                          }
                          /*
                           * If the CODE bit is not set *and* the EXPDOWN bit is set, then invert the limit check.
                           */
                          if ((this.type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.EXPDOWN)) == X86.DESC.ACC.TYPE.EXPDOWN) {
                              if (this.checkRead == this.checkReadProt) this.checkRead = this.checkReadProtDown;
                              if (this.checkWrite == this.checkWriteProt) this.checkWrite = this.checkWriteProtDown;
                              this.fExpDown = true;
                          }
                      }
                      /*
                       * TODO: For non-SEG descriptors, are there other checks or functions we should establish?
                       */
              
                      /*
                       * Any update to the following properties must occur only on segment loads, not simply when
                       * we're updating segment registers as part of a mode change.
                       */
                      if (fLoad) {
                          /*
                           * We must update the descriptor's ACCESSED bit whenever the segment is "accessed" (ie,
                           * loaded); unlike the ACCESSED and DIRTY bits in PTEs, a descriptor ACCESSED bit is only
                           * updated on loads, not on every memory access.
                           *
                           * We compute address of the descriptor byte containing the ACCESSED bit (offset 0x5);
                           * note that it's perfectly normal for addrDesc to occasionally be invalid (eg, when the CPU
                           * is creating protected-mode-only segment registers like LDT and TSS, or when the CPU has
                           * transitioned from real-mode to protected-mode and new selector(s) have not been loaded yet).
                           *
                           * TODO: Note I do NOT update the ACCESSED bit for null GDT selectors, because I assume the
                           * hardware does not update it either.  In fact, I've seen code that uses the null GDT descriptor
                           * for other purposes, on the assumption that that descriptor is completely unused.
                           */
                          if ((this.sel & ~X86.SEL.RPL) && this.addrDesc !== X86.ADDR_INVALID) {
                              var addrType = this.addrDesc + X86.DESC.ACC.TYPE.OFFSET;
                              this.cpu.setByte(addrType, this.cpu.getByte(addrType) | (X86.DESC.ACC.TYPE.ACCESSED >> 8));
                          }
                          this.cpl = this.sel & X86.SEL.RPL;
                          this.dpl = (this.acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
                          if (this.cpu.model < X86.MODEL_80386 || !(this.ext & X86.DESC.EXT.BIG)) {
                              this.dataSize = 2;
                              this.dataMask = 0xffff;
                          } else {
                              this.dataSize = 4;
                              this.dataMask = (0xffffffff|0);
                          }
                          this.addrSize = this.dataSize;
                          this.addrMask = this.dataMask;
                      }
                  } else {
                      this.load = this.loadReal;
                      this.loadIDT = this.loadIDTReal;
                      this.checkRead = this.checkReadReal;
                      this.checkWrite = this.checkWriteReal;
                      this.cpl = this.dpl = 0;
                      this.addrDesc = X86.ADDR_INVALID;
                  }
                  return fProt;
              };
              
              /**
               * messageSeg(sel, base, limit, type, ext)
               *
               * @this {X86Seg}
               * @param {number} sel
               * @param {number} base
               * @param {number} limit
               * @param {number} type
               * @param {number} [ext]
               */
              X86Seg.prototype.messageSeg = function(sel, base, limit, type, ext)
              {
                  if (DEBUG) {
                      if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.SEG)) {
                          var ch = (this.sName.length < 3? " " : "");
                          var sDPL = " dpl=" + this.dpl;
                          if (this.id == X86Seg.ID.CODE) sDPL += " cpl=" + this.cpl;
                          this.dbg.message("loadSeg(" + this.sName + "):" + ch + "sel=" + str.toHexWord(sel) + " base=" + str.toHex(base) + " limit=" + str.toHexWord(limit) + " type=" + str.toHexWord(type) + sDPL, true);
                      }
                      this.cpu.assert(/* base !== X86.ADDR_INVALID && */ (this.cpu.model >= X86.MODEL_80386 || !ext || ext == X86.DESC.EXT.AVAIL));
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = X86Seg;
              
          • templates
            • README.md
              PCjs Templates
              ===
              Template folders contain a variety of XML and HTML templates and supporting files, including:
              
              - DTD files (Document Type Definitions)
              - XSD files (XML schemas -- eventually)
              - XSL files (XML stylesheets)
              - CSS files (stylesheets that the XSL files rely upon)
              - HTML files (HTML fragments used to generate part or all of a web page)
              
              [*components.xsl*](components.xsl) transforms all the elements of a machine XML file into an HTML fragment
              that includes a series of **DIV** tags with corresponding *id* and *data-value* attributes that allow our
              JavaScript components to bind themselves to visual elements (eg, virtual screen, virtual keyboard, control
              panel) on a web page.
              
            • components.css
              @CHARSET "UTF-8";
              /* @author Jeff Parsons (@jeffpar)
                 @website http://www.pcjs.org/
                 @created 2013-05-05
                 @modified 2014-03-12
                 @license http://www.gnu.org/licenses/gpl.html
               */
              
              *:not(input,textarea) {
                  -webkit-user-select: none;
              }
              .pcjs-embed {
              }
              .pcjs-embed:after {
                  clear:both;
              }
              .pcjs-name, .pcjs-menu {
                  clear: both;
                  font-weight: bold;
                  padding-bottom: 4px;
              }
              .pcjs-menu {
                  float: left;
              }
              .pcjs-canvas {
                  width: 100%;
                  height: auto;
              }
              .pcjs-container {
                  color: #000000;
                  position: relative;
              }
              .pcjs-label {
                  font-size: small;
                  line-height: 19px;
                  vertical-align: middle;
                  float: left;
                  font-family: "Lucida Console", monospace;
              }
              .pcjs-control textarea {
                  font-family: Monaco, monospace;
                  font-size: x-small;
              }
              .pcjs-fieldset {
                  border: none;
                  margin: 0;
                  padding: 0;
              }
              .pcjs-flag {
                  font-family: "Lucida Console", monospace;
                  font-size: small;
                  text-align: center;
                  line-height: 19px;
                  vertical-align: middle;
              }
              .pcjs-register {
                  font-family: "Lucida Console", monospace;
                  font-size: small;
                  text-align: center;
                  line-height: 19px;
                  vertical-align: middle;
                  border: 1px solid black;
              }
              .pcjs-switches {
                  float: left;
              }
              .pcjs-bitBucket {
                  float: left;
                  width: 19px;
                  height: 38px;
              }
              .pcjs-bitCell {
                  float: left;
                  width: 19px;
                  height: 19px;
                  margin-right: -1px;
                  margin-bottom: -1px;
                  border: 1px solid black;
                  text-align: center;
                  line-height: 19px; /* the equivalent of "vertical-align: middle" for single-line elements */
              }
              .pcjs-bitCellLeft {
                  border-left: 1px solid black;
              }
              .pcjs-bitLabel {
                  font-size: xx-small;
                  text-align: center;
              }
              .pcjs-description, .pcjs-status {
                  font-size: x-small;
                  line-height: 2em;
              }
              .pcjs-key {
                  border: 1px solid black;
                  font-size: x-small;
                  text-align: center;
                  position: absolute;
                  height: 34px;
                  line-height: 34px; /* the equivalent of "vertical-align: middle" for single-line elements */
                  background-color: #ffffff;
              }
              .pcjs-led {
                  float: left;
                  width: 8px;
                  height: 8px;
                  margin: 4px;
                  border: 1px solid black;
                  text-align: center;
                  line-height: 19px; /* the equivalent of "vertical-align: middle" for single-line elements */
                  background-color: #000000;
              }
              .pcjs-video-object {
                  clear: both;
                  height: auto;
                  position: relative;
                  line-height: 0; /* this is just an attempt to eliminate the side-effects of any whitespace between inner DIVs */
              }
              .pcjs-video-object textarea {
                  position: absolute;
                  left: 0;
                  top: 0;
                  width: 100%;
                  height: 100%;
                  opacity: 0;
                  border: 0;
                  padding: 0;
                  line-height: 0; /* try to prevent Safari on iOS from always displaying a blinking cursor */
              }
              .pcjs-reference {
                  float: left;
                  font-size: x-small;
              }
              .pcjs-reference a {
                  text-decoration: none;
              }
              .pcjs-copyright {
                  float: right;
                  font-size: x-small;
              }
              .pcjs-copyright a {
                  text-decoration: none;
              }
              
              @media screen and (max-width: 900px) {
                  .pcjs-textarea {
                      width: 100% !important;
                  }
                  .pcjs-registers {
                      width: 100% !important;
                  }
              }
              
            • components.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other required entities may be defined below (see http://www.pcjs.org/modules/shared/templates/entities.dtd). -->
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              	<xsl:param name="rootDir" select="''"/>
              	<xsl:param name="generator" select="'client'"/>
              
              	<xsl:variable name="MACHINECLASS">pc</xsl:variable>
              	<xsl:variable name="APPCLASS">pcjs</xsl:variable>
              	<xsl:variable name="APPVERSION">1.x.x</xsl:variable>
              	<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
              
              	<xsl:template name="componentStyles">
              		<link rel="stylesheet" type="text/css" href="/versions/{$APPCLASS}/{$APPVERSION}/components.css"/>
              	</xsl:template>
              
              	<xsl:template name="componentScripts">
              		<xsl:param name="component"/>
              		<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
              	</xsl:template>
              
              	<xsl:template name="componentIncludes">
              		<xsl:param name="component"/>
              		<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
              	</xsl:template>
              
              	<xsl:template name="machine">
              		<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
              		<xsl:param name="state" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/machine">
              			<xsl:with-param name="machineState" select="$state"/>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="machine[@ref]">
              		<xsl:param name="machineState" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/machine">
              			<xsl:with-param name="machine" select="@id"/>
              			<xsl:with-param name="machineState">
              				<xsl:choose>
              					<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
              					<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
              				</xsl:choose>
              			</xsl:with-param>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="machine[not(@ref)]">
              		<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
              		<xsl:param name="machineState" select="''"/>
              		<xsl:variable name="machineStyle">
              			<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
              		</xsl:variable>
              		<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
              			<xsl:call-template name="component">
              				<xsl:with-param name="machine" select="$machine"/>
              				<xsl:with-param name="machineState">
              					<xsl:choose>
              						<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
              						<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
              					</xsl:choose>
              				</xsl:with-param>
              				<xsl:with-param name="component" select="'machine'"/>
              				<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
              				<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
              				<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
              			</xsl:call-template>
              		</div>
              	</xsl:template>
              
              	<xsl:template match="component[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/component">
              			<xsl:with-param name="machine" select="$machine"/>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="component[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class" select="@class"/>
              			<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template name="component">
              		<xsl:param name="machine" select="''"/>
              		<xsl:param name="machineState" select="''"/>
              		<xsl:param name="component" select="name(.)"/>
              		<xsl:param name="class" select="''"/>
              		<xsl:param name="parms" select="''"/>
              		<xsl:param name="url" select="''"/>
              		<xsl:variable name="id">
              			<xsl:choose>
              				<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
              				<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
              				<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
              				<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
              				<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="componentURL">
              			<xsl:choose>
              				<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="name">
              			<xsl:choose>
              				<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
              				<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="comment">
              			<xsl:choose>
              				<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="border">
              			<xsl:choose>
              				<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
              				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="left">
              			<xsl:choose>
              				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="top">
              			<xsl:choose>
              				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="width">
              			<xsl:choose>
              				<xsl:when test="@width">
              					<xsl:choose>
              						<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
              						<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
              					</xsl:choose>
              				</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="height">
              			<xsl:choose>
              				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="padding">
              			<xsl:choose>
              				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
              				<xsl:otherwise>
              					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
              					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
              					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
              					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
              				</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="pos">
              			<xsl:choose>
              				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
              				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
              				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
              				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
              				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="style">
              			<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
              			<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
              		</xsl:variable>
              		<xsl:variable name="componentClass">
              			<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
              		</xsl:variable>
              		<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
              			<xsl:if test="$component = 'machine'">
              				<xsl:apply-templates select="name" mode="machine"/>
              			</xsl:if>
              			<xsl:if test="$component != 'machine'">
              				<xsl:apply-templates select="name" mode="component"/>
              			</xsl:if>
              			<div class="{$APPCLASS}-container" style="{$border}{$style}">
              				<xsl:if test="$component = 'machine'">
              					<xsl:apply-templates select="menu" mode="machine"/>
              				</xsl:if>
              				<xsl:if test="$component != 'machine'">
              					<xsl:apply-templates select="menu" mode="component"/>
              				</xsl:if>
              				<xsl:if test="$class != '' and $component != 'machine'">
              					<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
              				</xsl:if>
              				<xsl:if test="control">
              					<div class="{$APPCLASS}-controls">
              						<xsl:apply-templates select="control" mode="component"/>
              					</div>
              				</xsl:if>
              				<xsl:apply-templates>
              					<xsl:with-param name="machine" select="$machine"/>
              					<xsl:with-param name="machineState" select="$machineState"/>
              				</xsl:apply-templates>
              			</div>
              			<xsl:if test="$component = 'machine'">
              				<xsl:choose>
              					<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
              					<xsl:otherwise/>
              				</xsl:choose>
              				<div class="{$APPCLASS}-copyright">
              					<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
              				</div>
              				<div style="clear:both"> </div>
              			</xsl:if>
              		</div>
              	</xsl:template>
              
              	<xsl:template match="name" mode="machine">
              		<xsl:variable name="pos">
              			<xsl:choose>
              				<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<h2 style="{$pos}"><xsl:apply-templates/></h2>
              	</xsl:template>
              
              	<xsl:template match="name" mode="component">
              		<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
              	</xsl:template>
              
              	<xsl:template match="menu" mode="component">
              		<xsl:apply-templates mode="component"/>
              	</xsl:template>
              
              	<xsl:template match="title" mode="component">
              		<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
              	</xsl:template>
              
              	<xsl:template match="control" mode="component">
              		<xsl:variable name="type">
              			<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
              		</xsl:variable>
              		<xsl:variable name="binding">
              			<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
              		</xsl:variable>
              		<xsl:variable name="border">
              			<xsl:choose>
              				<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
              				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="width">
              			<xsl:choose>
              				<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="height">
              			<xsl:choose>
              				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="left">
              			<xsl:choose>
              				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="top">
              			<xsl:choose>
              				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="padding">
              			<xsl:choose>
              				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
              				<xsl:otherwise>
              					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
              					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
              					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
              					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
              				</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="pos">
              			<xsl:choose>
              				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
              				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
              				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
              				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
              				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
              				<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="style">
              			<xsl:choose>
              				<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="containerClass">
              			<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
              		</xsl:variable>
              		<xsl:variable name="containerStyle">
              			<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
              			<xsl:choose>
              				<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
              			<xsl:variable name="fontsize">
              				<xsl:choose>
              					<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
              					<xsl:otherwise/>
              				</xsl:choose>
              			</xsl:variable>
              			<xsl:variable name="subClass">
              				<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
              			</xsl:variable>
              			<xsl:variable name="labelWidth">
              				<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
              			</xsl:variable>
              			<xsl:variable name="labelStyle">
              				<xsl:choose>
              					<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
              					<xsl:otherwise>text-align:right;</xsl:otherwise>
              				</xsl:choose>
              			</xsl:variable>
              			<xsl:if test="@label">
              				<xsl:if test="not(@labelpos) or @labelpos = 'left'">
              					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
              				</xsl:if>
              			</xsl:if>
              			<xsl:choose>
              				<xsl:when test="@type = 'canvas'">
              					<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
              				</xsl:when>
              				<xsl:when test="@type = 'button'">
              					<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
              				</xsl:when>
              				<xsl:when test="@type = 'list'">
              					<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
              						<xsl:apply-templates select="disk|app|manifest" mode="component"/>
              					</select>
              				</xsl:when>
              				<xsl:when test="@type = 'text'">
              					<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
              				</xsl:when>
              				<xsl:when test="@type = 'submit'">
              					<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
              				</xsl:when>
              				<xsl:when test="@type = 'textarea'">
              					<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
              				</xsl:when>
              				<xsl:when test="@type = 'heading'">
              					<div><xsl:value-of select="."/></div>
              				</xsl:when>
              				<xsl:when test="@type = 'file'">
              					<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
              						<fieldset class="{$APPCLASS}-fieldset">
              							<input type="file"/>
              							<input type="submit" value="Mount" disabled="true"/>
              						</fieldset>
              					</form>
              				</xsl:when>
              				<xsl:when test="@type = 'led'">
              					<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
              				</xsl:when>
              				<xsl:when test="@type = 'separator'">
              					<hr/>
              				</xsl:when>
              				<xsl:when test="@type = 'container'">
              					<xsl:apply-templates mode="component"/>
              				</xsl:when>
              				<xsl:when test="not(@type)">
              					<div style="clear:both"> </div>
              				</xsl:when>
              				<xsl:otherwise>
              					<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
              				</xsl:otherwise>
              			</xsl:choose>
              			<xsl:if test="@label">
              				<xsl:if test="@labelpos = 'right'">
              					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
              				</xsl:if>
              				<div style="clear:both"> </div>
              			</xsl:if>
              		</div>
              	</xsl:template>
              
              	<xsl:template match="disk[@ref]" mode="component">
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
              	</xsl:template>
              
              	<xsl:template match="disk[not(@ref)]" mode="component">
              		<xsl:variable name="desc">
              			<xsl:if test="@desc">
              				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
              				<xsl:if test="@href">
              					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
              				</xsl:if>
              			</xsl:if>
              		</xsl:variable>
              		<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
              	</xsl:template>
              
              	<xsl:template match="app[@ref]" mode="component">
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
              	</xsl:template>
              
              	<xsl:template match="app[not(@ref)]" mode="component">
              		<xsl:variable name="desc">
              			<xsl:if test="@desc">
              				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
              				<xsl:if test="@href">
              					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
              				</xsl:if>
              			</xsl:if>
              		</xsl:variable>
              		<xsl:variable name="path">
              			<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
              		</xsl:variable>
              		<xsl:variable name="files">
              			<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
              		</xsl:variable>
              		<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
              	</xsl:template>
              
              	<xsl:template match="manifest[@ref]" mode="component">
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
              			<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="manifest[not(@ref)]" mode="component">
              		<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
              		<xsl:if test="$disk != ''">
              			<xsl:variable name="prefix">
              				<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
              			</xsl:variable>
              			<xsl:for-each select="disk">
              				<xsl:if test="$disk = @id or $disk = '*'">
              					<xsl:variable name="name">
              						<xsl:choose>
              							<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
              							<xsl:when test="normalize-space(./text()) != ''">
              								<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
              							</xsl:when>
              							<xsl:otherwise>
              								<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
              							</xsl:otherwise>
              						</xsl:choose>
              					</xsl:variable>
              					<xsl:variable name="link">
              						<xsl:if test="link">
              							<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
              							<xsl:if test="link/@href">
              								<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
              							</xsl:if>
              						</xsl:if>
              					</xsl:variable>
              					<!-- TODO: Think about incorporating the optional "desc" tag into the disk description (see /disks/pc/tools/microsoft/MSC-048014.400/manifest.xml) -->
              					<xsl:if test="@href">
              						<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
              					</xsl:if>
              					<xsl:if test="not(@href)">
              						<xsl:variable name="dir">
              							<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
              						</xsl:variable>
              						<xsl:variable name="files">
              							<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
              						</xsl:variable>
              						<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
              					</xsl:if>
              				</xsl:if>
              			</xsl:for-each>
              		</xsl:if>
              	</xsl:template>
              
              	<xsl:template match="name">
              	</xsl:template>
              
              	<xsl:template match="title">
              	</xsl:template>
              
              	<xsl:template match="control">
              	</xsl:template>
              
              	<xsl:template match="cpu[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="cpu[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="model">
              			<xsl:choose>
              				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
              				<xsl:otherwise>8088</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="cycles">
              			<xsl:choose>
              				<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="multiplier">
              			<xsl:choose>
              				<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
              				<xsl:otherwise>1</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="autoStart">
              			<xsl:choose>
              				<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
              				<xsl:otherwise>null</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="csStart">
              			<xsl:choose>
              				<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
              				<xsl:otherwise>-1</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="csInterval">
              			<xsl:choose>
              				<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
              				<xsl:otherwise>-1</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="csStop">
              			<xsl:choose>
              				<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
              				<xsl:otherwise>-1</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class" select="'cpu'"/>
              			<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="chipset[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="chipset[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="model">
              			<xsl:choose>
              				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
              				<xsl:otherwise>5150</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="sw1">
              			<xsl:choose>
              				<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="sw2">
              			<xsl:choose>
              				<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="sound">
              			<xsl:choose>
              				<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
              				<xsl:otherwise>true</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="scaletimers">
              			<xsl:choose>
              				<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
              				<xsl:otherwise>false</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="floppies">
              			<xsl:choose>
              				<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
              				<xsl:otherwise>{}</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="monitor">
              			<xsl:choose>
              				<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="rtcdate">
              			<xsl:choose>
              				<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">chipset</xsl:with-param>
              			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="keyboard[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="keyboard[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="model">
              			<xsl:choose>
              				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">keyboard</xsl:with-param>
              			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="serial[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="serial[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="adapter">
              			<xsl:choose>
              				<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="binding">
              			<xsl:choose>
              				<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">serial</xsl:with-param>
              			<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="mouse[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="mouse[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="serial">
              			<xsl:choose>
              				<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">mouse</xsl:with-param>
              			<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="fdc[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/fdc">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="mount" select="@automount"/>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="fdc[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:param name="mount" select="''"/>
              		<xsl:variable name="automount">
              			<xsl:choose>
              				<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
              				<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">fdc</xsl:with-param>
              			<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="hdc[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="hdc[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="drives">
              			<xsl:choose>
              				<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="type">
              			<xsl:choose>
              				<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
              				<xsl:otherwise>xt</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">hdc</xsl:with-param>
              			<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="rom[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="rom[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="addr">
              			<xsl:choose>
              				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="size">
              			<xsl:choose>
              				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="alias">
              			<xsl:choose>
              				<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
              				<xsl:otherwise>null</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="file">
              			<xsl:choose>
              				<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="notify">
              			<xsl:choose>
              				<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">rom</xsl:with-param>
              			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="ram[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="ram[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="addr">
              			<xsl:choose>
              				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="size">
              			<xsl:choose>
              				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="test">
              			<xsl:choose>
              				<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
              				<xsl:otherwise>true</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">ram</xsl:with-param>
              			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="video[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="video[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="model">
              			<xsl:choose>
              				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="mode">
              			<xsl:choose>
              				<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
              				<xsl:otherwise>7</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="screenWidth">
              			<xsl:choose>
              				<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
              				<xsl:otherwise>256</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="screenHeight">
              			<xsl:choose>
              				<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
              				<xsl:otherwise>224</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="memory">
              			<xsl:choose>
              				<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="switches">
              			<xsl:choose>
              				<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="scale">
              			<xsl:choose>
              				<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
              				<xsl:otherwise>false</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="charCols">
              			<xsl:choose>
              				<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
              				<xsl:otherwise>80</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="charRows">
              			<xsl:choose>
              				<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
              				<xsl:otherwise>25</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="fontROM">
              			<xsl:choose>
              				<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
              				<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="screenColor">
              			<xsl:choose>
              				<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
              				<xsl:otherwise>black</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="touchScreen">
              			<xsl:choose>
              				<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
              				<xsl:otherwise>false</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="autoLock">
              			<xsl:choose>
              				<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
              				<xsl:otherwise>false</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">video</xsl:with-param>
              			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="debugger[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="debugger[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="commands">
              			<xsl:choose>
              				<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="messages">
              			<xsl:choose>
              				<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">debugger</xsl:with-param>
              			<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="panel[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="panel[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">panel</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              	<xsl:template match="computer[@ref]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:param name="machineState" select="''"/>
              		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($componentFile)/computer">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="machineState" select="$machineState"/>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="computer[not(@ref)]">
              		<xsl:param name="machine" select="''"/>
              		<xsl:param name="machineState" select="''"/>
              		<xsl:variable name="busWidth">
              			<xsl:choose>
              				<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
              				<xsl:otherwise>20</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="resume">
              			<xsl:choose>
              				<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
              				<xsl:otherwise>0</xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:variable name="state">
              			<xsl:choose>
              				<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
              				<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
              				<xsl:otherwise/>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:call-template name="component">
              			<xsl:with-param name="machine" select="$machine"/>
              			<xsl:with-param name="class">computer</xsl:with-param>
              			<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
              		</xsl:call-template>
              	</xsl:template>
              
              </xsl:stylesheet>
              
          • package.json
            {
              "name": "PCjs",
              "version": "1.17.5",
              "description": "IBM PC Emulator",
              "author": "Jeff Parsons <Jeff@pcjs.org>",
              "licenses": [
                {
                  "type": "GPLv3",
                  "url": "http://www.gnu.org/licenses/gpl.html"
                }
              ],
              "bin": {
                "example": "./bin/pcjs"
              }
            }
            
        • shared
          • lib
            • README.md
              Shared Sources
              ===
              
              This folder contains a mix of shared code, with some files used only by Node (server) modules,
              some used only by Browser (client) modules, and others used by both.
              
              At the moment, only a few files are completely agnostic; eg: [strlib.js](strlib.js) and [usrlib.js](usrlib.js).
              One give-away is that neither contain references to any globals (although references to each other
              would be fine).
              
              [netlib.js](netlib.js) is appropriate only for Node modules, because it contains code that relies on Node's
              global *Buffer* object, as indicated by:
              
              	/* global Buffer: false */
              
              And [weblib.js](weblib.js) is appropriate only for client modules, because it contains code that relies on the
              browser's global *window* object, as indicated by:
              
              	/* global window: true */
              
              We declare *window* modifiable (true) so that [defines.js](defines.js) can set *global.window* to *false*
              when running within Node, allowing any other code to test the existence of *window* with a simple:
              
              	if (window) {...}
              	
              instead of:
              
              	if (typeof window !== "undefined") {...}
              
            • component.js
              /**
               * @fileoverview The Component class used by C1Pjs and PCjs.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-May-14
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               * All the C1Pjs and PCjs components now use JSDoc types, primarily so that Google's Closure Compiler
               * will compile everything with ZERO warnings.  For more information about the JSDoc types supported by
               * the Closure Compiler:
               *
               *      https://developers.google.com/closure/compiler/docs/js-for-compiler#types
               *
               * I also attempted to use JSLint, but it's excessively strict for my taste, so this is the only file
               * I tried massaging for JSLint's sake.  I gave up when it complained about my use of "while (true)";
               * replacing "true" with an assignment expression didn't make it any happier.
               *
               * I wasn't thrilled about replacing all "++" and "--" operators with "+= 1" and "-= 1", nor about using
               * "(s || '')" instead of "(s? s : '')", because while the former may seem simpler, it is NOT more portable.
               * It's not that I'm trying to write "portable JavaScript", but some of this code was ported from C code I'd
               * written about 14 years earlier, and portability is good, so I'm not going to rewrite if there's no need.
               *
               * UPDATE: I've since switched to JSHint, which seems to have more reasonable defaults.
               */
              
              "use strict";
              
              /* global window: true, DEBUG: true */
              
              if (typeof module !== 'undefined') {
                  require("./defines");
                  var usr = require("./usrlib");
                  var web = require("./weblib");
              }
              
              /**
               * Component(type, parms, constructor, bitsMessage)
               *
               * A Component object requires:
               *
               *      type: a user-defined type name (eg, "CPU")
               *
               * and accepts any or all of the following (parms) properties:
               *
               *      id: component ID (default is "")
               *      name: component name (default is ""; if blank, toString() will use the type name only)
               *      comment: component comment string (default is undefined)
               *
               * Subclasses that use Component.subclass() to extend Component will likely have additional (parms) properties.
               *
               * @constructor
               * @param {string} type
               * @param {Object} [parms]
               * @param {Object} [constructor]
               * @param {number} [bitsMessage]
               */
              function Component(type, parms, constructor, bitsMessage)
              {
                  this.type = type;
              
                  if (!parms) parms = {'id': "", 'name': ""};
              
                  this.id = parms['id'];
                  this.name = parms['name'];
                  this.comment = parms['comment'];
                  this.parms = parms;
                  if (this.id === undefined) this.id = "";
              
                  var i = this.id.indexOf('.');
                  if (i > 0) {
                      this.idMachine = this.id.substr(0, i);
                      this.idComponent = this.id.substr(i + 1);
                  } else {
                      this.idComponent = this.id;
                  }
              
                  /*
                   * Recording the constructor is really just a debugging aid, because many of our constructors
                   * have class constants, but they're hard to find when the constructors are buried among all the
                   * other globals.
                   */
                  this[type] = constructor;
              
                  /*
                   * Gather all the various component flags (booleans) into a single "flags" object, and encourage
                   * subclasses to do the same, to reduce the property clutter we have to wade through while debugging.
                   */
                  this.aFlags = {
                      fReady: false,
                      fBusy: false,
                      fBusyCancel: false,
                      fPowered: false,
                      fError: false
                  };
              
                  this.fnReady = null;
                  this.clearError();
                  this.bindings = {};
                  this.dbg = null;                    // by default, no connection to a Debugger
                  this.bitsMessage = bitsMessage || -1;
              
                  Component.add(this);
              }
              
              /**
               * Component.parmsURL
               *
               * Initialized to the set of URL parameters, if any, for the current web page.
               *
               * @type {Object|null}
               */
              Component.parmsURL = web.getURLParameters();
              
              /**
               * Component.inherit(p)
               *
               * Returns a newly created object that inherits properties from the prototype object p.
               * It uses the ECMAScript 5 function Object.create() if it is defined, and otherwise falls back to an older technique.
               *
               * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-1)
               *
               * @param {Object} p
               */
              Component.inherit = function(p)
              {
                  if (window) {
                      if (!p) throw new TypeError();
                      if (Object.create) {
                          return Object.create(p);
                      }
                      var t = typeof p;
                      if (t !== "object" && t !== "function") throw new TypeError();
                  }
                  /**
                   * @constructor
                   */
                  function F() {}
                  F.prototype = p;
                  return new F();
              };
              
              /**
               * Component.extend(o, p)
               *
               * Copies the enumerable properties of p to o and returns o.
               * If o and p have a property by the same name, o's property is overwritten.
               *
               * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-2)
               *
               * @param {Object} o
               * @param {Object} p
               */
              Component.extend = function(o, p)
              {
                  for (var prop in p) {
                      o[prop] = p[prop];
                  }
                  return o;
              };
              
              /**
               * Component.subclass(subclass, superclass, methods, statics)
               *
               * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 9-11)
               *
               * @param {Object} subclass is the constructor for the new subclass
               * @param {Object} [superclass] is the constructor of the superclass (default is Component)
               * @param {Object} [methods] contains all instance methods
               * @param {Object} [statics] contains all class properties and methods
               */
              Component.subclass = function(subclass, superclass, methods, statics)
              {
                  if (!superclass) superclass = Component;
                  subclass.prototype = Component.inherit(superclass.prototype);
                  subclass.prototype.constructor = subclass;
                  subclass.prototype.parent = superclass.prototype;
                  if (methods) {
                      Component.extend(subclass.prototype, methods);
                  }
                  if (statics) {
                      Component.extend(subclass, statics);
                  }
                  return subclass;
              };
              
              /*
               * Every component created on the current page is recorded in this array (see Component.add()).
               *
               * This enables any component to locate another component by ID (see Component.getComponentByID())
               * or by type (see Component.getComponentByType()).
               */
              Component.all = [];
              
              /**
               * Component.add(component)
               *
               * @param {Component} component
               */
              Component.add = function(component)
              {
                  /*
                   * This just generates a lot of useless noise, handy in the early days, not so much these days...
                   *
                   *      if (DEBUG) Component.log("Component.add(" + component.type + "," + component.id + ")");
                   */
                  Component.all[Component.all.length] = component;
              };
              
              /**
               * Component.log(s, type)
               *
               * For diagnostic output only.
               *
               * @param {string} [s] is the message text
               * @param {string} [type] is the message type
               */
              Component.log = function(s, type)
              {
                  if (DEBUG) {
                      if (s) {
                          var msElapsed, sMsg = (type? (type + ": ") : "") + s;
                          if (Component.msStart === undefined) {
                              Component.msStart = usr.getTime();
                          }
                          msElapsed = usr.getTime() - Component.msStart;
                          if (window && window.console) console.log(msElapsed + "ms: " + sMsg.replace(/\n/g, " "));
                      }
                  }
              };
              
              /**
               * Component.assert(f, s)
               *
               * Verifies conditions that must be true (for DEBUG builds only).
               *
               * The Closure Compiler should automatically remove all references to Component.assert() in non-DEBUG builds.
               *
               * TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
               *
               * @param {boolean} f is the expression we are asserting to be true
               * @param {string} [s] is description of the assertion on failure
               */
              Component.assert = function(f, s)
              {
                  if (DEBUG) {
                      if (!f) {
                          if (!s) s = "assertion failure";
                          Component.log(s);
                          throw new Error(s);
                      }
                  }
              };
              
              /**
               * Component.println(s, type, id)
               *
               * For non-diagnostic messages, which components may override to control the destination/appearance of their output.
               *
               * Components that inherit from this class should use the instance method, this.println(), rather than Component.println(),
               * because if a Control Panel is loaded, it will override only the instance method, not the class method (overriding the class
               * method would improperly affect any other machines loaded on the same page).
               *
               * @param {string} [s] is the message text
               * @param {string} [type] is the message type
               * @param {string} [id] is the caller's ID, if any
               */
              Component.println = function(s, type, id)
              {
                  if (DEBUG) {
                      Component.log((id? (id + ": ") : "") + (s? ("\"" + s + "\"") : ""), type);
                  }
              };
              
              /**
               * Component.notice(s, fPrintOnly, id)
               *
               * notice() is like println() but implies a need for user notification, so we alert() as well.
               *
               * @param {string} s is the message text
               * @param {boolean} [fPrintOnly]
               * @param {string} [id] is the caller's ID, if any
               */
              Component.notice = function(s, fPrintOnly, id)
              {
                  if (DEBUG) {
                      Component.println(s, "notice", id);
                  }
                  if (!fPrintOnly) web.alertUser(s);
              };
              
              /**
               * Component.warning(s)
               *
               * @param {string} s describes the warning
               */
              Component.warning = function(s)
              {
                  if (DEBUG) {
                      Component.println(s, "warning");
                  }
                  web.alertUser(s);
              };
              
              /**
               * Component.error(s)
               *
               * @param {string} s describes the error; an alert() is displayed as well
               */
              Component.error = function(s)
              {
                  if (DEBUG) {
                      Component.println(s, "error");
                  }
                  web.alertUser(s);
              };
              
              /**
               * Component.getComponents(idRelated)
               *
               * We could store components as properties of an 'all' object, using the component's ID,
               * and change this linear lookup into a property lookup, but some components may have no ID.
               *
               * @param {string} [idRelated] of related component
               * @return {Array} of components
               */
              Component.getComponents = function(idRelated)
              {
                  var i;
                  var aComponents = [];
                  /*
                   * getComponentByID(id, idRelated)
                   *
                   * If idRelated is provided, we check it for a machine prefix, and use any
                   * existing prefix to constrain matches to IDs with the same prefix, in order to
                   * avoid matching components belonging to other machines.
                   */
                  if (idRelated) {
                      if ((i = idRelated.indexOf('.')) > 0)
                          idRelated = idRelated.substr(0, i + 1);
                      else
                          idRelated = "";
                  }
                  for (i = 0; i < Component.all.length; i++) {
                      var component = Component.all[i];
                      if (!idRelated || !component.id.indexOf(idRelated)) {
                          aComponents.push(component);
                      }
                  }
                  return aComponents;
              };
              
              /**
               * Component.getComponentByID(id, idRelated)
               *
               * We could store components as properties of an 'all' object, using the component's ID,
               * and change this linear lookup into a property lookup, but some components may have no ID.
               *
               * @param {string} id of the desired component
               * @param {string} [idRelated] of related component
               * @return {Component|null}
               */
              Component.getComponentByID = function(id, idRelated)
              {
                  if (id !== undefined) {
                      var i;
                      /*
                       * If idRelated is provided, we check it for a machine prefix, and use any
                       * existing prefix to constrain matches to IDs with the same prefix, in order to
                       * avoid matching components belonging to other machines.
                       */
                      if (idRelated && (i = idRelated.indexOf('.')) > 0) {
                          id = idRelated.substr(0, i + 1) + id;
                      }
                      for (i = 0; i < Component.all.length; i++) {
                          if (Component.all[i].id === id) {
                              return Component.all[i];
                          }
                      }
                      Component.log("Component ID '" + id + "' not found", "warning");
                  }
                  return null;
              };
              
              /**
               * Component.getComponentByType(sType, idRelated, componentPrev)
               *
               * @param {string} sType of the desired component
               * @param {string} [idRelated] of related component
               * @param {Component|null} [componentPrev] of previously returned component, if any
               * @return {Component|null}
               */
              Component.getComponentByType = function(sType, idRelated, componentPrev)
              {
                  if (sType !== undefined) {
                      var i;
                      /*
                       * If idRelated is provided, we check it for a machine prefix, and use any
                       * existing prefix to constrain matches to IDs with the same prefix, in order to
                       * avoid matching components belonging to other machines.
                       */
                      if (idRelated) {
                          if ((i = idRelated.indexOf('.')) > 0) {
                              idRelated = idRelated.substr(0, i + 1);
                          } else {
                              idRelated = "";
                          }
                      }
                      for (i = 0; i < Component.all.length; i++) {
                          if (componentPrev) {
                              if (componentPrev == Component.all[i]) componentPrev = null;
                              continue;
                          }
                          if (sType == Component.all[i].type && (!idRelated || !Component.all[i].id.indexOf(idRelated))) {
                              return Component.all[i];
                          }
                      }
                      Component.log("Component type '" + sType + "' not found", "warning");
                  }
                  return null;
              };
              
              /**
               * Component.getComponentParms(element)
               *
               * @param {Object} element from the DOM
               */
              Component.getComponentParms = function(element)
              {
                  var parms = null,
                      sParms = element.getAttribute("data-value");
                  if (sParms) {
                      try {
                          parms = eval("({" + sParms + "})"); // jshint ignore:line
                          /*
                           * We can no longer invoke removeAttribute() because some components (eg, Panel) need
                           * to run their initXXX() code more than once, to avoid initialization-order dependencies.
                           *
                           *      if (!DEBUG) {
                           *          element.removeAttribute("data-value");
                           *      }
                           */
                      } catch(e) {
                          Component.error(e.message + " (" + sParms + ")");
                      }
                  }
                  return parms;
              };
              
              /**
               * Component.bindExternalControl(component, sControl, sBinding, sType)
               *
               * @param {Component} component
               * @param {string} sControl
               * @param {string} sBinding
               * @param {string} [sType] is the external component type
               */
              Component.bindExternalControl = function(component, sControl, sBinding, sType)
              {
                  if (sControl) {
                      if (sType === undefined) sType = "Panel";
                      var target = Component.getComponentByType(sType, component.id);
                      if (target) {
                          var eBinding = target.bindings[sControl];
                          if (eBinding) {
                              component.setBinding(null, sBinding, eBinding);
                          }
                      }
                  }
              };
              
              if (window && !window.document.ELEMENT_NODE) window.document.ELEMENT_NODE = 1;
              
              /**
               * Component.bindComponentControls(component, element, sAppClass)
               *
               * @param {Component} component
               * @param {Object} element from the DOM
               * @param {string} sAppClass
               */
              Component.bindComponentControls = function(component, element, sAppClass)
              {
                  var aeControls = Component.getElementsByClass(element.parentNode, sAppClass + "-control");
              
                  for (var iControl = 0; iControl < aeControls.length; iControl++) {
              
                      var aeChildNodes = aeControls[iControl].childNodes;
              
                      for (var iNode = 0; iNode < aeChildNodes.length; iNode++) {
                          var control = aeChildNodes[iNode];
                          if (control.nodeType !== window.document.ELEMENT_NODE) {
                              continue;
                          }
                          var sClass = control.getAttribute("class");
                          if (!sClass) continue;
                          var aClasses = sClass.split(" ");
                          for (var iClass = 0; iClass < aClasses.length; iClass++) {
                              var parms;
                              sClass = aClasses[iClass];
                              switch (sClass) {
                                  case sAppClass + "-binding":
                                      parms = Component.getComponentParms(control);
                                      if (parms && parms['binding']) {
                                          component.setBinding(parms['type'], parms['binding'], control);
                                      } else {
                                          Component.log("Component '" + component.toString() + "' missing binding" + (parms? " for " + parms['type'] : ""), "warning");
                                      }
                                      iClass = aClasses.length;
                                      break;
                                  default:
                                      // if (DEBUG) Component.log("Component.bindComponentControls(" + component.toString() + "): unrecognized control class \"" + sClass + "\"", "warning");
                                      break;
                              }
                          }
                      }
                  }
              };
              
              /**
               * Component.getElementsByClass(element, sClass, sObjClass)
               *
               * This is a cross-browser helper function, since not all browser's support getElementsByClassName()
               *
               * TODO: This should probably be moved into weblib.js at some point, along with the control binding functions above,
               * to keep all the browser-related code together.
               *
               * @param {Object} element from the DOM
               * @param {string} sClass
               * @param {string} [sObjClass]
               * @return {Array|NodeList}
               */
              Component.getElementsByClass = function(element, sClass, sObjClass)
              {
                  if (sObjClass) sClass += '-' + sObjClass + "-object";
                  /*
                   * Use the browser's built-in getElementsByClassName() if it appears to be available
                   * (for example, it's not available in IE8, but it should be available in IE9 and up)
                   */
                  if (element.getElementsByClassName) {
                      return element.getElementsByClassName(sClass);
                  }
                  var i, j, ae = [];
                  var aeAll = element.getElementsByTagName("*");
                  var re = new RegExp('(^| )' + sClass + '( |$)');
                  for (i = 0, j = aeAll.length; i < j; i++) {
                      if (re.test(aeAll[i].className)) {
                          ae.push(aeAll[i]);
                      }
                  }
                  if (!ae.length) {
                      Component.log('No elements of class "' + sClass + '" found');
                  }
                  return ae;
              };
              
              Component.prototype = {
                  constructor: Component,
                  parent: null,
                  /**
                   * toString()
                   *
                   * @this {Component}
                   * @return {string}
                   */
                  toString: function() {
                      return (this.name? this.name : (this.id || this.type));
                  },
                  /**
                   * getMachineNum()
                   *
                   * @this {Component}
                   * @return {number} unique machine number
                   */
                  getMachineNum: function() {
                      var nMachine = 1;
                      if (this.idMachine) {
                          var aDigits = this.idMachine.match(/\d+/);
                          if (aDigits !== null)
                              nMachine = parseInt(aDigits[0], 10);
                      }
                      return nMachine;
                  },
                  /**
                   * setBinding(sHTMLType, sBinding, control)
                   *
                   * Component's setBinding() method is intended to be overridden by subclasses.
                   *
                   * @this {Component}
                   * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
                   * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
                   * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
                   * @return {boolean} true if binding was successful, false if unrecognized binding request
                   */
                  setBinding: function(sHTMLType, sBinding, control) {
                      switch (sBinding) {
                      case "clear":
                          if (!this.bindings[sBinding]) {
                              this.bindings[sBinding] = control;
                              control.onclick = (function(component) {
                                  return function clearPanel() {
                                      if (component.bindings['print']) {
                                          component.bindings['print'].value = "";
                                      }
                                  };
                              }(this));
                          }
                          return true;
                      case "print":
                          if (!this.bindings[sBinding]) {
                              this.bindings[sBinding] = control;
                              /*
                               * HACK: Save this particular HTML element so that the Debugger can access it, too
                               */
                              this.controlPrint = control;
                              /*
                               * This was added for Firefox (Safari automatically clears the <textarea> on a page reload,
                               * but Firefox does not).
                               */
                              control.value = "";
                              this.println = (function(control) {
                                  return function printPanel(s, type) {
                                      s = (type !== undefined? (type + ": ") : "") + (s || "");
                                      /*
                                       * Prevent the <textarea> from getting too large; otherwise, printing becomes slower and slower.
                                       */
                                      if (COMPILED) {
                                          if (control.value.length > 8192) {
                                              control.value = control.value.substr(control.value.length - 4096);
                                          }
                                      }
                                      control.value += s + "\n";
                                      control.scrollTop = control.scrollHeight;
                                      if (DEBUG && window && window.console) console.log(s);
                                  };
                              }(control));
                              /**
                               * Override this.notice() with a replacement function that eliminates the web.alertUser() call
                               *
                               * @this {Component}
                               * @param {string} s
                               * @param {boolean} [fPrintOnly]
                               * @param {string} [id]
                               */
                              this.notice = function noticePanel(s, fPrintOnly, id) {
                                  this.println(s, "notice", id);
                              };
                          }
                          return true;
                      default:
                          return false;
                      }
                  },
                  /**
                   * log(s, type)
                   *
                   * For diagnostic output only.
                   *
                   * WARNING: Even though this function's body is completely wrapped in DEBUG, that won't prevent the Closure Compiler
                   * from including it, so all calls must still be prefixed with "if (DEBUG) ....".  For this reason, the class method,
                   * Component.log(), is preferred, because the compiler IS smart enough to remove those calls.
                   *
                   * @this {Component}
                   * @param {string} [s] is the message text
                   * @param {string} [type] is the message type
                   */
                  log: function(s, type) {
                      if (DEBUG) {
                          Component.log(s, type || this.id || this.type);
                      }
                  },
                  /**
                   * assert(f, s)
                   *
                   * Verifies conditions that must be true (for DEBUG builds only).
                   *
                   * WARNING: Make sure you preface all calls to this.assert() with "if (DEBUG)", because unlike Component.assert(),
                   * the Closure Compiler can't be sure that this instance method hasn't been overridden, so it refuses to treat it as
                   * dead code in non-DEBUG builds.
                   *
                   * TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
                   *
                   * @param {boolean} f is the expression we are asserting to be true
                   * @param {string} [s] is description of the assertion on failure
                   */
                  assert: function(f, s) {
                      if (DEBUG) {
                          if (!f) {
                              s = "assertion failure in " + (this.id || this.type) + (s? ": " + s : "");
                              if (DEBUGGER && this.dbg) {
                                  this.dbg.stopCPU();
                                  /*
                                   * Why do we throw an Error only to immediately catch and ignore it?  Simply to give
                                   * any IDE the opportunity to inspect the application's state.  Even when the IDE has
                                   * control, you should still be able to invoke Debugger commands from the IDE's REPL,
                                   * using the '$' global function that the Debugger constructor defines; eg:
                                   *
                                   *      $('r')
                                   *      $('dw 0:0')
                                   *      $('h')
                                   *      ...
                                   *
                                   * If you have no desire to stop on assertions, consider this a no-op.  However, another
                                   * potential benefit of creating an Error object is that, for browsers like Chrome, we get
                                   * a stack trace, too.
                                   */
                                  try {
                                      throw new Error(s);
                                  } catch(e) {
                                      this.println(e.stack || e.message);
                                  }
                                  return;
                              }
                              this.log(s);
                              throw new Error(s);
                          }
                      }
                  },
                  /**
                   * println(s, type)
                   *
                   * For non-diagnostic messages, which components may override to control the destination/appearance of their output.
                   *
                   * Components using this.println() should wait until after their constructor has run to display any messages, because
                   * if a Control Panel has been loaded, its override will not take effect until its own constructor has run.
                   *
                   * @this {Component}
                   * @param {string} [s] is the message text
                   * @param {string} [type] is the message type
                   * @param {string} [id] is the caller's ID, if any
                   */
                  println: function(s, type, id) {
                      Component.println(s, type, id || this.id);
                  },
                  /**
                   * status(s)
                   *
                   * status() is like println() but it also includes information about the component (ie, the component ID),
                   * which is why there is no corresponding Component.status() function.
                   *
                   * @param {string} s is the message text
                   */
                  status: function(s) {
                      this.println(this.idComponent + ": " + s);
                  },
                  /**
                   * notice(s, fPrintOnly)
                   *
                   * notice() is like println() but implies a need for user notification, so we alert() as well; however, if this.println()
                   * is overridden, this.notice will be replaced with a similar override, on the assumption that the override is taking care
                   * of alerting the user.
                   *
                   * @this {Component}
                   * @param {string} s is the message text
                   * @param {boolean} [fPrintOnly]
                   * @param {string} [id] is the caller's ID, if any
                   */
                  notice: function(s, fPrintOnly, id) {
                      Component.notice(s, fPrintOnly, id || this.id);
                  },
                  /**
                   * setError(s)
                   *
                   * Set a fatal error condition
                   *
                   * @this {Component}
                   * @param {string} s describes a fatal error condition
                   */
                  setError: function(s) {
                      this.aFlags.fError = true;
                      this.notice(s);         // TODO: Any cases where we should still prefix this string with "Fatal error: "?
                  },
                  /**
                   * clearError()
                   *
                   * Clear any fatal error condition
                   *
                   * @this {Component}
                   */
                  clearError: function() {
                      this.aFlags.fError = false;
                  },
                  /**
                   * isError()
                   *
                   * Report any fatal error condition
                   *
                   * @this {Component}
                   * @return {boolean} true if a fatal error condition exists, false if not
                   */
                  isError: function() {
                      if (this.aFlags.fError) {
                          this.println(this.toString() + " error");
                          return true;
                      }
                      return false;
                  },
                  /**
                   * isReady(fnReady)
                   *
                   * Return the "ready" state of the component; if the component is not ready, it will queue the optional
                   * notification function, otherwise it will immediately call the notification function, if any, without queuing it.
                   *
                   * NOTE: Since only the Computer component actually cares about the "readiness" of other components, the so-called
                   * "queue" of notification functions supports exactly one function.  This keeps things nice and simple.
                   *
                   * @this {Component}
                   * @param {function()} [fnReady]
                   * @return {boolean} true if the component is in a "ready" state, false if not
                   */
                  isReady: function(fnReady) {
                      if (fnReady) {
                          if (this.aFlags.fReady) {
                              fnReady();
                          } else {
                              if (MAXDEBUG) this.log("NOT ready");
                              this.fnReady = fnReady;
                          }
                      }
                      return this.aFlags.fReady;
                  },
                  /**
                   * setReady(fReady)
                   *
                   * Set the "ready" state of the component to true, and call any queued notification functions.
                   *
                   * @this {Component}
                   * @param {boolean} [fReady] is assumed to indicate "ready" unless EXPLICITLY set to false
                   */
                  setReady: function(fReady) {
                      if (!this.aFlags.fError) {
                          this.aFlags.fReady = (fReady !== false);
                          if (this.aFlags.fReady) {
                              if (MAXDEBUG /* || this.name */) this.log("ready");
                              var fnReady = this.fnReady;
                              this.fnReady = null;
                              if (fnReady) fnReady();
                          }
                      }
                  },
                  /**
                   * isBusy(fCancel)
                   *
                   * Return the "busy" state of the component
                   *
                   * @this {Component}
                   * @param {boolean} [fCancel] is set to true to cancel a "busy" state
                   * @return {boolean} true if "busy", false if not
                   */
                  isBusy: function(fCancel) {
                      if (this.aFlags.fBusy) {
                          if (fCancel) {
                              this.aFlags.fBusyCancel = true;
                          } else if (fCancel === undefined) {
                              this.println(this.toString() + " busy");
                          }
                      }
                      return this.aFlags.fBusy;
                  },
                  /**
                   * setBusy(fBusy)
                   *
                   * Update the current busy state; if an fCancel request is pending, it will be honored now.
                   *
                   * @this {Component}
                   * @param {boolean} fBusy
                   * @return {boolean}
                   */
                  setBusy: function(fBusy) {
                      if (this.aFlags.fBusyCancel) {
                          if (this.aFlags.fBusy) {
                              this.aFlags.fBusy = false;
                          }
                          this.aFlags.fBusyCancel = false;
                          return false;
                      }
                      if (this.aFlags.fError) {
                          this.println(this.toString() + " error");
                          return false;
                      }
                      this.aFlags.fBusy = fBusy;
                      return this.aFlags.fBusy;
                  },
                  /**
                   * powerUp(fSave)
                   *
                   * @this {Component}
                   * @param {Object|null} data
                   * @param {boolean} [fRepower] is true if this is "repower" notification
                   * @return {boolean} true if successful, false if failure
                   */
                  powerUp: function(data, fRepower) {
                      this.aFlags.fPowered = true;
                      return true;
                  },
                  /**
                   * powerDown(fSave, fShutdown)
                   *
                   * @this {Component}
                   * @param {boolean} fSave
                   * @param {boolean} [fShutdown]
                   * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
                   */
                  powerDown: function(fSave, fShutdown) {
                      if (fShutdown) this.aFlags.fPowered = false;
                      return true;
                  },
                  /**
                   * messageEnabled(bitsMessage)
                   *
                   * If bitsMessage is not specified, the component's MESSAGE category is used.
                   *
                   * @this {Component}
                   * @param {number} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                   * @return {boolean} true if all specified message enabled, false if not
                   */
                  messageEnabled: function(bitsMessage) {
                      if (DEBUGGER && this.dbg) {
                          if (this === this.dbg) {
                              bitsMessage |= 0;
                          } else {
                              bitsMessage = bitsMessage || this.bitsMessage;
                          }
                          var bitsEnabled = this.dbg.bitsMessage & bitsMessage;
                          return (bitsEnabled === bitsMessage || !!(bitsEnabled & this.dbg.bitsWarning));
                      }
                      return false;
                  },
                  /**
                   * printMessage(sMessage, bitsMessage, fAddress)
                   *
                   * If bitsMessage is not specified, the component's MESSAGE category is used.
                   * If bitsMessage is true, the message is displayed regardless.
                   *
                   * @this {Component}
                   * @param {string} sMessage is any caller-defined message string
                   * @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                   * @param {boolean} [fAddress] is true to display the current address
                   * @return {boolean} true if Debugger available, false if not
                   */
                  printMessage: function(sMessage, bitsMessage, fAddress) {
                      if (DEBUGGER && this.dbg) {
                          if (bitsMessage === true || this.messageEnabled(bitsMessage | 0)) {
                              this.dbg.message(sMessage, fAddress);
                          }
                          return true;
                      }
                      return false;
                  },
                  /**
                   * printMessageIO(port, bOut, addrFrom, name, bIn, bitsMessage)
                   *
                   * If bitsMessage is not specified, the component's MESSAGE category is used.
                   * If bitsMessage is true, the message is displayed as long as MESSAGE.PORT is enabled.
                   *
                   * @this {Component}
                   * @param {number} port
                   * @param {number|null} bOut if an output operation
                   * @param {number|null} [addrFrom]
                   * @param {string|null} [name] of the port, if any
                   * @param {number|null} [bIn] is the input value, if known, on an input operation
                   * @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                   */
                  printMessageIO: function(port, bOut, addrFrom, name, bIn, bitsMessage) {
                      if (DEBUGGER && this.dbg) {
                          if (bitsMessage === true) {
                              bitsMessage = 0;
                          } else if (bitsMessage == null) {
                              bitsMessage = this.bitsMessage;
                          }
                          this.dbg.messageIO(this, port, bOut, addrFrom, name, bIn, bitsMessage);
                      }
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = Component;
              
            • defines.js
              /**
               * @fileoverview Compile-time definitions used by C1Pjs and PCjs.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /**
               * @define {string}
               */
              var APPNAME = "";               // this @define is overridden by the Closure Compiler with either "PCjs" or "C1Pjs"
              
              /**
               * @define {string}
               */
              var APPVERSION = "1.x.x";       // this @define is overridden by the Closure Compiler with the version in package.json
              
              /**
               * @define {string}
               */
              var SITEHOST = "localhost:8088";// this @define is overridden by the Closure Compiler with "www.pcjs.org"
              
              /**
               * @define {boolean}
               */
              var COMPILED = false;           // this @define is overridden by the Closure Compiler (to true)
              
              /**
               * @define {boolean}
               */
              var DEBUG = true;               // this @define is overridden by the Closure Compiler (to false) to remove DEBUG-only code
              
              /**
               * @define {boolean}
               */
              var MAXDEBUG = false;           // this @define is overridden by the Closure Compiler (to false) to remove MAXDEBUG-only code
              
              if (typeof module !== 'undefined') {
                  global.window = false;      // provides an alternative "if (typeof window === 'undefined')" (ie, "if (window) ...")
                  global.APPNAME = APPNAME;
                  global.APPVERSION = APPVERSION;
                  global.SITEHOST = SITEHOST;
                  global.COMPILED = COMPILED;
                  global.DEBUG = DEBUG;
                  global.MAXDEBUG = MAXDEBUG;
                  /*
                   * TODO: When we're "required" by Node, should we return anything via module.exports?
                   */
              }
              
            • diskapi.js
              /**
               * @fileoverview Disk APIs, as defined by httpapi.js and consumed by disk.js
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * Our "DiskIO API" looks like:
               *
               *      http://www.pcjs.org/api/v1/disk?action=open&volume=*10mb.img&mode=demandrw&chs=c:h:s&machine=xxx&user=yyy
               */
              var DiskAPI = {
                  ENDPOINT:       "/api/v1/disk",
                  QUERY: {
                      ACTION:     "action",   // value is one of DiskAPI.ACTION.*
                      VOLUME:     "volume",   // value is path of a disk image
                      MODE:       "mode",     // value is one of DiskAPI.MODE.*
                      CHS:        "chs",      // value is cylinders:heads:sectors:bytes
                      ADDR:       "addr",     // value is cylinder:head:sector:count
                      MACHINE:    "machine",  // value is machine token
                      USER:       "user",     // value is user ID
                      DATA:       "data"      // value is data to be written
                  },
                  ACTION: {
                      OPEN:       "open",
                      READ:       "read",
                      WRITE:      "write",
                      CLOSE:      "close"
                  },
                  MODE: {
                      LOCAL:      "local",    // this mode implies no API (at best, localStorage backing only)
                      PRELOAD:    "preload",  // this mode implies use of the DumpAPI
                      DEMANDRW:   "demandrw",
                      DEMANDRO:   "demandro"
                  },
                  FAIL: {
                      BADACTION:  "invalid action",
                      BADUSER:    "invalid user",
                      BADVOL:     "invalid volume",
                      OPENVOL:    "unable to open volume",
                      CREATEVOL:  "unable to create volume",
                      WRITEVOL:   "unable to write volume",
                      REVOKED:    "access revoked"
                  }
              };
              
              /*
               * Common (supported) diskette formats
               */
              DiskAPI.DISKETTE_FORMATS = {
                  163840:  [40,1,8],          // media type 0xFE: 40 cylinders, 1 head (single-sided),   8 sectors/track, ( 320 total sectors x 512 bytes/sector ==  163840)
                  184320:  [40,1,9],          // media type 0xFC: 40 cylinders, 1 head (single-sided),   9 sectors/track, ( 360 total sectors x 512 bytes/sector ==  184320)
                  327680:  [40,2,8],          // media type 0xFF: 40 cylinders, 2 heads (double-sided),  8 sectors/track, ( 640 total sectors x 512 bytes/sector ==  327680)
                  368640:  [40,2,9],          // media type 0xFD: 40 cylinders, 2 heads (double-sided),  9 sectors/track, ( 720 total sectors x 512 bytes/sector ==  368640)
                  737280:  [80,2,9],          // media type 0xF9: 80 cylinders, 2 heads (double-sided),  9 sectors/track, (1440 total sectors x 512 bytes/sector ==  737280)
                  1228800: [80,2,15],         // media type 0xF9: 80 cylinders, 2 heads (double-sided), 15 sectors/track, (2400 total sectors x 512 bytes/sector == 1228800)
                  1474560: [80,2,18],         // media type 0xF0: 80 cylinders, 2 heads (double-sided), 18 sectors/track, (2880 total sectors x 512 bytes/sector == 1474560)
                  2949120: [80,2,36]          // media type 0xF0: 80 cylinders, 2 heads (double-sided), 36 sectors/track, (5760 total sectors x 512 bytes/sector == 2949120)
              };
              
              DiskAPI.MBR = {
                  PARTITIONS: {
                      OFFSET:     0x1BE,
                      ENTRY: {
                          STATUS:         0x00,   // 0x80 if active
                          CHS_FIRST:      0x01,   // 3-byte CHS specifier
                          TYPE:           0x04,   // see TYPE.*
                          CHS_LAST:       0x05,   // 3-byte CHS specifier
                          LBA_FIRST:      0x08,
                          LBA_TOTAL:      0x0C,
                          LENGTH:         0x10
                      },
                      STATUS: {
                          ACTIVE:         0x80
                      },
                      TYPE: {
                          EMPTY:          0x00,
                          FAT12_PRIMARY:  0x01,   // DOS 2.0 and up (12-bit FAT)
                          FAT16_PRIMARY:  0x04    // DOS 3.0 and up (16-bit FAT)
                      }
                  },
                  SIG_OFFSET:     0x1FE,
                  SIGNATURE:      0xAA55          // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
              };
              
              /*
               * Boot sector offsets (and assorted constants) in DOS-compatible boot sectors (DOS 2.0 and up)
               *
               * WARNING: I've heard apocryphal stories about SIGNATURE being improperly reversed on some systems
               * (ie, 0x55AA instead 0xAA55) -- perhaps by a dyslexic programmer -- so be careful out there.
               */
              DiskAPI.BOOT = {
                  JMP_OPCODE:     0x000,      // 1 byte for a JMP opcode, followed by a 1 or 2-byte offset
                  OEM_STRING:     0x003,      // 8 bytes
                  SIG_OFFSET:     0x1FE,
                  SIGNATURE:      0xAA55      // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
              };
              
              /*
               * BIOS Parameter Block (BPB) offsets in DOS-compatible boot sectors (DOS 2.0 and up)
               */
              DiskAPI.BPB = {
                  SECTOR_BYTES:   0x00B,      // 2 bytes: bytes per sector (eg, 0x200 or 512)
                  CLUSTER_SECS:   0x00D,      // 1 byte: sectors per cluster (eg, 1)
                  RESERVED_SECS:  0x00E,      // 2 bytes: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (eg, 1)
                  TOTAL_FATS:     0x010,      // 1 byte: FAT copies (eg, 2)
                  ROOT_DIRENTS:   0x011,      // 2 bytes: root directory entries (eg, 0x40 or 64) 0x40 * 0x20 = 0x800 (1 sector is 0x200 bytes, total of 4 sectors)
                  TOTAL_SECS:     0x013,      // 2 bytes: number of sectors (eg, 0x140 or 320); if zero, refer to LARGE_SECS
                  MEDIA_TYPE:     0x015,      // 1 byte: media type (see DiskAPI.FAT.MEDIA_*)
                  FAT_SECS:       0x016,      // 2 bytes: sectors per FAT (eg, 1)
                  TRACK_SECS:     0x018,      // 2 bytes: sectors per track (eg, 8)
                  TOTAL_HEADS:    0x01A,      // 2 bytes: number of heads (eg, 1)
                  HIDDEN_SECS:    0x01C,      // 4 bytes: number of hidden sectors (always 0 for non-partitioned media)
                  LARGE_SECS:     0x020       // 4 bytes: number of sectors if TOTAL_SECS is zero
              };
              
              /*
               * Media descriptor bytes for DOS-compatible FAT-formatted disks (stored in the first byte of the FAT)
               */
              DiskAPI.FAT = {
                  MEDIA_160KB:    0xFE,       // 5.25-inch, 1-sided,  8-sector, 40-track
                  MEDIA_180KB:    0xFC,       // 5.25-inch, 1-sided,  9-sector, 40-track
                  MEDIA_320KB:    0xFF,       // 5.25-inch, 2-sided,  8-sector, 40-track
                  MEDIA_360KB:    0xFD,       // 5.25-inch, 2-sided,  9-sector, 40-track
                  MEDIA_720KB:    0xF9,       //  3.5-inch, 2-sided,  9-sector, 80-track
                  MEDIA_1200KB:   0xF9,       //  3.5-inch, 2-sided, 15-sector, 80-track
                  MEDIA_1440KB:   0xF0,       //  3.5-inch, 2-sided, 18-sector, 80-track
                  MEDIA_2880KB:   0xF0        //  3.5-inch, 2-sided, 36-sector, 80-track
              };
              
              /*
               * Cluster constants for 12-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
               */
              DiskAPI.FAT12 = {
                  MAX_CLUSTERS:   4084,
                  CLUSNUM_FREE:   0,          // this should NEVER appear in cluster chain (except at the start of an empty chain)
                  CLUSNUM_RES:    1,          // reserved; this should NEVER appear in cluster chain
                  CLUSNUM_MIN:    2,          // smallest valid cluster number
                  CLUSNUM_MAX:    0xFF6,      // largest valid cluster number
                  CLUSNUM_BAD:    0xFF7,      // bad cluster; this should NEVER appear in cluster chain
                  CLUSNUM_EOC:    0xFF8       // end of chain (actually, anything from 0xFF8-0xFFF indicates EOC)
              };
              
              /*
               * Cluster constants for 16-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
               */
              DiskAPI.FAT16 = {
                  MAX_CLUSTERS:   65524,
                  CLUSNUM_FREE:   0,          // this should NEVER appear in cluster chain (except at the start of an empty chain)
                  CLUSNUM_RES:    1,          // reserved; this should NEVER appear in cluster chain
                  CLUSNUM_MIN:    2,          // smallest valid cluster number
                  CLUSNUM_MAX:    0xFFF6,     // largest valid cluster number
                  CLUSNUM_BAD:    0xFFF7,     // bad cluster; this should NEVER appear in cluster chain
                  CLUSNUM_EOC:    0xFFF8      // end of chain (actually, anything from 0xFFF8-0xFFFF indicates EOC)
              };
              
              /*
               * Directory Entry offsets (and assorted constants) in FAT disk images
               *
               * NOTE: Versions of DOS prior to 2.0 use INVALID exclusively to mark available directory entries; any entry marked
               * UNUSED will actually be considered USED.  In DOS 2.0 and up, UNUSED was added to indicate that all remaining entries
               * are unused, relieving it from having to initialize the rest of the sectors in the directory cluster(s).  And in fact,
               * you WILL encounter garbage in subsequent directory sectors if you attempt to read past an UNUSED entry.
               */
              DiskAPI.DIRENT = {
                  NAME:           0x000,      // 8 bytes
                  EXT:            0x008,      // 3 bytes
                  ATTR:           0x00B,      // 1 byte
                  MODTIME:        0x016,      // 2 bytes
                  MODDATE:        0x018,      // 2 bytes
                  CLUSTER:        0x01A,      // 2 bytes
                  SIZE:           0x01C,      // 4 bytes (typically zero for subdirectories)
                  LENGTH:         0x20,       // 32 bytes total
                  UNUSED:         0x00,       // indicates this and all subsequent directory entries are unused
                  INVALID:        0xE5        // indicates this directory entry is unused
              };
              
              /*
               * Possible values for DIRENT.ATTR
               */
              DiskAPI.ATTR = {
                  READONLY:       0x01,       // PC-DOS 2.0 and up
                  HIDDEN:         0x02,
                  SYSTEM:         0x04,
                  LABEL:          0x08,       // PC-DOS 2.0 and up
                  SUBDIR:         0x10,       // PC-DOS 2.0 and up
                  ARCHIVE:        0x20        // PC-DOS 2.0 and up
              };
              
              if (typeof module !== 'undefined') module.exports = DiskAPI;
              
            • dumpapi.js
              /**
               * @fileoverview Disk APIs, as defined by diskdump.js and consumed by disk.js
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * Our "DiskDump API", such as it was, used to look like:
               *
               *      http://jsmachines.net/bin/convdisk.php?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
               *
               * To make it (a bit) more "REST-like", the above request now looks like:
               *
               *      http://www.pcjs.org/api/v1/dump?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
               *
               * Similarly, our "FileDump API" used to look like:
               *
               *      http://jsmachines.net/bin/convrom.php?rom=/devices/pc/bios/5150/1981-04-24.rom&format=json
               *
               * and that request now looks like:
               *
               *      http://www.pcjs.org/api/v1/dump?file=/devices/pc/bios/5150/1981-04-24.rom&format=json
               *
               * I don't think it makes sense to avoid "query" parameters, because blending the path of a disk image with the
               * the rest of the URL would be (a) confusing, and (b) more work to parse.
               */
              var DumpAPI = {
                  ENDPOINT:       "/api/v1/dump",
                  QUERY: {
                      DIR:        "dir",      // value is path of a directory (DiskDump only)
                      DISK:       "disk",     // value is path of a disk image (DiskDump only)
                      FILE:       "file",     // value is path of a ROM image file (FileDump only)
                      IMG:        "img",      // alias for DISK
                      PATH:       "path",     // value is path of a one or more files (DiskDump only)
                      FORMAT:     "format",   // value is one of FORMAT values below
                      COMMENTS:   "comments", // value is either "true" or "false"
                      DECIMAL:    "decimal",  // value is either "true" to force all numbers to decimal, "false" or undefined otherwise
                      MBHD:       "mbhd"      // value is hard disk size in Mb (formerly "mbsize") (DiskDump only)
                  },
                  FORMAT: {
                      JSON:       "json",     // default
                      DATA:       "data",     // same as "json", but built without JSON.stringify() (DiskDump only)
                      HEX:        "hex",      // deprecated
                      BYTES:      "bytes",    // displays data as hex bytes; normally used only when comments are enabled
                      IMG:        "img",      // returns the raw disk data (ie, using a Buffer object) (DiskDump only)
                      ROM:        "rom"       // returns the raw file data (ie, using a Buffer object) (FileDump only)
                  }
              };
              
              /*
               * Because we use an overloaded API endpoint (ie, one that's shared with the FileDump module), we must
               * also provide a list of commands which, when combined with the endpoint, define a unique request. 
               */
              DumpAPI.asDiskCommands = [DumpAPI.QUERY.DIR, DumpAPI.QUERY.DISK, DumpAPI.QUERY.PATH];
              DumpAPI.asFileCommands = [DumpAPI.QUERY.FILE];
              
              if (typeof module !== 'undefined') module.exports = DumpAPI;
            • embed.js
              /**
               * @fileoverview C1Pjs and PCjs embedding functionality.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Aug-28
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /* global window: true, XSLTProcessor: false, APPNAME: false, APPVERSION: false, DEBUG: true */
              
              if (typeof module !== 'undefined') {
                  var Component;
                  var str = require("./strlib");
                  var web = require("./weblib");
              }
              
              /*
               * We now support asynchronous XML and XSL file loads; simply set fAsync (below) to true.
               *
               * NOTE: For that support to work, we have to keep track of the number of machines on the page
               * (ie, how many embedMachine() calls were issued), reduce the count as each machine XML file
               * is fully transformed into HTML, and when the count finally returns to zero, notify all the
               * machine component init() handlers.
               *
               * Also, to prevent those init() handlers from running prematurely, we must disable all page
               * notification events at the start of the embedding process (web.enablePageEvents(false)) and
               * re-enable them at the end (web.enablePageEvents(true)).
               */
              var cMachines = 0;
              var fAsync = true;
              
              /**
               * loadXML(sFile, idMachine, sStateFile, fResolve, display, done)
               *
               * This is the preferred way to load all XML and XSL files. It uses loadResource()
               * to load them as strings, which parseXML() can massage before parsing/transforming them.
               *
               * For example, since I've been unable to get the XSLT document() function to work inside any
               * XSL document loaded by JavaScript's XSLT processor, that has prevented me from dynamically
               * loading any XML machine file that uses the "ref" attribute to refer to and incorporate
               * another XML document.
               *
               * To solve that, I've added an fResolve parameter that tells parseXML() to fetch any
               * referenced documents ITSELF and insert them into the XML string prior to parsing, instead
               * of relying on the XSLT template to pull them in.  That fetching is handled by resolveXML(),
               * which iterates over the XML until all "refs" have been resolved (including any nested
               * references).
               *
               * Also, XSL files with a <!DOCTYPE [...]> cause MSIE's Microsoft.XMLDOM.loadXML() function
               * to choke, so I strip that out prior to parsing as well.
               *
               * TODO: Figure out why the XSLT document() function works great when the web browser loads an
               * XML file (and the associated XSL file) itself, but does not work when loading documents via
               * JavaScript XSLT support. Is it broken, is it a security issue, or am I just calling it wrong?
               *
               * @param {string} sXMLFile
               * @param {string|null|undefined} idMachine
               * @param {string|null|undefined} sStateFile
               * @param {boolean} fResolve is true to resolve any "ref" attributes
               * @param {function(string)} display
               * @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
               */
              function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
              {
                  var doneLoadXML = function(sURLName, sXML, nErrorCode) {
                      if (nErrorCode) {
                          if (!sXML) sXML = "unable to load " + sXMLFile + " (" + nErrorCode + ")";
                          done(sXML, null);
                          return;
                      }
                      parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done);
                  };
                  display("Loading " + sXMLFile + "...");
                  web.loadResource(sXMLFile, fAsync, null, null, doneLoadXML);
              }
              
              /**
               * parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
               *
               * Generates an XML document from an XML string. This function also provides a work-around for XSLT's
               * lack of support for the document() function (at least on some browsers), by replacing every reference
               * tag (ie, a tag with a "ref" attribute) with the contents of the referenced file.
               *
               * @param {string} sXML
               * @param {string|null} sXMLFile
               * @param {string|null|undefined} idMachine
               * @param {string|null|undefined} sStateFile
               * @param {boolean} fResolve is true to resolve any "ref" attributes; default is false
               * @param {function(string)} display
               * @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
               */
              function parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
              {
                  var buildXML = function(sXML, sError) {
                      if (sError) {
                          done(sError, null);
                          return;
                      }
                      if (idMachine) {
                          var sURL = sXMLFile;
                          if (sURL && sURL.indexOf('/') < 0) sURL = window.location.pathname + sURL;
                          sXML = sXML.replace(/(<machine[^>]*\sid=)(['"]).*?\2/, "$1$2" + idMachine + "$2" + (sStateFile? " state=$2" + sStateFile + "$2" : "") + (sURL? " url=$2" + sURL + "$2" : ""));
                      }
                      /*
                       * If the resource we requested is not really an XML file (or the file didn't exist and the server simply returned
                       * a message like "Cannot GET /devices/pc/machine/5150/cga/64kb/donkey/machine.xml"), we'd like to display a more
                       * meaningful message, because the XML DOM parsers will blithely return a document that contains nothing useful; eg:
                       *
                       *      This page contains the following errors:error on line 1 at column 1:
                       *      Document is empty Below is a rendering of the page up to the first error.
                       *
                       * Supposedly, the IE XML DOM parser will throw an exception, but I haven't tested that, and unless all other
                       * browsers do that, that's not helpful.
                       *
                       * The best I can do at this stage (assuming web.loadResource() didn't drop any error information on the floor)
                       * is verify that the requested resource "looks like" valid XML (in other words, it begins with a '<').
                       */
                      var xmlDoc = null;
                      if (sXML.charAt(0) == '<') {
                          try {
                              if (window.ActiveXObject || "ActiveXObject" in window) {        // second test is required for IE11 on Windows 8.1
                                  /*
                                   * Another hack for MSIE, which fails to properly load XSL documents containing a <!DOCTYPE [...]> tag.
                                   */
                                  if (!fResolve) {
                                      sXML = sXML.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g, "");
                                  }
                                  xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
                                  xmlDoc.async = false;
                                  xmlDoc['loadXML'](sXML);
                              } else {
                                  xmlDoc = (new window.DOMParser()).parseFromString(sXML, "text/xml");
                              }
                          } catch(e) {
                              xmlDoc = null;
                              sXML = e.message;
                          }
                      } else {
                          sXML = "unrecognized XML: " + (sXML.length > 255? sXML.substr(0, 255) + "..." : sXML);
                      }
                      done(sXML, xmlDoc);
                  };
                  if (sXML) {
                      if (fResolve) {
                          resolveXML(sXML, display, buildXML);
                          return;
                      }
                      buildXML(sXML, null);
                      return;
                  }
                  done("no data" + (sXMLFile? " for file: " + sXMLFile : ""), null);
              }
              
              /**
               * resolveXML(sXML, display, done)
               *
               * Replaces every tag with a "ref" attribute with the contents of the corresponding file.
               *
               * TODO: Fix some of the limitations of this code, such as: 1) requiring the "ref" attribute
               * to appear as the tag's first attribute, 2) requiring the "ref" attribute to be double-quoted,
               * and 3) requiring the "ref" tag to be self-closing.
               *
               * @param {string} sXML
               * @param {function(string)} display
               * @param {function(string,(string|null))} done (the first string contains the resolved XML data, the second is for any error message)
               */
              function resolveXML(sXML, display, done)
              {
                  var matchRef;
                  var reRef = /<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g;
              
                  if ((matchRef = reRef.exec(sXML))) {
              
                      var sRefFile = matchRef[2];
              
                      var doneReadXML = function(sURLName, sXMLRef, nErrorCode) {
                          if (nErrorCode || !sXMLRef) {
                              done(sXML, "unable to resolve XML reference: " + matchRef[0] + " (" + nErrorCode + ")");
                              return;
                          }
                          /*
                           * If there are additional attributes in the "referring" XML tag, we want to insert them
                           * into the "referred" XML tag; attributes that don't exist in the referred tag should be
                           * appended, and attributes that DO exist should be overwritten.
                           */
                          var sRefAttrs = matchRef[3];
                          if (sRefAttrs) {
                              var aXMLRefTag = sXMLRef.match(new RegExp("<" + matchRef[1] + "[^>]*>"));
                              if (aXMLRefTag) {
                                  var sXMLNewTag = aXMLRefTag[0];
                                  /*
                                   * Iterate over all the attributes in the "referring" XML tag (sRefAttrs)
                                   */
                                  var matchAttr;
                                  var reAttr = /( [a-z]+=)(['"])(.*?)\2/g;
                                  while ((matchAttr = reAttr.exec(sRefAttrs))) {
                                      if (sXMLNewTag.indexOf(matchAttr[1]) < 0) {
                                          /*
                                           * This is the append case
                                           */
                                          sXMLNewTag = sXMLNewTag.replace(">", matchAttr[0] + ">");
                                      } else {
                                          /*
                                           * This is the overwrite case
                                           */
                                          sXMLNewTag = sXMLNewTag.replace(new RegExp(matchAttr[1] + "(['\"])(.*?)\\1"), matchAttr[0]);
                                      }
                                  }
                                  if (aXMLRefTag[0] != sXMLNewTag) {
                                      sXMLRef = sXMLRef.replace(aXMLRefTag[0], sXMLNewTag);
                                  }
                              } else {
                                  done(sXML, "missing <" + matchRef[1] + "> in " + sRefFile);
                                  return;
                              }
                          }
              
                          /*
                           * Apparently when a Windows Azure server delivers one of my XML files, it may modify the first line:
                           *
                           *      <?xml version="1.0" encoding="UTF-8"?>\n
                           *
                           * I didn't determine exactly what it was doing at this point (probably just changing the \n to \r\n),
                           * but in any case, relaxing the following replace() solved it.
                           */
                          sXMLRef = sXMLRef.replace(/<\?xml[^>]*>[\r\n]*/, "");
              
                          sXML = sXML.replace(matchRef[0], sXMLRef);
              
                          resolveXML(sXML, display, done);
                      };
              
                      display("Loading " + sRefFile + "...");
                      web.loadResource(sRefFile, fAsync, null, null, doneReadXML);
                      return;
                  }
                  done(sXML, null);
              }
              
              /**
               * embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
               *
               * This allows to you embed a machine on a web page, by transforming the machine XML into HTML.
               *
               * @param {string} sName is the app name (eg, "PCjs")
               * @param {string} sVersion is the app version (eg, "1.15.7")
               * @param {string} idElement
               * @param {string} sXMLFile
               * @param {string} sXSLFile
               * @param {string} [sStateFile]
               * @return {boolean} true if successful, false if error
               */
              function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
              {
                  var eMachine, eWarning, fSuccess = true;
              
                  cMachines++;
              
                  var doneMachine = function() {
                      Component.assert(cMachines > 0);
                      if (!--cMachines) {
                          if (fAsync) web.enablePageEvents(true);
                      }
                  };
              
                  var displayError = function(sError) {
                      Component.log(sError);
                      displayMessage("Error: " + sError);
                      if (fSuccess) doneMachine();
                      fSuccess = false;
                  };
              
                  var displayMessage = function(sMessage) {
                      if (eWarning === undefined) {
                          /*
                           * Our MarkOut module (in convertMDMachineLinks()) creates machine containers that look like:
                           *
                           *      <div id="' + sMachineID + '" class="machine-placeholder"><p>Embedded PC</p><p class="machine-warning">...</p></div>
                           *
                           * with the "machine-warning" paragraph pre-populated with a warning message that the user will
                           * see if nothing at all happens.  But hopefully, in the normal case (and especially the error case),
                           * *something* will have happened.
                           *
                           * Note that it is the HTMLOut module (in processMachines()) that ultimately decides which scripts to
                           * include and then generates the embedPC() and/or embedC1P() calls.
                           */
                          var aeWarning = (eMachine && Component.getElementsByClass(eMachine, "machine-warning"));
                          eWarning = (aeWarning && aeWarning[0]) || eMachine;
                      }
                      if (eWarning) eWarning.innerHTML = str.escapeHTML(sMessage);
                  };
              
                  try {
                      eMachine = window.document.getElementById(idElement);
                      if (eMachine) {
                          var sAppClass = sName.toLowerCase();        // eg, "pcjs" or "c1pjs"
                          if (!sXSLFile) {
                              /*
                               * Now that PCjs is an open-source project, we can make the following test more flexible,
                               * and revert to the internal template if DEBUG *or* internal version (instead of *and*).
                               *
                               * Third-party sites that don't use the PCjs server will ALWAYS want to specify a fully-qualified
                               * path to the XSL file, unless they choose to mirror our folder structure.
                               */
                              if (DEBUG || sVersion == "1.x.x") {
                                  sXSLFile = "/modules/" + sAppClass + "/templates/components.xsl";
                              } else {
                                  sXSLFile = "/versions/" + sAppClass + "/" + sVersion + "/components.xsl";
                              }
                          }
                          var loadXSL = function(sXML, xml) {
                              if (!xml) {
                                  displayError(sXML);
                                  return;
                              }
                              var transformXML = function(sXSL, xsl) {
                                  if (!xsl) {
                                      displayError(sXSL);
                                      return;
                                  }
                                  if (xsl) {
                                      /*
                                       * The <machine> template in components.xsl now generates a "machine div" that makes
                                       * the div we required the caller of embedMachine() to provide redundant, so instead
                                       * of appending this fragment to the caller's node, we REPLACE the caller's node.
                                       * This works only because because we ALSO inject the caller's "machine div" ID into
                                       * the fragment's ID during parseXML().
                                       *
                                       *      eMachine.innerHTML = sFragment;
                                       *
                                       * Also, if the transform function fails, make sure you're using the appropriate
                                       * "components.xsl" and not a "machine.xsl", because the latter will not produce valid
                                       * embeddable HTML (and is the most common cause of failure at this final stage).
                                       */
                                      displayMessage("Processing " + sXMLFile + "...");
                                      if (window.ActiveXObject || "ActiveXObject" in window) {        // second test is required for IE11 on Windows 8.1
                                          var sFragment = xml['transformNode'](xsl);
                                          if (sFragment) {
                                              eMachine.outerHTML = sFragment;
                                              doneMachine();
                                          } else {
                                              displayError("transformNodeToObject failed");
                                          }
                                      }
                                      else if (window.document.implementation && window.document.implementation.createDocument) {
                                          var xsltProcessor = new XSLTProcessor();
                                          xsltProcessor['importStylesheet'](xsl);
                                          var eFragment = xsltProcessor['transformToFragment'](xml, window.document);
                                          if (eFragment) {
                                              if (eMachine.parentNode) {
                                                  eMachine.parentNode.replaceChild(eFragment, eMachine);
                                                  doneMachine();
                                              } else {
                                                  displayError("invalid machine element: " + idElement);
                                              }
                                          } else {
                                              displayError("transformToFragment failed");
                                          }
                                      } else {
                                          /*
                                           * Perhaps I should have performed this test at the outset; on the other hand, I'm
                                           * not aware of any browsers don't support one or both of the above XSLT transformation
                                           * methods, so treat this as a bug.
                                           */
                                          displayError("unable to transform XML: unsupported browser");
                                      }
                                  } else {
                                      displayError("failed to load XSL file: " + sXSLFile);
                                  }
                              };
                              if (xml) {
                                  loadXML(sXSLFile, null, null, false, displayMessage, transformXML);
                              } else {
                                  displayError("failed to load XML file: " + sXMLFile);
                              }
                          };
                          if (sXMLFile.charAt(0) != '<') {
                              loadXML(sXMLFile, idElement, sStateFile, true, displayMessage, loadXSL);
                          } else {
                              parseXML(sXMLFile, null, idElement, sStateFile, false, displayMessage, loadXSL);
                          }
                      } else {
                          displayError("missing machine element: " + idElement);
                      }
                  } catch(e) {
                      displayError(e.message);
                  }
                  return fSuccess;
              }
              
              /**
               * embedC1P(idElement, sXMLFile, sXSLFile)
               *
               * @param {string} idElement
               * @param {string} sXMLFile
               * @param {string} sXSLFile
               * @return {boolean} true if successful, false if error
               */
              function embedC1P(idElement, sXMLFile, sXSLFile)
              {
                  if (fAsync) web.enablePageEvents(false);
                  return embedMachine("C1Pjs", APPVERSION, idElement, sXMLFile, sXSLFile);
              }
              
              /**
               * embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
               *
               * @param {string} idElement
               * @param {string} sXMLFile
               * @param {string} sXSLFile
               * @param {string} [sStateFile]
               * @return {boolean} true if successful, false if error
               */
              function embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
              {
                  if (fAsync) web.enablePageEvents(false);
                  return embedMachine("PCjs", APPVERSION, idElement, sXMLFile, sXSLFile, sStateFile);
              }
              
              /**
               * Prevent the Closure Compiler from renaming functions we want to export, by adding them
               * as (named) properties of a global object.
               */
              if (APPNAME == "PCjs") {
                  window['embedPC'] = embedPC;
              }
              
              if (APPNAME == "C1Pjs") {
                  window['embedC1P'] = embedC1P;
              }
              
              window['enableEvents'] = web.enablePageEvents;
              window['sendEvent'] = web.sendPageEvent;
              
            • externs.js
              /**
               * @fileoverview Externs used by PCjs and C1Pjs (for the Closure Compiler)
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2012-Dec-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var global;
              
              // var webkitAudioContext;
              
            • netlib.js
              /**
               * @fileoverview Net-related functions
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-03-16
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /* global Buffer: false */
              
              var net = {};
              
              if (typeof module !== 'undefined') {
                  var sServerRoot;
                  var fs = require("fs");
                  var http = require("http");
                  var path = require("path");
                  var url = require("url");
                  var str = require("./strlib");
              }
              
              /*
               * The following are (super-secret) commands that can be added to the URL to enable special features.
               *
               * Our super-secret command processor is affectionately call Gort, and while Gort doesn't understand commands
               * like "Klaatu barada nikto", it does understand commands like "debug" and "rebuild"; eg:
               *
               *      http://www.pcjs.org/?gort=debug
               *
               * hasParm() detects the presence of the specified command, and propagateParms() is a URL filter that ensures
               * any commands listed in asPropagate are passed through to all other URLs on the same page; using any of these
               * commands also forces the page to be rebuilt and not cached (since we would never want a cached "index.html" to
               * contain/expose any of these commands).
               */
              net.GORT_COMMAND    = "gort";
              net.GORT_DEBUG      = "debug";          // use this to force uncompiled JavaScript even on a Release server
              net.GORT_NODEBUG    = "nodebug";        // use this to force uncompiled JavaScript but with DEBUG code disabled
              net.GORT_RELEASE    = "release";        // use this to force the use of compiled JavaScript even on a Debug server
              net.GORT_REBUILD    = "rebuild";        // use this to force the "index.html" in the current directory to be rebuilt
              
              net.REVEAL_COMMAND  = "reveal";
              net.REVEAL_PDFS     = "pdfs";
              
              /*
               * This is a list of the URL parameters that propagateParms() will propagate from the requester's URL to
               * other URLs provided by the requester.
               */
              var asPropagate  = [net.GORT_COMMAND, "autostart"];
              
              /**
               * hasParm(sParm, sValue, req)
               *
               * @param {string} sParm
               * @param {string|null} sValue (pass null to check for the presence of ANY sParm)
               * @param {Object} [req] is the web server's (ie, Express) request object, if any
               * @return {boolean} true if the request Object contains the specified parameter/value, false if not
               *
               * TODO: Consider whether sParm === null should check for the presence of ANY parameter in asPropagate.
               */
              net.hasParm = function(sParm, sValue, req)
              {
                  return (req && req.query && req.query[sParm] && (!sValue || req.query[sParm] == sValue));
              };
              
              /**
               * propagateParms(sURL, req)
               *
               * Propagates any "special" query parameters (as listed in asPropagate) from the given
               * request object (req) to the given URL (sURL).
               *
               * We do not modify an sURL that already contains a '?' OR that begins with a protocol
               * (eg, http:, mailto:, etc), in order to keep this function simple, since it's only for
               * debugging purposes anyway.  I also considered blowing off any URLs with a '#' for the
               * same reason, since any hash string must follow any query parameters, but stripping
               * and re-appending the hash string is pretty trivial, so we do handle that.
               *
               * TODO: Make propagateParms() more general-purpose (eg, capable of detecting any URL
               * to the same site, and capable of merging any of our "special" query parameters with any
               * existing query parameters.
               *
               * @param {string|null} sURL
               * @param {Object} [req] is the web server's (ie, Express) request object, if any
               * @return {string} massaged sURL
               */
              net.propagateParms = function(sURL, req)
              {
                  if (sURL !== null && sURL.indexOf('?') < 0) {
                      var i;
                      var sHash = "";
                      if ((i = sURL.indexOf('#')) >= 0) {
                          sHash = sURL.substr(i);
                          sURL = sURL.substr(0, i);
                      }
                      var match = sURL.match(/^([a-z])+:(.*)/);
                      if (!match && req && req.query) {
                          for (i = 0; i < asPropagate.length; i++) {
                              var sQuery = asPropagate[i];
                              var sValue;
                              if ((sValue = req.query[sQuery])) {
                                  var sParm = (sURL.indexOf('?') < 0? '?' : '&');
                                  sParm += sQuery + '=';
                                  if (sURL.indexOf(sParm) < 0) sURL += sParm + encodeURIComponent(sValue);
                              }
                          }
                      }
                      sURL += sHash;
                  }
                  return sURL;
              };
              
              /**
               * encodeURL(sURL, req, fDebug)
               *
               * Used to encodes any URLs presented on the current page, using this 3-step (um, 4-step) process:
               *
               *  1) Replace any backslashes with slashes, in case the URL was derived from a file system path
               *  2) Remap links that begin with "static/" to the corresponding URL at "http://static.pcjs.org/"
               *  3) Transform any "htmlspecialchars" into the corresponding entities, using encodeURI()
               *  4) Massage the result with net.propagateParms(), so that any special parameters are passed along
               *
               * @param {string} sURL
               * @param {Object} req is the web server's (ie, Express) request object, if any
               * @param {boolean} [fDebug]
               * @return {string} encoded URL
               */
              net.encodeURL = function(sURL, req, fDebug)
              {
                  if (sURL) {
                      sURL = sURL.replace(/\\/g, '/');
                      if (!fDebug) {
                          if (sURL.match(/^[^:?]*static\//)) {
                              if (sURL.charAt(0) != '/') sURL = path.join(req.path, sURL);
                              sURL = "http://static.pcjs.org" + sURL.replace("/static/", "/");
                          }
                      }
                      return net.propagateParms(encodeURI(sURL), req);
                  }
                  return sURL;
              };
              
              /**
               * isRemote(sPath)
               *
               * @param {string} sPath
               * @return {boolean} true if sPath is a (supported) remote path, false if not
               *
               * TODO: Add support for FTP? HTTPS? Anything else?
               */
              net.isRemote = function(sPath)
              {
                  return (sPath.indexOf("http:") === 0);
              };
              
              /**
               * getStat(sURL, done)
               *
               * @param {string} sURL
               * @param {function(Error,Object)} done
               */
              net.getStat = function(sURL, done)
              {
                  var options = url.parse(sURL);
                  options.method = "HEAD";
                  options.path = options.pathname;    // TODO: Determine the necessity of aliasing this
                  var req = http.request(options, function(res) {
                      var err = null;
                      var stat = null;
                      // console.log(JSON.stringify(res.headers));
                      if (res.statusCode == 200) {
                          /*
                           * Apparently Node lower-cases response headers (at least incoming headers, despite
                           * lots of amusing whining by certain people in the Node community), which seems like
                           * a good thing, because that means I can do two simple key look-ups.
                           */
                          var sLength = res.headers['content-length'];
                          var sModified = res.headers['last-modified'];
                          stat = {
                              size: sLength? parseInt(sLength, 10) : -1,
                              mtime: sModified? new Date(sModified) : null,
                              remote: true            // an additional property we provide to indicate this is not your normal stats object
                          };
                      } else {
                          err = new Error("unexpected response code: " + res.statusCode);
                      }
                      done(err, stat);
                  });
                  req.on('error', function(err) {
                      done(err, null);
                  });
                  req.end();
              };
              
              /**
               * getFile(sURL, sEncoding, done)
               *
               * @param {string} sURL is the source file
               * @param {string|null} sEncoding is the encoding to assume, if any
               * @param {function(Error,number,(string|Buffer))} done receives an Error, an HTTP status code, and a Buffer (if any)
               *
               * TODO: Add support for FTP? HTTPS? Anything else?
               */
              net.getFile = function(sURL, sEncoding, done)
              {
                  /*
                   * Buffer objects are a fixed size, so my choices are: 1) call getStat() first, hope it returns
                   * the true size, and then preallocate a buffer; or 2) create a new, larger buffer every time a new
                   * chunk arrives.  The latter seems best.
                   *
                   * However, if an encoding is given, we'll simply concatenate all the data into a String and return
                   * that instead.  Note that the incoming data is always a Buffer, but concatenation with a String
                   * performs an implied "toString()" on the Buffer.
                   *
                   * WARNING: Even when an encoding is provided, we don't make any attempt to verify that the incoming
                   * data matches that encoding.
                   */
                  var sFile = "";
                  var bufFile = null;
                  http.get(sURL, function(res) {
                      res.on('data', function(data) {
                          if (sEncoding) {
                              sFile += data;
                              return;
                          }
                          if (!bufFile) {
                              bufFile = data;
                              return;
                          }
                          /*
                           * We need to grow bufFile.  I used to do this myself, using the "copy" method:
                           *
                           *      buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
                           *
                           * which defaults to 0 for [targetStart] and [sourceStart], but the docs don't clearly
                           * define the default value for [sourceEnd].  They say "buffer.length", but there is no
                           * parameter here named "buffer".  Let's hope that in the case of "bufFile.copy(buf)"
                           * they meant "bufFile.length".
                           *
                           * However, it turns out this is moot, because there's a new kid in town: Buffer.concat().
                           *
                           *      buf = new Buffer(bufFile.length + data.length);
                           *      bufFile.copy(buf);
                           *      data.copy(buf, bufFile.length);
                           *      bufFile = buf;
                           */
                          bufFile = Buffer.concat([bufFile, data], bufFile.length + data.length);
                      }).on('end', function() {
                          /*
                           * TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
                           * in such cases, the file content will likely just be an HTML error page.
                           */
                          if (res.statusCode < 400) {
                              done(null, res.statusCode, sEncoding? sFile : bufFile);
                          } else {
                              done(new Error(sEncoding? sFile : bufFile), res.statusCode, null);
                          }
                      }).on('error', function(err) {
                          done(err, res.statusCode, null);
                      });
                  });
              };
              
              /**
               * downloadFile(sURL, sFile, done)
               *
               * @param {string} sURL is the source file
               * @param {string} sFile is a fully-qualified target file
               * @param {function(Error,number)} done is a callback that receives an Error and a HTTP status code
               */
              net.downloadFile = function(sURL, sFile, done)
              {
                  var file = fs.createWriteStream(sFile);
              
                  /*
                   * http.get() accepts a "url" string in lieu of an "options" object; it automatically builds
                   * the latter from the former using url.parse(). This is good, because it relieves me from
                   * building my own "options" object, and also from wondering why http functions expect "options"
                   * to contain a "path" property, whereas url.parse() returns a "pathname" property.
                   *
                   * Either the documentation isn't quite right for url.parse() or http.request() (the big brother
                   * of http.get), or one of those "options" properties is aliased to the other, or...?
                   */
                  http.get(sURL, function(res) {
                      res.on('data', function(data) {
                          file.write(data);
                      }).on('end', function() {
                          file.end();
                          /*
                           * TODO: We should try to update the file's modification time to match the 'last-modified'
                           * response header value, if any.
                           *
                           * TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
                           * in such cases, the file content will likely just be an HTML error page.
                           */
                          done(null, res.statusCode);
                      }).on('error', function(err) {
                          done(err, res.statusCode);
                      });
                  });
              };
              
              /**
               * loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
               *
               * Request the specified resource (sURL), and once the request is complete,
               * optionally call the specified method (fnNotify) of the specified component (componentNotify).
               *
               * TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
               *
               *      {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
               *
               * NOTE: This function is a mirror image of the weblib version, for server-side component testing within Node;
               * since it is NOT intended for production use, it may make liberal use of synchronous functions, warning messages, etc.
               *
               * @param {string} sURL
               * @param {boolean} [fAsync] is true for an asynchronous request
               * @param {Object|null} [data] for a POST request (default is a GET request)
               * @param {Component} [componentNotify]
               * @param {function(...)} [fnNotify]
               * @param {number|string|null|Object|Array} [pNotify] optional fnNotify parameter
               * @return {Array} containing errorCode and responseText (empty array if async request)
               */
              net.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify) {
                  var nErrorCode = -1;
                  var sResponse = null;
                  if (net.isRemote(sURL)) {
                      console.log('net.loadResource("' + sURL + '"): unimplemented');
                  } else {
                      if (!sServerRoot) {
                          sServerRoot = path.join(path.dirname(fs.realpathSync(__filename)), "../../../");
                      }
                      var sBaseName = str.getBaseName(sURL);
                      var sFile = path.join(sServerRoot, sURL);
                      if (fAsync) {
                          fs.readFile(sFile, {encoding: "utf8"}, function(err, s) {
                              /*
                               * TODO: If err is set, is there an error code we should return (instead of -1)?
                               */
                              if (!err) {
                                  sResponse = s;
                                  nErrorCode = 0;
                              }
                              if (fnNotify) {
                                  if (!componentNotify) {
                                      fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
                                  } else {
                                      fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
                                  }
                              }
                          });
                          return [];
                      } else {
                          try {
                              sResponse = fs.readFileSync(sFile, {encoding: "utf8"});
                              nErrorCode = 0;
                          } catch(err) {
                              /*
                               * TODO: If err is set, is there an error code we should return (instead of -1)?
                               */
                              console.log(err.message);
                          }
                          if (fnNotify) {
                              if (!componentNotify) {
                                  fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
                              } else {
                                  fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
                              }
                          }
                      }
                  }
                  return [nErrorCode, sResponse];
              };
              
              if (typeof module !== 'undefined') module.exports = net;
              
            • nodebug.js
              /**
               * @fileoverview Compile-time definitions for non-DEBUG configurations.
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Aug-22
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
               * at <http://jsmachines.net/> and <http://pcjs.org/>.
               *
               * PCjs is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with PCjs.  If not,
               * see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some PCjs files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * PCjs program for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /* global DEBUG: true */
              
              /*
               * In the compiled case, we rely on the Closure Compiler to override DEBUG, setting it to false,
               * so that all DEBUG-only code will be removed by the compiler.
               *
               * However, when we're in "development mode" and want to run uncompiled code without any DEBUG-only
               * code, we must arrange for this additional file, nodebug.js, to be loaded as early as possible,
               * which will then set DEBUG to false at runtime.
               */
              DEBUG = false;
              
            • proclib.js
              /**
               * @fileoverview Process-related helper functions
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-05-07
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var proc = {};
              
              /**
               * getArgs()
               *
               * Processes command-line arguments.  Arguments may be introduced by either
               * a double-hyphen (--) or a long dash (—), and argument values, if any, must be
               * separated by an "=" without any intervening whitespace.  Arguments without
               * an explicit value default to true, and any argument appearing more than once
               * is automatically converted to an Array.
               * 
               * Single-hyphen (-) arguments are allowed as well; they are treated as a series
               * of single-character arguments, each set to true, and any of these arguments
               * appearing more than once is discarded.
               *
               * @return {{argc:number, argv:{}}}
               */
              proc.getArgs = function() {
                  var argc = 0;
                  var argv = {};
                  for (var i = 2; i < process.argv.length; i++) {
                      var j, sSep;
                      var sArg = process.argv[i];
                      if (!sArg.indexOf(sSep = "--") || !sArg.indexOf(sSep = "—")) {
                          sArg = sArg.substr(sSep.length);
                          var sValue = true;
                          j = sArg.indexOf("=");
                          if (j > 0) {
                              sValue = sArg.substr(j+1);
                              sArg = sArg.substr(0, j);
                              sValue = (sValue == "true")? true : ((sValue == "false")? false : sValue);
                          }
                          if (argv[sArg] === undefined) {
                              argc++;
                              argv[sArg] = sValue;
                          } else {
                              // console.log("too many '" + sArg + "' arguments");
                              if (typeof argv[sArg] == "string") {
                                  argv[sArg] = [argv[sArg]];
                              }
                              argv[sArg].push(sValue);
                          }
                      } else if (!sArg.indexOf("-")) {
                          for (j = 1; j < sArg.length; j++) {
                              var ch = sArg.charAt(j);
                              if (argv[ch] === undefined) {
                                  argv[ch] = true;
                                  argc++;
                              }
                          } 
                      }
                  }
                  return {argc: argc, argv: argv};
              };
              
              if (typeof module !== 'undefined') module.exports = proc;
              
            • reportapi.js
              /**
               * @fileoverview Report API, as defined by httpapi.js
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-13
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var ReportAPI = {
                  ENDPOINT:       "/api/v1/report",
                  QUERY: {
                      APP:        "app",
                      VER:        "ver",
                      URL:        "url",
                      USER:       "user",
                      TYPE:       "type",
                      DATA:       "data"
                  },
                  TYPE: {
                      BUG:        "bug"
                  },
                  RES: {
                      OK:         "Thank you"
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = ReportAPI;
            • sockets.js
              /**
               * @fileoverview Experimental code included by HTMLOut() only if "--sockets"
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-Apr-29
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /* global io: false */
              
              // connect to the socket server
              var socket = io.connect();
              
              // if we get an "info" emit from the socket server then console.log the data we receive
              socket.on('info', function (data) {
                  console.log(data);
              });
            • strlib.js
              /**
               *  @fileoverview String-related helper functions
               *  @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               *  @version 1.0
               *  Created 2014-03-09
               *
               *  Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var str = {};
              
              /**
               * isValidInt(s, base)
               *
               * Since the built-in parseInt() function has the annoying feature of returning a partial value
               * when it encounters an invalid character (eg, parseInt("foo", 16) returns 0xf), use this function
               * to validate the entire string first.
               *
               * @param {string} s is the string representation of some number
               * @param {number} [base] is the radix of the number represented above (only 10 and 16 are supported)
               * @return {boolean} true if valid (or we're not sure because the base isn't recognized), false if invalid
               */
              str.isValidInt = function(s, base)
              {
                  if (!base || base == 10) return s.match(/^[0-9]+$/) !== null;
                  if (base == 16) return s.match(/^[0-9a-f]+$/i) !== null;
                  return true;
              };
              
              /**
               * parseInt(s, base)
               *
               * This is a wrapper around the built-in parseInt() function, which recognizes certain prefixes (eg,
               * '$' or "0x" for hex) and suffixes (eg, 'h' for hex or '.' for decimal), and then calls isValidInt()
               * to ensure we don't get partial values (see isValidInt() for details).
               *
               * @param {string} s is the string representation of some number
               * @param {number} [base] is the default radix to use (default is 16); can be overridden by prefixes/suffixes
               * @return {number|undefined} corresponding value, or undefined if invalid
               */
              str.parseInt = function(s, base)
              {
                  var value;
                  if (s) {
                      if (!base) base = 16;
                      if (s.charAt(0) == '$') {
                          base = 16;
                          s = s.substr(1);
                      } else if (s.substr(0, 2) == "0x") {
                          base = 16;
                          s = s.substr(2);
                      } else {
                          var chSuffix = s.charAt(s.length-1).toLowerCase();
                          if (chSuffix == 'h') {
                              base = 16;
                              chSuffix = null;
                          }
                          else if (chSuffix == '.') {
                              base = 10;
                              chSuffix = null;
                          }
                          if (chSuffix === null) s = s.substr(0, s.length-1);
                      }
                      var v;
                      if (str.isValidInt(s, base) && !isNaN(v = parseInt(s, base))) {
                          value = v|0;
                      }
                  }
                  return value;
              };
              
              /**
               * toHex(n, cch)
               *
               * Converts an integer to hex, with the specified number of digits (up to the default of 8).
               *
               * You might be tempted to use the built-in n.toString(16) instead, but it doesn't zero-pad and it
               * doesn't properly convert negative values; for example, if n is -2147483647, then n.toString(16)
               * will return "-7fffffff" instead of "80000001".  Moreover, if n is undefined, n.toString() will throw
               * an exception, whereas toHex() will simply return '?' characters.
               *
               * NOTE: The following work-around (adapted from code found on StackOverflow) would be another solution,
               * taking care of negative values, zero-padding, and upper-casing, but not undefined/NaN values:
               *
               *      s = (n < 0? n + 0x100000000 : n).toString(16);
               *      s = "00000000".substr(0, 8 - s.length) + s;
               *      s = s.substr(0, cch).toUpperCase();
               *
               * @param {number|null|undefined} n is a 32-bit value
               * @param {number} [cch] is the desired number of hex digits (8 is both the default and the maximum)
               * @return {string} the hex representation of n
               */
              str.toHex = function(n, cch)
              {
                  var s = "";
                  if (cch === undefined) {
                      cch = 8;
                  } else {
                      if (cch > 8) cch = 8;
                  }
                  /*
                   * An initial "falsey" check for null takes care of both null and undefined;
                   * we can't rely entirely on isNaN(), because isNaN(null) returns false, oddly enough.
                   */
                  if (n == null || isNaN(n)) {
                      while (cch-- > 0) s = '?' + s;
                  } else {
                      while (cch-- > 0) {
                          var d = n & 0xf;
                          d += (d >= 0 && d <= 9? 0x30 : 0x41 - 10);
                          s = String.fromCharCode(d) + s;
                          n >>= 4;
                      }
                  }
                  return s;
              };
              
              /**
               * toHexByte(b)
               *
               * Alias for "0x" + str.toHex(b, 2)
               *
               * @param {number|null|undefined} b is a byte value
               * @return {string} the hex representation of b
               */
              str.toHexByte = function(b)
              {
                  return "0x" + str.toHex(b, 2);
              };
              
              /**
               * toHexWord(w)
               *
               * Alias for "0x" + str.toHex(w, 4)
               *
               * @param {number|null|undefined} w is a word (16-bit) value
               * @return {string} the hex representation of w
               */
              str.toHexWord = function(w)
              {
                  return "0x" + str.toHex(w, 4);
              };
              
              /**
               * toHexLong(l)
               *
               * Alias for "0x" + toHex(l)
               *
               * @param {number|null|undefined} l is a dword (32-bit) value
               * @return {string} the hex representation of w
               */
              str.toHexLong = function(l)
              {
                  return "0x" + str.toHex(l);
              };
              
              /**
               * getBaseName(sFileName, fStripExt)
               *
               * This is a poor-man's version of Node's path.basename(), which Node-only components should use instead.
               *
               * Note that fStripExt can be used to strip ANY extension, whereas path.basename() will strip the extension only
               * if it matches the second parameter (eg, path.basename("/foo/bar/baz/asdf/quux.html", ".html") returns "quux").
               *
               * @param {string} sFileName
               * @param {boolean} [fStripExt]
               * @return {string}
               */
              str.getBaseName = function(sFileName, fStripExt)
              {
                  var sBaseName = sFileName;
              
                  var i = sFileName.lastIndexOf('/');
                  if (i >= 0) sBaseName = sFileName.substr(i + 1);
              
                  /*
                   * This next bit is a kludge to clean up names that are part of a URL that includes unsightly query parameters.
                   */
                  i = sBaseName.indexOf('&');
                  if (i > 0) sBaseName = sBaseName.substr(0, i);
              
                  if (fStripExt) {
                      i = sBaseName.lastIndexOf(".");
                      if (i > 0) {
                          sBaseName = sBaseName.substring(0, i);
                      }
                  }
                  return sBaseName;
              };
              
              /**
               * getExtension(sFileName)
               *
               * This is a poor-man's version of Node's path.extname(), which Node-only components should use instead.
               *
               * Note that we EXCLUDE the period from the returned extension, whereas path.extname() includes it.
               *
               * @param {string} sFileName
               * @return {string} the filename's extension (in lower-case and EXCLUDING the "."), or an empty string
               */
              str.getExtension = function(sFileName)
              {
                  var sExtension = "";
                  var i = sFileName.lastIndexOf(".");
                  if (i >= 0) {
                      sExtension = sFileName.substr(i + 1).toLowerCase();
                  }
                  return sExtension;
              };
              
              /**
               * endsWith(s, sSuffix)
               *
               * @param {string} s
               * @param {string} sSuffix
               * @return {boolean} true if s ends with sSuffix, false if not
               */
              str.endsWith = function(s, sSuffix)
              {
                  return s.indexOf(sSuffix, s.length - sSuffix.length) !== -1;
              };
              
              str.aHTMLEscapeMap = {
                  '&': '&amp;',
                  '<': '&lt;',
                  '>': '&gt;',
                  '"': '&quot;',
                  "'": '&#039;'
              };
              
              /**
               * escapeHTML(sHTML)
               *
               * @param {string} sHTML
               * @return {string} with HTML entities "escaped", similar to PHP's htmlspecialchars()
               */
              str.escapeHTML = function(sHTML)
              {
                  return sHTML.replace(/[&<>"']/g, function(m) {
                      return str.aHTMLEscapeMap[m];
                  });
              };
              
              /**
               * replaceAll(sFind, sReplace, s)
               *
               * @param {string} sFind
               * @param {string} sReplace
               * @param {string} s
               * @return {string}
               */
              str.replaceAll = function(sFind, sReplace, s)
              {
                  var a = {};
                  a[sFind] = sReplace;
                  return str.replaceArray(a, s);
              };
              
              /**
               * replaceArray(a, s)
               *
               * @param {Object} a
               * @param {string} s
               * @return {string}
               */
              str.replaceArray = function(a, s)
              {
                  var sMatch = "";
                  for (var k in a) {
                      /*
                       * As noted in:
                       *
                       *      http://www.regexguru.com/2008/04/escape-characters-only-when-necessary/
                       *
                       * inside character classes, only backslash, caret, hyphen and the closing bracket need to be
                       * escaped.  And in fact, if you ensure that the closing bracket is first, the caret is not first,
                       * and the hyphen is last, you can avoid escaping those as well.
                       */
                      k = k.replace(/([\\[\]*{}().+?])/g, "\\$1");
                      sMatch += (sMatch? '|' : '') + k;
                  }
                  return s.replace(new RegExp('(' + sMatch + ')', "g"), function(m) {
                      return a[m];
                  });
              };
              
              /**
               * pad(s, cch)
               *
               * Note that the maximum amount of padding currently supported is 40 spaces.
               *
               * @param {string} s is a string
               * @param {number} cch is desired length
               * @returns {string} the original string (s) with spaces padding it to the specified length
               */
              str.pad = function(s, cch)
              {
                  return s + "                                        ".substr(0, cch - s.length);
              };
              
              /**
               * trim(s)
               *
               * @param {string} s
               * @returns {string}
               */
              str.trim = function(s)
              {
                  if (String.prototype.trim) {
                      return s.trim();
                  }
                  return s.replace(/^\s+|\s+$/g, "");
              };
              
              if (typeof module !== 'undefined') module.exports = str;
              
            • userapi.js
              /**
               * @fileoverview User API, as defined by httpapi.js
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * Created 2014-May-13
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              /*
               * Examples of User API requests:
               * 
               *      web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUser;
               */
              
              var UserAPI = {
                  ENDPOINT:       "/api/v1/user",
                  QUERY: {
                      REQ:        "req",      // specifies a request 
                      USER:       "user",     // specifies a user ID
                      STATE:      "state",    // specifies a state ID 
                      DATA:       "data"      // specifies state data
                  },
                  REQ: {
                      CREATE:     "create",   // creates a user ID
                      VERIFY:     "verify",   // requests verification of a user ID
                      STORE:      "store",    // stores a machine state on the server
                      LOAD:       "load"      // loads a machine state from the server
                  },
                  RES: {
                      CODE:       "code",
                      DATA:       "data"
                  },
                  CODE: {
                      OK:         "ok",
                      FAIL:       "error"
                  },
                  FAIL: {
                      DUPLICATE:  "user already exists",
                      VERIFY:     "unable to verify user",
                      BADSTATE:   "invalid state parameter",
                      NOSTATE:    "no machine state",
                      BADLOAD:    "unable to load machine state",
                      BADSTORE:   "unable to save machine state"
                  }
              };
              
              if (typeof module !== 'undefined') module.exports = UserAPI;
            • usrlib.js
              /**
               *  @fileoverview Assorted helper functions
               *  @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               *  @version 1.0
               *  Created 2014-03-09
               *
               *  Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var usr = {};
              
              /**
               * binarySearch(a, v, fnCompare)
               *
               * @param {Array} a is an array
               * @param {number|string|Array|Object} v
               * @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
               * @return {number} the index of matching entry if non-negative, otherwise the index of the insertion point
               */
              usr.binarySearch = function(a, v, fnCompare) {
                  var left = 0;
                  var right = a.length;
                  var found = 0;
                  if (fnCompare === undefined) {
                      fnCompare = function(a, b) {
                          return a > b? 1 : a < b? -1 : 0;
                      };
                  }
                  while (left < right) {
                      var middle = (left + right) >> 1;
                      var compareResult;
                      compareResult = fnCompare(v, a[middle]);
                      if (compareResult > 0) {
                          left = middle + 1;
                      } else {
                          right = middle;
                          found = !compareResult;
                      }
                  }
                  return found? left : ~left;
              };
              
              /**
               * binaryInsert(a, v, fnCompare)
               *
               * If element v already exists in array a, the array is unchanged (we don't allow duplicates); otherwise, the
               * element is inserted into the array at the appropriate index.
               *
               * @param {Array} a is an array
               * @param {number|string|Array|Object} v is the value to insert
               * @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
               */
              usr.binaryInsert = function(a, v, fnCompare) {
                  var index = usr.binarySearch(a, v, fnCompare);
                  if (index < 0) {
                      a.splice(-(index + 1), 0, v);
                  }
              };
              
              /**
               * getTime()
               *
               * @return {number} the current time, in milliseconds
               */
              usr.getTime = Date.now || function() { return +new Date(); };
              
              /**
               * getTimestamp()
               *
               * @return {string} timestamp containing the current date and time ("yyyy-mm-dd hh:mm:ss")
               */
              usr.getTimestamp = function() {
                  var date = new Date();
                  var padNum = function(n) {
                      return (n < 10? "0" : "") + n;
                  };
                  return date.getFullYear() + "-" + padNum(date.getMonth() + 1) + "-" + padNum(date.getDate()) + " " + padNum(date.getHours()) + ":" + padNum(date.getMinutes()) + ":" + padNum(date.getSeconds());
              };
              
              /**
               * getMonthDays(nMonth, nYear)
               *
               * Note that if we're being called on behalf of the RTC, its year is always truncated to two digits (mod 100),
               * so we have no idea what century the year 0 might refer to.  When using the normal leap-year formula, 0 fails
               * the mod 100 test but passes the mod 400 test, so as far as the RTC is concerned, every century year is a leap
               * year.  Since we're most likely dealing with the year 2000, that's fine, since 2000 was also a leap year.
               *
               * TODO: There IS a separate CMOS byte that's supposed to be set to CMOS_ADDR.CENTURY_DATE; it's always BCD,
               * so theoretically it will contain values like 0x19 or 0x20 (for the 20th and 21st centuries, respectively), and
               * we could add that as another parameter to this function, to improve the accuracy, but that would go beyond what
               * a real RTC actually does.
               *
               * @param {number} nMonth (1-12)
               * @param {number} nYear (normally a 4-digit year, but it may also be mod 100)
               * @return {number} the maximum (1-based) day allowed for the specified month and year
               */
              usr.getMonthDays = function(nMonth, nYear)
              {
                  var nDays = usr.aMonthDays[nMonth - 1];
                  if (nDays == 28) {
                      if ((nYear % 4) === 0 && ((nYear % 100) || (nYear % 400) === 0)) {
                          nDays++;
                      }
                  }
                  return nDays;
              };
              
              usr.asDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
              usr.asMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
              usr.aMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
              
              /**
               * formatDate(sFormat, date)
               *
               * @param {string} sFormat (eg, "F j, Y", "Y-m-d H:i:s")
               * @param {Date} [date] (default is the current time)
               * @return {string}
               *
               * Supported identifiers in sFormat include:
               *
               *      a:  lowercase ante meridiem and post meridiem (am or pm)
               *      d:  day of the month, 2 digits with leading zeros (01,...,31)
               *      g:  hour in 12-hour format, without leading zeros (1,...,12)
               *      i:  minutes, with leading zeros (00,...,59)
               *      j:  day of the month, without leading zeros (1,...,31)
               *      l:  day of the week ("Sunday",...,"Saturday")
               *      m:  month, with leading zeros (01,...,12)
               *      s:  seconds, with leading zeros (00,...,59)
               *      F:  month ("January",...,"December")
               *      H:  hour in 24-hour format, with leading zeros (00,...,23)
               *      Y:  year (eg, 2014)
               *
               * For more inspiration, see: http://php.net/manual/en/function.date.php
               */
              usr.formatDate = function(sFormat, date) {
                  var sDate = "";
                  if (!date) date = new Date();
                  var iHour = date.getHours();
                  var iDay = date.getDate();
                  var iMonth = date.getMonth() + 1;
                  for (var i = 0; i < sFormat.length; i++) {
                      var ch;
                      switch((ch = sFormat.charAt(i))) {
                      case 'a':
                          sDate += (iHour < 12? "am" : "pm");
                          break;
                      case 'd':
                          sDate += ('0' + iDay).slice(-2);
                          break;
                      case 'g':
                          sDate += (!iHour? 12 : (iHour > 12? iHour - 12 : iHour));
                          break;
                      case 'i':
                          sDate += ('0' + date.getMinutes()).slice(-2);
                          break;
                      case 'j':
                          sDate += iDay;
                          break;
                      case 'l':
                          sDate += usr.asDays[date.getDay()];
                          break;
                      case 'm':
                          sDate += ('0' + iMonth).slice(-2);
                          break;
                      case 's':
                          sDate += ('0' + date.getSeconds()).slice(-2);
                          break;
                      case 'F':
                          sDate += usr.asMonths[iMonth - 1];
                          break;
                      case 'H':
                          sDate += ('0' + iHour).slice(-2);
                          break;
                      case 'Y':
                          sDate += date.getFullYear();
                          break;
                      default:
                          sDate += ch;
                          break;
                      }
                  }
                  return sDate;
              };
              
              /**
               * @typedef {{
               *  mask:       number,
               *  shift:      number
               * }}
               */
              var BitField;
              
              /**
               * @typedef {Object.<BitField>}
               */
              var BitFields;
              
              /**
               * defineBitFields(bfs)
               *
               * Prepares a bit field definition for use with getBitField() and setBitField(); eg:
               *
               *      var bfs = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
               *
               * The above defines a set of bit fields containg four fields: num (bits 0-19), count (bits 20-27), btmod (bit 28), and type (bits 29-31).
               *
               *      usr.setBitField(bfs.num, n, 1);
               *
               * The above set bit field "bfs.num" in numeric variable "n" to the value 1.
               *
               * @param {Object} bfs
               * @return {*} (technically, we transform the bfs object into a BitFields object, but the Closure Compiler won't let us specify that)
               */
              usr.defineBitFields = function(bfs)
              {
                  var bit = 0;
                  for (var f in bfs) {
                      var width = bfs[f];
                      var mask = ((1 << width) - 1) << bit;
                      bfs[f] = {mask: mask, shift: bit};
                      bit += width;
                  }
                  // Component.assert(bit <= 32);
                  return bfs;
              };
              
              /**
               * initBitFields(bfs, ...)
               *
               * @param {BitFields} bfs
               * @param {...number} var_args
               * @return {number} a value containing all supplied bit fields
               */
              usr.initBitFields = function(bfs, var_args)
              {
                  var v = 0, i = 1;
                  for (var f in bfs) {
                      if (i >= arguments.length) break;
                      v = usr.setBitField(bfs[f], v, arguments[i++]);
                  }
                  return v;
              };
              
              /**
               * getBitField(bf, v)
               *
               * @param {BitField} bf
               * @param {number} v is a value containing bit fields
               * @return {number} the value of the bit field in v defined by bf
               */
              usr.getBitField = function(bf, v)
              {
                  return (v & bf.mask) >> bf.shift;
              };
              
              /**
               * setBitField(bf, v, n)
               *
               * @param {BitField} bf
               * @param {number} v is a value containing bit fields
               * @param {number} n is a value to store in v in the bit field defined by bf
               * @return {number} updated v
               */
              usr.setBitField = function(bf, v, n)
              {
                  // Component.assert(!(n & ~(bf.mask >>> bf.shift)));
                  return (v & ~bf.mask) | ((n << bf.shift) & bf.mask);
              };
              
              /**
               * indexOf(a, t, i)
               *
               * Use this instead of Array.prototype.indexOf() if you can't be sure the browser supports it.
               *
               * @param {Array} a
               * @param {*} t
               * @param {number} [i]
               * @returns {number}
               */
              usr.indexOf = function(a, t, i)
              {
                  if (Array.prototype.indexOf) {
                      return a.indexOf(t, i);
                  }
                  i = i || 0;
                  if (i < 0) i += a.length;
                  if (i < 0) i = 0;
                  for (var n = a.length; i < n; i++) {
                      if (i in a && a[i] === t) return i;
                  }
                  return -1;
              };
              
              if (typeof module !== 'undefined') module.exports = usr;
              
            • weblib.js
              /**
               * @fileoverview Browser-related helper functions
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2014-05-08
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              /*
               * According to http://www.w3schools.com/jsref/jsref_obj_global.asp, these are the *global* properties
               * and functions of JavaScript-in-the-Browser:
               *
               * Property             Description
               * ---
               * Infinity             A numeric value that represents positive/negative infinity
               * NaN                  "Not-a-Number" value
               * undefined            Indicates that a variable has not been assigned a value
               *
               * Function             Description
               * ---
               * decodeURI()          Decodes a URI
               * decodeURIComponent() Decodes a URI component
               * encodeURI()          Encodes a URI
               * encodeURIComponent() Encodes a URI component
               * escape()             Deprecated in version 1.5. Use encodeURI() or encodeURIComponent() instead
               * eval()               Evaluates a string and executes it as if it was script code
               * isFinite()           Determines whether a value is a finite, legal number
               * isNaN()              Determines whether a value is an illegal number
               * Number()             Converts an object's value to a number
               * parseFloat()         Parses a string and returns a floating point number
               * parseInt()           Parses a string and returns an integer
               * String()             Converts an object's value to a string
               * unescape()           Deprecated in version 1.5. Use decodeURI() or decodeURIComponent() instead
               *
               * And according to http://www.w3schools.com/jsref/obj_window.asp, these are the properties and functions
               * of the *window* object.
               *
               * Property             Description
               * ---
               * closed               Returns a Boolean value indicating whether a window has been closed or not
               * defaultStatus        Sets or returns the default text in the statusbar of a window
               * document             Returns the Document object for the window (See Document object)
               * frames               Returns an array of all the frames (including iframes) in the current window
               * history              Returns the History object for the window (See History object)
               * innerHeight          Returns the inner height of a window's content area
               * innerWidth           Returns the inner width of a window's content area
               * length               Returns the number of frames (including iframes) in a window
               * location             Returns the Location object for the window (See Location object)
               * name                 Sets or returns the name of a window
               * navigator            Returns the Navigator object for the window (See Navigator object)
               * opener               Returns a reference to the window that created the window
               * outerHeight          Returns the outer height of a window, including toolbars/scrollbars
               * outerWidth           Returns the outer width of a window, including toolbars/scrollbars
               * pageXOffset          Returns the pixels the current document has been scrolled (horizontally) from the upper left corner of the window
               * pageYOffset          Returns the pixels the current document has been scrolled (vertically) from the upper left corner of the window
               * parent               Returns the parent window of the current window
               * screen               Returns the Screen object for the window (See Screen object)
               * screenLeft           Returns the x coordinate of the window relative to the screen
               * screenTop            Returns the y coordinate of the window relative to the screen
               * screenX              Returns the x coordinate of the window relative to the screen
               * screenY              Returns the y coordinate of the window relative to the screen
               * self                 Returns the current window
               * status               Sets or returns the text in the statusbar of a window
               * top                  Returns the topmost browser window
               *
               * Method               Description
               * ---
               * alert()              Displays an alert box with a message and an OK button
               * atob()               Decodes a base-64 encoded string
               * blur()               Removes focus from the current window
               * btoa()               Encodes a string in base-64
               * clearInterval()      Clears a timer set with setInterval()
               * clearTimeout()       Clears a timer set with setTimeout()
               * close()              Closes the current window
               * confirm()            Displays a dialog box with a message and an OK and a Cancel button
               * createPopup()        Creates a pop-up window
               * focus()              Sets focus to the current window
               * moveBy()             Moves a window relative to its current position
               * moveTo()             Moves a window to the specified position
               * open()               Opens a new browser window
               * print()              Prints the content of the current window
               * prompt()             Displays a dialog box that prompts the visitor for input
               * resizeBy()           Resizes the window by the specified pixels
               * resizeTo()           Resizes the window to the specified width and height
               * scroll()             This method has been replaced by the scrollTo() method.
               * scrollBy()           Scrolls the content by the specified number of pixels
               * scrollTo()           Scrolls the content to the specified coordinates
               * setInterval()        Calls a function or evaluates an expression at specified intervals (in milliseconds)
               * setTimeout()         Calls a function or evaluates an expression after a specified number of milliseconds
               * stop()               Stops the window from loading
               */
              
              "use strict";
              
              /* global window: true, setTimeout: false, clearTimeout: false, SITEHOST: false */
              
              if (typeof module !== 'undefined') {
                  var Component;
                  require("./defines");
                  var str = require("./strlib");
                  var ReportAPI = require("./reportapi");
              }
              
              var web = {};
              
              /*
               * We must defer loading the Component module until the function(s) requiring it are
               * called; otherwise, we create an initialization cycle in which Component requires weblib
               * and weblib requires Component.
               *
               * In an ideal world, weblib would not be dependent on Component, but we really want to use
               * its I/O functions.  The simplest solution is to create wrapper functions.
               */
              
              /**
               * log(s, type)
               *
               * For diagnostic output only.  DEBUG must be true (or "--debug" specified via the command-line)
               * for Component.log() to display anything.
               *
               * @param {string} [s] is the message text
               * @param {string} [type] is the message type
               */
              web.log = function(s, type)
              {
                  if (typeof module !== 'undefined') {
                      if (!Component) Component = require("./component");
                  }
                  Component.log(s, type);
              };
              
              /**
               * notice(s, fPrintOnly, id)
               *
               * If Component.notice() calls web.alertUser(), it will fall back to web.log() if all else fails.
               *
               * @param {string} s is the message text
               * @param {boolean} [fPrintOnly]
               * @param {string} [id] is the caller's ID, if any
               */
              web.notice = function(s, fPrintOnly, id)
              {
                  if (typeof module !== 'undefined') {
                      if (!Component) Component = require("./component");
                  }
                  Component.notice(s, fPrintOnly, id);
              };
              
              /**
               * loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
               *
               * Request the specified resource (sURL), and once the request is complete,
               * optionally call the specified method (fnNotify) of the specified component (componentNotify).
               *
               * TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
               *
               *      {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
               *
               * @param {string} sURL
               * @param {boolean} [fAsync] is true for an asynchronous request
               * @param {Object} [data] for a POST request (default is a GET request)
               * @param {Component} [componentNotify]
               * @param {function(...)} [fnNotify]
               * @param {number|string|null|Object|Array} [pNotify] optional fnNotify info parameter
               * @return {Array} containing errorCode and responseText (empty array if fAsync is true)
               */
              web.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
              {
                  fAsync = !!fAsync;          // ensure that fAsync is a valid boolean (Internet Explorer xmlHTTP functions insist on it)
                  if (typeof module !== 'undefined') {
                      /*
                       * We don't even need to load Component, because we can't use any of the code below
                       * within Node anyway.  Instead, we must hand this request off to our network library.
                       *
                       *      if (!Component) Component = require("./component");
                       */
                      var net = require("./netlib");
                      return net.loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify);
                  }
                  var nErrorCode = 0;
                  var sURLData = null;
                  var sURLName = str.getBaseName(sURL);
                  var xmlHTTP = (window.XMLHttpRequest? new window.XMLHttpRequest() : new window.ActiveXObject("Microsoft.XMLHTTP"));
                  if (fAsync) {
                      xmlHTTP.onreadystatechange = function() {
                          if (xmlHTTP.readyState === 4) {
                              /*
                               * The following line was recommended for WebKit, as a work-around to prevent the handler firing multiple
                               * times when debugging.  Unfortunately, that's not the only XMLHttpRequest problem that occurs when
                               * debugging, so I think the WebKit problem is deeper than that.  When we have multiple XMLHttpRequests
                               * pending, any debugging activity means most of them simply get dropped on floor, so what may actually be
                               * happening are mis-notifications rather than redundant notifications.
                               *
                               *      xmlHTTP.onreadystatechange = undefined;
                               */
                              sURLData = xmlHTTP.responseText;
                              /*
                               * The normal "success" case is an HTTP status code of 200, but when testing with files loaded
                               * from the local file system (ie, when using the "file:" protocol), we have to be a bit more "flexible".
                               */
                              if (xmlHTTP.status == 200 || !xmlHTTP.status && sURLData.length && web.getHostProtocol() == "file:") {
                                  if (MAXDEBUG) web.log("xmlHTTP.onreadystatechange(" + sURL + "): returned " + sURLData.length + " bytes");
                              }
                              else {
                                  nErrorCode = xmlHTTP.status || -1;
                                  web.log("xmlHTTP.onreadystatechange(" + sURL + "): error code " + nErrorCode);
                              }
                              if (fnNotify) {
                                  if (!componentNotify) {
                                      fnNotify(sURLName, sURLData, nErrorCode, pNotify);
                                  } else {
                                      fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
                                  }
                              }
                          }
                      };
                  }
                  if (data) {
                      var sData = "";
                      for (var p in data) {
                          if (!data.hasOwnProperty(p)) continue;
                          if (sData) sData += "&";
                          sData += p + '=' + encodeURIComponent(data[p]);
                      }
                      sData = sData.replace(/%20/g, '+');
                      if (MAXDEBUG) web.log("web.loadResource(POST " + sURL + "): " + sData.length + " bytes");
                      xmlHTTP.open("POST", sURL, fAsync);
                      xmlHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                      xmlHTTP.send(sData);
                  } else {
                      if (MAXDEBUG) web.log("web.loadResource(GET " + sURL + ")");
                      xmlHTTP.open("GET", sURL, fAsync);
                      xmlHTTP.send();
                  }
                  var response = [];
                  if (!fAsync) {
                      sURLData = xmlHTTP.responseText;
                      if (xmlHTTP.status == 200) {
                          if (MAXDEBUG) web.log("web.loadResource(" + sURL + "): returned " + sURLData.length + " bytes");
                      } else {
                          nErrorCode = xmlHTTP.status || -1;
                          web.log("web.loadResource(" + sURL + "): error code " + nErrorCode);
                      }
                      if (fnNotify) {
                          if (!componentNotify) {
                              fnNotify(sURLName, sURLData, nErrorCode, pNotify);
                          } else {
                              fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
                          }
                      }
                      response = [nErrorCode, sURLData];
                  }
                  return response;
              };
              
              /**
               * sendReport(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
               *
               * Send a report (eg, bug report) to the server.
               *
               * @param {string} sApp (eg, "PCjs")
               * @param {string} sVer (eg, "1.02")
               * @param {string} sURL (eg, "/devices/pc/machine/5150/mda/64kb/machine.xml")
               * @param {string} sUser (ie, the user key, if any)
               * @param {string} sType (eg, "bug"); one of ReportAPI.TYPE.*
               * @param {string} sReport (eg, unparsed state data)
               * @param {string} [sHostName] (default is http://SITEHOST)
               */
              web.sendReport = function(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
              {
                  var data = {};
                  data[ReportAPI.QUERY.APP] = sApp;
                  data[ReportAPI.QUERY.VER] = sVer;
                  data[ReportAPI.QUERY.URL] = sURL;
                  data[ReportAPI.QUERY.USER] = sUser;
                  data[ReportAPI.QUERY.TYPE] = sType;
                  data[ReportAPI.QUERY.DATA] = sReport;
                  var sReportURL = (sHostName? sHostName : "http://" + SITEHOST) + ReportAPI.ENDPOINT;
                  web.loadResource(sReportURL, true, data);
              };
              
              /**
               * getHost()
               *
               * @return {string}
               */
              web.getHost = function()
              {
                  return ("http://" + (window? window.location.host : SITEHOST));
              };
              
              /**
               * getHostURL()
               *
               * @return {string|null}
               */
              web.getHostURL = function()
              {
                  return (window? window.location.href : null);
              };
              
              /**
               * getHostProtocol()
               *
               * @return {string}
               */
              web.getHostProtocol = function()
              {
                  return (window? window.location.protocol : "file:");
              };
              
              /**
               * getUserAgent()
               *
               * @return {string}
               */
              web.getUserAgent = function()
              {
                  return (window? window.navigator.userAgent : "");
              };
              
              /**
               * alertUser(sMessage)
               *
               * @param {string} sMessage
               */
              web.alertUser = function(sMessage)
              {
                  if (window) window.alert(sMessage); else web.log(sMessage);
              };
              
              /**
               * confirmUser(sPrompt)
               *
               * @param {string} sPrompt
               * @returns {boolean} true if the user clicked OK, false if Cancel/Close
               */
              web.confirmUser = function(sPrompt)
              {
                  var fResponse = false;
                  if (window) {
                      fResponse = window.confirm(sPrompt);
                  }
                  return fResponse;
              };
              
              /**
               * promptUser()
               *
               * @param {string} sPrompt
               * @param {string} [sDefault]
               * @returns {string|null}
               */
              web.promptUser = function(sPrompt, sDefault)
              {
                  var sResponse = null;
                  if (window) {
                      sResponse = window.prompt(sPrompt, sDefault === undefined? "" : sDefault);
                  }
                  return sResponse;
              };
              
              /**
               * fLocalStorage
               *
               * true if localStorage support exists, is enabled, and works; "falsey" otherwise
               *
               * @type {boolean|null}
               */
              web.fLocalStorage = null;
              
              /**
               * TODO: Is there any way to get the Closure Compiler to stop inlining this string?  This
               * isn't cutting it.
               *
               * @const {string}
               */
              web.sLocalStorageTest = "PCjs.localStorage";
              
              /**
               * hasLocalStorage
               *
               * true if localStorage support exists, is enabled, and works; false otherwise
               *
               * @return {boolean}
               */
              web.hasLocalStorage = function() {
                  if (web.fLocalStorage == null) {
                      var f = false;
                      if (window) {
                          try {
                              window.localStorage.setItem(web.sLocalStorageTest, web.sLocalStorageTest);
                              f = (window.localStorage.getItem(web.sLocalStorageTest) == web.sLocalStorageTest);
                              window.localStorage.removeItem(web.sLocalStorageTest);
                          } catch(e) {
                              web.logLocalStorageError(e);
                              f = false;
                          }
                      }
                      web.fLocalStorage = f;
                  }
                  return web.fLocalStorage;
              };
              
              /**
               * logLocalStorageError(e)
               *
               * @param {Error} e is an exception
               */
              web.logLocalStorageError = function(e)
              {
                  web.log(e.message, "localStorage error");
              };
              
              /**
               * getLocalStorageItem(sKey)
               *
               * Returns the requested key value, or null if the key does not exist, or undefined if localStorage is not available
               *
               * @param {string} sKey
               * @return {string|null|undefined} sValue
               */
              web.getLocalStorageItem = function(sKey)
              {
                  var sValue;
                  if (window) {
                      try {
                          sValue = window.localStorage.getItem(sKey);
                      } catch(e) {
                          web.logLocalStorageError(e);
                      }
                  }
                  return sValue;
              };
              
              /**
               * setLocalStorageItem(sKey, sValue)
               *
               * @param {string} sKey
               * @param {string} sValue
               * @return {boolean} true if localStorage is available, false if not
               */
              web.setLocalStorageItem = function(sKey, sValue)
              {
                  try {
                      window.localStorage.setItem(sKey, sValue);
                      return true;
                  } catch(e) {
                      web.logLocalStorageError(e);
                  }
                  return false;
              };
              
              /**
               * removeLocalStorageItem(sKey)
               *
               * @param {string} sKey
               */
              web.removeLocalStorageItem = function(sKey)
              {
                  try {
                      window.localStorage.removeItem(sKey);
                  } catch(e) {
                      web.logLocalStorageError(e);
                  }
              };
              
              /**
               * getLocalStorageKeys()
               *
               * @return {Array}
               */
              web.getLocalStorageKeys = function()
              {
                  var a = [];
                  try {
                      for (var i = 0, c = window.localStorage.length; i < c; i++) {
                          a.push(window.localStorage.key(i));
                      }
                  } catch(e) {
                      web.logLocalStorageError(e);
                  }
                  return a;
              };
              
              /**
               * reloadPage()
               */
              web.reloadPage = function()
              {
                  if (window) window.location.reload();
              };
              
              /**
               * isUserAgent(s)
               *
               * Check the browser's user-agent string for the given substring; "iOS" and "MSIE" are special values you can
               * use that will match any iOS or MSIE browser, respectively (even IE11, in the case of "MSIE").
               *
               * 2013-11-06: In a questionable move, MSFT changed the user-agent reported by IE11 on Windows 8.1, eliminating
               * the "MSIE" string (which MSDN calls a "version token"; see http://msdn.microsoft.com/library/ms537503.aspx);
               * they say "public websites should rely on feature detection, rather than browser detection, in order to design
               * their sites for browsers that don't support the features used by the website." So, in IE11, we get a user-agent
               * that tries to fool apps into thinking the browser is more like WebKit or Gecko:
               *
               *      Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
               *
               * That's a nice idea, but in the meantime, they hosed the XSL transform code in embed.js, which contained
               * some very critical browser-specific code; turning on IE's "Compatibility Mode" didn't help either, because
               * that's a sledgehammer solution which restores the old user-agent string but also disables other features like
               * HTML5 canvas support. As an interim solution, I'm treating any "MSIE" check as a check for either "MSIE" or
               * "Trident".
               *
               * UPDATE: I've since found ways to make the code in embed.js more browser-agnostic, so for now, there's isn't
               * any code that cares about "MSIE", but I've left the change in place, because I wouldn't be surprised if I'll
               * need more IE-specific code in the future, perhaps for things like copy/paste functionality, or mouse capture.
               *
               * @param {string} s is a substring to search for in the user-agent; as noted above, "iOS" and "MSIE" are special values
               * @return {boolean} is true if the string was found, false if not
               */
              web.isUserAgent = function(s)
              {
                  if (window) {
                      var userAgent = web.getUserAgent();
                      /*
                       * Here's one case where we have to be careful with Component, because when isUserAgent() is called by
                       * the init code below, component.js hasn't been loaded yet.  The simple solution for now is to remove the call.
                       *
                       *      web.log("agent: " + userAgent);
                       *
                       * And yes, it would be pointless to use the conditional (?) operator below, if not for the Google Closure
                       * Compiler (v20130823) failing to detect the entire expression as a boolean.
                       */
                      return (s == "iOS" && userAgent.match(/(iPod|iPhone|iPad)/) && userAgent.match(/AppleWebKit/) || s == "MSIE" && userAgent.match(/(MSIE|Trident)/) || (userAgent.indexOf(s) >= 0))? true : false;
                  }
                  return false;
              };
              
              /**
               * isMobile()
               *
               * Check the browser's user-agent string for the substring "Mobi", as per Mozilla recommendation:
               *
               *      https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
               *
               * @return {boolean} is true if the browser appears to be a mobile (ie, non-desktop) web browser, false if not
               */
              web.isMobile = function()
              {
                  return web.isUserAgent("Mobi");
              };
              
              /**
               * getURLParameters(sParms)
               *
               * @param {string} [sParms] containing the parameter portion of a URL (ie, after the '?')
               * @return {Object} containing properties for each parameter found
               */
              web.getURLParameters = function(sParms)
              {
                  var aParms = {};
                  if (window) {       // an alternative to "if (typeof module === 'undefined')" if require("defines") has been invoked
                      if (!sParms) {
                          /*
                           * Note that window.location.href returns the entire URL, whereas window.location.search
                           * returns only the parameters, if any (starting with the '?', which we skip over with a substr() call).
                           */
                          sParms = window.location.search.substr(1);
                      }
                      var match;
                      var pl = /\+/g;     // RegExp for replacing addition symbol with a space
                      var search = /([^&=]+)=?([^&]*)/g;
                      var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); };
              
                      while ((match = search.exec(sParms))) {
                          aParms[decode(match[1])] = decode(match[2]);
                      }
                  }
                  return aParms;
              };
              
              /**
               * onCountRepeat(n, fn, fnComplete, msDelay)
               *
               * Call fn() n times with an msDelay millisecond delay between calls, then
               * call fnComplete() when the count has been exhausted OR fn() returns false.
               *
               * @param {number} n
               * @param {function()} fn
               * @param {function()} fnComplete
               * @param {number} [msDelay]
               */
              web.onCountRepeat = function(n, fn, fnComplete, msDelay)
              {
                  var fnRepeat = function doCountRepeat() {
                      n -= 1;
                      if (n >= 0) {
                          if (!fn()) n = 0;
                      }
                      if (n > 0) {
                          setTimeout(fnRepeat, msDelay || 0);
                          return;
                      }
                      fnComplete();
                  };
                  fnRepeat();
              };
              
              /**
               * onClickRepeat(e, msDelay, msRepeat, fn)
               *
               * Repeatedly call fn() with an initial msDelay, and an msRepeat delay thereafter,
               * as long as HTML control Object e has an active "down" event and fn() returns true.
               *
               * @param {Object} e
               * @param {number} msDelay
               * @param {number} msRepeat
               * @param {function(boolean)} fn is passed false on the first call, true on all repeated calls
               */
              web.onClickRepeat = function(e, msDelay, msRepeat, fn)
              {
                  var ms = 0, timer = null, fIgnoreMouseEvents = false;
              
                  var fnRepeat = function doClickRepeat() {
                      if (fn(ms === msRepeat)) {
                          timer = setTimeout(fnRepeat, ms);
                          ms = msRepeat;
                      }
                  };
                  e.onmousedown = function() {
                      // web.log("onMouseDown()");
                      if (!fIgnoreMouseEvents) {
                          if (!timer) {
                              ms = msDelay;
                              fnRepeat();
                          }
                      }
                  };
                  e.ontouchstart = function() {
                      // web.log("onTouchStart()");
                      if (!timer) {
                          ms = msDelay;
                          fnRepeat();
                      }
                  };
                  e.onmouseup = e.onmouseout = function() {
                      // web.log("onMouseUp()/onMouseOut()");
                      if (timer) {
                          clearTimeout(timer);
                          timer = null;
                      }
                  };
                  e.ontouchend = e.ontouchcancel = function() {
                      // web.log("onTouchEnd()/onTouchCancel()");
                      if (timer) {
                          clearTimeout(timer);
                          timer = null;
                      }
                      /*
                       * Devices that generate ontouch* events ALSO generate onmouse* events,
                       * and generally do so immediately after all the touch events are complete,
                       * so unless we want double the action, we need to ignore mouse events.
                       */
                      fIgnoreMouseEvents = true;
                  };
              };
              
              web.aPageEventHandlers = {
                  'init': [],         // list of window 'onload' handlers
                  'show': [],         // list of window 'onpageshow' handlers
                  'exit': []          // list of window 'onunload' handlers (although we prefer to use 'onbeforeunload' if possible)
              };
              
              web.fPageReady = false; // set once the browser's first page initialization has occurred
              web.fPageEventsEnabled = true;
              
              /**
               * onPageEvent(sName, fn)
               *
               * @param {string} sFunc
               * @param {function()} fn
               *
               * Use this instead of setting window['onunload'], window['onunload'], etc.
               * Allows multiple JavaScript modules to define a handler for the same event.
               *
               * Moreover, it's risky to refer to obscure event handlers with "dot" names, because
               * the Closure Compiler may erroneously replace them (eg, window.onpageshow is a good example).
               */
              web.onPageEvent = function(sFunc, fn)
              {
                  if (window) {
                      var fnPrev = window[sFunc];
                      if (typeof fnPrev !== 'function') {
                          window[sFunc] = fn;
                      } else {
                          /*
                           * TODO: Determine whether there's any value in receiving/sending the Event object that the
                           * browser provides when it generates the original event.
                           */
                          window[sFunc] = function onWindowEvent() {
                              if (fnPrev) fnPrev();
                              fn();
                          };
                      }
                  }
              };
              
              /**
               * onInit(fn)
               *
               * @param {function()} fn
               *
               * Use this instead of setting window.onload.  Allows multiple JavaScript modules to define their own 'onload' event handler.
               */
              web.onInit = function(fn)
              {
                  web.aPageEventHandlers['init'].push(fn);
              };
              
              /**
               * onShow(fn)
               *
               * @param {function()} fn
               *
               * Use this instead of setting window.onpageshow.  Allows multiple JavaScript modules to define their own 'onpageshow' event handler.
               */
              web.onShow = function(fn)
              {
                  web.aPageEventHandlers['show'].push(fn);
              };
              
              /**
               * onExit(fn)
               *
               * @param {function()} fn
               *
               * Use this instead of setting window.onunload.  Allows multiple JavaScript modules to define their own 'onunload' event handler.
               */
              web.onExit = function(fn)
              {
                  web.aPageEventHandlers['exit'].push(fn);
              };
              
              /**
               * doPageEvent(afn)
               *
               * @param {Array.<function()>} afn
               */
              web.doPageEvent = function(afn)
              {
                  if (web.fPageEventsEnabled) {
                      try {
                          for (var i = 0; i < afn.length; i++) {
                              afn[i]();
                          }
                      } catch(e) {
                          web.notice("An unexpected exception occurred:\n\n" + e.message + "\n\nPlease send this information to support@pcjs.org. Thanks.");
                      }
                  }
              };
              
              /**
               * enablePageEvents(fEnable)
               *
               * @param {boolean} fEnable is true to enable page events, false to disable (they're enabled by default)
               */
              web.enablePageEvents = function(fEnable)
              {
                  if (!web.fPageEventsEnabled && fEnable) {
                      web.fPageEventsEnabled = true;
                      if (web.fPageReady) web.sendPageEvent('init');
                      return;
                  }
                  web.fPageEventsEnabled = fEnable;
              };
              
              /**
               * sendPageEvent(sEvent)
               *
               * This allows us to manually trigger page events.
               *
               * @param {string} sEvent (one of 'init', 'show' or 'exit')
               */
              web.sendPageEvent = function(sEvent)
              {
                  if (web.aPageEventHandlers[sEvent]) {
                      web.doPageEvent(web.aPageEventHandlers[sEvent]);
                  }
              };
              
              web.onPageEvent('onload', function onPageLoad() { web.fPageReady = true; web.doPageEvent(web.aPageEventHandlers['init']); });
              web.onPageEvent('onpageshow', function onPageShow() { web.doPageEvent(web.aPageEventHandlers['show']); });
              web.onPageEvent(web.isUserAgent("Opera") || web.isUserAgent("iOS")? 'onunload' : 'onbeforeunload', function onPageUnload() { web.doPageEvent(web.aPageEventHandlers['exit']); });
              
              if (typeof module !== 'undefined') module.exports = web;
              
          • templates
            • .gitignore
              adsense.html
              
            • README.md
              Shared Templates
              ===
              Template folders contain a variety of XML and HTML templates and supporting files, including:
              
              - DTD files (Document Type Definitions)
              - XSD files (XML schemas -- eventually)
              - XSL files (XML stylesheets)
              - CSS files (stylesheets that the XSL files rely upon)
              - HTML files (HTML fragments used to generate part or all of a web page)
              
              [*common.html*](common.html) is the HTML template file used by the [HTMLOut](/modules/htmlout/) module
              to generate a default HTML file ("index.html") for any folder that only has a "README.md", or a "machine.xml",
              or none of the above.
              
              [*common.xsl*](common.xsl) is a collection of XSL templates used by *machine.xsl* (and deprecated *outline.xsl*)
              files.
              
              [*machine.xsl*](machine.xsl) is an XML stylesheet that takes things a step further and transforms a machine XML
              into a stand-alone HTML document, which also includes all necessary compiled scripts (eg, c1p.js, c1p-dbg.js,
              pc.js or pc-dbg.js).  Most machine XML files explicitly link to this stylesheet, so that simply loading the XML
              file in your web browser creates a working virtual machine.
              
              [*manifest.xsl*](manifest.xsl) is an XML stylesheet that renders a software manifest XML file into a standalone
              document; it may even contain a reference to a machine XML file.
              
              [*document.xsl*](document.xsl) is a collection of XSL templates used exclusively by [*outline.xsl*](outline.xsl),
              which is a more grandiose version of [*machine.xsl*](machine.xsl), designed to support XML-based documentation
              that could also contain embedded machine XML files.  However, I've since moved away from that approach, in favor
              of simple README.md files that are more flexible and work nicely with GitHub.  Also, by rendering them with our own
              minimalistic Markdown converter, [MarkOut](/modules/markout/), it's also very easy to embed virtual machines
              in a README.md document.
              
              Since the XML document syntax that [*outline.xsl*](outline.xsl) supports was never very well documented, I'm tempted
              to deprecate it and port any XML documents that still rely on it (mostly the older IAS Electronic Computer Project
              documents) to Markdown files.
              
            • common.css
              @CHARSET "UTF-8";
              /**
                  @author Jeff Parsons (@jeffpar)
                  @website http://www.pcjs.org/
                  @created 2013-05-05
                  @modified 2014-02-23
                  @license http://www.gnu.org/licenses/gpl.html
               */
              body {
                  margin: 0;
                  background: #202020;
              }
              h1, h2 {
                  margin-top: 0;
                  color: #cccccc;
              }
              h1, h2, h3, h4 {
                  word-wrap: break-word;
              }
              /*
              h3 ~ *:not(h3) {
                  margin-left: 40px;
              }
              */
              h4 a {
                  color: #cccccc !important;
              }
              p {
                  line-height: 1.5em;
              }
              img {
                  max-width: 100%;
              }
              a img {
                  vertical-align: bottom;
              }
              pre, code {
                  color: #000000;
                  background-color: #cccccc;
                  font-family: Monaco, Consolas, "Lucida Console", monospace;
                  font-size: 12px;
              }
              pre {
                  margin: 1em 2em;
                  padding: 1em;
                  border-radius: 5px;
                  overflow: auto;
              }
              code {
                  padding: 1px;
              }
              pre a, code a {
                  color: #006400 !important;
              }
              .common {
                  width: 100%;
                  margin: 0 auto;
                  color: #cccccc;
              }
              .common a {
                /*color: #80bd01;*/
                  color: #7fc07f;
                  text-decoration: none;
              }
              .common hr {
                  border-color: #808080;
              }
              .common a:hover {
                  text-decoration: underline;
              }
              .common, .machine {
                  font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
                  font-size: 15px;
              }
              .machine {
                  margin: 15px;
                  overflow: hidden;
              }
              .c1pjs {
                  overflow: visible;
              }
              .machine-placeholder {
                  text-align: center;
                  font-weight: bold;
              }
              .common-top {
                  background: #202020;
                  font-size: small;
              }
              .common-top-left {
                  float: left;
                  width: 60%;
              }
              .common-top-left ul {
                  line-height: 1.5em;
                  list-style-type: none;
                  margin: 0;
                  padding: 1em 1em 1em 9px;
                  overflow: hidden;
              }
              .common-top-left ul li {
                  display: block;
                  float: left;
              }
              .common-top-left ul li a {
                  border-right: 1px solid #6f6f6f;
                  padding: 2px 6px 2px 6px;
              }
              .common-top-left ul li:last-child a {
                  border-right: none;
              }
              .common-top-right {
                  float: right;
                  width: 40%;
              }
              .common-top-right p {
                  float: right;
                  margin: 0;
                  padding: 1em;
              }
              .common-middle {
                  clear: both;
                  padding: 1px 1em 1px 1em;
                  background: #404040;
              }
              .common-sidebar {
                  float: left;
                  font-size: small;
                  width: 140px; /* should be <= margin-left of common-main */
                  padding-bottom: 20px;
                  overflow: hidden;
                  white-space: nowrap;
                  word-wrap: break-word;
              }
              .common-list {
                  list-style-type: none;
                  margin-top: 0;
                  margin-bottom: 0;
                  padding-left: 0;
              }
              .common-list li {
                /*font-variant: small-caps;*/
                  padding-bottom: 7px;
              }
              .common-list-data {
                  list-style-type: none;
                  margin-top: 0;
                  margin-bottom: 0;
                  padding-left: 0;
              }
              .common-list-data li {
                  line-height: 1.5em;
              }
              .common-list-data-items, .common-list-data-subitems {
                  font-size: x-small;
                  list-style-type: none;
                  margin-top: 0;
                  margin-bottom: 0;
                  padding-left: 2em;
              }
              .common-list-data-items li, .common-list-data-subitems li {
                  padding-bottom: 0;
              }
              .common-main {
                  margin-left: 150px;
              /*  padding-left: 1em;
                  padding-bottom: 1em;
                  padding-right: 1em; */
              }
              .common-image-gallery {
                  margin: 0 auto;
                  text-align: center;
              }
              .common-image-gallery:after {
                  content: '';
                  display: block;
              }
              .common-image-frame {
                  display: inline-block;
                  margin: 8px;
                  text-align: center;
              }
              .common-image-link {
                  padding: 5px;
                  border: 1px solid black;
                  border-radius: 5px;
                  background-color: #FAEBD7;
              }
              .common-image-label {
                  font-size: x-small;
              }
              .common-bottom {
                  clear: both;
                  padding-top: 1em;
              }
              .common-bottom:after {
                  content: '';
                  display: block;
                  clear: both;
              }
              .common-reference {
                  float: left;
                  font-size: x-small;
              }
              .common-reference a {
                  text-decoration: none;
              }
              .common-copyright {
                  float: right;
                  font-size: x-small;
              }
              .common-copyright a {
                  text-decoration: none;
              }
              .md-list {
              }
              .md-list li {
                  line-height: 1.5em;
                  margin-bottom: 1em;
              }
              .md-list li p {
                  padding-left: 2em;
              }
              .md-list-compact {
              }
              .md-list-compact li {
                  margin-bottom: 0;
              }
              .md-list-none {
                  list-style-type: none;
                  padding-left: 2em;
              }
              .md-list-none li {
                  margin-bottom: 0;
              }
              @media screen and (max-width: 900px) {
                  /*
                  h3 ~ *:not(h3) {
                      margin-left: 0;
                  }
                  */
                  .common-sidebar {
                      width: 100%;
                      white-space: normal;
                  }
                  .common-list {
                      padding-left: 0;
                  }
                  .common-list-data {
                      padding-left: 0;
                  }
                  .common-sidebar h4, .common-list li, .common-list-data li, .common-list-data-items li {
                      width: 130px;
                      float: left;
                      overflow: hidden;
                      vertical-align: top;
                      padding-right: 1em;
                      margin-top: 0;
                  }
                  .common-list-data-subitems {
                      display: none;
                  }
                  .common-main {
                      clear: both;
                      margin-left: 0;
                      padding-left: 0;
                      padding-right: 0;
                  }
                  .md-list-none {
                      padding-left: 1em;
                  }
              }
              
            • common.html
              <!DOCTYPE html>
              <!-- Some browsers tend to display a white page before displaying one of our dark pages, which causes annoying "flashes";
              	 setting a background color as early as possible seems to help -->
              <html style="background-color: #1d1d1d">
              	<head>
              		<title>pcjs.org | <!-- pcjs:title("The Original IBM PC In Your Web Browser") --></title>
              		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              		<meta charset="utf-8">
              		<!-- We could set content="width=device-width, initial-scale=1", but that apparently causes problems
              			 when rotating to landscape mode; by setting only "initial-scale", the width is apparently inferred -->
              		<meta name="viewport" content="initial-scale=1">
              		<link rel="shortcut icon" type="image/x-icon" href="/versions/images/current/favicon.ico">
              		<link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css">
              		<!-- pcjs:sockets -->
              	</head>
              	<body>
              		<!-- Template revision 0038 (increment this number prior to any Git push that should trigger a rebuild of all web pages) -->
              		<div class="common">
              			<div class="common-top">
              				<div class="common-top-left">
              					<ul>
              						<li><a href="/">Home</a></li>
              						<li><a href="/apps/pc/">Apps</a></li>
              						<li><a href="/disks/pc/">Disks</a></li>
              						<li><a href="/devices/pc/machine/">Machines</a></li>
              						<li><a href="/docs/">Docs</a></li>
              						<li><a href="/pubs/">Pubs</a></li>
              						<li><a href="/blog/">Blog</a></li>
              						<li><a href="/docs/about/">About</a></li>
              					</ul>
              				</div>
              				<div class="common-top-right">
              					<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
              				</div>
              			</div>
              			<div class="common-middle">
              				<h4>Directory of C:\<a href="/">PCJS.ORG</a><!-- pcjs:pcpath --></h4>
              				<div class="common-sidebar">
              					<!-- pcjs:dirlist -->
              					<!-- pcjs:manifest -->
              					<!-- pcjs:htmlfileLater("adsense.html") -->
              				</div>
              				<div class="common-main">
              					<!-- pcjs:default("*", "common-image") -->
              					<div class="common-bottom">
              						<p class="common-reference"><!-- Bottom-left-hand stuff, if there was any, would go here --></p>
              						<p class="common-copyright">
              							<!-- When using AWS, the pcjs.org domain must redirect to www.pcjs.org, so let's avoid unnecessary redirects in any absolute URLs -->
              							<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-<!-- pcjs:year --> by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
              							<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
              						</p>
              					</div>
              				</div>
              			</div>
              		</div>
              		<script id="randomize" type="text/javascript">
              			(function() {
              				var p = document.getElementById('random');
              				if (p) {
              					var mags = ['BYTE-1975-11:98', 'MSJ-1986-10:34', 'MSJ-1987-05:90', 'PCTJ-1987-01:216', 'PCTJ-1987-02:222', 'PCTJ-1987-03:214', 'PCTJ-1987-04:218', 'PCTJ-1987-05:238', 'PCTJ-1987-06:236', 'PCTJ-1987-07:230', 'PCTJ-1987-08:250', 'PCTJ-1987-09:252', 'PCTJ-1987-10:231', 'PCTJ-1987-11:261', 'PCTJ-1987-12:242'];
              					var p2 = document.createElement('p');
              					p2.appendChild(document.createTextNode('In addition, you see a piece of paper lying on the floor.'));
              					var div1 = document.createElement('div'); div1.setAttribute('class', 'common-image-gallery');
              					var div2 = document.createElement('div'); div2.setAttribute('class', 'common-image-frame'); div1.appendChild(div2);
              					var div3 = document.createElement('div'); div3.setAttribute('class', 'common-image-link'); div2.appendChild(div3);
              					var mag = mags[Math.floor(Math.random() * mags.length)];
              					var parts = mag.split(':'), issue = parts[0], page = Math.floor(Math.random() * parseInt(parts[1])) + 1;
              					parts = mag.split('-');
              					var name = parts[0].toLowerCase();
              					var a = document.createElement('a'); a.setAttribute('href', '/pubs/pc/magazines/' + name + '/' + issue + '/#page-' + page); div3.appendChild(a);
              					var img = document.createElement('img'); img.setAttribute('src', 'http://static.pcjs.org/pubs/pc/magazines/' + name + '/' + issue + '/thumbs/' + issue + ' ' + page + '.jpeg'); img.setAttribute('width', '200'); a.appendChild(img);
              					p.parentNode.insertBefore(p2, p.nextSibling);
              					p2.parentNode.insertBefore(div1, p2.nextSibling)
              				}
              			})();
              		</script>
              		<!-- pcjs:htmlfile("analytics.html") -->
              	</body>
              </html>
              
            • common.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other required entities may be defined below (see entities.dtd). -->
              	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
              	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
              	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              	<xsl:template name="commonStyles">
              		<meta charset="utf-8"/>
              		<link rel="shortcut icon" href="/versions/images/current/favicon.ico" type="image/x-icon"/>
              		<link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css"/>
              		<!-- script type="text/javascript" src="/versions/jquery/1.7.2/jquery.min.js" -->
              	</xsl:template>
              
              	<xsl:template name="commonTop">
              		<div class="common-top">
              			<div class="common-top-left">
              				<ul>
              					<li><a href="/">Home</a></li>
              					<li><a href="/apps/pc/">Apps</a></li>
              					<li><a href="/disks/pc/">Disks</a></li>
              					<li><a href="/devices/pc/machine/">Machines</a></li>
              					<li><a href="/docs/">Docs</a></li>
              					<li><a href="/pubs/">Pubs</a></li>
              					<li><a href="/blog/">Blog</a></li>
              					<li><a href="/docs/about/">About</a></li>
              				</ul>
              			</div>
              			<div class="common-top-right">
              				<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
              			</div>
              		</div>
              	</xsl:template>
              
              	<xsl:template name="commonBottom">
              		<div class="common-bottom">
              			<p class="common-reference"></p>
              			<p class="common-copyright">
              				<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
              				<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
              			</p>
              		</div>
              	</xsl:template>
              
              </xsl:stylesheet>
              
            • dictionary.txt
              addend
              chassis
              augend
              triodes
              addends
              rectifiers
              kirchoff
              triode
              ohms
              shiftable
              sensitising
              selectron
              pentode
              timeline
              seriatim
              operability
              performable
              deselected
              uncompiled
              repower
              onbeforeunload
              onunload
              onload
              onpageshow
              diskette
              masochistic
              
            • document.css
              @CHARSET "UTF-8";
              /* @author Jeff Parsons (@jeffpar)
                 @website http://www.pcjs.org/
                 @created 2013-05-05
                 @modified 2014-02-23
                 @license http://www.gnu.org/licenses/gpl.html
               */
              .page {
                  margin: 2% 2%;
                  padding: 2% 2%;
                  min-width: 30em;
                  overflow: auto;
                  font-size: large;
                  font-family: Helvetica, Arial, sans-serif;
                  background: #303030;
                  color: #ccc;
              /*  background-color: #63b6fc; */
              }
              .page-header {
              }
              .page-header-title {
              	text-align: center;
              	/*text-transform: uppercase;*/
              }
              .page a {
                  color: #7fc07f;
                  text-decoration: none;
              }
              a.footlink, a.paralink {
              	text-decoration: none;
              }
              a.footlink:link, a.paralink:link {
              	color: blue;
              }
              a.footlink:visited, a.paralink:visited {
              	color: blue;
              }
              .galleryitem {
              	float: left;
              	width: 200px;
              }
              .item {
              	float: left;
              	width: 2em;
              	text-indent: 1em;
              }
              .list {
              	margin-left: 3em;
              	text-indent: 0;
              	text-align: justify;
              }
              ul {
              	list-style: none;
              }
              div.pnumber {
              	float: left;
              	width: 2em;
              	text-indent: 1em;
              }
              div.pitem {
              	margin-left: 10em;
              }
              p.indent, .justified p {
              	text-indent: 2em;
              	text-align: justify;
              	line-height: 1.5em;
              }
              p.noindent {
              	text-indent: 0;
              	text-align: justify;
              }
              p.center, .center {
              	text-align: center;
              }
              li.para {
              	margin-top: 1em;
              	margin-bottom: 1em;
              }
              .left {
              	text-align: left;
              }
              .right {
              	text-align: right;
              }
              blockquote.tag {
              	font-size: small;
              	font-family: Monaco, Fixed, monospace;
              	margin-top: 0;
              	margin-bottom: 0;
              }
              .blockquote {
              	padding-left: 1em;
              	text-indent: 0;
              	text-align: justify;
              }
              .italics {
              	font-style: italic;
              }
              .medium {
              	font-size: medium;
              }
              .small {
              	font-size: x-small;
              }
              .smallcaps {
              	font-variant: small-caps;
              }
              .strike {
              	text-decoration: line-through;
              }
              .summation, .bracelist {
              	display: inline-block;
              	position: relative;
              	vertical-align: middle;
              	text-align: center;
              	margin-bottom: 0.5ex;
              	text-indent: 0;
              }
              .bracelist-symbol {
              	font-size: 3em;
              	vertical-align: -40%;
              }
              .summation .summation-lower, .summation .summation-upper, .bracelist-item {
              	display: block;
              	font-size: 75%;
              	text-align: center;
              }
              .summation .summation-upper {
              	margin-bottom: 0;
              	margin-left: 0.8ex;
              	font-style: italic;
              }
              .summation .summation-lower{
              	margin-bottom: -0.6ex;
              	font-style: italic;
              }
              .summation .summation-symbol {
              	font-size: 2em;
              }
              p sup {
              	vertical-align: baseline;
              	position: relative;
              	bottom: .5em;
              	font-size: small;
              }
              p sub {
              	vertical-align: baseline;
              	position: relative;
              	bottom: -.5em;
              	font-size: small;
              }
              .footnote {
              	font-size: medium;
              	text-indent: 1em;
              	text-align: justify;
              	margin-top: .5em;
              }
              .image-right {
              	float: right;
              	margin-left: 1em;
              	margin-top: 1em;
              	margin-bottom: 1em;
              }
              .image-caption {
              	font-size: small;
              	text-align: center;
              }
            • document.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other required entities may be defined below (see entities.dtd). -->
              	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
              	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
              	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              	<xsl:template name="documentStyles">
              		<link rel="stylesheet" type="text/css" href="document.css"/>
              	</xsl:template>
              
              	<xsl:template match="title">
              		<h1><xsl:apply-templates/></h1>
              	</xsl:template>
              
              	<xsl:template name="p">
              		<xsl:if test="@id">
              			<a name="{@id}"></a>
              		</xsl:if>
              		<xsl:choose>
              			<xsl:when test="not(@class)">
              				<p><xsl:apply-templates/></p>
              			</xsl:when>
              			<xsl:otherwise>
              				<p class="{@class}"><xsl:apply-templates/></p>
              			</xsl:otherwise>
              		</xsl:choose>
              	</xsl:template>
              
              	<xsl:template match="p">
              		<xsl:call-template name="p"/>
              	</xsl:template>
              
              	<xsl:template match="br">
              		<br/>
              	</xsl:template>
              
              	<xsl:template match="p[@number]">
              		<div class="pnumber">
              			<xsl:choose>
              				<xsl:when test="not(@number) or @number = ''">&nbsp;</xsl:when>
              				<xsl:otherwise><xsl:value-of select="@number"/></xsl:otherwise>
              			</xsl:choose>
              		</div>
              		<div class="pitem">
              			<xsl:call-template name="p"/>
              		</div>
              	</xsl:template>
              
              	<xsl:template match="span">
              		<xsl:choose>
              			<xsl:when test="not(@class)">
              				<span><xsl:apply-templates/></span>
              			</xsl:when>
              			<xsl:when test="@class = 'italics'">
              				<em><xsl:apply-templates/></em>
              			</xsl:when>
              			<xsl:otherwise>
              				<span class="{@class}"><xsl:apply-templates/></span>
              			</xsl:otherwise>
              		</xsl:choose>
              	</xsl:template>
              
              	<xsl:template match="h2">
              		<h2><xsl:apply-templates/></h2>
              	</xsl:template>
              
              	<xsl:template match="h3">
              		<h3><xsl:apply-templates/></h3>
              	</xsl:template>
              
              	<xsl:template match="h4">
              		<h4><xsl:apply-templates/></h4>
              	</xsl:template>
              
              	<xsl:template match="h5">
              		<h5><xsl:apply-templates/></h5>
              	</xsl:template>
              
              	<xsl:template match="h6">
              		<h6><xsl:apply-templates/></h6>
              	</xsl:template>
              
              	<xsl:template match="em">
              		<em><xsl:apply-templates/></em>
              	</xsl:template>
              
              	<xsl:template match="strong">
              		<strong><xsl:apply-templates/></strong>
              	</xsl:template>
              
              	<xsl:template match="a">
              		<a href="{@href}" target="{@target}"><xsl:apply-templates/></a>
              	</xsl:template>
              
              	<xsl:template match="ol">
              		<blockquote><ol><xsl:apply-templates/></ol></blockquote>
              	</xsl:template>
              
              	<xsl:template match="ul">
              		<blockquote><ul><xsl:apply-templates/></ul></blockquote>
              	</xsl:template>
              
              	<xsl:template match="li">
              		<li><xsl:apply-templates/></li>
              	</xsl:template>
              
              	<xsl:template match="img">
              		<div><img src="{@src}" alt="image"/></div>
              	</xsl:template>
              
              	<xsl:template match="pre">
              		<pre><xsl:apply-templates/></pre>
              	</xsl:template>
              
              	<xsl:template match="figure">
              		<xsl:choose>
              			<xsl:when test="@pos">
              				<div class="{@pos}"><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
              			</xsl:when>
              			<xsl:otherwise>
              				<div><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
              			</xsl:otherwise>
              		</xsl:choose>
              	</xsl:template>
              
              	<xsl:template match="sub">
              		<sub><xsl:apply-templates/></sub>
              	</xsl:template>
              
              	<xsl:template match="sup">
              		<sup><xsl:apply-templates/></sup>
              	</xsl:template>
              
              	<xsl:template match="lt">&lt;</xsl:template>
              	<xsl:template match="gt">&gt;</xsl:template>
              	<xsl:template match="ne">&ne;</xsl:template>
              	<xsl:template match="le">&le;</xsl:template>
              	<xsl:template match="ge">&ge;</xsl:template>
              	<xsl:template match="times">&times;</xsl:template>
              	<xsl:template match="dot">&sdot;</xsl:template>
              	<xsl:template match="divide">&divide;</xsl:template>
              	<xsl:template match="sigma">&sigma;</xsl:template>
              
              	<xsl:template match="summation">
              		<!-- Refer to: http://www.periodni.com/mathematical_and_chemical_equations_on_web.html -->
              		<span class="summation">
              			<span class="summation-upper"><xsl:value-of select="@upper"/></span>
              			<span class="summation-symbol">&sum;</span>
              			<span class="summation-lower"><xsl:value-of select="@lower"/></span>
              		</span>
              		<xsl:apply-templates/>
              	</xsl:template>
              
              	<xsl:template match="bracelist">
              		<span class="bracelist-symbol">&lbrace;</span>
              		<span class="bracelist">
              			<xsl:for-each select="item">
              				<span class="bracelist-item"><xsl:apply-templates/></span>
              			</xsl:for-each>
              		</span>
              	</xsl:template>
              
              	<xsl:template match="footlink">
              		<xsl:variable name="docID" select="/document/@id"/>
              		<a class="footlink" id="fn{$docID}_ref{@n}" href="#fn{$docID}_{@n}"><sup><xsl:if test="@quoted"><xsl:text>[</xsl:text></xsl:if><xsl:value-of select="@n"/><xsl:if test="@quoted"><xsl:text>]</xsl:text></xsl:if></sup></a>
              	</xsl:template>
              
              	<xsl:template match="footnote">
              		<xsl:variable name="docID" select="/document/@id"/>
              		<div class="footnote"><a id="fn{$docID}_{@n}" href="#fn{$docID}_ref{@n}"><sup><xsl:value-of select="@n"/></sup></a><xsl:text> </xsl:text>
              			<xsl:apply-templates/>
              		</div>
              	</xsl:template>
              
              	<xsl:template name="authors">
              		<xsl:for-each select="author"><xsl:if test="position() != 1"><xsl:text>, </xsl:text></xsl:if><xsl:if test="position() != 1 and position() = last()"><xsl:text>and </xsl:text></xsl:if><xsl:value-of select="."/></xsl:for-each>
              	</xsl:template>
              
              	<xsl:template name="formatDate">
              		<xsl:param name="date"/>
              		<xsl:param name="format">MDY</xsl:param>
              		<!-- date format: YYYY-MM-DD (MM and/or DD can be 00 if unknown) -->
              		<xsl:variable name="year">
              			<xsl:value-of select="substring-before($date,'-')"/>
              		</xsl:variable>
              		<xsl:variable name="mon-day">
              			<xsl:value-of select="substring-after($date,'-')"/>
              		</xsl:variable>
              		<xsl:variable name="mon">
              			<xsl:value-of select="substring-before($mon-day,'-')"/>
              		</xsl:variable>
              		<xsl:variable name="full-day">
              			<xsl:value-of select="substring-after($mon-day,'-')"/>
              		</xsl:variable>
              		<xsl:variable name="day">
              			<xsl:choose>
              				<xsl:when test="substring($full-day,1,1) = '0'"><xsl:value-of select="substring($full-day,2)"/></xsl:when>
              				<xsl:otherwise><xsl:value-of select="$full-day"/></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<xsl:choose>
              			<xsl:when test="$mon = '01'">January </xsl:when>
              			<xsl:when test="$mon = '02'">February </xsl:when>
              			<xsl:when test="$mon = '03'">March </xsl:when>
              			<xsl:when test="$mon = '04'">April </xsl:when>
              			<xsl:when test="$mon = '05'">May </xsl:when>
              			<xsl:when test="$mon = '06'">June </xsl:when>
              			<xsl:when test="$mon = '07'">July </xsl:when>
              			<xsl:when test="$mon = '08'">August </xsl:when>
              			<xsl:when test="$mon = '09'">September </xsl:when>
              			<xsl:when test="$mon = '10'">October </xsl:when>
              			<xsl:when test="$mon = '11'">November </xsl:when>
              			<xsl:when test="$mon = '12'">December </xsl:when>
              			<xsl:when test="$mon = '00'"/><!-- do nothing -->
              		</xsl:choose>
              		<xsl:if test="$day != '0' and $format = 'MDY'">
              			<xsl:value-of select="$day"/><xsl:text>, </xsl:text>
              		</xsl:if>
              		<xsl:value-of select="$year"/>
              	</xsl:template>
              
              	<xsl:template match="gallery">
              		<h2><xsl:value-of select="description"/></h2>
              		<div class="gallery">
              			<xsl:apply-templates select="item" mode="gallery"/>
              		</div>
              		<div style="clear:both;"></div>
              	</xsl:template>
              
              	<xsl:template match="item" mode="gallery">
              		<div class="galleryitem">
              			<a href="{@ref}"><img src="/versions/images/current/pdf-192.jpg" alt="{.}"/></a><br/>
              			<div style="font-size:small; text-align:center;"><xsl:value-of select="."/></div>
              		</div>
              	</xsl:template>
              
              	<xsl:template match="list[@type = 'timeline']">
              		<xsl:if test="not(description)">
              			<h2>Timeline</h2>
              		</xsl:if>
              		<xsl:if test="description">
              			<h2><xsl:value-of select="description"/></h2>
              		</xsl:if>
              		<blockquote>
              			<xsl:apply-templates select="item" mode="timeline"/>
              		</blockquote>
              	</xsl:template>
              
              	<xsl:template match="item" mode="timeline">
              		<xsl:if test="@ref">
              			<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              			<xsl:apply-templates select="document($documentFile)/document" mode="withDate">
              				<xsl:with-param name="itemRef" select="@ref"/>
              			</xsl:apply-templates>
              		</xsl:if>
              		<xsl:if test="not(@ref)">
              			<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="@date"/></xsl:call-template></h3>
              			<blockquote>
              				<xsl:value-of select="."/>
              			</blockquote>
              		</xsl:if>
              	</xsl:template>
              
              	<xsl:template match="list[@type = 'people']">
              		<xsl:if test="not(description)">
              			<h2>People</h2>
              		</xsl:if>
              		<xsl:if test="description">
              			<h2><xsl:value-of select="description"/></h2>
              		</xsl:if>
              		<blockquote>
              			<xsl:apply-templates select="item" mode="people"/>
              		</blockquote>
              	</xsl:template>
              
              	<xsl:template match="item" mode="people">
              		<h3><xsl:value-of select="name"/></h3>
              		<xsl:apply-templates select="list"/>
              	</xsl:template>
              
              	<xsl:template match="list[@type = 'documents']">
              		<xsl:if test="description"><h2><xsl:value-of select="description"/></h2></xsl:if>
              		<ul>
              			<xsl:apply-templates select="item" mode="document"/>
              		</ul>
              	</xsl:template>
              
              	<xsl:template match="item" mode="document">
              		<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
              		<xsl:apply-templates select="document($documentFile)/document">
              			<xsl:with-param name="itemRef" select="@ref"/>
              		</xsl:apply-templates>
              	</xsl:template>
              
              	<xsl:template match="document">
              		<xsl:param name="itemRef"/>
              		<li>
              			<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/></xsl:call-template>
              		</li>
              	</xsl:template>
              
              	<xsl:template match="document" mode="withDate">
              		<xsl:param name="itemRef"/>
              		<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="date"/><xsl:with-param name="format" select="MY"/></xsl:call-template></h3>
              		<blockquote>
              			<p>
              				<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/><xsl:with-param name="multiLine" select="'true'"/></xsl:call-template>
              			</p>
              		</blockquote>
              	</xsl:template>
              
              	<xsl:template name="documentSummary">
              		<xsl:param name="itemRef"/>
              		<xsl:param name="multiLine">false</xsl:param>
              		<xsl:choose>
              			<xsl:when test="content|include">
              				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
              				<xsl:if test="@ref">
              					<span class="small">
              						<xsl:text> [</xsl:text><a href="{@ref}">Original</a><xsl:text>]</xsl:text>
              					</span>
              				</xsl:if>
              			</xsl:when>
              			<xsl:otherwise>
              				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
              			</xsl:otherwise>
              		</xsl:choose>
              		<xsl:if test="copy">
              			<span class="small">
              				<xsl:text> [</xsl:text><a href="{copy/@ref}"><xsl:value-of select="copy"/></a><xsl:text>]</xsl:text>
              			</span>
              		</xsl:if>
              		<xsl:if test="author"><xsl:if test="$multiLine = 'true'"><br/></xsl:if><span class="medium"><xsl:text> by </xsl:text><xsl:call-template name="authors"/></span></xsl:if>
              		<xsl:if test="source">
              			<span class="small">
              				<br/>
              				<xsl:text>[Source: </xsl:text>
              				<xsl:if test="site">
              					<a href="{site/@url}"><xsl:value-of select="site"/></a>
              				</xsl:if>
              				<xsl:if test="not(site)">
              					<a href="{source/@url}"><xsl:value-of select="source"/></a>
              				</xsl:if>
              				<xsl:text>]</xsl:text>
              			</span>
              		</xsl:if>
              	</xsl:template>
              
              	<xsl:template match="list[@type = 'resources']">
              		<xsl:if test="not(description)">
              			<h2>Resources</h2>
              		</xsl:if>
              		<xsl:if test="description">
              			<h2><xsl:value-of select="description"/></h2>
              		</xsl:if>
              		<blockquote>
              			<xsl:apply-templates select="item" mode="resources"/>
              		</blockquote>
              	</xsl:template>
              
              	<xsl:template match="item" mode="resources">
              		<h3><xsl:value-of select="description"/></h3>
              		<xsl:apply-templates select="list"/>
              	</xsl:template>
              
              	<xsl:template match="list[@type = 'links']">
              		<xsl:if test="description">
              			<h4><xsl:value-of select="description"/></h4>
              		</xsl:if>
              		<ul>
              			<xsl:apply-templates select="item" mode="links"/>
              		</ul>
              	</xsl:template>
              
              	<xsl:template match="item" mode="links">
              		<li><a href="{@ref}"><xsl:value-of select="."/></a></li>
              	</xsl:template>
              
              	<xsl:template match="list[not(@type)]">
              		<xsl:if test="description">
              			<h2><xsl:value-of select="description"/></h2>
              		</xsl:if>
              		<blockquote>
              			<xsl:apply-templates select="item|tag" mode="outer"/>
              		</blockquote>
              	</xsl:template>
              
              	<xsl:template match="item" mode="outer">
              		<xsl:if test="description">
              			<h3><xsl:value-of select="description"/></h3>
              		</xsl:if>
              		<xsl:apply-templates select="list|item|tag" mode="inner"/>
              	</xsl:template>
              
              	<xsl:template match="list" mode="inner">
              		<xsl:if test="description">
              			<h4><xsl:value-of select="description"/></h4>
              		</xsl:if>
              		<ul>
              			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
              		</ul>
              	</xsl:template>
              
              	<xsl:template name="innerlist">
              		<xsl:if test="description">
              			<xsl:value-of select="description"/>
              		</xsl:if>
              		<ul>
              			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
              		</ul>
              	</xsl:template>
              
              	<xsl:template match="item" mode="inner">
              		<xsl:choose>
              			<xsl:when test="@ref">
              				<li><a href="{@ref}"><xsl:apply-templates/></a></li>
              			</xsl:when>
              			<xsl:when test="description">
              				<li><xsl:call-template name="innerlist"/></li>
              			</xsl:when>
              			<xsl:otherwise>
              				<li><xsl:apply-templates/></li>
              			</xsl:otherwise>
              		</xsl:choose>
              	</xsl:template>
              
              	<xsl:template match="para" mode="inner">
              		<li class="para"><xsl:apply-templates/></li>
              	</xsl:template>
              
              	<xsl:template match="tag" mode="outer">
              		<xsl:call-template name="tag"/>
              	</xsl:template>
              
              	<xsl:template match="tag" mode="inner">
              		<xsl:call-template name="tag"/>
              	</xsl:template>
              
              	<xsl:template name="tag">
              		<blockquote class="tag">
              			<xsl:text>&lt;</xsl:text><xsl:if test="@href"><a href="{@href}"><xsl:value-of select="@name"/></a></xsl:if><xsl:if test="not(@href)"><xsl:value-of select="@name"/></xsl:if><xsl:for-each select="attr"><xsl:text> </xsl:text><xsl:value-of select="@name"/><xsl:text>="</xsl:text><xsl:value-of select="@value"/><xsl:text>"</xsl:text></xsl:for-each>
              			<xsl:choose>
              				<xsl:when test="tag"><xsl:text>&gt;</xsl:text><xsl:apply-templates mode="inner"/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
              				<xsl:when test="normalize-space(.) != ''"><xsl:text>&gt;</xsl:text><xsl:value-of select="."/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
              				<xsl:otherwise><xsl:text>/&gt;</xsl:text></xsl:otherwise>
              			</xsl:choose>
              		</blockquote>
              	</xsl:template>
              
              </xsl:stylesheet>
              
            • entities.dtd
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!-- XSLT understands these entities only: lt, gt, apos, quot, and amp. Other useful entities are defined below. -->
              <!-- Alas, Firefox doesn't support loading external entities, so the contents of this file must be pasted into every primary XSL file. -->
              <!ENTITY nbsp   "&#160;">
              <!ENTITY sect   "&#167;">  <!-- OSX: option 6 -->
              <!ENTITY copy   "&#169;">  <!-- OSX: option g -->
              <!ENTITY para   "&#182;">  <!-- OSX: option 7 -->
              <!ENTITY ndash  "&#8211;"> <!-- &#x2013; UTF-8: 0xE2 0x80 0x93; OSX: option - -->
              <!ENTITY mdash  "&#8212;"> <!-- &#x2014; UTF-8: 0xE2 0x80 0x94; OSX: shift option - -->
              <!ENTITY lsquo  "&#8216;"> <!-- OSX: option ] -->
              <!ENTITY rsquo  "&#8217;"> <!-- OSX: shift option ] -->
              <!ENTITY ldquo  "&#8220;"> <!-- &#x201C; UTF-8: 0xE2 0x80 0x9C; OSX: option [ -->
              <!ENTITY rdquo  "&#8221;"> <!-- &#x201D; UTF-8: 0xE2 0x80 0x9D; OSX: shift option [ -->
              <!ENTITY dagger "&#8224;"> <!-- OSX: option t -->
              <!ENTITY Dagger "&#8225;"> <!-- OSX: shift option 7 -->
              
            • machine.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other useful entities are defined below (see entities.dtd). -->
              	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
              	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              	<xsl:output doctype-system="about:legacy-compat"/>
              
              	<xsl:include href="common.xsl"/>
              	<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
              	<xsl:include href="../../pcjs/templates/components.xsl"/>
              
              	<xsl:template match="/machine">
              		<html lang="en">
              			<head>
              				<title><xsl:value-of select="$SITEHOST"/></title>
              				<xsl:call-template name="commonStyles"/>
              				<xsl:call-template name="componentStyles"/>
              			</head>
              			<body>
              				<div class="common">
              					<xsl:call-template name="commonTop"/>
              					<div class="common-middle">
              						<p></p>
              						<div id="{@id}" class="machine {@class}js">
              							<xsl:call-template name="component">
              								<xsl:with-param name="machine" select="@id"/>
              								<xsl:with-param name="component" select="'machine'"/>
              								<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
              								<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
              							</xsl:call-template>
              						</div>
              					</div>
              					<xsl:call-template name="commonBottom"/>
              				</div>
              				<xsl:call-template name="componentScripts">
              					<xsl:with-param name="component">
              						<xsl:choose>
              							<xsl:when test="debugger"><xsl:value-of select="@class"/>-dbg</xsl:when>
              							<xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
              						</xsl:choose>
              					</xsl:with-param>
              				</xsl:call-template>
              			</body>
              		</html>
              	</xsl:template>
              
              </xsl:stylesheet>
              
            • manifest.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2014-04-10" modified="2014-04-10" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other useful entities are defined below (see entities.dtd). -->
              	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
              	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              	<xsl:output doctype-system="about:legacy-compat"/>
              
              	<xsl:include href="common.xsl"/>
              	<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
              	<xsl:include href="../../pcjs/templates/components.xsl"/>
              
              	<xsl:template match="/manifest[@type = 'document']">
              		<html lang="en">
              			<head>
              				<title><xsl:value-of select="$SITEHOST"/></title>
              				<xsl:call-template name="commonStyles"/>
              				<xsl:call-template name="componentStyles"/>
              			</head>
              			<body>
              				<div class="common">
              					<xsl:call-template name="commonTop"/>
              					<div class="common-middle">
              						<h4>Document Manifest</h4>
              						<div class="common-sidebar">
              							<ul class="common-list-data">
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Title'"/>
              									<xsl:with-param name="node" select="title"/>
              									<xsl:with-param name="default">None</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Version'"/>
              									<xsl:with-param name="node" select="version"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Source'"/>
              									<xsl:with-param name="node" select="source"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Documents'"/>
              									<xsl:with-param name="node" select="document"/>
              									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
              								</xsl:call-template>
              							</ul>
              						</div>
              						<div class="common-main">
              							<!-- TODO: Enumerate cover elements within document elements -->
              							<p><xsl:value-of select="desc"/></p>
              							<xsl:call-template name="commonBottom"/>
              						</div>
              					</div>
              				</div>
              			</body>
              		</html>
              	</xsl:template>
              
              	<xsl:template match="/manifest[@type = 'software' or not(@type)]">
              		<xsl:variable name="machineClass">
              			<xsl:choose>
              				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
              				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<html lang="en">
              			<head>
              				<title><xsl:value-of select="$SITEHOST"/></title>
              				<xsl:call-template name="commonStyles"/>
              				<xsl:call-template name="componentStyles"/>
              			</head>
              			<body>
              				<div class="common">
              					<xsl:call-template name="commonTop"/>
              					<div class="common-middle">
              						<h4>Software Manifest</h4>
              						<div class="common-sidebar">
              							<ul class="common-list-data">
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Title'"/>
              									<xsl:with-param name="node" select="title"/>
              									<xsl:with-param name="default">None</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Version'"/>
              									<xsl:with-param name="node" select="version"/>
              									<xsl:with-param name="default">Unknown</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Type'"/>
              									<xsl:with-param name="node" select="type"/>
              									<xsl:with-param name="default">None</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Category'"/>
              									<xsl:with-param name="node" select="category"/>
              									<xsl:with-param name="default">None</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Created'"/>
              									<xsl:with-param name="node" select="creationDate"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Creators'"/>
              									<xsl:with-param name="node" select="creator"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label"><xsl:if test="creationDate">Updated</xsl:if><xsl:if test="not(creationDate)">Released</xsl:if></xsl:with-param>
              									<xsl:with-param name="node" select="releaseDate"/>
              									<xsl:with-param name="default">Unknown</xsl:with-param>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Company'"/>
              									<xsl:with-param name="node" select="company"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Authors'"/>
              									<xsl:with-param name="node" select="author"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Contributors'"/>
              									<xsl:with-param name="node" select="contributor"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Publisher'"/>
              									<xsl:with-param name="node" select="publisher"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'License'"/>
              									<xsl:with-param name="node" select="license"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Source'"/>
              									<xsl:with-param name="node" select="source"/>
              									<xsl:with-param name="default" select="''"/>
              								</xsl:call-template>
              								<xsl:call-template name="listItem">
              									<xsl:with-param name="label" select="'Disks'"/>
              									<xsl:with-param name="node" select="disk"/>
              									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
              								</xsl:call-template>
              							</ul>
              						</div>
              						<div class="common-main">
              							<xsl:for-each select="machine[not(@type) or @type = 'default']">
              								<xsl:call-template name="machine">
              									<xsl:with-param name="href" select="@href"/>
              									<xsl:with-param name="state" select="@state"/>
              								</xsl:call-template>
              							</xsl:for-each>
              							<xsl:if test="not(machine[not(@type) or @type = 'default'])">
              								<p>No default machine specified for '<xsl:value-of select="title"/>' in manifest.xml</p>
              							</xsl:if>
              							<xsl:call-template name="commonBottom"/>
              						</div>
              					</div>
              				</div>
              				<xsl:call-template name="componentScripts">
              					<xsl:with-param name="component">
              						<xsl:choose>
              							<xsl:when test="machine/@debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
              							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
              						</xsl:choose>
              					</xsl:with-param>
              				</xsl:call-template>
              			</body>
              		</html>
              	</xsl:template>
              
              	<xsl:template name="listItem">
              		<xsl:param name="label"/>
              		<xsl:param name="node"/>
              		<xsl:param name="default">Unknown</xsl:param>
              		<xsl:if test="$node != '' or $default != ''">
              			<li><xsl:value-of select="$label"/>
              				<ul class="common-list-data-items">
              					<xsl:for-each select="$node">
              						<xsl:variable name="desc">
              							<xsl:choose>
              								<xsl:when test="desc"><xsl:value-of select="desc"/></xsl:when>
              								<xsl:when test="org"><xsl:value-of select="org"/></xsl:when>
              								<xsl:otherwise/>
              							</xsl:choose>
              						</xsl:variable>
              						<li title="{$desc}">
              							<xsl:variable name="value">
              								<xsl:choose>
              									<xsl:when test="name">
              										<xsl:value-of select="name"/>
              									</xsl:when>
              									<xsl:when test="normalize-space(./text()) != ''">
              										<xsl:value-of select="normalize-space(./text())"/>
              									</xsl:when>
              									<xsl:otherwise>
              										<xsl:value-of select="$default"/>
              									</xsl:otherwise>
              								</xsl:choose>
              							</xsl:variable>
              							<xsl:variable name="href">
              								<xsl:if test="@href"><xsl:value-of select="@href"/></xsl:if>
              							</xsl:variable>
              							<xsl:choose>
              								<xsl:when test="$href != ''">
              									<a href="{$href}"><xsl:value-of select="$value"/></a>
              								</xsl:when>
              								<xsl:otherwise>
              									<xsl:value-of select="$value"/>
              								</xsl:otherwise>
              							</xsl:choose>
              							<!-- Page elements are to document manifests what file elements are to software manifests, except that we don't enumerate file elements -->
              							<xsl:if test="page">
              								<ul class="common-list-data-subitems">
              									<xsl:for-each select="page">
              										<li>
              											<xsl:if test="@href">
              												<a href="{$href}{@href}"><xsl:value-of select="."/></a>
              											</xsl:if>
              											<xsl:if test="not(@href)">
              												<xsl:value-of select="."/>
              											</xsl:if>
              										</li>
              									</xsl:for-each>
              								</ul>
              							</xsl:if>
              						</li>
              					</xsl:for-each>
              					<xsl:if test="not($node)">
              						<xsl:if test="@href">
              							<a href="{@href}"><xsl:value-of select="$default"/></a>
              						</xsl:if>
              						<xsl:if test="not(@href)">
              							<xsl:value-of select="$default"/>
              						</xsl:if>
              					</xsl:if>
              				</ul>
              			</li>
              		</xsl:if>
              	</xsl:template>
              
              </xsl:stylesheet>
              
            • outline.xsl
              <?xml version="1.0" encoding="UTF-8"?>
              <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
              <!DOCTYPE xsl:stylesheet [
              	<!-- XSLT understands these entities only: lt, gt, apos, quot, and amp.  Other useful entities are defined below (see entities.dtd). -->
              	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
              	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
              ]>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              
              	<xsl:output doctype-system="about:legacy-compat"/>
              
              	<xsl:include href="common.xsl"/>
              	<xsl:include href="document.xsl"/>
              	<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
              	<xsl:include href="../../pcjs/templates/components.xsl"/>
              
              	<xsl:template match="/outline">
              		<xsl:variable name="machineClass">
              			<xsl:choose>
              				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
              				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
              			</xsl:choose>
              		</xsl:variable>
              		<html lang="en">
              			<head>
              				<title><xsl:value-of select="title"/><xsl:text> | </xsl:text><xsl:value-of select="$SITEHOST"/></title>
              				<xsl:call-template name="commonStyles"/>
              				<xsl:call-template name="documentStyles"/>
              				<xsl:call-template name="componentStyles"/>
              			</head>
              			<body>
              				<div class="common">
              					<div class="page justified">
              						<xsl:apply-templates/>
              					</div>
              				</div>
              				<xsl:call-template name="componentScripts">
              					<xsl:with-param name="component">
              						<xsl:choose>
              							<xsl:when test="debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
              							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
              						</xsl:choose>
              					</xsl:with-param>
              				</xsl:call-template>
              			</body>
              		</html>
              	</xsl:template>
              
              </xsl:stylesheet>
              
            • pdf.html
              <!DOCTYPE html>
              <html style="background-color: #1d1d1d">
              	<head>
              		<title>pcjs.org | PDF Viewer</title>
              		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              		<meta charset="utf-8">
              		<meta name="viewport" content="initial-scale=1">
              		<link rel="shortcut icon" type="image/x-icon" href="/versions/images/current/favicon.ico">
              		<link rel="stylesheet" type="text/css" href="/modules/shared/templates/common.css">
              	</head>
              	<body>
              		<div class="common">
              			<div class="common-top">
              				<div class="common-top-left">
              					<ul>
              						<li><a href="/">Home</a></li>
              						<li><a href="/apps/pc/">Apps</a></li>
              						<li><a href="/disks/pc/">Disks</a></li>
              						<li><a href="/devices/">Machines</a></li>
              						<li><a href="/docs/">Docs</a></li>
              						<li><a href="/pubs/">Pubs</a></li>
              						<li><a href="/blog/">Blog</a></li>
              						<li><a href="/docs/about/">About</a></li>
              					</ul>
              				</div>
              				<div class="common-top-right">
              					<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
              				</div>
              			</div>
              			<div class="common-middle">
              				<h4>Return to C:\<a href="/">PCJS.ORG</a><a id="returnLink"><span id="returnPath"></span></a></h4>
              				<div class="common-sidebar">
              					<ul class="common-list">
              					</ul>
              				</div>
              				<div class="common-main">
              					<div style="width:680px;margin-left:auto;margin-right:auto;">
              						<div style="float:left;margin-top:350px;margin-right:8px;">
              							<button id="prevPDF" style="font-size:large;">&lt;</button>
              						</div>
              						<div style="float:left;">
              							<iframe id="framePDF" src="" width="550" height="800"></iframe>
              						</div>
              						<div style="float:left;margin-top:350px;margin-left:8px;">
              							<button id="nextPDF" style="font-size:large;">&gt;</button>
              						</div>
              					</div>
              					<div class="common-bottom">
              						<p class="common-reference"></p>
              						<p class="common-copyright">
              							<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
              							<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
              						</p>
              					</div>
              				</div>
              			</div>
              		</div>
              		<script id="initFrame" type="text/javascript">
              			(function() {
              				var aParms = {};
              				var sParms = window.location.search.substr(1);
              				var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g;
              				var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); };
              				while ((match = search.exec(sParms))) aParms[decode(match[1])] = decode(match[2]);
              				var pdf = aParms['url'];
              				var curPage = parseInt(aParms['page'], 10) || 1;
              				var totalPages = parseInt(aParms['total'], 10) || 999;
              				var frame = document.getElementById('framePDF');
              				if (pdf && frame) {
              					pdf = pdf.replace('/static/', '/');
              					var i = pdf.indexOf("/pages/");
              					if (i > 0) {
              						var sReturnLink = pdf.substr(0, i+1);
              						var sReturnPath = sReturnLink.slice(0, -1).toUpperCase().replace(/\//g, '\\');
              						var e = document.getElementById('returnLink');
              						if (e) e.setAttribute('href', sReturnLink);
              						e = document.getElementById('returnPath');
              						if (e) e.textContent = sReturnPath;
              					}
              					i = pdf.indexOf('%20');
              					if (i < 0) i = pdf.indexOf(' ');
              					if (i > 0) pdf = pdf.substr(0, i);
              					var setPage = function(page) {
              						frame.setAttribute('src', 'http://static.pcjs.org' + pdf + ' ' + curPage + '.pdf');
              					};
              					setPage(curPage);
              					var buttonPrev = document.getElementById('prevPDF');
              					if (buttonPrev) {
              						buttonPrev.onclick = function() {
              							if (curPage > 1) setPage(--curPage);
              						};
              					}
              					var buttonNext = document.getElementById('nextPDF');
              					if (buttonNext) {
              						buttonNext.onclick = function() {
              							if (curPage < totalPages) setPage(++curPage);
              						};
              					}
              				}
              			})();
              		</script>
              	</body>
              </html>
              
        • textout
          • bin
            • textout
              #!/usr/bin/env node
              /**
               * @fileoverview Provides miscellaneous text-munging services
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
               * @version 1.0
               * @suppress {missingProperties}
               * Created 2015-Apr-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              var path = require("path");
              var fs = require("fs");
              var lib = path.join(path.dirname(fs.realpathSync(__filename)), "../lib/");
              
              require(lib + "textout.js").CLI();
              
          • lib
            • textout.js
              /**
               * @fileoverview Provides miscellaneous text-munging services
               * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
               * @version 1.0
               * Created 2015-Apr-04
               *
               * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
               *
               * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
               * and <http://pcjs.org/>.
               *
               * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
               * GNU General Public License as published by the Free Software Foundation, either version 3
               * of the License, or (at your option) any later version.
               *
               * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
               * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
               * GNU General Public License for more details.
               *
               * You should have received a copy of the GNU General Public License along with JSMachines.
               * If not, see <http://www.gnu.org/licenses/gpl.html>.
               *
               * You are required to include the above copyright notice in every source code file of every
               * copy or modified version of this work, and to display that copyright notice on every screen
               * that loads or runs any version of this software (see Computer.sCopyright).
               *
               * Some JSMachines files also attempt to load external resource files, such as character-image files,
               * ROM files, and disk image files. Those external resource files are not considered part of the
               * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
               * any copyright as to their contents.
               */
              
              "use strict";
              
              var fs      = require("fs");
              var path    = require("path");
              var mkdirp  = require("mkdirp");
              var net     = require("../../shared/lib/netlib");
              var proc    = require("../../shared/lib/proclib");
              var str     = require("../../shared/lib/strlib");
              
              /**
               * TextOut()
               *
               * @constructor
               */
              function TextOut()
              {
                  this.fDebug = false;
                  this.fASCII = true;
                  this.sServerRoot = process.cwd();
                  this.asLines = [];
                  this.nTabWidth = 8;
                  this.sTarget = "; ";
              }
              
              TextOut.asTargetRefs = ["call", "jmp", "jz", "jnz", "jc", "jnc", "ja", "jna", "js", "jns", "jo", "jno", "jl", "jnl", "jg", "jng", "jpo", "jpe", "loop", "loope", "loopne", "jcxz", "jecxz"];
              
              /*
               * Class methods
               */
              
              /**
               * CLI()
               *
               * Provides the command-line interface for the TextOut module.
               *
               * Usage
               * ---
               *      textout --file=({path}|{URL}) [--nasm]
               *
               * Arguments
               * ---
               *      --nasm performs a variety of NASM-related processing, including:
               *
               *          massageLines(): reorders basic elements of every line to make them "assemble-able"
               *
               *          collapseLines(): looks for series of lines containing nothing more than a "db",
               *          "dw", or something equivalent, and collapses them into a single repetition
               *
               *          labelTargets(): looks for all JMP and CALL targets and labels them
               *
               *          alignVertical(): looks for a predefined target string (eg, '; ') in the first line,
               *          and ensures that the same sequence in all subsequent lines starts at the same column
               *
               *      For now, all output is written to stdout only.
               *
               * Examples
               * ---
               *      node modules/textout/bin/textout --file=devices/pc/bios/compaq/deskpro386/1988-01-28.nasm --nasm
               */
              TextOut.CLI = function()
              {
                  var args = proc.getArgs();
              
                  if (!args.argc) {
                      console.log("usage: textout --file=({path}|{URL}) [--nasm]");
                      return;
                  }
              
                  var argv = args.argv;
                  var sFile = argv['file'];
                  if (!sFile) {
                      TextOut.logError(new Error("bad or missing input filename"));
                      return;
                  }
              
                  var text = new TextOut();
                  text.loadFile(sFile, function(err) {
                      if (!err) {
                          if (argv['nasm']) {
                              text.massageLines();
                              text.collapseLines();
                              text.labelTargets();
                              text.alignVertical();
                          }
                          text.outputText();
                      }
                  });
              };
              
              /**
               * logError(err)
               *
               * Conditionally logs an error to the console.
               *
               * @param {Error} err
               * @return {string} the error message that was logged (or that would have been logged had logging been enabled)
               */
              TextOut.logError = function(err)
              {
                  var sError = "";
                  if (err) {
                      sError = "textout error: " + err.message;
                      console.log(sError);
                  }
                  return sError;
              };
              
              /*
               * Object methods
               */
              
              /**
               * loadFile(sFile, done)
               *
               * @this {TextOut}
               * @param {string} sFile
               * @param {function(Error)} done
               */
              TextOut.prototype.loadFile = function(sFile, done)
              {
                  var obj = this;
                  var options = {encoding: "utf8"};
                  var sFilePath = net.isRemote(sFile)? sFile : path.join(this.sServerRoot, sFile);
              
                  if (!this.sFilePath) this.sFilePath = sFilePath;
              
                  if (this.fDebug) console.log("loadFile(" + sFilePath + ")");
              
                  if (net.isRemote(sFilePath)) {
                      net.getFile(sFilePath, options.encoding, function(err, status, buf) {
                          if (err) {
                              TextOut.logError(err);
                              done(err);
                              return;
                          }
                          obj.setText(buf);
                          done(null);
                      });
                  } else {
                      fs.readFile(sFilePath, options, function(err, buf) {
                          if (err) {
                              TextOut.logError(err);
                              done(err);
                              return;
                          }
                          obj.setText(buf);
                          done(null);
                      });
                  }
              };
              
              /**
               * setText(buf)
               *
               * Records the given file data in the TextOut's buffer
               *
               * @this {TextOut}
               * @param {Buffer|string} buf
               * @return {boolean}
               */
              TextOut.prototype.setText = function(buf)
              {
                  var b, i, j, s;
                  if (typeof buf == "string") {
                      this.asLines = buf.split('\n');
                      return true;
                  }
                  TextOut.logError(new Error("setText(): invalid data"));
                  return false;
              };
              
              /**
               * massageLines()
               *
               * @this {TextOut}
               */
              TextOut.prototype.massageLines = function()
              {
                  var iLineASCII = -1, sASCII = "";
              
                  for (var iLine = 0; iLine < this.asLines.length; iLine++) {
              
                      /*
                       * NDISASM sometimes inserts spurious lines containing a hyphen immediately followed by one or more hex bytes;
                       * this seems to happen whenever an instruction longer than 8 bytes is encountered, and it appears that these
                       * extra lines can be completely removed.
                       */
                      var sLine = this.asLines[iLine];
                      if (sLine.match(/^\s*-[0-9A-F]+$/)) {
                          this.asLines.splice(iLine--, 1);
                          continue;
                      }
              
                      sLine = sLine.replace(/^([0-9A-F]+)\s+([0-9A-F]+)\s+(o32 |a32 |)([^\s]*) *(.*)$/, "\t$3$4\t$5\t\t\t; $1  $2");
              
                      var fASCII = false;
                      var match = sLine.match(/([0-9A-F]+)$/);
                      if (match) {
                          fASCII = this.fASCII;
                          var cBytes = 0, c;
                          var sBytes = match[1], sASCIILine = "";
                          for (var i = 0; i < sBytes.length; i += 2) {
                              c = str.parseInt(sBytes.substr(i, 2));
                              if (c != 0x0D && c != 0x0A && (c < 0x20 || c >= 0x7F)) {
                                  c = 0x2E;
                                  fASCII = false;
                              }
                              sASCIILine += String.fromCharCode(c);
                              cBytes++;
                          }
                          /*
                           * Don't interpret single-byte opcodes within the ASCII range as potential ASCII?
                           *
                           *      if (cBytes == 1 && (c >= 0x40 && c <= 0x5F)) fASCII = false;
                           */
                          sLine += "  " + this.encodeASCII(sASCIILine);
                      }
              
                      this.asLines[iLine] = sLine;
              
                      if (fASCII) {
                          if (iLineASCII < 0) iLineASCII = iLine;
                          sASCII += sASCIILine;
                          continue;
                      }
              
                      if (iLineASCII >= 0) {
                          if (iLine - iLineASCII >= 4) {
                              /*
                               * This seems a better way of discriminating between single-byte opcodes and ASCII:
                               * output ASCII only when the number of ASCII bytes exceeds the number of opcode bytes.
                               */
                              if (sASCII.length > iLine - iLineASCII + 1) {
                                  this.asLines[iLineASCII] = "\tdb\t" + this.encodeASCII(sASCII);
                                  this.asLines.splice(iLineASCII+1, iLine - iLineASCII - 1);
                                  iLine = iLineASCII;
                              }
                          }
                          iLineASCII = -1; sASCII = "";
                      }
                  }
              };
              
              /**
               * encodeASCII(s)
               *
               * @param s
               * @return {string}
               */
              TextOut.prototype.encodeASCII = function(s)
              {
                  var sNew = "", fInQuotes = false;
                  for (var i = 0; i < s.length; i++) {
                      var c = s.charCodeAt(i);
                      if (c < 0x20 || c == 0x27) {
                          if (fInQuotes) {
                              sNew += "'";
                              fInQuotes = false;
                          }
                          if (sNew) sNew += ',';
                          sNew += str.toHexByte(c);
                          continue;
                      }
                      if (!fInQuotes) {
                          if (sNew) sNew += ',';
                          sNew += "'";
                          fInQuotes = true;
                      }
                      var ch = String.fromCharCode(c);
                      if (ch == "'") ch = "\\'";
                      sNew += ch;
                  }
                  if (fInQuotes) sNew += "'";
                  return sNew;
              };
              
              /**
               * collapseLines()
               *
               * @this {TextOut}
               */
              TextOut.prototype.collapseLines = function()
              {
                  for (var i = 0; i < this.asLines.length; i++) {
                      var as = this.getLineParts(i, true);
                      if (!as) continue;
                      if (as[2] != "db" && as[2] != "dw") continue;
                      var cCombine = 0, asLast;
                      for (var j = i + 1; j < this.asLines.length; j++) {
                          var asNext = this.getLineParts(j, true);
                          if (!asNext) break;
                          if (as[2] != asNext[2] || as[2] != asNext[2]) break;
                          asLast = asNext;
                          cCombine++;
                      }
                      if (cCombine > 2) {
                          this.asLines[i] = "\n\ttimes\t" + (cCombine + 1) + ' ' + as[2] + ' ' + as[3] + "\t\t; " + as[4] + " - " + asLast[4];
                          this.asLines.splice(i + 1, cCombine);
                      }
                  }
              };
              
              /**
               * labelTargets()
               *
               * @this {TextOut}
               */
              TextOut.prototype.labelTargets = function()
              {
                  /*
                   * First pass: find all target references (eg, JMP and CALL instructions)
                   */
                  var chPrefix = 'x';
                  var i, j, as, target, aTargets = [], aHardTargets = [];
              
                  for (i = 0; i < this.asLines.length; i++) {
                      as = this.getLineParts(i);
                      if (!as) continue;
                      var iTarget = TextOut.asTargetRefs.indexOf(as[2]);
                      if (iTarget < 0) continue;
                      var sTarget = as[3];
                      var sShort = "short ";
                      if (sTarget.indexOf(sShort) !== 0) {
                          sShort = "";
                      } else {
                          sTarget = sTarget.substr(sShort.length);
                      }
                      target = str.parseInt(sTarget);
                      if (target == undefined) continue;
                      if (aTargets.indexOf(target) < 0) {
                          aTargets.push(target);
                          /*
                           * For now, we're classifying only "call" targets as "hard" targets, and thus worthy of extra whitespace
                           */
                          if (iTarget < 1) aHardTargets.push(target);
                      }
                      this.asLines[i] = this.asLines[i].replace(as[3], sShort + chPrefix + target.toString(16));
                  }
              
                  /*
                   * Second pass: label all targets
                   */
                  var addr, fPrevHard = false;
                  for (i = 0; i < this.asLines.length; i++) {
                      as = this.getLineParts(i);
                      if (!as) continue;
                      addr = str.parseInt(as[4]);
                      if (addr == undefined) continue;
                      j = aTargets.indexOf(addr);
                      if (j >= 0) {
                          var fHard = (aHardTargets.indexOf(addr) >= 0);
                          this.asLines[i] = (fHard || fPrevHard? '\n' : '') + chPrefix + addr.toString(16) + ':' + this.asLines[i];
                          aTargets.splice(j, 1);
                      } else {
                          if (fPrevHard) this.asLines[i] = '\n' + this.asLines[i];
                      }
                      fPrevHard = (as[2] == "jmp" || as[2] == "ret" || as[2] == "retf" || as[2] == "iret");
                  }
              
                  /*
                   * Third pass: for all targets that turned out to NOT be targets, fix all references
                   */
                  var aRepairs = [];
                  if (aTargets.length) {
                      for (i = 0; i < this.asLines.length; i++) {
                          as = this.getLineParts(i);
                          if (!as) continue;
                          if (as[3].charAt(0) == chPrefix) {
                              addr = str.parseInt(as[3].substr(1));
                              if (aTargets.indexOf(addr) >= 0) {
                                  /*
                                   * Instead of putting back the original target address, let's just convert the line to a "db"
                                   */
                                  this.asLines[i] = as[1] + "\tdb\t";
                                  for (j = 0; j < as[5].length; j += 2) {
                                      this.asLines[i] += (j > 0? ',' : '') + "0x" + as[5].substr(j, 2);
                                  }
                                  // this.asLines[i] = this.asLines[i].replace(as[3], str.toHexWord(addr));
                                  if (aRepairs.indexOf(addr) < 0) aRepairs.push(addr);
                              }
                          }
                      }
                      if (aTargets.length != aRepairs.length) {
                          console.log("; warning: " + aTargets.length + " unprocessed targets (" + aRepairs.length + " repaired):");
                          for (j = 0; j < aTargets.length; j++) {
                              if (aRepairs.indexOf(aTargets[j]) < 0) console.log(';\t' + str.toHexWord(aTargets[j]));
                          }
                      }
                  }
              };
              
              /**
               * alignVertical()
               *
               * @this {TextOut}
               */
              TextOut.prototype.alignVertical = function()
              {
                  var iTarget = this.asLines.length? this.findTarget(this.asLines[0]) : -1;
                  if (iTarget < 0) return;
              
                  if (this.fDebug) console.log("target vertical alignment: " + (iTarget + 1));
              
                  for (var iLine = 1; iLine < this.asLines.length; iLine++) {
                      var iVictim;
                      var sLine = this.asLines[iLine];
                      while ((iVictim = this.findTarget(sLine)) != iTarget) {
                          if (iVictim < 0) break;
              
                          if (this.fDebug) console.log("line " + (iLine + 1) + ": current vertical alignment: " + (iVictim + 1));
              
                          if (iVictim > iTarget) {
                              if (!this.iTargetIndex) break;
                              var ch = sLine.charAt(this.iTargetIndex-1);
                              if (ch != ' ' && ch != '\t') break;
                              sLine = sLine.substr(0, this.iTargetIndex-1) + sLine.substr(this.iTargetIndex);
                          } else {
                              sLine = sLine.substr(0, this.iTargetIndex) + ' ' + sLine.substr(this.iTargetIndex);
                          }
                      }
                      this.asLines[iLine] = sLine;
                  }
              };
              
              /**
               * findTarget(sSrc, fDebug)
               *
               * This does not return the physical 0-based index of sTarget within sSrc, but rather the logical
               * 0-based position, taking into account tab stops, based on the current nTabWidth setting.
               *
               * @this {TextOut}
               * @param {string} sSrc
               * @param {boolean} [fDebug]
               * @return {number} logical position of sTarget within sSrc, -1 if not found
               */
              TextOut.prototype.findTarget = function(sSrc, fDebug)
              {
                  var i = 0, iPos = 0, iTarget;
              
                  if (fDebug) console.log('findTarget("' + sSrc + '")');
              
                  if ((iTarget = sSrc.indexOf(this.sTarget, i)) >= 0) {
                      /*
                       * i is a physical position, whereas iPos is the logical position (ie, taking into account tab stops),
                       * so we have to walk i up to iTarget, advancing iPos as we go.
                       */
                      while (i < iTarget) {
                          var ch = sSrc.charAt(i++);
                          if (ch != '\t') {
                              iPos++;
                          } else {
                              iPos = iPos + (this.nTabWidth - (iPos % this.nTabWidth));
                          }
                          if (fDebug) console.log('\t"' + ch + '": index=' + (i - 1) + ', pos=' + iPos);
                      }
                      this.iTargetIndex = iTarget;
                      iTarget = iPos;
                  }
                  return iTarget;
              };
              
              /**
               * getLineParts(iLine, fBogus)
               *
               * Returns the following array:
               *
               *      asParts[1]: label
               *      asParts[2]: operation
               *      asParts[3]: operand(s)
               *      asParts[4]: offset
               *      asParts[5]: byte sequence
               *      asParts[6]: ASCII sequence, if any
               *
               * or null if the line does not contain all of the above.
               *
               * @this {TextOut}
               * @param {number} iLine
               * @param {boolean} [fBogus]
               * @return {Array.<string>}
               */
              TextOut.prototype.getLineParts = function(iLine, fBogus)
              {
                  var as = this.asLines[iLine].match(/^\n?([^\s:]+:|)\s*([^\s;]+)\s*([^;]*?)\s*;\s*([0-9A-F]+)\s*([0-9A-F]+)\s*([^\s]+|)$/);
                  if (as && fBogus) {
                      /*
                       * In most (but not all) cases, an "add [bx+si],al" instruction is bogus (TODO: Come up with an actual bogosity test)
                       */
                      if (as[2] == "add" && as[3] == "[bx+si],al") {
                          as[2] = "dw";
                          as[3] = "0x0000";
                      }
                  }
                  return as;
              };
              
              /**
               * outputText(sOutputFile, fOverwrite)
               *
               * @this {TextOut}
               * @param {string} [sOutputFile]
               * @param {boolean} [fOverwrite]
               */
              TextOut.prototype.outputText = function(sOutputFile, fOverwrite)
              {
                  if (this.asLines.length) {
                      var sText = "";
                      for (var iLine = 0; iLine < this.asLines.length; iLine++) {
                          if (sText) sText += '\n';
                          sText += this.asLines[iLine];
                      }
                      if (sOutputFile) {
                          try {
                              if (fs.existsSync(sOutputFile) && !fOverwrite) {
                                  console.log(sOutputFile + " exists, use --overwrite to rewrite");
                              } else {
                                  var sDirName = path.dirname(sOutputFile);
                                  if (!fs.existsSync(sDirName)) mkdirp.sync(sDirName);
                                  fs.writeFileSync(sOutputFile, sText);
                                  console.log(sText.length + "-byte file saved as " + sOutputFile);
                              }
                          } catch(err) {
                              TextOut.logError(err);
                          }
                      } else {
                          console.log(sText);
                      }
                  }
              };
              
              module.exports = TextOut;
              
      • pc
        • basic
          • ibm-basic-1.00.json
            [233,143,126,232,167,107,203,232,2,101,203,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,46,148,13,104,115,91,17,
            89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,27,45,254,17,88,30,240,27,
            145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,169,18,88,18,57,34,184,18,
            216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,67,108,65,109,65,206,65,47,
            83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,28,101,128,126,150,125,241,
            112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,41,248,40,11,41,128,34,71,41,
            13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,1,72,1,87,1,139,1,180,1,217,
            1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,3,101,3,105,3,106,3,85,84,207,
            170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,0,79,76,79,210,191,76,79,83,
            197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,30,79,211,12,72,82,164,22,
            65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,70,73,78,212,173,69,70,83,
            78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,166,82,82,79,210,167,82,204,
            212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,207,137,79,32,84,207,137,79,
            83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,208,242,78,75,69,89,164,222,
            0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,136,73,78,197,176,79,65,196,
            188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,82,71,197,189,79,196,243,73,
            68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,84,164,25,80,84,73,79,206,184,
            70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,212,199,79,73,78,212,220,69,
            206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,83,85,77,197,168,73,71,72,84,
            164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,144,87,65,208,164,65,86,197,
            190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,80,65,67,69,164,24,79,85,78,
            196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,168,206,207,204,65,206,13,0,
            83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,72,73,76,197,177,69,78,196,178,
            82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,190,230,189,231,188,232,0,121,
            121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,32,99,116,101,18,99,25,99,65,
            99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,116,32,70,79,82,0,83,121,110,
            116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,83,85,66,0,79,117,116,32,111,
            102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,0,79,118,101,114,102,108,
            111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,100,32,108,105,110,101,32,110,
            117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,103,101,0,68,117,112,108,105,
            99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,98,121,32,122,101,114,111,0,73,
            108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,99,104,0,79,117,116,32,111,102,
            32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,108,111,110,103,0,83,116,114,105,
            110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,97,110,39,116,32,99,111,110,116,105,
            110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,116,105,111,110,0,78,111,32,82,69,83,
            85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,85,110,112,114,105,110,116,97,98,108,
            101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,0,76,105,110,101,32,98,117,102,102,
            101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,117,116,0,68,101,118,105,99,101,
            32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,32,111,102,32,80,97,112,101,114,
            0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,105,116,104,111,117,116,32,87,72,
            73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,0,66,
            97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,111,117,110,100,0,66,97,100,32,
            102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,101,110,0,63,0,68,101,118,105,
            99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,0,63,0,
            63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,66,97,100,32,114,101,99,111,
            114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,105,114,101,99,116,32,115,116,
            97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,102,105,108,101,115,0,0,0,0,195,
            30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,
            1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,105,110,32,0,
            79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,241,60,130,116,1,195,138,15,
            67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,185,181,8,233,145,0,205,134,
            139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,178,57,185,178,54,185,178,53,
            185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,178,58,235,34,139,30,55,3,137,
            30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,178,13,50,192,162,54,5,162,95,
            0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,116,4,137,30,73,3,185,12,8,
            139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,138,199,34,195,254,192,116,
            10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,135,218,233,115,6,50,192,
            136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,138,208,46,138,7,67,10,
            192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,180,3,235,212,232,190,
            114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,232,241,34,176,89,205,
            138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,187,255,255,137,30,
            46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,132,40,90,115,14,
            50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,137,30,63,3,160,
            247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,147,38,117,3,233,
            118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,81,232,238,61,232,
            176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,89,81,115,3,232,214,
            24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,3,217,83,232,21,91,
            91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,73,138,193,10,197,
            117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,254,139,30,48,0,135,
            218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,232,253,4,232,249,4,
            235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,175,35,234,116,2,
            60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,30,48,0,139,203,
            138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,162,253,2,162,
            252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,187,183,0,50,
            192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,47,67,80,232,
            84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,218,80,138,7,
            67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,115,3,233,46,
            1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,233,8,0,186,101,11,232,8,0,117,38,176,141,89,233,
            173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,0,85,66,0,91,232,127,
            14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,46,172,36,127,117,3,233,
            171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,116,21,60,208,116,17,232,
            54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,0,89,90,12,128,80,176,255,
            232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,75,80,205,146,186,12,12,
            138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,147,158,137,142,205,141,
            0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,60,217,116,3,233,198,
            0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,3,233,137,0,160,253,
            2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,253,0,94,135,222,86,
            135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,251,2,60,2,117,26,
            139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,27,232,92,0,187,163,
            4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,242,46,172,36,127,
            117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,12,60,72,176,11,117,
            2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,23,233,155,250,205,
            147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,60,48,115,236,60,46,
            116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,233,159,254,75,138,
            7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,59,3,160,251,2,80,232,
            123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,117,30,3,217,82,75,138,
            55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,232,227,30,83,139,30,53,
            3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,193,249,156,232,14,9,157,
            83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,198,86,235,39,232,18,93,
            232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,244,92,232,147,85,232,18,
            109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,83,139,30,90,4,137,30,46,
            0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,181,130,81,235,66,233,203,
            248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,116,224,67,139,23,67,137,
            22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,19,205,150,232,155,29,137,
            38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,171,60,74,115,162,50,228,
            2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,192,254,200,195,10,192,116,
            251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,115,7,60,254,117,27,138,7,
            67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,254,2,75,138,63,235,225,232,
            55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,218,89,90,137,30,254,2,88,187,
            4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,13,114,19,139,30,2,3,117,10,67,
            67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,163,4,139,30,4,3,137,30,165,4,195,
            187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,65,138,200,138,232,232,5,255,60,
            234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,254,192,94,135,222,86,187,96,3,
            181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,232,179,14,121,155,178,5,233,
            122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,3,117,3,233,159,254,50,192,162,
            0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,218,3,219,3,218,3,219,88,158,44,
            48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,116,3,233,163,48,232,117,28,185,
            232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,196,80,134,196,81,235,4,81,232,
            123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,222,86,232,81,0,67,83,139,30,
            46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,217,195,178,8,233,163,246,205,
            152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,46,0,187,232,14,94,135,222,86,
            176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,116,186,67,60,34,116,233,254,
            192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,231,137,22,59,3,82,160,251,2,
            80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,163,4,60,5,114,3,186,159,4,83,
            60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,187,44,3,59,218,115,10,176,90,
            232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,24,253,232,236,27,137,232,95,
            254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,3,10,192,138,194,116,209,160,
            40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,201,138,197,117,3,233,185,252,
            232,26,254,60,44,117,167,235,238,186,79,3,139,242,172,10,192,117,3,233,104,245,254,192,162,40,0,139,250,170,138,7,60,131,
            116,16,232,245,253,117,133,11,210,116,3,233,113,254,254,192,235,6,232,151,252,116,1,195,139,30,75,3,135,218,139,30,71,3,137,
            30,46,0,135,218,117,237,138,7,10,192,117,4,67,67,67,67,67,233,178,254,232,112,12,117,218,10,192,117,3,233,164,253,233,32,
            245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,116,8,232,147,253,116,3,
            233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,245,232,44,4,138,7,60,
            44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,117,3,233,204,253,60,
            13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,117,238,235,209,232,
            106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,3,233,171,0,60,210,
            117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,18,198,7,32,139,
            30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,138,232,254,192,
            116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,114,3,232,153,24,
            91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,232,50,59,60,255,
            116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,80,60,210,116,1,74,
            138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,41,0,138,216,254,
            192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,111,27,138,7,117,
            3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,176,32,232,24,
            23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,137,30,233,
            4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,176,0,91,233,
            230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,232,122,34,232,
            68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,32,102,114,111,
            109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,156,160,58,3,10,
            192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,242,232,190,28,
            185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,235,4,232,111,
            24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,161,24,81,50,192,
            162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,181,0,254,197,232,
            76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,116,7,60,44,116,3,
            233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,233,31,255,83,232,
            13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,3,233,10,255,198,
            7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,138,7,60,44,116,
            10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,155,248,138,240,
            138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,192,117,1,195,138,
            193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,233,253,82,75,232,
            79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,218,116,3,233,53,
            23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,22,55,3,232,8,248,
            60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,178,1,50,192,162,
            168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,160,251,2,60,3,138,
            194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,81,138,198,205,158,
            60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,121,3,233,17,0,255,
            54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,255,182,0,44,230,
            114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,101,83,232,55,
            76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,187,3,27,83,
            232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,2,116,40,60,
            4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,3,233,124,
            239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,30,161,4,
            91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,31,255,
            227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,232,97,
            75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,76,232,
            51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,233,106,
            1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,0,60,213,
            117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,117,46,232,
            199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,11,219,117,
            3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,3,233,76,
            46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,126,2,
            232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,232,65,
            1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,232,229,
            255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,60,71,115,
            67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,36,60,56,114,
            3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,213,232,153,
            74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,81,232,134,
            244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,101,4,135,218,
            94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,213,25,82,176,
            1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,60,233,116,251,
            159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,137,30,163,4,
            89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,60,123,117,3,
            233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,218,247,211,
            195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,132,73,232,
            46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,80,60,3,117,
            3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,208,208,138,
            200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,208,116,233,
            60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,232,243,1,
            232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,232,185,
            17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,233,206,
            0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,218,94,135,
            222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,227,232,249,
            71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,88,10,192,116,
            78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,74,74,74,160,251,
            2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,232,223,0,185,197,
            28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,4,4,80,208,200,138,
            200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,30,122,3,139,30,228,
            3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,30,80,4,138,199,10,195,
            162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,163,4,59,218,114,6,232,
            124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,135,218,139,227,139,30,
            80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,91,195,139,242,172,136,
            7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,15,209,176,128,162,57,
            3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,233,175,55,60,162,117,
            3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,232,240,255,238,195,
            232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,0,10,192,117,11,135,
            218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,125,32,138,198,182,
            0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,194,2,192,138,208,
            176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,232,50,58,10,192,
            121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,194,162,42,0,195,
            232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,233,50,241,75,232,
            242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,239,116,14,232,
            168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,138,15,67,138,
            47,67,138,197,10,193,117,3,233,61,233,232,90,16,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,218,59,218,89,
            115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,24,0,187,247,
            1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,50,192,162,94,
            4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,60,34,117,10,
            160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,121,3,233,60,
            0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,65,254,206,117,
            1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,208,216,208,216,
            115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,73,139,241,172,
            60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,53,255,160,252,
            2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,3,232,229,255,
            138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,116,1,75,83,81,
            82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,138,7,58,197,
            117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,117,7,50,192,
            162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,235,6,46,138,
            7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,100,254,232,
            191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,233,96,66,60,
            12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,170,65,254,206,
            116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,3,232,82,67,138,
            7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,117,4,60,46,116,
            8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,2,233,174,253,
            232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,238,187,45,7,232,
            246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,137,30,88,3,195,
            232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,6,142,6,80,3,139,
            250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,60,144,117,237,232,
            171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,82,232,116,237,138,
            238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,11,210,117,3,233,74,
            237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,44,237,90,89,88,83,
            82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,218,90,116,12,138,
            7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,86,135,218,67,137,
            23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,117,1,195,67,139,23,
            67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,60,137,117,228,232,
            92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,73,158,176,13,114,
            63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,102,105,110,101,
            100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,35,83,139,30,
            254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,170,9,83,232,
            166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,7,44,48,115,
            3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,67,235,243,159,
            134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,3,233,143,9,82,
            67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,117,109,98,101,
            114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,135,218,139,30,
            46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,161,116,29,60,
            205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,143,117,7,81,
            232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,117,161,254,205,
            117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,30,90,4,137,30,46,
            0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,46,0,91,82,195,159,
            80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,81,80,232,214,2,88,
            138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,192,115,241,254,206,
            254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,74,232,47,0,232,137,
            2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,149,0,187,44,3,83,
            136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,239,60,34,117,3,
            232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,218,138,193,232,
            180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,138,7,117,155,186,
            16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,117,3,232,165,5,65,
            235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,218,114,15,137,30,
            47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,81,139,30,10,3,137,
            30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,30,78,4,139,30,90,3,
            137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,50,192,138,208,182,
            0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,218,3,218,137,30,
            75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,67,88,83,3,217,60,
            3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,39,81,50,192,10,7,
            159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,94,135,222,86,59,218,
            94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,138,31,183,0,3,217,
            138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,30,163,4,94,135,222,
            86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,253,90,232,72,0,94,
            135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,135,222,86,138,7,
            67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,30,163,4,135,218,
            232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,30,47,3,91,195,205,
            238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,138,240,138,7,10,192,
            195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,45,3,136,23,89,233,
            114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,232,236,241,116,5,
            232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,205,116,188,139,
            30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,3,138,197,186,
            177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,90,232,13,255,
            233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,230,81,232,181,
            1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,232,114,243,138,
            234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,232,190,63,89,
            91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,243,244,10,192,
            117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,236,232,163,3,
            41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,200,58,7,176,0,
            115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,82,94,135,222,
            86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,192,195,91,90,
            90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,83,82,135,218,
            67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,86,232,241,
            2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,94,135,222,
            86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,138,205,254,
            201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,1,195,139,242,
            172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,41,195,232,150,
            239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,83,232,37,4,116,
            3,233,221,23,91,88,134,196,158,81,159,80,60,8,117,16,232,103,35,10,192,116,25,254,200,232,99,35,176,8,235,56,60,9,117,16,
            176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,11,254,205,58,
            197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,188,3,116,61,
            232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,239,4,10,192,
            116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,116,248,235,
            11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,192,195,205,
            183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,125,226,83,232,175,32,116,33,232,176,255,10,192,117,
            16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,163,4,176,3,
            162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,115,1,195,139,
            30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,218,235,227,117,
            214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,205,175,137,30,
            59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,7,0,187,11,0,
            232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,47,3,50,192,
            232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,89,139,30,44,
            0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,137,30,124,
            3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,86,139,223,
            117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,139,217,90,
            114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,31,21,157,137,30,67,3,187,14,3,137,
            30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,245,253,157,
            187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,219,186,17,
            0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,30,90,3,94,
            135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,218,83,139,
            30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,3,232,115,
            8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,218,139,242,
            172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,88,134,196,
            158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,232,146,254,
            44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,223,116,3,
            233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,25,135,218,
            137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,3,235,186,
            139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,48,139,30,
            86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,232,94,0,50,
            192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,1,58,195,116,
            221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,30,86,0,232,
            9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,42,199,114,
            150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,200,117,
            3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,16,58,
            199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,58,195,
            115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,117,
            249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,172,
            138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,138,
            200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,203,
            3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,232,
            7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,255,
            232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,60,27,117,2,176,21,10,192,117,3,232,113,28,80,139,30,88,0,135,218,139,30,
            86,0,138,195,58,194,117,22,138,199,58,198,115,4,137,30,88,0,160,90,0,58,199,115,5,138,199,162,90,0,88,232,41,0,114,10,116,
            181,232,253,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,
            7,117,246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,
            32,0,80,138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,60,32,
            114,3,34,192,195,60,7,116,249,60,9,116,245,60,11,116,241,60,12,116,237,60,28,114,4,60,32,114,229,50,192,195,13,2,6,5,3,11,
            12,28,29,30,31,14,127,21,9,10,8,18,2,6,5,3,13,14,127,21,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,
            50,193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,
            205,117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,
            41,3,160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,
            66,138,193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,
            30,88,0,82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,
            1,254,195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,
            7,0,135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,
            235,247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,
            197,117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,
            160,114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,
            83,187,90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,
            230,1,88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,
            232,173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,
            86,91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,
            5,2,94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,
            41,0,138,248,160,80,0,138,200,81,232,34,26,89,254,207,116,10,10,192,116,243,58,193,116,239,254,199,254,199,232,36,26,50,192,
            195,232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,
            195,235,226,50,192,162,112,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,197,235,241,232,214,25,232,59,1,115,7,232,49,0,
            116,182,235,241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,
            114,7,232,23,0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,
            117,190,160,41,0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,
            22,0,139,250,170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,
            232,138,251,116,21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,
            116,25,254,199,232,196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,
            81,232,164,0,89,80,138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,
            114,47,116,34,139,30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,
            83,183,1,232,249,24,91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,
            114,18,60,65,114,243,60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,
            60,255,116,8,254,199,254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,
            34,195,254,192,135,218,116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,
            3,232,120,211,114,3,233,60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,
            188,232,187,247,1,232,169,232,232,87,245,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,
            160,209,60,10,116,3,233,107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,
            13,232,77,244,176,10,195,75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,
            232,201,247,115,3,233,63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,
            51,138,232,81,181,255,186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,
            116,228,138,197,60,39,114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,
            1,195,254,198,60,33,116,249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,
            251,2,232,18,215,160,57,3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,
            162,57,3,83,160,77,4,10,192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,
            36,50,192,162,74,4,139,30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,
            91,94,135,222,86,82,186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,
            2,197,254,192,138,200,81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,
            0,59,218,117,248,90,136,55,67,90,137,23,67,232,221,1,135,218,66,91,195,50,192,162,166,4,138,248,138,216,137,30,163,4,232,
            64,226,117,7,187,6,0,137,30,163,4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,
            135,218,4,2,208,216,138,200,232,195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,
            88,137,30,181,0,91,4,2,208,216,89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,
            92,4,10,192,116,8,11,210,117,3,233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,
            116,136,60,41,116,7,60,93,116,3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,
            139,30,90,3,233,175,44,160,250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,
            9,0,233,25,206,160,251,2,136,7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,
            245,242,67,67,137,30,49,3,136,15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,
            159,65,158,136,15,159,80,67,136,47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,
            242,232,220,242,137,30,92,3,75,198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,
            75,137,23,67,67,88,158,114,70,138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,
            42,3,218,88,254,200,139,203,117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,
            89,3,217,135,218,139,30,82,3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,
            172,138,232,254,197,139,242,172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,
            139,30,163,4,235,10,160,58,3,10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,197,117,3,233,95,213,67,
            139,31,235,36,138,213,83,177,2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,
            1,232,130,240,50,192,138,208,138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,
            205,117,3,233,46,1,60,43,176,8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,
            24,60,42,117,174,138,197,67,60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,
            254,194,177,0,254,205,116,97,138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,
            46,116,3,233,101,255,177,1,67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,
            195,58,7,117,251,67,58,7,117,246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,
            75,254,194,36,8,117,28,254,202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,
            116,101,81,82,232,2,219,90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,
            75,232,216,210,249,116,17,162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,
            182,0,138,208,139,31,3,218,138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,
            231,239,94,135,222,86,232,28,236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,
            254,205,232,69,0,91,157,116,208,81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,
            3,232,161,236,232,228,233,139,30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,
            177,238,235,244,80,138,198,10,192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,
            68,158,159,68,158,117,8,3,217,139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,
            0,117,103,139,227,137,30,69,3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,
            39,91,116,9,185,177,0,138,233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,
            0,58,193,117,7,185,16,0,3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,
            232,58,7,75,232,109,209,116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,
            242,172,60,32,117,9,66,136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,
            209,176,44,232,175,237,235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,
            83,138,242,232,135,1,116,9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,
            2,115,5,205,172,233,97,201,60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,
            123,115,2,44,32,81,138,232,139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,
            90,10,192,195,10,192,120,235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,
            200,75,89,66,68,255,83,67,82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,
            80,134,196,186,46,0,3,218,176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,
            138,216,183,0,3,218,46,138,23,67,46,138,55,135,218,90,94,135,222,86,195,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,0,232,17,216,83,232,140,233,138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,
            196,80,134,196,185,240,4,182,11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,
            88,134,196,158,159,134,196,80,134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,
            255,6,138,198,60,11,116,239,60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,
            246,235,186,138,7,67,254,202,195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,
            3,218,139,31,160,54,5,254,192,116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,
            7,10,192,249,195,75,232,53,207,60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,
            4,195,185,152,20,81,232,28,215,138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,
            1,60,73,116,21,178,2,60,79,116,15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,
            206,232,204,222,232,161,237,44,138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,
            138,7,60,130,178,4,117,89,232,165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,
            237,80,232,95,237,69,232,91,237,78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,
            237,85,232,60,237,84,178,2,235,17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,
            82,138,7,60,35,117,3,232,61,206,232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,
            94,135,222,86,138,194,159,134,196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,
            185,46,0,3,217,136,55,176,0,91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,
            83,176,2,115,3,233,113,253,205,224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,
            7,0,91,195,249,235,3,13,50,192,159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,
            106,236,82,88,158,249,159,80,159,80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,
            5,88,158,159,80,26,192,162,239,4,138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,
            253,205,234,75,232,70,205,178,128,249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,
            236,65,10,192,178,2,159,80,138,194,36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,
            4,138,7,91,36,128,117,3,233,20,221,83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,
            30,233,4,232,198,0,10,192,121,3,233,22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,
            2,0,235,231,232,160,0,60,252,117,3,233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,
            117,3,233,54,26,88,158,205,236,233,0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,
            4,232,171,0,50,192,232,241,252,198,7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,
            232,40,4,232,39,199,67,67,137,30,88,3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,
            135,218,139,30,47,3,135,218,59,218,114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,
            90,91,195,117,30,83,81,80,186,38,67,82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,
            138,7,60,35,117,3,232,218,203,232,214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,
            10,192,120,204,185,40,65,50,192,160,223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,
            239,50,192,162,54,5,232,149,233,139,30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,
            30,233,4,176,6,232,5,0,205,227,233,235,195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,
            202,0,88,134,196,158,94,135,222,86,91,233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,
            232,48,203,232,4,234,36,232,0,234,40,83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,
            11,232,9,203,232,205,251,91,50,192,138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,
            83,232,7,226,135,218,89,88,158,159,80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,
            233,51,226,88,158,139,30,46,0,137,30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,
            2,0,91,195,50,192,136,7,67,254,205,117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,
            194,176,10,115,3,233,18,250,205,230,233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,
            232,223,250,117,3,233,210,194,176,14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,
            178,66,233,242,194,60,35,117,173,232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,
            232,30,214,185,155,22,186,32,44,117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,
            138,240,138,208,80,81,83,232,165,254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,
            44,138,197,117,9,138,245,138,213,232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,
            91,60,10,117,36,138,200,138,194,60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,
            44,176,13,116,15,10,192,116,11,58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,
            232,32,254,114,32,60,32,116,247,60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,
            195,193,91,198,7,0,187,246,1,138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,
            3,232,196,35,88,158,114,3,232,196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,
            116,3,233,158,193,83,81,178,2,232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,
            125,193,254,200,162,96,0,83,81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,
            185,200,90,117,3,176,1,195,82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,
            135,218,3,217,137,30,4,7,135,218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,
            185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,
            42,197,46,50,7,80,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,
            11,254,205,117,188,181,13,235,184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,
            138,199,20,0,138,248,139,242,172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,
            139,250,170,66,254,201,117,2,177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,
            80,160,100,4,10,192,116,3,233,245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,
            7,60,207,156,117,3,232,152,199,232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,
            5,116,3,187,0,0,159,3,217,209,222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,
            137,30,57,5,135,218,91,195,50,192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,
            49,199,232,140,255,83,232,20,3,187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,
            232,12,199,116,11,232,222,229,44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,
            55,5,138,195,42,193,138,216,138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,
            5,138,195,42,194,138,216,138,199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,
            55,5,94,135,222,86,137,30,55,5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,
            44,232,88,229,66,117,3,233,96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,
            255,115,3,232,175,255,67,83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,
            197,10,193,117,227,91,195,81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,
            82,135,218,232,218,255,91,137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,
            5,139,203,232,183,255,91,195,205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,
            187,241,73,115,3,187,5,74,94,135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,
            94,135,222,86,137,30,249,6,187,213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,
            65,233,32,2,138,198,10,192,208,216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,
            195,139,30,243,6,129,251,0,32,114,9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,
            114,9,129,235,176,31,137,30,243,6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,
            6,243,6,195,138,193,138,14,85,0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,
            138,7,138,22,245,6,34,194,138,14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,
            233,160,245,6,246,208,38,34,7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,
            2,211,226,3,211,177,4,211,226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,
            210,232,162,245,6,177,3,211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,
            160,72,0,199,6,59,5,100,0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,
            198,6,85,0,0,195,60,4,115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,
            248,195,160,85,0,10,192,116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,
            129,250,200,0,114,4,186,199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,
            139,30,243,6,38,138,47,160,245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,
            210,204,115,239,139,30,243,6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,
            6,129,226,7,0,209,233,227,171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,
            142,198,195,232,127,254,3,22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,
            91,195,83,232,39,25,91,195,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,15,205,16,162,72,0,180,40,60,2,114,13,
            180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,52,77,137,
            30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,143,2,0,38,
            199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,99,50,190,
            237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,84,104,101,
            32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,114,115,
            105,111,110,32,67,49,46,48,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,255,13,0,
            50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,34,76,80,
            84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,80,30,82,
            186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,160,106,
            0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,106,0,10,
            192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,19,187,52,
            78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,30,107,0,
            254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,137,30,
            107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,0,10,
            192,116,2,121,160,180,1,140,203,138,30,110,0,58,223,115,2,254,204,136,38,106,0,36,127,117,138,91,95,94,233,58,255,30,48,46,
            32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,116,9,70,
            254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,127,79,14,
            117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,44,2,116,
            4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,46,255,183,
            225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,62,73,0,138,
            30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,255,138,232,
            138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,254,193,181,
            0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,21,0,138,62,
            73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,2,205,16,
            90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,16,232,
            28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,117,32,
            138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,82,80,
            186,0,0,180,0,205,23,246,196,32,117,14,246,196,4,117,13,246,196,1,116,13,178,24,235,6,178,27,235,2,178,25,233,190,183,88,
            80,60,13,117,5,176,10,232,206,255,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,254,
            200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,114,
            2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,117,0,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,113,
            0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,232,
            251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,192,
            86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,0,138,
            62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,192,255,
            117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,91,86,177,
            6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,192,60,
            58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,185,1,
            0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,9,254,
            197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,77,
            205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,232,
            43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,10,50,
            210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,249,8,
            115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,128,117,
            29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,41,0,161,
            72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,0,232,110,
            0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,80,235,28,
            128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,128,62,41,
            0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,0,0,137,
            14,73,0,160,72,0,180,0,205,16,232,189,221,232,193,253,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,81,0,128,
            62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,138,221,
            128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,193,128,
            249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,81,232,
            117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,43,218,
            44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,128,229,
            7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,136,46,
            79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,4,60,25,
            115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,114,43,
            90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,10,232,
            81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,131,
            186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,22,
            86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,139,
            14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
            255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,38,140,
            14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,38,143,
            6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,233,116,
            80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,138,62,
            73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,88,10,
            192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,42,201,
            89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,27,201,
            60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,86,114,
            86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,245,
            180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,233,
            154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,0,254,
            192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,187,15,
            0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,185,4,0,
            88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,60,149,
            116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,168,1,116,
            14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,80,85,86,
            87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,0,160,69,
            0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,7,186,97,
            0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,
            160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,83,187,
            70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,200,152,
            138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,198,131,
            250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,220,52,247,
            241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,22,102,0,
            198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,89,16,89,
            16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,16,171,91,
            240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,67,136,47,
            67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,89,90,91,195,
            90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,4,138,135,47,
            0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,63,32,117,
            13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,4,116,9,10,
            192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,249,89,91,195,
            83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,203,244,91,131,
            195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,232,165,244,46,
            138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,0,0,136,14,82,
            5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,82,5,233,163,235,
            232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,139,30,233,4,136,
            143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,160,99,0,136,7,233,
            128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,116,15,254,7,83,232,149,254,91,56,7,114,7,176,13,235,
            231,198,7,0,138,7,232,124,254,136,7,195,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,226,251,117,2,178,1,
            162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,32,160,96,0,10,192,
            116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,46,254,246,196,1,
            117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,117,10,232,17,
            1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,83,5,185,17,0,
            83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,11,50,192,162,
            97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,117,13,139,30,
            233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,0,136,7,254,193,
            116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,7,1,195,232,61,
            253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,138,7,198,7,0,10,
            192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,252,58,15,116,3,
            10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,7,232,206,252,
            198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,8,136,14,81,
            5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,254,90,89,91,
            160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,190,83,5,139,
            140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,192,116,14,139,
            148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,88,3,233,128,229,
            80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,232,193,10,192,117,
            4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,50,193,162,167,4,
            138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,131,196,2,233,93,
            23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,203,128,195,198,
            6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,232,49,208,40,232,
            167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,255,54,94,4,203,139,
            30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
            38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,30,29,29,29,29,28,
            28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,18,17,17,17,16,16,
            16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,3,3,3,3,2,2,2,1,1,
            1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,248,248,247,247,
            247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,239,238,238,238,
            238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,229,229,229,228,
            228,228,228,227,227,227,226,226,226,225,225,225,225,224,35,199,83,237,220,199,89,2,118,92,84,20,234,28,8,6,147,115,105,153,
            36,36,42,9,120,208,195,191,45,173,84,12,75,98,218,151,60,236,4,16,222,250,208,189,75,39,38,19,149,57,69,173,30,177,79,22,
            253,67,75,44,179,206,1,26,253,20,94,247,95,66,34,29,60,154,53,245,247,210,74,32,203,0,131,242,181,135,125,35,127,224,145,
            183,209,116,30,39,158,88,118,37,6,18,70,42,198,238,211,174,135,150,119,45,60,117,68,205,20,190,26,49,139,146,149,0,154,109,
            65,52,45,247,186,128,0,201,113,55,124,218,116,80,160,29,23,59,27,17,146,100,8,229,60,62,98,149,182,125,74,30,108,65,94,29,
            146,142,238,146,19,69,181,164,54,50,170,119,56,72,226,77,196,190,148,149,102,75,173,176,58,247,124,29,16,79,217,92,9,53,220,
            36,52,82,15,180,75,66,19,46,97,85,137,80,111,9,204,188,12,89,172,36,203,11,255,235,47,92,214,237,189,206,254,230,91,95,166,
            180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,71,
            172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,204,
            76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,145,
            0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,183,
            67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,201,
            27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,122,
            23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,97,81,
            89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,225,
            79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,195,
            86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,153,
            118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,176,
            77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,90,
            0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,128,
            150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,255,
            127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,117,
            126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,0,
            0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,48,
            49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,114,10,128,38,165,4,128,116,
            71,233,205,24,60,104,114,82,160,165,4,10,192,121,9,36,127,162,165,4,187,235,98,83,255,54,163,4,255,54,165,4,232,70,16,138,
            226,128,196,129,116,27,80,50,228,232,212,17,88,91,90,80,232,150,4,187,23,98,232,123,18,91,51,210,138,218,233,32,10,131,196,
            4,50,228,136,38,167,4,233,241,17,186,0,0,187,0,129,233,234,5,191,163,4,51,192,252,171,199,5,0,129,195,233,26,172,205,185,
            128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,5,
            135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,192,
            135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,218,
            112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,5,139,
            216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,198,6,
            251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,62,163,
            4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,83,232,
            25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,139,159,
            2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,163,195,
            135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,138,229,
            138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,195,139,
            193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,114,3,186,
            159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,54,200,139,
            241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,120,3,233,
            131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,2,137,30,163,
            4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,136,255,156,
            138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,192,205,202,
            162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,208,208,224,
            26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,3,22,120,
            250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,254,192,195,
            120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,199,6,165,4,0,0,121,6,199,6,165,4,255,255,
            11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,152,3,240,59,245,
            117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,10,192,116,16,152,
            145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,243,139,46,92,3,
            252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,233,58,44,117,
            229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,222,233,5,211,
            232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,116,226,161,165,
            4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,195,246,217,162,
            167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,56,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,4,190,170,4,185,
            4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,233,233,17,173,
            25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,233,244,12,233,
            141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,240,128,54,165,
            4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,134,223,137,30,
            166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,114,18,157,137,
            54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,138,226,138,214,138,243,50,219,128,233,8,246,196,31,
            116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,121,37,42,204,
            138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,254,195,117,26,
            235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,19,195,160,177,
            4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,4,187,164,4,248,
            232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,232,119,19,139,
            252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,249,115,16,185,
            4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,4,128,116,9,255,
            6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,233,122,18,232,87,
            244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,209,214,86,87,43,
            253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,233,165,11,209,
            210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,139,30,163,4,129,
            251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,80,232,36,2,235,
            20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,4,232,139,2,91,90,
            232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,50,192,233,9,0,
            205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,192,117,5,198,
            6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,189,163,97,
            51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,106,75,106,
            95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,175,81,83,
            87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,232,221,0,233,11,0,232,188,0,233,5,0,50,192,232,182,0,157,
            117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,11,246,121,2,247,218,43,215,112,75,116,72,120,8,131,250,39,114,29,233,
            61,10,82,131,194,38,90,121,19,82,186,176,106,82,186,2,95,235,18,90,131,194,38,131,250,218,120,37,185,3,0,211,226,129,194,
            50,96,135,218,82,232,218,16,114,8,232,187,17,232,133,1,235,10,121,5,83,232,201,0,91,232,5,17,91,195,233,138,16,159,128,62,
            251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,214,235,5,60,43,116,1,
            195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,50,246,3,208,235,223,
            12,1,156,83,87,232,78,0,95,91,51,246,139,214,232,76,255,157,117,5,83,232,13,0,91,67,195,232,88,16,120,249,233,111,156,116,
            49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,30,167,4,139,22,163,
            4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,14,0,176,8,162,251,2,
            51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,195,205,209,117,3,233,
            24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,232,138,251,232,203,6,
            232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,5,36,127,162,165,4,
            186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,2,247,219,137,30,163,
            4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,138,222,138,242,138,
            215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,30,177,4,232,218,240,
            255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,44,191,0,0,139,207,139,
            0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,4,71,71,235,219,139,193,
            83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,5,128,14,158,4,32,160,165,
            4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,233,221,7,232,115,14,116,
            4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,139,202,88,247,227,3,200,
            115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,6,166,4,117,3,233,144,
            7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,11,195,83,176,8,114,2,
            176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,89,235,38,4,7,88,121,
            15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,197,176,2,235,4,2,197,
            181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,63,46,116,1,67,157,88,
            116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,254,196,44,10,115,250,
            4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,7,48,254,197,117,248,
            67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,3,137,14,129,4,195,180,
            5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,7,67,137,54,163,4,254,
            204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,139,22,163,4,86,138,198,
            50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,48,117,3,67,226,248,195,
            232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,91,190,171,4,191,159,4,
            185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,176,9,232,46,255,80,176,
            47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,60,58,117,9,198,7,49,67,198,7,48,235,2,136,7,67,88,254,200,117,215,81,
            190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,11,137,30,165,4,137,22,163,
            4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,82,232,94,13,93,176,47,80,
            88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,7,67,88,254,200,117,206,66,
            66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,81,185,7,0,191,159,4,248,252,
            46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,35,95,152,43,248,87,139,216,209,227,209,
            227,209,227,129,195,50,96,232,188,11,115,5,232,246,11,235,217,232,152,12,232,98,252,235,209,187,102,96,232,113,12,232,22,
            13,115,6,232,207,11,95,79,87,232,153,11,114,14,187,122,96,232,119,12,232,65,252,88,44,9,235,1,88,89,91,10,192,195,187,180,
            4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,232,191,242,116,50,189,
            165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,117,112,117,112,121,
            112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,198,7,36,246,196,4,
            117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,117,245,195,187,180,
            4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,221,255,117,8,67,198,
            7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,120,252,232,129,10,121,
            3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,81,232,55,13,139,22,171,
            4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,233,47,10,191,190,37,87,
            191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,10,219,121,36,128,255,153,
            114,3,233,239,158,82,83,255,54,163,4,255,54,165,4,232,52,1,91,90,232,92,11,232,63,11,91,90,116,3,233,211,158,160,165,4,10,
            192,121,9,191,195,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,232,4,1,90,91,232,44,11,117,30,
            82,83,186,0,0,187,0,144,232,31,11,91,90,121,15,157,90,91,233,60,0,186,0,0,187,0,129,233,18,247,157,121,14,83,82,232,47,1,
            138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,176,125,87,83,82,232,21,1,90,91,
            232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,46,178,4,115,7,90,91,83,82,232,222,
            250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,232,130,10,235,214,90,91,195,138,14,
            166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,128,136,135,1,0,198,135,2,0,184,157,
            156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,1,195,81,83,248,232,122,9,91,89,226,
            246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,235,249,91,195,138,14,166,4,128,233,
            152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,152,128,203,128,157,156,121,6,131,234,
            1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,195,157,115,5,50,228,233,169,1,158,121,
            10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,8,126,81,186,0,0,187,0,129,232,190,9,117,
            9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,187,118,97,232,24,2,90,91,232,16,11,232,
            124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,244,187,49,128,186,24,114,233,157,249,
            233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,0,0,137,30,83,4,116,3,232,233,195,137,
            30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,131,195,4,246,135,255,255,128,120,65,185,
            2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,4,185,2,0,243,165,50,192,116,3,232,75,240,
            95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,235,39,131,195,4,139,15,67,67,94,139,20,246,
            6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,232,165,241,91,89,42,197,232,31,241,116,11,137,
            22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,44,117,9,232,230,154,232,66,255,233,147,147,233,
            168,154,81,83,86,87,82,178,56,187,158,4,191,165,4,190,166,4,235,25,83,185,4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,
            254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,234,8,118,21,190,164,4,185,7,0,253,243,164,128,
            38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,6,138,62,166,4,185,3,0,10,219,120,44,117,18,
            128,239,8,114,29,138,222,138,242,138,212,128,228,32,226,234,116,16,248,208,212,209,210,208,211,246,196,64,117,7,254,207,117,
            216,233,155,6,128,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,45,0,187,10,4,235,12,83,232,2,0,91,195,232,
            31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,137,175,176,10,232,132,175,195,252,10,255,
            190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,0,235,9,131,198,4,191,163,4,185,2,0,46,165,
            226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,138,7,152,232,246,8,80,67,46,139,7,163,163,
            4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,232,131,247,91,83,46,139,23,46,139,159,2,
            0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,6,232,47,7,114,9,91,232,35,251,75,198,
            7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,197,42,6,130,4,121,5,246,216,232,194,
            250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,10,194,116,6,232,179,250,232,57,248,143,
            6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,240,2,194,138,200,120,4,50,192,138,200,
            121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,197,121,23,160,130,4,232,90,250,198,7,46,
            67,50,201,50,192,42,194,42,197,232,75,250,235,22,160,130,4,82,255,54,129,4,42,197,42,194,2,193,120,3,232,54,250,232,39,0,
            255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,1,2,194,254,200,120,3,232,15,250,233,
            91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,2,138,200,195,232,254,4,180,7,114,
            2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,156,10,210,116,2,254,202,2,242,
            157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,88,254,196,117,247,232,191,4,232,
            142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,85,6,235,14,187,110,96,138,196,152,
            3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,50,228,246,220,160,130,4,2,224,254,
            196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,130,4,232,94,247,88,10,228,126,5,138,
            196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,114,21,2,196,138,38,130,4,42,196,10,
            228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,196,64,180,3,117,2,50,228,163,131,4,
            137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,8,198,7,45,83,232,226,5,91,67,198,7,
            48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,3,136,47,67,198,7,0,187,179,4,67,139,
            62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,116,226,180,1,75,83,80,232,234,234,50,
            228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,235,3,75,136,7,88,10,228,116,248,131,
            196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,22,129,4,115,11,83,82,232,69,243,50,192,
            90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,254,200,120,6,232,20,248,198,7,0,143,6,129,
            4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,11,0,46,247,38,107,98,139,248,138,202,160,
            109,98,50,228,247,38,11,0,2,200,50,228,160,13,0,46,247,38,107,98,2,200,50,228,46,139,22,110,98,3,215,46,138,30,111,98,18,
            217,136,38,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,184,251,187,179,4,185,32,0,3,7,67,67,226,250,
            36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,4,233,143,251,83,81,187,158,4,129,7,128,
            0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,4,255,117,5,128,38,159,4,254,187,165,4,
            138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,131,196,4,233,136,251,128,228,224,128,196,128,115,28,156,66,117,
            18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,88,233,106,251,157,117,3,128,226,254,86,190,163,4,137,20,70,70,138,62,
            167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,
            166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,4,232,53,4,187,134,4,232,93,4,232,253,1,232,
            178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,4,89,117,4,254,193,235,204,139,233,232,117,
            4,139,205,195,128,38,165,4,127,232,143,0,186,219,15,187,73,131,232,250,242,186,219,15,187,73,129,232,101,237,161,165,4,128,
            252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,100,0,160,166,4,60,116,115,9,186,219,15,187,73,131,233,
            200,242,51,210,187,128,127,128,227,127,232,150,2,120,42,128,203,128,232,41,237,232,40,1,156,120,16,51,210,187,128,128,232,
            27,237,232,26,1,120,3,232,80,3,51,210,187,0,127,232,11,237,157,120,3,232,66,3,187,165,4,50,192,10,7,156,121,3,128,55,128,
            187,52,98,232,190,250,157,121,6,187,165,4,128,55,128,195,187,99,98,232,247,1,232,255,240,232,190,241,232,173,3,232,164,247,
            232,0,2,232,195,3,232,246,235,232,7,3,232,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,4,255,54,165,
            4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,12,191,57,
            123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,4,186,215,
            179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,54,165,4,
            232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,232,87,176,
            60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,4,163,165,
            4,195,232,42,0,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,4,10,192,116,
            7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,97,232,206,0,
            232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,114,7,232,171,
            0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,209,23,67,67,
            226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,187,170,4,138,
            39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,116,15,81,248,
            232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,226,247,195,191,
            124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,191,159,4,235,229,
            191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,89,195,81,83,87,
            187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,233,137,0,83,87,
            138,195,50,6,165,4,120,63,10,219,120,22,161,165,4,43,195,114,66,117,58,161,163,4,43,194,114,57,117,49,50,192,235,95,139,195,
            43,6,165,4,114,43,117,35,139,194,43,6,163,4,114,33,117,25,50,192,235,71,83,87,191,165,4,139,7,50,6,165,4,121,19,138,38,165,
            4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,247,253,167,117,6,226,
            251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,83,87,191,165,4,138,5,50,7,121,2,235,
            179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,195,46,43,150,0,0,46,26,
            158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,8,205,210,128,54,165,
            4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,232,51,0,191,151,4,185,
            8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,185,4,0,232,165,253,
            114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,185,2,0,191,163,4,135,
            251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,253,114,3,233,29,255,
            233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,4,0,235,17,232,57,253,
            191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,114,3,233,180,243,233,
            27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,46,172,136,7,67,66,254,
            205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,224,139,216,75,137,30,
            44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,101,4,162,40,0,187,14,
            3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,30,224,4,160,223,4,
            254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,116,14,135,218,3,
            217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,0,3,218,137,30,228,
            4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,104,173,
            177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,137,30,10,3,135,218,
            137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,229,187,220,127,232,
            127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0] 
            
          • ibm-basic-1.10.json
            [233,143,126,232,167,107,203,232,2,101,203,93,232,199,47,116,13,139,54,233,4,138,68,46,60,254,116,2,60,253,195,0,0,0,0,0,0,
            51,46,148,13,104,115,91,17,89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,
            27,45,254,17,88,30,240,27,145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,
            169,18,88,18,57,34,184,18,216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,
            67,108,65,109,65,206,65,47,83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,
            28,101,128,126,150,125,241,112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,
            41,248,40,11,41,128,34,71,41,13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,
            1,72,1,87,1,139,1,180,1,217,1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,
            3,101,3,105,3,106,3,85,84,207,170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,
            0,79,76,79,210,191,76,79,83,197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,
            30,79,211,12,72,82,164,22,65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,
            70,73,78,212,173,69,70,83,78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,
            166,82,82,79,210,167,82,204,212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,
            207,137,79,32,84,207,137,79,83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,
            208,242,78,75,69,89,164,222,0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,
            136,73,78,197,176,79,65,196,188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,
            82,71,197,189,79,196,243,73,68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,
            84,164,25,80,84,73,79,206,184,70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,
            212,199,79,73,78,212,220,69,206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,
            83,85,77,197,168,73,71,72,84,164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,
            144,87,65,208,164,65,86,197,190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,
            80,65,67,69,164,24,79,85,78,196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,
            168,206,207,204,65,206,13,0,83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,
            72,73,76,197,177,69,78,196,178,82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,
            190,230,189,231,188,232,0,121,121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,
            32,99,116,101,18,99,25,99,65,99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,
            116,32,70,79,82,0,83,121,110,116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,
            83,85,66,0,79,117,116,32,111,102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,
            108,0,79,118,101,114,102,108,111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,
            100,32,108,105,110,101,32,110,117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,
            103,101,0,68,117,112,108,105,99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,
            98,121,32,122,101,114,111,0,73,108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,
            99,104,0,79,117,116,32,111,102,32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,
            108,111,110,103,0,83,116,114,105,110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,
            97,110,39,116,32,99,111,110,116,105,110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,
            116,105,111,110,0,78,111,32,82,69,83,85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,
            85,110,112,114,105,110,116,97,98,108,101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,
            0,76,105,110,101,32,98,117,102,102,101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,
            117,116,0,68,101,118,105,99,101,32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,
            32,111,102,32,80,97,112,101,114,0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,
            105,116,104,111,117,116,32,87,72,73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,
            108,32,101,114,114,111,114,0,66,97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,
            111,117,110,100,0,66,97,100,32,102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,
            101,110,0,63,0,68,101,118,105,99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,
            120,105,115,116,115,0,63,0,63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,
            66,97,100,32,114,101,99,111,114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,
            105,114,101,99,116,32,115,116,97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,
            102,105,108,101,115,0,0,0,0,195,30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
            0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
            1,1,1,1,1,1,1,32,105,110,32,0,79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,
            241,60,130,116,1,195,138,15,67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,
            185,181,8,233,145,0,205,134,139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,
            178,57,185,178,54,185,178,53,185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,
            178,58,235,34,139,30,55,3,137,30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,
            178,13,50,192,162,54,5,162,95,0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,
            116,4,137,30,73,3,185,12,8,139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,
            138,199,34,195,254,192,116,10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,
            135,218,233,115,6,50,192,136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,
            138,208,46,138,7,67,10,192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,
            180,3,235,212,232,190,114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,
            232,241,34,176,89,205,138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,
            187,255,255,137,30,46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,
            132,40,90,115,14,50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,
            137,30,63,3,160,247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,
            147,38,117,3,233,118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,
            81,232,238,61,232,176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,
            89,81,115,3,232,214,24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,
            3,217,83,232,21,91,91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,
            73,138,193,10,197,117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,
            254,139,30,48,0,135,218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,
            232,253,4,232,249,4,235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,
            175,35,234,116,2,60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,
            30,48,0,139,203,138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,
            162,253,2,162,252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,
            187,183,0,50,192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,
            47,67,80,232,84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,
            218,80,138,7,67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,
            115,3,233,46,1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,235,11,144,186,101,11,232,8,0,117,
            38,176,141,89,233,173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,
            0,85,66,0,91,232,127,14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,
            46,172,36,127,117,3,233,171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,
            116,21,60,208,116,17,232,54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,
            0,89,90,12,128,80,176,255,232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,
            75,80,205,146,186,12,12,138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,
            147,158,137,142,205,141,0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,
            60,217,116,3,233,198,0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,
            3,233,137,0,160,253,2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,
            253,0,94,135,222,86,135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,
            251,2,60,2,117,26,139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,
            27,232,92,0,187,163,4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,
            242,46,172,36,127,117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,
            12,60,72,176,11,117,2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,
            23,233,155,250,205,147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,
            60,48,115,236,60,46,116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,
            233,159,254,75,138,7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,
            59,3,160,251,2,80,232,123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,
            117,30,3,217,82,75,138,55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,
            232,227,30,83,139,30,53,3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,
            193,249,156,232,14,9,157,83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,
            198,86,235,39,232,18,93,232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,
            244,92,232,147,85,232,18,109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,
            83,139,30,90,4,137,30,46,0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,
            181,130,81,235,66,233,203,248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,
            116,224,67,139,23,67,137,22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,
            19,205,150,232,155,29,137,38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,
            171,60,74,115,162,50,228,2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,
            192,254,200,195,10,192,116,251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,
            115,7,60,254,117,27,138,7,67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,
            254,2,75,138,63,235,225,232,55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,
            218,89,90,137,30,254,2,88,187,4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,
            13,114,19,139,30,2,3,117,10,67,67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,
            163,4,139,30,4,3,137,30,165,4,195,187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,
            65,138,200,138,232,232,5,255,60,234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,
            254,192,94,135,222,86,187,96,3,181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,
            232,179,14,121,155,178,5,233,122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,
            3,117,3,233,159,254,50,192,162,0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,
            218,3,219,3,218,3,219,88,158,44,48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,
            116,3,233,163,48,232,117,28,185,232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,
            196,80,134,196,81,235,4,81,232,123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,
            222,86,232,81,0,67,83,139,30,46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,
            217,195,178,8,233,163,246,205,152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,
            46,0,187,232,14,94,135,222,86,176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,
            116,186,67,60,34,116,233,254,192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,
            231,137,22,59,3,82,160,251,2,80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,
            163,4,60,5,114,3,186,159,4,83,60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,
            187,44,3,59,218,115,10,176,90,232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,
            24,253,232,236,27,137,232,95,254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,
            3,10,192,138,194,116,209,160,40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,
            201,138,197,117,3,233,185,252,232,26,254,60,44,117,167,235,238,160,79,3,10,192,117,8,51,192,163,77,3,233,102,245,254,192,
            162,40,0,128,63,131,116,18,232,247,253,117,12,11,210,116,16,232,115,254,50,192,162,79,3,195,232,151,252,117,250,235,7,50,
            192,162,79,3,254,192,161,71,3,163,46,0,139,30,75,3,117,229,128,63,0,117,3,131,195,4,67,233,23,25,232,112,12,117,218,10,192,
            117,3,233,164,253,233,32,245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,
            116,8,232,147,253,116,3,233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,
            245,232,44,4,138,7,60,44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,
            117,3,233,204,253,60,13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,
            117,238,235,209,232,106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,
            3,233,171,0,60,210,117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,
            18,198,7,32,139,30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,
            138,232,254,192,116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,
            114,3,232,153,24,91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,
            232,50,59,60,255,116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,
            80,60,210,116,1,74,138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,
            41,0,138,216,254,192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,
            111,27,138,7,117,3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,
            176,32,232,24,23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,
            137,30,233,4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,
            176,0,91,233,230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,
            232,122,34,232,68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,
            32,102,114,111,109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,
            156,160,58,3,10,192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,
            242,232,190,28,185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,
            235,4,232,111,24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,
            161,24,81,50,192,162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,
            181,0,254,197,232,76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,
            116,7,60,44,116,3,233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,
            233,31,255,83,232,13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,
            3,233,10,255,198,7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,
            138,7,60,44,116,10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,
            155,248,138,240,138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,
            192,117,1,195,138,193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,
            233,253,82,75,232,79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,
            218,116,3,233,53,23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,
            22,55,3,232,8,248,60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,
            178,1,50,192,162,168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,
            160,251,2,60,3,138,194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,
            81,138,198,205,158,60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,
            121,3,233,17,0,255,54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,
            255,182,0,44,230,114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,
            101,83,232,55,76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,
            187,3,27,83,232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,
            2,116,40,60,4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,
            3,233,124,239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,
            30,161,4,91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,
            31,255,227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,
            232,97,75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,
            76,232,51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,
            233,106,1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,
            0,60,213,117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,
            117,46,232,199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,
            11,219,117,3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,
            3,233,76,46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,
            126,2,232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,
            232,65,1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,
            232,229,255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,
            60,71,115,67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,
            36,60,56,114,3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,
            213,232,153,74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,
            81,232,134,244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,
            101,4,135,218,94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,
            213,25,82,176,1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,
            60,233,116,251,159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,
            137,30,163,4,89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,
            60,123,117,3,233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,
            218,247,211,195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,
            132,73,232,46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,
            80,60,3,117,3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,
            208,208,138,200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,
            208,116,233,60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,
            232,243,1,232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,
            232,185,17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,
            233,206,0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,
            218,94,135,222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,
            227,232,249,71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,
            88,10,192,116,78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,
            74,74,74,160,251,2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,
            232,223,0,185,197,28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,
            4,4,80,208,200,138,200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,
            30,122,3,139,30,228,3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,
            30,80,4,138,199,10,195,162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,
            163,4,59,218,114,6,232,124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,
            135,218,139,227,139,30,80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,
            91,195,139,242,172,136,7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,
            15,209,176,128,162,57,3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,
            233,175,55,60,162,117,3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,
            232,240,255,238,195,232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,
            0,10,192,117,11,135,218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,
            125,32,138,198,182,0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,
            194,2,192,138,208,176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,
            232,50,58,10,192,121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,
            194,162,42,0,195,232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,
            233,50,241,75,232,242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,
            239,116,14,232,168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,
            138,15,67,138,47,67,138,197,10,193,117,3,233,61,233,232,144,224,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,
            218,59,218,89,115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,
            24,0,187,247,1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,
            50,192,162,94,4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,
            60,34,117,10,160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,
            121,3,233,60,0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,
            65,254,206,117,1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,
            208,216,208,216,115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,
            73,139,241,172,60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,
            53,255,160,252,2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,
            3,232,229,255,138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,
            116,1,75,83,81,82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,
            138,7,58,197,117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,
            117,7,50,192,162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,
            235,6,46,138,7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,
            100,254,232,191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,
            233,96,66,60,12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,
            170,65,254,206,116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,
            3,232,82,67,138,7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,
            117,4,60,46,116,8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,
            2,233,174,253,232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,
            238,187,45,7,232,246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,
            137,30,88,3,195,232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,
            6,142,6,80,3,139,250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,
            60,144,117,237,232,171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,
            82,232,116,237,138,238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,
            11,210,117,3,233,74,237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,
            44,237,90,89,88,83,82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,
            218,90,116,12,138,7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,
            86,135,218,67,137,23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,
            117,1,195,67,139,23,67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,
            60,137,117,228,232,92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,
            73,158,176,13,114,63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,
            102,105,110,101,100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,
            35,83,139,30,254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,
            170,9,83,232,166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,
            7,44,48,115,3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,
            67,235,243,159,134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,
            3,233,143,9,82,67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,
            117,109,98,101,114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,
            135,218,139,30,46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,
            161,116,29,60,205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,
            143,117,7,81,232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,
            117,161,254,205,117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,
            30,90,4,137,30,46,0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,
            46,0,91,82,195,159,80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,
            81,80,232,214,2,88,138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,
            192,115,241,254,206,254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,
            74,232,47,0,232,137,2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,
            149,0,187,44,3,83,136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,
            239,60,34,117,3,232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,
            218,138,193,232,180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,
            138,7,117,155,186,16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,
            117,3,232,165,5,65,235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,
            218,114,15,137,30,47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,
            81,139,30,10,3,137,30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,
            30,78,4,139,30,90,3,137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,
            50,192,138,208,182,0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,
            218,3,218,137,30,75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,
            67,88,83,3,217,60,3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,
            39,81,50,192,10,7,159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,
            94,135,222,86,59,218,94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,
            138,31,183,0,3,217,138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,
            30,163,4,94,135,222,86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,
            253,90,232,72,0,94,135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,
            135,222,86,138,7,67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,
            30,163,4,135,218,232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,
            30,47,3,91,195,205,238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,
            138,240,138,7,10,192,195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,
            45,3,136,23,89,233,114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,
            232,236,241,116,5,232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,
            205,116,188,139,30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,
            3,138,197,186,177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,
            90,232,13,255,233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,
            230,81,232,181,1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,
            232,114,243,138,234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,
            232,190,63,89,91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,
            243,244,10,192,117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,
            236,232,163,3,41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,
            200,58,7,176,0,115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,
            82,94,135,222,86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,
            192,195,91,90,90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,
            83,82,135,218,67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,
            86,232,241,2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,
            94,135,222,86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,
            138,205,254,201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,
            1,195,139,242,172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,
            41,195,232,150,239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,
            83,232,37,4,116,3,233,221,23,91,88,134,196,158,81,159,80,235,18,50,192,162,79,3,233,147,229,25,254,200,232,99,35,176,8,235,
            56,60,9,117,16,176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,
            11,254,205,58,197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,
            188,3,116,61,232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,
            239,4,10,192,116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,
            116,248,235,11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,
            192,195,205,183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,239,50,83,232,175,32,116,33,232,176,255,
            10,192,117,16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,
            163,4,176,3,162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,
            115,1,195,139,30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,
            218,235,227,117,214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,
            205,175,137,30,59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,
            7,0,187,11,0,232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,
            47,3,50,192,232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,
            89,139,30,44,0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,
            137,30,124,3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,
            86,139,223,117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,
            139,217,90,114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,159,10,157,137,30,67,3,
            187,14,3,137,30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,
            245,253,157,187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,
            219,186,17,0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,
            30,90,3,94,135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,
            218,83,139,30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,
            3,232,115,8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,
            218,139,242,172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,
            88,134,196,158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,
            232,146,254,44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,
            223,116,3,233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,
            25,135,218,137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,
            3,235,186,139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,
            48,139,30,86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,
            232,94,0,50,192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,
            1,58,195,116,221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,
            30,86,0,232,9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,
            42,199,114,150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,
            200,117,3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,
            16,58,199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,
            58,195,115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,
            117,249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,
            172,138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,
            138,200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,
            203,3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,
            232,7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,
            255,232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,10,192,117,3,232,119,28,80,139,30,86,0,138,38,41,0,254,196,58,30,88,
            0,117,18,58,62,89,0,115,4,136,62,89,0,58,62,90,0,118,6,138,231,136,38,90,0,88,232,47,0,114,16,116,187,232,3,2,232,153,249,
            235,179,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,7,117,
            246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,32,0,80,
            138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,10,192,195,3,
            34,192,195,139,30,86,0,128,255,1,117,11,254,203,232,215,254,117,7,138,62,41,0,232,144,28,233,222,249,195,13,2,6,5,3,11,12,
            28,29,30,31,14,127,27,9,10,8,18,2,6,5,3,13,14,127,27,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,50,
            193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,205,
            117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,41,3,
            160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,66,138,
            193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,30,88,0,
            82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,1,254,
            195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,7,0,
            135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,235,
            247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,197,
            117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,160,
            114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,83,187,
            90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,230,1,
            88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,232,
            173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,86,
            91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,5,2,
            94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,41,
            0,138,248,160,80,0,138,200,81,232,34,26,89,10,192,116,12,58,193,116,8,254,199,232,42,26,50,192,195,254,207,116,244,235,229,
            232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,195,
            235,226,198,6,112,0,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,19,235,241,232,214,25,232,59,1,115,7,232,49,0,116,4,235,
            241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,114,7,232,23,
            0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,117,190,160,41,
            0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,22,0,139,250,
            170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,232,138,251,116,
            21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,116,25,254,199,232,
            196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,81,232,164,0,89,80,
            138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,114,47,116,34,139,
            30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,83,183,1,232,249,24,
            91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,114,18,60,65,114,243,
            60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,60,255,116,8,254,199,
            254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,34,195,254,192,135,218,
            116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,3,232,120,211,114,3,233,
            60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,188,232,187,247,1,232,169,
            232,232,95,251,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,160,209,60,10,116,3,233,
            107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,13,232,77,244,176,10,195,
            75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,232,201,247,115,3,233,
            63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,51,138,232,81,181,255,
            186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,116,228,138,197,60,39,
            114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,1,195,254,198,60,33,116,
            249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,251,2,232,18,215,160,57,
            3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,162,57,3,83,160,77,4,10,
            192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,36,50,192,162,74,4,139,
            30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,91,94,135,222,86,82,
            186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,2,197,254,192,138,200,
            81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,0,59,218,117,248,90,136,
            55,67,90,137,23,67,232,221,1,135,218,66,91,195,232,134,66,235,8,198,6,79,3,0,233,120,10,232,64,226,117,7,187,6,0,137,30,163,
            4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,135,218,4,2,208,216,138,200,232,
            195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,88,137,30,181,0,91,4,2,208,216,
            89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,92,4,10,192,116,8,11,210,117,3,
            233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,116,136,60,41,116,7,60,93,116,
            3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,139,30,90,3,233,175,44,160,
            250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,9,0,233,25,206,160,251,2,136,
            7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,245,242,67,67,137,30,49,3,136,
            15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,159,65,158,136,15,159,80,67,136,
            47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,242,232,220,242,137,30,92,3,75,
            198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,75,137,23,67,67,88,158,114,70,
            138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,42,3,218,88,254,200,139,203,
            117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,89,3,217,135,218,139,30,82,
            3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,172,138,232,254,197,139,242,
            172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,139,30,163,4,235,10,160,58,3,
            10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,237,117,3,233,95,213,67,139,31,235,36,138,213,83,177,
            2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,1,232,130,240,50,192,138,208,
            138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,205,117,3,233,46,1,60,43,176,
            8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,24,60,42,117,174,138,197,67,
            60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,254,194,177,0,254,205,116,97,
            138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,46,116,3,233,101,255,177,1,
            67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,195,58,7,117,251,67,58,7,117,
            246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,75,254,194,36,8,117,28,254,
            202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,116,101,81,82,232,2,219,
            90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,75,232,216,210,249,116,17,
            162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,182,0,138,208,139,31,3,218,
            138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,231,239,94,135,222,86,232,28,
            236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,254,205,232,69,0,91,157,116,208,
            81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,3,232,161,236,232,228,233,139,
            30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,177,238,235,244,80,138,198,10,
            192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,68,158,159,68,158,117,8,3,217,
            139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,0,117,103,139,227,137,30,69,
            3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,39,91,116,9,185,177,0,138,
            233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,0,58,193,117,7,185,18,0,
            3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,232,58,7,75,232,109,209,
            116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,242,172,60,32,117,9,66,
            136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,209,176,44,232,175,237,
            235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,83,138,242,232,135,1,116,
            9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,2,115,5,205,172,233,97,201,
            60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,123,115,2,44,32,81,138,232,
            139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,90,10,192,195,10,192,120,
            235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,200,75,89,66,68,255,83,67,
            82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,80,134,196,186,46,0,3,218,
            176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,138,216,183,0,3,218,46,138,
            23,67,46,138,55,135,218,90,94,135,222,86,195,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,216,83,232,140,233,
            138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,196,80,134,196,185,240,4,182,
            11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,88,134,196,158,159,134,196,80,
            134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,255,6,138,198,60,11,116,239,
            60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,246,235,186,138,7,67,254,202,
            195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,3,218,139,31,160,54,5,254,192,
            116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,7,10,192,249,195,75,232,53,207,
            60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,4,195,185,152,20,81,232,28,215,
            138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,1,60,73,116,21,178,2,60,79,116,
            15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,206,232,204,222,232,161,237,44,
            138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,138,7,60,130,178,4,117,89,232,
            165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,237,80,232,95,237,69,232,91,237,
            78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,237,85,232,60,237,84,178,2,235,
            17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,82,138,7,60,35,117,3,232,61,206,
            232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,94,135,222,86,138,194,159,134,
            196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,185,46,0,3,217,136,55,176,0,
            91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,83,176,2,115,3,233,113,253,205,
            224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,7,0,91,195,249,235,3,13,50,192,
            159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,106,236,82,88,158,249,159,80,159,
            80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,5,88,158,159,80,26,192,162,239,4,
            138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,253,205,234,75,232,70,205,178,128,
            249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,236,65,10,192,178,2,159,80,138,194,
            36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,4,138,7,91,36,128,117,3,233,20,221,
            83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,30,233,4,232,198,0,10,192,121,3,233,
            22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,2,0,235,231,232,160,0,60,252,117,3,
            233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,117,3,233,54,26,88,158,205,236,233,
            0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,4,232,171,0,50,192,232,241,252,198,
            7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,232,40,4,232,39,199,67,67,137,30,88,
            3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,135,218,139,30,47,3,135,218,59,218,
            114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,90,91,195,117,30,83,81,80,186,38,67,
            82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,138,7,60,35,117,3,232,218,203,232,
            214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,10,192,120,204,185,40,65,50,192,160,
            223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,239,50,192,162,54,5,232,149,233,139,
            30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,30,233,4,176,6,232,5,0,205,227,233,235,
            195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,202,0,88,134,196,158,94,135,222,86,91,
            233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,232,48,203,232,4,234,36,232,0,234,40,
            83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,11,232,9,203,232,205,251,91,50,192,
            138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,83,232,7,226,135,218,89,88,158,159,
            80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,233,51,226,88,158,139,30,46,0,137,
            30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,2,0,91,195,50,192,136,7,67,254,205,
            117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,194,176,10,115,3,233,18,250,205,230,
            233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,232,223,250,117,3,233,210,194,176,
            14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,178,66,233,242,194,60,35,117,173,
            232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,232,30,214,185,155,22,186,32,44,
            117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,138,240,138,208,80,81,83,232,165,
            254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,44,138,197,117,9,138,245,138,213,
            232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,91,60,10,117,36,138,200,138,194,
            60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,44,176,13,116,15,10,192,116,11,
            58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,232,32,254,114,32,60,32,116,247,
            60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,195,193,91,198,7,0,187,246,1,
            138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,3,232,196,35,88,158,114,3,232,
            196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,116,3,233,158,193,83,81,178,2,
            232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,125,193,254,200,162,96,0,83,
            81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,185,200,90,117,3,176,1,195,
            82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,135,218,3,217,137,30,4,7,135,
            218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,185,11,13,139,30,48,0,135,218,
            139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,42,197,46,50,7,80,187,118,97,
            138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,11,254,205,117,188,181,13,235,
            184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,139,242,
            172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,139,250,170,66,254,201,117,2,
            177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,80,160,100,4,10,192,116,3,233,
            245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,7,60,207,156,117,3,232,152,199,
            232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,5,116,3,187,0,0,159,3,217,209,
            222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,137,30,57,5,135,218,91,195,50,
            192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,49,199,232,140,255,83,232,20,3,
            187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,232,12,199,116,11,232,222,229,
            44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,55,5,138,195,42,193,138,216,
            138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,5,138,195,42,194,138,216,138,
            199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,55,5,94,135,222,86,137,30,55,
            5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,44,232,88,229,66,117,3,233,
            96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,255,115,3,232,175,255,67,
            83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,197,10,193,117,227,91,195,
            81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,82,135,218,232,218,255,91,
            137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,5,139,203,232,183,255,91,195,
            205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,187,241,73,115,3,187,5,74,94,
            135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,94,135,222,86,137,30,249,6,187,
            213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,65,233,32,2,138,198,10,192,208,
            216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,195,139,30,243,6,129,251,0,32,114,
            9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,114,9,129,235,176,31,137,30,243,
            6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,6,243,6,195,138,193,138,14,85,
            0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,138,7,138,22,245,6,34,194,138,
            14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,233,160,245,6,246,208,38,34,
            7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,2,211,226,3,211,177,4,211,
            226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,210,232,162,245,6,177,3,
            211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,160,72,0,199,6,59,5,100,
            0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,198,6,85,0,0,195,60,4,
            115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,248,195,160,85,0,10,192,
            116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,129,250,200,0,114,4,186,
            199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,139,30,243,6,38,138,47,160,
            245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,210,204,115,239,139,30,243,
            6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,6,129,226,7,0,209,233,227,
            171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,142,198,195,232,127,254,3,
            22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,91,195,83,232,39,25,91,
            195,246,128,62,113,0,0,116,3,233,249,4,195,160,41,0,138,208,232,255,210,233,237,4,0,0,0,180,15,205,16,162,72,0,180,40,60,
            2,114,13,180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,
            52,77,137,30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,
            143,2,0,38,199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,
            99,50,190,237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,
            84,104,101,32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,
            114,115,105,111,110,32,67,49,46,49,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,
            255,13,0,50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,
            34,76,80,84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,
            80,30,82,186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,
            160,106,0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,
            106,0,10,192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,
            19,187,52,78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,
            30,107,0,254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,
            137,30,107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,
            0,10,192,116,2,121,160,50,228,140,203,138,30,110,0,58,223,114,4,254,196,36,127,136,38,106,0,10,192,117,136,91,233,119,17,
            30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,
            116,9,70,254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,
            127,79,14,117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,
            44,2,116,4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,
            46,255,183,225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,
            62,73,0,138,30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,
            255,138,232,138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,
            254,193,181,0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,
            21,0,138,62,73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,
            2,205,16,90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,
            16,232,28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,
            117,32,138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,
            82,80,186,0,0,180,0,205,23,138,196,128,228,40,128,252,40,116,13,246,196,8,117,12,168,1,116,13,178,24,235,6,178,27,235,2,178,
            25,233,186,183,88,80,60,13,233,93,15,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,
            254,200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,
            114,2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,114,251,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,
            113,0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,
            232,251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,
            192,86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,
            0,138,62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,
            192,255,117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,
            91,86,177,6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,
            192,60,58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,
            185,1,0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,
            9,254,197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,
            77,205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,
            232,43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,
            10,50,210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,
            249,8,115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,
            128,117,29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,
            41,0,161,72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,
            0,232,110,0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,
            80,235,28,128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,
            128,62,41,0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,
            0,0,137,14,73,0,160,72,0,180,0,205,16,232,189,221,232,201,248,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,
            81,0,128,62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,
            138,221,128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,
            193,128,249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,
            81,232,117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,
            43,218,44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,
            128,229,7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,
            136,46,79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,
            4,60,25,115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,
            114,43,90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,
            10,232,81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,
            131,186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,
            22,86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,
            139,14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,
            255,255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,
            38,140,14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,
            38,143,6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,
            233,116,80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,
            138,62,73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,
            88,10,192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,
            42,201,89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,
            27,201,60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,
            86,114,86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,
            245,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,
            233,154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,
            0,254,192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,
            187,15,0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,
            185,4,0,88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,
            60,149,116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,
            168,1,116,14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,
            80,85,86,87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,
            0,160,69,0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,
            7,186,97,0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,
            63,0,88,160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,
            83,187,70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,
            200,152,138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,
            198,131,250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,
            220,52,247,241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,
            22,102,0,198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,
            89,16,89,16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,
            16,171,91,240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,
            67,136,47,67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,
            89,90,91,195,90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,
            4,138,135,47,0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,
            63,32,117,13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,
            4,116,9,10,192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,
            249,89,91,195,83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,
            203,244,91,131,195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,
            232,165,244,46,138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,
            0,0,136,14,82,5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,
            82,5,233,163,235,232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,
            139,30,233,4,136,143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,
            160,99,0,136,7,233,128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,117,3,233,228,4,60,32,115,1,195,254,
            7,83,232,141,254,91,254,192,116,244,254,200,56,7,233,197,4,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,
            226,251,117,2,178,1,162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,
            32,160,96,0,10,192,116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,
            46,254,246,196,1,117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,
            117,10,232,17,1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,
            83,5,185,17,0,83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,
            11,50,192,162,97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,
            117,13,139,30,233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,
            0,136,7,254,193,116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,
            7,1,195,232,61,253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,
            138,7,198,7,0,10,192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,
            252,58,15,116,3,10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,
            7,232,206,252,198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,
            8,136,14,81,5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,
            254,90,89,91,160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,
            190,83,5,139,140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,
            192,116,14,139,148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,
            88,3,233,128,229,80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,
            232,193,10,192,117,4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,
            50,193,162,167,4,138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,
            131,196,2,233,93,23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,
            203,128,195,198,6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,
            232,49,208,40,232,167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,
            255,54,94,4,203,139,30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,
            38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,
            30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,
            18,17,17,17,16,16,16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,
            3,3,3,3,2,2,2,1,1,1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,
            248,248,247,247,247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,
            239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,
            229,229,229,228,228,228,228,227,227,227,226,226,226,225,225,225,225,224,11,246,121,2,247,218,43,215,112,61,116,58,83,232,
            144,28,156,115,3,232,106,12,11,210,120,15,131,250,39,114,29,157,115,3,232,61,12,91,233,177,21,131,250,218,125,14,131,194,
            38,131,250,218,124,17,232,19,0,186,218,255,232,13,0,157,115,3,232,29,12,91,195,232,31,28,235,243,11,210,156,121,2,247,218,
            185,3,0,211,226,129,194,50,96,135,218,232,37,29,157,120,3,233,236,12,232,236,28,233,212,8,114,9,176,13,144,233,15,251,198,
            7,0,138,7,232,164,249,136,7,195,117,6,176,10,144,232,105,240,88,90,91,157,195,128,62,106,0,0,116,18,30,83,197,30,107,0,128,
            63,0,91,31,117,5,198,6,106,0,0,233,114,175,95,94,233,190,237,117,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,40,21,199,
            6,165,4,0,0,195,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,16,21,199,6,165,4,0,0,195,92,214,237,189,206,254,230,91,95,
            166,180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,
            71,172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,
            204,76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,
            145,0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,
            183,67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,
            201,27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,
            122,23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,
            97,81,89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,
            225,79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,
            195,86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,
            153,118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,
            176,77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,
            90,0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,
            128,150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,
            255,127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,
            117,126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,
            0,0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,
            48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,115,60,60,104,114,75,255,
            54,163,4,255,54,165,4,232,96,16,138,226,128,196,129,116,35,80,246,6,167,4,128,232,67,16,50,228,232,230,17,88,91,90,80,232,
            168,4,187,23,98,232,141,18,91,51,210,138,218,233,50,10,131,196,4,128,38,165,4,128,116,3,233,145,24,50,228,136,38,167,4,233,
            249,17,191,163,4,144,51,192,252,171,199,5,0,129,195,232,175,24,117,3,233,222,164,195,252,171,199,5,0,129,195,233,26,172,205,
            185,128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,
            5,135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,
            192,135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,
            218,112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,
            5,139,216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,
            198,6,251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,
            62,163,4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,
            83,232,25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,
            139,159,2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,
            163,195,135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,
            138,229,138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,
            195,139,193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,
            114,3,186,159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,
            54,200,139,241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,
            120,3,233,131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,
            2,137,30,163,4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,
            136,255,156,138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,
            192,205,202,162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,
            208,208,224,26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,
            3,22,120,250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,
            254,192,195,120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,232,211,249,144,144,144,121,6,
            199,6,165,4,255,255,11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,
            152,3,240,59,245,117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,
            10,192,116,16,152,145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,
            243,139,46,92,3,252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,
            233,58,44,117,229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,
            222,233,5,211,232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,
            116,226,161,165,4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,
            195,246,217,162,167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,57,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,
            4,190,170,4,185,4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,
            233,233,17,173,25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,
            233,244,12,233,141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,
            240,128,54,165,4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,
            134,223,137,30,166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,
            114,18,157,137,54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,233,5,3,144,138,243,50,219,128,233,
            8,246,196,31,116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,
            121,37,42,204,138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,
            254,195,117,26,235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,
            19,195,160,177,4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,
            4,187,164,4,248,232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,
            232,119,19,139,252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,
            249,115,16,185,4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,
            4,128,116,9,255,6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,
            233,122,18,232,87,244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,
            209,214,86,87,43,253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,
            233,165,11,209,210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,
            139,30,163,4,129,251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,
            80,232,36,2,235,20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,
            4,232,139,2,91,90,232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,
            50,192,233,9,0,205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,
            192,117,5,198,6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,
            189,163,97,51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,
            106,75,106,95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,
            175,81,83,87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,67,235,219,233,11,0,232,188,0,233,5,0,50,192,232,
            182,0,157,117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,233,118,244,198,6,85,4,255,232,137,164,139,212,233,227,8,
            10,255,117,5,232,232,16,249,195,160,166,4,10,192,117,8,138,195,246,208,232,228,16,249,195,232,228,255,93,114,20,235,16,83,
            139,31,232,217,255,91,93,114,8,83,87,191,165,4,144,85,195,254,192,44,1,195,246,196,255,138,226,116,3,128,204,32,138,214,233,
            237,252,16,159,128,62,251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,
            214,235,5,60,43,116,1,195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,
            50,246,3,208,235,223,12,1,83,87,117,7,232,28,0,235,5,144,144,232,70,0,95,91,51,246,139,214,232,189,243,67,195,232,88,16,120,
            249,233,111,156,116,49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,
            30,167,4,139,22,163,4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,
            14,0,176,8,162,251,2,51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,
            195,205,209,117,3,233,24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,
            232,138,251,232,203,6,232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,
            5,36,127,162,165,4,186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,
            2,247,219,137,30,163,4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,
            138,222,138,242,138,215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,
            30,177,4,232,218,240,255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,
            44,191,0,0,139,207,139,0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,
            4,71,71,235,219,139,193,83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,
            5,128,14,158,4,32,160,165,4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,
            233,221,7,232,115,14,116,4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,
            139,202,88,247,227,3,200,115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,
            6,166,4,117,3,233,144,7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,
            11,195,83,176,8,114,2,176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,
            89,235,38,4,7,88,121,15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,
            197,176,2,235,4,2,197,181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,
            63,46,116,1,67,157,88,116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,
            254,196,44,10,115,250,4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,
            7,48,254,197,117,248,67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,
            3,137,14,129,4,195,180,5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,
            7,67,137,54,163,4,254,204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,
            139,22,163,4,86,138,198,50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,
            48,117,3,67,226,248,195,232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,
            91,190,171,4,191,159,4,185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,
            176,9,232,46,255,80,176,47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,235,11,117,9,198,7,49,67,198,7,48,235,2,136,7,
            67,88,254,200,117,215,81,190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,
            11,137,30,165,4,137,22,163,4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,
            82,232,94,13,93,176,47,80,88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,
            7,67,88,254,200,117,206,66,66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,
            81,185,7,0,191,159,4,248,252,46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,12,95,152,
            43,248,87,139,208,232,50,239,235,232,187,102,96,232,136,12,232,45,13,115,6,232,230,11,95,79,87,232,176,11,114,31,187,122,
            96,232,142,12,232,88,252,88,44,9,80,187,246,127,232,109,12,232,87,13,118,7,232,185,11,88,254,192,80,88,89,91,10,192,195,88,
            89,91,10,192,195,187,180,4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,
            232,191,242,116,50,189,165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,
            117,112,117,112,121,112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,
            198,7,36,246,196,4,117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,
            117,245,195,187,180,4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,
            221,255,117,8,67,198,7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,
            120,252,232,129,10,121,3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,
            81,232,55,13,139,22,171,4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,
            233,47,10,191,190,37,87,191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,
            10,219,121,38,128,62,166,4,153,114,3,233,237,158,82,83,255,54,163,4,255,54,165,4,232,50,1,91,90,232,90,11,232,61,11,91,90,
            116,3,233,209,158,160,165,4,10,192,121,9,191,196,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,
            232,2,1,90,91,232,42,11,117,28,82,83,51,210,187,0,144,232,30,11,91,90,121,14,157,90,91,235,60,144,51,210,187,0,129,233,18,
            247,157,121,14,83,82,232,47,1,138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,
            176,125,87,83,82,232,21,1,90,91,232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,
            46,178,4,115,7,90,91,83,82,232,222,250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,
            232,130,10,235,214,90,91,195,138,14,166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,
            128,136,135,1,0,198,135,2,0,184,157,156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,
            1,195,81,83,248,232,122,9,91,89,226,246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,
            235,249,91,195,138,14,166,4,128,233,152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,
            152,128,203,128,157,156,121,6,131,234,1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,
            195,157,115,5,50,228,233,169,1,158,121,10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,
            8,126,81,186,0,0,187,0,129,232,190,9,117,9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,
            187,118,97,232,24,2,90,91,232,16,11,232,124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,
            244,187,49,128,186,24,114,233,157,249,233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,
            0,0,137,30,83,4,116,3,232,233,195,137,30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,
            131,195,4,246,135,255,255,128,120,65,185,2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,
            4,185,2,0,243,165,50,192,116,3,232,75,240,95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,
            235,39,131,195,4,139,15,67,67,94,139,20,246,6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,
            232,165,241,91,89,42,197,232,31,241,116,11,137,22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,
            44,117,9,232,85,246,232,66,255,233,147,147,233,168,154,81,83,86,87,82,178,57,187,158,4,191,165,4,190,166,4,235,25,83,185,
            4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,
            234,8,118,21,190,164,4,185,7,0,253,243,164,128,38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,
            6,138,62,166,4,185,4,0,10,219,120,33,117,17,128,239,8,114,23,138,222,138,242,138,212,50,228,226,235,116,11,248,208,212,209,
            210,208,211,254,207,117,222,233,161,6,136,62,166,4,233,131,4,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,
            45,0,187,10,4,235,12,83,232,2,0,91,195,232,31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,
            137,175,176,10,232,132,175,195,252,10,255,190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,
            0,235,9,131,198,4,191,163,4,185,2,0,46,165,226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,
            138,7,152,232,246,8,80,67,46,139,7,163,163,4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,
            232,131,247,91,83,46,139,23,46,139,159,2,0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,
            6,232,47,7,114,9,91,232,35,251,75,198,7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,
            197,42,6,130,4,121,5,246,216,232,194,250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,
            10,194,116,6,232,179,250,232,57,248,143,6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,
            240,2,194,138,200,120,4,50,192,138,200,121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,
            197,121,23,160,130,4,232,90,250,198,7,46,137,30,82,3,67,50,201,138,198,42,197,233,161,9,160,130,4,82,255,54,129,4,42,197,
            42,194,2,193,120,3,232,54,250,232,39,0,255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,
            1,2,194,254,200,120,3,232,15,250,233,91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,
            2,138,200,195,232,254,4,180,7,114,2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,
            156,10,210,116,2,254,202,2,242,157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,
            88,254,196,117,247,232,191,4,232,142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,
            85,6,235,14,187,110,96,138,196,152,3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,
            50,228,246,220,160,130,4,2,224,254,196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,
            130,4,232,94,247,88,10,228,126,5,138,196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,
            114,21,2,196,138,38,130,4,42,196,10,228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,
            196,64,180,3,117,2,50,228,163,131,4,137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,
            8,198,7,45,83,232,226,5,91,67,198,7,48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,
            3,136,47,67,198,7,0,187,179,4,67,139,62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,
            116,226,180,1,75,83,80,232,234,234,50,228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,
            235,3,75,136,7,88,10,228,116,248,131,196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,
            22,129,4,115,11,83,82,232,69,243,50,192,90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,
            254,200,120,6,232,20,248,198,7,0,143,6,129,4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,
            11,0,46,247,38,107,98,139,248,138,202,46,160,109,98,246,38,11,0,2,200,46,160,13,0,46,246,38,107,98,2,200,50,192,46,139,22,
            110,98,3,215,46,138,30,112,98,18,217,162,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,187,251,0,0,
            0,187,179,4,185,32,0,3,7,67,67,226,250,36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,
            4,233,143,251,83,81,187,158,4,129,7,128,0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,
            4,255,117,5,128,38,159,4,254,187,165,4,138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,144,144,144,233,136,251,
            128,228,224,128,196,128,115,28,156,66,117,18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,144,233,106,251,157,117,3,
            128,226,254,86,190,163,4,137,20,70,70,138,62,167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,
            9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,
            4,232,53,4,187,134,4,232,93,4,232,253,1,232,178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,
            4,89,117,4,254,193,235,204,139,233,232,117,4,139,205,195,128,38,165,4,127,232,134,0,232,165,0,198,6,178,4,127,232,163,236,
            232,132,0,235,27,101,237,161,165,4,128,252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,91,0,160,166,4,
            10,192,116,5,128,6,166,4,2,232,97,0,161,177,4,128,252,130,156,246,196,1,117,2,168,64,156,232,73,0,157,116,9,187,50,96,232,
            55,2,232,72,236,128,46,166,4,2,115,3,232,0,1,232,3,241,160,166,4,60,116,115,11,186,219,15,187,73,131,232,142,242,235,6,187,
            52,98,232,198,250,157,117,5,128,54,165,4,128,195,187,99,98,232,0,2,232,8,241,232,199,241,232,6,0,232,8,236,233,25,3,232,173,
            3,232,164,247,232,0,2,232,195,3,195,187,50,96,233,222,1,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,
            4,255,54,165,4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,
            12,191,57,123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,
            4,186,215,179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,
            54,165,4,232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,
            232,87,176,60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,
            4,163,165,4,195,232,120,231,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,
            4,10,192,116,7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,
            97,232,206,0,232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,
            114,7,232,171,0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,
            209,23,67,67,226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,
            187,170,4,138,39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,
            116,15,81,248,232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,
            226,247,195,191,124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,
            191,159,4,235,229,191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,
            89,195,81,83,87,187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,
            233,137,0,232,215,237,83,87,138,195,50,6,165,4,120,60,10,219,120,16,161,165,4,43,195,114,63,117,55,161,163,4,43,194,235,16,
            139,195,43,6,165,4,114,46,117,38,139,194,43,6,163,4,114,36,117,28,50,192,235,74,192,235,71,232,163,237,144,144,139,7,50,6,
            165,4,121,19,138,38,165,4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,
            247,253,167,117,6,226,251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,232,86,237,144,
            144,138,5,50,7,121,2,235,179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,
            195,46,43,150,0,0,46,26,158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,
            8,205,210,128,54,165,4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,
            232,51,0,191,151,4,185,8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,
            185,4,0,232,165,253,114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,
            185,2,0,191,163,4,135,251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,
            253,114,3,233,29,255,233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,
            4,0,235,17,232,57,253,191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,
            114,3,233,180,243,233,27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,
            46,172,136,7,67,66,254,205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,
            224,139,216,75,137,30,44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,
            101,4,162,40,0,187,14,3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,
            30,224,4,160,223,4,254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,
            116,14,135,218,3,217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,
            0,3,218,137,30,228,4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,
            115,3,233,104,173,177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,
            137,30,10,3,135,218,137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,
            229,187,220,127,232,127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,20,232,165,240,51,201,82,255,
            54,129,4,233,104,246,253,255,3,191,201,27,14,182,0,0] 
            
        • bios
          • 5150
            • 1981-04-24.json
              [53,55,48,48,48,53,49,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,216,224,237,225,185,0,64,252,139,217,184,255,255,186,85,
              170,43,255,243,170,79,253,139,247,139,203,172,50,196,117,37,228,98,36,192,176,0,117,29,128,252,0,116,3,138,194,170,226,233,
              128,252,0,116,14,138,224,134,242,252,71,116,216,79,186,1,0,235,208,195,250,180,213,158,115,78,117,76,123,74,121,72,159,177,
              5,210,236,115,65,176,64,208,224,113,59,50,228,158,114,54,116,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,
              255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,115,227,
              11,199,116,1,244,176,0,230,160,230,131,176,153,230,99,176,252,230,97,42,192,186,216,3,238,254,192,186,184,3,238,184,0,240,
              142,208,187,0,224,188,22,224,233,51,1,117,213,176,4,230,8,176,84,230,67,43,201,138,217,138,193,230,65,176,64,230,67,228,65,
              10,216,128,251,255,116,4,226,241,235,180,138,195,43,201,230,65,176,64,230,67,228,65,34,216,116,4,226,244,235,160,176,84,230,
              67,176,18,230,65,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,238,184,1,1,236,138,224,236,59,216,116,3,233,122,255,
              66,226,237,246,208,116,223,176,255,230,1,230,1,176,88,230,11,176,0,230,8,230,10,176,65,230,11,176,66,230,11,176,67,230,11,
              184,64,0,142,216,139,30,114,0,43,192,142,192,142,216,43,255,228,96,36,12,4,4,177,12,211,224,139,200,138,224,252,170,226,253,
              228,98,36,15,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,204,117,239,176,19,230,32,176,
              8,230,33,176,9,230,33,43,192,142,192,190,64,0,142,222,137,30,114,0,129,62,114,0,52,18,116,56,142,216,188,240,63,142,208,139,
              248,187,36,0,199,7,182,226,67,67,140,15,232,183,4,128,251,101,117,14,178,255,232,186,4,138,195,170,254,202,117,246,205,62,
              14,23,250,188,24,224,233,45,254,116,3,233,189,254,184,48,0,142,208,188,0,1,38,199,6,8,0,195,226,38,199,6,10,0,0,240,233,42,
              0,185,0,32,50,192,46,2,7,67,226,250,10,192,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,80,65,82,73,84,89,32,67,72,69,67,
              75,32,49,43,192,142,192,38,199,6,20,0,84,255,38,199,6,22,0,0,240,250,176,0,230,33,228,33,10,192,117,43,176,255,230,33,228,
              33,4,1,117,33,252,185,8,0,191,32,0,184,182,226,171,184,0,240,171,131,195,4,226,243,50,228,251,43,201,226,254,226,254,10,228,
              116,8,186,1,1,232,173,3,250,244,180,0,50,237,176,254,230,33,176,16,230,67,177,22,138,193,230,64,246,196,255,117,4,226,249,
              235,221,177,18,176,255,230,64,180,0,176,254,230,33,246,196,255,117,204,226,249,233,54,0,180,1,80,176,255,230,33,176,32,230,
              32,88,207,80,228,98,168,64,116,8,190,25,226,185,14,0,235,10,168,128,116,16,190,39,226,185,14,0,184,0,0,205,16,232,230,3,250,
              244,88,207,32,50,48,49,252,191,64,0,14,31,190,19,255,185,32,0,243,165,176,255,230,33,176,54,230,67,176,0,230,64,230,64,184,
              64,0,142,216,232,120,3,128,251,170,116,38,176,60,230,97,144,144,228,96,36,255,117,22,254,6,18,0,38,199,6,32,0,178,230,38,
              199,6,34,0,0,240,176,254,230,33,176,204,230,97,178,4,187,0,96,232,200,254,117,7,254,202,117,247,235,7,144,186,1,1,232,222,
              2,228,96,180,0,163,16,0,36,48,117,3,233,152,0,134,224,128,252,48,116,9,254,192,128,252,32,117,2,176,3,80,42,228,205,16,88,
              80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,11,187,0,184,186,216,3,185,0,64,254,200,238,142,195,184,64,0,142,216,
              129,62,114,0,52,18,116,13,142,219,232,118,252,116,6,186,2,1,232,129,2,88,80,180,0,205,16,184,32,112,43,255,185,40,0,252,243,
              171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,19,43,201,236,34,196,116,4,226,249,
              235,8,177,3,210,236,117,228,235,6,186,2,1,232,61,2,88,180,0,205,16,184,64,0,142,216,138,38,16,0,128,228,12,176,4,246,228,
              4,16,139,208,139,216,228,98,36,15,180,32,246,228,163,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,62,114,0,52,18,116,77,
              187,0,4,185,16,0,59,209,118,70,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,210,251,90,91,89,116,230,140,218,138,232,
              138,198,177,4,210,232,232,62,0,138,198,36,15,232,55,0,138,197,177,4,210,232,232,46,0,138,197,36,15,232,39,0,190,232,226,185,
              4,0,232,80,2,233,74,0,184,64,0,142,216,139,22,21,0,11,210,116,240,185,0,0,129,251,0,16,119,231,187,0,16,235,155,30,14,31,
              187,183,228,215,180,14,183,0,205,16,31,195,32,51,48,49,49,51,49,54,48,49,188,3,120,3,120,2,48,49,50,51,52,53,54,55,56,57,
              65,66,67,68,69,70,184,64,0,142,216,128,62,18,0,1,116,57,232,178,1,227,43,176,77,230,97,128,251,170,117,34,176,204,230,97,
              176,76,230,97,43,201,226,254,228,96,60,0,116,25,138,232,177,4,210,232,232,156,255,138,197,36,15,232,149,255,190,167,228,185,
              4,0,232,190,1,43,192,142,192,185,48,0,14,31,190,243,254,191,32,0,252,243,165,184,64,0,142,216,176,77,230,97,176,255,230,33,
              176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,62,20,232,59,20,227,12,129,251,64,5,115,6,129,251,
              16,4,115,9,190,171,228,185,3,0,232,110,1,176,252,230,33,160,16,0,168,1,117,3,233,185,0,176,188,230,33,180,0,205,19,246,196,
              255,117,32,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,243,8,114,7,181,34,232,236,8,115,9,190,
              174,228,185,3,0,232,42,1,176,12,186,242,3,238,199,6,26,0,30,0,199,6,28,0,30,0,189,177,228,190,0,0,46,139,86,0,176,170,238,
              42,192,236,60,170,117,6,137,148,8,0,70,70,69,69,129,253,183,228,117,228,187,0,0,186,250,3,236,168,248,117,8,199,135,0,0,248,
              3,67,67,186,250,2,236,168,248,117,8,199,135,0,0,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,168,15,117,
              5,128,14,17,0,16,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,16,0,233,207,0,128,62,18,0,1,117,3,233,46,250,233,118,255,
              156,250,30,184,64,0,142,216,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,232,
              179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,138,
              224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230,
              97,176,253,230,33,251,180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,81,80,228,97,36,191,230,
              97,43,201,226,254,12,64,230,97,176,32,230,32,88,89,207,184,64,0,142,216,128,62,18,0,1,117,5,182,1,233,85,255,46,138,4,70,
              183,0,180,14,205,16,226,244,184,13,14,205,16,184,10,14,205,16,195,251,184,64,0,142,216,161,16,0,168,1,116,35,185,4,0,81,180,
              0,205,19,114,20,180,2,187,0,0,142,195,187,0,124,186,0,0,185,1,0,176,1,205,19,89,115,4,226,224,205,24,234,0,124,0,0,23,4,0,
              3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,139,242,209,230,186,64,0,142,218,139,148,0,0,11,210,116,22,10,228,116,
              24,254,204,116,78,254,204,117,3,233,137,0,254,204,117,3,233,185,0,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,
              208,194,208,194,208,194,208,194,129,226,14,0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,
              196,36,31,238,131,234,2,176,0,238,235,121,80,131,194,4,176,3,238,51,201,131,194,2,236,168,32,117,8,226,249,88,128,204,80,
              235,167,43,201,236,168,16,117,8,226,249,88,128,204,128,235,152,74,43,201,236,168,32,117,8,226,249,88,128,204,128,235,136,
              131,234,5,89,138,193,238,233,126,255,128,38,113,0,127,131,194,4,176,1,238,131,194,2,43,201,236,168,32,117,7,226,249,180,128,
              233,98,255,74,236,168,1,117,9,246,6,113,0,128,116,244,235,236,36,30,138,224,139,148,0,0,236,233,71,255,139,148,0,0,131,194,
              5,236,138,224,66,236,233,56,255,251,30,83,187,64,0,142,219,10,228,116,11,254,204,116,32,254,204,116,45,91,31,207,251,144,
              250,139,30,26,0,59,30,28,0,116,243,139,7,232,30,0,137,30,26,0,91,31,207,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,
              0,160,23,0,91,31,207,131,195,2,129,251,62,0,117,3,187,30,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,
              255,255,30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,
              28,26,24,3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,
              255,117,255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,
              115,100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,
              38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,
              86,66,78,77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,
              53,54,43,49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,251,80,83,81,82,86,87,30,6,252,184,64,0,142,216,228,96,
              80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,117,2,36,127,14,7,191,130,232,185,8,0,242,174,
              138,196,116,3,233,136,0,129,239,131,232,46,138,165,138,232,168,128,117,84,128,252,16,115,7,8,38,23,0,233,131,0,246,6,23,0,
              4,117,104,60,82,117,37,246,6,23,0,8,116,3,235,91,144,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,216,1,246,6,23,
              0,3,116,243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,185,1,128,252,16,115,26,246,212,32,38,23,0,
              60,184,117,44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,163,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,
              60,69,116,5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,143,0,246,6,23,0,4,116,49,
              60,83,117,45,199,6,114,0,52,18,233,209,245,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,
              36,37,38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,37,1,191,138,234,185,10,0,242,174,117,18,129,239,139,234,160,25,0,180,
              10,246,228,3,199,162,25,0,235,139,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,248,0,60,2,114,12,60,14,115,8,128,196,118,
              176,0,233,232,0,60,59,115,3,233,99,255,60,71,115,249,187,99,233,233,37,1,246,6,23,0,4,116,91,60,70,117,24,187,30,0,137,30,
              26,0,137,30,28,0,198,6,113,0,128,205,27,184,0,0,233,180,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,
              216,3,160,101,0,238,246,6,24,0,8,117,249,233,22,255,60,55,117,6,184,0,114,233,133,0,187,146,232,60,59,115,3,235,120,144,187,
              204,232,233,195,0,60,71,115,45,246,6,23,0,3,116,91,60,15,117,6,184,0,15,235,97,144,60,55,117,9,176,32,230,32,205,5,233,218,
              254,60,59,114,6,187,89,233,233,151,0,187,31,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,
              44,71,187,122,233,235,119,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,109,233,235,11,60,59,114,4,176,
              0,235,7,187,229,232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,
              60,90,119,17,4,32,235,13,233,92,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,96,252,59,30,26,0,116,9,137,4,
              137,30,28,0,233,58,254,232,13,0,233,52,254,44,59,46,215,138,224,176,0,235,168,80,83,81,187,192,0,228,97,80,36,252,230,97,
              185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,235,88,230,97,89,91,88,195,251,83,81,30,86,87,85,82,139,236,190,64,0,
              142,222,232,28,0,187,4,0,232,255,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,
              127,10,228,116,39,254,204,116,116,198,6,65,0,0,128,250,4,115,19,254,204,116,106,254,204,117,3,233,150,0,254,204,116,104,254,
              204,116,104,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,
              254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,40,2,160,66,0,60,192,116,7,128,14,65,0,32,235,17,180,3,232,71,
              1,187,1,0,232,109,1,187,3,0,232,103,1,195,160,65,0,195,176,70,232,185,1,180,102,235,54,176,66,235,245,128,14,63,0,128,176,
              74,232,167,1,180,77,235,36,187,7,0,232,65,1,187,9,0,232,59,1,187,15,0,232,53,1,187,17,0,233,171,0,128,14,63,0,128,176,74,
              232,129,1,180,69,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,
              0,240,8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,224,0,10,228,116,8,
              43,201,226,254,254,204,235,246,251,89,232,224,0,88,138,252,182,0,114,75,190,243,237,144,86,232,148,0,138,102,1,208,228,208,
              228,128,228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,
              0,232,147,0,187,9,0,232,141,0,187,11,0,232,135,0,187,13,0,232,129,0,94,232,64,1,114,69,232,115,1,114,63,252,190,66,0,172,
              36,192,116,59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,
              4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,119,1,195,232,46,1,195,232,111,1,50,228,195,82,81,186,
              244,3,51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,
              186,245,3,238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,196,195,176,1,81,138,202,210,192,89,132,6,62,
              0,117,19,8,6,62,0,180,7,232,172,255,138,226,232,167,255,232,114,0,114,41,180,15,232,157,255,138,226,232,152,255,138,229,232,
              147,255,232,94,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,230,12,230,11,140,
              192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232,
              80,187,6,0,232,117,255,138,204,88,211,224,72,80,230,5,138,196,230,5,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8,
              232,40,255,232,76,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128,
              117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,184,64,0,142,216,128,14,62,
              0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249,
              91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202,
              235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,176,254,138,196,254,192,42,193,195,207,2,37,2,8,42,255,80,
              246,25,4,251,30,82,86,81,83,190,64,0,142,222,139,242,209,230,139,148,8,0,11,210,116,12,10,228,116,14,254,204,116,66,254,204,
              116,42,91,89,94,90,31,207,80,179,10,51,201,238,66,236,138,224,168,128,117,14,226,247,254,203,117,243,128,204,1,128,228,249,
              235,20,176,13,66,238,176,12,238,88,80,139,148,8,0,66,236,138,224,128,228,248,90,138,194,128,244,72,235,194,80,131,194,2,176,
              8,238,184,232,3,72,117,253,176,12,238,235,219,252,240,207,241,240,241,26,242,169,247,48,242,156,242,65,243,125,243,195,243,
              246,243,84,242,56,244,39,244,34,247,122,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88,
              233,71,1,184,64,0,142,216,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,3,184,0,176,142,192,88,138,38,73,0,46,255,164,
              69,240,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,6,7,0,
              0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,186,212,
              3,179,0,131,255,48,117,7,176,7,186,180,3,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,192,142,
              216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,238,66,
              254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,12,128,252,7,116,4,51,192,235,
              6,185,0,8,184,32,7,243,171,199,6,96,0,103,0,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,101,
              0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,66,
              176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,138,
              196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,148,80,0,56,62,98,0,117,
              5,139,194,232,2,0,235,190,232,127,0,139,200,3,14,78,0,209,249,180,14,232,193,255,195,138,223,50,255,209,227,139,151,80,0,
              139,14,96,0,95,94,91,88,88,31,7,207,162,98,0,139,14,76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,147,255,91,209,
              227,139,135,80,0,232,184,255,233,115,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102,
              0,233,87,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,63,255,83,139,216,138,196,
              246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,243,1,83,139,193,232,57,0,116,51,3,240,
              138,230,42,227,232,117,0,3,245,3,253,254,204,117,245,88,176,32,232,112,0,3,253,254,203,117,247,184,64,0,142,216,128,62,73,
              0,7,116,7,160,101,0,186,216,3,238,233,225,254,138,222,235,218,128,62,73,0,2,114,25,128,62,73,0,3,119,18,82,186,218,3,80,236,
              168,8,116,251,176,37,186,216,3,238,88,90,232,126,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,
              237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128,
              252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,147,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204,
              117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,87,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,169,2,
              232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,32,254,138,207,50,237,139,241,
              209,230,139,132,80,0,51,219,227,6,3,30,76,0,226,250,232,203,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,177,1,138,227,
              80,81,232,208,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233,
              209,253,128,252,4,114,8,128,252,7,116,3,233,126,1,80,81,232,159,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,
              250,236,168,1,116,251,138,195,170,71,226,232,233,160,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,143,253,80,
              80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,112,253,50,193,235,245,83,
              80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,
              1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,106,
              2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195,
              180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129,
              239,176,31,254,203,117,245,233,212,252,138,222,235,236,253,138,216,139,194,232,16,2,139,248,43,209,129,194,1,1,208,230,208,
              230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247,
              43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245,
              252,233,116,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,
              202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,133,1,139,248,88,60,128,115,6,190,110,250,14,235,15,
              44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,
              246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,244,251,38,50,5,170,172,38,50,
              133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,
              37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,
              199,80,254,206,117,193,94,95,131,199,2,226,182,233,148,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26,
              182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0,
              32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243,
              166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,
              131,196,8,233,16,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,186,0,0,185,1,0,
              139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192,
              178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224,
              209,224,42,255,3,195,91,195,80,80,180,3,205,16,88,60,8,116,89,60,13,116,94,60,10,116,94,60,7,116,97,138,62,98,0,180,10,185,
              1,0,205,16,254,194,58,22,74,0,117,54,178,0,128,254,24,117,45,180,2,183,0,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,
              8,205,16,138,252,184,1,6,185,0,0,182,24,138,22,74,0,254,202,205,16,88,233,71,250,254,198,180,2,235,244,128,250,0,116,247,
              254,202,235,243,178,0,235,239,128,254,24,117,232,235,185,179,2,232,199,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,
              194,6,236,168,4,117,120,168,2,116,126,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229,
              138,30,73,0,42,255,46,138,159,161,247,43,195,43,6,78,0,121,3,184,0,0,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178,
              40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18,
              246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,31,
              7,207,251,30,184,64,0,142,216,161,19,0,31,207,251,30,184,64,0,142,216,161,16,0,31,207,251,30,80,184,64,0,142,216,128,38,113,
              0,127,88,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,39,1,180,128,249,195,228,97,36,
              247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,194,1,228,98,36,16,162,107,0,186,122,63,246,6,113,0,128,116,
              3,233,138,0,74,117,3,233,132,0,232,198,0,227,235,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,232,173,
              0,11,201,89,116,197,59,211,227,4,115,191,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,255,255,
              186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,0,15,29,
              117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,3,117,19,232,31,0,235,14,78,116,3,233,98,255,94,89,91,43,210,180,4,
              80,228,33,36,254,230,33,232,66,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,216,129,251,
              240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,107,0,228,98,
              36,16,58,196,225,248,162,107,0,176,0,230,67,228,64,138,224,228,64,134,196,139,30,103,0,43,216,163,103,0,195,83,81,228,97,
              36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,91,176,22,232,
              68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,35,0,88,232,31,
              0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,122,254,43,192,195,81,80,138,232,
              177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,116,250,228,98,
              36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,0,195,232,35,254,
              179,66,185,0,7,226,254,254,203,117,247,195,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,
              108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,8,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,
              60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,
              120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,
              248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,
              0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,
              24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,
              0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,
              192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,
              24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,
              24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,
              120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,
              204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,
              0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,
              102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,
              120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,
              0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,
              108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,
              112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,
              238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,
              96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,
              118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,
              240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,
              224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,
              204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,
              48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,
              204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,
              0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,80,184,64,0,142,216,88,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,
              198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,0,0,235,218,251,30,80,82,184,64,0,
              142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,0,117,17,199,6,110,0,0,0,199,6,108,0,0,0,198,
              6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,32,90,88,31,207,165,254,0,240,135,233,
              0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,239,0,240,0,0,0,0,101,240,0,240,77,248,0,240,65,248,0,240,89,236,0,240,57,231,0,
              240,89,248,0,240,46,232,0,240,210,239,0,240,0,0,0,246,242,230,0,240,110,254,0,240,83,255,0,240,83,255,0,240,164,240,0,240,
              199,239,0,240,0,0,0,0,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25,
              232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37,
              117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90,
              180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,255,255,255,255,255,255,
              255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234,91,224,0,240,48,52,47,50,52,47,56,49,255,255,235] 
              
            • 1981-10-19.json
              [53,55,48,48,54,55,49,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,216,224,237,225,185,0,64,252,139,217,184,255,255,186,85,
              170,43,255,243,170,79,253,139,247,139,203,172,50,196,117,37,228,98,36,192,176,0,117,29,128,252,0,116,3,138,194,170,226,233,
              128,252,0,116,14,138,224,134,242,252,71,116,216,79,186,1,0,235,208,195,250,180,213,158,115,78,117,76,123,74,121,72,159,177,
              5,210,236,115,65,176,64,208,224,113,59,50,228,158,114,54,116,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,
              255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,115,227,
              11,199,116,1,244,176,0,230,160,230,131,176,153,230,99,176,252,230,97,42,192,186,216,3,238,254,192,186,184,3,238,184,0,240,
              142,208,187,0,224,188,22,224,233,51,1,117,213,176,4,230,8,176,84,230,67,43,201,138,217,138,193,230,65,176,64,230,67,128,251,
              255,116,8,228,65,10,216,226,241,235,180,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,6,226,242,235,158,144,
              144,176,18,230,65,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,238,184,1,1,236,138,224,236,59,216,116,3,233,122,255,
              66,226,237,246,208,116,223,176,255,230,1,230,1,176,88,230,11,176,0,230,8,230,10,176,65,230,11,176,66,230,11,176,67,230,11,
              184,64,0,142,216,139,30,114,0,43,192,142,192,142,216,43,255,228,96,36,12,4,4,177,12,211,224,139,200,138,224,252,170,226,253,
              228,98,36,15,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,204,117,239,176,19,230,32,176,
              8,230,33,176,9,230,33,43,192,142,192,190,64,0,142,222,137,30,114,0,129,62,114,0,52,18,116,56,142,216,188,240,63,142,208,139,
              248,187,36,0,199,7,182,226,67,67,140,15,232,183,4,128,251,101,117,14,178,255,232,186,4,138,195,170,254,202,117,246,205,62,
              14,23,250,188,24,224,233,45,254,116,3,233,189,254,184,48,0,142,208,188,0,1,38,199,6,8,0,195,226,38,199,6,10,0,0,240,233,42,
              0,185,0,32,50,192,46,2,7,67,226,250,10,192,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,80,65,82,73,84,89,32,67,72,69,67,
              75,32,49,43,192,142,192,38,199,6,20,0,84,255,38,199,6,22,0,0,240,250,176,0,230,33,228,33,10,192,117,43,176,255,230,33,228,
              33,4,1,117,33,252,185,8,0,191,32,0,184,182,226,171,184,0,240,171,131,195,4,226,243,50,228,251,43,201,226,254,226,254,10,228,
              116,8,186,1,1,232,173,3,250,244,180,0,50,237,176,254,230,33,176,16,230,67,177,22,138,193,230,64,246,196,255,117,4,226,249,
              235,221,177,18,176,255,230,64,180,0,176,254,230,33,246,196,255,117,204,226,249,233,54,0,180,1,80,176,255,230,33,176,32,230,
              32,88,207,80,228,98,168,64,116,8,190,25,226,185,14,0,235,10,168,128,116,16,190,39,226,185,14,0,184,0,0,205,16,232,230,3,250,
              244,88,207,32,50,48,49,252,191,64,0,14,31,190,19,255,185,32,0,176,255,230,33,176,54,230,67,176,0,230,64,243,165,230,64,184,
              64,0,142,216,232,120,3,128,251,170,116,38,176,60,230,97,144,144,228,96,36,255,117,22,254,6,18,0,38,199,6,32,0,178,230,38,
              199,6,34,0,0,240,176,254,230,33,176,204,230,97,178,4,187,0,96,232,200,254,117,7,254,202,117,247,235,7,144,186,1,1,232,222,
              2,228,96,180,0,163,16,0,36,48,117,3,233,152,0,134,224,128,252,48,116,9,254,192,128,252,32,117,2,176,3,80,42,228,205,16,88,
              80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,11,187,0,184,186,216,3,185,0,64,254,200,238,142,195,184,64,0,142,216,
              129,62,114,0,52,18,116,13,142,219,232,118,252,116,6,186,2,1,232,129,2,88,80,180,0,205,16,184,32,112,43,255,185,40,0,252,243,
              171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,19,43,201,236,34,196,116,4,226,249,
              235,8,177,3,210,236,117,228,235,6,186,2,1,232,61,2,88,180,0,205,16,184,64,0,142,216,138,38,16,0,128,228,12,176,4,246,228,
              4,16,139,208,139,216,228,98,36,15,180,32,246,228,163,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,62,114,0,52,18,116,77,
              187,0,4,185,16,0,59,209,118,70,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,210,251,90,91,89,116,230,140,218,138,232,
              138,198,177,4,210,232,232,62,0,138,198,36,15,232,55,0,138,197,177,4,210,232,232,46,0,138,197,36,15,232,39,0,190,232,226,185,
              4,0,232,80,2,233,74,0,184,64,0,142,216,139,22,21,0,11,210,116,240,185,0,0,129,251,0,16,119,231,187,0,16,235,155,30,14,31,
              187,183,228,215,180,14,183,0,205,16,31,195,32,51,48,49,49,51,49,54,48,49,188,3,120,3,120,2,48,49,50,51,52,53,54,55,56,57,
              65,66,67,68,69,70,184,64,0,142,216,128,62,18,0,1,116,57,232,178,1,227,43,176,77,230,97,128,251,170,117,34,176,204,230,97,
              176,76,230,97,43,201,226,254,228,96,60,0,116,25,138,232,177,4,210,232,232,156,255,138,197,36,15,232,149,255,190,167,228,185,
              4,0,232,190,1,43,192,142,192,185,48,0,14,31,190,243,254,191,32,0,252,243,165,184,64,0,142,216,176,77,230,97,176,255,230,33,
              176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,62,20,232,59,20,227,12,129,251,64,5,115,6,129,251,
              16,4,115,9,190,171,228,185,3,0,232,110,1,176,252,230,33,160,16,0,168,1,117,3,233,185,0,176,188,230,33,180,0,205,19,246,196,
              255,117,32,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,243,8,114,7,181,34,232,236,8,115,9,190,
              174,228,185,3,0,232,42,1,176,12,186,242,3,238,199,6,26,0,30,0,199,6,28,0,30,0,189,177,228,190,0,0,46,139,86,0,176,170,238,
              42,192,236,60,170,117,6,137,148,8,0,70,70,69,69,129,253,183,228,117,228,187,0,0,186,250,3,236,168,248,117,8,199,135,0,0,248,
              3,67,67,186,250,2,236,168,248,117,8,199,135,0,0,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,168,15,117,
              5,128,14,17,0,16,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,16,0,233,207,0,128,62,18,0,1,117,3,233,46,250,233,118,255,
              156,250,30,184,64,0,142,216,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,232,
              179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,138,
              224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230,
              97,176,253,230,33,251,180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,81,80,228,97,36,191,230,
              97,43,201,226,254,12,64,230,97,176,32,230,32,88,89,207,184,64,0,142,216,128,62,18,0,1,117,5,182,1,233,85,255,46,138,4,70,
              183,0,180,14,205,16,226,244,184,13,14,205,16,184,10,14,205,16,195,251,184,64,0,142,216,161,16,0,168,1,116,35,185,4,0,81,180,
              0,205,19,114,20,180,2,187,0,0,142,195,187,0,124,186,0,0,185,1,0,176,1,205,19,89,115,4,226,224,205,24,234,0,124,0,0,23,4,0,
              3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,139,242,209,230,186,64,0,142,218,139,148,0,0,11,210,116,22,10,228,116,
              24,254,204,116,78,254,204,117,3,233,137,0,254,204,117,3,233,185,0,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,
              208,194,208,194,208,194,208,194,129,226,14,0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,
              196,36,31,238,131,234,2,176,0,238,235,121,80,131,194,4,176,3,238,51,201,131,194,2,236,168,32,117,8,226,249,88,128,204,128,
              235,167,43,201,236,168,16,117,8,226,249,88,128,204,128,235,152,74,43,201,236,168,32,117,8,226,249,88,128,204,128,235,136,
              131,234,5,89,138,193,238,233,126,255,128,38,113,0,127,131,194,4,176,1,238,131,194,2,43,201,236,168,32,117,7,226,249,180,128,
              233,98,255,74,236,168,1,117,9,246,6,113,0,128,116,244,235,236,36,30,138,224,139,148,0,0,236,233,71,255,139,148,0,0,131,194,
              5,236,138,224,66,236,233,56,255,251,30,83,187,64,0,142,219,10,228,116,11,254,204,116,32,254,204,116,45,91,31,207,251,144,
              250,139,30,26,0,59,30,28,0,116,243,139,7,232,30,0,137,30,26,0,91,31,207,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,
              0,160,23,0,91,31,207,131,195,2,129,251,62,0,117,3,187,30,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,
              255,255,30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,
              28,26,24,3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,
              255,117,255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,
              115,100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,
              38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,
              86,66,78,77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,
              53,54,43,49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,251,80,83,81,82,86,87,30,6,252,184,64,0,142,216,228,96,
              80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,117,2,36,127,14,7,191,130,232,185,8,0,242,174,
              138,196,116,3,233,136,0,129,239,131,232,46,138,165,138,232,168,128,117,84,128,252,16,115,7,8,38,23,0,233,131,0,246,6,23,0,
              4,117,104,60,82,117,37,246,6,23,0,8,116,3,235,91,144,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,216,1,246,6,23,
              0,3,116,243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,185,1,128,252,16,115,26,246,212,32,38,23,0,
              60,184,117,44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,163,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,
              60,69,116,5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,143,0,246,6,23,0,4,116,49,
              60,83,117,45,199,6,114,0,52,18,233,209,245,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,
              36,37,38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,37,1,191,138,234,185,10,0,242,174,117,18,129,239,139,234,160,25,0,180,
              10,246,228,3,199,162,25,0,235,139,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,248,0,60,2,114,12,60,14,115,8,128,196,118,
              176,0,233,232,0,60,59,115,3,233,99,255,60,71,115,249,187,99,233,233,37,1,246,6,23,0,4,116,91,60,70,117,24,187,30,0,137,30,
              26,0,137,30,28,0,198,6,113,0,128,205,27,184,0,0,233,180,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,
              216,3,160,101,0,238,246,6,24,0,8,117,249,233,22,255,60,55,117,6,184,0,114,233,133,0,187,146,232,60,59,115,3,235,120,144,187,
              204,232,233,195,0,60,71,115,45,246,6,23,0,3,116,91,60,15,117,6,184,0,15,235,97,144,60,55,117,9,176,32,230,32,205,5,233,218,
              254,60,59,114,6,187,89,233,233,151,0,187,31,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,
              44,71,187,122,233,235,119,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,109,233,235,11,60,59,114,4,176,
              0,235,7,187,229,232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,
              60,90,119,17,4,32,235,13,233,92,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,96,252,59,30,26,0,116,9,137,4,
              137,30,28,0,233,58,254,232,13,0,233,52,254,44,59,46,215,138,224,176,0,235,168,80,83,81,187,192,0,228,97,80,36,252,230,97,
              185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,235,88,230,97,89,91,88,195,251,83,81,30,86,87,85,82,139,236,190,64,0,
              142,222,232,28,0,187,4,0,232,255,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,
              127,10,228,116,39,254,204,116,116,198,6,65,0,0,128,250,4,115,19,254,204,116,106,254,204,117,3,233,150,0,254,204,116,104,254,
              204,116,104,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,
              254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,40,2,160,66,0,60,192,116,7,128,14,65,0,32,235,17,180,3,232,71,
              1,187,1,0,232,109,1,187,3,0,232,103,1,195,160,65,0,195,176,70,232,185,1,180,102,235,54,176,66,235,245,128,14,63,0,128,176,
              74,232,167,1,180,77,235,36,187,7,0,232,65,1,187,9,0,232,59,1,187,15,0,232,53,1,187,17,0,233,171,0,128,14,63,0,128,176,74,
              232,129,1,180,69,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,
              0,240,8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,224,0,10,228,116,8,
              43,201,226,254,254,204,235,246,251,89,232,224,0,88,138,252,182,0,114,75,190,243,237,144,86,232,148,0,138,102,1,208,228,208,
              228,128,228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,
              0,232,147,0,187,9,0,232,141,0,187,11,0,232,135,0,187,13,0,232,129,0,94,232,64,1,114,69,232,115,1,114,63,252,190,66,0,172,
              36,192,116,59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,
              4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,119,1,195,232,46,1,195,232,111,1,50,228,195,82,81,186,
              244,3,51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,
              186,245,3,238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,196,195,176,1,81,138,202,210,192,89,132,6,62,
              0,117,19,8,6,62,0,180,7,232,172,255,138,226,232,167,255,232,114,0,114,41,180,15,232,157,255,138,226,232,152,255,138,229,232,
              147,255,232,94,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,230,12,230,11,140,
              192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232,
              80,187,6,0,232,117,255,138,204,88,211,224,72,80,230,5,138,196,230,5,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8,
              232,40,255,232,76,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128,
              117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,184,64,0,142,216,128,14,62,
              0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249,
              91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202,
              235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,176,254,138,196,254,192,42,193,195,207,2,37,2,8,42,255,80,
              246,25,4,251,30,82,86,81,83,190,64,0,142,222,139,242,209,230,139,148,8,0,11,210,116,12,10,228,116,14,254,204,116,66,254,204,
              116,42,91,89,94,90,31,207,80,179,20,51,201,238,66,236,138,224,168,128,117,14,226,247,254,203,117,243,128,204,1,128,228,249,
              235,20,176,13,66,238,176,12,238,88,80,139,148,8,0,66,236,138,224,128,228,248,90,138,194,128,244,72,235,194,80,131,194,2,176,
              8,238,184,232,3,72,117,253,176,12,238,235,219,252,240,207,241,240,241,26,242,169,247,48,242,156,242,65,243,125,243,195,243,
              246,243,84,242,56,244,39,244,34,247,122,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88,
              233,71,1,184,64,0,142,216,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,3,184,0,176,142,192,88,138,38,73,0,46,255,164,
              69,240,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,6,7,0,
              0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,186,212,
              3,179,0,131,255,48,117,7,176,7,186,180,3,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,192,142,
              216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,238,66,
              254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,12,128,252,7,116,4,51,192,235,
              6,185,0,8,184,32,7,243,171,199,6,96,0,103,0,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,101,
              0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,66,
              176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,138,
              196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,148,80,0,56,62,98,0,117,
              5,139,194,232,2,0,235,190,232,127,0,139,200,3,14,78,0,209,249,180,14,232,193,255,195,138,223,50,255,209,227,139,151,80,0,
              139,14,96,0,95,94,91,88,88,31,7,207,162,98,0,139,14,76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,147,255,91,209,
              227,139,135,80,0,232,184,255,233,115,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102,
              0,233,87,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,63,255,83,139,216,138,196,
              246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,243,1,83,139,193,232,57,0,116,51,3,240,
              138,230,42,227,232,117,0,3,245,3,253,254,204,117,245,88,176,32,232,112,0,3,253,254,203,117,247,184,64,0,142,216,128,62,73,
              0,7,116,7,160,101,0,186,216,3,238,233,225,254,138,222,235,218,128,62,73,0,2,114,25,128,62,73,0,3,119,18,82,186,218,3,80,236,
              168,8,116,251,176,37,186,216,3,238,88,90,232,126,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,
              237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128,
              252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,147,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204,
              117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,87,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,169,2,
              232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,32,254,138,207,50,237,139,241,
              209,230,139,132,80,0,51,219,227,6,3,30,76,0,226,250,232,203,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,177,1,138,227,
              80,81,232,208,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233,
              209,253,128,252,4,114,8,128,252,7,116,3,233,126,1,80,81,232,159,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,
              250,236,168,1,116,251,138,195,170,71,226,232,233,160,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,143,253,80,
              80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,112,253,50,193,235,245,83,
              80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,
              1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,106,
              2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195,
              180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129,
              239,176,31,254,203,117,245,233,212,252,138,222,235,236,253,138,216,139,194,232,16,2,139,248,43,209,129,194,1,1,208,230,208,
              230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247,
              43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245,
              252,233,116,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,
              202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,133,1,139,248,88,60,128,115,6,190,110,250,14,235,15,
              44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,
              246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,244,251,38,50,5,170,172,38,50,
              133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,
              37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,
              199,80,254,206,117,193,94,95,131,199,2,226,182,233,148,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26,
              182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0,
              32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243,
              166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,
              131,196,8,233,16,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,186,0,0,185,1,0,
              139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192,
              178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224,
              209,224,42,255,3,195,91,195,80,80,180,3,205,16,88,60,8,116,89,60,13,116,94,60,10,116,94,60,7,116,97,138,62,98,0,180,10,185,
              1,0,205,16,254,194,58,22,74,0,117,54,178,0,128,254,24,117,45,180,2,183,0,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,
              8,205,16,138,252,184,1,6,185,0,0,182,24,138,22,74,0,254,202,205,16,88,233,71,250,254,198,180,2,235,244,128,250,0,116,247,
              254,202,235,243,178,0,235,239,128,254,24,117,232,235,185,179,2,232,199,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,
              194,6,236,168,4,117,120,168,2,116,126,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229,
              138,30,73,0,42,255,46,138,159,161,247,43,195,43,6,78,0,121,3,184,0,0,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178,
              40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18,
              246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,31,
              7,207,251,30,184,64,0,142,216,161,19,0,31,207,251,30,184,64,0,142,216,161,16,0,31,207,251,30,80,184,64,0,142,216,128,38,113,
              0,127,88,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,39,1,180,128,249,195,228,97,36,
              247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,194,1,228,98,36,16,162,107,0,186,122,63,246,6,113,0,128,116,
              3,233,138,0,74,117,3,233,132,0,232,198,0,227,235,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,232,173,
              0,11,201,89,116,197,59,211,227,4,115,191,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,255,255,
              186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,0,15,29,
              117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,3,117,19,232,31,0,235,14,78,116,3,233,98,255,94,89,91,43,210,180,4,
              80,228,33,36,254,230,33,232,66,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,216,129,251,
              240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,107,0,228,98,
              36,16,58,196,225,248,162,107,0,176,0,230,67,139,30,103,0,228,64,138,224,228,64,134,196,43,216,163,103,0,195,83,81,228,97,
              36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,91,176,22,232,
              68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,35,0,88,232,31,
              0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,122,254,43,192,195,81,80,138,232,
              177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,116,250,228,98,
              36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,0,195,232,35,254,
              179,66,185,0,7,226,254,254,203,117,247,195,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,
              108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,
              60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,
              120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,
              248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,
              0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,
              24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,
              0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,
              192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,
              24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,
              24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,
              120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,
              204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,
              0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,
              102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,
              120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,
              0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,
              108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,
              112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,
              238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,
              96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,
              118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,
              240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,
              224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,
              204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,
              48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,
              204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,
              0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,80,184,64,0,142,216,88,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,
              198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,0,0,235,218,251,30,80,82,184,64,0,
              142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,0,117,17,199,6,110,0,0,0,199,6,108,0,0,0,198,
              6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,32,90,88,31,207,165,254,0,240,135,233,
              0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,239,0,240,0,0,0,0,101,240,0,240,77,248,0,240,65,248,0,240,89,236,0,240,57,231,0,
              240,89,248,0,240,46,232,0,240,210,239,0,240,0,0,0,246,242,230,0,240,110,254,0,240,83,255,0,240,83,255,0,240,164,240,0,240,
              199,239,0,240,0,0,0,0,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25,
              232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37,
              117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90,
              180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,255,255,255,255,255,255,
              255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234,91,224,0,240,49,48,47,49,57,47,56,49,255,255,155] 
              
            • 1982-10-27.json
              [49,53,48,49,52,55,54,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,209,224,185,0,64,252,139,217,184,170,170,186,85,255,43,
              255,243,170,79,253,139,247,139,203,172,50,196,117,37,138,194,170,226,246,34,228,116,22,138,224,134,242,34,228,117,4,138,212,
              235,224,252,71,116,222,79,186,1,0,235,214,228,98,36,192,176,0,252,195,255,250,180,213,158,115,76,117,74,123,72,121,70,159,
              177,5,210,236,115,63,176,64,208,224,113,57,50,228,158,118,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,255,
              255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,235,227,11,
              199,116,1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,153,230,99,176,252,230,97,140,200,142,208,142,216,183,
              224,188,22,224,233,123,11,117,218,176,4,230,8,176,84,230,67,138,193,230,65,176,64,230,67,128,251,255,116,7,228,65,10,216,
              226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,3,226,242,244,176,18,230,65,230,13,176,255,138,
              216,138,248,185,8,0,43,210,238,80,238,184,1,1,236,138,224,236,59,216,116,1,244,66,226,238,254,192,116,225,142,219,142,195,
              176,255,230,1,80,230,1,178,11,176,88,238,176,0,230,8,80,230,10,177,3,176,65,238,254,192,226,251,186,19,2,176,1,238,139,46,
              114,4,129,253,52,18,116,10,188,65,240,144,233,182,254,116,1,244,43,255,228,96,36,12,4,4,177,12,211,224,139,200,252,170,226,
              253,137,46,114,4,176,248,230,97,228,98,36,1,177,12,211,192,176,252,230,97,228,98,36,15,10,196,138,216,180,32,246,228,163,
              21,4,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,203,117,239,176,19,230,32,176,8,230,33,
              176,9,230,33,43,192,142,192,184,48,0,142,208,188,0,1,129,253,52,18,116,37,43,255,142,223,187,36,0,199,7,71,255,67,67,140,
              15,232,95,4,128,251,101,117,14,178,255,232,98,4,138,195,170,254,202,117,246,205,62,185,32,0,43,255,184,71,255,171,140,200,
              171,226,247,199,6,8,0,195,226,199,6,20,0,84,255,199,6,98,0,0,246,186,33,0,176,0,238,236,10,192,117,21,176,255,238,236,4,1,
              117,13,50,228,251,43,201,226,254,226,254,10,228,116,8,186,1,1,232,146,3,250,244,176,254,238,176,16,230,67,185,22,0,138,193,
              230,64,246,196,255,117,4,226,249,235,225,177,18,176,255,230,64,184,254,0,238,246,196,255,117,210,226,249,30,191,64,0,14,31,
              190,3,255,144,185,16,0,176,255,238,176,54,230,67,176,0,230,64,165,71,71,226,251,230,64,31,232,185,3,128,251,170,116,30,176,
              60,230,97,144,144,228,96,36,255,117,14,254,6,18,4,199,6,32,0,109,230,176,254,230,33,176,204,230,97,228,96,180,0,163,16,4,
              36,48,117,41,199,6,64,0,83,255,233,162,0,255,255,80,228,98,168,192,116,21,190,218,255,144,168,64,117,4,190,35,255,144,43,
              192,205,16,232,221,3,250,244,88,207,60,48,116,8,254,196,60,32,117,2,180,3,134,224,80,42,228,205,16,88,80,187,0,176,186,184,
              3,185,0,16,176,1,128,252,48,116,8,183,184,178,216,181,64,254,200,238,129,253,52,18,142,195,116,7,142,219,232,255,252,117,
              50,88,80,180,0,205,16,184,32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,2,178,218,180,8,43,201,236,34,196,
              117,4,226,249,235,9,43,201,236,34,196,116,10,226,249,186,2,1,232,121,2,235,6,177,3,210,236,117,222,88,180,0,205,16,186,0,
              192,142,218,43,219,139,7,83,91,61,85,170,117,5,232,14,3,235,4,129,194,128,0,129,250,0,200,124,228,186,16,2,184,85,85,238,
              176,1,236,58,196,117,52,247,208,238,176,1,236,58,196,117,42,139,216,186,20,2,46,136,7,238,144,236,58,199,117,20,66,236,58,
              196,117,14,66,236,58,196,117,8,247,208,60,170,116,9,235,221,190,237,254,144,232,246,2,232,119,27,160,16,0,36,12,180,4,246,
              228,4,16,139,208,139,216,161,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,253,52,18,30,116,79,187,0,4,185,16,0,59,209,
              118,45,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,17,252,90,91,89,116,230,140,218,138,232,138,198,232,16,2,138,197,
              232,11,2,190,103,250,144,232,153,2,235,24,31,30,139,22,21,0,11,210,116,14,185,0,0,129,251,0,16,119,5,187,0,16,235,183,31,
              128,62,18,0,1,116,42,232,253,1,227,30,176,77,230,97,128,251,170,117,21,176,204,230,97,176,76,230,97,43,201,226,254,228,96,
              60,0,116,10,232,191,1,190,51,255,144,232,77,2,43,192,142,192,185,8,0,30,14,31,190,243,254,144,191,32,0,165,71,71,226,251,
              31,30,176,77,230,97,176,255,230,33,176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,213,20,232,210,
              20,227,12,129,251,64,5,115,6,129,251,16,4,115,7,190,57,255,144,232,254,1,186,0,200,142,218,43,219,139,7,61,85,170,117,5,232,
              183,1,235,4,129,194,128,0,129,250,0,246,124,230,235,1,144,43,219,142,218,232,105,7,116,3,232,33,3,128,198,2,128,254,254,117,
              236,31,160,16,0,168,1,117,10,128,62,18,0,1,117,61,233,89,251,228,33,36,191,230,33,180,0,138,212,205,19,114,33,186,242,3,82,
              176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,85,9,114,7,181,34,232,78,9,115,7,190,234,255,144,232,130,1,
              176,12,90,238,190,30,0,137,54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,228,33,36,252,230,33,189,61,230,144,43,
              246,46,139,86,0,176,170,238,82,236,90,60,170,117,5,137,84,8,70,70,69,69,129,253,67,230,117,229,43,219,186,250,3,236,168,248,
              117,6,199,7,248,3,67,67,182,2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,178,1,236,168,15,
              117,5,128,14,17,0,16,30,7,191,120,0,184,20,20,171,171,184,1,1,171,171,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,2,0,
              205,25,156,250,30,232,105,25,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,
              232,179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,
              138,224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,80,177,4,210,232,232,3,0,88,36,15,4,144,39,20,64,39,
              180,14,183,0,205,16,195,188,3,120,3,120,2,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230,97,176,253,230,33,251,
              180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,80,228,97,138,224,246,208,36,64,128,228,191,
              10,196,230,97,176,32,230,32,88,207,184,64,0,142,192,42,228,138,71,2,177,9,211,224,139,200,81,177,4,211,232,3,208,89,232,176,
              5,116,5,232,101,1,235,19,82,38,199,6,0,1,3,0,38,140,30,2,1,38,255,30,0,1,90,195,232,129,24,128,62,18,0,1,117,5,182,1,233,
              6,255,46,138,4,70,80,232,101,255,88,60,10,117,243,195,32,82,79,77,13,10,80,176,32,230,32,88,207,234,0,124,0,0,255,255,255,
              255,255,255,255,255,255,251,43,192,142,216,199,6,120,0,199,239,140,14,122,0,161,16,4,168,1,116,30,185,4,0,81,180,0,205,19,
              114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,192,226,229,205,24,255,23,4,0,3,128,1,192,0,96,0,48,0,24,0,
              12,0,251,30,82,86,87,81,83,139,242,139,250,209,230,232,245,23,139,20,11,210,116,19,10,228,116,22,254,204,116,69,254,204,116,
              106,254,204,117,3,233,131,0,91,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,177,4,210,194,129,226,14,0,191,41,
              231,3,250,139,20,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,196,36,31,238,74,74,176,0,238,235,73,80,131,194,4,176,3,
              238,66,66,183,48,232,72,0,116,8,89,138,193,128,204,128,235,174,74,183,32,232,56,0,117,240,131,234,5,89,138,193,238,235,157,
              131,194,4,176,1,238,66,66,183,32,232,32,0,117,219,74,183,1,232,24,0,117,211,128,228,30,139,20,236,233,125,255,139,20,131,
              194,5,236,138,224,66,236,233,112,255,138,93,124,43,201,236,138,224,34,199,58,199,116,8,226,245,254,203,117,239,10,255,195,
              82,80,140,218,129,250,0,200,126,19,138,198,232,13,254,138,194,232,8,254,190,215,230,232,151,254,88,90,195,186,2,1,232,163,
              253,235,245,251,30,83,232,10,23,10,228,116,10,254,204,116,30,254,204,116,43,235,44,251,144,250,139,30,26,0,59,30,28,0,116,
              243,139,7,232,29,0,137,30,26,0,235,20,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,0,160,23,0,91,31,207,67,67,59,30,130,
              0,117,4,139,30,128,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,30,255,255,255,255,31,255,127,
              255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,3,22,2,14,13,255,255,255,255,
              255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,255,117,255,118,255,255,27,49,50,51,
              52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,100,102,103,104,106,107,108,59,
              39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,38,42,40,41,95,43,8,0,81,87,69,82,
              84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,77,60,62,63,255,0,255,32,
              255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,53,54,43,49,50,51,48,46,71,72,73,
              255,75,255,77,255,79,80,81,82,83,255,255,255,255,251,80,83,81,82,86,87,30,6,252,232,170,21,228,96,80,228,97,138,224,12,128,
              230,97,134,224,230,97,88,138,224,60,255,117,3,233,122,2,36,127,14,7,191,126,232,185,8,0,242,174,138,196,116,3,233,133,0,129,
              239,127,232,46,138,165,134,232,168,128,117,81,128,252,16,115,7,8,38,23,0,233,128,0,246,6,23,0,4,117,101,60,82,117,34,246,
              6,23,0,8,117,90,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,214,1,246,6,23,0,3,116,243,132,38,24,0,117,77,8,38,
              24,0,48,38,23,0,60,82,117,65,184,0,82,233,183,1,128,252,16,115,26,246,212,32,38,23,0,60,184,117,44,160,25,0,180,0,136,38,
              25,0,60,0,116,31,233,161,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,60,69,116,5,128,38,24,0,247,250,176,
              32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,145,0,246,6,23,0,4,116,51,60,83,117,47,199,6,114,0,52,18,234,
              91,224,0,240,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50,
              60,57,117,5,176,32,233,33,1,191,135,234,185,10,0,242,174,117,18,129,239,136,234,160,25,0,180,10,246,228,3,199,162,25,0,235,
              137,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,244,0,60,2,114,12,60,14,115,8,128,196,118,176,0,233,228,0,60,59,115,3,233,
              97,255,60,71,115,249,187,95,233,233,27,1,246,6,23,0,4,116,88,60,70,117,24,139,30,128,0,137,30,26,0,137,30,28,0,198,6,113,
              0,128,205,27,43,192,233,176,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216,3,160,101,0,238,246,6,
              24,0,8,117,249,233,20,255,60,55,117,6,184,0,114,233,129,0,187,142,232,60,59,114,118,187,200,232,233,188,0,60,71,115,44,246,
              6,23,0,3,116,90,60,15,117,5,184,0,15,235,96,60,55,117,9,176,32,230,32,205,5,233,220,254,60,59,114,6,187,85,233,233,145,0,
              187,27,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,44,71,187,118,233,235,113,184,45,74,
              235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,105,233,235,11,60,59,114,4,176,0,235,7,187,225,232,254,200,46,215,
              60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,60,90,119,17,4,32,235,13,233,94,254,
              60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,99,252,59,30,26,0,116,19,137,4,137,30,28,0,233,60,254,44,59,46,215,
              138,224,176,0,235,174,176,32,230,32,187,128,0,228,97,80,36,252,230,97,185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,
              235,88,230,97,233,18,254,185,0,32,50,192,2,7,67,226,251,10,192,195,251,83,81,30,86,87,85,82,139,236,232,216,18,232,28,0,187,
              4,0,232,253,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,127,10,228,116,39,254,
              204,116,115,198,6,65,0,0,128,250,4,115,19,254,204,116,105,254,204,117,3,233,149,0,254,204,116,103,254,204,116,103,198,6,65,
              0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,254,192,12,8,238,198,
              6,62,0,0,198,6,65,0,0,12,4,238,251,232,42,2,160,66,0,60,192,116,6,128,14,65,0,32,195,180,3,232,71,1,187,1,0,232,108,1,187,
              3,0,232,102,1,195,160,65,0,195,176,70,232,184,1,180,230,235,54,176,66,235,245,128,14,63,0,128,176,74,232,166,1,180,77,235,
              36,187,7,0,232,64,1,187,9,0,232,58,1,187,15,0,232,52,1,187,17,0,233,171,0,128,14,63,0,128,176,74,232,128,1,180,197,115,8,
              198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,0,240,8,6,63,0,251,176,
              16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,223,0,10,228,116,8,43,201,226,254,254,204,
              235,246,251,89,232,223,0,88,138,252,182,0,114,75,190,240,237,144,86,232,148,0,138,102,1,208,228,208,228,128,228,4,10,226,
              232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,0,232,146,0,187,9,0,232,
              140,0,187,11,0,232,134,0,187,13,0,232,128,0,94,232,67,1,114,69,232,116,1,114,63,252,190,66,0,172,36,192,116,59,60,64,117,
              41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,208,224,180,3,
              114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,120,1,195,232,47,1,195,232,112,1,50,228,195,82,81,186,244,3,51,201,236,168,
              64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,178,245,238,89,90,195,
              30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,197,195,176,1,81,138,202,210,192,89,132,6,62,0,117,19,8,6,62,0,180,7,
              232,173,255,138,226,232,168,255,232,118,0,114,41,180,15,232,158,255,138,226,232,153,255,138,229,232,148,255,232,98,0,156,
              187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,250,230,12,80,88,230,11,140,192,177,4,
              211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232,80,187,6,0,
              232,114,255,138,204,88,211,224,72,80,230,5,138,196,230,5,251,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8,232,37,
              255,232,74,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128,117,12,
              226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,232,225,15,128,14,62,0,128,176,32,
              230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249,91,90,89,195,
              236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202,235,227,91,90,
              89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,174,254,138,196,254,192,42,193,195,255,255,207,2,37,2,8,42,255,80,246,
              25,4,251,30,82,86,81,83,232,99,15,139,242,138,92,120,209,230,139,84,8,11,210,116,12,10,228,116,14,254,204,116,63,254,204,
              116,40,91,89,94,90,31,207,80,238,66,43,201,236,138,224,168,128,117,14,226,247,254,203,117,241,128,204,1,128,228,249,235,19,
              176,13,66,238,176,12,238,88,80,139,84,8,66,236,138,224,128,228,248,90,138,194,128,244,72,235,197,80,66,66,176,8,238,184,232,
              3,72,117,253,176,12,238,235,221,98,225,255,255,252,240,205,241,238,241,57,242,156,247,23,242,150,242,56,243,116,243,185,243,
              236,243,78,242,47,244,30,244,24,247,116,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88,
              233,69,1,232,187,14,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,2,180,176,142,192,88,138,38,73,0,46,255,164,69,240,
              255,255,255,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,
              6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,
              186,212,3,179,0,131,255,48,117,6,176,7,178,180,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,
              192,142,216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,
              238,66,254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,11,128,252,7,116,4,51,
              192,235,5,181,8,184,32,7,243,171,199,6,96,0,7,6,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,
              101,0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,
              66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,
              138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,84,80,56,62,98,0,
              117,5,139,194,232,2,0,235,191,232,124,0,139,200,3,14,78,0,209,249,180,14,232,194,255,195,162,98,0,139,14,76,0,152,80,247,
              225,163,78,0,139,200,209,249,180,12,232,170,255,91,209,227,139,71,80,232,207,255,235,140,138,223,50,255,209,227,139,87,80,
              139,14,96,0,95,94,91,88,88,31,7,207,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102,0,
              233,91,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,67,255,83,139,216,138,196,246,
              38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,240,1,83,139,193,232,55,0,116,49,3,240,138,
              230,42,227,232,114,0,3,245,3,253,254,204,117,245,88,176,32,232,109,0,3,253,254,203,117,247,232,113,12,128,62,73,0,7,116,7,
              160,101,0,186,216,3,238,233,231,254,138,222,235,220,128,62,73,0,2,114,24,128,62,73,0,3,119,17,82,186,218,3,80,236,168,8,116,
              251,176,37,178,216,238,88,90,232,129,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,237,138,195,
              246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128,252,4,114,
              8,128,252,7,116,3,233,166,1,83,139,194,232,148,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204,117,245,
              88,176,32,232,202,255,43,253,254,203,117,247,233,90,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,168,2,232,26,
              0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,39,254,138,207,50,237,139,241,209,230,
              139,68,80,51,219,227,6,3,30,76,0,226,250,232,207,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,178,1,138,227,80,81,232,
              209,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233,217,253,128,
              252,4,114,8,128,252,7,116,3,233,127,1,80,81,232,160,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,
              1,116,251,138,195,170,251,71,226,231,233,167,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,150,253,80,80,232,30,
              0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,119,253,50,193,235,245,83,80,176,40,
              82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,1,185,3,
              7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,105,2,139,
              248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195,180,
              80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129,239,
              176,31,254,203,117,245,233,219,252,138,222,235,236,253,138,216,139,194,232,15,2,139,248,43,209,129,194,1,1,208,230,208,230,
              128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247,43,
              240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245,252,
              233,123,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,202,
              87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,132,1,139,248,88,60,128,115,6,190,110,250,14,235,15,44,
              128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,246,
              195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,251,251,38,50,5,170,172,38,50,133,
              255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,37,
              38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,199,
              80,254,206,117,193,94,95,71,71,226,183,233,156,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26,182,4,138,
              4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0,32,232,129,
              0,129,238,176,31,254,206,117,238,191,110,250,144,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243,166,95,
              94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,131,196,
              8,233,23,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,43,210,185,1,0,139,216,35,
              217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192,178,0,133,
              193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224,209,224,
              42,255,3,195,91,195,80,80,180,3,138,62,98,0,205,16,88,60,8,116,82,60,13,116,87,60,10,116,87,60,7,116,90,180,10,185,1,0,205,
              16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,8,205,16,138,252,
              184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,88,233,82,250,254,198,180,2,235,244,128,250,0,116,247,254,202,235,243,178,
              0,235,239,128,254,24,117,232,235,188,179,2,232,113,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,194,6,236,168,4,117,
              126,168,2,117,3,233,129,0,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229,138,30,73,0,
              42,255,46,138,159,148,247,43,195,139,30,78,0,209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,
              178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,
              18,246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,
              31,7,207,255,255,255,255,255,255,255,251,30,232,248,6,161,19,0,31,207,255,255,251,30,232,236,6,161,16,0,31,207,255,255,251,
              30,232,224,6,128,38,113,0,127,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,36,1,180,128,
              249,195,228,97,36,247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,191,1,228,98,36,16,162,107,0,186,122,63,
              246,6,113,0,128,117,3,74,117,3,233,132,0,232,198,0,227,238,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,
              232,173,0,11,201,89,116,200,59,211,227,4,115,194,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,
              255,255,186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,
              0,15,29,117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,144,117,19,232,31,0,235,14,78,116,3,233,101,255,94,89,91,43,
              210,180,4,80,228,33,36,254,230,33,232,69,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,
              216,129,251,240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,
              107,0,228,98,36,16,58,196,225,248,162,107,0,176,0,230,67,139,30,103,0,228,64,138,224,228,64,134,196,43,216,163,103,0,195,
              83,81,228,97,36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,
              91,176,22,232,68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,
              35,0,88,232,31,0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,125,254,43,192,195,
              81,80,138,232,177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,
              116,250,228,98,36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,
              0,195,232,38,254,179,66,185,0,7,226,254,254,203,117,247,195,32,50,48,49,13,10,255,0,0,0,0,0,0,0,0,126,129,165,129,189,153,
              129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,
              16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
              153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,
              153,90,60,231,231,60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,
              102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,
              126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,
              102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,
              108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,
              0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,
              0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,
              12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,
              120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,
              48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,
              120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,
              0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
              48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,
              198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
              252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,
              204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,
              50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,
              255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,
              118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,
              48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
              0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,
              96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,
              254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,
              24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,232,203,0,10,228,116,7,254,
              204,116,22,251,31,207,250,160,112,0,198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,
              0,0,235,218,255,255,255,255,251,30,80,82,232,146,0,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,21,129,62,108,0,176,
              0,117,13,43,192,163,110,0,163,108,0,198,6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,
              32,90,88,31,207,49,56,48,49,13,10,165,254,135,233,221,230,221,230,221,230,221,230,87,239,221,230,101,240,77,248,65,248,89,
              236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,83,255,83,255,164,240,199,239,0,0,80,65,82,73,84,89,32,67,72,69,67,75,
              32,49,13,10,32,51,48,49,13,10,49,51,49,13,10,80,184,64,0,142,216,88,195,255,180,1,80,176,255,230,33,176,32,230,32,88,207,
              251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25,232,85,0,81,180,3,205,16,
              89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37,117,33,254,194,58,202,117,
              223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90,180,2,205,16,198,6,0,0,255,
              90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,54,
              48,49,13,10,255,234,91,224,0,240,49,48,47,50,55,47,56,50,255,255,120] 
              
          • 5160
            • 1982-11-08.json
              [49,53,48,49,53,49,50,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,215,224,126,225,32,75,66,32,79,75,13,232,19,26,138,251,
              232,14,26,138,235,138,207,252,250,191,0,5,176,253,230,33,176,10,230,32,186,97,0,187,204,76,180,2,138,195,238,138,199,238,
              74,228,32,34,196,116,250,236,170,66,226,238,234,0,5,0,0,255,255,250,180,213,158,115,76,117,74,123,72,121,70,159,177,5,210,
              236,115,63,176,64,208,224,113,57,50,228,158,118,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,255,255,249,
              142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,235,227,11,199,116,
              1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,137,230,99,176,165,230,97,176,1,230,96,140,200,142,208,142,216,
              252,187,0,224,188,22,224,233,27,24,117,212,176,2,230,96,176,4,230,8,176,84,230,67,138,193,230,65,176,64,230,67,128,251,255,
              116,7,228,65,10,216,226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,3,226,242,244,176,3,230,96,
              230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,80,238,176,1,236,138,224,236,59,216,116,1,244,66,226,239,254,192,116,225,
              142,219,142,195,176,255,230,1,80,230,1,176,88,230,11,176,0,138,232,230,8,80,230,10,176,18,230,65,176,65,230,11,80,228,8,36,
              16,116,1,244,176,66,230,11,176,67,230,11,186,19,2,176,1,238,139,30,114,4,185,0,32,129,251,52,18,116,22,188,24,224,233,241,
              4,116,18,138,216,176,4,230,96,43,201,226,254,134,216,235,246,43,192,243,171,137,30,114,4,186,0,4,187,16,0,142,194,43,255,
              184,85,170,139,200,38,137,5,176,15,38,139,5,51,193,117,17,185,0,32,243,171,129,194,0,4,131,195,16,128,254,160,117,218,137,
              30,19,4,184,48,0,142,208,188,0,1,176,19,230,32,176,8,230,33,176,9,230,33,176,255,230,33,30,185,32,0,43,255,142,199,184,35,
              255,171,140,200,171,226,247,191,64,0,14,31,140,216,190,3,255,144,185,16,0,165,71,71,226,251,31,30,228,98,36,15,138,224,176,
              173,230,97,144,228,98,177,4,210,192,36,240,10,196,42,228,163,16,4,176,153,230,99,232,5,24,128,251,170,116,24,128,251,101,
              117,3,233,239,253,176,56,230,97,144,144,228,96,36,255,117,4,254,6,18,4,161,16,4,80,176,48,163,16,4,42,228,205,16,176,32,163,
              16,4,42,228,205,16,88,163,16,4,36,48,117,10,191,64,0,199,5,75,255,233,160,0,60,48,116,8,254,196,60,32,117,2,180,3,134,224,
              80,42,228,205,16,88,80,187,0,176,186,184,3,185,0,8,176,1,128,252,48,116,9,183,184,186,216,3,181,32,254,200,238,129,62,114,
              4,52,18,142,195,116,7,142,219,232,199,3,117,70,88,80,180,0,205,16,184,32,112,235,17,255,255,255,255,255,255,255,255,255,255,
              255,255,255,255,233,153,21,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,
              4,226,249,235,9,43,201,236,34,196,116,17,226,249,31,30,198,6,21,0,6,186,2,1,232,219,22,235,6,177,3,210,236,117,215,88,180,
              0,205,16,186,0,192,142,218,43,219,139,7,83,91,61,85,170,117,5,232,54,22,235,4,129,194,128,0,129,250,0,200,124,228,31,198,
              6,21,4,5,176,0,230,33,228,33,10,192,117,27,176,255,230,33,228,33,4,1,117,17,162,107,4,251,43,201,226,254,226,254,128,62,107,
              4,0,116,9,190,255,248,144,232,78,22,250,244,198,6,21,4,2,176,254,230,33,176,16,230,67,185,22,0,138,193,230,64,246,6,107,4,
              1,117,4,226,247,235,216,177,12,176,255,230,64,198,6,107,4,0,176,254,230,33,246,6,107,4,1,117,194,226,247,176,255,230,33,176,
              54,230,67,176,0,230,64,230,64,176,153,230,99,160,16,4,36,1,116,49,128,62,18,4,1,116,42,232,115,22,227,30,176,73,230,97,128,
              251,170,117,21,176,200,230,97,176,72,230,97,43,201,226,254,228,96,60,0,116,10,232,180,21,190,76,236,144,232,203,21,30,43,
              192,142,192,185,8,0,14,31,190,243,254,144,191,32,0,165,71,71,226,251,31,199,6,8,0,95,248,199,6,20,0,84,255,199,6,98,0,0,246,
              128,62,18,4,1,117,10,199,6,112,0,60,249,176,254,230,33,186,16,2,184,85,85,238,176,1,236,58,196,117,68,247,208,238,176,1,236,
              58,196,117,58,187,1,0,186,21,2,185,16,0,46,136,7,144,236,58,199,117,33,66,236,58,195,117,27,74,209,227,226,236,185,8,0,176,
              1,74,138,224,238,176,1,236,58,196,117,6,208,224,226,242,235,7,190,15,249,144,232,63,21,232,236,21,30,129,62,114,0,52,18,117,
              3,233,159,0,184,16,0,235,40,139,30,19,0,131,235,16,177,4,211,235,139,203,187,0,4,142,219,142,195,129,195,0,4,82,81,83,80,
              185,0,32,232,207,1,117,76,88,5,16,0,80,187,10,0,185,3,0,51,210,247,243,128,202,48,82,226,246,185,3,0,88,232,222,20,226,250,
              185,7,0,190,26,224,46,138,4,70,232,207,20,226,247,88,61,16,0,116,169,91,89,90,226,180,176,10,232,189,20,228,8,36,1,117,51,
              31,198,6,21,0,3,233,102,254,138,232,176,13,232,167,20,176,10,232,162,20,88,131,196,6,140,218,31,30,163,19,0,136,54,21,0,232,
              206,26,138,197,232,122,20,190,4,249,144,232,145,20,186,0,200,142,218,43,219,139,7,83,91,61,85,170,117,6,232,40,20,235,5,144,
              129,194,128,0,129,250,0,246,124,227,235,1,144,180,4,43,219,142,218,232,174,19,116,3,232,130,1,129,194,0,2,254,204,117,236,
              31,160,16,0,36,1,116,62,228,33,36,191,230,33,180,0,138,212,205,19,246,196,255,117,32,186,242,3,176,28,238,43,201,226,254,
              226,254,51,210,181,1,136,22,62,0,232,252,8,114,7,181,34,232,245,8,115,7,190,82,236,144,232,24,20,176,12,186,242,3,238,198,
              6,107,0,0,190,30,0,137,54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,191,120,0,30,7,184,20,20,171,171,184,1,1,
              171,171,228,33,36,252,230,33,131,253,0,116,25,186,2,0,232,6,20,190,9,232,144,232,241,19,180,0,205,22,128,252,59,117,247,235,
              14,144,128,62,18,0,1,116,6,186,1,0,232,230,19,160,16,0,36,1,117,3,233,95,250,42,228,160,73,0,205,16,189,163,249,144,190,0,
              0,46,139,86,0,176,170,238,30,236,31,60,170,117,5,137,84,8,70,70,69,69,129,253,169,249,117,229,187,0,0,186,250,3,236,168,248,
              117,6,199,7,248,3,67,67,186,250,2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,144,
              144,144,168,15,117,5,128,14,17,0,16,228,97,12,48,230,97,36,207,230,97,176,128,230,160,205,25,252,43,255,43,192,136,5,138,
              5,50,196,117,77,254,196,138,196,117,242,139,217,209,227,184,170,170,186,85,255,243,171,228,97,12,48,230,97,144,36,207,230,
              97,79,253,139,247,139,203,172,50,196,117,37,138,194,170,226,246,34,228,116,22,138,224,134,242,34,228,117,4,138,212,235,224,
              252,71,116,222,79,186,1,0,235,214,228,98,36,192,176,0,252,195,82,80,140,218,38,136,54,21,0,129,250,0,200,124,13,232,253,24,
              190,10,249,144,232,197,18,88,90,195,186,2,1,232,235,18,235,245,255,255,255,251,43,192,142,216,199,6,120,0,199,239,140,14,
              122,0,185,4,0,81,180,0,205,19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,4,226,229,205,24,234,0,124,0,
              0,255,255,255,23,4,0,3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,83,139,242,139,250,209,230,232,16,19,139,20,11,
              210,116,19,10,228,116,22,254,204,116,69,254,204,116,106,254,204,117,3,233,131,0,91,89,95,94,90,31,207,138,224,131,194,3,176,
              128,238,138,212,177,4,210,194,129,226,14,0,191,41,231,3,250,139,20,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,196,36,
              31,238,74,74,176,0,238,235,73,80,131,194,4,176,3,238,66,66,183,48,232,72,0,116,8,89,138,193,128,204,128,235,174,74,183,32,
              232,56,0,117,240,131,234,5,89,138,193,238,235,157,131,194,4,176,1,238,66,66,183,32,232,32,0,117,219,74,183,1,232,24,0,117,
              211,128,228,30,139,20,236,233,125,255,139,20,131,194,5,236,138,224,66,236,233,112,255,138,93,124,43,201,236,138,224,34,199,
              58,199,116,8,226,245,254,203,117,239,10,255,195,69,82,82,79,82,46,32,40,82,69,83,85,77,69,32,61,32,34,70,49,34,32,75,69,89,
              41,13,10,255,255,255,255,255,255,255,255,255,251,30,83,232,37,18,10,228,116,10,254,204,116,30,254,204,116,43,235,44,251,144,
              250,139,30,26,0,59,30,28,0,116,243,139,7,232,29,0,137,30,26,0,235,20,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,0,160,
              23,0,91,31,207,67,67,59,30,130,0,117,4,139,30,128,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,
              30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,
              3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,255,117,
              255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,100,
              102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,38,42,40,
              41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,
              77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,53,54,43,
              49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,255,255,255,255,251,80,83,81,82,86,87,30,6,252,232,197,16,228,96,
              80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,122,2,36,127,14,7,191,126,232,185,8,0,242,174,
              138,196,116,3,233,133,0,129,239,127,232,46,138,165,134,232,168,128,117,81,128,252,16,115,7,8,38,23,0,233,128,0,246,6,23,0,
              4,117,101,60,82,117,34,246,6,23,0,8,117,90,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,214,1,246,6,23,0,3,116,
              243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,183,1,128,252,16,115,26,246,212,32,38,23,0,60,184,117,
              44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,161,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,60,69,116,
              5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,145,0,246,6,23,0,4,116,51,60,83,117,
              47,199,6,114,0,52,18,234,91,224,0,240,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,
              38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,33,1,191,135,234,185,10,0,242,174,117,18,129,239,136,234,160,25,0,180,10,246,
              228,3,199,162,25,0,235,137,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,244,0,60,2,114,12,60,14,115,8,128,196,118,176,0,
              233,228,0,60,59,115,3,233,97,255,60,71,115,249,187,95,233,233,27,1,246,6,23,0,4,116,88,60,70,117,24,139,30,128,0,137,30,26,
              0,137,30,28,0,198,6,113,0,128,205,27,43,192,233,176,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216,
              3,160,101,0,238,246,6,24,0,8,117,249,233,20,255,60,55,117,6,184,0,114,233,129,0,187,142,232,60,59,114,118,187,200,232,233,
              188,0,60,71,115,44,246,6,23,0,3,116,90,60,15,117,5,184,0,15,235,96,60,55,117,9,176,32,230,32,205,5,233,220,254,60,59,114,
              6,187,85,233,233,145,0,187,27,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,44,71,187,118,
              233,235,113,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,105,233,235,11,60,59,114,4,176,0,235,7,187,225,
              232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,60,90,119,17,4,
              32,235,13,233,94,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,99,252,59,30,26,0,116,19,137,4,137,30,28,0,233,
              60,254,44,59,46,215,138,224,176,0,235,174,176,32,230,32,187,128,0,228,97,80,36,252,230,97,185,72,0,226,254,12,2,230,97,185,
              72,0,226,254,75,117,235,88,230,97,233,18,254,32,51,48,49,13,10,54,48,49,13,10,255,255,251,83,81,30,86,87,85,82,139,236,232,
              243,13,232,28,0,187,4,0,232,253,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,
              127,10,228,116,39,254,204,116,115,198,6,65,0,0,128,250,4,115,19,254,204,116,105,254,204,117,3,233,149,0,254,204,116,103,254,
              204,116,103,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,
              254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,42,2,160,66,0,60,192,116,6,128,14,65,0,32,195,180,3,232,71,1,
              187,1,0,232,108,1,187,3,0,232,102,1,195,160,65,0,195,176,70,232,184,1,180,230,235,54,176,66,235,245,128,14,63,0,128,176,74,
              232,166,1,180,77,235,36,187,7,0,232,64,1,187,9,0,232,58,1,187,15,0,232,52,1,187,17,0,233,171,0,128,14,63,0,128,176,74,232,
              128,1,180,197,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,0,240,
              8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,223,0,10,228,116,8,43,201,
              226,254,254,204,235,246,251,89,232,223,0,88,138,252,182,0,114,75,190,240,237,144,86,232,148,0,138,102,1,208,228,208,228,128,
              228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,0,232,146,
              0,187,9,0,232,140,0,187,11,0,232,134,0,187,13,0,232,128,0,94,232,67,1,114,69,232,116,1,114,63,252,190,66,0,172,36,192,116,
              59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,
              208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,120,1,195,232,47,1,195,232,112,1,50,228,195,82,81,186,244,3,
              51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,178,245,
              238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,197,195,176,1,81,138,202,210,192,89,132,6,62,0,117,19,
              8,6,62,0,180,7,232,173,255,138,226,232,168,255,232,118,0,114,41,180,15,232,158,255,138,226,232,153,255,138,229,232,148,255,
              232,98,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,250,230,12,80,88,230,11,
              140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,
              232,80,187,6,0,232,114,255,138,204,88,211,224,72,80,230,5,138,196,230,5,251,89,88,3,193,89,176,2,230,10,195,232,30,0,114,
              20,180,8,232,37,255,232,74,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,
              6,62,0,128,117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,232,252,10,128,
              14,62,0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,
              249,91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,
              202,235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,174,254,138,196,254,192,42,193,195,255,255,207,2,37,
              2,8,42,255,80,246,25,4,251,30,82,86,81,83,232,126,10,139,242,138,92,120,209,230,139,84,8,11,210,116,12,10,228,116,14,254,
              204,116,63,254,204,116,40,91,89,94,90,31,207,80,238,66,43,201,236,138,224,168,128,117,14,226,247,254,203,117,241,128,204,
              1,128,228,249,235,19,176,13,66,238,176,12,238,88,80,139,84,8,66,236,138,224,128,228,248,90,138,194,128,244,72,235,197,80,
              66,66,176,8,238,184,232,3,72,117,253,176,12,238,235,221,255,255,255,255,252,240,205,241,238,241,57,242,156,247,23,242,150,
              242,56,243,116,243,185,243,236,243,78,242,47,244,30,244,24,247,116,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,
              224,139,240,61,32,0,114,4,88,233,69,1,232,214,9,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,2,180,176,142,192,88,138,
              38,73,0,46,255,164,69,240,255,255,255,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,
              45,10,127,6,100,112,2,1,6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,
              44,40,45,41,42,46,30,41,186,212,3,179,0,131,255,48,117,6,176,7,178,180,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,
              194,4,138,195,238,90,43,192,142,216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,
              3,217,80,50,228,138,196,238,66,254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,
              11,128,252,7,116,4,51,192,235,5,181,8,184,32,7,243,171,199,6,96,0,7,6,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,
              132,244,240,238,162,101,0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,
              30,7,51,192,243,171,66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,
              235,237,139,22,99,0,138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,
              84,80,56,62,98,0,117,5,139,194,232,2,0,235,191,232,124,0,139,200,3,14,78,0,209,249,180,14,232,194,255,195,162,98,0,139,14,
              76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,170,255,91,209,227,139,71,80,232,207,255,235,140,138,223,50,255,209,
              227,139,87,80,139,14,96,0,95,94,91,88,88,31,7,207,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,
              238,162,102,0,233,91,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,67,255,83,139,
              216,138,196,246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,240,1,83,139,193,232,55,0,
              116,49,3,240,138,230,42,227,232,114,0,3,245,3,253,254,204,117,245,88,176,32,232,109,0,3,253,254,203,117,247,232,140,7,128,
              62,73,0,7,116,7,160,101,0,186,216,3,238,233,231,254,138,222,235,220,128,62,73,0,2,114,24,128,62,73,0,3,119,17,82,186,218,
              3,80,236,168,8,116,251,176,37,178,216,238,88,90,232,129,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,
              74,0,3,237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,
              216,128,252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,148,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,
              254,204,117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,90,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,
              168,2,232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,39,254,138,207,50,237,139,
              241,209,230,139,68,80,51,219,227,6,3,30,76,0,226,250,232,207,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,178,1,138,
              227,80,81,232,209,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,
              233,217,253,128,252,4,114,8,128,252,7,116,3,233,127,1,80,81,232,160,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,
              251,250,236,168,1,116,251,138,195,170,251,71,226,231,233,167,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,150,
              253,80,80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,119,253,50,193,235,
              245,83,80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,
              6,187,128,1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,
              193,232,105,2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,
              116,45,138,195,180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,
              232,136,0,129,239,176,31,254,203,117,245,233,219,252,138,222,235,236,253,138,216,139,194,232,15,2,139,248,43,209,129,194,
              1,1,208,230,208,230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,
              246,228,139,247,43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,
              254,203,117,245,252,233,123,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,
              95,94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,132,1,139,248,88,60,128,115,6,190,110,
              250,14,235,15,44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,
              86,182,4,172,246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,251,251,38,50,5,
              170,172,38,50,133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,
              50,69,1,38,136,37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,
              133,1,32,131,199,80,254,206,117,193,94,95,71,71,226,183,233,156,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,
              114,26,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,
              198,0,32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,144,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,
              185,8,0,243,166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,
              128,235,210,131,196,8,233,23,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,43,210,
              185,1,0,139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,
              185,0,192,178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,
              74,0,209,224,209,224,42,255,3,195,91,195,80,80,180,3,138,62,98,0,205,16,88,60,8,116,82,60,13,116,87,60,10,116,87,60,7,116,
              90,180,10,185,1,0,205,16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,
              6,180,8,205,16,138,252,184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,88,233,82,250,254,198,180,2,235,244,128,250,0,116,
              247,254,202,235,243,178,0,235,239,128,254,24,117,232,235,188,179,2,232,118,2,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,
              194,6,236,168,4,117,126,168,2,117,3,233,129,0,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,
              138,229,138,30,73,0,42,255,46,138,159,148,247,43,195,139,30,78,0,209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,
              62,73,0,7,116,35,178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,
              238,208,238,235,18,246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,
              90,95,94,31,31,31,31,7,207,255,255,255,255,255,255,255,251,30,232,19,2,161,19,0,31,207,255,255,251,30,232,7,2,161,16,0,31,
              207,255,255,249,180,134,202,2,0,80,228,98,168,192,117,3,233,135,0,186,64,0,142,218,190,21,249,144,168,64,117,4,190,37,249,
              144,180,0,160,73,0,205,16,232,70,1,176,0,230,160,228,97,12,48,230,97,36,207,230,97,139,30,19,0,252,43,210,142,218,142,194,
              185,0,64,43,246,243,172,228,98,36,192,117,18,129,194,0,4,131,235,16,117,230,190,53,249,144,232,16,1,250,244,140,218,232,25,
              7,186,19,2,176,0,238,176,40,232,208,0,184,90,165,139,200,43,219,137,7,144,144,139,7,59,193,116,7,176,69,232,186,0,235,5,176,
              83,232,179,0,176,41,232,174,0,250,244,88,207,185,0,32,50,192,2,7,67,226,251,10,192,195,49,48,49,13,10,32,50,48,49,13,10,82,
              79,77,13,10,49,56,48,49,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,49,13,
              10,63,63,63,63,63,13,10,251,80,228,97,138,224,246,208,36,64,128,228,191,10,196,230,97,176,32,230,32,88,207,184,64,0,142,192,
              42,228,138,71,2,177,9,211,224,139,200,81,185,4,0,211,232,3,208,89,232,134,255,116,6,232,87,237,235,20,144,82,38,199,6,103,
              0,3,0,38,140,30,105,0,38,255,30,103,0,90,195,80,177,4,210,232,232,3,0,88,36,15,4,144,39,20,64,39,180,14,183,0,205,16,195,
              188,3,120,3,120,2,139,238,232,28,0,30,232,167,0,160,16,0,36,1,117,15,250,176,137,230,99,176,133,230,97,160,21,0,230,96,244,
              31,195,46,138,4,70,80,232,202,255,88,60,10,117,243,195,156,250,30,232,123,0,10,246,116,20,179,6,232,33,0,226,254,254,206,
              117,245,128,62,18,0,1,117,2,235,195,179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,
              51,5,230,66,138,196,230,66,228,97,138,224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,8,230,97,185,
              86,41,226,254,176,200,230,97,176,72,230,97,176,253,230,33,198,6,107,4,0,251,43,201,246,6,107,4,2,117,2,226,247,228,96,138,
              216,176,200,230,97,195,80,184,64,0,142,216,88,195,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,126,
              129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,
              56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,
              60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,
              99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,
              126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,
              126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,
              192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,
              0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,
              118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,
              48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,
              48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,
              0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,
              0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,
              0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,
              108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,
              252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,
              0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,
              204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,
              204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,
              48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,
              198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,
              120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,
              118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,
              0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,
              124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,
              204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,
              48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,232,
              230,251,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,
              0,137,14,110,0,198,6,112,0,0,235,218,255,255,255,255,251,30,80,82,232,173,251,255,6,108,0,117,4,255,6,110,0,131,62,110,0,
              24,117,21,129,62,108,0,176,0,117,13,43,192,163,110,0,163,108,0,198,6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,
              242,3,238,205,28,176,32,230,32,90,88,31,207,255,255,255,255,255,255,165,254,135,233,35,255,35,255,35,255,35,255,87,239,35,
              255,101,240,77,248,65,248,89,236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,75,255,75,255,164,240,199,239,0,0,30,82,
              80,232,48,251,176,11,230,32,144,228,32,138,224,10,196,117,4,180,255,235,10,228,33,10,196,230,33,176,32,230,32,136,38,107,
              0,88,90,31,207,255,255,255,255,255,255,255,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,
              205,16,138,204,181,25,232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,
              205,23,90,246,196,37,117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,
              6,0,0,0,235,10,90,180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,138,
              198,232,172,249,138,194,232,167,249,176,48,232,179,249,176,32,232,174,249,195,255,234,91,224,0,240,49,49,47,48,56,47,56,50,
              255,254,40] 
              
            • 1986-05-09.json
              [54,56,88,52,51,55,48,67,79,80,82,46,32,73,66,77,32,67,79,82,80,46,32,49,57,56,49,44,49,57,56,54,32,32,32,32,32,32,32,32,32,
              32,32,32,32,32,32,32,32,54,50,88,48,56,49,57,61,54,56,88,52,51,55,48,32,53,57,88,55,50,54,56,61,54,50,88,48,56,57,48,1,121,
              239,130,134,239,2,147,239,3,160,239,132,173,239,4,186,239,251,85,87,82,83,81,139,236,30,86,232,162,249,128,252,25,114,2,180,
              20,128,252,1,118,12,128,252,8,116,7,128,250,3,118,2,180,20,138,204,50,237,208,225,187,176,0,3,217,138,230,50,246,139,240,
              139,250,138,38,65,0,198,6,65,0,0,46,255,23,94,31,89,91,90,95,93,202,2,0,226,0,58,1,70,1,82,1,94,1,106,1,205,1,205,1,215,1,
              205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,205,1,204,2,10,3,63,3,167,3,186,242,3,250,160,63,0,36,63,
              208,192,208,192,208,192,208,192,12,8,238,198,6,62,0,0,235,0,12,4,238,251,232,16,10,114,45,185,192,0,81,184,50,1,80,180,8,
              232,55,9,88,232,37,10,89,114,25,58,14,66,0,117,19,254,193,128,249,195,118,226,232,1,3,232,95,7,139,222,138,195,195,89,128,
              14,65,0,32,235,240,136,38,65,0,232,75,7,139,222,138,196,195,128,38,63,0,127,184,70,230,232,188,3,195,184,74,197,128,14,63,
              0,128,232,176,3,195,128,38,63,0,127,184,66,230,232,164,3,195,232,241,2,232,138,4,128,14,63,0,128,246,6,143,0,1,116,5,232,
              208,4,114,65,232,46,5,116,6,232,162,2,232,5,5,176,74,232,49,5,114,47,180,77,232,141,5,114,40,184,194,1,80,178,3,232,181,7,
              232,164,8,178,4,232,173,7,232,156,8,178,7,232,165,7,232,148,8,178,8,232,157,7,232,140,8,88,232,191,5,232,199,2,232,196,6,
              139,222,138,195,195,139,198,180,1,136,38,65,0,249,195,129,255,128,0,114,6,139,198,180,1,249,195,232,120,2,199,70,2,0,0,161,
              16,0,36,193,208,232,115,124,208,192,208,192,208,192,254,192,136,70,4,246,6,143,0,1,117,3,233,157,0,131,255,1,119,102,198,
              70,5,1,232,20,7,114,22,10,192,116,18,232,237,1,114,13,136,70,2,46,138,79,4,46,138,111,11,235,50,138,165,144,0,246,196,16,
              116,62,128,228,192,128,252,128,117,84,176,1,232,200,1,46,138,79,4,46,138,111,11,246,133,144,0,1,116,13,176,4,232,180,1,46,
              138,79,4,46,138,111,11,137,78,0,137,94,6,140,200,142,192,232,32,2,51,192,248,195,198,70,4,0,129,255,128,0,114,9,232,15,2,
              139,198,180,1,249,195,51,192,137,70,0,136,102,5,137,70,6,142,192,235,215,176,2,232,116,1,46,138,79,4,46,138,111,11,128,252,
              64,116,187,235,172,131,255,3,119,216,177,9,246,133,144,0,1,176,1,181,39,116,4,176,3,181,79,136,70,2,198,70,3,0,198,70,5,1,
              232,65,1,235,147,246,6,143,0,1,116,32,232,136,1,138,133,144,0,180,0,10,192,116,8,180,1,168,1,116,2,180,2,80,232,160,1,88,
              248,139,222,138,195,195,161,16,0,180,0,168,1,116,241,208,192,208,192,36,3,59,199,114,231,180,1,235,227,246,6,143,0,1,117,
              3,233,185,254,232,71,1,138,133,144,0,10,192,116,25,168,1,116,5,232,85,8,116,5,198,6,65,0,6,232,92,1,232,89,5,139,222,138,
              195,195,128,14,65,0,128,235,238,232,28,1,86,139,198,50,228,139,240,128,165,144,0,15,78,117,7,128,141,144,0,144,235,62,246,
              6,143,0,1,116,10,232,237,2,128,62,65,0,128,116,45,78,117,7,128,141,144,0,112,235,35,78,117,7,128,141,144,0,16,235,25,78,117,
              32,246,133,144,0,4,116,9,176,80,246,133,144,0,2,117,2,176,144,8,133,144,0,232,243,0,232,240,4,91,138,195,195,198,6,65,0,1,
              235,239,232,180,0,51,219,128,126,1,39,117,11,246,133,144,0,1,116,22,179,3,235,18,179,6,128,126,0,15,116,10,179,18,128,126,
              0,18,116,2,179,12,46,139,159,81,0,46,138,71,4,46,138,103,11,57,70,0,117,35,46,138,71,12,60,64,117,2,12,32,137,94,6,12,16,
              128,165,144,0,15,8,133,144,0,140,200,142,192,232,140,0,232,137,4,195,198,6,65,0,12,235,242,80,81,51,219,185,6,0,46,138,167,
              80,0,58,196,116,8,131,195,3,226,242,249,235,5,46,139,159,81,0,89,88,195,184,69,4,80,180,3,232,22,6,42,210,232,31,5,232,14,
              6,178,1,232,23,5,232,6,6,88,195,184,93,4,80,180,3,232,251,5,46,138,39,232,245,5,46,138,103,1,232,238,5,88,195,246,6,143,0,
              1,116,34,131,255,1,119,29,128,189,144,0,0,116,23,139,207,208,225,208,225,160,143,0,210,200,36,7,128,165,144,0,248,8,133,144,
              0,195,232,250,6,195,246,6,143,0,1,116,121,131,255,1,119,116,128,189,144,0,0,116,109,139,207,208,225,208,225,180,2,210,204,
              132,38,143,0,117,22,180,7,210,204,246,212,32,38,143,0,138,133,144,0,36,7,210,200,8,6,143,0,138,165,144,0,138,252,128,228,
              192,128,252,0,116,16,176,1,128,252,64,117,22,246,199,32,117,29,176,7,235,32,232,67,4,114,247,60,2,117,243,176,2,235,12,176,
              0,128,252,128,117,232,246,199,1,117,227,246,199,16,116,2,4,3,128,165,144,0,248,8,133,144,0,195,80,232,77,255,232,167,0,88,
              246,6,143,0,1,116,10,80,232,47,1,88,115,3,233,134,0,80,138,181,144,0,128,230,192,232,248,3,10,192,116,47,232,211,254,114,
              42,87,51,219,185,6,0,46,138,167,80,0,128,228,127,58,196,117,11,46,139,191,81,0,46,58,117,12,116,29,131,195,3,226,228,198,
              6,65,0,255,95,235,63,187,121,239,246,133,144,0,1,116,9,187,147,239,235,4,144,139,223,95,232,204,254,232,53,1,116,3,232,15,
              1,83,232,32,3,91,114,26,88,80,83,232,51,1,91,88,114,31,80,83,232,141,1,91,114,8,232,173,1,114,3,232,222,1,232,114,2,88,115,
              3,233,105,255,232,38,2,232,173,2,80,232,214,254,88,232,210,2,195,246,6,143,0,1,116,55,246,133,144,0,16,117,48,184,128,64,
              246,133,144,0,4,116,12,176,0,246,133,144,0,2,117,3,184,128,128,128,165,144,0,31,8,165,144,0,128,38,139,0,243,208,200,208,
              200,208,200,208,200,8,6,139,0,195,246,6,143,0,1,116,73,246,133,144,0,16,117,66,232,30,3,114,62,254,200,120,58,138,165,144,
              0,128,228,15,10,192,117,5,128,204,144,235,37,254,200,117,5,128,204,16,235,28,254,200,117,15,246,196,4,116,16,246,196,2,116,
              11,128,204,80,235,9,254,200,117,10,235,226,128,204,144,136,165,144,0,195,50,228,235,247,246,6,143,0,1,116,55,232,34,5,116,
              52,128,165,144,0,239,139,207,176,1,210,224,246,208,250,32,6,63,0,251,232,252,2,232,110,250,181,1,232,245,3,50,237,232,240,
              3,198,6,65,0,6,232,245,4,116,5,198,6,65,0,128,249,195,248,195,246,6,143,0,1,116,25,80,128,38,139,0,63,138,133,144,0,36,192,
              8,6,139,0,208,192,208,192,186,247,3,238,88,195,80,138,38,139,0,138,133,144,0,37,192,192,58,196,88,195,250,230,12,235,0,230,
              11,60,66,117,4,51,192,235,21,140,192,209,192,209,192,209,192,209,192,138,232,36,240,3,70,2,115,2,254,197,80,230,4,235,0,138,
              196,230,4,138,197,235,0,36,15,230,129,139,198,134,196,42,192,209,232,80,178,3,232,83,2,138,204,88,211,224,72,80,230,5,235,
              0,138,196,230,5,251,89,88,3,193,176,2,230,10,115,5,198,6,65,0,9,195,80,232,68,2,138,110,1,232,63,3,88,114,24,187,74,7,83,
              232,17,3,139,198,139,223,208,228,208,228,128,228,4,10,227,232,1,3,91,195,184,128,7,80,138,102,1,232,245,2,139,198,232,240,
              2,138,102,0,232,234,2,178,3,232,243,1,232,226,2,178,4,232,235,1,232,218,2,46,138,103,5,232,211,2,178,6,232,220,1,232,203,
              2,88,195,86,232,143,3,156,232,179,3,114,71,157,114,60,252,190,66,0,172,36,192,116,51,60,64,117,41,172,208,224,180,4,114,36,
              208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,
              32,8,38,65,0,128,62,65,0,1,245,94,195,157,235,245,246,6,143,0,1,116,59,128,62,65,0,0,117,52,128,141,144,0,16,246,133,144,
              0,4,117,40,138,133,144,0,36,192,60,128,117,25,232,45,1,114,20,60,2,116,16,60,4,116,12,128,165,144,0,253,128,141,144,0,4,235,
              5,128,141,144,0,6,195,128,62,65,0,0,116,62,128,62,65,0,128,116,55,138,165,144,0,246,196,16,117,46,128,228,192,138,46,139,
              0,208,197,208,197,208,197,208,197,128,229,192,58,236,116,24,128,252,1,208,220,128,228,192,128,165,144,0,31,8,165,144,0,198,
              6,65,0,0,249,195,248,195,50,192,128,62,65,0,0,117,35,178,4,232,235,0,138,30,71,0,139,206,58,46,70,0,117,11,138,46,69,0,58,
              110,1,116,4,2,220,2,220,42,94,0,138,195,195,178,2,80,232,198,0,136,38,64,0,88,138,38,65,0,10,228,116,2,50,192,128,252,1,245,
              195,246,6,143,0,1,116,101,138,165,144,0,246,196,16,117,92,198,6,62,0,0,232,175,0,181,0,232,171,1,232,78,0,114,53,185,80,4,
              246,133,144,0,1,116,2,177,160,81,198,6,65,0,0,51,192,208,237,208,208,208,208,208,208,80,232,134,1,88,11,248,232,38,0,156,
              129,231,251,0,157,89,115,8,254,197,58,233,117,215,249,195,138,14,69,0,136,141,148,0,208,237,58,233,116,5,128,141,144,0,32,
              248,195,184,40,9,80,180,74,232,45,1,139,199,138,224,232,38,1,232,90,254,88,195,160,16,0,36,193,208,232,115,32,208,192,208,
              192,208,192,50,228,59,199,114,20,246,6,143,0,1,117,16,246,133,144,0,1,176,1,116,6,176,3,235,2,50,192,195,249,235,252,30,86,
              43,192,142,216,135,211,42,255,197,54,120,0,138,32,135,211,94,31,195,83,232,71,0,114,67,232,22,251,184,253,144,205,21,156,
              232,223,250,157,115,5,232,51,0,114,47,178,10,232,204,255,138,196,50,228,60,8,115,2,176,8,80,186,36,244,247,226,139,202,139,
              208,248,209,210,209,209,180,134,205,21,88,115,10,185,94,32,232,238,226,254,200,117,246,91,195,139,223,138,203,208,195,208,
              195,208,195,208,195,250,198,6,64,0,255,160,63,0,36,48,180,1,210,228,58,195,117,6,132,38,63,0,117,49,10,227,138,62,63,0,128,
              231,15,128,38,63,0,192,8,38,63,0,160,63,0,138,216,128,227,15,251,36,63,208,192,208,192,208,192,208,192,12,12,186,242,3,238,
              58,223,116,2,248,195,249,251,195,178,9,232,66,255,246,6,63,0,128,116,9,128,252,15,115,8,180,15,235,4,10,228,116,31,138,196,
              50,228,80,186,232,3,247,226,139,202,139,208,180,134,205,21,88,115,10,185,66,0,232,91,226,254,200,117,246,195,83,186,244,3,
              179,2,51,201,236,36,192,60,128,116,15,226,247,254,203,117,243,128,14,65,0,128,91,88,249,195,138,196,66,238,91,195,139,223,
              186,213,10,82,176,1,134,203,210,192,134,203,132,6,62,0,117,33,8,6,62,0,232,77,0,115,10,198,6,65,0,0,232,67,0,114,63,131,255,
              1,119,33,198,133,148,0,0,10,237,116,44,131,255,1,119,19,246,133,144,0,32,116,2,208,229,58,173,148,0,116,29,136,173,148,0,
              81,180,15,232,137,255,139,223,138,227,232,130,255,88,232,126,255,232,30,0,156,232,62,255,157,88,195,81,184,235,10,80,180,
              7,232,106,255,139,223,138,227,232,99,255,232,3,0,88,89,195,184,11,11,80,232,32,0,114,20,180,8,232,79,255,232,62,0,114,10,
              160,66,0,36,96,60,96,116,3,248,88,195,128,14,65,0,64,249,235,246,251,248,184,1,144,205,21,114,17,179,4,51,201,246,6,62,0,
              128,117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,195,87,191,66,0,179,7,186,244,3,183,2,51,201,
              236,36,192,60,192,116,14,226,247,254,207,117,243,128,14,65,0,128,249,235,27,66,236,136,5,71,185,2,0,232,55,225,74,236,168,
              16,116,10,254,203,117,210,128,14,65,0,32,249,95,195,232,239,253,186,247,3,236,168,128,195,232,229,253,232,75,255,114,62,181,
              48,232,220,254,114,55,181,11,254,205,120,38,81,232,208,254,114,44,184,203,11,80,180,4,232,161,254,139,199,138,224,232,154,
              254,232,137,255,88,89,246,6,66,0,16,116,218,10,237,116,6,128,141,144,0,148,195,128,141,144,0,1,195,89,195,251,80,30,232,61,
              238,128,14,62,0,128,31,176,32,230,32,184,1,145,205,21,88,207,80,83,81,82,87,86,30,232,34,238,128,14,160,0,1,199,6,144,0,0,
              0,128,38,139,0,51,128,14,139,0,192,198,6,62,0,0,198,6,64,0,0,198,6,63,0,0,198,6,65,0,0,160,16,0,208,192,208,192,36,3,50,228,
              51,255,190,16,0,246,6,143,0,1,117,5,198,133,144,0,148,80,232,77,255,232,81,248,35,54,66,0,88,71,59,248,118,227,198,6,62,0,
              0,128,38,160,0,254,232,58,252,114,5,11,246,117,1,249,31,94,95,90,89,91,88,195,251,30,83,81,232,169,237,10,228,116,38,254,
              204,116,55,254,204,116,100,128,236,3,116,100,128,236,11,116,12,254,204,116,26,254,204,116,57,89,91,31,207,232,114,0,232,162,
              0,235,244,232,106,0,232,165,0,114,248,235,234,232,134,0,116,24,156,232,141,0,235,17,232,123,0,116,13,156,232,141,0,115,6,
              157,232,73,0,235,239,157,89,91,31,202,2,0,138,38,24,0,128,228,4,177,5,210,228,160,24,0,36,115,10,224,160,150,0,36,12,10,224,
              160,23,0,235,169,86,250,139,30,28,0,139,243,232,141,0,59,30,26,0,116,11,137,12,137,30,28,0,42,192,235,3,144,176,1,251,94,
              235,135,139,30,26,0,59,30,28,0,117,5,184,2,144,205,21,251,144,250,139,30,26,0,59,30,28,0,116,243,139,7,232,85,0,137,30,26,
              0,195,250,139,30,26,0,59,30,28,0,139,7,251,195,60,240,117,6,10,228,116,2,50,192,195,128,252,224,117,18,60,13,116,9,60,10,
              116,5,180,53,235,35,144,180,28,235,30,144,128,252,132,119,26,60,240,117,7,10,228,116,16,235,16,144,60,224,117,9,10,228,116,
              5,50,192,235,1,144,248,195,249,195,67,67,59,30,130,0,114,4,139,30,128,0,195,80,83,81,82,86,87,30,6,252,232,131,236,228,96,
              147,228,97,138,224,12,128,230,97,134,224,230,97,251,147,180,79,249,205,21,114,3,233,137,1,138,224,60,255,117,3,233,246,3,
              14,7,138,62,150,0,60,224,117,7,128,14,150,0,18,235,9,60,225,117,8,128,14,150,0,17,233,104,1,36,127,246,199,2,116,12,185,2,
              0,191,204,17,242,174,117,91,235,68,246,199,1,116,29,185,4,0,191,202,17,242,174,116,219,60,69,117,49,246,196,128,117,44,246,
              6,24,0,8,117,37,233,99,2,60,84,117,51,246,196,128,117,28,246,6,24,0,4,117,18,128,14,24,0,4,176,32,230,32,184,0,133,251,205,
              21,233,22,1,233,9,1,128,38,24,0,251,176,32,230,32,184,1,133,251,205,21,233,1,1,138,30,23,0,191,198,17,185,8,0,144,242,174,
              138,196,116,3,233,207,0,129,239,199,17,46,138,165,206,17,177,2,168,128,116,3,235,110,144,128,252,16,115,33,8,38,23,0,246,
              196,12,117,3,233,192,0,246,199,2,116,7,8,38,150,0,233,180,0,210,236,8,38,24,0,233,171,0,246,195,4,116,3,233,143,0,60,82,117,
              33,246,195,8,116,3,233,131,0,246,199,2,117,20,246,195,32,117,10,246,195,3,116,10,138,224,235,112,144,246,195,3,116,246,132,
              38,24,0,116,3,235,118,144,8,38,24,0,48,38,23,0,60,82,117,105,138,224,235,120,144,128,252,16,246,212,115,67,32,38,23,0,128,
              252,251,119,38,246,199,2,116,6,32,38,150,0,235,6,210,252,32,38,24,0,138,224,160,150,0,210,232,10,6,24,0,210,224,36,12,8,6,
              23,0,138,196,60,184,117,42,160,25,0,180,0,136,38,25,0,60,0,116,29,233,105,2,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,
              116,28,60,69,116,5,128,38,24,0,247,128,38,150,0,252,250,176,32,230,32,7,31,95,94,90,89,91,88,207,60,88,119,233,246,195,8,
              116,12,246,199,16,116,10,246,6,24,0,4,116,3,233,215,0,246,195,4,116,55,60,83,117,51,199,6,114,0,52,18,129,38,150,0,16,0,233,
              230,208,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50,60,57,
              117,5,176,32,233,211,1,60,15,117,6,184,0,165,233,201,1,60,74,116,121,60,78,116,117,191,117,15,185,10,0,242,174,117,24,246,
              199,2,117,107,129,239,118,15,160,25,0,180,10,246,228,3,199,162,25,0,233,92,255,198,6,25,0,0,185,26,0,242,174,116,66,60,2,
              114,67,60,13,119,5,128,196,118,235,53,60,87,114,9,60,88,119,5,128,196,52,235,40,246,199,2,116,24,60,28,117,6,184,0,166,233,
              106,1,60,83,116,31,60,53,117,192,184,0,164,233,92,1,60,59,114,12,60,68,119,178,128,196,45,176,0,233,76,1,176,240,233,71,1,
              4,80,138,224,235,240,246,195,4,117,3,233,128,0,60,70,117,30,246,199,16,116,5,246,199,2,116,20,139,30,26,0,137,30,28,0,198,
              6,113,0,128,205,27,43,192,233,23,1,246,199,16,117,37,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216,
              3,160,101,0,238,246,6,24,0,8,117,249,233,180,254,60,55,117,16,246,199,16,116,5,246,199,2,116,32,184,0,114,233,217,0,60,15,
              116,22,60,53,117,11,246,199,2,116,6,184,0,149,233,198,0,187,214,17,60,59,114,87,187,214,17,233,168,0,60,55,117,31,246,199,
              16,116,7,246,199,2,117,7,235,52,246,195,3,116,47,176,32,230,32,205,5,128,38,150,0,252,233,93,254,60,58,119,44,60,53,117,5,
              246,199,2,117,20,185,26,0,191,127,15,242,174,117,5,246,195,64,117,10,246,195,3,117,10,187,46,18,235,80,246,195,3,117,246,
              187,134,18,235,70,60,68,119,2,235,54,60,83,119,44,60,74,116,237,60,78,116,233,246,199,2,117,10,246,195,32,117,19,246,195,
              3,117,19,60,76,117,5,176,240,235,61,144,187,46,18,235,38,246,195,3,117,237,235,197,60,86,117,2,235,176,246,195,3,116,224,
              187,134,18,235,15,254,200,46,215,246,6,150,0,2,116,21,180,224,235,17,254,200,46,215,138,224,176,0,246,6,150,0,2,116,2,176,
              224,60,255,116,5,128,252,255,117,3,233,177,253,250,139,30,28,0,139,243,232,234,251,59,30,26,0,116,23,137,4,137,30,28,0,176,
              32,230,32,184,2,145,205,21,128,38,150,0,252,233,148,253,250,228,33,12,2,230,33,176,32,230,32,251,185,166,2,179,3,232,160,
              218,250,228,33,36,253,230,33,233,118,253,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,30,255,255,255,
              255,31,255,127,148,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,3,22,2,14,13,255,
              255,255,255,150,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,141,132,142,115,143,116,144,117,145,118,146,147,
              255,255,255,137,138,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,
              100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,59,60,61,62,63,64,65,66,
              67,68,255,255,71,72,73,255,75,255,77,255,79,80,81,82,83,255,255,92,133,134,27,33,64,35,36,37,94,38,42,40,41,95,43,8,0,81,
              87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,77,60,62,63,255,
              42,255,32,255,84,85,86,87,88,89,90,91,92,93,255,255,55,56,57,45,52,53,54,43,49,50,51,48,46,255,255,124,135,136,251,82,83,
              131,250,3,119,37,138,248,30,232,37,231,86,139,242,138,156,120,0,209,230,139,148,8,0,94,31,11,210,116,12,10,228,116,13,254,
              204,116,75,254,204,116,57,180,41,91,90,207,238,66,236,236,168,128,117,5,184,254,144,205,21,81,43,201,236,138,224,168,128,
              117,15,226,247,254,203,117,243,89,128,204,1,128,228,249,235,21,89,176,13,66,250,238,235,0,176,12,238,251,74,74,66,236,236,
              36,248,138,224,138,199,128,244,72,235,187,66,66,176,8,238,184,232,3,72,117,253,176,12,238,74,74,235,224,251,30,82,86,87,81,
              83,131,250,3,119,36,139,242,139,250,209,230,232,152,230,139,148,0,0,11,210,116,19,10,228,116,24,254,204,116,75,254,204,116,
              112,254,204,117,3,233,139,0,180,128,91,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,177,4,210,194,129,226,14,
              0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,144,46,138,5,238,131,194,3,138,196,36,31,238,74,74,144,176,0,238,235,
              75,80,131,194,4,176,3,238,66,66,183,48,232,76,0,116,8,89,138,193,128,204,128,235,170,74,183,32,232,60,0,117,240,131,234,5,
              89,138,193,238,235,153,131,194,4,176,1,238,66,66,183,32,232,36,0,117,219,74,183,1,232,28,0,117,211,128,228,30,139,148,0,0,
              236,233,119,255,139,148,0,0,131,194,5,236,138,224,66,236,233,104,255,138,157,124,0,43,201,236,138,224,34,199,58,199,116,8,
              226,245,254,203,117,239,10,255,195,165,20,140,21,173,21,213,21,203,27,236,21,85,22,243,22,69,23,162,23,212,23,14,22,150,24,
              133,24,68,27,52,22,131,21,131,21,131,21,1,24,251,252,128,252,20,115,47,6,30,82,81,83,86,87,85,190,64,0,142,222,139,240,160,
              16,0,36,48,60,48,191,0,184,117,3,191,0,176,142,199,138,196,152,209,224,150,138,38,73,0,46,255,164,70,20,207,186,212,3,139,
              62,16,0,129,231,48,0,131,255,48,117,6,176,7,178,180,235,13,60,7,114,9,176,0,131,255,16,116,2,176,2,162,73,0,137,22,99,0,198,
              6,132,0,24,30,80,152,139,240,46,138,132,244,240,162,101,0,36,55,82,131,194,4,238,90,43,219,142,219,197,30,116,0,88,185,16,
              0,60,2,114,14,3,217,60,4,114,8,3,217,60,7,114,2,3,217,80,139,71,10,134,224,30,232,0,229,163,96,0,31,50,228,138,196,238,66,
              254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,60,4,114,10,60,7,116,4,51,192,235,5,181,8,
              184,32,7,243,171,139,22,99,0,131,194,4,160,101,0,238,46,138,132,236,240,152,163,74,0,129,230,14,0,46,139,132,228,240,163,
              76,0,185,8,0,191,80,0,30,7,51,192,243,171,66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,93,95,94,91,89,90,31,7,207,180,
              10,137,14,96,0,232,2,0,235,236,139,22,99,0,138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,199,152,
              209,224,150,137,148,80,0,56,62,98,0,117,5,139,194,232,2,0,235,191,232,127,0,139,200,3,14,78,0,209,249,180,14,232,195,255,
              195,138,223,50,255,209,227,139,151,80,0,139,14,96,0,93,95,94,91,88,88,31,7,207,162,98,0,152,80,247,38,76,0,163,78,0,139,200,
              209,249,180,12,232,150,255,91,209,227,139,135,80,0,232,185,255,233,117,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,
              36,224,128,227,31,10,195,238,162,102,0,233,89,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,93,
              95,94,89,233,65,255,83,147,160,74,0,246,231,50,255,3,195,209,224,91,195,232,216,0,128,252,4,114,8,128,252,7,116,3,233,141,
              2,83,139,193,232,55,0,116,49,3,240,138,230,42,227,232,109,0,3,245,3,253,254,204,117,245,88,176,32,232,104,0,3,253,254,203,
              117,247,232,132,227,128,62,73,0,7,116,7,160,101,0,186,216,3,238,233,229,254,138,222,235,220,232,161,255,3,6,78,0,139,248,
              139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,237,160,74,0,246,227,3,192,80,160,73,0,6,31,60,2,114,19,60,3,119,15,82,
              186,218,3,236,168,8,116,251,176,37,178,216,238,90,88,10,219,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,
              253,232,57,0,128,252,4,114,8,128,252,7,116,3,233,69,2,83,139,194,232,152,255,116,32,43,240,138,230,42,227,232,206,255,43,
              245,43,253,254,204,117,245,88,176,32,232,201,255,43,253,254,203,117,247,233,94,255,138,222,235,237,138,216,10,192,116,14,
              80,138,198,42,197,254,192,58,195,88,117,2,42,219,195,128,252,4,114,8,128,252,7,116,3,233,50,3,232,25,0,139,247,6,31,10,219,
              117,13,251,144,250,236,168,1,117,248,236,168,9,116,251,173,233,21,254,134,227,139,232,128,235,2,208,235,138,199,152,139,248,
              209,231,139,149,80,0,116,9,51,255,3,62,76,0,72,117,249,160,74,0,246,230,50,246,3,194,209,224,3,248,139,22,99,0,131,194,6,
              195,128,252,4,114,8,128,252,7,116,3,233,33,2,232,188,255,10,219,116,6,149,243,171,235,22,149,251,144,250,236,168,8,117,9,
              168,1,117,244,236,168,9,116,251,149,171,226,234,233,175,253,128,252,4,114,8,128,252,7,116,3,233,239,1,232,138,255,251,10,
              219,117,15,250,236,168,8,117,9,168,1,117,241,236,168,9,116,251,139,197,170,71,226,230,233,130,253,85,139,236,142,70,16,93,
              152,139,248,60,4,115,115,227,113,139,243,138,223,50,255,135,243,209,230,255,180,80,0,184,0,2,205,16,38,138,70,0,69,60,8,116,
              12,60,13,116,8,60,10,116,4,60,7,117,10,180,14,205,16,139,148,80,0,235,45,81,83,185,1,0,131,255,2,114,5,38,138,94,0,69,180,
              9,205,16,91,89,254,194,58,22,74,0,114,16,254,198,42,210,128,254,25,114,7,184,10,14,205,16,254,206,184,0,2,205,16,226,173,
              90,151,168,1,117,5,184,0,2,205,16,233,254,252,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,237,252,80,80,232,30,0,
              210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,206,252,50,193,235,245,150,176,40,246,
              226,168,8,116,3,5,216,31,150,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,1,185,3,7,34,234,211,234,3,242,138,247,
              42,201,208,200,2,205,254,207,117,248,138,227,210,236,195,138,216,139,193,232,57,2,139,248,43,209,129,194,1,1,208,230,208,
              230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,43,176,80,246,227,139,247,3,240,138,230,42,227,232,
              125,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,133,0,129,239,176,31,254,203,117,245,233,62,252,138,222,235,
              236,253,138,216,139,194,232,225,1,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,
              42,237,129,199,240,0,208,227,208,227,116,43,176,80,246,227,139,247,43,240,138,230,42,227,232,32,0,129,238,80,32,129,239,80,
              32,254,204,117,241,138,199,232,40,0,129,239,80,32,254,203,117,245,233,225,251,138,222,235,236,138,202,86,87,243,164,95,94,
              129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,
              0,80,232,89,1,139,248,88,60,128,115,6,190,110,250,14,235,24,44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,11,214,117,
              5,88,190,110,250,14,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,246,195,128,117,22,170,172,38,136,
              133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,88,251,38,50,5,170,172,38,50,133,255,31,235,224,138,211,209,231,
              128,227,3,176,85,246,227,138,216,138,248,87,86,182,4,172,232,184,0,35,195,134,224,246,194,128,116,3,38,51,5,38,137,5,172,
              232,165,0,35,195,134,224,246,194,128,116,5,38,51,133,0,32,38,137,133,0,32,131,199,80,254,206,117,207,94,95,71,71,226,197,
              233,255,250,232,168,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,25,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,
              131,198,80,254,206,117,235,235,22,209,230,182,4,232,94,0,129,198,254,31,232,87,0,129,238,178,31,254,206,117,238,191,110,250,
              14,7,131,237,8,139,245,176,0,22,31,186,128,0,86,87,185,4,0,243,167,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,
              43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,131,196,8,233,125,250,81,185,8,0,208,200,209,221,209,253,
              226,248,149,89,195,173,134,196,185,0,192,178,0,133,193,116,1,249,208,210,209,233,209,233,115,243,136,86,0,69,195,161,80,0,
              83,139,216,160,74,0,246,228,209,224,209,224,42,255,3,195,91,195,151,180,3,138,62,98,0,205,16,139,199,60,13,118,70,180,10,
              185,1,0,205,16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,8,
              205,16,138,252,184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,151,233,240,249,254,198,180,2,235,244,116,19,60,10,116,19,
              60,7,116,22,60,8,117,172,10,210,116,234,74,235,231,178,0,235,227,128,254,24,117,220,235,176,185,51,5,179,31,232,155,208,235,
              204,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,194,6,236,168,4,116,3,233,128,0,168,2,117,3,233,131,0,180,16,139,22,99,0,138,196,
              238,144,66,236,138,232,74,254,196,138,196,238,66,144,236,138,229,138,30,73,0,42,255,46,138,159,195,27,43,195,139,30,78,0,
              209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178,40,246,242,138,232,2,237,138,220,42,255,128,
              62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18,246,54,74,0,138,240,138,212,210,224,138,232,
              138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,93,95,94,31,31,31,31,7,207,251,128,252,128,115,6,180,134,249,
              202,2,0,128,252,192,116,46,128,236,128,116,37,254,204,116,33,254,204,116,29,254,204,254,204,116,39,254,204,116,19,254,204,
              254,204,254,204,116,24,128,236,8,116,6,254,204,116,5,235,203,248,235,203,207,14,7,187,60,231,50,228,235,193,51,192,207,251,
              139,194,186,1,2,10,192,116,9,254,200,116,10,235,171,251,235,171,236,36,240,235,248,179,1,232,25,0,81,179,2,232,19,0,81,179,
              4,232,13,0,81,179,8,232,7,0,139,209,89,91,88,235,218,82,250,176,0,230,67,235,0,228,64,235,0,138,224,228,64,134,224,80,185,
              255,4,238,235,0,236,132,195,224,251,131,249,0,89,117,4,43,201,235,45,176,0,230,67,235,0,228,64,138,224,235,0,228,64,134,224,
              59,200,115,11,82,186,255,255,43,208,3,202,90,235,2,43,200,129,225,240,31,209,233,209,233,209,233,209,233,251,186,1,2,81,80,
              185,255,4,236,168,15,224,251,88,89,90,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,143,126,232,167,
              107,203,232,2,101,203,93,232,199,47,116,13,139,54,233,4,138,68,46,60,254,116,2,60,253,195,0,0,0,0,0,0,51,46,148,13,104,115,
              91,17,89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,27,45,254,17,88,30,
              240,27,145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,169,18,88,18,57,34,
              184,18,216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,67,108,65,109,65,206,
              65,47,83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,28,101,128,126,150,125,
              241,112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,41,248,40,11,41,128,34,
              71,41,13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,1,72,1,87,1,139,1,180,
              1,217,1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,3,101,3,105,3,106,3,85,
              84,207,170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,0,79,76,79,210,191,76,
              79,83,197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,30,79,211,12,72,82,164,
              22,65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,70,73,78,212,173,69,70,
              83,78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,166,82,82,79,210,167,82,
              204,212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,207,137,79,32,84,207,137,
              79,83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,208,242,78,75,69,89,164,
              222,0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,136,73,78,197,176,79,65,
              196,188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,82,71,197,189,79,196,243,
              73,68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,84,164,25,80,84,73,79,206,
              184,70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,212,199,79,73,78,212,220,
              69,206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,83,85,77,197,168,73,71,72,
              84,164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,144,87,65,208,164,65,86,197,
              190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,80,65,67,69,164,24,79,85,78,
              196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,168,206,207,204,65,206,13,0,
              83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,72,73,76,197,177,69,78,196,178,
              82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,190,230,189,231,188,232,0,121,
              121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,32,99,116,101,18,99,25,99,65,
              99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,116,32,70,79,82,0,83,121,110,
              116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,83,85,66,0,79,117,116,32,111,
              102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,0,79,118,101,114,102,108,
              111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,100,32,108,105,110,101,32,110,
              117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,103,101,0,68,117,112,108,105,
              99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,98,121,32,122,101,114,111,0,73,
              108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,99,104,0,79,117,116,32,111,102,
              32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,108,111,110,103,0,83,116,114,105,
              110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,97,110,39,116,32,99,111,110,116,105,
              110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,116,105,111,110,0,78,111,32,82,69,83,
              85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,85,110,112,114,105,110,116,97,98,108,
              101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,0,76,105,110,101,32,98,117,102,102,
              101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,117,116,0,68,101,118,105,99,101,
              32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,32,111,102,32,80,97,112,101,114,
              0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,105,116,104,111,117,116,32,87,72,
              73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,0,66,
              97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,111,117,110,100,0,66,97,100,32,
              102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,101,110,0,63,0,68,101,118,105,
              99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,0,63,0,
              63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,66,97,100,32,114,101,99,111,
              114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,105,114,101,99,116,32,115,116,
              97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,102,105,108,101,115,0,0,0,0,195,
              30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
              255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,
              1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,105,110,32,0,
              79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,241,60,130,116,1,195,138,15,
              67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,185,181,8,233,145,0,205,134,
              139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,178,57,185,178,54,185,178,53,
              185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,178,58,235,34,139,30,55,3,137,
              30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,178,13,50,192,162,54,5,162,95,
              0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,116,4,137,30,73,3,185,12,8,
              139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,138,199,34,195,254,192,116,
              10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,135,218,233,115,6,50,192,
              136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,138,208,46,138,7,67,10,
              192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,180,3,235,212,232,190,
              114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,232,241,34,176,89,205,
              138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,187,255,255,137,30,
              46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,132,40,90,115,14,
              50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,137,30,63,3,160,
              247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,147,38,117,3,233,
              118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,81,232,238,61,232,
              176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,89,81,115,3,232,214,
              24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,3,217,83,232,21,91,
              91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,73,138,193,10,197,
              117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,254,139,30,48,0,135,
              218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,232,253,4,232,249,4,
              235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,175,35,234,116,2,
              60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,30,48,0,139,203,
              138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,162,253,2,162,
              252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,187,183,0,50,
              192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,47,67,80,232,
              84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,218,80,138,7,
              67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,115,3,233,46,
              1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,235,11,144,186,101,11,232,8,0,117,38,176,141,89,
              233,173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,0,85,66,0,91,232,
              127,14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,46,172,36,127,117,
              3,233,171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,116,21,60,208,116,
              17,232,54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,0,89,90,12,128,80,
              176,255,232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,75,80,205,146,186,
              12,12,138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,147,158,137,142,205,
              141,0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,60,217,116,3,233,
              198,0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,3,233,137,0,160,
              253,2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,253,0,94,135,222,
              86,135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,251,2,60,2,117,
              26,139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,27,232,92,0,187,
              163,4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,242,46,172,36,
              127,117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,12,60,72,176,
              11,117,2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,23,233,155,
              250,205,147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,60,48,115,236,
              60,46,116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,233,159,254,
              75,138,7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,59,3,160,251,
              2,80,232,123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,117,30,3,217,
              82,75,138,55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,232,227,30,83,
              139,30,53,3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,193,249,156,232,
              14,9,157,83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,198,86,235,39,
              232,18,93,232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,244,92,232,147,
              85,232,18,109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,83,139,30,90,4,
              137,30,46,0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,181,130,81,235,
              66,233,203,248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,116,224,67,139,
              23,67,137,22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,19,205,150,232,
              155,29,137,38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,171,60,74,115,
              162,50,228,2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,192,254,200,195,
              10,192,116,251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,115,7,60,254,117,
              27,138,7,67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,254,2,75,138,63,
              235,225,232,55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,218,89,90,137,30,
              254,2,88,187,4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,13,114,19,139,30,
              2,3,117,10,67,67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,163,4,139,30,4,3,
              137,30,165,4,195,187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,65,138,200,138,
              232,232,5,255,60,234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,254,192,94,135,
              222,86,187,96,3,181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,232,179,14,121,
              155,178,5,233,122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,3,117,3,233,159,
              254,50,192,162,0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,218,3,219,3,218,
              3,219,88,158,44,48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,116,3,233,163,
              48,232,117,28,185,232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,196,80,134,
              196,81,235,4,81,232,123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,222,86,232,
              81,0,67,83,139,30,46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,217,195,178,
              8,233,163,246,205,152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,46,0,187,232,
              14,94,135,222,86,176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,116,186,67,
              60,34,116,233,254,192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,231,137,22,
              59,3,82,160,251,2,80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,163,4,60,5,
              114,3,186,159,4,83,60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,187,44,3,
              59,218,115,10,176,90,232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,24,253,
              232,236,27,137,232,95,254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,3,10,192,
              138,194,116,209,160,40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,201,138,
              197,117,3,233,185,252,232,26,254,60,44,117,167,235,238,160,79,3,10,192,117,8,51,192,163,77,3,233,102,245,254,192,162,40,0,
              128,63,131,116,18,232,247,253,117,12,11,210,116,16,232,115,254,50,192,162,79,3,195,232,151,252,117,250,235,7,50,192,162,79,
              3,254,192,161,71,3,163,46,0,139,30,75,3,117,229,128,63,0,117,3,131,195,4,67,233,23,25,232,112,12,117,218,10,192,117,3,233,
              164,253,233,32,245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,116,8,232,
              147,253,116,3,233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,245,232,
              44,4,138,7,60,44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,117,3,
              233,204,253,60,13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,117,
              238,235,209,232,106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,3,
              233,171,0,60,210,117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,
              18,198,7,32,139,30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,
              138,232,254,192,116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,
              114,3,232,153,24,91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,
              232,50,59,60,255,116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,
              80,60,210,116,1,74,138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,
              41,0,138,216,254,192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,
              111,27,138,7,117,3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,
              176,32,232,24,23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,
              137,30,233,4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,
              176,0,91,233,230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,
              232,122,34,232,68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,
              32,102,114,111,109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,
              156,160,58,3,10,192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,
              242,232,190,28,185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,
              235,4,232,111,24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,
              161,24,81,50,192,162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,
              181,0,254,197,232,76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,
              116,7,60,44,116,3,233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,
              233,31,255,83,232,13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,
              3,233,10,255,198,7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,
              138,7,60,44,116,10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,
              155,248,138,240,138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,
              192,117,1,195,138,193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,
              233,253,82,75,232,79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,
              218,116,3,233,53,23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,
              22,55,3,232,8,248,60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,
              178,1,50,192,162,168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,
              160,251,2,60,3,138,194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,
              81,138,198,205,158,60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,
              121,3,233,17,0,255,54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,
              255,182,0,44,230,114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,
              101,83,232,55,76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,
              187,3,27,83,232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,
              2,116,40,60,4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,
              3,233,124,239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,
              30,161,4,91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,
              31,255,227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,
              232,97,75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,
              76,232,51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,
              233,106,1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,
              0,60,213,117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,
              117,46,232,199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,
              11,219,117,3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,
              3,233,76,46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,
              126,2,232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,
              232,65,1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,
              232,229,255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,
              60,71,115,67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,
              36,60,56,114,3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,
              213,232,153,74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,
              81,232,134,244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,
              101,4,135,218,94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,
              213,25,82,176,1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,
              60,233,116,251,159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,
              137,30,163,4,89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,
              60,123,117,3,233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,
              218,247,211,195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,
              132,73,232,46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,
              80,60,3,117,3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,
              208,208,138,200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,
              208,116,233,60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,
              232,243,1,232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,
              232,185,17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,
              233,206,0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,
              218,94,135,222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,
              227,232,249,71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,
              88,10,192,116,78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,
              74,74,74,160,251,2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,
              232,223,0,185,197,28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,
              4,4,80,208,200,138,200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,
              30,122,3,139,30,228,3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,
              30,80,4,138,199,10,195,162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,
              163,4,59,218,114,6,232,124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,
              135,218,139,227,139,30,80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,
              91,195,139,242,172,136,7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,
              15,209,176,128,162,57,3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,
              233,175,55,60,162,117,3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,
              232,240,255,238,195,232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,
              0,10,192,117,11,135,218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,
              125,32,138,198,182,0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,
              194,2,192,138,208,176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,
              232,50,58,10,192,121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,
              194,162,42,0,195,232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,
              233,50,241,75,232,242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,
              239,116,14,232,168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,
              138,15,67,138,47,67,138,197,10,193,117,3,233,61,233,232,144,224,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,
              218,59,218,89,115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,
              24,0,187,247,1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,
              50,192,162,94,4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,
              60,34,117,10,160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,
              121,3,233,60,0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,
              65,254,206,117,1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,
              208,216,208,216,115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,
              73,139,241,172,60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,
              53,255,160,252,2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,
              3,232,229,255,138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,
              116,1,75,83,81,82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,
              138,7,58,197,117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,
              117,7,50,192,162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,
              235,6,46,138,7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,
              100,254,232,191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,
              233,96,66,60,12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,
              170,65,254,206,116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,
              3,232,82,67,138,7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,
              117,4,60,46,116,8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,
              2,233,174,253,232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,
              238,187,45,7,232,246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,
              137,30,88,3,195,232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,
              6,142,6,80,3,139,250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,
              60,144,117,237,232,171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,
              82,232,116,237,138,238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,
              11,210,117,3,233,74,237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,
              44,237,90,89,88,83,82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,
              218,90,116,12,138,7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,
              86,135,218,67,137,23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,
              117,1,195,67,139,23,67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,
              60,137,117,228,232,92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,
              73,158,176,13,114,63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,
              102,105,110,101,100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,
              35,83,139,30,254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,
              170,9,83,232,166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,
              7,44,48,115,3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,
              67,235,243,159,134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,
              3,233,143,9,82,67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,
              117,109,98,101,114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,
              135,218,139,30,46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,
              161,116,29,60,205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,
              143,117,7,81,232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,
              117,161,254,205,117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,
              30,90,4,137,30,46,0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,
              46,0,91,82,195,159,80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,
              81,80,232,214,2,88,138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,
              192,115,241,254,206,254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,
              74,232,47,0,232,137,2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,
              149,0,187,44,3,83,136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,
              239,60,34,117,3,232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,
              218,138,193,232,180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,
              138,7,117,155,186,16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,
              117,3,232,165,5,65,235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,
              218,114,15,137,30,47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,
              81,139,30,10,3,137,30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,
              30,78,4,139,30,90,3,137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,
              50,192,138,208,182,0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,
              218,3,218,137,30,75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,
              67,88,83,3,217,60,3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,
              39,81,50,192,10,7,159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,
              94,135,222,86,59,218,94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,
              138,31,183,0,3,217,138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,
              30,163,4,94,135,222,86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,
              253,90,232,72,0,94,135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,
              135,222,86,138,7,67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,
              30,163,4,135,218,232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,
              30,47,3,91,195,205,238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,
              138,240,138,7,10,192,195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,
              45,3,136,23,89,233,114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,
              232,236,241,116,5,232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,
              205,116,188,139,30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,
              3,138,197,186,177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,
              90,232,13,255,233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,
              230,81,232,181,1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,
              232,114,243,138,234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,
              232,190,63,89,91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,
              243,244,10,192,117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,
              236,232,163,3,41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,
              200,58,7,176,0,115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,
              82,94,135,222,86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,
              192,195,91,90,90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,
              83,82,135,218,67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,
              86,232,241,2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,
              94,135,222,86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,
              138,205,254,201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,
              1,195,139,242,172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,
              41,195,232,150,239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,
              83,232,37,4,116,3,233,221,23,91,88,134,196,158,81,159,80,235,18,50,192,162,79,3,233,147,229,25,254,200,232,99,35,176,8,235,
              56,60,9,117,16,176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,
              11,254,205,58,197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,
              188,3,116,61,232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,
              239,4,10,192,116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,
              116,248,235,11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,
              192,195,205,183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,239,50,83,232,175,32,116,33,232,176,255,
              10,192,117,16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,
              163,4,176,3,162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,
              115,1,195,139,30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,
              218,235,227,117,214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,
              205,175,137,30,59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,
              7,0,187,11,0,232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,
              47,3,50,192,232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,
              89,139,30,44,0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,
              137,30,124,3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,
              86,139,223,117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,
              139,217,90,114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,159,10,157,137,30,67,3,
              187,14,3,137,30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,
              245,253,157,187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,
              219,186,17,0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,
              30,90,3,94,135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,
              218,83,139,30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,
              3,232,115,8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,
              218,139,242,172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,
              88,134,196,158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,
              232,146,254,44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,
              223,116,3,233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,
              25,135,218,137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,
              3,235,186,139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,
              48,139,30,86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,
              232,94,0,50,192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,
              1,58,195,116,221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,
              30,86,0,232,9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,
              42,199,114,150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,
              200,117,3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,
              16,58,199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,
              58,195,115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,
              117,249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,
              172,138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,
              138,200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,
              203,3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,
              232,7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,
              255,232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,10,192,117,3,232,119,28,80,139,30,86,0,138,38,41,0,254,196,58,30,88,
              0,117,18,58,62,89,0,115,4,136,62,89,0,58,62,90,0,118,6,138,231,136,38,90,0,88,232,47,0,114,16,116,187,232,3,2,232,153,249,
              235,179,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,7,117,
              246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,32,0,80,
              138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,10,192,195,3,
              34,192,195,139,30,86,0,128,255,1,117,11,254,203,232,215,254,117,7,138,62,41,0,232,144,28,233,222,249,195,13,2,6,5,3,11,12,
              28,29,30,31,14,127,27,9,10,8,18,2,6,5,3,13,14,127,27,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,50,
              193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,205,
              117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,41,3,
              160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,66,138,
              193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,30,88,0,
              82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,1,254,
              195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,7,0,
              135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,235,
              247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,197,
              117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,160,
              114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,83,187,
              90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,230,1,
              88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,232,
              173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,86,
              91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,5,2,
              94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,41,
              0,138,248,160,80,0,138,200,81,232,34,26,89,10,192,116,12,58,193,116,8,254,199,232,42,26,50,192,195,254,207,116,244,235,229,
              232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,195,
              235,226,198,6,112,0,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,19,235,241,232,214,25,232,59,1,115,7,232,49,0,116,4,235,
              241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,114,7,232,23,
              0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,117,190,160,41,
              0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,22,0,139,250,
              170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,232,138,251,116,
              21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,116,25,254,199,232,
              196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,81,232,164,0,89,80,
              138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,114,47,116,34,139,
              30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,83,183,1,232,249,24,
              91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,114,18,60,65,114,243,
              60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,60,255,116,8,254,199,
              254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,34,195,254,192,135,218,
              116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,3,232,120,211,114,3,233,
              60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,188,232,187,247,1,232,169,
              232,232,95,251,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,160,209,60,10,116,3,233,
              107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,13,232,77,244,176,10,195,
              75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,232,201,247,115,3,233,
              63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,51,138,232,81,181,255,
              186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,116,228,138,197,60,39,
              114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,1,195,254,198,60,33,116,
              249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,251,2,232,18,215,160,57,
              3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,162,57,3,83,160,77,4,10,
              192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,36,50,192,162,74,4,139,
              30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,91,94,135,222,86,82,
              186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,2,197,254,192,138,200,
              81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,0,59,218,117,248,90,136,
              55,67,90,137,23,67,232,221,1,135,218,66,91,195,232,134,66,235,8,198,6,79,3,0,233,120,10,232,64,226,117,7,187,6,0,137,30,163,
              4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,135,218,4,2,208,216,138,200,232,
              195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,88,137,30,181,0,91,4,2,208,216,
              89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,92,4,10,192,116,8,11,210,117,3,
              233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,116,136,60,41,116,7,60,93,116,
              3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,139,30,90,3,233,175,44,160,
              250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,9,0,233,25,206,160,251,2,136,
              7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,245,242,67,67,137,30,49,3,136,
              15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,159,65,158,136,15,159,80,67,136,
              47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,242,232,220,242,137,30,92,3,75,
              198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,75,137,23,67,67,88,158,114,70,
              138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,42,3,218,88,254,200,139,203,
              117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,89,3,217,135,218,139,30,82,
              3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,172,138,232,254,197,139,242,
              172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,139,30,163,4,235,10,160,58,3,
              10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,237,117,3,233,95,213,67,139,31,235,36,138,213,83,177,
              2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,1,232,130,240,50,192,138,208,
              138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,205,117,3,233,46,1,60,43,176,
              8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,24,60,42,117,174,138,197,67,
              60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,254,194,177,0,254,205,116,97,
              138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,46,116,3,233,101,255,177,1,
              67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,195,58,7,117,251,67,58,7,117,
              246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,75,254,194,36,8,117,28,254,
              202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,116,101,81,82,232,2,219,
              90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,75,232,216,210,249,116,17,
              162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,182,0,138,208,139,31,3,218,
              138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,231,239,94,135,222,86,232,28,
              236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,254,205,232,69,0,91,157,116,208,
              81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,3,232,161,236,232,228,233,139,
              30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,177,238,235,244,80,138,198,10,
              192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,68,158,159,68,158,117,8,3,217,
              139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,0,117,103,139,227,137,30,69,
              3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,39,91,116,9,185,177,0,138,
              233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,0,58,193,117,7,185,18,0,
              3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,232,58,7,75,232,109,209,
              116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,242,172,60,32,117,9,66,
              136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,209,176,44,232,175,237,
              235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,83,138,242,232,135,1,116,
              9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,2,115,5,205,172,233,97,201,
              60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,123,115,2,44,32,81,138,232,
              139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,90,10,192,195,10,192,120,
              235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,200,75,89,66,68,255,83,67,
              82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,80,134,196,186,46,0,3,218,
              176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,138,216,183,0,3,218,46,138,
              23,67,46,138,55,135,218,90,94,135,222,86,195,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,216,83,232,140,233,
              138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,196,80,134,196,185,240,4,182,
              11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,88,134,196,158,159,134,196,80,
              134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,255,6,138,198,60,11,116,239,
              60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,246,235,186,138,7,67,254,202,
              195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,3,218,139,31,160,54,5,254,192,
              116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,7,10,192,249,195,75,232,53,207,
              60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,4,195,185,152,20,81,232,28,215,
              138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,1,60,73,116,21,178,2,60,79,116,
              15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,206,232,204,222,232,161,237,44,
              138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,138,7,60,130,178,4,117,89,232,
              165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,237,80,232,95,237,69,232,91,237,
              78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,237,85,232,60,237,84,178,2,235,
              17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,82,138,7,60,35,117,3,232,61,206,
              232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,94,135,222,86,138,194,159,134,
              196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,185,46,0,3,217,136,55,176,0,
              91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,83,176,2,115,3,233,113,253,205,
              224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,7,0,91,195,249,235,3,13,50,192,
              159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,106,236,82,88,158,249,159,80,159,
              80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,5,88,158,159,80,26,192,162,239,4,
              138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,253,205,234,75,232,70,205,178,128,
              249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,236,65,10,192,178,2,159,80,138,194,
              36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,4,138,7,91,36,128,117,3,233,20,221,
              83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,30,233,4,232,198,0,10,192,121,3,233,
              22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,2,0,235,231,232,160,0,60,252,117,3,
              233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,117,3,233,54,26,88,158,205,236,233,
              0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,4,232,171,0,50,192,232,241,252,198,
              7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,232,40,4,232,39,199,67,67,137,30,88,
              3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,135,218,139,30,47,3,135,218,59,218,
              114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,90,91,195,117,30,83,81,80,186,38,67,
              82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,138,7,60,35,117,3,232,218,203,232,
              214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,10,192,120,204,185,40,65,50,192,160,
              223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,239,50,192,162,54,5,232,149,233,139,
              30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,30,233,4,176,6,232,5,0,205,227,233,235,
              195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,202,0,88,134,196,158,94,135,222,86,91,
              233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,232,48,203,232,4,234,36,232,0,234,40,
              83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,11,232,9,203,232,205,251,91,50,192,
              138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,83,232,7,226,135,218,89,88,158,159,
              80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,233,51,226,88,158,139,30,46,0,137,
              30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,2,0,91,195,50,192,136,7,67,254,205,
              117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,194,176,10,115,3,233,18,250,205,230,
              233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,232,223,250,117,3,233,210,194,176,
              14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,178,66,233,242,194,60,35,117,173,
              232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,232,30,214,185,155,22,186,32,44,
              117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,138,240,138,208,80,81,83,232,165,
              254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,44,138,197,117,9,138,245,138,213,
              232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,91,60,10,117,36,138,200,138,194,
              60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,44,176,13,116,15,10,192,116,11,
              58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,232,32,254,114,32,60,32,116,247,
              60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,195,193,91,198,7,0,187,246,1,
              138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,3,232,196,35,88,158,114,3,232,
              196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,116,3,233,158,193,83,81,178,2,
              232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,125,193,254,200,162,96,0,83,
              81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,185,200,90,117,3,176,1,195,
              82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,135,218,3,217,137,30,4,7,135,
              218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,185,11,13,139,30,48,0,135,218,
              139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,42,197,46,50,7,80,187,118,97,
              138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,11,254,205,117,188,181,13,235,
              184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,139,242,
              172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,139,250,170,66,254,201,117,2,
              177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,80,160,100,4,10,192,116,3,233,
              245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,7,60,207,156,117,3,232,152,199,
              232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,5,116,3,187,0,0,159,3,217,209,
              222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,137,30,57,5,135,218,91,195,50,
              192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,49,199,232,140,255,83,232,20,3,
              187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,232,12,199,116,11,232,222,229,
              44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,55,5,138,195,42,193,138,216,
              138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,5,138,195,42,194,138,216,138,
              199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,55,5,94,135,222,86,137,30,55,
              5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,44,232,88,229,66,117,3,233,
              96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,255,115,3,232,175,255,67,
              83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,197,10,193,117,227,91,195,
              81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,82,135,218,232,218,255,91,
              137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,5,139,203,232,183,255,91,195,
              205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,187,241,73,115,3,187,5,74,94,
              135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,94,135,222,86,137,30,249,6,187,
              213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,65,233,32,2,138,198,10,192,208,
              216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,195,139,30,243,6,129,251,0,32,114,
              9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,114,9,129,235,176,31,137,30,243,
              6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,6,243,6,195,138,193,138,14,85,
              0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,138,7,138,22,245,6,34,194,138,
              14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,233,160,245,6,246,208,38,34,
              7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,2,211,226,3,211,177,4,211,
              226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,210,232,162,245,6,177,3,
              211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,160,72,0,199,6,59,5,100,
              0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,198,6,85,0,0,195,60,4,
              115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,248,195,160,85,0,10,192,
              116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,129,250,200,0,114,4,186,
              199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,139,30,243,6,38,138,47,160,
              245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,210,204,115,239,139,30,243,
              6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,6,129,226,7,0,209,233,227,
              171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,142,198,195,232,127,254,3,
              22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,91,195,83,232,39,25,91,
              195,246,128,62,113,0,0,116,3,233,249,4,195,160,41,0,138,208,232,255,210,233,237,4,0,0,0,180,15,205,16,162,72,0,180,40,60,
              2,114,13,180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,
              52,77,137,30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,
              143,2,0,38,199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,
              99,50,190,237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,
              84,104,101,32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,
              114,115,105,111,110,32,67,49,46,49,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,
              255,13,0,50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,
              34,76,80,84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,
              80,30,82,186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,
              160,106,0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,
              106,0,10,192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,
              19,187,52,78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,
              30,107,0,254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,
              137,30,107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,
              0,10,192,116,2,121,160,50,228,140,203,138,30,110,0,58,223,114,4,254,196,36,127,136,38,106,0,10,192,117,136,91,233,119,17,
              30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,
              116,9,70,254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,
              127,79,14,117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,
              44,2,116,4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,
              46,255,183,225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,
              62,73,0,138,30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,
              255,138,232,138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,
              254,193,181,0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,
              21,0,138,62,73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,
              2,205,16,90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,
              16,232,28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,
              117,32,138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,
              82,80,186,0,0,180,0,205,23,138,196,128,228,40,128,252,40,116,13,246,196,8,117,12,168,1,116,13,178,24,235,6,178,27,235,2,178,
              25,233,186,183,88,80,60,13,233,93,15,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,
              254,200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,
              114,2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,114,251,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,
              113,0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,
              232,251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,
              192,86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,
              0,138,62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,
              192,255,117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,
              91,86,177,6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,
              192,60,58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,
              185,1,0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,
              9,254,197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,
              77,205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,
              232,43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,
              10,50,210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,
              249,8,115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,
              128,117,29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,
              41,0,161,72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,
              0,232,110,0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,
              80,235,28,128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,
              128,62,41,0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,
              0,0,137,14,73,0,160,72,0,180,0,205,16,232,189,221,232,201,248,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,
              81,0,128,62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,
              138,221,128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,
              193,128,249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,
              81,232,117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,
              43,218,44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,
              128,229,7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,
              136,46,79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,
              4,60,25,115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,
              114,43,90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,
              10,232,81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,
              131,186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,
              22,86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,
              139,14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,
              255,255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,
              38,140,14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,
              38,143,6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,
              233,116,80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,
              138,62,73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,
              88,10,192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,
              42,201,89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,
              27,201,60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,
              86,114,86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,
              245,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,
              233,154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,
              0,254,192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,
              187,15,0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,
              185,4,0,88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,
              60,149,116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,
              168,1,116,14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,
              80,85,86,87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,
              0,160,69,0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,
              7,186,97,0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,
              63,0,88,160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,
              83,187,70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,
              200,152,138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,
              198,131,250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,
              220,52,247,241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,
              22,102,0,198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,
              89,16,89,16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,
              16,171,91,240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,
              67,136,47,67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,
              89,90,91,195,90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,
              4,138,135,47,0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,
              63,32,117,13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,
              4,116,9,10,192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,
              249,89,91,195,83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,
              203,244,91,131,195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,
              232,165,244,46,138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,
              0,0,136,14,82,5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,
              82,5,233,163,235,232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,
              139,30,233,4,136,143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,
              160,99,0,136,7,233,128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,117,3,233,228,4,60,32,115,1,195,254,
              7,83,232,141,254,91,254,192,116,244,254,200,56,7,233,197,4,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,
              226,251,117,2,178,1,162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,
              32,160,96,0,10,192,116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,
              46,254,246,196,1,117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,
              117,10,232,17,1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,
              83,5,185,17,0,83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,
              11,50,192,162,97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,
              117,13,139,30,233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,
              0,136,7,254,193,116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,
              7,1,195,232,61,253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,
              138,7,198,7,0,10,192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,
              252,58,15,116,3,10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,
              7,232,206,252,198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,
              8,136,14,81,5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,
              254,90,89,91,160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,
              190,83,5,139,140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,
              192,116,14,139,148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,
              88,3,233,128,229,80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,
              232,193,10,192,117,4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,
              50,193,162,167,4,138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,
              131,196,2,233,93,23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,
              203,128,195,198,6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,
              232,49,208,40,232,167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,
              255,54,94,4,203,139,30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,
              38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,
              30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,
              18,17,17,17,16,16,16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,
              3,3,3,3,2,2,2,1,1,1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,
              248,248,247,247,247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,
              239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,
              229,229,229,228,228,228,228,227,227,227,226,226,226,225,225,225,225,224,11,246,121,2,247,218,43,215,112,61,116,58,83,232,
              144,28,156,115,3,232,106,12,11,210,120,15,131,250,39,114,29,157,115,3,232,61,12,91,233,177,21,131,250,218,125,14,131,194,
              38,131,250,218,124,17,232,19,0,186,218,255,232,13,0,157,115,3,232,29,12,91,195,232,31,28,235,243,11,210,156,121,2,247,218,
              185,3,0,211,226,129,194,50,96,135,218,232,37,29,157,120,3,233,236,12,232,236,28,233,212,8,114,9,176,13,144,233,15,251,198,
              7,0,138,7,232,164,249,136,7,195,117,6,176,10,144,232,105,240,88,90,91,157,195,128,62,106,0,0,116,18,30,83,197,30,107,0,128,
              63,0,91,31,117,5,198,6,106,0,0,233,114,175,95,94,233,190,237,117,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,40,21,199,
              6,165,4,0,0,195,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,16,21,199,6,165,4,0,0,195,92,214,237,189,206,254,230,91,95,
              166,180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,
              71,172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,
              204,76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,
              145,0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,
              183,67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,
              201,27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,
              122,23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,
              97,81,89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,
              225,79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,
              195,86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,
              153,118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,
              176,77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,
              90,0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,
              128,150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,
              255,127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,
              117,126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,
              0,0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,
              48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,115,60,60,104,114,75,255,
              54,163,4,255,54,165,4,232,96,16,138,226,128,196,129,116,35,80,246,6,167,4,128,232,67,16,50,228,232,230,17,88,91,90,80,232,
              168,4,187,23,98,232,141,18,91,51,210,138,218,233,50,10,131,196,4,128,38,165,4,128,116,3,233,145,24,50,228,136,38,167,4,233,
              249,17,191,163,4,144,51,192,252,171,199,5,0,129,195,232,175,24,117,3,233,222,164,195,252,171,199,5,0,129,195,233,26,172,205,
              185,128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,
              5,135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,
              192,135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,
              218,112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,
              5,139,216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,
              198,6,251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,
              62,163,4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,
              83,232,25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,
              139,159,2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,
              163,195,135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,
              138,229,138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,
              195,139,193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,
              114,3,186,159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,
              54,200,139,241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,
              120,3,233,131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,
              2,137,30,163,4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,
              136,255,156,138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,
              192,205,202,162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,
              208,208,224,26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,
              3,22,120,250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,
              254,192,195,120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,232,211,249,144,144,144,121,6,
              199,6,165,4,255,255,11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,
              152,3,240,59,245,117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,
              10,192,116,16,152,145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,
              243,139,46,92,3,252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,
              233,58,44,117,229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,
              222,233,5,211,232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,
              116,226,161,165,4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,
              195,246,217,162,167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,57,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,
              4,190,170,4,185,4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,
              233,233,17,173,25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,
              233,244,12,233,141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,
              240,128,54,165,4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,
              134,223,137,30,166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,
              114,18,157,137,54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,233,5,3,144,138,243,50,219,128,233,
              8,246,196,31,116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,
              121,37,42,204,138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,
              254,195,117,26,235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,
              19,195,160,177,4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,
              4,187,164,4,248,232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,
              232,119,19,139,252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,
              249,115,16,185,4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,
              4,128,116,9,255,6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,
              233,122,18,232,87,244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,
              209,214,86,87,43,253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,
              233,165,11,209,210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,
              139,30,163,4,129,251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,
              80,232,36,2,235,20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,
              4,232,139,2,91,90,232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,
              50,192,233,9,0,205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,
              192,117,5,198,6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,
              189,163,97,51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,
              106,75,106,95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,
              175,81,83,87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,67,235,219,233,11,0,232,188,0,233,5,0,50,192,232,
              182,0,157,117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,233,118,244,198,6,85,4,255,232,137,164,139,212,233,227,8,
              10,255,117,5,232,232,16,249,195,160,166,4,10,192,117,8,138,195,246,208,232,228,16,249,195,232,228,255,93,114,20,235,16,83,
              139,31,232,217,255,91,93,114,8,83,87,191,165,4,144,85,195,254,192,44,1,195,246,196,255,138,226,116,3,128,204,32,138,214,233,
              237,252,16,159,128,62,251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,
              214,235,5,60,43,116,1,195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,
              50,246,3,208,235,223,12,1,83,87,117,7,232,28,0,235,5,144,144,232,70,0,95,91,51,246,139,214,232,189,243,67,195,232,88,16,120,
              249,233,111,156,116,49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,
              30,167,4,139,22,163,4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,
              14,0,176,8,162,251,2,51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,
              195,205,209,117,3,233,24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,
              232,138,251,232,203,6,232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,
              5,36,127,162,165,4,186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,
              2,247,219,137,30,163,4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,
              138,222,138,242,138,215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,
              30,177,4,232,218,240,255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,
              44,191,0,0,139,207,139,0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,
              4,71,71,235,219,139,193,83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,
              5,128,14,158,4,32,160,165,4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,
              233,221,7,232,115,14,116,4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,
              139,202,88,247,227,3,200,115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,
              6,166,4,117,3,233,144,7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,
              11,195,83,176,8,114,2,176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,
              89,235,38,4,7,88,121,15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,
              197,176,2,235,4,2,197,181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,
              63,46,116,1,67,157,88,116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,
              254,196,44,10,115,250,4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,
              7,48,254,197,117,248,67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,
              3,137,14,129,4,195,180,5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,
              7,67,137,54,163,4,254,204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,
              139,22,163,4,86,138,198,50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,
              48,117,3,67,226,248,195,232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,
              91,190,171,4,191,159,4,185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,
              176,9,232,46,255,80,176,47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,235,11,117,9,198,7,49,67,198,7,48,235,2,136,7,
              67,88,254,200,117,215,81,190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,
              11,137,30,165,4,137,22,163,4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,
              82,232,94,13,93,176,47,80,88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,
              7,67,88,254,200,117,206,66,66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,
              81,185,7,0,191,159,4,248,252,46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,12,95,152,
              43,248,87,139,208,232,50,239,235,232,187,102,96,232,136,12,232,45,13,115,6,232,230,11,95,79,87,232,176,11,114,31,187,122,
              96,232,142,12,232,88,252,88,44,9,80,187,246,127,232,109,12,232,87,13,118,7,232,185,11,88,254,192,80,88,89,91,10,192,195,88,
              89,91,10,192,195,187,180,4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,
              232,191,242,116,50,189,165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,
              117,112,117,112,121,112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,
              198,7,36,246,196,4,117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,
              117,245,195,187,180,4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,
              221,255,117,8,67,198,7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,
              120,252,232,129,10,121,3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,
              81,232,55,13,139,22,171,4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,
              233,47,10,191,190,37,87,191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,
              10,219,121,38,128,62,166,4,153,114,3,233,237,158,82,83,255,54,163,4,255,54,165,4,232,50,1,91,90,232,90,11,232,61,11,91,90,
              116,3,233,209,158,160,165,4,10,192,121,9,191,196,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,
              232,2,1,90,91,232,42,11,117,28,82,83,51,210,187,0,144,232,30,11,91,90,121,14,157,90,91,235,60,144,51,210,187,0,129,233,18,
              247,157,121,14,83,82,232,47,1,138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,
              176,125,87,83,82,232,21,1,90,91,232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,
              46,178,4,115,7,90,91,83,82,232,222,250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,
              232,130,10,235,214,90,91,195,138,14,166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,
              128,136,135,1,0,198,135,2,0,184,157,156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,
              1,195,81,83,248,232,122,9,91,89,226,246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,
              235,249,91,195,138,14,166,4,128,233,152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,
              152,128,203,128,157,156,121,6,131,234,1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,
              195,157,115,5,50,228,233,169,1,158,121,10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,
              8,126,81,186,0,0,187,0,129,232,190,9,117,9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,
              187,118,97,232,24,2,90,91,232,16,11,232,124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,
              244,187,49,128,186,24,114,233,157,249,233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,
              0,0,137,30,83,4,116,3,232,233,195,137,30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,
              131,195,4,246,135,255,255,128,120,65,185,2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,
              4,185,2,0,243,165,50,192,116,3,232,75,240,95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,
              235,39,131,195,4,139,15,67,67,94,139,20,246,6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,
              232,165,241,91,89,42,197,232,31,241,116,11,137,22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,
              44,117,9,232,85,246,232,66,255,233,147,147,233,168,154,81,83,86,87,82,178,57,187,158,4,191,165,4,190,166,4,235,25,83,185,
              4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,
              234,8,118,21,190,164,4,185,7,0,253,243,164,128,38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,
              6,138,62,166,4,185,4,0,10,219,120,33,117,17,128,239,8,114,23,138,222,138,242,138,212,50,228,226,235,116,11,248,208,212,209,
              210,208,211,254,207,117,222,233,161,6,136,62,166,4,233,131,4,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,
              45,0,187,10,4,235,12,83,232,2,0,91,195,232,31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,
              137,175,176,10,232,132,175,195,252,10,255,190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,
              0,235,9,131,198,4,191,163,4,185,2,0,46,165,226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,
              138,7,152,232,246,8,80,67,46,139,7,163,163,4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,
              232,131,247,91,83,46,139,23,46,139,159,2,0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,
              6,232,47,7,114,9,91,232,35,251,75,198,7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,
              197,42,6,130,4,121,5,246,216,232,194,250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,
              10,194,116,6,232,179,250,232,57,248,143,6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,
              240,2,194,138,200,120,4,50,192,138,200,121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,
              197,121,23,160,130,4,232,90,250,198,7,46,137,30,82,3,67,50,201,138,198,42,197,233,161,9,160,130,4,82,255,54,129,4,42,197,
              42,194,2,193,120,3,232,54,250,232,39,0,255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,
              1,2,194,254,200,120,3,232,15,250,233,91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,
              2,138,200,195,232,254,4,180,7,114,2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,
              156,10,210,116,2,254,202,2,242,157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,
              88,254,196,117,247,232,191,4,232,142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,
              85,6,235,14,187,110,96,138,196,152,3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,
              50,228,246,220,160,130,4,2,224,254,196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,
              130,4,232,94,247,88,10,228,126,5,138,196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,
              114,21,2,196,138,38,130,4,42,196,10,228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,
              196,64,180,3,117,2,50,228,163,131,4,137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,
              8,198,7,45,83,232,226,5,91,67,198,7,48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,
              3,136,47,67,198,7,0,187,179,4,67,139,62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,
              116,226,180,1,75,83,80,232,234,234,50,228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,
              235,3,75,136,7,88,10,228,116,248,131,196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,
              22,129,4,115,11,83,82,232,69,243,50,192,90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,
              254,200,120,6,232,20,248,198,7,0,143,6,129,4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,
              11,0,46,247,38,107,98,139,248,138,202,46,160,109,98,246,38,11,0,2,200,46,160,13,0,46,246,38,107,98,2,200,50,192,46,139,22,
              110,98,3,215,46,138,30,112,98,18,217,162,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,187,251,0,0,
              0,187,179,4,185,32,0,3,7,67,67,226,250,36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,
              4,233,143,251,83,81,187,158,4,129,7,128,0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,
              4,255,117,5,128,38,159,4,254,187,165,4,138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,144,144,144,233,136,251,
              128,228,224,128,196,128,115,28,156,66,117,18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,144,233,106,251,157,117,3,
              128,226,254,86,190,163,4,137,20,70,70,138,62,167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,
              9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,
              4,232,53,4,187,134,4,232,93,4,232,253,1,232,178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,
              4,89,117,4,254,193,235,204,139,233,232,117,4,139,205,195,128,38,165,4,127,232,134,0,232,165,0,198,6,178,4,127,232,163,236,
              232,132,0,235,27,101,237,161,165,4,128,252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,91,0,160,166,4,
              10,192,116,5,128,6,166,4,2,232,97,0,161,177,4,128,252,130,156,246,196,1,117,2,168,64,156,232,73,0,157,116,9,187,50,96,232,
              55,2,232,72,236,128,46,166,4,2,115,3,232,0,1,232,3,241,160,166,4,60,116,115,11,186,219,15,187,73,131,232,142,242,235,6,187,
              52,98,232,198,250,157,117,5,128,54,165,4,128,195,187,99,98,232,0,2,232,8,241,232,199,241,232,6,0,232,8,236,233,25,3,232,173,
              3,232,164,247,232,0,2,232,195,3,195,187,50,96,233,222,1,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,
              4,255,54,165,4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,
              12,191,57,123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,
              4,186,215,179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,
              54,165,4,232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,
              232,87,176,60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,
              4,163,165,4,195,232,120,231,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,
              4,10,192,116,7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,
              97,232,206,0,232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,
              114,7,232,171,0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,
              209,23,67,67,226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,
              187,170,4,138,39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,
              116,15,81,248,232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,
              226,247,195,191,124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,
              191,159,4,235,229,191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,
              89,195,81,83,87,187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,
              233,137,0,232,215,237,83,87,138,195,50,6,165,4,120,60,10,219,120,16,161,165,4,43,195,114,63,117,55,161,163,4,43,194,235,16,
              139,195,43,6,165,4,114,46,117,38,139,194,43,6,163,4,114,36,117,28,50,192,235,74,192,235,71,232,163,237,144,144,139,7,50,6,
              165,4,121,19,138,38,165,4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,
              247,253,167,117,6,226,251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,232,86,237,144,
              144,138,5,50,7,121,2,235,179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,
              195,46,43,150,0,0,46,26,158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,
              8,205,210,128,54,165,4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,
              232,51,0,191,151,4,185,8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,
              185,4,0,232,165,253,114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,
              185,2,0,191,163,4,135,251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,
              253,114,3,233,29,255,233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,
              4,0,235,17,232,57,253,191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,
              114,3,233,180,243,233,27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,
              46,172,136,7,67,66,254,205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,
              224,139,216,75,137,30,44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,
              101,4,162,40,0,187,14,3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,
              30,224,4,160,223,4,254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,
              116,14,135,218,3,217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,
              0,3,218,137,30,228,4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,
              115,3,233,104,173,177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,
              137,30,10,3,135,218,137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,
              229,187,220,127,232,127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,20,232,165,240,51,201,82,255,
              54,129,4,233,104,246,253,255,3,191,201,27,14,182,0,0,54,50,88,48,56,57,48,32,67,79,80,82,46,32,73,66,77,32,49,57,56,54,213,
              224,143,225,32,75,66,32,79,75,13,232,203,25,138,251,232,198,25,138,235,138,207,250,252,176,253,230,33,191,0,5,176,10,230,
              32,186,97,0,176,204,238,176,76,238,74,228,32,36,2,116,250,236,170,66,226,238,234,0,5,0,0,204,204,204,204,204,204,204,250,
              180,213,158,115,74,117,72,123,70,121,68,159,177,5,210,236,115,61,176,64,208,224,113,55,50,228,158,118,50,120,48,122,46,159,
              210,236,114,41,208,228,112,37,184,255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,
              254,115,7,51,199,117,7,248,235,227,11,199,116,1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,137,230,99,176,
              165,230,97,176,1,230,96,140,200,142,208,142,216,252,187,0,0,188,22,224,233,243,23,117,212,176,2,230,96,176,4,230,8,176,84,
              230,67,138,193,230,65,176,64,230,67,128,251,255,116,7,228,65,10,216,226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,
              228,65,34,216,116,3,226,242,244,176,3,230,96,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,80,238,176,1,236,138,224,
              236,59,216,116,1,244,66,249,226,238,115,249,254,192,116,222,142,219,142,195,176,255,230,1,80,230,1,176,88,230,11,176,0,138,
              232,230,8,80,230,10,176,18,230,65,176,65,230,11,80,228,8,36,16,116,1,244,176,66,230,11,176,67,230,11,173,173,173,173,139,
              30,114,4,139,46,150,4,131,253,16,116,2,43,237,185,0,128,43,192,243,171,129,251,52,18,116,22,188,24,224,185,0,128,233,67,11,
              116,11,179,4,230,96,43,201,226,254,147,235,247,137,30,114,4,137,46,150,4,43,237,186,0,16,187,64,0,142,194,43,255,184,85,170,
              38,137,5,252,38,51,5,252,117,17,185,0,32,243,171,129,194,0,4,131,195,16,128,254,160,117,222,137,30,19,4,184,48,0,142,208,
              188,0,1,176,19,230,32,176,8,230,33,176,9,230,33,176,255,230,33,30,185,32,0,43,255,142,199,184,35,255,171,140,200,171,226,
              247,191,64,0,14,31,190,3,255,185,16,0,165,71,71,226,251,31,30,199,6,126,0,0,0,228,98,36,15,138,224,176,173,230,97,144,228,
              98,177,4,210,192,36,240,10,196,42,228,163,16,4,176,153,230,99,232,174,23,128,251,234,117,7,198,6,150,4,16,235,33,128,251,
              170,116,28,128,251,101,117,3,233,212,253,10,219,117,16,176,56,230,97,144,144,228,96,36,255,117,4,254,6,18,4,161,16,4,80,176,
              48,163,16,4,42,228,205,16,176,32,163,16,4,42,228,205,16,88,163,16,4,36,48,117,10,191,64,0,199,5,73,255,233,180,0,60,48,116,
              8,180,1,60,32,117,2,180,3,134,224,80,42,228,205,16,88,80,187,0,176,235,35,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,150,21,186,184,3,185,0,8,176,1,128,252,
              48,116,9,183,184,186,216,3,181,32,254,200,238,129,62,114,4,52,18,142,195,116,7,142,219,232,230,9,117,51,88,80,180,0,205,16,
              184,32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,9,
              43,201,236,34,196,116,19,226,249,51,210,142,218,198,6,21,4,6,186,2,1,232,116,22,235,6,177,3,210,236,117,213,88,180,0,205,
              16,186,0,192,142,218,43,219,139,7,252,252,61,85,170,117,5,232,208,21,235,4,129,194,128,0,129,250,0,200,124,228,31,198,6,21,
              4,5,176,0,230,33,228,33,10,192,117,27,176,255,230,33,228,33,4,1,117,17,162,107,4,251,43,201,226,254,226,254,128,62,107,4,
              0,116,8,190,213,248,232,232,21,250,244,198,6,21,4,2,176,254,230,33,176,16,230,67,185,22,0,138,193,230,64,246,6,107,4,1,117,
              4,226,247,235,217,177,12,176,255,230,64,198,6,107,4,0,176,254,230,33,246,6,107,4,1,117,195,226,247,176,255,230,33,176,54,
              230,67,176,0,230,64,230,64,176,153,230,99,160,16,4,36,1,116,48,128,62,18,4,1,116,41,232,249,21,227,30,176,73,230,97,128,251,
              170,117,21,176,200,230,97,176,72,230,97,43,201,226,254,228,96,60,0,116,9,232,78,21,190,138,233,232,102,21,30,43,192,142,192,
              185,8,0,14,31,190,243,254,191,32,0,165,71,71,226,251,31,199,6,8,0,195,226,199,6,20,0,84,255,199,6,98,0,0,246,128,62,18,4,
              1,117,10,199,6,112,0,18,249,176,254,230,33,186,16,2,184,85,85,238,176,15,236,58,196,117,67,247,208,238,176,15,236,58,196,
              117,57,187,1,0,186,21,2,185,16,0,46,136,7,144,236,58,199,117,33,66,236,58,195,117,27,74,209,227,226,236,185,8,0,176,1,74,
              138,224,238,176,1,236,58,196,117,6,208,224,226,242,235,6,190,229,248,232,220,20,232,117,21,30,129,62,114,0,52,18,117,3,233,
              148,0,184,64,0,232,215,2,139,54,19,0,177,6,211,230,51,255,184,0,12,142,216,199,5,170,85,137,69,2,5,0,4,59,198,114,240,187,
              0,12,184,48,0,142,219,142,195,86,83,80,51,255,50,192,129,61,170,85,117,50,57,93,2,117,45,185,0,32,232,229,7,117,37,88,5,16,
              0,232,143,2,91,94,129,195,0,4,59,222,114,209,176,10,232,99,20,228,8,36,1,117,49,31,198,6,21,0,3,233,115,254,138,232,176,13,
              232,77,20,176,10,232,72,20,88,91,94,140,218,31,30,163,19,0,136,54,21,0,232,140,7,138,197,232,33,20,190,218,248,232,57,20,
              186,0,200,142,218,43,219,139,7,252,252,61,85,170,117,5,232,209,19,235,4,129,194,128,0,129,250,0,240,124,228,31,160,16,0,36,
              1,116,94,186,241,3,236,144,187,255,255,36,248,128,38,143,0,254,60,80,117,5,128,14,143,0,1,228,33,36,191,230,33,180,0,138,
              212,205,19,246,196,255,117,25,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,34,136,22,62,0,232,203,36,115,5,190,
              144,233,235,2,51,246,176,12,186,242,3,238,232,48,38,114,4,11,246,116,6,190,144,233,232,180,19,198,6,107,0,0,190,30,0,137,
              54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,191,120,0,30,7,184,20,20,171,171,184,1,1,171,171,228,33,36,252,230,
              33,131,253,0,116,23,186,2,0,232,168,19,190,105,231,232,148,19,180,0,205,22,128,252,59,117,247,235,13,128,62,18,0,1,116,6,
              186,1,0,232,138,19,160,16,0,36,1,117,3,233,55,250,42,228,160,73,0,205,16,189,111,249,190,0,0,46,139,86,0,176,170,238,30,236,
              31,60,170,117,5,137,84,8,70,70,69,69,129,253,117,249,117,229,187,0,0,186,250,3,236,168,248,117,6,199,7,248,3,67,67,186,250,
              2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,144,144,144,168,15,117,5,128,14,17,
              0,16,228,97,12,48,230,97,36,207,230,97,176,128,230,160,205,25,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,251,43,192,142,216,199,6,120,0,199,239,140,14,122,0,185,4,0,81,
              180,0,205,19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,4,226,229,205,24,234,0,124,0,0,204,204,204,23,
              4,0,3,128,1,192,0,96,0,48,0,24,0,12,0,233,40,44,8,0,251,0,2,144,0,0,0,0,82,80,140,218,38,136,54,21,0,129,250,0,200,124,12,
              232,101,5,190,224,248,232,23,18,88,90,195,186,2,1,232,61,18,235,245,69,82,82,79,82,46,32,40,82,69,83,85,77,69,32,61,32,34,
              70,49,34,32,75,69,89,41,13,10,80,187,10,0,185,3,0,51,210,247,243,128,202,48,82,226,246,185,3,0,88,232,203,17,226,250,185,
              7,0,190,26,224,46,138,4,70,232,188,17,226,247,88,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,48,36,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,248,35,32,51,48,49,13,10,54,48,49,13,
              10,251,128,252,12,245,114,23,30,232,113,16,86,138,196,152,3,192,139,240,250,46,255,148,182,233,251,180,0,94,31,202,2,0,206,
              233,223,233,237,233,237,233,237,233,237,233,237,233,237,233,237,233,237,233,239,233,244,233,160,112,0,198,6,112,0,0,139,14,
              110,0,139,22,108,0,195,137,22,108,0,137,14,110,0,198,6,112,0,0,195,249,195,139,14,206,0,195,137,14,206,0,195,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,6,20,156,250,176,182,230,67,144,138,193,230,66,144,138,
              197,230,66,228,97,138,224,12,3,230,97,157,185,11,4,232,37,0,254,203,117,246,156,250,228,97,12,252,34,224,138,196,36,252,230,
              97,157,185,11,4,232,12,0,156,250,228,97,36,3,10,196,230,97,157,195,80,209,233,131,209,0,227,19,230,12,156,250,228,0,36,254,
              58,224,138,224,228,0,116,244,157,226,239,88,195,138,198,232,149,12,138,194,232,144,12,176,48,232,156,12,176,32,232,151,12,
              195,139,217,252,43,255,180,255,136,37,138,5,50,196,117,127,254,204,117,244,184,170,85,139,208,243,171,228,97,12,48,230,97,
              144,36,207,230,97,79,79,253,139,247,139,203,173,51,194,117,87,184,85,170,171,226,245,252,71,71,139,247,139,203,139,208,173,
              51,194,117,67,72,72,171,226,246,79,79,253,139,247,139,203,139,208,173,51,194,117,48,184,1,2,171,226,245,252,71,71,139,247,
              139,203,139,208,173,51,194,171,225,250,117,25,79,79,253,139,247,139,203,139,208,173,51,194,225,251,117,9,228,98,36,192,176,
              0,235,7,144,60,0,117,2,10,196,252,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,233,116,28,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,223,2,37,2,9,42,255,80,246,15,8,39,128,223,2,37,2,
              9,42,255,80,246,15,8,39,64,223,2,37,2,15,27,255,84,246,15,8,79,0,223,2,37,2,9,42,255,80,246,15,8,79,128,223,2,37,2,9,42,255,
              80,246,15,8,79,128,175,2,37,2,18,27,255,108,246,15,8,79,0,207,2,37,2,8,42,255,80,246,25,4,233,9,35,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,165,20,140,21,173,21,213,21,203,27,236,21,85,22,243,22,69,23,162,23,212,
              23,14,22,150,24,133,24,68,27,52,22,233,6,36,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,
              45,10,127,6,100,112,2,1,6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,
              44,40,45,41,42,46,30,41,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,251,30,232,203,1,161,19,0,31,207,204,204,251,30,232,191,1,161,16,0,31,207,204,204,233,19,36,80,
              228,98,168,192,117,2,88,207,80,51,192,230,160,232,164,1,160,73,0,205,16,88,190,235,248,168,128,116,5,80,232,24,1,88,190,251,
              248,168,64,116,3,232,13,1,228,97,12,48,230,97,36,207,230,97,252,43,210,228,98,168,192,117,31,139,30,19,0,142,218,43,246,185,
              8,0,243,173,228,98,168,192,117,20,66,247,194,255,15,117,234,131,235,64,119,229,190,11,249,232,213,0,250,244,232,247,243,250,
              244,185,0,0,50,192,2,7,67,226,251,10,192,195,49,48,49,13,10,32,50,48,49,13,10,82,79,77,13,10,49,56,48,49,13,10,80,65,82,73,
              84,89,32,67,72,69,67,75,32,49,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,63,63,63,63,63,13,10,251,80,228,97,52,
              64,230,97,176,32,230,32,88,207,184,64,0,142,192,42,228,138,71,2,177,9,211,224,139,200,81,185,4,0,211,232,3,208,89,232,143,
              255,116,5,232,5,238,235,19,82,38,199,6,103,0,3,0,38,140,30,105,0,38,255,30,103,0,90,195,80,177,4,210,232,232,3,0,88,36,15,
              4,144,39,20,64,39,180,14,183,0,205,16,195,188,3,120,3,120,2,139,238,232,28,0,30,232,147,0,160,16,0,36,1,117,15,250,176,137,
              230,99,176,133,230,97,160,21,0,230,96,244,31,195,46,138,4,70,80,232,202,255,88,60,10,117,243,195,156,250,10,246,116,30,179,
              112,185,0,5,232,170,242,185,51,194,232,232,242,254,206,117,238,30,232,81,0,128,62,18,0,1,31,116,189,179,18,185,184,4,232,
              140,242,185,120,129,232,202,242,254,202,117,238,185,120,129,232,192,242,157,195,176,8,230,97,185,86,41,226,254,176,200,230,
              97,176,72,230,97,176,253,230,33,198,6,107,4,0,251,43,201,246,6,107,4,2,117,2,226,247,228,96,138,216,176,200,230,97,195,46,
              142,30,23,250,195,64,0,251,30,80,82,184,64,0,142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,
              0,117,17,43,192,163,110,0,163,108,0,198,6,112,0,1,255,6,206,0,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,
              28,250,176,32,230,32,90,88,31,207,204,204,204,204,204,204,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,
              195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,
              124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,
              204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,
              90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,
              219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,
              24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,
              126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,
              108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,
              96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,
              0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,
              204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,
              48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,
              48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,
              204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,
              0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,
              12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,
              198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,
              0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,
              198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,
              96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,
              12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,
              0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,
              204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,
              120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,
              0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,
              198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,
              224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,233,36,235,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,233,113,251,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
              204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,165,254,135,233,35,255,35,255,35,
              255,35,255,87,239,35,255,101,240,77,248,65,248,89,236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,73,255,73,255,164,
              240,199,239,0,0,30,232,234,250,80,176,11,230,32,144,228,32,138,224,10,196,117,4,180,255,235,10,228,33,10,196,230,33,176,32,
              230,32,136,38,107,0,88,31,207,204,204,204,204,204,204,204,204,204,207,30,232,185,250,128,62,0,1,1,116,124,198,6,0,1,1,251,
              80,83,81,82,180,15,205,16,138,204,138,46,132,0,254,197,51,210,180,2,205,23,128,244,128,246,196,160,117,78,232,87,0,81,180,
              3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,41,117,34,254,194,
              58,202,117,223,50,210,138,226,82,232,37,0,90,254,198,58,238,117,208,90,180,2,205,16,250,198,6,0,1,0,235,11,90,180,2,205,16,
              250,198,6,0,1,255,90,89,91,88,31,207,51,210,184,13,0,205,23,184,10,0,205,23,195,204,204,204,204,204,204,234,91,224,0,240,
              48,53,47,48,57,47,56,54,204,251,18] 
              
          • 5170
            • 1984-01-10.json
              {"data":[
              825308726,825309240,842149936,538982712,1330594627,1381126224,538979886,1111640393,538987853,960049457,875837496,-388123398,-1070906528,146391182,-1105261056,549453555,
              1195877632,-1070859294,146391182,-1105261056,-1061159133,1195877633,-1070859294,-1064380274,526023,113763011,-11272172,6424263,1622210048,-1341944088,-396302839,-125173729,
              -1979704600,-53507352,-469434177,1946265700,-1436490502,-203259674,327914,-1469783040,-453320447,-1258634400,712220373,645605493,-1314970503,1944900101,-801066979,840397280,
              309763812,242880632,-771378785,-804818196,-352096028,-739667964,4241408,1692719246,58000552,-1342137623,-344922481,-2039356416,167542980,-1070973836,296808934,15409382,
              568723632,78643435,15409638,568721840,-5242645,296755686,15442150,-1578733392,15401648,15442406,-1578761808,-5242645,-1884249626,15429862,1910947882,171761798,
              1488858231,66061057,478883568,3193082,12374158,-469763327,162529646,290066839,24188571,295309756,1112672247,300614013,-1469782896,-469601279,-434065312,1731133216,
              -436097024,-18304,-1910410247,-1898214184,-1899918141,-1949135663,-1947431966,1946061813,1975988999,-471074809,24430347,-427052812,-469701776,-2134604175,-1951397916,-997822234,
              1910898923,-1934622485,15429862,1085829604,-2116514304,872444478,705393682,64535232,-1295974674,-55513416,45113830,163152102,-1342065664,-1972312433,-436147260,-342904719,
              -344922624,980542464,-794724924,-1327177004,-1937709565,-1898934584,48088,-371171652,24384651,4241652,78698638,149324006,378261734,1420820594,15418342,1105641866,
              1085277623,1139146987,1962933120,172090379,-17833256,-185895473,-2132408912,-919878774,95896038,1085276395,15418342,1105461483,125098018,-805376286,-1191908747,-661782464,
              -2132408656,7476873,-5239322,-125118326,-1174402887,-336723968,28372480,-336854805,-320828928,24434747,-354270476,-596328194,1951792000,-1426358263,1437599860,-1431253269,
              129026795,-622427930,-661979216,146405514,12630528,-301929490,15401392,-1979651092,-667161376,-2081160844,-387841342,-629882626,1951792000,-1426358263,1437599860,-1431253781,
              512477419,279117938,-434982912,-423613887,-1328486904,-1341397440,-338237760,-431902720,-338237941,-431837184,-338237941,-431771648,-1982405109,-1342148066,713090568,8501952,
              -301924423,-2118058430,1962971130,-18839818,-1070970164,1975794412,1254948400,8452737,-989925259,-605895542,-1883583312,-287274496,988594218,-2146273852,74829052,-353684560,
              1946221696,-339727867,162591969,-919895834,279470564,-243991839,1642383659,-85978968,179365749,-919895834,-527801116,1946273014,-161422334,-253754684,-1326186124,-1333729781,
              -530400086,-1466941461,-469601279,-530269088,-460308501,-1336591264,1971381772,-1128222499,569106536,-529875824,-460314645,-1333598624,-530138016,1955598315,-435310587,1571878016,
              518742246,1692859024,1692715307,-85982552,-1278661693,-1469783034,-502893311,1976303352,246465524,1085833446,-1948742144,-67079650,729809081,737553407,-1898410304,888897984,
              -385649390,263192992,-2135916314,1622968294,357100000,58054795,-1979607319,-1971198265,-1182603581,-644956160,126606123,1430061291,-2129890134,-2130673471,2093482233,1976116201,
              15722755,704895162,-1195708736,-301879293,-1157305725,280621268,-1964756480,-29167932,126496452,-498449426,-2132636942,-58658588,-1157073712,-725946204,870050563,-1342129921,
              12173454,119584776,-13390861,-1900543813,536918467,-1195725837,-299257853,-298799038,-1341925190,-1337790936,-930288080,12308622,-1327788368,440624,92864299,-85833913,
              1958281088,-1208014068,-1211920720,-337932616,-2011123486,92808709,-2115745977,-388889423,-351936836,-2115727330,-524546268,-1877677307,78742244,-490936110,-1878463739,254051044,
              67495100,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,
              -13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,
              -13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,86414827,87819568,-1410136751,-1912586056,1914603992,4241408,12376206,-1126920704,296779776,
              -2098954010,312668196,-423613952,-536801406,1962938281,-434982857,-1090052480,62509216,-1431652352,-1207949080,585651541,-390059264,-315949027,-1453810435,276103680,1946419369,
              1486683147,1963196585,-1874924797,-1174541324,-1410138109,651206845,6160655,651206845,5636367,651731133,5112079,651732413,4587791,-1949261633,375045,651731134,
              -931855301,-136165818,-423613757,-435048207,-1342117088,-350099960,-435900416,-1342117087,-350099967,-419450880,-434917343,-435048320,-1342116960,-1331566992,-436147454,-1342116959,
              -341711359,-419450880,-434851679,7911808,-946929877,-1424489032,-492058484,-434786057,4243328,-661905650,-1174469698,1201995792,-386145721,380637447,-1917812506,15429862,
              -2136444444,-1901064332,15429862,-2136444444,-1930878604,-434655232,-426856320,-469701776,-2134604175,-1901035316,-997822234,1910898923,-1332711445,-344922482,-344857600,-1329297920,
              -2123307378,872444478,-2046331630,-351263520,-1070952445,-617909786,-1867396821,-1047875915,15429862,-466980380,-1040263149,-294262470,376757003,1894166192,1910767851,-1347362678,
              15429862,-1019514396,-1901062284,15429862,-997821980,-1337930624,-344922482,-423328256,-434589583,207742080,-436147444,-434524063,-426790784,-1342117008,-1133386239,-728891392,
              -394264388,447747924,146309350,-942109184,23046,1543947776,1488846848,-1126789632,17825789,109024,-1884286859,15429862,1910900912,-200321559,113769963,-65464,
              5048006,1275512467,113705216,74,-2132403280,-1207942981,-1064435640,1946163688,9693443,-29310077,-2147464186,167791678,1458103669,8382720,1438187307,650677162,
              263193993,637897510,-1053620855,-1205977739,-661782504,7487105,1964970548,96937510,1642332417,202113259,15426022,1642525476,1358954424,93005400,-1071357468,378662,
              721974528,-2147436096,-1664898061,-2132403024,1894167472,1910767851,-997818356,1894167472,-75381626,41353728,1910931236,-1912596296,320768472,-1195139840,-661782520,4982470,
              1241958160,-1342177280,729867805,4765915,434684046,-352095232,-1014787979,1275526720,1279164416,-445252096,-352302872,-13922207,-1951771208,92874440,-1960439888,92874245,
              796246323,1619998,1048696974,305397874,639137055,16844231,1358954424,93005400,1084776932,378662,721974528,-2147436096,-1329353741,-1333729762,-344922448,-423392768,
              -1342117007,-344922447,-423130624,531678065,113672422,-1174405044,770244607,-959304960,134237190,-973069336,268454918,-973071384,536890374,-973073432,1073761286,-973075480,
              -2147464186,-352320536,-13922272,-1912584008,361309888,4982470,4765696,-2128166770,1962934077,-29169405,-434065213,228387200,-2132401744,-1912590148,16825556,-1912586056,
              -426856232,-469701776,1958783089,-1871189245,-1901010806,-997822234,1910955812,15439024,15429862,-527797788,779432104,1946160360,302446154,2054430720,-1181725461,508608512,
              -617883250,1025443723,1951967829,-2134802164,16351488,602373320,-555170871,-1977125633,302446276,192167936,809250852,-997582731,613419499,-1976550352,-1475644220,-164399871,
              536875526,-1901056908,15429862,-1062702620,-997847435,1894158000,-997850901,1910906892,-1325426456,-167021567,1073746438,41161136,116797872,1965031442,708715522,1090532,
              7487105,745804340,2028495024,-431116039,-389469344,-4589196,-1469782913,-1661279999,1625861552,208969209,1923244260,1969568768,-176625405,1342181537,279130288,-840685056,
              -1558138864,-467009520,28840141,1477496064,603984035,504526128,-1900008624,4243416,-11336249,2145984344,1949318144,1019543048,-1274907360,1356891651,281928746,12275800,
              62438064,-1341652807,821854209,-1195964044,-1258039110,-288817632,-611400818,2078853585,-1334872818,1484842530,-855591856,1881192464,683278123,1487663872,821854288,1946401466,
              64666115,-919926604,1975788268,-335945212,-322360511,91538466,921434594,-771509872,1491301868,281870516,-1329594182,-1904155101,-1948570662,1029395207,91597397,-351579672,
              -2134736636,16417024,-1327465272,-377428444,1760034989,352765452,1048579072,1952710770,302446093,108273664,-402586950,-1591866420,807665680,829698108,1377990,62437901,
              -1142029904,-611405824,732583352,-351827493,1023904512,1965009493,269386070,-1593823232,-467009520,904597709,704753808,-1173303836,11535320,-1207911442,1438178190,-1982125142,
              -1962874105,-1437254393,-2128317153,-822079450,269386239,-1342173184,-840685055,279009296,1009787904,1958750768,1354825218,520041705,-661733333,-956284737,536826629,-1325454871,
              181790730,-99895576,568721584,15442406,-527818268,-536174108,632302709,-5209882,-1578753562,568590571,-1578835830,1962934533,7053845,-2132400464,-490132485,-2130779394,
              27454,113642868,-1106968555,-1024925588,-1326122486,-1199512025,-2098746795,-997817628,-2082209557,1951771197,-490291707,-1070931733,263225574,-4624154,-1325473280,-462362993,
              1958742656,-433541111,-488653184,699449579,1642365158,15458442,1642527780,1139191984,1438122219,-347937110,-423327232,-469701822,-337607102,1027793920,91510186,-337446722,
              -433409907,-21955968,279978470,750339046,-1979651328,-79632703,7014134,-502434559,352765687,-2051145216,-10294816,-2132399184,-1341345286,-968825089,27398,568786608,
              1795618555,-562757376,-919865374,-2132398928,7014134,-502762239,-526467337,-83939351,568786864,1139160752,11534571,15417574,-919912218,-2132398672,44590308,-119404428,
              -371142466,1961426696,-433082358,1916699008,1964127232,67102979,-2132397904,1894158256,15401648,12349926,-1126920704,1776844800,-432951279,571520,-953761650,23046,
              113649152,-1107296164,-695336872,-1191182916,-661782504,-2014936912,1342193848,-1342068759,-344922482,1349641216,1894166960,1910767851,-1330585466,15429862,512455140,-670892013,
              1515145,1958783064,10610947,1894160048,1910767851,-1783570298,15429862,104428004,477364243,-426856368,-469701776,-2045768591,-426856252,-339442064,1483859456,1246777,
              -661951625,1912734013,-424431594,-469701776,-2038428559,-424431420,-339442064,-1334712832,-344922472,-2039356416,-426266400,-469701776,-1329034383,-344922447,-2039356416,-424628000,
              -469701776,1959279473,-1901047784,15429862,269251044,-1901017978,-997822234,1910898923,2009611096,63474434,387877337,1089176320,-338491727,571475,-953761650,-16758778,
              113649407,647168077,4982470,113714688,74,1611056934,654311168,6620870,113649299,637534308,6424263,-1070989312,-2031712794,-2065252098,-1912600392,1678180056,
              1275526656,1681817600,309462016,1619998,312531086,279453440,1085277301,-1280276506,15429862,1048605156,1913127012,-1329297912,-2037914048,1954588868,1681817610,343214592,
              -2138044181,134243390,113642101,-972029852,268454918,-436181856,1279164548,58064384,-1198496021,-661782432,-1912584008,-432951104,-2147436160,1946822120,21031171,-13936551,
              4195755,-1152364208,96010250,872360704,-2131494958,-497930038,375286,125888600,-1174805945,1572732934,76164833,124840006,1492574791,1962950717,-31201021,65165401,
              1351616235,-13571759,1342193848,-1912596296,387877848,1089176320,-338491727,571475,-970538866,25606,1644611366,704643072,-427432256,-436096890,-432820092,109061760,
              -1342111644,-344922445,-1468931072,638284928,6569600,-350915318,-2144956407,134243390,-970585483,268461062,-2014953296,6594598,-2144959258,-33528770,2045444981,6338704,
              -13903730,-796195445,-1070860405,-919927415,1482292962,-1036299952,1618330251,1074092121,1347506176,-1191179589,-13959163,-201862605,1378929280,96073442,-1545054208,-102611194,
              -1107294535,-1976639139,-1813494268,-152942842,-497526440,-2037783013,-460659004,-2034228127,579331268,-2037717792,1971971268,-1878594801,1156141392,-432754433,110160256,-997555482,
              -2082078485,-2031696245,15458438,-164919834,207742123,-436147444,-336386975,-1201543680,-661782504,1894158000,1910767851,-1280255862,15429862,-125144604,-930391975,1912733757,
              41958713,-940174990,755398016,267059712,41954704,-158332437,511017159,-1962803155,-424562488,-339375504,-1334712832,-436147280,-339637648,-344857088,329486340,-426790912,
              -352079760,-378411520,1085801986,-958886400,5638,1445504,-401756159,179307963,-469387544,94431364,-1679260188,-393812987,548406678,-469392664,93120643,-2014805276,
              1015079941,-516440525,482216564,1949449441,-521552381,-385499928,1625819795,1015079942,-485376459,-1212281228,370049248,-1561853440,-1878398203,-2147115800,67114510,721829608,
              1549248,-1174401351,-1070989182,-85835026,-2132396624,1181430,-385649376,1048576178,1969487986,11069699,-2132396368,1916699130,1947350016,1916698647,276081152,82357936,
              -402343950,74838539,-143273986,-186077776,-1335827215,-236066592,-453904664,1946265696,370049035,1321076736,-1872565277,-486169624,-432558040,-1426358144,951066485,-1364164378,
              737264360,-453057847,1946265700,-432426941,-396303232,770376882,-1414464880,-919903002,1692665271,-85917272,-805434763,-71371659,-1877283871,3956964,243272564,-1106247658,
              166453755,-507330928,1445504,79947808,-2132395344,568786864,-396316422,1169224039,-575381274,724626408,-1178562880,521011208,-1073810498,1201995808,737927751,-1178562880,
              521011208,-1073798210,1201996224,737927751,-942108992,-1023408122,335988706,-939568128,25094,25214966,-956297543,-2097151995,-136183097,68290294,-955615968,-1191174138,
              -419516394,-186057951,1916698884,1964127232,16759054,-1341917510,-18682364,-1326530518,-1333729732,66566658,268891886,1333002496,1181430,-465013728,604039969,-1272846657,
              -841709056,-3869165,-222681995,-300109821,213043499,-889258270,-768345483,378012085,1558708286,-1257803247,290842658,243272563,-1103101930,-622271969,-1173573629,-957479950,
              27398,-1996480834,-1996481994,-1996481482,-2097119178,914956486,2025783426,-1207493120,-1414851564,-1425997384,606201003,-436147202,302446113,58007552,-1342120727,-344922482,
              611443712,-1474923296,-499859840,-2098723212,-1872565501,-387818050,1508574073,721662864,-427118391,-469701776,1971366001,-17636827,-1091799605,1525211782,-426856445,-339442064,
              208790528,-423328252,-339442064,-344857088,1488556050,-427118590,-469701776,-528439183,-1328487436,-344922482,-1468931072,-1106873328,518578986,356417539,-54653952,-2146798368,
              218109246,213780085,50850017,-919924813,-335415366,225738920,-872482334,203748725,871045748,32815760,-336702032,1430055936,-1431296651,-335483922,460696124,9373382,
              -432164863,328132736,-2147257624,37182,243271028,-1337982960,-1333729730,-344922482,-1468931072,-1341164096,-344922478,1014096896,-402426880,-1325722588,-394205637,179307327,
              704796392,-338499904,-1160452608,-628176896,126606123,1430084435,-402229846,99287538,-2134736496,16417024,-387744544,1692664591,57937956,-2138043157,-2147478002,-387852354,
              -1396768175,48866,-1340765394,15462058,1008725022,-1996065366,1174407316,-2126035130,1977791231,48099,-335283526,141949096,34759,1128465400,-335349062,141949096,
              34759,1128465144,61982347,-1022703406,721424802,1549248,-47963676,568721643,1377990,16614144,1048591732,1969487986,352765448,803973632,178832,-469632024,
              -1106238364,158720395,-387866178,-1950481954,30992609,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-169278603,1916698858,108291072,-402652742,-467009092,
              -855619168,32815376,735092927,650153664,-947714679,-386342398,817375573,-1127182848,1085276416,1738637542,-1070903296,-620730461,-641715229,1610639166,1730576737,-2128658688,
              1056991038,-1692109565,6766301,116875616,-1195442073,-1578887819,15458084,568631782,15465252,243278310,1476526096,-2147457117,1677750846,1676346229,614589584,-436147203,
              -431902559,-424824704,1913046640,12058624,734039776,93005567,1430084435,-1993958230,207741957,-436147444,-336386975,-1654528512,102639989,-388289761,1964965939,-433213410,
              -345906064,-420273152,1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363091,604040033,-1335761165,-847190461,852044569,1124532928,-1073021982,-464454717,-153056640,
              -2143279920,-1005928476,548438246,-816307994,-1912586056,-1964758336,162595399,-930357037,309585,-805050157,-3938215,149423732,-1877677308,113714770,196711,1763609638,
              520037888,-1017511833,-771444400,256232,68101208,1075062672,-1223773145,-1022309120,549147422,-388264448,683343899,-388264448,817561619,-388264448,951779339,-388264448,
              526057475,-942581821,-1017182840,1692860080,-1946293260,1370350,10610718,603984032,-100174591,-436202080,-1021315968,1174702638,-5904304,1963605080,-90389517,8251422,
              343209482,568854195,-16850432,-2131397170,16781886,-873790859,233308595,-16850432,-487230006,536797950,-1229929571,15418342,-435866696,-1979651262,-465377596,-337606047,
              -436007936,-490132639,1976303358,-423326982,-5192863,-486322456,1979333667,-419581921,1795606049,-1275396096,-154588406,33581830,-136182155,-210383874,-662019868,1085821123,
              1490587136,1347559107,-923565,551947184,-460324629,182487584,-1274776124,-1339364353,-341776885,-1969167360,1962871544,178381838,-436147257,-350179167,-459217408,167832353,
              -350099772,-434065408,1797687328,1515739904,844156703,-1326389568,-425662944,47011872,548425935,-849829658,-963981558,-1963025944,-23795518,-1595395920,-400510722,-1329332581,
              13822352,-840330832,-376262656,-1817182008,-1342127127,12511636,4765702,-13909874,378662,1170679296,125828866,-1511418448,-376000512,-1750073184,-1342137367,9890200,
              -1846961744,-375738368,-1682964340,-1342142487,8579484,2129370544,-341921648,-1615818631,-1332710165,-1871713376,1793827248,-341659504,-1565487003,-1332715285,-1873024093,1458283696,
              -341462896,-1498378159,-1332720405,-1874334809,1122740400,-341200752,-1431269315,-1332725525,-1875645525,787197104,-340938608,-1364160471,-1332730645,-1876956241,451653808,-340676464,
              -1297051627,-1332735765,-1878266957,116110512,-340414320,-2132373503,578268732,146296862,-942109184,-16758778,1292289791,1220055808,1489014272,1364810271,1967192451,-528068095,
              -1002796060,-2132537740,24263484,-421493041,-101976960,-1947811798,-822017864,1642387851,202113259,15426022,1642525476,-1191181894,-13959152,-1031014869,-1376375893,57983539,
              -788488471,736879330,737553407,-16729408,114603,738133446,856001535,-385649470,-13959041,-4538325,-13915392,738133446,856001535,-429230654,-339442039,-460659200,
              -2034228127,579331268,-2037717792,1971971268,-1437222320,-164888789,-1031025781,-880038925,867038763,-499485246,-2037782791,-436147260,610395274,-456882496,-455073145,-456882550,
              589198729,-2128972590,1951771386,33194255,-1173392383,-1125427798,-1192504789,-352255558,-13909069,-372126837,-1420470856,-1414878536,-164890910,-372126837,1431647661,900588405,
              -579491158,-1981353246,15451270,1642367718,-997801948,-534607900,-2132397392,-997815580,-1116370460,-880017621,-1207768701,732692479,-1196690496,732692479,-2083812362,900530921,
              846594047,13741,-119395211,-51795,-13949835,-82005,-2037782869,-436147260,610395274,-456882496,-455073145,-456882550,-385649271,1760165739,1342591743,-1912586056,
              -1940891456,914892506,-92209131,226281472,-1090693144,988340562,1510430972,16956099,-335783960,736134900,-1469782839,-470097918,-421493196,-456578208,-1461679516,-469601279,
              46462560,494268896,-919927117,27813092,141949665,-193606658,166446078,-18691797,-377265948,-1070873855,113760398,-272170888,7999116,-1157562183,126450688,-503135357,
              79297529,11817216,259134413,721551800,-1144877358,28933120,1494469888,-58717581,-500992896,-1876956192,2080390787,-1082756096,179928064,2080416000,990037891,1962533125,
              2080434788,1152385024,820543718,-1895368964,12058880,1960349184,613331010,-344922497,-1468931072,724858120,-841864256,243987,8436305,721551800,-1144811813,28933120,
              1494469888,1048643698,-1437237762,-1169050764,-1070923648,1918440397,-1328160248,-847190459,-336862696,-479019274,-335861528,-70391554,-2132348752,1894158256,15402928,12349926,
              -1126920704,-773292032,571394,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,44558595,-2132348496,-1947816016,-919920435,-1071477788,
              57998048,-1342009111,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,4765696,-13909874,721783590,579593417,1962598592,39577859,-2132347984,
              251689151,-1070868736,633339919,2017263864,-1088719616,983144,264252383,-131741696,6831360,-1661138827,33597784,652804980,67152130,518587253,1486683138,1946419369,
              34859267,-2132347728,-1912584008,654257088,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-420936843,654256897,1072694727,638582968,-919927454,
              3967972,57998048,-1342059287,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342068503,-1199511819,-661979135,1103858499,-1958555253,
              -141867014,-292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025602909,477429761,1963129731,66683671,-92073355,-2096270076,141886975,1963392643,-1878725885,
              -1342090007,-947853578,-16758778,1275512575,113704960,-268435382,-1912584008,999104,-958564888,-1862251258,-1912584008,999104,-1194494744,255721544,-998907904,-1947820624,
              -970525141,-919928828,-1071477788,-1334445344,5048006,-419975021,4765824,218128571,-1016922109,-478111115,66813955,1622905461,4765696,1661193088,-2138737469,-75496477,
              -1339067133,-964630792,-218084090,721438907,-1023275072,-58712971,-1340639757,-947853575,-1442822138,1292289706,1220055808,-670888192,-1561787532,-1426358016,1208403882,-1202367232,
              51314760,-2115275304,1968526843,-419778331,571520,113760398,-65464,5048006,1275512467,113711872,74,-1912584008,654257088,-1437268537,4851399,1220050944,
              650153472,-1437268537,4982470,1241958170,-1207959552,-1064435640,1426442022,2145194,93051790,-1912592197,-1189245989,-645005264,-1336930933,1484842549,1957319997,1442545946,
              -2129365846,1957320185,-432754674,-426790784,-351883152,-378411520,1442510898,-2132377168,-1962879256,134265071,-794773333,47275,17770155,-41222050,-388456257,-276102990,
              -1426028360,-1411866440,-1426063176,1442909990,-1409447168,1576897451,251658680,1676341249,-1342160865,-1014962555,0,0,-660602744,37632,-794818560,37632,
              67109632,37632,4096,37643,-2147467264,37643,65535,37642,65535,37644,65535,39695,65535,37632,65535,37632,
              65535,37632,65535,37632,-1073739776,33024,533727232,37632,-805306232,57856,534773896,37632,-1189123906,-1510801340,543145667,-661731188,
              735092927,-1145008448,-2018115520,548995250,-1014258432,-1413313621,-1426063176,-524684318,547339520,-1515850357,-119362651,-1610168538,639185873,-777517369,-953804488,1037152262,
              113714713,423809464,-1073297626,639190993,-775420217,-953804468,1372704774,2144322329,-1994882024,-1827107304,-1323788264,-1156008424,-988233704,-820458984,-652684264,-484909544,
              -317134824,-149360104,18414616,186189337,353964057,521738777,689513497,1578708505,16416,1364458374,1431787038,-1091794094,-561119168,1979841664,33193999,113642102,
              -1107230655,1240137728,15067216,-2133423266,1031143934,9373430,-2143915007,829625854,838882955,-1965389057,167788838,-1974700572,-167735129,343216324,-511652726,63012871,
              184083584,281837793,9480072,9603014,310016,-397355381,646447885,-2141716416,91559422,-336011130,1093044744,33325056,1599953653,1532567390,-2147482934,100679998,
              -1484106636,-461373296,66879495,-989938061,1963195520,-1979665406,-2147446097,-331741211,-1349892236,-976224112,-444545584,-2133983741,41287677,-842005835,-58667568,-2147257087,
              -452321075,9480072,-1962912117,1586170446,-372864244,1452015410,84797440,1810432885,1090963199,1676247040,-1870149889,1542029312,33325311,116815478,1946222735,368869393,
              1397779059,-521645487,-385059836,1397753017,-722972079,-1974342908,167809159,-1341753920,-1870165888,1969306624,172919582,1915288960,-1870150122,45089280,9615242,326497802,
              9603014,-1978864799,167809687,-2012973614,-1979673977,973114126,-1576176447,-1060110197,52740304,-301729862,1482381658,645984394,176095295,-29854492,-965315380,16646,
              1853148414,58051838,-33514775,-26446644,-2140375860,58003692,-33234199,-385649204,-855767927,1240007541,1090962949,-1161625344,-1594227726,1059323967,-1059978063,-957478900,
              15878,4261574,201386752,-386142716,1117782829,1958755328,1091469318,-1262280704,31713283,-402652741,62587261,24635392,1185989571,-1274890008,-1338577946,-2131367102,
              -2147467506,-1494725968,-347229182,506660,-1157540632,1323827209,1030913,-1157543704,-353828847,1057914880,1253081088,-1274904344,-972524603,151011590,1354956976,-1328903599,
              -85929471,4130436,1048579188,-957611968,-16760826,101204594,78708799,4138624,146985679,-771735786,1067514826,-767613952,1376521408,-301731142,-38209446,1914031504,
              1358615,167829736,722302180,-1174478135,-18715386,-243938050,1692948987,-58042367,1920073910,1445189310,-1979638552,-456130202,-461314864,-387839484,-8388339,-385649331,
              -443875509,-1979645720,-85458586,-387872256,129695989,9431040,-402650693,1586167945,-1962987008,-167735129,108269764,-2146966400,-461372436,16547847,716440693,-58717205,
              -1274776319,-1274877149,12314651,-402649669,-396492715,1165099530,1912752872,1119812671,-1071338496,1077689204,-794023563,1912911072,-790573020,1913697504,-1260335076,-803835384,
              -1260334880,-804359676,1912845536,-1260335096,-1274908158,1093011488,39118848,33941699,38594755,516154418,-1900008618,2016855512,-1964257024,-1675665888,1963654019,1057420825,
              158629888,1929968768,-351751110,100433974,95695219,-75289109,-165120759,-2147467514,-469098124,1397890421,838882955,-1260745985,-1870165489,609901312,-1274776313,1006955284,
              -1644661757,1388511602,-189115567,855814915,1084812489,-102624908,-210383874,4263552,1515805568,-1279002280,-322358526,141918376,-872482334,-454298763,-172833654,1515805678,
              1359065283,-1059927414,1040614489,137852160,-1275052538,-5249017,-1427578230,14674175,113644659,-1275068351,-6559737,-1763122550,13363455,116815986,1946222735,-1962986999,
              -1803041062,-13500416,116841098,1946222735,-1870137847,41164800,-1355094576,1047789716,9744264,1592266676,-387806465,-443875495,-385919768,116785289,1946222735,-1870137847,
              41164800,-1147343408,-622329838,549016062,1961101827,-16850426,1509157836,116835229,1946222735,-1870137847,41164800,1371794896,-351475974,-1945377280,-754667072,619219648,
              1942160368,1355152898,15402214,82232458,15451530,-2115629276,-1070930294,-1152325423,-2098724858,1489799934,1346953427,15402470,99009674,56121851,45111745,-389870874,
              343015454,-1092089676,5892350,1117784690,1012933632,-134056864,1091469507,-1007075328,1364414715,-1878935304,292689357,-919403341,4065014,-502499968,1976303351,1091469555,
              -1661370368,4073088,1532599679,519816024,-236328880,4066944,-434065280,-1862158304,525866445,1119878351,1397903616,45549491,-189085389,-2136413181,-102625163,-260714498,
              4263552,1515977088,-1460878503,-2146994880,536887566,-331157525,-1186527864,-18743276,279505994,-872544652,-471088011,-1017554341,973096352,4694213,146475636,-39327744,
              -1057045366,-960249558,1627426951,-1946427160,28639318,-1946277144,11862102,-956423448,100679942,1482381658,-1962986813,-2147372838,-822067418,-1009646415,4136456,-880096302,
              -2063933230,1962950406,1057359881,1074185728,-1157890304,1067451378,-1321262080,213963268,-138744308,-335484157,-154959704,16813830,-13489804,-2020943222,119799952,125043516,
              -1528296590,-972720897,100679942,-1870165309,1975519744,1091469554,-1329364992,-344922610,-1468931072,-1326549568,-344922608,175236096,-1325107758,617140740,-338004977,-1895369014,
              1232339200,-628424910,9480074,1947256054,132415499,1963191424,-1023299572,712303626,1946674304,-1023234045,1894125232,1910767851,376815784,1894125744,1910767851,74830346,
              -925760335,54267684,-1070464398,-435244861,-469701776,1975560305,-435113743,-469701776,1976699505,-771444476,1007625416,839021058,116835264,1946222735,-1962986916,1976106714,
              -1870150138,1354994432,1962860264,1090962990,1451951616,-402541312,1452014823,-402606848,1452014815,-20846592,-967306892,-2147467002,838885003,-1870149889,1489199360,108382462,
              9471942,-922827916,-2017065355,-1022033776,4261574,1397801729,1465274961,-397074938,12316635,-1870149888,-956301312,37511,-1962490368,113639424,-973078466,16390,
              4130502,28332800,4138624,-771444273,1058932931,-1966353920,-85929269,4130436,101190005,113639487,-67174336,-1610353990,1059323967,-1059978063,-1947333620,-399460909,
              1381694527,954731189,856339964,1523449590,753423954,-402344708,-1998061513,-163160323,268452358,-24967051,1541566987,-2091183893,-2017064194,1935736976,-1870150139,-2092723456,
              57934587,1577025257,1583286047,1482381658,-72095549,-1360469366,-1070873605,653967502,637553825,637599907,637554337,637600419,4982471,-1943655823,-1207939570,-1557778524,
              -1943666216,637655566,17041095,-1943608319,637601294,18351815,-1943608319,-83813874,-1088118300,568631782,568785700,-1912586056,1946601176,113639424,-973078411,30214,
              1894158000,1910767851,-1071325046,-461347723,-426856201,-339441040,-1334712832,-344922478,-965614592,30470,11851914,1114959908,652472581,-973011805,16807174,-524237942,
              -1274121212,-470743808,18391846,7669446,-1266634238,1913900308,7119138,1141233803,-389510396,1048576035,1979777141,-394153467,-453378025,-419552223,-1094452447,2062083005,
              -307697664,-352317507,-1269738519,1913900297,-854477818,-401247469,-277675912,-152852290,1316291010,-387738690,1189806161,-628488012,863114189,28889994,1930677508,184320059,
              -58706316,-2144242671,745804028,1912620008,4497430,-730543874,4533898,4591242,168223168,-1093669944,-1024007186,-1107069695,938009563,1031661,-1329374375,-344922482,
              208790528,-1327461880,-1972312434,-436147260,1498989425,1347507035,989883553,990278361,-351505704,1925397252,1925266180,-121374462,-2131066685,1087178099,-83885366,158721034,
              -466992947,2005006976,150765807,-722926731,368869377,-1964440715,1381061377,1465255454,41280522,1139310770,1085820928,1490587136,7612042,-184419200,520576607,-899983014,
              730660866,736766945,737815538,730147853,730147717,754527428,755576065,730147725,757607301,730148159,761473925,4241488,-2141661042,57999868,-973019415,29702,
              1964935763,-494907392,1994013311,2112358006,1200301572,48808197,637551266,1376274314,-301730118,646580058,-461373322,-1998583104,1476425254,1342194594,1059373450,-2013248350,
              -1979693778,115916993,-1979693406,81838274,168814208,-1566569274,1347944519,-466434934,-259268399,1929390653,1364940826,-1043625136,-1064565527,-1064386301,1041281,-13739688,
              1479197348,1946601051,11534592,-1578829117,-1578713308,-1174097669,-1175583754,1967718410,7774461,-387051740,796197647,-335416902,661979452,4662912,-388879633,2129133830,
              1967030273,225837312,4656768,-402542064,1793589490,1946600961,-960299008,83915782,7643331,7603910,113689344,-383778744,113639843,-382730168,113639899,-398458808,
              141885980,1963096296,49080323,1208403651,1392922624,637761512,-1576122486,123404355,503429097,1085821702,-958886400,29702,7675530,981459584,-400394534,-1977220272,
              -1977220537,-369750449,1225755430,-896800265,-1070870389,123405236,46856223,-1950340352,-338654264,1392910065,-661733333,1946272502,404669446,-1006310655,-1207892962,-661782464,
              -2139035008,745734906,7603910,126559744,-1979710931,50341352,-388896559,239536678,-1977169782,-822214025,7673482,123453483,182815,7603910,705147911,735194048,
              -353633847,4720326,46327953,38242854,646629630,-461373369,-1998583056,637552422,-1576122486,-1070923709,-402635358,141885744,1963050728,33613827,1208403651,-1796660736,
              1208403456,-857132544,1208403456,233336832,-401312511,259326313,-2147361304,1073771582,113640821,-1023410060,1963036392,4694033,-301861190,1963054056,1946600965,-960299008,
              268453894,1962989544,20178964,-1477963915,1950253057,91570176,7603910,1950253056,-456982528,-423680863,606200993,-400431365,443875655,-1342048326,1021898384,1971368961,
              32619023,9282284,20709556,548668020,7612040,30533827,-74761614,1962967016,14411827,12136053,32553473,-160566276,33572870,703074932,-1172737535,79233520,
              -2010715136,-102611195,1963011560,-1945700857,-847937536,26339523,-208930190,1962950632,16705779,102690418,16824607,-66981702,-165711885,33572870,-437775756,-1160416768,
              79233520,76162560,-102611218,1962963176,15001795,116833909,1963458700,-1185692727,-397343232,1952055042,1950253067,1131708416,1156313314,113661787,-469761906,-423680863,
              606200993,-1088297221,-239468478,1980167681,309641216,603998368,1914715376,2000698377,1208909829,92930304,-2126362642,1963063546,-960274443,536900614,1950253147,-71106560,
              -1191655125,365793280,116795506,1971323022,-165629167,-2147447290,108394977,-210383874,113643755,-973078412,36358,7618176,113689344,-343932812,-1286341645,-1161221344,
              -1460928009,1962664064,1976303110,-972231691,29702,1950253147,-960299008,-2147453946,12186347,33012225,1963501804,-956702199,-2147453946,-1007107079,1962938344,1946265607,
              3860483,7618176,-138755328,-1935479807,-1476348928,-1273334400,1965074636,-1465207788,-1274121152,1947248704,-1475234808,-1274907388,1948682240,301760512,-58719372,-239418624,
              -1918702591,146363136,1927335936,-1141186046,-654102688,-2010674642,1526756390,-1023345536,20972256,280691899,12079114,1208415872,57934336,981402808,1996505894,973566470,
              -133991741,-956710056,151024646,-1070873768,-1024016242,638022657,18357956,-1004141077,-1023343586,1085808208,-958886400,-16740858,-1595531088,551944427,12122911,1477823889,
              825176527,876097329,-397205765,-469047249,-855766156,-855751308,526083956,438209487,471743232,-1207470848,365793282,-1946513157,989862430,1392516126,72804508,9903754,
              -478095310,-402361337,-1644559350,-1948421029,3401735,1711753,-87089317,1711755,1842747,1352402827,-1979439128,838899486,132350168,-605551756,-73574397,46800731,
              1548288,1137647451,-2111947965,-1962642176,-1023377378,1397773819,1465274961,-386136546,-1380915301,-100402712,1692715307,-85982552,1023107300,1007514878,-99453446,9899648,
              19327248,-1760657158,501817344,-1041739775,-1759606269,-2133315072,57935843,1476616936,-12787574,-169278603,243213314,1968454663,-2134575555,116793717,1963196440,403603479,
              548406272,-1364188954,-1207724568,-839154432,14739733,-2147429399,-83879898,551952560,2078846640,-2063484925,-384446981,2126446790,571880,-997544206,-1712782476,2146402560,
              -1517670680,-2136414074,1676345972,1930493056,388368391,9627904,1509110,-352095228,1379700853,116794741,1946681367,-1872237821,1509110,-166890208,50337542,817368436,
              33155410,1509110,-2064419837,1946163238,139979522,805312550,-167766234,91517124,43903056,1968323672,1375778881,-2147365143,443748604,639685878,-1204027369,429927541,
              -2013219840,1006639398,-383814656,-722075208,1582624,-2143546133,116789363,1946681368,1950694430,405176325,-1325730048,-1340021216,44886190,1595869178,1532582494,-154182312,
              134223622,-1880554635,386332160,829686784,762663740,7472839,-907472332,1347375822,1296845649,273238087,336794129,404166165,538910233,606282273,757868069,825241390,
              1966685234,-383733755,-574684877,702769,309702386,836693889,-1275061856,65336842,1680071,113673451,-1191182311,-1359871974,11535733,1006700265,1007448578,-2146929906,
              11564740,1006696169,-385649861,1195179868,1606154611,20769257,1509110,1013085188,-1961003706,-1996455906,-1996482018,-973071330,-2147454714,-404181328,723242241,12446144,
              645219644,1576576,-391204856,548405714,1048584422,1946615881,64535047,-301963872,1574646,-369527544,926744330,12060277,9038194,1021873851,-1149341125,-739645240,
              1934048256,386332211,1651770112,91557692,-351338312,1966554216,-391204848,548405634,-850059034,-957784827,1916484862,-380257530,-1157586455,1105979675,1509110,-165579488,
              50337542,1245454709,1312558196,1194069364,-370575685,767033472,-1205671094,501960235,1509110,752841987,-378946746,993790955,11535474,-507836437,784924392,1962884311,
              -229345,116791924,1950351383,386332192,259261184,359809340,293034556,233512964,1023297513,1007055457,738359162,471763744,-386692352,507247825,578027546,512296073,
              -1325793252,-1340021216,13953198,-846134600,-31397611,-684836052,11591818,548446187,-2101665562,1348592640,15465508,-826711578,218030592,-1184766462,-18743067,1491694923,
              -353803802,1364414717,62126218,-1759084294,-919875840,44590308,-947193120,-1174707994,116791808,1966080151,-17309171,-2132970037,-2147444978,116787179,1947205783,1482381806,
              116849347,1967128727,-1760657337,548421632,233513190,-1761151238,880099328,9899648,-387076032,-386203745,645922856,150470807,-167733498,-2147444986,-1998058635,116849407,
              1954545815,-386617338,-2131034245,1057003302,-1605254149,1881407511,-1059978063,-1017575644,-919864752,44590308,-430376224,-71042204,1364611614,-477763501,-1668615541,-422510472,
              562315,208982539,242541578,1416940798,1014287614,1516132699,-296693985,-1460907198,-1207601792,365793534,-741212374,-919874607,-1461679380,-502368896,-227193865,30179419,
              -335944576,229661463,212921922,1491992811,143952720,-1964228096,-119242528,-2134734246,-1326757644,-1337834928,-1598493176,-42645489,-336720720,1377762268,1397839702,-91491701,
              -118954287,9735138,1959922432,1961101843,1959591446,1959591499,1976368752,9169155,1583307099,-1966137510,63079392,-1964080976,-771444268,249725378,-416694528,-1802765821,
              776077312,-301906550,771812170,-2081553014,-997588030,1257119524,-1342117046,1273753088,79856464,1122894768,-399460542,141819980,-2134799783,-1460961076,-400509110,-260767684,
              1493559939,-336674422,79856535,1122894256,-400509118,-613089244,-402540726,-747306980,-1960909696,-335544172,-1946192407,-2097151852,-1964243518,-370392352,-1651835034,1398079612,
              -1736355,-774516480,-322360363,-954015606,125093690,1968043490,1576995568,708202179,2067222839,-1841447881,-1556611273,993588536,-1237750215,993676343,-599967686,557261111,
              -1606999753,117242681,1397838366,1347770198,-466434934,-259268399,1912612925,15292420,-505812991,-1950875464,-2130702274,-2097139481,41234687,-1064390476,335315032,-1957361803,
              273059564,1227262557,-1526780416,-725994019,-2097106173,125120767,-1262876752,-1966866941,4825824,6493833,-2091757538,-1014364990,-1070900498,516282510,-1185415052,-58720240,
              51409410,83656921,-654112398,1913126016,1356399362,-1900006650,172460992,-1557733242,839320672,-289109276,-1966801342,1245965831,525923298,1049231155,113639502,-1191182238,
              -58712064,-2146733564,74713084,99336243,548931765,-1599343865,-466485175,378269835,-1031602077,-2071319036,-1561399052,-1976696731,854649988,4891620,976513,-460551378,
              1276021232,571648,503337151,-205507833,816857771,4800128,-1342016250,1721953855,1583308032,526014811,179621639,6295177,-352320792,1662421996,-289109504,-1979651262,
              -347410747,-20674048,-347935040,-289306112,852462275,-1948134931,1351911921,1648244736,-1962576640,190658,-2115454997,63474432,-788509170,-401689351,-1966866501,-771804449,
              1352109027,1611565824,1583308032,525883483,1654836999,1276021504,-145713152,5153761,-103692149,-1930949452,-472818689,5277579,-369117208,378273643,-1031602077,6725637,
              242614026,-478093276,-289207777,-385849694,-551223473,-210506800,-269803508,4859530,-1979692640,1560306238,-380019105,-1957429449,-154891560,838879782,-775748609,-389850144,
              -58720034,-2146930172,57935868,1392681961,938000779,53572608,719751920,7596259,-50072317,-176829186,-400510888,-50134930,-143275010,-2132818200,117459262,1704986484,
              64535040,-19273234,-588521846,4800128,-2145816062,50350398,-1169026441,-330300454,-76281688,-658889296,1515777539,67076072,-1962914298,737184760,-20513071,-1947389246,
              50350638,-154957075,50350630,-2145450304,-1966931717,-212379958,-1017225307,-212350326,-37527637,-2147468824,141690108,1946680448,39315715,-389903533,544538514,-427102165,
              -823598294,737487871,1976368893,548428021,738183656,1976303357,-10950153,-303309174,-1073031030,-1974464908,-20632890,1489189568,-618003851,83656899,-58718094,-385649657,
              451412804,-1946973440,-2097126634,520488642,1963043052,-1460864261,-1376029695,-1963064599,-1947389233,-1947807247,855658628,50783195,-503296994,-21567238,-2134648829,141690108,
              1946680448,38660355,1364255626,-1946169112,-1956947461,-2097126634,-1460926782,-84183807,1946265836,-1413248005,-370613509,-58655309,-2146930172,57935868,1342315241,-6297519,
              1532623755,6493835,-335101309,-76217944,27847930,-1014301836,-498619653,-41817625,57803836,184586729,-385649207,-1974271862,-771804449,1354206179,1347836672,-855506760,
              1397839888,-528087472,4622886,1946696773,1947024396,1946827784,1963408388,-854674413,-790656496,1352109031,1532495616,-1875711143,-2147483207,91357948,6195750,-855002043,
              1532495632,985857625,1912621590,717684244,436109522,1342573426,-854717768,1489960464,12079111,1477496066,1012570338,1007252481,-1207602173,281870848,-386078999,-1977221071,
              -758898172,-758215968,-53089856,518541392,585683456,210380484,-2134641061,-722072203,-1056256990,1476692006,855422697,1408625601,1378398288,-151068032,-1024042270,84112385,
              -259317760,-1143895208,45679296,1228832771,108135936,-1191083845,-366868733,-234624301,-919930998,-855455536,-126496770,-321723510,-661994661,1827193227,737708802,29524433,
              -790179839,1228832998,74647040,-405675312,-316006650,-472849456,-1014354572,-453619532,-268175477,-483727734,-2130673432,-2128629522,-31477521,-1963887156,8972487,531689345,
              -176829442,-1963189527,-34804770,-1031022454,-1962798360,-2116998152,-805240382,-2132356890,100682046,-489683597,105375697,-2115163617,-805244729,1961087203,-1262253522,-1947929008,
              -1963971593,-387765530,-293535711,-276750256,-855760816,-947195531,-2130695704,-31436561,-51022389,-1963214103,-1964250146,-212379958,-2124521564,-2128609082,1444937927,-204830121,
              -1017225308,-212350326,-947822678,-1974001664,1605039050,1342223555,-1962833944,-2143528712,1857947251,267063034,723419180,-975270154,-1946125258,-783147046,-773795360,-2131754016,
              100682046,1462530591,-1408977322,1971373046,648849942,536839560,-28326013,1592554958,-471709857,653998825,-1398143694,-8048090,-1964971233,-387460653,1448542420,-391379786,
              -1021116191,1954595574,624043527,21312038,639993894,-1409202808,587253992,-2134706493,841353844,639631525,536970546,10848294,-2054674912,-947707903,1976499792,1197432513,
              -373824953,-639042853,-2081387776,-326432532,4800128,1914635782,-1979402726,4622340,8686149,4622368,1355187013,-344600834,-779085845,-402344218,-964624245,-2065162240,
              -1326546688,1976499743,-93405202,-310180082,-51016952,521535664,1442873530,571735,512403187,1583284247,-1057087884,1242089347,3991925,-1070919052,1053087886,-1064566660,
              74761995,-823426896,-385301373,-478086573,1371769347,-805305415,182505696,-1963400488,1388534267,-768912559,-1962933831,198779864,-773795373,601394145,-774698023,-1947438111,
              1515805634,-1977316669,12124484,-2063551808,24443073,-774713095,1944703465,5671154,1352778565,-661957888,653706378,-523173814,-13967151,-1017396477,62148688,6438538,
              1012404429,1012036616,1012364301,1012364298,-1269140473,112906,-1023536947,4855354,11678581,1964572288,-855460822,4825104,108135484,11994940,146015861,-58060595,
              721813944,-1978091831,-33535466,1477496266,-17199383,-352144186,16417012,-889260172,11727851,-25104405,-337087208,-402476100,-605300232,84214531,67306243,378208436,
              -1031602077,78179334,-2098658444,1963108352,8775939,378212532,-997588893,1107356654,1256753900,-997538562,15418094,-1964668180,704661790,-1618333953,-1020576332,5119627,
              -1020531759,-1070923143,1048576945,1912864841,1228832810,594806528,-218748750,-318576502,-13968246,4800128,-1325107962,-739979260,-1965782301,-789655312,-166532114,-1979692490,
              -757822736,-1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579575576,-820051949,-1930944773,1090009,-464466145,-339673472,-461314560,
              -1967085471,-385649184,-1380974439,-456821016,-390025120,2028520815,-429857595,4242048,1690229390,1086650081,1958609781,-1610566431,281870409,-1327974936,-462362881,201386849,
              -345905652,-420273152,320768865,-768869376,-1030825330,729809081,-458361866,-2117826975,1916797178,16417036,-468946048,1947248768,-2134575610,-158333717,292896964,268485249,
              1967188867,-511394101,-86482456,-388330252,682678616,-1328020760,-671225773,-119002704,-1326122281,-344922481,-435179520,1624201328,4241438,-1070868338,-1560252254,1856176236,
              -435245056,-469701776,1975788657,-1328993439,-344922614,-1468931072,-502958976,-1873810446,1894121648,1910767851,1299667260,-1291818520,-1947994606,-436031288,-469701776,2002336881,
              5564472,-150715205,-1950284829,-435900216,-469701776,1998797937,3991584,129224843,-1056709642,-1996434813,-1560252906,-453377940,-419552223,1629485857,-1100931133,-1830231418,
              -426856233,-339442064,208790528,-423328252,-339442064,-1015945728,-322903926,-720428028,-2130984182,1181909244,176221312,-29002524,-29264692,-29526836,-29657908,-25660212,
              -30313268,-33065780,-385452596,65601879,1976368641,60614915,58051838,-2147243543,58001388,-33279767,-385649204,-2035022803,183033,-400622613,116840387,1946222752,
              -335995132,-1578829076,-1578697180,10094220,9969289,10358409,10229385,10487494,-435441663,611443824,1346374783,1894124464,-76421544,-71636193,29016715,1958742530,
              1959329289,-72881398,619489259,-1275532304,1697793,-402476207,-1286537197,911364,-402082991,-779419641,-346530983,-1325772070,-347871744,-348068864,-455046656,1356891712,
              -301662279,-2064908053,-2080644925,1968767225,-339137788,-436162515,-469701821,-337606080,-2042567680,1942502368,-4566517,63974399,48978634,-511588309,-372170768,-372119087,
              -1157895727,1347486209,-335216711,-69202008,-1017489064,-689575906,10487542,520451073,-15865351,614589690,-1935546626,-956261858,-1610573818,-1643214592,-1676244736,-1610168832,
              196083968,1910796518,1074560804,-435441584,1910921328,-1610156293,-109805568,10487494,-857137408,1627192062,-1070981626,-541818650,1006772200,-1341688832,-377428477,-1884290860,
              15429862,1910901168,-561266548,-427756406,82755824,-1055923072,-670890784,-956431757,208963622,173836582,138725158,-953745409,3652,776111037,6160655,1409355558,
              -700848120,1772343436,-1547400448,-796131225,-427756406,82755824,-1055923072,-2010774304,-1993986956,-953800124,-55228,759481894,1153836691,-953807068,8772,541378342,
              -970522625,647701828,2507975,112640,-353369841,2114072,-1912592200,1095888,414767246,734039552,-201970689,610395301,639399104,-1993997173,-1996125436,-436097019,
              -345906048,-435418112,604040033,-379459853,-1070934790,-575377178,1006712808,-469076992,1962949760,-435965948,-711858048,-1912575583,6791632,119529611,-456882591,-2046804864,
              13630432,256018689,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
              541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
              541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
              541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,541296896,8847360,
              541296896,8847360,-436031488,-742594176,-386203925,276103187,1692848560,1962937064,-423327225,125024,-919907901,35939556,-1017513248,-432951045,-469701776,-1329297807,
              -344922576,-814619648,-387992326,3997636,-4979596,254201849,638080001,274465039,551948720,-947257109,15409638,568722608,28311787,15409638,568786864,-1595534928,
              -1014365973,45130214,-1578762005,28311787,15442406,-1578696784,944031526,-970522625,638532676,3818695,1153836544,-953771203,15940,251658680,1072361473,-1207945148,
              -661782504,-1912594248,2668736,-2091134834,812123332,-120892672,-805579031,-1662509317,1961102035,1959591444,133988387,753599357,-819987568,46800889,1889597952,1879492096,
              243990528,378208366,-437583764,1813416442,1846446336,1879492096,-706019328,125095166,645188862,-402617111,41091433,-1292187925,20637950,-259362332,-469683224,-389510543,
              1910767916,11724938,1189652459,-402427135,1392116004,367591090,-423196159,17754225,1910948234,-1979643928,-1301158203,16246794,611443802,214043171,179458050,1476454632,
              1827238374,17557759,1743324019,112392959,-469707544,-387413391,1910767821,-957812598,-1972247552,-399396152,1910767805,-393554550,-16826647,-20024116,-33065780,-381324084,
              -823656305,-402427136,1375338668,95611530,-1342139160,-395188736,-980811635,-2031586842,-423196160,8382577,1910948234,1994918578,611443712,1500636799,1793601970,-423261696,
              -17962639,1592265394,-1468931072,855995424,-18814528,1929411816,5957635,-385895686,-964034484,1172861414,-423523840,4122737,1910949258,-31153692,179479014,-469751576,
              209658993,179458080,1476402408,-1595313690,179501822,-469757720,1347888241,115870386,1910921216,-16872727,-423458110,-1031748752,-423458302,-1303198864,-1316855,1910908592,
              -1325407000,-395188606,1910833117,-452994840,1371757169,-1342023495,-344922614,-1468931072,-502958976,-104844302,519816025,-1302900144,-4986870,-527797788,-453006104,1355031153,
              779370664,-2116962584,-805266386,-1642167549,511115264,-1897395534,611443967,179458239,1493140712,113668582,-989855584,-973039554,-1470595067,-855477216,-434065334,1595991712,
              -820029350,1380982523,-3050776,1962961926,1845952260,1849590528,359995392,7093889,225771696,1856225323,7119616,7341766,1074724353,-2146732800,-268419290,-222688080,
              483257859,551952560,-820029350,1397759739,1354256977,-2133291520,16777278,113663860,-1275002880,-1978610417,-400968244,-1269759915,1494273283,-1261292718,-1273967358,168873224,
              -1342016064,-768388576,399369266,700773978,-1023532683,-545928646,-494218702,2353234,986119770,1523611118,281871028,1734,1510664960,281871028,1734,1532582655,
              869211992,-1327222062,840420618,-854740764,-858995945,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
              756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
              -653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
              -1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
              927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
              248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
              1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
              -1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
              -766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
              616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
              -968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
              1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
              1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
              1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
              2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
              1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
              1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
              1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
              1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
              543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
              1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
              544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
              1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
              1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
              1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
              1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
              1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
              1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
              117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
              1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
              1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
              -1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
              213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
              1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
              -561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
              -1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
              54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
              1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
              -1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
              1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
              -1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
              -1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
              -2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
              -385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
              172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
              -1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
              1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
              1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
              1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
              -437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
              -402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
              -931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
              -344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
              -1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
              1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
              45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
              1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
              1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
              -1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
              118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
              -390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
              -1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
              938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
              1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
              -1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
              1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
              1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
              -385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
              -1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
              54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
              -985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
              1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
              417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
              1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
              -389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
              1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
              -65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
              -388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
              259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
              996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
              1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
              -662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
              911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
              783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
              1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
              1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
              1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
              126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
              28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
              218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
              -259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
              57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
              -1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
              -1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
              1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
              53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
              1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
              1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
              1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
              1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
              -839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
              -655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
              1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
              -386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
              417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
              -309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
              1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
              -2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
              -20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
              58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
              -1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
              1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
              1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
              50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
              1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
              -349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
              1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
              -789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
              1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
              3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
              1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
              -370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
              1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
              -997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
              -1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
              1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
              260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
              -1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
              -1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
              -29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
              -1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
              126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
              1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
              1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
              -385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
              1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
              50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
              1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
              -402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
              1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
              1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
              1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
              -1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
              1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
              1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
              -398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
              73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
              -1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
              773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
              -402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
              -628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
              -1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
              121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
              53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
              -561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
              -822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
              -1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
              -1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
              1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
              -654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
              1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
              1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
              -380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
              -633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
              -413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
              1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
              1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
              -1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
              -397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
              -1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
              -1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
              -20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
              738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
              41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
              738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
              1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
              1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
              -1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
              -1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
              -796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
              -623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
              54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
              168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
              51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
              1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
              -1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
              -320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
              -393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
              -1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
              -1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
              -543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
              803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
              -1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
              698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
              -1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
              1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
              1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
              28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
              1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
              588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
              275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
              7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
              -872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
              854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
              -2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
              5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
              -259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
              -20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
              7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
              844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
              -872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
              1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
              28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
              -402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
              -1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
              -538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
              -1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
              -561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
              309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
              2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
              -1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
              1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
              -1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
              658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
              -1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
              -1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
              -411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
              1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
              179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
              149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
              1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
              126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
              1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
              64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
              182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
              -838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
              45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
              -33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
              851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
              1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
              -980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
              -655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
              1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
              -1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
              -1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
              378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
              -2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
              -1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
              -1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
              -1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
              -225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
              -1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
              0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
              -1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
              -344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
              -1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
              -1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
              -1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
              1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
              1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
              -2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
              1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
              209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
              -402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
              -1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
              167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
              -397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
              -305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
              -1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
              -389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
              916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
              154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
              1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
              1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
              1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
              1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
              -64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
              -1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
              1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
              -855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
              1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
              -1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
              417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
              -1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
              512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
              1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
              -1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
              991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
              132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
              717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
              -488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
              1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
              -1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
              -402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
              512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
              -2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
              116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
              -1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
              -154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
              1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
              -157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
              -1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
              -775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
              -82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
              1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
              520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
              -61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
              544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
              2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
              171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
              -1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
              -1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
              548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
              421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
              240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
              -160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
              1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
              -1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
              4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
              5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
              -2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
              -1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
              1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
              -32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
              243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
              -1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
              -1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
              1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
              -1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
              1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
              378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
              133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
              -855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
              -1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
              83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
              -1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
              12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
              1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
              -1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
              -19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
              -1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
              281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
              -1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
              -372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
              -920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
              -385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
              -33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
              -102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
              -688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
              -191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
              -1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
              169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
              -335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
              -369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
              420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
              -1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
              41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
              146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
              1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
              -873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
              1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
              -1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
              -385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
              1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
              -400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
              1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
              82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
              -401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
              -1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
              16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
              -1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
              -1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
              -1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
              -840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
              192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
              684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
              640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
              421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
              101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
              -202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
              -166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
              57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
              108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
              113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
              1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
              33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
              40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
              1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
              430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
              -534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
              -1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
              -402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
              -7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
              -1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
              1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
              -1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
              -844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
              -2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
              145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
              47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
              -1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
              -1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
              1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
              -74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
              -619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
              -1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
              -1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
              2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
              38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
              -1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
              -1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
              78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
              309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
              1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
              77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
              -1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
              796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
              -166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
              -1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
              -497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
              780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
              1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
              293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
              -1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
              -68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
              -1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
              1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
              141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
              -688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
              -1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
              501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
              1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
              -1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
              80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
              78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
              1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
              74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
              -19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
              192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
              1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
              -2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
              61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
              -1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
              -1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
              1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
              -1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
              -398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
              860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
              2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
              -1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
              -968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
              -968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
              113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
              -972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
              1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
              -1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
              16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
              -1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
              -1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
              512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
              -1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
              -2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
              -370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
              82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
              1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
              1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
              -201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
              -19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
              33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
              -397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
              -1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
              -989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
              75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
              717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
              1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
              178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
              1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
              1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
              -469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
              130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
              1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
              1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
              75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
              -687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
              -1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
              603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
              78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
              -2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
              2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
              1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
              1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
              -102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
              -1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
              -1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
              2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
              -2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
              -1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
              -2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
              -1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
              512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
              -1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
              -34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
              33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
              -397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
              45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
              -14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
              2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
              -1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
              512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
              -628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
              449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
              -628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
              825766198,540553776,1380994883,1112088622,959520845,13368,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,-385875968,35790920,63374420,66520019,65733605,825241888,1937330989,544040308,1918988098,1917132900,
              225603442,808525834,2035494194,1835365491,1634681376,1159750770,1919906418,824183309,1395471152,1702130553,1866604653,543453793,1869771333,537529714,758394929,1953724755,
              1109421413,1685217647,1920091424,168653423,892350752,1937330989,544040308,1918988098,1917132900,225603442,808591370,1699556657,2037542765,1920091424,168653423,825242656,
              1414677293,1920091424,168653423,825242912,1414677293,1920091424,168653423,842019360,1835355437,544830063,1919181889,544437093,1869771333,537529714,758329394,1869440333,
              1092647282,1701995620,1159754611,1919906418,1330776589,1917132877,225603442,1112219658,223039264,1230127440,1126193492,1262699848,168636960,1230127440,1126193492,1262699848,
              168636704,1061109567,537529663,1397051944,541412693,1176641597,1260397105,220813637,538976266,1851075872,1801678700,1937330976,544040308,1953066581,2036681504,1801678700,
              857737741,1261252912,1868724581,543453793,1869771333,537529714,758263859,1953724755,1428188517,544500078,1819895115,543908719,1277195113,1701536623,537529700,758329395,
              1652122955,1685217647,544362272,1953724755,1428188517,544500078,1869771333,537529714,758198326,1802725700,1702130789,1920091424,168653423,825635104,1937330989,544040308,
              1769238607,544435823,544501582,762602835,1853182504,1413829408,220811349,909189130,2035494194,1835365491,1953517344,1936617321,1953451552,1952797472,1968318509,1163075694,
              693130580,824183309,1412248374,543518057,1631854630,1310745972,1394635887,674067557,544109906,1431586131,168634704,58196924,632,0,0,0,
              -385875968,824204208,1395471920,1702130553,1866604653,543453793,1869771333,537529714,758591537,1953724755,1109421413,1685217647,1920091424,168653423,942682400,1937330989,
              544040308,1918988098,1917132900,225603442,808525834,2035494201,1835365491,1634681376,1159750770,1919906418,824183309,1294808118,1919905125,1767055481,1159751034,1919906418,
              1968318509,1163075694,693130580,857737741,1261253680,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,908069389,1143812656,1701540713,543519860,
              1953460034,1667584544,543453807,1869771333,822742386,758134839,1802725700,1176514592,1970039137,168650098,825767729,1936278573,540090475,1818845510,224752245,943141130,
              1766075698,1126198131,1920233071,1701604463,1631985778,1920298089,822742373,758135095,1802725700,1159737376,1919906418,925960717,1143812409,543912809,1917132849,225603442,
              67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
              100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
              251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
              134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,1911095296,52,0,0,
              0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1304029440,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,-1746337792,71,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
              490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
              -1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,
              1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,
              2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,
              5460561,-385875968,18122,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,877259008,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,-385875968,14004,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,-553648128,251798786,-162201829,-1696004081,68,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,708201984,2067222839,-1841447881,-1556611273,993588536,-1237750215,993676343,-599967686,1167976759,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
              0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              1176430848,0,0,1176299776,0,0,1200023808,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
              -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
              -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
              2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
              403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
              108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
              1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
              -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
              805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
              1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
              -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
              1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
              1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
              1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
              -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
              1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
              1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-337051394,69,0,0,0,
              0,0,0,0,0,0,0,0,0,1205659904,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,99190782,85460248,1461191960,
              1696073199,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,704643311,85483846,85460248,85479960,1574168,0,0,0,
              0,0,0,0,-822083584,4683241,2112356352,-1243034839,1558760232,1089063717,49,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,14703594,791752944,942616625,-1375993804]
              ,"symbols":{"POST1":{"o":44,"s":61440},"POST1_TEST01":{"o":166,"s":61440,"c":"TEST.01: 286 PROCESSOR TEST (REAL MODE)"},"POST1_TEST02":{"o":494,"s":61440,"c":"TEST.02: VERIFY CMOS SHUTDOWN BYTE"},"POST1_TEST03":{"o":531,"s":61440,"c":"TEST.03: ROS CHECKSUM TEST"},"POST1_TEST04":{"o":549,"s":61440,"c":"TEST.04: 8253 CHECK TIMER 1 (ALL BITS ON)"},"POST1_TEST05":{"o":604,"s":61440,"c":"TEST.05: 8253 CHECK TIMER 1 (ALL BITS OFF)"},"POST1_TEST06":{"o":635,"s":61440,"c":"TEST.06: 8237 DMA 0 INITIALIZATION"},"POST1_TEST07":{"o":710,"s":61440,"c":"TEST.07: 8237 DMA 1 INITIALIZATION"},"POST1_TEST08":{"o":827,"s":61440,"c":"TEST.08: DMA PAGE REGISTER TEST"},"POST1_TEST09":{"o":910,"s":61440,"c":"TEST.09: STORAGE REFRESH TEST"},"POST1_TEST10":{"o":934,"s":61440,"c":"TEST.10: 8042 TESTS"},"POST1_GETSW":{"o":989,"s":61440,"c":"GET SWITCH SETTINGS"},"POST1_TEST11":{"o":1062,"s":61440,"c":"TEST.11: BASE 64K R/W STORAGE TEST"},"POST1_SETMFG":{"o":1542,"s":61440,"c":"SET MFG_TST"},"POST1_TEST11A":{"o":1549,"s":61440,"c":"TEST.11A: VERIFY GDT/IDT INSTRUCTIONS"},"POST1_TEST12":{"o":1786,"s":61440,"c":"TEST.12: VERIFY CMOS CHECKSUM"},"POST1_TEST13":{"o":2018,"s":61440,"c":"TEST.13: PROTECTED MODE TEST"},"POST1_TEST13A":{"o":2231,"s":61440,"c":"TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)"},"POST1_TEST14":{"o":2740,"s":61440,"c":"TEST.14: INITIALIZE CRT CONTROLLER"},"POST1_TEST15":{"o":2855,"s":61440,"c":"TEST.15: VIDEO LINE TEST"},"POST1_TEST16":{"o":2871,"s":61440,"c":"TEST.16: CRT INTERFACE LINES TEST"},"POST2":{"o":3135,"s":61440,"c":"TEST.17: 8259 PIC TEST"},"POST2_CP27":{"o":3223,"s":61440,"c":"CHECKPOINT 0x27"},"POST2_CP29":{"o":3282,"s":61440,"c":"CHECKPOINT 0x29"},"POST2_TEST18":{"o":3333,"s":61440,"c":"TEST.18: 8253 TIMER TEST (CHECKPOINT 0x2A)"},"POST2_ERR102":{"o":3366,"s":61440,"c":"DISPLAY 102 ERROR"},"POST2_CP2B":{"o":3376,"s":61440,"c":"CHECKPOINT 0x2B"},".263":{"o":3398,"s":61440,"a":"","c":"TIMER COUNTING TOO FAST, DISPLAY 102 ERROR"},"POST2_CP2C":{"o":3408,"s":61440,"c":"CHECKPOINT 0x2C"},"POST2_CP2D":{"o":3448,"s":61440,"c":"CHECKPOINT 0x2D"},"POST2_TEST19":{"o":3469,"s":61440,"c":"TEST.19: ADDITIONAL MEMORY TESTS (CHECKPOINT 0x2F)"},"POST2_TEST20":{"o":4503,"s":61440,"c":"TEST.20: ADDITIONAL PROTECTED-MODE TESTS"},"POST2_TEST21":{"o":4564,"s":61440,"c":"TEST.21: KEYBOARD TEST (CHECKPOINT 0x35)"},"POST2_CP36":{"o":4588,"s":61440,"c":"CHECKPOINT 0x36 (BEGIN KEYBOARD TEST)"},"POST2_CP37":{"o":4661,"s":61440,"c":"CHECKPOINT 0x37 (CHECK KBD_RESET SCAN CODE)"},"POST2_CP38":{"o":4670,"s":61440,"c":"CHECKPOINT 0x38 (RE-ENABLE KEYBOARD)"},"POST2_CP39":{"o":4689,"s":61440,"c":"CHECKPOINT 0x39 (STUCK KEYS)"},"POST2_CP3A":{"o":4756,"s":61440,"c":"CHECKPOINT 0x3A"},"POST2_TEST23":{"o":4895,"s":61440,"c":"TEST.23: DISKETTE ATTACHMENT TEST"},"POST2_RTCUP":{"o":5085,"s":61440,"c":"TEST CLOCK UPDATING"},"POST2_COMBOHF":{"o":5196,"s":61440,"c":"CHECK FOR COMBO HARD/FLOPPY CARD"},"POST2_TEST22":{"o":5302,"s":61440,"c":"TEST.22: CHECK FOR OPTIONAL ROM"},"POST2_PRINTER":{"o":5378,"s":61440,"c":"SETUP PRINTER_BASE"},"POST2_PS232":{"o":5413,"s":61440,"c":"SETUP RS232"},"POST2_SETTOD":{"o":5591,"s":61440,"c":"SET TIME OF DAY"},"POST2_INT19":{"o":5803,"s":61440,"c":"GO TO BOOT LOADER"},"POST4":{"o":5971,"s":61440},"KBD_RESET":{"o":6098,"s":61440},"TEMP_ISR":{"o":6149,"s":61440},"HW_INT":{"o":6175,"s":61440},"NOT_SEC":{"o":6203,"s":61440},"SET_INTR_FLAG":{"o":6217,"s":61440},"POST5":{"o":6271,"s":61440},"EXC_13":{"o":6356,"s":61440,"c":"INT 13 (0x0D) GP FAULT HANDLER"},"SYS_32":{"o":6451,"s":61440,"c":"INT 32 (0x20) PROT-MODE TEST HANDLER"},"POST6":{"o":6556,"s":61440},"XMIT_8042":{"o":6949,"s":61440},"POST7":{"o":7213,"s":61440},"POST7_CPF1":{"o":7280,"s":61440,"c":"CHECKPOINT 0xF1"},"POST7_INT20":{"o":7288,"s":61440,"c":"TEST NORMAL SOFTWARE INTERRUPT"},"POST7_INT0D":{"o":7340,"s":61440,"c":"TEST GP FAULT (SEG LIMIT VIOLATION)"},"POST7_LLDT":{"o":7360,"s":61440,"c":"TEST LLDT"},"POST7_BOUND":{"o":7432,"s":61440,"c":"TEST BOUND"},"POST7_PUSHA":{"o":7539,"s":61440,"c":"TEST PUSHA/POPA"},"POST7_VERW":{"o":7623,"s":61440,"c":"TEST VERW/VERR"},"POST7_ARPL":{"o":7705,"s":61440,"c":"TEST ARPL"},"POST7_LAR":{"o":7751,"s":61440,"c":"TEST LAR/LSL"},"POST7_LOWMEG":{"o":7825,"s":61440,"c":"TEST WRITE TO 0x1B0000 VS. B000:0000"},"SYSINIT1":{"o":7962,"s":61440},"DISKETTE_IO_1":{"o":8357,"s":61440},"DISK_RETRY":{"o":8507,"s":61440},"DISK_RESET":{"o":8815,"s":61440},"DISK_STATUS":{"o":8881,"s":61440},"DISK_READ":{"o":8882,"s":61440},"DISK_VERF":{"o":8891,"s":61440},"DISK_FORMAT":{"o":8895,"s":61440},"DISK_WRITE":{"o":8933,"s":61440},"RW_OPN":{"o":8945,"s":61440},"GET_PARM":{"o":9255,"s":61440},"NEC_OUTPUT":{"o":9351,"s":61440},"SEEK":{"o":9409,"s":61440},"DMA_SETUP":{"o":9583,"s":61440},"CHK_STAT_2":{"o":9663,"s":61440},"WAIT_INT":{"o":9696,"s":61440},"DISK_INT_1":{"o":9742,"s":61440},"RESULTS":{"o":9765,"s":61440},"NUM_TRANS":{"o":9840,"s":61440},"READ_DSKCHNG":{"o":9897,"s":61440},"DISK_CHANGE":{"o":9963,"s":61440},"DISK_TYPE":{"o":10045,"s":61440},"FORMAT_SET":{"o":10162,"s":61440},"DSKETTE_SETUP":{"o":10262,"s":61440},"HDISK_SETUP":{"o":10458,"s":61440},"HDISK_IO":{"o":10865,"s":61440},"HDISK_IO_CONT":{"o":10988,"s":61440},"HDISK_RESET":{"o":11149,"s":61440},"RETURN_STATUS":{"o":11233,"s":61440},"HDISK_READ":{"o":11242,"s":61440},"HDISK_WRITE":{"o":11250,"s":61440},"HDISK_VERF":{"o":11258,"s":61440},"FMT_TRK":{"o":11277,"s":61440},"READ_DASD_TYPE":{"o":11299,"s":61440},"GET_HDPARM":{"o":11365,"s":61440},"INIT_DRV":{"o":11460,"s":61440},"RD_LONG":{"o":11513,"s":61440},"WR_LONG":{"o":11521,"s":61440},"HDISK_SEEK":{"o":11529,"s":61440},"TST_RDY":{"o":11560,"s":61440},"HDISK_RECAL":{"o":11583,"s":61440},"CTLR_DIAGNOSTIC":{"o":11619,"s":61440},"COMMANDI":{"o":11669,"s":61440},"COMMANDO":{"o":11733,"s":61440},"COMMAND":{"o":11806,"s":61440},"WAIT":{"o":11903,"s":61440},"NOT_BUSY":{"o":11961,"s":61440},"WAIT_DRQ":{"o":12002,"s":61440},"CHECK_STATUS":{"o":12024,"s":61440},"CHECK_ST":{"o":12042,"s":61440},"CHECK_ER":{"o":12094,"s":61440},"CHECK_DMA":{"o":12137,"s":61440},"GET_VEC":{"o":12174,"s":61440},"HD_INT":{"o":12196,"s":61440},"KEYBOARD_IO_1":{"o":12232,"s":61440},"KB_INT_1":{"o":12372,"s":61440},"K16":{"o":12457,"s":61440},"PRINTER_IO_1":{"o":13423,"s":61440},"RS232_IO_1":{"o":13557,"s":61440},"VIDEO_IO_1":{"o":13829,"s":61440},"SET_MODE":{"o":13902,"s":61440},"SET_CTYPE":{"o":14122,"s":61440},"SET_CPOS":{"o":14161,"s":61440},"READ_CURSOR":{"o":14203,"s":61440},"ACT_DISP_PAGE":{"o":14226,"s":61440},"SET_COLOR":{"o":14262,"s":61440},"VIDEO_STATE":{"o":14300,"s":61440},"SCROLL_UP":{"o":14335,"s":61440},"SCROLL_DOWN":{"o":14499,"s":61440},"READ_AC_CURRENT":{"o":14581,"s":61440},"WRITE_AC_CURRENT":{"o":14651,"s":61440},"WRITE_C_CURRENT":{"o":14702,"s":61440},"READ_DOT":{"o":14907,"s":61440},"WRITE_DOT":{"o":14924,"s":61440},"WRITE_TTY":{"o":15672,"s":61440},"READ_LPEN":{"o":15804,"s":61440},"MEMORY_SIZE_DETERMINE_1":{"o":15970,"s":61440},"EQUIPMENT_1":{"o":15980,"s":61440},"NMI_INT_1":{"o":15990,"s":61440},"SET_TOD":{"o":16175,"s":61440,"c":"CONVERT CMOS TIME TO TIMER TICKS"},"CASSETTE_IO_1":{"o":16354,"s":61440},"SHUT9":{"o":16978,"s":61440},"GATE_A20":{"o":17298,"s":61440},"TIME_OF_DAY_1":{"o":17500,"s":61440},"RTC_INT":{"o":17962,"s":61440},"TIMER_INT_1":{"o":18052,"s":61440},"PRINT_SCREEN_1":{"o":18124,"s":61440},"FILL":{"o":18258,"s":61440},"START":{"o":57435,"s":61440},"P_O_R":{"o":65520,"s":61440,"c":"POWER-ON RESET"}}}
            • 1984-01-10.map
               F000:002C  @   POST1
               F000:00A6  @   POST1_TEST01    ; TEST.01: 286 PROCESSOR TEST (REAL MODE)
               F000:01EE  @   POST1_TEST02    ; TEST.02: VERIFY CMOS SHUTDOWN BYTE
               F000:0213  @   POST1_TEST03    ; TEST.03: ROS CHECKSUM TEST
               F000:0225  @   POST1_TEST04    ; TEST.04: 8253 CHECK TIMER 1 (ALL BITS ON)
               F000:025C  @   POST1_TEST05    ; TEST.05: 8253 CHECK TIMER 1 (ALL BITS OFF)
               F000:027B  @   POST1_TEST06    ; TEST.06: 8237 DMA 0 INITIALIZATION
               F000:02C6  @   POST1_TEST07    ; TEST.07: 8237 DMA 1 INITIALIZATION
               F000:033B  @   POST1_TEST08    ; TEST.08: DMA PAGE REGISTER TEST
               F000:038E  @   POST1_TEST09    ; TEST.09: STORAGE REFRESH TEST
               F000:03A6  @   POST1_TEST10    ; TEST.10: 8042 TESTS
               F000:03DD  @   POST1_GETSW     ; GET SWITCH SETTINGS
               F000:0426  @   POST1_TEST11    ; TEST.11: BASE 64K R/W STORAGE TEST
               F000:0606  @   POST1_SETMFG    ; SET MFG_TST
               F000:060D  @   POST1_TEST11A   ; TEST.11A: VERIFY GDT/IDT INSTRUCTIONS
               F000:06FA  @   POST1_TEST12    ; TEST.12: VERIFY CMOS CHECKSUM
               F000:07E2  @   POST1_TEST13    ; TEST.13: PROTECTED MODE TEST
               F000:08B7  @   POST1_TEST13A   ; TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)
               F000:0AB4  @   POST1_TEST14    ; TEST.14: INITIALIZE CRT CONTROLLER
               F000:0B27  @   POST1_TEST15    ; TEST.15: VIDEO LINE TEST
               F000:0B37  @   POST1_TEST16    ; TEST.16: CRT INTERFACE LINES TEST
                    0C3F  +
               F000:0000  @   POST2           ; TEST.17: 8259 PIC TEST
               F000:0058  @   POST2_CP27      ; CHECKPOINT 0x27
               F000:0093  @   POST2_CP29      ; CHECKPOINT 0x29
               F000:00C6  @   POST2_TEST18    ; TEST.18: 8253 TIMER TEST (CHECKPOINT 0x2A)
               F000:00E7  @   POST2_ERR102    ; DISPLAY 102 ERROR
               F000:00F1  @   POST2_CP2B      ; CHECKPOINT 0x2B
               F000:0107  .                   ; TIMER COUNTING TOO FAST, DISPLAY 102 ERROR
               F000:0111  @   POST2_CP2C      ; CHECKPOINT 0x2C
               F000:0139  @   POST2_CP2D      ; CHECKPOINT 0x2D
               F000:014E  @   POST2_TEST19    ; TEST.19: ADDITIONAL MEMORY TESTS (CHECKPOINT 0x2F)
               F000:0558  @   POST2_TEST20    ; TEST.20: ADDITIONAL PROTECTED-MODE TESTS
               F000:0595  @   POST2_TEST21    ; TEST.21: KEYBOARD TEST (CHECKPOINT 0x35)
               F000:05AD  @   POST2_CP36      ; CHECKPOINT 0x36 (BEGIN KEYBOARD TEST)
               F000:05F6  @   POST2_CP37      ; CHECKPOINT 0x37 (CHECK KBD_RESET SCAN CODE)
               F000:05FF  @   POST2_CP38      ; CHECKPOINT 0x38 (RE-ENABLE KEYBOARD)
               F000:0612  @   POST2_CP39      ; CHECKPOINT 0x39 (STUCK KEYS)
               F000:0655  @   POST2_CP3A      ; CHECKPOINT 0x3A
               F000:06E0  @   POST2_TEST23    ; TEST.23: DISKETTE ATTACHMENT TEST
               F000:079E  @   POST2_RTCUP     ; TEST CLOCK UPDATING
               F000:080D  @   POST2_COMBOHF   ; CHECK FOR COMBO HARD/FLOPPY CARD
               F000:0877  @   POST2_TEST22    ; TEST.22: CHECK FOR OPTIONAL ROM
               F000:08C3  @   POST2_PRINTER   ; SETUP PRINTER_BASE
               F000:08E6  @   POST2_PS232     ; SETUP RS232
               F000:0998  @   POST2_SETTOD    ; SET TIME OF DAY
               F000:0A6C  @   POST2_INT19     ; GO TO BOOT LOADER
                    1753  +
               F000:0000  @   POST4
               F000:007F  @   KBD_RESET
               F000:00B2  @   TEMP_ISR
               F000:00CC  @   HW_INT
               F000:00E8  @   NOT_SEC
               F000:00F6  @   SET_INTR_FLAG
                    187F  +
               F000:0000  @   POST5
               F000:0055  @   EXC_13          ; INT 13 (0x0D) GP FAULT HANDLER
               F000:00B4  @   SYS_32          ; INT 32 (0x20) PROT-MODE TEST HANDLER
                    199C  +
               F000:0000  @   POST6
               F000:0189  @   XMIT_8042
                    1C2D  +
               F000:0000  @   POST7
               F000:0043  @   POST7_CPF1      ; CHECKPOINT 0xF1
               F000:004B  @   POST7_INT20     ; TEST NORMAL SOFTWARE INTERRUPT
               F000:007F  @   POST7_INT0D     ; TEST GP FAULT (SEG LIMIT VIOLATION)
               F000:0093  @   POST7_LLDT      ; TEST LLDT
               F000:00DB  @   POST7_BOUND     ; TEST BOUND
               F000:0146  @   POST7_PUSHA     ; TEST PUSHA/POPA
               F000:019A  @   POST7_VERW      ; TEST VERW/VERR
               F000:01EC  @   POST7_ARPL      ; TEST ARPL
               F000:021A  @   POST7_LAR       ; TEST LAR/LSL
               F000:0264  @   POST7_LOWMEG    ; TEST WRITE TO 0x1B0000 VS. B000:0000
                    1F1A  +
               F000:0000  @   SYSINIT1
                    20A5  +
               F000:0000  @   DISKETTE_IO_1
               F000:0096  @   DISK_RETRY
               F000:01CA  @   DISK_RESET
               F000:020C  @   DISK_STATUS
               F000:020D  @   DISK_READ
               F000:0216  @   DISK_VERF
               F000:021A  @   DISK_FORMAT
               F000:0240  @   DISK_WRITE
               F000:024C  @   RW_OPN
               F000:0382  @   GET_PARM
               F000:03E2  @   NEC_OUTPUT
               F000:041C  @   SEEK
               F000:04CA  @   DMA_SETUP
               F000:051A  @   CHK_STAT_2
               F000:053B  @   WAIT_INT
               F000:0569  @   DISK_INT_1
               F000:0580  @   RESULTS
               F000:05CB  @   NUM_TRANS
               F000:0604  @   READ_DSKCHNG
               F000:0646  @   DISK_CHANGE
               F000:0698  @   DISK_TYPE
               F000:070D  @   FORMAT_SET
               F000:0771  @   DSKETTE_SETUP
                    28DA  +
               F000:0000  @   HDISK_SETUP
               F000:0197  @   HDISK_IO
               F000:0212  @   HDISK_IO_CONT
               F000:02B3  @   HDISK_RESET
               F000:0307  @   RETURN_STATUS
               F000:0310  @   HDISK_READ
               F000:0318  @   HDISK_WRITE
               F000:0320  @   HDISK_VERF
               F000:0333  @   FMT_TRK
               F000:0349  @   READ_DASD_TYPE
               F000:038B  @   GET_HDPARM
               F000:03EA  @   INIT_DRV
               F000:041F  @   RD_LONG
               F000:0427  @   WR_LONG
               F000:042F  @   HDISK_SEEK
               F000:044E  @   TST_RDY
               F000:0465  @   HDISK_RECAL
               F000:0489  @   CTLR_DIAGNOSTIC
               F000:04BB  @   COMMANDI
               F000:04FB  @   COMMANDO
               F000:0544  @   COMMAND
               F000:05A5  @   WAIT
               F000:05DF  @   NOT_BUSY
               F000:0608  @   WAIT_DRQ
               F000:061E  @   CHECK_STATUS
               F000:0630  @   CHECK_ST
               F000:0664  @   CHECK_ER
               F000:068F  @   CHECK_DMA
               F000:06B4  @   GET_VEC
               F000:06CA  @   HD_INT
                    0000  +
               F000:2FC8  @   KEYBOARD_IO_1
               F000:3054  @   KB_INT_1
               F000:30A9  @   K16
               F000:3460  @   SHIP_IT
               F000:346F  @   PRINTER_IO_1
               F000:34F5  @   RS232_IO_1
               F000:3605  @   VIDEO_IO_1
               F000:364E  @   SET_MODE
               F000:372A  @   SET_CTYPE
               F000:3751  @   SET_CPOS
               F000:377B  @   READ_CURSOR
               F000:3792  @   ACT_DISP_PAGE
               F000:37B6  @   SET_COLOR
               F000:37DC  @   VIDEO_STATE
               F000:37FF  @   SCROLL_UP
               F000:38A3  @   SCROLL_DOWN
               F000:38F5  @   READ_AC_CURRENT
               F000:393B  @   WRITE_AC_CURRENT
               F000:396E  @   WRITE_C_CURRENT
               F000:3A3B  @   READ_DOT
               F000:3A4C  @   WRITE_DOT
               F000:3D38  @   WRITE_TTY
               F000:3DBC  @   READ_LPEN
               F000:3E62  @   MEMORY_SIZE_DETERMINE_1
               F000:3E6C  @   EQUIPMENT_1
               F000:3E76  @   NMI_INT_1
               F000:3F2F  @   SET_TOD         ; CONVERT CMOS TIME TO TIMER TICKS
               F000:3FE2  @   CASSETTE_IO_1
               F000:4252  @   SHUT9
               F000:4392  @   GATE_A20
               F000:445C  @   TIME_OF_DAY_1
               F000:462A  @   RTC_INT
               F000:4684  @   TIMER_INT_1
               F000:46CC  @   PRINT_SCREEN_1
               F000:4752  @   FILL
               F000:E05B  @   START
               F000:FFF0  @   P_O_R           ; POWER-ON RESET
              
            • 1985-06-10.json
              {"data":[
              808989750,1127233840,777146447,1296189728,1380926240,824192592,741423161,892877105,909516832,943207476,808464432,825243961,1128472608,1347440463,774787666,1229529120,
              1296908866,825303072,943208761,538981685,-712132358,1939763430,2066052391,-1625196253,-321780303,1085282931,343007440,1990124594,2047703055,-321741045,-456128910,57934448,
              -1191318540,-661782464,78144740,-1830222987,-426790912,-469701776,-2046215055,-2143193916,1014237948,-236535766,551948720,145752299,15409638,568722608,28311787,15409638,
              568786864,-1595534928,1890582763,45130214,-1578762005,28311787,15442406,-1578696784,1894158256,-423613808,1021347441,-1103857910,-268238589,-1959858173,47132,12374158,
              602144516,-1240887295,319836688,-637462250,-1827620592,524533511,-1335827455,-14621152,-1342150866,-1199512063,1945763839,-1931964895,-1933340965,-1932423487,-1948087342,-1946842132,
              856126462,-133728825,-955522069,-1191968396,1894157195,611443856,-423328249,-423328144,-1869827983,-460295962,-1174359951,-17955880,-289885504,-1293108558,11594970,-1326530382,
              -1335761156,-1937709566,-1898934584,871773144,-1384073765,-670901246,41155042,-1326186124,-1182734845,28573705,1894158256,1910949002,-426733648,1910804592,-1837775814,-387787568,
              -1912586056,-435900200,-435624320,1914080208,-430657536,-1979651261,-1220417855,-348082171,-2143033856,192217083,-670416412,-805376030,-1326126219,-1971263995,-423023677,-1341802687,
              -347871680,-469701888,1960321601,-17767929,-185829937,-1912586056,-435769128,1914079616,-1341266432,-1965520129,571896,-301989702,-1326579477,-335484159,-527826709,1960328172,
              -498928639,1958805226,1442545884,-75495052,-1341623126,-1328616619,-1328878678,-427760121,-1962954534,-1174893864,-1061552120,15461888,-352210706,15461376,1005379722,-201231144,
              -503135613,1958805224,1442545882,-75495052,-1341623126,-1328747691,-1949766742,-1560251874,313524240,-1070972442,-790230810,199639216,-689520464,1102053611,-689566746,1118830827,
              -689566746,1135608043,-689566746,7478921,-2132408144,-2118467542,16759040,-1057078546,9435777,-528025995,709545214,-1002771264,-855756683,-2131066550,-17795840,-490435900,
              -1160990501,-527826801,-322950418,309707834,1976368256,-348934140,16548074,-1070987916,-1326128661,729867785,-1469979447,-470097648,-1469979407,-470097904,-435506967,-456578176,
              -153056668,41157060,-990486300,1961943042,196146177,-1431273242,-352063812,1946265657,-1134500862,988480496,1430020324,-2132407120,-1062150283,-352062276,66501661,1625564395,
              1622180582,-352062788,-1341819891,-192879091,1625710000,-419815957,-456578204,-536696732,-919878662,1692665523,108331432,-872482590,-1329335179,-1199512050,-661782464,7478923,
              -2147436036,-164888789,-661733333,-75382642,58004020,-1342067735,-1333729777,-1131944320,-790035476,1977125658,27388175,56427493,59310952,58590073,-2115582070,-2098805878,
              -1900019527,-1948570663,1023470343,6990421,-1048507276,-108986240,-411252736,58050851,-1174344471,-1070988328,62438126,-2081554000,-725941014,1096176,-997530574,-989969682,
              -301495762,-220050877,-461315446,-788758288,-1531246476,64273136,-13378581,-1901068104,134265280,-217636680,-1140902997,-1014056960,-216006471,62438059,1122904496,-1158795088,
              682623960,816857838,-1899459346,-1342129200,816896910,721422009,1191545087,-2131041721,208976127,-1330118869,-1195916402,-487859314,92807344,1191544870,-1316887481,-1125592572,
              468387194,254050788,-351961924,-1316821998,-1125592572,132842878,254051044,67469500,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,
              637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,-13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,
              1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,-13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,79992299,81265869,
              -1410136851,-1912586056,1914603992,4241408,12376206,-1126920704,113672192,-1340604284,847308305,-1865862181,279470564,1642396385,-85978968,-260715522,-123209343,28968819,
              334424065,-33979916,-453806087,-1560796030,-1070989294,17793766,1026528,313537653,119439590,-1177509697,-1430781949,2484394,-397060680,-1070923745,-50324760,11098268,
              -1458604798,175375360,-1453810436,41223168,-336314901,244221,-1598182413,17770192,-1598226338,17770192,-1598226346,17770200,-1514340274,17770200,-1598095290,-1190818864,
              -1598160891,70985432,1179043957,717486050,-1326324032,-350165487,-435638272,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-1333729773,-341776879,-428822528,-352145247,
              -341711360,-436097024,-1342116959,-1331566849,-1182734828,-13959048,-893859954,-930305253,-1325931861,-1082071531,521011264,62838924,1096191,-498645083,314173691,-2132404560,
              2095615408,1954588690,-393302005,-2136468877,1693128052,-2132404304,-393310536,-2146692509,1994966150,-1202590958,1424526990,1916698898,1964127232,-351263740,-2034226686,308013252,
              -919872725,-1363832655,887669130,65284626,985792216,200373737,-1341098789,304212142,-1347362678,991042280,-1207077693,283676302,-2042622958,304343236,-393573704,254022147,
              649070453,317244550,-434589678,207742080,-1335761396,-1199512039,-18349681,48145,12375182,365095040,-2132403536,-954267542,23046,1543947776,1488846848,-1126789632,
              17825789,109024,-1883763595,298575880,-199975191,113769963,-65464,5048006,1275512467,113705216,74,-2132403280,1778401467,434636616,-385649664,-1014824782,
              1275526720,1279164416,-411760128,-385843480,-13959010,-1951771208,92874440,-1960439888,92874245,1702215987,521693726,7487105,1964970548,96937526,1642332417,1642466316,
              1642525476,643366762,1642333579,-1993949148,641365253,-64057,1342540582,-1071357468,1476757798,-12769419,723678719,-2147436096,102673395,12132102,-201970816,-453039187,
              650126433,1479,24452871,481336515,-1279754010,283764915,-75399156,41353728,-997818588,1779496168,512302872,-1013121005,-971044758,268454918,4851399,498073600,
              -617905946,-402175894,57933849,-2097112087,117326019,1048576076,1979580492,7858407,721455081,-1437222657,-1993946997,638562309,-1993996917,1975595781,409607774,1916698911,
              521286656,-953798795,1778450693,-1960421121,610395141,92874432,-953795211,1795161861,-1960421376,1642352645,-1993949148,662001669,1979711293,-1178588382,-1410105344,520488478,
              729809081,732820470,610395391,96937664,520552448,-1329397387,-1333729762,-387741008,-1313861575,854124426,531677968,113672422,721420364,-17665,721431784,1275512530,
              585631744,1275512320,451416064,1275512320,317202432,1275512320,182992896,1275512320,48791552,1780017920,-1993996472,1275512341,1214906368,1032005127,-385649409,-1329332724,
              -461314528,-435418015,-420273055,312600929,-2132401744,-1912602436,67157204,-946929877,-1424241992,-1206923544,-1796698482,1958782991,8841475,-997794012,-2129682200,872444478,
              -1341098990,259647638,-1069760476,113640821,-1335623566,258599060,816373898,199766389,-162761728,536875526,1324052340,1354760377,-644983010,732583359,990350299,1478451143,
              -1048507276,-108986240,-478361600,-389822173,645201882,116835466,1950351378,1009787914,-1978174160,604564420,-1976550352,-1475644220,-165251839,536875526,-1900535948,251783168,
              58048680,-401604888,28376994,116788084,-1337982958,-1342016495,302446129,41230336,-466993628,-2130702173,872444478,-1339263982,-115152800,1625705904,518572331,2147465721,
              27813092,-1331889439,-116725587,-468945763,7512672,58025276,-1593733911,-1336934384,1090352,281919531,279126192,243712,28840141,1477496064,603984035,504460592,
              -1900008624,4243416,-11336249,2146115416,141832252,540853502,62128757,709943430,1477496292,-1342129328,-1190938438,-58718208,-1224248272,64535224,1704992949,-298376192,
              -611400818,-1394030127,-1334807277,1484842530,-855591856,1881192464,683278123,1487663872,821854288,1946401466,64666115,-919926604,1975788268,-335945212,-322360510,74761250,
              938211810,-321780815,-1269242763,-1173304064,598786048,-628195098,-1437221033,126606123,1969211195,257288197,-1031731989,-92209024,-562247680,-2132400976,-402580503,113642999,
              -2146697195,1677750846,116788596,1948254226,16955910,504241128,603984033,1949318192,352765488,-1195766528,-301879293,-1901068101,-1437222693,126475051,126550251,531256637,
              243357045,3145744,704647329,-351220252,704753716,-1173303836,11535320,-1207911442,1438178190,-1982125142,-1962874105,-1437254393,-2128317153,-822079450,269386239,-1342173184,
              -840685055,279009296,1009787904,1958750768,1354825218,520041449,-661733333,-956284737,536826629,-1258346263,953542877,117440616,-1946150727,-1093103928,549453555,-492067584,
              571900,-1073798210,-1415249472,520551650,526023,113763011,-11272172,6424263,1622210048,-1325977624,-396302839,-125173729,-1979704600,-53507352,-469434177,1946265700,
              -1436490502,-203259674,327914,-1469783040,-453320447,179356512,-401748248,-315945769,-436162310,-341711327,-1977490432,178382048,-1339263520,-1333729755,-433985793,-469701727,
              -455046623,66977,1805784437,-433672192,-457573504,224323609,7028352,-972196864,83891462,-387948866,-184939373,-2132400208,-408267336,-2038242174,1032053956,91510186,
              -337585218,-435310366,506224,-1341315096,-2140084595,27454,682625396,-188841754,-1329271840,-461314519,618695265,-1335761156,-347871568,-1437222912,15418086,1122419850,
              1122238699,15458438,-1438825756,-1106938795,-1813257971,-2132399440,-419516166,-435113951,2931011,-1047920405,-151306010,16804614,-136180363,1377990,-529023486,-1325438743,
              -92215765,-5239631,113656038,-1342177173,-81664258,7014134,-488737535,-1328993289,-159324628,16804614,-136181643,-371158850,-1325727947,-1339955457,-347871690,-436162560,
              -436147392,-1328993472,-461314515,1946331236,-1090985464,250208450,194636031,-2132398160,7487105,58004020,-1341994007,-1199512016,1726481039,48139,12375182,254470272,
              -2132397648,637995114,5899975,-970588160,23558,-1912579906,-148266,-1340139414,-1199053184,216531008,-1330530296,-2046094616,185460960,1253003,-670837877,15240880,
              1958782987,-1201935614,-186083946,-2042682358,183363808,326422587,-1903249328,202040040,-389773808,995625717,-1959299120,-1194292264,-857172072,-387938806,-930411833,-391073352,
              -528086337,990558952,1343190216,-393310536,269224623,-1024932730,-935634934,-930413961,-92153597,225575425,-390876232,-2146694509,-1494694778,387877130,116113664,116048203,
              1396730450,1396730450,637995114,4720327,-953745409,18950,113649152,637534284,5048006,113714835,-65440,1644611366,637534208,6555334,113649152,714276965,
              -427432256,-423559546,520645252,6555390,4982526,6569600,-1341885948,-2138577216,167797822,1532565111,1364414552,6555192,113642098,-972029852,268454918,-436181856,
              1279164548,695533056,1780441194,833619784,12157158,257812608,-1595341964,727210240,1074113535,-397324288,1230571211,-347012125,-1185392488,-1108852549,117991946,1678165542,
              -953810944,25094,-423613952,-1333336443,-1333467647,645981747,6555264,1048585729,1997144164,1482381587,642863952,6555192,-970586510,268461062,6594598,-29588250,
              1617572980,-1946211553,737643285,-1190819392,1642601065,1347967242,-1950205103,-467765822,1975526497,89676056,1364197440,1493583592,1359209289,883989995,887718118,-1971132916,
              -1954289980,-2037979450,730195680,1642376182,202148070,-215719450,1482187238,115589467,393462571,52369514,1287107,-390876232,2133068047,585680006,-1950338295,-391008056,
              -511047399,317239472,59750409,-385282840,552078303,369542665,229638400,-1341519128,168159242,-253197084,-393878519,-2031875605,-1341528344,166848544,-588741660,-394075127,
              -2132538921,163459900,-1106610974,842850798,-608304268,149285089,-2136438556,-397407372,549324163,150792416,1950394456,91613193,-387960642,-1192687378,146401285,893157604,
              1960912574,-525746675,1445504,145614850,-1461188373,370049032,-1729625088,-1547687160,247005207,8567296,1122943018,900791010,116818150,1965031442,11593987,7487104,
              -385649308,917504166,-2114289434,872444478,-2145946606,-1442811330,-1364193164,-1208846360,-226564092,-805436299,-1380911243,-453875736,-387927968,1776874080,-1470044942,-2146798591,
              134223374,-337450306,161736800,934291939,-75464474,-1340050006,-1333729736,-231282514,-400956231,1692666064,1081344424,-2132395600,-454532892,-97850616,1692838832,95930667,
              27813092,158726881,-193605634,-337459522,1012982808,-2146798592,268441102,-337459522,-500908536,1445504,131196960,-2132395344,568786864,-396316422,1169224156,-575381274,
              724778728,-1178562880,521011208,-1073810498,1201995808,737927751,-1178562880,521011208,-1073798210,1201996224,737927751,-942108992,-1023408122,335988706,-939568128,25094,
              25214966,-956297031,-2097151995,-136183097,-167288088,536875526,-953808011,436215814,-419516389,1048705825,305397874,-4649355,66501120,-487717712,-289395970,-2132394832,
              -138804560,116846083,1946222608,302446165,1316233216,15409636,568770340,-729153356,-990506035,-1171950081,481297394,-389469202,-13432892,113639861,-2147483586,16818190,
              1914060520,-400378617,192091703,1445504,-483475904,-2147031320,-33513434,-222688080,113700355,-1107296149,914948126,914948122,914948124,-964493184,-2110355168,7913216,
              347604766,-1196709100,-1414856447,-31186460,568721643,1181430,-385649376,-1901068058,-1106878744,-2136415937,1757284213,1952491745,109701129,-2147431039,78857707,-1968125653,
              -1475985688,-501516928,1976303349,-510542097,-1207538968,686296718,-2046555130,104589508,548998891,-393564157,-2136472041,-572262432,216567472,1947248646,-508051962,-2147074328,
              201332030,1961037502,356417546,108334336,-387768642,-239466969,-131798013,1182027836,-335153222,-1606619100,263401332,-138753749,-2136413183,-102626188,-176829442,645139492,
              -189130773,-296374271,1022099691,-1341491883,15462058,1957313772,370049037,784220160,98167011,243277547,-1342111605,-394205635,-1058531716,-1859745275,1961101824,269385735,
              -4964352,2028506800,1975560197,-393170910,254018927,125092922,58049570,-1341757720,-1333729730,89778322,57933884,-82406424,-2132395088,-1341817112,107866122,-756629462,
              -723123989,-1899495238,1438603226,-1948570710,1606892295,-1528298123,-2130384122,-2130673470,2095055098,88991970,270820580,199950964,1445504,-499532160,-1090174232,12457579,
              361442816,-336680272,535567872,108374588,562313,1195853382,376569729,12313461,66763264,1979230444,8898312,1124333568,49986115,1979230444,8898312,1124268032,
              -1312388285,180933123,1155779,-1341744664,-1082071488,-1070399385,-472185463,1037631723,629236064,1031872319,326435647,1614667163,-1090128031,-469207624,-1260444511,-1600002558,
              35913744,141870138,1062528,91613186,1509063,568590336,15465508,113648102,-973078507,-1610574330,2145972912,108706081,-2147138584,520132134,7683712,-1273793534,
              -25054704,-855608058,1963916819,-402427392,-318044877,1048597876,-1167851406,242548738,1377990,610591914,-1170180848,-2115502075,-401690620,547881995,-973665164,108363776,
              -387880770,1692664926,108335140,-387719234,1572734034,72149218,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-605486219,1916698858,108291072,-402652742,
              -1545075664,-1595659771,281870409,-1090390855,-1070870368,-1993949042,46629637,12122338,-1127182848,568591360,15465252,1048584678,1969487986,-463672574,-335731551,-1331567104,
              -1333729727,-965679475,29190,-1897922376,654257088,1532167563,-1666558659,-469399258,-435418015,-420273055,662019425,723453470,79554779,-1340312289,-462363123,-420273055,
              1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363123,-420273055,-431771551,432929664,1030644,1021845680,-1325800956,70641709,180048067,375040,-768344277,
              -897518601,-152939984,1476396473,1191458536,129628642,375700992,1174702638,1191454440,-1017579806,541215520,-1138734257,2013493251,50456578,-2132348752,-402157640,12321501,
              -1126920704,-1578598400,571398,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,42920195,-2132348496,-1947815760,-919920435,-1071477788,
              57998048,-1342015511,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,122186240,-1960378581,-456578299,-524279157,-385649414,-206568892,2025816294,
              -687862016,1032235,16262592,1962965053,6864667,736034831,-939520064,1023473701,141885544,-1453810435,57934336,-1459482647,58000384,-66975767,11098268,-385649660,
              -189791748,1214939366,654256903,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-773258379,654256897,1072694727,638582968,-919927454,3967972,
              57998048,-1342064663,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342073879,-1199511819,-661979135,1103858499,-1958555253,-141867014,
              -292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025406301,427098113,1963129731,66683668,-92074123,-2096466684,91555327,1946615427,21162243,-2132347216,
              4720327,113704959,-956301236,18950,4765936,255770766,-579475456,5048006,4765841,255770766,-847976448,1040206008,1977614351,-425873212,653667211,721421510,
              579593417,1979375808,1292289712,-139422976,1220051174,6339328,1660945165,-2137360957,-75496477,-1148029693,1220018272,63668224,-2055945373,-2147228800,796197883,-2132346704,
              5048006,4766707,34586667,-2145618493,393606140,-2132346448,4720327,113683114,-1198325683,51314760,-385649448,-75431792,113748650,1431633992,251676856,-344598525,
              1431698305,-89070219,141197542,1208403743,-956301568,-1828696826,4982470,1241958171,1778384896,-13957304,1426442022,1241958314,1786773504,-953809080,-961915643,436227078,
              4851399,1214906368,96937479,543861333,1778748191,495656744,-1960890262,900747277,1029210342,376744533,-1437205631,-108982156,175417941,-2132396880,-402223176,-253165539,
              -1060070398,-86454023,-460295962,447762545,1894176976,31985240,-1664105728,-104804272,-419768112,-423327120,-803557263,1483794136,-1644530,512634563,1086527867,-3803392,
              1443394879,1073735297,-396431861,-400687082,116850659,1946222608,-87875838,-436202080,-135531392,1174702638,12445776,1963605080,-90389517,510981642,12153011,3205125,
              -389925959,-822214544,-400626059,1048641447,520159250,313771380,-402343751,2025390098,5433473,-294270210,-394168135,-1013120952,-1229915492,15418342,1122419082,-980811541,
              1642349286,51175562,-1180868122,635962379,1976303104,-453337866,586943585,616860384,-1654528260,-402388039,-90439668,52716004,1642513418,-464469091,974136417,-1963428668,
              1492443872,-1900523325,-17438578,-528080884,1493108968,1073794433,-390049597,256004,68101208,1075062672,-1223773145,-1022309120,-454506870,-389903617,816906207,-1325405464,
              -1710048,-782825789,119565031,812273578,1783605767,1336543032,1392978026,-919383726,-1828463942,-519460628,1504351227,123689818,852044739,1124532928,-1073021982,4241603,
              -466960242,-1056815222,-930412064,50653377,-2103088,-588774028,1377037060,1728497446,637534976,6889100,1730084646,-1329374720,82700543,-96721949,-38789259,113648102,
              -83885973,-919926093,7014134,-502893310,1976303351,-1973361421,1358676952,1077182692,548438246,-816307994,1223171680,-1564464130,1822621808,7250688,82349744,734274814,
              -1335593527,-33953654,-136216408,-1968154141,-1459753240,-470294400,-394219442,1497169379,1541949559,-1043821824,313721577,-939269130,-857177424,2002337021,4515889,65589584,
              1153128648,65271556,-393957176,591199667,736630903,-1278178560,65271303,13796289,7214729,520121507,1629471585,-387870274,-1900479029,-41293682,-997850100,-1006789400,
              -322903926,-720428028,1397801738,551947184,551813355,-1005920118,-4979595,196095979,15442150,-125132572,276102922,-955604508,-1578762005,15409328,233545958,15409636,
              184280192,-350099772,-434065408,-400663776,646511971,1478426731,548425935,-849829658,844156682,-1326389568,-425662944,47011872,-419516209,-34868124,-1377202000,-376328192,
              -1833959256,-1342135319,10414483,-1712745296,1214907904,654256903,1479,38127398,-1341685761,8579477,2129368752,2062260144,1995151536,1928042928,1860934320,1793825712,
              1726717104,1659608496,1592499888,1525391280,1458282672,1391174064,1324065456,1256956848,1189848240,1122739632,1055631024,988522416,921413808,854305200,787196592,720087984,
              652979376,585870768,518762160,451653552,384544944,317436336,250327728,183219120,116110512,49001904,-2132363600,477605692,520645150,4720327,113704959,1788018765,
              1511982920,-108834471,1375827264,-1947934586,242533434,993820900,-2033254030,-192878880,-1070925333,12094438,1442500353,-2132377168,-1962914072,134265071,-794773333,47275,
              17770155,-41222050,-388456257,-276103126,-1426028360,-1411866440,-1426063176,1442909990,-1409447168,1576897451,251658680,1944776705,-1342160867,-1014962555,-1189222466,-1510801340,
              510639811,-661731188,735092927,-1145008448,-2018115520,548995250,-1014258432,-1413313621,-1426063176,-524684318,514833664,-1515850357,-119362651,-1610168538,639422673,-777517369,
              -953803564,-657346554,113714716,484233656,-1073297626,639426769,-775420217,-953803548,-388902906,13615900,0,-2013265920,14196736,147,13672456,147,
              262147,147,184549392,147,192938048,-16777069,167772415,-16777069,184549631,-16777069,251658495,-16777061,255,-16777069,255,-16777069,
              255,-16777069,255,147,12582920,129,1986312,-2013265773,13631488,-2013265694,1990400,939524243,1109146908,1276921628,1746686236,1880910876,
              2015130652,-2145616868,-2011397092,-1877177316,-1742957540,-1608737764,-1474517988,-1340298212,-1206078436,-1071858660,-937638884,-434320356,16413,-455505018,-435418015,-420273055,
              -1177406623,-13959152,-772147669,-1961522734,-507366651,-1167690250,92929792,-1962838648,1975661317,-2012903080,-1947040203,1975661317,-2040404916,579331268,47328,1438269301,
              738143146,-1949594634,-1951665214,-1376375861,-69090765,1642342261,-2015050618,12116002,588936448,-2129234734,1951771386,33194251,-1173654527,-907323990,-352255558,-13909052,
              -372126837,-1096111432,-1416211115,-85808234,-880019925,1438640593,-1431651755,1975989165,-1036800548,-713689375,-997826076,-534607900,-2132397392,1962934456,-13940540,-377238645,
              -213865726,732645547,-2083812362,900530921,-1451884545,-507507795,-1381861893,1979711285,-1409340516,-1409286465,-997826076,-534607900,-352321352,1342591624,-1912586056,-1940891456,
              914892506,-92209131,226281472,-1090870808,-1461132334,1510430969,16956099,-335948824,736134900,-1469782839,-470097918,-421493196,-456578208,-1461679516,-469601279,46462560,
              494268896,-919927117,27813092,141949665,-193606658,166446078,-18691797,-377265948,12108545,-1898410496,2013710272,-1930443008,855669262,16824768,-209977153,79297451,
              11817216,259134413,721551800,-1144877358,28933120,1494469888,-58717837,-501058432,-2145457184,108789822,12546418,571772,-2089025375,87753415,1601501665,8126698,
              -431706112,-118626176,9111286,47105,1031067790,-1461186896,1963501816,734014260,-1189884462,-1169096701,28835968,-1898239230,2080422851,-855637575,141711635,2113814145,
              -1200313771,8436305,332251179,-502762919,-431640363,-501691008,-1091114005,-1662459069,-67179528,1397905237,518818641,-125441962,1914240128,-2146126846,209060348,1946745984,
              33193991,347341430,-315437942,834396624,-1965489375,-1946799386,-1963291664,-973061850,16646,1578630958,1515936031,46816607,-887004928,-484321503,-81662175,1294093601,
              1294096162,1294093602,1294093602,1294093602,1294093602,1294093602,-48083678,1243815714,66239011,4169978,-1061142748,-301462524,4064966,201386752,-386142716,1148323809,
              1359003833,1344390072,333973684,-152545273,812800263,4329018,-1040307595,1992554880,565950690,-402410416,-768997642,-402259736,28444398,-402261784,-396884250,-561314491,
              1506001802,4263552,-1997477088,-402636506,-561314511,-2134654070,2130722598,-387561800,-1195179427,243320138,-394264513,-2134703535,2130722598,-387562824,-389873083,-1326972499,
              1057914882,-253198336,-399019518,1253049126,1912816104,-397560787,1119355792,62017570,-402289432,78775930,-402291480,129107570,-402293528,145884778,-402295576,-396884382,
              -1930951727,79423489,-1014309237,-1262056509,1093044225,-2117863168,1912635647,-1262056698,-389809919,1187447109,-1593835518,-1054605296,1094451890,-889321868,1786052924,-2096867704,
              1719075327,17123014,1912933352,1958742552,1996700692,38176784,-523187970,-13444982,-141587666,-1870296542,1964025856,41844744,-348687360,784344092,586747531,292913212,
              -150041810,-1870268894,91488512,-82932946,5146914,-272169331,-1945745783,-390033720,-1070399249,1187431416,-1070399484,-2013247863,1183384934,166128390,156176167,11266127,
              9471370,326418442,27787700,45351540,12445776,-561252264,851690378,-386798620,-2054553463,-1073086320,27793780,-1779956364,-972721146,100679942,-402614552,-561314875,
              -2134654070,-2147466994,1592323819,-963947008,-259267534,9479552,125128207,9473408,-398988400,1048576403,1954545729,125128237,9473408,1310976880,-1920989323,-351272816,
              544558617,9471478,-1341557756,-1870268848,41222656,-2063036240,887619728,56879104,-1010595237,4261574,-2081428735,477561343,9485696,-1961462784,48349391,-771715168,
              -2147015480,-134180699,9471240,100722883,33522627,-1115658121,1946157200,-1060140191,45351649,646237394,376766607,-858650700,639685878,-2054553457,119799952,101238994,
              -1517682545,-58064752,-1329535872,16547842,28318836,1967193216,549975561,128979061,11539435,1971387520,29882101,-940117899,67269648,-1868201981,-2063009792,1354956944,
              -385914648,1347944504,1476439784,-397401742,-924319518,1477603842,16312400,1343648344,-402569240,-1427635863,36235265,-388468136,1642594803,1491619842,-2031593217,-2047425790,
              1963982992,1082177579,9471478,-1341361148,-1870268928,57999872,-2139062088,520130725,9479432,9119360,80265459,9111048,-1870268733,1014304768,1912789992,2026438200,
              -1868199372,266633216,91602954,-342832000,1976106527,281837573,-922872085,-990505099,-167087100,91488964,-347026304,-1865646077,9479560,-337366333,80406775,-1518324620,
              -1947271024,-771641137,-86968608,4130336,45148411,-1241756952,61204481,-1595347662,1090962947,-1645738496,-972721148,-2147467002,-1007107079,9119370,9471370,985710629,
              -2146405180,1057000230,9111048,-1174224704,-1007811593,-351475974,-1945377280,79741376,-266016630,1929528835,1355152898,15402214,82232458,15451530,-2115629276,-997800309,
              -388906966,-402410928,-863370715,1222693720,-351934896,-423327232,1482291973,45138179,91425510,4261574,-397360375,1854538262,51243009,-1156091304,-397204018,-963968286,
              -457121909,82083842,-739712246,-1195156734,-1974458862,-941096602,-389641470,1720320706,45934592,-957873230,45410305,-1092090702,44886017,9471370,-1071375436,599001204,
              41208062,-1746392396,-402214398,-1880620639,1455642626,-1677506328,1912827112,980589893,4374268,1958749356,1967143985,-523195353,577897652,-1274879808,-803507696,1913173216,
              48283669,242353332,62185680,-523237262,41026228,638066868,1048576065,-184483775,-341982370,1094615285,661979136,9473408,-1870268912,460653568,9471370,-2143502300,
              -1518334859,-2130902896,67145869,-1920989717,-1023016816,4275840,-2143718400,-2147466946,-1517669772,-990510960,-2144766704,780845284,-977272693,-1058701308,410315834,-805176192,
              -1058766628,9479552,-1868232673,1090962944,-1007091712,-1070414856,4275840,-1306299136,13363204,4660874,775605899,192217158,4533898,1946250810,47972868,6171356,
              -1295793270,-1494724606,1076267008,646600704,-469106623,-1070464396,-184419200,-1868199229,281343488,113662325,-402653122,11862166,-402551064,846331979,-167489351,16814213,
              -1599012236,1090963025,-1070399488,-792662576,1827164163,-133474303,-1677711640,16508801,141777309,-382024194,-1007035787,4525706,9735560,-382014000,-1920989836,-132120432,
              664123587,-397757360,-947191530,266920074,-25171967,246465368,-1460558104,242612672,-1662512976,1979649009,80265219,516099876,-1900008618,718505944,2016855551,-2027910656,
              -1021354285,1912620776,-66721725,-846135880,-689398763,91463163,1912615656,-401952209,-997523507,138208306,145752691,-198919600,-896802057,-772222837,-1261317678,1477823878,
              1589185139,-231806944,-160052994,-1965061181,79937739,1074185978,1067515648,-1271913472,988074497,-2079951421,1962950438,-1964832212,-2147467458,645926887,147783743,-1610596570,
              -662044609,-82844800,-1061142748,-1173615612,988677106,-134056737,-1006896701,1323829682,1057421055,343179264,343270410,-2054549580,-1071382384,141918268,82515124,527754250,
              -466434934,65583696,-896802057,-2034970485,1935152589,4372746,-17720344,-1007258168,-1291586374,-322358526,-2143502300,-136180108,-210383874,4263552,-1007069056,-297614198,
              -1159754813,-1336792800,-758413823,-2067036480,1962950150,1040582684,4581376,113642099,-402653119,930218043,9733574,1961691648,-1870268887,41164800,-1388649008,527696020,
              9743752,-1746399308,-1965061121,-7280413,9741706,-385906200,-392429538,1486749502,918049219,129257513,-1946192408,-387740961,65601390,-1017554944,1344886456,1912611048,
              -402082796,1055457114,-1609928192,1612972098,57958460,-2134681352,1073758478,-67703815,-1878935304,292689357,-919403341,4065014,-502499968,1976303351,1091469555,-1661370368,
              4073088,1472437631,-1291828545,66370055,-919403849,1019225324,-502369088,1976565495,1091469555,-335970304,-1997782501,45696773,-259856384,279505994,-872543628,243323509,
              -115343295,-68631713,66566909,-1014978324,-386010648,1014169419,-454545227,-1254788354,1372454411,1929304808,706000940,-402344880,-947126610,-1477910390,-7608066,116808024,
              1947205698,1961691868,-1869774842,-2134666240,16814221,-71083581,1491607120,1041137903,-1340112896,-1205803488,365793537,1397804888,509039185,-2131804440,16818190,113770291,
              144,9119360,-1961983949,113688576,-973078466,16390,4130502,1090962944,1810366464,-110499585,50299719,113702005,-2147483586,-33513434,536643816,1532582495,
              -1191525544,-661782528,-1560261471,1319174400,16950016,4982471,244067371,113705038,827261400,31067788,17041095,244114433,113705222,-469696232,18484876,-1088118300,
              -1578762005,-81518108,568721643,-402186501,113700515,-973078412,29958,7734982,-393302016,-527765925,57983012,-2147447831,-1901004828,-1326553880,-297408366,7800518,
              634948096,1920205040,276164668,820550064,1946172654,1999584357,81838433,652472581,-973011805,16807174,-524237942,-1272286204,1978678272,-392515568,3993095,792468340,
              -524216457,-470743804,-2094081909,158597183,18391846,7669446,-1266634238,1913900308,7119130,1141233803,-389510396,1048576024,1979777141,-394153467,-1094516724,2112414606,
              -302389248,1364456683,332204468,297010802,426972109,1929410024,-478560529,1963049718,-479936937,-352299032,-855591857,-1979141101,1913900506,1108248888,-1194096128,332203009,
              -58705549,-2144046070,796135932,1947270272,3729450,243996530,-1047920574,-922861788,-511654028,-1983378752,-352304626,-473973042,1963049718,-475218429,1508737768,-1900493989,
              -314709874,-528087028,-1007857432,1398495576,1822511185,1926839040,1926773510,990178060,990147267,-117280063,-2134640445,91455738,46809293,-469042432,1087179125,-92216278,
              -2131789951,58001660,-2147366167,58004988,-939425047,1392508936,102650449,-469084330,-2135817611,-402636568,646638859,-58720140,1583346945,1499078407,46844251,-1758641408,
              -1490182099,-1070748115,992820013,1932344109,-1406229202,1127133998,992820013,-399584979,992820014,-399568851,-58659637,-385649407,113639653,1392509044,7675530,2145550416,
              1970723386,74573830,88574758,-2013075263,-1977157562,-1169029049,1525548022,1982237191,-1058766848,646504458,-2007498634,-1974404794,-2009127743,1854470726,-1061057797,1183319784,
              -1060992260,-427817760,214305295,-45709152,-997568424,-523115470,708702347,1478128384,-1957670565,82428363,-1056718708,-478035826,1498939407,2107965230,-967092180,16806918,
              -87883600,15442404,-1578713308,-1174097669,-1175583754,1967718410,7774461,-387051740,762643206,-335416902,628425020,-268605824,-18296278,24176640,7683712,-2146667007,
              -1307509426,15460353,-972988952,29702,1946601155,-1597831936,113639540,-1023410060,553535174,-972971543,-382665146,1187381721,484983038,-402098942,57999997,-1023219992,
              1358841542,1894273798,1200236035,-112818162,-1209464997,1392909825,-957637912,29702,7675530,981459584,-400394534,-1977220277,-1977220537,-369750449,1225755430,-896800265,
              -1070870389,123405236,46856223,-1950340352,-338654264,1392910065,-1912602440,29554392,516163188,82510104,17047236,-2132064536,-92241686,-970165502,29702,755469094,
              -393609214,-788332507,652792296,-1978775798,2005542600,-1966146046,721450262,520575936,-973077814,117470214,-1070987340,-919875029,-957682695,-393085370,-1977220417,-922877369,
              -2130876790,-536153884,654141064,-2012330102,-1070859962,-386185592,141885751,1963051496,33679363,-28916029,10283298,855525062,-973024023,-395248058,343212311,1963030760,
              31582223,7618176,-972720832,29702,26536131,1183453557,32946941,30927086,113640821,-1023410060,285099718,1962992360,21227545,1055393140,-401640191,1048576423,
              1967128692,1946600965,1048576000,-1023410060,614589690,-436147265,606200993,-436147205,1139342113,-1172671231,-1867513353,20506862,259358900,-335416902,-1275032158,1946237952,
              -2011122686,-1023380442,1912720360,-386168007,846528639,1962991848,16824621,-100536134,-76680196,50218742,585634420,-1172868607,79233520,-2010715136,-102611195,1963009768,
              -112263675,-389820811,-93191796,1089008523,-386697984,-294518535,-1189149154,-256245504,-201524735,-165676177,1946353222,14673938,-256191374,309505,-301692378,-386276794,
              -1032519563,1962991336,-1945700675,-931854336,12145603,-118992634,192174590,7618176,-498568064,1531571184,-1912158633,-453378048,-339794783,-459151872,-335862751,-81664512,
              -239403213,1980167681,292864000,620643978,1914715376,2000698376,-28409852,-129791487,-2126362642,1963063546,-960274444,536900614,1950253147,-71106560,-1191655125,365793280,
              632491890,9307894,1979310464,1976303115,1946601203,183205888,7603910,-1912158720,1048576000,-1023410060,632509435,-138753749,-2136413183,192216032,-176829442,7603910,
              -972690560,29702,1950253147,-1178402816,-138804992,145288193,-102626955,7603910,-121374336,1042627,27789173,988283764,1950253056,-1161625600,-1561591305,11796620,
              443908264,547933364,-1431038859,242499752,279462068,297011316,41223336,646447284,-58720140,-2147257327,-1161625348,-1561591311,-1185742707,-523239416,-85851534,53546427,
              663367385,7612040,16547931,1073930435,-1157317887,-1202714096,1190559744,57934590,981402808,108525926,-1019607182,1492648818,113703363,1476984948,-1900008509,29554368,
              -1004140684,-352249826,516171269,1354957060,-400431074,9307846,-434065153,-436147296,-1191502048,365793536,909168472,791687471,519779640,-402790317,192209930,1165282558,
              1735707902,-1949360293,989862430,1962941470,-1878870009,-1862593075,438209530,471743232,-392408320,512361811,-667811689,1946674048,84404228,1952161274,-402158627,512294963,
              526057498,512490191,507183130,126550044,619204764,-1759606267,-2133315072,57935843,1476712680,526121885,-1610612022,526057495,994264015,1962967582,-2145481980,1442562816,
              1381061456,102651734,-412489476,-152523344,-919864828,44590308,1625619168,-839299148,-385650155,1023083066,1007514878,-99453446,9899648,36235536,-1760657158,535371776,
              -1259843582,-1759606268,-2133315072,57935843,1476679144,-12787574,15273333,1380993028,1229802323,609175377,-167309697,-1073703418,293155700,1974205568,-1777434619,645939200,
              -343998314,-1775861685,-58671360,-2143193791,16815630,9832182,-2143980512,536876814,-352057880,-1777928592,1601438208,9840256,1951546621,-2134575611,1572821877,702770,
              1416998642,1574646,-2146995192,-150988762,116802539,1946681367,386332174,896795648,829772604,-167667479,67114758,1379669365,-997585291,-2136440652,82379637,21293313,
              -2147302679,225904121,-2147325719,141943036,9834112,21555459,1977220224,-343559932,-620986361,-2035203211,1960311936,-654540568,116843380,1946681368,405176327,-705956096,
              116842890,1946681367,113541125,116791019,1946419223,79986693,116787947,1946353687,46432259,-1008091094,1968454658,-2134575555,116793717,1963196440,403603479,548406272,
              -1364188954,-1207729944,-839154432,14346517,-2147430935,-83879898,551952560,1726525104,-2063484925,-384446981,2126446784,571880,-997544206,-1813445772,2146402560,-1517670680,
              -2136414074,1575682676,1930493056,388368391,9234688,1509110,1014068484,-165513902,134223622,116811381,1965031447,386332173,225706752,-380489544,116785666,1946353687,
              405177587,-352160768,405145687,388378624,1891956224,-397408908,1012400782,-1203669678,-672574976,284983297,-722068877,1517088,745912380,-1275061856,421955584,1946172416,
              29485343,639685878,350945304,276004924,1574646,1008628744,-2147126203,-150988762,-434065158,-391204832,133825181,1516134175,1566071641,386332367,58001408,-167733015,
              67114758,1161574772,1178392180,1396494964,113716597,305397874,1389082089,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,
              -1341819591,20244768,-1187734593,-1359871990,-276753547,429929628,-167070720,-1564015644,2078867481,419874559,448331776,1974399488,-385830907,37486854,238816370,-998242189,
              -385830794,993788150,1407779699,1934048511,-379601927,-167691031,67114758,1178362484,512433525,512295040,512294938,113639452,-1333788559,30402734,-1070916659,1006681577,
              -2144963259,134223886,-1159156048,-434065407,1228832800,125044480,-1610360646,-152174491,134223878,32110965,1966554367,1912649734,-1157592599,993847438,-927236494,13887976,
              863192892,1509110,1013085187,-1207601905,1760235264,276117308,1793633968,-434065407,97342752,-21108387,108149564,-370584133,465240225,-163451927,536876806,116793717,
              1963130903,1951022113,1951284236,-1152963571,-2132153994,1244510208,733487851,-165811378,50337542,1177345909,-337024581,1916484619,-352276476,-387859705,-684799746,527761212,
              1962933376,386332186,544489472,1509110,1007645699,1008038465,68253530,-384963808,1631387198,2050754162,539755127,1842827,-1125583989,438189051,-1994230784,471763204,
              548469248,-1364188954,-1207911192,365793538,754849769,-1965609413,-352276256,-434065249,44480800,-2014837581,-33953309,-1974381744,-100420616,9905792,-456578097,-536696732,
              -423130374,12188512,-1761151462,225783808,-872482846,243326325,-343932777,-1761151481,-294383616,-1017619623,-1761151238,1198866432,9899648,-434065344,-99751136,9897718,
              -2144045760,1073780494,-1612124752,686357247,-1759084544,101251072,116785303,1971323031,-7804917,-1761151238,108298240,2078864560,645987071,-79757161,396382659,-1318050816,
              616616452,1354979591,-456578054,-536696732,1692817658,519816187,1397838422,-1948100888,2023525106,-1947807488,184551572,168588498,-32607004,-27757364,1530885324,526277209,
              1122914511,-2136413101,-21494411,706071952,47432191,-1964193493,1971366112,1274536462,-2141457803,-461372980,1528622073,-96334416,-352261138,-301158400,-1957668613,1107298452,
              -527766292,1526260864,-192888182,1353509704,145769026,262191342,-1325566648,-605295092,1448222459,-1957473961,-772109326,-507123482,38027,326423051,376759306,1265945854,
              1886702846,58051838,1526762473,1516134233,-527773921,-1341930877,-729092480,-1026423631,975489,65481151,9735162,-1976679936,1257111877,-1976696597,-1031541243,616860163,
              1246424607,11534571,1347152878,-1341865341,1111682563,1290285239,1493726208,-863977078,1252584320,1021845687,-2081393408,-1973877270,-1746145599,-1341865341,1111682561,619192503,
              1255896320,484966839,-2133625600,-1802821916,-370409472,-1802764427,-1031602176,-527766523,1726606402,2090699519,1565742336,16770433,-707668527,-1964193493,986129120,-502827833,
              -260747787,-1017250038,968833263,973879780,975388665,992950928,1004223361,977746957,1019034830,980238194,968243638,1010448822,503774459,1448300882,-1192733353,-1207910688,
              1064587,3204993,1966145411,-1342128637,1947466880,-1949921790,149864944,-24910127,-1979092184,771770662,948479231,-1174353943,-8191020,-1341885136,-1565216249,378077257,
              113639523,504889476,-259286960,-192640466,6660848,-2091763932,1525548226,-611394773,7610053,1096024,242352700,71096579,-654112654,41027388,-1957635837,-528086457,
              -533600226,520118435,-997530574,-989969682,1139672970,1492378186,-1979763937,-973058498,25094,1008730297,1007317508,855929863,-1257903168,119584776,378252275,-1031602077,
              6660100,-2071318802,-1550257940,-427753398,-1959919602,-1544493948,146341964,5291776,-1070397666,-1337807885,1228832816,41223680,-1561444432,1599930470,1515805534,-1261500641,
              1611565322,190464,378268907,-997588893,15418094,1257162122,-1057045366,15418094,-1007763062,-778516598,-1802922272,1043857488,91553890,48808587,-390337792,-930414463,
              5115395,246741457,-1006649368,-13443190,-1752439855,243990608,1599930464,1482185566,-1563490529,243990626,1352138828,1319363063,-775386368,-401820423,-782499952,1351060451,
              -4724736,-1946193943,-2097126634,1721763266,1979648512,-2132794354,-1022746653,6726382,620712937,1944834271,-350221069,1244039919,4825088,6438538,1499357021,1409235945,
              -997533557,4859638,-1023148238,-1017388847,-2147427864,141690108,1946680448,42723587,-389969069,829685815,-427102205,1860756266,66388736,1976368893,548428021,50358760,
              1976303357,-559027977,4800128,-1610124281,-658898843,-571871741,-337736962,-6297380,5113347,-259262325,-956378837,-315440386,4861579,-1014305533,4859638,-1605320701,
              520486985,326238780,259457852,64666194,1946724588,-1306152709,1482354392,-1966875894,-212379958,-1017225307,-212350326,-37527637,-2147468824,141690108,1946680448,37939459,
              -389903533,544538519,-427102165,-823598294,737487871,1976368893,548428021,738183656,1976303357,-10622473,-303309174,-1073031030,-1974464908,-20632890,1489189568,-618003851,
              83656899,-58718094,-385649657,434635556,116886272,1977289247,-91161843,1963043052,162065656,-374473868,-477692404,-343873397,-1947480062,853510899,-772043777,1350929383,
              856257536,1279132671,-109753600,67023080,1662422008,113410816,-2134647157,141690108,1946680448,35842307,184532968,-1794738981,384543731,-91161707,1963501804,1963042825,
              162065652,-1416234124,-1444287774,83656957,-58718094,-385649657,-1914174992,-620037121,-319156363,158664872,-243990104,1946790124,-1429894149,-370744761,71105916,2061728883,
              -289279093,-1650424,1342197940,-855506760,1397839888,652248656,1157645962,208930876,141823292,74713660,225773372,281874100,5280907,-346465448,112942,1912798336,
              1586112005,162809088,1532498125,985857625,1912621590,717684242,436109522,-1202714254,281873930,1347997438,-855506760,-1562224624,1963042906,33601541,-102166323,3270908,
              570722854,-1964977468,-373239090,1347484904,-771744024,650388200,-161805174,225804483,-870132490,-2010726134,-907454460,-339660036,682660853,145285878,-670760076,-1953262049,
              46185425,-2147286343,100682046,-2135226766,117684481,-355210718,-141889021,-925841110,-805384958,-477431691,-1966871342,-389968936,-125107666,-1031679701,-423624447,1228832770,
              74647040,-405675312,-316006650,1946346432,-1262253523,-1947929008,-1963981833,-387765530,-293535618,-276750416,-855760976,-947195531,-2130671896,-31477521,-369789493,-561316808,
              -1963070229,-389903400,-125107754,-1031679701,-423624447,1228832770,91424256,-405675312,706676295,-255360531,48480256,-1014354316,-453619532,-265554037,-483727734,-2130697752,
              -2128588562,-31436561,-1963887156,2746567,542175105,-176829442,-69539332,-336863606,1465305738,1583326451,536921729,536921985,-896903338,1583326451,1472891587,-2124436749,
              1461715143,-1426863478,11846495,21882960,1012463755,-1106873472,-351339922,511716367,-561056213,8140485,1377819276,50585793,1228833008,1914635776,-1235855572,-1007244284,
              -1441368704,-2054674772,-947707905,1976499791,1197432556,1575609314,87172859,841395370,-350224507,-774665504,65241319,-470395472,-125118326,79058519,12183724,-528039133,
              1954595574,87238147,-1408923354,587245288,-153057597,91521218,8729382,-2054609376,-947707904,1976499792,1197432527,-372907449,-1461126396,-2081387776,-326432532,4800128,
              1914635782,-1979402727,4622340,8686149,4622368,1355187013,-344600834,-422504725,1609041078,-20545280,5826591,531820161,-294269186,251293375,149783303,-1325599349,
              -1172367872,1465254016,-218102599,1952341927,-2084504034,1967786183,1946172653,-1900008686,2084488408,197168128,-1341885241,-2083329152,-2115434300,146362874,-775368704,-486682147,
              -1017539080,-1178302803,11714560,24428933,-1043148551,-193789207,1157650056,5284291,-1965520045,1244067524,48283904,-1023148246,1347470171,1049232308,281870434,1980578904,
              -1190480826,281870337,372949758,863305802,-25165646,-1272285928,-1609511678,71041097,121374322,108331191,281872564,28900490,-1228330234,1242991128,-842334720,-169256944,
              -1262027015,1962208002,1946827795,1946631187,1963473942,1959922348,-404010262,-471138126,1964572288,-1179587620,531825971,-338034200,84083660,50529029,-1962888188,-2097126634,
              -1460926782,-385649660,44564609,-2065104011,-1961839616,-1979686122,15462084,-393548734,-1966801334,-347935036,-443880448,4791946,-1976631510,725610911,1310624707,736874752,
              721582531,-2147241536,67127614,1048586610,1946615881,-165105118,48794354,719096557,1228833023,74778112,-456129359,-729095213,-289345398,-166532350,-1979692490,-757822736,
              -1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579625752,-820051949,-924311813,1090008,-464466145,1975560289,-401756153,-816260989,
              -426921904,-391270288,-1461140788,-1610566440,281870409,-534725032,91521192,-658184112,-533676456,57950376,-455558680,-435418015,-420273055,-768869279,1642395179,427147432,
              1253003,12180110,-458361984,1975560289,281444368,2000743299,-532627733,-86473240,-649271052,1088956592,-397168423,699455803,-86427928,-58655756,-2142342528,1366606076,
              176221312,-28805916,-29068084,-29330228,-28871476,-385649204,-855768917,-855756428,-855767180,-1763113355,20179201,58051838,-33312535,-385649204,-327154763,-385649401,
              -855768010,870908789,-108612604,-352320822,-1157165317,-466426123,-400624917,-1073031209,-922875788,-115391116,-151330069,16818182,536544628,-455742471,604040097,-1935546626,
              -1996449274,-1996449762,-1996448242,-973038570,16818182,1760037808,209659095,-527806400,1994918832,-81831721,1352788984,185317626,618090216,-387938625,-967256223,40966,
              -336060421,-1031013497,167903674,-32803648,-385059640,-369361037,619511666,-1275597840,1697793,-402476207,-1286537197,911364,-402082991,-779419641,-346530983,-1325772071,
              -347871744,-348068864,-455046656,1356891712,-301662279,-2064908053,-2080644925,1968767225,-339137788,-436162520,-469701821,-337606080,-2042567680,1942502368,-4566517,63974399,
              48978634,-511588309,-373219344,29031172,-1185918718,-1460927233,1492901903,516119129,-153693464,16818182,-115407500,-83960343,15442404,-1578697180,10100364,9963207,
              243859616,378077342,113639580,1342242976,-401929288,2133120619,-528072692,1490451688,-2024648197,-1610156335,-102662144,-360512139,-957189375,40966,-132163238,-50426391,
              -400685472,378328687,646512745,-1064566681,-192227186,-1056641344,-972880672,-956246400,-63420,-2012593015,1153895540,-956301298,-57276,2245831,608486912,625264143,
              642041755,-796131328,-289344374,81838340,-14138169,709134847,-970165112,-1265423036,27125983,108265532,-2132409424,-1883745813,-706222071,-2132361174,776207293,6160655,
              139723023,251658680,-1880428543,-1207951293,-796000216,-1912598344,1620184,-164904818,-1510736085,-1071357468,93000308,28312969,1642365158,1642466316,1642525476,-1193774359,
              -661782464,6887054,6760075,820567476,1946172417,1015079946,-1341885184,-1199512061,1894121485,-2132539617,1183378571,1642084879,183035,-2132409680,14169833,256114945,
              541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
              541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
              541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
              541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,541324288,8847360,
              -386248448,276103188,1692848560,1962937320,-423327225,190560,-919878823,35939556,-1195115808,417869873,-389773612,-87043053,-857153612,1946172671,-100682748,-1340143921,
              -350165487,-423130624,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-341776879,-423392768,-352145247,-341711360,-436097024,-1342116959,-945690881,-51132,255608006,
              3818695,1027917312,1044694939,17760256,17762388,28840028,-268366080,944087530,1619968,548984974,-1195340288,-796000216,79987547,-883740566,-70194696,-58655793,
              393409800,-743577570,149471574,-259276797,-1795215622,-1258600994,-903913984,1173225474,1175275007,1181042226,1187071624,1889552130,1879492096,243990528,378208366,-1983709076,
              -1996461034,-973050354,28678,18409667,11542386,-1965872408,-401886992,19190563,45142154,-1965876504,-402345784,-393555181,-202849288,-402427136,-427163433,451412144,
              -1327396141,-753670142,78701962,-1194128152,-320337141,207758546,31621122,-528039414,-120391448,12642499,128982386,-1965894936,-402083632,-259337525,-991426128,-1329034542,
              -759306190,-1007097718,1929420264,8513539,-402651464,-494218555,-1092089936,-1327068462,-759699448,162587018,-1965903640,-399331099,196661929,-762714101,-528056540,-120415000,
              -401887037,547934843,-399280647,57868378,-1979695384,-402542362,-510995839,2062025648,-1327133998,-764155899,-31153692,196649446,-766646261,537689892,1592320134,12122322,
              196657920,-767956981,-528066780,-120435480,638236867,-1194179352,1055425035,-401821486,229691935,-1009640728,52476241,-386266448,-2136419825,-486865292,-104844301,516160089,
              -1934076080,-1871649141,1621651940,-528069260,-460295962,-1463541135,-399477696,780259863,63963292,10362499,1344303872,-427062344,1910804592,-997802204,-997822234,113668582,
              -989855584,-973039554,-1470595067,-1341492192,-76487155,1514851666,-1331172358,-1334778355,-425662944,525885216,1397759695,-991407535,4096209,1953759489,16778950,263518977,
              -863366963,8662666,-768358914,399311540,-159320960,1316331716,1358977000,281871284,-768388519,281871028,281872564,41271306,861020336,-840682798,-990488041,-31296215,
              1976187586,-1965935905,635982562,-956409344,-797577670,-855460774,113703440,-352321280,45373963,-956690227,-16711674,1482381658,-768356577,-855634504,702487,-71100467,
              -397258722,117428527,74776684,7210751,7224963,-2129300200,-1342149570,722302208,7250880,-973050717,16805894,4198142,645925749,-1326448577,66238988,1511837166,
              -419815248,-820029408,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
              756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
              -653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
              -1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
              927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
              248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
              1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
              -1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
              -766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
              616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
              -968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
              1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
              1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
              1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
              2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
              1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
              1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
              1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
              1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
              543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
              1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
              544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
              1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
              1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
              1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
              1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
              1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
              1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
              117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
              1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
              1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
              -1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
              213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
              1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
              -561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
              -1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
              54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
              1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
              -1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
              1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
              -1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
              -1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
              -2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
              -385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
              172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
              -1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
              1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
              1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
              1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
              -437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
              -402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
              -931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
              -344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
              -1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
              1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
              45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
              1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
              1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
              -1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
              118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
              -390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
              -1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
              938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
              1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
              -1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
              1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
              1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
              -385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
              -1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
              54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
              -985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
              1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
              417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
              1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
              -389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
              1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
              -65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
              -388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
              259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
              996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
              1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
              -662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
              911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
              783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
              1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
              1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
              1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
              126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
              28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
              218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
              -259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
              57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
              -1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
              -1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
              1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
              53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
              1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
              1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
              1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
              1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
              -839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
              -655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
              1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
              -386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
              417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
              -309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
              1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
              -2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
              -20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
              58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
              -1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
              1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
              1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
              50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
              1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
              -349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
              1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
              -789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
              1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
              3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
              1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
              -370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
              1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
              -997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
              -1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
              1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
              260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
              -1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
              -1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
              -29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
              -1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
              126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
              1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
              1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
              -385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
              1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
              50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
              1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
              -402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
              1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
              1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
              1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
              -1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
              1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
              1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
              -398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
              73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
              -1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
              773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
              -402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
              -628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
              -1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
              121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
              53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
              -561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
              -822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
              -1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
              -1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
              1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
              -654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
              1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
              1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
              -380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
              -633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
              -413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
              1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
              1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
              -1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
              -397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
              -1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
              -1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
              -20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
              738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
              41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
              738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
              1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
              1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
              -1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
              -1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
              -796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
              -623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
              54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
              168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
              51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
              1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
              -1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
              -320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
              -393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
              -1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
              -1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
              -543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
              803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
              -1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
              698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
              -1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
              1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
              1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
              28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
              1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
              588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
              275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
              7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
              -872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
              854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
              -2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
              5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
              -259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
              -20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
              7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
              844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
              -872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
              1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
              28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
              -402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
              -1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
              -538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
              -1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
              -561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
              309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
              2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
              -1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
              1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
              -1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
              658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
              -1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
              -1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
              -411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
              1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
              179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
              149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
              1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
              126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
              1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
              64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
              182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
              -838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
              45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
              -33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
              851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
              1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
              -980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
              -655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
              1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
              -1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
              -1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
              378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
              -2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
              -1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
              -1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
              -1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
              -225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
              -1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
              0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
              -1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
              -344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
              -1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
              -1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
              -1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
              1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
              1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
              -2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
              1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
              209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
              -402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
              -1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
              167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
              -397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
              -305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
              -1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
              -389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
              916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
              154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
              1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
              1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
              1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
              1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
              -64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
              -1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
              1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
              -855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
              1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
              -1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
              417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
              -1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
              512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
              1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
              -1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
              991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
              132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
              717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
              -488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
              1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
              -1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
              -402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
              512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
              -2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
              116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
              -1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
              -154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
              1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
              -157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
              -1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
              -775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
              -82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
              1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
              520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
              -61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
              544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
              2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
              171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
              -1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
              -1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
              548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
              421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
              240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
              -160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
              1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
              -1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
              4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
              5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
              -2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
              -1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
              1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
              -32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
              243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
              -1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
              -1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
              1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
              -1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
              1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
              378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
              133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
              -855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
              -1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
              83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
              -1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
              12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
              1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
              -1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
              -19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
              -1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
              281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
              -1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
              -372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
              -920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
              -385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
              -33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
              -102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
              -688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
              -191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
              -1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
              169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
              -335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
              -369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
              420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
              -1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
              41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
              146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
              1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
              -873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
              1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
              -1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
              -385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
              1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
              -400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
              1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
              82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
              -401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
              -1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
              16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
              -1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
              -1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
              -1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
              -840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
              192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
              684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
              640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
              421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
              101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
              -202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
              -166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
              57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
              108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
              113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
              1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
              33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
              40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
              1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
              430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
              -534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
              -1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
              -402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
              -7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
              -1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
              1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
              -1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
              -844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
              -2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
              145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
              47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
              -1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
              -1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
              1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
              -74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
              -619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
              -1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
              -1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
              2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
              38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
              -1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
              -1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
              78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
              309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
              1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
              77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
              -1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
              796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
              -166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
              -1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
              -497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
              780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
              1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
              293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
              -1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
              -68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
              -1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
              1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
              141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
              -688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
              -1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
              501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
              1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
              -1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
              80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
              78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
              1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
              74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
              -19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
              192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
              1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
              -2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
              61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
              -1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
              -1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
              1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
              -1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
              -398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
              860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
              2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
              -1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
              -968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
              -968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
              113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
              -972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
              1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
              -1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
              16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
              -1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
              -1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
              512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
              -1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
              -2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
              -370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
              82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
              1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
              1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
              -201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
              -19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
              33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
              -397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
              -1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
              -989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
              75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
              717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
              1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
              178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
              1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
              1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
              -469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
              130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
              1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
              1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
              75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
              -687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
              -1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
              603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
              78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
              -2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
              2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
              1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
              1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
              -102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
              -1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
              -1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
              2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
              -2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
              -1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
              -2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
              -1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
              512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
              -1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
              -34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
              33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
              -397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
              45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
              -14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
              2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
              -1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
              512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
              -628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
              449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
              -628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
              808989750,540031280,1380994883,1112088622,959520845,539767096,892877105,538976288,1230127440,1126193492,1262699848,168636704,1230127440,1126193492,1262699848,168636960,
              1061109567,658751,0,0,0,0,-385875968,824188914,1395470640,1702130553,1866604653,543453793,1869771333,537529714,758263857,1953724755,
              1109421413,1685217647,1920091424,168653423,858796320,1937330989,544040308,1918988098,1917132900,225603442,808525834,2035494196,1835365491,1634681376,1159750770,1919906418,
              824183309,1395471664,1702130553,1866604653,543453793,1869771333,537529714,758526001,1953724755,1109421413,1685217647,1920091424,168653423,925905184,1937330989,544040308,
              1918988098,1917132900,225603442,808525834,2035494200,1835365491,1634681376,1159750770,1919906418,824183309,1395472688,1702130553,1866604653,543453793,1869771333,537529714,
              758199857,1953724755,1327525221,1869182064,1310749550,1394635887,674067557,544109906,1431586131,168634704,842412320,1937330989,544040308,1769238607,544435823,544501582,
              762602835,1853182504,1413829408,220811349,909189130,1767124275,639657325,1952531488,1867391077,1699946612,1378364788,1394634357,1347769413,537529641,758396465,1869440333,
              1394637170,543521385,1869771333,1378364786,1394634357,1347769413,537529641,758198322,1869440333,1159756146,1919906418,840960525,1294807600,1919905125,1681989753,1936028260,
              1917132915,225603442,808591370,1699556659,2037542765,1684291872,1936942450,1920091424,168653423,825242400,2036681517,1918988130,1917132900,225603442,808656906,2035494194,
              1835365491,1768838432,1699422324,1668246649,1936269419,1668238368,224683371,1378361354,1297437509,540876869,573654562,1497713440,658729,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              -385875968,857759212,1261253424,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,857737741,1261253680,1868724581,543453793,1394635343,1702130553,
              1851072621,1159754857,1919906418,874514957,1127035184,1159746642,1919906418,891292173,1127035184,1159746642,1919906418,908069389,1143812400,1701540713,543519860,1869771333,
              537529714,758263862,1802725700,1702130789,1869562400,1699881076,1685221219,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,1766075697,
              824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,809056049,1936278573,540024939,1869771333,822742386,
              758200631,1802725700,1159737632,1919906418,1330776589,1159733325,1919906418,537529632,757080096,1869377109,1394633571,1702130553,1851072621,1260418153,1869379941,220228451,
              67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
              100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
              251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
              134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,67265536,0,0,285382400,
              84136192,19660800,0,285462784,117690624,-65536,0,285462784,117702656,33554432,0,285474560,84073728,19660800,0,285400064,
              117628160,19660800,0,285400064,84073728,19660800,0,285400320,67187200,0,0,285298688,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,770244608,-67106759,7340288,0,
              0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1348790528,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,1105788928,73,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
              490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
              -1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,
              1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,
              2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,
              5460561,-385875968,18548,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,881322240,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,-385875968,15037,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,-553648128,251798786,-162201829,1105790991,71,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,-1086787840,205120569,591395130,792367162,-616857285,1195117883,-1120088518,1832874556,1212737850,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
              0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              1213917440,0,0,1213786368,0,0,1222240512,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
              -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
              -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
              2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
              403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
              108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
              1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
              -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
              805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
              1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
              -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
              1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
              1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
              1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
              -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
              1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
              1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1290338558,71,0,0,0,
              0,0,0,0,0,0,0,0,0,1234692352,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,-890664962,-904148453,1461439003,
              1696320239,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,1056964847,-904128185,-904148453,-904125925,1821211,0,0,0,
              0,0,0,0,-822083584,4739817,635961344,-840381653,1558760234,-18232535,50,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,14703594,792080624,942616625,133955637]
              }
            • 1985-11-15.json
              {"data":[
              962081078,1127626290,777146447,1296189728,1380926240,824192592,741423161,892877105,909516832,1482174769,842152249,892745270,1128472608,1347440463,774787666,1229529120,
              1296908866,825303072,943208761,538981685,-712132358,1939763430,2066052391,-1625196253,-321780303,1085282931,343007440,1990124594,2047703055,-321741045,-456128910,57934448,
              -1191318540,-661782464,78144740,-1830222987,-426790912,-469701776,-2046215055,-2143193916,1014237948,-236535766,551948720,145752299,15409638,568722608,28311787,15409638,
              568786864,-1595534928,1890582763,45130214,-1578762005,28311787,15442406,-1578696784,1894158256,-423613808,1021347441,-1103857910,-268238589,-1959858173,47132,12374158,
              602144516,-1274442239,386945040,-671016682,-1861175536,524752647,-1335827455,-14621152,-1342150866,-1199512063,1945763839,-1931964895,-1933340965,-1932423487,-1948087342,-1946842132,
              856126462,-133728825,-955522069,-1191968396,1894157195,611443856,-423328249,-423328144,-1869827983,-460295962,-1174359951,-17955880,-289885504,-1293108558,11594970,-1326530382,
              -1335761156,-1937709566,-1898934584,871773144,-1384073765,-670901246,41155042,-1326186124,-1182734845,28573705,1894158256,1910949002,-426733648,1910804592,-1837775814,-387787568,
              -1912586056,-435900200,-435624320,1914080208,-430657536,-1979651261,-1220417855,-348082171,-2143033856,192217083,-670416412,-805376030,-1326126219,-1971263995,-423023677,-1341802687,
              -347871680,-469701888,1960321601,-17767929,-185829937,-1912586056,-435769128,1914079616,-1341266432,-1965520129,571896,-301989702,-1326579477,-335484159,-527826709,1960328172,
              -498928639,1958805226,1442545884,-75495052,-1341623126,-1328616619,-1328878678,-427760121,-1962954534,-1174893864,-1061552120,15461888,-352210706,15461376,1005379722,-201231144,
              -503135613,1958805224,1442545882,-75495052,-1341623126,-1328747691,-1949766742,-1560251874,313524240,-1070972442,-790230810,199639216,-689520464,1102053611,-689566746,1118830827,
              -689566746,1135608043,-689566746,7478921,-2132408144,-2118467542,16759040,-1057078546,9435777,-528025995,709545214,-1002771264,-855756683,-2131066550,-17795840,-490435900,
              -1160990501,-527826801,-322950418,309707834,1976368256,-348934140,16548074,-1070987916,-1326128661,729867785,-1469979447,-470097648,-1469979407,-470097904,-435506967,-456578176,
              -153056668,41157060,-990486300,1961943042,196146177,-1431273242,-352063812,1946265657,-1134500862,988480496,1430020324,-2132407120,-1062150283,-352062276,66501661,1625564395,
              1622180582,-352062788,-1341819891,-192879091,1625710000,-419815957,-456578204,-536696732,-919878662,1692665523,108331432,-872482590,-1329335179,-1199512050,-661782464,7478923,
              -2147436036,-164888789,-661733333,-75382642,58004020,-1342067735,-1333729777,-1131944320,-689372180,1977125658,27388175,56427493,59310952,58590073,-2115582070,-2098805878,
              -1900019527,-1948570663,1023470343,6990421,-1048507276,-108986240,-411252736,58050851,-1174344471,-1070988328,62438126,-2081554000,-725941014,1096176,-997530574,-989969682,
              -301495762,-220050877,-461315446,-788758288,-1531246476,64273136,-13378581,-1901068104,134265280,-217636680,-1140902997,-1014056960,-216006471,62438059,1122904496,-1158795088,
              682623960,816857838,-1899459346,-1342129200,816896910,721422009,1191545087,-2131041721,208976127,-1330118869,-1195916402,-487859314,92807344,1191544870,-1316887481,-1125592572,
              468387194,254050788,-351961924,-1316821998,-1125592572,132842878,254051044,67469500,1075062672,637896743,1195836808,-2011123517,92808709,850413383,-2010774136,-1337506043,
              637896752,1195836808,92811696,-1341814746,-427759907,734604163,-1193767232,-13915563,92997001,92926434,-85850741,92997001,92928738,-85850741,92997001,-2115699998,
              1438154982,-1962571350,-1980243451,-502953211,-1962571270,-453320187,-1199511934,-13915563,92997001,92928226,-85850741,92997001,92928738,-85850741,79992299,81265869,
              -1410136851,-1912586056,1914603992,4241408,12376206,-1126920704,113672192,-1340604284,847308305,-1865862181,279470564,1642396385,-85978968,-260715522,-167708287,28968819,
              334686209,-33979916,-453806087,-1560796030,-1070989294,17793766,1026528,313537653,119439590,-1177509697,-1430781949,2484394,-397060680,-1070923745,-50324760,11098268,
              -1458604798,175375360,-1453810436,41223168,-336314901,244221,-1598182413,17770192,-1598226338,17770192,-1598226346,17770200,-1514340274,17770200,-1598095290,-1190818864,
              -1598160891,70985432,1179043957,717486050,-1326324032,-350165487,-435638272,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-1333729773,-341776879,-428822528,-352145247,
              -341711360,-436097024,-1342116959,-1331566849,-1182734828,-13959048,-793196658,-930305253,-1325931861,-1082071531,521011264,-1174469698,1201995792,-386145721,380637887,-1917812506,
              -1475181848,-1341426560,309979278,359956648,397436139,-1900511002,308930702,-997818356,-351109912,-1903249327,-2129503512,872444478,604271890,704834320,-389773632,-617934239,
              -1867396821,-1047875915,705837800,-19397660,1978219201,1960512497,-391204848,-527822297,552120240,1958951698,-1903249395,202512104,-389773760,-1967648215,302639242,125112100,
              -997841232,-1340991256,-461314536,-435418015,-434524063,26196096,-1139669784,-728891392,-394264388,447747530,141197542,1510393631,-973078528,23558,-1912579906,-148266,
              -1444937457,208994305,-402092104,-1494674991,-34868204,4720327,113704959,-963444659,16796678,4851399,464519168,1086030054,122186240,1946163688,11725059,-29310077,
              -2147464186,167791678,2129192821,10414336,1438187307,650677162,263193993,637897510,-1053620855,1780376949,1048649496,305397874,641103135,16844231,202138084,-215719450,
              -9805338,93005400,-1071357468,1963297062,96937530,-1960378369,1642352645,-1993949148,662001669,1979711293,-1178588382,-1410105344,520488478,729809081,732820470,610395391,
              96937664,520552448,-1664941707,-2132403024,-390876232,-2146692881,33618817,2133066359,-85408634,521693712,1253001,141214621,1275512351,113709056,74,-2132402768,
              1214962475,1697799,-1679228044,1086554880,4982526,4996736,-387484162,-2014773129,-1191236864,-930370987,-1341814490,93005327,856000806,509507009,-2128668566,872444478,
              796204818,17155878,1493133825,-469398746,650126433,1031079305,-16398554,1476422399,1342540582,-1071357468,1476757798,-12769419,723678719,-2147436096,102673395,12132102,
              -201970816,-453039187,650126433,1479,24452871,-434196285,-1968131968,272623843,-410340944,-1022347032,-2132402256,4982470,-1157682432,753467391,-959304960,134237190,
              -973069592,268454918,-973071640,536890374,-973073688,1073761286,-973075736,-2147464186,-352320792,122186264,-971667162,19462,638011498,1962884483,-32708349,-434065213,
              207742080,610395660,-379459853,565187241,12353766,-1126920704,-13958144,-793196658,-722949349,-1903249393,-1475372312,-385649472,-551288698,-1494694778,1916698895,1947350016,
              -392777712,-1071378561,91603004,7472838,-392908700,-527822993,829763752,1946160104,302446156,1869881344,12144363,1461604544,1438636430,-1948570710,1606892295,208951327,
              8438145,-939460223,-920394884,-2430781,-997579148,1181430,604664896,1966095408,-339441129,1009787912,1959037488,1963042827,302446118,527704064,-402616648,-1062727929,
              82314101,-6100976,192151984,1181430,1947316288,-164515838,536875526,1042547317,279176234,1916698880,1947350016,-396316628,1303443748,-919904026,-1174855448,1692696575,
              -85917272,-391270244,1956509964,-1570708468,1698431090,-1930886283,1089793,-1557090224,-1070923760,548409549,-1207955293,281870339,-855637576,279140368,1966089216,726670865,
              -1076326720,96927808,525926227,809271275,-989984652,41230396,-528088140,-840684976,-1152362480,-1195724800,134265091,1949367424,-1162299641,548733912,604005792,-1014043081,
              -908993650,1964225768,-433934224,-1269802880,-1206858496,-13930464,-218093383,-2142218069,-1162202884,-1174178813,146015194,585943339,-503024188,725806073,-1004344119,-102628236,
              61945835,-462033710,-855591848,-1073694192,-2132401232,-1084761458,-617895339,-952432757,-402295457,82513755,8438401,-939459967,615571068,468287718,234743809,1377990,
              1916698636,225731584,1181430,-1173982176,568852738,278994446,1009787904,-969903056,218109190,-1341933382,12316161,-1193570640,-617895339,15402889,1430062987,1433739178,
              1052289,278986800,-840685056,-1338709232,-840685055,64535056,-1142030160,-611403776,732583352,-351827493,1023904512,1965009493,270958884,-2113941760,268439566,704753664,
              1477496292,603984033,707804208,-33393472,870928576,-1070915841,1086314638,1392887552,686366719,-388123393,6831151,414779136,-1899459584,-17580328,-1526718273,-1174609237,
              599654408,29409279,-52253787,113712902,-490536952,1312455,113770324,-167772062,837312688,-435572489,2091104,451475594,-1964471808,12582095,-1469783035,-453348351,
              -2132366752,15397858,-469762043,-519985052,-1017060102,-722990416,215869453,-1325732565,-433986048,-469701727,-455046623,1977617057,-433737684,-419450752,-341711327,-1977490432,
              94495968,359989249,-1342149726,-75438554,-400956231,1048579428,1946157163,352765453,1589511424,211413216,665908474,1438154982,-461183062,-456882558,1437220227,-608303756,
              -1327305760,-1183783411,770179079,-426921971,1799258224,158597120,-2132399952,-337578818,-433475388,-1973296000,-419683104,-424628127,-1207899325,1122413141,-997588757,15418086,
              -528071964,1122238699,1951771197,-519193083,716215275,-1325760282,-1339955458,-1186732528,15401004,1088864650,1795618555,225771776,113702882,-1107165163,1760157815,-433344257,
              212990592,1088880560,7014086,-419516416,116849441,1962999915,737665758,-433278775,1795618432,141885696,-1866532894,-13243936,-419450630,-432623583,-1342117053,-348068352,
              725673472,-433213239,-1469782912,-502762494,-524108040,-385937687,800066463,1048674534,305397874,-873921675,-433016830,42973312,-1140101912,-728891392,-394264388,833621810,
              141197542,113714695,90,1543947814,1488846848,-1126789632,409665533,-427773921,4241543,-1207430424,417902769,-387938805,512428819,-745865197,-1901012989,-1475672344,
              -352160576,-1785284517,604699368,-387938753,-801436941,-1202711692,-387412338,-2045768694,184281284,2010135384,-1948742857,-1751598896,-2046111000,181266656,-1313290101,180742320,
              -1058479994,1959279370,-1900523505,179693710,-997847028,1477101800,41404475,-654063477,33684097,-1279783566,177858739,-997818356,-1995789080,-1056958690,-1052047637,1783760618,
              1783780160,141185856,113714695,-65464,1241958182,637534208,4982470,113649152,647168077,6293191,-953745409,25094,113649152,637534308,6620870,-423613805,
              -24713595,1787094720,117317384,117309540,1048576076,1912864868,-423579644,1681817735,376900096,1347967833,104354131,175243364,6555334,1275512336,1688211456,-2138774016,
              -33534914,1617570164,122186271,-2132397648,-394264391,57937765,1493213417,-1409340584,1342193669,114419793,65227097,1486416721,1086044504,1779090408,-970586360,25606,
              1644611366,704643072,-427432256,-436096890,-432820092,109061760,637599844,6569600,1494447882,1397774427,104343121,108134500,1678165542,-1608118272,-2065301404,880082492,
              723476586,-1961522177,-1983894537,443136261,1493854184,995184728,1975684034,610395166,1494775232,4195672,1290293584,-481732346,-1645522685,-2132396880,-435405591,-423327102,
              -423195773,-421493114,-1409930363,-1998167580,1642466316,1642525476,-1050978216,-1020590365,409606003,-1547500769,-1279786989,152430771,-997818588,856238312,-1329034304,153086129,
              -1330585206,-1207363352,317195151,199747849,-972478744,16782854,283643312,-401952758,-2065430005,-469109016,166848645,-320305436,-400510967,-2082207241,-469114136,165537922,
              859603172,1960970686,-504447478,57946684,-387851330,-1998321429,192184488,92923984,-387964738,-1470625534,-402033600,817759611,150268128,-402276631,-2132539201,649999676,
              -1106414367,243327145,-402522090,149620915,-2146914584,67114510,721985256,1549248,-1174401351,-1070989182,-85835026,-2132396624,1181430,-385649376,1048576176,1969487986,
              10938627,-2132396368,1916699130,1947350016,1916698647,276081152,2045292208,-402343950,74838656,-143273986,1776856496,-1335827214,-228398880,-453874712,1946265696,370049034,
              -356644864,-396301342,702745001,-2132396112,1974139776,-432492512,-391204736,-457575880,148301849,27813092,967852148,1625587942,-351737112,-1414464982,-919903002,1692665271,
              -85917272,-805435019,-960564107,-468128798,1946172512,370049034,-960622592,-1106711582,243327524,-400556010,984614871,-5209882,-1325784602,-237049760,1625703856,-1729569356,
              -1900008650,571840,-205644018,2146302,-498645083,-1900008453,571840,599662350,29409279,-498645083,-1900008453,134662104,-941440256,1409291270,1644611583,-940179456,
              32262,25214720,-956297031,-2097151995,-136183097,-167288088,536875526,-953808011,503324678,-419516389,1048705825,305397874,-4649355,66501120,-487717712,-289395970,
              -2132394832,-138804560,116846083,1946222608,302446165,1316233216,15409636,568770340,-729153356,-990506035,-1171950081,481297394,-389469202,-13432892,113639861,-2147483586,
              16818190,1914184424,-400378617,192092187,1445504,-483475904,-2147031320,-33513434,-222688080,113700355,-1107296149,914948126,914948122,914948124,-964493184,-2110355168,
              7913216,347604766,-1196709100,-1414856447,-31186460,568721643,1181430,-385649376,-1901068058,-1106878744,-2136415937,1757284213,1952491745,109701129,-2147431039,78857707,
              -1968125653,-1475985688,-501516928,1976303349,-510542097,-1207538968,686296718,-2046555130,104589508,548998891,-393564157,-2136472041,-572262432,216567472,1947248646,-508051962,
              -2147074328,201332030,1961037502,356417546,108334336,-387768642,-239466969,-131798013,1182027836,-335153222,-1606619100,263401332,-138753749,-2136413183,-102626188,-176829442,
              645139492,-189130773,-296374271,1022099691,-1341491883,15462058,1957313772,370049037,784220160,98167011,243277547,-1342111605,-394205635,-1058531233,-1859745275,1961101824,
              269385735,-4964352,2028506800,1975560197,-393170910,254018927,125092922,58049570,-1341757720,-1333729730,89778322,57933884,-82282776,-2132395088,-1341817112,107866122,
              -756629462,-723123989,-1899495238,1438603226,-1948570710,1606892295,-1528298123,-2130384122,-2130673470,2095055098,88991970,270820580,199950964,1445504,-499532160,-1090174232,
              12457583,361442816,-336680272,535567872,108374588,562313,1195853382,376831873,12313461,66763264,1979230444,8898312,1124333568,49986115,1979230444,8898312,
              1124268032,-1312388285,180933123,1155779,-1341744664,-1082071488,-1070399385,-472185463,1037631723,629236064,1031872319,326435647,1614667163,-1090128031,-469207624,-1260444511,
              -1600002558,35913744,141870138,1062528,91613186,1509063,568590336,15465508,113648102,-973078507,-1610574330,-1175915856,108706084,-2147138584,520132134,7683712,
              -1273793534,-25054704,-855608058,1963916819,-402427392,-318044877,1048597876,-1167851406,242548738,1377990,610591914,-1170180848,-2115502075,-401690620,547881995,-973665164,
              108363776,-387880770,1692664926,108335140,-387719234,1572734034,72149218,-768933452,1068505037,11829478,-58714419,-151816901,536875526,-672595083,1916698858,108291072,
              -402652742,-1545075664,-1595659771,281870409,-1090390855,-1070870368,-1993949042,46629637,12122338,-1127182848,568591360,15465252,1048584678,1969487986,-463672574,-335731551,
              -1331567104,-1333729727,-965679475,29190,-1897922376,654257088,1532167563,-1666558659,-469399258,-435418015,-420273055,662019425,723453470,79554779,-1340312289,-462363123,
              -420273055,1728497505,-1946156288,-1342150394,-8329662,-1342150882,-462363123,-420273055,-431771551,432929664,1030644,1021845680,-1325800956,70641709,180048067,375040,
              -768344277,-897518601,-152939984,1476396473,1191458536,129628642,375963136,1174702638,1191454440,-1017579806,541215520,-1138734257,2013493251,50456578,-2132348752,-402157640,
              12321501,-1126920704,-1545043968,571398,-661733234,1510393638,637534208,6031046,5815808,-37955954,-536801281,1962934697,42920195,-2132348496,-1947815760,-919920435,
              -1071477788,57998048,-1342015511,-1333729550,-947132771,18438,1292289536,113677056,-956235700,18950,122186240,-1960378581,-456578299,-524279157,-385649414,-206568892,
              2025816294,-687862016,1032235,16262592,1962965053,6864667,736034831,-939520064,1023473701,141885544,-1453810435,57934336,-1459482647,58000384,-66975767,11098268,
              -385649660,-189791748,1214939366,654256903,1479,38127398,-1783595009,12094438,90318352,-18691797,3967972,-773258379,654256897,1072694727,638582968,-919927454,
              3967972,57998048,-1342064663,730588821,96937727,-953810944,268370501,638582968,-919927454,3967972,57998048,-1342073879,-1199511819,-661979135,1103858499,-1958555253,
              -141867014,-292858554,-1070899131,-930359157,-125054837,-393482101,134054753,1025406301,427098113,1963129731,66683668,-92074123,-2096466684,91555327,1946615427,21162243,
              -2132347216,4720327,113704959,-956301236,18950,4765936,255770766,-579475456,5048006,4765841,255770766,-847976448,1040206008,1977614351,-425873212,653667211,
              721421510,579593417,1979375808,1292289712,-139422976,1220051174,6339328,1660945165,-2137360957,-75496477,-1148029693,1220018272,63668224,-2055945373,-2147228800,796197883,
              -2132346704,5048006,4766707,34586667,-2145618493,393606140,-2132346448,4720327,113683114,-1198325683,51314760,-385649448,-75431792,113748650,1431633992,251676856,
              -344598525,1431698305,-89070219,141197542,1208403743,-956301568,-1828696826,4982470,1241958171,1778384896,-13957304,1426442022,1241958314,1786773504,-953809080,-961915643,
              436227078,4851399,1214906368,96937479,543861333,1778748191,495656744,-1960890262,900747277,1029210342,376744533,-1437205631,-108982156,175417941,-2132396880,-402223176,
              -219611107,-1060070398,-86454023,-460295962,447762545,1894176976,31985240,-1664105728,-104804272,-419768112,-423327120,-803557263,1483794136,-1644530,512634563,1086527871,
              -3803392,1443394879,1073735297,-396431861,-400687082,116850659,1946222608,-87875838,-436202080,-135531392,1174702638,12445776,1963605080,-90389517,510981642,12153011,
              3205125,-389925959,-822214544,-400626059,1048641447,520159250,313771380,-402343751,2025390098,5433473,-294270210,-394168135,-1013120952,-1229915492,15418342,1122419082,
              -980811541,1642349286,51175562,-1180868122,635962379,1976303104,-453337866,586943585,616860384,-1654528260,-402388039,-90439668,52716004,1642513418,-464469091,974136417,
              -1963428668,1492443872,-1900523325,-17438578,-528080884,1493108968,1073794433,-390049597,256004,68101208,1075062672,-1223773145,-1022309120,-454506870,-389903617,816906207,
              -1325405464,-1710048,-782825789,119565031,812273578,1783605767,1336543032,1392978026,-919383726,-1828463942,-519460628,1504351227,123689818,852044739,1124532928,-1073021982,
              4241603,-466960242,-1056815222,-930412064,50653377,-2103088,-555219596,1377037060,1728497446,637534976,6889100,1730084646,-1329374720,82831615,-96721949,-38789259,
              113648102,-83885973,-919926093,7014134,-502893310,1976303351,-1973361421,1358676952,1077182692,548438246,-816307994,1223171680,-1564464130,1822621808,7250688,82349744,
              1975788798,-1328993432,-33953654,-136216408,-919905309,-320304464,-528439043,-1337007113,-35526528,1215781180,-1962910744,48873928,-470412621,-2102343677,1023265512,-399411367,
              -783286204,1489503208,-150715205,-1329069085,-38672252,410460988,-1962923032,-167267376,-2084502557,378077394,1822621806,-1017045248,-1849794273,-37099295,-393310536,67960199,
              -1696021370,-527776771,604302528,-1022700273,196105040,15409382,-527818524,74826762,803995572,-1595536464,-1595670293,-16058230,-1578889100,15451914,548446694,-1595539221,
              568593899,-461373205,-423359749,-1342117087,1528882720,-43915234,7022216,1355765791,-1595531088,-821375656,-423611824,-434065168,1478551200,-1328610611,-194713858,-1867448853,
              -1342132759,11069841,-1544973648,-376197120,-1800404834,100702697,721897578,96937727,-953810944,2147418693,-376066041,-1766850430,-1750040853,-1733264661,-1716488469,-1699712277,
              -1682936085,-1666159893,-1649383701,-1632607509,-1615831317,-1599055125,-1582278933,-1565502741,-1548726549,-1531950357,-1515174165,-1498397973,-1481621781,-1464845589,-1448069397,-1431293205,
              -1414517013,-1397740821,-1380964629,-1364188437,-1347412245,-1330636053,-1313859861,-1297083669,-1280307477,-1263531285,-1246755093,-1229978901,-1354989338,1780358263,113712904,-65464,
              5048006,122186387,1364810271,1967192451,-528068095,-1002796060,-2132537740,24263484,-421493041,-101976960,-1947811798,-822017864,-2119150086,1323860198,-1192260864,-1196750848,
              -1196699488,648740864,6160655,-1598030453,2812120,-2001145973,-1598510336,12102616,254192384,-1962912255,-1951683587,28859901,-268366080,1075673578,-427446272,-306265216,
              4503837,-1094474253,-930341259,-1598039922,-1900008496,4242368,11700150,-1526718279,-1951677557,12102594,-203248896,-1124015943,-175432011,-1415207515,-953747230,-690905082,
              113714716,484102568,-1341733082,639426257,-776468793,-953803550,-422461434,113714716,485151176,-804862170,-1021514031,207,0,-1610577920,9634008,-1610088448,
              9634000,196608,9633796,1048576,9636608,4194304,9636736,16776960,9636352,16776960,9636608,16776960,10161920,16776960,9633792,16776960,
              9633792,16776960,9633792,16776960,9633792,524288,8454336,1426587648,9633822,34816,14811344,1694533632,9633822,1125924352,1293699100,1461473820,
              1914465820,2048685596,-2112061924,-1977842148,-1843622372,-1709402596,-1575182820,-1440963044,-1306743268,-1172523492,-1038303716,-904083940,-769864164,1075702812,-1954152448,207742169,
              610395660,862054131,1096146,-164888789,-1982672391,856001301,1979113922,-16729498,1971848585,856001281,-1990691390,-2043312123,856001522,-464751166,-456882591,-1193270649,
              1064632320,732583354,-1946801153,-205354037,734759851,-1036800522,662043617,-997826076,-534607900,1962934456,1959928602,-1426423530,-2129955755,1946223098,1437252107,29018603,
              -1010504959,-880017621,-1430722095,1431682730,-1416189034,-164889886,-372126837,-1168812609,867019434,-1378060857,-152976845,1642386805,-2015050618,850452514,12091622,1220834560,
              -880017621,-1425872509,1219228480,-1946801237,48858059,-51795,195930485,1979441600,-13259358,731674111,-20993025,1642376191,-2015050618,12116002,1384704768,1085820934,
              1489014272,651856976,1390216,-939459967,-1612182148,-472727814,1492756200,-1161602553,-773324542,-2030769159,-456578080,-536696732,-2043354118,727770848,-1973099319,1946265824,
              -161422334,-236977468,112401781,1692715307,-85917272,-872544139,-1006701451,-919926293,1625620194,-1023284861,-1912602440,-943681832,-956270586,2047773935,-1178586368,12517632,
              -72617092,1358955705,332202164,28839794,-1898829054,2080422850,-855637575,158554387,1954610304,-337583582,4096030,1903298172,-1183055681,10551304,46629756,-102693573,
              15359860,-1342177156,-394205628,116848875,-1207893877,-661782528,246431092,-1460099352,724858120,-841864256,243987,8436305,721551800,-1144811813,28933120,1494469888,
              1048643698,-1437237762,-1169049484,-1070923648,1918440397,-1328160248,-847190459,-336862696,-482099466,-336028952,553320958,35719298,570630421,556762145,-551470076,151135490,
              -162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979951,
              1828657938,1325928438,1465252608,-1957604526,-397009172,-58656733,-1274908135,33325076,-58717066,-2146995192,41288186,-863365964,-506401486,52534971,853969625,-1947169802,
              1093044986,1090962944,-13762560,1495227927,-1956685221,1486639340,1476806281,567332701,573645349,575218237,582034005,582689457,582034097,582034097,582034097,582034097,
              582034097,582034097,597042036,606217153,-100404550,603996064,79740991,-957478900,15878,15401195,-68287476,1913214952,12630317,572373073,-402082736,-396883841,
              1918437740,1108228633,-32279296,-1007058751,-1595350410,113698818,-1014309237,243292611,-350224319,1093044464,112388096,-1014309237,1059487939,1186496256,55568614,-984958781,
              4132480,54782080,1059487939,1119387392,53995750,43313347,-2147213848,-2147467506,1912890344,38660161,1946464232,76670979,-1243067728,-1271959036,84863053,-1497880462,
              62017570,-402193432,78776307,-402195480,129107947,-402197528,145885155,-402199576,-396884005,1776813375,103999490,-1014309237,-1262056509,1093044225,-389809920,1187447342,
              -1593835518,-1054605296,1094451890,-889321868,1786052924,-2096867704,1719075327,17123014,1913032424,1958742550,27912210,1183321458,1334455810,1871326724,-1976374517,-167735131,
              1047793860,-2134842240,1416986876,-2065170000,1334455809,1871326724,-1870268917,225706240,1894253744,1334455809,1871326724,5146891,-1945739639,-390033720,-1070399016,1187431416,
              -8323068,158466176,-1962817560,-117328698,-1983892541,1720188998,105285893,-672415602,820511408,1334455809,1871326724,1090289675,-1393837196,-1979615768,167809157,-1273793344,
              1946265601,1342354434,1476495336,-1965126664,-466435133,1407775211,-1870296575,1958742528,1946265625,134604805,113640820,-402259903,703070560,-1965126907,243319747,-343932863,
              19458286,851872598,-2131719196,251695269,-2146994866,-1879011187,-370657301,1094615042,762609664,-2146994866,1879085197,1968055275,-1869774841,434835456,-165644978,67145861,
              1353714036,9471478,-1342016254,-1870329712,16705536,1527039976,-960248950,16793862,-941035541,88729600,-1073070222,1692950644,1463185920,112843571,-1484116480,-461365015,
              1975794303,-1081397737,-1976688406,1714947173,772371712,940270986,359924070,-503069821,1090963160,-346092544,440613,-346563789,1166683860,1967143948,-1994388478,269223550,
              -1868201889,-2063069440,-930348912,-2115452786,72017920,860967107,440795,-374896082,1959016992,63144712,-335940894,-1618268667,1482236138,-793227069,62148644,705019624,
              80144594,-1308248344,79620097,1476767464,-1202666664,-1269816086,94496771,-400061906,-1976695397,-1796734617,-1017620475,1996619651,-1866629092,376700928,-507457653,9412610,
              119851218,9479552,-1870329608,-1494695168,-8142074,-2139916543,37053,-812946316,-1274879552,-2066951678,1962970918,-771247082,550827724,-1979674842,604016773,147378695,
              -1979674874,-1979674459,-1058766596,1946221696,-2147373040,376783100,1965082614,-351817699,68020256,37549938,45151093,11537643,1971387520,29882088,-940121227,67269648,
              -1868201981,-2063009792,1354956944,-385917464,1347944629,1476472808,-1679228045,-1249226752,-427818864,63563968,20727410,-2047472779,1946222736,-352145393,-167153141,16814213,
              28312181,678739978,1929300712,-617392349,771753657,552183690,981460096,772502980,552255371,209009198,-1014819212,1608835587,-165610565,16814213,364579188,-1878725855,
              -396370037,300482252,-402426879,-397213453,1918567142,1397774362,1526796264,1344238168,23521363,-402099621,57803141,-402540824,1935147581,-10753789,-402522904,-397409677,
              -396820784,-154991976,268472453,-2135414411,-1870268864,175375360,9471478,-1207732990,-1518305152,136249488,-2147446619,-218068186,134531264,-1023374586,9471478,-398297840,
              1047659247,980994302,9479562,168813696,-2147125824,636195020,91605246,-351220608,1976106524,80016911,-990506892,-2146733054,166416588,175491326,-863968533,-1868199792,
              -466435328,-454494229,-2144046076,-285175643,28364683,-789126958,1057366266,-1092027648,-85137406,-1058537035,-387108349,113640379,-402259903,91489463,4261574,-121374336,
              645943491,-1975582581,604016773,-1962538816,46186496,-301729862,-1974418600,-1979675866,620793989,-1002782528,-419773608,-436147444,1967275019,-339725564,-1044345840,-393608000,
              1174663204,-33393918,82202821,-997588757,-980810522,254017771,-963935770,-1070939002,-1303320367,35842051,-749155190,-430946080,-1979651323,-83499324,-1056745383,15401648,
              91425510,4261574,-397360375,1854538257,51767297,-1156091304,-397203538,-963968289,-457121909,82083842,-790043894,-1195156734,-1974458396,-991428250,-389641470,1720320703,
              45737984,-1041759310,45213697,-1175976782,44689409,90671662,-1308450072,27977734,1476565736,1575507651,-2115462141,-1656393213,-1090766222,615252034,1009874112,-1406700224,
              78962896,-524279182,1913697282,-1260335077,-1072336376,78906080,-523235726,141689780,45408464,548668018,4269576,4275840,-1017187071,-2131367011,16702,-1920978827,
              -166723440,67145861,-2054544267,-1071382384,360022076,1912675048,1946434576,-1868201972,-1920926464,-352059248,-1869774843,-2134702592,16702,1048590708,1954545729,-1868199374,
              281343488,-461362827,-1959884096,80068608,985720192,-2145880852,-590347780,-2134842240,520130725,9479432,4261574,-121374464,-2134887741,16702,78783349,-1979659288,
              -1962916066,1177434830,-1978960640,973096238,74711406,-603792382,-1979687382,45269955,10938448,4204168,1093044824,1961101824,-2134887934,-1007353348,9479562,1964033270,
              1040631385,-1763180544,-402606848,1273495963,-1187876352,-2047474608,1946222736,1369485570,4261574,-792710400,64012525,24766544,-386397352,-2120482778,-1660879897,-33000615,
              1978219205,-1966868006,-2013248242,-805268339,1961442029,-1869774843,-1007149056,1344893112,417876660,-1966634239,17950944,1493071592,-401690429,-1062670385,-1341229575,-272242672,
              58064651,604293312,1444856591,-661733333,-13970553,7878341,-746119030,1405296478,1912621032,-76879805,-846135880,1005100053,91463163,1912615912,-401952209,-997523508,
              138208306,145752691,-198919600,-896802057,-772222837,-1261317678,1477823878,1589185139,-262739936,-160052994,-544488613,-1010775158,113703428,-1593900992,807665727,-455999052,
              108380986,4138628,-485872523,4144778,-2146441344,-822067418,4138504,-1979695200,266567896,-1069603589,202114240,-301731142,41213754,-67517448,-402017597,116850508,
              1954545727,1977879060,-1978682348,604016773,1971338432,-350964728,1961101828,851741215,-390442780,-1948059901,-1261401142,1477823878,1119423091,-272439296,-160052994,-189115453,
              855814915,-1071321911,259293244,-872482846,243331957,1535115329,-1966868136,-1662106940,-402652231,1537077140,-1327526973,-758413823,-2067036480,1962950150,1040582684,4777984,
              113642099,-402653119,997326910,9733574,1961691648,-1870268883,41164800,-1388649008,594804884,1378551738,9743752,-1930948684,-1965061121,-8001309,9741706,-385909016,
              -392429539,-1013055693,723368017,-402148272,-544473237,1692984202,256255,-1195157160,-397399235,343015456,1357383860,4122879,1117784690,1012933632,-133991328,243319640,
              -113246143,-117704981,-846200392,-1290702315,-154586364,-2147467770,-136180619,-210383874,4263552,-2137196160,2130722342,-1084767331,129171522,-1224477510,-322358526,-1069760476,
              -136180108,-210382850,4263552,468449664,92859458,244039,1257152488,1947248876,1976303114,1091469522,1610162176,-34608957,-335284294,-389840728,1273560549,-1254329601,
              -18487248,196425074,-397292034,745733851,1345060024,-1528298316,-1966633986,-23205664,1493142504,1107752537,-596373504,108326154,9473408,-1920941164,-1023344496,508609369,
              -2131921176,-2147467762,-434065377,28900128,1477823889,1364414671,-400664750,243330395,855703712,-1878603777,-2147483648,855673638,9113216,1040631488,113639424,-973078464,
              16134,4261574,-9705472,1207485416,1963130755,1040631540,645922816,-386006880,1595931772,1482381658,12122819,-1579643392,10682444,5153025,-956235101,302009350,
              1309576238,-670644480,-1942797567,-956179954,16843782,101616868,403097345,-1931214591,-469689842,-339794783,-459151872,-335862751,-81664512,-1058535650,1946601196,113639424,
              -973078411,30214,2028506800,618695404,-385649472,-461373301,-393301769,-1833898879,-957586712,30470,-265955190,1014133760,-1341098512,-330438503,1702101052,1635200828,
              84205761,-1557732367,113639684,-1979645835,81838275,11807348,276164668,619223728,1946172652,1999584283,81838359,-1947995899,1065561816,638153728,-973006685,33584390,
              347373746,443683789,-1962906463,71566808,417908875,1967030272,91619584,216564146,-1900100864,8251619,-336849176,-1269738508,1913900297,-854477818,-400985325,-277675915,
              -152864322,1467285954,-387750722,1340801111,332202164,-628488012,947000269,4329097,28889994,1930677508,184320057,-58706828,-2144373743,712249596,1912617192,1108249367,
              616663552,1959329343,-1058963257,243910666,-823459774,-152846402,57999810,-387732290,1532619679,-1903249213,216750824,-387938808,1489234797,1364417369,7119184,108190011,
              208853051,-1019542293,-1053096846,-1007091086,-92224520,-855280768,182848,1977879291,708889865,-2114289436,-58658953,-385649400,-58719798,-385649387,147325314,1364393984,
              1443241554,1977879127,-394219006,686293056,1948682987,33325056,123625461,1532582431,182985,796798762,797847431,799485845,790769442,811216674,814952588,791294106,
              790769442,818884792,790769442,-387436297,33325290,-437714059,1946600960,-1974272000,1342207262,981459584,108361434,637828840,-1056618613,1183318760,1200236280,-155561464,
              123399683,7743114,180413568,1982236896,1183340544,-1047899911,1183334180,-76642054,-390020726,-62486522,-524238198,266764292,-1609775606,1492993672,851741264,-1948200476,
              2768368,1532500595,-880062383,-1945835071,-1899953216,266568128,777607168,778347775,113662808,-1342111628,-453328128,604040097,-73275713,-155581264,179957251,-42645248,
              604010144,334032399,-1171426045,1022099953,-2145028863,720371046,16705746,-2147389208,16807230,1317014646,28446973,-402592792,113639773,-1023410060,7603910,1956692741,
              1946600960,-960299008,-383713722,1187381665,-639028994,-28916223,36300864,-1964504971,-402426622,-960298253,105971270,58583123,239569446,1543063176,28829959,-397212130,
              113699255,-1979711372,-2147453666,-633700382,1491608182,1200236035,1334453762,652867086,-146206837,-1949660183,-1262474288,520575747,183032,-930365397,-236203893,-1202518498,
              -661782528,1946272502,404669446,-1006310655,-402586594,-360650397,49971328,113650803,637534324,36505483,635996672,-388955392,170322129,-930476473,41388582,378195710,
              -1070923659,-903936165,113639426,-1274609548,734013959,-104256558,1187441387,-857173506,1200236034,-1966539262,-461308570,-1998583056,-1977156250,1183321671,-2000671751,1156119366,
              -402098943,57999830,-1023275288,587089606,-973038359,-382534074,1187381460,619213054,-401312511,259326341,-2147356952,1073771582,113640821,-1023410060,1963041256,-45708783,
              -301861190,1963058408,1946600965,-960299008,-401539514,427098351,1946243304,21751813,-1259860107,1950253057,91570176,7603910,1950253056,-87883776,-1088118300,-1578762005,
              -81518108,568721643,22079739,-138798475,-292507647,-1274984984,-1173392000,-1561591311,11796621,41156924,646455476,-389873548,963772888,-1930888309,-399346432,762642669,
              -1174339399,-50724368,-151294477,1946353222,19916818,-256239758,309505,92808940,-386276793,91554099,1979272958,-1712798770,-1946521087,5105907,115929973,518943233,
              12132102,32553473,1878260986,1190535163,309592830,1912663272,32553684,637535417,1190003850,-2098660894,-389909248,-1116405525,9176822,-1161267960,-1460928014,-972720897,
              -1157598202,12145603,-337096442,192174590,7618176,-498568064,1531571184,-1912158633,-453378048,-339794783,-459151872,-335862751,-81664512,-239403213,1980167681,292864000,
              620643978,1914715376,2000698376,-28409852,-129791487,-2126362642,1963063546,-960274444,536900614,1950253147,-71106560,-1191655125,365793280,632491890,9307894,1979310464,
              1976303115,1946601203,183205888,7603910,-1912158720,1048576000,-1023410060,-919907333,-1291716678,-2136413147,192216032,-176829442,7603910,-972690560,29702,1950253147,
              -1178402816,-138804992,145288193,-102626955,7603910,-121374336,1042627,27789173,988283764,1950253056,-1161625600,-1561591305,11796620,443908264,547933364,-1431038859,
              242499752,279462068,297011316,41223336,646447284,-58720140,-2147257327,-1161625348,-1561591311,-1185742707,-523239416,-85851534,53674427,663367385,7612040,16547931,
              1073930435,-1157317887,-1202714096,1190559744,57934590,981402808,108525926,-1019607182,1492648818,113703363,1476984948,-1900008509,29554368,-1004140684,-352249826,516171269,
              1354957060,-432936930,9307846,-434065153,-436147296,-1191502048,365793536,825347928,792015151,519779640,216551763,1961102054,1959591469,1959591486,1959591531,49053804,
              -2048326795,200048640,-855765900,-855762316,1532574068,-1796681953,15722496,-1930890005,15919104,-353634190,1946205928,-622289896,-401478912,225706163,14346396,-392362381,
              -269811605,526080413,-1979710774,-2147477466,95487204,413197522,175318016,9871584,-536212444,-352315488,1963277481,-524028251,-940138379,-1331988996,95348979,-771750471,
              180587239,94562503,-94992149,1842827,-1175915637,438188800,-1995738112,471763212,-339727872,28348419,1709793019,438209535,471743232,-1207470848,365793282,-1946513157,
              989862430,1392516126,99346588,9903754,-478095310,-402361337,-1644558945,-1948421029,7006215,1711753,512490179,507183130,126550044,-1092071268,-1759606267,-2133315072,
              57935843,1476747240,1019476893,168195568,839021796,-58670144,1007842784,1007252493,-1274711030,-1876694219,518724788,-2063826800,-264496521,-469104779,283840628,1977629840,
              1961101833,-339725819,-1007120383,1128514553,8527419,512427125,-71106432,1364414549,509040210,-1863779322,-391270172,737805485,-1469782839,-453320702,-112216992,57808333,
              -83755799,225771068,309721660,-1760657158,-353824768,243333633,-383778665,-397409823,512361749,-667811689,1946674048,79095811,1021348440,-385649153,118359122,9846410,
              1958791158,1007712564,-2147125845,1073780238,9840256,-2145391745,-1090480602,292848956,309674300,1948305398,386826248,1978146816,-1777434620,-2031546368,1977629697,-1777434617,
              166400512,141943100,9834112,24439057,-940146908,-1190366206,-2067857406,1974399720,-163386530,376701383,-1090517831,-1359812478,1161616244,-990498955,-383093376,1413218940,
              -990495371,-165579392,67115014,243275637,-1341915112,-1340021216,62908590,-75169608,703141325,18344193,1582720,-434065157,-391204832,28836773,365820805,-1979641879,
              -1090513122,146401406,-1968246272,-385649468,-276758311,-1976637313,-1310161243,1954588674,-1871123709,1930493056,388368417,214234624,-890698891,46659072,638060404,-1092026218,
              149737984,-385869786,-1007288139,-385649660,1379664025,-1007279755,-385649656,-940179315,-166431486,175448259,1946403830,-337606134,-1007251334,-2064223229,1946163238,8382723,
              1582600,1517104,1953547510,1441288197,1379686403,-527799947,-2138013717,-722071300,639648627,-58720233,-165251077,108266183,9840160,-53344533,1582624,-1767841654,
              183030272,-771745786,135013600,-1979705594,1975008452,1679402,646447284,3932185,2078874996,405151746,1008003840,-166694016,134223878,1161569140,645924212,-2131296232,
              -67070426,-434065158,-391204832,133825165,1516134175,1566071641,2002271439,147060450,-940176268,-167087088,67115014,-773258380,79951360,1396453748,113716597,305397874,
              1388908009,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,-1341819591,31779104,108334908,-375062344,1245446618,1312586100,
              1136620916,702775,410365682,1963116534,1156546923,1679415,-453637452,430098179,-10753792,1640134,1751296,1114943218,1131545148,91688252,-344537984,1918319669,
              2002271241,885293061,-940168981,1008235522,-1207536356,2078909952,1951611905,1966423071,-1543456576,1006726633,1007448635,-2135787708,11546052,-1342087703,22604272,-527806460,
              -1007226645,-385649404,1178337418,-940170379,-167414768,427033287,1711755,1842825,7407302,-391204736,466420081,602521643,281540097,1161570933,243279477,-1341652968,
              22538414,551952560,4800128,-1173916665,1704985560,116846080,1963458584,-22418951,276117308,1947256822,46659077,12066932,14739826,376704828,192230716,1946339318,
              -1795115002,-1157575191,993847438,-1900323214,11528680,645216060,1947256822,46659079,1005258613,1946403830,-391204810,548405485,-850059034,645946629,-369360746,977075787,
              893135991,-940178059,-1189841662,1304363034,1974399543,1086584325,-1007285643,-1156942589,1357637862,1963181046,-376783882,1144801003,921371255,746017596,-311145924,-378253764,
              1963116534,549713418,-1007283339,1007908099,-1341819572,-1874990096,-337058117,63174182,-974393995,41244220,-1007243029,-1142918141,267118986,-684799746,9832182,-1273662462,
              -32379936,-1965609272,-167726880,33592838,-525335948,91553596,1979710592,-39851773,1842827,1709765515,438189051,-1994558464,471763204,548469248,-1364188954,-1207952152,
              365793538,9840256,-41752068,551952560,-1291671879,-530782204,1358786281,-456578054,-536696732,1692817658,1397801979,-1275557295,645986819,734986391,-1469782839,-1963270142,
              -77535545,-166068039,805345030,-136180363,-579482626,9899648,-167253120,268474118,1532620404,-151338152,1073780486,243287925,-1337982825,-350165472,116849165,1967128727,
              -1760657356,-307216384,-83910680,-2147473176,-134179034,9897480,9897718,-401902208,-151322744,-2147444986,-189790604,-83919896,9905792,1371798335,603985824,-771444368,
              1493640384,1444871107,-397192878,-225714389,1963125441,2023524890,-1947807488,184551572,168588498,-32607004,-27757364,1530885324,526277209,1122914511,-2136413101,-21494411,
              706071952,47432191,-1964193493,1971366112,1274536462,-2141457803,-461372980,1528622073,-96334416,-352261138,-301158400,-1957668613,1107298452,-527766292,1526260864,-192888182,
              1353509704,145769026,262191342,-1325566648,-605295092,1448222459,-1957473961,-772109326,-786401814,-560863002,38027,326423051,376759306,1265945854,1886702846,58051838,
              1526762473,1516134233,-527773921,-1341930877,-729092480,-1026423631,975489,65481151,9735162,-1976679936,1257111877,-1976696597,-1031541243,616860163,1246424607,11534571,
              1347152878,-1341865341,1111682563,1290285239,1493726208,-863977078,1252584320,1021845687,-2081393408,-1973877270,-1746145599,-1341865341,1111682561,619192503,1255896320,484966839,
              -2133625600,-1802821916,-370409472,-1802764427,-1031602176,-527766523,1726606402,2090699519,1565742336,16770433,-707668527,-1964193493,986129120,-502827833,-260747787,-1017250038,
              1024343079,1029389619,1030898513,1048460767,1059733200,1033256796,1074544669,1035748042,1023753477,1065958661,503774459,1448300882,-2065148585,-1207910691,1064587,3204993,
              1966145411,-1342128637,1947466880,-1949921790,149864944,-24910127,-1979092184,771770662,1002480895,-1174348055,1049297876,-410976240,-8191952,-1341754064,-340479481,1913076749,
              -2097106935,41165055,1235354288,1662421248,-2079930880,1344149504,787516312,-252410742,604005794,-1031581129,727379460,-975466789,1476424734,1006637241,51278338,1912880345,
              1020855048,50491911,1200312537,518030858,-1545804056,840892512,-289109276,-1966801342,1245965831,525923298,1049231155,113639502,-1191182238,71049216,121375346,-1070398348,
              146081259,-217636680,1662421931,79856384,-301963872,-326858194,1252235504,249987328,-2071253504,1285812452,571648,503337151,-205507833,816857771,4800128,-1342016250,
              1721953855,1583308032,526014811,179621639,6295177,-352320792,1662421996,-289109504,-1979651262,-1974800699,-289341756,-1979651262,-1966870847,-523134777,1351911830,1648244736,
              -1962576640,190658,-2115453973,63474432,-788509170,-401689351,-1966866497,-771804449,1352109027,1611565824,1583308032,525883483,1654836999,1276021504,-145713152,5153761,
              -103692149,-1863840588,-472818689,5277579,-369117208,378273647,-1031602077,6725637,242614026,-478093276,-289207777,-385849694,-551223469,-210506800,-269803508,4859530,
              -1979692640,1560306238,-380019105,-1957429445,-154891560,838879782,-775748609,-389850144,-58720039,-2146930172,57935868,1392675817,938000779,53572608,719751920,7268579,
              -50072317,-176829186,-400510888,-50134935,-143275010,-2133105944,117459262,1704986484,64535040,-19011090,-588521846,67084264,-1962914298,737184760,-20513071,-1947389246,
              50350638,-154957075,50350630,1235243200,1008666112,1007907330,1376745219,-335291718,-76281688,-659413584,173562606,-896875557,-1510779050,-1966907809,-1410115638,-386022561,
              -58720199,-2146930172,57935868,1392657129,-1746353525,723547391,719751920,-3217181,-47450837,-176829186,-400510888,-47448119,-143275010,-1962975767,-1964119074,1958742744,
              -964014066,-1057045206,1968751418,-1009047038,1912929408,133988360,770245492,1697795,520550283,225827594,-319123205,-126549592,1946790124,216641019,-1948023042,48988392,
              -208933936,-13443190,-405668981,5277067,-13432460,4996611,-386304693,-133955920,6493835,-1962491261,-58670114,-2146930172,57935868,-402513175,-620036161,-208337292,
              -1793659989,-319123205,158664872,-193658456,1946790124,-492071429,-39196182,1912929408,133988360,-253164684,-7477247,1977289467,-1460864497,-1475775224,-319720191,-76281432,
              1202374027,2095703778,1929657597,-1954880644,149864947,-1258297647,-1202716592,281870848,1347637592,-1977163642,1011155014,1007449096,1007186957,1006924810,-1274186489,-1961833202,
              1476415636,787175771,-2147483207,91357948,6195750,-855002043,1499158544,372949758,309461066,-768948482,1914306176,179851273,-32453362,-1202693938,281870848,1520624216,
              91554216,-855506760,-50730736,637546984,-1004403574,-829759278,-387333934,-397389572,-388890594,-1977170910,-1007265012,-166890112,181150420,76031681,-53876392,-169098958,
              -165105517,1946724578,534250755,-779381866,-1191001925,1048576770,1912995913,25213702,570885049,65721322,720866034,46715081,1976565453,-756839688,-661994516,938000779,
              737708802,29524433,48676865,4800128,-805014778,115855842,-1058199009,762577635,1354023818,-141826826,-427102205,2129191722,-1326546688,-1326481121,1976368671,-389575951,
              -276758394,-872538192,954856821,-337736964,-661979668,-538393973,737708801,29524433,48676865,4800128,-804949242,1206374882,-316006650,15779713,1946346432,-1262253522,
              -1947929008,-1963971593,-387765530,-293535711,-276750256,-855760816,-947195531,-2130695704,-31436561,-51022389,-1963205911,-1964250146,-212379958,-2124521564,-2128609082,1444937927,
              -204830121,-1017225308,-212350326,-947822678,-1974001664,1605039050,1342223555,-1962846488,-2143528712,1857947251,418057978,723419180,-975270154,-1946125258,189931482,1476752854,
              251293374,50585793,1228833008,1914635776,-1235855572,-1007244284,-1441368704,-2054674772,-947707905,1976499791,1197432556,1424614370,87172859,841395370,-350224507,-774665504,
              65241319,-470395472,-125118326,79058519,12183724,-528039133,1954595574,87238147,-1408923354,587245288,-153057597,91521218,8729382,-2054609376,-947707904,1976499792,
              1197432527,-372907449,-1461126405,-2081387776,-326432532,4800128,1914635782,-1979402727,4622340,8686149,4622368,1355187013,-344600834,-422504725,1609041078,-20545280,
              5826591,531820161,-294269186,251293375,149783303,-1325599349,-1172367872,1465254016,-218102599,1952341927,-2084504034,1967786183,1946172653,-1900008686,2084488408,197168128,
              -1341885241,-2083329152,2028538052,146362874,-775368704,-486682147,-1017539080,-1178302803,11714560,24428933,-1043148551,-193789207,1157650056,5284291,-1965520045,1244067524,
              48283904,-1023148246,1347470171,1049232308,281870434,1980578904,-1190480826,281870337,372949758,863305802,-25165646,-1272285928,-1609511678,71041097,121374322,108331191,
              281872564,28900490,-1228330234,1242991128,-842334720,-320251888,-1262027015,1962208002,1946827795,1946631187,1963473942,1959922348,-404010262,-471138126,1964572288,-1179587620,
              531825971,-338252312,84083660,50529029,-1962888188,-2097126634,-1460926782,-385649660,44564609,-2065104011,-1961839616,-1979686122,15462084,-393548734,-1966801334,-347935036,
              -443880448,4791946,-1976631510,725830047,1310624707,736874752,721582531,-2147241536,67127614,1048586610,1946615881,-165105118,48794354,719096557,1228833023,74778112,
              -456129359,-729095213,-289345398,-166532350,-1979692490,-757822736,-1964471584,-738250020,1375843555,6493835,-301481341,1583308122,522133279,519819015,-1579843864,-820051949,
              1961369339,1090005,-464466145,1975560289,-401756153,-816261841,-426921904,-391270288,1424539508,-1610566443,281870409,-534725032,91521192,-714020784,-533676456,57950376,
              -455776792,-435418015,-420273055,-768869279,1642395179,427147432,1253003,12180110,-458361984,1975560289,281444368,2000743299,-532627733,-86691352,-705107724,-320329552,
              -397168427,699454951,-86646040,-58655756,-2142342528,1366606076,176221312,-28805916,-29068084,-29330228,-28871476,-385649204,-855768917,-855756428,-855767180,-1763113355,
              20179201,58051838,-33312535,-385649204,-327154763,-385649401,-855768010,870908789,-108612604,-352320822,-1157165317,-466426123,-400624917,-1073032061,-922875788,-115391116,
              -151330069,16818182,536544628,-455742471,604040097,-1935546626,-1996449274,-1996449762,-1996448242,-973038570,16818182,350751664,209659092,-527806400,585632688,-81831724,
              1352788984,185317626,617872104,-387938625,-967257075,40966,-336060421,-1031013497,167903674,-32803648,-385059640,-369361037,619511666,-1275597840,1697793,-402476207,
              -1286537197,911364,-402082991,-779419641,-346530983,-1325772071,-347871744,-348068864,-455046656,1356891712,-301662279,-2064908053,-2080644925,1968767225,-339137788,-436162520,
              -469701821,-337606080,-2042567680,1942502368,-4566517,63974399,48978634,-511588309,-373219344,29031172,-1185918718,-1460927233,1492901903,516119129,-153911576,16818182,
              -115407500,-83960343,15442404,-1578697180,10100364,9963207,243859616,378077342,113639580,1342242976,-401929288,2133119767,-528072692,1490233576,-2024648197,-1610156335,
              -102662144,-360512139,-957189375,40966,-132163238,-50426391,-400685472,378327835,646512745,-1064566681,-192227186,-1056641344,-972880672,-956246400,-63420,-2012593015,
              1153895540,-956301298,-57276,2245831,608486912,625264143,642041755,-796131328,-289344374,81838340,-14138169,709134847,-970165112,-1265423036,27125983,108265532,
              -2132409424,-1883745813,-762058743,-2132361174,776426429,6160655,139723023,251658680,-404033535,-1207951290,-796000216,-1912598344,1620184,-164904818,-1510736085,-1071357468,
              93000308,28312969,1642365158,1642466316,1642525476,-1193991959,-661782464,6887054,6760075,820567476,1946172417,1015079946,-1341885184,-1199512061,1894121485,-2132539617,
              1183378571,1642084879,183035,-2132409680,13952233,256334081,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
              541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
              541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
              541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,541543424,8847360,
              541543424,8847360,541543424,8847360,541543424,8847360,-386248448,276103188,1692848560,1962937320,-423327225,190560,-919878823,35939556,-1195115808,-991416271,
              -389773616,-87043905,-857153612,1946172671,-100682748,-1340143921,-350165487,-423130624,-1342117087,-350099964,-436097024,-1342117087,-1339955457,-341776879,-423392768,-352145247,
              -341711360,-436097024,-1342116959,-945690881,-51132,255608006,3818695,1027917312,1044694939,17760256,17762388,28840028,-268366080,944306666,1619968,548984974,
              -1195340288,-796000216,79987547,-883740566,-70194696,-58655793,393409800,-799414242,149471574,-259276797,-1795215622,-1258600138,-903913984,1229324290,1231374679,1237141898,
              1243171296,1889552986,1879492096,243990528,378208366,-1983709076,-1996461034,-973050354,28678,18409667,11542386,-1966090520,-401886992,19189711,45142154,-1966094616,
              -402345784,-393556033,-202849288,-402427136,-427163433,-957874000,-1327396145,-809506814,78701962,-1194346264,-1729623285,207758543,31621122,-528039414,-120609560,12642499,
              128982386,-1966113048,-402083632,-259338377,1894255024,-1329034545,-815142862,-1007097718,1929420264,8513539,-402651464,-494219407,1793591216,-1327068465,-815536120,162587018,
              -1966121752,-399331099,196661077,-818550773,-528056540,-120633112,-401887037,547933991,-399280647,57868378,-1979695384,-402542362,-510996691,652739504,-1327134001,-819992571,
              -31153692,196649446,-822482933,537689892,183033990,12122319,196657920,-823793653,-528066780,-120653592,638236867,-1194397464,-353861109,-401821490,229691083,-1009858840,
              52476241,-386266448,-2136420677,-486865292,-104844301,516160089,-1934076080,-1871649141,1621651940,-528069260,-460295962,-1463541135,-399477696,780259011,63963292,10362499,
              1344303872,-427062344,1910804592,-997802204,-997822234,113668582,-989855584,-973039554,-1470595067,-1341492192,-76487155,1514851666,-1331172358,-1334778355,-425662944,525885216,
              1397759695,1894273617,4096206,1953759489,16778950,263518977,-863366963,8662666,-768358914,399311540,-159320960,1316331716,1358977000,281871284,-768388519,281871028,
              281872564,41271306,861020336,-840682798,-990488041,-31296215,1976187586,-1965935905,635982562,-956409344,-797577670,-855460774,113703440,-352321280,45373963,-956690227,
              -16711674,1482381658,-768356577,-855634504,702487,-71100467,-397258722,117427675,74776684,7210751,7224963,-2129300200,-1342149570,722302208,7250880,-973050717,
              16805894,4198142,645925749,-1326448577,66238988,1511837166,-419815248,-820029408,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,-858993460,
              -394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,
              756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,
              -653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,
              -1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,
              927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,
              248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,
              1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,
              -1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,
              -766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,
              616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,
              -968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,
              1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,
              1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,
              1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,
              2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,
              1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,
              1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,
              1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,
              1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,
              543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,
              1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,
              544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,
              1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,
              1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,
              1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,
              1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,
              1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,
              1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,
              117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,
              1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,
              1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,
              -1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,
              213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,
              1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,
              -561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,
              -1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,
              54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,
              1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,
              -1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,
              1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,
              -1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,
              -1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,
              -2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,
              -385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,
              172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,
              -1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,
              1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,
              1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,
              1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,
              -437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,
              -402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,
              -931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,
              -344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,
              -1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,
              1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,
              45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,
              1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,
              1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,
              -1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,
              118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,
              -390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,
              -1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,
              938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,
              1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203,
              -1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,
              1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,
              1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,
              -385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,
              -1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,
              54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,
              -985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,
              1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,
              417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,
              1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,
              -389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,
              1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,
              -65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,
              -388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,
              259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,
              996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,
              1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,
              -662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,
              911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,
              783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,
              1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,
              1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,
              1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,
              126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,
              28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,
              218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,
              -259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,
              57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,
              -1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,
              -1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,
              1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,
              53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,
              1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,
              1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,
              1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,
              1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,
              -839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,
              -655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,
              1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,
              -386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,
              417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,
              -309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,
              1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,
              -2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,
              -20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,
              58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,
              -1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,
              1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,
              1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,
              50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,
              1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,
              -349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,
              1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,
              -789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,
              1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,
              3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,
              1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,
              -370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,
              1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,
              -997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,
              -1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,
              1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,
              260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,
              -1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427,
              -1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,
              -29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,
              -1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,
              126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,
              1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,
              1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,
              -385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,
              1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,
              50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,
              1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,
              -402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,
              1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,
              1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,
              1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,
              -1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,
              1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,
              1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,
              -398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,
              73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,
              -1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,
              773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,
              -402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,
              -628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,
              -1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,
              121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,
              53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,
              -561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,
              -822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,
              -1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,
              -1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,
              1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,
              -654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,
              1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,
              1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,
              -380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,
              -633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,
              -413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,
              1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,
              1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,
              -1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,
              -397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,
              -1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,
              -1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,
              -20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,
              738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,
              41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,
              738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,
              1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,
              1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,
              -1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,
              -1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,
              -796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,
              -623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,
              54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,
              168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,
              51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,
              1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,
              -1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,
              -320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,
              -393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,
              -1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,
              -1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,
              -543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,
              803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940,
              -1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,
              698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,
              -1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,
              1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,
              1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,
              28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,
              1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,
              588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,
              275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,
              7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,
              -872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,
              854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,
              -2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,
              5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,
              -259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,
              -20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,
              7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,
              844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,
              -872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,
              1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,
              28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,
              -402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,
              -1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,
              -538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,
              -1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,
              -561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,
              309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,
              2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,
              -1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,
              1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,
              -1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,
              658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,
              -1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,
              -1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,
              -411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,
              1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,
              179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,
              149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,
              1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,
              126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,
              1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,
              64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,
              182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,
              -838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,
              45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,
              -33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,
              851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,
              1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,
              -980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,
              -655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,
              1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,
              -1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,
              -1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,
              378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,
              -2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,
              -1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,
              -1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,
              -1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,
              -225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,
              -1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,
              0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,
              -1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,
              -344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,
              -1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127,
              -1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,
              -1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,
              1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,
              1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,
              -2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,
              1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,
              209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,
              -402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,
              -1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,
              167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,
              -397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,
              -305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,
              -1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,
              -389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,
              916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,
              154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,
              1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,
              1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,
              1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,
              1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,
              -64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,
              -1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,
              1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,
              -855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,
              1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,
              -1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,
              417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,
              -1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,
              512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,
              1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,
              -1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,
              991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,
              132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,
              717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,
              -488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,
              1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,
              -1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,
              -402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,
              512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,
              -2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,
              116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,
              -1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,
              -154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,
              1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,
              -157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,
              -1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,
              -775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,
              -82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,
              1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,
              520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,
              -61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,
              544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,
              2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,
              171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,
              -1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,
              -1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,
              548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,
              421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,
              240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,
              -160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,
              1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,
              -1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,
              4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,
              5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899,
              -2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,
              -1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,
              1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,
              -32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,
              243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,
              -1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,
              -1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,
              1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,
              -1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,
              1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,
              378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,
              133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,
              -855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,
              -1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,
              83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,
              -1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,
              12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,
              1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,
              -1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,
              -19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,
              -1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,
              281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,
              -1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,
              -372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,
              -920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,
              -385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,
              -33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,
              -102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,
              -688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,
              -191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,
              -1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,
              169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,
              -335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,
              -369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,
              420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,
              -1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,
              41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,
              146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,
              1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,
              -873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,
              1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,
              -1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,
              -385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,
              1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,
              -400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,
              1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,
              82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,
              -401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,
              -1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,
              16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,
              -1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,
              -1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,
              -1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,
              -840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,
              192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,
              684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,
              640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,
              421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,
              101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,
              -202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,
              -166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,
              57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,
              108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,
              113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955,
              1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,
              33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,
              40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,
              1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,
              430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,
              -534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,
              -1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,
              -402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,
              -7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,
              -1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,
              1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,
              -1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,
              -844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,
              -2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,
              145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,
              47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,
              -1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,
              -1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,
              1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,
              -74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,
              -619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,
              -1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,
              -1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,
              2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,
              38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,
              -1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,
              -1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,
              78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,
              309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,
              1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,
              77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,
              -1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,
              796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,
              -166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,
              -1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,
              -497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,
              780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,
              1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,
              293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,
              -1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,
              -68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,
              -1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,
              1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,
              141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,
              -688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,
              -1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,
              501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,
              1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,
              -1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,
              80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,
              78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,
              1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,
              74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,
              -19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,
              192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,
              1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,
              -2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,
              61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,
              -1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,
              -1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,
              1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,
              -1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,
              -398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,
              860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308,
              2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,
              -1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,
              -968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,
              -968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,
              113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,
              -972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,
              1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,
              -1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,
              16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,
              -1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,
              -1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,
              512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,
              -1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,
              -2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,
              -370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,
              82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,
              1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,
              1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,
              -201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,
              -19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,
              33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,
              -397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,
              -1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,
              -989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,
              75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,
              717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,
              1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,
              178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,
              1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,
              1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,
              -469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,
              130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,
              1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,
              1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,
              75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,
              -687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,
              -1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,
              603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,
              78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,
              -2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,
              2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,
              1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,
              1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,
              -102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,
              -1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,
              -1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,
              2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,
              -2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,
              -1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,
              -2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,
              -1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,
              512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,
              -1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,
              -34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,
              33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,
              -397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,
              45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,
              -14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,
              2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,
              -1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,
              512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,
              -628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,
              449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,
              -628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606,
              962081078,540423730,1380994883,1112088622,959520845,539767096,892877105,538976288,1230127440,1126193492,1262699848,168636704,1230127440,1126193492,1262699848,168636960,
              1061109567,658751,0,0,0,0,-385875968,824188914,1395470640,1702130553,1866604653,543453793,1869771333,537529714,758263857,1953724755,
              1109421413,1685217647,1920091424,168653423,858796320,1937330989,544040308,1918988098,1917132900,225603442,808525834,2035494196,1835365491,1634681376,1159750770,1919906418,
              824183309,1395471664,1702130553,1866604653,543453793,1869771333,537529714,758526001,1953724755,1109421413,1685217647,1920091424,168653423,925905184,1937330989,544040308,
              1918988098,1917132900,225603442,808525834,2035494200,1835365491,1634681376,1159750770,1919906418,824183309,1395472688,1702130553,1866604653,543453793,1869771333,537529714,
              758199857,1953724755,1327525221,1869182064,1310749550,1394635887,674067557,544109906,1431586131,168634704,842412320,1937330989,544040308,1769238607,544435823,544501582,
              762602835,1853182504,1413829408,220811349,909189130,1767124275,639657325,1952531488,1867391077,1699946612,1378364788,1394634357,1347769413,537529641,758396465,1869440333,
              1394637170,543521385,1869771333,1378364786,1394634357,1347769413,537529641,758198322,1869440333,1159756146,1919906418,840960525,1294807600,1919905125,1681989753,1936028260,
              1917132915,225603442,808591370,1699556659,2037542765,1684291872,1936942450,1920091424,168653423,825242400,2036681517,1918988130,1917132900,225603442,808656906,2035494194,
              1835365491,1768838432,1699422324,1668246649,1936269419,1668238368,224683371,1378361354,1297437509,540876869,573654562,1497713440,658729,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              -385875968,857760068,1261253424,1868724581,543453793,1394635343,1702130553,1851072621,1159754857,1919906418,857737741,1261253680,1868724581,543453793,1394635343,1702130553,
              1851072621,1159754857,1919906418,874514957,1127035184,1159746642,1919906418,891292173,1127035184,1159746642,1919906418,908069389,1143812400,1701540713,543519860,1869771333,
              537529714,758263862,1802725700,1702130789,1869562400,1699881076,1685221219,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,1766075697,
              824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,809056049,1936278573,540024939,1869771333,822742386,
              758200631,1802725700,1159737632,1919906418,1330776589,1159733325,1919906418,537529632,757080096,1869377109,1394633571,1702130553,1851072621,1260418153,1869379941,220228451,
              67187210,8388608,0,285290752,67266304,19660800,0,285370112,100820736,19660800,0,285370112,134458368,33554432,0,285453312,
              100903936,33554432,0,285453312,67266304,-65536,0,285370112,134336000,16777216,0,285343488,84073728,-65536,0,285400320,
              251888640,-65536,2048,285443328,50541568,-65536,0,285422592,84104960,-65536,0,285431552,117659392,-65536,0,285431552,
              134296064,8388608,0,285294336,117628160,-65536,0,285400320,0,0,0,0,67265536,0,0,285382400,
              84136192,19660800,0,285462784,117690624,-65536,0,285462784,117702656,33554432,0,285474560,84073728,19660800,0,285400064,
              117628160,19660800,0,285400064,84073728,19660800,0,285400320,67187200,0,0,285298688,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,870907904,-67106759,7340033,0,
              0,0,0,0,0,0,0,0,0,0,268032,-1073643517,805330944,201332736,1402530048,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,904462336,75,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978452480,
              490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85397908,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,
              -1,-14614634,1633705822,1701077858,-39066,-1903915657,-1871409293,-1837723275,-109,823888521,892613426,959985462,138226992,1702326537,1970893938,1534095209,
              1644105053,1734763635,1818978920,-10475717,1668840028,1835950710,-13685204,-14614742,1044200507,1111572543,-48061,-11974585,-11665589,1381060687,1560280915,34437,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,-385875968,555436881,623125312,673850974,137060137,1163350272,1431917650,2068860745,1107234173,1195787347,1280002632,-8510918,1129863804,1296974422,-12632516,
              -14614742,1465275732,1532647768,-41636,758724663,724972852,808661553,2097151790,34951,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,888006912,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,-385875968,15524,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,-553648128,251798786,-162201829,1894320143,74,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,238823168,1530737469,1917014333,2117984061,708759614,-1774232513,205528381,-1136473536,1266739517,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,170731576,471402015,117835522,0,173690993,471402015,117835522,
              0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              1270016256,0,0,1269885184,0,0,1278339328,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,-2122448896,-1715633755,-8487295,
              -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
              -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
              2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
              403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
              108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
              1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
              -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
              805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
              1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
              -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
              1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
              1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
              1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
              -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
              1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
              1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-1528233730,74,0,0,0,
              0,0,0,0,0,0,0,0,0,1290791168,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,-1526726656,-790001666,-803483621,1461440539,
              1696321775,1106791920,971790840,788027879,15717096,1860628992,1409242110,-940530433,-1761607441,-803463350,-803483621,-803461093,1822747,0,0,0,
              0,0,0,0,-822083584,4958953,216530944,-1259812051,1156107052,-773207253,53,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
              0,0,0,0,0,0,0,0,0,0,0,0,14703594,791753200,942617905,-1979973579]
              ,"symbols":{"POST1_TEST01":{"o":80,"s":61440,"c":"TEST.01: 286 PROCESSOR TEST (REAL MODE)"},"POST1_TEST02":{"o":391,"s":61440,"c":"TEST.02: ROM CHECKSUM TEST"},"POST1_TEST03":{"o":419,"s":61440,"c":"TEST.03: VERIFY CMOS SHUTDOWN BYTE"},"POST1_TEST04":{"o":457,"s":61440,"c":"TEST.04: 8254 CHECK TIMER 1 (ALL BITS ON)"},"POST1_TEST05":{"o":503,"s":61440,"c":"TEST.05: 8254 CHECK TIMER 1 (ALL BITS OFF)"},"POST1_TEST06":{"o":541,"s":61440,"c":"TEST.06: 8237 DMA 0 INITIALIZATION"},"POST1_TEST07":{"o":607,"s":61440,"c":"TEST.07: 8237 DMA 1 INITIALIZATION"},"POST1_TEST08":{"o":724,"s":61440,"c":"TEST.08: DMA PAGE REGISTER TEST"},"POST1_TEST09":{"o":807,"s":61440,"c":"TEST.09: STORAGE REFRESH TEST"},"POST1_TEST10":{"o":829,"s":61440,"c":"TEST.10: 8042 INTERFACE TEST"},"POST1_TEST11":{"o":951,"s":61440,"c":"TEST.11: BASE 64K R/W STORAGE TEST"},"POST1_TEST11A":{"o":1494,"s":61440,"c":"TEST.11A: VERIFY GDT/IDT INSTRUCTIONS"},"POST1_TEST12":{"o":1726,"s":61440,"c":"TEST.12: VERIFY CMOS CHECKSUM"},"POST1_TEST13":{"o":1920,"s":61440,"c":"TEST.13: PROTECTED MODE TEST"},"POST1_TEST13A":{"o":2158,"s":61440,"c":"TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)"},"POST1_TEST14":{"o":2713,"s":61440,"c":"TEST.14: INITIALIZE CRT CONTROLLER"},"POST1_TEST15":{"o":2829,"s":61440,"c":"TEST.15: VIDEO LINE TEST"},"POST1_TEST16":{"o":2845,"s":61440,"c":"TEST.16: CRT INTERFACE LINES TEST"},"MFG_BOOT":{"o":3109,"s":61440,"c":"MANUFACTURING BOOT TEST CODE ROUTINE"},"POST2":{"o":3220,"s":61440},"POST2_CHK_HFNUM":{"o":5372,"s":61440,"c":"CHECK FOR SECOND FIXED DISK PRESENT BUT NOT DEFINED"},"POST3":{"o":5749,"s":61440},"POST4":{"o":6469,"s":61440},"CMOS_READ":{"o":6469,"s":61440},"CMOS_WRITE":{"o":6495,"s":61440},"DDS":{"o":6521,"s":61440},"E_MSG":{"o":6529,"s":61440},"ERR_BEEP":{"o":6582,"s":61440},"BEEP":{"o":6644,"s":61440},"WAITF":{"o":6714,"s":61440,"c":"FIXED TIME WAIT (CX = COUNT OF 15.085737us INTERVALS TO WAIT)"},"CONFIG_BAD":{"o":6729,"s":61440},"XPC_BYTE":{"o":6749,"s":61440},"PRT_SEG":{"o":6772,"s":61440},"PROT_PRT":{"o":6793,"s":61440},"ROM_CHECKSUM":{"o":6837,"s":61440},"ROM_CHECK":{"o":6849,"s":61440},"KBD_RESET":{"o":6899,"s":61440},"BLINK_INT":{"o":6942,"s":61440},"SET_TOD":{"o":6956,"s":61440},"POST5":{"o":7230,"s":61440},"POST6":{"o":7867,"s":61440},"XMIT_8042":{"o":8167,"s":61440},"BOOT_STRAP_1":{"o":8232,"s":61440},"DISKETTE_IO_1":{"o":8521,"s":61440},"DISK_RESET":{"o":8656,"s":61440},"DISK_STATUS":{"o":8741,"s":61440},"DISK_READ":{"o":8753,"s":61440},"DISK_WRITE":{"o":8765,"s":61440},"DISK_VERF":{"o":8777,"s":61440},"DISK_FORMAT":{"o":8789,"s":61440},"DISK_PARMS":{"o":8891,"s":61440},"DISK_CHANGE":{"o":9110,"s":61440,"c":"RETURNS THE STATE OF THE DISK CHANGE LINE"},"FORMAT_SET":{"o":9153,"s":61440},"DISK_TYPE":{"o":9076,"s":61440},"SET_MEDIA":{"o":9250,"s":61440},"DR_TYPE_CHECK":{"o":9365,"s":61440},"SEND_SPEC":{"o":9397,"s":61440},"XLAT_NEW":{"o":9452,"s":61440},"XLAT_OLD":{"o":9490,"s":61440},"SETUP_END":{"o":10462,"s":61440},"SETUP_DBL":{"o":10488,"s":61440,"c":"CHECK DOUBLE STEP"},"READ_ID":{"o":10588,"s":61440},"CMOS_TYPE":{"o":10609,"s":61440},"MOTOR_ON":{"o":10655,"s":61440},"NEC_OUTPUT":{"o":10877,"s":61440},"SEEK":{"o":10921,"s":61440},"RESULTS":{"o":11118,"s":61440},"READ_DSKCHNG":{"o":11181,"s":61440},"WAIT_INT":{"o":11078,"s":61440},"DISK_INT_1":{"o":11230,"s":61440},"DSKETTE_SETUP":{"o":11253,"s":61440},"DISK_SETUP":{"o":11337,"s":61440},"DISK_IO":{"o":11762,"s":61440},"HDISK_SETUP":{"o":11369,"s":61440},"HD_RESET_1":{"o":11629,"s":61440},"SET_FAIL":{"o":11749,"s":61440},"POD_TCHK":{"o":11763,"s":61440},"HDISK_IO":{"o":11794,"s":61440},"HDISK_IO_CONT":{"o":11918,"s":61440},"HDISK_RESET":{"o":12074,"s":61440},"HDISK_STATUS":{"o":12158,"s":61440},"HDISK_READ":{"o":12167,"s":61440},"HDISK_WRITE":{"o":12174,"s":61440},"HDISK_VERF":{"o":12181,"s":61440},"FMT_TRK":{"o":12199,"s":61440},"READ_DASD":{"o":12220,"s":61440},"GET_PARM":{"o":12284,"s":61440},"INIT_DRV":{"o":12378,"s":61440},"RD_LONG":{"o":12428,"s":61440},"WR_LONG":{"o":12435,"s":61440},"DISK_SEEK":{"o":12442,"s":61440},"TST_RDY":{"o":12472,"s":61440,"c":"TEST HARD DISK READY (AH = 0x10)"},"HDISK_RECAL":{"o":12495,"s":61440},"CTLR_DIAGNOSTIC":{"o":12535,"s":61440},"COMMANDI":{"o":12591,"s":61440},"COMMANDO":{"o":12654,"s":61440},"COMMAND":{"o":12741,"s":61440},"WAIT":{"o":12843,"s":61440},"NOT_BUSY":{"o":12892,"s":61440},"WAIT_DRQ":{"o":12931,"s":61440},"CHECK_STATUS":{"o":12953,"s":61440},"CHECK_ST":{"o":12971,"s":61440},"CHECK_ER":{"o":13023,"s":61440},"CHECK_DMA":{"o":13066,"s":61440},"GET_VEC":{"o":13101,"s":61440},"HD_INT":{"o":13123,"s":61440},"KEYBOARD_IO_1":{"o":13158,"s":61440},"K1S":{"o":13357,"s":61440,"c":"READ THE KEY TO FIGURE OUT WHAT TO DO"},"K2S":{"o":13417,"s":61440,"c":"READ THE KEY TO SEE IF ONE IS PRESENT"},"KIO_E_XLAT":{"o":13451,"s":61440,"c":"TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS"},"KIO_S_XLAT":{"o":13462,"s":61440,"c":"TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS"},"K4":{"o":13518,"s":61440,"c":"INCREMENT BUFFER POINTER ROUTINE"},"KB_INT_1":{"o":13531,"s":61440,"c":"KEYBOARD INTERRUPT ROUTINE"},"KB_INT_01":{"o":13553,"s":61440,"c":"WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED"},"KB_INT_02":{"o":13571,"s":61440,"c":"CHECK FOR A RESEND COMMAND TO KEYBOARD"},"KB_INT_4":{"o":13589,"s":61440,"c":"RESEND THE LAST BYTE"},"KB_INT_2":{"o":13598,"s":61440,"c":"UPDATE MODE INDICATORS IF CHANGE IN STATE"},"UP0":{"o":13616,"s":61440,"c":"START OF KEY PROCESSING"},"T_SYS_KEY":{"o":13758,"s":61440,"c":"TEST FOR SYSTEM KEY"},"K16A":{"o":13823,"s":61440,"c":"TEST FOR SHIFT KEYS"},"K17":{"o":13842,"s":61440,"c":"SHIFT KEY FOUND"},"K17C":{"o":13860,"s":61440,"c":"SHIFT KEY FOUND, DETERMINE SET OR TOGGLE"},"K23":{"o":13979,"s":61440,"c":"BREAK SHIFT FOUND"},"K25":{"o":14059,"s":61440,"c":"TEST FOR HOLD STATE"},"K26A":{"o":14084,"s":61440,"c":"INTERRUPT RETURN"},"K57":{"o":14676,"s":61440,"c":"PUT CHARACTER INTO BUFFER"},"SHIP_IT":{"o":14747,"s":61440,"c":"HANDLE TRANSMISSION OF BYTES TO 8042"},"SND_DATA":{"o":14762,"s":61440,"c":"HANDLE TRANSMISSION OF COMMAND AND DATA BYTES"},"SND_LED":{"o":14822,"s":61440,"c":"TURN ON THE MODE INDICATORS"},"MAKE_LED":{"o":14903,"s":61440,"c":"FORM THE DATA BYTE FOR THE MODE INDICATORS"},"CASSETTE_IO_1":{"o":17549,"s":61440,"c":"BIOS1 (11/15/85)"},"INT15_EVENT_WAIT":{"o":17650,"s":61440},"INT15_JOY_STICK":{"o":17757,"s":61440},"INT15_WAIT":{"o":17911,"s":61440},"INT15_BLOCKMOVE":{"o":18007,"s":61440},"SHUT9":{"o":18199,"s":61440,"c":"RETURN FROM SHUTDOWN"},"GATE_A20":{"o":18521,"s":61440},"EMPTY_8042":{"o":18546,"s":61440},"EXT_MEMORY":{"o":18555,"s":61440},"X_VIRTUAL":{"o":18567,"s":61440},"TIME_OF_DAY_1":{"o":18709,"s":61440,"c":"BIOS2 (11/15/85)"},"RTC_INT":{"o":19095,"s":61440,"c":"ALARM INTERRUPT (INT 0x70, IRQ 8)"}}}
            • 1985-11-15.map
               F000:0050  @   POST1_TEST01    ; TEST.01: 286 PROCESSOR TEST (REAL MODE)
               F000:0187  @   POST1_TEST02    ; TEST.02: ROM CHECKSUM TEST
               F000:01A3  @   POST1_TEST03    ; TEST.03: VERIFY CMOS SHUTDOWN BYTE
               F000:01C9  @   POST1_TEST04    ; TEST.04: 8254 CHECK TIMER 1 (ALL BITS ON)
               F000:01F7  @   POST1_TEST05    ; TEST.05: 8254 CHECK TIMER 1 (ALL BITS OFF)
               F000:021D  @   POST1_TEST06    ; TEST.06: 8237 DMA 0 INITIALIZATION
               F000:025F  @   POST1_TEST07    ; TEST.07: 8237 DMA 1 INITIALIZATION
               F000:02D4  @   POST1_TEST08    ; TEST.08: DMA PAGE REGISTER TEST
               F000:0327  @   POST1_TEST09    ; TEST.09: STORAGE REFRESH TEST
               F000:033D  @   POST1_TEST10    ; TEST.10: 8042 INTERFACE TEST
               F000:03B7  @   POST1_TEST11    ; TEST.11: BASE 64K R/W STORAGE TEST
               F000:05D6  @   POST1_TEST11A   ; TEST.11A: VERIFY GDT/IDT INSTRUCTIONS
               F000:06BE  @   POST1_TEST12    ; TEST.12: VERIFY CMOS CHECKSUM
               F000:0780  @   POST1_TEST13    ; TEST.13: PROTECTED MODE TEST
               F000:086E  @   POST1_TEST13A   ; TEST.13A: MEMORY SIZE TEST (ABOVE 1024K)
               F000:0A99  @   POST1_TEST14    ; TEST.14: INITIALIZE CRT CONTROLLER
               F000:0B0D  @   POST1_TEST15    ; TEST.15: VIDEO LINE TEST
               F000:0B1D  @   POST1_TEST16    ; TEST.16: CRT INTERFACE LINES TEST
               F000:0C25  @   MFG_BOOT        ; MANUFACTURING BOOT TEST CODE ROUTINE
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows POST2 located at offset 0C96; it's actual location is 0C94.
              ;
                    0C94  +
               F000:0000  @   POST2
               F000:0868  @   POST2_CHK_HFNUM ; CHECK FOR SECOND FIXED DISK PRESENT BUT NOT DEFINED
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows POST3 located at offset 1671; it's actual location is 1675.
              ;
                    1675  +
               F000:0000  @   POST3
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows POST4 located at offset 1941; it's actual location is 1945.
              ;
                    1945  +
               F000:0000  @   POST4
               F000:0000  @   CMOS_READ
               F000:001A  @   CMOS_WRITE
               F000:0034  @   DDS
               F000:003C  @   E_MSG
               F000:0071  @   ERR_BEEP
               F000:00AF  @   BEEP
               F000:00F5  @   WAITF           ; FIXED TIME WAIT (CX = COUNT OF 15.085737us INTERVALS TO WAIT)
               F000:0104  @   CONFIG_BAD
               F000:0118  @   XPC_BYTE
               F000:012F  @   PRT_SEG
               F000:0144  @   PROT_PRT
               F000:0170  @   ROM_CHECKSUM
               F000:017C  @   ROM_CHECK
               F000:01AE  @   KBD_RESET
               F000:01D9  @   BLINK_INT
               F000:01E7  @   SET_TOD
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows POST5 located at offset 1C38; it's actual location is 1C3E.
              ;
                    1C3E  +
               F000:0000  @   POST5
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows POST6 located at offset 1EB5; it's actual location is 1EBB.
              ;
                    1EBB  +
               F000:0000  @   POST6
               F000:012C  @   XMIT_8042
               F000:016D  @   BOOT_STRAP_1
              ;
              ; IBM's 11/15/85 ROM BIOS listing shows DISKETTE_IO_1 located at offset 2143; it's actual location is 2149.
              ;
                    20E9  +
               F000:0060  @   DISKETTE_IO_1
               F000:00E7  @   DISK_RESET
               F000:013C  @   DISK_STATUS
               F000:0148  @   DISK_READ
               F000:0154  @   DISK_WRITE
               F000:0160  @   DISK_VERF
               F000:016C  @   DISK_FORMAT
               F000:00E7  @   DISK_RESET
               F000:01D2  @   DISK_PARMS
               F000:02AD  @   DISK_CHANGE     ; RETURNS THE STATE OF THE DISK CHANGE LINE
               F000:02D8  @   FORMAT_SET
               F000:028B  @   DISK_TYPE
               F000:0339  @   SET_MEDIA
               F000:03AC  @   DR_TYPE_CHECK
               F000:03CC  @   SEND_SPEC
               F000:0403  @   XLAT_NEW
               F000:0429  @   XLAT_OLD
               F000:07F5  @   SETUP_END
               F000:080F  @   SETUP_DBL       ; CHECK DOUBLE STEP
               F000:0873  @   READ_ID
               F000:0888  @   CMOS_TYPE
               F000:08B6  @   MOTOR_ON
               F000:0994  @   NEC_OUTPUT
               F000:09C0  @   SEEK
               F000:0A85  @   RESULTS
               F000:0AC4  @   READ_DSKCHNG
               F000:0A5D  @   WAIT_INT
               F000:0AF5  @   DISK_INT_1
               F000:0B0C  @   DSKETTE_SETUP
               F000:0B60  @   DISK_SETUP
               F000:0D09  @   DISK_IO
                    2C69  +
               F000:0000  @   HDISK_SETUP
               F000:0104  @   HD_RESET_1
               F000:017C  @   SET_FAIL
               F000:018A  @   POD_TCHK
               F000:01A9  @   HDISK_IO
               F000:0225  @   HDISK_IO_CONT
               F000:02C1  @   HDISK_RESET
               F000:0315  @   HDISK_STATUS
               F000:031E  @   HDISK_READ
               F000:0325  @   HDISK_WRITE
               F000:032C  @   HDISK_VERF
               F000:033E  @   FMT_TRK
               F000:0353  @   READ_DASD
               F000:0393  @   GET_PARM
               F000:03F1  @   INIT_DRV
               F000:0423  @   RD_LONG
               F000:042A  @   WR_LONG
               F000:0431  @   DISK_SEEK
               F000:044F  @   TST_RDY         ; TEST HARD DISK READY (AH = 0x10)
               F000:0466  @   HDISK_RECAL
               F000:048E  @   CTLR_DIAGNOSTIC
               F000:04C6  @   COMMANDI
               F000:0505  @   COMMANDO
               F000:055C  @   COMMAND
               F000:05C2  @   WAIT
               F000:05F3  @   NOT_BUSY
               F000:061A  @   WAIT_DRQ
               F000:0630  @   CHECK_STATUS
               F000:0642  @   CHECK_ST
               F000:0676  @   CHECK_ER
               F000:06A1  @   CHECK_DMA
               F000:06C4  @   GET_VEC
               F000:06DA  @   HD_INT
                    3366  +
               F000:0000  @   KEYBOARD_IO_1
               F000:00C7  @   K1S             ; READ THE KEY TO FIGURE OUT WHAT TO DO
               F000:0103  @   K2S             ; READ THE KEY TO SEE IF ONE IS PRESENT
               F000:0125  @   KIO_E_XLAT      ; TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS
               F000:0130  @   KIO_S_XLAT      ; TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS
               F000:0168  @   K4              ; INCREMENT BUFFER POINTER ROUTINE
               F000:0175  @   KB_INT_1        ; KEYBOARD INTERRUPT ROUTINE
               F000:018B  @   KB_INT_01       ; WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
               F000:019D  @   KB_INT_02       ; CHECK FOR A RESEND COMMAND TO KEYBOARD
               F000:01AF  @   KB_INT_4        ; RESEND THE LAST BYTE
               F000:01B8  @   KB_INT_2        ; UPDATE MODE INDICATORS IF CHANGE IN STATE
               F000:01CA  @   UP0             ; START OF KEY PROCESSING
               F000:0258  @   T_SYS_KEY       ; TEST FOR SYSTEM KEY
               F000:0299  @   K16A            ; TEST FOR SHIFT KEYS
               F000:02AC  @   K17             ; SHIFT KEY FOUND
               F000:02BE  @   K17C            ; SHIFT KEY FOUND, DETERMINE SET OR TOGGLE
               F000:0335  @   K23             ; BREAK SHIFT FOUND
               F000:0385  @   K25             ; TEST FOR HOLD STATE
               F000:039E  @   K26A            ; INTERRUPT RETURN
               F000:05EE  @   K57             ; PUT CHARACTER INTO BUFFER
               F000:0635  @   SHIP_IT         ; HANDLE TRANSMISSION OF BYTES TO 8042
               F000:0644  @   SND_DATA        ; HANDLE TRANSMISSION OF COMMAND AND DATA BYTES
               F000:0680  @   SND_LED         ; TURN ON THE MODE INDICATORS
               F000:06D1  @   MAKE_LED        ; FORM THE DATA BYTE FOR THE MODE INDICATORS
                    448D  +
               F000:0000  @   CASSETTE_IO_1   ; BIOS1 (11/15/85)
               F000:0065  @   INT15_EVENT_WAIT
               F000:00D0  @   INT15_JOY_STICK
               F000:016A  @   INT15_WAIT
               F000:01CA  @   INT15_BLOCKMOVE
               F000:028A  @   SHUT9           ; RETURN FROM SHUTDOWN
               F000:03CC  @   GATE_A20
               F000:03E5  @   EMPTY_8042
               F000:03EE  @   EXT_MEMORY
               F000:03FA  @   X_VIRTUAL
                    4915  +
               F000:0000  @   TIME_OF_DAY_1   ; BIOS2 (11/15/85)
               F000:0182  @   RTC_INT         ; ALARM INTERRUPT (INT 0x70, IRQ 8)
              
            • README.md
              IBM PC AT (Model 5170) BIOS
              ---
              [1984-01-10.json]() contains the original IBM PC AT BIOS.
              
              From [http://minuszerodegrees.net/bios/BIOS_5170_10JAN84_6MHZ.zip](http://minuszerodegrees.net/bios/):
              
              	This is the first BIOS for the IBM 5170.
              	It is dated 10JAN84.
              	It is found in type 1 motherboards running at 6 Mhz.
              	
              	U27 has the IBM part number of 6181028, and is 32K in size
              	U47 has the IBM part number of 6181029, and is 32K in size
              	
              	8 bit checksum of 6181028 = 36
              	8 bit checksum of 6181029 = CA
              							    --
              						added = 00
              	
              	There are two BIN files in this ZIP file:
              	
              	1. BIOS_5170_10JAN84_U27_6181028_27256_6MHZ.BIN  --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
              	2. BIOS_5170_10JAN84_U47_6181029_27256_6MHZ.BIN  --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
              
              The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
              
              	filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JAN84_U27_6181028_27256_6MHZ.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JAN84_U47_6181029_27256_6MHZ.BIN --output=1984-01-10.json --overwrite
              	
              Since a MAP file ([1984-01-10.map]()) exists as well, it is automatically appended to the JSON file ([1984-01-10.json]())
              when using a ROM input file (or JSON output file) with a matching filename.
              
              It is also possible to create a merged binary ROM image ([1984-01-10.rom](http://static.pcjs.org/devices/pc/bios/5170/1984-01-10.rom))
              by adding *--format=rom* to the command-line (the default is *--format=json*).
              
              These operations can only be performed using the *FileDump* command-line interface; the *FileDump* API does not support
              either the *merge* option or the appending of MAP data.  For the moment, the API can only dump unadorned ROM images; eg:
              
              	http://www.pcjs.org/api/v1/dump/?file=http://static.pcjs.org/devices/pc/bios/5170/1984-01-10.rom
              
              ---
              
              IBM PC AT (Model 5170) BIOS ("Rev 2")
              ---
              [1985-06-10.json]() contains the second IBM PC AT BIOS, dated June 10, 1985, which expanded hard disk support from 15 to 23 drive types,
              fixed some bugs, and added support for 720Kb 3.5-inch floppy diskette drives.
              
              From [http://minuszerodegrees.net/bios/BIOS_5170_10JUN85_6MHZ.zip](http://minuszerodegrees.net/bios/):
              
              	This is the second BIOS for the IBM 5170.
              	It is dated 10JUN85.
              	It is found in type 2 motherboards running at 6 Mhz.
              	
              	U27 has the IBM part number of 6480090, and is 32K in size
              	U47 has the IBM part number of 6480091, and is 32K in size
              	
              	8 bit checksum of 6480090 = 71
              	8 bit checksum of 6480091 = 8F
              							    --
              						added = 00
              	
              	There are two BIN files in this ZIP file:
              	
              	1. BIOS_5170_10JUN85_U27_6480090_27256.BIN  --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
              	2. BIOS_5170_10JUN85_U47_6480091_27256.BIN  --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
              
              The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
              
              	filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JUN85_U27_6480090_27256.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_10JUN85_U47_6480091_27256.BIN --output=1985-06-10.json --overwrite
              
              ---
              
              IBM PC AT (Model 5170) BIOS ("Rev 3")
              ---
              [1985-11-15.json]() contains the third (and last) IBM PC AT BIOS, dated November 15, 1985, which added support for 101-key keyboards and 1.44Mb floppy
              diskette drives.
              
              From [http://minuszerodegrees.net/bios/BIOS_5170_15NOV85_8MHZ_VARIATION_2.zip](http://minuszerodegrees.net/bios/):
              
              	This is the third BIOS for the IBM 5170.
              	It is dated 15NOV85.
              	It is found in type 2 motherboards running at 8 Mhz.
              	
              	U27 has the IBM part number of 61X9266, and is 32K in size
              	U47 has the IBM part number of 61X9265, and is 32K in size
              	
              	8 bit checksum of 61X9266 = 10
              	8 bit checksum of 61X9265 = F0
              							    --
              						added = 00
              	
              	There are two BIN files in this ZIP file:
              	
              	1. BIOS_5170_15NOV85_U27_61X9266_27256.BIN  --> Use this to create a U27 using a 27256 EPROM (rated at 150nS or faster)
              	2. BIOS_5170_15NOV85_U47_61X9265_27256.BIN  --> Use this to create a U47 using a 27256 EPROM (rated at 150nS or faster)
              
              The JSON-encoded ROM image that PCjs uses was created using the *FileDump* command-line *merge* option:
              
              	filedump --file=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_15NOV85_U27_61X9266_27256.BIN --merge=http://static.pcjs.org/devices/pc/bios/5170/BIOS_5170_15NOV85_U47_61X9265_27256.BIN --output=1985-11-15.json --overwrite
              
          • compaq
            • deskpro386
              • 1988-01-28
                • 109591-001.hex
                  FB FF E3 97 00 56 8B 60 89 04 46 00 C3 0E 42 8A 
                  4A 0F 42 C3 53 06 48 8E B1 B5 B0 E8 00 80 A3 00 
                  10 FD 01 08 A3 00 59 58 53 55 D0 C5 0E 00 C5 00 
                  26 07 00 C7 02 FF FC 8B FC FC FC FB 26 06 00 74 
                  A0 00 C1 14 38 4C 74 00 4C EB A0 00 C1 C0 E4 E0 
                  5D 5B 53 52 57 0A B9 00 08 33 F7 80 30 07 95 00 
                  4F EF BE 00 00 B9 00 A5 BE 00 00 B9 00 A5 5E 59 
                  C3 51 57 E8 00 08 70 00 8E BE 00 89 15 E4 5F 59 
                  C3 1E B8 1C D8 C0 33 BF 00 04 F3 BE 00 00 BB 00 
                  E3 00 80 00 44 88 04 44 92 04 00 10 B8 F0 10 F7 
                  05 F8 D2 89 02 54 C6 05 C7 07 BE 00 C8 9A 6C BE 
                  00 00 B3 E8 00 20 B8 00 92 56 BE 00 D0 92 4C BE 
                  00 00 B3 E8 00 48 B8 20 92 36 BE 00 00 B3 E8 00 
                  06 00 C6 57 80 58 B8 F0 92 16 8C 8E BE F8 A9 B9 
                  00 D1 F3 07 61 C7 FF 8A C1 04 EF 89 02 7C 88 05 
                  44 00 C3 B0 E8 33 C0 03 EB B0 E8 33 E0 95 45 A3 
                  00 98 3D 8A B0 E8 33 78 F8 C3 B0 E8 33 E0 CC 0A 
                  75 80 EF 8E 1E 58 56 D3 5B 22 BA 00 A6 B9 00 04 
                  C3 E8 44 E8 00 00 BB B6 19 E8 44 A1 00 C0 40 03 
                  84 BE B7 FB 74 80 FF 6E DB 6A 10 C4 03 03 69 02 
                  02 40 DF 56 13 80 10 C4 0C E8 3C 74 3C 74 80 30 
                  DF 3A 1D 80 10 C4 30 E8 3C 74 3C 74 80 30 DF 1E 
                  27 80 10 C4 C0 E8 3C 74 3C 74 80 30 04 DF 09 8C 
                  8E E8 5F C3 8C 8E BE 80 E4 00 AC E0 FB 0E 00 BB 
                  B7 0F E8 44 FE C3 07 07 07 07 07 07 07 07 07 07 
                  07 26 00 66 C3 3C 77 06 7E B4 E8 00 8B 02 02 9A 
                  8B 04 36 76 8B 10 D8 AC 5E 80 00 76 3C 74 3C 74 
                  3C 74 3C 74 93 93 1E B8 00 D8 E8 00 59 D3 07 7E 
                  F6 00 75 B4 E8 00 8A 49 88 01 3C 74 3C 74 3C 74 
                  3C 74 B9 00 09 2E B4 E8 00 C2 16 00 14 D2 C6 FE 
                  75 FE B0 B4 E8 00 D2 02 08 C3 0E 02 EB 50 06 00 
                  8E BB 00 C8 39 07 58 03 10 9C E8 6C 0E FC A0 84 
                  F2 B0 EE A1 84 64 E8 42 0C B0 E6 BB 00 1B BE 84 
                  04 E8 09 54 1C F2 EE A3 84 ED 56 72 BB 01 F9 E8 
                  09 38 64 E8 64 30 F9 2C 47 EC C0 03 EB 81 01 74 
                  3C 75 E8 64 12 2D EC A2 BF 00 BE A5 84 04 A4 84 
                  2F B9 00 00 E8 42 04 A6 84 21 BF 21 00 D2 D4 03 
                  02 00 B8 00 8E C6 00 FF C7 8D 00 C6 8C FA DB FF 
                  F0 FF 88 4C B8 00 C0 C7 00 26 45 FF FC 26 05 FC 
                  FC 0B 26 05 04 C1 0B C3 3A 74 FE EB 81 80 76 89 
                  8D 88 8C 07 B4 C7 82 80 C6 8F FF 06 00 BD 00 12 
                  81 80 0B 74 88 66 89 67 88 69 81 64 41 C3 7F 84 
                  06 00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 00 
                  06 00 FF 06 00 00 06 00 C6 4D 92 06 00 00 1E 50 
                  8E B8 00 C0 F6 FF 00 FC F3 BB FF 3F E2 8B 1F 06 
                  00 FF 06 00 00 06 00 C6 55 92 06 00 C6 57 80 1E 
                  00 B8 00 D8 61 0C E6 A0 00 06 00 24 26 45 58 61 
                  C6 10 B1 70 71 E0 B0 70 71 00 B9 3F CB C1 02 DB 
                  E3 26 5D 26 5D B5 32 C1 04 89 06 FE E8 88 26 45 
                  B9 7F 00 32 FC AC E0 FA D4 C4 88 C6 00 FC 07 E8 
                  00 60 8B BB 02 C1 74 BB 02 C1 74 BB 01 00 F7 FE 
                  88 90 8A 24 3C 74 BB 04 C1 75 BB 08 C1 75 BB 28 
                  00 F7 FE 88 91 C3 FD 00 04 8A C0 02 03 02 05 C3 
                  EB 3C 75 80 04 E7 B8 00 D8 02 24 0A A2 00 32 A3 
                  00 DB 02 01 FF 00 F7 BB 04 E3 CA 16 00 C7 50 FF 
                  C7 52 00 C6 54 C0 06 00 C6 56 00 06 00 1E B8 00 
                  D8 61 E0 08 61 84 1E 00 06 00 E6 FC FC FC FC FC 
                  FC FC FC 86 E6 8B 5B C3 00 00 00 00 FF 00 92 80 
                  FF 00 92 00 FF 00 9A 00 FF 00 92 C0 FF 00 9A 00 
                  FF 00 92 00 FF 00 92 00 FF 00 92 00 00 07 00 00 
                  07 00 FF 00 00 87 00 87 00 88 00 0F 16 07 20 0D 
                  00 22 2E 2E 87 08 8E B0 26 1D 84 FC FC FC FC FC 
                  FC FC FC 10 8E 0F 00 25 FF 7F 22 EA 87 F0 0F 1E 
                  07 E5 0F 16 07 20 0D 00 22 2E 2E 87 08 8E E4 8A 
                  0C E6 8A 26 1D C6 00 FF 61 B2 0F 16 87 20 0D 00 
                  22 2E 2E 87 20 8E B0 E6 B9 FF E4 A8 74 E2 E9 00 
                  FF E4 A8 75 E2 E9 00 60 08 7C C7 00 00 00 EB 66 
                  00 EB 66 00 00 75 EB 66 06 C0 00 16 16 00 C7 00 
                  00 00 EB 66 06 C0 00 98 00 C7 00 00 00 EB 66 06 
                  C0 00 A0 00 C7 00 00 00 EB 66 06 C0 00 03 B3 70 
                  71 E0 B3 70 C4 20 71 12 B3 70 71 E0 B3 70 C4 DF 
                  71 10 8E E9 FE 53 52 1E 40 8E 81 03 8B 8A 78 D1 
                  8B 08 0B 74 50 E4 0B CC 49 CC 5B EB EE EB EB EC 
                  F8 28 B8 90 CD 58 11 24 E8 08 24 78 E2 FE 75 EB 
                  EB EC F8 04 01 2D EC 1C 01 00 00 24 EB 42 B0 EB 
                  EE 05 E8 3C 04 00 00 4A 42 00 00 24 34 8A 58 E7 
                  5E 59 CF 3E 64 36 AB AD AF 6F 1D 33 83 91 D6 E4 
                  FA 51 8B 50 52 1E 0B 20 20 20 55 ED C8 D8 46 8B 
                  04 8A 80 F2 05 F9 75 43 4E B5 EB 8B FC 86 AC 00 
                  09 C1 F7 8B EB BE 89 DE 3C 74 3A 75 8B 08 E4 2B 
                  4E E6 FF 95 EB 1F 5A 58 59 BB 1F 5A 58 59 8B 80 
                  01 03 4E 80 00 04 4F 02 47 8B 3B 75 80 01 06 4E 
                  FF 02 FC 74 4F 4E 4E EB 47 46 46 EB 83 FF 0D FC 
                  74 4E EB 46 EB 80 01 03 4E 80 00 06 4F 4E 04 47 
                  46 8B 80 00 04 4E 02 46 8B 3B 75 80 00 08 4F 4F 
                  4E 31 47 47 46 29 FE 75 80 00 06 4E 4F 19 46 47 
                  13 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 4F EB 
                  47 C3 F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 74 
                  4E EB 46 C3 8A 4A 8B 02 D3 04 D3 CA C4 74 87 2A 
                  2A F6 F6 EB 2A 2A FE FE E8 02 21 3E 00 72 80 49 
                  03 13 52 16 00 C2 A0 00 F7 5A EB 80 49 04 07 3E 
                  00 75 8B 2B 81 FF D1 8B 8A F6 32 03 D1 03 4E 97 
                  C6 DE F0 E3 C6 01 04 D8 DD E0 C7 0A 74 3A 73 2A 
                  8A F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 75 B8 00 
                  D8 E4 74 80 49 02 12 3E 00 77 8B 63 83 04 65 EE 
                  80 49 06 04 E1 E2 50 52 F8 C5 ED BA 01 E2 C1 06 
                  00 8B 98 40 F7 F7 00 74 F7 F7 81 F0 80 49 06 01 
                  03 8C 8E 96 53 DF C0 30 C6 2C F0 D0 D0 8B 8B 8B 
                  8A F3 8B 8B 81 00 81 00 8A F3 03 03 FE 75 58 F0 
                  E6 E6 8A 8B 8A F3 8B 81 00 8A F3 03 FE 75 C3 66 
                  ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 61 F3 
                  61 BB 00 00 33 66 C5 1F F6 00 9E D1 9F 46 46 C3 
                  F3 23 61 C0 00 1B 09 66 D3 83 04 DA B1 66 D3 66 
                  7A 1F C0 C6 00 E4 0C E6 24 E6 59 D6 F9 E8 00 8A 
                  F6 22 D2 88 00 E8 00 22 D2 D0 79 26 05 26 00 66 
                  C3 22 0A AA 26 00 66 C3 FF 56 D1 73 BF 20 E2 E2 
                  E2 E2 FA E2 E2 FA FE 3E 00 73 D1 D0 8A F6 8B D1 
                  D1 D1 F6 80 07 C7 FA B0 E8 00 16 0A 33 84 75 B0 
                  B4 CD F6 01 01 5A 4F CF B9 00 AD 74 E2 59 EB E8 
                  03 EE E2 F8 F6 87 04 FF 31 00 50 1E 40 8E B8 00 
                  F1 1F 58 8B 83 10 8E 8B 8E B9 04 CB D1 49 FC 00 
                  BE 8E 2E A1 02 06 02 03 00 3D 01 0A 24 B8 E9 8C 
                  AB 6C B8 8D 8C AB 53 AB C8 8E 26 06 00 90 8C 92 
                  FB DC BF 03 85 B4 CD EB 33 8E 8B 52 85 75 E9 59 
                  C0 2E 02 B4 CD B8 0C 21 3D 75 C6 FF 0D 06 19 21 
                  41 5F 41 DC 59 24 A2 03 B3 C9 0E 03 0E 03 C7 93 
                  00 33 1E DB 1A 21 BA 03 27 21 8E 8B 14 8B 04 1F 
                  49 BA 03 27 21 02 75 91 C8 8B 81 E0 8E 33 B4 CD 
                  1F 85 B4 CD B4 CD 80 00 0C 3A B4 CD B8 0C 21 C5 
                  DD 80 B4 CD CB 00 0A 6E 65 74 43 4D 41 20 53 44 
                  53 64 73 65 74 0D 45 74 72 64 69 65 73 65 69 69 
                  72 24 0A 0A 65 6E 65 74 64 73 65 74 20 6E 64 69 
                  65 41 69 20 65 65 73 72 0D 53 72 6B 20 6E 20 65 
                  20 68 6E 72 61 79 0A 00 41 49 41 20 58 00 FE A8 
                  74 E8 02 27 05 E8 39 C0 F7 EC 80 0B 06 4E 01 88 
                  41 C3 D6 A8 75 32 EB E8 FF 5B D9 F6 10 0F 27 FC 
                  75 80 03 EC EB E8 44 87 03 08 07 04 02 61 27 AF 
                  E8 3A 46 50 46 02 AD C6 05 E8 5E 88 05 06 F7 EC 
                  80 02 80 26 00 4E 01 C3 FF 8F 74 F6 80 44 F8 E4 
                  46 3C 72 B4 81 16 00 30 C0 22 93 01 10 74 02 11 
                  15 03 0B 97 07 01 19 EB B0 E8 43 37 88 E8 44 C7 
                  E8 01 27 27 F6 10 03 01 C3 1B 8A 88 02 76 8A 05 
                  27 35 6C 75 E8 43 7E 00 03 E8 24 3C 73 E8 39 EF 
                  B4 88 E8 43 06 46 04 46 01 E8 5C 74 E8 39 D1 B4 
                  88 E8 43 06 46 04 46 01 E8 5C 74 E8 39 B3 B4 88 
                  E8 43 04 46 04 46 01 E8 5B 74 E8 39 95 B4 88 E8 
                  43 06 46 04 46 01 E8 5B 74 81 16 00 75 8A 02 27 
                  6D 8A 41 EB EB E8 42 17 CC 80 06 75 C0 04 0F 04 
                  05 07 EC E8 43 C4 E8 00 27 3B C6 02 8F 00 C0 76 
                  9D 32 8A 06 FC 72 B4 81 16 00 19 00 15 0A 74 B4 
                  A8 75 04 24 2C 74 B4 C3 DB 5E 81 90 C3 9C E4 8A 
                  E4 E4 2A 3C 77 E4 9D C3 F6 B0 EE F6 E8 F2 A8 84 
                  BA 03 FD FD FD FC 0F C0 03 56 83 0D EC C0 D8 36 
                  00 40 8E C6 40 FF 14 C6 06 C6 07 E8 00 46 01 92 
                  C6 05 E8 5C AF 84 F2 B0 EE 26 00 83 0D B3 E0 23 
                  24 86 B0 E8 23 C0 D8 C8 1E 00 02 C5 3E 00 02 C5 
                  ED 0C CD E5 80 01 2E 00 E8 41 40 39 A0 8A C0 04 
                  E4 0A 74 86 E8 00 08 E8 00 1D 0E B3 E0 C7 0C 86 
                  E8 22 A5 8A 80 20 8E B8 FB FF 05 07 CD B4 E8 41 
                  ED C6 00 46 30 EF C6 05 E8 5B 04 0B 8A 06 05 B9 
                  A8 FA 75 E2 EB E8 FE A8 75 80 05 74 FE 05 D3 07 
                  01 7E 00 05 6A EB B4 B0 E8 41 99 88 E8 41 01 8F 
                  05 3C 74 3C 75 B0 EB B0 3A C3 0A 6F 2D 79 74 6D 
                  64 73 20 72 64 73 20 72 6F 0D 72 70 61 65 61 64 
                  73 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 0D 36 
                  32 44 73 65 74 20 6F 74 52 63 72 20 72 6F 0D 24 
                  02 B9 FD 80 70 71 FF 0A F4 74 B9 FD EC E5 FF FF 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  8B 66 53 FC 01 85 5E 8E 8B 02 1F FB 75 B0 E6 FF 
                  02 A5 81 0F 74 B0 E6 1F 66 5D F9 B0 E6 E8 5D 07 
                  A0 BB 00 DB 20 66 11 00 8B 06 66 E1 00 00 0B 66 
                  66 C0 18 66 A1 00 AB 26 B9 00 66 E2 0F F0 AB 21 
                  66 66 C0 16 66 BE 00 66 8C 66 8C 66 B9 00 66 E2 
                  BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 
                  00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 
                  33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 
                  8B 02 AB 8B 66 FF FF 66 66 C0 44 66 66 00 92 66 
                  66 C0 E8 E0 66 B8 FF AB B8 00 00 AB 33 8C C1 04 
                  AB FF 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 
                  44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 
                  66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 
                  BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 E8 
                  5B 33 BF 13 07 5B 58 CF 9E 9E 97 97 97 97 05 0B 
                  E4 F0 E6 FF 70 C3 26 00 0A 75 80 87 10 C3 0A 74 
                  8B 63 83 04 65 0C A2 00 EB 8B 63 83 04 65 24 A2 
                  00 5A C3 A6 AC AC 80 D0 A7 8B 8B C2 98 98 A7 8D 
                  8C D1 A7 83 83 83 83 97 5A 5B 5F 1F CF FF FF FF 
                  FF FF E9 03 FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF D3 FF FF FF FF FF FF 
                  E9 03 42 74 80 49 04 0A 3E 00 74 EB 90 AE 8B 63 
                  83 06 E0 A8 75 FA A8 74 8A AA FB EE 80 49 04 07 
                  3E 00 75 E8 2A 47 FC E8 F4 2E 3E 00 72 80 49 07 
                  36 E3 64 8B 63 83 06 D8 A8 75 FA A8 74 8B AB E2 
                  C3 3E 00 72 80 49 07 08 E3 36 F3 C3 52 8A 06 3E 
                  00 CA DA 6E 0A 79 33 8E C5 7C 25 00 E0 E0 E0 F0 
                  FF 74 83 10 C4 06 D7 C7 53 F8 E3 B5 AC 08 E2 E2 
                  E0 02 D3 C9 F2 C6 E2 FE 75 5B 07 8C 8E B9 00 F4 
                  D0 79 26 05 81 FE AD FB 03 33 AB EF 1F E4 EF 01 
                  75 83 10 2E E3 D1 DE 04 8B AC FC 03 32 AA C7 1F 
                  D0 79 26 05 81 B1 E2 81 3F 4A D8 B8 C8 E8 00 80 
                  76 B8 E0 D8 DB 3F AA 39 F6 00 AD D8 DC F9 18 40 
                  8E 80 12 FF 00 BB B7 0F E8 2D 13 40 8E 1E D8 03 
                  50 EC 5E 58 B8 00 D8 8E 33 81 55 75 33 33 8A 02 
                  E1 D1 02 E2 75 B1 D3 52 40 8E 1E D8 03 50 F4 33 
                  36 1C ED 0C B8 00 D8 0E 00 1F 58 D8 5A DB DA C3 
                  1C 80 72 EB 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 
                  C2 1E B8 C0 27 75 3D C7 F6 C0 1F 1E B8 C0 E8 00 
                  74 50 C2 4B 58 80 76 07 C3 8E 33 81 55 75 33 33 
                  8A 02 E1 D1 02 E2 75 B1 D3 8C 03 C3 06 BA 50 8C 
                  B9 00 5E 1F 61 80 8C 03 33 C3 D8 40 8E 1E 03 50 
                  EC 5E 58 C3 2E 0C 46 3A 74 E2 F8 05 2E 04 59 FF 
                  B1 B3 B5 B7 B9 2D 08 71 65 74 75 6F 5B 0D 61 64 
                  67 6A 6C A7 FF 7A 63 62 6D AE FF FF FF 21 23 25 
                  26 28 5F 08 0B 1A 1B 1C 27 28 29 2B 33 34 35 39 
                  37 39 34 36 31 33 2E 00 77 84 73 74 75 76 8D 8E 
                  8F 90 91 92 93 00 1E 1F 1B 1D 0A 1C 00 97 98 99 
                  9B 9D 9F A0 A1 A2 A3 FF B0 E6 B0 E6 58 23 FA F7 
                  C2 EE E0 EE EA 32 8A EE FE AC 4A F5 E5 20 8E 06 
                  FF 00 F3 8B 8A 03 FF FF FF FF FF FF FF FF FF E9 
                  00 FF FF FF 06 01 85 17 84 40 8E B0 E6 E6 32 E6 
                  26 06 00 74 26 26 00 07 CD CF 55 56 1E EC 8B 26 
                  0E 00 D9 00 8B 06 F0 E6 00 E8 8B 08 E3 F0 C3 D8 
                  10 AC E0 F8 D8 05 F5 0D AC FF 81 08 F8 46 9B 66 
                  83 10 59 5B 07 CF B0 E6 B0 E6 B0 E6 58 0A 1E B8 
                  00 D8 32 FA 06 00 0E 00 16 00 1F A8 1E B8 00 D8 
                  89 6E 89 6C C6 70 00 58 E9 61 18 B0 E8 18 F0 02 
                  41 8A B0 E8 18 E8 72 B0 FA 2F A8 74 FB F3 E8 FF 
                  00 E6 22 B0 8A E8 18 04 E5 14 B0 E8 18 02 FB FE 
                  D2 02 01 E0 0B FC E9 61 BC B0 E8 17 D0 08 E5 8A 
                  B0 E8 17 C8 32 D7 8A E9 61 9A B8 00 CE B0 8A E8 
                  17 08 E6 C0 B0 8A E8 17 0B AF 0C 24 8A B0 E8 17 
                  32 E5 A2 E9 60 B0 E8 17 20 08 5B C0 CA 00 0A 83 
                  A8 75 B0 8A E8 17 03 E1 76 B0 8A E8 17 A1 FE A1 
                  0B 5F 0C 8A B0 E8 17 90 FA 0B 4D 24 8A B0 E8 17 
                  7E 8A B9 F4 84 75 E8 F3 F6 CC EF 80 B4 C3 C0 FE 
                  26 05 F9 F9 26 05 F9 F9 C3 0E FA 0B 0E 03 EB 90 
                  A8 75 9C B0 E8 16 E8 00 02 CF 01 33 C3 8E FA E3 
                  0E 03 EB 90 A8 75 9C B0 E8 16 E8 00 02 CF 01 33 
                  C3 1E 40 8E 66 10 66 FF 00 66 B0 E6 E4 A8 66 74 
                  66 00 00 1F E8 FF 68 3E 00 74 80 49 03 02 58 FF 
                  C7 74 8A 00 00 09 01 46 E4 EB B8 F0 3B 74 FC AB 
                  C8 FB 65 8A 66 8B 63 B9 00 A0 BB 01 3D 83 04 65 
                  EE 0F D4 B4 E8 E4 02 CA B4 E8 E4 FC AD E4 A8 58 
                  25 EE 66 04 50 48 8E E4 8A 0C E6 8A 00 C6 00 FF 
                  C4 61 1F CB F7 7E 00 17 A0 75 B0 E6 E4 A8 74 24 
                  75 0C EB E8 34 2E B4 74 BE A0 06 A8 74 BE A0 0F 
                  8A 8A 80 06 FF 74 BE A0 E3 74 BE A0 31 24 B4 FE 
                  74 FE 74 83 05 F3 46 00 C7 04 00 46 00 46 00 C7 
                  0A 00 2C 75 EB E8 34 DC 4E 2E 54 89 0A DB 14 75 
                  E8 34 05 8A 32 89 02 8A 02 6E 2E 4C 88 04 46 01 
                  20 75 E8 F1 3F 75 87 E8 F2 F7 1F 88 06 C0 66 FE 
                  87 C3 09 FB 02 4F 21 09 22 04 4F 21 F7 CD 8B 04 
                  B0 75 E8 33 26 01 1A C6 3C 74 83 0C 03 0C C6 2E 
                  54 74 83 06 3B 01 0C 35 00 28 3B 01 36 13 80 00 
                  07 F7 0C 87 2E 54 E8 F1 17 4E 2E 54 89 0A 66 01 
                  33 EB 81 16 00 0C C0 1A 4E 01 B4 32 E8 F0 3F 75 
                  87 50 CC 58 F7 F7 01 27 FB 02 27 08 02 4F 15 03 
                  4F 22 03 4F 2F 04 4F 3C FF FF FF FF FF DF 25 09 
                  FF F6 08 80 02 02 2A 50 0F 27 DF 25 0F FF F6 08 
                  00 02 02 2A 50 0F 4F DF 25 09 FF F6 08 80 02 02 
                  1B 65 0F 4F 8B 20 2A 38 FF 00 00 00 FB 1E BF 00 
                  DF 01 33 1D 06 00 75 80 A0 01 51 FA A1 FE A1 E8 
                  00 EB F6 A0 01 03 EB E8 00 26 00 EB F9 B4 1F CA 
                  00 B0 E8 13 40 8A B0 E8 13 FB FA 0B 89 24 50 E0 
                  0B 84 58 C3 1E 00 06 00 16 00 0E 00 FB FA 74 4A 
                  0F 86 C3 E4 01 EC F0 8C BA 02 24 3C 75 33 33 33 
                  33 EB 55 EC 8B 88 00 E8 00 F9 0F C7 0C 00 5E 89 
                  0A E0 24 32 75 8B E8 00 D9 5E 3B 0A E2 2C DF 3E 
                  2B F6 01 03 5E F6 02 03 5E F6 04 03 5E F6 08 03 
                  5E 38 00 B4 58 5B 5A 5D C1 04 EB C1 04 EA F8 50 
                  00 43 40 C8 40 E8 C3 5F 53 40 8E F6 A0 01 2E 06 
                  00 06 C3 1E 00 1B 07 E4 24 EB EB E6 FB E5 F6 A0 
                  80 F9 26 00 F8 01 5B 5F 02 FB 5F 06 B8 00 D8 26 
                  00 16 00 00 80 F3 74 1F 61 03 FB 5C 26 07 FF C8 
                  E0 26 47 8C C1 0C 88 04 C6 05 8D 28 C7 FF 8C C1 
                  04 89 02 D0 E8 26 47 26 47 92 56 C8 C0 36 A5 E4 
                  8B E8 00 07 5C 26 57 26 47 26 07 00 B0 E6 26 01 
                  E8 00 89 02 C2 26 47 26 07 FF C6 05 26 01 0F E0 
                  01 0F F0 FF 49 33 0F D0 28 8E B8 00 D8 18 8E FC 
                  F6 FF 00 70 D1 66 A5 F7 01 74 A5 80 70 28 8E 8E 
                  8E 66 0F 00 25 FF 7F 22 66 EA A3 F0 0F 1E A1 5C 
                  E8 48 19 D1 64 41 75 B0 E6 E8 48 07 FF 64 2F C3 
                  02 61 40 17 4E E8 01 02 04 04 0C E6 24 E6 B4 8A 
                  E6 EB 8C C1 04 C6 51 C1 C6 E8 03 C1 0C C3 40 8E 
                  8E 69 8B 67 E8 00 00 70 07 86 E4 86 55 EC E4 0C 
                  66 FE 81 06 00 0A 66 BF 81 06 00 CF B3 75 B0 E6 
                  E8 47 12 DD 60 A1 75 B0 E6 E8 47 04 03 80 5F B0 
                  E8 10 E0 30 99 CF 5F E8 FF 06 FF CA 00 53 5C 26 
                  07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 5B B0 E6 
                  8A E6 B0 E6 B0 E6 B0 E6 B0 E6 8A E6 B0 E6 B0 E6 
                  B0 E6 8D 08 0F 17 5C 26 01 55 EC 46 30 5D 01 0D 
                  00 01 2E 2E A1 C0 00 B8 00 D0 18 8E B8 00 C0 E4 
                  CA 00 1E B8 00 D8 10 80 06 75 80 04 75 83 02 75 
                  BB 00 47 92 20 8E BB FF 8B 26 07 0F 05 FF EB B8 
                  00 DB 1F C3 C8 C0 F5 33 C3 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A1 00 30 3C 58 17 07 
                  15 1E 00 E3 C0 04 FF 8A 42 EB B0 A2 00 49 BB B0 
                  B4 3C 74 BB B8 D4 8E 89 63 98 B0 83 04 83 04 C0 
                  4E A2 00 8A 12 A3 00 E3 8B 1A A3 00 EB 8A 2A 80 
                  3F 65 24 0A A2 00 8A 32 88 66 B9 00 E8 00 8A 0A 
                  8A 0B 49 24 3C 75 26 7C 0D 0E C5 47 8A 8A E8 00 
                  C8 89 60 A0 00 07 07 04 00 73 B8 07 FF 00 F3 1E 
                  BF 00 C0 08 F3 F6 87 10 06 F4 E8 1E 65 83 04 C3 
                  25 00 03 E0 0E F1 FC 72 FE 59 32 8A 49 1E F6 DE 
                  36 00 8A 3A 03 56 B2 E9 F4 5E D8 C0 C3 07 62 98 
                  52 26 00 4E 5A D1 B4 E8 05 D1 8B 50 E9 05 66 0A 
                  75 80 1F E0 C3 0B 05 E3 E3 24 0A A2 00 C2 EE A0 
                  00 46 A0 00 46 A0 00 46 C3 28 50 28 50 08 08 10 
                  10 40 40 40 40 28 29 2E 29 30 30 30 30 00 10 20 
                  30 01 07 1B 1B E2 1B 1B FF 95 1B FE E9 1B 1B 1B 
                  89 EF 1B F0 F8 F8 EC E7 F8 E8 EF E7 E6 FE FF FF 
                  F0 EF 00 4A 1C 1B 1B 1B 1C 1B 1B 1B 03 02 03 03 
                  02 14 14 01 01 00 00 30 84 40 8E 8B 13 5A ED C0 
                  00 33 8E B9 80 AB C5 10 EE EF B8 00 C0 1E 00 C0 
                  C0 80 B9 00 C8 96 2E AB F8 C0 C0 80 B9 00 00 AB 
                  E2 B0 E6 33 8E BE A8 C0 B9 00 C8 A5 E2 B0 E6 BE 
                  A8 00 B9 00 C8 A5 E2 57 7E 33 26 05 B0 E6 B8 00 
                  D8 00 E4 3C 75 8A 89 72 B0 E6 B4 B9 00 DB D2 C4 
                  E1 8A 03 FE E2 B0 E8 0B D0 AE CD 8A 3B 74 B0 E8 
                  0B 40 E0 8E BE B0 E6 B0 E6 BB 00 D8 C0 38 84 98 
                  BF 00 02 2E 92 42 3C 74 80 02 4A AB ED 39 84 9C 
                  BF 00 03 2E 92 F6 EE E0 3A 75 80 40 AB EB 3A 84 
                  A2 BF 00 06 F3 A5 C9 F9 40 8E 89 10 B0 E6 E8 18 
                  0E 00 B0 E8 0B 40 10 AD 31 A8 74 80 87 FB 11 77 
                  2E 47 E8 F3 05 26 00 C6 84 18 94 0B 24 8A 50 B0 
                  E6 E8 F0 58 0F FC 74 E8 01 53 84 3E C3 40 8E E8 
                  25 09 05 05 26 00 C3 FF E9 03 50 84 40 8E B0 E6 
                  B0 E8 0A C0 05 FF 0A B0 E8 0A 30 E0 1E 52 84 E2 
                  1F 74 C3 90 03 DA B0 E6 E8 EF 1E 50 9F 74 33 8E 
                  BF 00 C7 E4 80 10 CF 0E 00 B4 B0 CD 80 10 CF 0E 
                  00 B4 B0 CD E8 00 07 B0 E6 BD AA 38 24 50 20 58 
                  1C D0 40 B0 E6 58 10 73 B0 E6 E8 1C 76 E8 1C BA 
                  BA DA C3 0A 75 87 B0 B5 80 10 10 03 20 FC 74 E8 
                  00 03 20 26 00 08 10 50 2E 47 E8 F2 58 02 C3 B0 
                  E6 58 00 10 C0 53 FC 74 E8 00 0E 00 5B 8E 06 9B 
                  B0 74 F9 B0 E8 09 20 E0 8E B4 C3 58 84 1F 77 B0 
                  E6 8E 06 73 74 EB 90 5A 84 01 3F 03 02 01 17 B0 
                  E6 33 33 8B 0D C7 C4 02 C0 C2 E2 33 8B 0D C7 C4 
                  02 C0 C2 E1 75 80 FF D5 5C 84 BD AB FF 33 8A 02 
                  0E F4 9D 14 5D 84 8B 08 C9 4F 8B 0A 2A 5B 5E 84 
                  C3 81 95 73 E9 FF 5F 84 B0 E6 B9 FF 64 02 04 F8 
                  0B FF E4 A8 75 E2 BB B8 1D BD AC 9E EB E4 FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF EA 8E F0 0E 
                  00 49 24 3C 75 33 8E C5 74 80 19 75 F7 18 75 8B 
                  81 60 8A E8 00 E8 C1 0A 8A 0B B4 E8 00 24 B4 F6 
                  D1 D1 D1 14 C3 FF 77 86 32 D1 8B 02 8F 00 62 3A 
                  07 33 33 86 F7 4A 03 A1 00 E8 C8 B4 8A EE 8A EB 
                  EB EE FE 8A EB EB EE 8A EB EB EE C3 C4 42 C5 00 
                  00 4A C4 C4 00 00 42 C1 00 00 4A E5 B8 00 D8 78 
                  BA 01 10 33 BD AD 3E E4 0C E6 24 E6 BA 01 10 33 
                  BD AD A4 73 56 E8 49 5E 1B 4B 61 40 B8 00 00 0F 
                  FB F3 05 FC EB 33 1F 50 8A 26 05 61 0C 61 F3 61 
                  66 C0 19 32 86 80 0F F6 04 DC 05 E2 33 32 EB 66 
                  04 26 05 F7 04 A8 75 66 E8 46 F5 C8 D6 F9 FF FF 
                  FF FF FF AE AE AE AF B0 B0 B2 B2 B0 B0 AE AF B1 
                  B1 B2 B2 B1 B2 B2 B2 B2 B2 FA 73 CD 50 55 EC 46 
                  89 0A 9D EB 60 06 00 EC FC 76 B8 00 D8 66 EB 81 
                  1A FF 4E 00 FB 33 8E C4 04 F6 01 04 36 01 40 8E 
                  8B 8A 15 E3 FF E6 07 1F CF 66 88 74 B2 CD 8A 10 
                  9F 80 11 81 0D 15 E8 02 05 05 DA C3 74 88 14 26 
                  00 66 C3 DA 72 E8 04 20 F6 08 74 0C 80 15 75 0C 
                  50 8A 07 C0 02 04 46 58 48 E8 05 C2 F8 7F 7E 0A 
                  06 C4 02 C6 66 88 01 04 E6 04 09 4A C2 E8 05 42 
                  DD 72 8A E8 06 12 FC 74 F6 08 2C 11 EB E8 05 2C 
                  72 E8 05 7E 0A 05 04 72 FE 01 C5 46 01 75 E8 05 
                  03 2C C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 9C E8 04 7D E6 B0 26 44 C0 02 01 7E 0B 11 
                  02 26 44 0A 75 B0 88 00 A2 00 0E B6 80 15 74 0A 
                  75 FE 0A 14 66 74 3A 76 B4 EB E8 04 EA 8B 8B E8 
                  04 FA 80 15 75 E8 03 19 BD 72 E8 02 0F F1 72 FE 
                  01 DB 41 EB E8 04 E8 04 28 60 B0 26 44 C0 02 01 
                  48 E8 04 87 72 E8 02 0A BB 72 E8 04 03 14 C3 22 
                  72 E8 03 8A 0E 43 C6 48 50 48 E8 03 1E 68 8B 8B 
                  E8 03 49 72 E8 02 0A 7D 72 E8 03 03 D6 C3 46 A2 
                  00 8A 10 E3 80 81 76 89 12 46 B4 E8 03 25 8B 48 
                  3D 03 03 FF 86 C0 06 0A 0E 46 26 64 FE A0 00 46 
                  C3 9E 72 8A 10 8A 02 CF CF F6 01 03 CF 26 5C 26 
                  44 C1 02 1E BF 00 8A AA 01 8A AA 8A AA 05 07 9C 
                  E8 03 0F B7 72 E8 03 05 35 EB B4 E8 03 E8 03 05 
                  25 EB E8 03 E8 03 1F 44 C6 48 70 64 E8 03 0F 7F 
                  72 E8 03 05 FD EB E8 03 E8 03 08 FC 75 E9 00 33 
                  8E C4 04 1F 0A C6 45 00 06 00 80 47 E0 43 B0 BA 
                  01 E8 03 A8 E8 03 3E 00 72 80 47 10 25 B0 BA 01 
                  E8 03 8A E8 03 66 FE C6 15 E8 13 3B 33 8E C4 04 
                  1F 80 03 72 E8 00 25 3E 00 73 F8 20 33 8E C4 18 
                  1F 81 E3 72 80 47 10 10 73 B4 E8 02 E8 02 1F 74 
                  C6 48 10 94 E8 02 0F AF 72 E8 02 05 2D EB E8 02 
                  46 C3 3C 72 E8 01 06 00 E8 02 79 72 E8 00 0E 13 
                  32 89 14 01 05 20 02 C3 1E 00 CB C3 2A 10 0B 46 
                  89 12 46 EB C7 14 03 8A 02 F6 0E 8B 4B E3 46 89 
                  12 C6 14 B4 88 15 26 00 4E 01 C3 27 72 8A 10 01 
                  E0 0C BA 01 E8 00 0E 20 04 CC 06 40 05 AA 92 C3 
                  51 7F 3C 75 86 EB BB 00 24 A8 74 E8 DE 67 E2 4B 
                  EE 80 59 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 50 B8 00 D8 06 00 B0 E6 E6 33 8E B8 91 FF 54 
                  1F CF F7 EC 8C C3 10 04 20 02 F1 EC 8D B4 24 74 
                  56 6C D0 72 46 F9 AC 86 A0 00 26 44 C1 02 42 8A 
                  14 43 8A 12 3F 44 8A 13 45 8A 12 E8 8A 10 E4 C0 
                  03 C4 46 8A 10 01 E0 0C 8A 11 E6 0A A2 00 8A 08 
                  F6 EE B8 00 66 03 0E D2 50 E2 C1 04 D0 25 00 1E 
                  DB 00 BA 01 6F C3 ED 4E E8 DD C9 72 E8 00 0B 8E 
                  AC BA 01 E2 C3 00 BA 01 6D 32 8A 00 5F E8 FE 0C 
                  0A 72 BA 01 AA EC 51 24 E8 FE 10 F7 EC 08 08 39 
                  E2 B4 F9 C3 F9 32 89 14 88 15 46 00 26 00 4E 01 
                  F9 C6 8E 00 26 00 26 00 E4 11 46 24 3C 74 FE 74 
                  3C 74 E8 FD EB BA 03 00 E8 10 FF 72 E8 00 56 BE 
                  00 F1 B9 00 EE E2 59 C3 51 33 8E F8 00 9C 1E 00 
                  73 33 0A 8E 75 EB 33 BB 00 24 0A 8E 75 E8 DC F5 
                  75 B4 F9 06 00 59 C3 20 04 CC 0F 01 05 57 EB A8 
                  74 B4 F9 B9 F4 F7 33 EC 10 08 63 E2 B4 F9 BA 03 
                  02 C3 70 71 E6 8A E6 C3 40 84 40 8E A1 00 80 34 
                  02 E5 E5 FF FF 70 E9 D2 41 84 61 D0 10 E0 FF E4 
                  24 3A 74 E2 BB B6 18 BD B5 62 EB B0 E6 66 ED 00 
                  66 01 00 66 C5 00 8E 33 9E D1 66 E2 80 10 FA 20 
                  E8 43 84 61 0C 61 F3 61 44 84 00 66 01 00 66 DD 
                  8B 8A 8E 33 B9 40 E6 66 D3 8A 66 66 C3 F0 44 45 
                  84 61 C0 00 1B C7 10 FF 20 D1 4D 02 84 46 84 40 
                  8E FF 33 BD B6 B7 80 0F F6 04 DB 05 E2 33 32 EB 
                  90 04 2B A8 75 66 E8 46 F5 C8 47 84 D6 DE 00 BD 
                  B6 46 BB B6 11 BD B6 88 EB 8A 32 FE 02 0E 55 83 
                  04 75 80 45 EE C3 30 2D 79 74 6D 42 61 64 46 69 
                  75 65 0A 32 31 4D 6D 72 20 72 6F 20 30 2D 65 6F 
                  79 41 64 65 73 45 72 72 32 35 4D 6D 72 20 72 6F 
                  0D 20 30 2D 6E 61 69 20 65 6F 79 43 6E 69 75 61 
                  69 6E 0D 42 73 20 6F 75 65 20 6F 75 65 41 20 6F 
                  75 65 42 20 6F 75 65 43 0D 50 72 74 20 68 63 20 
                  20 50 72 74 20 68 63 20 20 3F 3F 3F 00 30 2D 4F 
                  20 72 6F 0D 20 30 2D 6F 6F 68 6F 65 41 61 74 72 
                  46 69 75 65 0A 35 31 44 73 6C 79 41 61 74 72 46 
                  69 75 65 0A 33 31 4B 79 6F 72 20 72 6F 20 72 54 
                  73 20 69 74 72 20 6E 74 6C 65 0D 20 30 2D 65 62 
                  61 64 45 72 72 0A 33 34 4B 79 6F 72 20 72 53 73 
                  65 20 6E 74 45 72 72 0A 30 2D 65 62 61 64 43 6E 
                  72 6C 65 20 72 6F 0D 20 30 2D 69 6B 74 65 43 6E 
                  72 6C 65 20 72 6F 0D 20 30 2D 6F 72 63 73 6F 20 
                  65 65 74 6F 20 72 6F 2C 50 65 73 20 68 63 20 6E 
                  74 6C 61 69 6E 0A 31 31 49 4F 52 4D 45 72 72 0A 
                  31 32 53 73 65 20 70 69 6E 20 6F 20 65 2D 52 6E 
                  53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 
                  69 6B 74 65 69 20 72 76 20 3A 0A 31 32 53 73 65 
                  20 70 69 6E 20 72 6F 0D 20 36 2D 65 6F 79 53 7A 
                  20 72 6F 0D 20 36 2D 69 65 26 44 74 20 6F 20 65 
                  0D 0D 20 52 53 4D 20 20 46 22 4B 59 0D 0D 20 30 
                  2D 79 74 6D 55 69 20 65 75 69 79 4C 63 20 73 4C 
                  63 65 0D 20 20 20 20 6E 6F 6B 53 73 65 20 6E 74 
                  53 63 72 74 20 6F 6B 0A 37 30 44 73 20 20 72 6F 
                  0D 31 39 2D 69 6B 31 45 72 72 0A 37 30 44 73 20 
                  20 61 6C 72 0D 31 38 2D 69 6B 31 46 69 75 65 0A 
                  37 32 44 73 20 6F 74 6F 6C 72 46 69 75 65 0A 36 
                  35 44 73 65 74 20 72 76 20 79 65 45 72 72 28 75 
                  20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 
                  64 73 65 74 20 6E 44 69 65 41 0D D8 D4 B4 00 00 
                  8A 1E 40 03 29 F0 B0 60 B7 00 BD BA E5 B0 E6 33 
                  E6 B0 E6 FA 0F 84 00 85 A0 FF D0 A2 FF 3A FE 75 
                  BF 00 CA E9 CD E3 BD BA C3 FC 00 8E B0 E6 E6 BB 
                  FF 1F 07 0F 0B E2 8B 8B 86 8E B0 E6 B0 E6 B0 E6 
                  B0 E6 B0 E6 32 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 
                  B0 BA 03 B0 E6 B0 BA 03 B0 BA 03 BA 03 BA 03 BA 
                  03 C0 BB BA 6E B0 8B EE 77 8A 02 12 BD BB 8C 83 
                  05 FA 03 03 30 4A E7 12 84 78 E9 E0 C9 57 B4 BD 
                  BB 93 83 0F FB BA BA 13 84 00 33 E2 B0 E6 E4 8A 
                  E4 3D 00 0E 8C B9 00 B4 E9 0C FE 14 84 8B 70 00 
                  00 00 71 07 E0 8B 70 C4 71 8C 70 15 84 8D 70 00 
                  00 00 71 80 E0 8E 70 00 00 00 71 80 C4 8A 75 80 
                  80 16 84 17 84 8E 70 C4 71 18 84 1C E9 F9 61 F3 
                  61 30 8E BC 01 19 84 7D B0 E6 B9 FF 64 02 10 F8 
                  10 B9 00 4C E9 0B FE 02 E4 51 88 E8 09 E4 A8 74 
                  E2 BB B8 1D BD BC 88 EB E8 E7 E3 B0 E6 E8 ED 1B 
                  84 63 B0 E6 E8 0F 1D 84 F5 B0 E6 E8 24 1E 84 3C 
                  B0 E6 E8 3A 20 84 2E E8 0B CB E8 2B B0 E6 E8 10 
                  23 84 14 B0 E6 E8 11 00 BD BC 0D 80 C0 FB 75 B0 
                  E6 BD BC 2B B0 E6 E4 B0 E6 E4 A8 74 EB E4 A8 74 
                  E4 24 24 8A B0 E6 E4 A8 75 8A E6 B0 E6 E8 D4 26 
                  84 6B B0 E6 B0 BA 03 B0 E6 E8 DC 29 84 8B B0 E6 
                  B4 CD B4 CD E4 8A 0C E6 86 E6 B0 E6 B0 E8 F7 04 
                  0C 00 BB B9 1A E8 09 A1 FD A1 21 FB 21 40 8E C6 
                  12 00 0E 00 80 96 20 E8 2E F2 60 B9 FF 06 00 74 
                  E2 C6 96 00 86 3E 00 12 1B 40 E8 35 C0 75 0C E6 
                  E8 35 92 4B D3 EB A8 75 A8 75 E8 09 00 11 3F 00 
                  06 34 02 05 B3 B0 50 3A FA 92 4B 3C 74 E6 C7 72 
                  00 FB 97 B0 E6 E8 33 19 C4 7F 07 BF BF 08 F2 5F 
                  74 E9 01 FC 75 F6 96 02 03 25 BB 10 C3 E4 7B FC 
                  74 80 B6 0A 06 00 74 E9 01 D3 FC 75 F6 96 02 13 
                  26 00 80 96 FD 06 00 74 EB 80 18 FD 06 00 74 EB 
                  80 9D 2D 06 00 75 F6 96 02 13 26 00 80 96 FD 06 
                  00 74 EB 80 18 FE 06 00 75 21 17 F9 80 38 1F 06 
                  00 74 80 96 08 26 00 EB 80 18 02 0E 00 F9 80 1D 
                  26 06 00 75 F6 96 02 0C 0E 00 80 96 FD 05 0E 00 
                  80 17 04 C3 1E 00 47 1E 00 06 00 75 80 52 33 06 
                  00 75 F6 17 03 10 06 00 75 F6 17 20 10 15 06 00 
                  75 F6 17 20 07 26 00 EB 30 17 80 52 01 C3 1D 36 
                  3A 46 06 00 75 80 18 04 00 E8 2B 15 F9 80 18 FB 
                  01 EB BB 00 50 F9 B4 B0 9C E8 28 F1 0E 91 3C 74 
                  BB 00 E8 08 3C 74 3C 74 3C 74 BB 00 7D BB 00 1A 
                  F9 80 FF 02 BB FC 75 EB 80 D4 02 A3 FC 75 EB 90 
                  FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 FC 75 E9 00 
                  49 74 3A 15 74 80 53 03 80 80 0C 78 FC 75 B0 E9 
                  00 FC 75 B0 E9 00 C3 06 00 75 F6 17 04 F0 06 00 
                  74 E9 00 06 00 75 EB 80 96 FE 0E 00 FA AF 45 80 
                  49 02 07 3E 00 75 50 05 B3 CD 58 06 00 75 F9 50 
                  C0 06 00 C0 03 27 58 9C E0 FA 75 FB E6 F6 96 10 
                  15 06 00 74 F6 17 04 0E 26 00 EB F6 17 03 03 6B 
                  FA 47 45 05 F9 F6 18 80 02 C3 C3 06 00 74 F6 17 
                  08 F0 F2 96 F6 17 04 E4 06 00 75 F6 96 10 0C 06 
                  00 74 80 96 FD 0E 00 E8 01 E8 29 FB 1B C0 65 BF 
                  10 ED C3 03 0A 78 80 3B 2E FC 7E 80 57 05 FC 75 
                  B0 F6 17 08 35 32 06 00 75 B0 F6 17 03 23 2E 1F 
                  C3 2D 06 00 75 B0 F6 17 04 0B 19 06 00 75 32 02 
                  32 E8 12 C3 E4 0F C4 47 04 53 07 06 00 F8 8A 2C 
                  BB 9B D7 06 00 75 BE 9B 06 00 75 F6 17 03 32 06 
                  00 75 F6 96 02 0D 2E 0B FC 75 B0 EB 32 F6 96 02 
                  07 26 00 B0 E8 11 C0 43 06 00 75 EB E8 D9 E0 D9 
                  34 06 00 75 3C 74 3C 75 E8 00 D6 F0 EB 3C 75 E8 
                  00 C8 F0 EB 2C 7C 8A 19 D5 A2 00 C3 26 00 BE 9B 
                  B7 36 00 36 00 C3 06 00 74 F6 17 04 9C A1 00 1A 
                  A3 00 E8 00 02 CF E8 CB 2B 26 00 FC 72 80 06 35 
                  A8 8B 63 83 06 A8 75 FA A8 74 26 05 46 FB 8A 49 
                  80 04 05 EC 76 E8 00 8B 89 00 E8 00 C1 D9 F7 D1 
                  C1 EC 8B B7 B3 8A D0 79 8A 8A 01 08 D1 79 F9 D0 
                  E2 F5 81 00 FE 75 83 50 CF D5 C8 D8 6E 8B E8 00 
                  22 C0 D8 36 00 53 C8 DB C3 58 05 FE 74 8B E8 00 
                  02 80 C4 89 00 8B 8A 32 A1 00 E3 D0 E3 9F 00 4A 
                  F6 32 03 D1 03 97 8B 50 33 86 8B D1 D1 03 F6 49 
                  02 02 E2 FA 8B 8B 32 BA 00 8B 8B B1 F3 74 05 00 
                  75 5E C0 C3 2B B1 D3 C3 40 8E B0 E6 32 A2 00 8E 
                  BA 01 55 32 EC 55 06 B1 84 0D 0E 00 E8 00 03 05 
                  B0 E6 C3 E8 01 15 B2 84 00 B9 00 00 E8 03 B2 EB 
                  B0 E6 33 8E 26 3E 01 80 1B 80 75 02 12 B4 84 C0 
                  C0 C4 18 B2 E8 00 C3 05 02 12 B4 CD 73 52 F7 EC 
                  A8 75 80 80 0F 04 10 12 67 E2 FE 75 FE 75 E8 01 
                  5C 09 13 F5 11 13 4D 26 05 02 8A 8A C0 06 C9 80 
                  0C E4 8A 58 D0 8A 02 CE 01 CD 73 80 0A 16 FC 74 
                  80 10 0C C1 11 11 0D C1 DE 01 B4 CD 73 E8 00 C3 
                  8E 9F A8 74 B0 E6 B1 F9 79 B0 E8 F0 C0 ED D8 33 
                  8B 8E 8A C0 04 0D 0F 05 99 6F FE FE B5 F6 05 E4 
                  A3 01 0E 01 C0 C3 0F 0D 0F 05 9A 4B FE FE F6 05 
                  E4 18 8C 1A A1 00 00 A1 00 02 C7 4C 12 8C 4E C7 
                  D8 43 8C DA FB 88 75 C3 B5 84 B0 80 80 03 C3 B9 
                  00 00 E8 01 B0 E6 BB B9 FA 74 E8 00 D6 B9 00 00 
                  E8 01 E8 00 44 BA 01 3C B9 F4 A8 74 E8 CC F6 75 
                  B4 EB BA 01 3C 74 B4 F9 FA 8E AD 0C 8A B0 E8 EF 
                  C3 21 FB 21 A1 BF A1 B8 00 F6 EE 04 E8 CB 00 C3 
                  53 52 57 55 EC 40 8E 81 03 8B 80 04 04 9C 00 E6 
                  94 00 D2 34 E4 05 12 EB FE 75 E8 05 22 CC 05 5D 
                  EB FE 75 E8 05 10 CC 05 B8 EB FE 75 E8 05 1F 5E 
                  59 CF FF FF FF 6A 10 53 01 E8 00 C3 50 E8 00 58 
                  C3 CB FA 00 43 40 E0 40 E8 00 02 CF C4 D8 FA 00 
                  43 40 E0 40 E8 00 02 CF C4 2B 81 50 5B E0 C6 8B 
                  B0 E6 E4 8A E4 86 8B B0 E6 E4 8A E4 86 2B 81 50 
                  72 E2 FF 03 EB 87 86 8B 8B B9 00 EA 02 BE C6 26 
                  8B 81 03 B9 00 D0 EB 90 20 88 00 AA 8B B9 00 E4 
                  EB 90 E5 B8 B0 C0 2E 26 C6 04 27 40 26 85 80 47 
                  EA E6 E9 52 D6 E2 B9 00 18 5A E2 00 04 E8 00 20 
                  B0 5A 02 E8 00 FC 2E 26 C6 04 27 40 52 50 94 58 
                  5A E8 1E 40 8E C6 12 FF 53 F6 C0 08 50 80 40 F3 
                  C6 74 E8 00 EE EB 59 2E 07 E8 00 43 F5 8A 53 52 
                  5B E2 C3 0D 48 B0 E8 00 BB 00 44 BB 01 9B C3 7D 
                  E8 00 7D E8 FE BB 03 2A BB 01 81 C3 E8 04 E8 06 
                  8A E8 00 24 04 27 40 E8 00 BB 00 0E 10 B0 E6 B0 
                  E6 B0 E6 E4 0C E6 E8 FE 61 FC 61 33 FC 00 8E 2E 
                  07 26 85 80 47 F3 E5 33 FC 00 8E 8A 43 88 00 AA 
                  E2 07 60 06 D0 84 40 8E 89 67 8C 69 B0 E6 E8 B8 
                  03 AA B0 E6 B0 E8 EC E0 B0 EF 33 BB 00 F3 F8 10 
                  99 E8 BC 8D 05 00 D2 40 F7 8A 8A 8C E8 00 BD B0 
                  E6 B8 00 D8 C0 D0 20 66 FE FF 0F 00 9D 00 2E 01 
                  51 B0 E6 B8 00 D8 16 00 26 00 C1 A1 00 D2 40 F7 
                  3D 00 03 23 2D 00 F8 00 80 00 15 C2 33 B9 40 FF 
                  66 AB CF C6 EB 07 61 BA 00 8C B9 00 4A F4 53 57 
                  06 18 8E C7 4A 00 80 00 1B 1E 00 48 8E 66 C0 00 
                  33 FC F3 FE FE EB 07 5F 5B C3 CC 88 41 0A 74 81 
                  16 00 8A 00 26 00 E4 05 4E 01 C3 C6 40 FF 10 4E 
                  D2 0C 0A 06 26 00 E4 0A BA 03 8A A0 00 E8 BA 03 
                  C0 04 3F 24 3A 74 08 3F FB B8 90 15 23 7D 08 8A 
                  0A 7E 03 08 7E 05 02 05 D9 02 D9 E3 D8 7B FB 51 
                  F4 B9 00 D1 EC 80 06 F6 80 04 C3 EC A8 59 8A A0 
                  00 46 D0 26 64 8A A0 00 46 26 64 02 02 47 2A 04 
                  E7 BA 03 3F 24 74 D0 A8 74 B0 8A 3F B1 D2 0A 0C 
                  EE 75 80 3E 00 04 B9 F4 06 00 75 E8 C7 F4 80 EB 
                  80 3E 7F 26 E8 25 E4 B8 00 66 03 02 D2 FA 0C 04 
                  C4 04 C4 D8 C2 81 C1 05 C4 05 C4 C3 7E C0 02 7E 
                  E8 0A 7E E8 0A FF FF FF FF FF FF 50 20 A0 20 0B 
                  A1 8A B0 E8 EA C4 40 03 0E A8 74 E8 00 CF CD 58 
                  06 1E B8 00 D8 06 00 74 81 9C D0 73 83 9E 01 1C 
                  50 0B E4 E8 EA 26 00 A1 00 C0 1E 00 80 80 1F 07 
                  50 E0 96 C2 B0 EE EA B1 D3 2E 84 CC 8A 42 42 58 
                  1F 4A 32 EE 83 05 8A 42 C3 52 03 82 74 B7 E8 D2 
                  06 B7 E8 D2 59 E4 0D 83 05 8A 8A 5A EB 8A C3 01 
                  58 74 BE 00 24 4A 01 5A B4 50 00 43 40 C4 40 C4 
                  F8 EC C7 29 24 1E B0 E6 E4 86 E4 86 57 F8 FF 5D 
                  58 DF CD CB C4 CC 32 EB 8A 83 05 80 1E 83 04 42 
                  B7 E9 D2 08 28 3C F5 DC DC E5 E3 E3 E3 DB FB C6 
                  03 2E 24 FC C2 B0 EE EA 32 8B D1 2E 84 CC 86 42 
                  42 8A EE 4A C0 4A 1A C3 02 19 C2 0A 75 EC 46 EB 
                  80 1F C3 83 04 FC C3 04 03 01 00 00 00 00 00 00 
                  00 00 AA 01 04 10 40 FF B0 E6 B9 00 44 E2 EB 2E 
                  8A B0 E8 E8 8F D7 3A 74 B0 E6 BA 00 8C B9 00 C4 
                  EB B0 E6 C3 93 84 04 08 D0 0D DA 0E BE CC 03 99 
                  2E 8B BA 00 08 EE 42 FB C0 B9 00 EE 42 FA 87 83 
                  81 82 8B 89 8A E0 87 C4 5A 00 83 C4 52 00 81 C4 
                  4A 00 82 C4 42 00 8B C4 3A 00 89 C4 32 00 8A C4 
                  2A 00 94 84 00 B9 00 EC 3A 75 E2 BA 00 08 EC 42 
                  3A 75 E2 8B E9 FF 00 BB B6 1A E8 FA FE 95 84 0D 
                  DA 00 08 D0 40 0B 41 0B 42 0B 43 0B C0 D6 41 D6 
                  42 D6 43 D6 96 84 9C B0 E8 E7 80 02 F5 80 C5 8A 
                  B0 E8 E7 C8 84 B7 8A 9D C6 D2 3C 77 86 8B 8A E8 
                  00 3B 58 D8 C5 BA 3C 77 8A 8B 33 86 51 23 F7 93 
                  52 3C F7 B9 22 E1 D8 13 8B 8A 8A B4 F6 D1 03 33 
                  03 13 87 83 07 C8 E9 DA E9 DA E9 DA 01 1A 0E 8E 
                  41 0C 8A B0 E8 E7 B8 00 D8 C0 C0 8B 20 26 06 00 
                  CE 26 00 E4 24 E6 BB 00 05 F6 6B 01 0E 00 BB B6 
                  1A E8 F8 FE 89 20 80 6B FE C3 50 40 8E 80 6B 01 
                  20 20 1F 8A C0 04 0F 0A B8 00 D8 1E 00 E3 DD 10 
                  A0 00 C0 03 CB E4 B0 E6 E4 A8 74 EB E4 A8 74 E4 
                  A8 75 F6 02 20 0B C3 75 80 FD 20 80 FD BA 00 4F 
                  B9 00 7E 5B 0C A1 DF A1 21 FB 21 1E 00 B0 E6 E8 
                  01 1B 05 10 00 BB B7 2F E8 F8 C8 C3 00 06 C0 E9 
                  00 86 84 FF 60 E8 51 1E 59 64 01 05 F3 8B E4 3C 
                  74 E2 E9 00 87 84 88 E4 A8 75 51 F6 59 F3 6A B0 
                  E6 E4 3C 74 EB 90 89 84 AE 64 FF E4 A8 74 E2 EB 
                  90 0A E4 A8 75 51 C0 59 F3 18 8A 84 60 B0 E6 E4 
                  A8 75 58 2F EB 90 8D 84 B8 00 D8 0E 00 BA 00 D7 
                  B9 00 9E C3 40 8E 80 12 FF 00 BB B7 24 E8 F7 B0 
                  E6 B9 FF 64 02 10 F8 00 BB B8 1F E8 F7 FE B0 E6 
                  B0 E6 E4 A8 75 E4 A8 74 E4 EB B0 E6 B0 E6 B9 27 
                  64 01 09 E8 F6 E2 EB B0 E6 E4 3C 74 B0 E6 BA 00 
                  10 B9 00 1C EB B0 E6 B0 E6 E4 A8 75 B0 E6 C3 AB 
                  64 64 02 FA 64 E4 A8 75 51 DA 59 F3 09 8C 84 60 
                  EB F9 FD F9 F5 E9 DA D5 A9 9A 96 55 55 00 BD D0 
                  61 80 C0 FB 75 BF 00 94 E9 B7 8C 8E BF D0 14 8A 
                  F2 75 EB BA 00 E3 B9 00 92 B0 E8 E4 20 0E E0 88 
                  07 C3 46 00 C2 EC EA A8 75 A8 74 C6 01 B0 EE EC 
                  E0 B0 EE EC 2B 4E 3D 10 02 C0 FF 1E 00 2A 5E 80 
                  00 02 C0 0E 00 FB 72 80 07 32 28 F1 C8 E9 E9 4E 
                  88 02 E0 46 B1 86 32 D3 89 06 3E 00 75 D0 02 66 
                  83 07 C3 F1 46 88 02 03 DC E3 5E D2 88 05 E3 03 
                  05 03 04 3E 00 07 60 08 46 0A 5F 0D 4B 01 B4 E8 
                  B2 03 54 FE 3A 4A 75 32 FE 80 19 13 CE 02 3C B4 
                  E8 B2 8A E8 00 B4 E8 B2 26 00 66 C3 03 1E 0A 74 
                  FE EB B4 E8 B2 D2 DD F4 E8 F6 B4 E8 B2 FE 74 FE 
                  EB B4 E8 B1 FC 52 3E 00 74 80 49 03 02 00 01 33 
                  B6 8A 4A 4A D0 5A C3 1D 35 38 0A 74 79 F9 E9 01 
                  FC 7F 8A 32 2E 87 9B 06 00 75 F6 17 04 16 7F 06 
                  00 74 E9 00 06 00 74 E9 00 FC 75 B8 94 76 FC 75 
                  F6 96 02 0A 26 00 B8 95 60 C0 5F FC 74 80 0E 5D 
                  FC 74 80 37 1A 06 00 74 F6 96 02 05 00 EB 80 96 
                  FD 33 20 0A 61 35 7B 31 1F 06 00 74 50 C9 C1 0E 
                  B9 00 C4 AE 75 80 96 FD E0 DF F9 B4 32 EB B0 EB 
                  BE 9B 21 72 EB 3C 7C 3C 7F 2C EB 80 37 D6 FC 75 
                  F6 96 02 07 26 00 EB 80 0F 09 0B 8A 59 EB 32 EB 
                  BE 9B E1 72 F6 17 40 82 20 7D 24 80 35 11 06 00 
                  74 80 96 FD A4 4B 80 1C 11 06 00 74 80 96 FD A6 
                  35 80 0F 05 A5 2B 50 C4 C9 C1 0D 90 BF D3 AE 74 
                  3C 74 80 02 12 FC 7C 3C 7C 3C 7F 32 E8 00 C3 C4 
                  EB B0 EB 01 1A 1C 28 2B 34 37 8B 1C 89 46 3B 82 
                  75 8B 80 3B 1A 74 89 1C FB 37 45 B8 91 15 C3 50 
                  7D E8 F3 C3 01 46 81 16 00 52 39 A8 5A B0 EB B0 
                  E8 E1 52 F6 8A 06 D2 03 E8 24 0A 74 3C 77 F8 01 
                  5A E8 BD 27 C4 C3 8E 02 0E 0F C3 16 00 C2 74 80 
                  C0 09 FA 75 B2 EB B2 EB B2 F9 8A 8A 06 E4 03 E0 
                  08 8F 8A C3 FC 66 0A 74 C0 04 D0 06 00 E7 33 A0 
                  00 66 0A 74 C0 04 0F C3 53 8A C0 06 F7 EE 8B 8A 
                  24 C0 04 C3 74 0C 80 C0 E0 26 00 5B C3 02 74 E8 
                  BC C3 F8 75 E8 BC C7 C3 8B 86 E8 FF FB E7 C3 E8 
                  19 4A DD 8A 07 E7 0A 06 D1 E8 1A 11 07 BF 00 B9 
                  88 47 F8 06 88 41 58 A0 00 C0 27 08 04 80 21 26 
                  00 C4 74 D0 EB F6 03 04 C4 0B C4 74 B4 EB B4 C3 
                  40 8E BB 00 3F 75 E9 00 07 C0 E8 0A 74 FE 75 B3 
                  B5 B4 CD B4 E8 00 09 B1 33 CD 72 E9 00 FC 75 0A 
                  75 B4 CD B4 E8 00 C5 B8 04 01 D2 13 46 FC 75 0A 
                  75 FE 74 80 29 B7 05 ED 00 13 17 92 B8 04 10 D2 
                  13 1C 00 13 15 7E B8 04 0F D2 13 26 CB 46 C5 D0 
                  90 80 97 0B 04 72 BA A1 55 B4 E8 00 2F EB 90 02 
                  5C BB 00 3F 74 BA A1 37 BA A1 31 B4 E8 00 FB EB 
                  90 CE 75 E8 FD F0 E8 3C BA A0 11 C8 08 74 FE BA 
                  A1 03 3C E8 00 53 90 38 74 88 E8 FE 0E 00 5B E8 
                  FD 68 98 C0 04 E0 50 FC 75 3C 74 3C 74 B0 E8 DE 
                  04 FC C4 E0 33 BC E8 FD 20 38 E0 CC B0 E8 DE 00 
                  BB BA 59 E8 F0 01 E8 0C 0F 10 00 10 BD 84 0E 33 
                  E0 7F 24 86 E8 DE 50 C2 D2 C2 78 AB C8 58 60 06 
                  A0 A8 60 84 00 8E BB 00 C3 8C 69 26 26 00 06 00 
                  00 61 84 D9 74 81 64 10 E9 03 28 B0 E6 C7 86 80 
                  C7 88 00 E8 A8 81 72 34 75 A1 00 86 A1 00 88 E9 
                  01 56 1E 8C 8E BB 00 DB 0C BF 00 0B F3 07 5F B0 
                  E6 E8 AA 07 64 84 0F 81 76 80 73 81 64 80 8B 7C 
                  89 76 8B 7E 89 78 E8 AD 76 0B 74 E9 01 1E 00 EB 
                  00 1E 00 1E 00 EB 00 1E 00 90 A2 00 02 06 00 E8 
                  02 1E 00 C3 00 1E 00 C0 12 0E 00 00 2E 00 16 00 
                  0E 00 65 84 1E 00 1E 00 1E 00 1E 00 2E 00 C5 00 
                  91 A2 00 10 06 00 E8 02 1E 00 1E 00 C0 12 0E 00 
                  00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 8B 
                  88 03 86 81 80 A1 00 82 C6 8F FF 26 00 06 00 E8 
                  02 C0 12 0E 00 00 2E 00 16 00 0E 00 B8 00 C0 80 
                  8B E8 A8 BD 00 06 00 B0 B4 E8 03 02 74 81 64 44 
                  88 6A 89 6B 88 6D A1 00 00 F7 B0 3A 74 8A C6 92 
                  01 36 A9 00 12 0E 00 00 2E 00 16 00 0E 00 88 0B 
                  74 05 04 E3 10 E2 06 00 E8 03 02 74 81 64 08 88 
                  72 89 73 88 75 A1 00 00 BB 3F 1E 00 C3 24 8C B4 
                  C6 92 01 D2 A9 00 12 0E 00 00 2E 00 16 00 0E 00 
                  66 84 1E 00 89 13 8B 88 B0 8A E8 DB B1 E7 EA B1 
                  F7 64 80 74 B1 E8 A8 67 84 3E 00 02 0E B3 C5 0C 
                  8A B0 E8 DB 02 06 00 FF 02 03 8F B0 B0 E6 E4 B0 
                  E6 E8 12 64 01 FA 60 E0 CC B0 E6 50 73 58 C4 60 
                  6B B0 E6 F4 FD 69 84 00 EB 90 6A 84 01 B8 00 D8 
                  16 00 26 00 E8 ED 0B 75 E9 00 6B 84 00 8E F7 64 
                  01 74 E8 ED ED 0E 00 F1 0E 00 16 00 12 F7 64 04 
                  74 E8 ED ED 0E 00 F1 0E 00 16 00 09 F7 64 02 74 
                  E8 ED ED 0E 00 F1 0E 00 16 00 D6 F7 64 08 74 E8 
                  ED ED 0E 00 F1 0E 00 16 00 CD F7 64 10 74 E8 ED 
                  00 BB B6 1A E8 EC 06 00 FF 18 EF F7 64 40 74 E9 
                  FF 61 C0 04 74 84 CA B0 E6 0F 0F 07 61 53 D8 6D 
                  84 C3 D8 6E 84 C3 1E 00 1E 00 26 0E 00 00 1E 00 
                  1E 00 4C 8B 84 39 80 73 8B 80 89 8A EB 90 18 0E 
                  00 00 1E 00 28 8B 84 89 8A EB 90 B0 E6 58 1E 00 
                  10 8B 84 89 8A F8 C0 01 5B 53 06 70 84 26 00 C4 
                  E4 F8 00 80 92 01 0A 40 8E 8B E8 A5 3E 00 75 B8 
                  00 06 00 00 86 B0 E6 B8 00 C0 56 55 8F 38 4C 77 
                  E8 D1 03 F5 5D 5E 73 8A 4C B8 00 55 83 40 57 53 
                  1E 00 08 33 33 D1 1D 00 E2 8A 4C B8 00 C3 74 B8 
                  01 5B 5F 3E 00 75 B8 00 C0 C5 C3 CC 39 82 77 B8 
                  00 09 80 4C 01 7E 89 84 50 73 84 07 5B 06 53 B0 
                  E6 58 4C 50 48 8E B9 00 D8 FF C0 DB 00 AF 3B F4 
                  8A E4 A8 74 32 33 EB 47 8B E4 A8 74 32 BF 00 26 
                  3E 00 75 B8 00 C0 C5 40 8B E8 A4 EB 4F 26 05 06 
                  26 25 C4 C6 00 C8 2E 00 7C 84 8B A3 00 D7 02 EB 
                  FE 3A 76 E9 FF FF 74 B8 00 5F C3 0C FA A5 FB 0E 
                  02 F8 15 E8 E5 90 F8 36 00 04 36 00 36 00 C3 E4 
                  FA 7D FB A0 00 80 00 23 0D 75 B8 1C 19 2F 75 B8 
                  35 0F FC 77 3C 74 3C 75 B0 BE FF 02 F6 F6 80 00 
                  06 F0 02 00 53 1E 00 C3 73 E3 C0 05 C3 26 00 E4 
                  0A A0 00 C3 05 5B FF 77 80 1F 51 E8 0E FB 26 00 
                  E8 0E F3 60 FF F6 97 10 0B F7 D7 B0 E6 EB 80 97 
                  EF C9 8A C0 05 C3 60 FF F6 97 10 09 F7 B1 B0 E6 
                  80 97 BF C3 8B 1C 89 46 3B 82 75 8B 80 3B 1A 74 
                  89 1C 32 F8 03 01 FB 50 08 5F 09 67 C0 16 86 BF 
                  80 C0 0A DE E6 2E 26 67 6E C8 16 86 BF 80 C0 0A 
                  DD E6 2E 26 67 54 C8 0C 86 7F 40 86 00 44 C8 4F 
                  86 00 40 05 E0 E4 34 E6 EB E4 24 0C E6 B4 EB 83 
                  01 2B F9 77 B8 00 C1 40 E0 86 BF 80 C0 C4 86 00 
                  92 E6 80 00 04 C4 4A 58 E4 A8 75 A8 75 B4 EB A8 
                  75 B4 24 2E 06 67 1E 01 3A DD 74 32 B9 00 C8 41 
                  09 08 08 80 02 02 C4 E4 E8 14 FF 08 00 20 02 01 
                  C4 E4 FB 3C 76 E9 01 EC 8B 8C 8E 8E 8B 33 B9 00 
                  AA F5 7C 26 05 FF C6 07 26 45 00 C6 05 26 45 00 
                  26 45 C0 7C 26 05 FF C6 07 26 45 00 C6 05 8C BB 
                  00 E3 C5 D2 05 00 D2 26 45 26 55 33 E8 00 03 94 
                  8D 38 8A 24 3C 74 C6 46 E9 00 02 E8 00 79 46 0A 
                  74 8D 10 DE 74 E8 00 F3 E0 2E 3D F7 00 8D 38 FF 
                  74 26 05 EB 26 05 33 E8 00 7C 26 05 C8 12 80 BF 
                  02 E8 00 2D 46 02 27 80 40 02 E8 00 1B 46 01 15 
                  7C 26 1D E3 74 C6 46 EB C6 46 83 38 B4 C3 FF FF 
                  02 75 FF 06 04 F3 83 08 EF 8F 06 44 8F 02 04 8D 
                  18 89 02 01 B4 CD C3 7C 26 5D B9 00 87 15 FF FF 
                  5C 55 48 52 20 41 39 47 42 33 57 39 44 43 33 50 
                  28 29 6F 79 69 68 20 4F 50 51 43 6D 75 65 20 6F 
                  70 72 74 6F 20 39 32 38 2C 34 38 2C 36 E9 DA 31 
                  00 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 
                  4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 
                  72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 
                  33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 
                  6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 
                  64 2E B0 E6 B0 E6 B0 BA 00 B3 E8 00 12 4B 0E 84 
                  92 4B 22 4A EE 80 05 B0 E6 C3 00 8A E6 EC E0 3D 
                  00 18 F1 92 4B 12 4B 8C B9 00 5A E9 E6 FE FF FF 
                  FF FF FF FF FF 50 61 40 02 CF 01 85 11 84 B0 E6 
                  B0 E6 E6 E8 01 61 E4 E0 96 EB 90 FE CC 02 C5 C8 
                  D8 C0 30 8E BC 01 43 E8 00 ED 08 53 E8 00 27 FA 
                  04 D3 B9 00 A2 8B 81 03 B9 00 96 B0 B4 CD 33 B9 
                  00 88 F4 F5 FF FF F2 E9 A5 EE C0 D8 DB 07 07 61 
                  08 61 F5 FF FF 10 E9 A5 EE 61 F7 61 61 40 03 FF 
                  B8 00 D8 3E 04 E7 BB 00 00 8E 66 AD 61 40 0C C3 
                  10 DF EA C0 E5 F3 D5 FF 56 E9 A5 EA E3 33 B1 D0 
                  73 42 F9 D2 FF 10 92 26 E2 04 3C 76 04 B4 CD E2 
                  C3 0A 74 B4 CD EB C3 2F 75 0E 33 8E BF 00 24 AB 
                  26 AB 7C A1 71 A1 71 BF 01 2C AB 2E AB 07 B8 00 
                  10 EA E1 F0 0E 77 8A B0 E8 D2 01 03 CC 8A A8 74 
                  BA 20 A0 B9 00 58 80 12 FF 42 20 11 00 BB B8 56 
                  E8 E4 0E 00 F6 10 01 11 00 BB B8 1B E8 E4 0E 00 
                  A8 74 BA 20 11 B9 00 14 80 12 FF 60 C0 64 FF E8 
                  AE 64 02 07 F5 27 FF E8 AE 64 01 04 F5 17 60 80 
                  11 00 BB B9 55 E8 E3 0E 00 33 E8 EC 01 E8 00 C0 
                  06 00 03 06 C6 12 00 60 00 BB B9 18 E8 E3 3C 74 
                  E8 00 06 00 61 FA 21 FD 21 33 8E 26 1E 00 C7 24 
                  E6 FB E8 E2 26 1E 00 B0 E6 B9 FF C1 E4 A8 74 E2 
                  B0 E6 C3 E4 B0 E6 58 B4 CD 80 3B F7 FF FF FF FF 
                  32 04 00 00 00 00 31 11 67 04 00 00 00 00 7E 11 
                  67 06 00 00 00 00 67 11 00 08 00 02 00 00 FF 11 
                  AC 06 00 02 00 00 AB 11 B9 05 00 00 00 00 B8 11 
                  CE 08 00 01 00 00 FF 11 9D 05 00 00 00 00 9C 11 
                  84 0F 00 FF 08 00 83 11 D4 05 00 FF 00 00 D4 11 
                  9D 07 00 00 00 00 9C 11 9D 09 00 00 08 00 9C 11 
                  64 08 00 01 00 00 63 11 D4 04 00 00 00 00 D4 11 
                  00 00 00 00 00 00 00 00 64 04 00 00 00 00 64 11 
                  D4 05 00 00 00 00 D4 11 C6 05 00 00 00 00 C6 11 
                  F2 0B 00 FF 08 00 F1 11 DD 05 00 01 00 00 DC 11 
                  DD 07 00 01 00 00 DC 11 25 06 00 FF 00 00 25 11 
                  9C 08 00 FF 00 00 9C 11 C6 0E 00 FF 08 00 C6 11 
                  C6 10 00 FF 08 00 C6 11 FF 0E 00 FF 08 00 FF 11 
                  C6 0A 00 FF 08 00 C6 11 EC 10 00 FF 08 00 EC 11 
                  25 06 00 FF 00 00 25 1A 67 04 00 00 00 00 67 19 
                  67 08 00 00 00 00 67 19 89 09 00 00 08 00 89 19 
                  EC 08 00 FF 00 00 EC 22 C6 07 00 FF 00 00 C6 22 
                  C6 08 00 FF 00 00 C6 22 C6 09 00 FF 08 00 C6 22 
                  C6 05 00 FF 00 00 C6 22 63 10 00 FF 08 00 63 3F 
                  FF 0B 00 FF 08 00 FF 21 FF 0F 00 FF 08 00 FF 22 
                  FF 0F 00 FF 08 00 FF 21 FF 10 00 FF 08 00 FF 3F 
                  25 04 00 FF 00 00 25 1A 25 02 00 FF 00 00 25 1A 
                  EC 08 00 FF 00 00 EC 21 EC 06 00 FF 00 00 EC 21 
                  C6 05 00 00 00 00 C6 19 FF 0B 08 FC 00 00 00 83 
                  06 FC 0F 84 00 85 C7 E8 EF DA B9 84 03 51 00 13 
                  00 B9 00 01 CD 59 42 0C FF FF FF FF E9 DE DD BB 
                  84 FA 74 B0 E8 CD 40 1E DA 40 8E 8A 75 8E 0A 74 
                  A8 75 B0 E6 BA 00 A6 18 C2 75 53 C7 5B 84 BD 94 
                  07 09 8B F3 75 BE 93 3F EB B0 8A E8 CD FB C4 A8 
                  81 FE 55 75 E4 A8 75 A8 75 B0 E6 B0 E6 EA 7C 00 
                  C4 FB 14 E8 00 00 16 19 2E 3C 74 E8 DF F5 2C BE 
                  FF 8B 2E 04 00 74 EB 90 E4 80 40 12 0A 2E 06 67 
                  2E 06 67 E8 0B 8B B9 00 F3 75 4A F3 F3 C8 F3 74 
                  83 04 EE F9 E5 FF FF FC 56 8B BE 00 DE E4 0B 55 
                  E8 F4 F8 B3 FE 75 81 0A 02 66 FE E8 F4 03 9D E8 
                  F4 05 2F EB 81 0A FF 4E 01 E9 00 CC 05 4A EB FE 
                  75 E8 F4 74 CC 02 6E CC 05 F3 EB 80 0B 08 F7 E8 
                  F4 58 FC 75 81 0A 02 66 FE E8 F4 44 42 81 0A FF 
                  4E 01 EB 80 0D 05 3A EB 80 EB 05 D6 EB 80 EC 05 
                  6E EB 80 ED 05 A4 EB 80 EF 05 AE EB 80 0D 5E CF 
                  50 40 8E B8 FF A0 A0 C0 0C E0 A1 C4 A1 A0 16 0B 
                  20 20 C0 0C E0 04 06 21 C4 21 FC 74 B0 E6 88 6B 
                  58 CF B9 00 F4 E8 A8 A8 75 E2 F9 08 E8 A8 42 40 
                  C3 FF 5C 72 E8 D4 0D B8 72 E8 D8 03 9A C3 AF B0 
                  E6 E8 02 FC 1E BB 00 DB 06 00 74 E4 3C 75 80 96 
                  40 26 00 B0 E6 FB FF E9 01 06 00 74 E4 3C 75 80 
                  96 BF 0E 00 80 17 20 B0 E8 CB 40 0E 2C 67 A8 75 
                  80 17 DF B0 E6 FB B6 80 96 DF FF E9 00 17 E8 FF 
                  D8 60 B4 CD BD 00 08 20 20 E9 00 E0 3C 75 F6 18 
                  08 0E C2 73 FA 20 20 E9 00 20 20 80 E0 07 0E 00 
                  EB 80 E1 07 0E 00 EB 80 FE 0A FC 75 80 97 10 EB 
                  90 B1 F6 18 08 65 1C FF FF FF FF FF FF FF FF FF 
                  C7 72 34 E9 F5 FC 74 80 D4 07 06 00 75 80 46 1C 
                  FC 75 F6 96 01 28 61 72 80 52 1E E4 1A 0E 06 00 
                  75 F6 17 04 07 26 00 EB E8 FE 88 15 E8 00 C6 85 
                  07 61 04 E8 00 50 26 00 F6 96 01 12 E4 80 45 05 
                  FC 74 80 96 FE C3 E8 01 AE 64 C3 16 E8 D7 17 FC 
                  75 FE EB 80 4A 09 C8 28 16 EB 3A 15 74 80 2A 05 
                  FC 75 F6 96 02 31 FC 75 F6 96 01 25 E4 21 DB 1E 
                  00 19 E4 50 FC 61 0F 0C E6 E8 00 75 58 61 C3 53 
                  00 43 40 D8 40 F8 00 43 40 E0 40 E0 2B 81 1D 5B 
                  EA 58 50 17 C0 04 07 26 00 E4 3A 74 80 97 F8 06 
                  00 02 58 50 E8 00 4D 26 00 E8 00 ED 60 FF F6 97 
                  10 0B F7 45 B0 E6 EB 80 97 EF 37 A0 00 E8 24 80 
                  97 F8 06 00 60 FF F6 97 10 02 F7 26 00 59 C3 FA 
                  97 0C 86 97 A8 FB C3 B9 27 64 02 FA C3 FF FF 34 
                  45 C0 C0 C0 E1 A6 A6 48 63 7C 10 38 FB 1E 57 52 
                  53 8B 33 8E C4 78 B8 00 D8 06 00 81 16 00 46 8A 
                  06 FC 73 3C 77 3C 76 3C 72 2C 8A 32 D1 2E 97 EC 
                  07 01 EF 3F 26 5C 88 40 81 16 02 5B 5A 5F 1F CF 
                  E1 75 E8 A3 0A 23 74 81 16 00 B0 E6 32 0A 74 B9 
                  00 01 E2 E2 FA 03 EE C3 7E 02 28 46 BB 00 E3 46 
                  83 00 FA 73 8A 00 FF DB C3 D2 80 0E 04 46 04 3E 
                  00 74 80 41 09 07 D4 0A 75 33 8A 00 8A 03 80 D3 
                  F7 48 C8 06 03 73 8A 01 04 0A 09 4E 01 EB 90 3B 
                  75 32 8A 01 E3 8B D1 E6 B0 EB E6 8A E8 E7 F9 8A 
                  07 3F 8A 04 39 83 03 3F 46 80 01 75 E8 E7 1A 8B 
                  B7 24 74 B7 A8 75 B7 E8 E7 7C E8 E7 EE E8 01 17 
                  07 BF 00 F6 74 E8 A3 88 47 F2 38 88 41 E8 FE E4 
                  1E 56 B9 00 C0 D8 AC 56 10 B8 10 D8 AC 59 E8 A1 
                  66 8B 8A F6 10 0D FC 75 80 03 C4 88 E8 E6 4A 0B 
                  FF E8 DC 04 E4 66 03 73 B4 EB E8 00 2E 02 0A 4D 
                  81 8A 07 E7 0A 06 75 83 03 7B 83 04 75 83 07 5A 
                  74 81 16 00 26 00 66 0A C3 E1 B9 00 44 74 E2 B4 
                  EB E8 A3 07 8A 06 35 E8 00 07 D8 A8 B4 C3 01 4E 
                  D2 84 3E 75 08 3E E8 A2 47 00 BB 74 24 3C 75 E8 
                  FF 7A 8F E8 A2 27 46 F6 20 02 E0 4F 32 3A 74 88 
                  04 BB 00 4F 5B B7 E8 E5 7E C0 02 7E E8 E5 91 8A 
                  04 BF FB 7C 75 33 26 5C 8A 01 03 04 05 14 E8 A2 
                  B0 80 02 02 0F D8 02 C3 DB 03 01 E8 00 C0 40 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 0E 
                  00 B0 E6 B8 91 15 58 B7 E8 E5 02 EB A2 00 3B E2 
                  A0 00 F8 01 CD 73 F6 3E 80 1B E4 1C 04 B9 3D C0 
                  06 00 75 E8 A1 F4 75 E8 DA 80 26 00 0A C3 2A 2A 
                  2A 2A 2A DF 25 0F FF F6 08 15 46 4A 42 B7 E8 E4 
                  ED C3 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF 80 14 07 FC 75 B4 FC EC 40 8E 8A 10 80 30 
                  00 80 30 03 00 8B 63 8E 86 8B 86 81 FF D1 2E 94 
                  97 8B FB 1E 57 53 52 EB FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 07 
                  00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 
                  00 00 28 0A 06 1C 07 07 00 00 50 0A 06 19 0D 0C 
                  00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 
                  00 00 00 00 00 00 00 00 1E 50 51 56 B0 E6 FC C9 
                  BB 00 00 8E B8 AA 06 00 5A ED 0E 00 E1 BE 00 4F 
                  75 8B 83 48 EC D0 C0 FD C0 48 F3 8B 8D 10 C6 04 
                  26 05 FF C6 05 8D 18 C6 04 26 05 FF C6 05 B4 8B 
                  D1 CD 83 48 E1 84 E2 84 00 8E B8 AA 06 00 3B FF 
                  75 32 8A 02 C1 09 FF 3B 74 2B 3B 72 83 0F E3 FF 
                  FF 2B 3B 72 BE 00 C1 75 D1 E8 00 13 E8 01 74 E8 
                  00 5E 59 58 1F C3 E8 00 00 8E 8C 8E BF 00 8B A3 
                  71 C7 26 05 26 C1 04 C3 E0 89 BF 00 8B A3 71 C7 
                  26 05 2A 26 1D 0C 26 05 2C 83 02 8B A3 71 89 B0 
                  E6 1F ED 0E 00 E1 C1 04 D9 83 00 1F 81 FF 81 00 
                  C1 0C 10 2B B9 F0 C1 E0 26 3D 88 C3 6A 33 B8 E0 
                  C0 FB ED 0E 00 E1 F3 C3 51 33 AC D0 FB D2 59 C3 
                  06 57 B9 C0 C1 ED 8A 02 C1 09 E9 8B 8C 8E BE E0 
                  03 F3 59 5E 1F 53 FC 50 06 FA FF FC E9 94 07 66 
                  5B E4 53 FE E4 B3 EB E8 00 FF 10 0C 01 0C 08 02 
                  04 02 00 C4 E4 50 E8 F8 A3 64 58 FA F3 B0 E6 E4 
                  A8 74 E4 EB E8 F8 A5 64 DB 51 10 E4 A8 E1 59 02 
                  60 9C C7 B0 E6 0E 03 EB 90 58 C3 FF 00 01 00 02 
                  00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 
                  04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE 
                  FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF 
                  FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  7D 84 E0 2E 34 F7 00 74 E9 01 00 80 0F 16 07 20 
                  0D 00 22 EA F4 00 08 8E E4 8A 0C E6 A0 00 E0 61 
                  E4 80 40 03 8A 80 02 40 38 8E B9 20 F6 F3 AD B9 
                  20 FF B8 AA AA F3 66 D8 38 8E 33 B9 20 AD 3B 74 
                  E9 00 74 EB B9 20 FF B8 6D 6D F3 66 D8 38 8E 33 
                  B9 20 AD 3B 75 49 02 F4 00 33 66 55 55 66 AB 8B 
                  B8 00 D8 F6 00 66 66 C3 47 74 EB B8 00 D8 78 B8 
                  00 7C 33 BD F5 20 BA 00 76 E9 01 FF 7C BD F5 8A 
                  72 BA 00 8C E9 F2 0B FB F3 0C FC EB B0 E6 E9 00 
                  08 8E 26 26 00 B8 00 C0 04 BB F3 7C 33 BD F5 CC 
                  BA 00 CA E9 00 08 8C 8E 26 0E 00 8E B8 00 7C 33 
                  BD F5 24 72 BA 00 F2 E9 F2 A5 04 BB F3 7C 33 BD 
                  F6 88 BA 00 0E E9 00 08 8C 8E 26 26 00 8E B8 00 
                  7C 33 BD F6 E0 72 BA 00 36 E9 F1 03 5E B8 00 D8 
                  26 00 C6 00 FC 80 00 05 0E 00 B8 00 C0 D8 20 66 
                  FE FF 0F 00 6D 00 2E 01 84 E4 3C 74 33 B9 00 D0 
                  E8 D0 7E 84 C0 80 8B B9 00 F3 4A F5 F3 C8 F3 FF 
                  1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 
                  24 E6 66 01 00 66 DD 8B 06 33 8A B9 40 E6 66 D3 
                  8A 66 66 C3 F0 14 61 40 B8 00 00 08 4D A9 33 C3 
                  04 50 61 0C 61 F3 61 66 C0 19 C4 86 80 0F F6 04 
                  DC 05 E2 33 32 EB 83 04 04 A8 75 66 E8 46 F5 C8 
                  D6 F9 60 0F 0F B0 E6 B8 00 D8 26 00 16 00 00 B0 
                  E6 51 7B 59 06 C9 E9 00 77 84 33 59 DB 06 C9 EB 
                  90 C1 80 06 C9 02 07 78 84 E4 B0 E6 E8 F4 64 01 
                  FA 60 E0 CC 50 81 58 60 64 E8 F4 8A E6 58 8F 88 
                  E8 F4 FE 64 EB B0 E6 F8 06 B0 E6 F9 40 8E 8E 69 
                  8B 67 72 EB 90 80 C8 C1 74 BA 00 8C B9 00 46 F4 
                  C1 74 BA 00 8C B9 00 34 F4 7B 84 A1 A9 61 B8 00 
                  1D 30 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 
                  FB B8 00 D8 13 1F E8 A6 2A 2A 2A 2A 80 7F 4C FC 
                  74 80 92 42 8B 81 00 C1 07 FF 84 EB 90 BF 92 EB 
                  CA 00 F8 F8 F8 A1 A1 F8 A2 A2 A4 A4 F8 F8 F8 F8 
                  F8 F8 F8 F8 A5 FC 75 F9 02 FB 86 CA 00 32 C3 5F 
                  E8 F6 F4 F2 F0 EE 5F E4 F1 20 21 21 21 21 A0 A1 
                  A1 A1 A1 95 95 CA D4 21 17 CB D3 D3 00 0A 03 00 
                  03 00 B0 E6 B0 E6 B4 9E B8 FF 01 B8 00 D8 64 04 
                  62 EA 01 84 AA 64 FF E4 A8 75 E2 EB 90 02 84 60 
                  03 84 04 84 00 8E 33 81 AA 75 BD F9 FF FD B0 E6 
                  B8 C8 D8 DB 3F 55 08 76 2E 2E F9 06 84 40 8E B8 
                  00 0E 07 84 8F 70 00 00 71 D8 8F 70 00 00 00 71 
                  FB 75 E9 AA 08 84 FB 75 EB 90 C0 F1 00 8E 33 BE 
                  F8 0B AC D0 EE F9 A0 B9 00 0B EC C0 05 20 E2 83 
                  20 05 20 EB B0 E6 E6 B0 E6 80 0B 02 00 FF E3 8B 
                  E7 B8 00 D8 E6 0A 84 40 8E FF 67 B0 E6 B0 E6 EB 
                  B0 E6 E4 24 E6 B0 E6 CD FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF 00 00 00 00 81 81 99 7E FF 
                  FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 
                  7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 
                  BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 
                  63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 
                  18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 
                  00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 
                  FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 
                  7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 
                  00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 
                  76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 
                  FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 
                  00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 
                  38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 
                  F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 
                  00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 
                  0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 
                  7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 
                  78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 
                  0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 
                  DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 
                  7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC 
                  CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 
                  18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 
                  C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 
                  7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C 
                  F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 
                  0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 
                  CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 
                  76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 
                  CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 
                  98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 
                  00 00 00 10 6C C6 00 53 DC FF FB 00 07 E3 FF 85 
                  32 5B BD D9 F4 1D 50 72 AA F1 FF 26 00 CD B0 E6 
                  5A 1F 1E 52 40 8E FF 6C 75 FF 6E 83 6E 18 13 B0 
                  2B 6C 75 A3 00 6E 40 70 A0 00 FF 1F 06 00 74 E4 
                  A8 74 A8 74 24 E6 B0 E6 2E DD E6 FE 40 75 B0 BA 
                  03 F6 3F 07 8C 86 80 86 40 82 C0 86 92 4B 77 FF 
                  FF E9 E9 FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF CF 1E D2 02 17 C4 74 
                  BB 00 DB 01 06 01 01 43 E8 8D 0F 10 EC B4 CD 59 
                  33 B4 CD B4 CD E8 8D 17 C2 D5 ED D6 72 32 FE 80 
                  19 DF C8 1A 5A 02 10 88 00 1F CF FF 00 00 00 00 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 9F 
                  7F 7F 34 20 33 4F 50 51 05 00 20 31 32 2F 38 98 
                  
                • 109592-001.hex
                  86 32 D1 8B 50 89 02 0E 00 4E C7 00 00 B0 EE EC 
                  E0 B0 EE EC 50 51 B8 00 C0 02 09 01 17 05 00 7C 
                  B1 B5 B0 E8 00 7E 07 5B C3 52 8A 8C 88 4C 8E BB 
                  00 C7 00 26 47 FF FC 26 1F FC FC 83 00 C6 00 00 
                  08 4C 2A EB 90 2E 00 06 16 00 C7 4C 2A FE 32 C1 
                  06 5A C3 51 56 BB 00 05 BF 00 D2 F3 C2 B6 89 93 
                  4F E2 FC 93 BF 00 0B F3 FC 93 BF 80 0B F3 5F 5A 
                  5B 53 52 56 18 B7 B3 B8 1C C0 00 B4 CD 0A 5E 5A 
                  5B 60 06 00 8E 8E FC C0 00 B9 00 AB 08 B8 1C 10 
                  F7 05 00 D2 89 02 54 C6 05 C7 5F BE 00 00 BB 00 
                  E3 21 80 00 44 88 04 44 92 04 00 30 8C B3 E8 00 
                  18 B8 1C 92 61 BE 00 40 B3 E8 00 28 8C B3 E8 00 
                  40 B8 B0 92 41 BE 00 00 B3 E8 00 50 B8 C0 92 2B 
                  C6 54 C0 06 00 BE 00 00 B3 E8 00 C8 D8 21 BF 00 
                  07 41 E9 A5 1F C3 04 FF FC E0 C0 04 44 88 04 5C 
                  C7 06 00 50 8E 58 A8 74 F9 1F 96 4C 8A B0 E8 33 
                  76 B0 E8 33 E0 97 36 A3 00 58 50 8E 2A 8A 80 10 
                  C9 03 E4 B0 E8 33 C3 E8 44 E8 00 00 BB B6 11 E8 
                  45 56 BE 5B 0D BA 00 B7 B9 00 EF C3 60 24 3C 74 
                  E9 00 06 80 FE 73 FB 74 0A 74 B7 8A 24 3C 74 3C 
                  74 B7 3A 72 BE B7 C7 8A 24 C0 02 03 4E 02 03 C7 
                  3A 72 BE B7 C7 8A 24 C0 04 03 32 02 03 C7 3A 72 
                  BE B7 C7 8A 24 C0 06 03 16 02 05 C7 74 3A 73 1E 
                  C8 D8 9C 1F 1E C8 D8 00 32 B9 80 02 E2 74 BA 50 
                  5A B9 00 3D EB 1F 30 30 30 30 30 20 4B 42 20 4F 
                  4B 8A 49 88 01 1E 03 5D 8A 07 03 A3 52 56 B4 E8 
                  00 4E E3 8B 0C 46 8E FC 8B 06 7E 01 13 07 0F 08 
                  0B 0A 07 0D 03 AC 51 50 40 8E 58 1D 1F E2 5A 8A 
                  07 46 01 05 02 4F 1F 26 00 66 C3 07 3B 08 37 0A 
                  33 0D 2F 01 B4 E8 00 03 29 FE 3A 4A 75 32 FE 80 
                  19 0B CE 0A 0E 0F 32 B4 E8 00 B4 E8 00 F8 53 BB 
                  00 C3 42 8C 26 07 5B 74 CD C3 0E 6D C3 1F B0 E6 
                  BA 03 00 B0 E6 BB 00 28 B0 EE A2 84 64 E8 42 9F 
                  BF 00 67 72 B0 BA 03 B0 E6 33 E8 09 43 F4 E8 41 
                  4B 72 B9 00 FA 72 E1 74 E8 0D A8 75 EC 33 F5 00 
                  15 70 11 DC 72 E8 0D BE 84 03 EB B0 E6 EB B0 E6 
                  BB B8 20 BA 00 B9 EB B0 E6 E4 24 E6 B0 E6 E6 C3 
                  DF 07 08 50 1E D8 06 00 1F 06 00 00 06 00 33 B1 
                  B5 33 06 0E 00 48 8E 26 05 00 C7 02 FF FC 8B FC 
                  FC FC C0 89 74 FE EB 83 40 CD 04 C9 CC EB 00 08 
                  1E 00 0E 00 C3 FE 06 00 00 06 00 C6 92 01 80 E8 
                  56 C5 00 C0 12 2E 00 16 00 0E 00 0E 00 00 B0 E6 
                  C7 50 FF C7 52 00 C6 54 0F 06 00 C6 56 00 06 00 
                  C7 48 FF C7 4A 00 C6 4C FF 06 00 C7 4E 00 06 B8 
                  00 D8 48 8E 33 33 B9 40 66 A5 E0 8B BB FF 37 C7 
                  50 FF C7 52 00 C6 54 C0 06 00 C6 56 00 06 00 8B 
                  8D 1E 50 8E E4 50 08 61 00 C6 00 FF F0 88 01 E6 
                  26 05 B0 E6 E4 8A B0 E6 E4 05 04 80 2B 3B 72 33 
                  C1 06 89 02 89 04 FE C9 E1 26 4D 8B 8C 26 25 88 
                  01 FF BE 80 E4 26 02 E2 F6 FE 26 24 06 00 1F C3 
                  99 A3 00 C8 80 F6 20 0B 00 F6 10 03 00 B8 04 E3 
                  CA 16 00 C1 C0 40 1F 00 F6 40 0B 00 F6 80 03 00 
                  B8 04 E3 CA 16 00 8A B3 B9 00 C7 EF 24 3C 75 80 
                  01 07 01 05 C3 E2 1E 50 8E A0 00 F0 C3 02 1F E4 
                  62 0A 75 B3 32 B8 04 E3 00 F7 FE 88 91 C3 06 00 
                  FF 06 00 00 06 00 C6 55 92 06 00 C6 57 80 53 50 
                  8E E4 8A 0C E6 E6 8B 00 C6 00 FF 84 FC FC FC FC 
                  FC FC FC FC E0 61 C3 1F 00 00 00 00 FF 00 C0 00 
                  FF 00 00 00 FF 00 0F 00 FF 00 00 00 FF 00 FF 00 
                  FF 00 FF 00 FF 00 0E 00 FF 00 FD 00 47 30 0F 47 
                  30 FF FF 00 00 AA 18 F8 18 28 18 2E 01 78 0F 00 
                  01 0F 00 FF 8A B8 00 C0 2F 88 E6 FC FC FC FC FC 
                  FC FC FC B8 00 C0 20 66 FE FF 0F 00 DC 00 2E 01 
                  84 FF 2E 01 78 0F 00 01 0F 00 FF 8E B8 00 C0 61 
                  E0 08 61 C4 8A 26 06 00 E6 EB 2E 01 78 0F 00 01 
                  0F 00 FF 92 B8 00 D8 C0 64 FF FA 64 02 05 F8 90 
                  B9 FF 64 01 05 F8 82 E4 A8 75 66 06 C0 00 B8 00 
                  A1 C4 00 25 80 00 0D 00 C7 00 00 00 EB EB 66 06 
                  C0 00 56 00 C7 00 00 00 EB 66 06 C0 00 64 00 C7 
                  00 00 00 EB 66 06 C0 00 30 00 C7 00 00 FF B0 E6 
                  E4 86 B0 E6 86 0C E6 EB B0 E6 E4 86 B0 E6 86 24 
                  E6 B8 00 D8 DC FB 51 56 BB 00 DB E2 00 F2 9C 00 
                  E6 94 00 D2 77 84 74 FE 74 FE 74 58 67 42 00 00 
                  24 78 50 FE F8 15 72 B9 F4 66 EC F8 13 F6 CB EF 
                  00 00 24 78 0C EB 42 24 0C EB EB EE 1C 0F 42 08 
                  00 BB 00 D0 0C EB EB EE 4A EB EB EC F8 48 F8 8A 
                  1F 5A 5B 2E 26 65 00 A5 A7 6D 00 8A 8A 8A 8A 8A 
                  8A 8A 55 EC 53 06 B0 E6 E4 A8 75 32 8C 8E 8E 06 
                  5E 26 0F F9 74 80 F3 08 FF 02 01 EB D6 BE 89 3C 
                  74 3A 75 43 F2 D7 8D 8B AC 00 16 C1 F7 46 80 04 
                  F3 D1 2E 94 89 0A 07 5B 5D E9 11 07 5B 5D CF F2 
                  FD 75 FF 02 FC 74 4F EB 47 C3 F2 F7 20 FD 75 FF 
                  02 4E 80 00 08 4F 4E 4E 31 47 46 46 29 FE 75 80 
                  00 04 4E 1B 46 17 FD 75 FF 02 FC 74 4F 4E EB 47 
                  46 C3 F2 FC 74 4E EB 46 C3 F2 F7 15 FC 74 4F 4F 
                  4E EB 47 47 46 EB 83 FF 11 FC 74 4E 4F EB 46 47 
                  EB 80 01 03 46 80 00 04 4F 02 47 8B 80 00 04 4F 
                  02 47 8B 80 01 03 4E 80 00 04 4F 02 47 8B 80 00 
                  04 4E 02 46 FD 1E 00 56 3A 72 8A FE F6 01 0C CA 
                  F5 D1 DE DA 04 F5 D1 C6 C2 75 74 80 49 02 28 3E 
                  00 77 50 8B 63 83 04 65 24 EE 58 0E 3E 00 72 80 
                  49 07 7C EB EA E5 00 E5 F8 C5 E3 ED C1 E0 06 00 
                  8C 8E 8B F6 F7 00 74 F7 F7 D1 03 96 C0 14 C6 10 
                  F0 CA A5 F5 FD CE F4 F0 E7 20 CA AB FD CE F6 40 
                  8E E8 01 19 3E 00 72 80 49 03 0B 16 00 C2 A0 00 
                  C3 3E 00 74 D0 D0 BD 00 8B 8A 32 98 40 F7 03 03 
                  4E 97 F0 BA 01 E2 C6 01 10 D8 DD C7 20 3E 00 74 
                  47 C7 C2 DA 5A 8B 0A 74 3A 73 2A 50 E6 E6 C6 F0 
                  FB CA A4 F0 FB F6 20 F7 20 CA A4 C5 DD CE E0 8A 
                  D0 D0 58 C4 FB CA AA FB F7 20 CA AA DD CE EA 1E 
                  33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C E6 24 
                  E6 66 01 00 66 DD 8B 06 33 B9 40 66 D3 AC 46 32 
                  E1 75 E4 A8 B0 75 B1 9E D3 46 FE 72 9E 1F D3 9F 
                  4D 9F 33 C3 04 50 61 0C 61 F3 61 8B 1F C3 32 26 
                  05 D7 C7 E8 46 C3 22 98 C3 E0 FC 0B 30 8A 49 88 
                  01 26 3D C7 8A 49 88 01 33 8B 02 EA 03 00 D1 D1 
                  D1 D1 03 D1 D1 03 B7 80 49 06 04 D1 E7 DF D3 D1 
                  EA EA EA D1 E1 D2 03 C3 0D 04 72 B0 52 D2 C0 02 
                  20 00 17 C4 74 F9 C3 8B 51 64 E8 5B 06 F9 F9 09 
                  F8 AC 59 E9 C3 06 00 C3 EA 8E F0 56 B8 00 D8 03 
                  E8 45 5E CF EB C3 FA D3 E1 C1 20 03 8E B9 00 BF 
                  03 EA F3 A5 50 3B 58 75 A2 03 57 75 BF 00 87 AB 
                  C8 BF 00 B5 AB C8 B8 FF 8C AB C5 C4 12 A3 00 06 
                  00 8E 53 01 BA 03 0F 21 0F C9 D9 1E 02 DB 8A 80 
                  0A 74 BA 03 09 21 01 CD 80 00 0D 05 3C 75 B4 CD 
                  04 24 3C 72 A2 03 0F 85 EB 33 89 A6 89 A8 41 06 
                  03 02 D2 8E B4 CD 1F 85 B4 CD 1E DB 16 00 0E 00 
                  52 51 85 B4 CD 3C 58 1A 2B 1E D3 C2 0F DA D2 1A 
                  21 BA 03 27 21 10 21 3D 74 BA 03 09 21 08 CD 8E 
                  8E BA 00 1A 21 00 0D 49 73 72 20 4F 50 51 4D 2D 
                  4F 20 69 6B 74 65 0A 6E 65 20 72 76 20 70 63 66 
                  65 20 0D 0D 52 69 73 72 20 69 6B 74 65 69 20 72 
                  76 20 20 66 6E 63 73 61 79 0A 74 69 65 61 79 6B 
                  79 77 65 20 65 64 0D 24 42 53 43 20 45 45 E8 44 
                  01 15 0A 8A E8 45 C8 33 BA 03 A8 74 B4 81 16 00 
                  26 00 E8 44 01 04 E4 60 CA 74 E8 01 07 74 8A 80 
                  97 03 C4 80 13 11 37 B4 3C 74 B4 3C 74 B4 88 E8 
                  44 1F 8A 05 C6 05 E8 5E 46 00 A6 58 46 B4 BA 03 
                  A8 74 B4 88 41 81 16 00 33 E8 FF 07 C4 75 8B 32 
                  8A 00 05 09 01 4E 01 EB 0A 74 B4 3C 74 B4 3C 74 
                  B4 3C 74 B4 EB B0 E8 44 05 01 FF E8 01 27 32 8B 
                  C3 2C 8A E8 44 C4 75 E8 00 E8 01 07 47 FF 00 46 
                  3C 77 E8 43 12 73 80 06 75 C0 04 0F 03 1E 65 E8 
                  00 61 27 E8 B0 C6 01 C6 00 50 3A 58 70 47 E8 00 
                  02 27 CA B0 C6 01 C6 00 50 1C 58 54 29 E8 00 87 
                  27 AC B0 C6 01 C6 00 50 FE 58 4F 0B E8 00 61 27 
                  8E B0 C6 01 C6 00 50 E0 58 34 4E 01 E8 00 67 88 
                  E8 43 26 00 2C 1C C5 75 E8 42 7E 00 03 E8 24 3C 
                  75 B4 80 03 0B 80 13 40 88 E8 43 47 00 46 32 FF 
                  16 C3 C0 66 80 02 09 01 4E 01 EB B4 E8 00 07 10 
                  01 10 02 13 07 03 02 02 33 8A 06 C3 00 50 FA 40 
                  E0 40 40 C4 DA F6 40 58 BA 01 A0 E8 33 3D B0 E6 
                  FB F4 EC FD FD FD 24 0A 74 EB 90 EC 8B 33 8E C4 
                  78 B8 00 D8 06 00 E8 38 46 00 46 00 99 C6 06 E8 
                  00 46 00 94 B0 E6 BA 03 0C 80 3F F0 C4 B0 8A E8 
                  23 F8 E0 33 1F 33 8B 8B 0A 90 74 FE 0A 91 74 FE 
                  0A 74 FE C0 06 CD 08 10 FA D8 A8 75 E8 41 E0 E8 
                  80 0F DB 0F DC 97 75 93 91 74 EB B0 8A E8 22 04 
                  C4 C5 E8 41 E0 CC B0 E8 22 C3 76 B0 E8 41 93 F0 
                  E8 FE 07 C6 05 E8 5B 46 08 E8 B7 E8 42 7E E8 42 
                  6B E8 36 04 F9 33 CC EC 10 0B 7E 00 26 4E EB B4 
                  B0 80 05 75 E8 41 07 93 01 74 E8 FE 27 94 EB F9 
                  46 C3 00 0A 01 04 93 02 07 E0 0D 4E 6E 53 73 65 
                  20 69 6B 6F 20 69 6B 65 72 72 0A 65 6C 63 20 6E 
                  20 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 0A 
                  30 2D 69 6B 74 65 42 6F 20 65 6F 64 45 72 72 0A 
                  BB 00 E8 B0 E6 E4 3C 75 E2 4B 05 E8 EB FF FF FF 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  55 EC 50 1E B0 E6 8B 04 DB 5E 8B 80 F0 0A 12 84 
                  46 E9 01 FB 05 0C 14 84 5B 58 E9 05 13 84 27 0E 
                  BF 13 80 8E 0F 00 25 00 80 0E 00 81 0F 00 66 C1 
                  AB 33 A1 00 AB 1A 66 BE 00 08 AD AB FB 21 66 0F 
                  F8 AB 33 A1 00 AB 1C AD AB E8 AB E0 AB 04 AD AB 
                  FB 60 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 
                  5A 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 4E 
                  66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 54 66 
                  C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB B8 00 00 
                  AB 33 8C C1 04 AB FF 66 66 00 92 66 66 C0 E0 E0 
                  66 B8 FF AB 48 66 C0 44 66 66 04 25 FF 00 AB 33 
                  8B 04 AB 42 66 C0 44 66 66 04 25 FF 00 AB 33 8B 
                  04 AB 3C 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 
                  AB 36 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 
                  89 66 FF A0 0F 1F 66 5D A9 A9 8B 8B 8C 9C 3C 77 
                  32 8B D1 2E A4 97 80 87 EF DB 05 0E 00 F8 52 DB 
                  12 16 00 C2 A0 00 08 65 EE 10 16 00 C2 A0 00 F7 
                  65 EE F8 92 7E CA 00 C4 BA 09 08 6D AF 64 DC 0B 
                  FB 66 FF 22 22 22 2A 7C 58 59 5E 5D 07 FF FF FF 
                  FF FF FF C8 FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF E9 03 FF FF FF FF FF 
                  FF BB E8 F5 30 3E 00 72 80 49 07 03 7F E8 2A 16 
                  00 C2 8A EC 01 FB EC 01 FB C4 47 E2 C3 3E 00 72 
                  80 49 07 51 81 AA E2 C3 F7 74 80 49 04 07 3E 00 
                  72 8A E8 2A 16 00 C2 8B EC 01 FB EC 01 FB C3 FB 
                  EF 80 49 04 07 3E 00 75 8A E8 2A AB E8 2A 5E 8A 
                  49 8C 8E BE FA C0 08 D2 DA 36 00 7F D1 D1 D1 03 
                  80 06 63 EC 8B 57 8C 8E 51 8B 80 03 08 B1 D1 D1 
                  D0 73 0A FE 75 8A 8A AB CD E6 5A 5F D0 D8 04 8B 
                  AD FB 03 33 AB C7 1F D0 79 26 05 81 B2 E2 81 3E 
                  4A D8 C4 EB 8A 8B 8B B9 00 F3 D0 79 26 05 81 FF 
                  AC FC 03 32 AA EF 1F E4 EF 01 75 C3 00 FC 51 3D 
                  DF F8 00 8E 33 81 55 75 33 B9 80 02 02 E2 74 B8 
                  00 D8 0E 00 BA 50 5A B9 00 51 EB B8 00 C0 8E B8 
                  00 8B FF 00 58 40 8E C3 D8 DB 3F AA 62 F6 C9 6F 
                  D1 8B AC D8 FB 3E 04 EA B8 00 C0 8E B8 00 8B 55 
                  ED FF 0B 74 1E 40 8E 80 12 FF 5D 8C 1F 8C 03 3B 
                  76 3D DF 1B 15 06 BA 50 8C B9 00 CD 1F 61 80 8C 
                  03 C3 06 00 E8 00 07 80 76 33 07 C3 06 00 50 12 
                  5A 07 8B E8 00 3D C7 ED 1F FC D8 DB 3F AA 2D F6 
                  C9 6F D1 8B AC D8 FB 09 04 EA D8 C2 60 1E 00 BB 
                  B8 14 E8 2C 07 BA 00 D8 C2 D2 8E B8 00 C0 B8 00 
                  8B FF 00 1F 51 8B 46 2E 24 05 F7 EB 46 8A F9 C3 
                  1B 32 B4 36 B8 B0 BD 89 77 72 79 69 70 5D FF 73 
                  66 68 6B BB E0 5C 78 76 6E AC AF 2A 20 1B 40 24 
                  5E 2A 29 2B 0F 00 7B 7D 0D 3A 22 7E 7C 3C 3E 3F 
                  20 38 2D 35 2B 32 30 0D 47 49 4B 4D 4F 51 48 4A 
                  4C 4E 50 52 53 06 07 0C 1A 1B 1C 2B 0A 47 48 49 
                  4B 4D 4F 50 51 52 53 FF 50 01 85 10 84 E9 4D 24 
                  83 04 86 42 83 05 E4 C4 42 C4 EE E2 FF B8 07 47 
                  33 B9 20 AB 17 47 EE E5 FF FF FF FF FF FF FF FF 
                  8A FF FF FF 50 B0 E6 B0 E6 B8 00 C0 20 A0 20 C0 
                  F0 F6 97 20 0B 80 97 DF 58 02 FC 53 51 83 10 EC 
                  80 97 20 76 9B 46 8B 81 0F C1 04 5E 81 00 0B 8E 
                  B9 00 8A 24 3C 74 E2 EB 90 25 07 66 00 09 08 D9 
                  00 C4 1F 5E 5D 58 50 01 85 16 84 20 A0 CD CF 50 
                  40 8E 58 C0 86 70 8B 6E 8B 6C FB E9 61 50 40 8E 
                  FA 0E 00 16 00 06 00 FB 1F 8D E8 00 00 48 8A B0 
                  E8 18 C8 04 3A 8A E9 61 0A E8 18 80 03 EB C3 EF 
                  B0 8A E8 18 02 E1 1B B0 8A E8 18 0B 0A 0C 24 24 
                  84 74 0C 8A B0 E8 17 31 E8 FF 07 EC 8A B0 E8 17 
                  F0 09 DE 8A B0 E8 17 E8 0F E8 FF 06 E8 17 07 E2 
                  C7 B0 8A E8 17 09 E1 B9 B0 E8 17 02 FB E0 0B A9 
                  B0 8A E8 17 D7 FA 0B 94 A8 74 FB 33 F9 02 B0 E8 
                  17 80 F7 01 E6 7D B0 8A E8 17 05 E5 6F E4 24 E6 
                  B0 E8 17 20 E0 0B 5B E9 60 B0 E8 17 DF E0 0B 49 
                  E9 60 E3 24 EC C7 0C 8A E2 FE 75 B4 C3 00 33 BF 
                  0F 89 F9 F9 F9 39 F9 F9 F9 B0 9C E8 17 E8 00 02 
                  CF C0 12 FA 2D F8 0E 03 EB 90 24 C3 C0 B0 9C E8 
                  16 E8 00 02 CF C0 12 FA AD D0 0E 03 EB 90 24 C3 
                  C0 FB B8 00 D8 A1 00 25 FF 00 50 33 70 71 20 58 
                  06 0D 00 01 C3 86 74 80 49 02 09 3E 00 74 EB 33 
                  8E BF 00 46 3C 74 3C 75 B8 F0 03 A4 26 05 39 FA 
                  8C AB A0 00 26 00 16 00 0C E8 08 F4 E8 27 C2 A0 
                  00 B4 E8 E4 03 CF B4 E8 E4 01 C5 C3 66 50 61 40 
                  74 83 04 89 1E B8 00 D8 61 E0 08 61 16 00 06 00 
                  86 E6 58 F9 87 80 06 75 E8 34 17 33 70 71 04 08 
                  FC 37 04 33 9B 73 E8 34 3B 24 E8 35 01 50 29 E8 
                  F2 3F DF E7 80 04 3E 33 80 C0 36 2E EB BE A0 04 
                  CC 28 C8 24 C6 EB C7 02 00 46 00 C6 07 C7 0C 00 
                  46 00 E8 34 3C 49 68 72 8C 0C 8B 03 56 33 E8 34 
                  0A 21 72 2E 1C FF 5E 2E 6C 88 05 8A 01 4E C6 07 
                  E8 34 0F 88 80 00 07 F7 81 87 E8 34 56 33 81 16 
                  FF F7 01 27 20 0F 15 03 4F 21 12 3C 87 BE A0 56 
                  E8 33 2F BD 72 3C 74 83 06 02 0A C6 3C 74 83 06 
                  3B 01 15 C6 2E 54 74 EB 3C 74 2E 54 75 E8 F1 3F 
                  75 87 E8 F2 F7 8A 03 00 88 8C 0C 8B 04 56 81 16 
                  00 C0 14 4E 01 B4 32 EB 81 16 00 0C C0 D4 80 00 
                  09 F7 E8 F1 87 87 C3 09 93 20 09 74 21 0F 15 21 
                  09 97 21 09 97 21 12 17 21 FF FF FF FF FF 02 02 
                  2A 50 0F 27 DF 25 09 FF F6 08 40 02 02 1B 54 0F 
                  4F DF 25 09 FF F6 08 80 02 02 2A 50 0F 4F DF 25 
                  12 FF F6 08 00 A3 00 A5 00 FF 00 00 00 5F 50 40 
                  8E 3C 77 74 F6 A0 01 2A 0E 00 E8 00 E4 24 E6 FB 
                  20 F8 15 06 00 75 F8 0B 23 80 A0 FE 01 58 00 5F 
                  02 FA 0B 9C 0C 50 E0 0B 97 58 C3 B0 E8 13 BF 8A 
                  B0 E8 13 FB 89 98 8C 9A 89 9C 89 9E C3 83 00 07 
                  74 B4 F9 32 BA 02 24 E9 00 01 EC 0F 0F 0A C0 DB 
                  C9 D2 78 83 0E EC 46 FA 6D 8B B0 EE 46 00 8B 0C 
                  5E 8A EC 0F E0 11 DF 4F 2B 89 0C 5E 77 EB 8B E8 
                  00 D9 C4 74 89 02 C4 74 89 04 C4 74 89 06 C4 74 
                  89 08 46 75 FB 58 59 5D 5D E8 C1 04 E9 C1 04 C3 
                  B0 E6 E4 8A E4 8A 58 FB 1E BB 00 DB 06 00 75 C6 
                  A0 01 8E 8D A0 E8 FF FA A1 FE 00 00 A1 E8 FE 06 
                  00 74 80 A0 7F EB F9 1F CA 00 5F 60 1E 40 8E 89 
                  67 8C 69 B0 E6 E8 00 06 07 B4 CF 8D 20 C7 FF 8C 
                  C1 04 89 02 C8 E8 26 47 26 47 9A 5C 26 07 FF D0 
                  E0 26 47 8C C1 0C 88 04 C6 05 06 8C 8E 8D 92 E8 
                  00 D0 E7 5E 8D 08 89 02 88 04 C7 FF FA 80 70 0F 
                  1F C1 26 47 E8 00 88 04 C7 FF 26 47 92 0F 17 01 
                  0D 00 01 2E 2E A1 C0 00 B8 00 D0 10 8E B8 00 C0 
                  33 33 B0 E6 51 E9 F3 59 C1 00 01 B0 E6 B8 00 D8 
                  C0 D0 50 20 66 FE FF 0F 00 58 D8 00 2E 01 51 EB 
                  FA 4A 75 B0 E6 E8 48 10 DF 60 38 75 B0 E6 E8 48 
                  B4 E4 A8 74 4E 50 36 74 8B 89 58 08 61 F7 61 01 
                  C4 80 91 C0 E0 03 C3 8C 8B C1 04 C1 E8 59 B8 00 
                  D8 16 00 26 00 2C B0 E6 1F 61 C4 80 C4 8B 0A 75 
                  81 06 FF 4E 40 EB 81 06 FF 4E 01 5D E8 47 1B D1 
                  64 AA 75 B0 E6 E8 47 09 FF 64 98 74 B0 E6 C3 5F 
                  31 A0 8A B0 E8 10 FB 5F 2E 74 B4 F9 02 FB 8D 38 
                  C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A FA 11 
                  20 C7 21 04 21 01 21 FF 21 11 A0 C3 A1 02 A1 01 
                  A1 FF A1 5C 26 01 8D 10 0F 1F 8B C7 04 00 0F E0 
                  01 0F F0 FF 4D 33 0F D0 28 8E B8 00 D8 20 8E 32 
                  F8 02 53 06 08 8E BB 00 7F 80 2F 7F C0 29 7F 00 
                  23 20 C6 05 B8 00 C0 E0 26 1F F7 00 75 B8 00 03 
                  FC 33 07 5B 8C 8E BB E6 C0 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 50 10 25 00 30 74 3C 
                  72 8B 10 80 30 EB 32 2E 87 A8 02 07 49 A0 00 00 
                  BA 03 07 06 00 BA 03 C3 16 00 93 01 C2 EE EA 33 
                  A3 00 62 2E 87 A8 4A D1 2E 87 A8 4C D1 2E A7 A8 
                  E4 A0 00 C0 C4 65 2E A7 A8 26 00 10 06 79 26 6C 
                  26 4C A0 00 FE 02 15 80 09 75 8A E8 00 E8 C1 40 
                  8A 07 0E 00 49 3C 74 3C B8 00 03 20 33 B9 20 AB 
                  07 50 33 B9 00 AB 06 00 74 BB 01 C0 A0 00 C2 EE 
                  51 1F B1 D2 B1 F6 80 07 02 C0 C3 FF 1E 00 33 8E 
                  C5 74 2E 9F A8 F3 BD A7 2B FB 8C 8E 1F 24 A2 00 
                  50 F7 4C A3 00 91 E9 0C 27 5E E6 8C 00 08 A0 00 
                  FF 09 E3 24 0A EB B1 D2 80 20 DF C3 66 83 05 C3 
                  49 88 00 4A 88 01 62 88 07 28 50 28 50 00 00 00 
                  00 00 00 00 00 2C 2D 2A 1E 30 30 30 3F 00 10 20 
                  20 03 03 D0 D0 C3 D0 D0 54 A0 D0 A5 87 D0 D0 D0 
                  A3 57 D0 65 4D 41 59 39 59 2E D2 C0 F2 6E 53 53 
                  A4 C7 00 97 1F D0 D0 D0 28 D0 D0 D0 F8 F8 BC 78 
                  78 14 14 01 01 1E 3E B0 E6 B8 00 C0 1E 00 33 33 
                  BE 20 FF C5 00 F3 81 00 3B 72 52 40 8E 89 13 33 
                  8E BF 00 50 8C BE A8 A5 E2 33 8E BF 01 08 B8 00 
                  AB FC 31 84 C0 C0 86 BF 01 08 8C 2E AB FB 32 84 
                  46 BF 00 20 8C 2E AB FB BF 00 C0 89 5F 33 84 40 
                  8E BA 12 80 34 02 D0 16 00 34 84 90 1E 33 33 8A 
                  E8 0B D0 DA C4 F3 AF D4 8A B0 E8 0B F0 D3 12 8E 
                  C2 0C 8A B0 E8 0B 35 84 36 84 00 8C 8E B0 E6 BE 
                  A8 00 B9 00 AD 42 EC FF 07 C7 4A 92 E2 B0 E6 BE 
                  A8 08 B9 00 AD EC D0 8A EC C4 05 C7 92 E2 B0 E6 
                  BE A8 78 B9 00 2E 85 75 B8 00 D8 1E 00 3B 84 59 
                  80 87 14 8E 3A A8 75 B0 E8 0B 05 07 26 00 EB BB 
                  BA 8E 06 F4 74 80 87 FB 06 00 B0 E8 0B 30 E0 1E 
                  52 84 3D 1F 74 80 00 03 35 B0 E6 E8 F0 B8 00 D8 
                  DC 72 3C 75 80 87 FB FF FF 9E B0 E6 B8 00 D8 51 
                  84 8E BE A8 74 B4 EB 90 94 B0 24 8A 50 B0 E6 E8 
                  EF 58 10 90 74 E8 00 53 84 E3 C3 06 E8 F3 0C C0 
                  C0 74 26 05 F0 26 00 80 10 30 00 07 10 26 00 80 
                  10 20 00 03 10 AA 58 1F 54 84 F9 E9 01 40 E8 00 
                  73 F6 24 50 55 84 E8 00 0D 56 84 93 E8 1C 73 C3 
                  77 8B 83 0F C0 40 D3 01 10 FC 74 B0 B5 80 20 07 
                  45 B0 B5 80 10 CF 2E 00 53 8E 06 C4 5B 74 F9 50 
                  57 84 B4 CD 33 C3 80 30 03 13 80 10 30 2E 47 E8 
                  F2 07 D9 C3 8E B8 0C 8A B0 E8 09 B0 E6 0E BB BA 
                  59 84 47 E8 F2 03 6F B0 E6 B0 81 B8 75 B0 8B EE 
                  5B 84 D2 FF 4F 8B 32 7B FE 32 AA F3 FF 4F 8B 32 
                  7B FE 32 AE F3 05 F2 75 B0 E6 9C FB E9 EF C9 57 
                  B4 E8 00 74 B0 E6 53 57 33 8A 0C 5F E8 1B B0 E6 
                  83 0F FB BA 03 73 B0 E6 C3 C0 64 FF E4 A8 74 E2 
                  EB B9 FF 64 01 10 F8 10 B9 00 59 E9 1B FE 60 E5 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF 31 00 89 
                  60 A0 00 FE 02 2A DB DB 36 00 7C 0D 1C C1 18 16 
                  D9 E3 60 C5 11 8A 8A E8 00 C8 CB 0A 3F C3 0F 0E 
                  E4 E8 E8 E8 00 80 07 48 FB FF E3 4E 89 50 A0 00 
                  46 75 52 C0 C5 26 00 C8 4E D1 03 5A 0E C4 42 C5 
                  00 00 4A C4 C4 00 00 42 C1 00 00 4A 8A EE 8A EB 
                  EB EE FE 8A EB EB EE 8A EB EB EE FF 1E 58 8E BB 
                  F3 F0 B8 00 FF 4F E9 49 61 0C 61 F3 61 F0 B8 00 
                  FF 67 E9 3A 0B 57 33 5F 72 EB E4 A8 66 00 00 75 
                  81 FC 74 BB F3 B6 C0 C3 26 05 88 E4 0C E6 24 E6 
                  58 0B 75 E8 D9 E0 E4 33 B1 D0 73 46 F9 F6 C0 17 
                  8B 66 33 8B B9 00 FF 07 C1 08 E2 8A 8B 1F C3 FF 
                  FF FF FF 72 98 A6 A7 2D 5E A3 A3 9C E2 A6 A7 49 
                  71 A3 A3 3B 19 A3 A3 44 70 80 80 12 40 9C 8B 8B 
                  02 46 5D 58 48 1E 6A 8B 80 15 0A 40 8E E8 04 2E 
                  66 FE 81 1A 02 FC C0 D8 36 01 C2 74 C4 18 BB 00 
                  DB D8 5E D1 2E 97 AD 07 61 88 15 26 00 00 40 46 
                  24 3C 72 3C 77 E8 17 EE 73 B4 E8 05 A0 00 46 88 
                  74 88 15 E8 05 53 E7 B0 26 44 C0 02 01 7E 0A 11 
                  02 26 44 0A 75 B0 88 00 A2 00 0F 8E 8B B6 80 15 
                  74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 05 D2 72 
                  E8 03 3D F8 04 73 80 11 0A C7 74 E8 05 27 53 E8 
                  05 1F 04 80 15 75 E8 05 11 4E 75 F7 1A 00 08 28 
                  EB E8 05 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A E9 03 D9 72 E8 03 30 F6 08 74 0C 80 15 75 
                  0C 50 8A 07 C0 02 04 46 58 48 E8 04 7F 7E 0B 06 
                  C4 02 C6 66 88 01 04 E6 04 09 34 C5 E8 03 DA F0 
                  4B E8 03 7E 0B 05 FE 72 E8 04 14 C8 72 E8 04 0A 
                  4E 75 E8 04 03 45 C3 53 72 E8 03 40 F6 08 74 0C 
                  A2 00 77 E8 04 0F 92 72 E8 04 05 10 EB E8 04 E8 
                  04 35 2F 26 44 A2 00 06 00 E8 04 D5 72 E8 03 DA 
                  F0 7B E8 04 0F 54 72 E8 04 05 D2 EB E8 03 89 14 
                  74 53 5E 80 9F FB 5B 0D 46 89 10 07 B7 EB 26 04 
                  48 FF 76 B8 03 E0 E0 26 44 89 12 8A 02 CC 75 89 
                  10 E8 03 50 5E 26 7C FE 80 A0 C3 74 80 10 8A 0E 
                  8B 05 E8 06 07 42 AA C3 B0 AA C4 AA C7 C6 91 E8 
                  03 AC 72 E8 01 0A E0 72 E8 03 05 07 37 C3 45 72 
                  E8 03 03 29 C3 37 72 E8 02 06 00 E8 03 74 72 E8 
                  01 0A A8 72 E8 02 03 01 C3 0F 73 80 01 03 97 1E 
                  C0 D8 36 01 E8 02 06 00 C6 46 00 26 00 E8 01 A0 
                  F6 EE 81 E8 FF 7B 80 75 02 17 0E 00 E8 01 B0 F6 
                  EE 63 E8 FF 5D 81 1A FF 46 00 8F 72 1E C0 D8 36 
                  01 B3 E8 FF 2A 35 72 80 75 02 03 EB 1E C0 D8 36 
                  01 B3 E8 FE 0A 0E 00 E8 00 05 05 59 C3 67 72 E8 
                  01 06 00 E8 02 A4 72 E8 00 0A D8 72 E8 02 03 31 
                  88 14 E8 02 23 49 C6 48 90 69 E8 02 13 84 72 E8 
                  01 E4 46 3C 74 B4 E8 02 8A 75 FE 80 80 5E 73 89 
                  14 46 89 10 19 46 00 26 44 26 64 26 1C F7 89 10 
                  56 C3 46 00 01 66 88 74 81 1A 00 E8 00 21 46 24 
                  C0 04 A0 F6 EE 14 72 A8 74 B4 EB A8 75 B4 E8 01 
                  53 E8 00 FF 04 C4 17 06 B9 F4 80 0E A0 E8 00 F4 
                  75 B4 F9 5B 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 1E 40 8E C6 8E FF 20 20 A0 C0 D8 00 9C 1E 
                  00 58 BA 01 A2 00 0A 00 00 40 BA 01 A2 00 20 D7 
                  10 BE B3 E0 03 EB 2E 5E E0 8D C3 8B 05 E8 A2 00 
                  46 A2 00 46 24 A2 00 46 A2 00 46 C0 06 66 80 60 
                  EC 0A A2 00 46 24 C0 04 A0 76 80 0F C6 47 26 44 
                  BA 03 C3 10 F7 02 46 80 00 C1 0C E8 0B 58 0F C3 
                  8E B9 01 F0 F3 1F 32 8A 00 86 E8 FE 10 31 72 1E 
                  DB 1F F0 EE E8 B9 01 F0 F3 C3 ED 4E E8 DD A2 72 
                  E8 00 07 F0 EC E2 C3 B9 F4 8C 72 BA 01 A8 75 E8 
                  DD F3 80 59 E8 FE E4 46 C3 66 C6 14 88 74 81 1A 
                  00 C3 06 00 88 74 8A 75 0A 74 8A 10 9F 80 0E CC 
                  04 81 06 FB F9 11 F6 B0 EE EE E8 FD 03 6B C3 51 
                  42 BA 01 07 AC 42 FB 5E 53 1E C0 D8 B8 90 FF 54 
                  1F 0A C0 06 00 1B 16 C0 14 B9 F4 06 00 0B 9C E2 
                  4B EF 80 C6 8E 00 5B A8 74 B4 EB A8 74 E8 FE 06 
                  04 03 11 C3 24 BA 01 C0 A8 75 E8 DC F6 80 C3 F6 
                  B0 EE E6 E4 C3 70 C4 71 B0 E6 B8 00 D8 72 E6 3C 
                  75 FF 8B B3 33 BD B5 26 B0 E6 E4 F6 24 8A B9 FF 
                  61 10 C4 10 F6 8C B9 00 95 E9 12 D9 42 84 33 BA 
                  00 B8 00 00 33 B9 40 C2 FF 66 D0 AB F9 C6 81 00 
                  72 B0 E6 E4 0C E6 24 E6 B0 E6 BF 00 BB 00 00 33 
                  66 C5 F4 DF F6 00 8A 9E D1 9F F4 AD 33 E1 75 B0 
                  E6 E4 A8 B0 75 81 00 81 00 72 66 7B EB B0 E6 B8 
                  00 D8 E4 FF 2D E9 D1 E3 33 B1 D0 73 46 F9 F6 C0 
                  11 B9 00 F1 FF 07 C1 08 E2 8B B0 E6 8B 8C BF 00 
                  65 E9 10 A6 B9 00 71 E9 11 FE 45 24 3C 75 8B 4C 
                  C2 80 4E 8A 4E F9 31 32 53 73 65 20 6F 72 20 61 
                  6C 72 0D 20 30 2D 65 6F 79 45 72 72 32 33 4D 6D 
                  72 20 64 72 73 20 72 6F 20 30 2D 65 6F 79 45 72 
                  72 0A 32 37 49 76 6C 64 4D 6D 72 20 6F 66 67 72 
                  74 6F 0A 20 61 65 4D 64 6C 00 4D 64 6C 20 00 4D 
                  64 6C 20 00 4D 64 6C 20 00 0A 61 69 79 43 65 6B 
                  31 00 61 69 79 43 65 6B 32 00 3F 3F 3F 31 31 52 
                  4D 45 72 72 0A 34 32 4D 6E 63 72 6D 20 64 70 65 
                  20 61 6C 72 0D 20 30 2D 69 70 61 20 64 70 65 20 
                  61 6C 72 0D 20 30 2D 65 62 61 64 45 72 72 6F 20 
                  65 74 46 78 75 65 49 73 61 6C 64 0A 33 31 4B 79 
                  6F 72 20 72 6F 0D 20 30 2D 65 62 61 64 6F 20 79 
                  74 6D 55 69 20 72 6F 0D 33 33 4B 79 6F 72 20 6F 
                  74 6F 6C 72 45 72 72 0A 36 31 44 73 65 74 20 6F 
                  74 6F 6C 72 45 72 72 0A 37 32 43 70 6F 65 73 72 
                  44 74 63 69 6E 45 72 72 20 6C 61 65 43 65 6B 49 
                  73 61 6C 74 6F 0D 20 30 2D 2F 20 4F 20 72 6F 0D 
                  20 36 2D 79 74 6D 4F 74 6F 73 4E 74 53 74 28 75 
                  20 65 75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 
                  64 73 65 74 20 6E 44 69 65 41 0D 20 36 2D 79 74 
                  6D 4F 74 6F 73 45 72 72 0A 31 34 4D 6D 72 20 69 
                  65 45 72 72 0A 31 33 54 6D 20 20 61 65 4E 74 53 
                  74 0A 0A 28 45 55 45 3D 22 31 20 45 29 0A 0A 33 
                  32 53 73 65 20 6E 74 53 63 72 74 20 6F 6B 69 20 
                  6F 6B 64 0A 20 20 2D 55 6C 63 20 79 74 6D 55 69 
                  20 65 75 69 79 4C 63 0D 31 39 2D 69 6B 30 45 72 
                  72 0A 37 31 44 73 20 20 72 6F 0D 31 38 2D 69 6B 
                  30 46 69 75 65 0A 37 31 44 73 20 20 61 6C 72 0D 
                  31 38 2D 69 6B 43 6E 72 6C 65 20 61 6C 72 0D 20 
                  30 2D 69 6B 74 65 44 69 65 54 70 20 72 6F 2D 52 
                  6E 53 74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 
                  20 69 6B 74 65 69 20 72 76 20 3A 0A 03 29 F0 B8 
                  60 B7 00 B8 B4 D4 00 00 69 21 10 9B E9 D8 8E 70 
                  C0 71 40 86 B0 E6 B0 E6 2E FE F6 2E FE 2E 06 FF 
                  12 02 BD BA 1A 80 BF D3 E9 CC B8 F0 D8 FF 21 A1 
                  E0 8B F7 00 75 BB FF 1F 07 C4 E8 0C 61 10 84 12 
                  4B 42 4B 92 4B C0 8F 54 43 12 41 36 43 00 40 00 
                  40 0C F2 EE 11 84 01 B8 EE 01 D8 EE BA EC DA EC 
                  C0 32 EE 77 BF BB 01 17 8B 04 57 B9 00 5F E9 E0 
                  C2 81 D9 75 B0 EE FF B0 E6 BD BB 82 33 8A 02 0E 
                  85 E9 F1 C3 81 95 72 B0 E6 B9 01 C0 FC 00 43 40 
                  E0 40 00 75 BB B6 18 BD BB 43 EB B0 E6 B0 E6 EB 
                  EB EB E4 24 8A B0 E6 8A E6 B0 E6 B0 E6 B0 E6 EB 
                  EB EB E4 24 8A B0 E6 EB EB EB E4 24 F6 80 E0 07 
                  CC B0 E6 B0 E6 B0 E6 8A E6 B0 E6 BD BC 34 E4 24 
                  E6 B8 00 D0 00 B0 E6 E8 EC AD 64 FF E4 A8 74 E2 
                  BB B8 1D BD BC AB EB B9 00 60 BB 13 DE 59 64 01 
                  10 EE 10 B9 00 6F E9 0B FE 6C E8 ED 1A 84 F6 B0 
                  E6 E8 C6 1C 84 C5 B0 E6 E8 0F 2D 84 6B B0 E6 E8 
                  13 1F 84 9D B0 E6 E8 1A 73 E8 37 27 FB 21 84 AD 
                  B0 E6 E8 12 22 84 A3 BF 00 D7 E9 CB E3 80 40 0A 
                  BE 84 E9 E9 CB 24 84 60 D0 64 64 02 02 F8 64 01 
                  FA 60 FD F3 E0 D1 64 64 02 FA C4 60 25 84 92 B0 
                  E6 E8 06 27 84 EC BE EE 28 84 81 B0 E6 E8 25 2A 
                  84 0F 10 00 10 61 E0 6C 61 E0 61 2B 84 0E E6 A8 
                  74 BA 20 29 B9 00 D7 E4 24 E6 E4 24 E6 B8 00 D8 
                  06 00 80 96 80 0E 00 FA 9C B0 E6 FB FF F6 96 20 
                  07 F7 06 00 E4 81 72 34 74 B0 50 57 0A 58 02 80 
                  86 67 B0 E6 E8 09 37 40 04 80 07 C6 B0 EB 24 3C 
                  72 3C 77 EB E8 09 00 E8 35 B0 E6 58 00 02 4A 06 
                  00 12 E8 09 2C 84 22 CD 8A 24 0E 57 5C B9 00 AE 
                  F8 03 35 80 2A 0A 06 00 74 E9 01 00 D3 0A 79 80 
                  AA 05 FC 75 F6 96 02 03 08 F7 80 B8 28 06 00 74 
                  80 96 F7 26 00 F6 18 02 42 44 26 00 F6 96 08 34 
                  36 FC 75 F6 96 01 2A 06 00 74 80 96 FB 26 00 F6 
                  18 01 0E 10 26 00 F6 96 04 04 1E 00 C3 FC 75 F6 
                  96 02 0C 0E 00 80 96 FD 05 0E 00 80 17 08 C3 FC 
                  75 F6 96 01 1D 06 00 74 80 96 04 26 00 EB 80 18 
                  01 0E 00 F9 85 17 75 09 17 F6 17 04 3C FC 75 F6 
                  17 08 36 06 00 74 F6 96 02 17 06 00 74 EB F6 96 
                  02 0E 06 00 74 80 18 7F 04 3E 00 FC 74 F9 38 2A 
                  52 45 F6 18 04 0E 0E 00 B8 85 96 CD 45 C3 26 00 
                  B8 85 EE 7D E8 08 C3 F0 03 0E 98 B4 9C E8 28 FF 
                  20 7D 50 33 58 00 14 01 10 09 0C 7D E8 06 7D E8 
                  08 C3 FC 75 EB 80 54 02 93 FC 75 EB 80 45 03 4F 
                  80 B8 03 97 80 37 03 AB 80 52 03 D3 80 46 03 D6 
                  E8 02 27 26 00 72 FC 75 E9 00 FC 74 80 33 05 00 
                  FC 80 34 05 01 F2 F8 F6 96 01 1A 06 00 74 F6 17 
                  08 03 9E F6 96 10 DF 05 26 00 80 18 08 E8 2A FB 
                  3E 00 74 80 49 03 09 B8 BF 01 10 F6 18 08 F9 C3 
                  33 86 19 84 74 E8 13 EB E9 F5 E8 2A E9 29 06 00 
                  74 F6 96 02 15 06 00 75 80 96 FD 0A 06 00 75 E9 
                  FF E8 2A CD FB C3 06 00 74 F9 F8 F6 17 04 F7 06 
                  00 74 B0 E9 00 06 00 74 F6 17 08 DD 06 00 74 F6 
                  96 02 CF 26 00 80 71 80 47 FA F6 45 CD 33 EB B4 
                  CD 33 F9 E9 FF E4 33 FC 7C 80 44 2B FC 74 80 58 
                  1F 34 06 00 75 B0 F6 17 04 2C 30 06 00 75 B0 EB 
                  F8 B0 F6 17 08 14 23 06 00 75 B0 F6 17 03 02 C0 
                  E0 C0 2E F9 0A 78 8A 3C 7C 3C 7E C6 19 00 C3 C4 
                  47 81 2E F6 17 08 55 8E F6 17 04 42 06 00 75 F6 
                  17 20 16 06 00 75 3C 7C 80 4C 04 F0 02 C0 06 00 
                  74 80 96 FD E0 C8 32 EB F6 17 20 D5 E2 0C 8A 72 
                  EB F6 96 02 2F 2E 89 2B 0A 38 75 B8 4E CE 2D 0A 
                  2A 75 B8 4A C0 30 BF 26 00 0A 19 F9 80 96 FD B8 
                  EB 8B 1A 3B 1C AD F6 17 08 05 06 00 C3 FA 80 A3 
                  00 1C 0E 03 EB 90 C3 39 74 8A 49 80 04 05 EC 76 
                  E8 00 16 00 C2 EC 01 FB EC 01 FB 8B 89 00 C3 26 
                  00 FC 72 80 06 0A 7D 26 05 46 C3 95 8C 8E 8B 8C 
                  8E 83 08 FC 04 02 04 FC 13 F0 54 B9 00 E2 01 D0 
                  D1 E2 AA F6 20 CB DE C6 FE 75 8C 8E BE FA FC 69 
                  73 33 8E C5 7C 50 8C 8C 3B 5B 75 83 00 09 FC 49 
                  72 04 83 08 46 C3 F8 DF FF 4C F7 8B D1 8B 50 A0 
                  00 E7 FF C3 E0 C2 C3 1E 00 D2 DA FB EF EF FB 06 
                  00 75 D1 03 C3 C6 DF ED 80 56 F0 FB 04 A7 0B 08 
                  4A F0 33 F9 5E C6 03 E8 B8 00 D8 B0 84 C0 75 A2 
                  00 F2 B0 EE C0 3C 74 B0 E6 EB 80 8B 01 E4 72 E8 
                  00 B8 84 06 9B 73 B0 E6 BB BA 1E BA 00 69 E8 01 
                  2B B3 84 C0 C0 C4 04 B2 E8 00 3E 00 72 B0 E6 33 
                  8E 26 3E 01 81 02 07 B7 B3 B9 7A 10 13 11 BA 01 
                  5A 80 18 FC 74 EB A8 75 E8 CD E0 CB D9 CF D3 09 
                  EB B4 CD 72 B4 CD 72 52 8B 2D 00 E8 CC E1 80 01 
                  E4 C0 04 D4 0A 26 75 FE B8 04 13 1B FC 74 80 11 
                  11 FC 74 8A 24 3C 74 FE EB B9 00 0C 13 04 92 F9 
                  B0 E8 F0 40 0A B7 84 00 EB 90 92 8C 0A 74 8A 1E 
                  C0 C8 D8 C3 E8 74 3C 75 B0 E8 F0 C1 C8 10 E5 01 
                  FA 04 8C 06 33 8A 24 74 3C 75 B0 E8 F0 C8 C1 E5 
                  01 A3 01 0E 01 4C A3 01 4E A3 01 06 00 2E 0E 00 
                  06 01 33 0E 01 1F 0E 00 B0 E6 BB B9 FA 74 BB B9 
                  13 BA 00 FD C3 B6 84 EB 80 81 06 39 BB B9 15 BA 
                  00 E1 C3 3A E8 00 F7 BB 00 24 EC 80 0C 1E E2 4B 
                  F0 80 0A F1 EC 01 03 20 C3 B0 E8 EF 08 E0 8E A9 
                  FB E4 24 E6 E4 24 E6 C3 00 BA 03 B0 EE DE B0 EE 
                  FB 51 56 1E 8B BE 00 DE E2 00 F2 FC 73 8A 7C D1 
                  8B 00 0B 74 84 75 E8 05 2B CC 05 3A EB FE 75 E8 
                  05 19 CC 05 1F EB FE 75 E8 05 07 CC 03 F4 5D 5F 
                  5A 5B FF FF FF E9 04 00 BB 00 02 5B 55 51 04 59 
                  5D 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 8B 9C B0 
                  E6 E4 8A E4 0E 03 EB 90 86 53 D8 FB 09 72 E2 C3 
                  CB 00 43 40 E0 40 C4 D8 00 43 40 E0 40 C4 D8 FB 
                  09 04 DC E5 D8 E4 F2 E9 D9 E6 04 D3 B9 00 C1 EB 
                  90 D4 E2 00 04 BE C6 17 B0 26 85 80 47 D3 02 BE 
                  C6 03 FF FC 00 8E 92 F7 2D 92 90 14 27 88 00 AA 
                  E2 FF 86 51 8B C1 08 02 E8 00 81 03 B9 00 0D B0 
                  E8 00 B9 00 01 C3 92 F7 2D 92 90 14 27 51 E8 00 
                  59 E2 C3 B8 00 D8 06 00 1F 51 C6 74 E8 00 EE EB 
                  F6 30 08 29 80 10 F3 5B 8A 53 5D 5B E2 C3 07 E8 
                  00 43 F6 B0 E8 00 0A 43 C3 FA E8 00 00 E8 FE BB 
                  00 37 BB 00 8E C3 20 E8 00 00 E8 FE 8A B1 D2 E8 
                  00 C5 01 C3 0F 90 14 27 01 C3 07 B4 CD C3 B6 43 
                  38 42 05 42 61 03 61 48 E4 24 E6 C3 FF B8 B0 C0 
                  8A 43 88 00 AA E2 FF 06 FF B8 B0 C0 07 26 85 80 
                  47 F4 C3 1E B0 E6 B8 00 D8 26 00 16 00 D1 84 A2 
                  74 E9 00 D2 84 B1 F6 8A B0 E8 EC D2 40 F7 8A B3 
                  E8 00 3F A1 00 80 33 BB 00 F3 F8 1E 00 80 E8 BC 
                  D3 84 28 8E 8E 8E 0F 00 25 FF 7F 22 EA C8 F0 0F 
                  1E A1 D4 84 40 8E 8E 69 8B 67 E8 DB 13 33 BB 00 
                  F3 00 75 EB 90 01 8A BA 10 FF 74 8E 66 C0 00 33 
                  FC F3 FE 80 10 E6 1F C3 00 BB B6 1A E8 FE 50 51 
                  1E B8 00 D8 06 00 00 FF 74 88 4C B8 00 C0 33 B9 
                  40 FF 66 AB CF C3 E0 1F 59 58 E8 00 26 00 E4 05 
                  4E 01 C3 46 8A 41 0A 74 81 16 00 FA 06 00 B0 8A 
                  06 E0 0C 46 8A 3F C0 04 C4 F2 EE E0 8B C0 06 F7 
                  EE EC A0 00 0F C4 30 26 00 F8 FD CD 72 B0 B1 26 
                  5C 80 01 74 80 01 75 B1 3A 73 86 F6 8B E8 FC C3 
                  BA 03 BC E8 C7 A8 75 E2 B0 EB E8 C7 42 40 C3 FC 
                  45 2A 05 E0 F6 04 D8 46 2A 07 F6 04 C3 06 00 46 
                  8A C3 F2 A0 00 0F 12 E8 04 02 03 26 00 04 E4 C4 
                  08 E8 C7 26 00 0C EE 24 F6 3E 80 0A 60 E2 B4 F9 
                  0D 26 00 E8 25 8F 32 C3 10 F7 0C 46 80 00 E6 E6 
                  86 E6 86 8B 8A E6 8B E6 86 E6 86 FB 8A 07 E7 0A 
                  06 40 8A 05 3A C3 FF FF FF FF FF FF B0 E6 E6 B0 
                  E8 EA E0 0C 9A 22 A8 74 E8 00 20 03 02 58 50 4A 
                  C3 53 50 40 8E F6 A0 01 2B 2E 00 03 23 2E 00 73 
                  58 B0 80 BF 5F 80 A0 FE 9A 8E 8B 98 26 0F 58 5B 
                  C3 25 00 83 03 80 83 03 04 EE 8B 2E EE C4 EE 42 
                  24 EE 4A C0 4A C2 EC E0 EC 50 B0 E8 00 0D 10 C3 
                  74 4A 20 BB 5A 84 75 52 C2 EC E0 C1 EE 02 C1 B0 
                  E8 00 45 71 80 7F B7 B9 00 80 B0 E6 E4 86 E4 86 
                  8B 58 84 75 84 75 50 00 43 40 C4 40 C4 2B 81 20 
                  5F 72 E2 FE 75 80 80 C0 09 E0 EA EC E4 C3 C2 EE 
                  42 20 3D 00 18 38 01 D0 D0 0A D0 D0 0A 32 86 BE 
                  CB F3 0A 8A 83 03 80 83 03 ED F1 E6 8B 2E EE E0 
                  EE 42 C7 4A 32 EE E8 FF 3C 73 83 04 C0 06 88 0C 
                  06 E3 8A EE EA E8 FE 17 00 80 C0 60 30 18 0C 06 
                  03 02 00 55 02 08 20 80 00 90 84 0E BE CC 02 24 
                  AC E0 8F E1 B0 E8 E8 E0 EA 92 84 00 BB B6 1A E8 
                  FA FE 91 84 B0 E6 B0 E6 E6 E6 E6 B9 00 44 E2 E9 
                  00 AC D9 00 B9 00 EE E2 BA 00 08 EE 42 E2 E6 E6 
                  E6 E6 E6 E6 E6 8A E4 3A 75 EB E4 3A 75 EB E4 3A 
                  75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 
                  75 EB B0 E6 BA 00 08 EC 42 C4 17 F7 C0 B9 00 EC 
                  42 C4 07 F6 CB 70 BA 00 8C B9 00 0D EB B0 E6 E6 
                  E6 B0 E6 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 
                  B0 E6 B0 E6 B0 E6 C3 FA 8A D0 A8 74 EB B0 E8 E7 
                  F0 82 BE 8A B0 E8 E7 E8 8A E8 00 3B 65 C4 F0 C1 
                  C5 3C 77 8A 8A E8 00 17 4D F8 C3 C9 CC B9 22 E1 
                  58 B9 00 E1 23 F7 03 59 D1 C6 C8 C4 92 E4 E1 C8 
                  C0 CB D0 D1 C2 13 D1 D1 D1 D1 D1 D1 B4 CD EB B0 
                  E8 E7 04 E0 8E 3D 06 40 8E 33 8E 26 2E 00 C7 20 
                  54 80 6B FE 21 FE 21 3C E8 F8 06 00 75 BA 00 8C 
                  B9 00 FF EB 26 2E 00 26 00 07 1E B8 00 D8 0E 00 
                  B0 E6 58 CF E0 EC 24 D5 C3 40 8E 8B 10 DB 9B 3E 
                  00 10 0A 75 80 02 60 C0 64 64 02 02 F8 64 01 FA 
                  60 04 07 C3 75 EB F6 02 06 E3 EB 90 E3 53 00 BB 
                  B8 3D E8 F8 EB E4 24 E6 E4 24 E6 89 10 C3 8B 84 
                  5C 72 3C 75 BA 00 A8 B9 00 5D E8 00 3C 74 E8 00 
                  8F B0 E6 B0 E6 B9 03 E8 F7 E4 A8 75 E2 E9 00 60 
                  FA 05 E8 80 B0 E6 B9 13 64 01 0A E8 F6 E2 EB 90 
                  88 84 60 AA 03 46 B0 E6 B0 E6 B9 FF 64 02 05 F8 
                  30 B9 00 64 01 09 E8 F6 E2 EB B0 E6 E4 50 AD 64 
                  64 02 FA E8 F8 06 B0 E6 C3 40 8E 80 12 FF 00 BB 
                  B7 15 E8 F7 B8 00 D8 0E 00 BA 00 EC B9 00 87 C3 
                  AE 64 FF E4 A8 74 E2 BA 00 10 B9 00 6B EB C3 80 
                  84 AD 64 64 02 FA 64 01 04 60 F6 81 84 AA 64 10 
                  E4 A8 75 51 25 59 F3 0A 82 84 60 55 12 83 84 00 
                  BB B8 1F E8 F7 FE 84 84 60 64 64 02 FA 5D 60 B0 
                  E6 E4 A8 75 B9 00 64 01 09 E8 F5 E2 EB B0 E6 E4 
                  F8 01 C3 FA F6 EA E5 D6 AA A5 95 56 FE BF 00 83 
                  E9 B7 E3 80 40 37 01 BD D0 50 06 C8 C0 65 B9 00 
                  C3 AE 02 1A 00 BB B6 23 E8 F6 0E 8C 0C B4 86 E8 
                  E4 5D C6 01 83 06 83 06 04 6E 02 6E 46 01 10 42 
                  8A 4A 11 42 4A 06 00 05 7C 33 32 8A 49 2E 87 D1 
                  DC 79 33 8A 4A 80 04 37 FB 74 B1 F6 8A D0 D0 88 
                  03 66 D0 88 05 03 E0 E4 E0 46 80 49 06 06 66 D1 
                  06 C2 EE F6 88 03 66 B1 8A D3 89 06 E0 46 EB 03 
                  05 03 03 8A 62 3C 74 3C 74 3C 74 3C 74 B9 00 0A 
                  59 B4 E8 B2 C2 16 00 1C D2 C6 FE 75 FE B4 E8 B2 
                  08 37 53 FC 40 5B 02 2B 8A 49 88 01 B4 E8 B2 D2 
                  EF CA E6 03 11 32 EB BB 01 07 C3 03 01 80 18 04 
                  C6 C8 08 F3 8A 51 80 49 07 09 3E 00 76 B7 B8 06 
                  C9 18 16 00 E8 B1 59 1C 2A 37 46 E4 03 05 C3 15 
                  80 39 F7 DC FF 8A 1F F6 17 08 E8 06 00 75 24 F6 
                  17 03 03 AF F6 17 40 63 99 80 0F 05 00 EB 80 35 
                  11 06 00 74 80 96 FD 00 EB 0A 78 80 03 5E FC 74 
                  80 1C 5C FC 75 F6 96 10 46 06 00 75 B8 96 35 26 
                  00 EB 3C 7E 3C 7C 3C 7D 24 F6 96 02 19 8C 8E BF 
                  D2 07 8A F2 58 07 26 00 B4 E8 00 C3 72 C0 D5 7F 
                  D1 AA E8 C8 C9 EA 61 C3 7A BF 20 BB FC 74 80 35 
                  0E 06 00 74 80 96 FD C3 FC 74 7F 2E 87 9B 95 C0 
                  91 69 E8 C7 89 06 00 75 2C E9 FF 7F FC 75 F6 96 
                  02 0A 26 00 B4 EB 90 FC 75 F6 96 02 0A 26 00 B4 
                  EB 90 FC 75 B4 EB 90 8A 8C 8E B9 00 FC A7 F2 58 
                  22 20 14 FC 7C 80 0E 0F 61 09 7A 05 C0 18 F9 80 
                  76 F4 F0 F2 0E 1B 27 29 33 35 FA 36 00 04 46 36 
                  00 04 36 00 36 00 11 36 00 E8 17 50 02 CD 58 FB 
                  BB 00 F5 58 B4 8A 00 4E 01 C3 E8 00 40 C3 90 02 
                  10 40 C3 E8 FF 56 0A 75 C0 04 0F C0 07 04 03 EB 
                  F9 C3 6A 8A F6 10 B0 EB B0 E8 E1 8B 10 F6 01 12 
                  E2 74 80 40 08 02 07 01 03 00 C3 FC 66 0A 74 C0 
                  04 06 00 E7 8A 8A 06 E4 03 E0 F6 20 8F 8A C3 C0 
                  8F 8A 06 E4 03 E8 25 00 50 52 C4 E8 BA 03 A0 00 
                  D8 C0 E8 F6 01 02 01 E4 0A 88 8B 5A 58 E8 F5 FB 
                  D8 EC E8 F4 FB CE 8A EE 26 1C FB EC 86 E8 FF 50 
                  BA B7 E8 FF 7E C0 02 7E E8 FF 8F 75 B9 00 42 E8 
                  FF 05 E2 E8 00 26 00 C3 42 A8 74 A8 74 B4 EB 8A 
                  43 F6 30 04 EC 14 C4 74 FE EB F6 80 02 04 02 00 
                  BB 00 DB 90 80 93 03 C7 8A 24 C0 06 C0 51 C8 24 
                  05 27 00 13 74 DF B8 04 01 D2 13 03 84 80 04 04 
                  C0 7B 00 13 97 BF 80 28 09 B1 33 CD 73 80 04 04 
                  C0 3D CB 7B ED EB B3 32 B4 CD B4 E8 00 01 B1 33 
                  CD 73 B4 CD B4 E8 00 01 B1 33 CD 73 FE 74 FE EB 
                  BB 00 3F 74 B4 E8 00 3C EB 90 34 67 BA A1 4A B4 
                  E8 00 90 80 74 06 15 EB 90 08 EB 90 01 43 BA A0 
                  26 E8 FD 23 D5 24 C0 04 01 FB 74 FE BA A1 0A C8 
                  22 74 BA A1 83 C3 BB 00 27 0A 27 38 80 8F 06 C3 
                  91 75 E8 FD E8 3A 74 80 34 08 03 47 04 43 33 C4 
                  0C 24 0A 8A B0 E8 DE A0 A8 75 8A 80 20 0E AB BA 
                  20 1E B9 00 9B BD 00 DF B4 CD B4 CD B0 E6 EB B0 
                  8A E8 DE FB C4 7D C3 8B 33 8E BF 00 8C AB C3 1E 
                  0F 0F B0 E6 B8 1C D8 40 8E 26 16 00 89 67 C7 64 
                  00 B0 E6 E8 A9 09 0E 00 00 61 E8 AF 62 84 06 00 
                  00 06 00 00 FE 26 3E 00 12 0F 7C A3 00 7E A3 00 
                  FE FC 57 06 DB C3 30 8E BE 83 93 B9 00 A5 1F 5E 
                  63 84 80 73 B0 E6 EB 90 3E 00 00 16 0E 00 00 1E 
                  00 1E 00 1E 00 1E 00 15 E8 AD C0 03 EE 8B 76 81 
                  80 89 7A 8B 7C 81 80 89 80 A0 00 8F B4 C6 92 01 
                  F9 8B 8A 81 80 89 86 0B 74 81 64 01 88 66 89 67 
                  88 69 B0 E6 8B 78 89 7A 8B 7E 89 80 8B 86 81 80 
                  A0 00 8F B4 C6 92 01 AB 8B 8A 89 88 0B 74 81 64 
                  02 88 6E 89 6F 88 71 A1 00 00 BB 3F 1E 00 C3 39 
                  2E 00 2E 00 C5 00 8D A3 00 06 00 8A 8C C6 92 01 
                  D1 0B 74 81 64 02 88 6E 89 6F 88 71 06 40 8E BD 
                  00 C5 1F 07 80 C6 92 01 FE 00 65 A9 00 12 0E 00 
                  00 2E 00 16 00 0E 00 86 BB 04 E3 02 C2 21 E2 06 
                  00 E8 03 02 74 81 64 04 88 6A 89 6B 88 6D A1 00 
                  C0 28 00 F7 B0 8A C6 92 01 07 A9 00 12 0E 00 00 
                  2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 A0 00 
                  FE 06 00 E8 02 02 74 81 64 08 88 72 89 73 88 75 
                  B0 E6 8B 86 26 1E 00 1E 00 B0 E3 F1 B0 8A E8 DB 
                  00 06 00 00 02 01 A6 B0 E6 81 86 80 72 B0 E8 DB 
                  80 E0 B3 C1 B4 F7 64 FF 74 B4 B0 E8 DB 68 84 60 
                  20 64 88 E4 A8 74 E4 8A 80 04 60 64 E8 12 8A E6 
                  E8 12 FE 64 EB B0 E6 BB 00 08 B0 E6 BB 00 40 8E 
                  8E 69 8B 67 53 9A 5B DB 03 98 B0 E6 B8 1C D8 06 
                  00 00 16 7E 32 8A 66 8B 8A 69 8B 67 E8 A8 06 00 
                  00 16 60 32 8A 6A 8B 8A 6D 8B 6B E8 A8 06 00 00 
                  16 42 32 8A 6E 8B 8A 71 8B 6F E8 A7 06 00 00 16 
                  24 32 8A 72 8B 8A 75 8B 73 E8 A7 06 00 00 0F 06 
                  BA 00 8C B9 00 B9 F7 64 FF 74 E8 EC 06 00 00 03 
                  25 E4 A8 74 B0 E6 E8 F5 6C 84 A9 A1 1F C3 8A B0 
                  E6 8A 8A B0 E6 8A 8B 80 39 7A 76 81 64 80 8B 7A 
                  89 82 E8 00 1E 00 1E 00 04 1E 00 1E 00 30 74 81 
                  64 80 89 82 E8 00 1E 00 1E 00 16 50 6F 84 89 82 
                  E8 00 1E 00 1E 00 0B 74 F9 C3 57 B0 E6 88 4C 8A 
                  32 8B BB 00 3E 00 75 B8 00 C0 C5 4D 83 82 00 0C 
                  00 C7 84 00 E9 00 71 84 48 8E 53 57 A0 00 06 00 
                  05 B4 EB E8 B0 5F 5B 0A 2E 00 01 EB 90 C3 FC 51 
                  8A 4C B9 00 FF C0 DB 00 AB F6 1E 00 00 F6 02 03 
                  01 AB 59 80 92 01 0C 40 8E 8B 03 E8 A4 1E 00 06 
                  00 EB 90 06 00 E9 FF 1E 00 B0 E6 58 5F C3 57 50 
                  72 84 A2 00 BB 00 C3 08 8A 33 33 D1 1D 00 75 E2 
                  26 05 61 C0 06 C0 FF 37 26 05 61 C0 07 C0 01 EB 
                  80 92 01 0F 40 8E 8B 05 00 E8 4F 58 28 4F 32 75 
                  47 32 8A 26 05 8A 8A 4C B0 E6 58 C5 84 8B B8 00 
                  11 C0 E0 03 7A 3D 00 F8 00 5B 07 E8 0F E8 E5 75 
                  B8 90 CD FA 98 FB 74 3B 82 75 8B 80 89 1A FB E8 
                  0E E8 E5 C3 17 C3 FC 74 3D E0 05 0D EB 3D E0 05 
                  2F EB 80 84 0F F0 0B E0 02 00 FF EB 33 85 C3 FC 
                  74 3C 75 B0 C3 8A 18 8A 24 80 04 E3 0A 8A 96 80 
                  0C E0 17 5B 3C 75 80 03 56 FB 77 51 E4 75 80 97 
                  EF EA B0 E6 B9 FF 06 00 75 E2 E8 0E F4 60 24 26 
                  00 E8 0E C7 E0 0A E6 B9 FF 06 00 75 E2 E8 0E F4 
                  60 26 00 59 FA 36 00 0C 46 36 00 04 36 00 36 00 
                  09 36 00 C0 EB B0 F9 C3 3C 74 3C 74 84 75 E4 24 
                  0C 24 2E 06 67 86 8A DE EB FE 75 E4 24 0C 24 2E 
                  06 67 86 8A DD EB FE 75 E4 24 0C E6 B4 EB FE 75 
                  E4 B4 A8 74 8A 80 3F 40 86 2D 86 7F C0 86 00 21 
                  F9 72 83 32 26 32 2B 40 8A E4 24 0C 24 0A E6 EB 
                  B0 FA 4B FC 74 8A E6 FB C3 86 40 08 80 04 08 2D 
                  40 21 00 3F 3A DE 74 B4 2E 06 67 15 E4 32 2B 41 
                  B4 EB B4 A8 75 B4 8A 32 C3 A3 B4 74 B4 A8 74 B4 
                  8A 32 C3 60 02 03 0A 83 38 EC D0 C0 D8 FD C0 38 
                  F3 8B 8D 10 C7 FF 26 45 80 C6 06 26 45 92 C7 02 
                  00 C6 04 8D 18 C7 FF 26 45 00 C6 06 26 45 92 D0 
                  10 F7 03 80 00 38 80 00 89 02 88 04 DB D2 73 E9 
                  00 7C 26 05 C0 40 07 46 00 81 BB 00 B4 72 8A 46 
                  C0 5D 7C 8B 8D 18 6E 8B BF FF 8B 2E 05 0F 7C 26 
                  35 06 C6 FF 04 C6 FC DB 6D 8D 38 8F FE 74 26 25 
                  BB 00 59 72 C6 46 EB 26 0D BB 00 47 72 C6 46 EB 
                  8D 38 8A 80 40 06 46 01 04 46 02 C4 61 E2 FC 35 
                  75 FF 04 75 B9 00 A5 EE 83 08 44 8F 04 44 8F C3 
                  7C 26 5D B9 00 87 15 8D 10 89 02 01 B4 CD C3 FF 
                  EB 41 54 4F 53 43 42 33 4C 39 52 53 33 4A 39 4E 
                  42 43 43 70 72 67 74 43 4D 41 20 6F 70 74 72 43 
                  72 6F 61 69 6E 31 38 2C 33 38 2C 35 38 2C 49 EA 
                  8E F0 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 
                  4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 
                  6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 
                  38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 
                  6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 
                  65 64 2E 0D 84 12 4B 22 48 EE 00 1C B0 E6 B0 E6 
                  B0 E6 B0 BA 00 B3 E8 00 92 4B B9 01 C3 4B 8A EC 
                  22 75 E2 B0 E6 B0 E6 BB B6 18 BD E1 9D EB C3 FF 
                  FF FF FF FF FF FF E4 A8 75 58 B0 E6 B0 E6 FC 80 
                  70 FF 21 A1 04 E4 32 8B BD E1 51 8B 8B 72 FE 8C 
                  8E 8E B8 00 D0 00 BE B7 D0 84 74 BE B7 C6 EB 87 
                  B9 00 EA 02 E8 00 D7 E2 00 04 E8 00 20 0E 10 D2 
                  02 E8 00 8B B3 33 BD E1 A4 8B 33 8E 33 8B 89 E4 
                  0C E6 8B B3 33 BD E2 86 8B E4 24 E6 E4 A8 74 F8 
                  E5 40 8E 8B 13 C1 06 00 B9 40 DB F3 E4 A8 75 81 
                  00 3B 76 33 FF 8B 8B 33 BD E2 8E 8B 80 0F D2 04 
                  DB 05 E2 33 F9 E5 00 F7 6B 92 30 39 02 07 0E 10 
                  EC AC C0 06 0E 10 F5 E8 10 27 1F C0 C0 40 A1 71 
                  A1 71 BF 00 28 AB 2A AB 0C A1 71 A1 71 BB 00 03 
                  CD C3 6B 00 B0 E8 D2 E0 14 70 A8 75 80 20 C4 C0 
                  13 00 BB B8 56 E8 E4 0E 00 EB A8 74 BA 20 A0 B9 
                  00 41 80 12 FF 06 00 75 BA 20 F6 B9 00 29 80 12 
                  FF 10 11 00 BB B9 18 E8 E4 0E 00 E4 B0 E6 B9 FF 
                  58 E4 A8 74 E2 EB B9 FF 48 E4 A8 75 E2 EB E4 A8 
                  75 BA 20 5B B9 00 D7 80 12 FF ED C6 72 95 2D 33 
                  0A 12 74 E8 00 06 00 C3 BA 00 43 B9 00 A9 95 05 
                  03 4B C6 12 00 C3 E4 24 E6 06 C0 C0 8B 24 26 06 
                  00 E3 53 67 5B 89 24 07 60 64 FF E8 AD 64 02 02 
                  F5 45 60 50 60 20 20 CF 00 16 FC 75 C3 FF FF FF 
                  FF 01 00 80 00 00 00 01 00 02 00 80 00 00 00 02 
                  00 02 00 80 00 00 00 02 00 04 00 00 00 00 00 03 
                  00 03 00 00 00 00 00 03 00 02 00 80 00 00 00 02 
                  00 01 00 00 09 00 00 01 00 03 00 80 00 00 00 03 
                  00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 
                  00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 
                  00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 
                  00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 02 
                  00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 
                  00 02 00 FF 00 00 00 02 00 02 00 00 00 00 00 02 
                  00 02 00 00 00 00 00 02 00 03 00 FF 00 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 
                  00 03 00 FF 00 00 00 03 00 02 00 80 00 00 00 02 
                  00 02 00 80 00 00 00 02 00 03 00 80 07 00 00 03 
                  00 02 00 FF 07 00 00 02 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 
                  00 02 00 FF 07 00 00 02 00 02 00 FF 07 00 00 02 
                  00 03 00 80 00 00 00 03 00 EB 90 00 01 70 00 00 
                  C4 FB B0 E6 B0 E6 BA EF BB 8E B0 E6 B9 00 B4 CD 
                  BB 7C 01 B8 02 13 73 72 FF FF FF FF FF 84 E2 B0 
                  E6 80 80 27 0E F8 A8 75 8C BB 00 DB 2E 00 DA ED 
                  0D 08 09 BA 84 80 EB CD F6 80 1E E8 ED E4 3C 74 
                  8B B9 00 FB AF 1E 5D E8 00 FE 33 E0 AA 24 86 E8 
                  CD BF 01 AA C5 86 80 08 40 04 92 4B BC 84 00 00 
                  83 06 BE 93 06 B4 CD CD FC AC 24 05 F9 EB C3 2D 
                  E0 2E 34 8B A9 0F 03 1B 80 C0 FC 74 E8 0B C6 DD 
                  22 C6 DE 24 00 C3 F3 21 66 A7 0C 75 8B 8B 66 A7 
                  07 EF 83 04 FF FF FF FB 1E 55 EC 40 8E 84 75 E8 
                  F4 87 74 E9 00 CC 29 4E 40 81 0A FF 64 75 E9 00 
                  69 75 E8 F4 EE 66 BF 81 0A 00 86 FE 75 E8 F4 7D 
                  CC 05 A2 EB FE 75 EB FE 75 E8 F4 65 FC 75 E8 F3 
                  5B EB 80 0C 1E 4E 40 81 0A FF 08 74 E8 F4 66 BF 
                  81 0A 00 35 FC 75 E8 F4 2B FC 75 E8 F4 21 FC 75 
                  E8 F5 17 FC 75 E8 F5 0D FC 75 E8 F5 03 EC 5D 1F 
                  1E B8 00 D8 0B E6 E4 84 74 8A E4 0A E6 E6 EB B0 
                  E6 E4 84 74 8A A8 75 E4 0A E6 80 FF 04 20 20 26 
                  00 1F 51 78 BA 03 4C EC 80 06 F6 EB 90 3E EC A8 
                  59 FF E8 D6 12 A4 72 E8 D7 08 12 72 E8 E8 E8 02 
                  AD 64 A8 C3 60 06 40 8E F6 96 80 1B 60 AB 0A 0E 
                  00 80 96 7F 20 20 BD FF 2D F6 96 40 41 60 41 E8 
                  26 00 80 96 10 0E 00 50 0E 70 A8 75 B0 E8 CB 40 
                  05 26 00 58 20 20 E8 01 26 00 BD FF E5 BF 00 7C 
                  8A E4 F9 4F 15 00 72 B0 E6 FB C9 8A 50 46 15 06 
                  00 75 E8 D6 09 B0 E6 FB A2 B0 E6 FB FC 75 80 96 
                  02 1B FC 75 80 96 01 0F FC 74 80 FA 09 0E 00 58 
                  7E E8 00 06 00 74 EB FF FF FF FF FF FF FF FF FF 
                  FF 06 00 12 D1 80 54 05 FC 75 F6 17 08 36 FC 74 
                  80 45 07 06 00 75 E8 D3 23 FC 74 84 78 EB F6 17 
                  08 0E 06 00 74 80 18 F7 03 90 58 26 00 0F E8 00 
                  ED 1F 75 FA 22 CF 80 96 FD 06 00 74 80 7F FC 74 
                  80 1D 05 26 00 58 50 1E B0 E6 58 A0 00 30 74 80 
                  4E 04 C0 07 FC 75 FE 78 A2 00 23 26 00 42 FC 74 
                  80 36 07 06 00 75 80 1D 07 06 00 75 84 78 33 0A 
                  16 74 50 61 24 E6 E8 00 02 61 08 4B EF E6 58 50 
                  B0 E6 E4 8A E4 8A B0 E6 E4 8A E4 86 53 D8 FB 01 
                  76 5B C3 A0 00 E8 24 8A 97 80 07 C4 0C 26 00 08 
                  97 E8 00 C3 51 52 75 80 97 EF 58 B0 E6 B9 FF 06 
                  00 75 E2 E8 00 F4 60 27 26 00 E8 00 17 C0 04 07 
                  26 00 08 97 E6 B9 FF 06 00 75 E2 80 97 BF 58 50 
                  A0 00 40 06 00 40 58 51 10 E4 A8 E0 59 FF FF FF 
                  C9 C9 EC EC EC ED EC EC 9F 91 8F 90 A0 55 06 56 
                  51 50 EC C0 D8 36 00 40 8E C6 40 FF 66 FE 8A 01 
                  66 80 02 1B 18 1B 08 06 15 13 0C D8 FF E3 FF 3F 
                  EB 3C 76 E8 E7 8A 02 1E 00 4E 00 5B 59 5E 07 5D 
                  E8 A2 0F 99 72 E8 00 05 4E 01 C3 06 0A C0 E4 0D 
                  04 B2 D0 3A E0 75 E8 DC 80 01 75 8B 0C 10 F7 03 
                  02 D2 80 0E 11 7E 02 32 03 83 00 FA 72 C6 01 80 
                  41 00 0E 3E 00 74 E8 DC E4 28 C0 46 26 4C BA 00 
                  E2 E2 8B E8 DD C3 11 46 A8 75 B4 81 16 00 7A E8 
                  01 74 FF 5E D1 2E 87 EF 0B 02 00 0A FC 48 E8 DC 
                  7E E8 E7 7E E8 E7 C6 E8 E7 46 7E 05 05 34 EB A0 
                  00 1B C0 08 23 40 02 2A 12 8A 01 0C 83 05 C7 75 
                  B9 00 42 E8 DB FB CC EC 05 E2 E8 E7 26 00 F7 0A 
                  C3 51 FC 10 33 8E F3 5E B9 00 00 8E F3 5E 1F A4 
                  75 E8 A3 27 C4 75 80 87 03 EC 80 13 27 74 B0 E6 
                  B9 FF 29 B0 32 F6 00 C3 04 09 2E 64 75 B0 E6 B7 
                  E8 E6 7E C0 02 7E E8 E6 C6 E8 E6 C6 E8 E6 EE E8 
                  FF 0E 4E 01 88 41 E8 FE E4 E8 DA 64 E8 DB 06 F9 
                  80 18 14 B0 EE 7E E8 E6 F3 75 E8 00 C0 80 B0 8A 
                  06 E0 06 00 1B 06 00 E0 C6 04 E8 FF 0B 70 70 7F 
                  B0 75 E8 DA C6 8A 8A 05 C4 74 D0 8A 04 E4 C1 5F 
                  47 53 04 E8 D7 FA 0F D4 8A 07 E7 0A 06 C8 E8 A2 
                  7F E8 E5 E8 00 33 DB 8A 09 46 3C 74 3C 75 53 43 
                  5B 14 FC 75 B0 3A 73 86 0B 74 E8 D7 35 A8 B4 C3 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E 80 
                  3E 80 20 20 01 CD 1F CF 08 50 B9 00 03 42 E8 E5 
                  F8 42 C3 B8 90 15 0B 06 00 74 32 EB BB 00 09 33 
                  F6 3E 80 0D F0 E2 4B EC 51 B4 80 3E 7F E4 2A 2A 
                  2A 2A 2A 2A 02 02 1B 54 0F E9 99 E6 C5 E6 03 E4 
                  E8 E4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FC 72 80 BF 33 14 8B BE 00 DE 16 00 E2 
                  BE B8 FA 75 BE B0 16 00 C6 C4 F0 C4 E6 00 E6 FF 
                  C6 E9 A7 06 55 56 51 50 B4 FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 
                  00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 
                  00 00 38 2D 1F 19 02 06 00 00 71 5A 19 19 02 0B 
                  00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 
                  00 00 00 00 00 00 00 00 55 06 53 52 57 E0 84 E8 
                  01 00 B8 E0 D8 55 3B 00 75 32 8A 02 C1 09 00 E8 
                  01 49 D9 EC 8B 8C 8E 8B 33 B9 00 AA F5 7C 26 45 
                  0E C7 FF 26 45 9A 7C 26 45 FE C7 FF 26 45 92 87 
                  CB E9 15 C4 B0 E6 B0 E6 B8 C0 D8 55 3B 00 75 E8 
                  00 36 ED 0E 00 E1 B8 FF D8 26 C3 C1 20 C3 81 F0 
                  B8 FF C3 C1 10 00 E8 00 08 E9 A2 E8 00 09 E8 00 
                  E9 5F 5A 5B 07 5D 1E F5 B8 00 C0 C8 D8 40 26 05 
                  24 83 02 8B A3 71 EB 81 00 26 1D 7C 26 05 28 83 
                  02 8B A3 71 89 BF 01 8B A3 71 C7 26 05 2E 26 1D 
                  E3 84 32 8A 02 C1 09 E3 03 C3 FB 74 4B C3 0F E3 
                  F0 EB B8 00 C3 00 8E BF FF 8B 26 05 E8 00 F6 00 
                  8E 8B 32 8A 02 C1 08 A5 50 52 D2 02 E2 84 5A 58 
                  1E 56 51 00 8E 32 26 0E 00 E1 83 16 F9 C9 D9 2E 
                  B9 00 A7 5F 07 C3 B3 66 55 9C 33 BD F2 9A 9D 5D 
                  58 32 C3 B3 EB 53 FF DF 25 B4 74 24 B4 3C 74 B4 
                  A8 75 B4 8A 32 C3 FA FE B0 E6 FB C3 E8 F8 AD 64 
                  64 01 04 60 F6 E2 B0 E6 E8 F8 B9 27 64 01 FA 74 
                  E4 50 E8 F8 AE 64 E8 00 02 CF FB FF 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 
                  00 04 00 08 00 10 00 20 00 40 00 80 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 
                  04 00 08 00 10 00 20 00 40 00 80 00 00 00 FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE 
                  FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FF 
                  FD FF FB FF F7 FF EF FF DF FF BF FF 7F FF FF FF 
                  B0 E6 BE FF 8B 2E 04 0F 03 F0 B0 E6 2E 01 7E 0F 
                  00 01 0F 00 AC 28 B8 00 D8 61 E0 08 61 00 86 E6 
                  80 C0 FC 74 E9 01 0E 00 B8 00 C0 00 33 66 26 FC 
                  00 33 66 AA AA 66 AB 8B B8 00 D8 F6 00 66 66 C3 
                  03 95 49 02 F1 00 33 66 B6 B6 66 AB 8B B8 00 D8 
                  F6 00 66 66 C3 6E 74 EB B9 20 FF B8 55 55 F3 66 
                  D8 38 8E 33 B9 20 AD 3B 75 49 02 F4 30 8E BB F3 
                  04 BA 00 FF 6D E9 01 7C BD F5 17 33 BA 00 81 E9 
                  F2 16 7C BD F5 7F 72 81 FC 74 BB F3 C6 01 80 9B 
                  B8 00 C0 80 02 BF 40 8E B8 00 78 BA 00 FF C1 E9 
                  00 7C BD F5 C3 B8 00 C1 C0 80 02 40 C1 04 BA 00 
                  FF E7 E9 F2 B0 7C BD F5 19 72 B8 00 FC BA 00 FF 
                  05 E9 00 7C BD F6 7F B8 00 C1 C0 80 02 BF C1 04 
                  BA 00 FF 2B E9 F1 0B 7C BD F6 D5 73 E9 FF 08 8E 
                  80 02 BF 06 00 E4 3C 75 80 02 40 10 8E 8E 0F 00 
                  25 FF 7F 22 EA F6 F0 0F 1E 07 80 00 0B D2 13 BB 
                  B6 C1 B0 E6 32 E6 C3 F3 21 66 A5 75 8B 8B 66 A5 
                  E5 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 
                  61 F3 61 BB 00 00 33 66 C5 1F F6 F4 00 8A 9E D1 
                  9F F4 AD 33 E1 75 E4 A8 66 00 00 75 66 7A 1F C0 
                  C6 00 E4 0C E6 24 E6 58 0B 75 E8 8F E0 E4 33 B1 
                  D0 73 46 F9 F6 C0 11 EE B9 00 FF 07 C1 08 E2 8A 
                  8B 1F C3 1E A8 A0 75 84 40 8E 89 67 8C 69 B9 00 
                  76 84 E8 89 74 80 01 90 B0 E6 51 DB 0B 74 80 02 
                  01 8A E6 B4 0A 74 B4 B0 E6 50 60 20 64 92 E4 A8 
                  74 E4 8A 80 04 E8 F4 B0 E6 50 78 58 C4 60 B0 E8 
                  BD 6A B0 E6 F4 FD 79 84 EB 90 7A 84 B8 00 D8 16 
                  00 26 00 03 29 E4 8A F6 02 0D 00 BB B6 1A E8 CF 
                  F6 01 0D 00 BB B6 1A E8 CF B0 E6 0F 0F 1F C3 00 
                  CF F8 00 86 00 FF FF FF FF FF FF FF FF FF FF FF 
                  FF 1E 40 8E A1 00 CF 32 CF 2A 2A 2A 2A FC 76 80 
                  C0 17 FC 73 57 F8 E7 7F EF 2E 95 F8 07 57 00 EB 
                  5F 02 C2 C4 C6 59 D9 C8 8E D3 9D AC BE BE BE BE 
                  BE BE CA CC 88 80 4F 04 CA 00 B4 F9 02 FB E4 5F 
                  EB EB EB EB EB EB 5F 32 CF 00 11 08 04 01 FF 11 
                  70 02 01 FF BA BA D9 D9 FA FA F7 F7 F7 00 FA 00 
                  E0 00 C8 00 84 00 85 02 FA F0 0F F0 40 8E E4 A8 
                  75 8E B0 E6 B0 E6 B9 FF 64 01 05 F8 3D B0 E6 E4 
                  B0 E6 B0 E6 B8 E0 D8 DB 3F 55 08 76 2E 2E F8 05 
                  84 00 8E 33 81 AA 75 BD F9 FF 01 B0 E6 B8 00 D8 
                  00 EB B0 E6 B0 E6 EB EB E4 8B B0 E6 EB EB B0 E6 
                  80 09 03 94 B0 E6 80 0A 03 57 32 E6 B8 F0 D8 D2 
                  D1 B9 00 8A AC E2 BA 00 08 B0 EE 0A 74 B0 EE F3 
                  FA 74 BA 00 E6 00 20 A0 09 84 FB 76 B3 32 D0 2E 
                  B7 F8 40 8E FF B0 E6 B8 00 D8 2E 00 0B 84 20 20 
                  E9 0C 84 61 F3 61 0E 70 19 FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF 00 00 00 00 7E A5 BD 81 7E 
                  DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 
                  38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 
                  99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 
                  7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 
                  7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 
                  00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 
                  0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 
                  3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 
                  6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 
                  38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 
                  3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 
                  00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 
                  0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 
                  C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 
                  30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 
                  18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 
                  66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 
                  68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 
                  0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 
                  F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 
                  66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC 
                  CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 
                  8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 
                  6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 
                  60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 
                  60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 
                  0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 
                  F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 
                  DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 
                  CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 
                  FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 
                  00 00 00 00 38 C6 FE FB 8A 32 81 07 77 D1 2E A7 
                  FE E4 CF 9C 9C 9C 9D 9D 9D 9D 9D 80 3F F0 1C 20 
                  20 58 CF 50 B8 00 D8 06 00 04 06 00 3E 00 75 B8 
                  00 06 00 0A 6C A3 00 A2 00 40 3C 75 F6 3F 07 18 
                  86 80 12 40 0E 3F 86 92 4B A0 67 4A 0E 00 9E 0C 
                  F2 EE 06 00 74 E4 A8 75 A8 75 0C E6 B0 E6 E9 FF 
                  FF FF DA FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF 60 33 B4 CD F6 80 
                  52 40 8E B0 86 00 3C 74 FB FB B4 CD 8A 51 03 10 
                  52 D2 02 10 08 10 EA 72 FE 3A 72 E8 8D 0C D2 C6 
                  FE 72 E8 8D C9 B4 CD FA 0E 01 61 FF 00 00 00 03 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 37 
                  B6 BE 47 4A 30 43 4D 41 EA F9 F0 30 2F 38 38 FC 
                  
                • 1988-01-28.json
                  {"data":[
                  -13436026,-1752439855,1451819088,1611565826,72255744,18119,246465280,-1964227858,263211744,-1007926546,105993040,-1912584008,-1258114624,-402542583,-2147155945,8168192,
                  -38465359,149422512,8299264,1482381575,1431458755,-980627318,4984456,12305806,130491904,-953810944,-64953,-1960379140,-50529249,-75236100,113649152,1946157056,
                  5021704,350994730,1278097552,422912,-352302058,5021895,-1057046230,-524164046,1532648710,1381061571,180049750,375040,855640255,-2131494958,129380546,9672073,
                  -270381233,9682684,-1191182145,-1510801397,9682684,-1182793537,-1510801397,1499094623,1364443995,-396994734,146210840,12087475,-1094676964,-1984692224,-469101107,1499094878,
                  509657947,469809158,-1064380274,-1077922820,79233024,-1096027392,12058632,1096476,386039,13795328,-2013117303,1153827924,80187909,280887391,-268388352,-150990661,
                  -132053533,-1996434816,1418199620,88393220,117753746,3194368,-1699493748,-1107268376,12058648,-393039076,549322849,4241408,1458082483,2670080,-1833709428,-1107276568,
                  12058688,-393038928,1220411457,536918016,921211571,5291520,-1279262536,2877586,5506758,1460061888,1488879616,-268388352,384340659,-1899459584,-132006184,-1191138881,
                  -784269305,128316393,-943496929,-1962934524,81838588,-1996165184,2089288260,89950212,410823,-1336884480,861464718,57983144,-1340085255,860678294,-1783570294,-1556920856,
                  -1733296010,-1976353304,-392711968,2023961398,-1017579520,-393301936,-527813846,168873088,-2147256887,-1901006876,1479745256,-739748157,585653060,47616,-1179212101,82313233,
                  -396967099,-396671810,12189709,-1229473024,-402646599,-1581038353,-1071382432,57950268,-1107262231,-75450618,-2139917058,1853161467,1786043146,-997584713,54264612,37513588,
                  1085735540,1450368826,-2135485506,-997584697,-390067164,1946369026,1946303566,818380803,980606778,-2135482946,-997584697,-390057948,1946369028,1946303538,818380803,510844730,
                  -2135480386,-997584697,-390021084,1946369030,1946303510,818380805,-549845900,-1944188557,-388460856,-1021354084,-1899459554,-2147434792,12182578,-536695680,242547682,-1152384838,
                  263829338,1144907776,-1021313301,120588080,120588080,119539504,121767755,122619680,646580043,1720189001,1008648961,106788611,-1274577270,10741763,39226194,-1696070988,
                  72256256,1988835043,273058572,-1392715634,-2147066229,1979777150,1946631187,1946696719,1946827787,1947024391,-1817406717,-1202708911,-661782464,1960024,-740140769,2122975066,
                  4650503,-1274710783,5236738,1227262495,23496704,1946631363,1946696763,1946827831,1947024435,112943,786958772,-402410496,-1023541207,4855354,-768469899,-25114882,
                  -32803559,-1274367794,1042446,45404722,-1023407896,48762548,1358490368,12256851,-1144812032,-930348990,117913894,57956443,-1664937779,1819142158,-65073469,-2065260368,
                  -1341918534,-1582240256,1690010854,1109977088,-1326576464,-1148918110,468189284,-2069905854,-402651969,1416759655,-222683984,-1548685821,-315390746,1913214696,32815939,-398329368,
                  946997579,-402627399,812803322,745863649,-334673944,58048680,-2127303700,1946157557,1970289685,1692198929,770183794,-1564546035,245636,-1515143445,82543846,-2065259344,
                  -1179111493,12189728,1119479808,-1498413845,568624358,568770340,-756678480,63165670,459487,5289992,-958886370,-16777210,-1928935649,-973078528,-100627450,-5121229,
                  -13373259,1276020742,4765696,-953761650,637534213,-16628281,654114047,-50592373,201129212,92874432,-1040317324,-1014821909,1959606848,-339083772,-2132049460,-1995934208,
                  -2013229794,117476366,-939608893,-2147450362,-1895381504,113704704,-1124007790,317194368,-2134539946,1958742784,1714325522,1729530112,1762560000,1678672128,-1023393536,-2065268816,
                  5244615,113770495,82,5506758,1426507279,113676800,-973078442,22278,4720327,113770495,74,4982470,1292289791,113742336,78,1354243590,
                  -1193767424,-1064435640,-13371853,-62914375,-1146752154,1066139616,-1946164549,113712951,-65456,5375687,113639424,-960495532,-1845471994,5637830,1460061696,512458752,
                  -1205993331,-661782448,206594532,-1604196856,113639424,620691456,1166550768,1642485761,268813862,1894166960,-527797788,1894166704,356836,1065400580,-1053045973,-617414030,
                  637985729,637689225,-1258005111,-1043778818,-1993997087,-24443315,-2010716020,1166550565,2147465473,847249598,-1406731036,-85794814,-989932298,-970684378,-67108858,-389871841,
                  1621295257,-1144485120,-1040842112,-1156877280,-1040842240,-1157401584,12058880,-18614524,-1877571382,616663552,1950366912,67156767,1967178230,134265611,1971372534,671136515,
                  -150732616,-1999962397,-1023373034,11795850,-1979710279,49266887,37487396,-1015020171,1007151873,-2147126015,-404618045,5290014,44095630,183510016,172739,-1545326049,
                  -620101534,28508789,12123954,-1142687996,-470350848,378063614,-943521647,-16756730,1376176127,-973078528,-1073720314,5572294,1443284626,113639424,511705175,5290067,
                  1642387598,135061642,-2065276442,7819,1734,-58398977,-50529028,-50529028,-50529028,-2030240516,-1956518176,-1021355069,0,0,65535,-2147446080,
                  65535,37376,65535,39439,65535,-1073704448,65535,39679,65535,37631,65535,37390,65535,37629,120586311,4653071,
                  16713520,65535,-2018902016,-2013790184,-2010644456,254672920,125310465,218112015,571408385,788475392,146311050,-1329558016,495461935,-50559770,-50529028,-50529028,
                  -50529028,280558844,264277504,627441696,2147483646,-369090033,-268400676,503385902,-436271228,369168174,537855864,68864,771760655,-2020724993,-1912600392,-1973295936,
                  -435680032,650414689,-970580598,-16777210,-1293196826,369168174,537888632,68864,771760655,-2020462849,-1912594248,-423579432,-18076,-1469782790,-502959102,9497080,
                  -452984903,1963042916,-369565179,1625555074,2088044712,444262,192,1711336376,-339476319,2450944,1962934400,1711336205,-1073740089,369098752,15406827,444262,
                  192,1711336278,-1073740089,-1744830464,-949616405,12582918,-345767936,113731072,49152,15441920,444262,192,1711336240,-1073740089,67043328,1894167472,
                  -528059932,1894167472,537707654,317420006,1894167472,-528059932,1894167472,-551238522,280523238,-371683840,1409023708,508973649,-1912586053,65176027,-1963816192,-788498276,
                  143952870,1959922432,-461090697,-855766156,-855750284,-346530956,-347935129,-335484160,679016484,-1862354864,1477823992,616108402,140962036,2029528300,-17374701,-336628277,
                  -335484160,75036708,770375948,472181826,15401228,619577579,1108339484,-351752126,96202240,1020323840,15401996,1257111787,15417930,619446507,-1974979336,-410363656,
                  1499094559,1043255131,912614438,-1381651712,1869459367,864689408,-1853193334,-460663158,1368062602,1357679445,503730771,551947184,547889380,-315468427,-661731188,-1962522994,
                  -1977220002,-218529777,-109050508,1124627955,-1258139905,-1947473151,-2034303786,3976329,-1053161100,-1958480011,-1093145614,-561280627,1946172588,1975597590,138841079,721740928,
                  -422490381,-1785397458,520809353,1482381831,-1142335139,1510416145,1499289691,-2131588145,57999869,-2147332353,74711292,48975695,-1950136505,1979137010,33390624,1325336181,
                  38731522,1946221696,1313820424,-347189682,1179076401,-347716026,-97495,-58716811,1308914688,1176234830,-2145916090,57999869,-2147332353,108265724,1313754959,1195836651,
                  -1950136762,16548082,1313735796,1178993387,1005751235,-2146077193,141820156,1330597711,837504590,1195853639,703284806,1979711107,16547857,1313736308,434851663,1195853382,
                  -41937941,-16550655,-58719674,1325691904,1191373647,-225721529,1946221696,-347123964,-1018738942,-41880949,-16550655,-58719666,1325691904,1191373647,-225721529,1946221696,
                  -347189756,-1018804734,1243515645,39226112,74634042,-889269366,1946273014,717915916,-154064139,-337971490,720710148,-20513071,41281730,1048584564,1912733769,1228832808,
                  326566656,378229328,-1031602077,6660100,1525610276,-2146505896,67127614,1048577906,1963393097,736856956,-1736214,-1947873024,-154825992,65876707,65065409,-1761587706,
                  -561068404,-470355829,16828151,-654900108,-523117065,177653507,974419136,705721286,-204829968,66388901,1976499965,-1963947276,-1977569049,61600714,1976499965,4241654,
                  -454502258,-2145815551,33573182,1048580722,1996685385,1662421771,79856384,-301963872,1228832963,74712576,-489627184,1375752381,-980748149,-1164382926,-487128768,100909315,
                  -1953038258,1085970672,-136120575,1946222790,-136775920,-255360547,1228832800,24380928,-1933114553,-1764061502,-544517286,812957706,745784890,-800002006,-1947807514,-1947169850,
                  -204829957,-1947169884,16155131,16220448,-204830176,63243172,1976499933,-259368736,-422517040,-1950053800,-204829957,-2114221142,-1977614089,61535178,1976499933,1713292266,
                  -1201214157,1,-1178258586,-13418496,-791583074,-102585498,202138084,-215719450,-1150918170,1,1725772646,520537483,12187187,-781803968,1185718227,-1020115386,
                  594932705,-1062706716,460652720,1721633201,-2092510253,-630061826,1713353118,1721750483,530545229,-960249805,-464519164,-435418015,-420273055,-695510687,-389809889,-1977221070,
                  584578565,-1998007609,-389873594,580386850,-790572349,638286332,646579504,1720189001,572965633,-1429796291,4793994,-1023318392,1452015411,1944768770,536919811,-489561391,
                  -489561391,-489555453,-100408623,1048641207,1929773129,-791555836,-153122073,-774796333,-773139990,-2133723414,-942536735,-1329333757,321549,179312242,-2066599086,-1342016064,
                  -855591904,29685271,1526268276,-812953661,6601041,1952165352,1509548550,-402002951,-290716680,-118889895,-2029586749,-3996672,9318890,508973296,-1912586056,243928,
                  524677608,-1949345698,281248747,-1949069574,-1178497311,-888994784,1236914574,12581888,-1897218557,-1583010061,104530512,57999960,1023606946,175440215,-1207950145,-1934890617,
                  1824500680,-1917470720,-1412920149,-1409330248,-1901344628,113518277,-1868365806,-1845064704,-594609408,50446163,-1274837574,-350106353,-1899416817,1377733593,1977320706,1501620618,
                  779403274,-1274871110,-1205744375,567086081,1962950016,-16398835,108334396,567089588,1596211460,-596491972,604199330,59089423,-919358485,61214345,61345417,-1828272319,
                  855769091,-611442990,567089844,59095583,567093172,-1948545506,-1962929130,520094734,-1169077934,666108805,37495245,-1860537000,-1960916949,-524123693,869961231,-853887790,
                  -2051399903,-853036029,-854543327,4030497,985271412,-855002109,201898017,-980540979,-2135237234,-853888000,52001,1850280461,1953654131,1297040160,542196048,1143821133,
                  1679840079,1701540713,224752756,1953383690,1679848037,1702259058,1701868320,1768319331,606106213,168626701,1852400978,1953654131,1936286752,1953785195,1852383333,1769104416,
                  1092642166,543582496,1701012846,1918989171,1393167737,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,2361869,1230192962,538984771,4544581,-1471873304,
                  -401247231,663355914,-398129688,-1070384696,-335284294,192184488,1317078708,-2013265642,-1023393498,-1471883544,839152897,-396301340,1534394314,-167650840,259264519,-58710134,
                  -2147256937,-327154748,-401478893,-2018229193,141820732,71042996,1639187060,-1343740024,975169604,1342523018,33900230,-966873624,-402651834,-2007474522,112461126,-335284294,
                  41189544,646480052,1317077057,-1023409898,-1880555725,-167283457,1148551364,-466421621,1006651018,-1274449403,374243585,820707329,578076682,20747188,1957957748,292815420,
                  54269364,-1749808268,28313579,-347858456,-402542587,937968639,-400062463,-947174350,19720387,669525898,281343556,31982453,468239104,-2012771839,1996423751,88508928,
                  897001276,1967353064,1131669522,425600,-390069387,1007625220,-400657661,-269993627,-2006862848,1139337255,1187382960,1187382273,-397410048,1951947834,961013872,-1275014680,
                  -400062462,112214986,67192518,16795334,1545398352,-397118376,-1276626647,-2004372480,1135405095,1187382448,1187382273,-397410048,1951947774,957081679,-1275030040,-400062367,
                  112214926,67192518,16795334,1541466192,-2127268776,71246,-1979681304,663224935,-1975292440,-352304858,-400757972,393560773,-2143105816,1962935934,82362371,71044900,
                  129238389,-402396032,-998227189,4253715,1005070216,38258243,4624128,1996472370,851680534,107383488,1912798336,-2130594807,71246,11803115,167777768,-1273990137,
                  1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,-1017602752,-1342048582,-152506720,-230823885,-2065258320,
                  66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,-969403160,-973076922,-402651322,1187381401,-1830289146,
                  88524288,1553262592,-2065256528,-1341918534,645983756,-2081423297,-1280307772,602464394,-2030558173,-399265568,-1070390497,-930359157,9444874,-973208972,9518602,-973208972,
                  208989450,-440349186,30244870,1060360,1104734458,963985576,-1975410456,82362592,168813696,-2045807397,9955548,-393017227,494141585,-1280307477,-941039478,-2046555102,
                  583395524,-1975409176,550273248,-1192718672,-3933406,128976246,-1270755864,1106307219,-956371480,1187381255,-269996027,88524379,1541990408,199754935,108956226,-1186855448,
                  -85415829,-503024330,-399250439,-1460863284,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-348034328,-1332497401,1098180609,-1996580376,1100277799,-1879506453,
                  1019413830,1007318016,-1341885183,-1341985901,-1008715257,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,225603442,1885696522,1701011820,1684955424,
                  1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,1667584544,543453807,1869771333,604638578,
                  -1191181637,-2135884312,1910796518,175505212,1951134946,-35079931,-436212501,-1,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
                  -1511456186,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381863,-1156341569,-611450752,1711284239,4389,101616512,-511613440,15,1723927398,
                  -1070373205,1711282337,1745323,650029926,571648,-492083539,-266268677,554675046,1722509048,379699251,-1096063488,1722613788,1726516395,1725992107,309675,-492083539,
                  6340347,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322778,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,5160619,
                  -1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322772,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,12084907,1711313408,
                  -1070373205,-524162932,-1196726780,-1419313153,47206,-1419378542,-1933560986,81838560,-4674714,-1096063233,862322760,38046656,-1956205722,-14326268,1711341567,-1070373205,
                  1711555723,4374187,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322748,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,
                  3587755,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-391420412,862346121,329302015,1528760079,-815966106,-1633050967,-1752459381,-1751345268,192349500,
                  -259267534,-13703471,-1013485404,8857216,1977289455,-2029092859,-1007153152,1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,
                  1525547109,-1500331016,-1396003714,-792428544,-1962301510,-1033008376,-1738237777,-1928615972,-781808389,-2094880769,-2094890206,-1753447638,1532582488,526212958,-12537,-1,
                  -1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1962230504,1228832816,175244288,4800128,-352095225,-1360490369,1662421802,
                  113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202334337,-389808926,779416823,4800128,-2146995708,117459262,
                  -477481358,-1960155928,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,921232266,-1012141270,-1976937752,1049232990,
                  -896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
                  41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
                  -2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
                  -1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,263829338,760342528,1085805547,515935744,62445710,
                  -326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
                  486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715724,751691776,-1168046305,-661913472,
                  516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
                  40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,-1933881344,1358264,523001576,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
                  1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
                  1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
                  959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
                  -1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,602495108,-148571571,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
                  12189491,-1951665376,55020055,-1703954,-1,-1,-1,-369098753,-65398,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
                  116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427691893,-390004721,140413700,-268377215,-661732597,
                  -1409281863,-131800950,91543612,233567714,-14308208,140935431,1175058432,1725537032,281314048,1532909855,-816314531,-436096944,-434720635,-434065276,181229728,-1202708785,
                  -661782464,-88067496,7341702,7212683,7083659,-1461116933,-1202708895,-661782464,1846446586,1813416192,1879492096,1492844544,1636690207,-1342170904,407431168,45150346,
                  -1978121752,-402345784,-393603014,-1335790871,803797514,1954588696,-202638589,-1054525,-427163472,-1340595480,-387872254,78649371,350807434,-401887208,34347018,-31130844,
                  41210500,-527826676,-51901520,1630660887,-1325417240,401401863,145805450,-1978145304,-402018064,-930474018,-672648528,-370636265,-1696046833,440575,-1340616984,-387806713,
                  145758151,-1058478454,-1979076585,398059745,-1343747152,604113943,-1327461637,397010955,-443927888,-384326936,-1325768489,395634699,141828264,-1070375941,183033,-2081944912,
                  1971365911,-1979600649,394127590,-511048784,-1340639512,-387610107,-1578887313,-1578697180,1609042864,-1977611241,-401887008,-1863772325,196147808,605507048,-1327461665,390719499,
                  -1973387543,-198919709,1976009964,-209000436,-855705886,-2135625867,-1023363901,-20987853,92874255,-101058055,87631609,-101058055,246465529,199817884,65539607,-1878856960,
                  1975560399,-1325753326,385411117,256014,-812645653,868417828,-1901018176,-471270756,65539606,-1878856960,1975560399,-1325753326,382789805,256014,-812645653,868417828,
                  519816128,-1912586056,279013080,-14326272,1711276287,-432820144,-1468930960,1951950368,878086,520159232,-7935805,1048602740,1946288201,1228832777,41157376,-13412117,
                  1958725518,4622848,158597180,1182073148,-336534344,-257640445,1946499878,-1409614791,-72628084,-1979685472,-1962908122,-1191156970,-1595408372,32815880,-2094580248,1704985794,
                  263515648,-1260071704,-456136701,-890764620,-402541340,-54270779,-464474778,1480632417,-293395084,76113412,1220038686,-455569920,216042081,-1973295608,-973078506,-16777210,
                  1642513542,-872865960,2122381191,393543686,1966383336,-432820201,-1468930960,604533764,204961276,-399250684,779302043,1949611240,-1608204741,-1472919832,-1102023679,266903593,
                  -1975547150,115835103,1946484608,-1607221698,1958798208,-1607549386,616444395,-33246048,-30903092,-2094762808,-202701370,149191,71747328,1187381248,1187446791,-956301300,
                  2630,1966353640,-397808836,-596495256,772558476,-1996270453,-617412010,1966347496,874637322,-1976695438,-1979764196,-1976696226,1854407276,1284124165,72255489,17254086,
                  1966350568,-242685937,1962950528,-386431225,-142085503,-2009849880,-1070397866,-32086399,-1007187969,-81327871,1326383648,151200021,69280335,557600530,-843122809,72780704,
                  1966321896,868083759,20719218,-964486540,1946303494,214336266,208929596,772195971,1946244155,113672981,22297390,904596596,678690876,22297390,333985397,4161777,
                  -142145675,-2014180120,1418342135,-251598845,1317803912,1418407436,173443332,18245249,-339725568,374243604,213123073,451657778,18239105,839693312,-254482240,1962950528,
                  1358399241,1492241640,-142084217,654901699,35715987,141829897,1326383649,52499733,580341513,1325990689,69283735,1008160530,-223,-1,-536870913,151135490,
                  -162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
                  1711217426,1325928438,547588864,950348288,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
                  -336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,329050123,-1974452212,-401887008,-78113897,196147907,605260264,-527806273,
                  -2065167440,-1006938093,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
                  -338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
                  -153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
                  1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
                  -109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
                  637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515310,
                  -388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
                  251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
                  1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1212868858,-776988299,1105749222,-1341098680,-396302625,125126712,1692860336,-1018679320,
                  1642332852,393494696,-397390258,41156918,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
                  1763086040,1730579200,2942976,1894121648,-2040461537,-2038373180,-326412860,209052682,-33134975,105808383,183173184,-1090099583,105808383,-815988735,1967633384,-422465509,
                  1202382948,-575663499,-1578606362,-1341557433,-396040449,74729368,-2132409424,-1335926845,278980657,816898186,-820995608,-396402693,108330798,-889585740,1408958466,641227917,
                  -63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,
                  -419450719,140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,
                  183032,-1207558573,-661782520,-2147479365,1971324543,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717195,-1207702784,
                  -617414404,-1017438457,-1064384372,870774203,-1543453760,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1588592640,807731216,1479556096,121378676,512431474,-478150640,82559024,-1976631502,-341294457,-1576554494,1235222601,-1342129408,
                  1006875834,-1157204985,-725960704,-1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1549266297,-472842166,445090606,5022632,-1976636463,-2136462681,
                  1705000932,180364288,6660804,849840686,1713801384,1095936,7989254,174885414,189565478,603998624,1963080958,2088773141,242552073,1206437258,-1964471808,4253889,
                  -1995978614,-1610588146,121372745,71042932,1929380024,119584771,12189491,514585376,5291783,146391091,-156503296,268470022,-189069708,515958785,-2097125984,-1007811390,
                  2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,983534126,1458766760,-374885699,1593570347,-1064380276,119849759,-1744805214,
                  653742672,1319305292,-779003392,-401820439,-782367449,1351388134,84470016,167798432,-2146863617,-534503453,200000266,-472775247,606135168,-1564276001,-1031602074,-1597772283,
                  1183318089,4890624,-1610529144,1183318114,673760007,673730640,134238288,268437504,1073745920,1073758208,673988608,774514989,808462622,808464432,12351,538972176,
                  16986144,466618115,-490529840,466623440,-1784610988,-22733872,466676103,466623440,-279475805,-261809200,-129894323,-415634343,-399574951,-406786094,-26286350,-11272365,
                  -272109404,1251409920,466623519,466623440,466623528,466623440,49808376,58196924,336855672,16847892,1966337,816840766,1085834470,-1950315008,1509954334,-1070338765,
                  857735358,-1178235137,-1410105344,268486017,-277680581,4241490,512344206,-1070399469,-2134916978,5290240,-1765881716,-1415237976,-1070335774,-2134916978,571649,-1426063176,
                  -1325604181,864347697,-1094676800,-1061181306,571649,-1523660660,-1325669717,-1098586574,12560454,2144512,-1523660660,1476125355,855670463,92874432,-432820129,4241540,
                  12245134,1015079954,-1979550412,1914079696,-432754688,-1181698940,-617414626,-997535181,-1978932760,-19266608,-1326193980,198502575,-1364143990,-1978937880,1960000496,-393301998,
                  1074531266,-1901010806,-1341407512,-1333467595,-1148918218,-661913600,951107726,-1732344602,49064,771752633,1111659181,1962884332,46628871,-1416476086,967896546,-1665235738,
                  573352,771752889,-152268115,-527765808,1975794412,1086816261,-337466478,-2065286480,-1079467330,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,408545412,
                  8851072,-393301996,1084754746,-1380970379,-1475661336,-2146995195,-83851482,2008748523,1200500410,-202053626,645924212,-956628857,402686982,199791792,-1976556533,-1340190496,
                  -393943470,1478488125,-58716300,-402426880,1404043573,1055425766,1085850608,-388461056,158475740,91555132,8857216,-15365,60746239,-2065280848,-1912586056,-430853928,
                  -393301884,-1062729026,-4979340,-1332737301,179366036,-527814620,1387273808,-488078106,1951932399,-1869561072,-622328972,-430723072,-270276476,1342578371,1962123240,-1900006644,
                  7651264,-469383386,270958832,243322624,-1271922672,-855134208,270958608,243322624,-1272971248,-855396352,11200528,-1340143784,-1115363756,954837753,1346380801,1476403432,
                  -789177229,-1336917980,1485104725,1929384168,-430526451,479455364,-400787736,-1161618317,-628376969,168805251,-2025818688,-1258180397,284983312,61870196,-58711883,-402164704,
                  61866053,645931189,147783696,1342181422,1200500307,-221976570,41179227,-1336884231,1485104727,281870516,1405337651,1949367424,1304579,1052288,-1909564624,-1679292857,
                  1946661106,-1329333799,163113102,-527818740,-1259827536,1487979273,521045222,-1329956933,-1903892903,1944585799,-352094990,1521520751,28345574,62406529,28312181,-1326573685,
                  864347739,-1946209326,-947188401,41665586,-1036861186,871621290,223316991,-1003305077,-1057095045,-508640718,-2147125773,-713687054,-2065277776,-1409565284,871366633,39291593,
                  -186118476,343186688,-2065277520,139955027,1334495539,174033676,1528507112,-2065277264,-2129673341,1941607931,-9180925,-2065277008,-423579453,-18076,44590308,-119405452,
                  -4650005,-1469782785,-502237951,-1206862856,-1124065863,-1628853159,-453055717,-1704096,-1,-1,-1,-1,-1,-1,-1909331201,243920896,
                  1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
                  -773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
                  -301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,5814302,2025576590,
                  32553715,855642296,-1387282945,-464961815,-435418015,-420273055,32553569,855642296,-1385710081,1933223145,-396929525,1583302963,1273699186,1084776932,47206,259325952,
                  -201524351,-54852236,867625971,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,854071669,-2132769063,-164425756,-590347087,-498727565,854995961,1712843712,
                  644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1368195073,-1364808040,-1339183193,-1297895330,-1331907933,-1364807454,-1320570969,
                  -1297895055,-1321487709,-1297894887,-1304120669,-92229008,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1726535822,-2127631612,
                  -124314,1724033,872217346,-992440640,-167705546,74711490,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,273058368,
                  -2143510748,-2126769806,367529335,49211415,95683955,-1023026456,-2013236064,646452294,1720189044,-622279915,-397184507,548406503,138737190,201487552,360611841,202470666,
                  -1977200638,-1073084604,78643829,1476413064,-402634590,-1030879985,2142697611,169180800,-1005975948,-956431755,-2011929078,74711398,74901050,1256917428,-402275608,1114768850,
                  1912856040,-386364867,309528068,1947335808,147322378,300428404,-400037115,753403219,-400592379,2122319108,91556373,1912931560,21954065,1190643061,1962934554,86566920,
                  753402859,707445509,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
                  707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,-402416407,2104624345,-1341921560,1156982320,41205768,2122318092,292883221,
                  642777612,168248458,-1342016064,4622340,4760152,-1241248024,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,80078900,-1962677528,-386888742,
                  -85457845,360611843,-402295541,426902526,1912913384,46721044,-236449934,-32869884,-613088946,-352042520,71690243,72607939,1625827442,641773571,-1073199882,17564276,
                  -402634590,-2014837641,-401640956,175243922,1912912872,68216837,350749675,585679620,-399150588,-1977220305,1134693956,1208403456,1223184384,64350212,1760042610,-1948611837,
                  58452208,1912883688,39118863,2112359026,-402296316,65733586,-1023158552,-1575729527,-1974271884,-478146466,-2114223969,-1995606437,1183388230,-402148336,636158903,1208257318,
                  67059016,-4717706,-1059027453,170264288,1183387204,1686775314,-1597178366,1183383669,-1628912880,-1974439421,-1977216930,-805436804,-157233280,57934275,638635904,638475402,
                  -1056619381,503710440,4374279,-1430025558,-1968569936,-1968526652,96905927,-1662515311,61663235,-1209528462,-401968639,91358176,-352111128,-402148347,-389872841,91358021,
                  -352115224,53078019,53995715,1156063090,1208403458,1692954624,57993219,2145914738,-401968639,91358120,-352125464,50456579,51374275,-58718093,-385649407,857604247,
                  -992440640,520160310,-972944664,17670,4589254,1193705472,1139335168,-1163874303,-387055114,-1461189759,58452223,7683712,-2145947134,268453646,-1342102040,32946864,
                  56879342,-385905944,1719731037,-956301798,-402647738,997331855,-1900006626,70698200,-2135744767,1929315304,3532842,1048585586,1929511029,552335363,-1900006626,406242520,
                  -2118967551,1929307112,1192132618,283643904,-1274711296,39446533,40364227,1961369458,1208403457,-1796730880,44361730,-1343746190,-401968640,91357912,-352178712,36825091,
                  -1022081400,1912749288,21620771,4720326,40495248,1912764904,8710163,333975154,-1981533695,20714566,548668788,-1023278360,7675530,-1014969346,274606720,1183386483,
                  306612500,-351254903,340182809,-1977220352,-165281212,-1960440220,-470332644,-1995422071,-960294314,-1275063226,359041025,7612040,18501249,669565696,-1977519616,19140678,
                  201646272,32946848,1370350,547884658,-860617612,1084753643,-1431042699,-1023307032,2145931603,1979661312,-339442172,441111,-1460394823,-401705856,1743314592,1274339840,
                  -2135626123,-1017423367,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
                  1344940586,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,1411317660,-816308480,-335415366,-1023374174,67112970,37756928,-335416902,-1275032158,1960256544,
                  1824413200,1927336115,-102021629,-2040615890,9281760,1149970115,48808197,-1979694430,1134695494,306612736,1151483684,323389952,-1979693662,-390065594,275155462,-1067391872,
                  -1005976596,-1979693406,19140678,201646272,292981408,168814208,4694726,138709542,-301730118,1095875,50489079,-763359674,-490647552,82362636,626577419,516096015,
                  12180366,32553473,-1021349901,1317727538,-578361344,1929300456,3270672,-1910633614,-1172329253,-487718416,12174312,32553473,851668467,5147373,-388145176,208862882,
                  1912605416,32553479,-320689428,616124867,-24319756,-138801038,145288193,971507829,-1259085091,-1017513600,855570920,340167140,359041219,1328838,7612040,18501249,
                  -960235264,36358,7612040,7677578,292873226,605046410,1954561183,1959591438,1954626564,-33822714,-1173230599,11535350,284092654,1929248744,7071747,-1101965629,
                  -239468478,506113,-498930004,-1017226757,857624915,-120025408,-1668284232,5512959,856322847,-1912206656,-350522112,-1145031914,616103956,-1912206604,-401902336,-169681764,
                  -1259375285,113703296,1493172366,547930971,-860617612,27791339,1474823540,-1475941378,-1274842108,-1178339055,-138742748,-322948351,141889704,-488872984,-109005578,66501315,
                  -1007811920,1910796518,-1972312381,-1015945532,-2065284944,-1912586056,7512536,876380390,-436272523,-4987509,1891499827,-769201739,-2065284688,-789159452,-527822812,-452984903,
                  974136417,-502238012,-1232290826,-1124067143,1659483541,-1327895790,1719985730,12250419,28861952,1711276032,12174643,868388416,-781803777,-492083504,281444601,536935041,
                  1135667314,1642366182,1642466316,1642525476,-2065283920,1711276223,443,-583834112,-1966765210,870289140,1073789430,1721689738,-1969237039,1722640116,-253639885,1169179765,
                  1642366182,11583656,-947840139,-8318976,-781049856,41635174,1185973483,1085834470,-2585088,-1107348508,-1209420243,266567889,78771763,91478992,872014406,-339725578,
                  79269905,-1460589824,1711764991,1174988993,-930351646,-2065283152,-561195381,-1124073281,1189721701,-1230587120,-1124068935,-1997949327,-1963005167,-31182267,242549308,-2092149365,
                  1971324098,1166704718,-1007030706,758263857,1953724755,1109421413,1685217647,1767982624,1701999980,840960525,1294807344,1919905125,1917132921,544370546,758329394,1869440333,
                  1092647282,1701995620,1159754611,1919906418,892351008,1835355437,544830063,1869771333,537529714,758591538,1635151433,543451500,1869440333,1126201714,1768320623,1634891111,
                  1852795252,1109396746,543519585,1969516365,536896876,1969516365,1092642156,1867325440,1701606756,536887840,1969516365,1126196588,1342835968,1953067617,1749229689,543908709,
                  1342185521,1953067617,1749229689,543908709,1056972850,1061109567,808517695,1330785585,1917132877,225603442,808722442,1867328818,1751347054,1701670770,1633960224,1919251568,
                  1767982624,1701999980,891292173,1143812400,1819308905,1092647265,1953522020,1176531557,1970039137,168650098,825242400,2036681517,1918988130,1917132900,544370546,1411412591,
                  544502629,1954048326,543519349,1953721929,1701604449,537529700,758198323,1652122955,1685217647,1920091424,168653423,875574048,2036681517,1918988130,1919885412,1937330976,
                  544040308,1953066581,1920091424,168653423,758329395,1652122955,1685217647,1852785440,1819243124,544367980,1869771333,537529714,758198326,1802725700,1702130789,1852785440,
                  1819243124,544367980,1869771333,537529714,758263863,1919971139,1936024431,544370547,1702126916,1869182051,1917132910,745697138,1701597216,543519585,1667590211,1850286187,
                  1818326131,1769234796,168652399,825241888,1328498989,1297044000,1920091424,168653423,842412320,1937330989,544040308,1769238607,544435823,544501582,762602835,1853182504,
                  1952797472,220819573,538976266,1850286112,1953654131,1095320608,1397706311,541280596,1802725732,1702130789,544106784,1986622020,977346661,824183309,1395470902,1702130553,
                  1884233837,1852795252,1917132915,225603442,909189130,1699556660,2037542765,2053722912,1917132901,225603442,909189130,1767124275,639657325,1952531488,1867391077,1699946612,
                  218762612,1378361354,1297437509,540876869,573654562,1497713440,218762537,808656906,2035494194,1835365491,1768838432,1699946612,1769108835,1277196660,543908719,1277195113,
                  1701536623,537529700,538976288,1851072557,1801678700,1937330976,544040308,1953066581,1667584800,1953067637,1867260025,168651619,809056049,1936278573,540024939,1869771333,
                  822742386,758200631,1802725700,1159737632,1919906418,925960717,1143812152,543912809,1631985712,1920298089,822742373,758200375,1802725700,1176514848,1970039137,168650098,
                  842544945,1936278573,1866670187,1869771886,1919249516,1767982624,1701999980,908069389,1143813424,1701540713,543519860,1986622020,2035556453,1159751024,1919906418,1968318509,
                  1699946606,695235956,538970637,1226842144,1919251310,1229201524,1330530113,1128879187,1936286752,1953785195,1852383333,1769096224,1092642166,-670429894,-1272327165,12058864,
                  515344992,62406656,-254531148,1610657792,2209641,-1164198640,-1327962647,863037070,-1334712640,-91822528,-2065297488,-2048524112,-90066,-1573990154,976158718,1979710982,
                  179986,-373634371,-478098150,-1160528449,-53689367,-1896873800,-419450664,-1147017695,529268704,251660279,-491058315,-1960866817,-1899723257,-435375896,-435113887,-434982780,
                  -431837109,-426594229,-423611829,-430657393,-434982845,-432623551,-436162493,-436162496,-1173573568,-1326578702,-1333467631,62437889,-1174294290,-1158806568,-1158937670,-1158937638,
                  -1070464064,-1166558226,-1329893697,-300446975,-1979418741,314114647,-1151353600,-2082435863,-92207678,58000345,1257124016,313583615,2025686246,-528291397,1468713267,-1123109886,
                  -1813398651,264471537,-1164575871,330349170,12158182,-490720511,-436162308,-1975458749,1027663072,242548736,-1179218757,-1262682088,205777339,347143915,-1951365914,15429862,
                  15401195,119828964,-1951342454,-997560090,-1934593562,363884774,-1917811482,15429862,15401195,-2145095196,-1901010806,15429862,15401195,-2145095196,-1971272458,-2146994720,
                  380666060,397444326,-1901034266,-997560090,414216678,482182374,-113972804,-215719452,817390054,-1127182848,430964992,2112390374,-424824596,-18076,44590308,-119402380,
                  -1179119429,1287454749,195815868,45743851,1365304320,-401372997,-463926818,1946265700,-1141972464,498710544,-1133527808,-351565591,-412292866,-1326586904,-393943526,464580086,
                  1676182758,-434327354,264628356,-2065293904,-1341131288,-393943507,514860139,1021871334,-434130925,983427204,-2065293136,-400937240,-873985165,724035639,-433999621,279832708,
                  -2065292368,-1340992280,-393943518,12521891,-1126712064,-2134176279,-75448093,-1341491904,-1115363650,736738537,-433803061,-1335827324,-463149360,1946331236,-453448958,1946265700,
                  610329850,-1963776771,-422465312,-1469782940,-1963297534,-1335826748,-393943515,649122962,1810400486,-433606650,-1158893436,-1326578754,-393943512,699456641,-1947695898,-433410011,
                  -854608764,-855591920,-1973296112,-429126432,-421493151,-433344415,-401690492,78182374,12192884,-1188447456,-402646343,-1578890793,-1578697436,-81518108,1085809126,-958886400,
                  4614,9834112,-1777434496,-386260992,-223334756,-1174707994,116850687,1948254358,-956833273,38406,1048676068,305397874,1085283188,894953552,1968750602,-427815934,
                  896002182,1273402032,-351677464,1967171639,1971365892,164030471,300613808,3948324,876349042,99287671,-1341541400,988303360,-1833895371,1012419558,-436046848,1913046858,
                  -82706432,-1341548568,-393943508,432878370,2133116042,-1084815602,146390876,1605300736,-385649416,-58719947,-167086806,33592838,636027764,268483329,-469056557,-58688647,
                  -2147126102,175486716,9832182,-385649662,-738787064,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,-2142966974,-50325466,9832182,-348883960,
                  -1644396490,116796789,1962999958,-1777928662,326369792,9840256,-1775861509,116849920,1946222616,-2146374898,-33548250,9832182,553940228,-117434594,956072131,116793205,
                  1946288278,-1777434612,645924864,-335740778,403603461,243270144,-116916201,503087299,116794997,1962999958,-1777928675,208929280,9834112,-1775861756,99351808,1576576,
                  386826241,-1007090688,1515141,503924597,116785175,1963196439,1392279612,116798325,1963458583,386332214,276038400,9832182,-166234878,536876806,367726708,9832182,
                  -166824702,536876806,645924724,-343998440,389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365767574,-2134640315,-83879898,
                  -343604808,8240110,-116895512,-1326402365,-401695741,-239851368,-1847062884,1962884136,8239904,137619536,1946172504,1946237972,1946762256,8239884,-1157202456,451412093,
                  -2134640376,41287676,-58672149,-352160428,-721649517,-1544879499,1967520896,-1873810685,1975057536,9955587,1966603392,11266307,1968372864,13887747,1967586432,14084355,
                  1946307048,354826791,-2139982848,58020860,-2147450647,2020871420,1966341248,-385830907,-58720004,-1341819596,15919361,116835320,1962999958,386332186,-260832256,1509110,
                  -385649656,116785310,1963982998,-2147095585,-33515994,1576576,-1343686136,-2131016406,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,1355020793,
                  109494323,-1065091047,669516660,-1662298093,-84549399,-81103384,-165026071,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,1810432885,
                  1206450943,97338666,-154928645,-2147477498,-1007091084,116835320,1946419223,386332407,-260831232,-1763052880,386332160,-462158848,1509110,-153258744,268473862,116788340,
                  1946288278,-1775861553,243334400,-394264463,-386268857,-79353354,-1070392371,-1078696469,-315420467,65651705,2028210943,1006403635,-58708356,-2144633276,91510780,1968766080,
                  -164319201,134223622,850408821,1509110,-1339263740,386332208,594871040,535506608,766559224,1509110,-1340836600,386332195,192218112,116791728,1963130903,46150146,
                  -390057248,-1007087058,259580938,1195164810,1396442236,113641342,-134217703,751078083,-1685996729,116840238,1963458583,-1685143979,1509110,-163416828,50337542,116798069,
                  1965031447,-1777928682,225772032,192687676,1967979648,-336547836,-155176446,33592838,645924724,-1325596522,298379488,1139523634,1509110,-338332384,-653465374,-646782838,
                  116798699,1963065494,1949187119,1965767817,3729418,-256321931,1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-1682391299,
                  915126251,909836314,-1012072420,1509110,-167414776,67114758,-1577411389,446890112,1876736,256014,-812645653,-885397309,646589300,-58720183,-2147126780,896927468,
                  -1962891032,-2097126634,-1460926782,-84183807,1946265836,93005563,-83868023,1227262659,83656704,-327154318,-401967610,-1960443779,4622597,9824451,-644955764,-779290741,
                  -326909554,-1208186104,-1979534588,2046611460,-1963947501,146342228,2044907776,-791611135,-169680175,16155050,1976303136,1355187166,-713699330,-661731188,-1946521922,6940924,
                  -1070390669,918935694,1397751932,-611530612,1482408763,-24967819,-1962314752,4843772,-2147220878,-1995914109,-1950154682,853510904,5022207,-796138505,-1618222127,1251999824,
                  854062592,-775748609,-1748892704,1344179139,-2033044736,-772043814,66048495,1225193211,41222656,-100408623,-1949922365,-1158860065,-1957298048,-1308914704,1957163780,525579,
                  1592816970,-1007042509,-1312412834,-1008151805,-1912586056,-424628008,-1564462460,-1901985675,32684544,854480304,1430056128,-1313864076,233538790,9113216,15001601,99091314,
                  -424103936,-402209916,359858587,-2065255760,-1178992453,12189726,57272320,-352210200,-424431573,-1900006524,1053042368,-2135817980,-2147476504,33584446,-1263529358,-1070365466,
                  -1004093298,-1308551106,190593,95929095,314114739,-854543238,1376875283,-335415366,1971365978,-2130935784,82513780,309661864,-489855000,1976303328,1976565465,17426643,
                  162815211,-177073203,332206516,642927986,36504971,-1964471808,115458252,-2147366528,-457175836,1490323972,-1977167862,-822214027,-855375432,-2145684717,376703740,1947335808,
                  284983313,-1047917452,289149220,-1040315020,28958443,-854805504,-402361581,-1007091566,-1612149072,1950394608,-424169462,-117395068,-1332708885,-259200878,-311115766,857659530,
                  -1899459648,-1060926760,225707240,91557692,1877514672,-20840720,-166677048,-469695003,17081338,17174156,-1014317005,225709860,91557692,1273535152,-20381968,98956993,
                  413393921,437160961,5021953,-1593769821,44236878,1275512577,-1943137792,-956281330,1124194310,-636580813,-2011170047,-1023380210,-2065254992,-2135314245,57966842,-1179008069,
                  12189715,33417216,-424234813,-1175733372,1954675328,3794950,-1179003205,12189717,31582208,3860675,-1174387480,1018888695,-198919936,1954588908,-870389748,1967912674,
                  -343886608,32619018,1946238188,-115297277,-1901004093,217034216,-1327461880,-274077554,568640507,568785700,-1088118300,-1195138586,-155582464,78704131,-874583826,-1007812432,
                  1381061627,1428051798,1086254219,-2116121088,-1962933278,83656946,-1668676493,-422510468,38027,880071179,91612292,-351989016,1976368683,87746565,-855760149,1575486837,
                  -31855867,-402295348,283837727,91606270,-351946520,1976368647,99936259,1583292253,-816096934,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
                  -880032931,11598492,1088701414,1088741514,256014,-812645653,-661928826,11598492,1088701414,1088741514,256014,-812645653,726910086,1358660056,-529376503,-1950103838,
                  -436162357,-1975458749,-2042567456,-1327985724,-465312256,-455046592,734299712,1358660056,-503025143,65404892,-2015040552,-1947629838,-1176073255,-355270652,-1107295559,652986049,
                  -2116777072,-1191181342,-792854524,-1877480506,-2010767184,-1434451835,-1177318585,-457310206,-1878791226,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,
                  -419435806,1381099910,-490613109,178440,1509955816,254593,-402651975,548405261,1509994728,-402652487,-54329343,653733522,76727853,1075062672,1347506727,1476433128,
                  -387818919,1085808323,-958886400,-16772602,-162442465,141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,
                  -498902272,229688310,-1342158616,4450314,16432067,-1157610264,-1679294208,2109457406,3663872,-402620997,-1144783218,719848224,16825088,-1006730776,78768266,115927250,
                  -389707264,616759297,663749647,-400080876,-1144848383,246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-28776351,-64724508,868442598,12123391,784371376,
                  641927050,-2147449464,-203274326,856090111,12123391,-1967092048,-2010758393,-1434451835,133489223,102654147,-2065248080,-1912586056,1730578904,1763085312,-422465536,-1197283196,
                  -1427569804,-422400000,-391008124,-527766282,-269963088,-1143852052,-201916352,280230026,-402613784,-1918780353,8389888,1086050867,-1963723008,-1944155400,8448000,-1329807896,
                  -1199249709,-661782488,-795950962,1711284239,-475,2232191,13147626,17772272,-1331605218,-1199249708,-661782464,6887054,6760075,-1579433496,-768409581,-150978373,
                  15859,602604405,77200,12253322,16744464,-1030875788,-1178586266,-13418496,-1410111748,-964636674,132573968,-1161600737,-1933901824,1751478,-184661272,1464947536,
                  414713374,-942109184,18950,16744448,512236404,1220018252,1723895296,12173363,-50384064,-22285466,-339476785,1595869152,-1017619623,-2013213464,167788838,-2130348828,
                  71246,4623043,4269706,91546634,18239105,-956644608,-16760826,1317671088,216060422,105253388,4138634,168092864,66239172,-1595897106,-390070133,66566662,
                  82624750,603996064,1959016975,1059457072,-1191642368,365793533,2108695410,-1977218895,2122320476,141820673,83984000,95486581,41146682,-470361722,2078857355,1371798524,
                  -1190923078,-773324612,-2136412985,-152959371,82542768,-322452504,1497409602,-1594062141,1177157701,652267525,-1979423498,4628696,638010922,33842422,1191576259,71707136,
                  -1161566326,1067451378,1947149312,-1461137390,-1342016508,1059490307,-771444480,214174436,1978199560,1042710727,67895296,-198919698,4065014,-401967744,-186464416,-335970124,
                  1042710541,652771072,630188069,-1195121614,1727463440,38142732,-100609408,82185446,82232454,-661928826,-2115583350,99008907,99009670,-1006910330,-1073250678,2114585319,
                  172025862,-402293110,-3995078,-1,-1,1358954495,-1595531088,196092134,-1964334616,-401821472,-1004344678,57950376,-1476391192,-402426848,-816316414,1481297232,
                  508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645982815,-1577189216,-1064435558,9969291,-2146467802,123412312,
                  -534425405,-1031563776,-293556221,-1325143421,787403524,-869366645,1120176878,1480737518,1257119524,-289394102,96633674,1122011884,1381024748,-2098723920,-1223855104,-758913008,
                  -1219885452,-759437280,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946179816,7454277,1249846400,1522074039,1350611968,1139146928,-997834524,-997834524,
                  -329713525,695584644,510993540,-436162480,-2042567613,-2042567484,-131377212,1562443649,-546154401,-872493598,-863976331,-339725696,-2082436599,-2132015638,-2084364572,1122895042,
                  -383731902,134271549,1010313240,-590285567,-452272944,-472849456,-617422070,-960562298,787678155,-58055670,-1341930877,-360452480,-1947389437,786878961,-869366645,1122010862,
                  -1975368978,1246424775,1257160754,-1006691608,426967612,168084099,-335120960,-351517048,535003142,-2081504374,-51903254,68666366,25166592,6291648,1572912,393228,
                  131075,22391296,268960770,-8372192,-426725376,964996,-489929538,774171394,-1327461716,-387848049,-672624720,1960852200,-426594070,47748,-1179218757,-991428582,
                  -1325470726,-1014700399,-2065263696,149292208,233230566,247061222,-867910144,-1712782366,-1951650304,47833,-301987655,-69057810,-1191132998,-286392312,-85835198,-2082043930,
                  -2098822682,-1981379610,-527791386,-1002797084,15424117,-1002798108,15422069,-1002798620,15420021,-1002798364,15417973,-1002796060,15415925,-1002796572,15413877,-1002796316,
                  15411829,-2065263440,-1191182150,-320077816,1975794242,-1158159849,146342080,1122823168,1975794242,-1946754553,-9377333,-1157627718,448378508,-99751936,-1783562517,233211110,
                  11590374,-790230810,199639216,199639472,199639728,199639984,-689520464,-689552976,-689552720,-689552464,-2065262928,-1325753149,-405739382,41189544,-2135886357,-1964522008,
                  -394088208,-930420802,-1209498448,-1645704473,-756496758,2000370688,-1950054811,-389969168,993788101,-662022025,-1159150198,1998011392,-1946645939,-2033634365,599347660,-1813907678,
                  1018778200,-1176373504,-503897565,324655107,-1966699567,-1262187832,-773523822,868746209,332071872,-2083420208,-938276926,-623777327,-623777327,-623777327,449642932,-1901064469,
                  216482280,-1327461884,-415373170,4241414,-1070344050,-1960394610,637542446,2098887,645975636,-453115797,-419552223,3980065,-151517720,16804614,12193397,-1232291072,
                  -402646343,-18089729,539920678,1797685248,-1022886400,1085820958,-2133291520,16804622,551952560,-1966137512,82624736,181735204,4241603,512481422,-472186864,272555419,
                  1089536,58048522,-469578880,-423579552,-1469782940,-352160766,-1469782792,-453348351,1963239520,46396935,199958645,1963115510,-35422202,-2138038037,-1168900637,1337655296,
                  4045240,1543012072,-1578890005,-1578705116,-81518108,512303590,-1329397744,-393943413,460456284,276104508,-1157627718,800700328,-128063488,-1023358744,108265532,-385826584,
                  -2035285873,-5208858,-390504218,518541571,1692686839,91554216,-1947601950,1012982784,-502958854,8448488,-2065266768,-468481863,1963042916,-152547062,-203269642,-1332712725,
                  -461052280,1957313632,-1874400509,-2065266256,1692839600,-452984903,1946331236,-336010747,179933232,-1469783040,1359574273,1509343464,418116578,-2065266000,-1336909596,-463149395,
                  1963108452,803756282,-1878594568,-2065265232,4241603,243325070,-1157693422,-675610624,1423799,-1007182104,-1912586056,302940376,12254976,-1209222400,-402643783,-1329334393,
                  -1184569682,1692729343,276038312,12253410,-1206863104,-402645063,-18090133,-427773757,-424824700,-1469782940,-453348094,1946265700,-345971708,-427708170,-425021308,655407460,
                  27813092,-397342347,-497420763,-1341461517,-461052286,1951743072,-427577326,47748,-1179119429,484966431,-1325470729,-1333467516,-463149472,1963108452,-430067462,-1414479008,
                  1692689638,-92994904,-469736263,1963042916,-622309111,-203269643,-1934620181,1625588966,-117314568,-100991549,-370477578,-707339547,-1700419158,1431738005,12539390,-796672768,
                  -2135465495,-75448093,-1086884544,-1799553023,-1219434032,-1899459578,-798638144,-1979706183,1974399683,-1172641022,-474284032,2341302,-1326017816,-460527602,246685708,-1998004090,
                  -1017313308,83654,-335101309,-1475941757,-1469156092,-965839870,-1342111418,-331158000,-1337270134,-331157999,1309027146,268778752,-1070398852,512425778,707657801,-2133762425,
                  41484508,243974195,-75497398,-2143849980,846465019,-235525967,-372193142,1317595600,40273923,1183375568,-2046578427,-740019488,105286112,4800128,-804883194,1724973670,
                  130188038,-235486226,-2013051256,61932134,-472654710,-771334519,88508640,50586603,50529541,1049232387,121372770,138174580,171722356,222060404,28920692,-401951744,
                  62173785,-21867288,1242970818,840725760,-2134442286,326441470,45403902,-1263387416,-1304958968,-386102701,-1269104576,-1305745406,4793994,-1023318392,518521780,1959922354,
                  -339018001,-402410266,-768429551,-189014549,-167254015,-402410301,-25120255,-33262568,-1261900858,-1309415416,1381104778,4800128,-2146864121,50350398,11993718,856031672,
                  -1978091831,1241532950,1521602792,488424281,943142186,1961101894,-117081853,18213315,2134506624,853314295,-2020987137,116824863,1963458583,386332392,376767488,116817700,
                  1946353687,11528451,1509110,-379358144,-58720103,-1207601905,1995150336,1966472320,-1777928687,175374848,9840256,-1795114755,-1073061653,-58695816,-2141293565,1567887100,
                  1948056704,939294812,116791925,1947205782,-1777928634,91554304,-342490952,-1775861707,871103744,176037948,897343804,830307132,116793124,1946288278,-913551335,247447950,
                  506322,-1359821686,-2146994856,-50293210,-538386252,-1262225152,-339725710,-343953195,-1683308847,1925718504,1022028745,1019444321,750747514,-2135168224,-697026564,1966472320,
                  -1777928690,125043200,9840256,-2134643715,158601212,-1976693889,-342140537,-339725675,-1687568751,1925702120,386332297,-2106245120,2112430124,-2139151105,292894204,9832182,
                  -2146798590,-50293210,1273734324,486310032,116789621,1946288278,-1775861750,-1498088192,-2138032661,91557884,736863668,-997568368,-1047606900,-1879044679,-743981060,1951969010,
                  1948269602,50102292,-58715524,1007647758,1007254625,839221114,1632448,-998194183,-1326126218,32697328,471538190,724117543,926233651,473336826,1174702336,-2110375098,
                  -1962642176,989888566,1946163766,473336081,938015488,-1202698985,365793538,1358676824,-402620997,-1017580555,1183449524,374243584,1388511233,-1476380184,-1329374656,-1341985904,
                  -515839984,-152546621,106334975,58053130,604301504,1958742543,1996766215,32241667,-389850375,663403882,-1022311178,48991920,266866352,378258401,-1024065520,-2146274303,
                  158646498,1967192704,-352144888,-352210425,-117394941,-1963160893,-469105050,-524287116,-1895430140,-1008236032,1720384650,1961101830,81838083,102813942,-410386289,-1598016573,
                  1720320143,1961101830,82362371,-1023406299,-1974316208,115916996,-301729862,-1979675744,-1061149480,-1007287064,201487361,-1058766847,646504458,1532625035,48808792,-386173707,
                  -1007895336,1978988776,-1127290629,-1007761526,-2044949722,-1251077,-404161658,-397360129,1253513658,-1962943000,-406845570,108923394,-385887768,292887183,-1090517063,-1175977918,
                  1191545087,115931362,1093044224,-1597810688,-1062731710,145237876,-2135686028,646586859,-990511037,-805014480,-166401044,74712004,200000766,1954596086,-352013310,-1023364094,
                  -1912586053,9485275,1972584320,13101315,-1071380598,168224960,-28216128,-1289456184,-1272466171,-1273770752,14674036,-1325135432,-841862399,-385650157,-58720124,168064260,
                  -1266977344,-1273770752,12576919,-1205287552,28378121,332255795,-58702221,168064260,-29526592,-2139392821,-1209325075,-315488845,332202164,-1830283340,67221504,-768405327,
                  477303757,332202164,2129139124,67221504,-768405583,645075917,1182059518,-789854722,-2147446597,192190271,1927808180,-1589855744,-1265609237,6809652,-341758022,45387850,
                  -1157604120,1065353360,-1173982092,938189077,-1593263472,-1265618453,4450305,-341771334,-823619546,-400329219,-266011179,1006954688,-1594115583,-922873484,1956710586,-1161232886,
                  57975074,-392086342,1405288579,939561147,-2012580825,-29824985,9375360,-389850362,1752563089,-1057122072,-533068568,-58699660,1007187252,1011315715,-1337756668,-557520845,
                  -64748532,-527776758,-1125633104,-39786274,947200168,-863969142,-401690592,12246699,-1172391136,-402630215,29225115,216000512,281874356,281870516,-2065252944,867176171,
                  2145968266,-2030361378,-562173756,-1031057213,-1030827469,-1426032449,1487653004,102654147,-1475370993,-2065276752,-1910767432,4242392,-1943616626,637561110,6760073,6555335,
                  1638924288,-639073050,-2130086743,268461070,56748288,-1330698008,-947591582,-2147449338,-2012821760,-402653184,-2128172802,872444478,-1592822510,-2036137860,8298752,-385840989,
                  1459356158,-1945756073,-1144811813,-611450832,-1081930562,196673683,128316160,-1335992545,-393943453,125020800,-2065275728,-2121265173,-2147453378,-2129235200,-2147458034,2082376448,
                  1981712640,2115930880,2015267072,-1391073280,195917544,-385649472,512426478,-343867274,512295040,512426106,-343867268,512295040,-1868562304,9413120,113640116,-402587502,
                  512426745,-1014955894,512295040,-1073020794,243339892,65636,6696584,6755977,6885000,-2065275472,7872139,8003209,8265355,8396425,8793739,8439169,
                  -1577021024,280232079,9569990,44820481,9051787,8920713,309641227,6557313,780664834,378077294,243794031,-2002714511,67110144,725582011,989891870,-1959169085,
                  50366510,-2130672082,-1593802555,-2103246707,-1895381504,646643456,113639564,-402587502,-1073020207,243339892,131172,7220872,7280265,7409288,4241414,-2135048050,
                  -389707008,-1123571681,113639552,-1342111598,-402606850,44630885,-2129497088,1140876302,1781434368,1796638976,1829668864,8823040,-150732613,973254883,-1977518910,-1845049630,
                  921174272,174339,243339892,262244,6958728,7018121,7147144,184584353,86537408,-470350848,-494268240,9569990,50849793,1946157737,1678672146,-2013263872,
                  -1996459474,-2013236458,-1593805554,327816,1065401092,9248299,611566395,-1275032416,-1845049602,-756547328,174338,243339892,524388,7483016,7542409,7671432,
                  -2065275216,8789643,320768294,-2011264256,-1968132096,-604903197,-410340944,-1310987544,1678178048,1946189824,-402542334,1739630758,1048675558,41943174,-1280307598,215729640,
                  -1327461760,-608048973,116851380,-65436,62128756,-1326936144,-429346597,-1335827324,-396040672,1692668552,-93060696,-527802140,-1341862784,1348789856,1477604328,1625736330,
                  -1340970008,-194713858,1773207019,12289254,-1878463744,-2065274192,-1207959109,-661782464,6887054,6760075,-308615085,1977289563,10021123,-2065273936,-1910767432,1678178264,
                  1946157312,-310450154,243985714,-242548634,6885002,6755979,-139980056,67134470,-401181696,-315429536,6950538,243986827,378208365,166199403,1678178216,1946157568,
                  -314382314,243985714,-242548626,7409290,7280267,-139995416,134243334,-401181696,-315429596,7474826,243986827,378208373,-840433549,1678178215,1946161152,-318314481,
                  -1157627718,448378508,-323360768,6555383,410320895,-135467032,1073767430,-385649664,1642397477,74760360,-2065271632,-1326069016,260367980,127995817,1405313311,1840306314,
                  -1014332186,1857083530,-1014332186,8396427,8003129,243345014,8388708,8003211,8527497,-1962914584,956335134,1929412638,-2145481980,-1977710336,-1875842304,243341428,
                  8388708,8527497,-1962923800,-1996454882,-352286178,-1336897514,1485104751,8527497,-1962929944,-1996454882,-134182370,24428555,1405311993,1890584151,646481126,-997588916,
                  -125049806,-2147483461,16814654,1085803125,-1950315008,-1521620795,8535683,-1207143168,113704960,132,-1342142743,-1199249807,-1064435640,1431787091,939560864,1996508166,
                  -776673275,-169344021,1583308208,-1979026597,-1207940050,1441464321,1086555024,1397839868,4988554,855640249,-775932929,7643,-1963531605,-1207940066,-1007288320,-1207733246,
                  1537933569,1048600409,1962999954,4241420,-980696946,-857160957,-2111948380,-1207535872,166395904,1275494544,2129199360,-2078373377,1940934656,123241702,113466207,-1336913065,
                  1485104754,1342196898,-1912584005,571843,-13379446,-607010765,-1358954467,-186500235,-469399002,1958783073,868233734,1194847231,-469398746,1958783073,-1077923321,652935169,
                  9584256,-1206946559,-1064435648,1074120075,-387413248,-346512305,642731816,108332338,624043591,-970537846,-930480123,4992650,-2065269584,-1547334824,-678756220,-352320840,
                  985726481,-385648928,-12714118,-1191676928,1599799296,216580871,-1511458289,242613221,-124779848,-386263603,-1862539880,909899892,74776706,8402571,1717897,-454507525,
                  2112420366,-1597768731,-2134704105,594804988,1977617725,470661125,792533483,-1207601696,267072815,2005204096,1961901071,1977629707,-1107251198,49020927,-158992845,16548035,
                  -264501644,11534965,512381891,-1014366184,-478121180,98811908,646628106,-461373290,-1595930100,-1017446377,1534395708,1996750720,536576086,-397323913,-76214556,9905792,
                  250276079,1625748400,-150995015,268474118,-136180875,-1341204504,-345970956,-1759084508,-907481344,-1060664818,-1022753312,-4628250,-1761151233,158666752,-1310132254,-420171762,
                  -1759084448,-1017528576,473336826,1175226624,-2110375098,-1962642176,989888566,1946163766,473336073,-121622016,28312555,1355021305,1601439804,1735657788,376815748,-1088125212,
                  -1071349748,-570029522,780592743,1742612106,-922849557,-2031872395,-2146648284,170836004,-429400826,646590086,1424713693,209045758,2133100260,-2031730676,1156251828,1333119230,
                  11831012,91504808,-461315958,-431999937,-466752634,209659014,-1266227520,-2094929152,728891897,1999829379,3323942,1077985579,-2031820662,-2146648284,-1005928412,15435494,
                  -419786064,16547915,-997587852,1492863718,-1467554621,-1475840704,-1274776192,-1473385720,-1272875712,775889920,1742603834,28581492,-586794450,840266855,3324388,1094830123,
                  149621172,-2136471372,45351541,-466434934,346286275,141885364,547881140,28574324,-466434934,1012988867,-385649150,-326958838,-1930654920,-1899983152,872254424,3717568,
                  -175396109,638614669,-64057,122013222,1170613888,-970588154,647103813,148935,1170613760,2089664516,96937496,-970522625,637536069,411078,88458790,-1143960430,
                  -470351856,-763312893,3671296,637588096,637683081,855922056,13822171,-1796668557,947686656,604342822,1950366912,1179043335,8513792,-402652485,2037514420,172377738,
                  -1923255104,-561311620,-401050483,-208994194,788521151,-147964533,-1928396795,-14272388,637957173,-335608378,96871940,-388287492,2089615469,93267512,309643518,-1088061402,
                  -402652485,762445913,38160070,-2144983061,45826061,4712448,1187388274,367722822,641236109,-478143094,-972655552,-352238010,1179043332,952402690,-1008552863,-13238276,
                  1979646581,108396292,-218102599,149848997,-1895239805,1150223940,38047492,-1916599153,-1993992068,28901981,-846744576,2089665301,1569269264,112898,365791156,-61,
                  1430346987,1380927572,1094918227,1194539330,859390540,961763154,1128940595,1347302201,692267074,2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,
                  1919905906,1869182049,959520878,942420536,876096563,741685292,-382978504,837474889,686817422,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
                  1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
                  741552952,876099628,942418996,741684536,909654060,942418998,758593336,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,
                  778331237,-435310546,-434982780,-1172131765,-1276247992,1894400,1273369264,-2065297744,1273402032,1253712560,-2135691776,-1342175768,-1018435950,-1979645767,-330570045,1038934154,
                  410320930,-1833897502,313543654,-1933882394,1620406,-371107139,-18094435,-61,-1,-1,1358954495,1084776932,-816315787,-2048523856,-2065296976,-427773700,
                  -419450768,-392042975,1642332420,-527702990,-337537347,-24407983,41077899,-930298370,-1064380274,-1912590152,16825552,-390642754,-310116144,1404962932,13035703,-91805717,
                  -754973511,178666,-1962892568,65176023,309504,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292837980,-661733325,126606131,1642334089,
                  1642465292,-4983413,280887091,-1517884958,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
                  -549777408,-1070339466,-208935425,-13380213,-371042627,-359946866,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
                  179094508,-1274645312,-351220466,803783669,237466896,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
                  -356314931,-268377749,2011696816,-1327461678,-764352492,57999784,-1977561984,1958783172,536918547,-1179082565,1491599446,302940388,1122762496,292823208,-1155530566,1455012000,
                  -465442816,1183360,268891903,292880640,-1155530566,465156342,-467015680,1183360,1947248895,536918545,-1179053637,350748696,302940388,1625620224,1692844208,-385876039,
                  1692708440,125043368,669775330,-385876039,1692708424,74777000,401339874,-2136448796,12194165,-1185170656,-402631239,243327959,872349714,-322508563,-392887950,-1070399443,
                  1181194,115868532,302433792,1623392256,-1157627718,414824771,-475404288,1946500245,4974595,1181382,-87858944,-47963676,856039910,650153664,2367115,604423974,
                  -68950528,-496506797,512304731,-1341718492,-1184569760,-1041694721,-1469782867,-503155710,-431640331,-464469152,-434065312,-1261479904,-2145989376,-143311876,-61,-1,
                  67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
                  100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,9,285343488,84122880,8388608,0,285449216,
                  251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
                  134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
                  84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
                  117628160,16777216,0,285400064,100869376,-65536,0,285418752,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
                  268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,168019456,-65536,2055,285459968,268626944,-65536,2055,285404160,
                  100869376,-65536,0,436413696,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
                  134409216,-65536,7,570616832,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
                  84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
                  251920128,-65536,2055,553910016,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
                  134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
                  -50657596,-2065297488,-2048524112,-386938950,-628166725,-2065253968,1358955449,332202164,-1183055685,28835841,1494469890,208814707,-1,-1,-561714689,-1146036766,
                  -92240666,-1339591552,-839325682,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416130795,1971372790,-941075682,-2065409043,-1804288708,
                  163121035,-201618688,-1105300049,1072206685,-1325470976,-387937741,-81474134,-1461140346,-21003827,1974097153,-1467554619,-1475840640,-1341885120,-1337203054,-360388932,31744,
                  -83442557,-393014082,11796486,432871117,1017917180,-402295772,-169091079,-1104335677,-1959854112,76230196,1947140265,-1877218557,-2134842240,309608700,772475624,1742538438,
                  113651234,-400267298,-1950151936,2210291,1973941094,-210417140,-930352245,1957163878,82805511,-117117309,-6657,-50593793,-1957341666,4243180,-461054322,1441270645,
                  -192419596,-1276512140,1976368640,172917033,1719730752,-385876470,58061924,-402612759,91616361,-336318488,174490094,1317142463,-385875702,-855768954,1256719733,-25302028,
                  -402295348,1961620642,41274622,-855740693,-202898059,-2140804108,141888508,-386664472,1491858523,1963785344,172917022,1719730752,-385876470,1148515336,-2114698520,-4257178,
                  17452673,-2143950080,91557372,-336315672,-335773653,-689437323,-2145260556,91614460,-336236824,-302219241,-1528298123,-2146571275,91615228,-336220440,233603075,-820027811,
                  1085820958,-1193767424,-1595474165,-1065049884,-527823756,-1005936156,-1595498010,196089579,551821542,208978052,78176394,568591989,568771594,1962933376,-434065404,1797687328,
                  -820029440,7911761,-402393926,-1460885428,-502893184,149682678,-1472272240,1084769004,-15527,1926651112,-727390190,-1192751758,-402099497,57858066,-1008166168,-1342001176,
                  -396040531,-54328664,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
                  -1090480602,9834112,386826256,-1336926208,-881793010,242565288,1743269040,1967171787,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
                  1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1943454440,548469257,-369418010,548405410,-2131025690,125165820,9834112,
                  -2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657399,-346550272,-1310158722,403109376,1702103040,-58133,-1,-1,-1,-1,
                  1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1926455784,1392279587,-461103500,250288760,1509110,
                  -166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
                  1948122240,-1775861755,-1017577984,18802768,1692839600,379634520,-684660736,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
                  1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
                  1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
                  48758935,1354979328,5433425,645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,
                  -134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1692673808,-85982552,-15527,889192447,
                  -1060551223,-1058225940,-1494359572,1223468780,2089903007,948965519,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
                  -58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,1072230262,1552557799,1075742722,374243584,1532690944,1600019033,-815980793,
                  1973608936,-1550194673,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1008931096,33652352,1183524981,1096460,1174660087,
                  13796098,1930361472,8292881,-617414910,-763116797,251297792,1187382386,1048577025,1946157121,1094615054,125044992,182244584,858289636,4623040,55347750,-754941766,
                  1222834146,115918987,1942160349,21400081,175441064,1317079476,-352321258,1005097082,846492929,22973183,-1959861295,-420490873,-352145397,-1978997248,-414652164,-1965229592,
                  1072170878,75401959,-2081998360,1072169926,-2142877977,1963262334,-415963131,-1952441621,605796096,-1224182592,1967171619,-399853822,2089477906,-418584575,-402264445,393544135,
                  -1090517063,-152567742,-386173733,-1997757492,-220051707,-1998112536,-402636506,-469041417,1448156867,1096188,-661733325,1449045235,-1207955271,-661778432,1499376883,-1583028193,
                  -1947703691,-165180765,225775812,1971846272,65830915,-2011970432,-428546009,199641776,-385876039,78699561,1727456306,1942160128,-351685628,6613038,45100661,1303841510,
                  -1964604952,-406845570,108923394,-2082048536,2078802886,80118758,-2082048536,1525155822,-2129758977,71246,4269704,184444648,-504839196,6601178,1960527080,-1258692090,
                  -401020032,129016596,108956398,-387566104,125108467,-1476339480,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1562318848,280518,1962916840,1013982219,-394300048,
                  2054553520,-388329496,663397062,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,1340604420,-1208329257,-439031793,-1073250678,2114585319,-439818234,-1969057304,
                  -1075313537,2095643621,859010304,1552557787,21400073,74711868,343213372,-1572607917,-2146127781,41222908,-667283536,-1014627725,57989899,-388562456,-1062731723,717439156,
                  707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-447682552,-352320839,4366851,-488293400,
                  4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474000,-387156661,-2135631279,4073088,-1008465281,707406378,
                  707406378,-550884822,251798786,-162201829,367593487,1256605337,-1209646395,-454760445,-1008407064,-1,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-1,-1,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
                  -2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-1947625530,503774119,1398167381,-347057583,-76,-1,-1,-1,
                  -1,-1,-1,-1,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,-907477884,
                  47873,-1897922376,-1437222696,1595,-315467147,134794,-1106648639,1340604416,-1958120191,1223459801,-796070773,-41172850,1220132915,-1951730944,276598261,71681574,
                  96937486,-970522625,-1919285947,-970581892,654181445,-64057,88458790,-1954040686,-840314421,1220838165,-2065243728,-2065243472,-1900019528,-1437222696,1595,-1557643,
                  842429696,34507501,165789952,1006632888,723940568,1925266371,264471328,-990335,738197432,1925266371,48656,1962983912,-387329784,333971618,17426432,-402623256,
                  1583284457,1482381658,-1017307385,16115742,-1912602440,-1899459392,4243416,-1559917786,-947687132,93005314,-1049549149,-1014954773,-1993940992,8175389,-1559917786,-947687128,
                  93005314,644950691,213851529,93005313,-2089735005,-1960443193,1898881797,-1340241626,528803555,243985714,-507445246,82034953,-2084316925,527696123,-3964597,14909711,
                  216777200,721424568,-268387901,-524303986,1032529663,-1023047642,855665384,-536823562,-74727282,243985714,-507445246,-1012534520,861032784,-805131054,-763036702,-1017620134,
                  1465255454,-1073694383,-315440754,34507302,165789952,-1961432701,-1899393799,-533807399,-218102855,1583307175,1405296391,1348926643,-90438059,-54657229,-1801786894,1717372829,
                  -466461864,-21802045,-1286347541,-387978241,-4980699,203690100,205259188,45353076,41223336,-997588812,1355015218,-117511942,1692836784,-87860997,-1325861912,-463149395,
                  1946265700,-345971708,-119346954,1692837296,1375263720,-467201863,-519985052,41179642,-1672453916,-1325873176,241493678,-352320536,1489997826,-15365,16777216,33554432,
                  67108864,134217728,268435456,536870912,1073741824,-2147483648,65536,131072,262144,524288,1048576,2097152,4194304,8388608,256,512,
                  1024,2048,4096,8192,16384,32768,1,2,4,8,16,32,64,128,0,-16777217,
                  -33554433,-67108865,-134217729,-268435457,-536870913,-1073741825,2147483647,-65537,-131073,-262145,-524289,-1048577,-2097153,-4194305,-8388609,-257,
                  -513,-1025,-2049,-4097,-8193,-16385,-32769,-2,-3,-5,-9,-17,-33,-65,-129,-1,
                  -2065269328,788521150,-147966837,1947140100,32565507,-2132410192,369168174,537855870,68864,-369090033,2684076,-1912600392,-1973295912,-435680032,41057,1642520710,
                  -2134842240,57950460,-2147382551,1073742350,-1912588104,536918464,-211356109,-1174622938,-13426688,-1431652250,-211375446,-661952853,-1912588104,-1175047208,-1385816064,1958951782,
                  9824515,-352160695,536918513,-1201209549,1840672182,1722544998,951638155,869830144,536918518,996584806,1231975875,-185925004,857735353,1438148351,1716868437,-1956205581,
                  3717336,-164374386,1713373369,-1019517267,1950959477,-1191908606,-661782480,-1192003397,2092564484,-1107348736,552203629,8174081,-369789251,-13434601,-1124041542,-1964378751,
                  -1172933902,-1933770628,-226498059,-75429006,208991228,-336331589,-436096826,10217856,-1912600392,645932736,-1195442174,-1064435648,-1157626696,2092626808,-1107348736,-857082431,
                  8174080,-369767747,146276547,-1899918336,243279552,-1908408318,309441,855669946,-169361921,1928471785,8174256,-369757507,-1519193575,-1157626696,2092626940,-1107348736,
                  -1997933051,8174080,-369750339,146276479,-1899918336,645932736,-1900085246,309441,855669946,-164905473,1928454377,8174091,-369740099,57930197,-1191223575,-661782520,
                  140928,444095,-2132476928,91553852,134784,1095744,-661733234,1711284239,-475,2232191,16149994,17772272,-469269474,1946172544,-1177406709,-793051117,
                  -792598346,-2065269072,-2132361166,-1175221309,-211419103,-176862555,-930352245,-5901466,862330597,28862189,1711276032,12174643,-1627442368,1724961126,-453385557,-435418015,
                  -420273055,29058657,1711276032,-1956192973,857671365,-1175155978,-427147264,-741251426,1727302303,-1020041555,343273697,1084776932,47206,141885440,-1451602586,-1010814177,
                  1342178502,202138084,-215719450,1717068262,427147275,-2037398296,266633440,78771763,91479248,872014406,-339725578,82739985,-1476393799,1711764991,1174988993,-930417182,
                  -115353973,253649091,-1331687512,-1199249803,-661782464,6760073,6887052,-1342177095,1367664246,1502182376,-914356620,9496833,-2065270864,1507537745,108321547,-352138880,
                  -1047883775,112492774,41208074,2024802228,-464485146,-434065312,-191698844,27813092,1625619060,-863969142,-2115481596,1622169844,-397384474,-1973881736,1482745540,-1998024784,
                  -194320195,1692860080,-1325536268,-125507975,-1332738325,-108730758,-1912586056,1763086040,1730579200,-352095744,-2132504535,-1040791414,-1173523454,-1933901824,1751478,-187742488,
                  1946272246,47629,-1179218757,887619610,2075194575,-1592818458,1629464847,47299,821566927,8781824,-256,-1,-1,-1,-1,-1,
                  -1205928961,-661782464,520098721,-1506613041,707406543,707406378,2147254314,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
                  182879,-121308990,-1587939130,-121069095,-1563188594,-1532189539,-121702210,-121702210,-121702210,-120784694,-58677880,-117148337,-83885366,-889616716,855310338,1600111588,
                  -152311573,-219417365,-286527253,-466460833,536932815,554180881,553722116,-1592680193,-1593663120,-1778409215,-893741638,567923929,-872802310,-738733065,167772407,1018,
                  992,-436162360,-436162428,-1643989883,-1001222,-1192230641,-661782464,78144740,-359767435,-2065301072,1692838576,-452984903,1963042916,-336010747,45125693,1625588966,
                  -2065300560,-2065300304,-1897922376,-2116340776,1968548415,-109658872,-47251666,-435834632,-939476860,-617359218,1437220737,1992099957,788475641,112261377,1085834470,-1193767424,
                  250281984,-2065299536,1894158256,15401195,-661949980,1894158256,15401195,1910898864,1963588480,-1433081597,-2065299280,1963654016,-1873286397,-236535758,-1896873800,-1093520424,
                  196737233,-796218368,-102568276,-1191141190,196083720,-1073025810,548406644,-2081168658,91496698,-352313158,-436162330,-1331632608,-2138774007,41290747,-13500237,-1959861296,
                  -1191647305,-661782464,179365631,1085834470,-2585088,-1342150866,-1333467637,-350165472,-435375895,610395268,-1335761165,-848239090,-231,-1,-1,-1,
                  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,-2122448896,-1715633755,-8487295,
                  -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
                  -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
                  2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
                  403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
                  108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
                  1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
                  -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
                  805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
                  1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
                  -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
                  1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
                  1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
                  1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
                  -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
                  1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
                  1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
                  1541681918,-644039217,496825500,1922912413,-241325411,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
                  1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,-576704949,-28645785,1962950670,-1173573474,
                  -152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-5670,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1912870661,281874356,-1269699446,1494273283,
                  -1261292718,-1273967358,-401552120,393383402,-717569282,-689377934,839676557,-2134442286,-546170370,445499624,45374153,-1996877619,520159246,-12447,0,196608,
                  -1,-1,-1,-1,-1,-1,-1,-1623725569,2143190966,541733959,1329804080,1363234893,16319978,825237744,792212015,-1728301000]
                  }
                • 1988-01-28.nasm
                  ;
                  ;   ROM BIOS for Compaq DeskPro 386-16
                  ;   Rev J.4, from parts 109592-001 and 109591-001, dated '01/28/88'
                  ;   (C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86,87-All rights reserved.
                  ;
                  ;   Listing produced by NDISASM, 2015-Apr-04
                  ;   Additional post-processing performed by the PCjs TextOut module
                  ;   All post-processing, comments, etc copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
                  ;
                  ;   This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
                  ;   at <http://jsmachines.net/> and <http://pcjs.org/>.
                  ;
                  ;   PCjs is free software: you can redistribute it and/or modify it under the terms of the
                  ;   GNU General Public License as published by the Free Software Foundation, either version 3
                  ;   of the License, or (at your option) any later version.
                  ;
                  ;   PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
                  ;   even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                  ;   GNU General Public License for more details.
                  ;
                  ;   You should have received a copy of the GNU General Public License along with PCjs.  If not,
                  ;   see <http://www.gnu.org/licenses/gpl.html>.
                  ;
                  
                  ;
                  ;   Overview
                  ;   --------
                  ;   This 32Kb ROM image is ORG'ed at 0x8000, because most of its code is designed to run
                  ;   at real-mode addresses F000:8000 through F000:FFFF.
                  ;
                  ;   And even though the 80386 resets with CS:IP set to F000:FFF0, the physical base address
                  ;   of CS is set to %FFFF0000, which means the ROM must also be mapped at physical addresses
                  ;   %FFFF8000 through %FFFFFFFF.
                  ;
                  ;   Additionally, DeskPro 386 systems mirror this 32Kb ROM at real-mode address F000:0000
                  ;   through F000:7FFF.  And that region is similarly mirrored at physical addresses %FFFF0000
                  ;   through %FFFF7FFFF.
                  ;
                  ;   In other words, both 32Kb halves of the last 64Kb of both the first and last megabyte
                  ;   of the 80386's 4Gb address space are physically mapped to this ROM image.
                  ;
                  ;   Finally, the DeskPro 386 has a "RAM Relocation" feature that allows 128Kb of RAM at
                  ;   %00FE0000 through %00FFFFFF to be mapped to %000E0000 through %000FFFFF, effectively
                  ;   replacing the ROM in the first megabyte with write-protected RAM; the top 64Kb of that
                  ;   RAM must first be initialized with the 64Kb at %000F0000 prior to remapping.  It's also
                  ;   possible to copy external ROMs from %000C0000 through %000EFFFF into the bottom 64Kb of
                  ;   that RAM, but this is only done for ROMs known to contain relocatable code; eg, a Compaq
                  ;   Video Graphics Controller (VGC) Board.
                  ;
                  ;   Every DeskPro 386 system must have a MINIMUM of 1Mb of RAM, of which either 256Kb,
                  ;   512Kb, or 640Kb can be physically mapped as conventional memory (at the bottom of the
                  ;   first megabyte), with the remainder (either 768Kb, 512Kb, or 384Kb) physically mapped
                  ;   to the top of the 16th megabyte (ending at address %00FFFFFF), the last 128Kb of which
                  ;   is used by the "RAM Relocation" feature.  The remaining memory immediately below that
                  ;   128Kb (ie, below %00FE0000) can only be accessed by special system software, such as CEMM.
                  ;
                  ;   Compaq refers to that remaining memory as "Compaq Built-in Memory".
                  ;
                  ;   As the Compaq 386/25 TechRef explains:
                  ;
                  ;	A data structure in memory indicates how much of the COMPAQ Built-in Memory (F40000h
                  ;	to FE0000h) is [available and] in use. This memory is allocated downward (decreasing
                  ;	addresses) starting at address FE0000h. Applications developed specifically for the
                  ;	COMPAQ DESKPRO	386/25 Personal Computer, such as CEMM, read and modify this data
                  ;	structure to allocate and deallocate portions of the COMPAQ Built-in Memory for their
                  ;	use. The built-in memory data structure is located in write-protected memory at segment
                  ;	F000h. The offset is specified by the word at F000:FFE0.
                  ;
                  ;	The format of the data structure is given [below]. Because the data structure resides
                  ;	in write-protected memory, the write-protection must be disabled when updating the data
                  ;	structure.
                  ;
                  ;	Word	Description
                  ;	----	-----------
                  ;	   0	FFFFh indicates that no COMPAQ Built-in Memory is available. Otherwise, words
                  ;		1, 2, and 3 define the amount of memory available.
                  ;
                  ;	   1	Total COMPAQ Built-in Memory size in 16-byte blocks.
                  ;
                  ;	   2	Available built-in memory in 16-byte blocks.
                  ;
                  ;	   3	Address for the last-used byte. The byte below (lower address) this byte is the
                  ;		first free byte in the COMPAQ Built-in Memory.
                  ;
                  	org	0x8000
                  
                  CMD8042_WRITE_OUTPORT	equ	0xD1
                  
                  	xchg	bh,bl			; 00008000  86FB  '..'
                  	xor	bh,bh			; 00008002  32FF  '2.'
                  	shl	bx,1			; 00008004  D1E3  '..'
                  	mov	dx,[bx+0x50]		; 00008006  8B975000  '..P.'
                  	mov	[bp+0x2],dx		; 0000800A  895602  '.V.'
                  	mov	cx,[0x60]		; 0000800D  8B0E6000  '..`.'
                  	mov	[bp+0x4],cx		; 00008011  894E04  '.N.'
                  	mov	word [bp+0x0],0x0	; 00008014  C746000000  '.F...'
                  	ret				; 00008019  C3  '.'
                  
                  	mov	al,0xe			; 0000801A  B00E  '..'
                  	out	dx,al			; 0000801C  EE  '.'
                  	inc	dx			; 0000801D  42  'B'
                  	in	al,dx			; 0000801E  EC  '.'
                  	mov	ah,al			; 0000801F  8AE0  '..'
                  	dec	dx			; 00008021  4A  'J'
                  	mov	al,0xf			; 00008022  B00F  '..'
                  	out	dx,al			; 00008024  EE  '.'
                  	inc	dx			; 00008025  42  'B'
                  	in	al,dx			; 00008026  EC  '.'
                  	ret				; 00008027  C3  '.'
                  
                  ;
                  ;   Protected-mode memory probe
                  ;
                  x8028:	push	ax			; 00008028  50  'P'
                  	push	bx			; 00008029  53  'S'
                  	push	cx			; 0000802A  51  'Q'
                  	push	es			; 0000802B  06  '.'
                  	mov	ax,0x48			; 0000802C  B84800  '.H.'
                  	mov	es,ax			; 0000802F  8EC0  '..'
                  
                  	mov	cl,0x2			; 00008031  B102  '..'
                  	mov	ch,0x9			; 00008033  B509  '..'
                  	mov	al,0x1			; 00008035  B001  '..'
                  	call	x8051			; 00008037  E81700  '...'
                  
                  	add	ax,0x80			; 0000803A  058000  '...'
                  	mov	[0x7c],ax		; 0000803D  A37C00  '.|.'
                  
                  	mov	cl,0x10			; 00008040  B110  '..'
                  	mov	ch,0xfd			; 00008042  B5FD  '..'
                  	mov	al,0x1			; 00008044  B001  '..'
                  	call	x8051			; 00008046  E80800  '...'
                  
                  	mov	[0x7e],ax		; 00008049  A37E00  '.~.'
                  
                  	pop	es			; 0000804C  07  '.'
                  	pop	cx			; 0000804D  59  'Y'
                  	pop	bx			; 0000804E  5B  '['
                  	pop	ax			; 0000804F  58  'X'
                  	ret				; 00008050  C3  '.'
                  
                  ;
                  ;   (AL) == block increment (eg, 0x1)
                  ;   (CL) == starting 64Kb block number (eg, 0x02, or 0x10)
                  ;   (CH) == maximum 64Kb block number (eg, 0x09, or 0xFD)
                  ;
                  x8051:	push	bx			; 00008051  53  'S'
                  	push	dx			; 00008052  52  'R'
                  	push	bp			; 00008053  55  'U'
                  	mov	dl,al			; 00008054  8AD0  '..'
                  	mov	bp,es			; 00008056  8CC5  '..'
                  ;
                  ;   0x4C is the base portion of the descriptor at DS:0x48
                  ;
                  	mov	[0x4c],cl		; 00008058  880E4C00  '..L.'
                  x805c:	mov	es,bp			; 0000805C  8EC5  '..'
                  	mov	bx,0x0			; 0000805E  BB0000  '...'
                  	mov	word [es:bx],0x0	; 00008061  26C7070000  '&....'
                  	mov	word [es:bx+0x2],0xffff	; 00008066  26C74702FFFF  '&.G...'
                  	cld				; 0000806C  FC  '.'
                  	cld				; 0000806D  FC  '.'
                  	mov	bx,[es:bx]		; 0000806E  268B1F  '&..'
                  	cld				; 00008071  FC  '.'
                  	cld				; 00008072  FC  '.'
                  	cld				; 00008073  FC  '.'
                  	cld				; 00008074  FC  '.'
                  	cld				; 00008075  FC  '.'
                  	cmp	bx,byte +0x0		; 00008076  83FB00  '...'
                  	mov	byte [es:0x0],0x0	; 00008079  26C606000000  '&.....'
                  	jz	x8089			; 0000807F  7408  't.'
                  	mov	al,[0x4c]		; 00008081  A04C00  '.L.'
                  	sub	al,cl			; 00008084  2AC1  '*.'
                  	jmp	short x809c		; 00008086  EB14  '..'
                  
                  	nop				; 00008088  90  '.'
                  x8089:	cmp	[0x4c],ch		; 00008089  382E4C00  '8.L.'
                  	jz	x8095			; 0000808D  7406  't.'
                  ;
                  ;   Bump the base portion of the descriptor at DS:0x48 to the next 64Kb block
                  ;
                  	add	[0x4c],dl		; 0000808F  00164C00  '..L.'
                  	jmp	short x805c		; 00008093  EBC7  '..'
                  
                  x8095:	mov	al,[0x4c]		; 00008095  A04C00  '.L.'
                  	sub	al,cl			; 00008098  2AC1  '*.'
                  	inc	al			; 0000809A  FEC0  '..'
                  x809c:	xor	ah,ah			; 0000809C  32E4  '2.'
                  	shl	ax,0x6			; 0000809E  C1E006  '...'
                  	pop	bp			; 000080A1  5D  ']'
                  	pop	dx			; 000080A2  5A  'Z'
                  	pop	bx			; 000080A3  5B  '['
                  	ret				; 000080A4  C3  '.'
                  
                  ;
                  ;   Display (AX) as a 5-digit, zero-padded number in the top-left corner of
                  ;   the display, using (ES) as the segment of the video buffer.
                  ;
                  ;   The number is followed by " KB OK", for a total of 11 (0x0B) characters.
                  ;
                  ;   This function works for both Mono and CGA displays because it writes to both
                  ;   video buffers (%B0000 via ES:0000 and %B8000 via ES:8000).
                  ;
                  ;   Called by CS:DBD6 in the normal case, where CS == 0x30 and ES == 0x40.
                  ;
                  x80a5:	push	bx			; 000080A5  53  'S'
                  	push	cx			; 000080A6  51  'Q'
                  	push	dx			; 000080A7  52  'R'
                  	push	si			; 000080A8  56  'V'
                  	push	di			; 000080A9  57  'W'
                  	mov	bx,0xa			; 000080AA  BB0A00  '.',0x0A,'.'
                  	mov	cx,0x5			; 000080AD  B90500  '...'
                  	mov	di,0x8			; 000080B0  BF0800  '...'
                  x80b3:	xor	dx,dx			; 000080B3  33D2  '3.'
                  	div	bx			; 000080B5  F7F3  '..'
                  	add	dl,0x30			; 000080B7  80C230  '..0'
                  	mov	dh,0x7			; 000080BA  B607  '..'
                  	mov	[di+0x93],dx		; 000080BC  89959300  '....'
                  	dec	di			; 000080C0  4F  'O'
                  	dec	di			; 000080C1  4F  'O'
                  	loop	x80b3			; 000080C2  E2EF  '..'
                  	cld				; 000080C4  FC  '.'
                  	mov	si,0x93			; 000080C5  BE9300  '...'
                  	mov	di,0x0			; 000080C8  BF0000  '...'
                  	mov	cx,0xb			; 000080CB  B90B00  '...'
                  	rep	movsw			; 000080CE  F3A5  '..'
                  	cld				; 000080D0  FC  '.'
                  	mov	si,0x93			; 000080D1  BE9300  '...'
                  	mov	di,0x8000		; 000080D4  BF0080  '...'
                  	mov	cx,0xb			; 000080D7  B90B00  '...'
                  	rep	movsw			; 000080DA  F3A5  '..'
                  	pop	di			; 000080DC  5F  '_'
                  	pop	si			; 000080DD  5E  '^'
                  	pop	dx			; 000080DE  5A  'Z'
                  	pop	cx			; 000080DF  59  'Y'
                  	pop	bx			; 000080E0  5B  '['
                  	ret				; 000080E1  C3  '.'
                  
                  ;
                  ;   Use INT 0x15, (AH) == 0x89, to enter protected-mode
                  ;
                  ;   Returns ZF set if successful
                  ;
                  ;   See Compaq 386/25 TechRef, p.4-98 for details
                  ;
                  x80e2:	push	bx			; 000080E2  53  'S'
                  	push	cx			; 000080E3  51  'Q'
                  	push	dx			; 000080E4  52  'R'
                  	push	di			; 000080E5  57  'W'
                  	push	si			; 000080E6  56  'V'
                  	call	x8102			; 000080E7  E81800  '...'
                  	mov	bh,0x8			; 000080EA  B708  '..'
                  	mov	bl,0x70			; 000080EC  B370  '.p'
                  	mov	ax,0x1c00		; 000080EE  B8001C  '...'
                  	mov	es,ax			; 000080F1  8EC0  '..'
                  	mov	si,0x0			; 000080F3  BE0000  '...'
                  	mov	ah,0x89			; 000080F6  B489  '..'
                  	int	0x15			; 000080F8  CD15  '..'
                  	or	ah,ah			; 000080FA  0AE4  0x0A,'.'
                  	pop	si			; 000080FC  5E  '^'
                  	pop	di			; 000080FD  5F  '_'
                  	pop	dx			; 000080FE  5A  'Z'
                  	pop	cx			; 000080FF  59  'Y'
                  	pop	bx			; 00008100  5B  '['
                  	ret				; 00008101  C3  '.'
                  
                  ;
                  ;   Descriptor table initialization
                  ;
                  ;   Used by x80e2 to prepare for an INT 0x15 call to enter protected-mode
                  ;
                  x8102:	pusha				; 00008102  60  '`'
                  	push	ds			; 00008103  1E  '.'
                  	push	es			; 00008104  06  '.'
                  	mov	ax,0x1c00		; 00008105  B8001C  '...'
                  	mov	ds,ax			; 00008108  8ED8  '..'
                  	mov	es,ax			; 0000810A  8EC0  '..'
                  	cld				; 0000810C  FC  '.'
                  	xor	ax,ax			; 0000810D  33C0  '3.'
                  	mov	di,0x0			; 0000810F  BF0000  '...'
                  	mov	cx,0x4			; 00008112  B90400  '...'
                  	rep	stosw			; 00008115  F3AB  '..'
                  	mov	si,0x8			; 00008117  BE0800  '...'
                  	mov	ax,0x1c00		; 0000811A  B8001C  '...'
                  	mov	bx,0x10			; 0000811D  BB1000  '...'
                  	mul	bx			; 00008120  F7E3  '..'
                  	add	ax,0x0			; 00008122  050000  '...'
                  	adc	dl,0x0			; 00008125  80D200  '...'
                  	mov	[si+0x2],ax		; 00008128  894402  '.D.'
                  	mov	[si+0x4],dl		; 0000812B  885404  '.T.'
                  	mov	byte [si+0x5],0x92	; 0000812E  C6440592  '.D..'
                  	mov	word [si],0x5f		; 00008132  C7045F00  '.._.'
                  	mov	si,0x10			; 00008136  BE1000  '...'
                  	mov	ax,0xf000		; 00008139  B800F0  '...'
                  	mov	bx,0x10			; 0000813C  BB1000  '...'
                  	mul	bx			; 0000813F  F7E3  '..'
                  	add	ax,0xf821		; 00008141  0521F8  '.!.'
                  	adc	dl,0x0			; 00008144  80D200  '...'
                  	mov	[si+0x2],ax		; 00008147  894402  '.D.'
                  	mov	[si+0x4],dl		; 0000814A  885404  '.T.'
                  	mov	byte [si+0x5],0x92	; 0000814D  C6440592  '.D..'
                  	mov	word [si],0x7		; 00008151  C7040700  '....'
                  	mov	si,0x30			; 00008155  BE3000  '.0.'
                  	mov	ax,cs			; 00008158  8CC8  '..'
                  	mov	bl,0x9a			; 0000815A  B39A  '..'
                  	call	x81cb			; 0000815C  E86C00  '.l.'
                  	mov	si,0x18			; 0000815F  BE1800  '...'
                  	mov	ax,0x1c00		; 00008162  B8001C  '...'
                  	mov	bl,0x92			; 00008165  B392  '..'
                  	call	x81cb			; 00008167  E86100  '.a.'
                  	mov	si,0x20			; 0000816A  BE2000  '. .'
                  	mov	ax,0x40			; 0000816D  B84000  '.@.'
                  	mov	bl,0x92			; 00008170  B392  '..'
                  	call	x81cb			; 00008172  E85600  '.V.'
                  	mov	si,0x28			; 00008175  BE2800  '.(.'
                  	mov	ax,ss			; 00008178  8CD0  '..'
                  	mov	bl,0x92			; 0000817A  B392  '..'
                  	call	x81cb			; 0000817C  E84C00  '.L.'
                  	mov	si,0x40			; 0000817F  BE4000  '.@.'
                  	mov	ax,0xb000		; 00008182  B800B0  '...'
                  	mov	bl,0x92			; 00008185  B392  '..'
                  	call	x81cb			; 00008187  E84100  '.A.'
                  	mov	si,0x48			; 0000818A  BE4800  '.H.'
                  	mov	ax,0x2000		; 0000818D  B80020  '.. '
                  	mov	bl,0x92			; 00008190  B392  '..'
                  	call	x81cb			; 00008192  E83600  '.6.'
                  	mov	si,0x50			; 00008195  BE5000  '.P.'
                  	mov	ax,0xc000		; 00008198  B800C0  '...'
                  	mov	bl,0x92			; 0000819B  B392  '..'
                  	call	x81cb			; 0000819D  E82B00  '.+.'
                  	mov	byte [0x54],0xc0	; 000081A0  C6065400C0  '..T..'
                  	mov	byte [0x57],0x80	; 000081A5  C606570080  '..W..'
                  	mov	si,0x58			; 000081AA  BE5800  '.X.'
                  	mov	ax,0xf000		; 000081AD  B800F0  '...'
                  	mov	bl,0x92			; 000081B0  B392  '..'
                  	call	x81cb			; 000081B2  E81600  '...'
                  	mov	ax,cs			; 000081B5  8CC8  '..'
                  	mov	ds,ax			; 000081B7  8ED8  '..'
                  	mov	si,0xf821		; 000081B9  BE21F8  '.!.'
                  	mov	di,0xa9			; 000081BC  BFA900  '...'
                  	mov	cx,0x7			; 000081BF  B90700  '...'
                  	inc	cx			; 000081C2  41  'A'
                  	shr	cx,1			; 000081C3  D1E9  '..'
                  	rep	movsw			; 000081C5  F3A5  '..'
                  	pop	es			; 000081C7  07  '.'
                  	pop	ds			; 000081C8  1F  '.'
                  	popa				; 000081C9  61  'a'
                  	ret				; 000081CA  C3  '.'
                  
                  ;
                  ;   Descriptor initializer
                  ;
                  ;   Used by x8102 to initialize a descriptor table
                  ;
                  x81cb:	mov	word [si],0xffff	; 000081CB  C704FFFF  '....'
                  	mov	bh,ah			; 000081CF  8AFC  '..'
                  	shl	ax,0x4			; 000081D1  C1E004  '...'
                  	shr	bh,0x4			; 000081D4  C0EF04  '...'
                  	mov	[si+0x2],ax		; 000081D7  894402  '.D.'
                  	mov	[si+0x4],bh		; 000081DA  887C04  '.|.'
                  	mov	[si+0x5],bl		; 000081DD  885C05  '.\.'
                  	mov	word [si+0x6],0x0	; 000081E0  C744060000  '.D...'
                  	ret				; 000081E5  C3  '.'
                  
                  x81e6:	push	ax			; 000081E6  50  'P'
                  	mov	al,0x8e			; 000081E7  B08E  '..'
                  	call	xb544			; 000081E9  E85833  '.X3'
                  	test	al,0xc0			; 000081EC  A8C0  '..'
                  	jz	x81f3			; 000081EE  7403  't.'
                  	stc				; 000081F0  F9  '.'
                  	jmp	short x8212		; 000081F1  EB1F  '..'
                  
                  x81f3:	mov	al,0x96			; 000081F3  B096  '..'
                  	call	xb544			; 000081F5  E84C33  '.L3'
                  	mov	ah,al			; 000081F8  8AE0  '..'
                  	mov	al,0x95			; 000081FA  B095  '..'
                  	call	xb544			; 000081FC  E84533  '.E3'
                  	mov	[0x76],ax		; 000081FF  A37600  '.v.'
                  	mov	al,0x98			; 00008202  B098  '..'
                  	call	xb544			; 00008204  E83D33  '.=3'
                  	mov	ah,al			; 00008207  8AE0  '..'
                  	mov	al,0x97			; 00008209  B097  '..'
                  	call	xb544			; 0000820B  E83633  '.63'
                  	mov	[0x78],ax		; 0000820E  A37800  '.x.'
                  	clc				; 00008211  F8  '.'
                  x8212:	pop	ax			; 00008212  58  'X'
                  	ret				; 00008213  C3  '.'
                  
                  x8214:	push	ax			; 00008214  50  'P'
                  	mov	al,0x8e			; 00008215  B08E  '..'
                  	call	xb544			; 00008217  E82A33  '.*3'
                  	mov	ah,al			; 0000821A  8AE0  '..'
                  	or	ah,0x10			; 0000821C  80CC10  '...'
                  	or	cl,cl			; 0000821F  0AC9  0x0A,'.'
                  	jnz	x8226			; 00008221  7503  'u.'
                  	and	ah,0xef			; 00008223  80E4EF  '...'
                  x8226:	mov	al,0x8e			; 00008226  B08E  '..'
                  	call	xb549			; 00008228  E81E33  '..3'
                  	pop	ax			; 0000822B  58  'X'
                  	ret				; 0000822C  C3  '.'
                  
                  x822d:	push	si			; 0000822D  56  'V'
                  	call	xc704			; 0000822E  E8D344  '..D'
                  	pop	bx			; 00008231  5B  '['
                  	call	x8257			; 00008232  E82200  '.".'
                  	mov	dx,0x0			; 00008235  BA0000  '...'
                  	mov	bx,err201		; 00008238  BBA6B6  '...'
                  	mov	cx,err201_len		; 0000823B  B91100  '...'
                  	call	xc745			; 0000823E  E80445  '..E'
                  	ret				; 00008241  C3  '.'
                  
                  x8242:	push	si			; 00008242  56  'V'
                  	call	xc704			; 00008243  E8BE44  '..D'
                  	pop	bx			; 00008246  5B  '['
                  	call	x8257			; 00008247  E80D00  '.',0x0D,'.'
                  	mov	dx,0x0			; 0000824A  BA0000  '...'
                  	mov	bx,err203		; 0000824D  BBB7B6  '...'
                  	mov	cx,err203_len		; 00008250  B91900  '...'
                  	call	xc745			; 00008253  E8EF44  '..D'
                  	ret				; 00008256  C3  '.'
                  
                  x8257:	mov	ax,[0x60]		; 00008257  A16000  '.`.'
                  	and	al,0xc0			; 0000825A  24C0  '$.'
                  	cmp	al,0x40			; 0000825C  3C40  '<@'
                  	jz	x8263			; 0000825E  7403  't.'
                  	jmp	x82e7			; 00008260  E98400  '...'
                  
                  x8263:	mov	si,0xb706		; 00008263  BE06B7  '...'
                  	cmp	bl,0xfe			; 00008266  80FBFE  '...'
                  	jz	x82de			; 00008269  7473  'ts'
                  	cmp	bl,0xff			; 0000826B  80FBFF  '...'
                  	jz	x82de			; 0000826E  746E  'tn'
                  	or	bl,bl			; 00008270  0ADB  0x0A,'.'
                  	jz	x82de			; 00008272  746A  'tj'
                  	mov	bh,0x10			; 00008274  B710  '..'
                  	mov	al,ah			; 00008276  8AC4  '..'
                  	and	al,0x3			; 00008278  2403  '$.'
                  	cmp	al,0x3			; 0000827A  3C03  '<.'
                  	jz	x82e7			; 0000827C  7469  'ti'
                  	cmp	al,0x2			; 0000827E  3C02  '<.'
                  	jz	x8284			; 00008280  7402  't.'
                  	mov	bh,0x40			; 00008282  B740  '.@'
                  x8284:	cmp	bl,bh			; 00008284  3ADF  ':.'
                  	jc	x82de			; 00008286  7256  'rV'
                  	mov	si,0xb713		; 00008288  BE13B7  '...'
                  	add	bh,0x10			; 0000828B  80C710  '...'
                  	mov	al,ah			; 0000828E  8AC4  '..'
                  	and	al,0xc			; 00008290  240C  '$.'
                  	shr	al,0x2			; 00008292  C0E802  '...'
                  	cmp	al,0x3			; 00008295  3C03  '<.'
                  	jz	x82e7			; 00008297  744E  'tN'
                  	cmp	al,0x2			; 00008299  3C02  '<.'
                  	jz	x82a0			; 0000829B  7403  't.'
                  	add	bh,0x30			; 0000829D  80C730  '..0'
                  x82a0:	cmp	bl,bh			; 000082A0  3ADF  ':.'
                  	jc	x82de			; 000082A2  723A  'r:'
                  	mov	si,0xb71d		; 000082A4  BE1DB7  '...'
                  	add	bh,0x10			; 000082A7  80C710  '...'
                  	mov	al,ah			; 000082AA  8AC4  '..'
                  	and	al,0x30			; 000082AC  2430  '$0'
                  	shr	al,0x4			; 000082AE  C0E804  '...'
                  	cmp	al,0x3			; 000082B1  3C03  '<.'
                  	jz	x82e7			; 000082B3  7432  't2'
                  	cmp	al,0x2			; 000082B5  3C02  '<.'
                  	jz	x82bc			; 000082B7  7403  't.'
                  	add	bh,0x30			; 000082B9  80C730  '..0'
                  x82bc:	cmp	bl,bh			; 000082BC  3ADF  ':.'
                  	jc	x82de			; 000082BE  721E  'r.'
                  	mov	si,0xb727		; 000082C0  BE27B7  '.',0x27,'.'
                  	add	bh,0x10			; 000082C3  80C710  '...'
                  	mov	al,ah			; 000082C6  8AC4  '..'
                  	and	al,0xc0			; 000082C8  24C0  '$.'
                  	shr	al,0x6			; 000082CA  C0E806  '...'
                  	cmp	al,0x3			; 000082CD  3C03  '<.'
                  	jz	x82e7			; 000082CF  7416  't.'
                  	cmp	al,0x2			; 000082D1  3C02  '<.'
                  	jz	x82da			; 000082D3  7405  't.'
                  	add	bh,0x30			; 000082D5  80C730  '..0'
                  	jz	x82de			; 000082D8  7404  't.'
                  x82da:	cmp	bl,bh			; 000082DA  3ADF  ':.'
                  	jnc	x82e7			; 000082DC  7309  's.'
                  x82de:	push	ds			; 000082DE  1E  '.'
                  	mov	ax,cs			; 000082DF  8CC8  '..'
                  	mov	ds,ax			; 000082E1  8ED8  '..'
                  	call	xe282			; 000082E3  E89C5F  '.._'
                  	pop	ds			; 000082E6  1F  '.'
                  x82e7:	ret				; 000082E7  C3  '.'
                  
                  x82e8:	push	ds			; 000082E8  1E  '.'
                  	mov	ax,cs			; 000082E9  8CC8  '..'
                  	mov	ds,ax			; 000082EB  8ED8  '..'
                  	mov	si,0x8000		; 000082ED  BE0080  '...'
                  	xor	ah,ah			; 000082F0  32E4  '2.'
                  	mov	cx,0x8000		; 000082F2  B90080  '...'
                  x82f5:	lodsb				; 000082F5  AC  '.'
                  	add	ah,al			; 000082F6  02E0  '..'
                  	loop	x82f5			; 000082F8  E2FB  '..'
                  	jz	x830a			; 000082FA  740E  't.'
                  	mov	dx,0x5000		; 000082FC  BA0050  '..P'
                  
                  	mov	bx,err101		; 000082FF  BB5AB7  '.Z.'
                  	mov	cx,err101_len		; 00008302  B90F00  '...'
                  	call	xc745			; 00008305  E83D44  '.=D'
                  x8308:	jmp	short x8308		; 00008308  Hang the machine
                  
                  x830a:	pop	ds			; 0000830A  1F  '.'
                  	ret				; 0000830B  C3  '.'
                  
                  	xor	[bx],al			; 0000830C  3007  '0.'
                  	xor	[bx],al			; 0000830E  3007  '0.'
                  	xor	[bx],al			; 00008310  3007  '0.'
                  	xor	[bx],al			; 00008312  3007  '0.'
                  	xor	[bx],al			; 00008314  3007  '0.'
                  	and	[bx],al			; 00008316  2007  ' .'
                  	dec	bx			; 00008318  4B  'K'
                  	pop	es			; 00008319  07  '.'
                  	inc	dx			; 0000831A  42  'B'
                  	pop	es			; 0000831B  07  '.'
                  	and	[bx],al			; 0000831C  2007  ' .'
                  	dec	di			; 0000831E  4F  'O'
                  	pop	es			; 0000831F  07  '.'
                  	dec	bx			; 00008320  4B  'K'
                  	pop	es			; 00008321  07  '.'
                  	mov	ah,[0x49]		; 00008322  8A264900  '.&I.'
                  	mov	[bp+0x1],ah		; 00008326  886601  '.f.'
                  	ret				; 00008329  C3  '.'
                  
                  	push	ds			; 0000832A  1E  '.'
                  	cmp	al,0x3			; 0000832B  3C03  '<.'
                  	ja	x838c			; 0000832D  775D  'w]'
                  	push	es			; 0000832F  06  '.'
                  	mov	bh,[bp+0x7]		; 00008330  8A7E07  '.~.'
                  	mov	ah,0x3			; 00008333  B403  '..'
                  	call	x83db			; 00008335  E8A300  '...'
                  	push	dx			; 00008338  52  'R'
                  	mov	dx,[bp+0x2]		; 00008339  8B5602  '.V.'
                  	mov	ah,0x2			; 0000833C  B402  '..'
                  	call	x83db			; 0000833E  E89A00  '...'
                  	mov	cx,[bp+0x4]		; 00008341  8B4E04  '.N.'
                  	jcxz	x837c			; 00008344  E336  '.6'
                  	mov	si,[bp+0xc]		; 00008346  8B760C  '.v.'
                  	mov	ax,[bp+0x10]		; 00008349  8B4610  '.F.'
                  	mov	ds,ax			; 0000834C  8ED8  '..'
                  	cld				; 0000834E  FC  '.'
                  x834f:	lodsb				; 0000834F  AC  '.'
                  	mov	bx,[bp+0x6]		; 00008350  8B5E06  '.^.'
                  	cmp	byte [bp+0x0],0x1	; 00008353  807E0001  '.~..'
                  	jna	x836c			; 00008357  7613  'v.'
                  	cmp	al,0x7			; 00008359  3C07  '<.'
                  	jz	x836c			; 0000835B  740F  't.'
                  	cmp	al,0x8			; 0000835D  3C08  '<.'
                  	jz	x836c			; 0000835F  740B  't.'
                  	cmp	al,0xa			; 00008361  3C0A  '<',0x0A
                  	jz	x836c			; 00008363  7407  't.'
                  	cmp	al,0xd			; 00008365  3C0D  '<',0x0D
                  	jz	x836c			; 00008367  7403  't.'
                  	xchg	ax,bx			; 00008369  93  '.'
                  	lodsb				; 0000836A  AC  '.'
                  	xchg	ax,bx			; 0000836B  93  '.'
                  x836c:	push	cx			; 0000836C  51  'Q'
                  	push	ds			; 0000836D  1E  '.'
                  	push	ax			; 0000836E  50  'P'
                  	mov	ax,0x40			; 0000836F  B84000  '.@.'
                  	mov	ds,ax			; 00008372  8ED8  '..'
                  	pop	ax			; 00008374  58  'X'
                  	call	x8395			; 00008375  E81D00  '...'
                  	pop	ds			; 00008378  1F  '.'
                  	pop	cx			; 00008379  59  'Y'
                  	loop	x834f			; 0000837A  E2D3  '..'
                  x837c:	pop	dx			; 0000837C  5A  'Z'
                  	pop	es			; 0000837D  07  '.'
                  	mov	bh,[bp+0x7]		; 0000837E  8A7E07  '.~.'
                  	test	byte [bp+0x0],0x1	; 00008381  F6460001  '.F..'
                  	jnz	x838c			; 00008385  7505  'u.'
                  	mov	ah,0x2			; 00008387  B402  '..'
                  	call	x83db			; 00008389  E84F00  '.O.'
                  x838c:	pop	ds			; 0000838C  1F  '.'
                  	mov	ah,[0x49]		; 0000838D  8A264900  '.&I.'
                  	mov	[bp+0x1],ah		; 00008391  886601  '.f.'
                  	ret				; 00008394  C3  '.'
                  
                  x8395:	cmp	al,0x7			; 00008395  3C07  '<.'
                  	jz	x83d4			; 00008397  743B  't;'
                  	cmp	al,0x8			; 00008399  3C08  '<.'
                  	db	't7<',0x0A,'t3<',0x0D,'t/'
                  	mov	cx,0x1			; 000083A5  B90100  '...'
                  	mov	ah,0x9			; 000083A8  B409  '..'
                  	call	x83db			; 000083AA  E82E00  '...'
                  	mov	ah,0x3			; 000083AD  B403  '..'
                  	call	x83db			; 000083AF  E82900  '.).'
                  	inc	dl			; 000083B2  FEC2  '..'
                  	cmp	dl,[0x4a]		; 000083B4  3A164A00  ':.J.'
                  	jnz	x83ce			; 000083B8  7514  'u.'
                  	xor	dl,dl			; 000083BA  32D2  '2.'
                  	inc	dh			; 000083BC  FEC6  '..'
                  	cmp	dh,0x19			; 000083BE  80FE19  '...'
                  	jnz	x83ce			; 000083C1  750B  'u.'
                  	dec	dh			; 000083C3  FECE  '..'
                  	mov	al,0xa			; 000083C5  B00A  '.',0x0A
                  	mov	ah,0xe			; 000083C7  B40E  '..'
                  	call	x83db			; 000083C9  E80F00  '...'
                  	xor	dl,dl			; 000083CC  32D2  '2.'
                  x83ce:	mov	ah,0x2			; 000083CE  B402  '..'
                  	call	x83db			; 000083D0  E80800  '...'
                  x83d3:	ret				; 000083D3  C3  '.'
                  
                  x83d4:	mov	ah,0xe			; 000083D4  B40E  '..'
                  	call	x83db			; 000083D6  E80200  '...'
                  	jmp	short x83d3		; 000083D9  EBF8  '..'
                  
                  x83db:	push	ax			; 000083DB  50  'P'
                  	push	bx			; 000083DC  53  'S'
                  	push	es			; 000083DD  06  '.'
                  	mov	bx,0x0			; 000083DE  BB0000  '...'
                  	mov	es,bx			; 000083E1  8EC3  '..'
                  	mov	bx,0x42			; 000083E3  BB4200  '.B.'
                  	mov	ax,cs			; 000083E6  8CC8  '..'
                  	cmp	[es:bx],ax		; 000083E8  263907  '&9.'
                  	pop	es			; 000083EB  07  '.'
                  	pop	bx			; 000083EC  5B  '['
                  	pop	ax			; 000083ED  58  'X'
                  	jz	x83f3			; 000083EE  7403  't.'
                  	int	0x10			; 000083F0  CD10  '..'
                  	ret				; 000083F2  C3  '.'
                  
                  x83f3:	pushf				; 000083F3  9C  '.'
                  	push	cs			; 000083F4  0E  '.'
                  	call	xf065			; 000083F5  E86D6C  '.ml'
                  	ret				; 000083F8  C3  '.'
                  
                  x83f9:	push	cs			; 000083F9  0E  '.'
                  	pop	ds			; 000083FA  1F  '.'
                  	cld				; 000083FB  FC  '.'
                  	mov	al,0xa0			; 000083FC  B0A0  '..'
                  	out	0x84,al			; 000083FE  E684  '..'
                  	mov	dx,0x3f2		; 00008400  BAF203  '...'
                  	mov	al,0x0			; 00008403  B000  '..'
                  	out	dx,al			; 00008405  EE  '.'
                  	mov	al,0xa1			; 00008406  B0A1  '..'
                  	out	0x84,al			; 00008408  E684  '..'
                  	mov	bx,0x64			; 0000840A  BB6400  '.d.'
                  	call	xc638			; 0000840D  E82842  '.(B'
                  	mov	al,0xc			; 00008410  B00C  '..'
                  	out	dx,al			; 00008412  EE  '.'
                  	mov	al,0xa2			; 00008413  B0A2  '..'
                  	out	0x84,al			; 00008415  E684  '..'
                  	mov	bx,0x64			; 00008417  BB6400  '.d.'
                  	call	xc638			; 0000841A  E81B42  '..B'
                  	mov	si,0x849f		; 0000841D  BE9F84  '...'
                  	mov	di,0x4			; 00008420  BF0400  '...'
                  	call	x8d8d			; 00008423  E86709  '.g.'
                  	jc	x847c			; 00008426  7254  'rT'
                  	mov	al,0x1c			; 00008428  B01C  '..'
                  	mov	dx,0x3f2		; 0000842A  BAF203  '...'
                  	out	dx,al			; 0000842D  EE  '.'
                  	mov	al,0xa3			; 0000842E  B0A3  '..'
                  	out	0x84,al			; 00008430  E684  '..'
                  	xor	bp,bp			; 00008432  33ED  '3.'
                  x8434:	call	x8d8d			; 00008434  E85609  '.V.'
                  	jc	x847c			; 00008437  7243  'rC'
                  	mov	bx,0x1f4		; 00008439  BBF401  '...'
                  	call	xc638			; 0000843C  E8F941  '..A'
                  	call	x8d8d			; 0000843F  E84B09  '.K.'
                  	jc	x847c			; 00008442  7238  'r8'
                  	mov	cx,0x64			; 00008444  B96400  '.d.'
                  x8447:	call	xe944			; 00008447  E8FA64  '..d'
                  	jc	x847c			; 0000844A  7230  'r0'
                  	loope	x8447			; 0000844C  E1F9  '..'
                  	jz	x847c			; 0000844E  742C  't,'
                  	call	x919a			; 00008450  E8470D  '.G',0x0D
                  	in	al,dx			; 00008453  EC  '.'
                  	test	al,0xc0			; 00008454  A8C0  '..'
                  	jnz	x845b			; 00008456  7503  'u.'
                  	in	al,dx			; 00008458  EC  '.'
                  	jmp	short x848e		; 00008459  EB33  '.3'
                  
                  x845b:	xor	bp,0x1			; 0000845B  81F50100  '....'
                  	jz	x8476			; 0000845F  7415  't.'
                  	cmp	al,0x70			; 00008461  3C70  '<p'
                  	jnz	x8476			; 00008463  7511  'u.'
                  	call	xe944			; 00008465  E8DC64  '..d'
                  	jc	x847c			; 00008468  7212  'r.'
                  	call	x919a			; 0000846A  E82D0D  '.-',0x0D
                  	in	al,dx			; 0000846D  EC  '.'
                  	mov	si,0x84a2		; 0000846E  BEA284  '...'
                  	mov	di,0x3			; 00008471  BF0300  '...'
                  	jmp	short x8434		; 00008474  EBBE  '..'
                  
                  x8476:	mov	al,0xa5			; 00008476  B0A5  '..'
                  	out	0x84,al			; 00008478  E684  '..'
                  	jmp	short x8480		; 0000847A  EB04  '..'
                  
                  x847c:	mov	al,0xa4			; 0000847C  B0A4  '..'
                  	out	0x84,al			; 0000847E  E684  '..'
                  x8480:	mov	bx,0xb82f		; 00008480  BB2FB8  './.'
                  	mov	cx,0x20			; 00008483  B92000  '. .'
                  	mov	dx,0x0			; 00008486  BA0000  '...'
                  	call	xc745			; 00008489  E8B942  '..B'
                  	jmp	short x8492		; 0000848C  EB04  '..'
                  
                  x848e:	mov	al,0xa6			; 0000848E  B0A6  '..'
                  	out	0x84,al			; 00008490  E684  '..'
                  x8492:	in	al,0x21			; 00008492  E421  '.!'
                  	and	al,0xbf			; 00008494  24BF  '$.'
                  	out	0x21,al			; 00008496  E621  '.!'
                  	mov	al,0x0			; 00008498  B000  '..'
                  	out	0xd2,al			; 0000849A  E6D2  '..'
                  	out	0xd4,al			; 0000849C  E6D4  '..'
                  	ret				; 0000849E  C3  '.'
                  
                  	add	bx,di			; 0000849F  03DF  '..'
                  	add	al,[bx]			; 000084A1  0207  '..'
                  	add	[bx+si],cl		; 000084A3  0008  '..'
                  
                  x84a5:	mov	ax,0x50			; 000084A5  B85000  '.P.'
                  	push	ds			; 000084A8  1E  '.'
                  	mov	ds,ax			; 000084A9  8ED8  '..'
                  	mov	byte [0x0],0xff		; 000084AB  C6060000FF  '.....'
                  	pop	ds			; 000084B0  1F  '.'
                  	mov	word [0x8d],0x0		; 000084B1  C7068D000000  '......'
                  	mov	byte [0x8c],0xfa	; 000084B7  C6068C00FA  '.....'
                  	xor	bx,bx			; 000084BC  33DB  '3.'
                  	mov	cl,0xff			; 000084BE  B1FF  '..'
                  	mov	ch,0xf0			; 000084C0  B5F0  '..'
                  	xor	di,di			; 000084C2  33FF  '3.'
                  	push	es			; 000084C4  06  '.'
                  x84c5:	mov	[0x4c],cl		; 000084C5  880E4C00  '..L.'
                  	mov	ax,0x48			; 000084C9  B84800  '.H.'
                  	mov	es,ax			; 000084CC  8EC0  '..'
                  	mov	word [es:di],0x0	; 000084CE  26C7050000  '&....'
                  	mov	word [es:di+0x2],0xffff	; 000084D3  26C74502FFFF  '&.E...'
                  	cld				; 000084D9  FC  '.'
                  	cld				; 000084DA  FC  '.'
                  	mov	ax,[es:di]		; 000084DB  268B05  '&..'
                  	cld				; 000084DE  FC  '.'
                  	cld				; 000084DF  FC  '.'
                  	cld				; 000084E0  FC  '.'
                  	cld				; 000084E1  FC  '.'
                  	cld				; 000084E2  FC  '.'
                  	or	ax,ax			; 000084E3  0BC0  '..'
                  	mov	[es:di],ax		; 000084E5  268905  '&..'
                  	jz	x84ee			; 000084E8  7404  't.'
                  	inc	cl			; 000084EA  FEC1  '..'
                  	jmp	short x84f9		; 000084EC  EB0B  '..'
                  
                  x84ee:	add	bx,byte +0x40		; 000084EE  83C340  '..@'
                  	cmp	cl,ch			; 000084F1  3ACD  ':.'
                  	jz	x84f9			; 000084F3  7404  't.'
                  	dec	cl			; 000084F5  FEC9  '..'
                  	jmp	short x84c5		; 000084F7  EBCC  '..'
                  
                  x84f9:	sub	bx,0x80			; 000084F9  81EB8000  '....'
                  	jna	x8507			; 000084FD  7608  'v.'
                  	mov	[0x8d],bx		; 000084FF  891E8D00  '....'
                  	mov	[0x8c],cl		; 00008503  880E8C00  '....'
                  x8507:	pop	es			; 00008507  07  '.'
                  	ret				; 00008508  C3  '.'
                  
                  ;
                  ;   Wrapper around xdb33 to test memory at %FE0000
                  ;
                  x8509:	mov	ah,0xfe			; 00008509  B4FE  '..'
                  	mov	word [0x82],0x80	; 0000850B  C70682008000  '......'
                  	mov	byte [0x8f],0xff	; 00008511  C6068F00FF  '.....'
                  	mov	byte [0x92],0x1		; 00008516  C606920001  '.....'
                  	mov	bp,0x80			; 0000851B  BD8000  '...'
                  	call	xdb33			; 0000851E  E81256  '..V'
                  	add	bp,0x80			; 00008521  81C58000  '....'
                  	or	ax,ax			; 00008525  0BC0  '..'
                  	jz	x853b			; 00008527  7412  't.'
                  	mov	[0x66],ch		; 00008529  882E6600  '..f.'
                  	mov	[0x67],dx		; 0000852D  89166700  '..g.'
                  	mov	[0x69],cl		; 00008531  880E6900  '..i.'
                  	or	word [0x64],0x41	; 00008535  810E64004100  '..d.A.'
                  x853b:	ret				; 0000853B  C3  '.'
                  
                  ;
                  ;   Copy ROM from %0F0000 to %FF0000
                  ;
                  x853c:	mov	al,0x7f			; 0000853C  B07F  '..'
                  	out	0x84,al			; 0000853E  E684  '..'
                  	mov	word [0x50],0xffff	; 00008540  C7065000FFFF  '..P...'
                  	mov	word [0x52],0x0		; 00008546  C70652000000  '..R...'
                  	mov	byte [0x54],0xf		; 0000854C  C60654000F  '..T..'
                  	mov	byte [0x55],0x92	; 00008551  C606550092  '..U..'
                  	mov	byte [0x56],0x0		; 00008556  C606560000  '..V..'
                  	mov	byte [0x57],0x0		; 0000855B  C606570000  '..W..'
                  	mov	word [0x48],0xffff	; 00008560  C7064800FFFF  '..H...'
                  	mov	word [0x4a],0x0		; 00008566  C7064A000000  '..J...'
                  	mov	byte [0x4c],0xff	; 0000856C  C6064C00FF  '..L..'
                  	mov	byte [0x4d],0x92	; 00008571  C6064D0092  '..M..'
                  	mov	word [0x4e],0x0		; 00008576  C7064E000000  '..N...'
                  	push	es			; 0000857C  06  '.'
                  	push	ds			; 0000857D  1E  '.'
                  	mov	ax,0x50			; 0000857E  B85000  '.P.'
                  	mov	ds,ax			; 00008581  8ED8  '..'
                  	mov	ax,0x48			; 00008583  B84800  '.H.'
                  	mov	es,ax			; 00008586  8EC0  '..'
                  	xor	si,si			; 00008588  33F6  '3.'
                  	xor	di,di			; 0000858A  33FF  '3.'
                  ;
                  ;   Copy 64Kb from %0F0000 to %FF0000
                  ;
                  	mov	cx,0x4000		; 0000858C  B90040  '..@'
                  	cld				; 0000858F  FC  '.'
                  	rep	movsd			; 00008590  66F3A5  'f..'
                  ;
                  ;   (DI) -> 0x7FB6
                  ;
                  	mov	bx,bim_table_offset	; 00008593  BBE0FF  '...'
                  	mov	di,[bx]			; 00008596  8B3F  '.?'
                  ;
                  ;   (SI) -> 0x7FBE
                  ;
                  	mov	bx,cpu_idrev_offset	; 00008598  BBE2FF  '...'
                  	mov	si,[bx]			; 0000859B  8B37  '.7'
                  
                  	pop	ds			; 0000859D  1F  '.'
                  	mov	word [0x50],0xffff	; 0000859E  C7065000FFFF  '..P...'
                  	mov	word [0x52],0x0		; 000085A4  C70652000000  '..R...'
                  	mov	byte [0x54],0xc0	; 000085AA  C6065400C0  '..T..'
                  	mov	byte [0x55],0x92	; 000085AF  C606550092  '..U..'
                  	mov	byte [0x56],0x0		; 000085B4  C606560000  '..V..'
                  	mov	byte [0x57],0x80	; 000085B9  C606570080  '..W..'
                  ;
                  ;   (BX) is 0x100 (256Kb)
                  ;
                  	mov	bx,[0x8d]		; 000085BE  8B1E8D00  '....'
                  
                  	push	ds			; 000085C2  1E  '.'
                  ;
                  ;   (DS) -> 0x80C00000
                  ;
                  	mov	ax,0x50			; 000085C3  B85000  '.P.'
                  	mov	ds,ax			; 000085C6  8ED8  '..'
                  ;
                  ;   Disable IOCHK NMI, since it is possible to generate a
                  ;   parity error by simply reading the RAM Diagnostics Register.
                  ;
                  	in	al,0x61			; 000085C8  E461  '.a'
                  	push	ax			; 000085CA  50  'P'
                  	or	al,0x8			; 000085CB  0C08  '..'
                  	out	0x61,al			; 000085CD  E661  '.a'
                  ;
                  ;   (AL) == RAM Diagnostics Register (from 0x80C00000)
                  ;
                  	mov	al,[0x0]		; 000085CF  A00000  '...'
                  ;
                  ;   Ensure that relocatable RAM at %FE0000 is NEITHER currently remapped NOR write-protected
                  ;
                  	mov	byte [0x0],0xff		; 000085D2  C6060000FF  '.....'
                  ;
                  ;   Isolate the base memory settings in bits 5-4 (00=640Kb, 10=512Kb, 11=256Kb)
                  ;
                  	and	al,0xf0			; 000085D7  24F0  '$.'
                  ;
                  ;   Update [bim_table_offset]+1 (eg, %FF7FB7) with base memory settings
                  ;
                  	mov	[es:di+0x1],al		; 000085D9  26884501  '&.E.'
                  	pop	ax			; 000085DD  58  'X'
                  	out	0x61,al			; 000085DE  E661  '.a'
                  ;
                  ;   Update [bim_table_offset]+0 (eg, %FF7FB6) with 0x10; that will set the first word of the built-in
                  ;   memory table to one of these values:
                  ;
                  ;	0x0010		256kb (1024 - 640 - 128)
                  ;	0x2010		384Kb (1024 - 512 - 128)
                  ;	0x3010		640Kb (1024 - 256 - 128)
                  ;
                  	mov	byte [es:di],0x10	; 000085E0  26C60510
                  
                  	mov	al,0xb1			; 000085E4  B0B1  '..'
                  	out	0x70,al			; 000085E6  E670  '.p'
                  	in	al,0x71			; 000085E8  E471  '.q'
                  	mov	ah,al			; 000085EA  8AE0  '..'
                  	mov	al,0xb0			; 000085EC  B0B0  '..'
                  	out	0x70,al			; 000085EE  E670  '.p'
                  	in	al,0x71			; 000085F0  E471  '.q'
                  ;
                  ;   (AX) contains CMOS EXTMEM2 value (eg, 0x400 or 1024Kb), to which we add another 1024Kb (for conventional memory)
                  ;
                  	add	ax,0x400		; 000085F2  050004  '...'
                  	mov	cx,0x3f80		; 000085F5  B9803F  '..?'
                  
                  ;
                  ;   (CX) contains 0x3F80 (maximum # of supported Kb), reduced by the amount of built-in memory
                  ;
                  	sub	cx,bx			; 000085F8  2BCB  '+.'
                  ;
                  ;   Compare (AX), total conventional+extended memory, to (CX)
                  ;
                  	cmp	ax,cx			; 000085FA  3BC1  ';.'
                  	jc	x8600			; 000085FC  7202  'r.'
                  	xor	bx,bx			; 000085FE  33DB  '3.'
                  ;
                  ;   Assuming no problems, convert Kb of built-in memory to paragraphs, by multiplying by 64
                  ;
                  x8600:	shl	bx,0x6			; 00008600  C1E306  '...'
                  ;
                  ;   If (BX) was 0x100 (256Kb), we'll move the equivalent number of paragraphs
                  ;   (0x4000) to [bim_table_offset]+2 and +4 (eg, %FF7FB8 and %FF7FBA).
                  ;
                  	mov	[es:di+0x2],bx		; 00008603  26895D02  '&.].'
                  	mov	[es:di+0x4],bx		; 00008607  26895D04  '&.].'
                  	mov	ch,0xfe			; 0000860B  B5FE  '..'
                  	xor	cl,cl			; 0000860D  32C9  '2.'
                  	shl	cx,0x4			; 0000860F  C1E104  '...'
                  ;
                  ;   Move 0xE000 to [bim_table_offset]+6 (eg, %FF7FBC)
                  ;
                  	mov	[es:di+0x6],cx		; 00008612  26894D06  '&.M.'
                  	mov	di,si			; 00008616  8BFE  '..'
                  	mov	ax,gs			; 00008618  8CE8  '..'
                  ;
                  ;   (AX) contains the processor type and revision (AH=0x03, AL=0x04),
                  ;   which were preserved on reset in (GS); store them at the offset specified
                  ;   by cpu_idrev_offset (eg, type in %FF7FBE and revision in %FF7FBF).
                  ;
                  	mov	[es:di],ah		; 0000861A  268825  '&.%'
                  	mov	[es:di+0x1],al		; 0000861D  26884501  '&.E.'
                  
                  	mov	cx,0x7fff		; 00008621  B9FF7F  '...'
                  	mov	si,0x8000		; 00008624  BE0080  '...'
                  	xor	ah,ah			; 00008627  32E4  '2.'
                  	cld				; 00008629  FC  '.'
                  x862a:	es	lodsb			; 0000862A  26AC  '&.'
                  	add	ah,al			; 0000862C  02E0  '..'
                  	loop	x862a			; 0000862E  E2FA  '..'
                  	not	ah			; 00008630  F6D4  '..'
                  	inc	ah			; 00008632  FEC4  '..'
                  	mov	[es:si],ah		; 00008634  268824  '&.$'
                  ;
                  ;   Relocate RAM at %FF0000 to %0F0000
                  ;
                  	mov	byte [0x0],0xfc		; 00008637  C6060000FC  '.....'
                  	pop	ds			; 0000863C  1F  '.'
                  	pop	es			; 0000863D  07  '.'
                  	ret				; 0000863E  C3  '.'
                  
                  x863f:	call	x86db			; 0000863F  E89900  '...'
                  	mov	[0x60],ax		; 00008642  A36000  '.`.'
                  	mov	cx,ax			; 00008645  8BC8  '..'
                  	mov	bx,0x280		; 00008647  BB8002  '...'
                  	test	cl,0x20			; 0000864A  F6C120  '.. '
                  	jz	x865a			; 0000864D  740B  't.'
                  	mov	bx,0x200		; 0000864F  BB0002  '...'
                  	test	cl,0x10			; 00008652  F6C110  '...'
                  	jz	x865a			; 00008655  7403  't.'
                  	mov	bx,0x100		; 00008657  BB0001  '...'
                  x865a:	mov	ax,0x400		; 0000865A  B80004  '...'
                  	mul	bx			; 0000865D  F7E3  '..'
                  	dec	dl			; 0000865F  FECA  '..'
                  	mov	[0x90],dl		; 00008661  88169000  '....'
                  	mov	al,cl			; 00008665  8AC1  '..'
                  	and	al,0xc0			; 00008667  24C0  '$.'
                  	cmp	al,0x40			; 00008669  3C40  '<@'
                  	jz	x868c			; 0000866B  741F  't.'
                  	mov	bx,0x400		; 0000866D  BB0004  '...'
                  	test	cl,0x40			; 00008670  F6C140  '..@'
                  	jnz	x8680			; 00008673  750B  'u.'
                  	mov	bx,0x800		; 00008675  BB0008  '...'
                  	test	cl,0x80			; 00008678  F6C180  '...'
                  	jnz	x8680			; 0000867B  7503  'u.'
                  	mov	bx,0x2800		; 0000867D  BB0028  '..('
                  x8680:	mov	ax,0x400		; 00008680  B80004  '...'
                  	mul	bx			; 00008683  F7E3  '..'
                  	dec	dl			; 00008685  FECA  '..'
                  	mov	[0x91],dl		; 00008687  88169100  '....'
                  	ret				; 0000868B  C3  '.'
                  
                  x868c:	mov	bh,ch			; 0000868C  8AFD  '..'
                  	mov	bl,0x0			; 0000868E  B300  '..'
                  	mov	cx,0x4			; 00008690  B90400  '...'
                  x8693:	mov	al,bh			; 00008693  8AC7  '..'
                  	shr	bh,0x2			; 00008695  C0EF02  '...'
                  	and	al,0x3			; 00008698  2403  '$.'
                  	cmp	al,0x2			; 0000869A  3C02  '<.'
                  	jnz	x86a3			; 0000869C  7505  'u.'
                  	add	bl,0x1			; 0000869E  80C301  '...'
                  	jmp	short x86aa		; 000086A1  EB07  '..'
                  
                  x86a3:	cmp	al,0x1			; 000086A3  3C01  '<.'
                  	jnz	x86ac			; 000086A5  7505  'u.'
                  	add	bl,0x4			; 000086A7  80C304  '...'
                  x86aa:	loop	x8693			; 000086AA  E2E7  '..'
                  x86ac:	push	ds			; 000086AC  1E  '.'
                  	mov	ax,0x50			; 000086AD  B85000  '.P.'
                  	mov	ds,ax			; 000086B0  8ED8  '..'
                  	mov	al,[0x2]		; 000086B2  A00200  '...'
                  	and	al,0xf0			; 000086B5  24F0  '$.'
                  	or	al,bl			; 000086B7  0AC3  0x0A,'.'
                  	mov	[0x2],al		; 000086B9  A20200  '...'
                  	pop	ds			; 000086BC  1F  '.'
                  	xor	ah,ah			; 000086BD  32E4  '2.'
                  	mov	[0x62],ax		; 000086BF  A36200  '.b.'
                  	or	bl,bl			; 000086C2  0ADB  0x0A,'.'
                  	jnz	x86c8			; 000086C4  7502  'u.'
                  	mov	bl,0x1			; 000086C6  B301  '..'
                  x86c8:	xor	bh,bh			; 000086C8  32FF  '2.'
                  	mov	ax,0x400		; 000086CA  B80004  '...'
                  	mul	bx			; 000086CD  F7E3  '..'
                  	mov	bx,0x400		; 000086CF  BB0004  '...'
                  	mul	bx			; 000086D2  F7E3  '..'
                  	dec	dl			; 000086D4  FECA  '..'
                  	mov	[0x91],dl		; 000086D6  88169100  '....'
                  	ret				; 000086DA  C3  '.'
                  
                  x86db:	mov	word [0x50],0xffff	; 000086DB  C7065000FFFF  '..P...'
                  	mov	word [0x52],0x0		; 000086E1  C70652000000  '..R...'
                  	mov	byte [0x54],0xc0	; 000086E7  C6065400C0  '..T..'
                  	mov	byte [0x55],0x92	; 000086EC  C606550092  '..U..'
                  	mov	byte [0x56],0x0		; 000086F1  C606560000  '..V..'
                  	mov	byte [0x57],0x80	; 000086F6  C606570080  '..W..'
                  	push	ds			; 000086FB  1E  '.'
                  	push	bx			; 000086FC  53  'S'
                  	mov	ax,0x50			; 000086FD  B85000  '.P.'
                  	mov	ds,ax			; 00008700  8ED8  '..'
                  	in	al,0x61			; 00008702  E461  '.a'
                  	mov	ah,al			; 00008704  8AE0  '..'
                  	or	al,0x8			; 00008706  0C08  '..'
                  	out	0x61,al			; 00008708  E661  '.a'
                  	out	0x84,al			; 0000870A  E684  '..'
                  ;
                  ;   Read the memory-mapped settings/diagnostic register at 0x80C00000 into BX
                  ;
                  	mov	bx,[0x0]		; 0000870C  8B1E0000  '....'
                  	mov	byte [0x0],0xff		; 00008710  C6060000FF  '.....'
                  	out	0x84,al			; 00008715  E684  '..'
                  	cld				; 00008717  FC  '.'
                  	cld				; 00008718  FC  '.'
                  	cld				; 00008719  FC  '.'
                  	cld				; 0000871A  FC  '.'
                  	cld				; 0000871B  FC  '.'
                  	cld				; 0000871C  FC  '.'
                  	cld				; 0000871D  FC  '.'
                  	cld				; 0000871E  FC  '.'
                  	cld				; 0000871F  FC  '.'
                  	cld				; 00008720  FC  '.'
                  	cld				; 00008721  FC  '.'
                  	cld				; 00008722  FC  '.'
                  	cld				; 00008723  FC  '.'
                  	cld				; 00008724  FC  '.'
                  	cld				; 00008725  FC  '.'
                  	cld				; 00008726  FC  '.'
                  	xchg	ah,al			; 00008727  86E0  '..'
                  	out	0x61,al			; 00008729  E661  '.a'
                  	mov	ax,bx			; 0000872B  8BC3  '..'
                  	pop	bx			; 0000872D  5B  '['
                  	pop	ds			; 0000872E  1F  '.'
                  	ret				; 0000872F  C3  '.'
                  
                  romgdt:					; 00008730
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0x00,0x00,0xC0,0x92,0x00,0x80
                  	db	0xFF,0xFF,0x00,0x00,0x00,0x92,0x00,0x00, 0xFF,0xFF,0x00,0x00,0x0F,0x9A,0x00,0x00
                  	db	0xFF,0xFF,0x00,0x00,0x00,0x92,0x00,0xC0, 0xFF,0xFF,0x00,0x00,0xFF,0x9A,0x00,0x00
                  	db	0xFF,0xFF,0x00,0x00,0xFF,0x92,0x00,0x00, 0xFF,0xFF,0x00,0x00,0x0E,0x92,0x00,0x00
                  	db	0xFF,0xFF,0x00,0x00,0xFD,0x92,0x00,0x00
                  
                  gdtr_lo:				; accessed via offset 0x0778 (and also 0x8778)
                  	dw	0x0047,0x0730,0x000F	; 00008778  GDTR referencing the above GDT in the 0th Mb
                  gdtr_hi:				; accessed via offset 0x077E
                  	dw	0x0047,0x0730,0x00FF	; 0000877E  GDTR referencing the above GDT in the 15th Mb
                  idtr_lo:				; accessed via offset 0x0784
                  	dw	0xFFFF,0x0000,0x0000	; 00008784  IDTR
                  
                  	db	0xAA,0x87,0x18,0x00,0xF8,0x87
                  	db	0x18,0x00,0x28,0x88,0x18,0x00
                  
                  x8796:	lgdt	[cs:0x0778]		; 00008796  load [gdtr_lo] into GDTR
                  	mov	eax,cr0			; 0000879C  0F2000
                  	or	ax,0x1			; 0000879F  0D0100  0x0D,'..'
                  	mov	cr0,eax			; 000087A2  0F2200
                  	jmp	far [cs:0x878a]		; 000087A5  2EFF2E8A87  '.....'
                  
                  	mov	ax,0x8			; 000087AA  B80800  '...'
                  	mov	es,ax			; 000087AD  8EC0  '..'
                  	mov	al,0x2f			; 000087AF  B02F  './'
                  	mov	[es:di],bl		; 000087B1  26881D  '&..'
                  	out	0x84,al			; 000087B4  E684  '..'
                  	cld				; 000087B6  FC  '.'
                  	cld				; 000087B7  FC  '.'
                  	cld				; 000087B8  FC  '.'
                  	cld				; 000087B9  FC  '.'
                  	cld				; 000087BA  FC  '.'
                  	cld				; 000087BB  FC  '.'
                  	cld				; 000087BC  FC  '.'
                  	cld				; 000087BD  FC  '.'
                  	cld				; 000087BE  FC  '.'
                  	cld				; 000087BF  FC  '.'
                  	cld				; 000087C0  FC  '.'
                  	cld				; 000087C1  FC  '.'
                  	cld				; 000087C2  FC  '.'
                  	cld				; 000087C3  FC  '.'
                  	cld				; 000087C4  FC  '.'
                  	cld				; 000087C5  FC  '.'
                  x87c6:	mov	ax,0x10			; 000087C6  B81000  '...'
                  	mov	es,ax			; 000087C9  8EC0  '..'
                  	mov	eax,cr0			; 000087CB  0F2000
                  	and	eax,0x7ffffffe		; 000087CE  6625FEFFFF7F  'f%....'
                  	mov	cr0,eax			; 000087D4  0F2200
                  	jmp	0xf000:x87dc		; 000087D7  EADC8700F0  '.....'
                  
                  x87dc:	lidt	[cs:0x0784]		; 000087DC  load [idtr_lo] into IDTR
                  	jmp	bp			; 000087E2  FFE5  '..'
                  
                  x87e4:	lgdt	[cs:0x0778]		; 000087E4  load [gdtr_lo] into GDTR
                  	mov	eax,cr0			; 000087EA  0F2000
                  	or	ax,0x1			; 000087ED  0D0100  0x0D,'..'
                  	mov	cr0,eax			; 000087F0  0F2200
                  	jmp	far [cs:0x878e]		; 000087F3  2EFF2E8E87  '.....'
                  
                  	mov	ax,0x8			; 000087F8  B80800  '...'
                  	mov	es,ax			; 000087FB  8EC0  '..'
                  	in	al,0x61			; 000087FD  E461  '.a'
                  	mov	ah,al			; 000087FF  8AE0  '..'
                  	or	al,0x8			; 00008801  0C08  '..'
                  	out	0x61,al			; 00008803  E661  '.a'
                  	mov	al,ah			; 00008805  8AC4  '..'
                  	mov	bl,[es:di]		; 00008807  268A1D  '&..'
                  	mov	byte [es:0x0],0xff	; 0000880A  26C6060000FF  '&.....'
                  	out	0x61,al			; 00008810  E661  '.a'
                  	jmp	short x87c6		; 00008812  EBB2  '..'
                  
                  x8814:	lgdt	[cs:0x8778]		; 00008814  load [gdtr_lo] into GDTR
                  	mov	eax,cr0			; 0000881A  0F2000
                  	or	ax,0x1			; 0000881D  0D0100  0x0D,'..'
                  	mov	cr0,eax			; 00008820  0F2200
                  	jmp	far [cs:0x8792]		; 00008823  2EFF2E9287  '.....'
                  
                  	mov	ax,0x20			; 00008828  B82000  '. .'
                  	mov	ds,ax			; 0000882B  8ED8  '..'
                  	mov	al,0xc0			; 0000882D  B0C0  '..'
                  	out	0x64,al			; 0000882F  E664  '.d'
                  	mov	cx,0xffff		; 00008831  B9FFFF  '...'
                  	cli				; 00008834  FA  '.'
                  x8835:	in	al,0x64			; 00008835  E464  '.d'
                  	test	al,0x2			; 00008837  A802  '..'
                  	jz	x8840			; 00008839  7405  't.'
                  	loop	x8835			; 0000883B  E2F8  '..'
                  	jmp	x88d0			; 0000883D  E99000  '...'
                  
                  x8840:	mov	cx,0xffff		; 00008840  B9FFFF  '...'
                  x8843:	in	al,0x64			; 00008843  E464  '.d'
                  	test	al,0x1			; 00008845  A801  '..'
                  	jnz	x884e			; 00008847  7505  'u.'
                  	loop	x8843			; 00008849  E2F8  '..'
                  	jmp	x88d0			; 0000884B  E98200  '...'
                  
                  x884e:	in	al,0x60			; 0000884E  E460  '.`'
                  	test	al,0x8			; 00008850  A808  '..'
                  	jnz	x88d0			; 00008852  757C  'u|'
                  	mov	dword [0xc000],0xb8000000; 00008854  66C70600C0000000  'f.......'
                  	jmp	short x885f		; 0000885D  EB00  '..'
                  
                  x885f:	mov	eax,[0xc400]		; 0000885F  66A100C4  'f...'
                  	jmp	short x8865		; 00008863  EB00  '..'
                  
                  x8865:	and	eax,0x8000		; 00008865  662500800000  'f%....'
                  	jnz	x887a			; 0000886B  750D  'u',0x0D
                  	jmp	short x886f		; 0000886D  EB00  '..'
                  
                  x886f:	mov	dword [0xc000],0x16000000; 0000886F  66C70600C0000000  'f.......'
                  	jmp	short x8890		; 00008878  EB16  '..'
                  
                  x887a:	jmp	short x887c		; 0000887A  EB00  '..'
                  
                  x887c:	mov	dword [0xc000],0x56000000; 0000887C  66C70600C0000000  'f.......'
                  	jmp	short x8887		; 00008885  EB00  '..'
                  
                  x8887:	mov	dword [0xc000],0x98000000; 00008887  66C70600C0000000  'f.......'
                  x8890:	jmp	short x8892		; 00008890  EB00  '..'
                  
                  x8892:	mov	dword [0xc000],0x64000000; 00008892  66C70600C0000000  'f.......'
                  	jmp	short x889d		; 0000889B  EB00  '..'
                  
                  x889d:	mov	dword [0xc000],0xa0000000; 0000889D  66C70600C0000000  'f.......'
                  	jmp	short x88a8		; 000088A6  EB00  '..'
                  
                  x88a8:	mov	dword [0xc000],0x30000000; 000088A8  66C70600C0000000  'f.......'
                  	jmp	short x88b3		; 000088B1  EB00  '..'
                  
                  x88b3:	mov	dword [0xc000],0x3ff0000; 000088B3  66C70600C00000FF  'f.......'
                  	mov	al,0xb3			; 000088BC  B0B3  '..'
                  	out	0x70,al			; 000088BE  E670  '.p'
                  	in	al,0x71			; 000088C0  E471  '.q'
                  	xchg	ah,al			; 000088C2  86E0  '..'
                  	mov	al,0xb3			; 000088C4  B0B3  '..'
                  	out	0x70,al			; 000088C6  E670  '.p'
                  	xchg	al,ah			; 000088C8  86C4  '..'
                  	or	al,0x20			; 000088CA  0C20  '. '
                  	out	0x71,al			; 000088CC  E671  '.q'
                  	jmp	short x88e2		; 000088CE  EB12  '..'
                  
                  x88d0:	mov	al,0xb3			; 000088D0  B0B3  '..'
                  	out	0x70,al			; 000088D2  E670  '.p'
                  	in	al,0x71			; 000088D4  E471  '.q'
                  	xchg	ah,al			; 000088D6  86E0  '..'
                  	mov	al,0xb3			; 000088D8  B0B3  '..'
                  	out	0x70,al			; 000088DA  E670  '.p'
                  	xchg	al,ah			; 000088DC  86C4  '..'
                  	and	al,0xdf			; 000088DE  24DF  '$.'
                  	out	0x71,al			; 000088E0  E671  '.q'
                  x88e2:	mov	ax,0x10			; 000088E2  B81000  '...'
                  	mov	ds,ax			; 000088E5  8ED8  '..'
                  	jmp	x87c6			; 000088E7  E9DCFE  '...'
                  
                  x88ea:	sti				; 000088EA  FB  '.'
                  	push	bx			; 000088EB  53  'S'
                  	push	cx			; 000088EC  51  'Q'
                  	push	dx			; 000088ED  52  'R'
                  	push	si			; 000088EE  56  'V'
                  	push	ds			; 000088EF  1E  '.'
                  	mov	bx,0x40			; 000088F0  BB4000  '.@.'
                  	mov	ds,bx			; 000088F3  8EDB  '..'
                  	and	dx,0x3			; 000088F5  81E20300  '....'
                  	mov	si,dx			; 000088F9  8BF2  '..'
                  	mov	bl,[si+0x78]		; 000088FB  8A9C7800  '..x.'
                  	shl	si,1			; 000088FF  D1E6  '..'
                  	mov	dx,[si+0x8]		; 00008901  8B940800  '....'
                  	or	dx,dx			; 00008905  0BD2  '..'
                  	jz	x8980			; 00008907  7477  'tw'
                  	push	ax			; 00008909  50  'P'
                  	test	ah,ah			; 0000890A  84E4  '..'
                  	jz	x8919			; 0000890C  740B  't.'
                  	dec	ah			; 0000890E  FECC  '..'
                  	jz	x895b			; 00008910  7449  'tI'
                  	dec	ah			; 00008912  FECC  '..'
                  	jz	x8971			; 00008914  745B  't['
                  	pop	ax			; 00008916  58  'X'
                  	jmp	short x8980		; 00008917  EB67  '.g'
                  
                  x8919:	out	dx,al			; 00008919  EE  '.'
                  	inc	dx			; 0000891A  42  'B'
                  	jmp	short x891d		; 0000891B  EB00  '..'
                  
                  x891d:	jmp	short x891f		; 0000891D  EB00  '..'
                  
                  x891f:	in	al,dx			; 0000891F  EC  '.'
                  	and	al,0xf8			; 00008920  24F8  '$.'
                  	js	x894c			; 00008922  7828  'x('
                  	push	ax			; 00008924  50  'P'
                  	mov	ax,0x90fe		; 00008925  B8FE90  '...'
                  	clc				; 00008928  F8  '.'
                  	int	0x15			; 00008929  CD15  '..'
                  	pop	ax			; 0000892B  58  'X'
                  	jc	x893f			; 0000892C  7211  'r.'
                  x892e:	mov	cx,0xf424		; 0000892E  B924F4  '.$.'
                  x8931:	call	x919a			; 00008931  E86608  '.f.'
                  	in	al,dx			; 00008934  EC  '.'
                  	and	al,0xf8			; 00008935  24F8  '$.'
                  	js	x894c			; 00008937  7813  'x.'
                  	loop	x8931			; 00008939  E2F6  '..'
                  	dec	bl			; 0000893B  FECB  '..'
                  	jnz	x892e			; 0000893D  75EF  'u.'
                  x893f:	jmp	short x8941		; 0000893F  EB00  '..'
                  
                  x8941:	jmp	short x8943		; 00008941  EB00  '..'
                  
                  x8943:	in	al,dx			; 00008943  EC  '.'
                  	and	al,0xf8			; 00008944  24F8  '$.'
                  	js	x894c			; 00008946  7804  'x.'
                  	or	al,0x1			; 00008948  0C01  '..'
                  	jmp	short x8979		; 0000894A  EB2D  '.-'
                  
                  x894c:	inc	dx			; 0000894C  42  'B'
                  	in	al,dx			; 0000894D  EC  '.'
                  	and	al,0x1c			; 0000894E  241C  '$.'
                  	or	al,0x1			; 00008950  0C01  '..'
                  	jmp	short x8954		; 00008952  EB00  '..'
                  
                  x8954:	jmp	short x8956		; 00008954  EB00  '..'
                  
                  x8956:	out	dx,al			; 00008956  EE  '.'
                  	and	al,0x1c			; 00008957  241C  '$.'
                  	jmp	short x896a		; 00008959  EB0F  '..'
                  
                  x895b:	inc	dx			; 0000895B  42  'B'
                  	inc	dx			; 0000895C  42  'B'
                  	mov	al,0x8			; 0000895D  B008  '..'
                  	jmp	short x8961		; 0000895F  EB00  '..'
                  
                  x8961:	out	dx,al			; 00008961  EE  '.'
                  	mov	bx,0x5			; 00008962  BB0500  '...'
                  	call	xc638			; 00008965  E8D03C  '..<'
                  	or	al,0x4			; 00008968  0C04  '..'
                  x896a:	jmp	short x896c		; 0000896A  EB00  '..'
                  
                  x896c:	jmp	short x896e		; 0000896C  EB00  '..'
                  
                  x896e:	out	dx,al			; 0000896E  EE  '.'
                  	dec	dx			; 0000896F  4A  'J'
                  	dec	dx			; 00008970  4A  'J'
                  x8971:	inc	dx			; 00008971  42  'B'
                  	jmp	short x8974		; 00008972  EB00  '..'
                  
                  x8974:	jmp	short x8976		; 00008974  EB00  '..'
                  
                  x8976:	in	al,dx			; 00008976  EC  '.'
                  	and	al,0xf8			; 00008977  24F8  '$.'
                  x8979:	xor	al,0x48			; 00008979  3448  '4H'
                  	mov	bh,al			; 0000897B  8AF8  '..'
                  	pop	ax			; 0000897D  58  'X'
                  	mov	ah,bh			; 0000897E  8AE7  '..'
                  x8980:	pop	ds			; 00008980  1F  '.'
                  	pop	si			; 00008981  5E  '^'
                  	pop	dx			; 00008982  5A  'Z'
                  	pop	cx			; 00008983  59  'Y'
                  	pop	bx			; 00008984  5B  '['
                  	iret				; 00008985  CF  '.'
                  
                  	add	[ss:bp+di+0xada5],ch	; 00008986  2E3E2664653600AB  '.>&de6..'
                  	cmpsw				; 00008990  A7  '.'
                  	scasw				; 00008991  AF  '.'
                  	insw				; 00008992  6D  'm'
                  	outsw				; 00008993  6F  'o'
                  	add	[di],bl			; 00008994  001D  '..'
                  	mov	dh,[bp+di]		; 00008996  8A33  '.3'
                  	mov	al,[bp+di+0x918a]	; 00008998  8A838A91  '....'
                  	mov	dl,dh			; 0000899C  8AD6  '..'
                  	mov	ah,ah			; 0000899E  8AE4  '..'
                  	mov	bh,dl			; 000089A0  8AFA  '..'
                  	mov	dl,[bx+di+0x55]		; 000089A2  8A5155  '.QU'
                  	mov	bp,sp			; 000089A5  8BEC  '..'
                  	push	ax			; 000089A7  50  'P'
                  	push	bx			; 000089A8  53  'S'
                  	push	dx			; 000089A9  52  'R'
                  	push	es			; 000089AA  06  '.'
                  	push	ds			; 000089AB  1E  '.'
                  	mov	al,0xb			; 000089AC  B00B  '..'
                  	out	0x20,al			; 000089AE  E620  '. '
                  	in	al,0x20			; 000089B0  E420  '. '
                  	test	al,0x20			; 000089B2  A820  '. '
                  	jnz	x8a0b			; 000089B4  7555  'uU'
                  	xor	ch,ch			; 000089B6  32ED  '2.'
                  	mov	ax,cs			; 000089B8  8CC8  '..'
                  	mov	ds,ax			; 000089BA  8ED8  '..'
                  	mov	es,[bp+0x6]		; 000089BC  8E4606  '.F.'
                  	mov	bx,[bp+0x4]		; 000089BF  8B5E04  '.^.'
                  x89c2:	mov	cl,[es:bx]		; 000089C2  268A0F  '&..'
                  	cmp	cl,0xf2			; 000089C5  80F9F2  '...'
                  	jz	x89cf			; 000089C8  7405  't.'
                  	cmp	cl,0xf3			; 000089CA  80F9F3  '...'
                  	jnz	x89d7			; 000089CD  7508  'u.'
                  x89cf:	inc	bx			; 000089CF  43  'C'
                  	dec	word [bp+0x2]		; 000089D0  FF4E02  '.N.'
                  	mov	ch,0x1			; 000089D3  B501  '..'
                  	jmp	short x89c2		; 000089D5  EBEB  '..'
                  
                  x89d7:	mov	dx,si			; 000089D7  8BD6  '..'
                  	cld				; 000089D9  FC  '.'
                  	mov	si,0x8986		; 000089DA  BE8689  '...'
                  x89dd:	lodsb				; 000089DD  AC  '.'
                  	cmp	al,0x0			; 000089DE  3C00  '<.'
                  	jz	x89eb			; 000089E0  7409  't.'
                  	cmp	al,cl			; 000089E2  3AC1  ':.'
                  	jnz	x89dd			; 000089E4  75F7  'u.'
                  	inc	bx			; 000089E6  43  'C'
                  	mov	si,dx			; 000089E7  8BF2  '..'
                  	jmp	short x89c2		; 000089E9  EBD7  '..'
                  
                  x89eb:	mov	si,0x898d		; 000089EB  BE8D89  '...'
                  	mov	bx,si			; 000089EE  8BDE  '..'
                  x89f0:	lodsb				; 000089F0  AC  '.'
                  	cmp	al,0x0			; 000089F1  3C00  '<.'
                  	jz	x8a0b			; 000089F3  7416  't.'
                  	cmp	al,cl			; 000089F5  3AC1  ':.'
                  	jnz	x89f0			; 000089F7  75F7  'u.'
                  	mov	ax,[bp+0x8]		; 000089F9  8B4608  '.F.'
                  	and	ah,0x4			; 000089FC  80E404  '...'
                  	sub	si,bx			; 000089FF  2BF3  '+.'
                  	dec	si			; 00008A01  4E  'N'
                  	shl	si,1			; 00008A02  D1E6  '..'
                  	call	near [cs:si+0x8995]	; 00008A04  2EFF949589  '.....'
                  	jmp	short x8a15		; 00008A09  EB0A  '.',0x0A
                  
                  x8a0b:	pop	ds			; 00008A0B  1F  '.'
                  	pop	es			; 00008A0C  07  '.'
                  	pop	dx			; 00008A0D  5A  'Z'
                  	pop	bx			; 00008A0E  5B  '['
                  	pop	ax			; 00008A0F  58  'X'
                  	pop	bp			; 00008A10  5D  ']'
                  	pop	cx			; 00008A11  59  'Y'
                  	jmp	x9bd0			; 00008A12  E9BB11
                  
                  x8a15:	pop	ds			; 00008A15  1F  '.'
                  	pop	es			; 00008A16  07  '.'
                  	pop	dx			; 00008A17  5A  'Z'
                  	pop	bx			; 00008A18  5B  '['
                  	pop	ax			; 00008A19  58  'X'
                  	pop	bp			; 00008A1A  5D  ']'
                  	pop	cx			; 00008A1B  59  'Y'
                  	iret				; 00008A1C  CF  '.'
                  
                  	mov	si,dx			; 00008A1D  8BF2  '..'
                  	cmp	ch,0x1			; 00008A1F  80FD01  '...'
                  	jnz	x8a27			; 00008A22  7503  'u.'
                  	dec	word [bp+0x2]		; 00008A24  FF4E02  '.N.'
                  x8a27:	cmp	ah,0x0			; 00008A27  80FC00  '...'
                  	jz	x8a30			; 00008A2A  7404  't.'
                  	dec	di			; 00008A2C  4F  'O'
                  	dec	di			; 00008A2D  4F  'O'
                  	jmp	short x8a32		; 00008A2E  EB02  '..'
                  
                  x8a30:	inc	di			; 00008A30  47  'G'
                  	inc	di			; 00008A31  47  'G'
                  x8a32:	ret				; 00008A32  C3  '.'
                  
                  	mov	si,dx			; 00008A33  8BF2  '..'
                  	cmp	si,di			; 00008A35  3BF7  ';.'
                  	jnz	0x8a59			; 00008A37  7520  'u '
                  	cmp	ch,0x1			; 00008A39  80FD01  '...'
                  	jnz	x8a44			; 00008A3C  7506  'u.'
                  	dec	word [bp+0x2]		; 00008A3E  FF4E02  '.N.'
                  	dec	word [bp+0x2]		; 00008A41  FF4E02  '.N.'
                  x8a44:	cmp	ah,0x0			; 00008A44  80FC00  '...'
                  	jz	x8a51			; 00008A47  7408  't.'
                  	dec	di			; 00008A49  4F  'O'
                  	dec	di			; 00008A4A  4F  'O'
                  	dec	si			; 00008A4B  4E  'N'
                  	dec	si			; 00008A4C  4E  'N'
                  	dec	si			; 00008A4D  4E  'N'
                  	dec	si			; 00008A4E  4E  'N'
                  	jmp	short x8a82		; 00008A4F  EB31  '.1'
                  
                  x8a51:	inc	di			; 00008A51  47  'G'
                  	inc	di			; 00008A52  47  'G'
                  	inc	si			; 00008A53  46  'F'
                  	inc	si			; 00008A54  46  'F'
                  	inc	si			; 00008A55  46  'F'
                  	inc	si			; 00008A56  46  'F'
                  	jmp	short x8a82		; 00008A57  EB29  '.)'
                  
                  	cmp	si,byte -0x1		; 00008A59  83FEFF  '...'
                  	jnz	x8a6b			; 00008A5C  750D  'u',0x0D
                  	cmp	ah,0x0			; 00008A5E  80FC00  '...'
                  	jz	x8a67			; 00008A61  7404  't.'
                  	dec	si			; 00008A63  4E  'N'
                  	dec	si			; 00008A64  4E  'N'
                  	jmp	short x8a82		; 00008A65  EB1B  '..'
                  
                  x8a67:	inc	si			; 00008A67  46  'F'
                  	inc	si			; 00008A68  46  'F'
                  	jmp	short x8a82		; 00008A69  EB17  '..'
                  
                  x8a6b:	cmp	ch,0x1			; 00008A6B  80FD01  '...'
                  	jnz	x8a73			; 00008A6E  7503  'u.'
                  	dec	word [bp+0x2]		; 00008A70  FF4E02  '.N.'
                  x8a73:	cmp	ah,0x0			; 00008A73  80FC00  '...'
                  	jz	x8a7e			; 00008A76  7406  't.'
                  	dec	di			; 00008A78  4F  'O'
                  	dec	di			; 00008A79  4F  'O'
                  	dec	si			; 00008A7A  4E  'N'
                  	dec	si			; 00008A7B  4E  'N'
                  	jmp	short x8a82		; 00008A7C  EB04  '..'
                  
                  x8a7e:	inc	di			; 00008A7E  47  'G'
                  	inc	di			; 00008A7F  47  'G'
                  	inc	si			; 00008A80  46  'F'
                  	inc	si			; 00008A81  46  'F'
                  x8a82:	ret				; 00008A82  C3  '.'
                  
                  	mov	si,dx			; 00008A83  8BF2  '..'
                  	cmp	ah,0x0			; 00008A85  80FC00  '...'
                  	jz	x8a8e			; 00008A88  7404  't.'
                  	dec	si			; 00008A8A  4E  'N'
                  	dec	si			; 00008A8B  4E  'N'
                  	jmp	short x8a90		; 00008A8C  EB02  '..'
                  
                  x8a8e:	inc	si			; 00008A8E  46  'F'
                  	inc	si			; 00008A8F  46  'F'
                  x8a90:	ret				; 00008A90  C3  '.'
                  
                  	mov	si,dx			; 00008A91  8BF2  '..'
                  	cmp	si,di			; 00008A93  3BF7  ';.'
                  	jnz	x8aac			; 00008A95  7515  'u.'
                  	cmp	ah,0x0			; 00008A97  80FC00  '...'
                  	jz	x8aa4			; 00008A9A  7408  't.'
                  	dec	di			; 00008A9C  4F  'O'
                  	dec	di			; 00008A9D  4F  'O'
                  	dec	di			; 00008A9E  4F  'O'
                  	dec	di			; 00008A9F  4F  'O'
                  	dec	si			; 00008AA0  4E  'N'
                  	dec	si			; 00008AA1  4E  'N'
                  	jmp	short x8ad5		; 00008AA2  EB31  '.1'
                  
                  x8aa4:	inc	di			; 00008AA4  47  'G'
                  	inc	di			; 00008AA5  47  'G'
                  	inc	di			; 00008AA6  47  'G'
                  	inc	di			; 00008AA7  47  'G'
                  	inc	si			; 00008AA8  46  'F'
                  	inc	si			; 00008AA9  46  'F'
                  	jmp	short x8ad5		; 00008AAA  EB29  '.)'
                  
                  x8aac:	cmp	si,byte -0x1		; 00008AAC  83FEFF  '...'
                  	jnz	x8ac2			; 00008AAF  7511  'u.'
                  	cmp	ah,0x0			; 00008AB1  80FC00  '...'
                  	jz	x8abc			; 00008AB4  7406  't.'
                  	dec	si			; 00008AB6  4E  'N'
                  	dec	si			; 00008AB7  4E  'N'
                  	dec	di			; 00008AB8  4F  'O'
                  	dec	di			; 00008AB9  4F  'O'
                  	jmp	short x8ad5		; 00008ABA  EB19  '..'
                  
                  x8abc:	inc	si			; 00008ABC  46  'F'
                  	inc	si			; 00008ABD  46  'F'
                  	inc	di			; 00008ABE  47  'G'
                  	inc	di			; 00008ABF  47  'G'
                  	jmp	short x8ad5		; 00008AC0  EB13  '..'
                  
                  x8ac2:	cmp	ch,0x1			; 00008AC2  80FD01  '...'
                  	jnz	x8aca			; 00008AC5  7503  'u.'
                  	inc	word [bp+0x2]		; 00008AC7  FF4602  '.F.'
                  x8aca:	cmp	ah,0x0			; 00008ACA  80FC00  '...'
                  	jz	x8ad3			; 00008ACD  7404  't.'
                  	dec	di			; 00008ACF  4F  'O'
                  	dec	di			; 00008AD0  4F  'O'
                  	jmp	short x8ad5		; 00008AD1  EB02  '..'
                  
                  x8ad3:	inc	di			; 00008AD3  47  'G'
                  	inc	di			; 00008AD4  47  'G'
                  x8ad5:	ret				; 00008AD5  C3  '.'
                  
                  	mov	si,dx			; 00008AD6  8BF2  '..'
                  	cmp	ah,0x0			; 00008AD8  80FC00  '...'
                  	jz	x8ae1			; 00008ADB  7404  't.'
                  	dec	di			; 00008ADD  4F  'O'
                  	dec	di			; 00008ADE  4F  'O'
                  	jmp	short x8ae3		; 00008ADF  EB02  '..'
                  
                  x8ae1:	inc	di			; 00008AE1  47  'G'
                  	inc	di			; 00008AE2  47  'G'
                  x8ae3:	ret				; 00008AE3  C3  '.'
                  
                  	mov	si,dx			; 00008AE4  8BF2  '..'
                  	cmp	ch,0x1			; 00008AE6  80FD01  '...'
                  	jnz	x8aee			; 00008AE9  7503  'u.'
                  	dec	word [bp+0x2]		; 00008AEB  FF4E02  '.N.'
                  x8aee:	cmp	ah,0x0			; 00008AEE  80FC00  '...'
                  	jz	x8af7			; 00008AF1  7404  't.'
                  	dec	di			; 00008AF3  4F  'O'
                  	dec	di			; 00008AF4  4F  'O'
                  	jmp	short x8af9		; 00008AF5  EB02  '..'
                  
                  x8af7:	inc	di			; 00008AF7  47  'G'
                  	inc	di			; 00008AF8  47  'G'
                  x8af9:	ret				; 00008AF9  C3  '.'
                  
                  	mov	si,dx			; 00008AFA  8BF2  '..'
                  	cmp	ah,0x0			; 00008AFC  80FC00  '...'
                  	jz	x8b05			; 00008AFF  7404  't.'
                  	dec	si			; 00008B01  4E  'N'
                  	dec	si			; 00008B02  4E  'N'
                  	jmp	short x8b07		; 00008B03  EB02  '..'
                  
                  x8b05:	inc	si			; 00008B05  46  'F'
                  	inc	si			; 00008B06  46  'F'
                  x8b07:	ret				; 00008B07  C3  '.'
                  
                  	std				; 00008B08  FD  '.'
                  	mov	bl,[0x4a]		; 00008B09  8A1E4A00  '..J.'
                  	mov	dx,[bp+0x2]		; 00008B0D  8B5602  '.V.'
                  	cmp	dl,bl			; 00008B10  3AD3  ':.'
                  	jc	x8b18			; 00008B12  7204  'r.'
                  	mov	dl,bl			; 00008B14  8AD3  '..'
                  	dec	dl			; 00008B16  FECA  '..'
                  x8b18:	test	ah,0x1			; 00008B18  F6C401  '...'
                  	jz	x8b29			; 00008B1B  740C  't.'
                  	xchg	cx,dx			; 00008B1D  87CA  '..'
                  	sub	dh,ch			; 00008B1F  2AF5  '*.'
                  	sub	dl,cl			; 00008B21  2AD1  '*.'
                  	neg	dh			; 00008B23  F6DE  '..'
                  	neg	dl			; 00008B25  F6DA  '..'
                  	jmp	short x8b2d		; 00008B27  EB04  '..'
                  
                  x8b29:	sub	dh,ch			; 00008B29  2AF5  '*.'
                  	sub	dl,cl			; 00008B2B  2AD1  '*.'
                  x8b2d:	inc	dh			; 00008B2D  FEC6  '..'
                  	inc	dl			; 00008B2F  FEC2  '..'
                  	call	x8da9			; 00008B31  E87502  '.u.'
                  	jz	x8b57			; 00008B34  7421  't!'
                  	cmp	byte [0x49],0x2		; 00008B36  803E490002  '.>I..'
                  	jc	x8b65			; 00008B3B  7228  'r('
                  	cmp	byte [0x49],0x3		; 00008B3D  803E490003  '.>I..'
                  	ja	x8b57			; 00008B42  7713  'w.'
                  	push	ax			; 00008B44  50  'P'
                  	push	dx			; 00008B45  52  'R'
                  	mov	dx,[0x63]		; 00008B46  8B166300  '..c.'
                  	add	dx,byte +0x4		; 00008B4A  83C204  '...'
                  	mov	al,[0x65]		; 00008B4D  A06500  '.e.'
                  	and	al,0xf7			; 00008B50  24F7  '$.'
                  	out	dx,al			; 00008B52  EE  '.'
                  	pop	dx			; 00008B53  5A  'Z'
                  	pop	ax			; 00008B54  58  'X'
                  	jmp	short x8b65		; 00008B55  EB0E  '..'
                  
                  x8b57:	cmp	byte [0x49],0x4		; 00008B57  803E490004  '.>I..'
                  	jc	x8b65			; 00008B5C  7207  'r.'
                  	cmp	byte [0x49],0x7		; 00008B5E  803E490007  '.>I..'
                  	jnz	x8be1			; 00008B63  757C  'u|'
                  x8b65:	mov	bp,bx			; 00008B65  8BEB  '..'
                  	sub	bp,dx			; 00008B67  2BEA  '+.'
                  	and	bp,0xff			; 00008B69  81E5FF00  '....'
                  	shl	bp,1			; 00008B6D  D1E5  '..'
                  	mov	di,ax			; 00008B6F  8BF8  '..'
                  	mov	al,ch			; 00008B71  8AC5  '..'
                  	mul	bl			; 00008B73  F6E3  '..'
                  	xor	ch,ch			; 00008B75  32ED  '2.'
                  	add	ax,cx			; 00008B77  03C1  '..'
                  	shl	ax,1			; 00008B79  D1E0  '..'
                  	add	ax,[0x4e]		; 00008B7B  03064E00  '..N.'
                  	xchg	ax,di			; 00008B7F  97  '.'
                  	mov	si,es			; 00008B80  8CC6  '..'
                  	mov	ds,si			; 00008B82  8EDE  '..'
                  	mov	si,ax			; 00008B84  8BF0  '..'
                  	mul	bl			; 00008B86  F6E3  '..'
                  	test	si,0x100		; 00008B88  F7C60001  '....'
                  	jz	x8b92			; 00008B8C  7404  't.'
                  	neg	ax			; 00008B8E  F7D8  '..'
                  	neg	bp			; 00008B90  F7DD  '..'
                  x8b92:	shl	ax,1			; 00008B92  D1E0  '..'
                  	add	ax,di			; 00008B94  03C7  '..'
                  	xchg	ax,si			; 00008B96  96  '.'
                  	or	al,al			; 00008B97  0AC0  0x0A,'.'
                  	jz	x8baf			; 00008B99  7414  't.'
                  	cmp	al,dh			; 00008B9B  3AC6  ':.'
                  	jnc	x8baf			; 00008B9D  7310  's.'
                  	sub	dh,al			; 00008B9F  2AF0  '*.'
                  x8ba1:	mov	cl,dl			; 00008BA1  8ACA  '..'
                  	rep	movsw			; 00008BA3  F3A5  '..'
                  	add	si,bp			; 00008BA5  03F5  '..'
                  	add	di,bp			; 00008BA7  03FD  '..'
                  	dec	dh			; 00008BA9  FECE  '..'
                  	jnz	x8ba1			; 00008BAB  75F4  'u.'
                  	mov	dh,al			; 00008BAD  8AF0  '..'
                  x8baf:	mov	ah,bh			; 00008BAF  8AE7  '..'
                  	mov	al,0x20			; 00008BB1  B020  '. '
                  x8bb3:	mov	cl,dl			; 00008BB3  8ACA  '..'
                  	rep	stosw			; 00008BB5  F3AB  '..'
                  	add	di,bp			; 00008BB7  03FD  '..'
                  	dec	dh			; 00008BB9  FECE  '..'
                  	jnz	x8bb3			; 00008BBB  75F6  'u.'
                  	mov	ax,0x40			; 00008BBD  B84000  '.@.'
                  	mov	ds,ax			; 00008BC0  8ED8  '..'
                  	call	x8da9			; 00008BC2  E8E401  '...'
                  	jz	x8be0			; 00008BC5  7419  't.'
                  	cmp	byte [0x49],0x2		; 00008BC7  803E490002  '.>I..'
                  	jc	x8be0			; 00008BCC  7212  'r.'
                  	cmp	byte [0x49],0x3		; 00008BCE  803E490003  '.>I..'
                  	ja	x8be0			; 00008BD3  770B  'w.'
                  	mov	dx,[0x63]		; 00008BD5  8B166300  '..c.'
                  	add	dx,byte +0x4		; 00008BD9  83C204  '...'
                  	mov	al,[0x65]		; 00008BDC  A06500  '.e.'
                  	out	dx,al			; 00008BDF  EE  '.'
                  x8be0:	ret				; 00008BE0  C3  '.'
                  
                  x8be1:	cmp	byte [0x49],0x6		; 00008BE1  803E490006  '.>I..'
                  	jz	x8bec			; 00008BE6  7404  't.'
                  	shl	cl,1			; 00008BE8  D0E1  '..'
                  	shl	dl,1			; 00008BEA  D0E2  '..'
                  x8bec:	mov	bp,0x50			; 00008BEC  BD5000  '.P.'
                  	push	dx			; 00008BEF  52  'R'
                  	mov	di,ax			; 00008BF0  8BF8  '..'
                  	mov	al,ch			; 00008BF2  8AC5  '..'
                  	xor	ch,ch			; 00008BF4  32ED  '2.'
                  	cbw				; 00008BF6  98  '.'
                  	mov	dx,0x140		; 00008BF7  BA4001  '.@.'
                  	mul	dx			; 00008BFA  F7E2  '..'
                  	add	ax,cx			; 00008BFC  03C1  '..'
                  	add	ax,[0x4e]		; 00008BFE  03064E00  '..N.'
                  	xchg	ax,di			; 00008C02  97  '.'
                  	mov	si,ax			; 00008C03  8BF0  '..'
                  	cbw				; 00008C05  98  '.'
                  	mov	dx,0x140		; 00008C06  BA4001  '.@.'
                  	mul	dx			; 00008C09  F7E2  '..'
                  	test	si,0x100		; 00008C0B  F7C60001  '....'
                  	jz	x8c21			; 00008C0F  7410  't.'
                  	neg	ax			; 00008C11  F7D8  '..'
                  	neg	bp			; 00008C13  F7DD  '..'
                  	add	di,0x20f0		; 00008C15  81C7F020  '... '
                  	cmp	byte [0x49],0x6		; 00008C19  803E490006  '.>I..'
                  	jz	x8c21			; 00008C1E  7401  't.'
                  	inc	di			; 00008C20  47  'G'
                  x8c21:	add	ax,di			; 00008C21  03C7  '..'
                  	mov	dx,es			; 00008C23  8CC2  '..'
                  	mov	ds,dx			; 00008C25  8EDA  '..'
                  	xchg	ax,si			; 00008C27  96  '.'
                  	pop	dx			; 00008C28  5A  'Z'
                  	push	bx			; 00008C29  53  'S'
                  	mov	bx,di			; 00008C2A  8BDF  '..'
                  	or	al,al			; 00008C2C  0AC0  0x0A,'.'
                  	jz	x8c60			; 00008C2E  7430  't0'
                  	cmp	al,dh			; 00008C30  3AC6  ':.'
                  	jnc	x8c60			; 00008C32  732C  's,'
                  	sub	dh,al			; 00008C34  2AF0  '*.'
                  	push	ax			; 00008C36  50  'P'
                  	shl	dh,1			; 00008C37  D0E6  '..'
                  	shl	dh,1			; 00008C39  D0E6  '..'
                  	mov	ax,si			; 00008C3B  8BC6  '..'
                  x8c3d:	mov	si,ax			; 00008C3D  8BF0  '..'
                  	mov	di,bx			; 00008C3F  8BFB  '..'
                  	mov	cl,dl			; 00008C41  8ACA  '..'
                  	rep	movsb			; 00008C43  F3A4  '..'
                  	mov	si,ax			; 00008C45  8BF0  '..'
                  	mov	di,bx			; 00008C47  8BFB  '..'
                  	xor	si,0x2000		; 00008C49  81F60020  '... '
                  	xor	di,0x2000		; 00008C4D  81F70020  '... '
                  	mov	cl,dl			; 00008C51  8ACA  '..'
                  	rep	movsb			; 00008C53  F3A4  '..'
                  	add	ax,bp			; 00008C55  03C5  '..'
                  	add	bx,bp			; 00008C57  03DD  '..'
                  	dec	dh			; 00008C59  FECE  '..'
                  	jnz	x8c3d			; 00008C5B  75E0  'u.'
                  	pop	ax			; 00008C5D  58  'X'
                  	mov	dh,al			; 00008C5E  8AF0  '..'
                  x8c60:	shl	dh,1			; 00008C60  D0E6  '..'
                  	shl	dh,1			; 00008C62  D0E6  '..'
                  	pop	ax			; 00008C64  58  'X'
                  	mov	al,ah			; 00008C65  8AC4  '..'
                  x8c67:	mov	di,bx			; 00008C67  8BFB  '..'
                  	mov	cl,dl			; 00008C69  8ACA  '..'
                  	rep	stosb			; 00008C6B  F3AA  '..'
                  	mov	di,bx			; 00008C6D  8BFB  '..'
                  	xor	di,0x2000		; 00008C6F  81F70020  '... '
                  	mov	cl,dl			; 00008C73  8ACA  '..'
                  	rep	stosb			; 00008C75  F3AA  '..'
                  	add	bx,bp			; 00008C77  03DD  '..'
                  	dec	dh			; 00008C79  FECE  '..'
                  	jnz	x8c67			; 00008C7B  75EA  'u.'
                  	ret				; 00008C7D  C3  '.'
                  
                  x8c7e:	push	ds			; 00008C7E  1E  '.'
                  	xor	ebp,ebp			; 00008C7F  6633ED  'f3.'
                  x8c82:	mov	eax,0x1			; 00008C82  66B801000000  'f.....'
                  	xor	eax,ebp			; 00008C88  6633C5  'f3.'
                  	mov	cx,0x4000		; 00008C8B  B90040  '..@'
                  	xor	di,di			; 00008C8E  33FF  '3.'
                  	sahf				; 00008C90  9E  '.'
                  x8c91:	rcl	eax,1			; 00008C91  66D1D0  'f..'
                  	stosd				; 00008C94  66AB  'f.'
                  	loop	x8c91			; 00008C96  E2F9  '..'
                  	in	al,0x61			; 00008C98  E461  '.a'
                  	or	al,0xc			; 00008C9A  0C0C  '..'
                  	out	0x61,al			; 00008C9C  E661  '.a'
                  	and	al,0xf3			; 00008C9E  24F3  '$.'
                  	out	0x61,al			; 00008CA0  E661  '.a'
                  	mov	ebx,0x1			; 00008CA2  66BB01000000  'f.....'
                  	xor	ebx,ebp			; 00008CA8  6633DD  'f3.'
                  	mov	eax,ebp			; 00008CAB  668BC5  'f..'
                  	push	es			; 00008CAE  06  '.'
                  	pop	ds			; 00008CAF  1F  '.'
                  	xor	si,si			; 00008CB0  33F6  '3.'
                  x8cb2:	mov	cx,0x4000		; 00008CB2  B90040  '..@'
                  x8cb5:	sahf				; 00008CB5  9E  '.'
                  	rcl	ebx,1			; 00008CB6  66D1D3  'f..'
                  	lahf				; 00008CB9  9F  '.'
                  	lodsb				; 00008CBA  AC  '.'
                  	inc	si			; 00008CBB  46  'F'
                  	inc	si			; 00008CBC  46  'F'
                  	inc	si			; 00008CBD  46  'F'
                  	xor	al,bl			; 00008CBE  32C3  '2.'
                  	loope	x8cb5			; 00008CC0  E1F3  '..'
                  	jnz	x8ce7			; 00008CC2  7523  'u#'
                  	in	al,0x61			; 00008CC4  E461  '.a'
                  	test	al,0xc0			; 00008CC6  A8C0  '..'
                  	mov	al,0x0			; 00008CC8  B000  '..'
                  	jnz	x8ce7			; 00008CCA  751B  'u.'
                  	mov	cl,0x9			; 00008CCC  B109  '..'
                  	sahf				; 00008CCE  9E  '.'
                  	rcl	ebx,cl			; 00008CCF  66D3D3  'f..'
                  	inc	si			; 00008CD2  46  'F'
                  	cmp	si,byte +0x4		; 00008CD3  83FE04  '...'
                  	jc	x8cb2			; 00008CD6  72DA  'r.'
                  	sahf				; 00008CD8  9E  '.'
                  	mov	cl,0x1f			; 00008CD9  B11F  '..'
                  	rcl	ebx,cl			; 00008CDB  66D3D3  'f..'
                  	lahf				; 00008CDE  9F  '.'
                  	dec	ebp			; 00008CDF  664D  'fM'
                  	jpe	x8c82			; 00008CE1  7A9F  'z.'
                  	pop	ds			; 00008CE3  1F  '.'
                  	xor	ax,ax			; 00008CE4  33C0  '3.'
                  	ret				; 00008CE6  C3  '.'
                  
                  x8ce7:	mov	byte [si],0x0		; 00008CE7  C60400  '...'
                  	push	ax			; 00008CEA  50  'P'
                  	in	al,0x61			; 00008CEB  E461  '.a'
                  	or	al,0xc			; 00008CED  0C0C  '..'
                  	out	0x61,al			; 00008CEF  E661  '.a'
                  	and	al,0xf3			; 00008CF1  24F3  '$.'
                  	out	0x61,al			; 00008CF3  E661  '.a'
                  	pop	cx			; 00008CF5  59  'Y'
                  	mov	dx,si			; 00008CF6  8BD6  '..'
                  	pop	ds			; 00008CF8  1F  '.'
                  	stc				; 00008CF9  F9  '.'
                  	ret				; 00008CFA  C3  '.'
                  
                  	call	x8d30			; 00008CFB  E83200  '.2.'
                  	mov	al,[es:di]		; 00008CFE  268A05  '&..'
                  	not	bh			; 00008D01  F6D7  '..'
                  	and	al,bh			; 00008D03  22C7  '".'
                  	shr	al,cl			; 00008D05  D2E8  '..'
                  	mov	[bp+0x0],al		; 00008D07  884600  '.F.'
                  	ret				; 00008D0A  C3  '.'
                  
                  	call	x8d30			; 00008D0B  E82200  '.".'
                  	cbw				; 00008D0E  98  '.'
                  	and	al,bl			; 00008D0F  22C3  '".'
                  	shl	al,cl			; 00008D11  D2E0  '..'
                  	sar	ah,1			; 00008D13  D0FC  '..'
                  	jns	x8d22			; 00008D15  790B  'y.'
                  	xor	[es:di],al		; 00008D17  263005  '&0.'
                  	mov	ah,[0x49]		; 00008D1A  8A264900  '.&I.'
                  	mov	[bp+0x1],ah		; 00008D1E  886601  '.f.'
                  	ret				; 00008D21  C3  '.'
                  
                  x8d22:	and	bh,[es:di]		; 00008D22  26223D  '&"='
                  	or	al,bh			; 00008D25  0AC7  0x0A,'.'
                  	stosb				; 00008D27  AA  '.'
                  	mov	ah,[0x49]		; 00008D28  8A264900  '.&I.'
                  	mov	[bp+0x1],ah		; 00008D2C  886601  '.f.'
                  	ret				; 00008D2F  C3  '.'
                  
                  x8d30:	xor	di,di			; 00008D30  33FF  '3.'
                  	mov	dx,[bp+0x2]		; 00008D32  8B5602  '.V.'
                  	shr	dx,1			; 00008D35  D1EA  '..'
                  	jnc	x8d3c			; 00008D37  7303  's.'
                  	mov	di,0x2000		; 00008D39  BF0020  '.. '
                  x8d3c:	shl	dx,1			; 00008D3C  D1E2  '..'
                  	shl	dx,1			; 00008D3E  D1E2  '..'
                  	shl	dx,1			; 00008D40  D1E2  '..'
                  	shl	dx,1			; 00008D42  D1E2  '..'
                  	add	di,dx			; 00008D44  03FA  '..'
                  	shl	dx,1			; 00008D46  D1E2  '..'
                  	shl	dx,1			; 00008D48  D1E2  '..'
                  	add	di,dx			; 00008D4A  03FA  '..'
                  	mov	bh,0xfe			; 00008D4C  B7FE  '..'
                  	cmp	byte [0x49],0x6		; 00008D4E  803E490006  '.>I..'
                  	jnc	x8d59			; 00008D53  7304  's.'
                  	rcl	cx,1			; 00008D55  D1D1  '..'
                  	shl	bh,1			; 00008D57  D0E7  '..'
                  x8d59:	mov	bl,bh			; 00008D59  8ADF  '..'
                  	not	bl			; 00008D5B  F6D3  '..'
                  	mov	dx,cx			; 00008D5D  8BD1  '..'
                  	shr	dx,1			; 00008D5F  D1EA  '..'
                  	shr	dx,1			; 00008D61  D1EA  '..'
                  	shr	dx,1			; 00008D63  D1EA  '..'
                  	not	cl			; 00008D65  F6D1  '..'
                  	and	cl,0x7			; 00008D67  80E107  '...'
                  	rol	bh,cl			; 00008D6A  D2C7  '..'
                  	add	di,dx			; 00008D6C  03FA  '..'
                  	ret				; 00008D6E  C3  '.'
                  
                  x8d6f:	mov	al,0xd			; 00008D6F  B00D  '.',0x0D
                  	call	x8d78			; 00008D71  E80400  '...'
                  	jc	x8d8c			; 00008D74  7216  'r.'
                  	mov	al,0xa			; 00008D76  B00A  '.',0x0A
                  
                  x8d78:	push	dx			; 00008D78  52  'R'
                  	xor	dx,dx			; 00008D79  33D2  '3.'
                  	test	al,al			; 00008D7B  84C0  '..'
                  	jnz	x8d81			; 00008D7D  7502  'u.'
                  	mov	al,0x20			; 00008D7F  B020  '. '
                  x8d81:	mov	ah,0x0			; 00008D81  B400  '..'
                  	int	0x17			; 00008D83  CD17  '..'
                  	test	ah,0x1			; 00008D85  F6C401  '...'
                  	jz	x8d8b			; 00008D88  7401  't.'
                  	stc				; 00008D8A  F9  '.'
                  x8d8b:	pop	dx			; 00008D8B  5A  'Z'
                  x8d8c:	ret				; 00008D8C  C3  '.'
                  
                  x8d8d:	dec	di			; 00008D8D  4F  'O'
                  	mov	cx,di			; 00008D8E  8BCF  '..'
                  x8d90:	push	cx			; 00008D90  51  'Q'
                  	mov	cx,0x64			; 00008D91  B96400  '.d.'
                  x8d94:	call	xe944			; 00008D94  E8AD5B  '..['
                  	jz	x8d9f			; 00008D97  7406  't.'
                  	loop	x8d94			; 00008D99  E2F9  '..'
                  	pop	cx			; 00008D9B  59  'Y'
                  	stc				; 00008D9C  F9  '.'
                  	jmp	short x8da8		; 00008D9D  EB09  '..'
                  
                  x8d9f:	call	x919a			; 00008D9F  E8F803  '...'
                  	lodsb				; 00008DA2  AC  '.'
                  	out	dx,al			; 00008DA3  EE  '.'
                  	pop	cx			; 00008DA4  59  'Y'
                  	loop	x8d90			; 00008DA5  E2E9  '..'
                  	clc				; 00008DA7  F8  '.'
                  x8da8:	ret				; 00008DA8  C3  '.'
                  
                  x8da9:	test	byte [0x87],0x4		; 00008DA9  F606870004  '.....'
                  	ret				; 00008DAE  C3  '.'
                  
                  	db	0xFF			; 00008DAF  FF  '.'
                  	jmp	0xf000:0x8e31		; 00008DB0  EA318E00F0  '.1...'
                  
                  	push	ax			; 00008DB5  50  'P'
                  	push	si			; 00008DB6  56  'V'
                  	push	ds			; 00008DB7  1E  '.'
                  	mov	ax,0x40			; 00008DB8  B84000  '.@.'
                  	mov	ds,ax			; 00008DBB  8ED8  '..'
                  	mov	ax,0x3			; 00008DBD  B80300  '...'
                  	call	xd3b4			; 00008DC0  E8F145  '..E'
                  	pop	ds			; 00008DC3  1F  '.'
                  	pop	si			; 00008DC4  5E  '^'
                  	pop	ax			; 00008DC5  58  'X'
                  	iret				; 00008DC6  CF  '.'
                  
                  x8dc7:	mov	bp,bx			; 00008DC7  8BEB  '..'
                  	add	bx,byte +0x10		; 00008DC9  83C310  '...'
                  	cli				; 00008DCC  FA  '.'
                  	mov	ss,bx			; 00008DCD  8ED3  '..'
                  	mov	sp,cx			; 00008DCF  8BE1  '..'
                  	mov	es,cx			; 00008DD1  8EC1  '..'
                  	mov	cx,0x420		; 00008DD3  B92004  '. .'
                  	add	cx,bx			; 00008DD6  03CB  '..'
                  	mov	ss,cx			; 00008DD8  8ED1  '..'
                  	mov	cx,0x49			; 00008DDA  B94900  '.I.'
                  	cld				; 00008DDD  FC  '.'
                  	mov	di,0x300		; 00008DDE  BF0003  '...'
                  	mov	si,0x8eea		; 00008DE1  BEEA8E  '...'
                  	cs	rep movsw		; 00008DE4  F32EA5  '...'
                  	mov	ax,[0x250]		; 00008DE7  A15002  '.P.'
                  	cmp	ax,[0x258]		; 00008DEA  3B065802  ';.X.'
                  	jnz	x8df3			; 00008DEE  7503  'u.'
                  	mov	[0x300],al		; 00008DF0  A20003  '...'
                  x8df3:	cmp	ax,0x157		; 00008DF3  3D5701  '=W.'
                  	jnz	x8e02			; 00008DF6  750A  'u',0x0A
                  	mov	di,0x24			; 00008DF8  BF2400  '.$.'
                  	mov	ax,0xe987		; 00008DFB  B887E9  '...'
                  	stosw				; 00008DFE  AB  '.'
                  	mov	ax,cs			; 00008DFF  8CC8  '..'
                  	stosw				; 00008E01  AB  '.'
                  x8e02:	mov	di,0x6c			; 00008E02  BF6C00  '.l.'
                  	mov	ax,0x8db5		; 00008E05  B8B58D  '...'
                  	stosw				; 00008E08  AB  '.'
                  	mov	ax,cs			; 00008E09  8CC8  '..'
                  	stosw				; 00008E0B  AB  '.'
                  	mov	ax,0xff53		; 00008E0C  B853FF  '.S.'
                  	stosw				; 00008E0F  AB  '.'
                  	mov	ax,cs			; 00008E10  8CC8  '..'
                  	stosw				; 00008E12  AB  '.'
                  	mov	es,bp			; 00008E13  8EC5  '..'
                  	les	ax,[es:0x12]		; 00008E15  26C4061200  '&....'
                  	mov	[0x90],ax		; 00008E1A  A39000  '...'
                  	mov	[0x92],es		; 00008E1D  8C069200  '....'
                  	sti				; 00008E21  FB  '.'
                  	mov	ds,sp			; 00008E22  8EDC  '..'
                  	push	bx			; 00008E24  53  'S'
                  x8e25:	mov	di,0x301		; 00008E25  BF0103  '...'
                  	mov	dx,0x385		; 00008E28  BA8503  '...'
                  	mov	ah,0xf			; 00008E2B  B40F  '..'
                  	int	0x21			; 00008E2D  CD21  '.!'
                  	jmp	short x8e40		; 00008E2F  EB0F  '..'
                  
                  	xor	cx,cx			; 00008E31  33C9  '3.'
                  	mov	ds,cx			; 00008E33  8ED9  '..'
                  	mov	bx,[0x252]		; 00008E35  8B1E5202  '..R.'
                  	test	bx,bx			; 00008E39  85DB  '..'
                  	jnz	x8dc7			; 00008E3B  758A  'u.'
                  	jmp	xe7c0			; 00008E3D  E98059  '..Y'
                  
                  x8e40:	or	al,al			; 00008E40  0AC0  0x0A,'.'
                  	jz	x8e72			; 00008E42  742E  't.'
                  x8e44:	mov	dx,0x302		; 00008E44  BA0203  '...'
                  	mov	ah,0x9			; 00008E47  B409  '..'
                  	int	0x21			; 00008E49  CD21  '.!'
                  	mov	ax,0xc01		; 00008E4B  B8010C  '...'
                  	int	0x21			; 00008E4E  CD21  '.!'
                  	cmp	byte [di],0x0		; 00008E50  803D00  '.=.'
                  	jnz	x8e62			; 00008E53  750D  'u',0x0D
                  	mov	byte [di],0xff		; 00008E55  C605FF  '...'
                  	cmp	al,0xd			; 00008E58  3C0D  '<',0x0D
                  	jnz	x8e62			; 00008E5A  7506  'u.'
                  	mov	ah,0x19			; 00008E5C  B419  '..'
                  	int	0x21			; 00008E5E  CD21  '.!'
                  	add	al,0x41			; 00008E60  0441  '.A'
                  x8e62:	and	al,0x5f			; 00008E62  245F  '$_'
                  	cmp	al,0x41			; 00008E64  3C41  '<A'
                  	jc	x8e44			; 00008E66  72DC  'r.'
                  	mov	[0x359],al		; 00008E68  A25903  '.Y.'
                  	and	al,0xf			; 00008E6B  240F  '$.'
                  	mov	[0x385],al		; 00008E6D  A28503  '...'
                  	jmp	short x8e25		; 00008E70  EBB3  '..'
                  
                  x8e72:	xor	cx,cx			; 00008E72  33C9  '3.'
                  	mov	[0x3a6],cx		; 00008E74  890EA603  '....'
                  	mov	[0x3a8],cx		; 00008E78  890EA803  '....'
                  	inc	cx			; 00008E7C  41  'A'
                  	mov	word [0x393],0x200	; 00008E7D  C70693030002  '......'
                  	xor	dx,dx			; 00008E83  33D2  '3.'
                  	push	ds			; 00008E85  1E  '.'
                  	mov	ds,bx			; 00008E86  8EDB  '..'
                  	mov	ah,0x1a			; 00008E88  B41A  '..'
                  	int	0x21			; 00008E8A  CD21  '.!'
                  	pop	ds			; 00008E8C  1F  '.'
                  	mov	dx,0x385		; 00008E8D  BA8503  '...'
                  	mov	ah,0x27			; 00008E90  B427  '.',0x27
                  	int	0x21			; 00008E92  CD21  '.!'
                  	push	ds			; 00008E94  1E  '.'
                  	mov	ds,bx			; 00008E95  8EDB  '..'
                  	mov	dx,[0x14]		; 00008E97  8B161400  '....'
                  	mov	cx,[0x4]		; 00008E9B  8B0E0400  '....'
                  	pop	ds			; 00008E9F  1F  '.'
                  	push	dx			; 00008EA0  52  'R'
                  	dec	cx			; 00008EA1  49  'I'
                  	push	cx			; 00008EA2  51  'Q'
                  	mov	dx,0x385		; 00008EA3  BA8503  '...'
                  	mov	ah,0x27			; 00008EA6  B427  '.',0x27
                  	int	0x21			; 00008EA8  CD21  '.!'
                  	cmp	al,0x2			; 00008EAA  3C02  '<.'
                  	pop	ax			; 00008EAC  58  'X'
                  	jnz	x8ec9			; 00008EAD  751A  'u.'
                  	xchg	ax,cx			; 00008EAF  91  '.'
                  	sub	cx,ax			; 00008EB0  2BC8  '+.'
                  	push	ds			; 00008EB2  1E  '.'
                  	mov	dx,bx			; 00008EB3  8BD3  '..'
                  	add	dx,0xfe0		; 00008EB5  81C2E00F  '....'
                  	mov	ds,dx			; 00008EB9  8EDA  '..'
                  	xor	dx,dx			; 00008EBB  33D2  '3.'
                  	mov	ah,0x1a			; 00008EBD  B41A  '..'
                  	int	0x21			; 00008EBF  CD21  '.!'
                  	pop	ds			; 00008EC1  1F  '.'
                  	mov	dx,0x385		; 00008EC2  BA8503  '...'
                  	mov	ah,0x27			; 00008EC5  B427  '.',0x27
                  	int	0x21			; 00008EC7  CD21  '.!'
                  x8ec9:	mov	ah,0x10			; 00008EC9  B410  '..'
                  	int	0x21			; 00008ECB  CD21  '.!'
                  	cmp	byte [di],0x0		; 00008ECD  803D00  '.=.'
                  	jz	x8ede			; 00008ED0  740C  't.'
                  	mov	dx,0x33a		; 00008ED2  BA3A03  '.:.'
                  	mov	ah,0x9			; 00008ED5  B409  '..'
                  	int	0x21			; 00008ED7  CD21  '.!'
                  	mov	ax,0xc08		; 00008ED9  B8080C  '...'
                  	int	0x21			; 00008EDC  CD21  '.!'
                  x8ede:	mov	es,bp			; 00008EDE  8EC5  '..'
                  	mov	ds,bp			; 00008EE0  8EDD  '..'
                  	mov	dx,0x80			; 00008EE2  BA8000  '...'
                  	mov	ah,0x1a			; 00008EE5  B41A  '..'
                  	int	0x21			; 00008EE7  CD21  '.!'
                  	retf				; 00008EE9  CB  '.'
                  
                  	dw	0x0000			; 00008EEA  0000  '..'
                  
                  	db	0x0D,0x0A,'Insert COMPAQ MS-DOS diskette',0x0D,0x0A
                  	db	'Enter drive specifier $',0x0D,0x0A,0x0D,0x0A
                  	db	'Reinsert diskette in drive A if necessary',0x0D,0x0A
                  	db	'Strike any key when ready',0x0D,0x0A,'$'
                  	db	0x00
                  
                  	db	'BASICA  EXE',0x00
                  
                  x8f7c:	call	xd47d			; 00008F7C  E8FE44
                  	test	al,0x01			; 00008F7F  A801
                  	jz	x8f98			; 00008F81  7415
                  	call	x9190			; 00008F83  E80A02  '.',0x0A,'.'
                  	mov	ah,[bx]			; 00008F86  8A27  '.',0x27
                  	call	xd490			; 00008F88  E80545  '..E'
                  	call	xc956			; 00008F8B  E8C839  '..9'
                  	xor	ax,ax			; 00008F8E  33C0  '3.'
                  	mov	dx,0x3f7		; 00008F90  BAF703  '...'
                  	in	al,dx			; 00008F93  EC  '.'
                  	test	al,0x80			; 00008F94  A880  '..'
                  	jz	x8fa3			; 00008F96  740B  't.'
                  x8f98:	mov	ah,0x6			; 00008F98  B406  '..'
                  	or	word [bp+0x16],0x1	; 00008F9A  814E160100  '.N...'
                  	mov	[0x41],ah		; 00008F9F  88264100  '.&A.'
                  x8fa3:	ret				; 00008FA3  C3  '.'
                  
                  x8fa4:	call	xd47d			; 00008FA4  E8D644  '..D'
                  	test	al,0x1			; 00008FA7  A801  '..'
                  	jnz	x8faf			; 00008FA9  7504  'u.'
                  	xor	ah,ah			; 00008FAB  32E4  '2.'
                  	jmp	short x900f		; 00008FAD  EB60  '.`'
                  x8faf:	call    x8f7c			; 00008FAF  E8CAFF
                  	jz	x900f			; 00008FB2  745B  't['
                  	call	x9190			; 00008FB4  E8D901  '...'
                  	test	byte [bx],0x10		; 00008FB7  F60710  '...'
                  	jz	x8fcb			; 00008FBA  740F  't.'
                  	mov	ah,[bx]			; 00008FBC  8A27  '.',0x27
                  	cmp	ah,0x97			; 00008FBE  80FC97  '...'
                  	jnz	x8fc6			; 00008FC1  7503  'u.'
                  	add	ah,0x3			; 00008FC3  80C403  '...'
                  x8fc6:	sub	ah,0x13			; 00008FC6  80EC13  '...'
                  	jmp	short x8fdc		; 00008FC9  EB11  '..'
                  
                  x8fcb:	call	xd405			; 00008FCB  E83744  '.7D'
                  	mov	ah,0x87			; 00008FCE  B487  '..'
                  	cmp	al,0x3			; 00008FD0  3C03  '<.'
                  	jz	x8fdc			; 00008FD2  7408  't.'
                  	mov	ah,0x7			; 00008FD4  B407  '..'
                  	cmp	al,0x4			; 00008FD6  3C04  '<.'
                  	jz	x8fdc			; 00008FD8  7402  't.'
                  	mov	ah,0x61			; 00008FDA  B461  '.a'
                  x8fdc:	mov	[bx],ah			; 00008FDC  8827  '.',0x27
                  	call	xd490			; 00008FDE  E8AF44  '..D'
                  	call	xca03			; 00008FE1  E81F3A  '..:'
                  	mov	al,[bp+0x5]		; 00008FE4  8A4605  '.F.'
                  	push	ax			; 00008FE7  50  'P'
                  	mov	byte [bp+0x5],0x2	; 00008FE8  C6460502  '.F..'
                  	call	xee9c			; 00008FEC  E8AD5E  '..^'
                  	mov	byte [bp+0x5],0x0	; 00008FEF  C6460500  '.F..'
                  	call	xee9c			; 00008FF3  E8A65E  '..^'
                  	pop	ax			; 00008FF6  58  'X'
                  	mov	[bp+0x5],al		; 00008FF7  884605  '.F.'
                  	mov	ah,0x6			; 00008FFA  B406  '..'
                  	mov	dx,0x3f7		; 00008FFC  BAF703  '...'
                  	in	al,dx			; 00008FFF  EC  '.'
                  	test	al,0x80			; 00009000  A880  '..'
                  	jz	x9006			; 00009002  7402  't.'
                  	mov	ah,0x80			; 00009004  B480  '..'
                  x9006:	mov	[0x41],ah		; 00009006  88264100  '.&A.'
                  	or	word [bp+0x16],0x1	; 0000900A  814E160100  '.N...'
                  x900f:	ret				; 0000900F  C3  '.'
                  
                  	xor	di,di			; 00009010  33FF  '3.'
                  	call	x8fa4			; 00009012  E88FFF  '...'
                  	jz	x901e			; 00009015  7407  't.'
                  	test	ah,0x80			; 00009017  F6C480  '...'
                  	jnz	x9060			; 0000901A  7544  'uD'
                  	mov	di,ax			; 0000901C  8BF8  '..'
                  x901e:	xor	ah,ah			; 0000901E  32E4  '2.'
                  	mov	al,[bp+0x0]		; 00009020  8A4600  '.F.'
                  	cmp	al,0x5			; 00009023  3C05  '<.'
                  	jc	x9030			; 00009025  7209  'r.'
                  	mov	ah,0x1			; 00009027  B401  '..'
                  	or	word [bp+0x16],0x1	; 00009029  814E160100  '.N...'
                  	jmp	short x9060		; 0000902E  EB30  '.0'
                  
                  x9030:	or	al,al			; 00009030  0AC0  0x0A,'.'
                  	jz	x9056			; 00009032  7422  't"'
                  	mov	ah,0x93			; 00009034  B493  '..'
                  	cmp	al,0x1			; 00009036  3C01  '<.'
                  	jz	x904a			; 00009038  7410  't.'
                  	mov	ah,0x74			; 0000903A  B474  '.t'
                  	cmp	al,0x2			; 0000903C  3C02  '<.'
                  	jz	x9051			; 0000903E  7411  't.'
                  	mov	ah,0x15			; 00009040  B415  '..'
                  	cmp	al,0x3			; 00009042  3C03  '<.'
                  	jz	x9051			; 00009044  740B  't.'
                  	mov	ah,0x97			; 00009046  B497  '..'
                  	jmp	short x9051		; 00009048  EB07  '..'
                  
                  x904a:	mov	al,0x1			; 0000904A  B001  '..'
                  	call	xd468			; 0000904C  E81944  '..D'
                  	jmp	short x9056		; 0000904F  EB05  '..'
                  
                  x9051:	mov	al,0x1			; 00009051  B001  '..'
                  	call	xd455			; 00009053  E8FF43  '..C'
                  x9056:	call	x9190			; 00009056  E83701  '.7.'
                  	mov	[bx],ah			; 00009059  8827  '.',0x27
                  	call	xd490			; 0000905B  E83244  '.2D'
                  	mov	ax,di			; 0000905E  8BC7  '..'
                  x9060:	ret				; 00009060  C3  '.'
                  
                  x9061:	call	x9190			; 00009061  E82C01  '.,.'
                  	mov	ah,[bx]			; 00009064  8A27  '.',0x27
                  	call	xd490			; 00009066  E82744  '.',0x27,'D'
                  	test	ah,0x10			; 00009069  F6C410  '...'
                  	jnz	x9071			; 0000906C  7503  'u.'
                  	call	x9072			; 0000906E  E80100  '...'
                  x9071:	ret				; 00009071  C3  '.'
                  
                  x9072:	call	x9190			; 00009072  E81B01  '...'
                  	mov	al,[bx]			; 00009075  8A07  '..'
                  	mov	[bx+0x2],al		; 00009077  884702  '.G.'
                  	push	word [bp+0x0]		; 0000907A  FF7600  '.v.'
                  	mov	al,[bp+0x5]		; 0000907D  8A4605  '.F.'
                  	cmp	al,0x27			; 00009080  3C27  '<',0x27
                  	ja	x90b9			; 00009082  7735  'w5'
                  	call	xd3f3			; 00009084  E86C43  '.lC'
                  	jnz	x909b			; 00009087  7512  'u.'
                  	call	xd3ff			; 00009089  E87343  '.sC'
                  	cmp	byte [bp+0x6],0x0	; 0000908C  807E0600  '.~..'
                  	jnz	x9095			; 00009090  7503  'u.'
                  	shr	al,0x4			; 00009092  C0E804  '...'
                  x9095:	and	al,0xf			; 00009095  240F  '$.'
                  	cmp	al,0x3			; 00009097  3C03  '<.'
                  	jnc	x90b9			; 00009099  731E  's.'
                  x909b:	call	xca03			; 0000909B  E86539  '.e9'
                  	call	x9190			; 0000909E  E8EF00  '...'
                  	mov	ah,0x61			; 000090A1  B461  '.a'
                  	mov	[bx],ah			; 000090A3  8827  '.',0x27
                  	call	xd490			; 000090A5  E8E843  '..C'
                  	mov	al,0x6			; 000090A8  B006  '..'
                  	mov	byte [bp+0x1],0x4	; 000090AA  C6460104  '.F..'
                  	mov	byte [bp+0x0],0x1	; 000090AE  C6460001  '.F..'
                  	push	ax			; 000090B2  50  'P'
                  	call	xecf0			; 000090B3  E83A5C  '.:\'
                  	pop	ax			; 000090B6  58  'X'
                  	jz	x9129			; 000090B7  7470  'tp'
                  x90b9:	call	xca03			; 000090B9  E84739  '.G9'
                  	call	x9190			; 000090BC  E8D100  '...'
                  	mov	ah,0x2			; 000090BF  B402  '..'
                  	mov	[bx],ah			; 000090C1  8827  '.',0x27
                  	call	xd490			; 000090C3  E8CA43  '..C'
                  	mov	al,0x6			; 000090C6  B006  '..'
                  	mov	byte [bp+0x1],0x4	; 000090C8  C6460104  '.F..'
                  	mov	byte [bp+0x0],0x1	; 000090CC  C6460001  '.F..'
                  	push	ax			; 000090D0  50  'P'
                  	call	xecf0			; 000090D1  E81C5C  '..\'
                  	pop	ax			; 000090D4  58  'X'
                  	jz	x912b			; 000090D5  7454  'tT'
                  	call	xca03			; 000090D7  E82939  '.)9'
                  	call	x9190			; 000090DA  E8B300  '...'
                  	mov	ah,0x87			; 000090DD  B487  '..'
                  	mov	[bx],ah			; 000090DF  8827  '.',0x27
                  	call	xd490			; 000090E1  E8AC43  '..C'
                  	mov	al,0x4			; 000090E4  B004  '..'
                  	mov	byte [bp+0x1],0x4	; 000090E6  C6460104  '.F..'
                  	mov	byte [bp+0x0],0x1	; 000090EA  C6460001  '.F..'
                  	push	ax			; 000090EE  50  'P'
                  	call	xecf0			; 000090EF  E8FE5B  '..['
                  	pop	ax			; 000090F2  58  'X'
                  	jz	x9144			; 000090F3  744F  'tO'
                  	call	xca03			; 000090F5  E80B39  '..9'
                  	call	x9190			; 000090F8  E89500  '...'
                  	mov	ah,0x61			; 000090FB  B461  '.a'
                  	mov	[bx],ah			; 000090FD  8827  '.',0x27
                  	call	xd490			; 000090FF  E88E43  '..C'
                  	mov	al,0x6			; 00009102  B006  '..'
                  	mov	byte [bp+0x1],0x4	; 00009104  C6460104  '.F..'
                  	mov	byte [bp+0x0],0x1	; 00009108  C6460001  '.F..'
                  	push	ax			; 0000910C  50  'P'
                  	call	xecf0			; 0000910D  E8E05B  '..['
                  	pop	ax			; 00009110  58  'X'
                  	jz	x9147			; 00009111  7434  't4'
                  	or	word [bp+0x16],0x1	; 00009113  814E160100  '.N...'
                  	call	x9190			; 00009118  E87500  '.u.'
                  	mov	ah,[bx+0x2]		; 0000911B  8A6702  '.g.'
                  	mov	[bx],ah			; 0000911E  8827  '.',0x27
                  	call	xd490			; 00009120  E86D43  '.mC'
                  	mov	ah,[0x41]		; 00009123  8A264100  '.&A.'
                  	jmp	short x9155		; 00009127  EB2C  '.,'
                  
                  x9129:	jmp	short x9147		; 00009129  EB1C  '..'
                  
                  x912b:	call	xd3f3			; 0000912B  E8C542  '..B'
                  	jnz	x9147			; 0000912E  7517  'u.'
                  	call	xd3ff			; 00009130  E8CC42  '..B'
                  	cmp	byte [bp+0x6],0x0	; 00009133  807E0600  '.~..'
                  	jnz	x913c			; 00009137  7503  'u.'
                  	shr	al,0x4			; 00009139  C0E804  '...'
                  x913c:	and	al,0xf			; 0000913C  240F  '$.'
                  	cmp	al,0x4			; 0000913E  3C04  '<.'
                  	jnz	x9147			; 00009140  7505  'u.'
                  	mov	ah,0x7			; 00009142  B407  '..'
                  x9144:	sub	ah,0x3			; 00009144  80EC03  '...'
                  x9147:	call	xd455			; 00009147  E80B43  '..C'
                  	add	ah,0x13			; 0000914A  80C413  '...'
                  	call	x9190			; 0000914D  E84000  '.@.'
                  	mov	[bx],ah			; 00009150  8827  '.',0x27
                  	call	xd490			; 00009152  E83B43  '.;C'
                  x9155:	mov	byte [bx+0x2],0x0	; 00009155  C6470200  '.G..'
                  	pop	word [bp+0x0]		; 00009159  8F4600  '.F.'
                  	xor	al,al			; 0000915C  32C0  '2.'
                  	push	word [bp+0x16]		; 0000915E  FF7616  '.v.'
                  	popf				; 00009161  9D  '.'
                  	ret				; 00009162  C3  '.'
                  
                  x9163:	xor	al,al			; 00009163  32C0  '2.'
                  	mov	ah,[bp+0x6]		; 00009165  8A6606  '.f.'
                  	cmp	ah,0x2			; 00009168  80FC02  '...'
                  	jc	x9176			; 0000916B  7209  'r.'
                  	mov	ah,0x1			; 0000916D  B401  '..'
                  	or	word [bp+0x16],0x1	; 0000916F  814E160100  '.N...'
                  	jmp	short x918f		; 00009174  EB19  '..'
                  
                  x9176:	mov	ah,0x0			; 00009176  B400  '..'
                  	call	x9190			; 00009178  E81500  '...'
                  	or	al,[bx]			; 0000917B  0A07  0x0A,'.'
                  	jz	x918f			; 0000917D  7410  't.'
                  	mov	ah,0x1			; 0000917F  B401  '..'
                  	test	al,0x10			; 00009181  A810  '..'
                  	jnz	x9187			; 00009183  7502  'u.'
                  	add	al,0x13			; 00009185  0413  '..'
                  x9187:	and	al,0x7			; 00009187  2407  '$.'
                  	sub	al,0x3			; 00009189  2C03  ',.'
                  	jz	x918f			; 0000918B  7402  't.'
                  	mov	ah,0x2			; 0000918D  B402  '..'
                  x918f:	ret				; 0000918F  C3  '.'
                  
                  x9190:	xor	bx,bx			; 00009190  33DB  '3.'
                  	mov	bl,[bp+0x6]		; 00009192  8A5E06  '.^.'
                  	add	bx,0x90			; 00009195  81C39000  '....'
                  	ret				; 00009199  C3  '.'
                  
                  x919a:	push	ax			; 0000919A  50  'P'
                  	pushf				; 0000919B  9C  '.'
                  	cli				; 0000919C  FA  '.'
                  	in	al,0x40			; 0000919D  E440  '.@'
                  	mov	ah,al			; 0000919F  8AE0  '..'
                  x91a1:	in	al,0x40			; 000091A1  E440  '.@'
                  	in	al,0x40			; 000091A3  E440  '.@'
                  	sub	al,ah			; 000091A5  2AC4  '*.'
                  	cmp	al,0xda			; 000091A7  3CDA  '<.'
                  	ja	x91a1			; 000091A9  77F6  'w.'
                  	in	al,0x40			; 000091AB  E440  '.@'
                  	popf				; 000091AD  9D  '.'
                  	pop	ax			; 000091AE  58  'X'
                  	ret				; 000091AF  C3  '.'
                  
                  x91b0:	mov	dx,0x1f6		; 000091B0  BAF601  '...'
                  	mov	al,0xa0			; 000091B3  B0A0  '..'
                  	out	dx,al			; 000091B5  EE  '.'
                  	call	xc5af			; 000091B6  E8F633  '..3'
                  	call	x83f9			; 000091B9  E83DF2  '.=.'
                  	mov	al,0xa8			; 000091BC  B0A8  '..'
                  	out	0x84,al			; 000091BE  E684  '..'
                  	sti				; 000091C0  FB  '.'
                  	mov	dx,0x3f4		; 000091C1  BAF403  '...'
                  	in	al,dx			; 000091C4  EC  '.'
                  	std				; 000091C5  FD  '.'
                  	std				; 000091C6  FD  '.'
                  	std				; 000091C7  FD  '.'
                  	std				; 000091C8  FD  '.'
                  	std				; 000091C9  FD  '.'
                  	std				; 000091CA  FD  '.'
                  	cld				; 000091CB  FC  '.'
                  	and	al,0xf			; 000091CC  240F  '$.'
                  	or	al,al			; 000091CE  0AC0  0x0A,'.'
                  	jz	x91d5			; 000091D0  7403  't.'
                  	jmp	short x922a		; 000091D2  EB56  '.V'
                  
                  	nop				; 000091D4  90  '.'
                  x91d5:	sub	sp,byte +0xd		; 000091D5  83EC0D  '..',0x0D
                  	mov	bp,sp			; 000091D8  8BEC  '..'
                  	xor	ax,ax			; 000091DA  33C0  '3.'
                  	mov	ds,ax			; 000091DC  8ED8  '..'
                  	les	si,[0x78]		; 000091DE  C4367800  '.6x.'
                  	mov	ax,0x40			; 000091E2  B84000  '.@.'
                  	mov	ds,ax			; 000091E5  8ED8  '..'
                  	mov	byte [0x40],0xff	; 000091E7  C6064000FF  '..@..'
                  	call	xca03			; 000091EC  E81438  '..8'
                  	mov	byte [bp+0x6],0x0	; 000091EF  C6460600  '.F..'
                  	mov	byte [bp+0x7],0x0	; 000091F3  C6460700  '.F..'
                  	call	x9293			; 000091F7  E89900  '...'
                  	mov	byte [bp+0x6],0x1	; 000091FA  C6460601  '.F..'
                  	call	x9293			; 000091FE  E89200  '...'
                  	mov	byte [bp+0x5],0x0	; 00009201  C6460500  '.F..'
                  	call	xee9c			; 00009205  E8945C  '..\'
                  	mov	al,0xaf			; 00009208  B0AF  '..'
                  	out	0x84,al			; 0000920A  E684  '..'
                  	mov	dx,0x3f2		; 0000920C  BAF203  '...'
                  	mov	al,0xc			; 0000920F  B00C  '..'
                  	out	dx,al			; 00009211  EE  '.'
                  	and	byte [0x3f],0xf0	; 00009212  80263F00F0  '.&?..'
                  	add	sp,byte +0xd		; 00009217  83C40D  '..',0x0D
                  	mov	al,0xb3			; 0000921A  B0B3  '..'
                  	mov	ah,al			; 0000921C  8AE0  '..'
                  	call	xb544			; 0000921E  E82323  '.##'
                  	and	al,0xf8			; 00009221  24F8  '$.'
                  	xchg	ah,al			; 00009223  86E0  '..'
                  	mov	al,0x33			; 00009225  B033  '.3'
                  	call	xb549			; 00009227  E81F23  '..#'
                  x922a:	xor	ax,ax			; 0000922A  33C0  '3.'
                  	mov	bx,ax			; 0000922C  8BD8  '..'
                  	mov	cx,ax			; 0000922E  8BC8  '..'
                  	or	bl,[0x90]		; 00009230  0A1E9000  0x0A,'...'
                  	jz	x9238			; 00009234  7402  't.'
                  	inc	ch			; 00009236  FEC5  '..'
                  x9238:	or	bh,[0x91]		; 00009238  0A3E9100  0x0A,'>..'
                  	jz	x9240			; 0000923C  7402  't.'
                  	inc	ch			; 0000923E  FEC5  '..'
                  x9240:	or	ch,ch			; 00009240  0AED  0x0A,'.'
                  	jz	x9250			; 00009242  740C  't.'
                  	dec	ch			; 00009244  FECD  '..'
                  	shl	ch,0x6			; 00009246  C0E506  '...'
                  	or	ch,0x1			; 00009249  80CD01  '...'
                  	or	[0x10],ch		; 0000924C  082E1000  '....'
                  x9250:	cli				; 00009250  FA  '.'
                  	call	xd42c			; 00009251  E8D841  '..A'
                  	test	al,0x40			; 00009254  A840  '.@'
                  	jnz	x9291			; 00009256  7539  'u9'
                  	call	xd3fb			; 00009258  E8A041  '..A'
                  	mov	ah,al			; 0000925B  8AE0  '..'
                  	shr	al,0x4			; 0000925D  C0E804  '...'
                  	and	ah,0xf			; 00009260  80E40F  '...'
                  	or	bl,bl			; 00009263  0ADB  0x0A,'.'
                  	jz	x9276			; 00009265  740F  't.'
                  	xchg	bl,ah			; 00009267  86DC  '..'
                  	call	x9303			; 00009269  E89700  '...'
                  	jnz	x9276			; 0000926C  7508  'u.'
                  	xchg	ax,bx			; 0000926E  93  '.'
                  	call	x9303			; 0000926F  E89100  '...'
                  	jz	x9291			; 00009272  741D  't.'
                  	jmp	short x9284		; 00009274  EB0E  '..'
                  
                  x9276:	mov	al,0xb3			; 00009276  B0B3  '..'
                  	mov	ah,al			; 00009278  8AE0  '..'
                  	call	xb544			; 0000927A  E8C722  '.."'
                  	or	al,0x4			; 0000927D  0C04  '..'
                  	xchg	al,ah			; 0000927F  86C4  '..'
                  	call	xb549			; 00009281  E8C522  '.."'
                  x9284:	call	xd42c			; 00009284  E8A541  '..A'
                  	mov	ah,al			; 00009287  8AE0  '..'
                  	or	ah,0x20			; 00009289  80CC20  '.. '
                  	mov	al,0x8e			; 0000928C  B08E  '..'
                  	call	xb549			; 0000928E  E8B822  '.."'
                  x9291:	sti				; 00009291  FB  '.'
                  	ret				; 00009292  C3  '.'
                  
                  x9293:	push	word [bp+0x5]		; 00009293  FF7605  '.v.'
                  	mov	al,0x7			; 00009296  B007  '..'
                  	call	xd468			; 00009298  E8CD41  '..A'
                  	mov	ah,0x93			; 0000929B  B493  '..'
                  	call	xd490			; 0000929D  E8F041  '..A'
                  	call	x9190			; 000092A0  E8EDFE  '...'
                  	mov	byte [bx],0x0		; 000092A3  C60700  '...'
                  	mov	byte [bp+0x5],0x30	; 000092A6  C6460530  '.F.0'
                  	call	xee9c			; 000092AA  E8EF5B  '..['
                  	mov	byte [bp+0x5],0x8	; 000092AD  C6460508  '.F..'
                  x92b1:	call	xee9c			; 000092B1  E8E85B  '..['
                  	mov	bh,0x4			; 000092B4  B704  '..'
                  	call	xd4c4			; 000092B6  E80B42  '..B'
                  	mov	bh,[bp+0x6]		; 000092B9  8A7E06  '.~.'
                  	call	xd4c4			; 000092BC  E80542  '..B'
                  	mov	cx,0xa86b		; 000092BF  B96BA8  '.k.'
                  x92c2:	call	xc9bf			; 000092C2  E8FA36  '..6'
                  	jnz	x92cb			; 000092C5  7504  'u.'
                  	loop	x92c2			; 000092C7  E2F9  '..'
                  	jmp	short x92fe		; 000092C9  EB33  '.3'
                  
                  x92cb:	call	x919a			; 000092CB  E8CCFE  '...'
                  	in	al,dx			; 000092CE  EC  '.'
                  	test	al,0x10			; 000092CF  A810  '..'
                  	jnz	x92de			; 000092D1  750B  'u.'
                  	cmp	byte [bp+0x5],0x0	; 000092D3  807E0500  '.~..'
                  	jz	x92ff			; 000092D7  7426  't&'
                  	dec	byte [bp+0x5]		; 000092D9  FE4E05  '.N.'
                  	jmp	short x92b1		; 000092DC  EBD3  '..'
                  
                  x92de:	mov	ah,0x7			; 000092DE  B407  '..'
                  	mov	al,0x1			; 000092E0  B001  '..'
                  	cmp	byte [bp+0x5],0x0	; 000092E2  807E0500  '.~..'
                  	jnz	x92ed			; 000092E6  7505  'u.'
                  	call	xd455			; 000092E8  E86A41  '.jA'
                  	jmp	short x92f4		; 000092EB  EB07  '..'
                  
                  x92ed:	mov	ah,0x93			; 000092ED  B493  '..'
                  	mov	al,0x1			; 000092EF  B001  '..'
                  	call	xd468			; 000092F1  E87441  '.tA'
                  x92f4:	call	x9190			; 000092F4  E899FE  '...'
                  	mov	[bx],ah			; 000092F7  8827  '.',0x27
                  	call	xd490			; 000092F9  E89441  '..A'
                  	jmp	short x92ff		; 000092FC  EB01  '..'
                  
                  x92fe:	stc				; 000092FE  F9  '.'
                  x92ff:	pop	word [bp+0x5]		; 000092FF  8F4605  '.F.'
                  	ret				; 00009302  C3  '.'
                  
                  x9303:	cmp	al,0x0			; 00009303  3C00  '<.'
                  	jz	x9311			; 00009305  740A  't',0x0A
                  	cmp	al,0x1			; 00009307  3C01  '<.'
                  	jnz	x930f			; 00009309  7504  'u.'
                  	mov	al,0x93			; 0000930B  B093  '..'
                  	jmp	short x9311		; 0000930D  EB02  '..'
                  
                  x930f:	mov	al,0x7			; 0000930F  B007  '..'
                  x9311:	cmp	ah,al			; 00009311  3AE0  ':.'
                  	ret				; 00009313  C3  '.'
                  
                  boot_prompt:
                  	db	0x0D,0x0A,'Non-System disk or disk error',0x0D,0x0A,'replace and strike any key when ready',0x0D,0x0A,'$'
                  
                  boot_error:
                  	db	0x0D,0x0A,'602-Diskette Boot Record Error',0x0D,0x0A,'$'
                  
                  x9380:	mov	bx,0x2			; 00009380  BB0200  '...'
                  	mov	cx,0xfde8		; 00009383  B9E8FD  '...'
                  x9386:	mov	al,0x80			; 00009386  B080  '..'
                  	out	0x70,al			; 00009388  E670  '.p'
                  	in	al,0x71			; 0000938A  E471  '.q'
                  	cmp	al,0xff			; 0000938C  3CFF  '<.'
                  	jnz	x939a			; 0000938E  750A  'u',0x0A
                  	loop	x9386			; 00009390  E2F4  '..'
                  	dec	bx			; 00009392  4B  'K'
                  	jz	x939a			; 00009393  7405  't.'
                  	mov	cx,0xfde8		; 00009395  B9E8FD  '...'
                  	jmp	short x9386		; 00009398  EBEC  '..'
                  
                  x939a:	jmp	bp			; 0000939A  FFE5  '..'
                  
                  	db	0xFF			; 0000939C  FF  '.'
                  	db	0xFF			; 0000939D  FF  '.'
                  	db	0xFF			; 0000939E  FF  '.'
                  	inc	word [bx+si]		; 0000939F  FF00  '..'
                  
                  	times	255 dw 0x0000		; 000093A1 - 0000959D
                  	add	[di-0x75],dl		; 0000959F  00558B  '.U.'
                  	in	al,dx			; 000095A2  EC  '.'
                  	push	eax			; 000095A3  6650  'fP'
                  	push	bx			; 000095A5  53  'S'
                  	push	ds			; 000095A6  1E  '.'
                  	cld				; 000095A7  FC  '.'
                  	mov	al,0x1			; 000095A8  B001  '..'
                  	out	0x85,al			; 000095AA  E685  '..'
                  	mov	bx,[bp+0x4]		; 000095AC  8B5E04  '.^.'
                  	mov	ds,bx			; 000095AF  8EDB  '..'
                  	mov	bx,[bp+0x2]		; 000095B1  8B5E02  '.^.'
                  	mov	bx,[bx]			; 000095B4  8B1F  '..'
                  	cmp	bl,0xf0			; 000095B6  80FBF0  '...'
                  	jnz	x95c5			; 000095B9  750A  'u',0x0A
                  	mov	al,0x12			; 000095BB  B012  '..'
                  	out	0x84,al			; 000095BD  E684  '..'
                  	inc	word [bp+0x2]		; 000095BF  FF4602  '.F.'
                  	jmp	x976a			; 000095C2  E9A501  '...'
                  
                  x95c5:	cmp	bx,0x50f		; 000095C5  81FB0F05  '....'
                  	jz	x95d7			; 000095C9  740C  't.'
                  	mov	al,0x14			; 000095CB  B014  '..'
                  	out	0x84,al			; 000095CD  E684  '..'
                  	pop	ds			; 000095CF  1F  '.'
                  	pop	bx			; 000095D0  5B  '['
                  	pop	eax			; 000095D1  6658  'fX'
                  	pop	bp			; 000095D3  5D  ']'
                  	jmp	x9bd0			; 000095D4  E9F905
                  
                  x95d7:	mov	al,0x13			; 000095D7  B013  '..'
                  	out	0x84,al			; 000095D9  E684  '..'
                  	call	xf305			; 000095DB  E8275D  '.',0x27,']'
                  	push	cs			; 000095DE  0E  '.'
                  	pop	es			; 000095DF  07  '.'
                  	mov	di,0x13a0		; 000095E0  BFA013  '...'
                  	mov	bx,0x80			; 000095E3  BB8000  '...'
                  	mov	ds,bx			; 000095E6  8EDB  '..'
                  	mov	eax,cr0			; 000095E8  0F2000
                  	and	eax,0x80000011		; 000095EB  662511000080  'f%....'
                  	mov	cx,[0x6]		; 000095F1  8B0E0600  '....'
                  	and	ecx,0xf			; 000095F5  6681E10F000000  'f......'
                  	or	eax,ecx			; 000095FC  660BC1  'f..'
                  	stosd				; 000095FF  66AB  'f.'
                  	xor	eax,eax			; 00009601  6633C0  'f3.'
                  	mov	ax,[0x18]		; 00009604  A11800  '...'
                  	stosd				; 00009607  66AB  'f.'
                  	mov	ax,[0x1a]		; 00009609  A11A00  '...'
                  	stosd				; 0000960C  66AB  'f.'
                  	mov	si,0x26			; 0000960E  BE2600  '.&.'
                  	mov	cx,0x8			; 00009611  B90800  '...'
                  x9614:	lodsw				; 00009614  AD  '.'
                  	stosd				; 00009615  66AB  'f.'
                  	loop	x9614			; 00009617  E2FB  '..'
                  	mov	eax,dr6			; 00009619  0F21F0  '.!.'
                  	stosd				; 0000961C  66AB  'f.'
                  	mov	eax,dr7			; 0000961E  0F21F8  '.!.'
                  	stosd				; 00009621  66AB  'f.'
                  	xor	eax,eax			; 00009623  6633C0  'f3.'
                  	mov	ax,[0x16]		; 00009626  A11600  '...'
                  	stosd				; 00009629  66AB  'f.'
                  	mov	si,0x1c			; 0000962B  BE1C00  '...'
                  	lodsw				; 0000962E  AD  '.'
                  	stosd				; 0000962F  66AB  'f.'
                  	mov	ax,gs			; 00009631  8CE8  '..'
                  	stosd				; 00009633  66AB  'f.'
                  	mov	ax,fs			; 00009635  8CE0  '..'
                  	stosd				; 00009637  66AB  'f.'
                  	mov	cx,0x4			; 00009639  B90400  '...'
                  x963c:	lodsw				; 0000963C  AD  '.'
                  	stosd				; 0000963D  66AB  'f.'
                  	loop	x963c			; 0000963F  E2FB  '..'
                  	mov	si,0x60			; 00009641  BE6000  '.`.'
                  	xor	eax,eax			; 00009644  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 00009647  8B4402  '.D.'
                  	stosd				; 0000964A  66AB  'f.'
                  	mov	eax,[si]		; 0000964C  668B04  'f..'
                  	and	eax,0xffffff		; 0000964F  6625FFFFFF00  'f%....'
                  	stosd				; 00009655  66AB  'f.'
                  	xor	eax,eax			; 00009657  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 0000965A  8B4404  '.D.'
                  	stosd				; 0000965D  66AB  'f.'
                  	mov	si,0x5a			; 0000965F  BE5A00  '.Z.'
                  	xor	eax,eax			; 00009662  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 00009665  8B4402  '.D.'
                  	stosd				; 00009668  66AB  'f.'
                  	mov	eax,[si]		; 0000966A  668B04  'f..'
                  	and	eax,0xffffff		; 0000966D  6625FFFFFF00  'f%....'
                  	stosd				; 00009673  66AB  'f.'
                  	xor	eax,eax			; 00009675  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 00009678  8B4404  '.D.'
                  	stosd				; 0000967B  66AB  'f.'
                  	mov	si,0x4e			; 0000967D  BE4E00  '.N.'
                  	xor	eax,eax			; 00009680  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 00009683  8B4402  '.D.'
                  	stosd				; 00009686  66AB  'f.'
                  	mov	eax,[si]		; 00009688  668B04  'f..'
                  	and	eax,0xffffff		; 0000968B  6625FFFFFF00  'f%....'
                  	stosd				; 00009691  66AB  'f.'
                  	xor	eax,eax			; 00009693  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 00009696  8B4404  '.D.'
                  	stosd				; 00009699  66AB  'f.'
                  	mov	si,0x54			; 0000969B  BE5400  '.T.'
                  	xor	eax,eax			; 0000969E  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 000096A1  8B4402  '.D.'
                  	stosd				; 000096A4  66AB  'f.'
                  	mov	eax,[si]		; 000096A6  668B04  'f..'
                  	and	eax,0xffffff		; 000096A9  6625FFFFFF00  'f%....'
                  	stosd				; 000096AF  66AB  'f.'
                  	xor	eax,eax			; 000096B1  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 000096B4  8B4404  '.D.'
                  	stosd				; 000096B7  66AB  'f.'
                  	mov	eax,0x920000		; 000096B9  66B800009200  'f.....'
                  	stosd				; 000096BF  66AB  'f.'
                  	xor	eax,eax			; 000096C1  6633C0  'f3.'
                  	mov	ax,gs			; 000096C4  8CE8  '..'
                  	shl	ax,0x4			; 000096C6  C1E004  '...'
                  	stosd				; 000096C9  66AB  'f.'
                  	mov	ax,0xffff		; 000096CB  B8FFFF  '...'
                  	stosd				; 000096CE  66AB  'f.'
                  	mov	eax,0x920000		; 000096D0  66B800009200  'f.....'
                  	stosd				; 000096D6  66AB  'f.'
                  	xor	eax,eax			; 000096D8  6633C0  'f3.'
                  	mov	ax,fs			; 000096DB  8CE0  '..'
                  	shl	ax,0x4			; 000096DD  C1E004  '...'
                  	stosd				; 000096E0  66AB  'f.'
                  	mov	ax,0xffff		; 000096E2  B8FFFF  '...'
                  	stosd				; 000096E5  66AB  'f.'
                  	mov	si,0x48			; 000096E7  BE4800  '.H.'
                  	xor	eax,eax			; 000096EA  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 000096ED  8B4402  '.D.'
                  	stosd				; 000096F0  66AB  'f.'
                  	mov	eax,[si]		; 000096F2  668B04  'f..'
                  	and	eax,0xffffff		; 000096F5  6625FFFFFF00  'f%....'
                  	stosd				; 000096FB  66AB  'f.'
                  	xor	eax,eax			; 000096FD  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 00009700  8B4404  '.D.'
                  	stosd				; 00009703  66AB  'f.'
                  	mov	si,0x42			; 00009705  BE4200  '.B.'
                  	xor	eax,eax			; 00009708  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 0000970B  8B4402  '.D.'
                  	stosd				; 0000970E  66AB  'f.'
                  	mov	eax,[si]		; 00009710  668B04  'f..'
                  	and	eax,0xffffff		; 00009713  6625FFFFFF00  'f%....'
                  	stosd				; 00009719  66AB  'f.'
                  	xor	eax,eax			; 0000971B  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 0000971E  8B4404  '.D.'
                  	stosd				; 00009721  66AB  'f.'
                  	mov	si,0x3c			; 00009723  BE3C00  '.<.'
                  	xor	eax,eax			; 00009726  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 00009729  8B4402  '.D.'
                  	stosd				; 0000972C  66AB  'f.'
                  	mov	eax,[si]		; 0000972E  668B04  'f..'
                  	and	eax,0xffffff		; 00009731  6625FFFFFF00  'f%....'
                  	stosd				; 00009737  66AB  'f.'
                  	xor	eax,eax			; 00009739  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 0000973C  8B4404  '.D.'
                  	stosd				; 0000973F  66AB  'f.'
                  	mov	si,0x36			; 00009741  BE3600  '.6.'
                  	xor	eax,eax			; 00009744  6633C0  'f3.'
                  	mov	ax,[si+0x2]		; 00009747  8B4402  '.D.'
                  	stosd				; 0000974A  66AB  'f.'
                  	mov	eax,[si]		; 0000974C  668B04  'f..'
                  	and	eax,0xffffff		; 0000974F  6625FFFFFF00  'f%....'
                  	stosd				; 00009755  66AB  'f.'
                  	xor	eax,eax			; 00009757  6633C0  'f3.'
                  	mov	ax,[si+0x4]		; 0000975A  8B4404  '.D.'
                  	stosd				; 0000975D  66AB  'f.'
                  	call	xf2eb			; 0000975F  E8895B  '..['
                  	xor	edi,edi			; 00009762  6633FF  'f3.'
                  	mov	di,0x13a0		; 00009765  BFA013  '...'
                  	loadall				; 00009768  0F07  '..'
                  x976a:	pop	ds			; 0000976A  1F  '.'
                  	pop	bx			; 0000976B  5B  '['
                  	pop	eax			; 0000976C  6658  'fX'
                  	pop	bp			; 0000976E  5D  ']'
                  	iret				; 0000976F  CF  '.'
                  
                  	test	ax,0xa99e		; 00009770  A99EA9  '...'
                  	sahf				; 00009773  9E  '.'
                  	mov	dx,[bx+0x978b]		; 00009774  8B978B97  '....'
                  	mov	[bx+0x979c],ss		; 00009778  8C979C97  '....'
                  	cmp	al,0x5			; 0000977C  3C05  '<.'
                  	ja	x978b			; 0000977E  770B  'w.'
                  	xor	ah,ah			; 00009780  32E4  '2.'
                  	mov	si,ax			; 00009782  8BF0  '..'
                  	shl	si,1			; 00009784  D1E6  '..'
                  	jmp	near [cs:si+0x9770]	; 00009786  2EFFA47097  '...p.'
                  
                  x978b:	ret				; 0000978B  C3  '.'
                  
                  	and	byte [0x87],0xef	; 0000978C  80268700EF  '.&...'
                  	or	bl,bl			; 00009791  0ADB  0x0A,'.'
                  	jnz	x979a			; 00009793  7505  'u.'
                  	or	byte [0x87],0x10	; 00009795  800E870010  '.....'
                  x979a:	clc				; 0000979A  F8  '.'
                  	ret				; 0000979B  C3  '.'
                  
                  	push	dx			; 0000979C  52  'R'
                  	or	bl,bl			; 0000979D  0ADB  0x0A,'.'
                  	jz	x97b3			; 0000979F  7412  't.'
                  	mov	dx,[0x63]		; 000097A1  8B166300  '..c.'
                  	add	dx,byte +0x4		; 000097A5  83C204  '...'
                  	mov	al,[0x65]		; 000097A8  A06500  '.e.'
                  	or	al,0x8			; 000097AB  0C08  '..'
                  	mov	[0x65],al		; 000097AD  A26500  '.e.'
                  	out	dx,al			; 000097B0  EE  '.'
                  	jmp	short x97c3		; 000097B1  EB10  '..'
                  
                  x97b3:	mov	dx,[0x63]		; 000097B3  8B166300  '..c.'
                  	add	dx,byte +0x4		; 000097B7  83C204  '...'
                  	mov	al,[0x65]		; 000097BA  A06500  '.e.'
                  	and	al,0xf7			; 000097BD  24F7  '$.'
                  	mov	[0x65],al		; 000097BF  A26500  '.e.'
                  	out	dx,al			; 000097C2  EE  '.'
                  x97c3:	pop	dx			; 000097C3  5A  'Z'
                  	clc				; 000097C4  F8  '.'
                  	ret				; 000097C5  C3  '.'
                  
                  	xchg	ax,dx			; 000097C6  92  '.'
                  	cmpsb				; 000097C7  A6  '.'
                  	db	0x7E,0xAC
                  	retf	0xac			; 000097CA  CAAC00  '...'
                  
                  	add	ah,0xd0			; 000097CD  80C4D0  '...'
                  	mov	dx,0x9a7		; 000097D0  BAA709  '...'
                  	mov	cx,[bx+si]		; 000097D3  8B08  '..'
                  	mov	bp,[di-0x3e]		; 000097D5  8B6DC2  '.m.'
                  	scasw				; 000097D8  AF  '.'
                  	cbw				; 000097D9  98  '.'
                  	fs	cbw			; 000097DA  6498  'd.'
                  	fsub	qword [bx+0x8d0b]	; 000097DC  DCA70B8D  '....'
                  	sti				; 000097E0  FB  '.'
                  	mov	[bp-0x2f],fs		; 000097E1  8C66D1  '.f.'
                  	jmp	near [bx+0x8322]	; 000097E4  FFA72283  '..".'
                  
                  	and	al,[bp+di+0x8322]	; 000097E8  22832283  '".".'
                  	sub	al,[bp+di+0x977c]	; 000097EC  2A837C97  '*.|.'
                  x97f0:	pop	ax			; 000097F0  58  'X'
                  	pop	dx			; 000097F1  5A  'Z'
                  	pop	cx			; 000097F2  59  'Y'
                  	pop	bx			; 000097F3  5B  '['
                  	pop	si			; 000097F4  5E  '^'
                  	pop	di			; 000097F5  5F  '_'
                  	pop	bp			; 000097F6  5D  ']'
                  	pop	ds			; 000097F7  1F  '.'
                  	pop	es			; 000097F8  07  '.'
                  	iret				; 000097F9  CF  '.'
                  
                  	times	11 db 0xFF		; 000097FA - 00009804
                  	jmp	x9bd0			; 00009805  E9C803
                  
                  	times	74 db 0xFF		; 00009808 - 00009851
                  	jmp	x9c28			; 00009852  E9D303
                  
                  	times	12 db 0xFF		; 00009855 - 00009860
                  	jmp	x9c1f			; 00009861  E9BB03  '...'
                  
                  	call	x8da9			; 00009864  E842F5  '.B.'
                  	jz	x9899			; 00009867  7430  't0'
                  	cmp	byte [0x49],0x4		; 00009869  803E490004  '.>I..'
                  	jc	x987a			; 0000986E  720A  'r',0x0A
                  	cmp	byte [0x49],0x7		; 00009870  803E490007  '.>I..'
                  	jz	x987a			; 00009875  7403  't.'
                  	jmp	short x98f8		; 00009877  EB7F  '..'
                  
                  	nop				; 00009879  90  '.'
                  x987a:	call	xc32b			; 0000987A  E8AE2A  '..*'
                  	mov	dx,[0x63]		; 0000987D  8B166300  '..c.'
                  	add	dx,byte +0x6		; 00009881  83C206  '...'
                  	mov	ah,al			; 00009884  8AE0  '..'
                  x9886:	in	al,dx			; 00009886  EC  '.'
                  	test	al,0x1			; 00009887  A801  '..'
                  	jnz	x9886			; 00009889  75FB  'u.'
                  	cli				; 0000988B  FA  '.'
                  x988c:	in	al,dx			; 0000988C  EC  '.'
                  	test	al,0x1			; 0000988D  A801  '..'
                  	jz	x988c			; 0000988F  74FB  't.'
                  	mov	al,ah			; 00009891  8AC4  '..'
                  	stosb				; 00009893  AA  '.'
                  	inc	di			; 00009894  47  'G'
                  	sti				; 00009895  FB  '.'
                  	loop	x9886			; 00009896  E2EE  '..'
                  	ret				; 00009898  C3  '.'
                  
                  x9899:	cmp	byte [0x49],0x4		; 00009899  803E490004  '.>I..'
                  	jc	x98a7			; 0000989E  7207  'r.'
                  	cmp	byte [0x49],0x7		; 000098A0  803E490007  '.>I..'
                  	jnz	x98f8			; 000098A5  7551  'uQ'
                  x98a7:	call	xc32b			; 000098A7  E8812A  '..*'
                  x98aa:	stosb				; 000098AA  AA  '.'
                  	inc	di			; 000098AB  47  'G'
                  	loop	x98aa			; 000098AC  E2FC  '..'
                  	ret				; 000098AE  C3  '.'
                  
                  	call	x8da9			; 000098AF  E8F7F4  '...'
                  	jz	x98e2			; 000098B2  742E  't.'
                  	cmp	byte [0x49],0x4		; 000098B4  803E490004  '.>I..'
                  	jc	x98c2			; 000098B9  7207  'r.'
                  	cmp	byte [0x49],0x7		; 000098BB  803E490007  '.>I..'
                  	jc	x98f8			; 000098C0  7236  'r6'
                  x98c2:	mov	ah,bl			; 000098C2  8AE3  '..'
                  	call	xc32b			; 000098C4  E8642A  '.d*'
                  	mov	dx,[0x63]		; 000098C7  8B166300  '..c.'
                  	add	dx,byte +0x6		; 000098CB  83C206  '...'
                  	mov	bx,ax			; 000098CE  8BD8  '..'
                  x98d0:	in	al,dx			; 000098D0  EC  '.'
                  	test	al,0x1			; 000098D1  A801  '..'
                  	jnz	x98d0			; 000098D3  75FB  'u.'
                  	cli				; 000098D5  FA  '.'
                  x98d6:	in	al,dx			; 000098D6  EC  '.'
                  	test	al,0x1			; 000098D7  A801  '..'
                  	jz	x98d6			; 000098D9  74FB  't.'
                  	mov	ax,bx			; 000098DB  8BC3  '..'
                  	stosw				; 000098DD  AB  '.'
                  	sti				; 000098DE  FB  '.'
                  	loop	x98d0			; 000098DF  E2EF  '..'
                  	ret				; 000098E1  C3  '.'
                  
                  x98e2:	cmp	byte [0x49],0x4		; 000098E2  803E490004  '.>I..'
                  	jc	x98f0			; 000098E7  7207  'r.'
                  	cmp	byte [0x49],0x7		; 000098E9  803E490007  '.>I..'
                  	jnz	x98f8			; 000098EE  7508  'u.'
                  x98f0:	mov	ah,bl			; 000098F0  8AE3  '..'
                  	call	xc32b			; 000098F2  E8362A  '.6*'
                  	rep	stosw			; 000098F5  F3AB  '..'
                  	ret				; 000098F7  C3  '.'
                  
                  x98f8:	call	xc34d			; 000098F8  E8522A  '.R*'
                  	mov	bl,[bp+0x6]		; 000098FB  8A5E06  '.^.'
                  	mov	bh,[0x49]		; 000098FE  8A3E4900  '.>I.'
                  	mov	dx,cs			; 00009902  8CCA  '..'
                  	mov	ds,dx			; 00009904  8EDA  '..'
                  	mov	si,0xfa6e		; 00009906  BE6EFA  '.n.'
                  	or	al,al			; 00009909  0AC0  0x0A,'.'
                  	jns	x9915			; 0000990B  7908  'y.'
                  	xor	dx,dx			; 0000990D  33D2  '3.'
                  	mov	ds,dx			; 0000990F  8EDA  '..'
                  	lds	si,[0x7c]		; 00009911  C5367C00  '.6|.'
                  x9915:	and	ax,0x7f			; 00009915  257F00  '%..'
                  	shl	ax,1			; 00009918  D1E0  '..'
                  	shl	ax,1			; 0000991A  D1E0  '..'
                  	shl	ax,1			; 0000991C  D1E0  '..'
                  	add	si,ax			; 0000991E  03F0  '..'
                  	cmp	bh,0x6			; 00009920  80FF06  '...'
                  	jz	x9988			; 00009923  7463  'tc'
                  	sub	sp,byte +0x10		; 00009925  83EC10  '...'
                  	mov	ax,sp			; 00009928  8BC4  '..'
                  	push	di			; 0000992A  57  'W'
                  	push	es			; 0000992B  06  '.'
                  	mov	di,ss			; 0000992C  8CD7  '..'
                  	mov	es,di			; 0000992E  8EC7  '..'
                  	push	cx			; 00009930  51  'Q'
                  	push	bx			; 00009931  53  'S'
                  	mov	di,ax			; 00009932  8BF8  '..'
                  	and	bl,0x3			; 00009934  80E303  '...'
                  	mov	ch,0x8			; 00009937  B508  '..'
                  x9939:	lodsb				; 00009939  AC  '.'
                  	mov	cl,0x8			; 0000993A  B108  '..'
                  x993c:	shl	dx,1			; 0000993C  D1E2  '..'
                  	shl	dx,1			; 0000993E  D1E2  '..'
                  	shl	al,1			; 00009940  D0E0  '..'
                  	jnc	x9946			; 00009942  7302  's.'
                  	or	dl,bl			; 00009944  0AD3  0x0A,'.'
                  x9946:	dec	cl			; 00009946  FEC9  '..'
                  	jnz	x993c			; 00009948  75F2  'u.'
                  	mov	al,dh			; 0000994A  8AC6  '..'
                  	mov	ah,dl			; 0000994C  8AE2  '..'
                  	stosw				; 0000994E  AB  '.'
                  	dec	ch			; 0000994F  FECD  '..'
                  	jnz	x9939			; 00009951  75E6  'u.'
                  	pop	bx			; 00009953  5B  '['
                  	pop	dx			; 00009954  5A  'Z'
                  	pop	es			; 00009955  07  '.'
                  	pop	di			; 00009956  5F  '_'
                  	mov	ax,ss			; 00009957  8CD0  '..'
                  	mov	ds,ax			; 00009959  8ED8  '..'
                  x995b:	mov	cx,0x4			; 0000995B  B90400  '...'
                  	mov	si,sp			; 0000995E  8BF4  '..'
                  x9960:	lodsw				; 00009960  AD  '.'
                  	sar	bl,1			; 00009961  D0FB  '..'
                  	jns	x9968			; 00009963  7903  'y.'
                  	xor	ax,[es:di]		; 00009965  263305  '&3.'
                  x9968:	stosw				; 00009968  AB  '.'
                  	add	di,0x1ffe		; 00009969  81C7FE1F  '....'
                  	lodsw				; 0000996D  AD  '.'
                  	sar	bl,1			; 0000996E  D0FB  '..'
                  	jns	x9975			; 00009970  7903  'y.'
                  	xor	ax,[es:di]		; 00009972  263305  '&3.'
                  x9975:	stosw				; 00009975  AB  '.'
                  	sub	di,0x1fb2		; 00009976  81EFB21F  '....'
                  	loop	x9960			; 0000997A  E2E4  '..'
                  	sub	di,0x13e		; 0000997C  81EF3E01  '..>.'
                  	dec	dx			; 00009980  4A  'J'
                  	jnz	x995b			; 00009981  75D8  'u.'
                  	add	sp,byte +0x10		; 00009983  83C410  '...'
                  	jmp	short x99b6		; 00009986  EB2E  '..'
                  
                  x9988:	mov	ah,bl			; 00009988  8AE3  '..'
                  	mov	dx,cx			; 0000998A  8BD1  '..'
                  	mov	bx,si			; 0000998C  8BDE  '..'
                  x998e:	mov	cx,0x4			; 0000998E  B90400  '...'
                  	mov	si,bx			; 00009991  8BF3  '..'
                  x9993:	lodsb				; 00009993  AC  '.'
                  	sar	ah,1			; 00009994  D0FC  '..'
                  	jns	x999b			; 00009996  7903  'y.'
                  	xor	al,[es:di]		; 00009998  263205  '&2.'
                  x999b:	stosb				; 0000999B  AA  '.'
                  	add	di,0x1fff		; 0000999C  81C7FF1F  '....'
                  	lodsb				; 000099A0  AC  '.'
                  	sar	ah,1			; 000099A1  D0FC  '..'
                  	jns	x99a8			; 000099A3  7903  'y.'
                  	xor	al,[es:di]		; 000099A5  263205  '&2.'
                  x99a8:	stosb				; 000099A8  AA  '.'
                  	sub	di,0x1fb1		; 000099A9  81EFB11F  '....'
                  	loop	x9993			; 000099AD  E2E4  '..'
                  	sub	di,0x13f		; 000099AF  81EF3F01  '..?.'
                  	dec	dx			; 000099B3  4A  'J'
                  	jnz	x998e			; 000099B4  75D8  'u.'
                  x99b6:	ret				; 000099B6  C3  '.'
                  
                  x99b7:	mov	ax,0xc800		; 000099B7  B800C8  '...'
                  	cld				; 000099BA  FC  '.'
                  x99bb:	call	x9a0f			; 000099BB  E85100  '.Q.'
                  	cmp	ax,0xdf80		; 000099BE  3D80DF  '=..'
                  	jna	x99bb			; 000099C1  76F8  'v.'
                  	mov	ax,0xe000		; 000099C3  B800E0  '...'
                  	mov	ds,ax			; 000099C6  8ED8  '..'
                  	xor	bx,bx			; 000099C8  33DB  '3.'
                  	cmp	word [bx],0xaa55	; 000099CA  813F55AA  '.?U.'
                  	jnz	x9a09			; 000099CE  7539  'u9'
                  	xor	si,si			; 000099D0  33F6  '3.'
                  	mov	cx,0x8000		; 000099D2  B90080  '...'
                  x99d5:	lodsw				; 000099D5  AD  '.'
                  	add	bl,al			; 000099D6  02D8  '..'
                  	add	bl,ah			; 000099D8  02DC  '..'
                  	loop	x99d5			; 000099DA  E2F9  '..'
                  	jz	x99f6			; 000099DC  7418  't.'
                  	mov	ax,0x40			; 000099DE  B84000  '.@.'
                  	mov	ds,ax			; 000099E1  8ED8  '..'
                  	or	byte [0x12],0xff	; 000099E3  800E1200FF  '.....'
                  	mov	dx,0x5000		; 000099E8  BA0050  '..P'
                  
                  	mov	bx,err101		; 000099EB  BB5AB7  '.Z.'
                  	mov	cx,err101_len		; 000099EE  B90F00  '...'
                  	call	xc745			; 000099F1  E8512D  '.Q-'
                  	jmp	short x9a09		; 000099F4  EB13  '..'
                  
                  x99f6:	mov	ax,0x40			; 000099F6  B84000  '.@.'
                  	mov	es,ax			; 000099F9  8EC0  '..'
                  	push	ds			; 000099FB  1E  '.'
                  	mov	ds,ax			; 000099FC  8ED8  '..'
                  	mov	ax,0x3			; 000099FE  B80300  '...'
                  	push	ax			; 00009A01  50  'P'
                  	mov	bp,sp			; 00009A02  8BEC  '..'
                  	call	far [bp+0x0]		; 00009A04  FF5E00  '.^.'
                  	pop	ax			; 00009A07  58  'X'
                  	pop	ax			; 00009A08  58  'X'
                  x9a09:	mov	ax,0x40			; 00009A09  B84000  '.@.'
                  	mov	ds,ax			; 00009A0C  8ED8  '..'
                  	ret				; 00009A0E  C3  '.'
                  
                  x9a0f:	mov	ds,ax			; 00009A0F  8ED8  '..'
                  	xor	bx,bx			; 00009A11  33DB  '3.'
                  	cmp	word [bx],0xaa55	; 00009A13  813F55AA  '.?U.'
                  	jnz	x9a7b			; 00009A17  7562  'ub'
                  	xor	si,si			; 00009A19  33F6  '3.'
                  	xor	cx,cx			; 00009A1B  33C9  '3.'
                  	mov	ch,[bx+0x2]		; 00009A1D  8A6F02  '.o.'
                  	shl	cx,1			; 00009A20  D1E1  '..'
                  	mov	dx,cx			; 00009A22  8BD1  '..'
                  x9a24:	lodsb				; 00009A24  AC  '.'
                  	add	bl,al			; 00009A25  02D8  '..'
                  	loop	x9a24			; 00009A27  E2FB  '..'
                  	jnz	x9a69			; 00009A29  753E  'u>'
                  	mov	cl,0x4			; 00009A2B  B104  '..'
                  	shr	dx,cl			; 00009A2D  D3EA  '..'
                  	push	dx			; 00009A2F  52  'R'
                  	mov	ax,0x40			; 00009A30  B84000  '.@.'
                  	mov	es,ax			; 00009A33  8EC0  '..'
                  	push	ds			; 00009A35  1E  '.'
                  	mov	ds,ax			; 00009A36  8ED8  '..'
                  	mov	ax,0x3			; 00009A38  B80300  '...'
                  	push	ax			; 00009A3B  50  'P'
                  	mov	si,sp			; 00009A3C  8BF4  '..'
                  	push	bp			; 00009A3E  55  'U'
                  	xor	bp,bp			; 00009A3F  33ED  '3.'
                  	call	far [ss:si]		; 00009A41  36FF1C  '6..'
                  	or	bp,bp			; 00009A44  0BED  '..'
                  	jz	x9a54			; 00009A46  740C  't.'
                  	push	ds			; 00009A48  1E  '.'
                  	mov	ax,0x40			; 00009A49  B84000  '.@.'
                  	mov	ds,ax			; 00009A4C  8ED8  '..'
                  	or	byte [0x12],0xff	; 00009A4E  800E1200FF  '.....'
                  	pop	ds			; 00009A53  1F  '.'
                  x9a54:	pop	bp			; 00009A54  5D  ']'
                  	pop	ax			; 00009A55  58  'X'
                  	mov	ax,ds			; 00009A56  8CD8  '..'
                  	pop	ds			; 00009A58  1F  '.'
                  	pop	dx			; 00009A59  5A  'Z'
                  	mov	bx,ds			; 00009A5A  8CDB  '..'
                  	add	bx,dx			; 00009A5C  03DA  '..'
                  	cmp	ax,bx			; 00009A5E  3BC3  ';.'
                  	jna	x9a7e			; 00009A60  761C  'v.'
                  	cmp	ax,0xdf80		; 00009A62  3D80DF  '=..'
                  	jc	x9a82			; 00009A65  721B  'r.'
                  	jmp	short x9a7e		; 00009A67  EB15  '..'
                  
                  x9a69:	pusha				; 00009A69  60  '`'
                  	push	es			; 00009A6A  06  '.'
                  	push	ds			; 00009A6B  1E  '.'
                  	mov	dx,0x5000		; 00009A6C  BA0050  '..P'
                  	mov	bx,0xb88c		; 00009A6F  BB8CB8  '...'
                  	mov	cx,0x14			; 00009A72  B91400  '...'
                  	call	xc745			; 00009A75  E8CD2C  '..,'
                  	pop	ds			; 00009A78  1F  '.'
                  	pop	es			; 00009A79  07  '.'
                  	popa				; 00009A7A  61  'a'
                  x9a7b:	mov	dx,0x80			; 00009A7B  BA8000  '...'
                  x9a7e:	mov	ax,ds			; 00009A7E  8CD8  '..'
                  	add	ax,dx			; 00009A80  03C2  '..'
                  x9a82:	ret				; 00009A82  C3  '.'
                  
                  x9a83:	push	ds			; 00009A83  1E  '.'
                  	push	es			; 00009A84  06  '.'
                  	mov	ax,0xc000		; 00009A85  B800C0  '...'
                  x9a88:	call	x9ab2			; 00009A88  E82700  '.',0x27,'.'
                  	jnz	x9a94			; 00009A8B  7507  'u.'
                  	cmp	ax,0xc780		; 00009A8D  3D80C7  '=..'
                  	jna	x9a88			; 00009A90  76F6  'v.'
                  	xor	ax,ax			; 00009A92  33C0  '3.'
                  x9a94:	pop	es			; 00009A94  07  '.'
                  	pop	ds			; 00009A95  1F  '.'
                  	ret				; 00009A96  C3  '.'
                  
                  x9a97:	push	ds			; 00009A97  1E  '.'
                  	push	es			; 00009A98  06  '.'
                  	mov	ax,0xc000		; 00009A99  B800C0  '...'
                  x9a9c:	push	ax			; 00009A9C  50  'P'
                  	call	x9ab2			; 00009A9D  E81200  '...'
                  	pop	dx			; 00009AA0  5A  'Z'
                  	jz	x9aaa			; 00009AA1  7407  't.'
                  	push	ax			; 00009AA3  50  'P'
                  	mov	ax,dx			; 00009AA4  8BC2  '..'
                  	call	x9af4			; 00009AA6  E84B00  '.K.'
                  	pop	ax			; 00009AA9  58  'X'
                  x9aaa:	cmp	ax,0xc780		; 00009AAA  3D80C7  '=..'
                  	jna	x9a9c			; 00009AAD  76ED  'v.'
                  	pop	es			; 00009AAF  07  '.'
                  	pop	ds			; 00009AB0  1F  '.'
                  	ret				; 00009AB1  C3  '.'
                  
                  x9ab2:	cld				; 00009AB2  FC  '.'
                  	mov	ds,ax			; 00009AB3  8ED8  '..'
                  	xor	bx,bx			; 00009AB5  33DB  '3.'
                  	cmp	word [bx],0xaa55	; 00009AB7  813F55AA  '.?U.'
                  	jnz	x9aea			; 00009ABB  752D  'u-'
                  	xor	si,si			; 00009ABD  33F6  '3.'
                  	xor	cx,cx			; 00009ABF  33C9  '3.'
                  	mov	ch,[bx+0x2]		; 00009AC1  8A6F02  '.o.'
                  	shl	cx,1			; 00009AC4  D1E1  '..'
                  	mov	dx,cx			; 00009AC6  8BD1  '..'
                  x9ac8:	lodsb				; 00009AC8  AC  '.'
                  	add	bl,al			; 00009AC9  02D8  '..'
                  	loop	x9ac8			; 00009ACB  E2FB  '..'
                  	jnz	x9ad8			; 00009ACD  7509  'u.'
                  	mov	cl,0x4			; 00009ACF  B104  '..'
                  	shr	dx,cl			; 00009AD1  D3EA  '..'
                  	mov	ax,ds			; 00009AD3  8CD8  '..'
                  	add	ax,dx			; 00009AD5  03C2  '..'
                  	ret				; 00009AD7  C3  '.'
                  
                  x9ad8:	pusha				; 00009AD8  60  '`'
                  	push	es			; 00009AD9  06  '.'
                  	push	ds			; 00009ADA  1E  '.'
                  	mov	dx,0x5000		; 00009ADB  BA0050  '..P'
                  	mov	bx,0xb88c		; 00009ADE  BB8CB8  '...'
                  	mov	cx,0x14			; 00009AE1  B91400  '...'
                  	call	xc745			; 00009AE4  E85E2C  '.^,'
                  	pop	ds			; 00009AE7  1F  '.'
                  	pop	es			; 00009AE8  07  '.'
                  	popa				; 00009AE9  61  'a'
                  x9aea:	mov	dx,0x80			; 00009AEA  BA8000  '...'
                  	mov	ax,ds			; 00009AED  8CD8  '..'
                  	add	ax,dx			; 00009AEF  03C2  '..'
                  	xor	dx,dx			; 00009AF1  33D2  '3.'
                  	ret				; 00009AF3  C3  '.'
                  
                  x9af4:	mov	ds,ax			; 00009AF4  8ED8  '..'
                  	mov	ax,0x40			; 00009AF6  B84000  '.@.'
                  	mov	es,ax			; 00009AF9  8EC0  '..'
                  	push	ds			; 00009AFB  1E  '.'
                  	mov	ax,0x3			; 00009AFC  B80300  '...'
                  	push	ax			; 00009AFF  50  'P'
                  	mov	bp,sp			; 00009B00  8BEC  '..'
                  	call	far [bp+0x0]		; 00009B02  FF5E00  '.^.'
                  	pop	ax			; 00009B05  58  'X'
                  	pop	ds			; 00009B06  1F  '.'
                  	ret				; 00009B07  C3  '.'
                  
                  x9b08:	push	cx			; 00009B08  51  'Q'
                  	mov	cx,[cs:si]		; 00009B09  2E8B0C  '...'
                  x9b0c:	inc	si			; 00009B0C  46  'F'
                  	inc	si			; 00009B0D  46  'F'
                  	cmp	ah,[cs:si]		; 00009B0E  2E3A24  '.:$'
                  	jz	x9b18			; 00009B11  7405  't.'
                  	loop	x9b0c			; 00009B13  E2F7  '..'
                  	clc				; 00009B15  F8  '.'
                  	jmp	short x9b1d		; 00009B16  EB05  '..'
                  
                  x9b18:	inc	si			; 00009B18  46  'F'
                  	mov	al,[cs:si]		; 00009B19  2E8A04  '...'
                  	stc				; 00009B1C  F9  '.'
                  x9b1d:	pop	cx			; 00009B1D  59  'Y'
                  	ret				; 00009B1E  C3  '.'
                  
                  	db	0xFF,0x1B,0xB1,0x32,0xB3,0xB4,0xB5,0x36,0xB7,0xB8,0xB9,0xB0,0x2D,0xBD,0x08,0x89
                  	db	'qwertyuiop[]'
                  	db	0x0D,0xFF
                  	db	'asdfghjkl'
                  	db	0xBB,0xA7,0xE0,0xFF
                  	db	'\zxcvbnm'
                  	db	0xAC,0xAE,0xAF,0xFF,0x2A,0xFF,0x20,0xFF,0x1B
                  	db	'!@#$%^&*()_+'
                  	db	0x08,0x0F,0x0B,0x00,0x1A,0x7B,0x1B,0x7D,0x1C,0x0D,0x27
                  	db	':(")~+|3<4>5?9 789-456+1230.'
                  	db	0x0D,0x00
                  	db	0x47,0x77,0x49,0x84,0x4B,0x73
                  	db	'MtOuQvH'
                  	db	0x8D,0x4A,0x8E
                  	db	0x4C,0x8F,0x4E,0x90,0x50,0x91,0x52,0x92,0x53,0x93,0x06,0x00,0x07,0x1E,0x0C,0x1F,0x1A,0x1B,0x1B,0x1D
                  	db	0x1C,0x0A,0x2B,0x1C,0x0A,0x00,0x47,0x97,0x48,0x98,0x49,0x99,0x4B,0x9B,0x4D,0x9D,0x4F,0x9F,0x50,0xA0
                  	db	0x51,0xA1,0x52,0xA2,0x53,0xA3
                  	db	0xFF,0xFF
                  
                  x9bd0:	push	ax			; 00009BD0  50
                  	mov	al,0x01			; 00009BD1  B001
                  	out	0x85,al			; 00009BD3  E685
                  	mov	al,0x10			; 00009BD5  B010
                  	out	0x84,al			; 00009BD7  E684
                  	pop	ax			; 00009BD9  58
                  	jmp	xe900			; 00009BDA  E9234D
                  
                  x9bdd:	cli				; 00009BDD  FA
                  	and	al,0xf7			; 00009BDE  24F7  '$.'
                  	add	dx,byte +0x4		; 00009BE0  83C204  '...'
                  	out	dx,al			; 00009BE3  EE  '.'
                  	xchg	ah,al			; 00009BE4  86E0  '..'
                  	inc	dx			; 00009BE6  42  'B'
                  	out	dx,al			; 00009BE7  EE  '.'
                  	sub	dx,byte +0x5		; 00009BE8  83EA05  '...'
                  x9beb:	xor	ah,ah			; 00009BEB  32E4  '2.'
                  x9bed:	mov	al,ah			; 00009BED  8AC4  '..'
                  	out	dx,al			; 00009BEF  EE  '.'
                  	inc	dx			; 00009BF0  42  'B'
                  	inc	ah			; 00009BF1  FEC4  '..'
                  	lodsb				; 00009BF3  AC  '.'
                  	out	dx,al			; 00009BF4  EE  '.'
                  	dec	dx			; 00009BF5  4A  'J'
                  	loop	x9bed			; 00009BF6  E2F5  '..'
                  	jmp	bp			; 00009BF8  FFE5  '..'
                  ;
                  ;   Clear the screen (DS=F000, BX=BA77 for CGA or BA86 for Mono)
                  ;
                  x9bfa:	mov	ax,0x720		; 00009BFA  B82007  '. .'
                  	mov	es,[bx+0x6]		; 00009BFD  8E4706  '.G.'
                  	xor	di,di			; 00009C00  33FF  '3.'
                  	mov	cx,0x2000		; 00009C02  B90020  '.. '
                  	rep	stosw			; 00009C05  F3AB  '..'
                  	mov	dx,[bx]			; 00009C07  8B17  '..'
                  	mov	al,[bx+0x3]		; 00009C09  8A4703  '.G.'
                  	out	dx,al			; 00009C0C  EE  '.'
                  	jmp	bp			; 00009C0D  FFE5  '..'
                  
                  	times	16 db 0xFF		; 00009C0F - 00009C1E
                  
                  x9c1f:	jmp	x9cac			; 00009C1F  E98A00  '...'
                  
                  	times	6 db 0xFF		; 00009C22 - 00009C27
                  
                  x9c28:	push	ax			; 00009C28  50
                  	push	es			; 00009C29  06
                  	mov	al,0x1			; 00009C2A  B001  '..'
                  	out	0x85,al			; 00009C2C  E685  '..'
                  	mov	al,0x17			; 00009C2E  B017  '..'
                  	out	0x84,al			; 00009C30  E684  '..'
                  	mov	ax,0x40			; 00009C32  B84000  '.@.'
                  	mov	es,ax			; 00009C35  8EC0  '..'
                  	mov	al,0x20			; 00009C37  B020  '. '
                  	out	0xa0,al			; 00009C39  E6A0  '..'
                  	out	0x20,al			; 00009C3B  E620  '. '
                  	xor	al,al			; 00009C3D  32C0  '2.'
                  	out	0xf0,al			; 00009C3F  E6F0  '..'
                  	test	byte [es:0x97],0x20	; 00009C41  26F606970020  '&.... '
                  	jz	x9c54			; 00009C47  740B  't.'
                  	and	byte [es:0x97],0xdf	; 00009C49  2680269700DF  '&.&...'
                  	pop	es			; 00009C4F  07  '.'
                  	pop	ax			; 00009C50  58  'X'
                  	int	0x2			; 00009C51  CD02  '..'
                  	iret				; 00009C53  CF  '.'
                  
                  x9c54:	cld				; 00009C54  FC  '.'
                  	push	bp			; 00009C55  55  'U'
                  	push	bx			; 00009C56  53  'S'
                  	push	si			; 00009C57  56  'V'
                  	push	cx			; 00009C58  51  'Q'
                  	push	ds			; 00009C59  1E  '.'
                  	sub	sp,byte +0x10		; 00009C5A  83EC10  '...'
                  	mov	bp,sp			; 00009C5D  8BEC  '..'
                  	or	byte [es:0x97],0x20	; 00009C5F  26800E970020  '&.... '
                  	fnstenv	[bp+0x0]		; 00009C65  D97600  '.v.'
                  	wait				; 00009C68  9B  '.'
                  	mov	ax,[bp+0x6]		; 00009C69  8B4606  '.F.'
                  	mov	si,ax			; 00009C6C  8BF0  '..'
                  	and	si,0xf			; 00009C6E  81E60F00  '....'
                  	shr	ax,0x4			; 00009C72  C1E804  '...'
                  	mov	bx,[bp+0x8]		; 00009C75  8B5E08  '.^.'
                  	and	bx,0xf000		; 00009C78  81E300F0  '....'
                  	or	ax,bx			; 00009C7C  0BC3  '..'
                  	mov	ds,ax			; 00009C7E  8ED8  '..'
                  	mov	cx,0x10			; 00009C80  B91000  '...'
                  x9c83:	lodsb				; 00009C83  AC  '.'
                  	mov	ah,al			; 00009C84  8AE0  '..'
                  	and	al,0xf8			; 00009C86  24F8  '$.'
                  	cmp	al,0xd8			; 00009C88  3CD8  '<.'
                  	jz	x9c91			; 00009C8A  7405  't.'
                  	loop	x9c83			; 00009C8C  E2F5  '..'
                  	jmp	short x9c9d		; 00009C8E  EB0D  '.',0x0D
                  
                  	nop				; 00009C90  90  '.'
                  x9c91:	lodsb				; 00009C91  AC  '.'
                  	and	ax,0x7ff		; 00009C92  25FF07  '%..'
                  	and	word [bp+0x8],0xf800	; 00009C95  81660800F8  '.f...'
                  	or	[bp+0x8],ax		; 00009C9A  094608  '.F.'
                  x9c9d:	wait				; 00009C9D  9B  '.'
                  	fldenv	[bp+0x0]		; 00009C9E  D96600  '.f.'
                  	add	sp,byte +0x10		; 00009CA1  83C410  '...'
                  	pop	ds			; 00009CA4  1F  '.'
                  	pop	cx			; 00009CA5  59  'Y'
                  	pop	si			; 00009CA6  5E  '^'
                  	pop	bx			; 00009CA7  5B  '['
                  	pop	bp			; 00009CA8  5D  ']'
                  	pop	es			; 00009CA9  07  '.'
                  	pop	ax			; 00009CAA  58  'X'
                  	iret				; 00009CAB  CF  '.'
                  
                  x9cac:	push	ax			; 00009CAC  50  'P'
                  	mov	al,0x1			; 00009CAD  B001  '..'
                  	out	0x85,al			; 00009CAF  E685  '..'
                  	mov	al,0x16			; 00009CB1  B016  '..'
                  	out	0x84,al			; 00009CB3  E684  '..'
                  	mov	al,0x20			; 00009CB5  B020  '. '
                  	out	0xa0,al			; 00009CB7  E6A0  '..'
                  	pop	ax			; 00009CB9  58  'X'
                  	int	0xa			; 00009CBA  CD0A  '.',0x0A
                  	iret				; 00009CBC  CF  '.'
                  
                  	push	ds			; 00009CBD  1E  '.'
                  	push	ax			; 00009CBE  50  'P'
                  	mov	ax,0x40			; 00009CBF  B84000  '.@.'
                  	mov	ds,ax			; 00009CC2  8ED8  '..'
                  	pop	ax			; 00009CC4  58  'X'
                  	xor	al,al			; 00009CC5  32C0  '2.'
                  	cli				; 00009CC7  FA  '.'
                  	xchg	al,[0x70]		; 00009CC8  86067000  '..p.'
                  	mov	cx,[0x6e]		; 00009CCC  8B0E6E00  '..n.'
                  	mov	dx,[0x6c]		; 00009CD0  8B166C00  '..l.'
                  	sti				; 00009CD4  FB  '.'
                  	pop	ds			; 00009CD5  1F  '.'
                  	jmp	xfe81			; 00009CD6  E9A861  '..a'
                  
                  	push	ds			; 00009CD9  1E  '.'
                  	push	ax			; 00009CDA  50  'P'
                  	mov	ax,0x40			; 00009CDB  B84000  '.@.'
                  	mov	ds,ax			; 00009CDE  8ED8  '..'
                  	cli				; 00009CE0  FA  '.'
                  	mov	[0x6e],cx		; 00009CE1  890E6E00  '..n.'
                  	mov	[0x6c],dx		; 00009CE5  89166C00  '..l.'
                  	mov	byte [0x70],0x0		; 00009CE9  C606700000  '..p..'
                  	sti				; 00009CEE  FB  '.'
                  	pop	ax			; 00009CEF  58  'X'
                  	pop	ds			; 00009CF0  1F  '.'
                  	jmp	xfe81			; 00009CF1  E98D61  '..a'
                  
                  	call	x9d0f			; 00009CF4  E81800  '...'
                  	mov	al,0x0			; 00009CF7  B000  '..'
                  	call	xb544			; 00009CF9  E84818  '.H.'
                  	mov	dh,al			; 00009CFC  8AF0  '..'
                  	mov	al,0x2			; 00009CFE  B002  '..'
                  	call	xb544			; 00009D00  E84118  '.A.'
                  	mov	cl,al			; 00009D03  8AC8  '..'
                  	mov	al,0x4			; 00009D05  B004  '..'
                  	call	xb544			; 00009D07  E83A18  '.:.'
                  	mov	ch,al			; 00009D0A  8AE8  '..'
                  	jmp	xfe81			; 00009D0C  E97261  '.ra'
                  
                  x9d0f:	mov	al,0xa			; 00009D0F  B00A  '.',0x0A
                  	cli				; 00009D11  FA  '.'
                  	call	xb544			; 00009D12  E82F18  './.'
                  	test	al,0x80			; 00009D15  A880  '..'
                  	jz	x9d1c			; 00009D17  7403  't.'
                  	sti				; 00009D19  FB  '.'
                  	jmp	short x9d0f		; 00009D1A  EBF3  '..'
                  
                  x9d1c:	ret				; 00009D1C  C3  '.'
                  
                  	call	x9d0f			; 00009D1D  E8EFFF  '...'
                  	mov	al,0x0			; 00009D20  B000  '..'
                  	mov	ah,dh			; 00009D22  8AE6  '..'
                  	call	xb549			; 00009D24  E82218  '.".'
                  	mov	al,0x2			; 00009D27  B002  '..'
                  	mov	ah,cl			; 00009D29  8AE1  '..'
                  	call	xb549			; 00009D2B  E81B18  '...'
                  	mov	al,0x4			; 00009D2E  B004  '..'
                  	mov	ah,ch			; 00009D30  8AE5  '..'
                  	call	xb549			; 00009D32  E81418  '...'
                  	mov	al,0xb			; 00009D35  B00B  '..'
                  	call	xb544			; 00009D37  E80A18  '.',0x0A,'.'
                  	or	al,0x2			; 00009D3A  0C02  '..'
                  	and	al,0xfb			; 00009D3C  24FB  '$.'
                  	and	al,0xfe			; 00009D3E  24FE  '$.'
                  	test	dl,dl			; 00009D40  84D2  '..'
                  	jz	x9d46			; 00009D42  7402  't.'
                  	or	al,0x1			; 00009D44  0C01  '..'
                  x9d46:	mov	ah,al			; 00009D46  8AE0  '..'
                  	mov	al,0xb			; 00009D48  B00B  '..'
                  	call	xb549			; 00009D4A  E8FC17  '...'
                  	jmp	xfe81			; 00009D4D  E93161  '.1a'
                  
                  	call	x9d0f			; 00009D50  E8BCFF  '...'
                  	mov	al,0x7			; 00009D53  B007  '..'
                  	call	xb544			; 00009D55  E8EC17  '...'
                  	mov	dl,al			; 00009D58  8AD0  '..'
                  	mov	al,0x8			; 00009D5A  B008  '..'
                  	call	xb544			; 00009D5C  E8E517  '...'
                  	mov	dh,al			; 00009D5F  8AF0  '..'
                  	mov	al,0x9			; 00009D61  B009  '..'
                  	call	xb544			; 00009D63  E8DE17  '...'
                  	mov	cl,al			; 00009D66  8AC8  '..'
                  	mov	al,0x32			; 00009D68  B032  '.2'
                  	call	xb544			; 00009D6A  E8D717  '...'
                  	mov	ch,al			; 00009D6D  8AE8  '..'
                  	jmp	xfe81			; 00009D6F  E90F61  '..a'
                  
                  	call	x9d0f			; 00009D72  E89AFF  '...'
                  	mov	ax,0x6			; 00009D75  B80600  '...'
                  	call	xb549			; 00009D78  E8CE17  '...'
                  	mov	al,0x7			; 00009D7B  B007  '..'
                  	mov	ah,dl			; 00009D7D  8AE2  '..'
                  	call	xb549			; 00009D7F  E8C717  '...'
                  	mov	al,0x8			; 00009D82  B008  '..'
                  	mov	ah,dh			; 00009D84  8AE6  '..'
                  	call	xb549			; 00009D86  E8C017  '...'
                  	mov	al,0x9			; 00009D89  B009  '..'
                  	mov	ah,cl			; 00009D8B  8AE1  '..'
                  	call	xb549			; 00009D8D  E8B917  '...'
                  	mov	al,0xb			; 00009D90  B00B  '..'
                  	call	xb544			; 00009D92  E8AF17  '...'
                  	or	al,0x2			; 00009D95  0C02  '..'
                  	and	al,0xfb			; 00009D97  24FB  '$.'
                  	mov	ah,al			; 00009D99  8AE0  '..'
                  	mov	al,0xb			; 00009D9B  B00B  '..'
                  	call	xb549			; 00009D9D  E8A917  '...'
                  	mov	al,0x32			; 00009DA0  B032  '.2'
                  	mov	ah,ch			; 00009DA2  8AE5  '..'
                  	call	xb549			; 00009DA4  E8A217  '...'
                  	jmp	xfe81			; 00009DA7  E9D760  '..`'
                  
                  	cli				; 00009DAA  FA  '.'
                  	mov	al,0xb			; 00009DAB  B00B  '..'
                  	call	xb544			; 00009DAD  E89417  '...'
                  	test	al,0x20			; 00009DB0  A820  '. '
                  	jz	x9dbc			; 00009DB2  7408  't.'
                  	sti				; 00009DB4  FB  '.'
                  	pop	bx			; 00009DB5  5B  '['
                  	xor	ax,ax			; 00009DB6  33C0  '3.'
                  	stc				; 00009DB8  F9  '.'
                  	retf	0x2			; 00009DB9  CA0200  '...'
                  
                  x9dbc:	mov	al,0xa			; 00009DBC  B00A  '.',0x0A
                  	call	xb544			; 00009DBE  E88317  '...'
                  	test	al,0x80			; 00009DC1  A880  '..'
                  	jnz	x9dbc			; 00009DC3  75F7  'u.'
                  	mov	al,0x1			; 00009DC5  B001  '..'
                  	mov	ah,dh			; 00009DC7  8AE6  '..'
                  	call	xb549			; 00009DC9  E87D17  '.}.'
                  	mov	al,0x3			; 00009DCC  B003  '..'
                  	mov	ah,cl			; 00009DCE  8AE1  '..'
                  	call	xb549			; 00009DD0  E87617  '.v.'
                  	mov	al,0x5			; 00009DD3  B005  '..'
                  	mov	ah,ch			; 00009DD5  8AE5  '..'
                  	call	xb549			; 00009DD7  E86F17  '.o.'
                  	in	al,0xa1			; 00009DDA  E4A1  '..'
                  	and	al,0xfe			; 00009DDC  24FE  '$.'
                  	out	0xa1,al			; 00009DDE  E6A1  '..'
                  	mov	al,0xb			; 00009DE0  B00B  '..'
                  	call	xb544			; 00009DE2  E85F17  '._.'
                  	or	al,0x20			; 00009DE5  0C20  '. '
                  	mov	ah,al			; 00009DE7  8AE0  '..'
                  	mov	al,0xb			; 00009DE9  B00B  '..'
                  	call	xb549			; 00009DEB  E85B17  '.[.'
                  	jmp	xfe81			; 00009DEE  E99060  '..`'
                  
                  	cli				; 00009DF1  FA  '.'
                  	mov	al,0xb			; 00009DF2  B00B  '..'
                  	call	xb544			; 00009DF4  E84D17  '.M.'
                  	and	al,0xdf			; 00009DF7  24DF  '$.'
                  	mov	ah,al			; 00009DF9  8AE0  '..'
                  	mov	al,0xb			; 00009DFB  B00B  '..'
                  	call	xb549			; 00009DFD  E84917  '.I.'
                  	jmp	xfe81			; 00009E00  E97E60  '.~`'
                  
                  x9e03:	mov	ah,bl			; 00009E03  8AE3  '..'
                  x9e05:	mov	cx,0xf424		; 00009E05  B924F4  '.$.'
                  x9e08:	in	al,dx			; 00009E08  EC  '.'
                  	test	bh,al			; 00009E09  84C7  '..'
                  	jnz	x9e19			; 00009E0B  750C  'u.'
                  	call	x919a			; 00009E0D  E88AF3  '...'
                  	loop	x9e08			; 00009E10  E2F6  '..'
                  	dec	ah			; 00009E12  FECC  '..'
                  	jnz	x9e05			; 00009E14  75EF  'u.'
                  	mov	ah,0x80			; 00009E16  B480  '..'
                  	ret				; 00009E18  C3  '.'
                  
                  x9e19:	mov	ah,0x0			; 00009E19  B400  '..'
                  	ret				; 00009E1B  C3  '.'
                  
                  x9e1c:	xor	ax,ax			; 00009E1C  33C0  '3.'
                  	mov	di,0xffe		; 00009E1E  BFFE0F  '...'
                  	mov	[es:di],ax		; 00009E21  268905  '&..'
                  	stc				; 00009E24  F9  '.'
                  	stc				; 00009E25  F9  '.'
                  	stc				; 00009E26  F9  '.'
                  	stc				; 00009E27  F9  '.'
                  	stc				; 00009E28  F9  '.'
                  	cmp	[es:di],ax		; 00009E29  263905  '&9.'
                  	stc				; 00009E2C  F9  '.'
                  	stc				; 00009E2D  F9  '.'
                  	stc				; 00009E2E  F9  '.'
                  	stc				; 00009E2F  F9  '.'
                  	stc				; 00009E30  F9  '.'
                  	ret				; 00009E31  C3  '.'
                  
                  x9e32:	mov	al,0xe			; 00009E32  B00E  '..'
                  	pushf				; 00009E34  9C  '.'
                  	cli				; 00009E35  FA  '.'
                  	call	xb544			; 00009E36  E80B17  '...'
                  	push	cs			; 00009E39  0E  '.'
                  	call	x9e40			; 00009E3A  E80300  '...'
                  	jmp	short x9e41		; 00009E3D  EB02  '..'
                  
                  	nop				; 00009E3F  90  '.'
                  
                  x9e40:	iret				; 00009E40  CF  '.'
                  
                  x9e41:	test	al,0xc0			; 00009E41  A8C0  '..'
                  	jnz	x9e57			; 00009E43  7512  'u.'
                  	pushf				; 00009E45  9C  '.'
                  	cli				; 00009E46  FA  '.'
                  	mov	al,0x2d			; 00009E47  B02D  '.-'
                  	call	xb544			; 00009E49  E8F816  '...'
                  	push	cs			; 00009E4C  0E  '.'
                  	call	x9e53			; 00009E4D  E80300  '...'
                  	jmp	short x9e54		; 00009E50  EB02  '..'
                  
                  	nop				; 00009E52  90  '.'
                  
                  x9e53:	iret				; 00009E53  CF  '.'
                  
                  x9e54:	and	al,0x1			; 00009E54  2401  '$.'
                  	ret				; 00009E56  C3  '.'
                  
                  x9e57:	xor	ax,ax			; 00009E57  33C0  '3.'
                  	ret				; 00009E59  C3  '.'
                  
                  x9e5a:	mov	al,0x8e			; 00009E5A  B08E  '..'
                  	pushf				; 00009E5C  9C  '.'
                  	cli				; 00009E5D  FA  '.'
                  	call	xb544			; 00009E5E  E8E316  '...'
                  	push	cs			; 00009E61  0E  '.'
                  	call	x9e68			; 00009E62  E80300  '...'
                  	jmp	short x9e69		; 00009E65  EB02  '..'
                  
                  	nop				; 00009E67  90  '.'
                  
                  x9e68:	iret				; 00009E68  CF  '.'
                  
                  x9e69:	test	al,0xc0			; 00009E69  A8C0  '..'
                  	jnz	x9e7f			; 00009E6B  7512  'u.'
                  	pushf				; 00009E6D  9C  '.'
                  	cli				; 00009E6E  FA  '.'
                  	mov	al,0xad			; 00009E6F  B0AD  '..'
                  	call	xb544			; 00009E71  E8D016  '...'
                  	push	cs			; 00009E74  0E  '.'
                  	call	x9e7b			; 00009E75  E80300  '...'
                  	jmp	short x9e7c		; 00009E78  EB02  '..'
                  
                  	nop				; 00009E7A  90  '.'
                  
                  x9e7b:	iret				; 00009E7B  CF  '.'
                  
                  x9e7c:	and	al,0x1			; 00009E7C  2401  '$.'
                  	ret				; 00009E7E  C3  '.'
                  
                  x9e7f:	xor	ax,ax			; 00009E7F  33C0  '3.'
                  	ret				; 00009E81  C3  '.'
                  
                  x9e82:	sti				; 00009E82  FB  '.'
                  	push	ds			; 00009E83  1E  '.'
                  	mov	ax,0x40			; 00009E84  B84000  '.@.'
                  	mov	ds,ax			; 00009E87  8ED8  '..'
                  	mov	eax,[0x10]		; 00009E89  66A11000  'f...'
                  	and	eax,0xffff		; 00009E8D  6625FFFF0000  'f%....'
                  	push	eax			; 00009E93  6650  'fP'
                  	mov	al,0x33			; 00009E95  B033  '.3'
                  	out	0x70,al			; 00009E97  E670  '.p'
                  	in	al,0x71			; 00009E99  E471  '.q'
                  	test	al,0x20			; 00009E9B  A820  '. '
                  	pop	eax			; 00009E9D  6658  'fX'
                  	jz	x9ea7			; 00009E9F  7406  't.'
                  	or	eax,0x1000000		; 00009EA1  660D00000001  'f',0x0D,'....'
                  x9ea7:	pop	ds			; 00009EA7  1F  '.'
                  	ret				; 00009EA8  C3  '.'
                  
                  	call	x9e32			; 00009EA9  E886FF  '...'
                  	jz	x9f16			; 00009EAC  7468  'th'
                  	cmp	byte [0x49],0x2		; 00009EAE  803E490002  '.>I..'
                  	jz	x9ebe			; 00009EB3  7409  't.'
                  	cmp	byte [0x49],0x3		; 00009EB5  803E490003  '.>I..'
                  	jz	x9ebe			; 00009EBA  7402  't.'
                  	jmp	short x9f16		; 00009EBC  EB58  '.X'
                  
                  x9ebe:	xor	di,di			; 00009EBE  33FF  '3.'
                  	mov	es,di			; 00009EC0  8EC7  '..'
                  	mov	di,0x74			; 00009EC2  BF7400  '.t.'
                  	mov	al,[bp+0x0]		; 00009EC5  8A4600  '.F.'
                  	cmp	al,0x0			; 00009EC8  3C00  '<.'
                  	jz	x9ed5			; 00009ECA  7409  't.'
                  	cmp	al,0x1			; 00009ECC  3C01  '<.'
                  	jnz	x9f16			; 00009ECE  7546  'uF'
                  	mov	ax,0xf0e4		; 00009ED0  B8E4F0  '...'
                  	jmp	short x9ed8		; 00009ED3  EB03  '..'
                  
                  x9ed5:	mov	ax,0xf0a4		; 00009ED5  B8A4F0  '...'
                  x9ed8:	cmp	ax,[es:di]		; 00009ED8  263B05  '&;.'
                  	jz	x9f16			; 00009EDB  7439  't9'
                  	cld				; 00009EDD  FC  '.'
                  	cli				; 00009EDE  FA  '.'
                  	stosw				; 00009EDF  AB  '.'
                  	mov	ax,cs			; 00009EE0  8CC8  '..'
                  	stosw				; 00009EE2  AB  '.'
                  	sti				; 00009EE3  FB  '.'
                  	mov	al,[0x65]		; 00009EE4  A06500  '.e.'
                  	mov	ah,[0x66]		; 00009EE7  8A266600  '.&f.'
                  	mov	dx,[0x63]		; 00009EEB  8B166300  '..c.'
                  	mov	cx,0xc			; 00009EEF  B90C00  '...'
                  	call	xa795			; 00009EF2  E8A008  '...'
                  	mov	bx,0x1f4		; 00009EF5  BBF401  '...'
                  	call	xc638			; 00009EF8  E83D27  '.=',0x27
                  	add	dx,byte +0x4		; 00009EFB  83C204  '...'
                  	mov	al,[0x65]		; 00009EFE  A06500  '.e.'
                  	out	dx,al			; 00009F01  EE  '.'
                  	mov	ah,0xf			; 00009F02  B40F  '..'
                  	call	x83db			; 00009F04  E8D4E4  '...'
                  	mov	ah,0x3			; 00009F07  B403  '..'
                  	call	x83db			; 00009F09  E8CFE4  '...'
                  	mov	ah,0x2			; 00009F0C  B402  '..'
                  	call	x83db			; 00009F0E  E8CAE4  '...'
                  	mov	ah,0x1			; 00009F11  B401  '..'
                  	call	x83db			; 00009F13  E8C5E4  '...'
                  x9f16:	ret				; 00009F16  C3  '.'
                  
                  x9f17:	cld				; 00009F17  FC  '.'
                  	lodsd				; 00009F18  66AD  'f.'
                  	push	ax			; 00009F1A  50  'P'
                  	in	al,0x61			; 00009F1B  E461  '.a'
                  	test	al,0x40			; 00009F1D  A840  '.@'
                  	pop	ax			; 00009F1F  58  'X'
                  	jz	x9f47			; 00009F20  7425  't%'
                  	sub	si,byte +0x4		; 00009F22  83EE04  '...'
                  	mov	[si],eax		; 00009F25  668904  'f..'
                  	push	ds			; 00009F28  1E  '.'
                  	push	ax			; 00009F29  50  'P'
                  	mov	ax,0x48			; 00009F2A  B84800  '.H.'
                  	mov	ds,ax			; 00009F2D  8ED8  '..'
                  	in	al,0x61			; 00009F2F  E461  '.a'
                  	mov	ah,al			; 00009F31  8AE0  '..'
                  	or	al,0x8			; 00009F33  0C08  '..'
                  	out	0x61,al			; 00009F35  E661  '.a'
                  	mov	dl,[0x0]		; 00009F37  8A160000  '....'
                  	mov	byte [0x0],0xff		; 00009F3B  C6060000FF  '.....'
                  	xchg	al,ah			; 00009F40  86C4  '..'
                  	out	0x61,al			; 00009F42  E661  '.a'
                  	pop	ax			; 00009F44  58  'X'
                  	pop	ds			; 00009F45  1F  '.'
                  	stc				; 00009F46  F9  '.'
                  x9f47:	retf				; 00009F47  CB  '.'
                  
                  	xchg	si,di			; 00009F48  87F7  '..'
                  	cmp	byte [bp+0x6],0x0	; 00009F4A  807E0600  '.~..'
                  	jnz	x9f67			; 00009F4E  7517  'u.'
                  	call	xd3f3			; 00009F50  E8A034  '..4'
                  	jnz	x9f6c			; 00009F53  7517  'u.'
                  	mov	al,0x33			; 00009F55  B033  '.3'
                  	out	0x70,al			; 00009F57  E670  '.p'
                  	in	al,0x71			; 00009F59  E471  '.q'
                  	test	al,0x4			; 00009F5B  A804  '..'
                  	jz	x9f67			; 00009F5D  7408  't.'
                  	and	al,0xfc			; 00009F5F  24FC  '$.'
                  	jnz	x9f9a			; 00009F61  7537  'u7'
                  	or	al,0x4			; 00009F63  0C04  '..'
                  	jmp	short x9f9a		; 00009F65  EB33  '.3'
                  
                  x9f67:	call	xd405			; 00009F67  E89B34  '..4'
                  	jnc	x9f9a			; 00009F6A  732E  's.'
                  x9f6c:	call	xd423			; 00009F6C  E8B434  '..4'
                  	jz	x9fac			; 00009F6F  743B  't;'
                  	mov	si,0xa024		; 00009F71  BE24A0  '.$.'
                  	call	xd47d			; 00009F74  E80635  '..5'
                  	test	al,0x1			; 00009F77  A801  '..'
                  	jz	x9fcb			; 00009F79  7450  'tP'
                  	mov	si,0xa029		; 00009F7B  BE29A0  '.).'
                  	call	x9190			; 00009F7E  E80FF2  '...'
                  	mov	bh,[bx]			; 00009F81  8A3F  '.?'
                  	mov	bl,bh			; 00009F83  8ADF  '..'
                  	and	bh,0x6			; 00009F85  80E706  '...'
                  	cmp	bh,0x4			; 00009F88  80FF04  '...'
                  	jz	x9fcb			; 00009F8B  743E  't>'
                  	mov	si,0xa033		; 00009F8D  BE33A0  '.3.'
                  	and	bl,0xc0			; 00009F90  80E3C0  '...'
                  	jz	x9fcb			; 00009F93  7436  't6'
                  	mov	si,0xa02e		; 00009F95  BE2EA0  '...'
                  	jmp	short x9fcb		; 00009F98  EB31  '.1'
                  
                  x9f9a:	mov	si,0xa024		; 00009F9A  BE24A0  '.$.'
                  	mov	ah,0x4			; 00009F9D  B404  '..'
                  x9f9f:	dec	ah			; 00009F9F  FECC  '..'
                  	jz	x9fcb			; 00009FA1  7428  't('
                  	dec	al			; 00009FA3  FEC8  '..'
                  	jz	x9fcb			; 00009FA5  7424  't$'
                  	add	si,byte +0x5		; 00009FA7  83C605  '...'
                  	jmp	short x9f9f		; 00009FAA  EBF3  '..'
                  
                  x9fac:	mov	word [bp+0x2],0x0	; 00009FAC  C746020000  '.F...'
                  	mov	word [bp+0x4],0x0	; 00009FB1  C746040000  '.F...'
                  	mov	byte [bp+0x7],0x0	; 00009FB6  C6460700  '.F..'
                  	mov	word [bp+0xc],0x0	; 00009FBA  C7460C0000  '.F...'
                  	mov	word [bp+0xa],0x0	; 00009FBF  C7460A0000  '.F',0x0A,'..'
                  	call	xd3f3			; 00009FC4  E82C34  '.,4'
                  	jnz	xa005			; 00009FC7  753C  'u<'
                  	jmp	short xa014		; 00009FC9  EB49  '.I'
                  
                  x9fcb:	call	xd436			; 00009FCB  E86834  '.h4'
                  	jc	x9fac			; 00009FCE  72DC  'r.'
                  	mov	[bp+0xc],cs		; 00009FD0  8C4E0C  '.N.'
                  	mov	dx,[cs:si+0x3]		; 00009FD3  2E8B5403  '..T.'
                  	mov	[bp+0xa],dx		; 00009FD7  89560A  '.V',0x0A
                  	xor	bx,bx			; 00009FDA  33DB  '3.'
                  	call	xd3f3			; 00009FDC  E81434  '..4'
                  	jnz	x9feb			; 00009FDF  750A  'u',0x0A
                  	call	xd405			; 00009FE1  E82134  '.!4'
                  	jc	x9feb			; 00009FE4  7205  'r.'
                  	mov	bl,[cs:si]		; 00009FE6  2E8A1C  '...'
                  	xor	bh,bh			; 00009FE9  32FF  '2.'
                  x9feb:	mov	[bp+0x2],bx		; 00009FEB  895E02  '.^.'
                  	mov	ch,[cs:si+0x2]		; 00009FEE  2E8A6C02  '..l.'
                  	mov	[bp+0x5],ch		; 00009FF2  886E05  '.n.'
                  	mov	cl,[cs:si+0x1]		; 00009FF5  2E8A4C01  '..L.'
                  	mov	[bp+0x4],cl		; 00009FF9  884E04  '.N.'
                  	mov	byte [bp+0x7],0x1	; 00009FFC  C6460701  '.F..'
                  	call	0xd423			; 0000A000  E82034  '. 4'
                  	jnz	xa014			; 0000A003  750F  'u.'
                  xa005:	call	x9190			; 0000A005  E888F1  '...'
                  	cmp	byte [bx],0x0		; 0000A008  803F00  '.?.'
                  	jnz	xa014			; 0000A00B  7507  'u.'
                  	xchg	si,di			; 0000A00D  87F7  '..'
                  	call	x9293			; 0000A00F  E881F2  '...'
                  	xchg	si,di			; 0000A012  87F7  '..'
                  xa014:	call	xd436			; 0000A014  E81F34  '..4'
                  	mov	[bp+0x6],dl		; 0000A017  885606  '.V.'
                  	xor	ax,ax			; 0000A01A  33C0  '3.'
                  	and	word [bp+0x16],0xfffe	; 0000A01C  816616FEFF  '.f...'
                  	xchg	si,di			; 0000A021  87F7  '..'
                  	ret				; 0000A023  C3  '.'
                  
                  	add	[bx+di],cx		; 0000A024  0109  '..'
                  	daa				; 0000A026  27  0x27
                  	sti				; 0000A027  FB  '.'
                  	and	[bp+si],al		; 0000A028  2002  ' .'
                  	cmovg	dx,[di]			; 0000A02A  0F4F15  '.O.'
                  	and	[bp+di],ax		; 0000A02D  2103  '!.'
                  	or	[bx+0x22],cx		; 0000A02F  094F22  '.O"'
                  	and	[si],ax			; 0000A032  2104  '!.'
                  	adc	cl,[bx+0x3c]		; 0000A034  124F3C  '.O<'
                  	and	[bx+0xbef7],ax		; 0000A037  2187F7BE  '!...'
                  	int	0xa0			; 0000A03B  CDA0  '..'
                  	mov	dx,[bp+0x4]		; 0000A03D  8B5604  '.V.'
                  	call	xd3f3			; 0000A040  E8B033  '..3'
                  	jnz	xa074			; 0000A043  752F  'u/'
                  	call	xd405			; 0000A045  E8BD33  '..3'
                  	jc	xa070			; 0000A048  7226  'r&'
                  	cmp	al,0x1			; 0000A04A  3C01  '<.'
                  	jz	xa068			; 0000A04C  741A  't.'
                  	add	si,byte +0x6		; 0000A04E  83C606  '...'
                  	cmp	al,0x2			; 0000A051  3C02  '<.'
                  	jz	xa05f			; 0000A053  740A  't',0x0A
                  	add	si,byte +0xc		; 0000A055  83C60C  '...'
                  	cmp	al,0x3			; 0000A058  3C03  '<.'
                  	jz	xa068			; 0000A05A  740C  't.'
                  	add	si,byte +0x6		; 0000A05C  83C606  '...'
                  xa05f:	cmp	dx,[cs:si+0x1]		; 0000A05F  2E3B5401  '.;T.'
                  	jz	xa07a			; 0000A063  7415  't.'
                  	add	si,byte +0x6		; 0000A065  83C606  '...'
                  xa068:	cmp	dx,[cs:si+0x1]		; 0000A068  2E3B5401  '.;T.'
                  	jz	xa07a			; 0000A06C  740C  't.'
                  	jmp	short xa0a5		; 0000A06E  EB35  '.5'
                  
                  xa070:	cmp	al,0x0			; 0000A070  3C00  '<.'
                  	jz	xa09c			; 0000A072  7428  't('
                  xa074:	cmp	dx,[cs:si+0x1]		; 0000A074  2E3B5401  '.;T.'
                  	jnz	xa0b0			; 0000A078  7536  'u6'
                  xa07a:	call	x9190			; 0000A07A  E813F1  '...'
                  	cmp	byte [bx],0x0		; 0000A07D  803F00  '.?.'
                  	jnz	xa089			; 0000A080  7507  'u.'
                  	xchg	si,di			; 0000A082  87F7  '..'
                  	call	x9293			; 0000A084  E80CF2  '...'
                  	xchg	si,di			; 0000A087  87F7  '..'
                  xa089:	mov	dl,[cs:si+0x3]		; 0000A089  2E8A5403  '..T.'
                  	call	x9190			; 0000A08D  E800F1  '...'
                  	mov	[bx],dl			; 0000A090  8817  '..'
                  	mov	[bp+0xc],cs		; 0000A092  8C4E0C  '.N.'
                  	mov	dx,[cs:si+0x4]		; 0000A095  2E8B5404  '..T.'
                  	mov	[bp+0xa],dx		; 0000A099  89560A  '.V',0x0A
                  xa09c:	and	word [bp+0x16],0x1	; 0000A09C  8166160100  '.f...'
                  	xor	ax,ax			; 0000A0A1  33C0  '3.'
                  	jmp	short xa0b9		; 0000A0A3  EB14  '..'
                  
                  xa0a5:	or	word [bp+0x16],0x1	; 0000A0A5  814E160100  '.N...'
                  	mov	ah,0xc			; 0000A0AA  B40C  '..'
                  	xor	al,al			; 0000A0AC  32C0  '2.'
                  	jmp	short xa0ca		; 0000A0AE  EB1A  '..'
                  
                  xa0b0:	or	word [bp+0x16],0x1	; 0000A0B0  814E160100  '.N...'
                  	mov	ah,0xc			; 0000A0B5  B40C  '..'
                  	xor	al,al			; 0000A0B7  32C0  '2.'
                  xa0b9:	call	x9190			; 0000A0B9  E8D4F0  '...'
                  	cmp	byte [bx],0x0		; 0000A0BC  803F00  '.?.'
                  	jnz	xa0ca			; 0000A0BF  7509  'u.'
                  	xchg	si,di			; 0000A0C1  87F7  '..'
                  	push	ax			; 0000A0C3  50  'P'
                  	call	x9293			; 0000A0C4  E8CCF1  '...'
                  	pop	ax			; 0000A0C7  58  'X'
                  	xchg	si,di			; 0000A0C8  87F7  '..'
                  xa0ca:	xchg	si,di			; 0000A0CA  87F7  '..'
                  	ret				; 0000A0CC  C3  '.'
                  
                  	add	[bx+di],cx		; 0000A0CD  0109  '..'
                  	daa				; 0000A0CF  27  0x27
                  	xchg	ax,bx			; 0000A0D0  93  '.'
                  	sti				; 0000A0D1  FB  '.'
                  	and	[bp+si],al		; 0000A0D2  2002  ' .'
                  	or	[bx],sp			; 0000A0D4  0927  '.',0x27
                  	jz	xa0e0			; 0000A0D6  7408  't.'
                  	and	[bp+si],ax		; 0000A0D8  2102  '!.'
                  	cmovg	dx,[di]			; 0000A0DA  0F4F15  '.O.'
                  	adc	ax,0x321		; 0000A0DD  152103  '.!.'
                  xa0e0:	or	[bx-0x69],cx		; 0000A0E0  094F97  '.O.'
                  	and	ah,[bx+di]		; 0000A0E3  2221  '"!'
                  	add	cx,[bx+di]		; 0000A0E5  0309  '..'
                  	dec	di			; 0000A0E7  4F  'O'
                  	xchg	ax,di			; 0000A0E8  97  '.'
                  	das				; 0000A0E9  2F  '/'
                  	and	[si],ax			; 0000A0EA  2104  '!.'
                  	adc	cl,[bx+0x17]		; 0000A0EC  124F17  '.O.'
                  	cmp	al,0x21			; 0000A0EF  3C21  '<!'
                  
                  	times	10 db 0xFF		; 0000A0F1 - 0000A0FA
                  	fild	word [bp+si]		; 0000A0FB  DF02  '..'
                  	and	ax,0x902		; 0000A0FD  250209  '%..'
                  	sub	bh,bh			; 0000A100  2AFF  '*.'
                  	push	ax			; 0000A102  50  'P'
                  	db	0xF6			; 0000A103  F6  '.'
                  	invd				; 0000A104  0F08  '..'
                  	daa				; 0000A106  27  0x27
                  	sbb	bh,0x2			; 0000A107  80DF02  '...'
                  	and	ax,0x902		; 0000A10A  250209  '%..'
                  	sub	bh,bh			; 0000A10D  2AFF  '*.'
                  	push	ax			; 0000A10F  50  'P'
                  	db	0xF6			; 0000A110  F6  '.'
                  	invd				; 0000A111  0F08  '..'
                  	daa				; 0000A113  27  0x27
                  	inc	ax			; 0000A114  40  '@'
                  	fild	word [bp+si]		; 0000A115  DF02  '..'
                  	and	ax,0xf02		; 0000A117  25020F  '%..'
                  	sbb	di,di			; 0000A11A  1BFF  '..'
                  	push	sp			; 0000A11C  54  'T'
                  	db	0xF6			; 0000A11D  F6  '.'
                  	invd				; 0000A11E  0F08  '..'
                  	dec	di			; 0000A120  4F  'O'
                  	add	bh,bl			; 0000A121  00DF  '..'
                  	add	ah,[di]			; 0000A123  0225  '.%'
                  	add	cl,[bx+di]		; 0000A125  0209  '..'
                  	sub	bh,bh			; 0000A127  2AFF  '*.'
                  	push	ax			; 0000A129  50  'P'
                  	db	0xF6			; 0000A12A  F6  '.'
                  	invd				; 0000A12B  0F08  '..'
                  	dec	di			; 0000A12D  4F  'O'
                  	sbb	bh,0x2			; 0000A12E  80DF02  '...'
                  	and	ax,0x902		; 0000A131  250209  '%..'
                  	sub	bh,bh			; 0000A134  2AFF  '*.'
                  	push	ax			; 0000A136  50  'P'
                  	db	0xF6			; 0000A137  F6  '.'
                  	invd				; 0000A138  0F08  '..'
                  	dec	di			; 0000A13A  4F  'O'
                  	sbb	bh,0x2			; 0000A13B  80DF02  '...'
                  	and	ax,0x1202		; 0000A13E  250212  '%..'
                  	sbb	di,di			; 0000A141  1BFF  '..'
                  	db	0x65			; 0000A143  65  'e'
                  	db	0xF6			; 0000A144  F6  '.'
                  	invd				; 0000A145  0F08  '..'
                  	dec	di			; 0000A147  4F  'O'
                  	add	[bp+di+0x20a3],cl	; 0000A148  008BA320  '... '
                  	add	[bp+si],ch		; 0000A14C  002A  '.*'
                  	movsw				; 0000A14E  A5  '.'
                  	cmp	[bx+si],al		; 0000A14F  3800  '8.'
                  	db	0xFF			; 0000A151  FF  '.'
                  	inc	word [bx+si]		; 0000A152  FF00  '..'
                  	add	[bx+si],al		; 0000A154  0000  '..'
                  	add	[bx+si],al		; 0000A156  0000  '..'
                  	add	bl,bh			; 0000A158  00FB  '..'
                  	pop	di			; 0000A15A  5F  '_'
                  	push	ds			; 0000A15B  1E  '.'
                  	push	ax			; 0000A15C  50  'P'
                  	mov	di,0x40			; 0000A15D  BF4000  '.@.'
                  	mov	ds,di			; 0000A160  8EDF  '..'
                  	cmp	al,0x1			; 0000A162  3C01  '<.'
                  	ja	xa199			; 0000A164  7733  'w3'
                  	jz	xa185			; 0000A166  741D  't.'
                  	test	byte [0xa0],0x1		; 0000A168  F606A00001  '.....'
                  	jnz	xa199			; 0000A16D  752A  'u*'
                  	or	byte [0xa0],0x1		; 0000A16F  800EA00001  '.....'
                  	call	xa1c8			; 0000A174  E85100  '.Q.'
                  	cli				; 0000A177  FA  '.'
                  	in	al,0xa1			; 0000A178  E4A1  '..'
                  	and	al,0xfe			; 0000A17A  24FE  '$.'
                  	out	0xa1,al			; 0000A17C  E6A1  '..'
                  	sti				; 0000A17E  FB  '.'
                  	call	0xa1a2			; 0000A17F  E82000  '. .'
                  	clc				; 0000A182  F8  '.'
                  	jmp	short xa19a		; 0000A183  EB15  '..'
                  
                  xa185:	test	byte [0xa0],0x1		; 0000A185  F606A00001  '.....'
                  	jnz	xa18f			; 0000A18A  7503  'u.'
                  	clc				; 0000A18C  F8  '.'
                  	jmp	short xa19a		; 0000A18D  EB0B  '..'
                  
                  xa18f:	call	xa1b5			; 0000A18F  E82300  '.#.'
                  	and	byte [0xa0],0xfe	; 0000A192  8026A000FE  '.&...'
                  	jmp	short xa19a		; 0000A197  EB01  '..'
                  
                  xa199:	stc				; 0000A199  F9  '.'
                  xa19a:	pop	ax			; 0000A19A  58  'X'
                  	mov	ah,0x0			; 0000A19B  B400  '..'
                  	pop	ds			; 0000A19D  1F  '.'
                  	pop	di			; 0000A19E  5F  '_'
                  	retf	0x2			; 0000A19F  CA0200  '...'
                  
                  xa1a2:	cli				; 0000A1A2  FA  '.'
                  	mov	al,0xb			; 0000A1A3  B00B  '..'
                  	call	xb544			; 0000A1A5  E89C13  '...'
                  	or	al,0x40			; 0000A1A8  0C40  '.@'
                  	push	ax			; 0000A1AA  50  'P'
                  	mov	ah,al			; 0000A1AB  8AE0  '..'
                  	mov	al,0xb			; 0000A1AD  B00B  '..'
                  	call	xb549			; 0000A1AF  E89713  '...'
                  	pop	ax			; 0000A1B2  58  'X'
                  	sti				; 0000A1B3  FB  '.'
                  	ret				; 0000A1B4  C3  '.'
                  
                  xa1b5:	cli				; 0000A1B5  FA  '.'
                  	mov	al,0xb			; 0000A1B6  B00B  '..'
                  	call	xb544			; 0000A1B8  E88913  '...'
                  	and	al,0xbf			; 0000A1BB  24BF  '$.'
                  	push	ax			; 0000A1BD  50  'P'
                  	mov	ah,al			; 0000A1BE  8AE0  '..'
                  	mov	al,0xb			; 0000A1C0  B00B  '..'
                  	call	xb549			; 0000A1C2  E88413  '...'
                  	pop	ax			; 0000A1C5  58  'X'
                  	sti				; 0000A1C6  FB  '.'
                  	ret				; 0000A1C7  C3  '.'
                  
                  xa1c8:	mov	[0x98],bx		; 0000A1C8  891E9800  '....'
                  	mov	[0x9a],es		; 0000A1CC  8C069A00  '....'
                  	mov	[0x9c],dx		; 0000A1D0  89169C00  '....'
                  	mov	[0x9e],cx		; 0000A1D4  890E9E00  '....'
                  	ret				; 0000A1D8  C3  '.'
                  
                  	sti				; 0000A1D9  FB  '.'
                  	cmp	dx,byte +0x0		; 0000A1DA  83FA00  '...'
                  	jz	xa1e6			; 0000A1DD  7407  't.'
                  	dec	dx			; 0000A1DF  4A  'J'
                  	jz	xa1f1			; 0000A1E0  740F  't.'
                  	mov	ah,0x86			; 0000A1E2  B486  '..'
                  	stc				; 0000A1E4  F9  '.'
                  	ret				; 0000A1E5  C3  '.'
                  
                  xa1e6:	xor	ah,ah			; 0000A1E6  32E4  '2.'
                  	mov	dx,0x201		; 0000A1E8  BA0102  '...'
                  	in	al,dx			; 0000A1EB  EC  '.'
                  	and	al,0xf0			; 0000A1EC  24F0  '$.'
                  	jmp	xa27d			; 0000A1EE  E98C00  '...'
                  
                  xa1f1:	mov	dx,0x201		; 0000A1F1  BA0102  '...'
                  	in	al,dx			; 0000A1F4  EC  '.'
                  	and	al,0xf			; 0000A1F5  240F  '$.'
                  	cmp	al,0xf			; 0000A1F7  3C0F  '<.'
                  	jnz	xa205			; 0000A1F9  750A  'u',0x0A
                  	xor	ax,ax			; 0000A1FB  33C0  '3.'
                  	xor	bx,bx			; 0000A1FD  33DB  '3.'
                  	xor	cx,cx			; 0000A1FF  33C9  '3.'
                  	xor	dx,dx			; 0000A201  33D2  '3.'
                  	jmp	short xa27d		; 0000A203  EB78  '.x'
                  
                  xa205:	push	bp			; 0000A205  55  'U'
                  	sub	sp,byte +0xe		; 0000A206  83EC0E  '...'
                  	mov	bp,sp			; 0000A209  8BEC  '..'
                  	mov	[bp+0x0],al		; 0000A20B  884600  '.F.'
                  	cli				; 0000A20E  FA  '.'
                  	call	xa27f			; 0000A20F  E86D00  '.m.'
                  	mov	di,cx			; 0000A212  8BF9  '..'
                  	mov	al,0xf			; 0000A214  B00F  '..'
                  	out	dx,al			; 0000A216  EE  '.'
                  	mov	word [bp+0xc],0x0	; 0000A217  C7460C0000  '.F...'
                  xa21c:	mov	bx,[bp+0xc]		; 0000A21C  8B5E0C  '.^.'
                  	mov	[bp+0xa],bx		; 0000A21F  895E0A  '.^',0x0A
                  	mov	ah,al			; 0000A222  8AE0  '..'
                  	in	al,dx			; 0000A224  EC  '.'
                  	and	al,0xf			; 0000A225  240F  '$.'
                  	xor	ah,al			; 0000A227  32E0  '2.'
                  	jnz	xa23c			; 0000A229  7511  'u.'
                  	mov	bx,di			; 0000A22B  8BDF  '..'
                  	call	xa27f			; 0000A22D  E84F00  '.O.'
                  	sub	bx,cx			; 0000A230  2BD9  '+.'
                  	mov	[bp+0xc],bx		; 0000A232  895E0C  '.^.'
                  	cmp	bx,[bp+0xa]		; 0000A235  3B5E0A  ';^',0x0A
                  	ja	xa21c			; 0000A238  77E2  'w.'
                  	jmp	short xa268		; 0000A23A  EB2C  '.,'
                  
                  xa23c:	mov	bx,di			; 0000A23C  8BDF  '..'
                  	call	xa27f			; 0000A23E  E83E00  '.>.'
                  	sub	bx,cx			; 0000A241  2BD9  '+.'
                  	test	ah,0x1			; 0000A243  F6C401  '...'
                  	jz	xa24b			; 0000A246  7403  't.'
                  	mov	[bp+0x2],bx		; 0000A248  895E02  '.^.'
                  xa24b:	test	ah,0x2			; 0000A24B  F6C402  '...'
                  	jz	xa253			; 0000A24E  7403  't.'
                  	mov	[bp+0x4],bx		; 0000A250  895E04  '.^.'
                  xa253:	test	ah,0x4			; 0000A253  F6C404  '...'
                  	jz	xa25b			; 0000A256  7403  't.'
                  	mov	[bp+0x6],bx		; 0000A258  895E06  '.^.'
                  xa25b:	test	ah,0x8			; 0000A25B  F6C408  '...'
                  	jz	xa263			; 0000A25E  7403  't.'
                  	mov	[bp+0x8],bx		; 0000A260  895E08  '.^.'
                  xa263:	cmp	[bp+0x0],al		; 0000A263  384600  '8F.'
                  	jnz	xa21c			; 0000A266  75B4  'u.'
                  xa268:	sti				; 0000A268  FB  '.'
                  	pop	ax			; 0000A269  58  'X'
                  	pop	ax			; 0000A26A  58  'X'
                  	pop	bx			; 0000A26B  5B  '['
                  	pop	cx			; 0000A26C  59  'Y'
                  	pop	dx			; 0000A26D  5A  'Z'
                  	pop	bp			; 0000A26E  5D  ']'
                  	pop	bp			; 0000A26F  5D  ']'
                  	pop	bp			; 0000A270  5D  ']'
                  	shr	ax,0x4			; 0000A271  C1E804  '...'
                  	shr	bx,0x4			; 0000A274  C1EB04  '...'
                  	shr	cx,0x4			; 0000A277  C1E904  '...'
                  	shr	dx,0x4			; 0000A27A  C1EA04  '...'
                  xa27d:	clc				; 0000A27D  F8  '.'
                  	ret				; 0000A27E  C3  '.'
                  
                  xa27f:	push	ax			; 0000A27F  50  'P'
                  	mov	al,0x0			; 0000A280  B000  '..'
                  	out	0x43,al			; 0000A282  E643  '.C'
                  	in	al,0x40			; 0000A284  E440  '.@'
                  	mov	cl,al			; 0000A286  8AC8  '..'
                  	in	al,0x40			; 0000A288  E440  '.@'
                  	mov	ch,al			; 0000A28A  8AE8  '..'
                  	pop	ax			; 0000A28C  58  'X'
                  	ret				; 0000A28D  C3  '.'
                  
                  	sti				; 0000A28E  FB  '.'
                  	pop	di			; 0000A28F  5F  '_'
                  	push	ds			; 0000A290  1E  '.'
                  	push	bx			; 0000A291  53  'S'
                  	mov	bx,0x40			; 0000A292  BB4000  '.@.'
                  	mov	ds,bx			; 0000A295  8EDB  '..'
                  	test	byte [0xa0],0x1		; 0000A297  F606A00001  '.....'
                  	jnz	xa2cc			; 0000A29C  752E  'u.'
                  	mov	byte [0xa0],0x1		; 0000A29E  C606A00001  '.....'
                  	push	es			; 0000A2A3  06  '.'
                  	mov	es,bx			; 0000A2A4  8EC3  '..'
                  	lea	bx,[0xa0]		; 0000A2A6  8D1EA000  '....'
                  	call	xa1c8			; 0000A2AA  E81BFF  '...'
                  	pop	es			; 0000A2AD  07  '.'
                  	cli				; 0000A2AE  FA  '.'
                  	in	al,0xa1			; 0000A2AF  E4A1  '..'
                  	and	al,0xfe			; 0000A2B1  24FE  '$.'
                  	jmp	short xa2b5		; 0000A2B3  EB00  '..'
                  
                  xa2b5:	jmp	short xa2b7		; 0000A2B5  EB00  '..'
                  
                  xa2b7:	out	0xa1,al			; 0000A2B7  E6A1  '..'
                  	sti				; 0000A2B9  FB  '.'
                  	call	xa1a2			; 0000A2BA  E8E5FE  '...'
                  xa2bd:	test	byte [0xa0],0x80	; 0000A2BD  F606A00080  '.....'
                  	jz	xa2bd			; 0000A2C2  74F9  't.'
                  	and	byte [0xa0],0x7f	; 0000A2C4  8026A0007F  '.&...'
                  	clc				; 0000A2C9  F8  '.'
                  	jmp	short xa2cd		; 0000A2CA  EB01  '..'
                  
                  xa2cc:	stc				; 0000A2CC  F9  '.'
                  xa2cd:	pop	bx			; 0000A2CD  5B  '['
                  	pop	ds			; 0000A2CE  1F  '.'
                  	pop	di			; 0000A2CF  5F  '_'
                  	retf	0x2			; 0000A2D0  CA0200  '...'
                  
                  	sti				; 0000A2D3  FB  '.'
                  	pop	di			; 0000A2D4  5F  '_'
                  	pop	di			; 0000A2D5  5F  '_'
                  	pusha				; 0000A2D6  60  '`'
                  	push	es			; 0000A2D7  06  '.'
                  	push	ds			; 0000A2D8  1E  '.'
                  	mov	ax,0x40			; 0000A2D9  B84000  '.@.'
                  	mov	ds,ax			; 0000A2DC  8ED8  '..'
                  	mov	[0x67],sp		; 0000A2DE  89266700  '.&g.'
                  	mov	[0x69],ss		; 0000A2E2  8C166900  '..i.'
                  	mov	al,0x0			; 0000A2E6  B000  '..'
                  	out	0x80,al			; 0000A2E8  E680  '..'
                  	call	xa3e0			; 0000A2EA  E8F300  '...'
                  	jz	xa2f5			; 0000A2ED  7406  't.'
                  	pop	ds			; 0000A2EF  1F  '.'
                  	pop	es			; 0000A2F0  07  '.'
                  	popa				; 0000A2F1  61  'a'
                  	mov	ah,0x3			; 0000A2F2  B403  '..'
                  	iret				; 0000A2F4  CF  '.'
                  
                  xa2f5:	sti				; 0000A2F5  FB  '.'
                  	lea	bx,[si+0x20]		; 0000A2F6  8D5C20  '.\ '
                  	mov	word [es:bx],0xffff	; 0000A2F9  26C707FFFF  '&....'
                  	mov	ax,cs			; 0000A2FE  8CC8  '..'
                  	shl	ax,0x4			; 0000A300  C1E004  '...'
                  	mov	[es:bx+0x2],ax		; 0000A303  26894702  '&.G.'
                  	mov	ax,cs			; 0000A307  8CC8  '..'
                  	shr	ax,0xc			; 0000A309  C1E80C  '...'
                  	mov	[es:bx+0x4],al		; 0000A30C  26884704  '&.G.'
                  	mov	byte [es:bx+0x5],0x9a	; 0000A310  26C647059A  '&.G..'
                  	lea	bx,[si+0x28]		; 0000A315  8D5C28  '.\('
                  	mov	word [es:bx],0xffff	; 0000A318  26C707FFFF  '&....'
                  	mov	ax,ss			; 0000A31D  8CD0  '..'
                  	shl	ax,0x4			; 0000A31F  C1E004  '...'
                  	mov	[es:bx+0x2],ax		; 0000A322  26894702  '&.G.'
                  	mov	ax,ss			; 0000A326  8CD0  '..'
                  	shr	ax,0xc			; 0000A328  C1E80C  '...'
                  	mov	[es:bx+0x4],al		; 0000A32B  26884704  '&.G.'
                  	mov	byte [es:bx+0x5],0x92	; 0000A32F  26C6470592  '&.G..'
                  	push	es			; 0000A334  06  '.'
                  	push	si			; 0000A335  56  'V'
                  	mov	ax,cs			; 0000A336  8CC8  '..'
                  	mov	es,ax			; 0000A338  8EC0  '..'
                  	lea	si,[0xa592]		; 0000A33A  8D3692A5  '.6..'
                  	call	xa425			; 0000A33E  E8E400  '...'
                  	mov	dx,ax			; 0000A341  8BD0  '..'
                  	call	xa42d			; 0000A343  E8E700  '...'
                  	pop	si			; 0000A346  5E  '^'
                  	pop	es			; 0000A347  07  '.'
                  	lea	bx,[si+0x8]		; 0000A348  8D5C08  '.\.'
                  	mov	[es:bx+0x2],dx		; 0000A34B  26895702  '&.W.'
                  	mov	[es:bx+0x4],al		; 0000A34F  26884704  '&.G.'
                  	mov	word [es:bx],0xff	; 0000A353  26C707FF00  '&....'
                  	cli				; 0000A358  FA  '.'
                  	mov	al,0x80			; 0000A359  B080  '..'
                  	out	0x70,al			; 0000A35B  E670  '.p'
                  	lidt	[es:bx]			; 0000A35D  260F011F  '&...'
                  	call	xa425			; 0000A361  E8C100  '...'
                  	mov	[es:bx+0x2],ax		; 0000A364  26894702  '&.G.'
                  	call	xa42d			; 0000A368  E8C200  '...'
                  	mov	[es:bx+0x4],al		; 0000A36B  26884704  '&.G.'
                  	mov	word [es:bx],0xffff	; 0000A36F  26C707FFFF  '&....'
                  	mov	byte [es:bx+0x5],0x92	; 0000A374  26C6470592  '&.G..'
                  	lgdt	[es:bx]			; 0000A379  260F0117  '&...'
                  	smsw	ax			; 0000A37D  0F01E0  '...'
                  	or	ax,0x1			; 0000A380  0D0100  0x0D,'..'
                  	lmsw	ax			; 0000A383  0F01F0  '...'
                  	jmp	far [cs:0xa149]		; 0000A386  2EFF2E49A1  '...I.'
                  
                  	xor	ax,ax			; 0000A38B  33C0  '3.'
                  	lldt	ax			; 0000A38D  0F00D0  '...'
                  	mov	ax,0x28			; 0000A390  B82800  '.(.'
                  	mov	ss,ax			; 0000A393  8ED0  '..'
                  	mov	ax,0x10			; 0000A395  B81000  '...'
                  	mov	ds,ax			; 0000A398  8ED8  '..'
                  	mov	ax,0x18			; 0000A39A  B81800  '...'
                  	mov	es,ax			; 0000A39D  8EC0  '..'
                  	cld				; 0000A39F  FC  '.'
                  	xor	si,si			; 0000A3A0  33F6  '3.'
                  	xor	di,di			; 0000A3A2  33FF  '3.'
                  	mov	al,0x0			; 0000A3A4  B000  '..'
                  	out	0x70,al			; 0000A3A6  E670  '.p'
                  	push	cx			; 0000A3A8  51  'Q'
                  	shr	cx,1			; 0000A3A9  D1E9  '..'
                  	rep	movsd			; 0000A3AB  66F3A5  'f..'
                  	pop	cx			; 0000A3AE  59  'Y'
                  	test	cx,0x1			; 0000A3AF  F7C10100  '....'
                  	jz	xa3b6			; 0000A3B3  7401  't.'
                  	movsw				; 0000A3B5  A5  '.'
                  xa3b6:	mov	al,0x80			; 0000A3B6  B080  '..'
                  	out	0x70,al			; 0000A3B8  E670  '.p'
                  	mov	ax,0x28			; 0000A3BA  B82800  '.(.'
                  	mov	ds,ax			; 0000A3BD  8ED8  '..'
                  	mov	es,ax			; 0000A3BF  8EC0  '..'
                  	mov	ss,ax			; 0000A3C1  8ED0  '..'
                  	push	eax			; 0000A3C3  6650  'fP'
                  	mov	eax,cr0			; 0000A3C5  0F2000
                  	and	eax,0x7ffffffe		; 0000A3C8  6625FEFFFF7F  'f%....'
                  	mov	cr0,eax			; 0000A3CE  0F2200
                  	pop	eax			; 0000A3D1  6658  'fX'
                  	jmp	0xf000:0xa3d8		; 0000A3D3  EAD8A300F0  '.....'
                  
                  	lidt	[cs:0xa151]		; 0000A3D8  2E0F011E51A1  '....Q.'
                  	jmp	short xa43c		; 0000A3DE  EB5C  '.\'
                  ;
                  ;   Enable A20
                  ;
                  xa3e0:	cli				; 0000A3E0  FA  '.'
                  	call	xec2e_wait_8042_ready	; 0000A3E1  E84A48  '.JH'
                  	jnz	xa3ff			; 0000A3E4  7519  'u.'
                  	mov	al,CMD8042_WRITE_OUTPORT; 0000A3E6  B0D1  '..'
                  	out	0x64,al			; 0000A3E8  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000A3EA  E84148  '.AH'
                  	jnz	xa3ff			; 0000A3ED  7510  'u.'
                  	mov	al,0xdf			; 0000A3EF  B0DF  '..'
                  	out	0x60,al			; 0000A3F1  E660  '.`'
                  	call	xec2e_wait_8042_ready	; 0000A3F3  E83848  '.8H'
                  	jnz	xa3ff			; 0000A3F6  7507  'u.'
                  	mov	al,0xff			; 0000A3F8  B0FF  '..'
                  	out	0x64,al			; 0000A3FA  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000A3FC  E82F48  './H'
                  xa3ff:	ret				; 0000A3FF  C3  '.'
                  
                  	mov	ah,0x2			; 0000A400  B402  '..'
                  	in	al,0x61			; 0000A402  E461  '.a'
                  	test	al,0x40			; 0000A404  A840  '.@'
                  	jz	xa41f			; 0000A406  7417  't.'
                  	dec	si			; 0000A408  4E  'N'
                  	dec	si			; 0000A409  4E  'N'
                  	push	ax			; 0000A40A  50  'P'
                  	call	xa544			; 0000A40B  E83601  '.6.'
                  	jz	xa412			; 0000A40E  7402  't.'
                  	mov	ax,[si]			; 0000A410  8B04  '..'
                  xa412:	mov	[si],ax			; 0000A412  8904  '..'
                  	pop	ax			; 0000A414  58  'X'
                  	or	al,0x8			; 0000A415  0C08  '..'
                  	out	0x61,al			; 0000A417  E661  '.a'
                  	and	al,0xf7			; 0000A419  24F7  '$.'
                  	out	0x61,al			; 0000A41B  E661  '.a'
                  	mov	ah,0x1			; 0000A41D  B401  '..'
                  xa41f:	mov	al,ah			; 0000A41F  8AC4  '..'
                  	out	0x80,al			; 0000A421  E680  '..'
                  	jmp	short xa3b6		; 0000A423  EB91  '..'
                  
                  xa425:	mov	ax,es			; 0000A425  8CC0  '..'
                  	shl	ax,0x4			; 0000A427  C1E004  '...'
                  	add	ax,si			; 0000A42A  03C6  '..'
                  	ret				; 0000A42C  C3  '.'
                  
                  xa42d:	push	cx			; 0000A42D  51  'Q'
                  	mov	cx,es			; 0000A42E  8CC1  '..'
                  	mov	ax,si			; 0000A430  8BC6  '..'
                  	shr	ax,0x4			; 0000A432  C1E804  '...'
                  	add	ax,cx			; 0000A435  03C1  '..'
                  	shr	ax,0xc			; 0000A437  C1E80C  '...'
                  	pop	cx			; 0000A43A  59  'Y'
                  	ret				; 0000A43B  C3  '.'
                  
                  xa43c:	mov	ax,0x40			; 0000A43C  B84000  '.@.'
                  	mov	ds,ax			; 0000A43F  8ED8  '..'
                  	mov	ss,[0x69]		; 0000A441  8E166900  '..i.'
                  	mov	sp,[0x67]		; 0000A445  8B266700  '.&g.'
                  ;
                  ;   Disable A20
                  ;
                  	call	xa478			; 0000A449  E82C00  '.,.'
                  	mov	al,0x0			; 0000A44C  B000  '..'
                  	out	0x70,al			; 0000A44E  E670  '.p'
                  	pop	ds			; 0000A450  1F  '.'
                  	pop	es			; 0000A451  07  '.'
                  	popa				; 0000A452  61  'a'
                  	xchg	al,ah			; 0000A453  86C4  '..'
                  	in	al,0x80			; 0000A455  E480  '..'
                  	xchg	al,ah			; 0000A457  86C4  '..'
                  	push	bp			; 0000A459  55  'U'
                  	mov	bp,sp			; 0000A45A  8BEC  '..'
                  	or	ah,ah			; 0000A45C  0AE4  0x0A,'.'
                  	jnz	xa46c			; 0000A45E  750C  'u.'
                  	and	word [bp+0x6],0xfffe	; 0000A460  816606FEFF  '.f...'
                  	or	word [bp+0x6],0x40	; 0000A465  814E064000  '.N.@.'
                  	jmp	short xa476		; 0000A46A  EB0A  '.',0x0A
                  
                  xa46c:	and	word [bp+0x6],0xffbf	; 0000A46C  816606BFFF  '.f...'
                  	or	word [bp+0x6],0x1	; 0000A471  814E060100  '.N...'
                  xa476:	pop	bp			; 0000A476  5D  ']'
                  	iret				; 0000A477  CF  '.'
                  
                  ;
                  ;   Disable A20
                  ;
                  xa478:	call	xec2e_wait_8042_ready	; 0000A478  E8B347  '..G'
                  	jnz	xa498			; 0000A47B  751B  'u.'
                  	mov	al,CMD8042_WRITE_OUTPORT; 0000A47D  B0D1  '..'
                  	out	0x64,al			; 0000A47F  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000A481  E8AA47  '..G'
                  	jnz	xa498			; 0000A484  7512  'u.'
                  	mov	al,0xdd			; 0000A486  B0DD  '..'
                  	out	0x60,al			; 0000A488  E660  '.`'
                  	call	xec2e_wait_8042_ready	; 0000A48A  E8A147  '..G'
                  	jnz	xa498			; 0000A48D  7509  'u.'
                  	mov	al,0xff			; 0000A48F  B0FF  '..'
                  	out	0x64,al			; 0000A491  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000A493  E89847  '..G'
                  	jz	xa49c			; 0000A496  7404  't.'
                  xa498:	mov	al,0x3			; 0000A498  B003  '..'
                  	out	0x80,al			; 0000A49A  E680  '..'
                  xa49c:	ret				; 0000A49C  C3  '.'
                  
                  	pop	di			; 0000A49D  5F  '_'
                  	pop	di			; 0000A49E  5F  '_'
                  	mov	al,0x31			; 0000A49F  B031  '.1'
                  	call	xb544			; 0000A4A1  E8A010  '...'
                  	mov	ah,al			; 0000A4A4  8AE0  '..'
                  	mov	al,0x30			; 0000A4A6  B030  '.0'
                  	call	xb544			; 0000A4A8  E89910  '...'
                  	iret				; 0000A4AB  CF  '.'
                  
                  	sti				; 0000A4AC  FB  '.'
                  	pop	di			; 0000A4AD  5F  '_'
                  	pop	di			; 0000A4AE  5F  '_'
                  	call	xa3e0			; 0000A4AF  E82EFF  '...'
                  	jz	xa4ba			; 0000A4B2  7406  't.'
                  	mov	ah,0xff			; 0000A4B4  B4FF  '..'
                  	stc				; 0000A4B6  F9  '.'
                  	retf	0x2			; 0000A4B7  CA0200  '...'
                  
                  xa4ba:	sti				; 0000A4BA  FB  '.'
                  	push	bx			; 0000A4BB  53  'S'
                  	lea	bx,[si+0x38]		; 0000A4BC  8D5C38  '.\8'
                  	mov	word [es:bx],0xffff	; 0000A4BF  26C707FFFF  '&....'
                  	mov	ax,cs			; 0000A4C4  8CC8  '..'
                  	shl	ax,0x4			; 0000A4C6  C1E004  '...'
                  	mov	[es:bx+0x2],ax		; 0000A4C9  26894702  '&.G.'
                  	mov	ax,cs			; 0000A4CD  8CC8  '..'
                  	shr	ax,0xc			; 0000A4CF  C1E80C  '...'
                  	mov	[es:bx+0x4],al		; 0000A4D2  26884704  '&.G.'
                  	mov	byte [es:bx+0x5],0x9a	; 0000A4D6  26C647059A  '&.G..'
                  	pop	bx			; 0000A4DB  5B  '['
                  	cli				; 0000A4DC  FA  '.'
                  	mov	al,0x11			; 0000A4DD  B011  '..'
                  	out	0x20,al			; 0000A4DF  E620  '. '
                  	mov	al,bh			; 0000A4E1  8AC7  '..'
                  	out	0x21,al			; 0000A4E3  E621  '.!'
                  	mov	al,0x4			; 0000A4E5  B004  '..'
                  	out	0x21,al			; 0000A4E7  E621  '.!'
                  	mov	al,0x1			; 0000A4E9  B001  '..'
                  	out	0x21,al			; 0000A4EB  E621  '.!'
                  	mov	al,0xff			; 0000A4ED  B0FF  '..'
                  	out	0x21,al			; 0000A4EF  E621  '.!'
                  	mov	al,0x11			; 0000A4F1  B011  '..'
                  	out	0xa0,al			; 0000A4F3  E6A0  '..'
                  	mov	al,bl			; 0000A4F5  8AC3  '..'
                  	out	0xa1,al			; 0000A4F7  E6A1  '..'
                  	mov	al,0x2			; 0000A4F9  B002  '..'
                  	out	0xa1,al			; 0000A4FB  E6A1  '..'
                  	mov	al,0x1			; 0000A4FD  B001  '..'
                  	out	0xa1,al			; 0000A4FF  E6A1  '..'
                  	mov	al,0xff			; 0000A501  B0FF  '..'
                  	out	0xa1,al			; 0000A503  E6A1  '..'
                  	lea	bx,[si+0x8]		; 0000A505  8D5C08  '.\.'
                  	lgdt	[es:bx]			; 0000A508  260F0117  '&...'
                  	lea	bx,[si+0x10]		; 0000A50C  8D5C10  '.\.'
                  	lidt	[es:bx]			; 0000A50F  260F011F  '&...'
                  	push	bp			; 0000A513  55  'U'
                  	mov	bp,sp			; 0000A514  8BEC  '..'
                  	mov	word [bp+0x4],0x30	; 0000A516  C746043000  '.F.0.'
                  	pop	bp			; 0000A51B  5D  ']'
                  	smsw	ax			; 0000A51C  0F01E0  '...'
                  	or	ax,0x1			; 0000A51F  0D0100  0x0D,'..'
                  	lmsw	ax			; 0000A522  0F01F0  '...'
                  	jmp	far [cs:0xa14d]		; 0000A525  2EFF2E4DA1  '...M.'
                  
                  	xor	ax,ax			; 0000A52A  33C0  '3.'
                  	lldt	ax			; 0000A52C  0F00D0  '...'
                  	mov	ax,0x28			; 0000A52F  B82800  '.(.'
                  	mov	ss,ax			; 0000A532  8ED0  '..'
                  	mov	ax,0x18			; 0000A534  B81800  '...'
                  	mov	ds,ax			; 0000A537  8ED8  '..'
                  	mov	ax,0x20			; 0000A539  B82000  '. .'
                  	mov	es,ax			; 0000A53C  8EC0  '..'
                  	xor	ah,ah			; 0000A53E  32E4  '2.'
                  	clc				; 0000A540  F8  '.'
                  	retf	0x2			; 0000A541  CA0200  '...'
                  
                  xa544:	push	bx			; 0000A544  53  'S'
                  	push	ds			; 0000A545  1E  '.'
                  	push	es			; 0000A546  06  '.'
                  	mov	ax,0x8			; 0000A547  B80800  '...'
                  	mov	ds,ax			; 0000A54A  8ED8  '..'
                  	mov	bx,0x10			; 0000A54C  BB1000  '...'
                  	cmp	byte [bx+0x6],0x80	; 0000A54F  807F0680  '....'
                  	jnz	xa584			; 0000A553  752F  'u/'
                  	cmp	byte [bx+0x4],0xc0	; 0000A555  807F04C0  '....'
                  	jnz	xa584			; 0000A559  7529  'u)'
                  	cmp	word [bx+0x2],byte +0x0	; 0000A55B  837F0200  '....'
                  	jnz	xa584			; 0000A55F  7523  'u#'
                  	mov	bx,0x20			; 0000A561  BB2000  '. .'
                  	mov	byte [bx+0x5],0x92	; 0000A564  C6470592  '.G..'
                  	mov	ax,0x20			; 0000A568  B82000  '. .'
                  	mov	es,ax			; 0000A56B  8EC0  '..'
                  	mov	bx,bim_table_offset	; 0000A56D  BBE0FF  '...'
                  	mov	bx,[es:bx]		; 0000A570  268B1F  '&..'
                  	test	word [es:bx],0xf00	; 0000A573  26F707000F  '&....'
                  	jnz	xa57f			; 0000A578  7505  'u.'
                  	mov	ax,0xff			; 0000A57A  B8FF00  '...'
                  	jmp	short xa582		; 0000A57D  EB03  '..'
                  
                  xa57f:	mov	ax,0xfc			; 0000A57F  B8FC00  '...'
                  xa582:	xor	bx,bx			; 0000A582  33DB  '3.'
                  xa584:	pop	es			; 0000A584  07  '.'
                  	pop	ds			; 0000A585  1F  '.'
                  	pop	bx			; 0000A586  5B  '['
                  	ret				; 0000A587  C3  '.'
                  
                  	mov	ax,cs			; 0000A588  8CC8  '..'
                  	mov	es,ax			; 0000A58A  8EC0  '..'
                  	mov	bx,0xe6f5		; 0000A58C  BBF5E6  '...'
                  	xor	ax,ax			; 0000A58F  33C0  '3.'
                  	ret				; 0000A591  C3  '.'
                  	add	[si+0x20],ah		; 0000A592  00A42000  '.. .'
                  
                  	add	[bp+0x0],al		; 0000A596  00860000  '....'
                  	add	[si+0x20],ah		; 0000A59A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A59E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5A2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5A6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5AA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5AE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5B2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5B6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5BA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5BE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5C2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5C6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5CA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5CE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5D2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5D6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5DA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5DE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5E2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5E6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5EA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5EE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5F2  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5F6  00860000  '....'
                  	add	[si+0x20],ah		; 0000A5FA  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A5FE  00860000  '....'
                  	add	[si+0x20],ah		; 0000A602  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A606  00860000  '....'
                  	add	[si+0x20],ah		; 0000A60A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A60E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A612  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A616  00860000  '....'
                  	add	[si+0x20],ah		; 0000A61A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A61E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A622  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A626  00860000  '....'
                  	add	[si+0x20],ah		; 0000A62A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A62E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A632  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A636  00860000  '....'
                  	add	[si+0x20],ah		; 0000A63A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A63E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A642  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A646  00860000  '....'
                  	add	[si+0x20],ah		; 0000A64A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A64E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A652  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A656  00860000  '....'
                  	add	[si+0x20],ah		; 0000A65A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A65E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A662  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A666  00860000  '....'
                  	add	[si+0x20],ah		; 0000A66A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A66E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A672  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A676  00860000  '....'
                  	add	[si+0x20],ah		; 0000A67A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A67E  00860000  '....'
                  	add	[si+0x20],ah		; 0000A682  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A686  00860000  '....'
                  	add	[si+0x20],ah		; 0000A68A  00A42000  '.. .'
                  	add	[bp+0x0],al		; 0000A68E  00860000  '....'
                  	push	ax			; 0000A692  50  'P'
                  	mov	ax,[0x10]		; 0000A693  A11000  '...'
                  	and	ax,0x30			; 0000A696  253000  '%0.'
                  	cmp	al,0x30			; 0000A699  3C30  '<0'
                  	pop	ax			; 0000A69B  58  'X'
                  	jz	xa6b5			; 0000A69C  7417  't.'
                  	cmp	al,0x7			; 0000A69E  3C07  '<.'
                  	jc	xa6b7			; 0000A6A0  7215  'r.'
                  	mov	bx,[0x10]		; 0000A6A2  8B1E1000  '....'
                  	and	bl,0x30			; 0000A6A6  80E330  '..0'
                  	shr	bl,0x4			; 0000A6A9  C0EB04  '...'
                  	xor	bh,bh			; 0000A6AC  32FF  '2.'
                  	mov	al,[cs:bx+0xa842]	; 0000A6AE  2E8A8742A8  '...B.'
                  	jmp	short xa6b7		; 0000A6B3  EB02  '..'
                  
                  xa6b5:	mov	al,0x7			; 0000A6B5  B007  '..'
                  xa6b7:	mov	[0x49],al		; 0000A6B7  A24900  '.I.'
                  	mov	al,[0x49]		; 0000A6BA  A04900  '.I.'
                  	mov	bx,0xb000		; 0000A6BD  BB00B0  '...'
                  	mov	dx,0x3b4		; 0000A6C0  BAB403  '...'
                  	cmp	al,0x7			; 0000A6C3  3C07  '<.'
                  	jz	xa6cd			; 0000A6C5  7406  't.'
                  	mov	bx,0xb800		; 0000A6C7  BB00B8  '...'
                  	mov	dx,0x3d4		; 0000A6CA  BAD403  '...'
                  xa6cd:	mov	es,bx			; 0000A6CD  8EC3  '..'
                  	mov	[0x63],dx		; 0000A6CF  89166300  '..c.'
                  	cbw				; 0000A6D3  98  '.'
                  	xchg	ax,bx			; 0000A6D4  93  '.'
                  	mov	al,0x1			; 0000A6D5  B001  '..'
                  	add	dx,byte +0x4		; 0000A6D7  83C204  '...'
                  	out	dx,al			; 0000A6DA  EE  '.'
                  	sub	dx,byte +0x4		; 0000A6DB  83EA04  '...'
                  	xor	ax,ax			; 0000A6DE  33C0  '3.'
                  	mov	[0x4e],ax		; 0000A6E0  A34E00  '.N.'
                  	mov	[0x62],al		; 0000A6E3  A26200  '.b.'
                  	mov	al,[cs:bx+0xa812]	; 0000A6E6  2E8A8712A8  '.....'
                  	mov	[0x4a],ax		; 0000A6EB  A34A00  '.J.'
                  	shl	bx,1			; 0000A6EE  D1E3  '..'
                  	mov	ax,[cs:bx+0xa81a]	; 0000A6F0  2E8B871AA8  '.....'
                  	mov	[0x4c],ax		; 0000A6F5  A34C00  '.L.'
                  	shr	bx,1			; 0000A6F8  D1EB  '..'
                  	mov	ah,[cs:bx+0xa82a]	; 0000A6FA  2E8AA72AA8  '...*.'
                  	and	ah,0x3f			; 0000A6FF  80E43F  '..?'
                  	mov	al,[0x65]		; 0000A702  A06500  '.e.'
                  	and	al,0xc0			; 0000A705  24C0  '$.'
                  	or	al,ah			; 0000A707  0AC4  0x0A,'.'
                  	mov	[0x65],al		; 0000A709  A26500  '.e.'
                  	mov	ah,[cs:bx+0xa832]	; 0000A70C  2E8AA732A8  '...2.'
                  	mov	[0x66],ah		; 0000A711  88266600  '.&f.'
                  	mov	cx,0x10			; 0000A715  B91000  '...'
                  	push	es			; 0000A718  06  '.'
                  	call	xa795			; 0000A719  E87900  '.y.'
                  	mov	ch,[es:si+0xa]		; 0000A71C  268A6C0A  '&.l',0x0A
                  	mov	cl,[es:si+0xb]		; 0000A720  268A4C0B  '&.L.'
                  	mov	al,[0x49]		; 0000A724  A04900  '.I.'
                  	and	al,0xfe			; 0000A727  24FE  '$.'
                  	cmp	al,0x2			; 0000A729  3C02  '<.'
                  	jnz	xa742			; 0000A72B  7515  'u.'
                  	cmp	byte [es:si+0x9],0xd	; 0000A72D  26807C090D  '&.|.',0x0D
                  	jnz	xa742			; 0000A732  750E  'u.'
                  	mov	al,ch			; 0000A734  8AC5  '..'
                  	call	xa780			; 0000A736  E84700  '.G.'
                  	mov	ch,al			; 0000A739  8AE8  '..'
                  	mov	al,cl			; 0000A73B  8AC1  '..'
                  	call	xa780			; 0000A73D  E84000  '.@.'
                  	mov	cl,al			; 0000A740  8AC8  '..'
                  xa742:	pop	es			; 0000A742  07  '.'
                  	mov	[0x60],cx		; 0000A743  890E6000  '..`.'
                  	mov	al,[0x49]		; 0000A747  A04900  '.I.'
                  	cmp	al,0x7			; 0000A74A  3C07  '<.'
                  	jz	xa755			; 0000A74C  7407
                  	cmp	al,0x4			; 0000A74E  3C04  '<.'
                  	mov	ax,0x0			; 0000A750  B80000  '...'
                  	jnc	xa758			; 0000A753  7303  's.'
                  xa755:	mov	ax,0x720		; 0000A755  B82007  '. .'
                  xa758:	xor	di,di			; 0000A758  33FF  '3.'
                  	mov	cx,0x2000		; 0000A75A  B90020  '.. '
                  	rep	stosw			; 0000A75D  F3AB  '..'
                  	push	ds			; 0000A75F  1E  '.'
                  	pop	es			; 0000A760  07  '.'
                  	mov	di,0x50			; 0000A761  BF5000  '.P.'
                  	xor	ax,ax			; 0000A764  33C0  '3.'
                  	mov	cx,0x8			; 0000A766  B90800  '...'
                  	rep	stosw			; 0000A769  F3AB  '..'
                  	test	byte [0x87],0x10	; 0000A76B  F606870010  '.....'
                  	jz	xa778			; 0000A770  7406  't.'
                  	mov	bx,0x1f4		; 0000A772  BBF401  '...'
                  	call	xc638			; 0000A775  E8C01E  '...'
                  xa778:	mov	al,[0x65]		; 0000A778  A06500  '.e.'
                  	add	dx,byte +0x4		; 0000A77B  83C204  '...'
                  	out	dx,al			; 0000A77E  EE  '.'
                  	ret				; 0000A77F  C3  '.'
                  
                  xa780:	push	cx			; 0000A780  51  'Q'
                  	and	ax,0x1f			; 0000A781  251F00  '%..'
                  	mov	cl,0x3			; 0000A784  B103  '..'
                  	shl	al,cl			; 0000A786  D2E0  '..'
                  	mov	cl,0xe			; 0000A788  B10E  '..'
                  	div	cl			; 0000A78A  F6F1  '..'
                  	cmp	ah,0x7			; 0000A78C  80FC07  '...'
                  	jc	xa793			; 0000A78F  7202  'r.'
                  	inc	al			; 0000A791  FEC0  '..'
                  xa793:	pop	cx			; 0000A793  59  'Y'
                  	ret				; 0000A794  C3  '.'
                  
                  xa795:	xor	bh,bh			; 0000A795  32FF  '2.'
                  	mov	bl,[0x49]		; 0000A797  8A1E4900  '..I.'
                  	push	ds			; 0000A79B  1E  '.'
                  	xor	si,si			; 0000A79C  33F6  '3.'
                  	mov	ds,si			; 0000A79E  8EDE  '..'
                  	lds	si,[0x74]		; 0000A7A0  C5367400  '.6t.'
                  	mov	bl,[cs:bx+0xa83a]	; 0000A7A4  2E8A9F3AA8  '...:.'
                  	add	si,bx			; 0000A7A9  03F3  '..'
                  	push	si			; 0000A7AB  56  'V'
                  	mov	bp,0xa7b2		; 0000A7AC  BDB2A7  '...'
                  	jmp	x9bdd			; 0000A7AF  E92BF4
                  
                  	sti				; 0000A7B2  FB  '.'
                  	pop	si			; 0000A7B3  5E  '^'
                  	mov	ax,ds			; 0000A7B4  8CD8  '..'
                  	mov	es,ax			; 0000A7B6  8EC0  '..'
                  	pop	ds			; 0000A7B8  1F  '.'
                  	ret				; 0000A7B9  C3  '.'
                  
                  	and	al,0x7			; 0000A7BA  2407  '$.'
                  	mov	[0x62],al		; 0000A7BC  A26200  '.b.'
                  	cbw				; 0000A7BF  98  '.'
                  	push	ax			; 0000A7C0  50  'P'
                  	push	dx			; 0000A7C1  52  'R'
                  	mul	word [0x4c]		; 0000A7C2  F7264C00  '.&L.'
                  	mov	[0x4e],ax		; 0000A7C6  A34E00  '.N.'
                  	pop	dx			; 0000A7C9  5A  'Z'
                  	xchg	ax,cx			; 0000A7CA  91  '.'
                  	shr	cx,1			; 0000A7CB  D1E9  '..'
                  	mov	ah,0xc			; 0000A7CD  B40C  '..'
                  	call	xacf9			; 0000A7CF  E82705  '.',0x27,'.'
                  	pop	si			; 0000A7D2  5E  '^'
                  	shl	si,1			; 0000A7D3  D1E6  '..'
                  	mov	cx,[si+0x50]		; 0000A7D5  8B8C5000  '..P.'
                  	jmp	xace4			; 0000A7D9  E90805  '...'
                  
                  	mov	al,[0x66]		; 0000A7DC  A06600  '.f.'
                  	or	bh,bh			; 0000A7DF  0AFF  0x0A,'.'
                  	jnz	xa7ec			; 0000A7E1  7509  'u.'
                  	and	bl,0x1f			; 0000A7E3  80E31F  '...'
                  	and	al,0xe0			; 0000A7E6  24E0  '$.'
                  	or	al,bl			; 0000A7E8  0AC3  0x0A,'.'
                  	jmp	short xa7f7		; 0000A7EA  EB0B  '..'
                  
                  xa7ec:	mov	cl,0x5			; 0000A7EC  B105  '..'
                  	shl	bl,cl			; 0000A7EE  D2E3  '..'
                  	and	bl,0x20			; 0000A7F0  80E320  '.. '
                  	and	al,0xdf			; 0000A7F3  24DF  '$.'
                  	or	al,bl			; 0000A7F5  0AC3  0x0A,'.'
                  xa7f7:	mov	[0x66],al		; 0000A7F7  A26600  '.f.'
                  	add	dx,byte +0x5		; 0000A7FA  83C205  '...'
                  	out	dx,al			; 0000A7FD  EE  '.'
                  	ret				; 0000A7FE  C3  '.'
                  
                  	mov	al,[0x49]		; 0000A7FF  A04900  '.I.'
                  	mov	[bp+0x0],al		; 0000A802  884600  '.F.'
                  	mov	al,[0x4a]		; 0000A805  A04A00  '.J.'
                  	mov	[bp+0x1],al		; 0000A808  884601  '.F.'
                  	mov	al,[0x62]		; 0000A80B  A06200  '.b.'
                  	mov	[bp+0x7],al		; 0000A80E  884607  '.F.'
                  	ret				; 0000A811  C3  '.'
                  
                  	db	'((PP((PP'
                  
                  	add	[bx+si],cl		; 0000A81A  0008  '..'
                  	add	[bx+si],cl		; 0000A81C  0008  '..'
                  	add	[bx+si],dl		; 0000A81E  0010  '..'
                  	add	[bx+si],dl		; 0000A820  0010  '..'
                  	add	[bx+si+0x0],al		; 0000A822  004000  '.@.'
                  	inc	ax			; 0000A825  40  '@'
                  	add	[bx+si+0x0],al		; 0000A826  004000  '.@.'
                  	inc	ax			; 0000A829  40  '@'
                  	sub	al,0x28			; 0000A82A  2C28  ',('
                  	sub	ax,0x2a29		; 0000A82C  2D292A  '-)*'
                  	cs	push ds			; 0000A82F  2E1E  '..'
                  	db	')000000?'
                  	xor	[bx+si],al		; 0000A839  3000  '0.'
                  	add	[bx+si],dl		; 0000A83B  0010  '..'
                  	adc	[bx+si],ah		; 0000A83D  1020  '. '
                  	and	[bx+si],ah		; 0000A83F  2020  '  '
                  	xor	[bp+di],al		; 0000A841  3003  '0.'
                  	add	[bp+di],ax		; 0000A843  0103  '..'
                  	pop	es			; 0000A845  07  '.'
                  	rcr	byte [bp+di],1		; 0000A846  D01B  '..'
                  	rcr	byte [bp+di],1		; 0000A848  D01B  '..'
                  	ret				; 0000A84A  C3  '.'
                  
                  	db	0xE2,0xD0
                  	sbb	dx,ax			; 0000A84D  1BD0  '..'
                  	sbb	dx,[si-0x1]		; 0000A84F  1B54FF  '.T.'
                  	mov	al,[0xd095]		; 0000A852  A095D0  '...'
                  	sbb	sp,[di+0x87fe]		; 0000A855  1BA5FE87  '....'
                  	jmp	xc42c			; 0000A859  E9D01B  '...'
                  
                  	rcr	byte [bp+di],1		; 0000A85C  D01B  '..'
                  	rcr	byte [bp+di],1		; 0000A85E  D01B  '..'
                  	mov	[0x5789],ax		; 0000A860  A38957  '..W'
                  	out	dx,ax			; 0000A863  EF  '.'
                  	rcr	byte [bp+di],1		; 0000A864  D01B  '..'
                  	gs	lock dec bp		; 0000A866  65F04D  'e.M'
                  	clc				; 0000A869  F8  '.'
                  	inc	cx			; 0000A86A  41  'A'
                  	clc				; 0000A86B  F8  '.'
                  	pop	cx			; 0000A86C  59  'Y'
                  	in	al,dx			; 0000A86D  EC  '.'
                  	cmp	di,sp			; 0000A86E  39E7  '9.'
                  	pop	cx			; 0000A870  59  'Y'
                  	clc				; 0000A871  F8  '.'
                  	cs	call 0x9848		; 0000A872  2EE8D2EF  '....'
                  	shl	bh,0xf2			; 0000A876  C0E7F2  '...'
                  	out	0x6e,al			; 0000A879  E66E  '.n'
                  	db	0xFE			; 0000A87B  FE  '.'
                  	push	bx			; 0000A87C  53  'S'
                  	call	near [bp+di-0x1]	; 0000A87D  FF53FF  '.S.'
                  	movsb				; 0000A880  A4  '.'
                  	db	0xF0			; 0000A881  F0  '.'
                  	db	0xC7			; 0000A882  C7  '.'
                  	out	dx,ax			; 0000A883  EF  '.'
                  	add	[bx+si],al		; 0000A884  0000  '..'
                  	xchg	ax,di			; 0000A886  97  '.'
                  	dec	dx			; 0000A887  4A  'J'
                  	pop	ds			; 0000A888  1F  '.'
                  	sbb	al,0xd0			; 0000A889  1CD0  '..'
                  	sbb	dx,ax			; 0000A88B  1BD0  '..'
                  	sbb	dx,ax			; 0000A88D  1BD0  '..'
                  	sbb	bp,[bx+si]		; 0000A88F  1B28  '.('
                  	sbb	al,0xd0			; 0000A891  1CD0  '..'
                  	sbb	dx,ax			; 0000A893  1BD0  '..'
                  	sbb	dx,ax			; 0000A895  1BD0  '..'
                  	sbb	di,ax			; 0000A897  1BF8  '..'
                  	add	di,ax			; 0000A899  03F8  '..'
                  	add	bh,[si+0x7803]		; 0000A89B  02BC0378  '...x'
                  	add	di,[bx+si+0x2]		; 0000A89F  037802  '.x.'
                  	adc	al,0x14			; 0000A8A2  1414  '..'
                  	adc	al,0x14			; 0000A8A4  1414  '..'
                  	add	[bx+di],ax		; 0000A8A6  0101  '..'
                  	add	[bx+di],ax		; 0000A8A8  0101  '..'
                  	push	ds			; 0000A8AA  1E  '.'
                  	add	[0xb000],bh		; 0000A8AB  003E00
                  
                  xa8ae:	mov	al,0x30			; 0000A8AE  B030
                  	out	0x84,al			; 0000A8B0  E684
                  	mov	ax,0x0040		; 0000A8B2  B84000  '..@.'
                  	mov	es,ax			; 0000A8B5  8EC0  '..'
                  	mov	bx,[0x13]		; 0000A8B7  8B1E1300  '....'
                  	pop	dx			; 0000A8BB  5A  'Z'
                  	xor	bp,bp			; 0000A8BC  33ED  '3.'
                  	xor	ax,ax			; 0000A8BE  33C0  '3.'
                  	mov	si,0x2000		; 0000A8C0  BE0020  '.. '
                  xa8c3:	xor	di,di			; 0000A8C3  33FF  '3.'
                  	mov	es,bp			; 0000A8C5  8EC5  '..'
                  	mov	cx,0x8000		; 0000A8C7  B90080  '...'
                  	rep	stosw			; 0000A8CA  F3AB  '..'
                  	add	bp,0x1000		; 0000A8CC  81C50010  '....'
                  	cmp	bp,si			; 0000A8D0  3BEE  ';.'
                  	jc	xa8c3			; 0000A8D2  72EF  'r.'
                  	push	dx			; 0000A8D4  52  'R'
                  	mov	ax,0x40			; 0000A8D5  B84000  '.@.'
                  	mov	es,ax			; 0000A8D8  8EC0  '..'
                  	mov	[0x13],bx		; 0000A8DA  891E1300  '....'
                  	xor	ax,ax			; 0000A8DE  33C0  '3.'
                  	mov	es,ax			; 0000A8E0  8EC0  '..'
                  	mov	di,0x80			; 0000A8E2  BF8000  '...'
                  	mov	cx,0x50			; 0000A8E5  B95000  '.P.'
                  	mov	ax,cs			; 0000A8E8  8CC8  '..'
                  xa8ea:	mov	si,0xa896		; 0000A8EA  BE96A8  '...'
                  	cs	movsw			; 0000A8ED  2EA5  '..'
                  	stosw				; 0000A8EF  AB  '.'
                  	loop	xa8ea			; 0000A8F0  E2F8  '..'
                  	xor	ax,ax			; 0000A8F2  33C0  '3.'
                  	mov	es,ax			; 0000A8F4  8EC0  '..'
                  	mov	di,0x180		; 0000A8F6  BF8001  '...'
                  	mov	cx,0x8			; 0000A8F9  B90800  '...'
                  	mov	ax,0x0			; 0000A8FC  B80000  '...'
                  xa8ff:	stosw				; 0000A8FF  AB  '.'
                  	stosw				; 0000A900  AB  '.'
                  	loop	xa8ff			; 0000A901  E2FC  '..'
                  	mov	al,0x31			; 0000A903  B031  '.1'
                  	out	0x84,al			; 0000A905  E684  '..'
                  	xor	ax,ax			; 0000A907  33C0  '3.'
                  	mov	es,ax			; 0000A909  8EC0  '..'
                  	mov	si,0xa886		; 0000A90B  BE86A8  '...'
                  	mov	di,0x1c0		; 0000A90E  BFC001  '...'
                  	mov	cx,0x8			; 0000A911  B90800  '...'
                  	mov	ax,cs			; 0000A914  8CC8  '..'
                  xa916:	cs	movsw			; 0000A916  2EA5  '..'
                  	stosw				; 0000A918  AB  '.'
                  	loop	xa916			; 0000A919  E2FB  '..'
                  	mov	al,0x32			; 0000A91B  B032  '.2'
                  	out	0x84,al			; 0000A91D  E684  '..'
                  	mov	si,0xa846		; 0000A91F  BE46A8  '.F.'
                  	mov	di,0x0			; 0000A922  BF0000  '...'
                  	mov	cx,0x20			; 0000A925  B92000  '. .'
                  	mov	ax,cs			; 0000A928  8CC8  '..'
                  xa92a:	cs	movsw			; 0000A92A  2EA5  '..'
                  	stosw				; 0000A92C  AB  '.'
                  	loop	xa92a			; 0000A92D  E2FB  '..'
                  	push	di			; 0000A92F  57  'W'
                  	mov	di,0x7e			; 0000A930  BF7E00  '.~.'
                  	xor	ax,ax			; 0000A933  33C0  '3.'
                  	mov	[es:di],ax		; 0000A935  268905  '&..'
                  	pop	di			; 0000A938  5F  '_'
                  	mov	al,0x33			; 0000A939  B033  '.3'
                  	out	0x84,al			; 0000A93B  E684  '..'
                  	mov	ax,0x40			; 0000A93D  B84000  '.@.'
                  	mov	ds,ax			; 0000A940  8ED8  '..'
                  	mov	dx,0x1200		; 0000A942  BA0012  '...'
                  	in	al,0x80			; 0000A945  E480  '..'
                  	cmp	al,0x34			; 0000A947  3C34  '<4'
                  	jnz	xa94d			; 0000A949  7502  'u.'
                  	mov	dl,al			; 0000A94B  8AD0  '..'
                  xa94d:	mov	[0x72],dx		; 0000A94D  89167200  '..r.'
                  	mov	al,0x34			; 0000A951  B034  '.4'
                  	out	0x84,al			; 0000A953  E684  '..'
                  	mov	ah,0x90			; 0000A955  B490  '..'
                  	mov	cx,0x1e			; 0000A957  B91E00  '...'
                  	xor	bx,bx			; 0000A95A  33DB  '3.'
                  	xor	dx,dx			; 0000A95C  33D2  '3.'
                  xa95e:	mov	al,ah			; 0000A95E  8AC4  '..'
                  	call	xb544			; 0000A960  E8E10B  '...'
                  	mov	dl,al			; 0000A963  8AD0  '..'
                  	add	bx,dx			; 0000A965  03DA  '..'
                  	inc	ah			; 0000A967  FEC4  '..'
                  	loop	xa95e			; 0000A969  E2F3  '..'
                  	mov	al,0xaf			; 0000A96B  B0AF  '..'
                  	call	xb544			; 0000A96D  E8D40B  '...'
                  	mov	dl,al			; 0000A970  8AD0  '..'
                  	mov	al,0xae			; 0000A972  B0AE  '..'
                  	call	xb544			; 0000A974  E8CD0B  '...'
                  	mov	dh,al			; 0000A977  8AF0  '..'
                  	cmp	dx,bx			; 0000A979  3BD3  ';.'
                  	jz	xa98f			; 0000A97B  7412  't.'
                  	mov	al,0x8e			; 0000A97D  B08E  '..'
                  	call	xb544			; 0000A97F  E8C20B  '...'
                  	or	al,0x40			; 0000A982  0C40  '.@'
                  	mov	ah,al			; 0000A984  8AE0  '..'
                  	mov	al,0x8e			; 0000A986  B08E  '..'
                  	call	xb549			; 0000A988  E8BE0B  '...'
                  	mov	al,0x35			; 0000A98B  B035  '.5'
                  	out	0x84,al			; 0000A98D  E684  '..'
                  xa98f:	mov	al,0x36			; 0000A98F  B036  '.6'
                  	out	0x84,al			; 0000A991  E684  '..'
                  	mov	bx,0x0			; 0000A993  BB0000  '...'
                  	mov	ax,ds			; 0000A996  8CD8  '..'
                  	mov	es,ax			; 0000A998  8EC0  '..'
                  	mov	al,0x38			; 0000A99A  B038  '.8'
                  	out	0x84,al			; 0000A99C  E684  '..'
                  	mov	si,0xa898		; 0000A99E  BE98A8  '...'
                  	mov	di,0x0			; 0000A9A1  BF0000  '...'
                  	mov	cx,0x2			; 0000A9A4  B90200  '...'
                  xa9a7:	cs	lodsw			; 0000A9A7  2EAD  '..'
                  	xchg	ax,dx			; 0000A9A9  92  '.'
                  	inc	dx			; 0000A9AA  42  'B'
                  	inc	dx			; 0000A9AB  42  'B'
                  	in	al,dx			; 0000A9AC  EC  '.'
                  	cmp	al,0xff			; 0000A9AD  3CFF  '<.'
                  	jz	xa9b8			; 0000A9AF  7407  't.'
                  	add	bh,0x2			; 0000A9B1  80C702  '...'
                  	dec	dx			; 0000A9B4  4A  'J'
                  	dec	dx			; 0000A9B5  4A  'J'
                  	xchg	ax,dx			; 0000A9B6  92  '.'
                  	stosw				; 0000A9B7  AB  '.'
                  xa9b8:	loop	xa9a7			; 0000A9B8  E2ED  '..'
                  	mov	al,0x39			; 0000A9BA  B039  '.9'
                  	out	0x84,al			; 0000A9BC  E684  '..'
                  	mov	si,0xa89c		; 0000A9BE  BE9CA8  '...'
                  	mov	di,0x8			; 0000A9C1  BF0800  '...'
                  	mov	cx,0x3			; 0000A9C4  B90300  '...'
                  xa9c7:	cs	lodsw			; 0000A9C7  2EAD  '..'
                  	xchg	ax,dx			; 0000A9C9  92  '.'
                  	in	al,dx			; 0000A9CA  EC  '.'
                  	not	al			; 0000A9CB  F6D0  '..'
                  	out	dx,al			; 0000A9CD  EE  '.'
                  	mov	ah,al			; 0000A9CE  8AE0  '..'
                  	in	al,dx			; 0000A9D0  EC  '.'
                  	cmp	al,ah			; 0000A9D1  3AC4  ':.'
                  	jnz	xa9da			; 0000A9D3  7505  'u.'
                  	add	bh,0x40			; 0000A9D5  80C740  '..@'
                  	xchg	ax,dx			; 0000A9D8  92  '.'
                  	stosw				; 0000A9D9  AB  '.'
                  xa9da:	loop	xa9c7			; 0000A9DA  E2EB  '..'
                  	mov	al,0x3a			; 0000A9DC  B03A  '.:'
                  	out	0x84,al			; 0000A9DE  E684  '..'
                  	mov	si,0xa8a2		; 0000A9E0  BEA2A8  '...'
                  	mov	di,0x78			; 0000A9E3  BF7800  '.x.'
                  	mov	cx,0x6			; 0000A9E6  B90600  '...'
                  xa9e9:	cs	rep movsw		; 0000A9E9  F32EA5  '...'
                  	test	cx,cx			; 0000A9EC  85C9  '..'
                  	jnz	xa9e9			; 0000A9EE  75F9  'u.'
                  	mov	ax,0x40			; 0000A9F0  B84000  '.@.'
                  	mov	ds,ax			; 0000A9F3  8ED8  '..'
                  	mov	[0x10],bx		; 0000A9F5  891E1000  '....'
                  	mov	al,0x3b			; 0000A9F9  B03B  '.;'
                  	out	0x84,al			; 0000A9FB  E684  '..'
                  	call	xc259			; 0000A9FD  E85918  '.Y.'
                  	;
                  	;   Set bit 2 (reserved?) and bit 4 (memory size?) of ROM BIOS Video Mode Options byte @40:0087.
                  	;   It would appear that Compaq had a different conception of this byte; however, in the case of an
                  	;   adapter like the IBM VGA, it doesn't matter, since the IBM VGA ROM will rewrite this byte anyway.
                  	;
                  	or	byte [0x87],0x14	; 0000AA00  800E870014  '.....'
                  	mov	al,0x8e			; 0000AA05  B08E  '..'
                  	call	xb544			; 0000AA07  E83A0B  '.:.'
                  	test	al,0x40			; 0000AA0A  A840  '.@'
                  	jnz	xaa1e			; 0000AA0C  7510  'u.'
                  	mov	al,0xad			; 0000AA0E  B0AD  '..'
                  	call	xb544			; 0000AA10  E8310B  '.1.'
                  	test	al,0x5			; 0000AA13  A805  '..'
                  	jz	xaa1e			; 0000AA15  7407  't.'
                  	and	byte [0x87],0xfb	; 0000AA17  80268700FB  '.&...'
                  	jmp	short xaa2f		; 0000AA1C  EB11  '..'
                  
                  xaa1e:	mov	bx,xba77		; 0000AA1E  BB77BA  '.w.'
                  	mov	es,[cs:bx+0x6]		; 0000AA21  2E8E4706  '..G.'
                  	call	x9e1c			; 0000AA25  E8F4F3  '...'
                  	jz	xaa2f			; 0000AA28  7405  't.'
                  	and	byte [0x87],0xfb	; 0000AA2A  80268700FB  '.&...'
                  xaa2f:	mov	byte [0x84],0x18	; 0000AA2F  C606840018  '.....'
                  	mov	al,0x94			; 0000AA34  B094  '..'
                  	call	xb544			; 0000AA36  E80B0B  '...'
                  	and	al,0x30			; 0000AA39  2430  '$0'
                  	mov	ah,al			; 0000AA3B  8AE0  '..'
                  	push	ax			; 0000AA3D  50  'P'
                  	push	ds			; 0000AA3E  1E  '.'
                  	mov	al,0x52			; 0000AA3F  B052  '.R'
                  	out	0x84,al			; 0000AA41  E684  '..'
                  	call	x9a83			; 0000AA43  E83DF0  '.=.'
                  	pop	ds			; 0000AA46  1F  '.'
                  	pop	ax			; 0000AA47  58  'X'
                  	jz	xaa59			; 0000AA48  740F  't.'
                  	cmp	ah,0x0			; 0000AA4A  80FC00  '...'
                  	jz	xaa52			; 0000AA4D  7403  't.'
                  	call	xab87			; 0000AA4F  E83501  '.5.'
                  xaa52:	mov	al,0x53			; 0000AA52  B053  '.S'
                  	out	0x84,al			; 0000AA54  E684  '..'
                  	call	x9a97			; 0000AA56  E83EF0  '.>.'
                  xaa59:	ret				; 0000AA59  C3  '.'
                  
                  xaa5a:	mov	ax,0x40			; 0000AA5A  B84000  '.@.'
                  	mov	ds,ax			; 0000AA5D  8ED8  '..'
                  	call	xd03e			; 0000AA5F  E8DC25  '..%'
                  	jc	xaa6d			; 0000AA62  7209  'r.'
                  	cmp	al,0x5			; 0000AA64  3C05  '<.'
                  	jnz	xaa6d			; 0000AA66  7505  'u.'
                  	and	byte [0x87],0xfb	; 0000AA68  80268700FB  '.&...'
                  xaa6d:	ret				; 0000AA6D  C3  '.'
                  
                  	db	0xFF			; 0000AA6E  FF  '.'
                  	db	0xFF			; 0000AA6F  FF  '.'
                  	db	0xFF			; 0000AA70  FF  '.'
                  	jmp	xae12			; 0000AA71  E99E03
                  
                  xaa74:	mov	al,0x50			; 0000AA74  B050  '.P'
                  	out	0x84,al			; 0000AA76  E684  '..'
                  	mov	ax,0x40			; 0000AA78  B84000  '.@.'
                  	mov	ds,ax			; 0000AA7B  8ED8  '..'
                  	mov	al,0x51			; 0000AA7D  B051  '.Q'
                  	out	0x84,al			; 0000AA7F  E684  '..'
                  	mov	al,0x8e			; 0000AA81  B08E  '..'
                  	call	xb544			; 0000AA83  E8BE0A  '..',0x0A
                  	test	al,0xc0			; 0000AA86  A8C0  '..'
                  	jz	xaa8f			; 0000AA88  7405  't.'
                  	mov	ah,0xff			; 0000AA8A  B4FF  '..'
                  	jmp	short xaa98		; 0000AA8C  EB0A  '.',0x0A
                  
                  	nop				; 0000AA8E  90  '.'
                  xaa8f:	mov	al,0x94			; 0000AA8F  B094  '..'
                  	call	xb544			; 0000AA91  E8B00A  '..',0x0A
                  	and	al,0x30			; 0000AA94  2430  '$0'
                  	mov	ah,al			; 0000AA96  8AE0  '..'
                  xaa98:	push	ax			; 0000AA98  50  'P'
                  	push	ds			; 0000AA99  1E  '.'
                  	mov	al,0x52			; 0000AA9A  B052  '.R'
                  	out	0x84,al			; 0000AA9C  E684  '..'
                  	call	x9a83			; 0000AA9E  E8E2EF  '...'
                  	pop	ds			; 0000AAA1  1F  '.'
                  	pop	ax			; 0000AAA2  58  'X'
                  	jz	xaab5			; 0000AAA3  7410  't.'
                  	ret				; 0000AAA5  C3  '.'
                  
                  	nop				; 0000AAA6  90  '.'
                  	nop				; 0000AAA7  90  '.'
                  	jz	xaaad			; 0000AAA8  7403  't.'
                  	call	xab87			; 0000AAAA  E8DA00  '...'
                  xaaad:	mov	al,0x53			; 0000AAAD  B053  '.S'
                  	out	0x84,al			; 0000AAAF  E684  '..'
                  	call	x9a97			; 0000AAB1  E8E3EF  '...'
                  	ret				; 0000AAB4  C3  '.'
                  
                  xaab5:	push	ds			; 0000AAB5  1E  '.'
                  	push	es			; 0000AAB6  06  '.'
                  	push	ax			; 0000AAB7  50  'P'
                  	call	x9e5a			; 0000AAB8  E89FF3  '...'
                  	jz	xaac9			; 0000AABB  740C  't.'
                  	xor	ax,ax			; 0000AABD  33C0  '3.'
                  	mov	es,ax			; 0000AABF  8EC0  '..'
                  	mov	di,0x74			; 0000AAC1  BF7400  '.t.'
                  	mov	word [es:di],0xf0e4	; 0000AAC4  26C705E4F0  '&....'
                  xaac9:	and	byte [0x10],0xcf	; 0000AAC9  80261000CF  '.&...'
                  	or	byte [0x10],0x30	; 0000AACE  800E100030  '....0'
                  	mov	ah,0x0			; 0000AAD3  B400  '..'
                  	mov	al,0x7			; 0000AAD5  B007  '..'
                  	int	0x10			; 0000AAD7  CD10  '..'
                  	and	byte [0x10],0xcf	; 0000AAD9  80261000CF  '.&...'
                  	or	byte [0x10],0x20	; 0000AADE  800E100020  '.... '
                  	mov	ah,0x0			; 0000AAE3  B400  '..'
                  	mov	al,0x3			; 0000AAE5  B003  '..'
                  	int	0x10			; 0000AAE7  CD10  '..'
                  	call	xab96			; 0000AAE9  E8AA00  '...'
                  	pop	ax			; 0000AAEC  58  'X'
                  	pop	es			; 0000AAED  07  '.'
                  	pop	ds			; 0000AAEE  1F  '.'
                  	mov	al,0x54			; 0000AAEF  B054  '.T'
                  	out	0x84,al			; 0000AAF1  E684  '..'
                  	mov	bp,0xaaf9		; 0000AAF3  BDF9AA  '...'
                  	jmp	xac31			; 0000AAF6  E93801  '.8.'
                  
                  	and	al,0x40			; 0000AAF9  2440  '$@'
                  	push	ax			; 0000AAFB  50  'P'
                  	call	0xab1f			; 0000AAFC  E82000  '. .'
                  	pop	ax			; 0000AAFF  58  'X'
                  	jnc	xab1e			; 0000AB00  731C  's.'
                  	not	al			; 0000AB02  F6D0  '..'
                  	and	al,0x40			; 0000AB04  2440  '$@'
                  	push	ax			; 0000AB06  50  'P'
                  	mov	al,0x55			; 0000AB07  B055  '.U'
                  	out	0x84,al			; 0000AB09  E684  '..'
                  	pop	ax			; 0000AB0B  58  'X'
                  	call	xab1f			; 0000AB0C  E81000  '...'
                  	jnc	xab1e			; 0000AB0F  730D  's',0x0D
                  	mov	al,0x56			; 0000AB11  B056  '.V'
                  	out	0x84,al			; 0000AB13  E684  '..'
                  	call	xc7ab			; 0000AB15  E8931C
                  	call	xc791			; 0000AB18  E8761C  '.v.'
                  	call	xc791			; 0000AB1B  E8731C  '.s.'
                  xab1e:	ret				; 0000AB1E  C3  '.'
                  
                  xab1f:	mov	dx,xba77		; 0000AB1F  BA77BA  '.w.'
                  	mov	bx,dx			; 0000AB22  8BDA  '..'
                  	add	bx,byte +0xf		; 0000AB24  83C30F  '...'
                  	or	al,al			; 0000AB27  0AC0  0x0A,'.'
                  	jnz	xab6b			; 0000AB29  7540  'u@'
                  	xchg	dx,bx			; 0000AB2B  87D3  '..'
                  	mov	al,0x1			; 0000AB2D  B001  '..'
                  	mov	ch,0x10			; 0000AB2F  B510  '..'
                  	cmp	ah,0x10			; 0000AB31  80FC10  '...'
                  	jz	xab46			; 0000AB34  7410  't.'
                  	mov	al,0x3			; 0000AB36  B003  '..'
                  	mov	ch,0x20			; 0000AB38  B520  '. '
                  	cmp	ah,0x20			; 0000AB3A  80FC20  '.. '
                  	jz	xab46			; 0000AB3D  7407  't.'
                  	call	xab87			; 0000AB3F  E84500  '.E.'
                  	mov	al,0x3			; 0000AB42  B003  '..'
                  	mov	ch,0x20			; 0000AB44  B520  '. '
                  xab46:	and	byte [0x10],0xcf	; 0000AB46  80261000CF  '.&...'
                  	or	[0x10],ch		; 0000AB4B  082E1000  '....'
                  	push	ax			; 0000AB4F  50  'P'
                  	push	bx			; 0000AB50  53  'S'
                  	mov	es,[cs:bx+0x6]		; 0000AB51  2E8E4706  '..G.'
                  	call	x9e1c			; 0000AB55  E8C4F2  '...'
                  	pop	bx			; 0000AB58  5B  '['
                  	pop	ax			; 0000AB59  58  'X'
                  	jz	xab5e			; 0000AB5A  7402  't.'
                  	stc				; 0000AB5C  F9  '.'
                  	ret				; 0000AB5D  C3  '.'
                  
                  xab5e:	push	ax			; 0000AB5E  50  'P'
                  	mov	al,0x57			; 0000AB5F  B057  '.W'
                  	out	0x84,al			; 0000AB61  E684  '..'
                  	pop	ax			; 0000AB63  58  'X'
                  	mov	ah,0x0			; 0000AB64  B400  '..'
                  	int	0x10			; 0000AB66  CD10  '..'
                  	xor	ax,ax			; 0000AB68  33C0  '3.'
                  	ret				; 0000AB6A  C3  '.'
                  
                  xab6b:	push	bx			; 0000AB6B  53  'S'
                  	cmp	ah,0x30			; 0000AB6C  80FC30  '..0'
                  	jz	xab74			; 0000AB6F  7403  't.'
                  	call	xab87			; 0000AB71  E81300  '...'
                  xab74:	or	byte [0x10],0x30	; 0000AB74  800E100030  '....0'
                  	pop	bx			; 0000AB79  5B  '['
                  	mov	es,[cs:bx+0x6]		; 0000AB7A  2E8E4706  '..G.'
                  	call	x9e1c			; 0000AB7E  E89BF2  '...'
                  	mov	al,0x7			; 0000AB81  B007  '..'
                  	jz	xab5e			; 0000AB83  74D9  't.'
                  	stc				; 0000AB85  F9  '.'
                  	ret				; 0000AB86  C3  '.'
                  
                  xab87:	mov	al,0x8e			; 0000AB87  B08E  '..'
                  	call	xb544			; 0000AB89  E8B809  '...'
                  	or	al,0x20			; 0000AB8C  0C20  '. '
                  	mov	ah,al			; 0000AB8E  8AE0  '..'
                  	mov	al,0x8e			; 0000AB90  B08E  '..'
                  	call	xb549			; 0000AB92  E8B409  '...'
                  	ret				; 0000AB95  C3  '.'
                  
                  xab96:	mov	al,0x58			; 0000AB96  B058  '.X'
                  	out	0x84,al			; 0000AB98  E684  '..'
                  	push	cs			; 0000AB9A  0E  '.'
                  	pop	ds			; 0000AB9B  1F  '.'
                  	mov	bx,xba77		; 0000AB9C  BB77BA  '.w.'
                  xab9f:	mov	al,0x59			; 0000AB9F  B059  '.Y'
                  	out	0x84,al			; 0000ABA1  E684  '..'
                  	mov	es,[bx+0x6]		; 0000ABA3  8E4706  '.G.'
                  	call	x9e1c			; 0000ABA6  E873F2  '.s.'
                  	jz	xabae			; 0000ABA9  7403  't.'
                  	jmp	short xac1c		; 0000ABAB  EB6F  '.o'
                  
                  	nop				; 0000ABAD  90  '.'
                  xabae:	mov	al,0x5a			; 0000ABAE  B05A  '.Z'
                  	out	0x84,al			; 0000ABB0  E684  '..'
                  	mov	al,0x1			; 0000ABB2  B001  '..'
                  	cmp	word [bx],0x3b8		; 0000ABB4  813FB803  '.?..'
                  	jnz	xabbc			; 0000ABB8  7502  'u.'
                  	mov	al,0x1			; 0000ABBA  B001  '..'
                  xabbc:	mov	dx,[bx]			; 0000ABBC  8B17  '..'
                  	out	dx,al			; 0000ABBE  EE  '.'
                  	mov	al,0x5b			; 0000ABBF  B05B  '.['
                  	out	0x84,al			; 0000ABC1  E684  '..'
                  	xor	dx,dx			; 0000ABC3  33D2  '3.'
                  xabc5:	xor	di,di			; 0000ABC5  33FF  '3.'
                  	mov	cx,[bx+0xd]		; 0000ABC7  8B4F0D  '.O',0x0D
                  xabca:	mov	ax,di			; 0000ABCA  8BC7  '..'
                  	xor	al,ah			; 0000ABCC  32C4  '2.'
                  	jpo	xabd2			; 0000ABCE  7B02  '{.'
                  	inc	al			; 0000ABD0  FEC0  '..'
                  xabd2:	xor	al,dl			; 0000ABD2  32C2  '2.'
                  	stosb				; 0000ABD4  AA  '.'
                  	loop	xabca			; 0000ABD5  E2F3  '..'
                  	xor	di,di			; 0000ABD7  33FF  '3.'
                  	mov	cx,[bx+0xd]		; 0000ABD9  8B4F0D  '.O',0x0D
                  xabdc:	mov	ax,di			; 0000ABDC  8BC7  '..'
                  	xor	al,ah			; 0000ABDE  32C4  '2.'
                  	jpo	xabe4			; 0000ABE0  7B02  '{.'
                  	inc	al			; 0000ABE2  FEC0  '..'
                  xabe4:	xor	al,dl			; 0000ABE4  32C2  '2.'
                  	scasb				; 0000ABE6  AE  '.'
                  	loope	xabdc			; 0000ABE7  E1F3  '..'
                  	jnz	xabf0			; 0000ABE9  7505  'u.'
                  	xor	dl,0xff			; 0000ABEB  80F2FF  '...'
                  	jnz	xabc5			; 0000ABEE  75D5  'u.'
                  xabf0:	mov	al,0x5c			; 0000ABF0  B05C  '.\'
                  	out	0x84,al			; 0000ABF2  E684  '..'
                  	pushf				; 0000ABF4  9C  '.'
                  	mov	bp,0xabfb		; 0000ABF5  BDFBAB  '...'
                  	jmp	x9bfa			; 0000ABF8  E9FFEF
                  
                  	xor	cx,cx			; 0000ABFB  33C9  '3.'
                  	mov	dl,[bx+0x2]		; 0000ABFD  8A5702  '.W.'
                  	mov	ah,0xe			; 0000AC00  B40E  '..'
                  	call	xacf9			; 0000AC02  E8F400  '...'
                  	popf				; 0000AC05  9D  '.'
                  	jz	xac1c			; 0000AC06  7414  't.'
                  	mov	al,0x5d			; 0000AC08  B05D  '.]'
                  	out	0x84,al			; 0000AC0A  E684  '..'
                  	push	bx			; 0000AC0C  53  'S'
                  	mov	dx,[bx+0x8]		; 0000AC0D  8B5708  '.W.'
                  	xor	cx,cx			; 0000AC10  33C9  '3.'
                  	mov	cl,[bx+0xc]		; 0000AC12  8A4F0C  '.O.'
                  	mov	bx,[bx+0xa]		; 0000AC15  8B5F0A  '._',0x0A
                  	call	xc745			; 0000AC18  E82A1B  '.*.'
                  	pop	bx			; 0000AC1B  5B  '['
                  xac1c:	mov	al,0x5e			; 0000AC1C  B05E  '.^'
                  	out	0x84,al			; 0000AC1E  E684  '..'
                  	add	bx,byte +0xf		; 0000AC20  83C30F  '...'
                  	cmp	bx,0xba95		; 0000AC23  81FB95BA  '....'
                  	jnc	xac2c			; 0000AC27  7303  's.'
                  	jmp	xab9f			; 0000AC29  E973FF  '.s.'
                  
                  xac2c:	mov	al,0x5f			; 0000AC2C  B05F  '._'
                  	out	0x84,al			; 0000AC2E  E684  '..'
                  	ret				; 0000AC30  C3  '.'
                  
                  xac31:	mov	al,0xc0			; 0000AC31  B0C0  '..'
                  	out	0x64,al			; 0000AC33  E664  '.d'
                  	mov	cx,0xffff		; 0000AC35  B9FFFF  '...'
                  xac38:	in	al,0x64			; 0000AC38  E464  '.d'
                  	test	al,0x2			; 0000AC3A  A802  '..'
                  	jz	xac42			; 0000AC3C  7404  't.'
                  	loop	xac38			; 0000AC3E  E2F8  '..'
                  	jmp	short xac4d		; 0000AC40  EB0B  '..'
                  
                  xac42:	mov	cx,0xffff		; 0000AC42  B9FFFF  '...'
                  xac45:	in	al,0x64			; 0000AC45  E464  '.d'
                  	test	al,0x1			; 0000AC47  A801  '..'
                  	jnz	xac5b			; 0000AC49  7510  'u.'
                  	loop	xac45			; 0000AC4B  E2F8  '..'
                  
                  xac4d:	mov	bx,0xb810		; 0000AC4D  BB10B8  '...'
                  	mov	cx,0x1d			; 0000AC50  B91D00  '...'
                  	mov	bp,0xac59		; 0000AC53  BD59AC  '.Y.'
                  	jmp	xc7f7			; 0000AC56  E99E1B  '...'
                  xac59:	jmp	short xac59		; 0000AC59  Hang the machine
                  
                  xac5b:	in	al,0x60			; 0000AC5B  E460  '.`'
                  	jmp	bp			; 0000AC5D  FFE5  '..'
                  
                  	times	26 db 0xFF		; 0000AC5F - 0000AC78
                  
                  	jmp	0xf000:0x8e31		; 0000AC79  EA318E00F0  '.1...'
                  
                  	mov	[0x60],cx		; 0000AC7E  890E6000  '..`.'
                  	mov	al,[0x49]		; 0000AC82  A04900  '.I.'
                  	and	al,0xfe			; 0000AC85  24FE  '$.'
                  	cmp	al,0x2			; 0000AC87  3C02  '<.'
                  	jnz	xacb5			; 0000AC89  752A  'u*'
                  	xor	bx,bx			; 0000AC8B  33DB  '3.'
                  	mov	ds,bx			; 0000AC8D  8EDB  '..'
                  	lds	si,[0x74]		; 0000AC8F  C5367400  '.6t.'
                  	cmp	byte [si+0x19],0xd	; 0000AC93  807C190D  '.|.',0x0D
                  	jnz	xacb5			; 0000AC97  751C  'u.'
                  	test	cx,0x1818		; 0000AC99  F7C11818  '....'
                  	jnz	xacb5			; 0000AC9D  7516  'u.'
                  	mov	bx,cx			; 0000AC9F  8BD9  '..'
                  	and	bx,0x6060		; 0000ACA1  81E36060  '..``'
                  	mov	al,ch			; 0000ACA5  8AC5  '..'
                  	call	xacbb			; 0000ACA7  E81100  '...'
                  	mov	ch,al			; 0000ACAA  8AE8  '..'
                  	mov	al,cl			; 0000ACAC  8AC1  '..'
                  	call	xacbb			; 0000ACAE  E80A00  '.',0x0A,'.'
                  	mov	cl,al			; 0000ACB1  8AC8  '..'
                  	or	cx,bx			; 0000ACB3  0BCB  '..'
                  xacb5:	mov	ah,0xa			; 0000ACB5  B40A  '.',0x0A
                  	call	xacf9			; 0000ACB7  E83F00  '.?.'
                  	ret				; 0000ACBA  C3  '.'
                  
                  xacbb:	and	al,0xf			; 0000ACBB  240F  '$.'
                  	mov	ah,0xe			; 0000ACBD  B40E  '..'
                  	mul	ah			; 0000ACBF  F6E4  '..'
                  	shr	ax,1			; 0000ACC1  D1E8  '..'
                  	shr	ax,1			; 0000ACC3  D1E8  '..'
                  	shr	ax,1			; 0000ACC5  D1E8  '..'
                  	adc	al,0x0			; 0000ACC7  1400  '..'
                  	ret				; 0000ACC9  C3  '.'
                  
                  	cmp	bh,0x7			; 0000ACCA  80FF07  '...'
                  	ja	xad17			; 0000ACCD  7748  'wH'
                  	xchg	bh,bl			; 0000ACCF  86FB  '..'
                  	xor	bh,bh			; 0000ACD1  32FF  '2.'
                  	shl	bx,1			; 0000ACD3  D1E3  '..'
                  	mov	cx,[bp+0x2]		; 0000ACD5  8B4E02  '.N.'
                  	mov	[bx+0x50],cx		; 0000ACD8  898F5000  '..P.'
                  	mov	al,[0x62]		; 0000ACDC  A06200  '.b.'
                  	cmp	al,[bp+0x7]		; 0000ACDF  3A4607  ':F.'
                  	jnz	xad17			; 0000ACE2  7533  'u3'
                  xace4:	push	dx			; 0000ACE4  52  'R'
                  	xor	ax,ax			; 0000ACE5  33C0  '3.'
                  	xchg	al,ch			; 0000ACE7  86C5  '..'
                  	mul	word [0x4a]		; 0000ACE9  F7264A00  '.&J.'
                  	add	cx,ax			; 0000ACED  03C8  '..'
                  	mov	ax,[0x4e]		; 0000ACEF  A14E00  '.N.'
                  	shr	ax,1			; 0000ACF2  D1E8  '..'
                  	add	cx,ax			; 0000ACF4  03C8  '..'
                  	pop	dx			; 0000ACF6  5A  'Z'
                  	mov	ah,0xe			; 0000ACF7  B40E  '..'
                  
                  xacf9:	mov	al,ah			; 0000ACF9  8AC4  '..'
                  	out	dx,al			; 0000ACFB  EE  '.'
                  	inc	dx			; 0000ACFC  42  'B'
                  	mov	al,ch			; 0000ACFD  8AC5  '..'
                  	jmp	short xad01		; 0000ACFF  EB00  '..'
                  
                  xad01:	jmp	short xad03		; 0000AD01  EB00  '..'
                  
                  xad03:	out	dx,al			; 0000AD03  EE  '.'
                  	dec	dx			; 0000AD04  4A  'J'
                  	inc	ah			; 0000AD05  FEC4  '..'
                  	mov	al,ah			; 0000AD07  8AC4  '..'
                  	jmp	short xad0b		; 0000AD09  EB00  '..'
                  
                  xad0b:	jmp	short xad0d		; 0000AD0B  EB00  '..'
                  
                  xad0d:	out	dx,al			; 0000AD0D  EE  '.'
                  	inc	dx			; 0000AD0E  42  'B'
                  	mov	al,cl			; 0000AD0F  8AC1  '..'
                  	jmp	short xad13		; 0000AD11  EB00  '..'
                  
                  xad13:	jmp	short xad15		; 0000AD13  EB00  '..'
                  
                  xad15:	out	dx,al			; 0000AD15  EE  '.'
                  	dec	dx			; 0000AD16  4A  'J'
                  xad17:	ret				; 0000AD17  C3  '.'
                  
                  xad18:	mov	al,ah			; 0000AD18  8AC4  '..'
                  	out	dx,al			; 0000AD1A  EE  '.'
                  	inc	dx			; 0000AD1B  42  'B'
                  	mov	al,ch			; 0000AD1C  8AC5  '..'
                  	jmp	short xad20		; 0000AD1E  EB00  '..'
                  
                  xad20:	jmp	short xad22		; 0000AD20  EB00  '..'
                  
                  xad22:	out	dx,al			; 0000AD22  EE  '.'
                  	dec	dx			; 0000AD23  4A  'J'
                  	inc	ah			; 0000AD24  FEC4  '..'
                  	mov	al,ah			; 0000AD26  8AC4  '..'
                  	jmp	short xad2a		; 0000AD28  EB00  '..'
                  
                  xad2a:	jmp	short xad2c		; 0000AD2A  EB00  '..'
                  
                  xad2c:	out	dx,al			; 0000AD2C  EE  '.'
                  	inc	dx			; 0000AD2D  42  'B'
                  	mov	al,cl			; 0000AD2E  8AC1  '..'
                  	jmp	short xad32		; 0000AD30  EB00  '..'
                  
                  xad32:	jmp	short xad34		; 0000AD32  EB00  '..'
                  
                  xad34:	out	dx,al			; 0000AD34  EE  '.'
                  	dec	dx			; 0000AD35  4A  'J'
                  	jmp	bp			; 0000AD36  FFE5  '..'
                  
                  ;
                  ;   This prepares a request to performed a copy of 0x21 DWORDs (0x84 bytes)
                  ;   from 0x58:x0F378 (DS:BX) to (ES:DI) for 0x1F0 (DX) times, followed by a
                  ;   final copy of 0x10 DWORDs (0x40 bytes).  DI advances, BX does not.
                  ;
                  ;   Note that 0x84 * 0x1F0 is 0xFFC0, and 0xFFC0 + 0x40 is 0x10000, or exactly
                  ;   64Kb.  Also, DS is pointing to %F0000 and ES is pointing to %FF0000 (the
                  ;   last 64Kb at the top of 16Mb).
                  ;
                  ;   DS:SI is the hard-coded address of a set of hard-coded values at %FF378.
                  ;
                  xad38:	push	ds			; 0000AD38  1E  '.'
                  	mov	ax,0x58			; 0000AD39  B85800  '.X.'
                  	mov	ds,ax			; 0000AD3C  8ED8  '..'
                  	mov	bx,0xf378		; 0000AD3E  BB78F3  '.x.'
                  xad41:	mov	dx,0x1f0		; 0000AD41  BAF001  '...'
                  	mov	ax,0x10			; 0000AD44  B81000  '...'
                  	xor	di,di			; 0000AD47  33FF  '3.'
                  	mov	bp,0xad4f		; 0000AD49  BD4FAD  '.O.'
                  	jmp	xf68d			; 0000AD4C  E93E49  '.>I'
                  ;
                  ;   Now that the 64Kb buffer at ES:0 has been prepared, call xe80b to verify the buffer contents.
                  ;
                  	in	al,0x61			; 0000AD4F  E461  '.a'
                  	or	al,0xc			; 0000AD51  0C0C  '..'
                  	out	0x61,al			; 0000AD53  E661  '.a'
                  	and	al,0xf3			; 0000AD55  24F3  '$.'
                  	out	0x61,al			; 0000AD57  E661  '.a'
                  	mov	dx,0x1f0		; 0000AD59  BAF001  '...'
                  	mov	ax,0x10			; 0000AD5C  B81000  '...'
                  	xor	di,di			; 0000AD5F  33FF  '3.'
                  	mov	bp,0xad67		; 0000AD61  BD67AD  '.g.'
                  	jmp	xe80b			; 0000AD64  E9A43A  '..:'
                  
                  	jnc	xad74			; 0000AD67  730B  's.'
                  	push	si			; 0000AD69  56  'V'
                  	push	di			; 0000AD6A  57  'W'
                  	call	xf6a1			; 0000AD6B  E83349  '.3I'
                  	pop	di			; 0000AD6E  5F  '_'
                  	pop	si			; 0000AD6F  5E  '^'
                  	jc	xad8d			; 0000AD70  721B  'r.'
                  	jmp	short xadbf		; 0000AD72  EB4B  '.K'
                  
                  xad74:	in	al,0x61			; 0000AD74  E461  '.a'
                  	test	al,0x40			; 0000AD76  A840  '.@'
                  	mov	eax,0x0			; 0000AD78  66B800000000  'f.....'
                  	jnz	xad8f			; 0000AD7E  750F  'u.'
                  	cmp	bx,pattern2		; 0000AD80  81FBFCF3  '....'
                  	jz	xad8b			; 0000AD84  7405  't.'
                  	mov	bx,pattern2		; 0000AD86  BBFCF3  '...'
                  	jmp	short xad41		; 0000AD89  EBB6  '..'
                  
                  xad8b:	xor	ax,ax			; 0000AD8B  33C0  '3.'
                  xad8d:	pop	ds			; 0000AD8D  1F  '.'
                  	ret				; 0000AD8E  C3  '.'
                  
                  xad8f:	push	ax			; 0000AD8F  50  'P'
                  	mov	al,[es:di]		; 0000AD90  268A05  '&..'
                  	mov	[es:di],al		; 0000AD93  268805  '&..'
                  	in	al,0x61			; 0000AD96  E461  '.a'
                  	or	al,0xc			; 0000AD98  0C0C  '..'
                  	out	0x61,al			; 0000AD9A  E661  '.a'
                  	and	al,0xf3			; 0000AD9C  24F3  '$.'
                  	out	0x61,al			; 0000AD9E  E661  '.a'
                  	pop	ax			; 0000ADA0  58  'X'
                  	or	eax,eax			; 0000ADA1  660BC0  'f..'
                  	jnz	xadbf			; 0000ADA4  7519  'u.'
                  	call	x86db			; 0000ADA6  E832D9  '.2.'
                  	xchg	ah,al			; 0000ADA9  86E0  '..'
                  	and	ah,0xf			; 0000ADAB  80E40F  '...'
                  	xor	si,si			; 0000ADAE  33F6  '3.'
                  	mov	cl,0x4			; 0000ADB0  B104  '..'
                  xadb2:	rcr	ah,1			; 0000ADB2  D0DC  '..'
                  	jnc	xadbb			; 0000ADB4  7305  's.'
                  	inc	si			; 0000ADB6  46  'F'
                  	loop	xadb2			; 0000ADB7  E2F9  '..'
                  	xor	si,si			; 0000ADB9  33F6  '3.'
                  xadbb:	xor	al,al			; 0000ADBB  32C0  '2.'
                  	jmp	short xadd6		; 0000ADBD  EB17  '..'
                  
                  xadbf:	mov	eax,[si]		; 0000ADBF  668B04  'f..'
                  	xor	eax,[es:di]		; 0000ADC2  66263305  'f&3.'
                  	mov	si,di			; 0000ADC6  8BF7  '..'
                  	mov	cx,0x4			; 0000ADC8  B90400  '...'
                  xadcb:	test	al,0xff			; 0000ADCB  A8FF  '..'
                  	jnz	xadd6			; 0000ADCD  7507  'u.'
                  	shr	eax,0x8			; 0000ADCF  66C1E808  'f...'
                  	inc	si			; 0000ADD3  46  'F'
                  	loop	xadcb			; 0000ADD4  E2F5  '..'
                  xadd6:	mov	cl,al			; 0000ADD6  8AC8  '..'
                  	mov	dx,si			; 0000ADD8  8BD6  '..'
                  	pop	ds			; 0000ADDA  1F  '.'
                  	stc				; 0000ADDB  F9  '.'
                  	ret				; 0000ADDC  C3  '.'
                  
                  	times	8 db 0xFF		; 0000ADDD - 0000ADE4
                  
                  	push	word [bp+si-0x52]	; 0000ADE5  FF72AE  '.r.'
                  	cbw				; 0000ADE8  98  '.'
                  	scasb				; 0000ADE9  AE  '.'
                  	cmpsb				; 0000ADEA  A6  '.'
                  	scasb				; 0000ADEB  AE  '.'
                  	cmpsw				; 0000ADEC  A7  '.'
                  	scasw				; 0000ADED  AF  '.'
                  	sub	ax,0x5eb0		; 0000ADEE  2DB05E  '-.^'
                  	mov	al,0xa3			; 0000ADF1  B0A3  '..'
                  	mov	dl,0xa3			; 0000ADF3  B2A3  '..'
                  	mov	dl,0x9c			; 0000ADF5  B29C  '..'
                  	mov	al,0xe2			; 0000ADF7  B0E2  '..'
                  	mov	al,0xa6			; 0000ADF9  B0A6  '..'
                  	scasb				; 0000ADFB  AE  '.'
                  	cmpsw				; 0000ADFC  A7  '.'
                  	scasw				; 0000ADFD  AF  '.'
                  	dec	cx			; 0000ADFE  49  'I'
                  	mov	cl,0x71			; 0000ADFF  B171  '.q'
                  	mov	cl,0xa3			; 0000AE01  B1A3  '..'
                  	mov	dl,0xa3			; 0000AE03  B2A3  '..'
                  	mov	dl,0x3b			; 0000AE05  B23B  '.;'
                  	mov	cl,0x19			; 0000AE07  B119  '..'
                  	mov	dl,0xa3			; 0000AE09  B2A3  '..'
                  	mov	dl,0xa3			; 0000AE0B  B2A3  '..'
                  	mov	dl,0x44			; 0000AE0D  B244  '.D'
                  	mov	dl,0x70			; 0000AE0F  B270  '.p'
                  	mov	dl,0x80			; 0000AE11  B2
                  
                  xae12:	cmp	dl,0x80			; 0000AE12  80FA80
                  	jnc	xae29			; 0000AE15  7312
                  	int	0x40			; 0000AE17  CD40
                  	push	ax			; 0000AE19  50  'P'
                  	pushf				; 0000AE1A  9C  '.'
                  	push	bp			; 0000AE1B  55  'U'
                  	mov	bp,sp			; 0000AE1C  8BEC  '..'
                  	mov	ax,[bp+0x2]		; 0000AE1E  8B4602  '.F.'
                  	mov	[bp+0xa],ax		; 0000AE21  89460A  '.F',0x0A
                  	pop	bp			; 0000AE24  5D  ']'
                  	popf				; 0000AE25  9D  '.'
                  	pop	ax			; 0000AE26  58  'X'
                  	jmp	short xae71		; 0000AE27  EB48  '.H'
                  
                  xae29:	pusha				; 0000AE29  60  '`'
                  	push	ds			; 0000AE2A  1E  '.'
                  	push	es			; 0000AE2B  06  '.'
                  	push	byte +0x0		; 0000AE2C  6A00  'j.'
                  	mov	bp,sp			; 0000AE2E  8BEC  '..'
                  	cmp	ah,0x15			; 0000AE30  80FC15  '...'
                  	jna	xae3f			; 0000AE33  760A  'v',0x0A
                  	mov	ax,0x40			; 0000AE35  B84000  '.@.'
                  	mov	ds,ax			; 0000AE38  8ED8  '..'
                  	call	xb2a3			; 0000AE3A  E86604  '.f.'
                  	jmp	short xae6d		; 0000AE3D  EB2E  '..'
                  
                  xae3f:	and	word [bp+0x1a],0xfffe	; 0000AE3F  81661AFEFF  '.f...'
                  	or	word [bp+0x1a],0x200	; 0000AE44  814E1A0002  '.N...'
                  	sti				; 0000AE49  FB  '.'
                  	cld				; 0000AE4A  FC  '.'
                  	xor	ax,ax			; 0000AE4B  33C0  '3.'
                  	mov	ds,ax			; 0000AE4D  8ED8  '..'
                  	les	si,[0x104]		; 0000AE4F  C4360401  '.6..'
                  	test	dl,0x1			; 0000AE53  F6C201  '...'
                  	jz	xae5c			; 0000AE56  7404  't.'
                  	les	si,[0x118]		; 0000AE58  C4361801  '.6..'
                  xae5c:	mov	bx,0x40			; 0000AE5C  BB4000  '.@.'
                  	mov	ds,bx			; 0000AE5F  8EDB  '..'
                  	mov	bx,ax			; 0000AE61  8BD8  '..'
                  	mov	bl,[bp+0x15]		; 0000AE63  8A5E15  '.^.'
                  	shl	bx,1			; 0000AE66  D1E3  '..'
                  	call	near [cs:bx+0xade6]	; 0000AE68  2EFF97E6AD  '.....'
                  xae6d:	pop	es			; 0000AE6D  07  '.'
                  	pop	es			; 0000AE6E  07  '.'
                  	pop	ds			; 0000AE6F  1F  '.'
                  	popa				; 0000AE70  61  'a'
                  xae71:	iret				; 0000AE71  CF  '.'
                  
                  	mov	[bp+0x15],ah		; 0000AE72  886615  '.f.'
                  	mov	[0x74],ah		; 0000AE75  88267400  '.&t.'
                  	mov	dl,0x0			; 0000AE79  B200  '..'
                  	int	0x40			; 0000AE7B  CD40  '.@'
                  	mov	al,[bp+0x10]		; 0000AE7D  8A4610  '.F.'
                  	and	al,0x9f			; 0000AE80  249F  '$.'
                  	cmp	al,0x80			; 0000AE82  3C80  '<.'
                  	jc	xae97			; 0000AE84  7211  'r.'
                  	cmp	al,0x81			; 0000AE86  3C81  '<.'
                  	ja	xae97			; 0000AE88  770D  'w',0x0D
                  	call	xc5a2			; 0000AE8A  E81517  '...'
                  	call	xb17e			; 0000AE8D  E8EE02  '...'
                  	jnc	xae97			; 0000AE90  7305  's.'
                  	mov	ah,0x5			; 0000AE92  B405  '..'
                  	call	xb471			; 0000AE94  E8DA05  '...'
                  xae97:	ret				; 0000AE97  C3  '.'
                  
                  	mov	al,[0x74]		; 0000AE98  A07400  '.t.'
                  	mov	[bp+0x14],al		; 0000AE9B  884614  '.F.'
                  	mov	[0x74],ah		; 0000AE9E  88267400  '.&t.'
                  	mov	[bp+0x15],ah		; 0000AEA2  886615  '.f.'
                  	ret				; 0000AEA5  C3  '.'
                  
                  	call	xb483			; 0000AEA6  E8DA05  '...'
                  	jc	xaefe			; 0000AEA9  7253  'rS'
                  	call	xb395			; 0000AEAB  E8E704  '...'
                  	mov	al,0x20			; 0000AEAE  B020  '. '
                  	test	byte [es:si+0x8],0xc0	; 0000AEB0  26F64408C0  '&.D..'
                  	jz	xaeb9			; 0000AEB5  7402  't.'
                  	or	al,0x1			; 0000AEB7  0C01  '..'
                  xaeb9:	cmp	byte [bp+0x15],0xa	; 0000AEB9  807E150A  '.~.',0x0A
                  	jnz	xaed0			; 0000AEBD  7511  'u.'
                  	or	al,0x2			; 0000AEBF  0C02  '..'
                  	push	ax			; 0000AEC1  50  'P'
                  	mov	al,[es:si+0x7]		; 0000AEC2  268A4407  '&.D.'
                  	or	al,al			; 0000AEC6  0AC0  0x0A,'.'
                  	jnz	xaecc			; 0000AEC8  7502  'u.'
                  	mov	al,0x4			; 0000AECA  B004  '..'
                  xaecc:	mov	[bp+0x0],al		; 0000AECC  884600  '.F.'
                  	pop	ax			; 0000AECF  58  'X'
                  xaed0:	mov	[0x48],al		; 0000AED0  A24800  '.H.'
                  	call	xb3e5			; 0000AED3  E80F05  '...'
                  	mov	es,dx			; 0000AED6  8EC2  '..'
                  	mov	di,ax			; 0000AED8  8BF8  '..'
                  	mov	dh,0x7f			; 0000AEDA  B67F  '..'
                  	cmp	byte [bp+0x15],0xa	; 0000AEDC  807E150A  '.~.',0x0A
                  	jz	xaee8			; 0000AEE0  7406  't.'
                  	or	al,ah			; 0000AEE2  0AC4  0x0A,'.'
                  	jnz	xaee8			; 0000AEE4  7502  'u.'
                  	inc	dh			; 0000AEE6  FEC6  '..'
                  xaee8:	or	ah,[bp+0x14]		; 0000AEE8  0A6614  0x0A,'f.'
                  	mov	[bp+0x1],ah		; 0000AEEB  886601  '.f.'
                  	jz	xaef4			; 0000AEEE  7404  't.'
                  	cmp	ah,dh			; 0000AEF0  3AE6  ':.'
                  	jna	xaef8			; 0000AEF2  7604  'v.'
                  xaef4:	mov	ah,0x9			; 0000AEF4  B409  '..'
                  	jmp	short xaf42		; 0000AEF6  EB4A  '.J'
                  
                  xaef8:	call	xb4bd			; 0000AEF8  E8C205  '...'
                  xaefb:	call	xb4d0			; 0000AEFB  E8D205  '...'
                  xaefe:	jc	xaf42			; 0000AEFE  7242  'rB'
                  	call	xb2e0			; 0000AF00  E8DD03  '...'
                  	jc	xaf42			; 0000AF03  723D  'r='
                  	mov	bh,al			; 0000AF05  8AF8  '..'
                  	call	xb50e			; 0000AF07  E80406
                  	jnc	xaf1e			; 0000AF0A  7312  's.'
                  	cmp	ah,0x11			; 0000AF0C  80FC11  '...'
                  	jz	xaf1b			; 0000AF0F  740A  't',0x0A
                  	test	bh,0x8			; 0000AF11  F6C708  '...'
                  	jz	xaf42			; 0000AF14  742C  't,'
                  	call	xb42a			; 0000AF16  E81105  '...'
                  	jmp	short xaf42		; 0000AF19  EB27  '.',0x27
                  
                  xaf1b:	call	xb471			; 0000AF1B  E85305  '.S.'
                  xaf1e:	call	xb44d			; 0000AF1E  E82C05  '.,.'
                  	jc	xaf42			; 0000AF21  721F  'r.'
                  	call	xb42a			; 0000AF23  E80405  '...'
                  	cmp	byte [bp+0x15],0xa	; 0000AF26  807E150A  '.~.',0x0A
                  	jnz	xaf31			; 0000AF2A  7505  'u.'
                  	call	xb433			; 0000AF2C  E80405  '...'
                  	jc	xaf42			; 0000AF2F  7211  'r.'
                  xaf31:	dec	byte [bp+0x1]		; 0000AF31  FE4E01  '.N.'
                  	jnz	xaefb			; 0000AF34  75C5  'u.'
                  	test	word [bp+0x1a],0x1	; 0000AF36  F7461A0100  '.F...'
                  	jnz	xaf45			; 0000AF3B  7508  'u.'
                  	call	xb468			; 0000AF3D  E82805  '.(.'
                  	jmp	short xaf45		; 0000AF40  EB03  '..'
                  
                  xaf42:	call	xb471			; 0000AF42  E82C05  '.,.'
                  xaf45:	ret				; 0000AF45  C3  '.'
                  
                  	db	'**********************************************************************************************'
                  
                  	jmp	xb343			; 0000AFA4  E99C03
                  
                  	call	xb483			; 0000AFA7  E8D904  '...'
                  	jc	xb029			; 0000AFAA  727D  'r}'
                  	call	xb395			; 0000AFAC  E8E603  '...'
                  	mov	al,0x30			; 0000AFAF  B030  '.0'
                  	test	byte [es:si+0x8],0xc0	; 0000AFB1  26F64408C0  '&.D..'
                  	jz	xafba			; 0000AFB6  7402  't.'
                  	or	al,0x1			; 0000AFB8  0C01  '..'
                  xafba:	cmp	byte [bp+0x15],0xb	; 0000AFBA  807E150B  '.~..'
                  	jnz	xafd1			; 0000AFBE  7511  'u.'
                  	or	al,0x2			; 0000AFC0  0C02  '..'
                  	push	ax			; 0000AFC2  50  'P'
                  	mov	al,[es:si+0x7]		; 0000AFC3  268A4407  '&.D.'
                  	or	al,al			; 0000AFC7  0AC0  0x0A,'.'
                  	jnz	xafcd			; 0000AFC9  7502  'u.'
                  	mov	al,0x4			; 0000AFCB  B004  '..'
                  xafcd:	mov	[bp+0x0],al		; 0000AFCD  884600  '.F.'
                  	pop	ax			; 0000AFD0  58  'X'
                  xafd1:	mov	[0x48],al		; 0000AFD1  A24800  '.H.'
                  	call	xb3e5			; 0000AFD4  E80E04  '...'
                  	mov	dh,0x7f			; 0000AFD7  B67F  '..'
                  	cmp	byte [bp+0x15],0xb	; 0000AFD9  807E150B  '.~..'
                  	jz	xafe5			; 0000AFDD  7406  't.'
                  	or	al,ah			; 0000AFDF  0AC4  0x0A,'.'
                  	jnz	xafe5			; 0000AFE1  7502  'u.'
                  	inc	dh			; 0000AFE3  FEC6  '..'
                  xafe5:	or	ah,[bp+0x14]		; 0000AFE5  0A6614  0x0A,'f.'
                  	mov	[bp+0x1],ah		; 0000AFE8  886601  '.f.'
                  	jz	xaff1			; 0000AFEB  7404  't.'
                  	cmp	ah,dh			; 0000AFED  3AE6  ':.'
                  	jna	xaff5			; 0000AFEF  7604  'v.'
                  xaff1:	mov	ah,0x9			; 0000AFF1  B409  '..'
                  	jmp	short xb029		; 0000AFF3  EB34  '.4'
                  
                  xaff5:	call	xb4bd			; 0000AFF5  E8C504  '...'
                  	call	xb3e5			; 0000AFF8  E8EA03  '...'
                  	mov	bx,dx			; 0000AFFB  8BDA  '..'
                  	mov	si,ax			; 0000AFFD  8BF0  '..'
                  xafff:	call	xb44d			; 0000AFFF  E84B04  '.K.'
                  	call	xb3ff			; 0000B002  E8FA03  '...'
                  	cmp	byte [bp+0x15],0xb	; 0000B005  807E150B  '.~..'
                  	jnz	xb010			; 0000B009  7505  'u.'
                  	call	xb40c			; 0000B00B  E8FE03  '...'
                  	jc	xb029			; 0000B00E  7219  'r.'
                  xb010:	call	xb4d0			; 0000B010  E8BD04  '...'
                  	jc	xb029			; 0000B013  7214  'r.'
                  	call	xb2e0			; 0000B015  E8C802  '...'
                  	jc	xb029			; 0000B018  720F  'r.'
                  	call	xb50e			; 0000B01A  E8F104
                  	jc	xb029			; 0000B01D  720A  'r',0x0A
                  	dec	byte [bp+0x1]		; 0000B01F  FE4E01  '.N.'
                  	jnz	xafff			; 0000B022  75DB  'u.'
                  	call	xb468			; 0000B024  E84104  '.A.'
                  	jmp	short xb02c		; 0000B027  EB03  '..'
                  
                  xb029:	call	xb471			; 0000B029  E84504  '.E.'
                  xb02c:	ret				; 0000B02C  C3  '.'
                  
                  	call	xb483			; 0000B02D  E85304  '.S.'
                  	jc	xb05a			; 0000B030  7228  'r('
                  	call	xb395			; 0000B032  E86003  '.`.'
                  	mov	al,0x40			; 0000B035  B040  '.@'
                  	test	byte [es:si+0x8],0xc0	; 0000B037  26F64408C0  '&.D..'
                  	jz	xb040			; 0000B03C  7402  't.'
                  	or	al,0x1			; 0000B03E  0C01  '..'
                  xb040:	mov	[0x48],al		; 0000B040  A24800  '.H.'
                  	call	xb4bd			; 0000B043  E87704  '.w.'
                  	call	xb4d0			; 0000B046  E88704  '...'
                  	jc	xb05a			; 0000B049  720F  'r.'
                  	call	xb2e0			; 0000B04B  E89202  '...'
                  	jc	xb05a			; 0000B04E  720A  'r',0x0A
                  	call	xb50e			; 0000B050  E8BB04
                  	jc	xb05a			; 0000B053  7205  'r.'
                  	call	xb468			; 0000B055  E81004  '...'
                  	jmp	short xb05d		; 0000B058  EB03  '..'
                  
                  xb05a:	call	xb471			; 0000B05A  E81404  '...'
                  xb05d:	ret				; 0000B05D  C3  '.'
                  
                  	call	xb483			; 0000B05E  E82204  '.".'
                  	jc	xb098			; 0000B061  7235  'r5'
                  	call	xb395			; 0000B063  E82F03  './.'
                  	mov	al,[es:si+0xe]		; 0000B066  268A440E  '&.D.'
                  	mov	[0x43],al		; 0000B06A  A24300  '.C.'
                  	mov	byte [0x48],0x50	; 0000B06D  C606480050  '..H.P'
                  	call	xb4bd			; 0000B072  E84804  '.H.'
                  	call	xb44d			; 0000B075  E8D503  '...'
                  	jc	xb098			; 0000B078  721E  'r.'
                  	call	xb3e5			; 0000B07A  E86803  '.h.'
                  	mov	bx,dx			; 0000B07D  8BDA  '..'
                  	mov	si,ax			; 0000B07F  8BF0  '..'
                  	call	xb3ff			; 0000B081  E87B03  '.{.'
                  	call	xb4d0			; 0000B084  E84904  '.I.'
                  	jc	xb098			; 0000B087  720F  'r.'
                  	call	xb2e0			; 0000B089  E85402  '.T.'
                  	jc	xb098			; 0000B08C  720A  'r',0x0A
                  	call	xb50e			; 0000B08E  E87D04
                  	jc	xb098			; 0000B091  7205  'r.'
                  	call	xb468			; 0000B093  E8D203  '...'
                  	jmp	short xb09b		; 0000B096  EB03  '..'
                  
                  xb098:	call	xb471			; 0000B098  E8D603  '...'
                  xb09b:	ret				; 0000B09B  C3  '.'
                  
                  	mov	[bp+0x14],ax		; 0000B09C  894614  '.F.'
                  	mov	[0x74],al		; 0000B09F  A27400  '.t.'
                  	push	bx			; 0000B0A2  53  'S'
                  	mov	bl,[bp+0x10]		; 0000B0A3  8A5E10  '.^.'
                  	and	bl,0x9f			; 0000B0A6  80E39F  '...'
                  	cmp	bl,0x81			; 0000B0A9  80FB81  '...'
                  	pop	bx			; 0000B0AC  5B  '['
                  	jna	xb0bc			; 0000B0AD  760D  'v',0x0D
                  	mov	[bp+0x12],ax		; 0000B0AF  894612  '.F.'
                  	mov	[bp+0x10],ax		; 0000B0B2  894610  '.F.'
                  	mov	ah,0x7			; 0000B0B5  B407  '..'
                  	call	xb471			; 0000B0B7  E8B703  '...'
                  	jmp	short xb0e1		; 0000B0BA  EB25  '.%'
                  
                  xb0bc:	mov	ax,[es:si]		; 0000B0BC  268B04  '&..'
                  	dec	ax			; 0000B0BF  48  'H'
                  	dec	ax			; 0000B0C0  48  'H'
                  	cmp	ax,0x3ff		; 0000B0C1  3DFF03  '=..'
                  	jna	xb0c9			; 0000B0C4  7603  'v.'
                  	mov	ax,0x3ff		; 0000B0C6  B8FF03  '...'
                  xb0c9:	xchg	ah,al			; 0000B0C9  86E0  '..'
                  	shl	al,0x6			; 0000B0CB  C0E006  '...'
                  	or	al,[es:si+0xe]		; 0000B0CE  260A440E  '&',0x0A,'D.'
                  	mov	[bp+0x12],ax		; 0000B0D2  894612  '.F.'
                  	mov	ah,[es:si+0x2]		; 0000B0D5  268A6402  '&.d.'
                  	dec	ah			; 0000B0D9  FECC  '..'
                  	mov	al,[0x75]		; 0000B0DB  A07500  '.u.'
                  	mov	[bp+0x10],ax		; 0000B0DE  894610  '.F.'
                  xb0e1:	ret				; 0000B0E1  C3  '.'
                  
                  	call	xb483			; 0000B0E2  E89E03  '...'
                  	jc	xb137			; 0000B0E5  7250  'rP'
                  	mov	bl,[bp+0x10]		; 0000B0E7  8A5E10  '.^.'
                  
                  xb0ea:	mov	bh,[es:si+0x2]		; 0000B0EA  268A7C02  '&.|.'
                  	dec	bh			; 0000B0EE  FECF  '..'
                  	or	bh,0xa0			; 0000B0F0  80CFA0  '...'
                  	test	bl,0x1			; 0000B0F3  F6C301  '...'
                  	jz	xb0fb			; 0000B0F6  7403  't.'
                  	or	bh,0x10			; 0000B0F8  80CF10  '...'
                  xb0fb:	mov	bl,[es:si+0xe]		; 0000B0FB  268A5C0E  '&.\.'
                  	mov	ax,[es:si+0x5]		; 0000B0FF  268B4405  '&.D.'
                  	shr	ax,0x2			; 0000B103  C1E802  '...'
                  	push	es			; 0000B106  06  '.'
                  	push	ds			; 0000B107  1E  '.'
                  	pop	es			; 0000B108  07  '.'
                  	mov	di,0x42			; 0000B109  BF4200  '.B.'
                  	stosb				; 0000B10C  AA  '.'
                  	mov	al,bl			; 0000B10D  8AC3  '..'
                  	stosb				; 0000B10F  AA  '.'
                  	mov	al,0x1			; 0000B110  B001  '..'
                  	stosb				; 0000B112  AA  '.'
                  	mov	al,ah			; 0000B113  8AC4  '..'
                  	stosb				; 0000B115  AA  '.'
                  	stosb				; 0000B116  AA  '.'
                  	mov	al,bh			; 0000B117  8AC7  '..'
                  	stosb				; 0000B119  AA  '.'
                  	mov	byte [di],0x91		; 0000B11A  C60591  '...'
                  	pop	es			; 0000B11D  07  '.'
                  	call	xb4bd			; 0000B11E  E89C03  '...'
                  	call	xb4d0			; 0000B121  E8AC03  '...'
                  	jc	xb135			; 0000B124  720F  'r.'
                  	call	xb2e0			; 0000B126  E8B701  '...'
                  	jc	xb135			; 0000B129  720A  'r',0x0A
                  	call	xb50e			; 0000B12B  E8E003
                  	jc	xb135			; 0000B12E  7205  'r.'
                  	call	xb468			; 0000B130  E83503  '.5.'
                  	jmp	short xb13a		; 0000B133  EB05  '..'
                  
                  xb135:	mov	ah,0x7			; 0000B135  B407  '..'
                  xb137:	call	xb471			; 0000B137  E83703  '.7.'
                  xb13a:	ret				; 0000B13A  C3  '.'
                  
                  	call	xb483			; 0000B13B  E84503  '.E.'
                  	jc	xb145			; 0000B13E  7205  'r.'
                  	call	xb468			; 0000B140  E82503  '.%.'
                  	jmp	short xb148		; 0000B143  EB03  '..'
                  
                  xb145:	call	xb471			; 0000B145  E82903  '.).'
                  xb148:	ret				; 0000B148  C3  '.'
                  
                  	call	xb483			; 0000B149  E83703  '.7.'
                  	jc	xb16d			; 0000B14C  721F  'r.'
                  	call	xb395			; 0000B14E  E84402  '.D.'
                  
                  xb151:	mov	byte [0x48],0x70	; 0000B151  C606480070  '..H.p'
                  	call	xb4bd			; 0000B156  E86403  '.d.'
                  	call	xb4d0			; 0000B159  E87403  '.t.'
                  	jc	xb16d			; 0000B15C  720F  'r.'
                  	call	xb2e0			; 0000B15E  E87F01  '...'
                  	jc	xb16d			; 0000B161  720A  'r',0x0A
                  	call	xb50e			; 0000B163  E8A803
                  	jc	xb16d			; 0000B166  7205  'r.'
                  	call	xb468			; 0000B168  E8FD02  '...'
                  	jmp	short xb170		; 0000B16B  EB03  '..'
                  
                  xb16d:	call	xb471			; 0000B16D  E80103  '...'
                  xb170:	ret				; 0000B170  C3  '.'
                  
                  	call	xb483			; 0000B171  E80F03  '...'
                  	jnc	xb17e			; 0000B174  7308  's.'
                  	cmp	ah,0x1			; 0000B176  80FC01  '...'
                  	jnz	xb17e			; 0000B179  7503  'u.'
                  	jmp	xb215			; 0000B17B  E99700  '...'
                  
                  xb17e:	push	ds			; 0000B17E  1E  '.'
                  	xor	ax,ax			; 0000B17F  33C0  '3.'
                  	mov	ds,ax			; 0000B181  8ED8  '..'
                  	les	si,[0x104]		; 0000B183  C4360401  '.6..'
                  	pop	ds			; 0000B187  1F  '.'
                  	call	xb395			; 0000B188  E80A02  '.',0x0A,'.'
                  	mov	byte [0x45],0x0		; 0000B18B  C606450000  '..E..'
                  	mov	byte [0x46],0x0		; 0000B190  C606460000  '..F..'
                  	and	byte [0x47],0xe0	; 0000B195  80264700E0  '.&G..'
                  	call	xb2e0			; 0000B19A  E84301  '.C.'
                  	mov	al,0xa0			; 0000B19D  B0A0  '..'
                  	mov	dx,0x1f6		; 0000B19F  BAF601  '...'
                  	out	dx,al			; 0000B1A2  EE  '.'
                  	call	xb527			; 0000B1A3  E88103  '...'
                  	call	xb151			; 0000B1A6  E8A8FF  '...'
                  	call	xb527			; 0000B1A9  E87B03  '.{.'
                  	cmp	byte [0x75],0x2		; 0000B1AC  803E750002  '.>u..'
                  	jc	xb1ca			; 0000B1B1  7217  'r.'
                  	or	byte [0x47],0x10	; 0000B1B3  800E470010  '..G..'
                  	call	xb2e0			; 0000B1B8  E82501  '.%.'
                  	mov	al,0xb0			; 0000B1BB  B0B0  '..'
                  	mov	dx,0x1f6		; 0000B1BD  BAF601  '...'
                  	out	dx,al			; 0000B1C0  EE  '.'
                  	call	xb527			; 0000B1C1  E86303  '.c.'
                  	call	xb151			; 0000B1C4  E88AFF  '...'
                  	call	xb527			; 0000B1C7  E85D03  '.].'
                  xb1ca:	and	word [bp+0x1a],0xfffe	; 0000B1CA  81661AFEFF  '.f...'
                  	mov	byte [bp+0x15],0x0	; 0000B1CF  C6461500  '.F..'
                  	call	xc565			; 0000B1D3  E88F13  '...'
                  	jc	xb213			; 0000B1D6  723B  'r;'
                  	push	ds			; 0000B1D8  1E  '.'
                  	xor	ax,ax			; 0000B1D9  33C0  '3.'
                  	mov	ds,ax			; 0000B1DB  8ED8  '..'
                  	les	si,[0x104]		; 0000B1DD  C4360401  '.6..'
                  	pop	ds			; 0000B1E1  1F  '.'
                  	mov	bl,0x80			; 0000B1E2  B380  '..'
                  	call	xb0ea			; 0000B1E4  E803FF  '...'
                  	jc	xb213			; 0000B1E7  722A  'r*'
                  	call	xb221			; 0000B1E9  E83500  '.5.'
                  	jc	xb213			; 0000B1EC  7225  'r%'
                  	cmp	byte [0x75],0x2		; 0000B1EE  803E750002  '.>u..'
                  	jnc	xb1f8			; 0000B1F3  7303  's.'
                  	clc				; 0000B1F5  F8  '.'
                  	jmp	short xb218		; 0000B1F6  EB20  '. '
                  xb1f8:	push	ds			; 0000B1F8  1E  '.'
                  	xor	ax,ax			; 0000B1F9  33C0  '3.'
                  	mov	ds,ax			; 0000B1FB  8ED8  '..'
                  	les	si,[0x118]		; 0000B1FD  C4361801  '.6..'
                  	pop	ds			; 0000B201  1F  '.'
                  	mov	bl,0x81			; 0000B202  B381  '..'
                  	call	xb0ea			; 0000B204  E8E3FE  '...'
                  	jc	xb213			; 0000B207  720A  'r',0x0A
                  	or	byte [0x47],0x10	; 0000B209  800E470010  '..G..'
                  	call	xb221			; 0000B20E  E81000  '...'
                  	jnc	xb218			; 0000B211  7305  's.'
                  xb213:	mov	ah,0x5			; 0000B213  B405  '..'
                  xb215:	call	xb471			; 0000B215  E85902  '.Y.'
                  xb218:	ret				; 0000B218  C3  '.'
                  
                  	call	xb483			; 0000B219  E86702  '.g.'
                  	jc	xb23d			; 0000B21C  721F  'r.'
                  	call	xb395			; 0000B21E  E87401  '.t.'
                  
                  xb221:	mov	byte [0x48],0x10	; 0000B221  C606480010  '..H..'
                  	call	xb4bd			; 0000B226  E89402  '...'
                  	call	xb4d0			; 0000B229  E8A402  '...'
                  	jc	xb23d			; 0000B22C  720F  'r.'
                  	call	xb2e0			; 0000B22E  E8AF00  '...'
                  	jc	xb23d			; 0000B231  720A  'r',0x0A
                  	call	xb50e			; 0000B233  E8D802
                  	jc	xb23d			; 0000B236  7205  'r.'
                  	call	xb468			; 0000B238  E82D02  '.-.'
                  	jmp	short xb240		; 0000B23B  EB03  '..'
                  
                  xb23d:	call	xb471			; 0000B23D  E83102  '.1.'
                  xb240:	mov	[bp+0x14],al		; 0000B240  884614  '.F.'
                  	ret				; 0000B243  C3  '.'
                  
                  	call	xb483			; 0000B244  E83C02  '.<.'
                  	jc	xb26c			; 0000B247  7223  'r#'
                  	call	xb395			; 0000B249  E84901  '.I.'
                  	mov	byte [0x48],0x90	; 0000B24C  C606480090  '..H..'
                  	call	xb4bd			; 0000B251  E86902  '.i.'
                  	call	xb4d0			; 0000B254  E87902  '.y.'
                  	jc	xb26c			; 0000B257  7213  'r.'
                  	call	xb2e0			; 0000B259  E88400  '...'
                  	jc	xb26c			; 0000B25C  720E  'r.'
                  	call	xb374			; 0000B25E  E81301
                  	xor	ah,ah			; 0000B261  32E4  '2.'
                  	mov	[bp+0x14],ax		; 0000B263  894614  '.F.'
                  	cmp	al,0x1			; 0000B266  3C01  '<.'
                  	jz	xb26f			; 0000B268  7405  't.'
                  	mov	ah,0x20			; 0000B26A  B420  '. '
                  xb26c:	call	xb471			; 0000B26C  E80202  '...'
                  xb26f:	ret				; 0000B26F  C3  '.'
                  
                  	mov	bl,[0x75]		; 0000B270  8A1E7500  '..u.'
                  	dec	bl			; 0000B274  FECB  '..'
                  	add	bl,0x80			; 0000B276  80C380  '...'
                  	sub	bl,[bp+0x10]		; 0000B279  2A5E10  '*^.'
                  	jnc	xb289			; 0000B27C  730B  's.'
                  	mov	[bp+0x14],ax		; 0000B27E  894614  '.F.'
                  	mov	[bp+0x12],ax		; 0000B281  894612  '.F.'
                  	mov	[bp+0x10],ax		; 0000B284  894610  '.F.'
                  	jmp	short xb2a2		; 0000B287  EB19  '..'
                  
                  xb289:	mov	word [bp+0x14],0x300	; 0000B289  C746140003  '.F...'
                  	mov	al,[es:si+0x2]		; 0000B28E  268A4402  '&.D.'
                  	mul	byte [es:si+0xe]	; 0000B292  26F6640E  '&.d.'
                  	mov	bx,[es:si]		; 0000B296  268B1C  '&..'
                  	dec	bx			; 0000B299  4B  'K'
                  	mul	bx			; 0000B29A  F7E3  '..'
                  	mov	[bp+0x10],ax		; 0000B29C  894610  '.F.'
                  	mov	[bp+0x12],dx		; 0000B29F  895612  '.V.'
                  xb2a2:	ret				; 0000B2A2  C3  '.'
                  
                  xb2a3:	mov	byte [bp+0x14],0x0	; 0000B2A3  C6461400  '.F..'
                  	mov	ah,0x1			; 0000B2A7  B401  '..'
                  	mov	[bp+0x15],ah		; 0000B2A9  886615  '.f.'
                  	mov	[0x74],ah		; 0000B2AC  88267400  '.&t.'
                  	or	word [bp+0x1a],0x1	; 0000B2B0  814E1A0100  '.N...'
                  	ret				; 0000B2B5  C3  '.'
                  
                  xb2b6:	call	xb2e0			; 0000B2B6  E82700  '.',0x27,'.'
                  	jc	xb2dc			; 0000B2B9  7221  'r!'
                  	mov	al,[bp+0x10]		; 0000B2BB  8A4610  '.F.'
                  	and	al,0x1			; 0000B2BE  2401  '$.'
                  	shl	al,0x4			; 0000B2C0  C0E004  '...'
                  	or	al,0xa0			; 0000B2C3  0CA0  '..'
                  	mov	dx,0x1f6		; 0000B2C5  BAF601  '...'
                  	out	dx,al			; 0000B2C8  EE  '.'
                  	call	xb2e0			; 0000B2C9  E81400  '...'
                  	jc	xb2dc			; 0000B2CC  720E  'r.'
                  	test	al,0x20			; 0000B2CE  A820  '. '
                  	jz	xb2d6			; 0000B2D0  7404  't.'
                  	mov	ah,0xcc			; 0000B2D2  B4CC  '..'
                  	jmp	short xb2dc		; 0000B2D4  EB06  '..'
                  
                  xb2d6:	test	al,0x40			; 0000B2D6  A840  '.@'
                  	jnz	xb2df			; 0000B2D8  7505  'u.'
                  	mov	ah,0xaa			; 0000B2DA  B4AA  '..'
                  xb2dc:	call	xb471			; 0000B2DC  E89201  '...'
                  xb2df:	ret				; 0000B2DF  C3  '.'
                  
                  xb2e0:	push	bx			; 0000B2E0  53  'S'
                  	push	cx			; 0000B2E1  51  'Q'
                  	call	xb364			; 0000B2E2  E87F00  '...'
                  	cmp	al,0xff			; 0000B2E5  3CFF  '<.'
                  	jnz	xb2ed			; 0000B2E7  7504  'u.'
                  	xchg	al,ah			; 0000B2E9  86C4  '..'
                  	jmp	short xb304		; 0000B2EB  EB17  '..'
                  
                  xb2ed:	mov	bx,0x6			; 0000B2ED  BB0600  '...'
                  xb2f0:	mov	cx,0xf424		; 0000B2F0  B924F4  '.$.'
                  xb2f3:	test	al,0x80			; 0000B2F3  A880  '..'
                  	jz	xb305			; 0000B2F5  740E  't.'
                  	call	x919a			; 0000B2F7  E8A0DE  '...'
                  	call	xb364			; 0000B2FA  E86700  '.g.'
                  	loop	xb2f3			; 0000B2FD  E2F4  '..'
                  	dec	bx			; 0000B2FF  4B  'K'
                  	jnz	xb2f0			; 0000B300  75EE  'u.'
                  	mov	ah,0x80			; 0000B302  B480  '..'
                  xb304:	stc				; 0000B304  F9  '.'
                  xb305:	pop	cx			; 0000B305  59  'Y'
                  	pop	bx			; 0000B306  5B  '['
                  	ret				; 0000B307  C3  '.'
                  
                  	db	'***********************************************************'
                  
                  xb343:	push	ax			; 0000B343  50
                  	push	ds			; 0000B344  1E
                  	mov	ax,0x40			; 0000B345  B84000  '.@.'
                  	mov	ds,ax			; 0000B348  8ED8  '..'
                  	mov	byte [0x8e],0xff	; 0000B34A  C6068E00FF  '.....'
                  	mov	al,0x20			; 0000B34F  B020  '. '
                  	out	0x20,al			; 0000B351  E620  '. '
                  	out	0xa0,al			; 0000B353  E6A0  '..'
                  	xor	ax,ax			; 0000B355  33C0  '3.'
                  	mov	ds,ax			; 0000B357  8ED8  '..'
                  	mov	ax,0x9100		; 0000B359  B80091  '...'
                  	pushf				; 0000B35C  9C  '.'
                  	call	far [0x54]		; 0000B35D  FF1E5400  '..T.'
                  	pop	ds			; 0000B361  1F  '.'
                  	pop	ax			; 0000B362  58  'X'
                  	iret				; 0000B363  CF  '.'
                  
                  xb364:	mov	dx,0x1f7		; 0000B364  BAF701  '...'
                  	in	al,dx			; 0000B367  EC  '.'
                  	mov	[0x8c],al		; 0000B368  A28C00  '...'
                  	ret				; 0000B36B  C3  '.'
                  
                  	or	dl,[bx+si]		; 0000B36C  0A10  0x0A,'.'
                  	add	[si],al			; 0000B36E  0004  '..'
                  	add	[bx+si],ah		; 0000B370  0020  '. '
                  	inc	ax			; 0000B372  40  '@'
                  	db	0x02			; 0000B373  02
                  
                  xb374:	mov	dx,0x01f1		; 0000B374  BAF101  '...'
                  	in	al,dx			; 0000B377  EC  '.'
                  	mov	[0x8d],al		; 0000B378  A28D00  '...'
                  	mov	ah,0x20			; 0000B37B  B420  '. '
                  	and	al,0xd7			; 0000B37D  24D7  '$.'
                  	jz	xb391			; 0000B37F  7410  't.'
                  	push	si			; 0000B381  56  'V'
                  	mov	si,0xb36c		; 0000B382  BE6CB3  '.l.'
                  xb385:	shl	al,1			; 0000B385  D0E0  '..'
                  	jc	xb38c			; 0000B387  7203  'r.'
                  	inc	si			; 0000B389  46  'F'
                  	jmp	short xb385		; 0000B38A  EBF9  '..'
                  
                  xb38c:	cs	lodsb			; 0000B38C  2EAC  '..'
                  	pop	si			; 0000B38E  5E  '^'
                  	xchg	ah,al			; 0000B38F  86E0  '..'
                  xb391:	mov	al,[0x8d]		; 0000B391  A08D00  '...'
                  	ret				; 0000B394  C3  '.'
                  
                  xb395:	mov	ax,[es:si+0x5]		; 0000B395  268B4405  '&.D.'
                  	shr	ax,0x2			; 0000B399  C1E802  '...'
                  	mov	[0x42],al		; 0000B39C  A24200  '.B.'
                  	mov	al,[bp+0x14]		; 0000B39F  8A4614  '.F.'
                  	mov	[0x43],al		; 0000B3A2  A24300  '.C.'
                  	mov	al,[bp+0x12]		; 0000B3A5  8A4612  '.F.'
                  	and	al,0x3f			; 0000B3A8  243F  '$?'
                  	mov	[0x44],al		; 0000B3AA  A24400  '.D.'
                  	mov	al,[bp+0x13]		; 0000B3AD  8A4613  '.F.'
                  	mov	[0x45],al		; 0000B3B0  A24500  '.E.'
                  	mov	al,[bp+0x12]		; 0000B3B3  8A4612  '.F.'
                  	shr	al,0x6			; 0000B3B6  C0E806  '...'
                  	mov	ah,[bp+0x10]		; 0000B3B9  8A6610  '.f.'
                  	and	ah,0x60			; 0000B3BC  80E460  '..`'
                  	shr	ah,0x3			; 0000B3BF  C0EC03  '...'
                  	or	al,ah			; 0000B3C2  0AC4  0x0A,'.'
                  	mov	[0x46],al		; 0000B3C4  A24600  '.F.'
                  	mov	al,[bp+0x10]		; 0000B3C7  8A4610  '.F.'
                  	and	al,0x1			; 0000B3CA  2401  '$.'
                  	shl	al,0x4			; 0000B3CC  C0E004  '...'
                  	or	al,0xa0			; 0000B3CF  0CA0  '..'
                  	mov	dh,[bp+0x11]		; 0000B3D1  8A7611  '.v.'
                  	and	dh,0xf			; 0000B3D4  80E60F  '...'
                  	or	al,dh			; 0000B3D7  0AC6  0x0A,'.'
                  	mov	[0x47],al		; 0000B3D9  A24700  '.G.'
                  	mov	al,[es:si+0x8]		; 0000B3DC  268A4408  '&.D.'
                  	mov	dx,0x3f6		; 0000B3E0  BAF603  '...'
                  	out	dx,al			; 0000B3E3  EE  '.'
                  	ret				; 0000B3E4  C3  '.'
                  
                  xb3e5:	mov	ax,0x10			; 0000B3E5  B81000  '...'
                  	mul	word [bp+0x2]		; 0000B3E8  F76602  '.f.'
                  	add	ax,[bp+0xe]		; 0000B3EB  03460E  '.F.'
                  	adc	dl,0x0			; 0000B3EE  80D200  '...'
                  	push	ax			; 0000B3F1  50  'P'
                  	shl	dx,0xc			; 0000B3F2  C1E20C  '...'
                  	shr	ax,0x4			; 0000B3F5  C1E804  '...'
                  	or	dx,ax			; 0000B3F8  0BD0  '..'
                  	pop	ax			; 0000B3FA  58  'X'
                  	and	ax,0xf			; 0000B3FB  250F00  '%..'
                  	ret				; 0000B3FE  C3  '.'
                  
                  xb3ff:	push	ds			; 0000B3FF  1E  '.'
                  	mov	ds,bx			; 0000B400  8EDB  '..'
                  	mov	cx,0x100		; 0000B402  B90001  '...'
                  	mov	dx,0x1f0		; 0000B405  BAF001  '...'
                  	rep	outsw			; 0000B408  F36F  '.o'
                  	pop	ds			; 0000B40A  1F  '.'
                  	ret				; 0000B40B  C3  '.'
                  
                  xb40c:	xor	ch,ch			; 0000B40C  32ED  '2.'
                  	mov	cl,[bp+0x0]		; 0000B40E  8A4E00  '.N.'
                  xb411:	call	x919a			; 0000B411  E886DD  '...'
                  	call	xb2e0			; 0000B414  E8C9FE  '...'
                  	jc	xb429			; 0000B417  7210  'r.'
                  	call	xb44d			; 0000B419  E83100  '.1.'
                  	jc	xb429			; 0000B41C  720B  'r.'
                  	push	ds			; 0000B41E  1E  '.'
                  	mov	ds,bx			; 0000B41F  8EDB  '..'
                  	lodsb				; 0000B421  AC  '.'
                  	pop	ds			; 0000B422  1F  '.'
                  	mov	dx,0x1f0		; 0000B423  BAF001  '...'
                  	out	dx,al			; 0000B426  EE  '.'
                  	loop	xb411			; 0000B427  E2E8  '..'
                  xb429:	ret				; 0000B429  C3  '.'
                  
                  xb42a:	mov	cx,0x100		; 0000B42A  B90001  '...'
                  	mov	dx,0x1f0		; 0000B42D  BAF001  '...'
                  	rep	insw			; 0000B430  F36D  '.m'
                  	ret				; 0000B432  C3  '.'
                  
                  xb433:	xor	ch,ch			; 0000B433  32ED  '2.'
                  	mov	cl,[bp+0x0]		; 0000B435  8A4E00  '.N.'
                  xb438:	call	x919a			; 0000B438  E85FDD  '._.'
                  	call	xb2e0			; 0000B43B  E8A2FE  '...'
                  	jc	xb44c			; 0000B43E  720C  'r.'
                  	call	xb44d			; 0000B440  E80A00  '.',0x0A,'.'
                  	jc	xb44c			; 0000B443  7207  'r.'
                  	mov	dx,0x1f0		; 0000B445  BAF001  '...'
                  	in	al,dx			; 0000B448  EC  '.'
                  	stosb				; 0000B449  AA  '.'
                  	loop	xb438			; 0000B44A  E2EC  '..'
                  xb44c:	ret				; 0000B44C  C3  '.'
                  
                  xb44d:	push	cx			; 0000B44D  51  'Q'
                  	mov	cx,0xf424		; 0000B44E  B924F4  '.$.'
                  	call	xb2e0			; 0000B451  E88CFE  '...'
                  	jc	xb466			; 0000B454  7210  'r.'
                  xb456:	mov	dx,0x1f7		; 0000B456  BAF701  '...'
                  	in	al,dx			; 0000B459  EC  '.'
                  	test	al,0x8			; 0000B45A  A808  '..'
                  	jnz	xb466			; 0000B45C  7508  'u.'
                  	call	x919a			; 0000B45E  E839DD  '.9.'
                  	loop	xb456			; 0000B461  E2F3  '..'
                  	mov	ah,0x80			; 0000B463  B480  '..'
                  	stc				; 0000B465  F9  '.'
                  xb466:	pop	cx			; 0000B466  59  'Y'
                  	ret				; 0000B467  C3  '.'
                  
                  xb468:	call	xb364			; 0000B468  E8F9FE  '...'
                  	xor	ah,ah			; 0000B46B  32E4  '2.'
                  	mov	[bp+0x14],ax		; 0000B46D  894614  '.F.'
                  	ret				; 0000B470  C3  '.'
                  
                  xb471:	mov	[bp+0x15],ah		; 0000B471  886615  '.f.'
                  	mov	byte [bp+0x14],0x0	; 0000B474  C6461400  '.F..'
                  	mov	[0x74],ah		; 0000B478  88267400  '.&t.'
                  	or	word [bp+0x1a],0x1	; 0000B47C  814E1A0100  '.N...'
                  	stc				; 0000B481  F9  '.'
                  	ret				; 0000B482  C3  '.'
                  
                  xb483:	mov	byte [0x8e],0x0		; 0000B483  C6068E0000  '.....'
                  	mov	[0x74],ah		; 0000B488  88267400  '.&t.'
                  	mov	ah,[0x75]		; 0000B48C  8A267500  '.&u.'
                  	or	ah,ah			; 0000B490  0AE4  0x0A,'.'
                  	jz	xb4a5			; 0000B492  7411  't.'
                  	mov	al,[bp+0x10]		; 0000B494  8A4610  '.F.'
                  	and	al,0x9f			; 0000B497  249F  '$.'
                  	cmp	al,0x80			; 0000B499  3C80  '<.'
                  	jz	xb4ab			; 0000B49B  740E  't.'
                  	dec	ah			; 0000B49D  FECC  '..'
                  	jz	xb4a5			; 0000B49F  7404  't.'
                  	cmp	al,0x81			; 0000B4A1  3C81  '<.'
                  	jz	xb4ab			; 0000B4A3  7406  't.'
                  xb4a5:	call	xb2a3			; 0000B4A5  E8FBFD  '...'
                  	stc				; 0000B4A8  F9  '.'
                  	jmp	short xb4bc		; 0000B4A9  EB11  '..'
                  
                  xb4ab:	mov	dx,0x3f6		; 0000B4AB  BAF603  '...'
                  	mov	al,0x0			; 0000B4AE  B000  '..'
                  	out	dx,al			; 0000B4B0  EE  '.'
                  	call	xc5a2			; 0000B4B1  E8EE10  '...'
                  	call	xb2b6			; 0000B4B4  E8FFFD  '...'
                  	jc	xb4bc			; 0000B4B7  7203  'r.'
                  	call	xb527			; 0000B4B9  E86B00  '.k.'
                  xb4bc:	ret				; 0000B4BC  C3  '.'
                  
                  xb4bd:	push	si			; 0000B4BD  56  'V'
                  	push	cx			; 0000B4BE  51  'Q'
                  	mov	si,0x42			; 0000B4BF  BE4200  '.B.'
                  	mov	dx,0x1f1		; 0000B4C2  BAF101  '...'
                  	mov	cx,0x7			; 0000B4C5  B90700  '...'
                  xb4c8:	lodsb				; 0000B4C8  AC  '.'
                  	out	dx,al			; 0000B4C9  EE  '.'
                  	inc	dx			; 0000B4CA  42  'B'
                  	loop	xb4c8			; 0000B4CB  E2FB  '..'
                  	pop	cx			; 0000B4CD  59  'Y'
                  	pop	si			; 0000B4CE  5E  '^'
                  	ret				; 0000B4CF  C3  '.'
                  
                  xb4d0:	push	bx			; 0000B4D0  53  'S'
                  	push	cx			; 0000B4D1  51  'Q'
                  	push	ds			; 0000B4D2  1E  '.'
                  	xor	ax,ax			; 0000B4D3  33C0  '3.'
                  	mov	ds,ax			; 0000B4D5  8ED8  '..'
                  	clc				; 0000B4D7  F8  '.'
                  	mov	ax,0x9000		; 0000B4D8  B80090  '...'
                  	pushf				; 0000B4DB  9C  '.'
                  	call	far [0x54]		; 0000B4DC  FF1E5400  '..T.'
                  	pop	ds			; 0000B4E0  1F  '.'
                  	jnc	xb4ed			; 0000B4E1  730A  's',0x0A
                  	xor	ax,ax			; 0000B4E3  33C0  '3.'
                  	or	al,[0x8e]		; 0000B4E5  0A068E00  0x0A,'...'
                  	jnz	xb506			; 0000B4E9  751B  'u.'
                  	jmp	short xb503		; 0000B4EB  EB16  '..'
                  
                  xb4ed:	xor	ax,ax			; 0000B4ED  33C0  '3.'
                  	mov	bx,0x14			; 0000B4EF  BB1400  '...'
                  xb4f2:	mov	cx,0xf424		; 0000B4F2  B924F4  '.$.'
                  xb4f5:	or	al,[0x8e]		; 0000B4F5  0A068E00  0x0A,'...'
                  	jnz	xb506			; 0000B4F9  750B  'u.'
                  	call	x919a			; 0000B4FB  E89CDC  '...'
                  	loop	xb4f5			; 0000B4FE  E2F5  '..'
                  	dec	bx			; 0000B500  4B  'K'
                  	jnz	xb4f2			; 0000B501  75EF  'u.'
                  xb503:	mov	ah,0x80			; 0000B503  B480  '..'
                  	stc				; 0000B505  F9  '.'
                  xb506:	mov	byte [0x8e],0x0		; 0000B506  C6068E0000  '.....'
                  	pop	cx			; 0000B50B  59  'Y'
                  	pop	bx			; 0000B50C  5B  '['
                  	ret				; 0000B50D  C3  '.'
                  
                  xb50e:	test	al,0x20			; 0000B50E  A820  '. '
                  	jz	xb516			; 0000B510  7404  't.'
                  	mov	ah,0xcc			; 0000B512  B4CC  '..'
                  	jmp	short xb525		; 0000B514  EB0F  '..'
                  
                  xb516:	test	al,0x1			; 0000B516  A801  '..'
                  	jz	xb51f			; 0000B518  7405  't.'
                  	call	xb374			; 0000B51A  E857FE
                  	jmp	short xb525		; 0000B51D  EB06  '..'
                  
                  xb51f:	test	al,0x4			; 0000B51F  A804  '..'
                  	jz	xb526			; 0000B521  7403  't.'
                  	mov	ah,0x11			; 0000B523  B411  '..'
                  xb525:	stc				; 0000B525  F9  '.'
                  xb526:	ret				; 0000B526  C3  '.'
                  
                  xb527:	mov	cx,0xf424		; 0000B527  B924F4  '.$.'
                  	mov	dx,0x1f7		; 0000B52A  BAF701  '...'
                  	xor	ax,ax			; 0000B52D  33C0  '3.'
                  xb52f:	in	al,dx			; 0000B52F  EC  '.'
                  	test	al,0x10			; 0000B530  A810  '..'
                  	jnz	xb53c			; 0000B532  7508  'u.'
                  	call	x919a			; 0000B534  E863DC  '.c.'
                  	loop	xb52f			; 0000B537  E2F6  '..'
                  	mov	ah,0x80			; 0000B539  B480  '..'
                  	stc				; 0000B53B  F9  '.'
                  xb53c:	ret				; 0000B53C  C3  '.'
                  
                  	mov	dx,0x3f6		; 0000B53D  BAF603  '...'
                  	mov	al,0x2			; 0000B540  B002  '..'
                  	out	dx,al			; 0000B542  EE  '.'
                  	ret				; 0000B543  C3  '.'
                  
                  xb544:	out	0x70,al			; 0000B544  E670  '.p'
                  	in	al,0x71			; 0000B546  E471  '.q'
                  	ret				; 0000B548  C3  '.'
                  
                  xb549:	out	0x70,al			; 0000B549  E670  '.p'
                  	mov	al,ah			; 0000B54B  8AC4  '..'
                  	out	0x71,al			; 0000B54D  E671  '.q'
                  	ret				; 0000B54F  C3  '.'
                  
                  xb550:	mov	al,0x40			; 0000B550  B040  '.@'
                  	out	0x84,al			; 0000B552  E684  '..'
                  	mov	ax,0x40			; 0000B554  B84000  '.@.'
                  	mov	ds,ax			; 0000B557  8ED8  '..'
                  	mov	ax,[0x72]		; 0000B559  A17200  '.r.'
                  	out	0x80,al			; 0000B55C  E680  '..'
                  	cmp	al,0x34			; 0000B55E  3C34  '<4'
                  	jnz	xb564			; 0000B560  7502  'u.'
                  	jmp	bp			; 0000B562  FFE5  '..'
                  
                  xb564:	mov	sp,bp			; 0000B564  8BE5  '..'
                  	mov	bl,0xff			; 0000B566  B3FF  '..'
                  	xor	di,di			; 0000B568  33FF  '3.'
                  	mov	bp,0xb570		; 0000B56A  BD70B5  '.p.'
                  	jmp	x8796			; 0000B56D  E926D2
                  
                  xb570:	mov	al,0x41			; 0000B570  B041  '.A'
                  	out	0x84,al			; 0000B572  E684  '..'
                  ;
                  ;   Verify that RAM refresh is occurring, by confirming that bit 4 (0x10) of port 0x61 is alternating
                  ;
                  	in	al,0x61			; 0000B574  E461  '.a'
                  	not	al			; 0000B576  F6D0  '..'
                  	and	al,0x10			; 0000B578  2410  '$.'
                  	mov	ah,al			; 0000B57A  8AE0  '..'
                  	mov	cx,0xffff		; 0000B57C  B9FFFF  '...'
                  xb57f:	in	al,0x61			; 0000B57F  E461  '.a'
                  	and	al,0x10			; 0000B581  2410  '$.'
                  	cmp	al,ah			; 0000B583  3AC4  ':.'
                  	jz	xb597			; 0000B585  7410  't.'
                  	loop	xb57f			; 0000B587  E2F6  '..'
                  ;
                  ;   Verification failed
                  ;
                  	mov	bx,err102		; 0000B589  BB8CB6  '...'
                  	mov	cx,err102_len-2		; 0000B58C  B91800  '...'
                  	mov	bp,0xb595		; 0000B58F  BD95B5  '...'
                  	jmp	xc7f7			; 0000B592  E96212  '.b.'
                  
                  	jmp	short xb570		; 0000B595  EBD9  '..'
                  ;
                  ;   Checkpoint 0x42: Memory test of the first 128Kb of (conventional) RAM
                  ;
                  xb597:	mov	al,0x42			; 0000B597  B042  '.B'
                  	out	0x84,al			; 0000B599  E684  '..'
                  
                  init_128kb:
                  	xor	ebp,ebp			; 0000B59B  6633ED  'f3.'
                  xb59e:	mov	dx,0x0			; 0000B59E  BA0000  '...'
                  	mov	eax,0x1			; 0000B5A1  66B801000000  'f.....'
                  	xor	eax,ebp			; 0000B5A7  6633C5  'f3.'
                  xb5aa:	mov	cx,0x4000		; 0000B5AA  B90040  '..@'
                  	mov	es,dx			; 0000B5AD  8EC2  '..'
                  	xor	di,di			; 0000B5AF  33FF  '3.'
                  	sahf				; 0000B5B1  9E  '.'
                  xb5b2:	rcl	eax,1			; 0000B5B2  66D1D0  'f..'
                  	stosd				; 0000B5B5  66AB  'f.'
                  	loop	xb5b2			; 0000B5B7  E2F9  '..'
                  	add	dh,0x10			; 0000B5B9  80C610  '...'
                  	cmp	dx,0x2000		; 0000B5BC  81FA0020  '... '
                  	jc	xb5aa			; 0000B5C0  72E8  'r.'
                  	mov	al,0x43			; 0000B5C2  B043  '.C'
                  	out	0x84,al			; 0000B5C4  E684  '..'
                  	in	al,0x61			; 0000B5C6  E461  '.a'
                  	or	al,0xc			; 0000B5C8  0C0C  '..'
                  	out	0x61,al			; 0000B5CA  E661  '.a'
                  	and	al,0xf3			; 0000B5CC  24F3  '$.'
                  	out	0x61,al			; 0000B5CE  E661  '.a'
                  	mov	al,0x44			; 0000B5D0  B044  '.D'
                  	out	0x84,al			; 0000B5D2  E684  '..'
                  	mov	di,0x0			; 0000B5D4  BF0000  '...'
                  	mov	ebx,0x1			; 0000B5D7  66BB01000000  'f.....'
                  	xor	ebx,ebp			; 0000B5DD  6633DD  'f3.'
                  	mov	eax,ebp			; 0000B5E0  668BC5  'f..'
                  	mov	dh,ah			; 0000B5E3  8AF4  '..'
                  xb5e5:	mov	ds,di			; 0000B5E5  8EDF  '..'
                  	xor	si,si			; 0000B5E7  33F6  '3.'
                  	mov	cx,0x4000		; 0000B5E9  B90040  '..@'
                  xb5ec:	mov	ah,dh			; 0000B5EC  8AE6  '..'
                  	sahf				; 0000B5EE  9E  '.'
                  	rcl	ebx,1			; 0000B5EF  66D1D3  'f..'
                  	lahf				; 0000B5F2  9F  '.'
                  	mov	dh,ah			; 0000B5F3  8AF4  '..'
                  	lodsd				; 0000B5F5  66AD  'f.'
                  	xor	eax,ebx			; 0000B5F7  6633C3  'f3.'
                  	loope	xb5ec			; 0000B5FA  E1F0  '..'
                  	jnz	xb642			; 0000B5FC  7544  'uD'
                  	mov	al,0x45			; 0000B5FE  B045  '.E'
                  	out	0x84,al			; 0000B600  E684  '..'
                  	in	al,0x61			; 0000B602  E461  '.a'
                  	test	al,0xc0			; 0000B604  A8C0  '..'
                  	mov	al,0x0			; 0000B606  B000  '..'
                  	jnz	xb625			; 0000B608  751B  'u.'
                  	add	di,0x1000		; 0000B60A  81C70010  '....'
                  	cmp	di,0x2000		; 0000B60E  81FF0020  '... '
                  	jc	xb5e5			; 0000B612  72D1  'r.'
                  	dec	ebp			; 0000B614  664D  'fM'
                  	jpo	xb61a			; 0000B616  7B02  '{.'
                  	jmp	short xb59e		; 0000B618  EB84  '..'
                  
                  xb61a:	mov	al,0x46			; 0000B61A  B046  '.F'
                  	out	0x84,al			; 0000B61C  E684  '..'
                  	mov	ax,0x40			; 0000B61E  B84000  '.@.'
                  	mov	ds,ax			; 0000B621  8ED8  '..'
                  	jmp	sp			; 0000B623  FFE4  '..'
                  
                  xb625:	xor	di,di			; 0000B625  33FF  '3.'
                  	mov	bp,0xb62d		; 0000B627  BD2DB6  '.-.'
                  	jmp	x87e4			; 0000B62A  E9B7D1  '...'
                  
                  	and	bl,0xf			; 0000B62D  80E30F  '...'
                  	xor	si,si			; 0000B630  33F6  '3.'
                  	mov	cl,0x4			; 0000B632  B104  '..'
                  xb634:	rcr	bl,1			; 0000B634  D0DB  '..'
                  	jnc	xb63d			; 0000B636  7305  's.'
                  	inc	si			; 0000B638  46  'F'
                  	loop	xb634			; 0000B639  E2F9  '..'
                  	xor	si,si			; 0000B63B  33F6  '3.'
                  xb63d:	xor	al,al			; 0000B63D  32C0  '2.'
                  	jmp	short xb652		; 0000B63F  EB11  '..'
                  	nop				; 0000B641  90  '.'
                  ;
                  ;   The first 128Kb failed the above memory test
                  ;
                  xb642:	mov	cx,0x4			; 0000B642  B90400  '...'
                  	sub	si,cx			; 0000B645  2BF1  '+.'
                  xb647:	test	al,0xff			; 0000B647  A8FF  '..'
                  	jnz	xb652			; 0000B649  7507  'u.'
                  	shr	eax,0x8			; 0000B64B  66C1E808  'f...'
                  	inc	si			; 0000B64F  46  'F'
                  	loop	xb647			; 0000B650  E2F5  '..'
                  
                  xb652:	mov	cx,ax			; 0000B652  8BC8  '..'
                  	mov	al,0x47			; 0000B654  B047  '.G'
                  	out	0x84,al			; 0000B656  E684  '..'
                  	mov	dx,si			; 0000B658  8BD6  '..'
                  	mov	si,ds			; 0000B65A  8CDE  '..'
                  	mov	di,0x0			; 0000B65C  BF0000  '...'
                  	mov	bp,xb665		; 0000B65F  BD65B6  '.e.'
                  	jmp	xc6ab			; 0000B662  E94610  '.F.'
                  
                  xb665:	mov	bx,err201		; 0000B665  BBA6B6  '...'
                  	mov	cx,err201_len		; 0000B668  B91100  '...'
                  	mov	bp,0xb671		; 0000B66B  BD71B6  '.q.'
                  	jmp	xc7f9			; 0000B66E  E98811  '...'
                  xb671:	jmp	short xb671		; 0000B671  Hang the machine
                  
                  xb673:	mov	al,[di+0x32]		; 0000B673  8A4532  '.E2'
                  	and	al,0xfe			; 0000B676  24FE  '$.'
                  	cmp	al,0x2			; 0000B678  3C02  '<.'
                  	jnz	xb68a			; 0000B67A  750E  'u.'
                  	mov	dx,[di+0x4c]		; 0000B67C  8B554C  '.UL'
                  	add	dx,byte +0x4		; 0000B67F  83C204  '...'
                  	xor	byte [di+0x4e],0x80	; 0000B682  80754E80  '.uN.'
                  	mov	al,[di+0x4e]		; 0000B686  8A454E  '.EN'
                  	out	dx,al			; 0000B689  EE  '.'
                  xb68a:	stc				; 0000B68A  F9  '.'
                  	ret				; 0000B68B  C3  '.'
                  
                  ;
                  ;   Error messages
                  ;
                  err102:	db	'102-System Board Failure',0x0D,0x0A
                  err102_len equ $-err102
                  
                  err201:	db	' 201-Memory Error'
                  err201_len equ $-err201
                  
                  err203:	db	' 203-Memory Address Error'
                  err203_len equ $-err203
                  
                  err205:	db	' 205-Memory Error',0x0D,0x0A
                  err205_len equ $-err205
                  
                  err207:	db	' 207-Invalid Memory Configuration',0x0A,0x0D
                  err207_len equ $-err207
                  
                  	db	' Base Module',0x00
                  	db	' Module A',0x00
                  	db	' Module B',0x00
                  	db	' Module C',0x00
                  	db	0x0D,0x0A
                  	db	'Parity Check 1 ',0x00
                  	db	'Parity Check 2 ',0x00
                  	db	'??????',0x00
                  
                  err101:	db	'101-ROM Error',0x0D,0x0A
                  err101_len equ $-err101
                  
                  	db	' 402-Monochrome Adapter Failure',0x0D,0x0A
                  	db	' 501-Display Adapter Failure',0x0D,0x0A
                  	db	' 301-Keyboard Error or Test Fixture Installed',0x0D,0x0A
                  	db	' 301-Keyboard Error',0x0D,0x0A
                  	db	' 304-Keyboard or System Unit Error',0x0D,0x0A
                  	db	'303-Keyboard Controller Error',0x0D,0x0A
                  	db	' 601-Diskette Controller Error',0x0D,0x0A
                  	db	' 702-Coprocessor Detection Error, Please Check Installation',0x0D,0x0A
                  	db	' 101-I/O ROM Error',0x0D,0x0A
                  	db	' 162-System Options Not Set-(Run Setup)',0x0D,0x0A
                  	db	'     Insert DIAGNOSTIC diskette in Drive A:',0x0D,0x0A
                  	db	' 162-System Options Error',0x0D,0x0A
                  	db	' 164-Memory Size Error',0x0D,0x0A
                  	db	' 163-Time & Date Not Set',0x0D,0x0A,0x0D,0x0A
                  	db	' (RESUME = "F1" KEY)',0x0D,0x0A,0x0D,0x0A
                  	db	' 302-System Unit Security Lock is Locked',0x0D,0x0A
                  	db	'     - Unlock System Unit Security Lock',0x0D,0x0A
                  	db	'1790-Disk 0 Error',0x0D,0x0A
                  	db	'1791-Disk 1 Error',0x0D,0x0A
                  	db	'1780-Disk 0 Failure',0x0D,0x0A
                  	db	'1781-Disk 1 Failure',0x0D,0x0A
                  	db	'1782-Disk Controller Failure',0x0D,0x0A
                  	db	' 605-Diskette Drive Type Error-(Run Setup)',0x0D,0x0A
                  	db	'     Insert DIAGNOSTIC diskette in Drive A:',0x0D,0x0A
                  
                  ;
                  ;   Video card data
                  ;
                  xba77:	dw	0x03D8			; 0000BA77  D803 	; +0x00: I/O address of Mode Select Register (CGA)
                  	db	0xD4,0x29,0xB4,0xF0	; 0000BA79  D429B4F0
                  	dw	0xB800			; 0000BA7D  00B8	; +0x06: real-mode segment of video buffer
                  	db	0x00,0x60,0x8A,0xB7	; 0000BA7F  00608AB7
                  	db	0x1E,0x00,0x40		; 0000BA83  1E0040
                  
                  xba86:	dw	0x03B8			; 0000BA86  B803	; +0x00: I/O address of Mode Select Register (Mono)
                  	db	0xB4,0x29,0xD4,0xF0	; 0000BA88  B429D4F0
                  	dw	0xB000			; 0000BA8C  00B0	; +0x06: real-mode segment of video buffer
                  	db	0x00,0x60,0x69,0xB7	; 0000BA8E  006069B7
                  	db	0x21,0x00,0x10		; 0000BA92  210010
                  
                  	mov	bp,0xba9b		; 0000BA95  BD9BBA
                  	jmp	x9380			; 0000BA98  E9E5D8
                  
                  	mov	al,0x8e			; 0000BA9B  B08E
                  	out	0x70,al			; 0000BA9D  E670
                  	xor	ax,ax			; 0000BA9F  33C0
                  	out	0x71,al			; 0000BAA1  E671
                  	mov	al,0x40			; 0000BAA3  B040
                  	out	0x86,al			; 0000BAA5  E686
                  
                  xbaa7:	cli				; 0000BAA7  FA  '.'
                  	mov	al,0xf			; 0000BAA8  B00F  '..'
                  	out	0x84,al			; 0000BAAA  E684  '..'
                  	mov	al,0x0			; 0000BAAC  B000  '..'
                  	out	0x85,al			; 0000BAAE  E685  '..'
                  	mov	al,[cs:0xfffe]		; 0000BAB0  2EA0FEFF  '....'
                  	not	al			; 0000BAB4  F6D0  '..'
                  	mov	[cs:0xfffe],al		; 0000BAB6  2EA2FEFF  '....'
                  	cmp	al,[cs:0xfffe]		; 0000BABA  2E3A06FEFF  '.:...'
                  	jnz	xbad3			; 0000BABF  7512  'u.'
                  	mov	di,0x2			; 0000BAC1  BF0200  '...'
                  	mov	bp,0xbaca		; 0000BAC4  BDCABA  '...'
                  	jmp	x87e4			; 0000BAC7  E91ACD  '...'
                  
                  	and	bl,0xbf			; 0000BACA  80E3BF  '...'
                  	mov	bp,0xbad3		; 0000BACD  BDD3BA  '...'
                  	jmp     x8796			; 0000BAD0  E9C3CC
                  
                  xbad3:	cld				; 0000BAD3  FC  '.'
                  	mov	ax,0xf000		; 0000BAD4  B800F0  '...'
                  	mov	ds,ax			; 0000BAD7  8ED8  '..'
                  	mov	al,0xff			; 0000BAD9  B0FF  '..'
                  	out	0x21,al			; 0000BADB  E621  '.!'
                  	out	0xa1,al			; 0000BADD  E6A1  '..'
                  	mov	bx,bim_table_offset	; 0000BADF  BBE0FF  '...'
                  	mov	bx,[bx]			; 0000BAE2  8B1F  '..'
                  	test	word [bx],0xf00		; 0000BAE4  F707000F  '....'
                  	jnz	xbaf5			; 0000BAE8  750B  'u.'
                  	mov	bx,cpu_idrev_offset	; 0000BAEA  BBE2FF  '...'
                  	mov	bx,[bx]			; 0000BAED  8B1F  '..'
                  	mov	ax,[bx]			; 0000BAEF  8B07  '..'
                  	xchg	al,ah			; 0000BAF1  86C4  '..'
                  	mov	gs,ax			; 0000BAF3  8EE8  '..'
                  xbaf5:	mov	al,0xc			; 0000BAF5  B00C  '..'
                  	out	0x61,al			; 0000BAF7  E661  '.a'
                  	mov	al,0x10			; 0000BAF9  B010  '..'
                  	out	0x84,al			; 0000BAFB  E684  '..'
                  	mov	al,0x12			; 0000BAFD  B012  '..'
                  	out	0x4b,al			; 0000BAFF  E64B  '.K'
                  	mov	al,0x42			; 0000BB01  B042  '.B'
                  	out	0x4b,al			; 0000BB03  E64B  '.K'
                  	mov	al,0x92			; 0000BB05  B092  '..'
                  	out	0x4b,al			; 0000BB07  E64B  '.K'
                  	xor	al,al			; 0000BB09  32C0  '2.'
                  	out	0x8f,al			; 0000BB0B  E68F  '..'
                  	mov	al,0x54			; 0000BB0D  B054  '.T'
                  	out	0x43,al			; 0000BB0F  E643  '.C'
                  	mov	al,0x12			; 0000BB11  B012  '..'
                  	out	0x41,al			; 0000BB13  E641  '.A'
                  	mov	al,0x36			; 0000BB15  B036  '.6'
                  	out	0x43,al			; 0000BB17  E643  '.C'
                  	mov	al,0x0			; 0000BB19  B000  '..'
                  	out	0x40,al			; 0000BB1B  E640  '.@'
                  	mov	al,0x0			; 0000BB1D  B000  '..'
                  	out	0x40,al			; 0000BB1F  E640  '.@'
                  	mov	al,0xc			; 0000BB21  B00C  '..'
                  	mov	dx,0x3f2		; 0000BB23  BAF203  '...'
                  	out	dx,al			; 0000BB26  EE  '.'
                  	mov	al,0x11			; 0000BB27  B011  '..'
                  	out	0x84,al			; 0000BB29  E684  '..'
                  	mov	al,0x1			; 0000BB2B  B001  '..'
                  	mov	dx,0x3b8		; 0000BB2D  BAB803  '...'
                  	out	dx,al			; 0000BB30  EE  '.'
                  	mov	al,0x1			; 0000BB31  B001  '..'
                  	mov	dx,0x3d8		; 0000BB33  BAD803  '...'
                  	out	dx,al			; 0000BB36  EE  '.'
                  	mov	dx,0x3ba		; 0000BB37  BABA03  '...'
                  	in	al,dx			; 0000BB3A  EC  '.'
                  	mov	dx,0x3da		; 0000BB3B  BADA03  '...'
                  	in	al,dx			; 0000BB3E  EC  '.'
                  	mov	dx,0x3c0		; 0000BB3F  BAC003  '...'
                  	xor	al,al			; 0000BB42  32C0  '2.'
                  	out	dx,al			; 0000BB44  EE  '.'
                  	mov	bx,0xba77		; 0000BB45  BB77BA  '.w.'
                  xbb48:	mov	di,0xbb6e		; 0000BB48  BF6EBB  '.n.'
                  	mov	al,0x1			; 0000BB4B  B001  '..'
                  	mov	dx,[bx]			; 0000BB4D  8B17  '..'
                  	out	dx,al			; 0000BB4F  EE  '.'
                  	mov	si,[bx+0x4]		; 0000BB50  8B7704  '.w.'
                  	mov	dl,[bx+0x2]		; 0000BB53  8A5702  '.W.'
                  	mov	cx,0x12			; 0000BB56  B91200  '...'
                  	mov	bp,0xbb5f		; 0000BB59  BD5FBB  '._.'
                  	jmp	x9beb			; 0000BB5C  E98CE0  '...'
                  
                  	add	dx,byte +0x5		; 0000BB5F  83C205  '...'
                  	cmp	dx,0x3d9		; 0000BB62  81FAD903  '....'
                  	jnz	xbb6b			; 0000BB66  7503  'u.'
                  	mov	al,0x30			; 0000BB68  B030  '.0'
                  	out	dx,al			; 0000BB6A  EE  '.'
                  xbb6b:	dec	dx			; 0000BB6B  4A  'J'
                  	jmp	di			; 0000BB6C  FFE7  '..'
                  
                  	mov	al,0x12			; 0000BB6E  B012  '..'
                  	out	0x84,al			; 0000BB70  E684  '..'
                  	mov	bp,0xbb78		; 0000BB72  BD78BB  '.x.'
                  	jmp	x9bfa			; 0000BB75  E982E0
                  
                  	xor	cx,cx			; 0000BB78  33C9  '3.'
                  	mov	dl,[bx+0x2]		; 0000BB7A  8A5702  '.W.'
                  	mov	ah,0xe			; 0000BB7D  B40E  '..'
                  	mov	bp,0xbb85		; 0000BB7F  BD85BB  '...'
                  	jmp	xad18			; 0000BB82  E993F1  '...'
                  
                  	add	bx,byte +0xf		; 0000BB85  83C30F  '...'
                  	cmp	bx,0xba95		; 0000BB88  81FB95BA  '....'
                  	jc	xbb48			; 0000BB8C  72BA  'r.'
                  	mov	al,0x13			; 0000BB8E  B013  '..'
                  	out	0x84,al			; 0000BB90  E684  '..'
                  	mov	cx,0x100		; 0000BB92  B90001  '...'
                  xbb95:	xor	ax,ax			; 0000BB95  33C0  '3.'
                  	loop	xbb95			; 0000BB97  E2FC  '..'
                  	mov	al,0x0			; 0000BB99  B000  '..'
                  	out	0x43,al			; 0000BB9B  E643  '.C'
                  	in	al,0x40			; 0000BB9D  E440  '.@'
                  	mov	ah,al			; 0000BB9F  8AE0  '..'
                  	in	al,0x40			; 0000BBA1  E440  '.@'
                  	cmp	ax,0x0			; 0000BBA3  3D0000  '=..'
                  	jnz	xbbb6			; 0000BBA6  750E  'u.'
                  
                  	mov	bx,err102		; 0000BBA8  BB8CB6  '...'
                  	mov	cx,err102_len-2		; 0000BBAB  B91800  '...'
                  	mov	bp,0xbbb4		; 0000BBAE  BDB4BB  '...'
                  	jmp	xc7f7			; 0000BBB1  E9430C  '.C.'
                  xbbb4:	jmp	short xbbb4		; 0000BBB4  Hang the machine
                  
                  xbbb6:	mov	al,0x14			; 0000BBB6  B014  '..'
                  	out	0x84,al			; 0000BBB8  E684  '..'
                  	mov	al,0x8b			; 0000BBBA  B08B  '..'
                  	out	0x70,al			; 0000BBBC  E670  '.p'
                  	jmp	short xbbc0		; 0000BBBE  EB00  '..'
                  
                  xbbc0:	jmp	short xbbc2		; 0000BBC0  EB00  '..'
                  
                  xbbc2:	jmp	short xbbc4		; 0000BBC2  EB00  '..'
                  
                  xbbc4:	in	al,0x71			; 0000BBC4  E471  '.q'
                  	and	al,0x7			; 0000BBC6  2407  '$.'
                  	mov	ah,al			; 0000BBC8  8AE0  '..'
                  	mov	al,0x8b			; 0000BBCA  B08B  '..'
                  	out	0x70,al			; 0000BBCC  E670  '.p'
                  	mov	al,ah			; 0000BBCE  8AC4  '..'
                  	out	0x71,al			; 0000BBD0  E671  '.q'
                  	mov	al,0x8c			; 0000BBD2  B08C  '..'
                  	out	0x70,al			; 0000BBD4  E670  '.p'
                  	mov	al,0x15			; 0000BBD6  B015  '..'
                  	out	0x84,al			; 0000BBD8  E684  '..'
                  	mov	al,0x8d			; 0000BBDA  B08D  '..'
                  	out	0x70,al			; 0000BBDC  E670  '.p'
                  	jmp	short xbbe0		; 0000BBDE  EB00  '..'
                  
                  xbbe0:	jmp	short xbbe2		; 0000BBE0  EB00  '..'
                  
                  xbbe2:	jmp	short xbbe4		; 0000BBE2  EB00  '..'
                  
                  xbbe4:	in	al,0x71			; 0000BBE4  E471  '.q'
                  	and	al,0x80			; 0000BBE6  2480  '$.'
                  	mov	ah,al			; 0000BBE8  8AE0  '..'
                  	mov	al,0x8e			; 0000BBEA  B08E  '..'
                  	out	0x70,al			; 0000BBEC  E670  '.p'
                  	jmp	short xbbf0		; 0000BBEE  EB00  '..'
                  
                  xbbf0:	jmp	short xbbf2		; 0000BBF0  EB00  '..'
                  
                  xbbf2:	jmp	short xbbf4		; 0000BBF2  EB00  '..'
                  
                  xbbf4:	in	al,0x71			; 0000BBF4  E471  '.q'
                  	and	al,0x80			; 0000BBF6  2480  '$.'
                  	test	ah,0x80			; 0000BBF8  F6C480  '...'
                  	mov	ah,al			; 0000BBFB  8AE0  '..'
                  	jnz	xbc06			; 0000BBFD  7507  'u.'
                  	or	ah,0x80			; 0000BBFF  80CC80  '...'
                  	mov	al,0x16			; 0000BC02  B016  '..'
                  	out	0x84,al			; 0000BC04  E684  '..'
                  xbc06:	mov	al,0x17			; 0000BC06  B017  '..'
                  	out	0x84,al			; 0000BC08  E684  '..'
                  	mov	al,0x8e			; 0000BC0A  B08E  '..'
                  	out	0x70,al			; 0000BC0C  E670  '.p'
                  	mov	al,ah			; 0000BC0E  8AC4  '..'
                  	out	0x71,al			; 0000BC10  E671  '.q'
                  	mov	al,0x18			; 0000BC12  B018  '..'
                  	out	0x84,al			; 0000BC14  E684  '..'
                  	mov	bp,0xbc1c		; 0000BC16  BD1CBC  '...'
                  	jmp	xb550			; 0000BC19  E934F9  '.4.'
                  
                  	in	al,0x61			; 0000BC1C  E461  '.a'
                  	and	al,0xf3			; 0000BC1E  24F3  '$.'
                  	out	0x61,al			; 0000BC20  E661  '.a'
                  	mov	ax,0x30			; 0000BC22  B83000  '.0.'
                  	mov	ss,ax			; 0000BC25  8ED0  '..'
                  	mov	sp,0x100		; 0000BC27  BC0001  '...'
                  	mov	al,0x19			; 0000BC2A  B019  '..'
                  	out	0x84,al			; 0000BC2C  E684  '..'
                  	call	xa8ae			; 0000BC2E  E87DEC
                  	mov	al,0xad			; 0000BC31  B0AD  '..'
                  	out	0x64,al			; 0000BC33  E664  '.d'
                  	mov	cx,0xffff		; 0000BC35  B9FFFF  '...'
                  xbc38:	in	al,0x64			; 0000BC38  E464  '.d'
                  	test	al,0x2			; 0000BC3A  A802  '..'
                  	jz	xbc4e			; 0000BC3C  7410  't.'
                  	loop	xbc38			; 0000BC3E  E2F8  '..'
                  	mov	bx,0xb810		; 0000BC40  BB10B8  '...'
                  	mov	cx,0x1d			; 0000BC43  B91D00  '...'
                  	mov	bp,0xbc4c		; 0000BC46  BD4CBC  '.L.'
                  	jmp	xc7f7			; 0000BC49  E9AB0B  '...'
                  xbc4c:	jmp	short xbc4c		; 0000BC4C  Hang the machine
                  
                  xbc4e:	mov	cx,0x2			; 0000BC4E  B90200  '...'
                  xbc51:	in	al,0x60			; 0000BC51  E460  '.`'
                  	push	cx			; 0000BC53  51  'Q'
                  	mov	bx,0x1388		; 0000BC54  BB8813  '...'
                  	call	xc638			; 0000BC57  E8DE09  '...'
                  	pop	cx			; 0000BC5A  59  'Y'
                  	in	al,0x64			; 0000BC5B  E464  '.d'
                  	test	al,0x1			; 0000BC5D  A801  '..'
                  	jz	xbc71			; 0000BC5F  7410  't.'
                  	loop	xbc51			; 0000BC61  E2EE  '..'
                  	mov	bx,0xb810		; 0000BC63  BB10B8  '...'
                  	mov	cx,0x1d			; 0000BC66  B91D00  '...'
                  	mov	bp,0xbc6f		; 0000BC69  BD6FBC  '.o.'
                  	jmp	xc7f7			; 0000BC6C  E9880B  '...'
                  xbc6f:	jmp	short xbc6f		; 0000BC6F  Hang the machine
                  
                  xbc71:	call	xa3e0			; 0000BC71  E86CE7  '.l.'
                  	call	xaa5a			; 0000BC74  E8E3ED  '...'
                  	mov	al,0x1a			; 0000BC77  B01A  '..'
                  	out	0x84,al			; 0000BC79  E684  '..'
                  	call	xaa74			; 0000BC7B  E8F6ED  '...'
                  	mov	al,0x1b			; 0000BC7E  B01B  '..'
                  	out	0x84,al			; 0000BC80  E684  '..'
                  	call	x82e8			; 0000BC82  E863C6  '.c.'
                  	mov	al,0x1c			; 0000BC85  B01C  '..'
                  	out	0x84,al			; 0000BC87  E684  '..'
                  	call	xcc51			; 0000BC89  E8C50F  '...'
                  	mov	al,0x1d			; 0000BC8C  B01D  '..'
                  	out	0x84,al			; 0000BC8E  E684  '..'
                  	call	xcc88			; 0000BC90  E8F50F  '...'
                  	mov	al,0x2d			; 0000BC93  B02D  '.-'
                  	out	0x84,al			; 0000BC95  E684  '..'
                  	call	xe105			; 0000BC97  E86B24
                  	mov	al,0x1e			; 0000BC9A  B01E  '..'
                  	out	0x84,al			; 0000BC9C  E684  '..'
                  	call	xcfdd			; 0000BC9E  E83C13  '.<.'
                  	mov	al,0x1f			; 0000BCA1  B01F  '..'
                  	out	0x84,al			; 0000BCA3  E684  '..'
                  	call	xf745			; 0000BCA5  E89D3A  '..:'
                  	mov	al,0x20			; 0000BCA8  B020  '. '
                  	out	0x84,al			; 0000BCAA  E684  '..'
                  	call	xd6dd			; 0000BCAC  E82E1A  '...'
                  ;
                  ;   Switch to protected-mode, relocate the ROM, switch back to real-mode, disable
                  ;   the A20 line, and then initialize all conventional RAM.
                  ;
                  	call	xc825			; 0000BCAF  E8730B
                  
                  	call	xf480			; 0000BCB2  E8CB37
                  
                  	call	xe7df			; 0000BCB5  E8272B
                  
                  	sti				; 0000BCB8  FB  '.'
                  	mov	al,0x21			; 0000BCB9  B021  '.!'
                  	out	0x84,al			; 0000BCBB  E684  '..'
                  	call	xcd6d			; 0000BCBD  E8AD10  '...'
                  	mov	al,0x23			; 0000BCC0  B023  '.#'
                  	out	0x84,al			; 0000BCC2  E684  '..'
                  	call	xcedb			; 0000BCC4  E81412  '...'
                  	mov	al,0x22			; 0000BCC7  B022  '."'
                  	out	0x84,al			; 0000BCC9  E684  '..'
                  	call	xce71			; 0000BCCB  E8A311  '...'
                  	mov	di,0x0			; 0000BCCE  BF0000  '...'
                  	mov	bp,0xbcd7		; 0000BCD1  BDD7BC  '...'
                  	jmp	x87e4			; 0000BCD4  E90DCB  '.',0x0D,'.'
                  
                  	and	bl,0xc0			; 0000BCD7  80E3C0  '...'
                  	cmp	bl,0x40			; 0000BCDA  80FB40  '..@'
                  	jnz	xbce9			; 0000BCDD  750A  'u',0x0A
                  	mov	al,0xbe			; 0000BCDF  B0BE  '..'
                  	out	0x84,al			; 0000BCE1  E684  '..'
                  	mov	bp,0xbce9		; 0000BCE3  BDE9BC  '...'
                  	jmp	x8814			; 0000BCE6  E92BCB  '.+.'
                  
                  xbce9:	mov	al,0x24			; 0000BCE9  B024  '.$'
                  	out	0x84,al			; 0000BCEB  E684  '..'
                  	in	al,0x60			; 0000BCED  E460  '.`'
                  	mov	al,0xd0			; 0000BCEF  B0D0  '..'
                  	out	0x64,al			; 0000BCF1  E664  '.d'
                  xbcf3:	in	al,0x64			; 0000BCF3  E464  '.d'
                  	test	al,0x2			; 0000BCF5  A802  '..'
                  	jz	xbcfb			; 0000BCF7  7402  't.'
                  	jmp	short xbcf3		; 0000BCF9  EBF8  '..'
                  
                  xbcfb:	in	al,0x64			; 0000BCFB  E464  '.d'
                  	test	al,0x1			; 0000BCFD  A801  '..'
                  	jz	xbcfb			; 0000BCFF  74FA  't.'
                  	in	al,0x60			; 0000BD01  E460  '.`'
                  	and	al,0xfd			; 0000BD03  24FD  '$.'
                  	and	al,0xf3			; 0000BD05  24F3  '$.'
                  	mov	ah,al			; 0000BD07  8AE0  '..'
                  	mov	al,0xd1			; 0000BD09  B0D1  '..'
                  	out	0x64,al			; 0000BD0B  E664  '.d'
                  xbd0d:	in	al,0x64			; 0000BD0D  E464  '.d'
                  	test	al,0x2			; 0000BD0F  A802  '..'
                  	jnz	xbd0d			; 0000BD11  75FA  'u.'
                  	mov	al,ah			; 0000BD13  8AC4  '..'
                  	out	0x60,al			; 0000BD15  E660  '.`'
                  	mov	al,0x25			; 0000BD17  B025  '.%'
                  	out	0x84,al			; 0000BD19  E684  '..'
                  	call	x91b0			; 0000BD1B  E892D4  '...'
                  	mov	al,0x26			; 0000BD1E  B026  '.&'
                  	out	0x84,al			; 0000BD20  E684  '..'
                  	call	xc390			; 0000BD22  E86B06  '.k.'
                  	mov	al,0x27			; 0000BD25  B027  '.',0x27
                  	out	0x84,al			; 0000BD27  E684  '..'
                  	mov	al,0xec			; 0000BD29  B0EC  '..'
                  	mov	dx,0x3be		; 0000BD2B  BABE03  '...'
                  	out	dx,al			; 0000BD2E  EE  '.'
                  	mov	al,0x28			; 0000BD2F  B028  '.('
                  	out	0x84,al			; 0000BD31  E684  '..'
                  	call	x99b7			; 0000BD33  E881DC  '...'
                  	mov	al,0x29			; 0000BD36  B029  '.)'
                  	out	0x84,al			; 0000BD38  E684  '..'
                  	call	xe2c8			; 0000BD3A  E88B25  '..%'
                  	mov	al,0x2a			; 0000BD3D  B02A  '.*'
                  	out	0x84,al			; 0000BD3F  E684  '..'
                  	mov	ah,0xf			; 0000BD41  B40F  '..'
                  	int	0x10			; 0000BD43  CD10  '..'
                  	mov	ah,0x0			; 0000BD45  B400  '..'
                  	int	0x10			; 0000BD47  CD10  '..'
                  	in	al,0x61			; 0000BD49  E461  '.a'
                  	mov	ah,al			; 0000BD4B  8AE0  '..'
                  	or	al,0x6c			; 0000BD4D  0C6C  '.l'
                  	out	0x61,al			; 0000BD4F  E661  '.a'
                  	xchg	ah,al			; 0000BD51  86E0  '..'
                  	out	0x61,al			; 0000BD53  E661  '.a'
                  	mov	al,0x2b			; 0000BD55  B02B  '.+'
                  	out	0x84,al			; 0000BD57  E684  '..'
                  	mov	al,0xe			; 0000BD59  B00E  '..'
                  	call	xb544			; 0000BD5B  E8E6F7  '...'
                  	test	al,0x4			; 0000BD5E  A804  '..'
                  	jz	xbd6e			; 0000BD60  740C  't.'
                  	mov	dx,0x2000		; 0000BD62  BA0020  '.. '
                  	mov	bx,0xb929		; 0000BD65  BB29B9  '.).'
                  	mov	cx,0x1a			; 0000BD68  B91A00  '...'
                  	call	xc745			; 0000BD6B  E8D709  '...'
                  xbd6e:	in	al,0xa1			; 0000BD6E  E4A1  '..'
                  	and	al,0xfd			; 0000BD70  24FD  '$.'
                  	out	0xa1,al			; 0000BD72  E6A1  '..'
                  	in	al,0x21			; 0000BD74  E421  '.!'
                  	and	al,0xfb			; 0000BD76  24FB  '$.'
                  	out	0x21,al			; 0000BD78  E621  '.!'
                  	mov	ax,0x40			; 0000BD7A  B84000  '.@.'
                  	mov	ds,ax			; 0000BD7D  8ED8  '..'
                  	mov	byte [0x12],0x0		; 0000BD7F  C606120000  '.....'
                  	or	byte [0x96],0x80	; 0000BD84  800E960080  '.....'
                  	or	byte [0x96],0x20	; 0000BD89  800E960020  '.... '
                  	cli				; 0000BD8E  FA  '.'
                  	call	xec2e_wait_8042_ready	; 0000BD8F  E89C2E  '...'
                  	mov	al,0xf2			; 0000BD92  B0F2  '..'
                  	out	0x60,al			; 0000BD94  E660  '.`'
                  	sti				; 0000BD96  FB  '.'
                  	mov	cx,0xffff		; 0000BD97  B9FFFF  '...'
                  	test	byte [0x96],0x20	; 0000BD9A  F606960020  '.... '
                  	jz	xbda8			; 0000BD9F  7407  't.'
                  	db	0xE2,0xF7
                  	mov	byte [0x96],0x0		; 0000BDA3  C606960000  '.....'
                  xbda8:	in	al,0x86			; 0000BDA8  E486  '..'
                  	cmp	word [0x72],0x1234	; 0000BDAA  813E72003412  '.>r.4.'
                  	jz	xbdcd			; 0000BDB0  741B  't.'
                  	mov	al,0x40			; 0000BDB2  B040  '.@'
                  	push	ax			; 0000BDB4  50  'P'
                  	call	xf30f			; 0000BDB5  E85735  '.W5'
                  	or	al,al			; 0000BDB8  0AC0  0x0A,'.'
                  	pop	ax			; 0000BDBA  58  'X'
                  	jnz	xbdbf			; 0000BDBB  7502  'u.'
                  	or	al,0x80			; 0000BDBD  0C80  '..'
                  xbdbf:	out	0x86,al			; 0000BDBF  E686  '..'
                  	call	xf32b			; 0000BDC1  E86735  '.g5'
                  	mov	al,0x92			; 0000BDC4  B092  '..'
                  	out	0x4b,al			; 0000BDC6  E64B  '.K'
                  	call	xc79e			; 0000BDC8  E8D309  '...'
                  	jmp	short xbe04		; 0000BDCB  EB37  '.7'
                  
                  xbdcd:	test	al,0x40			; 0000BDCD  A840  '.@'
                  	jnz	xbdd5			; 0000BDCF  7504  'u.'
                  	test	al,0x80			; 0000BDD1  A880  '..'
                  	jnz	xbddc			; 0000BDD3  7507  'u.'
                  xbdd5:	call	xc79e			; 0000BDD5  E8C609  '...'
                  	mov	al,0x0			; 0000BDD8  B000  '..'
                  	jmp	short xbded		; 0000BDDA  EB11  '..'
                  
                  xbddc:	and	al,0x3f			; 0000BDDC  243F  '$?'
                  	cmp	al,0x0			; 0000BDDE  3C00  '<.'
                  	jc	xbde8			; 0000BDE0  7206  'r.'
                  	cmp	al,0x34			; 0000BDE2  3C34  '<4'
                  	ja	xbde8			; 0000BDE4  7702  'w.'
                  	jmp	short xbded		; 0000BDE6  EB05  '..'
                  
                  xbde8:	call	xc79e			; 0000BDE8  E8B309  '...'
                  	mov	al,0x0			; 0000BDEB  B000  '..'
                  xbded:	push	ax			; 0000BDED  50  'P'
                  	call	xf32b			; 0000BDEE  E83A35  '.:5'
                  	cli				; 0000BDF1  FA  '.'
                  	mov	al,0x92			; 0000BDF2  B092  '..'
                  	out	0x4b,al			; 0000BDF4  E64B  '.K'
                  	pop	ax			; 0000BDF6  58  'X'
                  	cmp	al,0x0			; 0000BDF7  3C00  '<.'
                  	jz	xbdfd			; 0000BDF9  7402  't.'
                  	out	0x4a,al			; 0000BDFB  E64A  '.J'
                  xbdfd:	mov	word [0x72],0x1200	; 0000BDFD  C70672000012  '..r...'
                  	sti				; 0000BE03  FB  '.'
                  xbe04:	call	xc79e			; 0000BE04  E89709  '...'
                  	mov	al,0x2c			; 0000BE07  B02C  '.,'
                  	out	0x84,al			; 0000BE09  E684  '..'
                  	call	xf130			; 0000BE0B  E82233  '."3'
                  	int	0x19			; 0000BE0E  CD19  '..'
                  
                  xbe10:	mov	al,ah			; 0000BE10  8AC4  '..'
                  	and	al,0x7f			; 0000BE12  247F  '$.'
                  	push	cs			; 0000BE14  0E  '.'
                  	pop	es			; 0000BE15  07  '.'
                  	push	di			; 0000BE16  57  'W'
                  	mov	di,0xbf5c		; 0000BE17  BF5CBF  '.\.'
                  	mov	cx,0x8			; 0000BE1A  B90800  '...'
                  	repne	scasb			; 0000BE1D  F2AE  '..'
                  	pop	di			; 0000BE1F  5F  '_'
                  	clc				; 0000BE20  F8  '.'
                  	jz	xbe26			; 0000BE21  7403  't.'
                  	jmp	xbf5b			; 0000BE23  E93501  '.5.'
                  
                  xbe26:	cmp	ah,0x2a			; 0000BE26  80FC2A  '..*'
                  	jnz	xbe35			; 0000BE29  750A  'u',0x0A
                  	test	byte [0x96],0x2		; 0000BE2B  F606960002  '.....'
                  	jz	xbe35			; 0000BE30  7403  't.'
                  	jmp	xbf5a			; 0000BE32  E92501  '.%.'
                  
                  xbe35:	mov	bx,0x1000		; 0000BE35  BB0010  '...'
                  	rol	bx,cl			; 0000BE38  D3C3  '..'
                  	or	ah,ah			; 0000BE3A  0AE4  0x0A,'.'
                  	jns	xbeb9			; 0000BE3C  797B  'y{'
                  	cmp	ah,0xaa			; 0000BE3E  80FCAA  '...'
                  	jz	xbe48			; 0000BE41  7405  't.'
                  	cmp	ah,0xb6			; 0000BE43  80FCB6  '...'
                  	jnz	xbe52			; 0000BE46  750A  'u',0x0A
                  xbe48:	test	byte [0x96],0x2		; 0000BE48  F606960002  '.....'
                  	jz	xbe52			; 0000BE4D  7403  't.'
                  	jmp	xbf5a			; 0000BE4F  E90801  '...'
                  
                  xbe52:	not	bx			; 0000BE52  F7D3  '..'
                  	cmp	ah,0xb8			; 0000BE54  80FCB8  '...'
                  	jnz	xbe81			; 0000BE57  7528  'u('
                  	test	byte [0x96],0x2		; 0000BE59  F606960002  '.....'
                  	jz	xbe73			; 0000BE5E  7413  't.'
                  	and	byte [0x96],0xf7	; 0000BE60  80269600F7  '.&...'
                  	and	byte [0x96],0xfd	; 0000BE65  80269600FD  '.&...'
                  	test	byte [0x18],0x2		; 0000BE6A  F606180002  '.....'
                  	jz	xbeb3			; 0000BE6F  7442  'tB'
                  	jmp	short xbeb7		; 0000BE71  EB44  '.D'
                  
                  xbe73:	and	byte [0x18],0xfd	; 0000BE73  80261800FD  '.&...'
                  	test	byte [0x96],0x8		; 0000BE78  F606960008  '.....'
                  	jz	xbeb3			; 0000BE7D  7434  't4'
                  	jmp	short xbeb7		; 0000BE7F  EB36  '.6'
                  
                  xbe81:	cmp	ah,0x9d			; 0000BE81  80FC9D  '...'
                  	jnz	xbeb3			; 0000BE84  752D  'u-'
                  	test	byte [0x96],0x1		; 0000BE86  F606960001  '.....'
                  	jnz	xbeb7			; 0000BE8B  752A  'u*'
                  	test	byte [0x96],0x2		; 0000BE8D  F606960002  '.....'
                  	jz	xbea7			; 0000BE92  7413  't.'
                  	and	byte [0x96],0xfb	; 0000BE94  80269600FB  '.&...'
                  	and	byte [0x96],0xfd	; 0000BE99  80269600FD  '.&...'
                  	test	byte [0x18],0x1		; 0000BE9E  F606180001  '.....'
                  	jz	xbeb3			; 0000BEA3  740E  't.'
                  	jmp	short xbeb7		; 0000BEA5  EB10  '..'
                  
                  xbea7:	and	byte [0x18],0xfe	; 0000BEA7  80261800FE  '.&...'
                  	test	byte [0x96],0x4		; 0000BEAC  F606960004  '.....'
                  	jnz	xbeb7			; 0000BEB1  7504  'u.'
                  xbeb3:	and	[0x17],bx		; 0000BEB3  211E1700  '!...'
                  xbeb7:	stc				; 0000BEB7  F9  '.'
                  	ret				; 0000BEB8  C3  '.'
                  
                  xbeb9:	cmp	ah,0x38			; 0000BEB9  80FC38  '..8'
                  	jnz	xbedd			; 0000BEBC  751F  'u.'
                  	test	byte [0x96],0x2		; 0000BEBE  F606960002  '.....'
                  	jz	xbed1			; 0000BEC3  740C  't.'
                  	or	byte [0x96],0x8		; 0000BEC5  800E960008  '.....'
                  	and	byte [0x96],0xfd	; 0000BECA  80269600FD  '.&...'
                  	jmp	short xbed6		; 0000BECF  EB05  '..'
                  
                  xbed1:	or	byte [0x18],0x2		; 0000BED1  800E180002  '.....'
                  xbed6:	or	byte [0x17],0x8		; 0000BED6  800E170008  '.....'
                  	stc				; 0000BEDB  F9  '.'
                  	ret				; 0000BEDC  C3  '.'
                  
                  xbedd:	cmp	ah,0x1d			; 0000BEDD  80FC1D  '...'
                  	jnz	xbf08			; 0000BEE0  7526  'u&'
                  	test	byte [0x96],0x1		; 0000BEE2  F606960001  '.....'
                  	jnz	xbf06			; 0000BEE7  751D  'u.'
                  	test	byte [0x96],0x2		; 0000BEE9  F606960002  '.....'
                  	jz	xbefc			; 0000BEEE  740C  't.'
                  	or	byte [0x96],0x4		; 0000BEF0  800E960004  '.....'
                  	and	byte [0x96],0xfd	; 0000BEF5  80269600FD  '.&...'
                  	jmp	short xbf01		; 0000BEFA  EB05  '..'
                  
                  xbefc:	or	byte [0x18],0x1		; 0000BEFC  800E180001  '.....'
                  xbf01:	or	byte [0x17],0x4		; 0000BF01  800E170004  '.....'
                  xbf06:	stc				; 0000BF06  F9  '.'
                  	ret				; 0000BF07  C3  '.'
                  
                  xbf08:	test	[0x17],bx		; 0000BF08  851E1700  '....'
                  	jnz	xbf55			; 0000BF0C  7547  'uG'
                  	or	[0x17],bx		; 0000BF0E  091E1700  '....'
                  	test	byte [0x17],0x4		; 0000BF12  F606170004  '.....'
                  	jnz	xbf55			; 0000BF17  753C  'u<'
                  	cmp	ah,0x52			; 0000BF19  80FC52  '..R'
                  	jnz	xbf51			; 0000BF1C  7533  'u3'
                  	test	byte [0x17],0x8		; 0000BF1E  F606170008  '.....'
                  	jnz	xbf5b			; 0000BF23  7536  'u6'
                  	test	byte [0x17],0x3		; 0000BF25  F606170003  '.....'
                  	jz	xbf3c			; 0000BF2A  7410  't.'
                  	test	byte [0x96],0x2		; 0000BF2C  F606960002  '.....'
                  	jnz	xbf4a			; 0000BF31  7517  'u.'
                  	test	byte [0x17],0x20	; 0000BF33  F606170020  '.... '
                  	jz	xbf4a			; 0000BF38  7410  't.'
                  	jmp	short xbf51		; 0000BF3A  EB15  '..'
                  
                  xbf3c:	test	byte [0x96],0x2		; 0000BF3C  F606960002  '.....'
                  	jnz	xbf51			; 0000BF41  750E  'u.'
                  	test	byte [0x17],0x20	; 0000BF43  F606170020  '.... '
                  	jz	xbf51			; 0000BF48  7407  't.'
                  xbf4a:	and	byte [0x18],0x7f	; 0000BF4A  802618007F  '.&...'
                  	jmp	short xbf55		; 0000BF4F  EB04  '..'
                  
                  xbf51:	xor	[0x17],bh		; 0000BF51  303E1700  '0>..'
                  xbf55:	cmp	ah,0x52			; 0000BF55  80FC52  '..R'
                  	jz	xbf5b			; 0000BF58  7401  't.'
                  xbf5a:	stc				; 0000BF5A  F9  '.'
                  xbf5b:	ret				; 0000BF5B  C3  '.'
                  
                  	cmp	[di],bl			; 0000BF5C  381D  '8.'
                  	sub	dh,[0x3a52]		; 0000BF5E  2A36523A  '*6R:'
                  	inc	bp			; 0000BF62  45  'E'
                  	inc	si			; 0000BF63  46  'F'
                  xbf64:	test	byte [0x18],0x4		; 0000BF64  F606180004  '.....'
                  	jnz	xbf79			; 0000BF69  750E  'u.'
                  	or	byte [0x18],0x4		; 0000BF6B  800E180004  '.....'
                  	mov	ax,0x8500		; 0000BF70  B80085  '...'
                  xbf73:	call	xeb0c			; 0000BF73  E8962B  '..+'
                  	int	0x15			; 0000BF76  CD15  '..'
                  	inc	bp			; 0000BF78  45  'E'
                  xbf79:	stc				; 0000BF79  F9  '.'
                  	ret				; 0000BF7A  C3  '.'
                  
                  xbf7b:	and	byte [0x18],0xfb	; 0000BF7B  80261800FB  '.&...'
                  	mov	ax,0x8501		; 0000BF80  B80185  '...'
                  	jmp	short xbf73		; 0000BF83  EBEE  '..'
                  
                  xbf85:	mov	bx,0x7d			; 0000BF85  BB7D00  '.}.'
                  	call	xc7db			; 0000BF88  E85008  '.P.'
                  	stc				; 0000BF8B  F9  '.'
                  	ret				; 0000BF8C  C3  '.'
                  
                  	mov	ah,0xf0			; 0000BF8D  B4F0  '..'
                  	mov	al,0x3			; 0000BF8F  B003  '..'
                  	pushf				; 0000BF91  9C  '.'
                  	push	cs			; 0000BF92  0E  '.'
                  	call	xe82e			; 0000BF93  E89828  '..('
                  	mov	ah,0xf1			; 0000BF96  B4F1  '..'
                  	pushf				; 0000BF98  9C  '.'
                  	push	cs			; 0000BF99  0E  '.'
                  	call	xe82e			; 0000BF9A  E89128  '..('
                  	cmp	al,0xff			; 0000BF9D  3CFF  '<.'
                  	jz	0xbfc1			; 0000BF9F  7420  't '
                  	mov	bx,0x7d			; 0000BFA1  BB7D00  '.}.'
                  	push	ax			; 0000BFA4  50  'P'
                  	call	xc7db			; 0000BFA5  E83308  '.3.'
                  	pop	ax			; 0000BFA8  58  'X'
                  	cmp	al,0x0			; 0000BFA9  3C00  '<.'
                  	jz	xbfc1			; 0000BFAB  7414  't.'
                  	cmp	al,0x1			; 0000BFAD  3C01  '<.'
                  	jz	xbfc1			; 0000BFAF  7410  't.'
                  	cmp	al,0x9			; 0000BFB1  3C09  '<.'
                  	jz	xbfc1			; 0000BFB3  740C  't.'
                  	mov	bx,0x7d			; 0000BFB5  BB7D00  '.}.'
                  	call	xc638			; 0000BFB8  E87D06  '.}.'
                  	mov	bx,0x7d			; 0000BFBB  BB7D00  '.}.'
                  	call	xc7db			; 0000BFBE  E81A08  '...'
                  xbfc1:	stc				; 0000BFC1  F9  '.'
                  	ret				; 0000BFC2  C3  '.'
                  
                  xbfc3:	cmp	ah,0xff			; 0000BFC3  80FCFF  '...'
                  	jnz	xbfca			; 0000BFC6  7502  'u.'
                  	jmp	short xbf85		; 0000BFC8  EBBB  '..'
                  
                  xbfca:	cmp	ah,0x54			; 0000BFCA  80FC54  '..T'
                  	jnz	xbfd1			; 0000BFCD  7502  'u.'
                  	jmp	short xbf64		; 0000BFCF  EB93  '..'
                  
                  xbfd1:	cmp	ah,0xd4			; 0000BFD1  80FCD4  '...'
                  	jnz	xbfd8			; 0000BFD4  7502  'u.'
                  	jmp	short xbf7b		; 0000BFD6  EBA3  '..'
                  
                  xbfd8:	cmp	ah,0x45			; 0000BFD8  80FC45  '..E'
                  	jnz	xbfe0			; 0000BFDB  7503  'u.'
                  	jmp	short xc02e		; 0000BFDD  EB4F  '.O'
                  
                  	nop				; 0000BFDF  90  '.'
                  xbfe0:	cmp	ah,0xb8			; 0000BFE0  80FCB8  '...'
                  	jnz	xbfe8			; 0000BFE3  7503  'u.'
                  	jmp	xc07f			; 0000BFE5  E99700  '...'
                  
                  xbfe8:	cmp	ah,0x37			; 0000BFE8  80FC37  '..7'
                  	jnz	xbff0			; 0000BFEB  7503  'u.'
                  	jmp	xc09b			; 0000BFED  E9AB00  '...'
                  
                  xbff0:	cmp	ah,0x52			; 0000BFF0  80FC52  '..R'
                  	jnz	xbff8			; 0000BFF3  7503  'u.'
                  	jmp	xc0cb			; 0000BFF5  E9D300  '...'
                  
                  xbff8:	cmp	ah,0x46			; 0000BFF8  80FC46  '..F'
                  	jnz	xc000			; 0000BFFB  7503  'u.'
                  	jmp	xc0d6			; 0000BFFD  E9D600  '...'
                  
                  xc000:	call	xc24c			; 0000C000  E84902  '.I.'
                  	jz	xc02c			; 0000C003  7427  't',0x27
                  	cmp	ah,[0x15]		; 0000C005  3A261500  ':&..'
                  	jz	xc07d			; 0000C009  7472  'tr'
                  	cmp	ah,0x53			; 0000C00B  80FC53  '..S'
                  	jnz	xc013			; 0000C00E  7503  'u.'
                  	jmp	xc093			; 0000C010  E98000  '...'
                  
                  xc013:	cmp	ah,0xc			; 0000C013  80FC0C  '...'
                  	jz	xc090			; 0000C016  7478  'tx'
                  	cmp	ah,0x33			; 0000C018  80FC33  '..3'
                  	jnz	xc022			; 0000C01B  7505  'u.'
                  	mov	al,0x0			; 0000C01D  B000  '..'
                  	jmp	xc11e			; 0000C01F  E9FC00  '...'
                  
                  xc022:	cmp	ah,0x34			; 0000C022  80FC34  '..4'
                  	jnz	xc02c			; 0000C025  7505  'u.'
                  	mov	al,0x1			; 0000C027  B001  '..'
                  	jmp	xc11e			; 0000C029  E9F200  '...'
                  
                  xc02c:	clc				; 0000C02C  F8  '.'
                  	ret				; 0000C02D  C3  '.'
                  
                  xc02e:	test	byte [0x96],0x1		; 0000C02E  F606960001  '.....'
                  	jnz	xc04f			; 0000C033  751A  'u.'
                  	test	byte [0x17],0x4		; 0000C035  F606170004  '.....'
                  	jz	xc02c			; 0000C03A  74F0  't.'
                  	test	byte [0x17],0x8		; 0000C03C  F606170008  '.....'
                  	jz	xc046			; 0000C041  7403  't.'
                  	jmp	xc0e4			; 0000C043  E99E00  '...'
                  
                  xc046:	test	byte [0x96],0x10	; 0000C046  F606960010  '.....'
                  	jnz	xc02c			; 0000C04B  75DF  'u.'
                  	jmp	short xc054		; 0000C04D  EB05  '..'
                  
                  xc04f:	and	byte [0x96],0xfe	; 0000C04F  80269600FE  '.&...'
                  xc054:	or	byte [0x18],0x8		; 0000C054  800E180008  '.....'
                  	cli				; 0000C059  FA  '.'
                  	call	xeb0c			; 0000C05A  E8AF2A  '..*'
                  	inc	bp			; 0000C05D  45  'E'
                  	sti				; 0000C05E  FB  '.'
                  	cmp	byte [0x49],0x2		; 0000C05F  803E490002  '.>I..'
                  	jz	xc06d			; 0000C064  7407  't.'
                  	cmp	byte [0x49],0x3		; 0000C066  803E490003  '.>I..'
                  	jnz	xc076			; 0000C06B  7509  'u.'
                  xc06d:	push	ax			; 0000C06D  50  'P'
                  	mov	ax,0xbf05		; 0000C06E  B805BF  '...'
                  	mov	bl,0x1			; 0000C071  B301  '..'
                  	int	0x10			; 0000C073  CD10  '..'
                  	pop	ax			; 0000C075  58  'X'
                  xc076:	test	byte [0x18],0x8		; 0000C076  F606180008  '.....'
                  	jnz	xc076			; 0000C07B  75F9  'u.'
                  xc07d:	stc				; 0000C07D  F9  '.'
                  	ret				; 0000C07E  C3  '.'
                  
                  xc07f:	push	ax			; 0000C07F  50  'P'
                  	xor	ax,ax			; 0000C080  33C0  '3.'
                  	xchg	al,[0x19]		; 0000C082  86061900  '....'
                  	test	al,al			; 0000C086  84C0  '..'
                  	jz	xc08d			; 0000C088  7403  't.'
                  	call	xd3b4			; 0000C08A  E82713  '.',0x27,'.'
                  xc08d:	pop	ax			; 0000C08D  58  'X'
                  	jmp	short xc02c		; 0000C08E  EB9C  '..'
                  
                  xc090:	jmp	xb673			; 0000C090  E9E0F5  '...'
                  
                  xc093:	cli				; 0000C093  FA  '.'
                  	call	xeb0c			; 0000C094  E8752A  '.u*'
                  	sti				; 0000C097  FB  '.'
                  	jmp	xea81			; 0000C098  E9E629
                  
                  xc09b:	test	byte [0x96],0x10	; 0000C09B  F606960010  '.....'
                  	jz	xc0b7			; 0000C0A0  7415  't.'
                  	test	byte [0x96],0x2		; 0000C0A2  F606960002  '.....'
                  	jz	xc0be			; 0000C0A7  7415  't.'
                  	test	byte [0x17],0x4		; 0000C0A9  F606170004  '.....'
                  	jnz	xc0be			; 0000C0AE  750E  'u.'
                  	and	byte [0x96],0xfd	; 0000C0B0  80269600FD  '.&...'
                  	jmp	short xc0c1		; 0000C0B5  EB0A  '.',0x0A
                  
                  xc0b7:	test	byte [0x17],0x3		; 0000C0B7  F606170003  '.....'
                  	jnz	xc0c1			; 0000C0BC  7503  'u.'
                  xc0be:	jmp	xc02c			; 0000C0BE  E96BFF  '.k.'
                  
                  xc0c1:	cli				; 0000C0C1  FA  '.'
                  	call	xeb0c			; 0000C0C2  E8472A  '.G*'
                  	inc	bp			; 0000C0C5  45  'E'
                  	int	0x5			; 0000C0C6  CD05  '..'
                  	sti				; 0000C0C8  FB  '.'
                  	stc				; 0000C0C9  F9  '.'
                  	ret				; 0000C0CA  C3  '.'
                  
                  xc0cb:	test	byte [0x18],0x80	; 0000C0CB  F606180080  '.....'
                  	jz	xc0d4			; 0000C0D0  7402  't.'
                  	stc				; 0000C0D2  F9  '.'
                  	ret				; 0000C0D3  C3  '.'
                  
                  xc0d4:	clc				; 0000C0D4  F8  '.'
                  	ret				; 0000C0D5  C3  '.'
                  
                  xc0d6:	test	byte [0x17],0x4		; 0000C0D6  F606170004  '.....'
                  	jz	xc0d4			; 0000C0DB  74F7  't.'
                  	test	byte [0x17],0x8		; 0000C0DD  F606170008  '.....'
                  	jz	xc0d4			; 0000C0E2  74F0  't.'
                  xc0e4:	mov	al,0xf2			; 0000C0E4  B0F2  '..'
                  	jmp	xc17f			; 0000C0E6  E99600  '...'
                  
                  xc0e9:	test	byte [0x17],0x4		; 0000C0E9  F606170004  '.....'
                  	jz	xc0d4			; 0000C0EE  74E4  't.'
                  	test	byte [0x17],0x8		; 0000C0F0  F606170008  '.....'
                  	jnz	xc0d4			; 0000C0F5  75DD  'u.'
                  	test	byte [0x96],0x10	; 0000C0F7  F606960010  '.....'
                  	jz	xc10a			; 0000C0FC  740C  't.'
                  	test	byte [0x96],0x2		; 0000C0FE  F606960002  '.....'
                  	jz	xc0d4			; 0000C103  74CF  't.'
                  	and	byte [0x96],0xfd	; 0000C105  80269600FD  '.&...'
                  xc10a:	or	byte [0x71],0x80	; 0000C10A  800E710080  '..q..'
                  	call	xc259			; 0000C10F  E84701  '.G.'
                  	cli				; 0000C112  FA  '.'
                  	call	xeb0c			; 0000C113  E8F629  '..)'
                  	inc	bp			; 0000C116  45  'E'
                  	sti				; 0000C117  FB  '.'
                  	int	0x1b			; 0000C118  CD1B  '..'
                  	xor	ax,ax			; 0000C11A  33C0  '3.'
                  	jmp	short xc183		; 0000C11C  EB65  '.e'
                  
                  xc11e:	mov	ah,0xbf			; 0000C11E  B4BF  '..'
                  	int	0x10			; 0000C120  CD10  '..'
                  	xor	bp,bp			; 0000C122  33ED  '3.'
                  	stc				; 0000C124  F9  '.'
                  	ret				; 0000C125  C3  '.'
                  
                  	jmp	xc02c			; 0000C126  E903FF  '...'
                  
                  xc129:	or	ah,ah			; 0000C129  0AE4  0x0A,'.'
                  	js	xc160			; 0000C12B  7833  'x3'
                  	cmp	ah,0x3b			; 0000C12D  80FC3B  '..;'
                  	jl	xc160			; 0000C130  7C2E  '|.'
                  	cmp	ah,0x44			; 0000C132  80FC44  '..D'
                  	jng	xc162			; 0000C135  7E2B  '~+'
                  	cmp	ah,0x57			; 0000C137  80FC57  '..W'
                  	jz	xc141			; 0000C13A  7405  't.'
                  	cmp	ah,0x58			; 0000C13C  80FC58  '..X'
                  	jnz	xc160			; 0000C13F  751F  'u.'
                  xc141:	mov	al,0x34			; 0000C141  B034  '.4'
                  	test	byte [0x17],0x8		; 0000C143  F606170008  '.....'
                  	jnz	xc17f			; 0000C148  7535  'u5'
                  	mov	al,0x32			; 0000C14A  B032  '.2'
                  	test	byte [0x17],0x4		; 0000C14C  F606170004  '.....'
                  	jnz	xc17f			; 0000C151  752C  'u,'
                  	mov	al,0x30			; 0000C153  B030  '.0'
                  	test	byte [0x17],0x3		; 0000C155  F606170003  '.....'
                  	jnz	xc17f			; 0000C15A  7523  'u#'
                  	mov	al,0x2e			; 0000C15C  B02E  '..'
                  	jmp	short xc17f		; 0000C15E  EB1F  '..'
                  
                  xc160:	clc				; 0000C160  F8  '.'
                  	ret				; 0000C161  C3  '.'
                  
                  xc162:	mov	al,0x2d			; 0000C162  B02D  '.-'
                  	test	byte [0x17],0x8		; 0000C164  F606170008  '.....'
                  	jnz	xc17f			; 0000C169  7514  'u.'
                  	mov	al,0x23			; 0000C16B  B023  '.#'
                  	test	byte [0x17],0x4		; 0000C16D  F606170004  '.....'
                  	jnz	xc17f			; 0000C172  750B  'u.'
                  	mov	al,0x19			; 0000C174  B019  '..'
                  	test	byte [0x17],0x3		; 0000C176  F606170003  '.....'
                  	jnz	xc17f			; 0000C17B  7502  'u.'
                  	xor	al,al			; 0000C17D  32C0  '2.'
                  xc17f:	add	ah,al			; 0000C17F  02E0  '..'
                  	xor	al,al			; 0000C181  32C0  '2.'
                  xc183:	call	xd3b4			; 0000C183  E82E12  '...'
                  	stc				; 0000C186  F9  '.'
                  	ret				; 0000C187  C3  '.'
                  
                  xc188:	or	ah,ah			; 0000C188  0AE4  0x0A,'.'
                  	js	xc19b			; 0000C18A  780F  'x.'
                  	mov	al,ah			; 0000C18C  8AC4  '..'
                  	cmp	al,0x47			; 0000C18E  3C47  '<G'
                  	jl	xc196			; 0000C190  7C04  '|.'
                  	cmp	al,0x53			; 0000C192  3C53  '<S'
                  	jng	xc19d			; 0000C194  7E07  '~.'
                  xc196:	mov	byte [0x19],0x0		; 0000C196  C606190000  '.....'
                  xc19b:	clc				; 0000C19B  F8  '.'
                  	ret				; 0000C19C  C3  '.'
                  
                  xc19d:	mov	al,ah			; 0000C19D  8AC4  '..'
                  	sub	al,0x47			; 0000C19F  2C47  ',G'
                  	mov	bx,0x9b81		; 0000C1A1  BB819B  '...'
                  	cs	xlatb			; 0000C1A4  2ED7  '..'
                  	test	byte [0x17],0x8		; 0000C1A6  F606170008  '.....'
                  	jnz	xc202			; 0000C1AB  7555  'uU'
                  	mov	si,0x9b8e		; 0000C1AD  BE8E9B  '...'
                  	test	byte [0x17],0x4		; 0000C1B0  F606170004  '.....'
                  	jnz	xc1f9			; 0000C1B5  7542  'uB'
                  	test	byte [0x17],0x3		; 0000C1B7  F606170003  '.....'
                  	jnz	xc1f0			; 0000C1BC  7532
                  	test	byte [0x17],0x20	; 0000C1BE  F606170020  '.... '
                  	jnz	xc1db			; 0000C1C3  7516  'u.'
                  	test	byte [0x96],0x2		; 0000C1C5  F606960002  '.....'
                  	jnz	xc1d9			; 0000C1CA  750D  'u',0x0D
                  xc1cc:	cmp	al,0x2e			; 0000C1CC  3C2E  '<.'
                  	jl	xc1db			; 0000C1CE  7C0B  '|.'
                  	cmp	ah,0x4c			; 0000C1D0  80FC4C  '..L'
                  	jnz	xc1d9			; 0000C1D3  7504  'u.'
                  	mov	al,0xf0			; 0000C1D5  B0F0  '..'
                  	jmp	short xc1db		; 0000C1D7  EB02  '..'
                  
                  xc1d9:	xor	al,al			; 0000C1D9  32C0  '2.'
                  xc1db:	test	byte [0x96],0x2		; 0000C1DB  F606960002  '.....'
                  	jz	xc1e9			; 0000C1E0  7407  't.'
                  	and	byte [0x96],0xfd	; 0000C1E2  80269600FD  '.&...'
                  	mov	al,0xe0			; 0000C1E7  B0E0  '..'
                  xc1e9:	call	xd3b4			; 0000C1E9  E8C811  '...'
                  xc1ec:	xor	al,al			; 0000C1EC  32C0  '2.'
                  	jmp	short xc233		; 0000C1EE  EB43  '.C'
                  
                  xc1f0:	test	byte [0x17],0x20	; 0000C1F0  F606170020  '.... '
                  	jnz	xc1cc			; 0000C1F5  75D5  'u.'
                  	jmp	short xc1db		; 0000C1F7  EBE2  '..'
                  
                  xc1f9:	call	x9b08			; 0000C1F9  E80CD9  '...'
                  	mov	ah,al			; 0000C1FC  8AE0  '..'
                  	jc	xc1d9			; 0000C1FE  72D9  'r.'
                  	jmp	short xc236		; 0000C200  EB34  '.4'
                  
                  xc202:	test	byte [0x96],0x2		; 0000C202  F606960002  '.....'
                  	jnz	xc238			; 0000C207  752F  'u/'
                  	cmp	al,0x2e			; 0000C209  3C2E  '<.'
                  	jz	xc196			; 0000C20B  7489  't.'
                  	cmp	al,0x2b			; 0000C20D  3C2B  '<+'
                  	jnz	xc21b			; 0000C20F  750A  'u',0x0A
                  	call	xc24c			; 0000C211  E83800  '.8.'
                  	jnz	xc1ec			; 0000C214  75D6  'u.'
                  	mov	ax,0x4ef0		; 0000C216  B8F04E  '..N'
                  	jmp	short xc1e9		; 0000C219  EBCE  '..'
                  
                  xc21b:	cmp	al,0x2d			; 0000C21B  3C2D  '<-'
                  	jnz	xc229			; 0000C21D  750A  'u',0x0A
                  	call	xc24c			; 0000C21F  E82A00  '.*.'
                  	jnz	xc1ec			; 0000C222  75C8  'u.'
                  	mov	ax,0x4af0		; 0000C224  B8F04A  '..J'
                  	jmp	short xc1e9		; 0000C227  EBC0  '..'
                  
                  xc229:	sub	al,0x30			; 0000C229  2C30  ',0'
                  	jl	xc1ec			; 0000C22B  7CBF  '|.'
                  	mov	ah,[0x19]		; 0000C22D  8A261900  '.&..'
                  	aad				; 0000C231  D50A  '.',0x0A
                  xc233:	mov	[0x19],al		; 0000C233  A21900  '...'
                  xc236:	stc				; 0000C236  F9  '.'
                  	ret				; 0000C237  C3  '.'
                  
                  xc238:	and	byte [0x96],0xfd	; 0000C238  80269600FD  '.&...'
                  	mov	si,0x9bb8		; 0000C23D  BEB89B  '...'
                  	jmp	short xc1f9		; 0000C240  EBB7  '..'
                  
                  xc242:	mov	si,[0x1a]		; 0000C242  8B361A00  '.6..'
                  	cmp	si,[0x1c]		; 0000C246  3B361C00  ';6..'
                  	lodsw				; 0000C24A  AD  '.'
                  	ret				; 0000C24B  C3  '.'
                  
                  xc24c:	test	byte [0x17],0x8		; 0000C24C  F606170008  '.....'
                  	jz	xc258			; 0000C251  7405  't.'
                  	test	byte [0x17],0x4		; 0000C253  F606170004  '.....'
                  xc258:	ret				; 0000C258  C3  '.'
                  
                  xc259:	pushf				; 0000C259  9C  '.'
                  	cli				; 0000C25A  FA  '.'
                  	mov	ax,[0x80]		; 0000C25B  A18000  '...'
                  	mov	[0x1a],ax		; 0000C25E  A31A00  '...'
                  	mov	[0x1c],ax		; 0000C261  A31C00  '...'
                  	push	cs			; 0000C264  0E  '.'
                  	call	xc26b			; 0000C265  E80300  '...'
                  	jmp	short xc26c		; 0000C268  EB02  '..'
                  
                  	nop				; 0000C26A  90  '.'
                  
                  xc26b:	iret				; 0000C26B  CF  '.'
                  
                  xc26c:	ret				; 0000C26C  C3  '.'
                  
                  	call	x8da9			; 0000C26D  E839CB  '.9.'
                  	jz	xc29d			; 0000C270  742B  't+'
                  	mov	ah,[0x49]		; 0000C272  8A264900  '.&I.'
                  	cmp	ah,0x4			; 0000C276  80FC04  '...'
                  	jc	xc280			; 0000C279  7205  'r.'
                  	sub	ah,0x6			; 0000C27B  80EC06  '...'
                  	jna	xc2b5			; 0000C27E  7635  'v5'
                  xc280:	call	xc32b			; 0000C280  E8A800  '...'
                  	mov	dx,[0x63]		; 0000C283  8B166300  '..c.'
                  	add	dx,byte +0x6		; 0000C287  83C206  '...'
                  xc28a:	in	al,dx			; 0000C28A  EC  '.'
                  	test	al,0x1			; 0000C28B  A801  '..'
                  	jnz	xc28a			; 0000C28D  75FB  'u.'
                  	cli				; 0000C28F  FA  '.'
                  xc290:	in	al,dx			; 0000C290  EC  '.'
                  	test	al,0x1			; 0000C291  A801  '..'
                  	jz	xc290			; 0000C293  74FB  't.'
                  	mov	ax,[es:di]		; 0000C295  268B05  '&..'
                  	mov	[bp+0x0],ax		; 0000C298  894600  '.F.'
                  	sti				; 0000C29B  FB  '.'
                  	ret				; 0000C29C  C3  '.'
                  
                  xc29d:	mov	ah,[0x49]		; 0000C29D  8A264900  '.&I.'
                  	cmp	ah,0x4			; 0000C2A1  80FC04  '...'
                  	jc	xc2ab			; 0000C2A4  7205  'r.'
                  	sub	ah,0x6			; 0000C2A6  80EC06  '...'
                  	jna	xc2b5			; 0000C2A9  760A  'v',0x0A
                  xc2ab:	call	xc32b			; 0000C2AB  E87D00  '.}.'
                  	mov	ax,[es:di]		; 0000C2AE  268B05  '&..'
                  	mov	[bp+0x0],ax		; 0000C2B1  894600  '.F.'
                  	ret				; 0000C2B4  C3  '.'
                  
                  xc2b5:	call	xc34d			; 0000C2B5  E89500  '...'
                  	mov	cx,es			; 0000C2B8  8CC1  '..'
                  	mov	ds,cx			; 0000C2BA  8ED9  '..'
                  	mov	si,di			; 0000C2BC  8BF7  '..'
                  	mov	cx,ss			; 0000C2BE  8CD1  '..'
                  	mov	es,cx			; 0000C2C0  8EC1  '..'
                  	sub	sp,byte +0x8		; 0000C2C2  83EC08  '...'
                  	mov	di,sp			; 0000C2C5  8BFC  '..'
                  	mov	bh,0x4			; 0000C2C7  B704  '..'
                  xc2c9:	mov	bl,0x2			; 0000C2C9  B302  '..'
                  xc2cb:	mov	al,[si]			; 0000C2CB  8A04  '..'
                  	sar	ah,1			; 0000C2CD  D0FC  '..'
                  	jns	xc2e4			; 0000C2CF  7913  'y.'
                  	mov	dh,al			; 0000C2D1  8AF0  '..'
                  	mov	dl,[si+0x1]		; 0000C2D3  8A5401  '.T.'
                  	mov	cx,0x8			; 0000C2D6  B90800  '...'
                  xc2d9:	shl	dx,1			; 0000C2D9  D1E2  '..'
                  	jns	xc2de			; 0000C2DB  7901  'y.'
                  	stc				; 0000C2DD  F9  '.'
                  xc2de:	rcl	al,1			; 0000C2DE  D0D0  '..'
                  	shl	dx,1			; 0000C2E0  D1E2  '..'
                  	loop	xc2d9			; 0000C2E2  E2F5  '..'
                  xc2e4:	stosb				; 0000C2E4  AA  '.'
                  	xor	si,0x2000		; 0000C2E5  81F60020  '... '
                  	dec	bl			; 0000C2E9  FECB  '..'
                  	jnz	xc2cb			; 0000C2EB  75DE  'u.'
                  	add	si,byte +0x50		; 0000C2ED  83C650  '..P'
                  	dec	bh			; 0000C2F0  FECF  '..'
                  	jnz	xc2c9			; 0000C2F2  75D5  'u.'
                  	mov	ax,cs			; 0000C2F4  8CC8  '..'
                  	mov	ds,ax			; 0000C2F6  8ED8  '..'
                  	mov	si,0xfa6e		; 0000C2F8  BE6EFA  '.n.'
                  	mov	di,sp			; 0000C2FB  8BFC  '..'
                  	call	xc369			; 0000C2FD  E86900  '.i.'
                  	jnc	xc324			; 0000C300  7322  's"'
                  	xor	ax,ax			; 0000C302  33C0  '3.'
                  	mov	ds,ax			; 0000C304  8ED8  '..'
                  	lds	si,[0x7c]		; 0000C306  C5367C00  '.6|.'
                  	push	ax			; 0000C30A  50  'P'
                  	push	bx			; 0000C30B  53  'S'
                  	mov	ax,cs			; 0000C30C  8CC8  '..'
                  	mov	bx,ds			; 0000C30E  8CDB  '..'
                  	cmp	ax,bx			; 0000C310  3BC3  ';.'
                  	pop	bx			; 0000C312  5B  '['
                  	pop	ax			; 0000C313  58  'X'
                  	jnz	xc31b			; 0000C314  7505  'u.'
                  	cmp	si,byte +0x0		; 0000C316  83FE00  '...'
                  	jz	xc324			; 0000C319  7409  't.'
                  xc31b:	mov	di,sp			; 0000C31B  8BFC  '..'
                  	call	xc369			; 0000C31D  E84900  '.I.'
                  	jc	xc324			; 0000C320  7202  'r.'
                  	add	al,0x80			; 0000C322  0480  '..'
                  xc324:	add	sp,byte +0x8		; 0000C324  83C408  '...'
                  	mov	[bp+0x0],ax		; 0000C327  894600  '.F.'
                  	ret				; 0000C32A  C3  '.'
                  
                  xc32b:	mov	di,ax			; 0000C32B  8BF8  '..'
                  	mov	bl,bh			; 0000C32D  8ADF  '..'
                  	xor	bh,bh			; 0000C32F  32FF  '2.'
                  	mov	ax,[0x4c]		; 0000C331  A14C00  '.L.'
                  	mul	bx			; 0000C334  F7E3  '..'
                  	mov	dx,ax			; 0000C336  8BD0  '..'
                  	shl	bx,1			; 0000C338  D1E3  '..'
                  	mov	bx,[bx+0x50]		; 0000C33A  8B9F5000  '..P.'
                  	mov	al,[0x4a]		; 0000C33E  A04A00  '.J.'
                  	mul	bh			; 0000C341  F6E7  '..'
                  	xor	bh,bh			; 0000C343  32FF  '2.'
                  	add	ax,bx			; 0000C345  03C3  '..'
                  	shl	ax,1			; 0000C347  D1E0  '..'
                  	add	ax,dx			; 0000C349  03C2  '..'
                  	xchg	ax,di			; 0000C34B  97  '.'
                  	ret				; 0000C34C  C3  '.'
                  
                  xc34d:	mov	bx,[0x50]		; 0000C34D  8B1E5000  '..P.'
                  	xor	dx,dx			; 0000C351  33D2  '3.'
                  	xchg	bl,dl			; 0000C353  86DA  '..'
                  	mov	di,bx			; 0000C355  8BFB  '..'
                  	shr	di,1			; 0000C357  D1EF  '..'
                  	shr	di,1			; 0000C359  D1EF  '..'
                  	add	di,bx			; 0000C35B  03FB  '..'
                  	test	byte [0x49],0x2		; 0000C35D  F606490002  '..I..'
                  	jnz	xc366			; 0000C362  7502  'u.'
                  	shl	dx,1			; 0000C364  D1E2  '..'
                  xc366:	add	di,dx			; 0000C366  03FA  '..'
                  	ret				; 0000C368  C3  '.'
                  
                  xc369:	mov	ax,si			; 0000C369  8BC6  '..'
                  	mov	bx,di			; 0000C36B  8BDF  '..'
                  	xor	ch,ch			; 0000C36D  32ED  '2.'
                  	mov	dx,0x80			; 0000C36F  BA8000  '...'
                  	push	si			; 0000C372  56  'V'
                  xc373:	mov	si,ax			; 0000C373  8BF0  '..'
                  	mov	di,bx			; 0000C375  8BFB  '..'
                  	mov	cl,0x4			; 0000C377  B104  '..'
                  	repe	cmpsw			; 0000C379  F3A7  '..'
                  	jz	xc388			; 0000C37B  740B  't.'
                  	add	ax,0x8			; 0000C37D  050800  '...'
                  	dec	dx			; 0000C380  4A  'J'
                  	jnz	xc373			; 0000C381  75F0  'u.'
                  	pop	si			; 0000C383  5E  '^'
                  	xor	ax,ax			; 0000C384  33C0  '3.'
                  	stc				; 0000C386  F9  '.'
                  	ret				; 0000C387  C3  '.'
                  
                  xc388:	pop	si			; 0000C388  5E  '^'
                  	sub	ax,si			; 0000C389  2BC6  '+.'
                  	mov	cl,0x3			; 0000C38B  B103  '..'
                  	shr	ax,cl			; 0000C38D  D3E8  '..'
                  	ret				; 0000C38F  C3  '.'
                  
                  xc390:	mov	ax,0x40			; 0000C390  B84000  '.@.'
                  	mov	ds,ax			; 0000C393  8ED8  '..'
                  	mov	al,0xb0			; 0000C395  B0B0  '..'
                  	out	0x84,al			; 0000C397  E684  '..'
                  	xor	al,al			; 0000C399  32C0  '2.'
                  	mov	[0x75],al		; 0000C39B  A27500  '.u.'
                  	mov	[0x8e],al		; 0000C39E  A28E00  '...'
                  	mov	dx,0x1f2		; 0000C3A1  BAF201  '...'
                  	mov	al,0x55			; 0000C3A4  B055  '.U'
                  	out	dx,al			; 0000C3A6  EE  '.'
                  	xor	al,al			; 0000C3A7  32C0  '2.'
                  	in	al,dx			; 0000C3A9  EC  '.'
                  	cmp	al,0x55			; 0000C3AA  3C55  '<U'
                  	jz	xc3b4			; 0000C3AC  7406  't.'
                  	mov	al,0xb1			; 0000C3AE  B0B1  '..'
                  	out	0x84,al			; 0000C3B0  E684  '..'
                  	jmp	short xc3c1		; 0000C3B2  EB0D  '.',0x0D
                  
                  xc3b4:	or	byte [0x8b],0x1		; 0000C3B4  800E8B0001  '.....'
                  	call	xc4a0			; 0000C3B9  E8E400  '...'
                  	jc	xc3c1			; 0000C3BC  7203  'r.'
                  	call	xc3c6			; 0000C3BE  E80500  '...'
                  xc3c1:	mov	al,0xb8			; 0000C3C1  B0B8  '..'
                  	out	0x84,al			; 0000C3C3  E684  '..'
                  	ret				; 0000C3C5  C3  '.'
                  
                  xc3c6:	push	es			; 0000C3C6  06  '.'
                  	call	xc565			; 0000C3C7  E89B01  '...'
                  	jnc	xc3e1			; 0000C3CA  7315  's.'
                  	mov	al,0xb2			; 0000C3CC  B0B2  '..'
                  	out	0x84,al			; 0000C3CE  E684  '..'
                  	mov	bx,0xba00		; 0000C3D0  BB00BA  '...'
                  	mov	cx,0x1e			; 0000C3D3  B91E00  '...'
                  	mov	dx,0x0			; 0000C3D6  BA0000  '...'
                  	call	xc745			; 0000C3D9  E86903  '.i.'
                  	call	xc591			; 0000C3DC  E8B201  '...'
                  	jmp	short xc40c		; 0000C3DF  EB2B  '.+'
                  
                  xc3e1:	mov	al,0xb3			; 0000C3E1  B0B3  '..'
                  	out	0x84,al			; 0000C3E3  E684  '..'
                  	xor	ax,ax			; 0000C3E5  33C0  '3.'
                  	mov	es,ax			; 0000C3E7  8EC0  '..'
                  	les	di,[es:0x104]		; 0000C3E9  26C43E0401  '&.>..'
                  	mov	dl,0x80			; 0000C3EE  B280  '..'
                  	call	xc40e			; 0000C3F0  E81B00  '...'
                  	cmp	byte [0x75],0x2		; 0000C3F3  803E750002  '.>u..'
                  	jc	xc40c			; 0000C3F8  7212  'r.'
                  	mov	al,0xb4			; 0000C3FA  B0B4  '..'
                  	out	0x84,al			; 0000C3FC  E684  '..'
                  	xor	ax,ax			; 0000C3FE  33C0  '3.'
                  	mov	es,ax			; 0000C400  8EC0  '..'
                  	les	di,[es:0x118]		; 0000C402  26C43E1801  '&.>..'
                  	mov	dl,0x81			; 0000C407  B281  '..'
                  	call	xc40e			; 0000C409  E80200  '...'
                  xc40c:	pop	es			; 0000C40C  07  '.'
                  	ret				; 0000C40D  C3  '.'
                  
                  xc40e:	mov	bh,0x5			; 0000C40E  B705  '..'
                  xc410:	mov	bl,0x2			; 0000C410  B302  '..'
                  xc412:	mov	cx,0x7a12		; 0000C412  B9127A  '..z'
                  xc415:	mov	ah,0x10			; 0000C415  B410  '..'
                  	int	0x13			; 0000C417  CD13  '..'
                  	jnc	xc42c			; 0000C419  7311  's.'
                  	push	dx			; 0000C41B  52  'R'
                  	mov	dx,0x1f7		; 0000C41C  BAF701  '...'
                  	in	al,dx			; 0000C41F  EC  '.'
                  	pop	dx			; 0000C420  5A  'Z'
                  	test	al,0x80			; 0000C421  A880  '..'
                  	jnz	xc43d			; 0000C423  7518  'u.'
                  	cmp	ah,0x80			; 0000C425  80FC80  '...'
                  	jz	xc439			; 0000C428  740F  't.'
                  	jmp	short xc430		; 0000C42A  EB04  '..'
                  
                  xc42c:	test	al,0x10			; 0000C42C  A810  '..'
                  	jnz	xc442			; 0000C42E  7512  'u.'
                  xc430:	call	x919a			; 0000C430  E867CD  '.g.'
                  	loop	xc415			; 0000C433  E2E0  '..'
                  	dec	bl			; 0000C435  FECB  '..'
                  	jnz	xc412			; 0000C437  75D9  'u.'
                  xc439:	dec	bh			; 0000C439  FECF  '..'
                  	jnz	xc410			; 0000C43B  75D3  'u.'
                  xc43d:	call	xc549			; 0000C43D  E80901  '...'
                  	jmp	short xc49e		; 0000C440  EB5C  '.\'
                  
                  xc442:	mov	ah,0x9			; 0000C442  B409  '..'
                  	int	0x13			; 0000C444  CD13  '..'
                  	jc	xc43d			; 0000C446  72F5  'r.'
                  	mov	ah,0x11			; 0000C448  B411  '..'
                  	int	0x13			; 0000C44A  CD13  '..'
                  	jc	xc49b			; 0000C44C  724D  'rM'
                  	push	dx			; 0000C44E  52  'R'
                  	mov	ax,[es:di]		; 0000C44F  268B05  '&..'
                  	sub	ax,0x2			; 0000C452  2D0200  '-..'
                  	mov	ch,al			; 0000C455  8AE8  '..'
                  	mov	cl,ah			; 0000C457  8ACC  '..'
                  	shl	cl,0x6			; 0000C459  C0E106  '...'
                  	or	cl,0x1			; 0000C45C  80C901  '...'
                  	and	ah,0xc			; 0000C45F  80E40C  '...'
                  	shl	ah,0x4			; 0000C462  C0E404  '...'
                  	mov	dl,ah			; 0000C465  8AD4  '..'
                  	pop	ax			; 0000C467  58  'X'
                  	or	dl,al			; 0000C468  0AD0  0x0A,'.'
                  	mov	dh,[es:di+0x2]		; 0000C46A  268A7502  '&.u.'
                  	dec	dh			; 0000C46E  FECE  '..'
                  xc470:	mov	ax,0x401		; 0000C470  B80104  '...'
                  	int	0x13			; 0000C473  CD13  '..'
                  	jnc	xc492			; 0000C475  731B  's.'
                  	cmp	ah,0xa			; 0000C477  80FC0A  '..',0x0A
                  	jz	xc492			; 0000C47A  7416  't.'
                  	cmp	ah,0x11			; 0000C47C  80FC11  '...'
                  	jz	xc492			; 0000C47F  7411  't.'
                  	cmp	ah,0x10			; 0000C481  80FC10  '...'
                  	jz	xc492			; 0000C484  740C  't.'
                  	mov	al,cl			; 0000C486  8AC1  '..'
                  	and	al,0x11			; 0000C488  2411  '$.'
                  	cmp	al,0x11			; 0000C48A  3C11  '<.'
                  	jz	xc49b			; 0000C48C  740D  't',0x0D
                  	inc	cl			; 0000C48E  FEC1  '..'
                  	jmp	short xc470		; 0000C490  EBDE  '..'
                  
                  xc492:	mov	cx,0x1			; 0000C492  B90100  '...'
                  	mov	ah,0xc			; 0000C495  B40C  '..'
                  	int	0x13			; 0000C497  CD13  '..'
                  	jnc	xc49f			; 0000C499  7304  's.'
                  xc49b:	call	xc530			; 0000C49B  E89200  '...'
                  xc49e:	stc				; 0000C49E  F9  '.'
                  xc49f:	ret				; 0000C49F  C3  '.'
                  
                  xc4a0:	mov	al,0x8e			; 0000C4A0  B08E  '..'
                  	call	xb544			; 0000C4A2  E89FF0  '...'
                  	test	al,0x40			; 0000C4A5  A840  '.@'
                  	jz	xc4b3			; 0000C4A7  740A  't',0x0A
                  xc4a9:	mov	al,0xb7			; 0000C4A9  B0B7  '..'
                  	out	0x84,al			; 0000C4AB  E684  '..'
                  	mov	cl,0x0			; 0000C4AD  B100  '..'
                  	stc				; 0000C4AF  F9  '.'
                  	jmp	short xc52b		; 0000C4B0  EB79  '.y'
                  
                  	nop				; 0000C4B2  90  '.'
                  xc4b3:	mov	al,0x92			; 0000C4B3  B092  '..'
                  	call	xb544			; 0000C4B5  E88CF0  '...'
                  	or	al,al			; 0000C4B8  0AC0  0x0A,'.'
                  	jz	xc4a9			; 0000C4BA  74ED  't.'
                  	mov	bl,al			; 0000C4BC  8AD8  '..'
                  	push	ds			; 0000C4BE  1E  '.'
                  	xor	ax,ax			; 0000C4BF  33C0  '3.'
                  	mov	cx,ax			; 0000C4C1  8BC8  '..'
                  	mov	ds,ax			; 0000C4C3  8ED8  '..'
                  	mov	al,bl			; 0000C4C5  8AC3  '..'
                  	shr	al,0x4			; 0000C4C7  C0E804  '...'
                  	jz	xc4d9			; 0000C4CA  740D  't',0x0D
                  	cmp	al,0xf			; 0000C4CC  3C0F  '<.'
                  	jnz	xc4d5			; 0000C4CE  7505  'u.'
                  	mov	al,0x99			; 0000C4D0  B099  '..'
                  	call	xb544			; 0000C4D2  E86FF0  '.o.'
                  xc4d5:	inc	cl			; 0000C4D5  FEC1  '..'
                  	dec	al			; 0000C4D7  FEC8  '..'
                  xc4d9:	mov	ch,0x10			; 0000C4D9  B510  '..'
                  	mul	ch			; 0000C4DB  F6E5  '..'
                  	add	ax,0xe401		; 0000C4DD  0501E4  '...'
                  	cli				; 0000C4E0  FA  '.'
                  	mov	[0x104],ax		; 0000C4E1  A30401  '...'
                  	mov	[0x106],cs		; 0000C4E4  8C0E0601  '....'
                  	xor	ax,ax			; 0000C4E8  33C0  '3.'
                  	mov	al,bl			; 0000C4EA  8AC3  '..'
                  	and	al,0xf			; 0000C4EC  240F  '$.'
                  	jz	xc4fd			; 0000C4EE  740D  't',0x0D
                  	cmp	al,0xf			; 0000C4F0  3C0F  '<.'
                  	jnz	xc4f9			; 0000C4F2  7505  'u.'
                  	mov	al,0x9a			; 0000C4F4  B09A  '..'
                  	call	xb544			; 0000C4F6  E84BF0  '.K.'
                  xc4f9:	dec	al			; 0000C4F9  FEC8  '..'
                  	inc	cl			; 0000C4FB  FEC1  '..'
                  xc4fd:	mul	ch			; 0000C4FD  F6E5  '..'
                  	add	ax,0xe401		; 0000C4FF  0501E4  '...'
                  	mov	[0x118],ax		; 0000C502  A31801  '...'
                  	mov	[0x11a],cs		; 0000C505  8C0E1A01  '....'
                  	mov	ax,[0x4c]		; 0000C509  A14C00  '.L.'
                  	mov	[0x100],ax		; 0000C50C  A30001  '...'
                  	mov	ax,[0x4e]		; 0000C50F  A14E00  '.N.'
                  	mov	[0x102],ax		; 0000C512  A30201  '...'
                  	mov	word [0x4c],0x2e12	; 0000C515  C7064C00122E  '..L...'
                  	mov	[0x4e],cs		; 0000C51B  8C0E4E00  '..N.'
                  	mov	word [0x1d8],0x3343	; 0000C51F  C706D8014333  '....C3'
                  	mov	[0x1da],cs		; 0000C525  8C0EDA01  '....'
                  	sti				; 0000C529  FB  '.'
                  	pop	ds			; 0000C52A  1F  '.'
                  xc52b:	mov	[0x75],cl		; 0000C52B  880E7500  '..u.'
                  	ret				; 0000C52F  C3  '.'
                  
                  xc530:	mov	al,0xb5			; 0000C530  B0B5  '..'
                  	out	0x84,al			; 0000C532  E684  '..'
                  	mov	bx,0xb9b0		; 0000C534  BBB0B9  '...'
                  	cmp	dl,0x80			; 0000C537  80FA80  '...'
                  	jz	xc53f			; 0000C53A  7403  't.'
                  	mov	bx,0xb9c3		; 0000C53C  BBC3B9  '...'
                  xc53f:	mov	cx,0x13			; 0000C53F  B91300  '...'
                  	mov	dx,0x0			; 0000C542  BA0000  '...'
                  	call	xc745			; 0000C545  E8FD01  '...'
                  	ret				; 0000C548  C3  '.'
                  
                  xc549:	mov	al,0xb6			; 0000C549  B0B6  '..'
                  	out	0x84,al			; 0000C54B  E684  '..'
                  	mov	bx,0xb9eb		; 0000C54D  BBEBB9  '...'
                  	cmp	dl,0x81			; 0000C550  80FA81  '...'
                  	jz	xc55b			; 0000C553  7406  't.'
                  	call	xc591			; 0000C555  E83900  '.9.'
                  	mov	bx,0xb9d6		; 0000C558  BBD6B9  '...'
                  xc55b:	mov	cx,0x15			; 0000C55B  B91500  '...'
                  	mov	dx,0x0			; 0000C55E  BA0000  '...'
                  	call	xc745			; 0000C561  E8E101  '...'
                  	ret				; 0000C564  C3  '.'
                  
                  xc565:	call	xc5a2			; 0000C565  E83A00  '.:.'
                  	call	xc5af			; 0000C568  E84400  '.D.'
                  	mov	dx,0x1f7		; 0000C56B  BAF701  '...'
                  	mov	bx,0x3c			; 0000C56E  BB3C00  '.<.'
                  xc571:	mov	cx,0xf424		; 0000C571  B924F4  '.$.'
                  xc574:	in	al,dx			; 0000C574  EC  '.'
                  	test	al,0x80			; 0000C575  A880  '..'
                  	jz	xc585			; 0000C577  740C  't.'
                  	call	x919a			; 0000C579  E81ECC  '...'
                  	loop	xc574			; 0000C57C  E2F6  '..'
                  	dec	bx			; 0000C57E  4B  'K'
                  	jnz	xc571			; 0000C57F  75F0  'u.'
                  	mov	ah,0x80			; 0000C581  B480  '..'
                  	jmp	short xc58f		; 0000C583  EB0A  '.',0x0A
                  
                  xc585:	mov	dx,0x1f1		; 0000C585  BAF101  '...'
                  	in	al,dx			; 0000C588  EC  '.'
                  	cmp	al,0x1			; 0000C589  3C01  '<.'
                  	jz	xc590			; 0000C58B  7403  't.'
                  	mov	ah,0x20			; 0000C58D  B420  '. '
                  xc58f:	stc				; 0000C58F  F9  '.'
                  xc590:	ret				; 0000C590  C3  '.'
                  
                  xc591:	cli				; 0000C591  FA  '.'
                  	mov	al,0x8e			; 0000C592  B08E  '..'
                  	call	xb544			; 0000C594  E8ADEF  '...'
                  	or	al,0x8			; 0000C597  0C08  '..'
                  	mov	ah,al			; 0000C599  8AE0  '..'
                  	mov	al,0x8e			; 0000C59B  B08E  '..'
                  	call	xb549			; 0000C59D  E8A9EF  '...'
                  	sti				; 0000C5A0  FB  '.'
                  	ret				; 0000C5A1  C3  '.'
                  
                  xc5a2:	in	al,0x21			; 0000C5A2  E421  '.!'
                  	and	al,0xfb			; 0000C5A4  24FB  '$.'
                  	out	0x21,al			; 0000C5A6  E621  '.!'
                  	in	al,0xa1			; 0000C5A8  E4A1  '..'
                  	and	al,0xbf			; 0000C5AA  24BF  '$.'
                  	out	0xa1,al			; 0000C5AC  E6A1  '..'
                  	ret				; 0000C5AE  C3  '.'
                  
                  xc5af:	mov	ax,0x0			; 0000C5AF  B80000  '...'
                  	mov	dx,0x3f6		; 0000C5B2  BAF603  '...'
                  	out	dx,al			; 0000C5B5  EE  '.'
                  	mov	al,0x4			; 0000C5B6  B004  '..'
                  	out	dx,al			; 0000C5B8  EE  '.'
                  	call	x919a			; 0000C5B9  E8DECB  '...'
                  	mov	al,0x0			; 0000C5BC  B000  '..'
                  	out	dx,al			; 0000C5BE  EE  '.'
                  	ret				; 0000C5BF  C3  '.'
                  
                  xc5c0:	sti				; 0000C5C0  FB  '.'
                  	push	bx			; 0000C5C1  53  'S'
                  	push	cx			; 0000C5C2  51  'Q'
                  	push	dx			; 0000C5C3  52  'R'
                  	push	si			; 0000C5C4  56  'V'
                  	push	di			; 0000C5C5  57  'W'
                  	push	ds			; 0000C5C6  1E  '.'
                  	push	bp			; 0000C5C7  55  'U'
                  	mov	bp,sp			; 0000C5C8  8BEC  '..'
                  	mov	si,0x40			; 0000C5CA  BE4000  '.@.'
                  	mov	ds,si			; 0000C5CD  8EDE  '..'
                  	and	dx,0x3			; 0000C5CF  81E20300  '....'
                  	mov	si,dx			; 0000C5D3  8BF2  '..'
                  	cmp	ah,0x4			; 0000C5D5  80FC04  '...'
                  	jnc	xc5de			; 0000C5D8  7304  's.'
                  	mov	bl,[si+0x7c]		; 0000C5DA  8A9C7C00  '..|.'
                  xc5de:	shl	si,1			; 0000C5DE  D1E6  '..'
                  	mov	dx,[si+0x0]		; 0000C5E0  8B940000  '....'
                  	or	dx,dx			; 0000C5E4  0BD2  '..'
                  	jz	xc61c			; 0000C5E6  7434  't4'
                  	test	ah,ah			; 0000C5E8  84E4  '..'
                  	jnz	xc5f1			; 0000C5EA  7505  'u.'
                  	call	xcb01			; 0000C5EC  E81205  '...'
                  	jmp	short xc61c		; 0000C5EF  EB2B  '.+'
                  
                  xc5f1:	dec	ah			; 0000C5F1  FECC  '..'
                  	jnz	xc5fa			; 0000C5F3  7505  'u.'
                  	call	xcb32			; 0000C5F5  E83A05  '.:.'
                  	jmp	short xc61c		; 0000C5F8  EB22  '."'
                  
                  xc5fa:	dec	ah			; 0000C5FA  FECC  '..'
                  	jnz	xc603			; 0000C5FC  7505  'u.'
                  	call	xcb5e			; 0000C5FE  E85D05  '.].'
                  	jmp	short xc61c		; 0000C601  EB19  '..'
                  
                  xc603:	dec	ah			; 0000C603  FECC  '..'
                  	jnz	xc60c			; 0000C605  7505  'u.'
                  	call	xcb29			; 0000C607  E81F05  '...'
                  	jmp	short xc61c		; 0000C60A  EB10  '..'
                  
                  xc60c:	dec	ah			; 0000C60C  FECC  '..'
                  	jnz	xc615			; 0000C60E  7505  'u.'
                  	call	xcbcb			; 0000C610  E8B805
                  	jmp	short xc61c		; 0000C613  EB07  '..'
                  
                  xc615:	dec	ah			; 0000C615  FECC  '..'
                  	jnz	xc61c			; 0000C617  7503  'u.'
                  	call	xcc10			; 0000C619  E8F405  '...'
                  xc61c:	pop	bp			; 0000C61C  5D  ']'
                  	pop	ds			; 0000C61D  1F  '.'
                  	pop	di			; 0000C61E  5F  '_'
                  	pop	si			; 0000C61F  5E  '^'
                  	pop	dx			; 0000C620  5A  'Z'
                  	pop	cx			; 0000C621  59  'Y'
                  	pop	bx			; 0000C622  5B  '['
                  	iret				; 0000C623  CF  '.'
                  
                  	times	6 db 0xFF		; 0000C624 - 0000C629
                  	jmp	xca97			; 0000C62A  E96A04
                  
                  	dw	0x0010			; 0000C62D  1000
                  
                  xc62f:	push	bx			; 0000C62F  53  'S'
                  	mov	bx,0x1			; 0000C630  BB0100  '...'
                  	call	xc638			; 0000C633  E80200  '...'
                  	pop	bx			; 0000C636  5B  '['
                  	ret				; 0000C637  C3  '.'
                  
                  xc638:	push	bp			; 0000C638  55  'U'
                  	push	ax			; 0000C639  50  'P'
                  	push	cx			; 0000C63A  51  'Q'
                  	call	xc642			; 0000C63B  E80400  '...'
                  	pop	cx			; 0000C63E  59  'Y'
                  	pop	ax			; 0000C63F  58  'X'
                  	pop	bp			; 0000C640  5D  ']'
                  	ret				; 0000C641  C3  '.'
                  
                  xc642:	mov	cx,bx			; 0000C642  8BCB  '..'
                  
                  xc644:	pushf				; 0000C644  9C  '.'
                  	cli				; 0000C645  FA  '.'
                  	mov	al,0x0			; 0000C646  B000  '..'
                  	out	0x43,al			; 0000C648  E643  '.C'
                  	in	al,0x40			; 0000C64A  E440  '.@'
                  	mov	ah,al			; 0000C64C  8AE0  '..'
                  	in	al,0x40			; 0000C64E  E440  '.@'
                  	push	cs			; 0000C650  0E  '.'
                  	call	xc657			; 0000C651  E80300  '...'
                  	jmp	short xc658		; 0000C654  EB02  '..'
                  
                  	nop				; 0000C656  90  '.'
                  
                  xc657:	iret				; 0000C657  CF  '.'
                  
                  xc658:	xchg	al,ah			; 0000C658  86C4  '..'
                  	mov	bx,ax			; 0000C65A  8BD8  '..'
                  
                  xc65c:	pushf				; 0000C65C  9C  '.'
                  	cli				; 0000C65D  FA  '.'
                  	mov	al,0x0			; 0000C65E  B000  '..'
                  	out	0x43,al			; 0000C660  E643  '.C'
                  	in	al,0x40			; 0000C662  E440  '.@'
                  	mov	ah,al			; 0000C664  8AE0  '..'
                  	in	al,0x40			; 0000C666  E440  '.@'
                  	push	cs			; 0000C668  0E  '.'
                  	call	xc66f			; 0000C669  E80300  '...'
                  	jmp	short xc670		; 0000C66C  EB02  '..'
                  
                  	nop				; 0000C66E  90  '.'
                  
                  xc66f:	iret				; 0000C66F  CF  '.'
                  
                  xc670:	xchg	al,ah			; 0000C670  86C4  '..'
                  	push	bx			; 0000C672  53  'S'
                  	sub	bx,ax			; 0000C673  2BD8  '+.'
                  	cmp	bx,0x950		; 0000C675  81FB5009  '..P.'
                  	pop	bx			; 0000C679  5B  '['
                  	jc	xc65c			; 0000C67A  72E0  'r.'
                  	loop	xc644			; 0000C67C  E2C6  '..'
                  	ret				; 0000C67E  C3  '.'
                  
                  	mov	cx,bx			; 0000C67F  8BCB  '..'
                  xc681:	mov	al,0x0			; 0000C681  B000  '..'
                  	out	0x43,al			; 0000C683  E643  '.C'
                  	in	al,0x40			; 0000C685  E440  '.@'
                  	mov	ah,al			; 0000C687  8AE0  '..'
                  	in	al,0x40			; 0000C689  E440  '.@'
                  	xchg	al,ah			; 0000C68B  86C4  '..'
                  	mov	bx,ax			; 0000C68D  8BD8  '..'
                  xc68f:	mov	al,0x0			; 0000C68F  B000  '..'
                  	out	0x43,al			; 0000C691  E643  '.C'
                  	in	al,0x40			; 0000C693  E440  '.@'
                  	mov	ah,al			; 0000C695  8AE0  '..'
                  	in	al,0x40			; 0000C697  E440  '.@'
                  	xchg	al,ah			; 0000C699  86C4  '..'
                  	sub	bx,ax			; 0000C69B  2BD8  '+.'
                  	cmp	bx,0x950		; 0000C69D  81FB5009  '..P.'
                  	jc	xc6a7			; 0000C6A1  7204  'r.'
                  	loop	xc681			; 0000C6A3  E2DC  '..'
                  	jmp	bp			; 0000C6A5  FFE5  '..'
                  
                  xc6a7:	add	bx,ax			; 0000C6A7  03D8  '..'
                  	jmp	short xc68f		; 0000C6A9  EBE4  '..'
                  
                  xc6ab:	xchg	si,dx			; 0000C6AB  87F2  '..'
                  	xchg	ch,cl			; 0000C6AD  86E9  '..'
                  	mov	bx,cx			; 0000C6AF  8BD9  '..'
                  	mov	sp,si			; 0000C6B1  8BE6  '..'
                  	mov	cx,0x4			; 0000C6B3  B90400  '...'
                  	shr	dx,cl			; 0000C6B6  D3EA  '..'
                  	mov	cx,0x2			; 0000C6B8  B90200  '...'
                  	mov	si,0xc6c1		; 0000C6BB  BEC1C6  '...'
                  	jmp	short xc6e6		; 0000C6BE  EB26  '.&'
                  
                  	nop				; 0000C6C0  90  '.'
                  	mov	dx,sp			; 0000C6C1  8BD4  '..'
                  	and	dx,0x3			; 0000C6C3  81E20300  '....'
                  	mov	cx,0x4			; 0000C6C7  B90400  '...'
                  	mov	si,0xc6d0		; 0000C6CA  BED0C6  '...'
                  	jmp	short xc6e6		; 0000C6CD  EB17  '..'
                  
                  	nop				; 0000C6CF  90  '.'
                  	mov	al,0x20			; 0000C6D0  B020  '. '
                  	mov	[es:di+0x8000],al	; 0000C6D2  2688850080  '&....'
                  	stosb				; 0000C6D7  AA  '.'
                  	inc	di			; 0000C6D8  47  'G'
                  	mov	dx,bx			; 0000C6D9  8BD3  '..'
                  	mov	cx,0x2			; 0000C6DB  B90200  '...'
                  	mov	si,0xc6e4		; 0000C6DE  BEE4C6  '...'
                  	jmp	short xc6e6		; 0000C6E1  EB03  '..'
                  
                  	nop				; 0000C6E3  90  '.'
                  	jmp	bp			; 0000C6E4  FFE5  '..'
                  
                  xc6e6:	cld				; 0000C6E6  FC  '.'
                  	mov	ax,0xb000		; 0000C6E7  B800B0  '...'
                  	mov	es,ax			; 0000C6EA  8EC0  '..'
                  xc6ec:	xchg	ax,dx			; 0000C6EC  92  '.'
                  	mul	word [cs:0xc62d]	; 0000C6ED  2EF7262DC6  '..&-.'
                  	xchg	ax,dx			; 0000C6F2  92  '.'
                  	add	al,0x90			; 0000C6F3  0490  '..'
                  	daa				; 0000C6F5  27  0x27
                  	adc	al,0x40			; 0000C6F6  1440  '.@'
                  	daa				; 0000C6F8  27  0x27
                  	mov	[es:di+0x8000],al	; 0000C6F9  2688850080  '&....'
                  	stosb				; 0000C6FE  AA  '.'
                  	inc	di			; 0000C6FF  47  'G'
                  	loop	xc6ec			; 0000C700  E2EA  '..'
                  	jmp	si			; 0000C702  FFE6  '..'
                  
                  xc704:	xchg	ch,cl			; 0000C704  86E9  '..'
                  	push	cx			; 0000C706  51  'Q'
                  	push	dx			; 0000C707  52  'R'
                  	mov	dx,si			; 0000C708  8BD6  '..'
                  	shl	dx,0x8			; 0000C70A  C1E208  '...'
                  	mov	cx,0x2			; 0000C70D  B90200  '...'
                  	call	xc72b			; 0000C710  E81800  '...'
                  	pop	dx			; 0000C713  5A  'Z'
                  	and	dx,0x3			; 0000C714  81E20300  '....'
                  	mov	cx,0x4			; 0000C718  B90400  '...'
                  	call	xc72b			; 0000C71B  E80D00  '.',0x0D,'.'
                  	mov	al,0x20			; 0000C71E  B020  '. '
                  	call	print_char		; 0000C720  E8B000  '...'
                  	pop	dx			; 0000C723  5A  'Z'
                  	mov	cx,0x2			; 0000C724  B90200  '...'
                  	call	xc72b			; 0000C727  E80100  '...'
                  	ret				; 0000C72A  C3  '.'
                  
                  ;
                  ;   Print the value in (DX) as (CX) hex digits
                  ;
                  xc72b:	cld				; 0000C72B  FC  '.'
                  xc72c:	xchg	ax,dx			; 0000C72C  92  '.'
                  	mul	word [cs:0xc62d]	; multiply by 16
                  	xchg	ax,dx			; 0000C732  92  '.'
                  	add	al,0x90			; 0000C733  0490  '..'
                  	daa				; 0000C735  27  0x27
                  	adc	al,0x40			; 0000C736  1440  '.@'
                  	daa				; 0000C738  27  0x27
                  	push	dx			; 0000C739  52  'R'
                  	push	cx			; 0000C73A  51  'Q'
                  	push	ax			; 0000C73B  50  'P'
                  	call	print_char		; 0000C73C  E89400  '...'
                  	pop	ax			; 0000C73F  58  'X'
                  	pop	cx			; 0000C740  59  'Y'
                  	pop	dx			; 0000C741  5A  'Z'
                  	loop	xc72c			; 0000C742  E2E8  '..'
                  	ret				; 0000C744  C3  '.'
                  
                  xc745:	push	ds			; 0000C745  1E  '.'
                  	mov	ax,0x40			; 0000C746  B84000  '.@.'
                  	mov	ds,ax			; 0000C749  8ED8  '..'
                  	mov	byte [0x12],0xff	; 0000C74B  C6061200FF  '.....'
                  	pop	ds			; 0000C750  1F  '.'
                  
                  xc751:	push	bx			; 0000C751  53  'S'
                  	push	cx			; 0000C752  51  'Q'
                  
                  xc753:	test	dh,0xc0			; 0000C753  F6C6C0  '...'
                  	jz	xc760			; 0000C756  7408  't.'
                  	call	xc7ab			; 0000C758  E85000
                  	sub	dh,0x40			; 0000C75B  80EE40  '..@'
                  	jmp	short xc753		; 0000C75E  EBF3  '..'
                  
                  xc760:	test	dh,0x30			; 0000C760  F6C630  '..0'
                  	jz	xc76d			; 0000C763  7408  't.'
                  	call	xc791			; 0000C765  E82900  '.).'
                  	sub	dh,0x10			; 0000C768  80EE10  '...'
                  	jmp	short xc760		; 0000C76B  EBF3  '..'
                  
                  xc76d:	pop	cx			; 0000C76D  59  'Y'
                  	pop	bx			; 0000C76E  5B  '['
                  
                  xc76f:	mov	al,[cs:bx]		; 0000C76F  2E8A07  '...'
                  	push	bx			; 0000C772  53  'S'
                  	call	print_char		; 0000C773  E85D00  '.].'
                  	pop	bx			; 0000C776  5B  '['
                  	inc	bx			; 0000C777  43  'C'
                  	loop	xc76f			; 0000C778  E2F5  '..'
                  	ret				; 0000C77A  C3  '.'
                  
                  ;
                  ;   print_str(BX -> string, CX == length)
                  ;
                  ;   NOTE: This appears to be dead code
                  ;
                  print_str:
                  	mov	al,[bx]			; 0000C77B  8A07  '..'
                  	push	bx			; 0000C77D  53  'S'
                  	call	print_char		; 0000C77E  E85200  '.R.'
                  	pop	bx			; 0000C781  5B  '['
                  	inc	bx			; 0000C782  43  'C'
                  	loop	print_str		; 0000C783  E2F6  '..'
                  	ret				; 0000C785  C3  '.'
                  
                  ;
                  ;   print_crlf()
                  ;
                  print_crlf:
                  	mov	al,0xd			; 0000C786  B00D  '.',0x0D
                  	call	print_char		; 0000C788  E84800  '.H.'
                  	mov	al,0xa			; 0000C78B  B00A  '.',0x0A
                  	call	print_char		; 0000C78D  E84300  '.C.'
                  	ret				; 0000C790  C3  '.'
                  
                  xc791:	mov	bx,0xfa			; 0000C791  BBFA00  '...'
                  	call	xc7db			; 0000C794  E84400  '.D.'
                  	mov	bx,0x100		; 0000C797  BB0001  '...'
                  	call	xc638			; 0000C79A  E89BFE  '...'
                  	ret				; 0000C79D  C3  '.'
                  
                  xc79e:	mov	bx,0x7d			; 0000C79E  BB7D00  '.}.'
                  	call	xc7db			; 0000C7A1  E83700  '.7.'
                  	mov	bx,0x7d			; 0000C7A4  BB7D00  '.}.'
                  	call	xc638			; 0000C7A7  E88EFE  '...'
                  	ret				; 0000C7AA  C3  '.'
                  
                  xc7ab:	mov	bx,0x320		; 0000C7AB  BB2003  '. .'
                  	call	xc7db			; 0000C7AE  E82A00  '.*.'
                  	mov	bx,0x100		; 0000C7B1  BB0001  '...'
                  	call	xc638			; 0000C7B4  E881FE  '...'
                  	ret				; 0000C7B7  C3  '.'
                  
                  xc7b8:	mov	ch,al			; 0000C7B8  8AE8  '..'
                  	mov	cl,0x4			; 0000C7BA  B104  '..'
                  	shr	al,cl			; 0000C7BC  D2E8  '..'
                  	call	xc7c7			; 0000C7BE  E80600  '...'
                  	mov	al,ch			; 0000C7C1  8AC5  '..'
                  	call	xc7c7			; 0000C7C3  E80100  '...'
                  	ret				; 0000C7C6  C3  '.'
                  
                  xc7c7:	and	al,0xf			; 0000C7C7  240F  '$.'
                  	add	al,0x90			; 0000C7C9  0490  '..'
                  	daa				; 0000C7CB  27  0x27
                  	adc	al,0x40			; 0000C7CC  1440  '.@'
                  	daa				; 0000C7CE  27  0x27
                  	call	print_char		; 0000C7CF  E80100  '...'
                  	ret				; 0000C7D2  C3  '.'
                  
                  print_char:
                  	mov	bx,0x7			; 0000C7D3  BB0700  '...'
                  	mov	ah,0xe			; 0000C7D6  B40E  '..'
                  	int	0x10			; 0000C7D8  CD10  '..'
                  	ret				; 0000C7DA  C3  '.'
                  
                  xc7db:	mov	al,0xb6			; 0000C7DB  B0B6  '..'
                  	out	0x43,al			; 0000C7DD  E643  '.C'
                  	mov	al,0x38			; 0000C7DF  B038  '.8'
                  	out	0x42,al			; 0000C7E1  E642  '.B'
                  	mov	al,0x5			; 0000C7E3  B005  '..'
                  	out	0x42,al			; 0000C7E5  E642  '.B'
                  	in	al,0x61			; 0000C7E7  E461  '.a'
                  	or	al,0x3			; 0000C7E9  0C03  '..'
                  	out	0x61,al			; 0000C7EB  E661  '.a'
                  	call	xc638			; 0000C7ED  E848FE  '.H.'
                  	in	al,0x61			; 0000C7F0  E461  '.a'
                  	and	al,0xfc			; 0000C7F2  24FC  '$.'
                  	out	0x61,al			; 0000C7F4  E661  '.a'
                  	ret				; 0000C7F6  C3  '.'
                  
                  xc7f7:	xor	di,di			; 0000C7F7  33FF  '3.'
                  xc7f9:	cld				; 0000C7F9  FC  '.'
                  	mov	ax,0xb000		; 0000C7FA  B800B0  '...'
                  	mov	es,ax			; 0000C7FD  8EC0  '..'
                  xc7ff:	mov	al,[cs:bx]		; 0000C7FF  2E8A07  '...'
                  	inc	bx			; 0000C802  43  'C'
                  	mov	[es:di+0x8000],al	; 0000C803  2688850080  '&....'
                  	stosb				; 0000C808  AA  '.'
                  	inc	di			; 0000C809  47  'G'
                  	loop	xc7ff			; 0000C80A  E2F3  '..'
                  	jmp	bp			; 0000C80C  FFE5  '..'
                  
                  	push	es			; 0000C80E  06  '.'
                  	xor	di,di			; 0000C80F  33FF  '3.'
                  	cld				; 0000C811  FC  '.'
                  	mov	ax,0xb000		; 0000C812  B800B0  '...'
                  	mov	es,ax			; 0000C815  8EC0  '..'
                  xc817:	mov	al,[bx]			; 0000C817  8A07  '..'
                  	inc	bx			; 0000C819  43  'C'
                  	mov	[es:di+0x8000],al	; 0000C81A  2688850080  '&....'
                  	stosb				; 0000C81F  AA  '.'
                  	inc	di			; 0000C820  47  'G'
                  	loop	xc817			; 0000C821  E2F4  '..'
                  	pop	es			; 0000C823  07  '.'
                  	ret				; 0000C824  C3  '.'
                  
                  ;
                  ;   Copy ROM to RAM
                  ;
                  ;   This function ends by disabling A20 and zeroing all conventional memory.
                  ;
                  xc825:	pusha				; 0000C825  60  '`'
                  	push	ds			; 0000C826  1E  '.'
                  	push	es			; 0000C827  06  '.'
                  	mov	al,0xd0			; 0000C828  B0D0  '..'
                  	out	0x84,al			; 0000C82A  E684  '..'
                  	mov	ax,0x40			; 0000C82C  B84000  '.@.'
                  	mov	ds,ax			; 0000C82F  8ED8  '..'
                  	mov	[0x67],sp		; 0000C831  89266700  '.&g.'
                  	mov	[0x69],ss		; 0000C835  8C166900  '..i.'
                  	mov	al,0xd1			; 0000C839  B0D1  '..'
                  	out	0x84,al			; 0000C83B  E684  '..'
                  ;
                  ;   Enter protected-mode
                  ;
                  	call	x80e2			; 0000C83D  E8A2B8  '...'
                  	jz	xc845			; 0000C840  7403  't.'
                  	jmp	xc8ef			; 0000C842  E9AA00  '...'
                  
                  xc845:	mov	al,0xd2			; 0000C845  B0D2  '..'
                  	out	0x84,al			; 0000C847  E684  '..'
                  	mov	al,0xb1			; 0000C849  B0B1  '..'
                  	call	xb544			; 0000C84B  E8F6EC  '...'
                  	mov	ah,al			; 0000C84E  8AE0  '..'
                  	mov	al,0xb0			; 0000C850  B0B0  '..'
                  	call	xb544			; 0000C852  E8EFEC  '...'
                  	xor	dx,dx			; 0000C855  33D2  '3.'
                  	mov	bx,0x40			; 0000C857  BB4000  '.@.'
                  	div	bx			; 0000C85A  F7F3  '..'
                  	mov	bh,al			; 0000C85C  8AF8  '..'
                  	mov	bl,0x10			; 0000C85E  B310  '..'
                  	call	xc8fc			; 0000C860  E89900  '...'
                  ;
                  ;   The next function writes 0xFF to 0x80C00000, presumably to ensure that
                  ;   Compaq Built-in Memory at 0xFE0000 is NOT mapped to 0x0E000 at the moment
                  ;
                  	call	x84a5			; 0000C863  E83FBC  '.?.'
                  
                  	mov	ax,[0x8d]		; 0000C866  A18D00  '...'
                  	add	ax,0x80			; 0000C869  058000  '...'
                  	xor	dx,dx			; 0000C86C  33D2  '3.'
                  	mov	bx,0x40			; 0000C86E  BB4000  '.@.'
                  	div	bx			; 0000C871  F7F3  '..'
                  	mov	bh,al			; 0000C873  8AF8  '..'
                  	mov	bl,[0x8c]		; 0000C875  8A1E8C00  '....'
                  	call	xc8fc			; 0000C879  E88000  '...'
                  ;
                  ;   Relocate the ROM
                  ;
                  ;   On return, we should now be running in RAM (ie, a copy of the ROM in 128Kb of RAM
                  ;   now mapped to %0E0000 through %0FFFFF)
                  ;
                  	call	x853c			; 0000C87C  E8BDBC  '...'
                  ;
                  ;   Return to real-mode
                  ;
                  	mov	al,0xd3			; 0000C87F  B0D3  '..'
                  	out	0x84,al			; 0000C881  E684  '..'
                  	mov	ax,0x28			; 0000C883  B82800  '.(.'
                  	mov	ds,ax			; 0000C886  8ED8  '..'
                  	mov	es,ax			; 0000C888  8EC0  '..'
                  	mov	ss,ax			; 0000C88A  8ED0  '..'
                  	mov	eax,cr0			; 0000C88C  0F2000
                  	and	eax,0x7ffffffe		; 0000C88F  6625FEFFFF7F  'f%....'
                  	mov	cr0,eax			; 0000C895  0F2200
                  	jmp	0xf000:xc89d		; 0000C898  EA9DC800F0  '.....'
                  
                  xc89d:	lidt	[cs:0xa151]		; 0000C89D  2E0F011E51A1  '....Q.'
                  	mov	al,0xd4			; 0000C8A3  B0D4  '..'
                  	out	0x84,al			; 0000C8A5  E684  '..'
                  	mov	ax,0x40			; 0000C8A7  B84000  '.@.'
                  	mov	ds,ax			; 0000C8AA  8ED8  '..'
                  	mov	ss,[0x69]		; 0000C8AC  8E166900  '..i.'
                  	mov	sp,[0x67]		; 0000C8B0  8B266700  '.&g.'
                  ;
                  ;   Disable A20
                  ;
                  	call	xa478			; 0000C8B4  E8C1DB
                  ;
                  ;   Get the (conventional) memory size in Kb from 0x40:0x0013, divide by 64 (0x40) to yield
                  ;   the number of 64Kb blocks of RAM below 1Mb, and then zero each 64Kb block with "rep stosd".
                  ;
                  	mov	ax,[0x13]		; 0000C8B7  A11300  '...'
                  	xor	dx,dx			; 0000C8BA  33D2  '3.'
                  	mov	bx,0x40			; 0000C8BC  BB4000  '.@.'
                  	div	bx			; 0000C8BF  F7F3  '..'
                  	cmp	ax,0x0			; 0000C8C1  3D0000  '=..'
                  	jnz	xc8c9			; 0000C8C4  7503  'u.'
                  	jmp	short xc8eb		; 0000C8C6  EB23  '.#'
                  	nop				; 0000C8C8  90  '.'
                  
                  xc8c9:	sub	ax,0x1			; 0000C8C9  2D0100  '-..'
                  	mov	bh,al			; 0000C8CC  8AF8  '..'
                  	mov	dx,0x1000		; 0000C8CE  BA0010  '...'
                  xc8d1:	cmp	bh,0x0			; 0000C8D1  80FF00  '...'
                  	jz	xc8eb			; 0000C8D4  7415  't.'
                  	mov	es,dx			; 0000C8D6  8EC2  '..'
                  	xor	eax,eax			; 0000C8D8  6633C0  'f3.'
                  	mov	cx,0x4000		; 0000C8DB  B90040  '..@'
                  	xor	di,di			; 0000C8DE  33FF  '3.'
                  	cld				; 0000C8E0  FC  '.'
                  	rep	stosd			; 0000C8E1  66F3AB  'f..'
                  	dec	bh			; 0000C8E4  FECF  '..'
                  	add	dh,0x10			; 0000C8E6  80C610  '...'
                  	jmp	short xc8d1		; 0000C8E9  EBE6  '..'
                  
                  xc8eb:	pop	es			; 0000C8EB  07  '.'
                  	pop	ds			; 0000C8EC  1F  '.'
                  	popa				; 0000C8ED  61  'a'
                  	ret				; 0000C8EE  C3  '.'
                  
                  xc8ef:	mov	dx,0x0			; 0000C8EF  BA0000  '...'
                  	mov	bx,err102		; 0000C8F2  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000C8F5  B91A00  '...'
                  	call	xc745			; 0000C8F8  E84AFE  '.J.'
                  	hlt				; 0000C8FB  F4  '.'
                  
                  xc8fc:	push	ax			; 0000C8FC  50  'P'
                  	push	bx			; 0000C8FD  53  'S'
                  	push	cx			; 0000C8FE  51  'Q'
                  	push	di			; 0000C8FF  57  'W'
                  	push	ds			; 0000C900  1E  '.'
                  	push	es			; 0000C901  06  '.'
                  	mov	ax,0x18			; 0000C902  B81800  '...'
                  	mov	ds,ax			; 0000C905  8ED8  '..'
                  	mov	word [0x4a],0x0		; 0000C907  C7064A000000  '..J...'
                  xc90d:	cmp	bh,0x0			; 0000C90D  80FF00  '...'
                  	jz	xc92d			; 0000C910  741B  't.'
                  	mov	[0x4c],bl		; 0000C912  881E4C00  '..L.'
                  	mov	ax,0x48			; 0000C916  B84800  '.H.'
                  	mov	es,ax			; 0000C919  8EC0  '..'
                  	xor	eax,eax			; 0000C91B  6633C0  'f3.'
                  	mov	cx,0x4000		; 0000C91E  B90040  '..@'
                  	xor	di,di			; 0000C921  33FF  '3.'
                  	cld				; 0000C923  FC  '.'
                  	rep	stosd			; 0000C924  66F3AB  'f..'
                  	dec	bh			; 0000C927  FECF  '..'
                  	inc	bl			; 0000C929  FEC3  '..'
                  	jmp	short xc90d		; 0000C92B  EBE0  '..'
                  
                  xc92d:	pop	es			; 0000C92D  07  '.'
                  	pop	ds			; 0000C92E  1F  '.'
                  	pop	di			; 0000C92F  5F  '_'
                  	pop	cx			; 0000C930  59  'Y'
                  	pop	bx			; 0000C931  5B  '['
                  	pop	ax			; 0000C932  58  'X'
                  	ret				; 0000C933  C3  '.'
                  
                  	call	xca03			; 0000C934  E8CC00  '...'
                  	mov	[0x41],ah		; 0000C937  88264100  '.&A.'
                  	or	ah,ah			; 0000C93B  0AE4  0x0A,'.'
                  	jz	xc944			; 0000C93D  7405  't.'
                  	or	word [bp+0x16],0x1	; 0000C93F  814E160100  '.N...'
                  xc944:	ret				; 0000C944  C3  '.'
                  
                  	mov	al,[bp+0x0]		; 0000C945  8A4600  '.F.'
                  	mov	ah,[0x41]		; 0000C948  8A264100  '.&A.'
                  	or	ah,ah			; 0000C94C  0AE4  0x0A,'.'
                  	jz	xc955			; 0000C94E  7405  't.'
                  	or	word [bp+0x16],0x1	; 0000C950  814E160100  '.N...'
                  xc955:	ret				; 0000C955  C3  '.'
                  
                  xc956:	cli				; 0000C956  FA  '.'
                  	mov	byte [0x40],0xff	; 0000C957  C6064000FF  '..@..'
                  	mov	al,0x10			; 0000C95C  B010  '..'
                  	mov	cl,[bp+0x6]		; 0000C95E  8A4E06  '.N.'
                  	shl	al,cl			; 0000C961  D2E0  '..'
                  	or	al,0xc			; 0000C963  0C0C  '..'
                  	or	al,[bp+0x6]		; 0000C965  0A4606  0x0A,'F.'
                  	mov	ah,[0x3f]		; 0000C968  8A263F00  '.&?.'
                  	shl	ah,0x4			; 0000C96C  C0E404  '...'
                  	or	al,ah			; 0000C96F  0AC4  0x0A,'.'
                  	mov	dx,0x3f2		; 0000C971  BAF203  '...'
                  	out	dx,al			; 0000C974  EE  '.'
                  	mov	ah,al			; 0000C975  8AE0  '..'
                  	mov	al,[0x8b]		; 0000C977  A08B00  '...'
                  	shr	al,0x6			; 0000C97A  C0E806  '...'
                  	mov	dx,0x3f7		; 0000C97D  BAF703  '...'
                  	out	dx,al			; 0000C980  EE  '.'
                  	shr	ah,0x4			; 0000C981  C0EC04  '...'
                  	mov	al,[0x3f]		; 0000C984  A03F00  '.?.'
                  	and	al,0xf			; 0000C987  240F  '$.'
                  	cmp	al,ah			; 0000C989  3AC4  ':.'
                  	jz	xc9bd			; 0000C98B  7430  't0'
                  	or	[0x3f],ah		; 0000C98D  08263F00  '.&?.'
                  	sti				; 0000C991  FB  '.'
                  	clc				; 0000C992  F8  '.'
                  	mov	ax,0x90fd		; 0000C993  B8FD90  '...'
                  	int	0x15			; 0000C996  CD15  '..'
                  	jc	xc9bd			; 0000C998  7223  'r#'
                  	mov	al,0x7d			; 0000C99A  B07D  '.}'
                  	mov	cl,0x8			; 0000C99C  B108  '..'
                  	mov	bl,[es:si+0xa]		; 0000C99E  268A5C0A  '&.\',0x0A
                  	cmp	byte [bp+0x1],0x3	; 0000C9A2  807E0103  '.~..'
                  	jz	xc9b0			; 0000C9A6  7408  't.'
                  	cmp	byte [bp+0x1],0x5	; 0000C9A8  807E0105  '.~..'
                  	jnz	xc9b0			; 0000C9AC  7502  'u.'
                  	mov	cl,0x5			; 0000C9AE  B105  '..'
                  xc9b0:	cmp	bl,cl			; 0000C9B0  3AD9  ':.'
                  	jnc	xc9b6			; 0000C9B2  7302  's.'
                  	xchg	bl,cl			; 0000C9B4  86D9  '..'
                  xc9b6:	mul	bl			; 0000C9B6  F6E3  '..'
                  	mov	bx,ax			; 0000C9B8  8BD8  '..'
                  	call	xc638			; 0000C9BA  E87BFC  '.{.'
                  xc9bd:	sti				; 0000C9BD  FB  '.'
                  	ret				; 0000C9BE  C3  '.'
                  
                  xc9bf:	push	cx			; 0000C9BF  51  'Q'
                  	mov	dx,0x3f4		; 0000C9C0  BAF403  '...'
                  	mov	cx,0xbc			; 0000C9C3  B9BC00  '...'
                  xc9c6:	call	x919a			; 0000C9C6  E8D1C7  '...'
                  	in	al,dx			; 0000C9C9  EC  '.'
                  	test	al,0x80			; 0000C9CA  A880  '..'
                  	jnz	xc9d4			; 0000C9CC  7506  'u.'
                  	loop	xc9c6			; 0000C9CE  E2F6  '..'
                  	mov	al,0x80			; 0000C9D0  B080  '..'
                  	jmp	short xc9d8		; 0000C9D2  EB04  '..'
                  
                  xc9d4:	call	x919a			; 0000C9D4  E8C3C7  '...'
                  	in	al,dx			; 0000C9D7  EC  '.'
                  xc9d8:	inc	dx			; 0000C9D8  42  'B'
                  	test	al,0x40			; 0000C9D9  A840  '.@'
                  	pop	cx			; 0000C9DB  59  'Y'
                  	ret				; 0000C9DC  C3  '.'
                  
                  xc9dd:	mov	bh,ah			; 0000C9DD  8AFC  '..'
                  	mov	al,[0x45]		; 0000C9DF  A04500  '.E.'
                  	sub	al,[bp+0x5]		; 0000C9E2  2A4605  '*F.'
                  	shl	al,1			; 0000C9E5  D0E0  '..'
                  	mul	byte [es:si+0x4]	; 0000C9E7  26F66404  '&.d.'
                  	mov	bl,al			; 0000C9EB  8AD8  '..'
                  	mov	al,[0x46]		; 0000C9ED  A04600  '.F.'
                  	sub	al,[bp+0x7]		; 0000C9F0  2A4607  '*F.'
                  	mul	byte [es:si+0x4]	; 0000C9F3  26F66404  '&.d.'
                  	add	al,bl			; 0000C9F7  02C3  '..'
                  	add	al,[0x47]		; 0000C9F9  02064700  '..G.'
                  	sub	al,[bp+0x4]		; 0000C9FD  2A4604  '*F.'
                  	mov	ah,bh			; 0000CA00  8AE7  '..'
                  	ret				; 0000CA02  C3  '.'
                  
                  xca03:	mov	dx,0x3f2		; 0000CA03  BAF203  '...'
                  	mov	al,[0x3f]		; 0000CA06  A03F00  '.?.'
                  	and	al,0xf			; 0000CA09  240F  '$.'
                  	jz	xca1f			; 0000CA0B  7412  't.'
                  	shr	al,1			; 0000CA0D  D0E8  '..'
                  	test	al,0x4			; 0000CA0F  A804  '..'
                  	jz	xca15			; 0000CA11  7402  't.'
                  	mov	al,0x3			; 0000CA13  B003  '..'
                  xca15:	mov	ah,[0x3f]		; 0000CA15  8A263F00  '.&?.'
                  	mov	cl,0x4			; 0000CA19  B104  '..'
                  	shl	ah,cl			; 0000CA1B  D2E4  '..'
                  	or	al,ah			; 0000CA1D  0AC4  0x0A,'.'
                  xca1f:	or	al,0x8			; 0000CA1F  0C08  '..'
                  	out	dx,al			; 0000CA21  EE  '.'
                  	call	x919a			; 0000CA22  E875C7  '.u.'
                  	and	byte [0x3e],0x0		; 0000CA25  80263E0000  '.&>..'
                  	or	al,0x4			; 0000CA2A  0C04  '..'
                  	out	dx,al			; 0000CA2C  EE  '.'
                  	mov	cx,0xf424		; 0000CA2D  B924F4  '.$.'
                  xca30:	test	byte [0x3e],0x80	; 0000CA30  F6063E0080  '..>..'
                  	jnz	xca41			; 0000CA35  750A  'u',0x0A
                  	call	x919a			; 0000CA37  E860C7  '.`.'
                  	loop	xca30			; 0000CA3A  E2F4  '..'
                  	mov	ah,0x80			; 0000CA3C  B480  '..'
                  	stc				; 0000CA3E  F9  '.'
                  	jmp	short xca4e		; 0000CA3F  EB0D  '.',0x0D
                  
                  xca41:	and	byte [0x3e],0x7f	; 0000CA41  80263E007F  '.&>..'
                  	call	xef6f			; 0000CA46  E82625  '.&%'
                  	call	xefdb			; 0000CA49  E88F25  '..%'
                  	xor	ah,ah			; 0000CA4C  32E4  '2.'
                  xca4e:	ret				; 0000CA4E  C3  '.'
                  
                  xca4f:	mov	ax,0x10			; 0000CA4F  B81000  '...'
                  	mul	word [bp+0xc]		; 0000CA52  F7660C  '.f.'
                  	add	ax,[bp+0x2]		; 0000CA55  034602  '.F.'
                  	adc	dl,0x0			; 0000CA58  80D200  '...'
                  	cli				; 0000CA5B  FA  '.'
                  	out	0xc,al			; 0000CA5C  E60C  '..'
                  	out	0x4,al			; 0000CA5E  E604  '..'
                  	xchg	al,ah			; 0000CA60  86C4  '..'
                  	out	0x4,al			; 0000CA62  E604  '..'
                  	xchg	al,ah			; 0000CA64  86C4  '..'
                  	mov	bx,ax			; 0000CA66  8BD8  '..'
                  	mov	al,dl			; 0000CA68  8AC2  '..'
                  	out	0x81,al			; 0000CA6A  E681  '..'
                  	mov	ax,cx			; 0000CA6C  8BC1  '..'
                  	out	0x5,al			; 0000CA6E  E605  '..'
                  	xchg	al,ah			; 0000CA70  86C4  '..'
                  	out	0x5,al			; 0000CA72  E605  '..'
                  	xchg	al,ah			; 0000CA74  86C4  '..'
                  	sti				; 0000CA76  FB  '.'
                  	ret				; 0000CA77  C3  '.'
                  
                  xca78:	mov	bh,[bp+0x7]		; 0000CA78  8A7E07  '.~.'
                  	shl	bh,0x2			; 0000CA7B  C0E702  '...'
                  	or	bh,[bp+0x6]		; 0000CA7E  0A7E06  0x0A,'~.'
                  	call	xd4c4			; 0000CA81  E8400A  '.@',0x0A
                  	mov	bh,[bp+0x5]		; 0000CA84  8A7E05  '.~.'
                  	call	xd4c4			; 0000CA87  E83A0A  '.:',0x0A
                  	ret				; 0000CA8A  C3  '.'
                  
                  	times	12 db 0xFF		; 0000CA8B - 0000CA96
                  
                  xca97:	push	ax			; 0000CA97  50
                  	mov	al,0x20			; 0000CA98  B020
                  	out	0xa0,al			; 0000CA9A  E6A0
                  	out	0x20,al			; 0000CA9C  E620
                  	mov	al,0xb			; 0000CA9E  B00B  '..'
                  	call	xb544			; 0000CAA0  E8A1EA  '...'
                  	mov	ah,al			; 0000CAA3  8AE0  '..'
                  	mov	al,0xc			; 0000CAA5  B00C  '..'
                  	call	xb544			; 0000CAA7  E89AEA  '...'
                  	and	al,ah			; 0000CAAA  22C4  '".'
                  	test	al,0x40			; 0000CAAC  A840  '.@'
                  	jz	xcab3			; 0000CAAE  7403
                  	call	xcac1			; 0000CAB0  E80E00  '...'
                  xcab3:	test	al,0x20			; 0000CAB3  A820  '. '
                  	jz	xcaba			; 0000CAB5  7403  't.'
                  	call	xcabc			; 0000CAB7  E80200  '...'
                  xcaba:	pop	ax			; 0000CABA  58  'X'
                  	iret				; 0000CABB  CF  '.'
                  
                  xcabc:	push	ax			; 0000CABC  50  'P'
                  	int	0x4a			; 0000CABD  CD4A  '.J'
                  	pop	ax			; 0000CABF  58  'X'
                  	ret				; 0000CAC0  C3  '.'
                  
                  xcac1:	push	es			; 0000CAC1  06  '.'
                  	push	bx			; 0000CAC2  53  'S'
                  	push	ds			; 0000CAC3  1E  '.'
                  	push	ax			; 0000CAC4  50  'P'
                  	mov	ax,0x40			; 0000CAC5  B84000  '.@.'
                  	mov	ds,ax			; 0000CAC8  8ED8  '..'
                  	test	byte [0xa0],0x1		; 0000CACA  F606A00001  '.....'
                  	jz	xcafc			; 0000CACF  742B  't+'
                  	sub	word [0x9c],0x3d0	; 0000CAD1  812E9C00D003  '......'
                  	jnc	xcafc			; 0000CAD7  7323  's#'
                  	sub	word [0x9e],byte +0x1	; 0000CAD9  832E9E0001  '.....'
                  	jnc	xcafc			; 0000CADE  731C  's.'
                  	pop	ax			; 0000CAE0  58  'X'
                  	push	ax			; 0000CAE1  50  'P'
                  	mov	al,0xb			; 0000CAE2  B00B  '..'
                  	and	ah,0xbf			; 0000CAE4  80E4BF  '...'
                  	call	xb549			; 0000CAE7  E85FEA  '._.'
                  	and	byte [0xa0],0xfe	; 0000CAEA  8026A000FE  '.&...'
                  	mov	ax,[0x9a]		; 0000CAEF  A19A00  '...'
                  	mov	es,ax			; 0000CAF2  8EC0  '..'
                  	mov	bx,[0x98]		; 0000CAF4  8B1E9800  '....'
                  	or	byte [es:bx],0x80	; 0000CAF8  26800F80  '&...'
                  xcafc:	pop	ax			; 0000CAFC  58  'X'
                  	pop	ds			; 0000CAFD  1F  '.'
                  	pop	bx			; 0000CAFE  5B  '['
                  	pop	es			; 0000CAFF  07  '.'
                  	ret				; 0000CB00  C3  '.'
                  
                  xcb01:	push	ax			; 0000CB01  50  'P'
                  	and	ax,0xe0			; 0000CB02  25E000  '%..'
                  	xchg	ax,si			; 0000CB05  96  '.'
                  	add	dx,byte +0x3		; 0000CB06  83C203  '...'
                  	mov	al,0x80			; 0000CB09  B080  '..'
                  	out	dx,al			; 0000CB0B  EE  '.'
                  	sub	dx,byte +0x3		; 0000CB0C  83EA03  '...'
                  	mov	cl,0x4			; 0000CB0F  B104  '..'
                  	shr	si,cl			; 0000CB11  D3EE  '..'
                  	mov	ax,[cs:si+0xcc2e]	; 0000CB13  2E8B842ECC  '.....'
                  	out	dx,al			; 0000CB18  EE  '.'
                  	mov	al,ah			; 0000CB19  8AC4  '..'
                  	inc	dx			; 0000CB1B  42  'B'
                  	out	dx,al			; 0000CB1C  EE  '.'
                  	inc	dx			; 0000CB1D  42  'B'
                  	inc	dx			; 0000CB1E  42  'B'
                  	pop	ax			; 0000CB1F  58  'X'
                  	and	al,0x1f			; 0000CB20  241F  '$.'
                  	out	dx,al			; 0000CB22  EE  '.'
                  	dec	dx			; 0000CB23  4A  'J'
                  	dec	dx			; 0000CB24  4A  'J'
                  	xor	al,al			; 0000CB25  32C0  '2.'
                  	out	dx,al			; 0000CB27  EE  '.'
                  	dec	dx			; 0000CB28  4A  'J'
                  
                  xcb29:	add	dx,byte +0x5		; 0000CB29  83C205  '...'
                  	in	al,dx			; 0000CB2C  EC  '.'
                  	mov	ah,al			; 0000CB2D  8AE0  '..'
                  	inc	dx			; 0000CB2F  42  'B'
                  	in	al,dx			; 0000CB30  EC  '.'
                  	ret				; 0000CB31  C3  '.'
                  
                  xcb32:	push	ax			; 0000CB32  50  'P'
                  	push	dx			; 0000CB33  52  'R'
                  	mov	al,0x3			; 0000CB34  B003  '..'
                  	call	xcbbb			; 0000CB36  E88200  '...'
                  	jz	xcb48			; 0000CB39  740D  't',0x0D
                  	mov	bh,0x10			; 0000CB3B  B710  '..'
                  	call	x9e03			; 0000CB3D  E8C3D2  '...'
                  	jz	xcb48			; 0000CB40  7406  't.'
                  	dec	dx			; 0000CB42  4A  'J'
                  	mov	bh,0x20			; 0000CB43  B720  '. '
                  	call	x9e03			; 0000CB45  E8BBD2  '...'
                  xcb48:	pop	dx			; 0000CB48  5A  'Z'
                  	pop	cx			; 0000CB49  59  'Y'
                  	test	ah,ah			; 0000CB4A  84E4  '..'
                  	jnz	xcb5b			; 0000CB4C  750D  'u',0x0D
                  	push	dx			; 0000CB4E  52  'R'
                  	add	dx,byte +0x5		; 0000CB4F  83C205  '...'
                  	in	al,dx			; 0000CB52  EC  '.'
                  	mov	ah,al			; 0000CB53  8AE0  '..'
                  	mov	al,cl			; 0000CB55  8AC1  '..'
                  	pop	dx			; 0000CB57  5A  'Z'
                  	out	dx,al			; 0000CB58  EE  '.'
                  	jmp	short xcb5d		; 0000CB59  EB02  '..'
                  
                  xcb5b:	mov	al,cl			; 0000CB5B  8AC1  '..'
                  xcb5d:	ret				; 0000CB5D  C3  '.'
                  
                  xcb5e:	mov	al,0x1			; 0000CB5E  B001  '..'
                  	call	xcbbb			; 0000CB60  E85800  '.X.'
                  	jz	xcbaa			; 0000CB63  7445  'tE'
                  	mov	si,0x71			; 0000CB65  BE7100  '.q.'
                  	and	byte [si],0x7f		; 0000CB68  80247F  '.$.'
                  	dec	dx			; 0000CB6B  4A  'J'
                  	mov	bh,0x1			; 0000CB6C  B701  '..'
                  xcb6e:	mov	cx,0x5a			; 0000CB6E  B95A00  '.Z.'
                  	mov	ah,0x80			; 0000CB71  B480  '..'
                  xcb73:	push	ax			; 0000CB73  50  'P'
                  	mov	al,0x0			; 0000CB74  B000  '..'
                  	out	0x43,al			; 0000CB76  E643  '.C'
                  	in	al,0x40			; 0000CB78  E440  '.@'
                  	xchg	al,ah			; 0000CB7A  86C4  '..'
                  	in	al,0x40			; 0000CB7C  E440  '.@'
                  	xchg	al,ah			; 0000CB7E  86C4  '..'
                  	mov	di,ax			; 0000CB80  8BF8  '..'
                  	pop	ax			; 0000CB82  58  'X'
                  xcb83:	in	al,dx			; 0000CB83  EC  '.'
                  	test	bh,al			; 0000CB84  84C7  '..'
                  	jnz	xcbb1			; 0000CB86  7529  'u)'
                  	test	[si],ah			; 0000CB88  8424  '.$'
                  	jnz	xcbaa			; 0000CB8A  751E  'u.'
                  	push	ax			; 0000CB8C  50  'P'
                  	mov	al,0x0			; 0000CB8D  B000  '..'
                  	out	0x43,al			; 0000CB8F  E643  '.C'
                  	in	al,0x40			; 0000CB91  E440  '.@'
                  	xchg	al,ah			; 0000CB93  86C4  '..'
                  	in	al,0x40			; 0000CB95  E440  '.@'
                  	xchg	al,ah			; 0000CB97  86C4  '..'
                  	push	di			; 0000CB99  57  'W'
                  	sub	di,ax			; 0000CB9A  2BF8  '+.'
                  	cmp	di,0x5d20		; 0000CB9C  81FF205D  '.. ]'
                  	pop	di			; 0000CBA0  5F  '_'
                  	pop	ax			; 0000CBA1  58  'X'
                  	jc	xcb83			; 0000CBA2  72DF  'r.'
                  	loop	xcb73			; 0000CBA4  E2CD  '..'
                  	dec	bl			; 0000CBA6  FECB  '..'
                  	jnz	xcb6e			; 0000CBA8  75C4  'u.'
                  xcbaa:	or	ah,0x80			; 0000CBAA  80CC80  '...'
                  	xor	al,al			; 0000CBAD  32C0  '2.'
                  	jmp	short xcbba		; 0000CBAF  EB09  '..'
                  
                  xcbb1:	mov	ah,al			; 0000CBB1  8AE0  '..'
                  	sub	dx,byte +0x5		; 0000CBB3  83EA05  '...'
                  	in	al,dx			; 0000CBB6  EC  '.'
                  	and	ah,0x1e			; 0000CBB7  80E41E  '...'
                  xcbba:	ret				; 0000CBBA  C3  '.'
                  
                  xcbbb:	add	dx,byte +0x4		; 0000CBBB  83C204  '...'
                  	out	dx,al			; 0000CBBE  EE  '.'
                  	inc	dx			; 0000CBBF  42  'B'
                  	inc	dx			; 0000CBC0  42  'B'
                  	mov	bh,0x20			; 0000CBC1  B720  '. '
                  	jmp	x9e03			; 0000CBC3  E93DD2  '.=.'
                  
                  	add	[bx+si],cl		; 0000CBC6  0008  '..'
                  	sbb	[bx+si],ch		; 0000CBC8  1828  '.('
                  	db	0x38			; 0000CBCA  38
                  
                  xcbcb:	cmp	al,0x01			; 0000CBCB  3C01
                  	cmc				; 0000CBCD  F5
                  	rcr	ah,1			; 0000CBCE  D0DC  '..'
                  	rcr	ah,1			; 0000CBD0  D0DC  '..'
                  	or	ah,ch			; 0000CBD2  0AE5  0x0A,'.'
                  	shl	bl,1			; 0000CBD4  D0E3  '..'
                  	shl	bl,1			; 0000CBD6  D0E3  '..'
                  	or	ah,bl			; 0000CBD8  0AE3  0x0A,'.'
                  	xor	bl,bl			; 0000CBDA  32DB  '2.'
                  	xchg	bh,bl			; 0000CBDC  86FB  '..'
                  	mov	si,0xcbc6		; 0000CBDE  BEC6CB  '...'
                  	add	si,bx			; 0000CBE1  03F3  '..'
                  	or	ah,[cs:si]		; 0000CBE3  2E0A24  '.',0x0A,'$'
                  	mov	bh,ah			; 0000CBE6  8AFC  '..'
                  	add	dx,byte +0x3		; 0000CBE8  83C203  '...'
                  	mov	al,0x80			; 0000CBEB  B080  '..'
                  	out	dx,al			; 0000CBED  EE  '.'
                  	sub	dx,byte +0x3		; 0000CBEE  83EA03  '...'
                  	xor	ch,ch			; 0000CBF1  32ED  '2.'
                  	mov	si,cx			; 0000CBF3  8BF1  '..'
                  	shl	si,1			; 0000CBF5  D1E6  '..'
                  	mov	ax,[cs:si+0xcc2e]	; 0000CBF7  2E8B842ECC  '.....'
                  	out	dx,al			; 0000CBFC  EE  '.'
                  	xchg	ah,al			; 0000CBFD  86E0  '..'
                  	inc	dx			; 0000CBFF  42  'B'
                  	out	dx,al			; 0000CC00  EE  '.'
                  	inc	dx			; 0000CC01  42  'B'
                  	inc	dx			; 0000CC02  42  'B'
                  	mov	al,bh			; 0000CC03  8AC7  '..'
                  	out	dx,al			; 0000CC05  EE  '.'
                  	dec	dx			; 0000CC06  4A  'J'
                  	dec	dx			; 0000CC07  4A  'J'
                  	xor	al,al			; 0000CC08  32C0  '2.'
                  	out	dx,al			; 0000CC0A  EE  '.'
                  	dec	dx			; 0000CC0B  4A  'J'
                  	call	xcb29			; 0000CC0C  E81AFF  '...'
                  	ret				; 0000CC0F  C3  '.'
                  
                  xcc10:	cmp	al,0x2			; 0000CC10  3C02  '<.'
                  	jnc	xcc2d			; 0000CC12  7319  's.'
                  	add	dx,byte +0x4		; 0000CC14  83C204  '...'
                  	or	al,al			; 0000CC17  0AC0  0x0A,'.'
                  	jnz	xcc21			; 0000CC19  7506  'u.'
                  	in	al,dx			; 0000CC1B  EC  '.'
                  	mov	[bp+0xc],al		; 0000CC1C  88460C  '.F.'
                  	jmp	short xcc27		; 0000CC1F  EB06  '..'
                  
                  xcc21:	and	bl,0x1f			; 0000CC21  80E31F  '...'
                  	mov	al,bl			; 0000CC24  8AC3  '..'
                  	out	dx,al			; 0000CC26  EE  '.'
                  xcc27:	sub	dx,byte +0x4		; 0000CC27  83EA04  '...'
                  	call	xcb29			; 0000CC2A  E8FCFE  '...'
                  xcc2d:	ret				; 0000CC2D  C3  '.'
                  
                  	pop	ss			; 0000CC2E  17  '.'
                  	add	al,0x0			; 0000CC2F  0400  '..'
                  	add	ax,[bx+si+0xc001]	; 0000CC31  038001C0  '....'
                  	add	[bx+si+0x0],ah		; 0000CC35  006000  '.`.'
                  	xor	[bx+si],al		; 0000CC38  3000  '0.'
                  	sbb	[bx+si],al		; 0000CC3A  1800  '..'
                  	or	al,0x0			; 0000CC3C  0C00  '..'
                  	push	es			; 0000CC3E  06  '.'
                  	add	[bp+di],al		; 0000CC3F  0003  '..'
                  	add	[bp+si],al		; 0000CC41  0002  '..'
                  	add	[bx+si],al		; 0000CC43  0000  '..'
                  	stosb				; 0000CC45  AA  '.'
                  	push	bp			; 0000CC46  55  'U'
                  	add	[bp+si],ax		; 0000CC47  0102  '..'
                  	add	al,0x8			; 0000CC49  0408  '..'
                  	adc	[bx+si],ah		; 0000CC4B  1020  '. '
                  	inc	ax			; 0000CC4D  40  '@'
                  	cmp	bh,0x0			; 0000CC4E  80FF00  '...'
                  
                  xcc51:	mov	al,0x90			; 0000CC51  B090  '..'
                  	out	0x84,al			; 0000CC53  E684  '..'
                  	mov	cx,0xe			; 0000CC55  B90E00  '...'
                  	mov	si,0xcc44		; 0000CC58  BE44CC  '.D.'
                  xcc5b:	loop	xcc5f			; 0000CC5B  E202  '..'
                  	jmp	short xcc83		; 0000CC5D  EB24  '.$'
                  
                  xcc5f:	cs	lodsb			; 0000CC5F  2EAC  '..'
                  	mov	ah,al			; 0000CC61  8AE0  '..'
                  	mov	al,0x8f			; 0000CC63  B08F  '..'
                  	call	xb549			; 0000CC65  E8E1E8  '...'
                  	mov	al,0x8f			; 0000CC68  B08F  '..'
                  	call	xb544			; 0000CC6A  E8D7E8  '...'
                  	cmp	ah,al			; 0000CC6D  3AE0  ':.'
                  	jz	xcc5b			; 0000CC6F  74EA  't.'
                  	mov	al,0x92			; 0000CC71  B092  '..'
                  	out	0x84,al			; 0000CC73  E684  '..'
                  	mov	dx,0x0			; 0000CC75  BA0000  '...'
                  
                  	mov	bx,err102		; 0000CC78  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000CC7B  B91A00  '...'
                  	call	xc745			; 0000CC7E  E8C4FA  '...'
                  xcc81:	jmp	short xcc81		; 0000CC81  Hang the machine
                  
                  xcc83:	mov	al,0x91			; 0000CC83  B091  '..'
                  	out	0x84,al			; 0000CC85  E684  '..'
                  	ret				; 0000CC87  C3  '.'
                  
                  xcc88:	mov	al,0x93			; 0000CC88  B093  '..'
                  	out	0x84,al			; 0000CC8A  E684  '..'
                  	mov	al,0x4			; 0000CC8C  B004  '..'
                  	out	0x8,al			; 0000CC8E  E608  '..'
                  	out	0xd0,al			; 0000CC90  E6D0  '..'
                  	out	0xd,al			; 0000CC92  E60D  '.',0x0D
                  	out	0xda,al			; 0000CC94  E6DA  '..'
                  	mov	cx,0xe			; 0000CC96  B90E00  '...'
                  	mov	si,0xcc44		; 0000CC99  BE44CC  '.D.'
                  xcc9c:	loop	xcca1			; 0000CC9C  E203  '..'
                  	jmp	xcd3a			; 0000CC9E  E99900  '...'
                  
                  xcca1:	cs	lodsb			; 0000CCA1  2EAC  '..'
                  	mov	bx,cx			; 0000CCA3  8BD9  '..'
                  	mov	dx,0x0			; 0000CCA5  BA0000  '...'
                  	mov	cx,0x8			; 0000CCA8  B90800  '...'
                  xccab:	out	dx,al			; 0000CCAB  EE  '.'
                  	out	dx,al			; 0000CCAC  EE  '.'
                  	inc	dx			; 0000CCAD  42  'B'
                  	loop	xccab			; 0000CCAE  E2FB  '..'
                  	mov	dx,0xc0			; 0000CCB0  BAC000  '...'
                  	mov	cx,0x8			; 0000CCB3  B90800  '...'
                  xccb6:	out	dx,al			; 0000CCB6  EE  '.'
                  	out	dx,al			; 0000CCB7  EE  '.'
                  	inc	dx			; 0000CCB8  42  'B'
                  	inc	dx			; 0000CCB9  42  'B'
                  	loop	xccb6			; 0000CCBA  E2FA  '..'
                  	out	0x87,al			; 0000CCBC  E687  '..'
                  	out	0x83,al			; 0000CCBE  E683  '..'
                  	out	0x81,al			; 0000CCC0  E681  '..'
                  	out	0x82,al			; 0000CCC2  E682  '..'
                  	out	0x8b,al			; 0000CCC4  E68B  '..'
                  	out	0x89,al			; 0000CCC6  E689  '..'
                  	out	0x8a,al			; 0000CCC8  E68A  '..'
                  	mov	ah,al			; 0000CCCA  8AE0  '..'
                  	in	al,0x87			; 0000CCCC  E487  '..'
                  	cmp	al,ah			; 0000CCCE  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCD0  755A  'uZ'
                  	jmp	short xccd4		; 0000CCD2  EB00  '..'
                  
                  xccd4:	in	al,0x83			; 0000CCD4  E483  '..'
                  	cmp	al,ah			; 0000CCD6  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCD8  7552  'uR'
                  	jmp	short xccdc		; 0000CCDA  EB00  '..'
                  
                  xccdc:	in	al,0x81			; 0000CCDC  E481  '..'
                  	cmp	al,ah			; 0000CCDE  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCE0  754A  'uJ'
                  	jmp	short xcce4		; 0000CCE2  EB00  '..'
                  
                  xcce4:	in	al,0x82			; 0000CCE4  E482  '..'
                  	cmp	al,ah			; 0000CCE6  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCE8  7542  'uB'
                  	jmp	short xccec		; 0000CCEA  EB00  '..'
                  
                  xccec:	in	al,0x8b			; 0000CCEC  E48B  '..'
                  	cmp	al,ah			; 0000CCEE  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCF0  753A  'u:'
                  	jmp	short xccf4		; 0000CCF2  EB00  '..'
                  
                  xccf4:	in	al,0x89			; 0000CCF4  E489  '..'
                  	cmp	al,ah			; 0000CCF6  3AC4  ':.'
                  	jnz	xcd2c			; 0000CCF8  7532  'u2'
                  	jmp	short xccfc		; 0000CCFA  EB00  '..'
                  
                  xccfc:	in	al,0x8a			; 0000CCFC  E48A  '..'
                  	cmp	al,ah			; 0000CCFE  3AC4  ':.'
                  	jnz	xcd2c			; 0000CD00  752A  'u*'
                  	jmp	short xcd04		; 0000CD02  EB00  '..'
                  
                  xcd04:	mov	al,0x94			; 0000CD04  B094  '..'
                  	out	0x84,al			; 0000CD06  E684  '..'
                  	mov	dx,0x0			; 0000CD08  BA0000  '...'
                  	mov	cx,0x8			; 0000CD0B  B90800  '...'
                  xcd0e:	in	al,dx			; 0000CD0E  EC  '.'
                  	in	al,dx			; 0000CD0F  EC  '.'
                  	inc	dx			; 0000CD10  42  'B'
                  	cmp	al,ah			; 0000CD11  3AC4  ':.'
                  	jnz	xcd2c			; 0000CD13  7517  'u.'
                  	loop	xcd0e			; 0000CD15  E2F7  '..'
                  	mov	dx,0xc0			; 0000CD17  BAC000  '...'
                  	mov	cx,0x8			; 0000CD1A  B90800  '...'
                  xcd1d:	in	al,dx			; 0000CD1D  EC  '.'
                  	in	al,dx			; 0000CD1E  EC  '.'
                  	inc	dx			; 0000CD1F  42  'B'
                  	inc	dx			; 0000CD20  42  'B'
                  	cmp	al,ah			; 0000CD21  3AC4  ':.'
                  	jnz	xcd2c			; 0000CD23  7507  'u.'
                  	loop	xcd1d			; 0000CD25  E2F6  '..'
                  	mov	cx,bx			; 0000CD27  8BCB  '..'
                  	jmp	xcc9c			; 0000CD29  E970FF  '.p.'
                  
                  xcd2c:	mov	dx,0x0			; 0000CD2C  BA0000  '...'
                  	mov	bx,err102		; 0000CD2F  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000CD32  B91A00  '...'
                  	call	xc745			; 0000CD35  E80DFA  '.',0x0D,'.'
                  xcd38:	jmp	short xcd38		; 0000CD38  Hang the machine
                  
                  xcd3a:	mov	al,0x95			; 0000CD3A  B095  '..'
                  	out	0x84,al			; 0000CD3C  E684  '..'
                  	out	0xd,al			; 0000CD3E  E60D  '.',0x0D
                  	out	0xda,al			; 0000CD40  E6DA  '..'
                  	mov	al,0x0			; 0000CD42  B000  '..'
                  	out	0x8,al			; 0000CD44  E608  '..'
                  	out	0xd0,al			; 0000CD46  E6D0  '..'
                  	mov	al,0x40			; 0000CD48  B040  '.@'
                  	out	0xb,al			; 0000CD4A  E60B  '..'
                  	mov	al,0x41			; 0000CD4C  B041  '.A'
                  	out	0xb,al			; 0000CD4E  E60B  '..'
                  	mov	al,0x42			; 0000CD50  B042  '.B'
                  	out	0xb,al			; 0000CD52  E60B  '..'
                  	mov	al,0x43			; 0000CD54  B043  '.C'
                  	out	0xb,al			; 0000CD56  E60B  '..'
                  	mov	al,0xc0			; 0000CD58  B0C0  '..'
                  	out	0xd6,al			; 0000CD5A  E6D6  '..'
                  	mov	al,0x41			; 0000CD5C  B041  '.A'
                  	out	0xd6,al			; 0000CD5E  E6D6  '..'
                  	mov	al,0x42			; 0000CD60  B042  '.B'
                  	out	0xd6,al			; 0000CD62  E6D6  '..'
                  	mov	al,0x43			; 0000CD64  B043  '.C'
                  	out	0xd6,al			; 0000CD66  E6D6  '..'
                  	mov	al,0x96			; 0000CD68  B096  '..'
                  	out	0x84,al			; 0000CD6A  E684  '..'
                  	ret				; 0000CD6C  C3  '.'
                  
                  xcd6d:	pushf				; 0000CD6D  9C  '.'
                  	cli				; 0000CD6E  FA  '.'
                  xcd6f:	mov	al,0x8a			; 0000CD6F  B08A  '..'
                  	call	xb544			; 0000CD71  E8D0E7  '...'
                  	test	al,0x80			; 0000CD74  A880  '..'
                  	jz	xcd7a			; 0000CD76  7402  't.'
                  	jmp	short xcd6f		; 0000CD78  EBF5  '..'
                  
                  xcd7a:	mov	al,0x80			; 0000CD7A  B080  '..'
                  	call	xb544			; 0000CD7C  E8C5E7  '...'
                  	mov	dh,al			; 0000CD7F  8AF0  '..'
                  	mov	al,0x82			; 0000CD81  B082  '..'
                  	call	xb544			; 0000CD83  E8BEE7  '...'
                  	mov	cl,al			; 0000CD86  8AC8  '..'
                  	mov	al,0x84			; 0000CD88  B084  '..'
                  	call	xb544			; 0000CD8A  E8B7E7  '...'
                  	mov	ch,al			; 0000CD8D  8AE8  '..'
                  	popf				; 0000CD8F  9D  '.'
                  	mov	al,dh			; 0000CD90  8AC6  '..'
                  	call	xce67			; 0000CD92  E8D200  '...'
                  	cmp	al,0x3b			; 0000CD95  3C3B  '<;'
                  	ja	xcdfe			; 0000CD97  7765  'we'
                  	xchg	al,ah			; 0000CD99  86C4  '..'
                  	mov	si,ax			; 0000CD9B  8BF0  '..'
                  	mov	al,cl			; 0000CD9D  8AC1  '..'
                  	call	xce67			; 0000CD9F  E8C500  '...'
                  	cmp	al,0x3b			; 0000CDA2  3C3B  '<;'
                  	ja	xcdfe			; 0000CDA4  7758  'wX'
                  	mov	bl,al			; 0000CDA6  8AD8  '..'
                  	mov	al,ch			; 0000CDA8  8AC5  '..'
                  	call	xce67			; 0000CDAA  E8BA00  '...'
                  	cmp	al,0x17			; 0000CDAD  3C17  '<.'
                  	ja	xcdfe			; 0000CDAF  774D  'wM'
                  	mov	bh,al			; 0000CDB1  8AF8  '..'
                  	mov	ax,bx			; 0000CDB3  8BC3  '..'
                  	xor	cx,cx			; 0000CDB5  33C9  '3.'
                  	xchg	cl,ah			; 0000CDB7  86CC  '..'
                  	push	cx			; 0000CDB9  51  'Q'
                  	mov	cx,0x2223		; 0000CDBA  B92322  '.#"'
                  	mul	cx			; 0000CDBD  F7E1  '..'
                  	xchg	ax,bx			; 0000CDBF  93  '.'
                  	pop	ax			; 0000CDC0  58  'X'
                  	push	dx			; 0000CDC1  52  'R'
                  	mov	cx,0x3c			; 0000CDC2  B93C00  '.<.'
                  	mul	cx			; 0000CDC5  F7E1  '..'
                  	mov	cx,0x2223		; 0000CDC7  B92322  '.#"'
                  	mul	cx			; 0000CDCA  F7E1  '..'
                  	add	bx,ax			; 0000CDCC  03D8  '..'
                  	pop	cx			; 0000CDCE  59  'Y'
                  	adc	dx,cx			; 0000CDCF  13D1  '..'
                  	mov	ax,si			; 0000CDD1  8BC6  '..'
                  	mov	cl,al			; 0000CDD3  8AC8  '..'
                  	mov	al,ah			; 0000CDD5  8AC4  '..'
                  	mov	ah,0x92			; 0000CDD7  B492  '..'
                  	mul	ah			; 0000CDD9  F6E4  '..'
                  	shl	cx,1			; 0000CDDB  D1E1  '..'
                  	add	cx,ax			; 0000CDDD  03C8  '..'
                  	xor	ax,ax			; 0000CDDF  33C0  '3.'
                  	add	cx,bx			; 0000CDE1  03CB  '..'
                  	adc	dx,ax			; 0000CDE3  13D0  '..'
                  	xchg	dx,cx			; 0000CDE5  87D1  '..'
                  	add	dx,byte +0x7		; 0000CDE7  83C207  '...'
                  	adc	cx,ax			; 0000CDEA  13C8  '..'
                  	shr	cx,1			; 0000CDEC  D1E9  '..'
                  	rcr	dx,1			; 0000CDEE  D1DA  '..'
                  	shr	cx,1			; 0000CDF0  D1E9  '..'
                  	rcr	dx,1			; 0000CDF2  D1DA  '..'
                  	shr	cx,1			; 0000CDF4  D1E9  '..'
                  	rcr	dx,1			; 0000CDF6  D1DA  '..'
                  	mov	ah,0x1			; 0000CDF8  B401  '..'
                  	int	0x1a			; 0000CDFA  CD1A  '..'
                  	jmp	short xce0c		; 0000CDFC  EB0E  '..'
                  
                  xcdfe:	mov	al,0x8e			; 0000CDFE  B08E  '..'
                  	call	xb544			; 0000CE00  E841E7  '.A.'
                  	or	al,0x4			; 0000CE03  0C04  '..'
                  	mov	ah,al			; 0000CE05  8AE0  '..'
                  	mov	al,0x8e			; 0000CE07  B08E  '..'
                  	call	xb549			; 0000CE09  E83DE7  '.=.'
                  xce0c:	push	es			; 0000CE0C  06  '.'
                  	mov	ax,0x40			; 0000CE0D  B84000  '.@.'
                  	mov	ds,ax			; 0000CE10  8ED8  '..'
                  	xor	ax,ax			; 0000CE12  33C0  '3.'
                  	mov	es,ax			; 0000CE14  8EC0  '..'
                  	mov	bp,[es:0x20]		; 0000CE16  268B2E2000  '&.. .'
                  	mov	word [es:0x20],0xce54	; 0000CE1B  26C706200054CE  '&.. .T.'
                  	and	byte [0x6b],0xfe	; 0000CE22  80266B00FE  '.&k..'
                  	in	al,0x21			; 0000CE27  E421  '.!'
                  	and	al,0xfe			; 0000CE29  24FE  '$.'
                  	out	0x21,al			; 0000CE2B  E621  '.!'
                  	mov	bx,0x3c			; 0000CE2D  BB3C00  '.<.'
                  	call	xc638			; 0000CE30  E805F8  '...'
                  	test	byte [0x6b],0x1		; 0000CE33  F6066B0001  '..k..'
                  	jnz	xce48			; 0000CE38  750E
                  
                  	mov	dx,0x0			; 0000CE3A  BA0000  '...'
                  	mov	bx,err102		; 0000CE3D  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000CE40  B91A00  '...'
                  	call	xc745			; 0000CE43  E8FFF8  '...'
                  xce46:	jmp	short xce46		; 0000CE46  Hang the machine
                  
                  xce48:	mov	[es:0x20],bp		; 0000CE48  26892E2000  '&.. .'
                  	and	byte [0x6b],0xfe	; 0000CE4D  80266B00FE  '.&k..'
                  	pop	es			; 0000CE52  07  '.'
                  	ret				; 0000CE53  C3  '.'
                  
                  	push	ds			; 0000CE54  1E  '.'
                  	push	ax			; 0000CE55  50  'P'
                  	mov	ax,0x40			; 0000CE56  B84000  '.@.'
                  	mov	ds,ax			; 0000CE59  8ED8  '..'
                  	or	byte [0x6b],0x1		; 0000CE5B  800E6B0001  '..k..'
                  	mov	al,0x20			; 0000CE60  B020  '. '
                  	out	0x20,al			; 0000CE62  E620  '. '
                  	pop	ax			; 0000CE64  58  'X'
                  	pop	ds			; 0000CE65  1F  '.'
                  	iret				; 0000CE66  CF  '.'
                  
                  xce67:	mov	ah,al			; 0000CE67  8AE0  '..'
                  	shr	ah,0x4			; 0000CE69  C0EC04  '...'
                  	and	al,0xf			; 0000CE6C  240F  '$.'
                  	aad				; 0000CE6E  D50A  '.',0x0A
                  	ret				; 0000CE70  C3  '.'
                  
                  xce71:	mov	ax,0x40			; 0000CE71  B84000  '.@.'
                  	mov	ds,ax			; 0000CE74  8ED8  '..'
                  	mov	bx,[0x10]		; 0000CE76  8B1E1000  '....'
                  	fninit				; 0000CE7A  DBE3  '..'
                  	wait				; 0000CE7C  9B  '.'
                  	fnstsw	[0x10]			; 0000CE7D  DD3E1000  '.>..'
                  	mov	al,[0x10]		; 0000CE81  A01000  '...'
                  	or	al,al			; 0000CE84  0AC0  0x0A,'.'
                  	jnz	xce8b			; 0000CE86  7503  'u.'
                  	or	bl,0x2			; 0000CE88  80CB02  '...'
                  xce8b:	in	al,0x60			; 0000CE8B  E460  '.`'
                  	mov	al,0xc0			; 0000CE8D  B0C0  '..'
                  	out	0x64,al			; 0000CE8F  E664  '.d'
                  xce91:	in	al,0x64			; 0000CE91  E464  '.d'
                  	test	al,0x2			; 0000CE93  A802  '..'
                  	jz	xce99			; 0000CE95  7402  't.'
                  	jmp	short xce91		; 0000CE97  EBF8  '..'
                  
                  xce99:	in	al,0x64			; 0000CE99  E464  '.d'
                  	test	al,0x1			; 0000CE9B  A801  '..'
                  	jz	xce99			; 0000CE9D  74FA  't.'
                  	in	al,0x60			; 0000CE9F  E460  '.`'
                  	test	al,0x4			; 0000CEA1  A804  '..'
                  	jnz	xceac			; 0000CEA3  7507  'u.'
                  	test	bl,0x2			; 0000CEA5  F6C302  '...'
                  	jnz	0xceca			; 0000CEA8  7520  'u '
                  	jmp	short xceb7		; 0000CEAA  EB0B  '..'
                  
                  xceac:	test	bl,0x2			; 0000CEAC  F6C302  '...'
                  	jnz	xceb7			; 0000CEAF  7506  'u.'
                  	and	bl,0xfd			; 0000CEB1  80E3FD  '...'
                  	jmp	short xced6		; 0000CEB4  EB20  '. '
                  	nop				; 0000CEB6  90  '.'
                  xceb7:	and	bl,0xfd			; 0000CEB7  80E3FD  '...'
                  	push	bx			; 0000CEBA  53  'S'
                  	mov	dx,0x0			; 0000CEBB  BA0000  '...'
                  	mov	bx,0xb84f		; 0000CEBE  BB4FB8  '.O.'
                  	mov	cx,0x3d			; 0000CEC1  B93D00  '.=.'
                  	call	xc745			; 0000CEC4  E87EF8  '.~.'
                  	pop	bx			; 0000CEC7  5B  '['
                  	jmp	short xced6		; 0000CEC8  EB0C  '..'
                  
                  	in	al,0xa1			; 0000CECA  E4A1  '..'
                  	and	al,0xdf			; 0000CECC  24DF  '$.'
                  	out	0xa1,al			; 0000CECE  E6A1  '..'
                  	in	al,0x21			; 0000CED0  E421  '.!'
                  	and	al,0xfb			; 0000CED2  24FB  '$.'
                  	out	0x21,al			; 0000CED4  E621  '.!'
                  xced6:	mov	[0x10],bx		; 0000CED6  891E1000  '....'
                  	ret				; 0000CEDA  C3  '.'
                  
                  xcedb:	mov	al,0x8b			; 0000CEDB  B08B  '..'
                  	out	0x84,al			; 0000CEDD  E684  '..'
                  	call	xd03e			; 0000CEDF  E85C01  '.\.'
                  	jc	xceff			; 0000CEE2  721B  'r.'
                  	cmp	al,0x5			; 0000CEE4  3C05  '<.'
                  	jnz	xcef8			; 0000CEE6  7510  'u.'
                  	mov	dx,0x0			; 0000CEE8  BA0000  '...'
                  	mov	bx,0xb7a8		; 0000CEEB  BBA8B7  '...'
                  	mov	cx,0x2f			; 0000CEEE  B92F00  './.'
                  	call	xc751			; 0000CEF1  E85DF8  '.].'
                  	call	xcfbf			; 0000CEF4  E8C800  '...'
                  	ret				; 0000CEF7  C3  '.'
                  
                  xcef8:	cmp	al,0x0			; 0000CEF8  3C00  '<.'
                  	jz	xcf02			; 0000CEFA  7406  't.'
                  	call	xcfbf			; 0000CEFC  E8C000  '...'
                  xceff:	jmp	xcf91			; 0000CEFF  E98F00  '...'
                  
                  xcf02:	mov	al,0x86			; 0000CF02  B086  '..'
                  	out	0x84,al			; 0000CF04  E684  '..'
                  	mov	al,0xff			; 0000CF06  B0FF  '..'
                  	out	0x60,al			; 0000CF08  E660  '.`'
                  	mov	cx,0x3e8		; 0000CF0A  B9E803  '...'
                  xcf0d:	push	cx			; 0000CF0D  51  'Q'
                  	call	xc62f			; 0000CF0E  E81EF7  '...'
                  	pop	cx			; 0000CF11  59  'Y'
                  	in	al,0x64			; 0000CF12  E464  '.d'
                  	test	al,0x1			; 0000CF14  A801  '..'
                  	jnz	xcf1d			; 0000CF16  7505  'u.'
                  	loop	xcf0d			; 0000CF18  E2F3  '..'
                  	jmp	xcfa8			; 0000CF1A  E98B00  '...'
                  
                  xcf1d:	in	al,0x60			; 0000CF1D  E460  '.`'
                  	cmp	al,0xfa			; 0000CF1F  3CFA  '<.'
                  	jz	xcf28			; 0000CF21  7405  't.'
                  	loop	xcf0d			; 0000CF23  E2E8  '..'
                  	jmp	xcfa8			; 0000CF25  E98000  '...'
                  
                  xcf28:	mov	al,0x87			; 0000CF28  B087  '..'
                  	out	0x84,al			; 0000CF2A  E684  '..'
                  	mov	cx,0x1388		; 0000CF2C  B98813  '...'
                  xcf2f:	in	al,0x64			; 0000CF2F  E464  '.d'
                  	test	al,0x1			; 0000CF31  A801  '..'
                  	jnz	xcf3f			; 0000CF33  750A  'u',0x0A
                  	push	cx			; 0000CF35  51  'Q'
                  	call	xc62f			; 0000CF36  E8F6F6  '...'
                  	pop	cx			; 0000CF39  59  'Y'
                  	loop	xcf2f			; 0000CF3A  E2F3  '..'
                  	jmp	short xcfa8		; 0000CF3C  EB6A  '.j'
                  
                  	nop				; 0000CF3E  90  '.'
                  xcf3f:	mov	al,0x88			; 0000CF3F  B088  '..'
                  	out	0x84,al			; 0000CF41  E684  '..'
                  	in	al,0x60			; 0000CF43  E460  '.`'
                  	cmp	al,0xaa			; 0000CF45  3CAA  '<.'
                  	jz	xcf4c			; 0000CF47  7403  't.'
                  	jmp	short xcf91		; 0000CF49  EB46  '.F'
                  
                  	nop				; 0000CF4B  90  '.'
                  xcf4c:	mov	al,0x89			; 0000CF4C  B089  '..'
                  	out	0x84,al			; 0000CF4E  E684  '..'
                  	mov	al,0xae			; 0000CF50  B0AE  '..'
                  	out	0x64,al			; 0000CF52  E664  '.d'
                  	mov	cx,0xffff		; 0000CF54  B9FFFF  '...'
                  xcf57:	in	al,0x64			; 0000CF57  E464  '.d'
                  	test	al,0x2			; 0000CF59  A802  '..'
                  	jz	xcf62			; 0000CF5B  7405  't.'
                  	loop	xcf57			; 0000CF5D  E2F8  '..'
                  	jmp	short xcf91		; 0000CF5F  EB30  '.0'
                  
                  	nop				; 0000CF61  90  '.'
                  xcf62:	mov	cx,0xa			; 0000CF62  B90A00  '.',0x0A,'.'
                  xcf65:	in	al,0x64			; 0000CF65  E464  '.d'
                  	test	al,0x1			; 0000CF67  A801  '..'
                  	jnz	xcf74			; 0000CF69  7509  'u.'
                  	push	cx			; 0000CF6B  51  'Q'
                  	call	xc62f			; 0000CF6C  E8C0F6  '...'
                  	pop	cx			; 0000CF6F  59  'Y'
                  	loop	xcf65			; 0000CF70  E2F3  '..'
                  	jmp	short xcf8c		; 0000CF72  EB18  '..'
                  
                  xcf74:	mov	al,0x8a			; 0000CF74  B08A  '..'
                  	out	0x84,al			; 0000CF76  E684  '..'
                  	in	al,0x60			; 0000CF78  E460  '.`'
                  	push	ax			; 0000CF7A  50  'P'
                  	mov	al,0xad			; 0000CF7B  B0AD  '..'
                  	out	0x64,al			; 0000CF7D  E664  '.d'
                  xcf7f:	in	al,0x64			; 0000CF7F  E464  '.d'
                  	test	al,0x2			; 0000CF81  A802  '..'
                  	jnz	xcf7f			; 0000CF83  75FA  'u.'
                  	pop	ax			; 0000CF85  58  'X'
                  	call	xc7b8			; 0000CF86  E82FF8  './.'
                  	jmp	short xcf91		; 0000CF89  EB06  '..'
                  
                  	nop				; 0000CF8B  90  '.'
                  xcf8c:	mov	al,0x8d			; 0000CF8C  B08D  '..'
                  	out	0x84,al			; 0000CF8E  E684  '..'
                  	ret				; 0000CF90  C3  '.'
                  
                  xcf91:	mov	ax,0x40			; 0000CF91  B84000  '.@.'
                  	mov	ds,ax			; 0000CF94  8ED8  '..'
                  	or	byte [0x12],0xff	; 0000CF96  800E1200FF  '.....'
                  	mov	dx,0x0			; 0000CF9B  BA0000  '...'
                  	mov	bx,0xb7d7		; 0000CF9E  BBD7B7  '...'
                  	mov	cx,0x15			; 0000CFA1  B91500  '...'
                  	call	xc745			; 0000CFA4  E89EF7  '...'
                  	ret				; 0000CFA7  C3  '.'
                  
                  xcfa8:	mov	ax,0x40			; 0000CFA8  B84000  '.@.'
                  	mov	ds,ax			; 0000CFAB  8ED8  '..'
                  	or	byte [0x12],0xff	; 0000CFAD  800E1200FF  '.....'
                  	mov	dx,0x0			; 0000CFB2  BA0000  '...'
                  	mov	bx,0xb7ec		; 0000CFB5  BBECB7  '...'
                  	mov	cx,0x24			; 0000CFB8  B92400  '.$.'
                  	call	xc745			; 0000CFBB  E887F7  '...'
                  	ret				; 0000CFBE  C3  '.'
                  
                  xcfbf:	mov	al,0xae			; 0000CFBF  B0AE  '..'
                  	out	0x64,al			; 0000CFC1  E664  '.d'
                  	mov	cx,0xffff		; 0000CFC3  B9FFFF  '...'
                  xcfc6:	in	al,0x64			; 0000CFC6  E464  '.d'
                  	test	al,0x2			; 0000CFC8  A802  '..'
                  	jz	xcfdc			; 0000CFCA  7410  't.'
                  	loop	xcfc6			; 0000CFCC  E2F8  '..'
                  	mov	dx,0x0			; 0000CFCE  BA0000  '...'
                  	mov	bx,0xb810		; 0000CFD1  BB10B8  '...'
                  	mov	cx,0x1f			; 0000CFD4  B91F00  '...'
                  	call	xc745			; 0000CFD7  E86BF7  '.k.'
                  xcfda:	jmp	short xcfda		; 0000CFDA  Hang the machine
                  
                  xcfdc:	ret				; 0000CFDC  C3  '.'
                  
                  xcfdd:	mov	al,0x80			; 0000CFDD  B080  '..'
                  	out	0x84,al			; 0000CFDF  E684  '..'
                  	mov	al,0xad			; 0000CFE1  B0AD  '..'
                  	out	0x64,al			; 0000CFE3  E664  '.d'
                  xcfe5:	in	al,0x64			; 0000CFE5  E464  '.d'
                  	test	al,0x2			; 0000CFE7  A802  '..'
                  	jnz	xcfe5			; 0000CFE9  75FA  'u.'
                  xcfeb:	in	al,0x64			; 0000CFEB  E464  '.d'
                  	test	al,0x1			; 0000CFED  A801  '..'
                  	jz	xcff5			; 0000CFEF  7404  't.'
                  	in	al,0x60			; 0000CFF1  E460  '.`'
                  	jmp	short xcfeb		; 0000CFF3  EBF6  '..'
                  
                  xcff5:	mov	al,0x81			; 0000CFF5  B081  '..'
                  	out	0x84,al			; 0000CFF7  E684  '..'
                  	mov	al,0xaa			; 0000CFF9  B0AA  '..'
                  	out	0x64,al			; 0000CFFB  E664  '.d'
                  	mov	cx,0x2710		; 0000CFFD  B91027  '..',0x27
                  xd000:	in	al,0x64			; 0000D000  E464  '.d'
                  	test	al,0x1			; 0000D002  A801  '..'
                  	jnz	xd00f			; 0000D004  7509  'u.'
                  	push	cx			; 0000D006  51  'Q'
                  	call	xc62f			; 0000D007  E825F6  '.%.'
                  	pop	cx			; 0000D00A  59  'Y'
                  	loop	xd000			; 0000D00B  E2F3  '..'
                  	jmp	short xd019		; 0000D00D  EB0A  '.',0x0A
                  
                  xd00f:	mov	al,0x82			; 0000D00F  B082  '..'
                  	out	0x84,al			; 0000D011  E684  '..'
                  	in	al,0x60			; 0000D013  E460  '.`'
                  	cmp	al,0x55			; 0000D015  3C55  '<U'
                  	jz	xd02b			; 0000D017  7412  't.'
                  xd019:	mov	al,0x83			; 0000D019  B083  '..'
                  	out	0x84,al			; 0000D01B  E684  '..'
                  	mov	dx,0x0			; 0000D01D  BA0000  '...'
                  	mov	bx,0xb810		; 0000D020  BB10B8  '...'
                  	mov	cx,0x1f			; 0000D023  B91F00  '...'
                  	call	xc745			; 0000D026  E81CF7  '...'
                  xd029:	jmp	short xd029		; 0000D029  EBFE  Hang the machine
                  
                  xd02b:	mov	al,0x84			; 0000D02B  B084  '..'
                  	out	0x84,al			; 0000D02D  E684  '..'
                  	mov	al,0x60			; 0000D02F  B060  '.`'
                  	out	0x64,al			; 0000D031  E664  '.d'
                  xd033:	in	al,0x64			; 0000D033  E464  '.d'
                  	test	al,0x2			; 0000D035  A802  '..'
                  	jnz	xd033			; 0000D037  75FA  'u.'
                  	mov	al,0x5d			; 0000D039  B05D  '.]'
                  	out	0x60,al			; 0000D03B  E660  '.`'
                  	ret				; 0000D03D  C3  '.'
                  
                  xd03e:	mov	al,0xab			; 0000D03E  B0AB  '..'
                  	out	0x64,al			; 0000D040  E664  '.d'
                  xd042:	in	al,0x64			; 0000D042  E464  '.d'
                  	test	al,0x2			; 0000D044  A802  '..'
                  	jnz	xd042			; 0000D046  75FA  'u.'
                  	mov	cx,0x64			; 0000D048  B96400  '.d.'
                  xd04b:	in	al,0x64			; 0000D04B  E464  '.d'
                  	test	al,0x1			; 0000D04D  A801  '..'
                  	jnz	xd05a			; 0000D04F  7509  'u.'
                  	push	cx			; 0000D051  51  'Q'
                  	call	xc62f			; 0000D052  E8DAF5  '...'
                  	pop	cx			; 0000D055  59  'Y'
                  	loop	xd04b			; 0000D056  E2F3  '..'
                  	jmp	short xd063		; 0000D058  EB09  '..'
                  
                  xd05a:	mov	al,0x8c			; 0000D05A  B08C  '..'
                  	out	0x84,al			; 0000D05C  E684  '..'
                  	in	al,0x60			; 0000D05E  E460  '.`'
                  	clc				; 0000D060  F8  '.'
                  	jmp	short xd064		; 0000D061  EB01  '..'
                  
                  xd063:	stc				; 0000D063  F9  '.'
                  xd064:	ret				; 0000D064  C3  '.'
                  
                  	std				; 0000D065  FD  '.'
                  	cli				; 0000D066  FA  '.'
                  	stc				; 0000D067  F9  '.'
                  	div	ch			; 0000D068  F6F5  '..'
                  	jmp	0xd6da:0xe5e9		; 0000D06A  EAE9E5DAD6  '.....'
                  
                  	aad	0xaa			; 0000D06F  D5AA  '..'
                  	test	ax,0x9aa5		; 0000D071  A9A59A  '...'
                  	xchg	ax,bp			; 0000D074  95  '.'
                  	xchg	ax,si			; 0000D075  96  '.'
                  	push	si			; 0000D076  56  'V'
                  	push	bp			; 0000D077  55  'U'
                  	db	0xFE			; 0000D078  FE  '.'
                  
                  xd079:	push	bp			; 0000D079  55  'U'
                  	mov	di,0x0			; 0000D07A  BF0000  '...'
                  	mov	bp,0xd083		; 0000D07D  BD83D0  '...'
                  	jmp	x87e4			; 0000D080  E961B7  '.a.'
                  
                  	and	bl,0xc0			; 0000D083  80E3C0  '...'
                  	cmp	bl,0x40			; 0000D086  80FB40  '..@'
                  	jnz	xd0c2			; 0000D089  7537  'u7'
                  	mov	di,0x1			; 0000D08B  BF0100  '...'
                  	mov	bp,0xd094		; 0000D08E  BD94D0  '...'
                  	jmp	x87e4			; 0000D091  E950B7  '.P.'
                  
                  	push	es			; 0000D094  06  '.'
                  	mov	ax,cs			; 0000D095  8CC8  '..'
                  	mov	es,ax			; 0000D097  8EC0  '..'
                  	mov	di,0xd065		; 0000D099  BF65D0  '.e.'
                  	mov	cx,0x14			; 0000D09C  B91400  '...'
                  	mov	al,bl			; 0000D09F  8AC3  '..'
                  	repne	scasb			; 0000D0A1  F2AE  '..'
                  	jnz	xd0a7			; 0000D0A3  7502  'u.'
                  	jmp	short xd0c1		; 0000D0A5  EB1A  '..'
                  
                  xd0a7:	mov	dx,0x0			; 0000D0A7  BA0000  '...'
                  	mov	bx,err207		; 0000D0AA  BBE3B6  '...'
                  	mov	cx,err207_len		; 0000D0AD  B92300  '.#.'
                  	call	xc745			; 0000D0B0  E892F6  '...'
                  	mov	al,0xe			; 0000D0B3  B00E  '..'
                  	call	xb544			; 0000D0B5  E88CE4  '...'
                  	or	al,0x20			; 0000D0B8  0C20  '. '
                  	mov	ah,0xe			; 0000D0BA  B40E  '..'
                  	xchg	ah,al			; 0000D0BC  86E0  '..'
                  	call	xb549			; 0000D0BE  E888E4  '...'
                  xd0c1:	pop	es			; 0000D0C1  07  '.'
                  xd0c2:	pop	bp			; 0000D0C2  5D  ']'
                  	ret				; 0000D0C3  C3  '.'
                  
                  	mov	byte [bp+0x1],0x0	; 0000D0C4  C6460100  '.F..'
                  	add	dx,byte +0x6		; 0000D0C8  83C206  '...'
                  	in	al,dx			; 0000D0CB  EC  '.'
                  	sub	dx,byte +0x6		; 0000D0CC  83EA06  '...'
                  	test	al,0x4			; 0000D0CF  A804  '..'
                  	jnz	xd141			; 0000D0D1  756E  'un'
                  	test	al,0x2			; 0000D0D3  A802  '..'
                  	jz	xd145			; 0000D0D5  746E  'tn'
                  	mov	byte [bp+0x1],0x1	; 0000D0D7  C6460101  '.F..'
                  	mov	al,0x10			; 0000D0DB  B010  '..'
                  	out	dx,al			; 0000D0DD  EE  '.'
                  	inc	dx			; 0000D0DE  42  'B'
                  	in	al,dx			; 0000D0DF  EC  '.'
                  	mov	ah,al			; 0000D0E0  8AE0  '..'
                  	dec	dx			; 0000D0E2  4A  'J'
                  	mov	al,0x11			; 0000D0E3  B011  '..'
                  	out	dx,al			; 0000D0E5  EE  '.'
                  	inc	dx			; 0000D0E6  42  'B'
                  	in	al,dx			; 0000D0E7  EC  '.'
                  	dec	dx			; 0000D0E8  4A  'J'
                  	sub	ax,[0x4e]		; 0000D0E9  2B064E00  '+.N.'
                  	cmp	ax,0x1005		; 0000D0ED  3D0510  '=..'
                  	jl	xd0f4			; 0000D0F0  7C02  '|.'
                  	xor	ax,ax			; 0000D0F2  33C0  '3.'
                  xd0f4:	xor	bh,bh			; 0000D0F4  32FF  '2.'
                  	mov	bl,[0x49]		; 0000D0F6  8A1E4900  '..I.'
                  	sub	al,[cs:bx+0xd15e]	; 0000D0FA  2E2A875ED1  '.*.^.'
                  	sbb	ah,0x0			; 0000D0FF  80DC00  '...'
                  	jns	xd106			; 0000D102  7902  'y.'
                  	xor	ax,ax			; 0000D104  33C0  '3.'
                  xd106:	mov	cl,[0x4a]		; 0000D106  8A0E4A00  '..J.'
                  	cmp	bl,0x4			; 0000D10A  80FB04  '...'
                  	jc	xd146			; 0000D10D  7237  'r7'
                  	cmp	bl,0x7			; 0000D10F  80FB07  '...'
                  	jz	xd146			; 0000D112  7432  't2'
                  	mov	cl,0x28			; 0000D114  B128  '.('
                  	div	cl			; 0000D116  F6F1  '..'
                  	mov	cl,al			; 0000D118  8AC8  '..'
                  	shr	cl,1			; 0000D11A  D0E9  '..'
                  	shr	cl,1			; 0000D11C  D0E9  '..'
                  	mov	[bp+0x3],cl		; 0000D11E  884E03  '.N.'
                  	mov	[bp+0x2],ah		; 0000D121  886602  '.f.'
                  	shl	al,1			; 0000D124  D0E0  '..'
                  	mov	[bp+0x5],al		; 0000D126  884605  '.F.'
                  	mov	cl,0x3			; 0000D129  B103  '..'
                  	xchg	ah,al			; 0000D12B  86E0  '..'
                  	xor	ah,ah			; 0000D12D  32E4  '2.'
                  	shl	ax,cl			; 0000D12F  D3E0  '..'
                  	mov	[bp+0x6],ax		; 0000D131  894606  '.F.'
                  	cmp	byte [0x49],0x6		; 0000D134  803E490006  '.>I..'
                  	jnz	xd141			; 0000D139  7506  'u.'
                  	shl	byte [bp+0x2],1		; 0000D13B  D06602  '.f.'
                  	shl	word [bp+0x6],1		; 0000D13E  D16606  '.f.'
                  xd141:	add	dx,byte +0x7		; 0000D141  83C207  '...'
                  	out	dx,al			; 0000D144  EE  '.'
                  xd145:	ret				; 0000D145  C3  '.'
                  
                  xd146:	div	cl			; 0000D146  F6F1  '..'
                  	mov	[bp+0x3],al		; 0000D148  884603  '.F.'
                  	mov	[bp+0x2],ah		; 0000D14B  886602  '.f.'
                  	mov	cl,0x3			; 0000D14E  B103  '..'
                  	mov	bl,ah			; 0000D150  8ADC  '..'
                  	shl	bx,cl			; 0000D152  D3E3  '..'
                  	mov	[bp+0x6],bx		; 0000D154  895E06  '.^.'
                  	shl	al,cl			; 0000D157  D2E0  '..'
                  	mov	[bp+0x5],al		; 0000D159  884605  '.F.'
                  	jmp	short xd141		; 0000D15C  EBE3  '..'
                  
                  	add	ax,[bp+di]		; 0000D15E  0303  '..'
                  	add	ax,0x305		; 0000D160  050503  '...'
                  	add	ax,[bp+di]		; 0000D163  0303  '..'
                  	add	al,0x8a			; 0000D165  048A  '..'
                  	bound	ax,[ds:bx+si]		; 0000D167  3E6200  '>b.'
                  	cmp	al,0x7			; 0000D16A  3C07  '<.'
                  	jz	xd1ce			; 0000D16C  7460  't`'
                  	cmp	al,0x8			; 0000D16E  3C08  '<.'
                  	db	'tF<',0x0A,'t_<',0x0D,'tK'
                  	mov	cx,0x1			; 0000D17A  B90100  '...'
                  	mov	ah,0xa			; 0000D17D  B40A  '.',0x0A
                  	call	x83db			; 0000D17F  E859B2  '.Y.'
                  	mov	ah,0x3			; 0000D182  B403  '..'
                  	call	x83db			; 0000D184  E854B2  '.T.'
                  	inc	dl			; 0000D187  FEC2  '..'
                  	cmp	dl,[0x4a]		; 0000D189  3A164A00  ':.J.'
                  	jnz	xd1ab			; 0000D18D  751C  'u.'
                  	xor	dl,dl			; 0000D18F  32D2  '2.'
                  	inc	dh			; 0000D191  FEC6  '..'
                  	cmp	dh,0x19			; 0000D193  80FE19  '...'
                  	jnz	xd1ab			; 0000D196  7513  'u.'
                  	dec	dh			; 0000D198  FECE  '..'
                  	mov	ah,0x2			; 0000D19A  B402  '..'
                  	call	x83db			; 0000D19C  E83CB2  '.<.'
                  	mov	ah,0x8			; 0000D19F  B408  '..'
                  	call	x83db			; 0000D1A1  E837B2  '.7.'
                  	push	bx			; 0000D1A4  53  'S'
                  	mov	bh,ah			; 0000D1A5  8AFC  '..'
                  	call	xd1ea			; 0000D1A7  E84000  '.@.'
                  	pop	bx			; 0000D1AA  5B  '['
                  xd1ab:	mov	ah,0x2			; 0000D1AB  B402  '..'
                  	call	x83db			; 0000D1AD  E82BB2  '.+.'
                  xd1b0:	mov	ah,[0x49]		; 0000D1B0  8A264900  '.&I.'
                  	mov	[bp+0x1],ah		; 0000D1B4  886601  '.f.'
                  	ret				; 0000D1B7  C3  '.'
                  
                  	mov	ah,0x3			; 0000D1B8  B403  '..'
                  	call	x83db			; 0000D1BA  E81EB2  '...'
                  	or	dl,dl			; 0000D1BD  0AD2  0x0A,'.'
                  	jz	xd1b0			; 0000D1BF  74EF  't.'
                  	dec	dl			; 0000D1C1  FECA  '..'
                  	jmp	short xd1ab		; 0000D1C3  EBE6  '..'
                  
                  	mov	ah,0x3			; 0000D1C5  B403  '..'
                  	call	x83db			; 0000D1C7  E811B2  '...'
                  	xor	dl,dl			; 0000D1CA  32D2  '2.'
                  	jmp	short xd1ab		; 0000D1CC  EBDD  '..'
                  
                  xd1ce:	mov	bx,0x1f4		; 0000D1CE  BBF401  '...'
                  	call	xc7db			; 0000D1D1  E807F6  '...'
                  	ret				; 0000D1D4  C3  '.'
                  
                  	mov	ah,0x3			; 0000D1D5  B403  '..'
                  	call	x83db			; 0000D1D7  E801B2  '...'
                  	cmp	dh,0x18			; 0000D1DA  80FE18  '...'
                  	jz	xd1e3			; 0000D1DD  7404  't.'
                  	inc	dh			; 0000D1DF  FEC6  '..'
                  	jmp	short xd1ab		; 0000D1E1  EBC8  '..'
                  
                  xd1e3:	mov	ah,0x8			; 0000D1E3  B408  '..'
                  	call	x83db			; 0000D1E5  E8F3B1  '...'
                  	mov	bh,ah			; 0000D1E8  8AFC  '..'
                  
                  xd1ea:	push	cx			; 0000D1EA  51  'Q'
                  	push	dx			; 0000D1EB  52  'R'
                  	cmp	byte [0x49],0x7		; 0000D1EC  803E490007  '.>I..'
                  	jz	xd1fc			; 0000D1F1  7409  't.'
                  	cmp	byte [0x49],0x3		; 0000D1F3  803E490003  '.>I..'
                  	jna	xd1fc			; 0000D1F8  7602  'v.'
                  	mov	bh,0x0			; 0000D1FA  B700  '..'
                  xd1fc:	mov	ax,0x601		; 0000D1FC  B80106  '...'
                  	xor	cx,cx			; 0000D1FF  33C9  '3.'
                  	mov	dh,0x18			; 0000D201  B618  '..'
                  	mov	dl,[0x4a]		; 0000D203  8A164A00  '..J.'
                  	dec	dx			; 0000D207  4A  'J'
                  	call	x83db			; 0000D208  E8D0B1  '...'
                  	pop	dx			; 0000D20B  5A  'Z'
                  	pop	cx			; 0000D20C  59  'Y'
                  	ret				; 0000D20D  C3  '.'
                  
                  	db	0x1c,0x1d,'*578F'	; 0000D20E  1C1D2A35373846
                  
                  xd215:	or	ah,ah			; 0000D215  0AE4
                  	jz	xd21c			; 0000D217  7403
                  	jns	xd220			; 0000D219  7905
                  	stc				; 0000D21B  F9  '.'
                  xd21c:	ret				; 0000D21C  C3  '.'
                  
                  xd21d:	jmp	xd335			; 0000D21D  E91501  '...'
                  
                  xd220:	cmp	ah,0x39			; 0000D220  80FC39  '..9'
                  	jg	xd21c			; 0000D223  7FF7  '..'
                  	mov	bl,ah			; 0000D225  8ADC  '..'
                  	xor	bh,bh			; 0000D227  32FF  '2.'
                  	mov	al,[cs:bx+0x9b1f]	; 0000D229  2E8A871F9B  '.....'
                  	test	byte [0x17],0x8		; 0000D22E  F606170008  '.....'
                  	jnz	xd21d			; 0000D233  75E8  'u.'
                  	test	byte [0x17],0x4		; 0000D235  F606170004  '.....'
                  	jnz	xd252			; 0000D23A  7516  'u.'
                  	and	al,0x7f			; 0000D23C  247F  '$.'
                  	test	byte [0x17],0x3		; 0000D23E  F606170003  '.....'
                  	jz	xd248			; 0000D243  7403  't.'
                  	jmp	xd2f7			; 0000D245  E9AF00  '...'
                  
                  xd248:	test	byte [0x17],0x40	; 0000D248  F606170040  '....@'
                  	jz	xd2b2			; 0000D24D  7463  'tc'
                  	jmp	xd2eb			; 0000D24F  E99900  '...'
                  
                  xd252:	cmp	ah,0xf			; 0000D252  80FC0F  '...'
                  	jnz	xd25c			; 0000D255  7505  'u.'
                  	mov	ax,0x9400		; 0000D257  B80094  '...'
                  	jmp	short xd2d2		; 0000D25A  EB76  '.v'
                  
                  xd25c:	cmp	ah,0x35			; 0000D25C  80FC35  '..5'
                  	jnz	xd272			; 0000D25F  7511  'u.'
                  	test	byte [0x96],0x2		; 0000D261  F606960002  '.....'
                  	jz	xd272			; 0000D266  740A  't',0x0A
                  	and	byte [0x96],0xfd	; 0000D268  80269600FD  '.&...'
                  	mov	ax,0x9500		; 0000D26D  B80095  '...'
                  	jmp	short xd2d2		; 0000D270  EB60  '.`'
                  
                  xd272:	or	al,al			; 0000D272  0AC0  0x0A,'.'
                  	js	xd2d5			; 0000D274  785F  'x_'
                  	cmp	ah,0x3			; 0000D276  80FC03  '...'
                  	jz	xd2d9			; 0000D279  745E  't^'
                  	cmp	ah,0xe			; 0000D27B  80FC0E  '...'
                  	jz	xd2dd			; 0000D27E  745D  't]'
                  	cmp	ah,0x1c			; 0000D280  80FC1C  '...'
                  	jz	xd2e1			; 0000D283  745C  't\'
                  	cmp	ah,0x37			; 0000D285  80FC37  '..7'
                  	jnz	xd2a4			; 0000D288  751A
                  	test	byte [0x96],0x10	; 0000D28A  F606960010  '.....'
                  	jz	xd2d7			; 0000D28F  7446  'tF'
                  	test	byte [0x96],0x2		; 0000D291  F606960002  '.....'
                  	jnz	xd29d			; 0000D296  7505  'u.'
                  	mov	ax,0x9600		; 0000D298  B80096  '...'
                  	jmp	short xd2d2		; 0000D29B  EB35  '.5'
                  
                  xd29d:	and	byte [0x96],0xfd	; 0000D29D  80269600FD  '.&...'
                  	jmp	short xd2d7		; 0000D2A2  EB33  '.3'
                  
                  xd2a4:	cmp	al,0x20			; 0000D2A4  3C20
                  	jng	xd2b2			; 0000D2A6  7E0A
                  	cmp	al,0x61			; 0000D2A8  3C61
                  	jl	xd2e1			; 0000D2AA  7C35
                  	cmp	al,0x7b			; 0000D2AC  3C7B
                  	jnl	xd2e1			; 0000D2AE  7D31
                  	and	al,0x1f			; 0000D2B0  241F  '$.'
                  
                  xd2b2:	test	byte [0x96],0x2		; 0000D2B2  F606960002  '.....'
                  	jz	xd2d2			; 0000D2B7  7419  't.'
                  	push	ax			; 0000D2B9  50  'P'
                  	mov	cx,cs			; 0000D2BA  8CC9  '..'
                  	mov	es,cx			; 0000D2BC  8EC1  '..'
                  	mov	di,0xd20e		; 0000D2BE  BF0ED2  '...'
                  	mov	cx,0x7			; 0000D2C1  B90700  '...'
                  	mov	al,ah			; 0000D2C4  8AC4  '..'
                  	repne	scasb			; 0000D2C6  F2AE  '..'
                  	pop	ax			; 0000D2C8  58  'X'
                  	jnz	xd2d2			; 0000D2C9  7507  'u.'
                  	and	byte [0x96],0xfd	; 0000D2CB  80269600FD  '.&...'
                  	mov	ah,0xe0			; 0000D2D0  B4E0  '..'
                  xd2d2:	call	xd3b4			; 0000D2D2  E8DF00  '...'
                  xd2d5:	stc				; 0000D2D5  F9  '.'
                  	ret				; 0000D2D6  C3  '.'
                  
                  xd2d7:	mov	ah,0x72			; 0000D2D7  B472  '.r'
                  xd2d9:	xor	al,al			; 0000D2D9  32C0  '2.'
                  	jmp	short xd2b2		; 0000D2DB  EBD5  '..'
                  
                  xd2dd:	mov	al,0x7f			; 0000D2DD  B07F  '..'
                  	jmp	short xd2b2		; 0000D2DF  EBD1  '..'
                  
                  xd2e1:	mov	si,0x9baa		; 0000D2E1  BEAA9B  '...'
                  	call	x9b08			; 0000D2E4  E821C8  '.!.'
                  	jc	xd2b2			; 0000D2E7  72C9  'r.'
                  	jmp	short xd2d5		; 0000D2E9  EBEA  '..'
                  
                  xd2eb:	cmp	al,0x61			; 0000D2EB  3C61  '<a'
                  	jl	xd2b2			; 0000D2ED  7CC3  '|.'
                  	cmp	al,0x7a			; 0000D2EF  3C7A  '<z'
                  	jg	xd2b2			; 0000D2F1  7FBF  '..'
                  	sub	al,0x20			; 0000D2F3  2C20  ', '
                  	jmp	short xd2b2		; 0000D2F5  EBBB  '..'
                  
                  xd2f7:	cmp	ah,0x37			; 0000D2F7  80FC37  '..7'
                  	jz	xd2d2			; 0000D2FA  74D6  't.'
                  	cmp	ah,0x35			; 0000D2FC  80FC35  '..5'
                  	jnz	xd30f			; 0000D2FF  750E  'u.'
                  	test	byte [0x96],0x2		; 0000D301  F606960002  '.....'
                  	jz	xd30f			; 0000D306  7407  't.'
                  	and	byte [0x96],0xfd	; 0000D308  80269600FD  '.&...'
                  	jmp	short xd2d2		; 0000D30D  EBC3  '..'
                  
                  xd30f:	cmp	ah,0xf			; 0000D30F  80FC0F  '...'
                  	jz	xd31d			; 0000D312  7409  't.'
                  	jg	xd321			; 0000D314  7F0B  '..'
                  	mov	al,[cs:bx+0x9b59]	; 0000D316  2E8A87599B  '...Y.'
                  	jmp	short xd2b2		; 0000D31B  EB95  '..'
                  
                  xd31d:	xor	al,al			; 0000D31D  32C0  '2.'
                  	jmp	short xd2b2		; 0000D31F  EB91  '..'
                  
                  xd321:	mov	si,0x9b69		; 0000D321  BE699B  '.i.'
                  	call	x9b08			; 0000D324  E8E1C7  '...'
                  	jc	xd2b2			; 0000D327  7289  'r.'
                  	test	byte [0x17],0x40	; 0000D329  F606170040  '....@'
                  	jnz	xd2b2			; 0000D32E  7582  'u.'
                  	sub	al,0x20			; 0000D330  2C20  ', '
                  	jmp	xd2b2			; 0000D332  E97DFF  '.}.'
                  
                  xd335:	and	al,0x7f			; 0000D335  247F  '$.'
                  	cmp	ah,0x35			; 0000D337  80FC35  '..5'
                  	jnz	xd34d			; 0000D33A  7511  'u.'
                  	test	byte [0x96],0x2		; 0000D33C  F606960002  '.....'
                  	jz	xd34d			; 0000D341  740A  't',0x0A
                  	and	byte [0x96],0xfd	; 0000D343  80269600FD  '.&...'
                  	mov	ah,0xa4			; 0000D348  B4A4  '..'
                  	jmp	short xd397		; 0000D34A  EB4B  '.K'
                  
                  	nop				; 0000D34C  90  '.'
                  xd34d:	cmp	ah,0x1c			; 0000D34D  80FC1C  '...'
                  	jnz	xd363			; 0000D350  7511  'u.'
                  	test	byte [0x96],0x2		; 0000D352  F606960002  '.....'
                  	jz	xd363			; 0000D357  740A  't',0x0A
                  	and	byte [0x96],0xfd	; 0000D359  80269600FD  '.&...'
                  	mov	ah,0xa6			; 0000D35E  B4A6  '..'
                  	jmp	short xd397		; 0000D360  EB35  '.5'
                  
                  	nop				; 0000D362  90  '.'
                  xd363:	cmp	ah,0xf			; 0000D363  80FC0F  '...'
                  	jnz	xd36d			; 0000D366  7505  'u.'
                  	mov	ah,0xa5			; 0000D368  B4A5  '..'
                  	jmp	short xd397		; 0000D36A  EB2B  '.+'
                  
                  	nop				; 0000D36C  90  '.'
                  xd36d:	push	ax			; 0000D36D  50  'P'
                  	mov	al,ah			; 0000D36E  8AC4  '..'
                  	mov	cx,cs			; 0000D370  8CC9  '..'
                  	mov	es,cx			; 0000D372  8EC1  '..'
                  	mov	cx,0xd			; 0000D374  B90D00  '.',0x0D,'.'
                  	nop				; 0000D377  90  '.'
                  	cld				; 0000D378  FC  '.'
                  	mov	di,0xd3a7		; 0000D379  BFA7D3  '...'
                  	repne	scasb			; 0000D37C  F2AE  '..'
                  	pop	ax			; 0000D37E  58  'X'
                  	jz	xd3a3			; 0000D37F  7422  't"'
                  	cmp	al,0x20			; 0000D381  3C20  '< '
                  	jz	xd399			; 0000D383  7414  't.'
                  	cmp	ah,0x2			; 0000D385  80FC02  '...'
                  	jl	xd39c			; 0000D388  7C12  '|.'
                  	cmp	ah,0xe			; 0000D38A  80FC0E  '...'
                  	jl	xd39e			; 0000D38D  7C0F  '|.'
                  	cmp	al,0x61			; 0000D38F  3C61  '<a'
                  	jl	xd39c			; 0000D391  7C09  '|.'
                  	cmp	al,0x7a			; 0000D393  3C7A  '<z'
                  	jg	xd39c			; 0000D395  7F05  '..'
                  xd397:	xor	al,al			; 0000D397  32C0  '2.'
                  xd399:	call	xd3b4			; 0000D399  E81800  '...'
                  xd39c:	stc				; 0000D39C  F9  '.'
                  	ret				; 0000D39D  C3  '.'
                  
                  xd39e:	add	ah,0x76			; 0000D39E  80C476  '..v'
                  	jmp	short xd397		; 0000D3A1  EBF4  '..'
                  
                  xd3a3:	mov	al,0xf0			; 0000D3A3  B0F0  '..'
                  	jmp	short xd399		; 0000D3A5  EBF2  '..'
                  
                  	add	[0x1b1a],cx		; 0000D3A7  010E1A1B  '....'
                  	sbb	al,0x27			; 0000D3AB  1C27  '.',0x27
                  	db	'()+3457'
                  
                  xd3b4:	cli				; 0000D3B4  FA  '.'
                  	mov	si,[0x1c]		; 0000D3B5  8B361C00  '.6..'
                  	mov	[si],ax			; 0000D3B9  8904  '..'
                  	inc	si			; 0000D3BB  46  'F'
                  	inc	si			; 0000D3BC  46  'F'
                  	cmp	si,[0x82]		; 0000D3BD  3B368200  ';6..'
                  	jnz	xd3c7			; 0000D3C1  7504  'u.'
                  	mov	si,[0x80]		; 0000D3C3  8B368000  '.6..'
                  xd3c7:	cmp	si,[0x1a]		; 0000D3C7  3B361A00  ';6..'
                  	jz	xd3de			; 0000D3CB  7411  't.'
                  	mov	[0x1c],si		; 0000D3CD  89361C00  '.6..'
                  	sti				; 0000D3D1  FB  '.'
                  	call	xeb0c			; 0000D3D2  E83717  '.7.'
                  	inc	bp			; 0000D3D5  45  'E'
                  	push	ax			; 0000D3D6  50  'P'
                  	mov	ax,0x9102		; 0000D3D7  B80291  '...'
                  	int	0x15			; 0000D3DA  CD15  '..'
                  	pop	ax			; 0000D3DC  58  'X'
                  	ret				; 0000D3DD  C3  '.'
                  
                  xd3de:	sti				; 0000D3DE  FB  '.'
                  	push	ax			; 0000D3DF  50  'P'
                  	mov	bx,0x7d			; 0000D3E0  BB7D00  '.}.'
                  	call	xc7db			; 0000D3E3  E8F5F3  '...'
                  	pop	ax			; 0000D3E6  58  'X'
                  	ret				; 0000D3E7  C3  '.'
                  
                  xd3e8:	mov	ah,0x1			; 0000D3E8  B401  '..'
                  	mov	al,[bp+0x0]		; 0000D3EA  8A4600  '.F.'
                  	or	word [bp+0x16],0x1	; 0000D3ED  814E160100  '.N...'
                  	ret				; 0000D3F2  C3  '.'
                  
                  xd3f3:	push	dx			; 0000D3F3  52  'R'
                  	call	xd430			; 0000D3F4  E83900  '.9.'
                  	test	al,0x40			; 0000D3F7  A840  '.@'
                  	pop	dx			; 0000D3F9  5A  'Z'
                  	ret				; 0000D3FA  C3  '.'
                  
                  xd3fb:	mov	al,0x90			; 0000D3FB  B090  '..'
                  	jmp	short xd401		; 0000D3FD  EB02  '..'
                  
                  xd3ff:	mov	al,0x10			; 0000D3FF  B010  '..'
                  xd401:	call	xb544			; 0000D401  E840E1  '.@.'
                  	ret				; 0000D404  C3  '.'
                  
                  xd405:	push	dx			; 0000D405  52  'R'
                  	call	xd3ff			; 0000D406  E8F6FF  '...'
                  	mov	dl,[bp+0x6]		; 0000D409  8A5606  '.V.'
                  	or	dl,dl			; 0000D40C  0AD2  0x0A,'.'
                  	jnz	xd413			; 0000D40E  7503  'u.'
                  	shr	al,0x4			; 0000D410  C0E804  '...'
                  xd413:	and	al,0xf			; 0000D413  240F  '$.'
                  	or	al,al			; 0000D415  0AC0  0x0A,'.'
                  	jz	xd420			; 0000D417  7407  't.'
                  	cmp	al,0x4			; 0000D419  3C04  '<.'
                  	ja	xd420			; 0000D41B  7703  'w.'
                  	clc				; 0000D41D  F8  '.'
                  	jmp	short xd421		; 0000D41E  EB01  '..'
                  
                  xd420:	stc				; 0000D420  F9  '.'
                  xd421:	pop	dx			; 0000D421  5A  'Z'
                  	ret				; 0000D422  C3  '.'
                  
                  xd423:	call	x9190			; 0000D423  E86ABD  '.j.'
                  	mov	ah,[bx]			; 0000D426  8A27  '.',0x27
                  	test	ah,0x10			; 0000D428  F6C410  '...'
                  	ret				; 0000D42B  C3  '.'
                  
                  xd42c:	mov	al,0x8e			; 0000D42C  B08E  '..'
                  	jmp	short xd432		; 0000D42E  EB02  '..'
                  
                  xd430:	mov	al,0xe			; 0000D430  B00E  '..'
                  xd432:	call	xb544			; 0000D432  E80FE1  '...'
                  	ret				; 0000D435  C3  '.'
                  
                  xd436:	mov	dx,[0x10]		; 0000D436  8B161000  '....'
                  	test	dl,0x1			; 0000D43A  F6C201  '...'
                  	jz	xd451			; 0000D43D  7412  't.'
                  	and	dl,0xc0			; 0000D43F  80E2C0  '...'
                  	jz	xd44d			; 0000D442  7409  't.'
                  	cmp	dl,0x40			; 0000D444  80FA40  '..@'
                  	jnz	xd451			; 0000D447  7508  'u.'
                  	mov	dl,0x2			; 0000D449  B202  '..'
                  	jmp	short xd454		; 0000D44B  EB07  '..'
                  
                  xd44d:	mov	dl,0x1			; 0000D44D  B201  '..'
                  	jmp	short xd454		; 0000D44F  EB03  '..'
                  
                  xd451:	mov	dl,0x0			; 0000D451  B200  '..'
                  	stc				; 0000D453  F9  '.'
                  xd454:	ret				; 0000D454  C3  '.'
                  
                  xd455:	mov	bh,ah			; 0000D455  8AFC  '..'
                  	mov	ah,[bp+0x6]		; 0000D457  8A6606  '.f.'
                  	or	ah,ah			; 0000D45A  0AE4  0x0A,'.'
                  	jz	xd461			; 0000D45C  7403  't.'
                  	shl	al,0x4			; 0000D45E  C0E004  '...'
                  xd461:	or	[0x8f],al		; 0000D461  08068F00  '....'
                  	mov	ah,bh			; 0000D465  8AE7  '..'
                  	ret				; 0000D467  C3  '.'
                  
                  xd468:	mov	bh,ah			; 0000D468  8AFC  '..'
                  	mov	ah,[bp+0x6]		; 0000D46A  8A6606  '.f.'
                  	or	ah,ah			; 0000D46D  0AE4  0x0A,'.'
                  	jz	xd474			; 0000D46F  7403  't.'
                  	shl	al,0x4			; 0000D471  C0E004  '...'
                  xd474:	not	al			; 0000D474  F6D0  '..'
                  	and	[0x8f],al		; 0000D476  20068F00  ' ...'
                  	mov	ah,bh			; 0000D47A  8AE7  '..'
                  	ret				; 0000D47C  C3  '.'
                  
                  xd47d:	xor	ax,ax			; 0000D47D  33C0  '3.'
                  	mov	al,[0x8f]		; 0000D47F  A08F00  '...'
                  	mov	ah,[bp+0x6]		; 0000D482  8A6606  '.f.'
                  	or	ah,ah			; 0000D485  0AE4  0x0A,'.'
                  	jz	xd48c			; 0000D487  7403  't.'
                  	shr	al,0x4			; 0000D489  C0E804  '...'
                  xd48c:	and	ax,0xf			; 0000D48C  250F00  '%..'
                  	ret				; 0000D48F  C3  '.'
                  
                  xd490:	push	ax			; 0000D490  50  'P'
                  	push	bx			; 0000D491  53  'S'
                  	push	dx			; 0000D492  52  'R'
                  	mov	al,ah			; 0000D493  8AC4  '..'
                  	shr	al,0x6			; 0000D495  C0E806  '...'
                  	mov	dx,0x3f7		; 0000D498  BAF703  '...'
                  	out	dx,al			; 0000D49B  EE  '.'
                  	mov	al,[0x8b]		; 0000D49C  A08B00  '...'
                  	mov	bl,al			; 0000D49F  8AD8  '..'
                  	and	al,0xc0			; 0000D4A1  24C0  '$.'
                  	shr	al,0x4			; 0000D4A3  C0E804  '...'
                  	test	bl,0x1			; 0000D4A6  F6C301  '...'
                  	jz	xd4ad			; 0000D4A9  7402  't.'
                  	or	al,0x1			; 0000D4AB  0C01  '..'
                  xd4ad:	and	ah,0xc0			; 0000D4AD  80E4C0  '...'
                  	or	ah,al			; 0000D4B0  0AE0  0x0A,'.'
                  	mov	[0x8b],ah		; 0000D4B2  88268B00  '.&..'
                  	pop	dx			; 0000D4B6  5A  'Z'
                  	pop	bx			; 0000D4B7  5B  '['
                  	pop	ax			; 0000D4B8  58  'X'
                  	ret				; 0000D4B9  C3  '.'
                  
                  xd4ba:	call	xc9bf			; 0000D4BA  E802F5  '...'
                  	jz	xd4ba			; 0000D4BD  74FB  't.'
                  	call	x919a			; 0000D4BF  E8D8BC  '...'
                  	in	al,dx			; 0000D4C2  EC  '.'
                  	ret				; 0000D4C3  C3  '.'
                  
                  xd4c4:	call	xc9bf			; 0000D4C4  E8F8F4  '...'
                  	jnz	xd4c4			; 0000D4C7  75FB  'u.'
                  	call	x919a			; 0000D4C9  E8CEBC  '...'
                  	mov	al,bh			; 0000D4CC  8AC7  '..'
                  	out	dx,al			; 0000D4CE  EE  '.'
                  	ret				; 0000D4CF  C3  '.'
                  
                  xd4d0:	mov	bx,[es:si]		; 0000D4D0  268B1C  '&..'
                  	xchg	bh,bl			; 0000D4D3  86FB  '..'
                  	call	xd4c4			; 0000D4D5  E8ECFF  '...'
                  	xchg	bh,bl			; 0000D4D8  86FB  '..'
                  	call	xd4c4			; 0000D4DA  E8E7FF  '...'
                  	ret				; 0000D4DD  C3  '.'
                  
                  	push	ax			; 0000D4DE  50  'P'
                  	call	xee9c			; 0000D4DF  E8BA19  '...'
                  	mov	bh,0x4a			; 0000D4E2  B74A  '.J'
                  	call	xd4c4			; 0000D4E4  E8DDFF  '...'
                  	mov	bh,[bp+0x7]		; 0000D4E7  8A7E07  '.~.'
                  	shl	bh,0x2			; 0000D4EA  C0E702  '...'
                  	or	bh,[bp+0x6]		; 0000D4ED  0A7E06  0x0A,'~.'
                  	call	xd4c4			; 0000D4F0  E8D1FF  '...'
                  	call	xef85			; 0000D4F3  E88F1A  '...'
                  	jnz	xd509			; 0000D4F6  7511  'u.'
                  	mov	cx,0x7			; 0000D4F8  B90700  '...'
                  	mov	di,0x42			; 0000D4FB  BF4200  '.B.'
                  xd4fe:	call	xd4ba			; 0000D4FE  E8B9FF  '...'
                  	mov	[di],al			; 0000D501  8805  '..'
                  	inc	di			; 0000D503  47  'G'
                  	loop	xd4fe			; 0000D504  E2F8  '..'
                  	call	xd50f			; 0000D506  E80600  '...'
                  xd509:	mov	[0x41],ah		; 0000D509  88264100  '.&A.'
                  	pop	ax			; 0000D50D  58  'X'
                  	ret				; 0000D50E  C3  '.'
                  
                  ;
                  ;   Check the FDC's ST0 response
                  ;
                  xd50f:	mov	al,[0x42]		; 0000D50F  A04200  '.B.'
                  	test	al,0xc0			; 0000D512  A8C0  '..'
                  	jz	xd53d			; 0000D514  No problems
                  
                  	test	al,0x8			; 0000D516  A808  '..'
                  	jz	xd51e			; 0000D518  7404  't.'
                  	mov	ah,0x80			; 0000D51A  B480  '..'
                  	jmp	short xd53f		; 0000D51C  EB21  '.!'
                  
                  xd51e:	mov	ah,[0x43]		; 0000D51E  8A264300  '.&C.'
                  	test	ah,0x30			; 0000D522  F6C430  '..0'
                  	jz	xd52b			; 0000D525  7404  't.'
                  	shr	ah,1			; 0000D527  D0EC  '..'
                  	jmp	short xd53f		; 0000D529  EB14  '..'
                  
                  xd52b:	test	ah,0x3			; 0000D52B  F6C403  '...'
                  	jz	xd534			; 0000D52E  7404  't.'
                  	inc	ah			; 0000D530  FEC4  '..'
                  	jmp	short xd53f		; 0000D532  EB0B  '..'
                  
                  xd534:	test	ah,0x80			; 0000D534  F6C480  '...'
                  	jz	xd53b			; 0000D537  7402  't.'
                  	mov	ah,0x4			; 0000D539  B404  '..'
                  xd53b:	jmp	short xd53f		; 0000D53B  EB02  '..'
                  
                  xd53d:	mov	ah,0x0			; 0000D53D  B400  '..'
                  xd53f:	ret				; 0000D53F  C3  '.'
                  
                  xd540:	mov	bx,0x40			; 0000D540  BB4000  '.@.'
                  	mov	ds,bx			; 0000D543  8EDB  '..'
                  	mov	bx,0x90			; 0000D545  BB9000  '...'
                  	cmp	byte [bx],0x93		; 0000D548  803F93  '.?.'
                  	jnz	xd550			; 0000D54B  7503  'u.'
                  	jmp	xd617			; 0000D54D  E9C700  '...'
                  
                  xd550:	mov	al,[bx]			; 0000D550  8A07  '..'
                  	and	al,0xc0			; 0000D552  24C0  '$.'
                  	shr	al,0x6			; 0000D554  C0E806  '...'
                  	or	al,al			; 0000D557  0AC0  0x0A,'.'
                  	jz	xd5ac			; 0000D559  7451  'tQ'
                  	dec	al			; 0000D55B  FEC8  '..'
                  	jnz	xd583			; 0000D55D  7524  'u$'
                  	mov	bl,0x5			; 0000D55F  B305  '..'
                  	mov	ch,0x27			; 0000D561  B527  '.',0x27
                  xd563:	mov	ah,0x0			; 0000D563  B400  '..'
                  	int	0x13			; 0000D565  CD13  '..'
                  	mov	ah,0x74			; 0000D567  B474  '.t'
                  	call	xd64b			; 0000D569  E8DF00  '...'
                  	mov	ax,0x409		; 0000D56C  B80904  '...'
                  	mov	cl,0x1			; 0000D56F  B101  '..'
                  	xor	dx,dx			; 0000D571  33D2  '3.'
                  	int	0x13			; 0000D573  CD13  '..'
                  	jc	xd57a			; 0000D575  7203  'r.'
                  	jmp	xd5fe			; 0000D577  E98400  '...'
                  
                  xd57a:	cmp	ah,0x4			; 0000D57A  80FC04  '...'
                  	jnz	xd583			; 0000D57D  7504  'u.'
                  	or	al,al			; 0000D57F  0AC0  0x0A,'.'
                  	jnz	xd5fe			; 0000D581  757B  'u{'
                  xd583:	mov	ah,0x0			; 0000D583  B400  '..'
                  	int	0x13			; 0000D585  CD13  '..'
                  	mov	ah,0x97			; 0000D587  B497  '..'
                  	call	xd64b			; 0000D589  E8BF00  '...'
                  	add	ch,0x28			; 0000D58C  80C528  '..('
                  	mov	ax,0x409		; 0000D58F  B80904  '...'
                  	mov	cl,0x1			; 0000D592  B101  '..'
                  	xor	dx,dx			; 0000D594  33D2  '3.'
                  	int	0x13			; 0000D596  CD13  '..'
                  	jnc	xd5e0			; 0000D598  7346  'sF'
                  	cmp	ah,0x4			; 0000D59A  80FC04  '...'
                  	jnz	xd5a3			; 0000D59D  7504  'u.'
                  	or	al,al			; 0000D59F  0AC0  0x0A,'.'
                  	jnz	xd5e0			; 0000D5A1  753D  'u='
                  xd5a3:	dec	bl			; 0000D5A3  FECB  '..'
                  	jz	xd622			; 0000D5A5  747B  't{'
                  	sub	ch,0x29			; 0000D5A7  80ED29  '..)'
                  	jmp	short xd563		; 0000D5AA  EBB7  '..'
                  
                  xd5ac:	mov	bl,0x5			; 0000D5AC  B305  '..'
                  	xor	ch,ch			; 0000D5AE  32ED  '2.'
                  xd5b0:	mov	ah,0x0			; 0000D5B0  B400  '..'
                  	int	0x13			; 0000D5B2  CD13  '..'
                  	mov	ah,0x17			; 0000D5B4  B417  '..'
                  	call	xd64b			; 0000D5B6  E89200  '...'
                  	mov	ax,0x401		; 0000D5B9  B80104  '...'
                  	mov	cl,0x10			; 0000D5BC  B110  '..'
                  	xor	dx,dx			; 0000D5BE  33D2  '3.'
                  	int	0x13			; 0000D5C0  CD13  '..'
                  	jnc	xd5e0			; 0000D5C2  731C  's.'
                  	mov	ah,0x0			; 0000D5C4  B400  '..'
                  	int	0x13			; 0000D5C6  CD13  '..'
                  	mov	ah,0x15			; 0000D5C8  B415  '..'
                  	call	xd64b			; 0000D5CA  E87E00  '.~.'
                  	mov	ax,0x401		; 0000D5CD  B80104  '...'
                  	mov	cl,0xf			; 0000D5D0  B10F  '..'
                  	xor	dx,dx			; 0000D5D2  33D2  '3.'
                  	int	0x13			; 0000D5D4  CD13  '..'
                  	jnc	xd5fe			; 0000D5D6  7326  's&'
                  	dec	bl			; 0000D5D8  FECB  '..'
                  	jz	xd622			; 0000D5DA  7446  'tF'
                  	inc	ch			; 0000D5DC  FEC5  '..'
                  	jmp	short xd5b0		; 0000D5DE  EBD0  '..'
                  
                  xd5e0:	mov	bx,0x90			; 0000D5E0  BB9000  '...'
                  	cmp	byte [bx],0x97		; 0000D5E3  803F97  '.?.'
                  	jz	xd5f3			; 0000D5E6  740B  't.'
                  	mov	ah,0x4			; 0000D5E8  B404  '..'
                  	call	xd65f			; 0000D5EA  E87200  '.r.'
                  	mov	dx,0xa13c		; 0000D5ED  BA3CA1  '.<.'
                  	jmp	short xd647		; 0000D5F0  EB55  '.U'
                  
                  	nop				; 0000D5F2  90  '.'
                  xd5f3:	mov	ah,0x34			; 0000D5F3  B434  '.4'
                  	call	xd65f			; 0000D5F5  E86700  '.g.'
                  	mov	dx,0xa12f		; 0000D5F8  BA2FA1  './.'
                  	jmp	short xd647		; 0000D5FB  EB4A  '.J'
                  
                  	nop				; 0000D5FD  90  '.'
                  xd5fe:	mov	ah,0x2			; 0000D5FE  B402  '..'
                  	call	xd65f			; 0000D600  E85C00  '.\.'
                  	mov	bx,0x90			; 0000D603  BB9000  '...'
                  	cmp	byte [bx],0x74		; 0000D606  803F74  '.?t'
                  	jz	xd611			; 0000D609  7406  't.'
                  	mov	dx,0xa115		; 0000D60B  BA15A1  '...'
                  	jmp	short xd647		; 0000D60E  EB37  '.7'
                  
                  	nop				; 0000D610  90  '.'
                  xd611:	mov	dx,0xa108		; 0000D611  BA08A1  '...'
                  	jmp	short xd647		; 0000D614  EB31  '.1'
                  
                  	nop				; 0000D616  90  '.'
                  xd617:	mov	ah,0x1			; 0000D617  B401  '..'
                  	call	xd65f			; 0000D619  E84300  '.C.'
                  	mov	dx,0xa0fb		; 0000D61C  BAFBA0  '...'
                  	jmp	short xd647		; 0000D61F  EB26  '.&'
                  
                  	nop				; 0000D621  90  '.'
                  xd622:	call	xd3f3			; 0000D622  E8CEFD  '...'
                  	jnz	xd64a			; 0000D625  7523  'u#'
                  	call	xd3ff			; 0000D627  E8D5FD  '...'
                  	and	al,0xf0			; 0000D62A  24F0  '$.'
                  	shr	al,0x4			; 0000D62C  C0E804  '...'
                  	cmp	al,0x1			; 0000D62F  3C01  '<.'
                  	mov	dx,0xa0fb		; 0000D631  BAFBA0  '...'
                  	jz	xd647			; 0000D634  7411  't.'
                  	dec	al			; 0000D636  FEC8  '..'
                  	mov	dx,0xa108		; 0000D638  BA08A1  '...'
                  	jz	xd647			; 0000D63B  740A  't',0x0A
                  	dec	al			; 0000D63D  FEC8  '..'
                  	mov	dx,0xa122		; 0000D63F  BA22A1  '.".'
                  	jz	xd647			; 0000D642  7403  't.'
                  	mov	dx,0xa13c		; 0000D644  BA3CA1  '.<.'
                  xd647:	call	xd6cd			; 0000D647  E88300  '...'
                  xd64a:	ret				; 0000D64A  C3  '.'
                  
                  xd64b:	push	bx			; 0000D64B  53  'S'
                  	mov	bx,0x90			; 0000D64C  BB9000  '...'
                  	cmp	[bx],ah			; 0000D64F  3827  '8',0x27
                  	jz	xd65d			; 0000D651  740A  't',0x0A
                  	mov	[bx],ah			; 0000D653  8827  '.',0x27
                  	call	xd490			; 0000D655  E838FE  '.8.'
                  	or	byte [0x8f],0x6		; 0000D658  800E8F0006  '.....'
                  xd65d:	pop	bx			; 0000D65D  5B  '['
                  	ret				; 0000D65E  C3  '.'
                  
                  xd65f:	call	xd3f3			; 0000D65F  E891FD  '...'
                  	jnz	xd6cc			; 0000D662  7568  'uh'
                  	call	xd3ff			; 0000D664  E898FD  '...'
                  	shr	al,0x4			; 0000D667  C0E804  '...'
                  	cmp	ah,al			; 0000D66A  3AE0  ':.'
                  	jz	xd6be			; 0000D66C  7450  'tP'
                  	cmp	ah,0x34			; 0000D66E  80FC34  '..4'
                  	jnz	xd67b			; 0000D671  7508  'u.'
                  	cmp	al,0x3			; 0000D673  3C03  '<.'
                  	jz	xd6be			; 0000D675  7447  'tG'
                  	cmp	al,0x4			; 0000D677  3C04  '<.'
                  	jz	xd6be			; 0000D679  7443  'tC'
                  xd67b:	mov	al,0x33			; 0000D67B  B033  '.3'
                  	call	xb544			; 0000D67D  E8C4DE  '...'
                  	or	al,0x4			; 0000D680  0C04  '..'
                  	and	al,0xfc			; 0000D682  24FC  '$.'
                  	or	al,ah			; 0000D684  0AC4  0x0A,'.'
                  	mov	ah,al			; 0000D686  8AE0  '..'
                  	mov	al,0x33			; 0000D688  B033  '.3'
                  	call	xb549			; 0000D68A  E8BCDE  '...'
                  	call	xd430			; 0000D68D  E8A0FD  '...'
                  	test	al,0x20			; 0000D690  A820  '. '
                  	jnz	xd6cc			; 0000D692  7538  'u8'
                  	mov	ah,al			; 0000D694  8AE0  '..'
                  	or	ah,0x20			; 0000D696  80CC20  '.. '
                  	mov	al,0xe			; 0000D699  B00E  '..'
                  	call	xb549			; 0000D69B  E8ABDE  '...'
                  	mov	dx,0x2000		; 0000D69E  BA0020  '.. '
                  	mov	bx,0xba1e		; 0000D6A1  BB1EBA  '...'
                  	mov	cx,0x59			; 0000D6A4  B95900  '.Y.'
                  	call	xc745			; 0000D6A7  E89BF0  '...'
                  	mov	bp,0x1			; 0000D6AA  BD0100  '...'
                  	call	xe38f			; 0000D6AD  E8DF0C  '...'
                  	mov	ah,0xf			; 0000D6B0  B40F  '..'
                  	int	0x10			; 0000D6B2  CD10  '..'
                  	mov	ah,0x0			; 0000D6B4  B400  '..'
                  	int	0x10			; 0000D6B6  CD10  '..'
                  	mov	al,0xbd			; 0000D6B8  B0BD  '..'
                  	out	0x84,al			; 0000D6BA  E684  '..'
                  	jmp	short xd6cc		; 0000D6BC  EB0E  '..'
                  
                  xd6be:	mov	al,0x33			; 0000D6BE  B033  '.3'
                  	mov	ah,al			; 0000D6C0  8AE0  '..'
                  	call	xb544			; 0000D6C2  E87FDE  '...'
                  	and	al,0xfb			; 0000D6C5  24FB  '$.'
                  	xchg	al,ah			; 0000D6C7  86C4  '..'
                  	call	xb549			; 0000D6C9  E87DDE  '.}.'
                  xd6cc:	ret				; 0000D6CC  C3  '.'
                  
                  xd6cd:	push	ax			; 0000D6CD  50  'P'
                  	mov	ax,dx			; 0000D6CE  8BC2  '..'
                  	xor	dx,dx			; 0000D6D0  33D2  '3.'
                  	mov	es,dx			; 0000D6D2  8EC2  '..'
                  	mov	di,0x78			; 0000D6D4  BF7800  '.x.'
                  	stosw				; 0000D6D7  AB  '.'
                  	mov	ax,cs			; 0000D6D8  8CC8  '..'
                  	stosw				; 0000D6DA  AB  '.'
                  	pop	ax			; 0000D6DB  58  'X'
                  	ret				; 0000D6DC  C3  '.'
                  
                  xd6dd:	pusha				; 0000D6DD  60  '`'
                  	push	ds			; 0000D6DE  1E  '.'
                  	push	es			; 0000D6DF  06  '.'
                  	push	fs			; 0000D6E0  0FA0  '..'
                  	push	gs			; 0000D6E2  0FA8  '..'
                  	mov	al,0x60			; 0000D6E4  B060  '.`'
                  	out	0x84,al			; 0000D6E6  E684  '..'
                  	mov	ax,0x1c00		; 0000D6E8  B8001C  '...'
                  	mov	ds,ax			; 0000D6EB  8ED8  '..'
                  	mov	bx,0x40			; 0000D6ED  BB4000  '.@.'
                  	mov	es,bx			; 0000D6F0  8EC3  '..'
                  	mov	[es:0x69],ss		; 0000D6F2  268C166900  '&..i.'
                  	mov	[es:0x67],sp		; 0000D6F7  2689266700  '&.&g.'
                  	mov	word [0x64],0x0		; 0000D6FC  C70664000000  '..d...'
                  	mov	al,0x61			; 0000D702  B061  '.a'
                  	out	0x84,al			; 0000D704  E684  '..'
                  	call	x80e2			; 0000D706  E8D9A9  '...'
                  	jz	xd714			; 0000D709  7409  't.'
                  	or	word [0x64],0x10	; 0000D70B  810E64001000  '..d...'
                  	jmp	xda75			; 0000D711  E96103  '.a.'
                  
                  xd714:	call	x863f			; 0000D714  E828AF  '.(.'
                  	mov	al,0x62			; 0000D717  B062  '.b'
                  	out	0x84,al			; 0000D719  E684  '..'
                  	mov	word [0x86],0x80	; 0000D71B  C70686008000  '......'
                  	mov	word [0x88],0x0		; 0000D721  C70688000000  '......'
                  	call	x8028			; 0000D727  E8FEA8  '...'
                  	cmp	word [es:0x72],0x1234	; 0000D72A  26813E72003412  '&.>r.4.'
                  	jnz	xd742			; 0000D731  750F  'u.'
                  	mov	ax,[0x7c]		; 0000D733  A17C00  '.|.'
                  	mov	[0x86],ax		; 0000D736  A38600  '...'
                  	mov	ax,[0x7e]		; 0000D739  A17E00  '.~.'
                  	mov	[0x88],ax		; 0000D73C  A38800  '...'
                  	jmp	xd940			; 0000D73F  E9FE01  '...'
                  
                  xd742:	cld				; 0000D742  FC  '.'
                  	push	si			; 0000D743  56  'V'
                  	push	di			; 0000D744  57  'W'
                  	push	ds			; 0000D745  1E  '.'
                  	push	es			; 0000D746  06  '.'
                  	mov	bx,ds			; 0000D747  8CDB  '..'
                  	mov	es,bx			; 0000D749  8EC3  '..'
                  	mov	bx,0x30			; 0000D74B  BB3000  '.0.'
                  	mov	ds,bx			; 0000D74E  8EDB  '..'
                  	mov	si,0x830c		; 0000D750  BE0C83  '...'
                  	mov	di,0x93			; 0000D753  BF9300  '...'
                  	mov	cx,0xb			; 0000D756  B90B00  '...'
                  	rep	movsw			; 0000D759  F3A5  '..'
                  	pop	es			; 0000D75B  07  '.'
                  	pop	ds			; 0000D75C  1F  '.'
                  	pop	di			; 0000D75D  5F  '_'
                  	pop	si			; 0000D75E  5E  '^'
                  	mov	al,0x63			; 0000D75F  B063  '.c'
                  	out	0x84,al			; 0000D761  E684  '..'
                  	call	x81e6			; 0000D763  E880AA  '...'
                  	jnc	xd76f			; 0000D766  7307  's.'
                  	mov	al,0x64			; 0000D768  B064  '.d'
                  	out	0x84,al			; 0000D76A  E684  '..'
                  	jmp	short xd77d		; 0000D76C  EB0F  '..'
                  
                  	nop				; 0000D76E  90  '.'
                  xd76f:	cmp	word [0x76],0x80	; 0000D76F  813E76008000  '.>v...'
                  	jnc	xd78d			; 0000D775  7316  's.'
                  	or	word [0x64],0x80	; 0000D777  810E64008000  '..d...'
                  xd77d:	mov	bx,[0x7c]		; 0000D77D  8B1E7C00  '..|.'
                  	mov	[0x76],bx		; 0000D781  891E7600  '..v.'
                  	mov	bx,[0x7e]		; 0000D785  8B1E7E00  '..~.'
                  	mov	[0x78],bx		; 0000D789  891E7800  '..x.'
                  xd78d:	call	x84a5			; 0000D78D  E815AD  '...'
                  
                  ;
                  ;   Call this xdb33 wrapper to test 128Kb of memory at %FE0000
                  ;
                  	call	x8509			; 0000D790  E876AD  '.v.'
                  	or	ax,ax			; 0000D793  0BC0  '..'
                  	jz	xd79a			; 0000D795  7403  't.'
                  	jmp	xd988			; 0000D797  E9EE01  '...'
                  
                  xd79a:	mov	bx,[0x76]		; 0000D79A  8B1E7600  '..v.'
                  ;
                  ;   (BX) contains 0x280 (640)
                  ;
                  	sub	bx,0x80			; 0000D79E  81EB8000  '....'
                  ;
                  ;   (BX) is reduced by 128 for a total of 512
                  ;
                  	mov	[0x7a],bx		; 0000D7A2  891E7A00  '..z.'
                  ;
                  ;   (BX) again contains 0x280 (640), again is reduced by 128, and again stored elsewhere
                  ;
                  	mov	bx,[0x7c]		; 0000D7A6  8B1E7C00  '..|.'
                  	sub	bx,0x80			; 0000D7AA  81EB8000  '....'
                  	mov	[0x80],bx		; 0000D7AE  891E8000  '....'
                  
                  	mov	al,[0x90]		; 0000D7B2  A09000  '...'
                  ;
                  ;   (AL) contains 0x09
                  ;
                  	mov	[0x8f],al		; 0000D7B5  A28F00  '...'
                  
                  	mov	ah,0x2			; 0000D7B8  B402  '..'
                  	mov	byte [0x92],0x1		; 0000D7BA  C606920001  '.....'
                  	call	xdabb			; 0000D7BF  E8F902  '...'
                  
                  	mov	bx,[0x8a]		; 0000D7C2  8B1E8A00  '....'
                  	add	bx,0x80			; 0000D7C6  81C38000  '....'
                  	mov	[0x86],bx		; 0000D7CA  891E8600  '....'
                  	or	ax,ax			; 0000D7CE  0BC0  '..'
                  	jz	xd7e4			; 0000D7D0  7412  't.'
                  	or	word [0x64],0x1		; 0000D7D2  810E64000100  '..d...'
                  	mov	[0x66],ch		; 0000D7D8  882E6600  '..f.'
                  	mov	[0x67],dx		; 0000D7DC  89166700  '..g.'
                  	mov	[0x69],cl		; 0000D7E0  880E6900  '..i.'
                  
                  xd7e4:	mov	al,0x65			; 0000D7E4  B065  '.e'
                  	out	0x84,al			; 0000D7E6  E684  '..'
                  ;
                  ;   (BX) becomes 0x400 (the amount of extended memory in Kb)
                  ;
                  	mov	bx,[0x78]		; 0000D7E8  8B1E7800  '..x.'
                  	mov	[0x7a],bx		; 0000D7EC  891E7A00  '..z.'
                  ;
                  ;   (BX) becomes 0x3B80 (not sure where this number comes from)
                  ;
                  	mov	bx,[0x7e]		; 0000D7F0  8B1E7E00  '..~.'
                  	mov	[0x80],bx		; 0000D7F4  891E8000  '....'
                  
                  	mov	bp,[0x86]		; 0000D7F8  8B2E8600  '....'
                  	add	bp,0x80			; 0000D7FC  81C58000  '....'
                  ;
                  ;   (BP) is now 0x280 + 0x80, for a total of 0x300
                  ;
                  ;   (AL) becomes 0x9F
                  ;
                  	mov	al,[0x91]		; 0000D800  A09100  '...'
                  	mov	[0x8f],al		; 0000D803  A28F00  '...'
                  
                  	mov	ah,0x10			; 0000D806  B410  '..'
                  	mov	byte [0x92],0x1		; 0000D808  C606920001  '.....'
                  	call	xdabb			; 0000D80D  E8AB02  '...'
                  
                  	mov	bx,[0x8a]		; 0000D810  8B1E8A00  '....'
                  	mov	[0x88],bx		; 0000D814  891E8800  '....'
                  	or	ax,ax			; 0000D818  0BC0  '..'
                  	jz	xd82e			; 0000D81A  7412  't.'
                  	or	word [0x64],0x2		; 0000D81C  810E64000200  '..d...'
                  	mov	[0x6e],ch		; 0000D822  882E6E00  '..n.'
                  	mov	[0x6f],dx		; 0000D826  89166F00  '..o.'
                  	mov	[0x71],cl		; 0000D82A  880E7100  '..q.'
                  xd82e:	mov	ax,[0x88]		; 0000D82E  A18800  '...'
                  	add	ax,0x400		; 0000D831  050004  '...'
                  	mov	bx,0x3f80		; 0000D834  BB803F  '..?'
                  	sub	bx,[0x8d]		; 0000D837  2B1E8D00  '+...'
                  	cmp	ax,bx			; 0000D83B  3BC3  ';.'
                  	jnc	xd878			; 0000D83D  7339  's9'
                  	mov	bp,[0x88]		; 0000D83F  8B2E8800  '....'
                  	add	bp,[0x86]		; 0000D843  032E8600  '....'
                  	add	bp,0x80			; 0000D847  81C58000  '....'
                  	mov	ax,[0x8d]		; 0000D84B  A18D00  '...'
                  	mov	[0x82],ax		; 0000D84E  A38200  '...'
                  	mov	byte [0x8f],0xff	; 0000D851  C6068F00FF  '.....'
                  	mov	ah,[0x8c]		; 0000D856  8A268C00  '.&..'
                  	mov	byte [0x92],0x1		; 0000D85A  C606920001  '.....'
                  	call	xdb33			; 0000D85F  E8D102  '...'
                  	or	ax,ax			; 0000D862  0BC0  '..'
                  	jz	xd878			; 0000D864  7412  't.'
                  	or	word [0x64],0x2		; 0000D866  810E64000200  '..d...'
                  	mov	[0x6e],ch		; 0000D86C  882E6E00  '..n.'
                  	mov	[0x6f],dx		; 0000D870  89166F00  '..o.'
                  	mov	[0x71],cl		; 0000D874  880E7100  '..q.'
                  ;
                  ;   We now restart the memory verification process, by redisplaying "00128 KB OK",
                  ;   and then calling xdbfb for each region of RAM identified earlier.  As before, (AH)
                  ;   contains the 64Kb block number of the region to verify.
                  ;
                  xd878:	push	es			; 0000D878  06  '.'
                  	mov	ax,0x40			; 0000D879  B84000  '.@.'
                  	mov	es,ax			; 0000D87C  8EC0  '..'
                  	mov	bp,0x80			; 0000D87E  BD8000  '...'
                  	mov	ax,bp			; 0000D881  8BC5  '..'
                  	call	x80a5			; 0000D883  E81FA8  '...'
                  	pop	es			; 0000D886  07  '.'
                  	mov	bp,0x80			; 0000D887  BD8000  '...'
                  	mov	byte [0x92],0x1		; 0000D88A  C606920001  '.....'
                  	mov	al,0xfe			; 0000D88F  B0FE  '..'
                  	mov	ah,0x0			; 0000D891  B400  '..'
                  	call	xdbfb			; 0000D893  E86503  '.e.'
                  	test	ax,0x2			; 0000D896  A90200  '...'
                  	jz	xd8ad			; 0000D899  7412  't.'
                  	or	word [0x64],0x44	; 0000D89B  810E64004400  '..d.D.'
                  	mov	[0x6a],ch		; 0000D8A1  882E6A00  '..j.'
                  	mov	[0x6b],dx		; 0000D8A5  89166B00  '..k.'
                  	mov	[0x6d],cl		; 0000D8A9  880E6D00  '..m.'
                  xd8ad:	mov	ax,[0x86]		; 0000D8AD  A18600  '...'
                  	mov	bx,0x400		; 0000D8B0  BB0004  '...'
                  	mul	bx			; 0000D8B3  F7E3  '..'
                  	mov	al,0x2			; 0000D8B5  B002  '..'
                  	cmp	al,dl			; 0000D8B7  3AC2  ':.'
                  	jz	xd8dc			; 0000D8B9  7421  't!'
                  	mov	ah,dl			; 0000D8BB  8AE2  '..'
                  	mov	byte [0x92],0x1		; 0000D8BD  C606920001  '.....'
                  	call	xdbfb			; 0000D8C2  E83603  '.6.'
                  	test	ax,0x2			; 0000D8C5  A90200  '...'
                  	jz	xd8dc			; 0000D8C8  7412  't.'
                  	or	word [0x64],0x4		; 0000D8CA  810E64000400  '..d...'
                  	mov	[0x6a],ch		; 0000D8D0  882E6A00  '..j.'
                  	mov	[0x6b],dx		; 0000D8D4  89166B00  '..k.'
                  	mov	[0x6d],cl		; 0000D8D8  880E6D00  '..m.'
                  xd8dc:	mov	ax,[0x88]		; 0000D8DC  A18800  '...'
                  	or	ax,ax			; 0000D8DF  0BC0  '..'
                  	jz	xd90b			; 0000D8E1  7428  't('
                  	add	ax,0x400		; 0000D8E3  050004  '...'
                  	mul	bx			; 0000D8E6  F7E3  '..'
                  	mov	al,0x10			; 0000D8E8  B010  '..'
                  	mov	ah,dl			; 0000D8EA  8AE2  '..'
                  	mov	byte [0x92],0x1		; 0000D8EC  C606920001  '.....'
                  	call	xdbfb			; 0000D8F1  E80703  '...'
                  	test	ax,0x2			; 0000D8F4  A90200  '...'
                  	jz	xd90b			; 0000D8F7  7412  't.'
                  	or	word [0x64],0x8		; 0000D8F9  810E64000800  '..d...'
                  	mov	[0x72],ch		; 0000D8FF  882E7200  '..r.'
                  	mov	[0x73],dx		; 0000D903  89167300  '..s.'
                  	mov	[0x75],cl		; 0000D907  880E7500  '..u.'
                  xd90b:	mov	ax,[0x88]		; 0000D90B  A18800  '...'
                  	add	ax,0x400		; 0000D90E  050004  '...'
                  	mov	bx,0x3f80		; 0000D911  BB803F  '..?'
                  	sub	bx,[0x8d]		; 0000D914  2B1E8D00  '+...'
                  	cmp	ax,bx			; 0000D918  3BC3  ';.'
                  	jnc	xd940			; 0000D91A  7324  's$'
                  	mov	al,[0x8c]		; 0000D91C  A08C00  '...'
                  	mov	ah,0xfe			; 0000D91F  B4FE  '..'
                  	mov	byte [0x92],0x1		; 0000D921  C606920001  '.....'
                  	call	xdbfb			; 0000D926  E8D202  '...'
                  	test	ax,0x2			; 0000D929  A90200  '...'
                  	jz	xd940			; 0000D92C  7412  't.'
                  	or	word [0x64],0x8		; 0000D92E  810E64000800  '..d...'
                  	mov	[0x72],ch		; 0000D934  882E7200  '..r.'
                  	mov	[0x73],dx		; 0000D938  89167300  '..s.'
                  	mov	[0x75],cl		; 0000D93C  880E7500  '..u.'
                  xd940:	mov	al,0x66			; 0000D940  B066  '.f'
                  	out	0x84,al			; 0000D942  E684  '..'
                  	mov	bx,[0x86]		; 0000D944  8B1E8600  '....'
                  ;
                  ;   Store the total amount of conventional RAM (in Kb) into the ROM BIOS Data Area at 0x40:0x13
                  ;
                  	mov	[es:0x13],bx		; 0000D948  26891E1300  '&....'
                  	mov	bx,[0x88]		; 0000D94D  8B1E8800  '....'
                  	mov	al,0xb0			; 0000D951  B0B0  '..'
                  	mov	ah,bl			; 0000D953  8AE3  '..'
                  	call	xb549			; 0000D955  E8F1DB  '...'
                  	mov	al,0xb1			; 0000D958  B0B1  '..'
                  	mov	ah,bh			; 0000D95A  8AE7  '..'
                  	call	xb549			; 0000D95C  E8EADB  '...'
                  	mov	cl,0x0			; 0000D95F  B100  '..'
                  	test	word [0x64],0x80	; 0000D961  F70664008000  '..d...'
                  	jz	xd96b			; 0000D967  7402  't.'
                  	mov	cl,0x1			; 0000D969  B101  '..'
                  xd96b:	call	x8214			; 0000D96B  E8A6A8  '...'
                  	mov	al,0x67			; 0000D96E  B067  '.g'
                  	out	0x84,al			; 0000D970  E684  '..'
                  	cmp	word [0x86],0x280	; 0000D972  813E86008002  '.>....'
                  	jc	xd988			; 0000D978  720E  'r.'
                  	mov	al,0xb3			; 0000D97A  B0B3  '..'
                  	call	xb544			; 0000D97C  E8C5DB  '...'
                  	or	al,0x80			; 0000D97F  0C80  '..'
                  	mov	ah,al			; 0000D981  8AE0  '..'
                  	mov	al,0xb3			; 0000D983  B0B3  '..'
                  	call	xb549			; 0000D985  E8C1DB  '...'
                  xd988:	mov	ah,0x2			; 0000D988  B402  '..'
                  	test	word [0x64],0xffff	; 0000D98A  F7066400FFFF  '..d...'
                  	jz	xd994			; 0000D990  7402  't.'
                  	mov	ah,0x3			; 0000D992  B403  '..'
                  xd994:	mov	al,0x8f			; 0000D994  B08F  '..'
                  	call	xb549			; 0000D996  E8B0DB  '...'
                  
                  	mov	al,0x68			; 0000D999  B068  '.h'
                  	out	0x84,al			; 0000D99B  E684  '..'
                  ;
                  ;   Set SYS_FLAG (0x04) in the 8042 CMD byte, and then pulse OUTPORT to return to real-mode
                  ;
                  	in	al,0x60			; 0000D99D  E460  '.`'
                  	mov	al,0x20			; 0000D99F  B020  '. '
                  	out	0x64,al			; 0000D9A1  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000D9A3  E88812  '...'
                  xd9a6:	in	al,0x64			; 0000D9A6  E464  '.d'
                  	test	al,0x1			; 0000D9A8  A801  '..'
                  	jz	xd9a6			; 0000D9AA  74FA  't.'
                  	in	al,0x60			; 0000D9AC  E460  '.`'
                  	mov	ah,al			; 0000D9AE  8AE0  '..'
                  	or	ah,0x4			; 0000D9B0  80CC04  '...'
                  	mov	al,0x60			; 0000D9B3  B060  '.`'
                  	out	0x64,al			; 0000D9B5  E664  '.d'
                  	push	ax			; 0000D9B7  50  'P'
                  	call	xec2e_wait_8042_ready	; 0000D9B8  E87312  '.s.'
                  	pop	ax			; 0000D9BB  58  'X'
                  	mov	al,ah			; 0000D9BC  8AC4  '..'
                  	out	0x60,al			; 0000D9BE  E660  '.`'
                  	call	xec2e_wait_8042_ready	; 0000D9C0  E86B12  '.k.'
                  	mov	al,0xfe			; 0000D9C3  B0FE  '..'
                  	out	0x64,al			; 0000D9C5  E664  '.d'
                  ;
                  ;   The following hang is temporary; the 8042 should reset the processor, returning us to real-mode
                  ;
                  xd9c7:	hlt				; 0000D9C7  F4  '.'
                  	jmp	short xd9c7		; 0000D9C8  EBFD  '..'
                  
                  	mov	al,0x69			; 0000D9CA  B069  '.i'
                  	out	0x84,al			; 0000D9CC  E684  '..'
                  	mov	bx,0x0			; 0000D9CE  BB0000  '...'
                  	jmp	short xd9db		; 0000D9D1  EB08  '..'
                  	nop				; 0000D9D3  90  '.'
                  ;
                  ;   Code for CMOS SHUTDOWN byte 0x03
                  ;
                  xd9d4:	mov	al,0x6a			; 0000D9D4  B06A  '.j'
                  	out	0x84,al			; 0000D9D6  E684  '..'
                  	mov	bx,0x1			; 0000D9D8  BB0100  '...'
                  
                  xd9db:	mov	ax,0x40			; 0000D9DB  B84000  '.@.'
                  	mov	ds,ax			; 0000D9DE  8ED8  '..'
                  	mov	ss,[0x69]		; 0000D9E0  8E166900  '..i.'
                  	mov	sp,[0x67]		; 0000D9E4  8B266700  '.&g.'
                  	push	bx			; 0000D9E8  53  'S'
                  	call	print_crlf		; 0000D9E9  E89AED  '...'
                  	pop	bx			; 0000D9EC  5B  '['
                  	or	bx,bx			; 0000D9ED  0BDB  '..'
                  	jnz	xd9f4			; 0000D9EF  7503  'u.'
                  	jmp	xda8c			; 0000D9F1  E99800  '...'
                  ;
                  ;   At checkpoint 0x6B, the conventional+extended memory test has been completed,
                  ;   and you should see a total at the top of the screen (eg, "01792 KB OK").
                  ;
                  xd9f4:	mov	al,0x6b			; 0000D9F4  B06B  '.k'
                  	out	0x84,al			; 0000D9F6  E684  '..'
                  
                  	mov	ax,0x1c00		; 0000D9F8  B8001C  '...'
                  	mov	ds,ax			; 0000D9FB  8ED8  '..'
                  
                  	test	word [0x64],0x1		; 0000D9FD  F70664000100  '..d...'
                  	jz	xda1b			; 0000DA03  7416  't.'
                  	call	print_crlf		; 0000DA05  E87EED  '.~.'
                  	xor	ch,ch			; 0000DA08  32ED  '2.'
                  	mov	cl,[0x66]		; 0000DA0A  8A0E6600  '..f.'
                  	mov	si,cx			; 0000DA0E  8BF1  '..'
                  	mov	cl,[0x69]		; 0000DA10  8A0E6900  '..i.'
                  	mov	dx,[0x67]		; 0000DA14  8B166700  '..g.'
                  	call	x822d			; 0000DA18  E812A8  '...'
                  
                  xda1b:	test	word [0x64],0x4		; 0000DA1B  F70664000400  '..d...'
                  	jz	xda39			; 0000DA21  7416  't.'
                  	call	print_crlf		; 0000DA23  E860ED  '.`.'
                  	xor	ch,ch			; 0000DA26  32ED  '2.'
                  	mov	cl,[0x6a]		; 0000DA28  8A0E6A00  '..j.'
                  	mov	si,cx			; 0000DA2C  8BF1  '..'
                  	mov	cl,[0x6d]		; 0000DA2E  8A0E6D00  '..m.'
                  	mov	dx,[0x6b]		; 0000DA32  8B166B00  '..k.'
                  	call	x8242			; 0000DA36  E809A8  '...'
                  
                  xda39:	test	word [0x64],0x2		; 0000DA39  F70664000200  '..d...'
                  	jz	xda57			; 0000DA3F  7416  't.'
                  	call	print_crlf		; 0000DA41  E842ED  '.B.'
                  	xor	ch,ch			; 0000DA44  32ED  '2.'
                  	mov	cl,[0x6e]		; 0000DA46  8A0E6E00  '..n.'
                  	mov	si,cx			; 0000DA4A  8BF1  '..'
                  	mov	cl,[0x71]		; 0000DA4C  8A0E7100  '..q.'
                  	mov	dx,[0x6f]		; 0000DA50  8B166F00  '..o.'
                  ;
                  ;   The next call prints an address, value, and error message; eg:
                  ;
                  ;	F00000 02 201-Memory Error
                  ;
                  	call	x822d			; 0000DA54  E8D6A7  '...'
                  
                  xda57:	test	word [0x64],0x8		; 0000DA57  F70664000800  '..d...'
                  	jz	xda75			; 0000DA5D  7416  't.'
                  	call	print_crlf		; 0000DA5F  E824ED  '.$.'
                  	xor	ch,ch			; 0000DA62  32ED  '2.'
                  	mov	cl,[0x72]		; 0000DA64  8A0E7200  '..r.'
                  	mov	si,cx			; 0000DA68  8BF1  '..'
                  	mov	cl,[0x75]		; 0000DA6A  8A0E7500  '..u.'
                  	mov	dx,[0x73]		; 0000DA6E  8B167300  '..s.'
                  ;
                  ;   The next call prints an address, value, and error message; eg:
                  ;
                  ;	F00000 FF 203-Memory Address Error
                  ;
                  	call	x8242			; 0000DA72  E8CDA7  '...'
                  
                  xda75:	test	word [0x64],0x10	; 0000DA75  F70664001000  '..d...'
                  	jz	xda8c			; 0000DA7B  740F  't.'
                  	call	print_crlf		; 0000DA7D  E806ED  '...'
                  	mov	dx,0x0			; 0000DA80  BA0000  '...'
                  	mov	bx,err102		; 0000DA83  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000DA86  B91A00  '...'
                  	call	xc745			; 0000DA89  E8B9EC  '...'
                  
                  xda8c:	test	word [0x64],0xffff	; 0000DA8C  F7066400FFFF  '..d...'
                  	jz	xdaac			; 0000DA92  7418  't.'
                  	call	print_crlf		; 0000DA94  E8EFEC  '...'
                  	test	word [0x64],0x40	; 0000DA97  F70664004000  '..d.@.'
                  	jz	xdaa2			; 0000DA9D  7403  't.'
                  	jmp	xd9c7			; 0000DA9F  E925FF  '.%.'
                  
                  xdaa2:	in	al,0x61			; 0000DAA2  E461  '.a'
                  	test	al,0xc0			; 0000DAA4  A8C0  '..'
                  	jz	xdaac			; 0000DAA6  7404  't.'
                  	mov	al,0x74			; 0000DAA8  B074  '.t'
                  	out	0x84,al			; 0000DAAA  E684  '..'
                  xdaac:	call	xd079			; 0000DAAC  E8CAF5  '...'
                  	mov	al,0x6c			; 0000DAAF  B06C  '.l'
                  	out	0x84,al			; 0000DAB1  E684  '..'
                  	pop	gs			; 0000DAB3  0FA9  '..'
                  	pop	fs			; 0000DAB5  0FA1  '..'
                  	pop	es			; 0000DAB7  07  '.'
                  	pop	ds			; 0000DAB8  1F  '.'
                  	popa				; 0000DAB9  61  'a'
                  	ret				; 0000DABA  C3  '.'
                  
                  ;
                  ;   Another wrapper around the xdb33 memory test
                  ;
                  ;   When called for conventional memory:
                  ;
                  ; 	(AH) == starting 64Kb block number (eg, 0x02)
                  ; 	(AL) == 0x09, which came from byte [0x90]
                  ; 	(BX) == amount of memory in Kb to test (eg, 0x200 or 512)
                  ;
                  ;   When called for extended memory:
                  ;
                  ; 	(AH) == starting 64Kb block number (eg, 0x10)
                  ; 	(AL) == 0x9F, which came from byte [0x91]
                  ; 	(BX) == amount of memory in Kb to test (eg, 0x3B80 or 15232)
                  ;
                  xdabb:	push	bx			; 0000DABB  53  'S'
                  	mov	bl,al			; 0000DABC  8AD8  '..'
                  	mov	al,0x6d			; 0000DABE  B06D  '.m'
                  	out	0x84,al			; 0000DAC0  E684  '..'
                  ;
                  ;   This is special: move BL into AL, and then move AL back into BL.
                  ;   We'll give Compaq the benefit of the doubt and assume this is macro nonsense.
                  ;
                  	mov	al,bl			; 0000DAC2  8AC3  '..'
                  	mov	bl,al			; 0000DAC4  8AD8  '..'
                  
                  	mov	al,0x6e			; 0000DAC6  B06E  '.n'
                  	out	0x84,al			; 0000DAC8  E684  '..'
                  
                  	mov	al,bl			; 0000DACA  8AC3  '..'
                  	mov	bx,[0x80]		; 0000DACC  8B1E8000  '....'
                  	cmp	[0x7a],bx		; 0000DAD0  391E7A00  '9.z.'
                  	jna	xdafc			; 0000DAD4  7626  'v&'
                  	or	word [0x64],0x80	; 0000DAD6  810E64008000  '..d...'
                  	mov	bx,[0x7a]		; 0000DADC  8B1E7A00  '..z.'
                  	mov	[0x82],bx		; 0000DAE0  891E8200  '....'
                  	call	xdb33			; 0000DAE4  E84C00  '.L.'
                  	mov	bx,[0x84]		; 0000DAE7  8B1E8400  '....'
                  	cmp	[0x80],bx		; 0000DAEB  391E8000  '9...'
                  	jnc	xdaf5			; 0000DAEF  7304  's.'
                  	mov	bx,[0x80]		; 0000DAF1  8B1E8000  '....'
                  xdaf5:	mov	[0x8a],bx		; 0000DAF5  891E8A00  '....'
                  	jmp	short xdb2b		; 0000DAF9  EB30  '.0'
                  
                  	nop				; 0000DAFB  90  '.'
                  xdafc:	jz	xdb16			; 0000DAFC  7418  't.'
                  	or	word [0x64],0x80	; 0000DAFE  810E64008000  '..d...'
                  	mov	[0x82],bx		; 0000DB04  891E8200  '....'
                  	call	xdb33			; 0000DB08  E82800  '.(.'
                  ;
                  ;   Assuming another 1024Kb of extended RAM has been successfully tested, (BX) will
                  ;   be loaded with 0x400 (1024).
                  ;
                  	mov	bx,[0x84]		; 0000DB0B  8B1E8400  '....'
                  	mov	[0x8a],bx		; 0000DB0F  891E8A00  '....'
                  	jmp	short xdb2b		; 0000DB13  EB16  '..'
                  	nop				; 0000DB15  90  '.'
                  ;
                  ;   This is where we end up testing the remaining 512Kb of the first 640Kb, because
                  ;   the value in word [0x80] (0x200) matched the value in word [0x7a] (0x200).
                  ;
                  xdb16:	push	ax			; 0000DB16  50  'P'
                  	mov	al,0x6f			; 0000DB17  B06F  '.o'
                  	out	0x84,al			; 0000DB19  E684  '..'
                  	pop	ax			; 0000DB1B  58  'X'
                  	mov	[0x82],bx		; 0000DB1C  891E8200  '....'
                  	call	xdb33			; 0000DB20  E81000  '...'
                  	mov	bx,[0x84]		; 0000DB23  8B1E8400  '....'
                  	mov	[0x8a],bx		; 0000DB27  891E8A00  '....'
                  xdb2b:	clc				; 0000DB2B  F8  '.'
                  	or	ax,ax			; 0000DB2C  0BC0  '..'
                  	jz	xdb31			; 0000DB2E  7401  't.'
                  	stc				; 0000DB30  F9  '.'
                  xdb31:	pop	bx			; 0000DB31  5B  '['
                  	ret				; 0000DB32  C3  '.'
                  
                  ;
                  ;   Protected-mode Memory Test
                  ;
                  ;   When called from x8509 (ie, the initial call):
                  ;
                  ;  	word [0x82]:	0x80
                  ;  	byte [0x8f]:	0xff
                  ;  	byte [0x92]:	0x01 (this means display the value in BP immediately)
                  ;  	(BP): 		0x80 (128)
                  ;  	(AH):		0xFE (64Kb block number, copied to byte [0x4c] on entry)
                  ;
                  ;   On the initial call, the first 128Kb has already been tested and initialized (see init_128kb),
                  ;   which is why BP is set to 128 for immediate display of "00128 KB OK".
                  ;
                  ;   We then proceed to test the 128Kb starting at %FE0000 through %FFFFFF (the top of the 16Mb range),
                  ;   which is where this ROM (and potentially other ROMs) will be copied and then mapped to %0E0000
                  ;   through %0FFFFF.  Compaq refers to this as "relocatable RAM".
                  ;
                  ;   On the second call (from xdb16), AH is 0x02 (the first 64Kb block after the first 128Kb), and on
                  ;   successful completion of that call, "00768 KB OK" will be displayed, referring to the first 640Kb
                  ;   of conventional RAM plus the 128Kb of "relocatable RAM" tested earlier.
                  ;
                  ;   On the third call (from xdafc), AH is 0x10 (the first 64Kb block above 1Mb).  Assuming this call
                  ;   successfully tests another 1024Kb, a total of "01792 KB OK" will be displayed.
                  ;
                  ;   There appears to be a fourth call (from xd82e), where AH is 0xF0 (the first 64Kb of the last 1Mb
                  ;   of the first 16Mb); we place no memory there, and Compaq memory maps typically show no memory there,
                  ;   so I'm not sure what that's all about. -JP
                  ;
                  xdb33:	push	bx			; 0000DB33  53  'S'
                  	push	di			; 0000DB34  57  'W'
                  	push	es			; 0000DB35  06  '.'
                  	mov	al,0x70			; 0000DB36  B070  '.p'
                  	out	0x84,al			; 0000DB38  E684  '..'
                  	mov	[0x4c],ah		; 0000DB3A  88264C00  '.&L.'
                  	mov	al,ah			; 0000DB3E  8AC4  '..'
                  	xor	ah,ah			; 0000DB40  32E4  '2.'
                  	mov	di,ax			; 0000DB42  8BF8  '..'
                  	mov	bx,0x0			; 0000DB44  BB0000  '...'
                  
                  	cmp	byte [0x92],0x1		; 0000DB47  803E920001  '.>...'
                  	jnz	xdb58			; 0000DB4C  750A  'u',0x0A
                  ;
                  ;   Display the Kb value in (BP)
                  ;
                  	mov	ax,0x40			; segment 0x40 mapped to %B0000
                  	mov	es,ax			; (ES) -> video buffers
                  	mov	ax,bp			; (AX) == value to display (in Kb)
                  	call	x80a5			; display it
                  
                  xdb58:	cmp	word [0x82],byte +0x0	; 0000DB58  833E820000  '.>...'
                  	jnz	xdb6b			; 0000DB5D  750C  'u.'
                  	mov	ax,0x0			; 0000DB5F  B80000  '...'
                  	mov	word [0x84],0x0		; 0000DB62  C70684000000  '......'
                  	jmp	xdbf1			; 0000DB68  E98600  '...'
                  ;
                  ;   Test another 64Kb of memory
                  ;
                  xdb6b:	mov	al,0x71			; 0000DB6B  B071  '.q'
                  	out	0x84,al			; 0000DB6D  E684  '..'
                  	mov	ax,0x48			; 0000DB6F  B84800  '.H.'
                  	mov	es,ax			; 0000DB72  8EC0  '..'
                  	push	bx			; 0000DB74  53  'S'
                  	push	si			; 0000DB75  56  'V'
                  	push	di			; 0000DB76  57  'W'
                  	push	bp			; 0000DB77  55  'U'
                  	mov	al,[0x8f]		; 0000DB78  A08F00  '...'
                  	cmp	[0x4c],al		; 0000DB7B  38064C00  '8.L.'
                  	ja	xdb86			; 0000DB7F  7705  'w.'
                  ;
                  ;   Test the memory at segment 0x48 (ES), carry clear if success
                  ;
                  	call	xad38			; 0000DB81  E8B4D1  '...'
                  	jmp	short xdb89		; 0000DB84  EB03  '..'
                  
                  xdb86:	call	x8c7e			; 0000DB86  E8F5B0  '...'
                  
                  xdb89:	pop	bp			; 0000DB89  5D  ']'
                  	pop	di			; 0000DB8A  5F  '_'
                  	pop	si			; 0000DB8B  5E  '^'
                  	pop	bx			; 0000DB8C  5B  '['
                  	jnc	xdb99			; 0000DB8D  730A  's',0x0A
                  	mov	ch,[0x4c]		; 0000DB8F  8A2E4C00  '..L.'
                  	mov	ax,0x1			; 0000DB93  B80100  '...'
                  	jmp	short xdbed		; 0000DB96  EB55  '.U'
                  	nop				; 0000DB98  90  '.'
                  
                  xdb99:	add	bx,byte +0x40		; 0000DB99  83C340  '..@'
                  	cld				; 0000DB9C  FC  '.'
                  	push	di			; 0000DB9D  57  'W'
                  	push	cx			; 0000DB9E  51  'Q'
                  	push	bx			; 0000DB9F  53  'S'
                  	mov	bl,[0x4c]		; 0000DBA0  8A1E4C00  '..L.'
                  	mov	cx,0x8			; 0000DBA4  B90800  '...'
                  	xor	di,di			; 0000DBA7  33FF  '3.'
                  xdba9:	xor	ax,ax			; 0000DBA9  33C0  '3.'
                  	rcr	bx,1			; 0000DBAB  D1DB  '..'
                  	sbb	ax,0x0			; 0000DBAD  1D0000  '...'
                  	stosw				; 0000DBB0  AB  '.'
                  	loop	xdba9			; 0000DBB1  E2F6  '..'
                  	mov	bl,[0x4c]		; 0000DBB3  8A1E4C00  '..L.'
                  	mov	ax,0x0			; 0000DBB7  B80000  '...'
                  	test	bl,0x2			; 0000DBBA  F6C302  '...'
                  	jz	xdbc2			; 0000DBBD  7403  't.'
                  	mov	ax,0x101		; 0000DBBF  B80101  '...'
                  xdbc2:	stosw				; 0000DBC2  AB  '.'
                  	pop	bx			; 0000DBC3  5B  '['
                  	pop	cx			; 0000DBC4  59  'Y'
                  	pop	di			; 0000DBC5  5F  '_'
                  	cmp	byte [0x92],0x1		; 0000DBC6  803E920001  '.>...'
                  	jnz	xdbd9			; 0000DBCB  750C  'u.'
                  	mov	ax,0x40			; 0000DBCD  B84000  '.@.'
                  	mov	es,ax			; 0000DBD0  8EC0  '..'
                  	mov	ax,bp			; 0000DBD2  8BC5  '..'
                  	add	ax,bx			; 0000DBD4  03C3  '..'
                  ;
                  ;   Display (AX) as a 5-digit value in the top-left corner of the screen, followed by " KB OK"
                  ;
                  	call	x80a5			; 0000DBD6  E8CCA4
                  ;
                  ;   After displaying "00192 KB OK", BX is 0x40 and [0x82] contains 0x80.
                  ;
                  xdbd9:	cmp	[0x82],bx		; 0000DBD9  391E8200  '9...'
                  	ja	xdbe5			; 0000DBDD  7706  'w.'
                  	mov	ax,0x0			; 0000DBDF  B80000  '...'
                  	jmp	short xdbed		; 0000DBE2  EB09  '..'
                  
                  	nop				; 0000DBE4  90  '.'
                  xdbe5:	add	byte [0x4c],0x1		; 0000DBE5  80064C0001  '..L..'
                  	jmp	xdb6b			; 0000DBEA  E97EFF  '.~.'
                  
                  ;
                  ;   Now we're on to a new phase, after displaying "00256 KB OK"
                  ;
                  xdbed:	mov	[0x84],bx		; 0000DBED  891E8400  '....'
                  xdbf1:	push	ax			; 0000DBF1  50  'P'
                  	mov	al,0x73			; 0000DBF2  B073  '.s'
                  	out	0x84,al			; 0000DBF4  E684  '..'
                  	pop	ax			; 0000DBF6  58  'X'
                  	pop	es			; 0000DBF7  07  '.'
                  	pop	di			; 0000DBF8  5F  '_'
                  	pop	bx			; 0000DBF9  5B  '['
                  	ret				; 0000DBFA  C3  '.'
                  
                  xdbfb:	push	es			; 0000DBFB  06  '.'
                  	push	di			; 0000DBFC  57  'W'
                  	push	bx			; 0000DBFD  53  'S'
                  	push	ax			; 0000DBFE  50  'P'
                  	mov	al,0x72			; 0000DBFF  B072  '.r'
                  	out	0x84,al			; 0000DC01  E684  '..'
                  	pop	ax			; 0000DC03  58  'X'
                  xdc04:	mov	[0x4c],al		; 0000DC04  A24C00  '.L.'
                  	push	ax			; 0000DC07  50  'P'
                  	mov	bx,0x48			; 0000DC08  BB4800  '.H.'
                  	mov	es,bx			; 0000DC0B  8EC3  '..'
                  	mov	cx,0x8			; 0000DC0D  B90800  '...'
                  	mov	bl,al			; 0000DC10  8AD8  '..'
                  	xor	di,di			; 0000DC12  33FF  '3.'
                  xdc14:	xor	ax,ax			; 0000DC14  33C0  '3.'
                  	rcr	bx,1			; 0000DC16  D1DB  '..'
                  	sbb	ax,0x0			; 0000DC18  1D0000  '...'
                  	scasw				; 0000DC1B  AF  '.'
                  	jnz	xdc59			; 0000DC1C  753B  'u;'
                  	loop	xdc14			; 0000DC1E  E2F4  '..'
                  	mov	al,[es:di]		; 0000DC20  268A05  '&..'
                  	in	al,0x61			; 0000DC23  E461  '.a'
                  	test	al,0xc0			; 0000DC25  A8C0  '..'
                  	jz	xdc2f			; 0000DC27  7406  't.'
                  	xor	al,al			; 0000DC29  32C0  '2.'
                  	xor	di,di			; 0000DC2B  33FF  '3.'
                  	jmp	short xdc66		; 0000DC2D  EB37  '.7'
                  
                  xdc2f:	inc	di			; 0000DC2F  47  'G'
                  	mov	ax,[es:di]		; 0000DC30  268B05  '&..'
                  	in	al,0x61			; 0000DC33  E461  '.a'
                  	test	al,0xc0			; 0000DC35  A8C0  '..'
                  	jz	xdc40			; 0000DC37  7407  't.'
                  	xor	al,al			; 0000DC39  32C0  '2.'
                  	mov	di,0x1			; 0000DC3B  BF0100  '...'
                  	jmp	short xdc66		; 0000DC3E  EB26  '.&'
                  
                  xdc40:	cmp	byte [0x92],0x1		; 0000DC40  803E920001  '.>...'
                  	jnz	xdc56			; 0000DC45  750F  'u.'
                  	mov	ax,0x40			; 0000DC47  B84000  '.@.'
                  	mov	es,ax			; 0000DC4A  8EC0  '..'
                  	mov	ax,bp			; 0000DC4C  8BC5  '..'
                  	add	ax,0x40			; 0000DC4E  054000  '.@.'
                  	mov	bp,ax			; 0000DC51  8BE8  '..'
                  	call	x80a5			; 0000DC53  E84FA4  '.O.'
                  xdc56:	pop	ax			; 0000DC56  58  'X'
                  	jmp	short xdc81		; 0000DC57  EB28  '.('
                  
                  xdc59:	dec	di			; 0000DC59  4F  'O'
                  	dec	di			; 0000DC5A  4F  'O'
                  	xor	al,[es:di]		; 0000DC5B  263205  '&2.'
                  	jnz	xdc66			; 0000DC5E  7506  'u.'
                  	inc	di			; 0000DC60  47  'G'
                  	xor	ah,[es:di]		; 0000DC61  263225  '&2%'
                  	mov	al,ah			; 0000DC64  8AC4  '..'
                  xdc66:	mov	byte [es:di],0x0	; 0000DC66  26C60500  '&...'
                  	mov	cl,al			; 0000DC6A  8AC8  '..'
                  	mov	ch,[0x4c]		; 0000DC6C  8A2E4C00  '..L.'
                  	mov	al,0x7c			; 0000DC70  B07C  '.|'
                  	out	0x84,al			; 0000DC72  E684  '..'
                  	pop	ax			; 0000DC74  58  'X'
                  	mov	ax,bp			; 0000DC75  8BC5  '..'
                  	mov	[0x84],ax		; 0000DC77  A38400  '...'
                  	mov	dx,di			; 0000DC7A  8BD7  '..'
                  	mov	ax,0x2			; 0000DC7C  B80200  '...'
                  	jmp	short xdc92		; 0000DC7F  EB11  '..'
                  
                  xdc81:	inc	al			; 0000DC81  FEC0  '..'
                  	cmp	ah,al			; 0000DC83  3AE0  ':.'
                  	jna	xdc8a			; 0000DC85  7603  'v.'
                  xdc87:	jmp	xdc04			; 0000DC87  E97AFF  '.z.'
                  
                  xdc8a:	cmp	ax,0xff			; 0000DC8A  3DFF00  '=..'
                  	jz	xdc87			; 0000DC8D  74F8  't.'
                  	mov	ax,0x0			; 0000DC8F  B80000  '...'
                  xdc92:	pop	bx			; 0000DC92  5B  '['
                  	pop	di			; 0000DC93  5F  '_'
                  	pop	es			; 0000DC94  07  '.'
                  	ret				; 0000DC95  C3  '.'
                  
                  xdc96:	call	xeba5			; 0000DC96  E80C0F  '...'
                  	cli				; 0000DC99  FA  '.'
                  	call	xc242			; 0000DC9A  E8A5E5  '...'
                  	sti				; 0000DC9D  FB  '.'
                  	jnz	xdcae			; 0000DC9E  750E  'u.'
                  	mov	ax,0x9002		; 0000DCA0  B80290  '...'
                  	clc				; 0000DCA3  F8  '.'
                  	int	0x15			; 0000DCA4  CD15  '..'
                  xdca6:	cli				; 0000DCA6  FA  '.'
                  	call	xc242			; 0000DCA7  E898E5  '...'
                  	sti				; 0000DCAA  FB  '.'
                  	nop				; 0000DCAB  90  '.'
                  	jz	xdca6			; 0000DCAC  74F8  't.'
                  xdcae:	cmp	si,[0x82]		; 0000DCAE  3B368200  ';6..'
                  	jnz	xdcb8			; 0000DCB2  7504  'u.'
                  	mov	si,[0x80]		; 0000DCB4  8B368000  '.6..'
                  xdcb8:	mov	[0x1a],si		; 0000DCB8  89361A00  '.6..'
                  	sti				; 0000DCBC  FB  '.'
                  	ret				; 0000DCBD  C3  '.'
                  
                  xdcbe:	call	xeba5			; 0000DCBE  E8E40E  '...'
                  	cli				; 0000DCC1  FA  '.'
                  	call	xc242			; 0000DCC2  E87DE5  '.}.'
                  	sti				; 0000DCC5  FB  '.'
                  	ret				; 0000DCC6  C3  '.'
                  
                  xdcc7:	mov	al,[0x17]		; 0000DCC7  A01700  '...'
                  	ret				; 0000DCCA  C3  '.'
                  
                  xdccb:	cmp	ah,0x0			; 0000DCCB  80FC00  '...'
                  	jz	xdcf3			; 0000DCCE  7423  't#'
                  	cmp	ax,0xe00d		; 0000DCD0  3D0DE0  '=',0x0D,'.'
                  	jnz	xdcda			; 0000DCD3  7505  'u.'
                  	mov	ax,0x1c0d		; 0000DCD5  B80D1C  '.',0x0D,'.'
                  	jmp	short xdcf3		; 0000DCD8  EB19  '..'
                  
                  xdcda:	cmp	ax,0xe02f		; 0000DCDA  3D2FE0  '=/.'
                  	jnz	xdce4			; 0000DCDD  7505  'u.'
                  	mov	ax,0x352f		; 0000DCDF  B82F35  './5'
                  	jmp	short xdcf3		; 0000DCE2  EB0F  '..'
                  
                  xdce4:	cmp	ah,0x84			; 0000DCE4  80FC84  '...'
                  	ja	xdcf8			; 0000DCE7  770F  'w.'
                  	cmp	al,0xf0			; 0000DCE9  3CF0  '<.'
                  	jz	xdcf8			; 0000DCEB  740B  't.'
                  	cmp	al,0xe0			; 0000DCED  3CE0  '<.'
                  	jnz	xdcf3			; 0000DCEF  7502  'u.'
                  	mov	al,0x0			; 0000DCF1  B000  '..'
                  xdcf3:	mov	si,0xffff		; 0000DCF3  BEFFFF  '...'
                  	jmp	short xdcfa		; 0000DCF6  EB02  '..'
                  
                  xdcf8:	xor	si,si			; 0000DCF8  33F6  '3.'
                  xdcfa:	test	si,si			; 0000DCFA  85F6  '..'
                  	ret				; 0000DCFC  C3  '.'
                  
                  xdcfd:	cmp	ah,0x0			; 0000DCFD  80FC00  '...'
                  	jz	xdd08			; 0000DD00  7406  't.'
                  	cmp	al,0xf0			; 0000DD02  3CF0  '<.'
                  	jnz	xdd08			; 0000DD04  7502  'u.'
                  	mov	al,0x0			; 0000DD06  B000  '..'
                  xdd08:	ret				; 0000DD08  C3  '.'
                  
                  xdd09:	push	bx			; 0000DD09  53  'S'
                  	mov	bl,[0x18]		; 0000DD0A  8A1E1800  '....'
                  	mov	al,bl			; 0000DD0E  8AC3  '..'
                  	and	al,0x73			; 0000DD10  2473  '$s'
                  	and	bl,0x4			; 0000DD12  80E304  '...'
                  	shl	bl,0x5			; 0000DD15  C0E305  '...'
                  	or	al,bl			; 0000DD18  0AC3  0x0A,'.'
                  	mov	ah,[0x96]		; 0000DD1A  8A269600  '.&..'
                  	and	ah,0xc			; 0000DD1E  80E40C  '...'
                  	or	ah,al			; 0000DD21  0AE0  0x0A,'.'
                  	mov	al,[0x17]		; 0000DD23  A01700  '...'
                  	pop	bx			; 0000DD26  5B  '['
                  	ret				; 0000DD27  C3  '.'
                  
                  xdd28:	cmp	al,0x5			; 0000DD28  3C05  '<.'
                  	jnz	xdd87			; 0000DD2A  755B  'u['
                  	cmp	bh,0x3			; 0000DD2C  80FF03  '...'
                  	ja	xdd87			; 0000DD2F  7756  'wV'
                  	cmp	bl,0x1f			; 0000DD31  80FB1F  '...'
                  	ja	xdd87			; 0000DD34  7751  'wQ'
                  	push	cx			; 0000DD36  51  'Q'
                  xdd37:	call	xec1e			; 0000DD37  E8E40E  '...'
                  	jnz	xdd37			; 0000DD3A  75FB  'u.'
                  	and	byte [0x97],0xef	; 0000DD3C  80269700EF  '.&...'
                  	call	xec2e_wait_8042_ready	; 0000DD41  E8EA0E  '...'
                  	mov	al,0xf3			; 0000DD44  B0F3  '..'
                  	out	0x60,al			; 0000DD46  E660  '.`'
                  	mov	cx,0xffff		; 0000DD48  B9FFFF  '...'
                  xdd4b:	test	byte [0x97],0x10	; 0000DD4B  F606970010  '.....'
                  	jnz	xdd5d			; 0000DD50  750B  'u.'
                  	loop	xdd4b			; 0000DD52  E2F7  '..'
                  	call	xec2e_wait_8042_ready	; 0000DD54  E8D70E  '...'
                  	mov	al,0xf4			; 0000DD57  B0F4  '..'
                  	out	0x60,al			; 0000DD59  E660  '.`'
                  	jmp	short xdd81		; 0000DD5B  EB24  '.$'
                  
                  xdd5d:	and	byte [0x97],0xef	; 0000DD5D  80269700EF  '.&...'
                  	call	xec2e_wait_8042_ready	; 0000DD62  E8C90E  '...'
                  	mov	al,bh			; 0000DD65  8AC7  '..'
                  	shl	al,0x5			; 0000DD67  C0E005  '...'
                  	or	al,bl			; 0000DD6A  0AC3  0x0A,'.'
                  	out	0x60,al			; 0000DD6C  E660  '.`'
                  	mov	cx,0xffff		; 0000DD6E  B9FFFF  '...'
                  xdd71:	test	byte [0x97],0x10	; 0000DD71  F606970010  '.....'
                  	jnz	xdd81			; 0000DD76  7509  'u.'
                  	loop	xdd71			; 0000DD78  E2F7  '..'
                  	call	xec2e_wait_8042_ready	; 0000DD7A  E8B10E  '...'
                  	mov	al,0xf4			; 0000DD7D  B0F4  '..'
                  	out	0x60,al			; 0000DD7F  E660  '.`'
                  xdd81:	and	byte [0x97],0xbf	; 0000DD81  80269700BF  '.&...'
                  	pop	cx			; 0000DD86  59  'Y'
                  xdd87:	ret				; 0000DD87  C3  '.'
                  
                  xdd88:	cli				; 0000DD88  FA  '.'
                  	mov	si,[0x1c]		; 0000DD89  8B361C00  '.6..'
                  	mov	[si],cx			; 0000DD8D  890C  '..'
                  	inc	si			; 0000DD8F  46  'F'
                  	inc	si			; 0000DD90  46  'F'
                  	cmp	si,[0x82]		; 0000DD91  3B368200  ';6..'
                  	jnz	xdd9b			; 0000DD95  7504  'u.'
                  	mov	si,[0x80]		; 0000DD97  8B368000  '.6..'
                  xdd9b:	cmp	si,[0x1a]		; 0000DD9B  3B361A00  ';6..'
                  	jz	xddaa			; 0000DD9F  7409  't.'
                  	mov	[0x1c],si		; 0000DDA1  89361C00  '.6..'
                  	xor	al,al			; 0000DDA5  32C0  '2.'
                  	clc				; 0000DDA7  F8  '.'
                  	jmp	short xddad		; 0000DDA8  EB03  '..'
                  
                  xddaa:	mov	al,0x1			; 0000DDAA  B001  '..'
                  	stc				; 0000DDAC  F9  '.'
                  xddad:	sti				; 0000DDAD  FB  '.'
                  	ret				; 0000DDAE  C3  '.'
                  
                  xddaf:	push	ax			; 0000DDAF  50  'P'
                  	cmp	al,0x8			; 0000DDB0  3C08  '<.'
                  	jz	xde13			; 0000DDB2  745F  't_'
                  	cmp	al,0x9			; 0000DDB4  3C09  '<.'
                  	jz	xde1f			; 0000DDB6  7467  'tg'
                  	test	al,al			; 0000DDB8  84C0  '..'
                  	jnz	xddd2			; 0000DDBA  7516  'u.'
                  	in	al,0x86			; 0000DDBC  E486  '..'
                  	and	al,0xbf			; 0000DDBE  24BF  '$.'
                  	or	al,0x80			; 0000DDC0  0C80  '..'
                  	and	al,0xc0			; 0000DDC2  24C0  '$.'
                  	or	al,[cs:0x67de]		; 0000DDC4  2E0A06DE67  '.',0x0A,'..g'
                  	out	0x86,al			; 0000DDC9  E686  '..'
                  	mov	ah,[cs:0x67de]		; 0000DDCB  2E8A26DE67  '..&.g'
                  	jmp	short xde40		; 0000DDD0  EB6E  '.n'
                  
                  xddd2:	dec	al			; 0000DDD2  FEC8  '..'
                  	jnz	xddec			; 0000DDD4  7516  'u.'
                  	in	al,0x86			; 0000DDD6  E486  '..'
                  	and	al,0xbf			; 0000DDD8  24BF  '$.'
                  	or	al,0x80			; 0000DDDA  0C80  '..'
                  	and	al,0xc0			; 0000DDDC  24C0  '$.'
                  	or	al,[cs:0x67dd]		; 0000DDDE  2E0A06DD67  '.',0x0A,'..g'
                  	out	0x86,al			; 0000DDE3  E686  '..'
                  	mov	ah,[cs:0x67dd]		; 0000DDE5  2E8A26DD67  '..&.g'
                  	jmp	short xde40		; 0000DDEA  EB54  '.T'
                  
                  xddec:	dec	al			; 0000DDEC  FEC8  '..'
                  	jnz	xddfc			; 0000DDEE  750C  'u.'
                  	in	al,0x86			; 0000DDF0  E486  '..'
                  	and	al,0x7f			; 0000DDF2  247F  '$.'
                  	or	al,0x40			; 0000DDF4  0C40  '.@'
                  	out	0x86,al			; 0000DDF6  E686  '..'
                  	mov	ah,0x0			; 0000DDF8  B400  '..'
                  	jmp	short xde40		; 0000DDFA  EB44  '.D'
                  
                  xddfc:	dec	al			; 0000DDFC  FEC8  '..'
                  	jnz	xde4f			; 0000DDFE  754F  'uO'
                  	in	al,0x86			; 0000DE00  E486  '..'
                  	mov	ah,0x0			; 0000DE02  B400  '..'
                  	test	al,0x40			; 0000DE04  A840  '.@'
                  	jz	xde0d			; 0000DE06  7405  't.'
                  	mov	ah,al			; 0000DE08  8AE0  '..'
                  	and	ah,0x3f			; 0000DE0A  80E43F  '..?'
                  xde0d:	xor	al,0x40			; 0000DE0D  3440  '4@'
                  	out	0x86,al			; 0000DE0F  E686  '..'
                  	jmp	short xde40		; 0000DE11  EB2D  '.-'
                  
                  xde13:	in	al,0x86			; 0000DE13  E486  '..'
                  	and	al,0x7f			; 0000DE15  247F  '$.'
                  	or	al,0xc0			; 0000DE17  0CC0  '..'
                  	out	0x86,al			; 0000DE19  E686  '..'
                  	mov	ah,0x0			; 0000DE1B  B400  '..'
                  	jmp	short xde40		; 0000DE1D  EB21  '.!'
                  
                  xde1f:	cmp	cx,byte +0x1		; 0000DE1F  83F901  '...'
                  	jc	xde4f			; 0000DE22  722B  'r+'
                  	cmp	cx,byte +0x32		; 0000DE24  83F932  '..2'
                  	ja	xde4f			; 0000DE27  7726  'w&'
                  	mov	ax,0x32			; 0000DE29  B83200  '.2.'
                  	sub	ax,cx			; 0000DE2C  2BC1  '+.'
                  	inc	ax			; 0000DE2E  40  '@'
                  	inc	ax			; 0000DE2F  40  '@'
                  	mov	ah,al			; 0000DE30  8AE0  '..'
                  	in	al,0x86			; 0000DE32  E486  '..'
                  	and	al,0xbf			; 0000DE34  24BF  '$.'
                  	or	al,0x80			; 0000DE36  0C80  '..'
                  	and	al,0xc0			; 0000DE38  24C0  '$.'
                  	or	al,ah			; 0000DE3A  0AC4  0x0A,'.'
                  	out	0x86,al			; 0000DE3C  E686  '..'
                  	jmp	short xde40		; 0000DE3E  EB00  '..'
                  
                  xde40:	mov	al,0x92			; 0000DE40  B092  '..'
                  	cli				; 0000DE42  FA  '.'
                  	out	0x4b,al			; 0000DE43  E64B  '.K'
                  	cmp	ah,0x0			; 0000DE45  80FC00  '...'
                  	jz	xde4e			; 0000DE48  7404  't.'
                  	mov	al,ah			; 0000DE4A  8AC4  '..'
                  	out	0x4a,al			; 0000DE4C  E64A  '.J'
                  xde4e:	sti				; 0000DE4E  FB  '.'
                  xde4f:	pop	ax			; 0000DE4F  58  'X'
                  	ret				; 0000DE50  C3  '.'
                  
                  xde51:	in	al,0x86			; 0000DE51  E486  '..'
                  	test	al,0x40			; 0000DE53  A840  '.@'
                  	jnz	xde5f			; 0000DE55  7508  'u.'
                  	test	al,0x80			; 0000DE57  A880  '..'
                  	jnz	xde5f			; 0000DE59  7504  'u.'
                  	mov	ah,0x8			; 0000DE5B  B408  '..'
                  	jmp	short xde8c		; 0000DE5D  EB2D  '.-'
                  
                  xde5f:	test	al,0x40			; 0000DE5F  A840  '.@'
                  	jnz	xde84			; 0000DE61  7521  'u!'
                  	mov	ah,0x0			; 0000DE63  B400  '..'
                  	and	al,0x3f			; 0000DE65  243F  '$?'
                  	cmp	al,[cs:0x67de]		; 0000DE67  2E3A06DE67  '.:..g'
                  	jz	xde8c			; 0000DE6C  741E  't.'
                  	mov	ah,0x1			; 0000DE6E  B401  '..'
                  	cmp	al,[cs:0x67dd]		; 0000DE70  2E3A06DD67  '.:..g'
                  	jz	xde8c			; 0000DE75  7415  't.'
                  	xor	ah,ah			; 0000DE77  32E4  '2.'
                  	mov	cx,0x32			; 0000DE79  B93200  '.2.'
                  	sub	cx,ax			; 0000DE7C  2BC8  '+.'
                  	inc	cx			; 0000DE7E  41  'A'
                  	inc	cx			; 0000DE7F  41  'A'
                  	mov	ah,0x9			; 0000DE80  B409  '..'
                  	jmp	short xde8c		; 0000DE82  EB08  '..'
                  
                  xde84:	mov	ah,0x8			; 0000DE84  B408  '..'
                  	test	al,0x80			; 0000DE86  A880  '..'
                  	jnz	xde8c			; 0000DE88  7502  'u.'
                  	mov	ah,0x2			; 0000DE8A  B402  '..'
                  xde8c:	mov	al,ah			; 0000DE8C  8AC4  '..'
                  	xor	ah,ah			; 0000DE8E  32E4  '2.'
                  	ret				; 0000DE90  C3  '.'
                  
                  xde91:	call	xf337			; 0000DE91  E8A314  '...'
                  	mov	ah,0xff			; 0000DE94  B4FF  '..'
                  	jz	xdea0			; 0000DE96  7408  't.'
                  	mov	ah,0x0			; 0000DE98  B400  '..'
                  	test	al,0x20			; 0000DE9A  A820  '. '
                  	jz	xdea0			; 0000DE9C  7402  't.'
                  	mov	ah,0x1			; 0000DE9E  B401  '..'
                  xdea0:	mov	al,ah			; 0000DEA0  8AC4  '..'
                  	xor	ah,ah			; 0000DEA2  32E4  '2.'
                  	ret				; 0000DEA4  C3  '.'
                  
                  xdea5:	sti				; 0000DEA5  FB  '.'
                  	pusha				; 0000DEA6  60  '`'
                  	cmp	al,0x2			; 0000DEA7  3C02  '<.'
                  	jna	xdeae			; 0000DEA9  7603  'v.'
                  	jmp	xdfb8			; 0000DEAB  E90A01  '.',0x0A,'.'
                  
                  xdeae:	sub	sp,byte +0x38		; 0000DEAE  83EC38  '..8'
                  	mov	bp,sp			; 0000DEB1  8BEC  '..'
                  	mov	ax,ss			; 0000DEB3  8CD0  '..'
                  	mov	es,ax			; 0000DEB5  8EC0  '..'
                  	mov	ds,ax			; 0000DEB7  8ED8  '..'
                  	mov	di,bp			; 0000DEB9  8BFD  '..'
                  	xor	ax,ax			; 0000DEBB  33C0  '3.'
                  	mov	cx,0x38			; 0000DEBD  B93800  '.8.'
                  	rep	stosb			; 0000DEC0  F3AA  '..'
                  	mov	si,bp			; 0000DEC2  8BF5  '..'
                  	lea	di,[si+0x10]		; 0000DEC4  8D7C10  '.|.'
                  	mov	word [es:di],0xffff	; 0000DEC7  26C705FFFF  '&....'
                  	mov	byte [es:di+0x7],0x80	; 0000DECC  26C6450780  '&.E..'
                  	mov	byte [es:di+0x6],0x0	; 0000DED1  26C6450600  '&.E..'
                  	mov	byte [es:di+0x5],0x92	; 0000DED6  26C6450592  '&.E..'
                  	mov	word [es:di+0x2],0x0	; 0000DEDB  26C745020000  '&.E...'
                  	mov	byte [es:di+0x4],0xc0	; 0000DEE1  26C64504C0  '&.E..'
                  	lea	di,[si+0x18]		; 0000DEE6  8D7C18  '.|.'
                  	mov	word [es:di],0xffff	; 0000DEE9  26C705FFFF  '&....'
                  	mov	byte [es:di+0x7],0x0	; 0000DEEE  26C6450700  '&.E..'
                  	mov	byte [es:di+0x6],0x0	; 0000DEF3  26C6450600  '&.E..'
                  	mov	byte [es:di+0x5],0x92	; 0000DEF8  26C6450592  '&.E..'
                  	mov	ax,ss			; 0000DEFD  8CD0  '..'
                  	mov	bx,0x10			; 0000DEFF  BB1000  '...'
                  	mul	bx			; 0000DF02  F7E3  '..'
                  	add	ax,bp			; 0000DF04  03C5  '..'
                  	adc	dl,0x0			; 0000DF06  80D200  '...'
                  	add	ax,0x38			; 0000DF09  053800  '.8.'
                  	adc	dl,0x0			; 0000DF0C  80D200  '...'
                  	mov	[es:di+0x2],ax		; 0000DF0F  26894502  '&.E.'
                  	mov	[es:di+0x4],dl		; 0000DF13  26885504  '&.U.'
                  	xor	bx,bx			; 0000DF17  33DB  '3.'
                  	call	xdfee			; 0000DF19  E8D200  '...'
                  	jnc	xdf21			; 0000DF1C  7303  's.'
                  	jmp	xdfb5			; 0000DF1E  E99400  '...'
                  
                  xdf21:	lea	di,[si+0x38]		; 0000DF21  8D7C38  '.|8'
                  	mov	al,[es:di]		; 0000DF24  268A05  '&..'
                  	and	al,0xc0			; 0000DF27  24C0  '$.'
                  	cmp	al,0x40			; 0000DF29  3C40  '<@'
                  	jz	xdf34			; 0000DF2B  7407  't.'
                  	mov	byte [bp+0x46],0x0	; 0000DF2D  C6464600  '.FF.'
                  	jmp	xdfb5			; 0000DF31  E98100  '...'
                  
                  xdf34:	mov	bx,0x2			; 0000DF34  BB0200  '...'
                  	call	xdfee			; 0000DF37  E8B400  '...'
                  	jc	xdfb5			; 0000DF3A  7279  'ry'
                  	mov	al,[bp+0x46]		; 0000DF3C  8A4646  '.FF'
                  	or	al,al			; 0000DF3F  0AC0  0x0A,'.'
                  	jz	xdfa0			; 0000DF41  745D  't]'
                  	lea	di,[si+0x10]		; 0000DF43  8D7C10  '.|.'
                  	mov	bx,si			; 0000DF46  8BDE  '..'
                  	lea	si,[si+0x18]		; 0000DF48  8D7418  '.t.'
                  	call	xdfbc			; 0000DF4B  E86E00  '.n.'
                  	mov	si,bx			; 0000DF4E  8BF3  '..'
                  	mov	di,bim_table_offset	; 0000DF50  BFE0FF  '...'
                  	mov	di,[cs:di]		; 0000DF53  2E8B3D  '..='
                  	test	word [cs:di],0xf00	; 0000DF56  2EF705000F  '.....'
                  	lea	di,[si+0x38]		; 0000DF5B  8D7C38  '.|8'
                  	push	word [es:di]		; 0000DF5E  26FF35  '&.5'
                  	jz	xdf69			; 0000DF61  7406  't.'
                  	mov	byte [es:di],0xff	; 0000DF63  26C605FF  '&...'
                  	jmp	short xdf6d		; 0000DF67  EB04  '..'
                  
                  xdf69:	mov	byte [es:di],0xfc	; 0000DF69  26C605FC  '&...'
                  xdf6d:	xor	bx,bx			; 0000DF6D  33DB  '3.'
                  	call	xdfdf			; 0000DF6F  E86D00  '.m.'
                  	lea	di,[si+0x38]		; 0000DF72  8D7C38  '.|8'
                  	pop	word [es:di]		; 0000DF75  268F05  '&..'
                  	dec	al			; 0000DF78  FEC8  '..'
                  	jz	xdf8e			; 0000DF7A  7412  't.'
                  	and	byte [es:di],0xbf	; 0000DF7C  268025BF  '&.%.'
                  	mov	bx,0x2			; 0000DF80  BB0200  '...'
                  	call	xdfdf			; 0000DF83  E85900  '.Y.'
                  	jc	xdfb5			; 0000DF86  722D  'r-'
                  	mov	byte [bp+0x46],0x2	; 0000DF88  C6464602  '.FF.'
                  	jmp	short xdfb5		; 0000DF8C  EB27  '.',0x27
                  
                  xdf8e:	or	byte [es:di],0x40	; 0000DF8E  26800D40  '&.',0x0D,'@'
                  	mov	bx,0x2			; 0000DF92  BB0200  '...'
                  	call	xdfdf			; 0000DF95  E84700  '.G.'
                  	jc	xdfb5			; 0000DF98  721B  'r.'
                  	mov	byte [bp+0x46],0x1	; 0000DF9A  C6464601  '.FF.'
                  	jmp	short xdfb5		; 0000DF9E  EB15  '..'
                  
                  xdfa0:	lea	di,[si+0x38]		; 0000DFA0  8D7C38  '.|8'
                  	mov	bl,[es:di]		; 0000DFA3  268A1D  '&..'
                  	and	bl,0x40			; 0000DFA6  80E340  '..@'
                  	jz	xdfb1			; 0000DFA9  7406  't.'
                  	mov	byte [bp+0x46],0x1	; 0000DFAB  C6464601  '.FF.'
                  	jmp	short xdfb5		; 0000DFAF  EB04  '..'
                  
                  xdfb1:	mov	byte [bp+0x46],0x2	; 0000DFB1  C6464602  '.FF.'
                  xdfb5:	add	sp,byte +0x38		; 0000DFB5  83C438  '..8'
                  xdfb8:	popa				; 0000DFB8  61  'a'
                  	mov	ah,0xe2			; 0000DFB9  B4E2  '..'
                  	ret				; 0000DFBB  C3  '.'
                  
                  xdfbc:	cld				; 0000DFBC  FC  '.'
                  	push	word [di]		; 0000DFBD  FF35  '.5'
                  	push	word [di+0x2]		; 0000DFBF  FF7502  '.u.'
                  	push	word [di+0x4]		; 0000DFC2  FF7504  '.u.'
                  	push	word [di+0x6]		; 0000DFC5  FF7506  '.u.'
                  	mov	cx,0x4			; 0000DFC8  B90400  '...'
                  	rep	movsw			; 0000DFCB  F3A5  '..'
                  	sub	si,byte +0x8		; 0000DFCD  83EE08  '...'
                  	sub	di,byte +0x8		; 0000DFD0  83EF08  '...'
                  	pop	word [si+0x6]		; 0000DFD3  8F4406  '.D.'
                  	pop	word [si+0x4]		; 0000DFD6  8F4404  '.D.'
                  	pop	word [si+0x2]		; 0000DFD9  8F4402  '.D.'
                  	pop	word [si]		; 0000DFDC  8F04  '..'
                  	ret				; 0000DFDE  C3  '.'
                  
                  xdfdf:	lea	di,[si+0x18]		; 0000DFDF  8D7C18  '.|.'
                  	mov	[es:di+0x2],bx		; 0000DFE2  26895D02  '&.].'
                  	mov	cx,0x1			; 0000DFE6  B90100  '...'
                  	mov	ah,0x87			; 0000DFE9  B487  '..'
                  	int	0x15			; 0000DFEB  CD15  '..'
                  	ret				; 0000DFED  C3  '.'
                  
                  xdfee:	lea	di,[si+0x10]		; 0000DFEE  8D7C10  '.|.'
                  	mov	[es:di+0x2],bx		; 0000DFF1  26895D02  '&.].'
                  	mov	cx,0x1			; 0000DFF5  B90100  '...'
                  	mov	ah,0x87			; 0000DFF8  B487  '..'
                  	int	0x15			; 0000DFFA  CD15  '..'
                  	ret				; 0000DFFC  C3  '.'
                  
                  	db	0xFF			; 0000DFFD  FF  '.'
                  	db	0xFF			; 0000DFFE  FF  '.'
                  	db	0xFF			; 0000DFFF  FF  '.'
                  	jmp	short xe05e		; 0000E000  EB5C  '.\'
                  
                  	db	'AUTHORS CAB93GLB93RWS93DJC93NPB(C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86,'
                  
                  xe05b:	jmp	xbaa7			; 0000E05B  E949DA
                  
                  xe05e:	jmp	0xf000:0x8e31		; 0000E05E  EA318E00F0  '.1...'
                  
                  	db	'((CC))CCooppyyrriigghhtt  CCOOMMPPAAQQ  CCoommppuutteerr  CCoorrppoorraattiioonn  11998822,,8833,,8844,,8855,,8866,,8877--AAllll  rriigghhttss  rreesseerrvveedd..'
                  
                  xe105:	mov	al,0xd			; 0000E105  B00D  '.',0x0D  0x0D
                  	out	0x84,al			; 0000E107  E684  '..'
                  	mov	al,0x12			; 0000E109  B012  '..'
                  	out	0x4b,al			; 0000E10B  E64B  '.K'
                  	mov	al,0x22			; 0000E10D  B022  '."'
                  	mov	dx,0x48			; 0000E10F  BA4800  '.H.'
                  	out	dx,al			; 0000E112  EE  '.'
                  	mov	bl,0x0			; 0000E113  B300  '..'
                  	call	xe134			; 0000E115  E81C00  '...'
                  	mov	al,0x12			; 0000E118  B012  '..'
                  	out	0x4b,al			; 0000E11A  E64B  '.K'
                  	mov	al,0xe			; 0000E11C  B00E  '..'
                  	out	0x84,al			; 0000E11E  E684  '..'
                  	mov	al,0x92			; 0000E120  B092  '..'
                  	out	0x4b,al			; 0000E122  E64B  '.K'
                  	mov	al,0x22			; 0000E124  B022  '."'
                  	mov	dx,0x4a			; 0000E126  BA4A00  '.J.'
                  	out	dx,al			; 0000E129  EE  '.'
                  	mov	bl,0x80			; 0000E12A  B380  '..'
                  	call	xe134			; 0000E12C  E80500  '...'
                  	mov	al,0x92			; 0000E12F  B092  '..'
                  	out	0x4b,al			; 0000E131  E64B  '.K'
                  	ret				; 0000E133  C3  '.'
                  
                  xe134:	mov	cx,0x100		; 0000E134  B90001  '...'
                  xe137:	mov	al,bl			; 0000E137  8AC3  '..'
                  	out	0x4b,al			; 0000E139  E64B  '.K'
                  	in	al,dx			; 0000E13B  EC  '.'
                  	mov	ah,al			; 0000E13C  8AE0  '..'
                  	in	al,dx			; 0000E13E  EC  '.'
                  	cmp	ax,0x22			; 0000E13F  3D2200  '=".'
                  	jnz	xe15c			; 0000E142  7518  'u.'
                  	loop	xe137			; 0000E144  E2F1  '..'
                  	mov	al,0x92			; 0000E146  B092  '..'
                  	out	0x4b,al			; 0000E148  E64B  '.K'
                  	mov	al,0x12			; 0000E14A  B012  '..'
                  	out	0x4b,al			; 0000E14C  E64B  '.K'
                  
                  	mov	bx,err102		; 0000E14E  BB8CB6  '...'
                  	mov	cx,err102_len-2		; 0000E151  B91800  '...'
                  	mov	bp,0xe15a		; 0000E154  BD5AE1  '.Z.'
                  	jmp	xc7f7			; 0000E157  E99DE6  '...'
                  xe15a:	jmp	short xe15a		; 0000E15A  Hang the machine
                  
                  xe15c:	ret				; 0000E15C  C3  '.'
                  
                  	times	13 db 0xFF		; 0000E15D - 0000E169
                  
                  	call	near [bx+si-0x1c]	; 0000E16A  FF50E4  '.P.'
                  	popa				; 0000E16D  61  'a'
                  	test	al,0x40			; 0000E16E  A840  '.@'
                  	jnz	xe174			; 0000E170  7502  'u.'
                  	pop	ax			; 0000E172  58  'X'
                  	iret				; 0000E173  CF  '.'
                  
                  xe174:	mov	al,0x1			; 0000E174  B001  '..'
                  	out	0x85,al			; 0000E176  E685  '..'
                  	mov	al,0x11			; 0000E178  B011  '..'
                  	out	0x84,al			; 0000E17A  E684  '..'
                  	cld				; 0000E17C  FC  '.'
                  	mov	al,0x80			; 0000E17D  B080  '..'
                  	out	0x70,al			; 0000E17F  E670  '.p'
                  	mov	al,0xff			; 0000E181  B0FF  '..'
                  	out	0x21,al			; 0000E183  E621  '.!'
                  	out	0xa1,al			; 0000E185  E6A1  '..'
                  	call	xe28e			; 0000E187  E80401  '...'
                  	in	al,0x61			; 0000E18A  E461  '.a'
                  	xor	ah,ah			; 0000E18C  32E4  '2.'
                  	mov	sp,ax			; 0000E18E  8BE0  '..'
                  	mov	bp,0xe196		; 0000E190  BD96E1  '...'
                  	jmp	short xe1e6		; 0000E193  EB51  '.Q'
                  
                  	nop				; 0000E195  90  '.'
                  	mov	di,si			; 0000E196  8BFE  '..'
                  	mov	cx,sp			; 0000E198  8BCC  '..'
                  	jc	xe19e			; 0000E19A  7202  'r.'
                  	inc	ch			; 0000E19C  FEC5  '..'
                  xe19e:	mov	ax,cs			; 0000E19E  8CC8  '..'
                  	mov	ds,ax			; 0000E1A0  8ED8  '..'
                  	mov	es,ax			; 0000E1A2  8EC0  '..'
                  	mov	ax,0x30			; 0000E1A4  B83000  '.0.'
                  	mov	ss,ax			; 0000E1A7  8ED0  '..'
                  	mov	sp,0x100		; 0000E1A9  BC0001  '...'
                  	mov	si,0xb743		; 0000E1AC  BE43B7  '.C.'
                  	call	xe282			; 0000E1AF  E8D000  '...'
                  	test	ch,ch			; 0000E1B2  84ED  '..'
                  	jz	xe1be			; 0000E1B4  7408  't.'
                  	mov	si,0xb753		; 0000E1B6  BE53B7  '.S.'
                  	call	xe282			; 0000E1B9  E8C600  '...'
                  	jmp	short xe1e5		; 0000E1BC  EB27  '.',0x27
                  
                  xe1be:	xchg	di,dx			; 0000E1BE  87FA  '..'
                  	mov	cx,0x4			; 0000E1C0  B90400  '...'
                  	shr	dx,cl			; 0000E1C3  D3EA  '..'
                  	mov	cx,0x2			; 0000E1C5  B90200  '...'
                  	call	xe26d			; 0000E1C8  E8A200  '...'
                  	mov	dx,di			; 0000E1CB  8BD7  '..'
                  	and	dx,0x3			; 0000E1CD  81E20300  '....'
                  	mov	cx,0x4			; 0000E1D1  B90400  '...'
                  	call	xe26d			; 0000E1D4  E89600  '...'
                  	mov	al,0x20			; 0000E1D7  B020  '. '
                  	mov	ah,0xe			; 0000E1D9  B40E  '..'
                  	int	0x10			; 0000E1DB  CD10  '..'
                  	xor	dx,dx			; 0000E1DD  33D2  '3.'
                  	mov	cx,0x2			; 0000E1DF  B90200  '...'
                  	call	xe26d			; 0000E1E2  E88800  '...'
                  xe1e5:	hlt				; 0000E1E5  F4  '.'
                  xe1e6:	mov	si,bp			; 0000E1E6  8BF5  '..'
                  	mov	bl,0xff			; 0000E1E8  B3FF  '..'
                  	xor	di,di			; 0000E1EA  33FF  '3.'
                  	mov	bp,0xe1f2		; 0000E1EC  BDF2E1  '...'
                  	jmp	x8796			; 0000E1EF  E9A4A5
                  
                  	mov	bp,si			; 0000E1F2  8BEE  '..'
                  	xor	ax,ax			; 0000E1F4  33C0  '3.'
                  	mov	ds,ax			; 0000E1F6  8ED8  '..'
                  	xor	bx,bx			; 0000E1F8  33DB  '3.'
                  	mov	ax,[bx]			; 0000E1FA  8B07  '..'
                  	mov	[bx],ax			; 0000E1FC  8907  '..'
                  	in	al,0x61			; 0000E1FE  E461  '.a'
                  	or	al,0x8			; 0000E200  0C08  '..'
                  	out	0x61,al			; 0000E202  E661  '.a'
                  	mov	si,bp			; 0000E204  8BF5  '..'
                  	mov	bl,0xff			; 0000E206  B3FF  '..'
                  	xor	di,di			; 0000E208  33FF  '3.'
                  	mov	bp,0xe210		; 0000E20A  BD10E2  '...'
                  	jmp	x8796			; 0000E20D  E986A5
                  
                  	mov	bp,si			; 0000E210  8BEE  '..'
                  	in	al,0x61			; 0000E212  E461  '.a'
                  	and	al,0xf7			; 0000E214  24F7  '$.'
                  	out	0x61,al			; 0000E216  E661  '.a'
                  	in	al,0x61			; 0000E218  E461  '.a'
                  	test	al,0x40			; 0000E21A  A840  '.@'
                  	jz	xe221			; 0000E21C  7403  't.'
                  	clc				; 0000E21E  F8  '.'
                  	jmp	bp			; 0000E21F  FFE5  '..'
                  
                  xe221:	mov	ax,0x40			; 0000E221  B84000  '.@.'
                  	mov	ds,ax			; 0000E224  8ED8  '..'
                  	mov	di,[0x413]		; 0000E226  8B3E1304  '.>..'
                  	shl	di,0x6			; 0000E22A  C1E706  '...'
                  	mov	bx,0x0			; 0000E22D  BB0000  '...'
                  xe230:	mov	cx,0x4000		; 0000E230  B90040  '..@'
                  	mov	ds,bx			; 0000E233  8EDB  '..'
                  	rep	lodsd			; 0000E235  66F3AD  'f..'
                  	in	al,0x61			; 0000E238  E461  '.a'
                  	test	al,0x40			; 0000E23A  A840  '.@'
                  	jnz	xe24a			; 0000E23C  750C  'u.'
                  	add	bx,0x1000		; 0000E23E  81C30010  '....'
                  	cmp	bx,di			; 0000E242  3BDF  ';.'
                  	jna	xe230			; 0000E244  76EA  'v.'
                  	xor	ax,ax			; 0000E246  33C0  '3.'
                  	jmp	bp			; 0000E248  FFE5  '..'
                  
                  xe24a:	mov	si,bx			; 0000E24A  8BF3  '..'
                  	mov	dx,bp			; 0000E24C  8BD5  '..'
                  	xor	di,di			; 0000E24E  33FF  '3.'
                  	mov	bp,0xe256		; 0000E250  BD56E2  '.V.'
                  	jmp	x87e4			; 0000E253  E98EA5  '...'
                  
                  	mov	bp,dx			; 0000E256  8BEA  '..'
                  	and	bl,0xf			; 0000E258  80E30F  '...'
                  	xor	dx,dx			; 0000E25B  33D2  '3.'
                  	mov	cl,0x4			; 0000E25D  B104  '..'
                  xe25f:	rcr	bl,1			; 0000E25F  D0DB  '..'
                  	jnc	xe268			; 0000E261  7305  's.'
                  	inc	dx			; 0000E263  42  'B'
                  	loop	xe25f			; 0000E264  E2F9  '..'
                  	xor	dx,dx			; 0000E266  33D2  '3.'
                  xe268:	stc				; 0000E268  F9  '.'
                  	jmp	bp			; 0000E269  FFE5  '..'
                  
                  	adc	[bx+si],al		; 0000E26B  1000  '..'
                  
                  xe26d:	xchg	ax,dx			; 0000E26D  92  '.'
                  	mul	word [0xe26b]		; 0000E26E  F7266BE2  '.&k.'
                  	xchg	ax,dx			; 0000E272  92  '.'
                  	add	al,0x30			; 0000E273  0430  '.0'
                  	cmp	al,0x39			; 0000E275  3C39  '<9'
                  	jna	xe27b			; 0000E277  7602  'v.'
                  	add	al,0x7			; 0000E279  0407  '..'
                  xe27b:	mov	ah,0xe			; 0000E27B  B40E  '..'
                  	int	0x10			; 0000E27D  CD10  '..'
                  	loop	xe26d			; 0000E27F  E2EC  '..'
                  	ret				; 0000E281  C3  '.'
                  
                  xe282:	lodsb				; 0000E282  AC  '.'
                  	or	al,al			; 0000E283  0AC0  0x0A,'.'
                  	jz	xe28d			; 0000E285  7406  't.'
                  	mov	ah,0xe			; 0000E287  B40E  '..'
                  	int	0x10			; 0000E289  CD10  '..'
                  	jmp	short xe282		; 0000E28B  EBF5  '..'
                  
                  xe28d:	ret				; 0000E28D  C3  '.'
                  
                  xe28e:	call	xf2c0			; 0000E28E  E82F10  './.'
                  	jnz	xe2ba			; 0000E291  7527  'u',0x27
                  	push	cs			; 0000E293  0E  '.'
                  	pop	ds			; 0000E294  1F  '.'
                  	xor	ax,ax			; 0000E295  33C0  '3.'
                  	mov	es,ax			; 0000E297  8EC0  '..'
                  	mov	di,0x40			; 0000E299  BF4000  '.@.'
                  	mov	ax,[0x7124]		; 0000E29C  A12471  '.$q'
                  	stosw				; 0000E29F  AB  '.'
                  	mov	ax,[0x7126]		; 0000E2A0  A12671  '.&q'
                  	stosw				; 0000E2A3  AB  '.'
                  	mov	di,0x7c			; 0000E2A4  BF7C00  '.|.'
                  	mov	ax,[0x7128]		; 0000E2A7  A12871  '.(q'
                  	stosw				; 0000E2AA  AB  '.'
                  	mov	ax,[0x712a]		; 0000E2AB  A12A71  '.*q'
                  	stosw				; 0000E2AE  AB  '.'
                  	mov	di,0x10c		; 0000E2AF  BF0C01  '...'
                  	mov	ax,[0x712c]		; 0000E2B2  A12C71  '.,q'
                  	stosw				; 0000E2B5  AB  '.'
                  	mov	ax,[0x712e]		; 0000E2B6  A12E71  '..q'
                  	stosw				; 0000E2B9  AB  '.'
                  xe2ba:	mov	bx,0x7			; 0000E2BA  BB0700  '...'
                  	mov	ax,0x3			; 0000E2BD  B80300  '...'
                  	int	0x10			; 0000E2C0  CD10  '..'
                  	ret				; 0000E2C2  C3  '.'
                  
                  	jmp	0xf000:0xe16b		; 0000E2C3  EA6BE100F0  '.k...'
                  
                  xe2c8:	mov	al,0xe			; 0000E2C8  B00E  '..'
                  	call	xb544			; 0000E2CA  E877D2  '.w.'
                  	mov	ah,al			; 0000E2CD  8AE0  '..'
                  	mov	al,0x14			; 0000E2CF  B014  '..'
                  	call	xb544			; 0000E2D1  E870D2  '.p.'
                  	test	al,0x1			; 0000E2D4  A801  '..'
                  	jnz	xe2db			; 0000E2D6  7503  'u.'
                  	or	ah,0x20			; 0000E2D8  80CC20  '.. '
                  xe2db:	mov	al,ah			; 0000E2DB  8AC4  '..'
                  	test	al,0xc0			; 0000E2DD  A8C0  '..'
                  	jz	xe2f4			; 0000E2DF  7413
                  	mov	dx,0x2000		; 0000E2E1  BA0020  '.. '
                  	mov	bx,0xb8a0		; 0000E2E4  BBA0B8  '...'
                  	mov	cx,0x56			; 0000E2E7  B95600  '.V.'
                  	call	xc745			; 0000E2EA  E858E4  '.X.'
                  	or	byte [0x12],0xff	; 0000E2ED  800E1200FF  '.....'
                  	jmp	short xe336		; 0000E2F2  EB42  '.B'
                  
                  xe2f4:	test	al,0x20			; 0000E2F4  A820  '. '
                  	jz	xe309			; 0000E2F6  7411  't.'
                  	mov	dx,0x2000		; 0000E2F8  BA0020  '.. '
                  	mov	bx,0xb8a0		; 0000E2FB  BBA0B8  '...'
                  	mov	cx,0x56			; 0000E2FE  B95600  '.V.'
                  	call	xc745			; 0000E301  E841E4  '.A.'
                  	or	byte [0x12],0xff	; 0000E304  800E1200FF  '.....'
                  xe309:	test	byte [0x10],0x1		; 0000E309  F606100001  '.....'
                  	jnz	xe321			; 0000E30E  7511  'u.'
                  	mov	dx,0x2000		; 0000E310  BA0020  '.. '
                  	mov	bx,0xb8f6		; 0000E313  BBF6B8  '...'
                  	mov	cx,0x1b			; 0000E316  B91B00  '...'
                  	call	xc745			; 0000E319  E829E4  '.).'
                  	or	byte [0x12],0xff	; 0000E31C  800E1200FF  '.....'
                  xe321:	test	al,0x10			; 0000E321  A810  '..'
                  	jz	xe336			; 0000E323  7411  't.'
                  	mov	dx,0x2000		; 0000E325  BA0020  '.. '
                  	mov	bx,0xb911		; 0000E328  BB11B9  '...'
                  	mov	cx,0x18			; 0000E32B  B91800  '...'
                  	call	xc745			; 0000E32E  E814E4  '...'
                  	or	byte [0x12],0xff	; 0000E331  800E1200FF  '.....'
                  xe336:	in	al,0x60			; 0000E336  E460  '.`'
                  	mov	al,0xc0			; 0000E338  B0C0  '..'
                  	out	0x64,al			; 0000E33A  E664  '.d'
                  	mov	cx,0xffff		; 0000E33C  B9FFFF  '...'
                  xe33f:	call	x919a			; 0000E33F  E858AE  '.X.'
                  	in	al,0x64			; 0000E342  E464  '.d'
                  	test	al,0x2			; 0000E344  A802  '..'
                  	jz	xe34f			; 0000E346  7407  't.'
                  	loop	xe33f			; 0000E348  E2F5  '..'
                  	jmp	short xe373		; 0000E34A  EB27  '.',0x27
                  
                  	mov	cx,0xffff		; 0000E34C  B9FFFF  '...'
                  xe34f:	call	x919a			; 0000E34F  E848AE  '.H.'
                  	in	al,0x64			; 0000E352  E464  '.d'
                  	test	al,0x1			; 0000E354  A801  '..'
                  	jnz	xe35c			; 0000E356  7504  'u.'
                  	loop	xe34f			; 0000E358  E2F5  '..'
                  	jmp	short xe373		; 0000E35A  EB17  '..'
                  
                  xe35c:	in	al,0x60			; 0000E35C  E460  '.`'
                  	test	al,0x80			; 0000E35E  A880  '..'
                  	jnz	xe373			; 0000E360  7511  'u.'
                  	mov	dx,0x2000		; 0000E362  BA0020  '.. '
                  	mov	bx,0xb95b		; 0000E365  BB5BB9  '.[.'
                  	mov	cx,0x55			; 0000E368  B95500  '.U.'
                  	call	xc745			; 0000E36B  E8D7E3  '...'
                  	or	byte [0x12],0xff	; 0000E36E  800E1200FF  '.....'
                  xe373:	xor	bp,bp			; 0000E373  33ED  '3.'
                  	call	xd03e			; 0000E375  E8C6EC  '...'
                  	jc	xe37b			; 0000E378  7201  'r.'
                  	xchg	ax,bp			; 0000E37A  95  '.'
                  xe37b:	call	xe3ab			; 0000E37B  E82D00  '.-.'
                  	xor	ax,ax			; 0000E37E  33C0  '3.'
                  	or	al,[0x12]		; 0000E380  0A061200  0x0A,'...'
                  	jz	xe389			; 0000E384  7403  't.'
                  	call	xe38f			; 0000E386  E80600  '...'
                  xe389:	mov	byte [0x12],0x0		; 0000E389  C606120000  '.....'
                  	ret				; 0000E38E  C3  '.'
                  
                  xe38f:	pusha				; 0000E38F  60  '`'
                  	mov	dx,0x0			; 0000E390  BA0000  '...'
                  	mov	bx,0xb943		; 0000E393  BB43B9  '.C.'
                  	mov	cx,0x18			; 0000E396  B91800  '...'
                  	call	xc745			; 0000E399  E8A9E3  '...'
                  	xchg	ax,bp			; 0000E39C  95  '.'
                  	cmp	al,0x5			; 0000E39D  3C05  '<.'
                  	jz	xe3a4			; 0000E39F  7403  't.'
                  	call	xe3ef			; 0000E3A1  E84B00  '.K.'
                  xe3a4:	mov	byte [0x12],0x0		; 0000E3A4  C606120000  '.....'
                  	popa				; 0000E3A9  61  'a'
                  	ret				; 0000E3AA  C3  '.'
                  
                  xe3ab:	cli				; 0000E3AB  FA  '.'
                  	in	al,0x21			; 0000E3AC  E421  '.!'
                  	and	al,0xfd			; 0000E3AE  24FD  '$.'
                  	out	0x21,al			; 0000E3B0  E621  '.!'
                  	push	es			; 0000E3B2  06  '.'
                  	xor	ax,ax			; 0000E3B3  33C0  '3.'
                  	mov	es,ax			; 0000E3B5  8EC0  '..'
                  	mov	bx,[es:0x24]		; 0000E3B7  268B1E2400  '&..$.'
                  	mov	word [es:0x24],0xe3e6	; 0000E3BC  26C7062400E6E3  '&..$...'
                  	sti				; 0000E3C3  FB  '.'
                  	push	bx			; 0000E3C4  53  'S'
                  	call	xc62f			; 0000E3C5  E867E2  '.g.'
                  	pop	bx			; 0000E3C8  5B  '['
                  	mov	[es:0x24],bx		; 0000E3C9  26891E2400  '&..$.'
                  	pop	es			; 0000E3CE  07  '.'
                  	mov	al,0x60			; 0000E3CF  B060  '.`'
                  	out	0x64,al			; 0000E3D1  E664  '.d'
                  	mov	cx,0xffff		; 0000E3D3  B9FFFF  '...'
                  xe3d6:	call	x919a			; 0000E3D6  E8C1AD  '...'
                  	in	al,0x64			; 0000E3D9  E464  '.d'
                  	test	al,0x2			; 0000E3DB  A802  '..'
                  	jz	xe3e1			; 0000E3DD  7402  't.'
                  	loop	xe3d6			; 0000E3DF  E2F5  '..'
                  xe3e1:	mov	al,0x45			; 0000E3E1  B045  '.E'
                  	out	0x60,al			; 0000E3E3  E660  '.`'
                  	ret				; 0000E3E5  C3  '.'
                  
                  	push	ax			; 0000E3E6  50  'P'
                  	in	al,0x60			; 0000E3E7  E460  '.`'
                  	mov	al,0x20			; 0000E3E9  B020  '. '
                  	out	0x20,al			; 0000E3EB  E620  '. '
                  	pop	ax			; 0000E3ED  58  'X'
                  	iret				; 0000E3EE  CF  '.'
                  
                  xe3ef:	mov	ah,0x0			; 0000E3EF  B400  '..'
                  	int	0x16			; 0000E3F1  CD16  '..'
                  	cmp	ah,0x3b			; 0000E3F3  80FC3B  '..;'
                  	jnz	xe3ef			; 0000E3F6  75F7  'u.'
                  	ret				; 0000E3F8  C3  '.'
                  
                  	times	7 db 0xFF		; 0000E3F9 - 0000E3FF
                  
                  	db	0xFF,0x32,0x01,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x01,0x11	; 0000E400
                  	db	0x00,0x67,0x02,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x11 ; 0000E410
                  	db	0x00,0x67,0x02,0x06,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x11 ; 0000E420
                  	db	0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0x11 ; 0000E430
                  	db	0x00,0xAC,0x03,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xAB,0x03,0x11 ; 0000E440
                  	db	0x00,0xB9,0x02,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x02,0x11 ; 0000E450
                  	db	0x00,0xCE,0x01,0x08,0x00,0x00,0x00,0x01,0x09,0x00,0x00,0x00,0x00,0xFF,0x01,0x11 ; 0000E460
                  	db	0x00,0x9D,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E470
                  	db	0x00,0x84,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0x83,0x03,0x11 ; 0000E480
                  	db	0x00,0xD4,0x03,0x05,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E490
                  	db	0x00,0x9D,0x03,0x07,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E4A0
                  	db	0x00,0x9D,0x03,0x09,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E4B0
                  	db	0x00,0x64,0x02,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x63,0x02,0x11 ; 0000E4C0
                  	db	0x00,0xD4,0x03,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E4D0
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0000E4E0
                  	db	0x00,0x64,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x02,0x11 ; 0000E4F0
                  	db	0x00,0xD4,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x03,0x11 ; 0000E500
                  	db	0x00,0xC6,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E510
                  	db	0x00,0xF2,0x02,0x0B,0x00,0x00,0xFF,0xFF,0x00,0x08,0x00,0x00,0x00,0xF1,0x02,0x11 ; 0000E520
                  	db	0x00,0xDD,0x02,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x02,0x11 ; 0000E530
                  	db	0x00,0xDD,0x02,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xDC,0x02,0x11 ; 0000E540
                  	db	0x00,0x25,0x03,0x06,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x11 ; 0000E550
                  	db	0x00,0x9C,0x03,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0x9C,0x03,0x11 ; 0000E560
                  	db	0x00,0xC6,0x03,0x0E,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E570
                  	db	0x00,0xC6,0x03,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E580
                  	db	0x00,0xFF,0x03,0x0E,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x11 ; 0000E590
                  	db	0x00,0xC6,0x03,0x0A,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x11 ; 0000E5A0
                  	db	0x00,0xEC,0x02,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xEC,0x02,0x11 ; 0000E5B0
                  	db	0x00,0x25,0x03,0x06,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E5C0
                  	db	0x00,0x67,0x02,0x04,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x19 ; 0000E5D0
                  	db	0x00,0x67,0x02,0x08,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x02,0x19 ; 0000E5E0
                  	db	0x00,0x89,0x03,0x09,0x00,0x00,0x80,0x00,0x07,0x08,0x00,0x00,0x00,0x89,0x03,0x19 ; 0000E5F0
                  	db	0x00,0xEC,0x02,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x22 ; 0000E600
                  	db	0x00,0xC6,0x03,0x07,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E610
                  	db	0x00,0xC6,0x03,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E620
                  	db	0x00,0xC6,0x03,0x09,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E630
                  	db	0x00,0xC6,0x03,0x05,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xC6,0x03,0x22 ; 0000E640
                  	db	0x00,0x63,0x02,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0x63,0x02,0x3F ; 0000E650
                  	db	0x00,0xFF,0x03,0x0B,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x21 ; 0000E660
                  	db	0x00,0xFF,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x22 ; 0000E670
                  	db	0x00,0xFF,0x03,0x0F,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x21 ; 0000E680
                  	db	0x00,0xFF,0x03,0x10,0x00,0x00,0xFF,0xFF,0x07,0x08,0x00,0x00,0x00,0xFF,0x03,0x3F ; 0000E690
                  	db	0x00,0x25,0x03,0x04,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E6A0
                  	db	0x00,0x25,0x03,0x02,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x25,0x03,0x1A ; 0000E6B0
                  	db	0x00,0xEC,0x02,0x08,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x21 ; 0000E6C0
                  	db	0x00,0xEC,0x02,0x06,0x00,0x00,0xFF,0xFF,0x07,0x00,0x00,0x00,0x00,0xEC,0x02,0x21 ; 0000E6D0
                  	db	0x00,0xC6,0x03,0x05,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x03,0x19 ; 0000E6E0
                  	db	0x00,0xFF,0xEB,0x0B,0x90,0x08,0x00,0xFC,0x01,0x00,0x70,0x00,0x00,0x00,0x00,0x83 ; 0000E6F0
                  	db	0xC4,0x06 									; 0000E700
                  
                  ;
                  ;   Start of warm boot code: read first sector from boot drive
                  ;
                  	sti				; 0000E702  FB  '.'
                  	cld				; 0000E703  FC  '.'
                  	mov	al,0xf			; 0000E704  B00F  '..'
                  	out	0x84,al			; 0000E706  E684  '..'
                  	mov	al,0x0			; 0000E708  B000  '..'
                  	out	0x85,al			; 0000E70A  E685  '..'
                  	mov	dx,0xefc7		; 0000E70C  BAC7EF  '...'
                  	call	xd6cd			; 0000E70F  E8BBEF  '...'
                  	mov	ds,dx			; 0000E712  8EDA  '..'
                  xe714:	mov	al,0xb9			; 0000E714  B0B9  '..'
                  	out	0x84,al			; 0000E716  E684  '..'
                  	mov	cx,0x3			; 0000E718  B90300  '...'
                  xe71b:	push	cx			; 0000E71B  51  'Q'
                  ;
                  ;   Reset the disk controller
                  ;
                  	mov	ah,0x0			; 0000E71C  B400  '..'
                  	int	0x13			; 0000E71E  CD13  '..'
                  ;
                  ;   Read the boot sector
                  ;
                  	mov	bx,0x7c00		; 0000E720  BB007C  '..|'
                  	mov	cx,0x1			; 0000E723  B90100  '...'
                  	mov	ax,0x201		; 0000E726  B80102  '...'
                  	int	0x13			; 0000E729  CD13  '..'
                  	pop	cx			; 0000E72B  59  'Y'
                  	jnc	xe770			; 0000E72C  7342  'sB'
                  	jc	xe73c			; 0000E72E  720C  'r.'
                  
                  	times	9 db 0xFF		; 0000E730 - 0000E738
                  	jmp	xc5c0			; 0000E739  E984DE (NOTE: This JMP doesn't appear reachable)
                  
                  xe73c:	loop	xe71b			; 0000E73C  E2DD  '..'
                  	mov	al,0xbb			; 0000E73E  B0BB  '..'
                  	out	0x84,al			; 0000E740  E684  '..'
                  	cmp	dl,0x80			; 0000E742  80FA80  '...'
                  	jz	xe76e			; 0000E745  7427  't',0x27
                  	mov	al,0xe			; 0000E747  B00E  '..'
                  	call	xb544			; 0000E749  E8F8CD  '...'
                  	test	al,0x40			; 0000E74C  A840  '.@'
                  	jnz	xe76e			; 0000E74E  751E  'u.'
                  	mov	dx,ds			; 0000E750  8CDA  '..'
                  	mov	bx,0x40			; 0000E752  BB4000  '.@.'
                  	mov	ds,bx			; 0000E755  8EDB  '..'
                  	mov	ch,[0x75]		; 0000E757  8A2E7500  '..u.'
                  	mov	ds,dx			; 0000E75B  8EDA  '..'
                  	or	ch,ch			; 0000E75D  0AED  0x0A,'.'
                  	jz	xe76e			; 0000E75F  740D  't',0x0D
                  	test	al,0x8			; 0000E761  A808  '..'
                  	jnz	xe76e			; 0000E763  7509  'u.'
                  	mov	al,0xba			; 0000E765  B0BA  '..'
                  	out	0x84,al			; 0000E767  E684  '..'
                  	mov	dx,0x80			; 0000E769  BA8000  '...'
                  	jmp	short xe714		; 0000E76C  EBA6  '..'
                  
                  ;
                  ;   On warm boot failure, pass control to the traditional ROM BASIC entry point
                  ;
                  xe76e:	int	0x18			; 0000E76E  CD18  '..'
                  
                  ;
                  ;   Boot sector successfully read
                  ;
                  xe770:	test	dl,0x80			; 0000E770  F6C280  '...'
                  	jnz	xe793			; 0000E773  751E  'u.'
                  
                  ;
                  ;   More diskette I/O (TODO: Investigate)
                  ;
                  	push	bx			; 0000E775  53  'S'
                  	call	xd540			; 0000E776  E8C7ED  '...'
                  	pop	bx			; 0000E779  5B  '['
                  ;
                  ;   Check the ROM status byte for 0xBD (values I've seen: 0xB9)
                  ;
                  	in	al,0x84			; 0000E77A  E484  '..'
                  	cmp	al,0xbd			; 0000E77C  3CBD  '<.'
                  	jz	xe714			; 0000E77E  7494  't.'
                  ;
                  ;   This code looks broken: ES:BX points to the boot sector just loaded
                  ;   (0x0000:0x7C00), and apparently the ROM wants to scan the first 9 words
                  ;   of the boot sector, to see if they all match the 1st word; if they do,
                  ;   then it's likely the boot sector is invalid (hence the "boot_error"
                  ;   message).  However, it's loading AX with the 1st word from DS:BX
                  ;   (0x0040:0x7C00) rather than ES:BX, which aside from being the wrong word,
                  ;   also increases the likelihood that this code will always see a difference
                  ;   and never trigger the error.
                  ;
                  ;   The value in AX is typically 0x0000.
                  ;
                  	mov	ax,[bx]			; 0000E780  8B07  '..'
                  	mov	cx,0x9			; 0000E782  B90900  '...'
                  	mov	di,bx			; 0000E785  8BFB  '..'
                  	repe	scasw			; 0000E787  F3AF  '..'
                  	jnz	xe7a9			; 0000E789  751E  'u.'
                  
                  	mov	si,boot_error		; 0000E78B  BE5D93  '.].'
                  	call	print_str$		; 0000E78E  E83F00  '.?.'
                  xe791:	jmp	short xe791		; 0000E791  Hang the machine
                  
                  ;
                  ;   Hard disk sector validation (as opposed to the preceding floppy disk sector validation)
                  ;
                  xe793:	mov	al,0x33			; 0000E793  B033  '.3'
                  	mov	ah,al			; 0000E795  8AE0  '..'
                  	call	xb544			; 0000E797  E8AACD  '...'
                  	and	al,0xfb			; 0000E79A  24FB  '$.'
                  	xchg	al,ah			; 0000E79C  86C4  '..'
                  	call	xb549			; 0000E79E  E8A8CD  '...'
                  ;
                  ;   Verify the hard disk boot sector signature (0xAA55)
                  ;
                  	cmp	word [bx+0x1fe],0xaa55	; 0000E7A1  81BFFE0155AA  '....U.'
                  	jnz	xe76e			; 0000E7A7  75C5  'u.'
                  
                  xe7a9:	in	al,0x86			; 0000E7A9  E486  '..'
                  	test	al,0x80			; 0000E7AB  A880  '..'
                  	jnz	xe7b7			; 0000E7AD  7508  'u.'
                  	test	al,0x40			; 0000E7AF  A840  '.@'
                  	jnz	xe7b7			; 0000E7B1  7504  'u.'
                  	mov	al,0x92			; 0000E7B3  B092  '..'
                  	out	0x4b,al			; 0000E7B5  E64B  '.K'
                  xe7b7:	mov	al,0xbc			; 0000E7B7  B0BC  '..'
                  	out	0x84,al			; 0000E7B9  E684  '..'
                  ;
                  ;   Jump to the start of the boot sector
                  ;
                  	jmp	0x0:0x7c00		; 0000E7BB  EA007C0000  '..|..'
                  
                  xe7c0:	add	sp,byte +0x6		; 0000E7C0  83C406  '...'
                  	sti				; 0000E7C3  FB  '.'
                  	mov	si,boot_prompt		; 0000E7C4  BE1493  '...'
                  	call	print_str$		; 0000E7C7  E80600  '...'
                  	mov	ah,0x0			; 0000E7CA  B400  '..'
                  	int	0x16			; 0000E7CC  CD16  '..'
                  	int	0x19			; 0000E7CE  CD19  '..'
                  
                  ;
                  ;   print_str$(CS:SI -> $-terminated string)
                  ;
                  print_str$:
                  	cld				; 0000E7D0  FC  '.'
                  xe7d1:	cs	lodsb			; 0000E7D1  2EAC  '..'
                  	cmp	al,0x24			; 0000E7D3  3C24  '<$'
                  	jz	xe7dc			; 0000E7D5  7405  't.'
                  	call	print_char		; 0000E7D7  E8F9DF  '...'
                  	jmp	short xe7d1		; 0000E7DA  EBF5  '..'
                  xe7dc:	ret				; 0000E7DC  C3  '.'
                  
                  	sub	al,0x2d			; 0000E7DD  2C2D  ',-' (NOTE: This instruction doesn't appear reachable)
                  
                  xe7df:	mov	si,bim_table_offset	; 0000E7DF  BEE0FF  '...'
                  	mov	si,[cs:si]		; 0000E7E2  2E8B34  '..4'
                  	mov	ax,[cs:si]		; 0000E7E5  2E8B04  '...'
                  	test	ax,0xf00		; 0000E7E8  A9000F  '...'
                  	jz	xe7f0			; 0000E7EB  7403  't.'
                  	jmp	short xe80a		; 0000E7ED  EB1B  '..'
                  
                  	nop				; 0000E7EF  90  '.'
                  xe7f0:	and	ah,0xc0			; 0000E7F0  80E4C0  '...'
                  	cmp	ah,0x40			; 0000E7F3  80FC40  '..@'
                  	jz	xe80a			; 0000E7F6  7412  't.'
                  	call	xf305			; 0000E7F8  E80A0B  '.',0x0A,'.'
                  	mov	byte [cs:0x67dd],0x22	; 0000E7FB  2EC606DD6722  '....g"'
                  	mov	byte [cs:0x67de],0x24	; 0000E801  2EC606DE6724  '....g$'
                  	call	xf30a			; 0000E807  E8000B  '...'
                  xe80a:	ret				; 0000E80A  C3  '.'
                  
                  ;
                  ;   Compare DS:BX to ES:DI; return carry CLEAR if success, SET if failure
                  ;
                  xe80b:	mov	si,bx			; 0000E80B  8BF3  '..'
                  	mov	cx,0x21			; 0000E80D  B92100  '.!.'
                  	repe	cmpsd			; 0000E810  66F3A7  'f..'
                  	jnz	xe821			; 0000E813  750C  'u.'
                  	dec	dx			; 0000E815  4A  'J'
                  	jnz	xe80b			; 0000E816  75F3  'u.'
                  	mov	si,bx			; 0000E818  8BF3  '..'
                  	mov	cx,ax			; 0000E81A  8BC8  '..'
                  	repe	cmpsd			; 0000E81C  66F3A7  'f..'
                  	jz	xe828			; 0000E81F  7407  't.'
                  xe821:	sub	di,byte +0x4		; 0000E821  83EF04  '...'
                  	sub	si,byte +0x4		; 0000E824  83EE04  '...'
                  	stc				; 0000E827  F9  '.'
                  xe828:	jmp	bp			; 0000E828  FFE5  '..'
                  
                  	times	4 db 0xFF		; 0000E82A - 0000E82D
                  
                  xe82e:	sti				; 0000E82E  FB  '.'
                  	cld				; 0000E82F  FC  '.'
                  	push	ds			; 0000E830  1E  '.'
                  	push	si			; 0000E831  56  'V'
                  	push	bp			; 0000E832  55  'U'
                  	mov	bp,sp			; 0000E833  8BEC  '..'
                  	mov	si,0x40			; 0000E835  BE4000  '.@.'
                  	mov	ds,si			; 0000E838  8EDE  '..'
                  	test	ah,ah			; 0000E83A  84E4  '..'
                  	jnz	xe849			; 0000E83C  750B  'u.'
                  xe83e:	call	xdc96			; 0000E83E  E855F4  '.U.'
                  	call	xdccb			; 0000E841  E887F4  '...'
                  	jz	xe83e			; 0000E844  74F8  't.'
                  	jmp	xe8fc			; 0000E846  E9B300  '...'
                  
                  xe849:	dec	ah			; 0000E849  FECC  '..'
                  	jnz	xe876			; 0000E84B  7529  'u)'
                  	or	word [bp+0xa],0x240	; 0000E84D  814E0A4002  '.N',0x0A,'@.'
                  	and	word [bp+0xa],0xfffe	; 0000E852  81660AFEFF  '.f',0x0A,'..'
                  xe857:	call	xdcbe			; 0000E857  E864F4  '.d.'
                  	jnz	xe85f			; 0000E85A  7503  'u.'
                  	jmp	xe8fc			; 0000E85C  E99D00  '...'
                  
                  xe85f:	call	xdccb			; 0000E85F  E869F4  '.i.'
                  	jnz	xe869			; 0000E862  7505  'u.'
                  	call	xdc96			; 0000E864  E82FF4  './.'
                  	jmp	short xe857		; 0000E867  EBEE  '..'
                  
                  xe869:	and	word [bp+0xa],0xffbf	; 0000E869  81660ABFFF  '.f',0x0A,'..'
                  	or	word [bp+0xa],0x1	; 0000E86E  814E0A0100  '.N',0x0A,'..'
                  	jmp	xe8fc			; 0000E873  E98600  '...'
                  
                  xe876:	dec	ah			; 0000E876  FECC  '..'
                  	jnz	xe87f			; 0000E878  7505  'u.'
                  	call	xdcc7			; 0000E87A  E84AF4  '.J.'
                  	jmp	short xe8fc		; 0000E87D  EB7D  '.}'
                  
                  xe87f:	dec	ah			; 0000E87F  FECC  '..'
                  	jnz	xe888			; 0000E881  7505  'u.'
                  	call	xdd28			; 0000E883  E8A2F4  '...'
                  	jmp	short xe8fc		; 0000E886  EB74  '.t'
                  
                  xe888:	dec	ah			; 0000E888  FECC  '..'
                  	jnz	xe88e			; 0000E88A  7502  'u.'
                  	jmp	short xe8fc		; 0000E88C  EB6E  '.n'
                  
                  xe88e:	dec	ah			; 0000E88E  FECC  '..'
                  	jnz	xe897			; 0000E890  7505  'u.'
                  	call	xdd88			; 0000E892  E8F3F4  '...'
                  	jmp	short xe8fc		; 0000E895  EB65  '.e'
                  
                  xe897:	cmp	ah,0xb			; 0000E897  80FC0B  '...'
                  	jnz	xe8a4			; 0000E89A  7508  'u.'
                  	call	xdc96			; 0000E89C  E8F7F3  '...'
                  	call	xdcfd			; 0000E89F  E85BF4  '.[.'
                  	jmp	short xe8fc		; 0000E8A2  EB58  '.X'
                  
                  xe8a4:	cmp	ah,0xc			; 0000E8A4  80FC0C  '...'
                  	jnz	xe8c7			; 0000E8A7  751E  'u.'
                  	or	word [bp+0xa],0x240	; 0000E8A9  814E0A4002  '.N',0x0A,'@.'
                  	and	word [bp+0xa],0xfffe	; 0000E8AE  81660AFEFF  '.f',0x0A,'..'
                  	call	xdcbe			; 0000E8B3  E808F4  '...'
                  	jz	xe8fc			; 0000E8B6  7444  'tD'
                  	call	xdcfd			; 0000E8B8  E842F4  '.B.'
                  	and	word [bp+0xa],0xffbf	; 0000E8BB  81660ABFFF  '.f',0x0A,'..'
                  	or	word [bp+0xa],0x1	; 0000E8C0  814E0A0100  '.N',0x0A,'..'
                  	jmp	short xe8fc		; 0000E8C5  EB35  '.5'
                  
                  xe8c7:	cmp	ah,0xd			; 0000E8C7  80FC0D  '..',0x0D
                  	jnz	xe8d1			; 0000E8CA  7505  'u.'
                  	call	xdd09			; 0000E8CC  E83AF4  '.:.'
                  	jmp	short xe8fc		; 0000E8CF  EB2B  '.+'
                  
                  xe8d1:	cmp	ah,0xeb			; 0000E8D1  80FCEB  '...'
                  	jnz	xe8db			; 0000E8D4  7505  'u.'
                  	call	xddaf			; 0000E8D6  E8D6F4  '...'
                  	jmp	short xe8fc		; 0000E8D9  EB21  '.!'
                  
                  xe8db:	cmp	ah,0xec			; 0000E8DB  80FCEC  '...'
                  	jnz	xe8e5			; 0000E8DE  7505  'u.'
                  	call	xde51			; 0000E8E0  E86EF5  '.n.'
                  	jmp	short xe8fc		; 0000E8E3  EB17  '..'
                  
                  xe8e5:	cmp	ah,0xed			; 0000E8E5  80FCED  '...'
                  	jnz	xe8ef			; 0000E8E8  7505  'u.'
                  	call	xde91			; 0000E8EA  E8A4F5  '...'
                  	jmp	short xe8fc		; 0000E8ED  EB0D  '.',0x0D
                  
                  xe8ef:	cmp	ah,0xef			; 0000E8EF  80FCEF  '...'
                  	jnz	xe8f9			; 0000E8F2  7505  'u.'
                  	call	xdea5			; 0000E8F4  E8AEF5  '...'
                  	jmp	short xe8fc		; 0000E8F7  EB03  '..'
                  
                  xe8f9:	sub	ah,0xd			; 0000E8F9  80EC0D  '..',0x0D
                  xe8fc:	pop	bp			; 0000E8FC  5D  ']'
                  	pop	si			; 0000E8FD  5E  '^'
                  	pop	ds			; 0000E8FE  1F  '.'
                  	iret				; 0000E8FF  CF  '.'
                  
                  xe900:	push	ds			; 0000E900  1E  '.'
                  	push	ax			; 0000E901  50  'P'
                  	mov	ax,0x40			; 0000E902  B84000  '.@.'
                  	mov	ds,ax			; 0000E905  8ED8  '..'
                  	mov	ax,0xff0b		; 0000E907  B80BFF  '...'
                  	out	0xa0,al			; 0000E90A  E6A0  '..'
                  	in	al,0xa0			; 0000E90C  E4A0  '..'
                  	test	al,al			; 0000E90E  84C0  '..'
                  	jz	xe91e			; 0000E910  740C  't.'
                  	mov	ah,al			; 0000E912  8AE0  '..'
                  	in	al,0xa1			; 0000E914  E4A1  '..'
                  	or	al,ah			; 0000E916  0AC4  0x0A,'.'
                  	out	0xa1,al			; 0000E918  E6A1  '..'
                  	out	0xa0,al			; 0000E91A  E6A0  '..'
                  	jmp	short xe934		; 0000E91C  EB16  '..'
                  
                  xe91e:	mov	al,0xb			; 0000E91E  B00B  '..'
                  	out	0x20,al			; 0000E920  E620  '. '
                  	in	al,0x20			; 0000E922  E420  '. '
                  	test	al,al			; 0000E924  84C0  '..'
                  	jz	xe934			; 0000E926  740C  't.'
                  	mov	ah,al			; 0000E928  8AE0  '..'
                  	test	al,0x4			; 0000E92A  A804  '..'
                  	jnz	xe934			; 0000E92C  7506  'u.'
                  	in	al,0x21			; 0000E92E  E421  '.!'
                  	or	al,ah			; 0000E930  0AC4  0x0A,'.'
                  	out	0x21,al			; 0000E932  E621  '.!'
                  xe934:	cmp	ah,0xff			; 0000E934  80FCFF  '...'
                  	jz	xe93d			; 0000E937  7404  't.'
                  	mov	al,0x20			; 0000E939  B020  '. '
                  	out	0x20,al			; 0000E93B  E620  '. '
                  xe93d:	mov	[0x6b],ah		; 0000E93D  88266B00  '.&k.'
                  	pop	ax			; 0000E941  58  'X'
                  	pop	ds			; 0000E942  1F  '.'
                  	iret				; 0000E943  CF  '.'
                  
                  xe944:	push	cx			; 0000E944  51  'Q'
                  	mov	cx,0x78			; 0000E945  B97800  '.x.'
                  	mov	dx,0x3f4		; 0000E948  BAF403  '...'
                  xe94b:	call	x919a			; 0000E94B  E84CA8  '.L.'
                  	in	al,dx			; 0000E94E  EC  '.'
                  	test	al,0x80			; 0000E94F  A880  '..'
                  	jnz	xe959			; 0000E951  7506  'u.'
                  	loop	xe94b			; 0000E953  E2F6  '..'
                  	stc				; 0000E955  F9  '.'
                  	jmp	short xe960		; 0000E956  EB08  '..'
                  
                  	nop				; 0000E958  90  '.'
                  xe959:	call	x919a			; 0000E959  E83EA8  '.>.'
                  	in	al,dx			; 0000E95C  EC  '.'
                  	inc	dx			; 0000E95D  42  'B'
                  	test	al,0x40			; 0000E95E  A840  '.@'
                  xe960:	pop	cx			; 0000E960  59  'Y'
                  	ret				; 0000E961  C3  '.'
                  
                  	db	0xFF			; 0000E962  FF  '.'
                  	db	0xFF			; 0000E963  FF  '.'
                  
                  xe964:	call	xbfc3			; 0000E964  E85CD6  '.\.'
                  	jc	xe97b			; 0000E967  7212  'r.'
                  	call	xbe10			; 0000E969  E8A4D4  '...'
                  	jc	xe97b			; 0000E96C  720D  'r',0x0D
                  	call	xc129			; 0000E96E  E8B8D7  '...'
                  	jc	xe97b			; 0000E971  7208  'r.'
                  	call	xc188			; 0000E973  E812D8  '...'
                  	jc	xe97b			; 0000E976  7203  'r.'
                  	call	xd215			; 0000E978  E89AE8
                  xe97b:	ret				; 0000E97B  C3  '.'
                  
                  xe97c:	call	xec2e_wait_8042_ready	; 0000E97C  E8AF02  '...'
                  	mov	al,0xad			; 0000E97F  B0AD  '..'
                  	out	0x64,al			; 0000E981  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000E983  E8A802  '...'
                  	ret				; 0000E986  C3  '.'
                  
                  	cld				; 0000E987  FC  '.'
                  	pusha				; 0000E988  60  '`'
                  	push	ds			; 0000E989  1E  '.'
                  	push	es			; 0000E98A  06  '.'
                  	mov	bx,0x40			; 0000E98B  BB4000  '.@.'
                  	mov	ds,bx			; 0000E98E  8EDB  '..'
                  	test	byte [0x96],0x80	; 0000E990  F606960080  '.....'
                  	jz	xe9b2			; 0000E995  741B  't.'
                  	in	al,0x60			; 0000E997  E460  '.`'
                  	cmp	al,0xab			; 0000E999  3CAB  '<.'
                  	jnz	xe9a7			; 0000E99B  750A
                  	or	byte [0x96],0x40	; 0000E99D  800E960040  '....@'
                  	and	byte [0x96],0x7f	; 0000E9A2  802696007F  '.&...'
                  xe9a7:	mov	al,0x20			; 0000E9A7  B020  '. '
                  	out	0x20,al			; 0000E9A9  E620  '. '
                  	sti				; 0000E9AB  FB  '.'
                  	mov	bp,0xffff		; 0000E9AC  BDFFFF  '...'
                  	jmp	xeadf			; 0000E9AF  E92D01  '.-.'
                  
                  xe9b2:	test	byte [0x96],0x40	; 0000E9B2  F606960040  '....@'
                  	jz	xe9fa			; 0000E9B7  7441  'tA'
                  	in	al,0x60			; 0000E9B9  E460  '.`'
                  	cmp	al,0x41			; 0000E9BB  3C41  '<A'
                  	jnz	xe9a7			; 0000E9BD  75E8
                  	and	byte [0x96],0xbf	; 0000E9BF  80269600BF  '.&...'
                  	or	byte [0x96],0x10	; 0000E9C4  800E960010  '.....'
                  	or	byte [0x17],0x20	; 0000E9C9  800E170020  '.... '
                  	push	ax			; 0000E9CE  50  'P'
                  	mov	al,0xe			; 0000E9CF  B00E  '..'
                  	call	xb544			; 0000E9D1  E870CB  '.p.'
                  	test	al,0x40			; 0000E9D4  A840  '.@'
                  	jnz	xe9e6			; 0000E9D6  750E  'u.'
                  	mov	al,0x2c			; 0000E9D8  B02C  '.,'
                  	call	xb544			; 0000E9DA  E867CB  '.g.'
                  	test	al,0x40			; 0000E9DD  A840  '.@'
                  	jnz	xe9e6			; 0000E9DF  7505  'u.'
                  	and	byte [0x17],0xdf	; 0000E9E1  80261700DF  '.&...'
                  xe9e6:	pop	ax			; 0000E9E6  58  'X'
                  	mov	al,0x20			; 0000E9E7  B020  '. '
                  	out	0x20,al			; 0000E9E9  E620  '. '
                  	sti				; 0000E9EB  FB  '.'
                  	call	xeba5			; 0000E9EC  E8B601  '...'
                  	and	byte [0x96],0xdf	; 0000E9EF  80269600DF  '.&...'
                  	mov	bp,0xffff		; 0000E9F4  BDFFFF  '...'
                  	jmp	xeadf			; 0000E9F7  E9E500  '...'
                  
                  xe9fa:	mov	di,0x17			; 0000E9FA  BF1700  '...'
                  	call	xe97c			; 0000E9FD  E87CFF  '.|.'
                  	mov	bl,al			; 0000EA00  8AD8  '..'
                  	in	al,0x60			; 0000EA02  E460  '.`'
                  	stc				; 0000EA04  F9  '.'
                  	mov	ah,0x4f			; 0000EA05  B44F  '.O'
                  	int	0x15			; 0000EA07  CD15  '..'
                  	mov	bp,0x0			; 0000EA09  BD0000  '...'
                  	jc	xea16			; 0000EA0C  7208  'r.'
                  	mov	al,0x20			; 0000EA0E  B020  '. '
                  	out	0x20,al			; 0000EA10  E620  '. '
                  	sti				; 0000EA12  FB  '.'
                  	jmp	xeadf			; 0000EA13  E9C900  '...'
                  
                  xea16:	mov	ah,al			; 0000EA16  8AE0  '..'
                  	push	ax			; 0000EA18  50  'P'
                  	cmp	al,0x46			; 0000EA19  3C46  '<F'
                  	jnz	xea32			; 0000EA1B  7515
                  	test	byte [0x18],0x8		; 0000EA1D  F606180008  '.....'
                  	jnz 	xea32			; 0000EA22  750E
                  	call	xc0e9			; 0000EA24  E8C2D6  '...'
                  	jnc	xea32			; 0000EA27  7309
                  	cli				; 0000EA29  FA  '.'
                  	mov	al,0x20			; 0000EA2A  B020  '. '
                  	out	0x20,al			; 0000EA2C  E620  '. '
                  	sti				; 0000EA2E  FB  '.'
                  	jmp	xead4			; 0000EA2F  E9A200  '...'
                  xea32:	mov	al,0x20			; 0000EA32  B020  '. '
                  	out	0x20,al			; 0000EA34  E620  '. '
                  
                  	sti				; 0000EA36  FB  '.'
                  	cmp	ah,0xe0			; 0000EA37  80FCE0  '...'
                  	jnz	xea43			; 0000EA3A  7507  'u.'
                  	or	byte [0x96],0x2		; 0000EA3C  800E960002  '.....'
                  	jmp	short xea5e		; 0000EA41  EB1B  '..'
                  
                  xea43:	cmp	ah,0xe1			; 0000EA43  80FCE1  '...'
                  	jnz	xea4f			; 0000EA46  7507  'u.'
                  	or	byte [0x96],0x1		; 0000EA48  800E960001  '.....'
                  	jmp	short xea5e		; 0000EA4D  EB0F  '..'
                  
                  xea4f:	cmp	ah,0xfe			; 0000EA4F  80FCFE  '...'
                  	jz	xea5e			; 0000EA52  740A  't',0x0A
                  	cmp	ah,0xfa			; 0000EA54  80FCFA  '...'
                  	jnz	xea62			; 0000EA57  7509  'u.'
                  	or	byte [0x97],0x10	; 0000EA59  800E970010  '.....'
                  xea5e:	pop	ax			; 0000EA5E  58  'X'
                  	jmp	short xeadf		; 0000EA5F  EB7E  '.~'
                  
                  	nop				; 0000EA61  90  '.'
                  xea62:	call	xeb16			; 0000EA62  E8B100  '...'
                  	test	byte [0x18],0x8		; 0000EA65  F606180008  '.....'
                  	jz	xead1			; 0000EA6A  7465  'te'
                  	jmp	short xea8a		; 0000EA6C  EB1C  '..'
                  
                  	times	19 db 0xFF		; 0000EA6E - 0000EA80
                  
                  xea81:	mov	word [0x0072],0x1234	; 0000EA81  C70672003412
                  	jmp	xe05b			; 0000EA87  E9D1F5
                  
                  xea8a:	cmp	ah,0x54			; 0000EA8A  80FC54  '..T'
                  	jz	xea94			; 0000EA8D  7405  't.'
                  	cmp	ah,0xd4			; 0000EA8F  80FCD4  '...'
                  	jnz	xea9b			; 0000EA92  7507  'u.'
                  xea94:	test	byte [0x17],0x8		; 0000EA94  F606170008  '.....'
                  	jnz	xead1			; 0000EA99  7536  'u6'
                  xea9b:	cmp	ah,0x46			; 0000EA9B  80FC46  '..F'
                  	jz	xeabc			; 0000EA9E  741C  't.'
                  	cmp	ah,0x45			; 0000EAA0  80FC45  '..E'
                  	jnz	xeaac			; 0000EAA3  7507  'u.'
                  	test	byte [0x96],0x1		; 0000EAA5  F606960001  '.....'
                  	jnz	xead4			; 0000EAAA  7528  'u('
                  xeaac:	call	xbe10			; 0000EAAC  E861D3  '.a.'
                  	jc	xead4			; 0000EAAF  7223  'r#'
                  	cmp	ah,0x52			; 0000EAB1  80FC52  '..R'
                  	jz	xead4			; 0000EAB4  741E  't.'
                  	test	ah,ah			; 0000EAB6  84E4  '..'
                  	js	xead4			; 0000EAB8  781A  'x.'
                  	jmp	short xeaca		; 0000EABA  EB0E  '..'
                  
                  xeabc:	test	byte [0x17],0x8		; 0000EABC  F606170008  '.....'
                  	jnz	xead1			; 0000EAC1  750E  'u.'
                  	test	byte [0x17],0x4		; 0000EAC3  F606170004  '.....'
                  	jz	xead1			; 0000EAC8  7407  't.'
                  xeaca:	and	byte [0x18],0xf7	; 0000EACA  80261800F7  '.&...'
                  	jmp	short xead4		; 0000EACF  EB03  '..'
                  
                  xead1:	call	xe964			; 0000EAD1  E890FE  '...'
                  xead4:	pop	ax			; 0000EAD4  58  'X'
                  	mov	[0x15],ah		; 0000EAD5  88261500  '.&..'
                  	call	xeaeb			; 0000EAD9  E80F00  '...'
                  	call	xeba5			; 0000EADC  E8C600  '...'
                  xeadf:	test	bp,bp			; 0000EADF  85ED  '..'
                  	pop	es			; 0000EAE1  07  '.'
                  	pop	ds			; 0000EAE2  1F  '.'
                  	popa				; 0000EAE3  61  'a'
                  	jnz	xeaea			; 0000EAE4  7504  'u.'
                  	cli				; 0000EAE6  FA  '.'
                  	call	xeb0c			; 0000EAE7  E82200  '.".'
                  xeaea:	iret				; 0000EAEA  CF  '.'
                  
                  xeaeb:	push	ax			; 0000EAEB  50  'P'
                  	and	byte [0x96],0xfd	; 0000EAEC  80269600FD  '.&...'
                  	test	byte [0x96],0x1		; 0000EAF1  F606960001  '.....'
                  	jz	xeb0a			; 0000EAF6  7412  't.'
                  	and	ah,0x7f			; 0000EAF8  80E47F  '...'
                  	cmp	ah,0x45			; 0000EAFB  80FC45  '..E'
                  	jz	xeb05			; 0000EAFE  7405  't.'
                  	cmp	ah,0x1d			; 0000EB00  80FC1D  '...'
                  	jz	xeb0a			; 0000EB03  7405  't.'
                  xeb05:	and	byte [0x96],0xfe	; 0000EB05  80269600FE  '.&...'
                  xeb0a:	pop	ax			; 0000EB0A  58  'X'
                  	ret				; 0000EB0B  C3  '.'
                  
                  xeb0c:	push	ax			; 0000EB0C  50  'P'
                  	call	xec2e_wait_8042_ready	; 0000EB0D  E81E01  '...'
                  	mov	al,0xae			; 0000EB10  B0AE  '..'
                  	out	0x64,al			; 0000EB12  E664  '.d'
                  	pop	ax			; 0000EB14  58  'X'
                  	ret				; 0000EB15  C3  '.'
                  
                  xeb16:	mov	al,[0x16]		; 0000EB16  A01600  '...'
                  	call	xc24c			; 0000EB19  E830D7  '.0.'
                  	jz	xeb35			; 0000EB1C  7417  't.'
                  	cmp	ah,0x4e			; 0000EB1E  80FC4E  '..N'
                  	jnz	xeb27			; 0000EB21  7504  'u.'
                  	inc	al			; 0000EB23  FEC0  '..'
                  	jmp	short xeb2e		; 0000EB25  EB07  '..'
                  
                  xeb27:	cmp	ah,0x4a			; 0000EB27  80FC4A  '..J'
                  	jnz	xeb35			; 0000EB2A  7509  'u.'
                  	dec	al			; 0000EB2C  FEC8  '..'
                  xeb2e:	js	xeb58			; 0000EB2E  7828  'x('
                  	mov	[0x16],al		; 0000EB30  A21600  '...'
                  	jmp	short xeb58		; 0000EB33  EB23  '.#'
                  
                  xeb35:	cmp	ah,[0x15]		; 0000EB35  3A261500  ':&..'
                  	jz	xeb7d			; 0000EB39  7442  'tB'
                  	cmp	ah,0x2a			; 0000EB3B  80FC2A  '..*'
                  	jz	xeb45			; 0000EB3E  7405  't.'
                  	cmp	ah,0x36			; 0000EB40  80FC36  '..6'
                  	jnz	xeb4c			; 0000EB43  7507  'u.'
                  xeb45:	test	byte [0x96],0x2		; 0000EB45  F606960002  '.....'
                  	jnz	xeb7d			; 0000EB4A  7531  'u1'
                  xeb4c:	cmp	ah,0x1d			; 0000EB4C  80FC1D  '...'
                  	jnz	xeb58			; 0000EB4F  7507  'u.'
                  	test	byte [0x96],0x1		; 0000EB51  F606960001  '.....'
                  	jnz	xeb7d			; 0000EB56  7525  'u%'
                  xeb58:	test	ah,ah			; 0000EB58  84E4  '..'
                  	js	xeb7d			; 0000EB5A  7821  'x!'
                  	xor	bx,bx			; 0000EB5C  33DB  '3.'
                  	or	bl,[0x16]		; 0000EB5E  0A1E1600  0x0A,'...'
                  	jz	xeb7d			; 0000EB62  7419  't.'
                  	push	ax			; 0000EB64  50  'P'
                  	in	al,0x61			; 0000EB65  E461  '.a'
                  	push	ax			; 0000EB67  50  'P'
                  xeb68:	and	al,0xfc			; 0000EB68  24FC  '$.'
                  	out	0x61,al			; 0000EB6A  E661  '.a'
                  	call	xeb7e			; 0000EB6C  E80F00  '...'
                  	or	al,0x2			; 0000EB6F  0C02  '..'
                  	out	0x61,al			; 0000EB71  E661  '.a'
                  	call	xeb7e			; 0000EB73  E80800  '...'
                  	dec	bx			; 0000EB76  4B  'K'
                  	jnz	xeb68			; 0000EB77  75EF  'u.'
                  	pop	ax			; 0000EB79  58  'X'
                  	out	0x61,al			; 0000EB7A  E661  '.a'
                  	pop	ax			; 0000EB7C  58  'X'
                  xeb7d:	ret				; 0000EB7D  C3  '.'
                  
                  xeb7e:	push	ax			; 0000EB7E  50  'P'
                  	push	bx			; 0000EB7F  53  'S'
                  	mov	al,0x0			; 0000EB80  B000  '..'
                  	out	0x43,al			; 0000EB82  E643  '.C'
                  	in	al,0x40			; 0000EB84  E440  '.@'
                  	mov	bl,al			; 0000EB86  8AD8  '..'
                  	in	al,0x40			; 0000EB88  E440  '.@'
                  	mov	bh,al			; 0000EB8A  8AF8  '..'
                  xeb8c:	mov	al,0x0			; 0000EB8C  B000  '..'
                  	out	0x43,al			; 0000EB8E  E643  '.C'
                  	in	al,0x40			; 0000EB90  E440  '.@'
                  	mov	ah,al			; 0000EB92  8AE0  '..'
                  	in	al,0x40			; 0000EB94  E440  '.@'
                  	xchg	ah,al			; 0000EB96  86E0  '..'
                  	push	bx			; 0000EB98  53  'S'
                  	sub	bx,ax			; 0000EB99  2BD8  '+.'
                  	cmp	bx,0x11d		; 0000EB9B  81FB1D01  '....'
                  	pop	bx			; 0000EB9F  5B  '['
                  	jna	xeb8c			; 0000EBA0  76EA  'v.'
                  	pop	bx			; 0000EBA2  5B  '['
                  	pop	ax			; 0000EBA3  58  'X'
                  	ret				; 0000EBA4  C3  '.'
                  
                  xeba5:	push	ax			; 0000EBA5  50  'P'
                  	mov	al,[0x17]		; 0000EBA6  A01700  '...'
                  	shr	al,0x4			; 0000EBA9  C0E804  '...'
                  	and	al,0x7			; 0000EBAC  2407  '$.'
                  	mov	ah,[0x97]		; 0000EBAE  8A269700  '.&..'
                  	and	ah,0x7			; 0000EBB2  80E407  '...'
                  	cmp	al,ah			; 0000EBB5  3AC4  ':.'
                  	jz	xebc5			; 0000EBB7  740C  't.'
                  	and	byte [0x97],0xf8	; 0000EBB9  80269700F8  '.&...'
                  	or	[0x97],al		; 0000EBBE  08069700  '....'
                  	call	xebc7			; 0000EBC2  E80200  '...'
                  xebc5:	pop	ax			; 0000EBC5  58  'X'
                  	ret				; 0000EBC6  C3  '.'
                  
                  xebc7:	push	ax			; 0000EBC7  50  'P'
                  	push	cx			; 0000EBC8  51  'Q'
                  	call	xec1e			; 0000EBC9  E85200  '.R.'
                  	jnz	xec1b			; 0000EBCC  754D  'uM'
                  	and	byte [0x97],0xef	; 0000EBCE  80269700EF  '.&...'
                  	call	xec2e_wait_8042_ready	; 0000EBD3  E85800  '.X.'
                  	mov	al,0xed			; 0000EBD6  B0ED  '..'
                  	out	0x60,al			; 0000EBD8  E660  '.`'
                  	mov	cx,0xffff		; 0000EBDA  B9FFFF  '...'
                  xebdd:	test	byte [0x97],0x10	; 0000EBDD  F606970010  '.....'
                  	jnz	xebef			; 0000EBE2  750B  'u.'
                  	loop	xebdd			; 0000EBE4  E2F7  '..'
                  	call	xec2e_wait_8042_ready	; 0000EBE6  E84500  '.E.'
                  	mov	al,0xf4			; 0000EBE9  B0F4  '..'
                  	out	0x60,al			; 0000EBEB  E660  '.`'
                  	jmp	short xec16		; 0000EBED  EB27  '.',0x27
                  
                  xebef:	and	byte [0x97],0xef	; 0000EBEF  80269700EF  '.&...'
                  	call	xec2e_wait_8042_ready	; 0000EBF4  E83700  '.7.'
                  	mov	al,[0x17]		; 0000EBF7  A01700  '...'
                  	shr	al,0x4			; 0000EBFA  C0E804  '...'
                  	and	al,0x7			; 0000EBFD  2407  '$.'
                  	and	byte [0x97],0xf8	; 0000EBFF  80269700F8  '.&...'
                  	or	[0x97],al		; 0000EC04  08069700  '....'
                  	out	0x60,al			; 0000EC08  E660  '.`'
                  	mov	cx,0xffff		; 0000EC0A  B9FFFF  '...'
                  xec0d:	test	byte [0x97],0x10	; 0000EC0D  F606970010  '.....'
                  	jnz	xec16			; 0000EC12  7502  'u.'
                  	loop	xec0d			; 0000EC14  E2F7  '..'
                  xec16:	and	byte [0x97],0xbf	; 0000EC16  80269700BF  '.&...'
                  xec1b:	pop	cx			; 0000EC1B  59  'Y'
                  	pop	ax			; 0000EC1C  58  'X'
                  	ret				; 0000EC1D  C3  '.'
                  
                  xec1e:	push	ax			; 0000EC1E  50  'P'
                  	cli				; 0000EC1F  FA  '.'
                  	mov	al,[0x97]		; 0000EC20  A09700  '...'
                  	or	al,0x40			; 0000EC23  0C40  '.@'
                  	xchg	al,[0x97]		; 0000EC25  86069700  '....'
                  	test	al,0x40			; 0000EC29  A840  '.@'
                  	sti				; 0000EC2B  FB  '.'
                  	pop	ax			; 0000EC2C  58  'X'
                  	ret				; 0000EC2D  C3  '.'
                  
                  xec2e_wait_8042_ready:
                  
                  xec2e:	push	cx			; 0000EC2E  51  'Q'
                  	mov	cx,0x2710		; 0000EC2F  B91027  '..',0x27
                  xec32:	in	al,0x64			; 0000EC32  E464  '.d'
                  	test	al,0x2			; 0000EC34  A802  '..'
                  	loopne	xec32			; 0000EC36  E0FA  '..'
                  	pop	cx			; 0000EC38  59  'Y'
                  	ret				; 0000EC39  C3  '.'
                  
                    	db	0xFF,0xFF,0xFF,0xFF,0xFF,0x34,0xC9,0x45,0xC9,0xC0,0xEC,0xC0,0xEC,0xC0,0xEC,0xE1
                    	db	0xED,0xA6,0xEC,0xA6,0xEC,0x48,0x9F,0x63,0x91,0x7C,0x8F,0x10,0x90,0x38,0xA0
                  
                  ;
                  ;   This address (F000:EC59) is stored in the IDT vector for INT 0x40 when a hard disk controls INT 0x13
                  ;
                  int13_diskette:
                  	sti				; 0000EC59  FB  '.'
                  	push	bp			; 0000EC5A  55  'U'
                  	push	ds			; 0000EC5B  1E  '.'
                  	push	es			; 0000EC5C  06  '.'
                  	push	di			; 0000EC5D  57  'W'
                  	push	si			; 0000EC5E  56  'V'
                  	push	dx			; 0000EC5F  52  'R'
                  	push	cx			; 0000EC60  51  'Q'
                  	push	bx			; 0000EC61  53  'S'
                  	push	ax			; 0000EC62  50  'P'
                  	mov	bp,sp			; 0000EC63  8BEC  '..'
                  	xor	ax,ax			; 0000EC65  33C0  '3.'
                  	mov	ds,ax			; 0000EC67  8ED8  '..'
                  	les	si,[0x78]		; 0000EC69  C4367800  '.6x.'
                  	mov	ax,0x40			; 0000EC6D  B84000  '.@.'
                  	mov	ds,ax			; 0000EC70  8ED8  '..'
                  	mov	byte [0x40],0xff	; 0000EC72  C6064000FF  '..@..'
                  	and	word [bp+0x16],0xfe	; 0000EC77  816616FE00  '.f...'
                  	mov	al,[bp+0x1]		; 0000EC7C  8A4601  '.F.'
                  	mov	ah,[bp+0x6]		; 0000EC7F  8A6606  '.f.'
                  	cmp	ah,0x2			; 0000EC82  80FC02  '...'
                  	jnc	xeca2			; 0000EC85  731B  's.'
                  	cmp	al,0x18			; 0000EC87  3C18  '<.'
                  	ja	xeca6			; 0000EC89  771B  'w.'
                  	cmp	al,0x8			; 0000EC8B  3C08  '<.'
                  	jna	xec95			; 0000EC8D  7606  'v.'
                  	cmp	al,0x15			; 0000EC8F  3C15  '<.'
                  	jc	xeca6			; 0000EC91  7213  'r.'
                  	sub	al,0xc			; 0000EC93  2C0C  ',.'
                  xec95:	mov	bl,al			; 0000EC95  8AD8  '..'
                  	xor	bh,bh			; 0000EC97  32FF  '2.'
                  	shl	bx,1			; 0000EC99  D1E3  '..'
                  	call	near [cs:bx+0xec3f]	; 0000EC9B  2EFF973FEC  '...?.'
                  	jmp	short xeca9		; 0000ECA0  EB07  '..'
                  
                  xeca2:	cmp	al,0x1			; 0000ECA2  3C01  '<.'
                  	jna	xec95			; 0000ECA4  76EF  'v.'
                  xeca6:	call	xd3e8			; 0000ECA6  E83FE7  '.?.'
                  
                  xeca9:	mov	bl,[es:si+0x2]		; 0000ECA9  268A5C02  '&.\.'
                  	mov	[0x40],bl		; 0000ECAD  881E4000  '..@.'
                  	or	word [bp+0x16],0x200	; 0000ECB1  814E160002  '.N...'
                  	pop	bx			; 0000ECB6  5B  '['
                  	pop	bx			; 0000ECB7  5B  '['
                  	pop	cx			; 0000ECB8  59  'Y'
                  	pop	dx			; 0000ECB9  5A  'Z'
                  	pop	si			; 0000ECBA  5E  '^'
                  	pop	di			; 0000ECBB  5F  '_'
                  	pop	es			; 0000ECBC  07  '.'
                  	pop	ds			; 0000ECBD  1F  '.'
                  	pop	bp			; 0000ECBE  5D  ']'
                  	iret				; 0000ECBF  CF  '.'
                  
                  	call	x8fa4			; 0000ECC0  E8E1A2  '...'
                  	jnz	xecd4			; 0000ECC3  750F  'u.'
                  	call	x9061			; 0000ECC5  E899A3  '...'
                  	jc	xecd4			; 0000ECC8  720A  'r',0x0A
                  ;
                  ;   Perform FDC operation (eg, read); ZF set on success
                  ;
                  	call	xecf0			; 0000ECCA  E82300  '.#.'
                  	jz	xecd4			; 0000ECCD  7405  't.'
                  
                  	or	word [bp+0x16],0x1	; 0000ECCF  814E160100  '.N...'
                  
                  xecd4:	ret				; 0000ECD4  C3  '.'
                  
                  xecd5:	mov	al,0x6			; 0000ECD5  B006  '..'
                  	out	0xa,al			; 0000ECD7  E60A  '.',0x0A
                  	xor	al,al			; 0000ECD9  32C0  '2.'
                  	or	ah,ah			; 0000ECDB  0AE4  0x0A,'.'
                  	jz	xecec			; 0000ECDD  740D  't',0x0D
                  	mov	cx,0x4			; 0000ECDF  B90400  '...'
                  	mov	dl,0x1			; 0000ECE2  B201  '..'
                  xece4:	shl	dl,1			; 0000ECE4  D0E2  '..'
                  	cmp	ah,dl			; 0000ECE6  3AE2  ':.'
                  	loopne	xece4			; 0000ECE8  E0FA  '..'
                  	jnz	xecef			; 0000ECEA  7503  'u.'
                  xecec:	call	xc9dd			; 0000ECEC  E8EEDC  '...'
                  xecef:	ret				; 0000ECEF  C3  '.'
                  
                  xecf0:	cmp	byte [bp+0x1],0x2	; 0000ECF0  807E0102  '.~..'
                  	jnz	xed1e			; 0000ECF4  7528  'u('
                  	mov	ax,[bp+0xc]		; 0000ECF6  8B460C  '.F.'
                  	mov	bx,0x10			; 0000ECF9  BB1000  '...'
                  	mul	bx			; 0000ECFC  F7E3  '..'
                  	add	ax,[bp+0x2]		; 0000ECFE  034602  '.F.'
                  	adc	dx,byte +0x0		; 0000ED01  83D200  '...'
                  	cmp	dl,0xe			; 0000ED04  80FA0E  '...'
                  	jnc	xed1a			; 0000ED07  7311  's.'
                  	mov	bh,[bp+0x0]		; 0000ED09  8A7E00  '.~.'
                  	add	bh,bh			; 0000ED0C  02FF  '..'
                  	xor	bl,bl			; 0000ED0E  32DB  '2.'
                  	add	ax,bx			; 0000ED10  03C3  '..'
                  	adc	dx,byte +0x0		; 0000ED12  83D200  '...'
                  	cmp	dl,0xe			; 0000ED15  80FA0E  '...'
                  	jc	xed1e			; 0000ED18  7204  'r.'
                  xed1a:	mov	byte [bp+0x1],0x4	; 0000ED1A  C6460104  '.F..'
                  xed1e:	cmp	byte [0x41],0x0		; 0000ED1E  803E410000  '.>A..'
                  	jz	xed33			; 0000ED23  740E  't.'
                  	cmp	byte [0x41],0x9		; 0000ED25  803E410009  '.>A..'
                  	jz	xed33			; 0000ED2A  7407  't.'
                  	call	xca03			; 0000ED2C  E8D4DC  '...'
                  	or	ah,ah			; 0000ED2F  0AE4  0x0A,'.'
                  	jnz	xed5b			; 0000ED31  7528  'u('
                  xed33:	xor	ax,ax			; 0000ED33  33C0  '3.'
                  	mov	al,[bp+0x0]		; 0000ED35  8A4600  '.F.'
                  	mov	cl,[es:si+0x3]		; 0000ED38  268A4C03  '&.L.'
                  	mov	dx,0x80			; 0000ED3C  BA8000  '...'
                  	shl	dx,cl			; 0000ED3F  D3E2  '..'
                  	mul	dx			; 0000ED41  F7E2  '..'
                  	dec	ax			; 0000ED43  48  'H'
                  	mov	cx,ax			; 0000ED44  8BC8  '..'
                  	call	xca4f			; 0000ED46  E806DD  '...'
                  	add	ax,bx			; 0000ED49  03C3  '..'
                  	jnc	xed5e			; 0000ED4B  7311  's.'
                  	mov	al,[bp+0x1]		; 0000ED4D  8A4601  '.F.'
                  	test	al,0x4			; 0000ED50  A804  '..'
                  	jnz	xed5e			; 0000ED52  750A  'u',0x0A
                  	mov	ah,0x9			; 0000ED54  B409  '..'
                  	or	word [bp+0x16],0x1	; 0000ED56  814E160100  '.N...'
                  xed5b:	jmp	short xedd7		; 0000ED5B  EB7A  '.z'
                  
                  	nop				; 0000ED5D  90  '.'
                  xed5e:	call	xee9c			; 0000ED5E  E83B01  '.;.'
                  	jnz	xedd7			; 0000ED61  7574  'ut'
                  	xor	bh,bh			; 0000ED63  32FF  '2.'
                  	mov	bl,[bp+0x1]		; 0000ED65  8A5E01  '.^.'
                  	shl	bx,1			; 0000ED68  D1E3  '..'
                  	mov	ax,[cs:bx+0xefd1]	; 0000ED6A  2E8B87D1EF  '.....'
                  	out	0xb,al			; 0000ED6F  E60B  '..'
                  	mov	al,0x2			; 0000ED71  B002  '..'
                  	jmp	short xed75		; 0000ED73  EB00  '..'
                  
                  xed75:	out	0xa,al			; 0000ED75  E60A  '.',0x0A
                  	mov	bh,ah			; 0000ED77  8AFC  '..'
                  	call	xd4c4			; 0000ED79  E848E7  '.H.'
                  	call	xca78			; 0000ED7C  E8F9DC  '...'
                  	mov	bh,[bp+0x7]		; 0000ED7F  8A7E07  '.~.'
                  	call	xd4c4			; 0000ED82  E83FE7  '.?.'
                  	mov	bh,[bp+0x4]		; 0000ED85  8A7E04  '.~.'
                  	call	xd4c4			; 0000ED88  E839E7  '.9.'
                  	add	si,byte +0x3		; 0000ED8B  83C603  '...'
                  	call	xd4d0			; 0000ED8E  E83FE7  '.?.'
                  	inc	si			; 0000ED91  46  'F'
                  	inc	si			; 0000ED92  46  'F'
                  	cmp	byte [bp+0x1],0x5	; 0000ED93  807E0105  '.~..'
                  	jnz	xed9e			; 0000ED97  7505  'u.'
                  	call	xd4d0			; 0000ED99  E834E7  '.4.'
                  	jmp	short xedb8		; 0000ED9C  EB1A  '..'
                  
                  xed9e:	mov	al,[0x8b]		; 0000ED9E  A08B00  '...'
                  	mov	bh,0x1b			; 0000EDA1  B71B  '..'
                  	and	al,0xc0			; 0000EDA3  24C0  '$.'
                  	jz	xedaf			; 0000EDA5  7408  't.'
                  	mov	bh,0x23			; 0000EDA7  B723  '.#'
                  	test	al,0x40			; 0000EDA9  A840  '.@'
                  	jnz	xedaf			; 0000EDAB  7502  'u.'
                  	mov	bh,0x2a			; 0000EDAD  B72A  '.*'
                  xedaf:	call	xd4c4			; 0000EDAF  E812E7  '...'
                  	mov	bh,[si+0x1]		; 0000EDB2  8A7C01  '.|.'
                  	call	xd4c4			; 0000EDB5  E80CE7  '...'
                  xedb8:	sub	si,byte +0x5		; 0000EDB8  83EE05  '...'
                  
                  xedbb:	call	xef85			; 0000EDBB  E8C701  '...'
                  	jnz	xedd7			; 0000EDBE  7517  'u.'
                  ;
                  ;   Read 7 FDC response bytes, starting with ST0, storing them at 0x40:0x42
                  ;
                  	mov	cx,0x7			; 0000EDC0  B90700  '...'
                  	mov	di,0x42			; 0000EDC3  BF4200  '.B.'
                  
                  xedc6:	call	xc9bf			; 0000EDC6  E8F6DB  '...'
                  	jz	xedc6			; 0000EDC9  74FB  't.'
                  	call	x919a			; 0000EDCB  E8CCA3  '...'
                  	in	al,dx			; 0000EDCE  EC  '.'
                  	mov	[di],al			; 0000EDCF  8805  '..'
                  	inc	di			; 0000EDD1  47  'G'
                  	loop	xedc6			; 0000EDD2  E2F2  '..'
                  ;
                  ;   If the FDC's response in ST0 is good, this will return (AH) == 0x00
                  ;
                  	call	xd50f			; 0000EDD4  E838E7  '.8.'
                  
                  xedd7:	mov	[0x41],ah		; 0000EDD7  88264100  '.&A.'
                  ;
                  ;   This appears to validate the rest of the FDC response bytes; (AX) should be zero on success
                  ;
                  	call	xecd5			; 0000EDDB  E8F7FE  '...'
                  
                  	or	ah,ah			; 0000EDDE  0AE4  0x0A,'.'
                  	ret				; 0000EDE0  C3  '.'
                  
                  	push	ds			; 0000EDE1  1E  '.'
                  	push	cx			; 0000EDE2  51  'Q'
                  	push	si			; 0000EDE3  56  'V'
                  	cld				; 0000EDE4  FC  '.'
                  	mov	cx,0x10			; 0000EDE5  B91000  '...'
                  	xor	ax,ax			; 0000EDE8  33C0  '3.'
                  	mov	ds,ax			; 0000EDEA  8ED8  '..'
                  	rep	lodsb			; 0000EDEC  F3AC  '..'
                  	pop	si			; 0000EDEE  5E  '^'
                  	push	si			; 0000EDEF  56  'V'
                  	mov	cx,0x10			; 0000EDF0  B91000  '...'
                  	mov	ax,0x1000		; 0000EDF3  B80010  '...'
                  	mov	ds,ax			; 0000EDF6  8ED8  '..'
                  	rep	lodsb			; 0000EDF8  F3AC  '..'
                  	pop	si			; 0000EDFA  5E  '^'
                  	pop	cx			; 0000EDFB  59  'Y'
                  	pop	ds			; 0000EDFC  1F  '.'
                  	call	x8fa4			; 0000EDFD  E8A4A1  '...'
                  	jnz	xee68			; 0000EE00  7566  'uf'
                  	call	x9190			; 0000EE02  E88BA3  '...'
                  	mov	ah,[bx]			; 0000EE05  8A27  '.',0x27
                  	test	ah,0x10			; 0000EE07  F6C410  '...'
                  	jnz	xee19			; 0000EE0A  750D  'u',0x0D
                  	cmp	ah,0x87			; 0000EE0C  80FC87  '...'
                  	jnz	xee14			; 0000EE0F  7503  'u.'
                  	sub	ah,0x3			; 0000EE11  80EC03  '...'
                  xee14:	add	ah,0x13			; 0000EE14  80C413  '...'
                  	mov	[bx],ah			; 0000EE17  8827  '.',0x27
                  xee19:	call	xd490			; 0000EE19  E874E6  '.t.'
                  	mov	al,0x4a			; 0000EE1C  B04A  '.J'
                  	out	0xb,al			; 0000EE1E  E60B  '..'
                  	mov	cx,0xffff		; 0000EE20  B9FFFF  '...'
                  	call	xca4f			; 0000EE23  E829DC  '.).'
                  	mov	al,0x4			; 0000EE26  B004  '..'
                  	xor	ah,ah			; 0000EE28  32E4  '2.'
                  	mul	byte [bp+0x0]		; 0000EE2A  F66600  '.f.'
                  	add	ax,bx			; 0000EE2D  03C3  '..'
                  	jnc	xee35			; 0000EE2F  7304  's.'
                  	mov	ah,0x9			; 0000EE31  B409  '..'
                  	jmp	short xee63		; 0000EE33  EB2E  '..'
                  
                  xee35:	call	xee9c			; 0000EE35  E86400  '.d.'
                  	jnz	xee68			; 0000EE38  752E  'u.'
                  	mov	al,0x2			; 0000EE3A  B002  '..'
                  	out	0xa,al			; 0000EE3C  E60A  '.',0x0A
                  	mov	bh,0x4d			; 0000EE3E  B74D  '.M'
                  	call	xd4c4			; 0000EE40  E881E6  '...'
                  	mov	bh,[bp+0x7]		; 0000EE43  8A7E07  '.~.'
                  	shl	bh,0x2			; 0000EE46  C0E702  '...'
                  	or	bh,[bp+0x6]		; 0000EE49  0A7E06  0x0A,'~.'
                  	call	xd4c4			; 0000EE4C  E875E6  '.u.'
                  	add	si,byte +0x3		; 0000EE4F  83C603  '...'
                  	call	xd4d0			; 0000EE52  E87BE6  '.{.'
                  	add	si,byte +0x4		; 0000EE55  83C604  '...'
                  	call	xd4d0			; 0000EE58  E875E6  '.u.'
                  	sub	si,byte +0x7		; 0000EE5B  83EE07  '...'
                  	call	xedbb			; 0000EE5E  E85AFF  '.Z.'
                  	jz	xee71			; 0000EE61  740E  't.'
                  xee63:	or	word [bp+0x16],0x1	; 0000EE63  814E160100  '.N...'
                  xee68:	mov	[0x41],ah		; 0000EE68  88264100  '.&A.'
                  	call	xecd5			; 0000EE6C  E866FE  '.f.'
                  	or	ah,ah			; 0000EE6F  0AE4  0x0A,'.'
                  xee71:	ret				; 0000EE71  C3  '.'
                  
                  xee72:	call	xc956			; 0000EE72  E8E1DA  '...'
                  	mov	cx,0x64			; 0000EE75  B96400  '.d.'
                  xee78:	call	xc9bf			; 0000EE78  E844DB  '.D.'
                  	jz	xee83			; 0000EE7B  7406  't.'
                  	loop	xee78			; 0000EE7D  E2F9  '..'
                  	mov	ah,0x80			; 0000EE7F  B480  '..'
                  	jmp	short xee9b		; 0000EE81  EB18  '..'
                  
                  xee83:	call	x919a			; 0000EE83  E814A3  '...'
                  	mov	al,0x7			; 0000EE86  B007  '..'
                  	out	dx,al			; 0000EE88  EE  '.'
                  	mov	bh,[bp+0x6]		; 0000EE89  8A7E06  '.~.'
                  	call	xd4c4			; 0000EE8C  E835E6  '.5.'
                  	call	xef85			; 0000EE8F  E8F300  '...'
                  	jnz	xee9b			; 0000EE92  7507  'u.'
                  	call	xef6f			; 0000EE94  E8D800  '...'
                  	test	al,0xc0			; 0000EE97  A8C0  '..'
                  	mov	ah,0x80			; 0000EE99  B480  '..'
                  xee9b:	ret				; 0000EE9B  C3  '.'
                  
                  xee9c:	mov	al,0x1			; 0000EE9C  B001  '..'
                  	mov	cl,[bp+0x6]		; 0000EE9E  8A4E06  '.N.'
                  	shl	al,cl			; 0000EEA1  D2E0  '..'
                  	test	[0x3e],al		; 0000EEA3  84063E00  '..>.'
                  	jnz	xeec4			; 0000EEA7  751B  'u.'
                  	or	[0x3e],al		; 0000EEA9  08063E00  '..>.'
                  	call	x9190			; 0000EEAD  E8E0A2  '...'
                  	mov	byte [bx+0x4],0x0	; 0000EEB0  C6470400  '.G..'
                  	call	xee72			; 0000EEB4  E8BBFF  '...'
                  	jz	xeec4			; 0000EEB7  740B  't.'
                  	and	al,0x70			; 0000EEB9  2470  '$p'
                  	cmp	al,0x70			; 0000EEBB  3C70  '<p'
                  	jnz	xef3e			; 0000EEBD  757F  'u.'
                  	call	xee72			; 0000EEBF  E8B0FF  '...'
                  	jnz	xef3e			; 0000EEC2  757A  'uz'
                  xeec4:	call	xc956			; 0000EEC4  E88FDA  '...'
                  	call	x9190			; 0000EEC7  E8C6A2  '...'
                  	mov	ah,[bx]			; 0000EECA  8A27  '.',0x27
                  	mov	al,[bp+0x5]		; 0000EECC  8A4605  '.F.'
                  	test	ah,0x20			; 0000EECF  F6C420  '.. '
                  	jz	xeed6			; 0000EED2  7402  't.'
                  	shl	al,1			; 0000EED4  D0E0  '..'
                  xeed6:	mov	cl,[bx+0x4]		; 0000EED6  8A4F04  '.O.'
                  	xor	ah,ah			; 0000EED9  32E4  '2.'
                  	cmp	al,cl			; 0000EEDB  3AC1  ':.'
                  	jz	xef3e			; 0000EEDD  745F  't_'
                  	mov	[bx+0x4],al		; 0000EEDF  884704  '.G.'
                  	push	bx			; 0000EEE2  53  'S'
                  	mov	bx,0x4			; 0000EEE3  BB0400  '...'
                  	call	xc638			; 0000EEE6  E84FD7  '.O.'
                  	pop	bx			; 0000EEE9  5B  '['
                  	cli				; 0000EEEA  FA  '.'
                  	mov	bh,0xf			; 0000EEEB  B70F  '..'
                  	call	xd4c4			; 0000EEED  E8D4E5  '...'
                  	mov	bh,[bp+0x7]		; 0000EEF0  8A7E07  '.~.'
                  	shl	bh,0x2			; 0000EEF3  C0E702  '...'
                  	or	bh,[bp+0x6]		; 0000EEF6  0A7E06  0x0A,'~.'
                  	call	xd4c4			; 0000EEF9  E8C8E5  '...'
                  	call	x9190			; 0000EEFC  E891A2  '...'
                  	mov	bh,[bx+0x4]		; 0000EEFF  8A7F04  '...'
                  	call	xd4c4			; 0000EF02  E8BFE5  '...'
                  	sti				; 0000EF05  FB  '.'
                  	call	xef85			; 0000EF06  E87C00  '.|.'
                  	jnz	xef3e			; 0000EF09  7533  'u3'
                  	xor	bx,bx			; 0000EF0B  33DB  '3.'
                  	mov	bl,[es:si+0x9]		; 0000EF0D  268A5C09  '&.\.'
                  	mov	al,[bp+0x1]		; 0000EF11  8A4601  '.F.'
                  	cmp	al,0x3			; 0000EF14  3C03  '<.'
                  	jz	xef1c			; 0000EF16  7404  't.'
                  	cmp	al,0x5			; 0000EF18  3C05  '<.'
                  	jnz	xef30			; 0000EF1A  7514  'u.'
                  xef1c:	push	bx			; 0000EF1C  53  'S'
                  	call	x9163			; 0000EF1D  E843A2  '.C.'
                  	pop	bx			; 0000EF20  5B  '['
                  	mov	al,0x14			; 0000EF21  B014  '..'
                  	cmp	ah,0x2			; 0000EF23  80FC02  '...'
                  	jnz	xef2a			; 0000EF26  7502  'u.'
                  	mov	al,0xf			; 0000EF28  B00F  '..'
                  xef2a:	cmp	bl,al			; 0000EF2A  3AD8  ':.'
                  	jnc	xef30			; 0000EF2C  7302  's.'
                  	xchg	al,bl			; 0000EF2E  86C3  '..'
                  xef30:	or	bx,bx			; 0000EF30  0BDB  '..'
                  	jz	xef37			; 0000EF32  7403  't.'
                  	call	xc638			; 0000EF34  E801D7  '...'
                  xef37:	call	xef6f			; 0000EF37  E83500  '.5.'
                  	test	al,0xc0			; 0000EF3A  A8C0  '..'
                  	mov	ah,0x40			; 0000EF3C  B440  '.@'
                  xef3e:	ret				; 0000EF3E  C3  '.'
                  
                  	db	'************************P'
                  
                  	push	ds			; 0000EF58  1E  '.'
                  	mov	ax,0x40			; 0000EF59  B84000  '.@.'
                  	mov	ds,ax			; 0000EF5C  8ED8  '..'
                  	or	byte [0x3e],0x80	; 0000EF5E  800E3E0080  '..>..'
                  	mov	al,0x20			; 0000EF63  B020  '. '
                  	out	0x20,al			; 0000EF65  E620  '. '
                  	mov	ax,0x9101		; 0000EF67  B80191  '...'
                  	int	0x15			; 0000EF6A  CD15  '..'
                  	pop	ds			; 0000EF6C  1F  '.'
                  	pop	ax			; 0000EF6D  58  'X'
                  	iret				; 0000EF6E  CF  '.'
                  
                  xef6f:	mov	bh,0x8			; 0000EF6F  B708  '..'
                  	call	xd4c4			; 0000EF71  E850E5  '.P.'
                  	mov	cx,0x2			; 0000EF74  B90200  '...'
                  	jmp	short xef7c		; 0000EF77  EB03  '..'
                  
                  xef79:	mov	[0x42],al		; 0000EF79  A24200  '.B.'
                  xef7c:	call	xd4ba			; 0000EF7C  E83BE5  '.;.'
                  	loop	xef79			; 0000EF7F  E2F8  '..'
                  	mov	al,[0x42]		; 0000EF81  A04200  '.B.'
                  	ret				; 0000EF84  C3  '.'
                  
                  xef85:	clc				; 0000EF85  F8  '.'
                  	mov	ax,0x9001		; 0000EF86  B80190  '...'
                  	int	0x15			; 0000EF89  CD15  '..'
                  	jnc	xef98			; 0000EF8B  730B  's.'
                  	test	byte [0x3e],0x80	; 0000EF8D  F6063E0080  '..>..'
                  	jz	xefaf			; 0000EF92  741B  't.'
                  	xor	ah,ah			; 0000EF94  32E4  '2.'
                  	jmp	short xefb4		; 0000EF96  EB1C  '..'
                  
                  xef98:	mov	bx,0x4			; 0000EF98  BB0400  '...'
                  xef9b:	mov	cx,0x3d09		; 0000EF9B  B9093D  '..='
                  	xor	ax,ax			; 0000EF9E  33C0  '3.'
                  xefa0:	test	byte [0x3e],0x80	; 0000EFA0  F6063E0080  '..>..'
                  	jnz	xefb4			; 0000EFA5  750D  'u',0x0D
                  	call	x919a			; 0000EFA7  E8F0A1  '...'
                  	loop	xefa0			; 0000EFAA  E2F4  '..'
                  	dec	bx			; 0000EFAC  4B  'K'
                  	jnz	xef9b			; 0000EFAD  75EC  'u.'
                  xefaf:	call	xca03			; 0000EFAF  E851DA  '.Q.'
                  	mov	ah,0x80			; 0000EFB2  B480  '..'
                  xefb4:	and	byte [0x3e],0x7f	; 0000EFB4  80263E007F  '.&>..'
                  	or	ah,ah			; 0000EFB9  0AE4  0x0A,'.'
                  	ret				; 0000EFBB  C3  '.'
                  
                  	db	'**********'
                  
                  	sub	bl,bh			; 0000EFC6  2ADF  '*.'
                  	add	ah,[di]			; 0000EFC8  0225  '.%'
                  	add	cl,[bx]			; 0000EFCA  020F  '..'
                  	sbb	di,di			; 0000EFCC  1BFF  '..'
                  	push	sp			; 0000EFCE  54  'T'
                  	db	0xF6			; 0000EFCF  F6  '.'
                  	invd				; 0000EFD0  0F08  '..'
                  	jmp	x88ea			; 0000EFD2  E91599  '...'
                  
                  	inc	si			; 0000EFD5  46  'F'
                  	out	0x4a,al			; 0000EFD6  E64A  '.J'
                  	lds	ax,[bp+si-0x1a]		; 0000EFD8  C542E6  '.B.'
                  
                  xefdb:	mov	bh,0x3			; 0000EFDB  B703  '..'
                  	call	xd4c4			; 0000EFDD  E8E4E4  '...'
                  	call	xd4d0			; 0000EFE0  E8EDE4  '...'
                  	ret				; 0000EFE3  C3  '.'
                  
                  	times	65 db 0xFF		; 0000EFE4 - 0000F024
                  
                  xf025:	cmp	ah,0x14			; 0000F025  80FC14  '...'
                  	jc	xf031			; 0000F028  7207  'r.'
                  	cmp	ah,0xbf			; 0000F02A  80FCBF  '...'
                  	jnz	xf062			; 0000F02D  7533  'u3'
                  	mov	ah,0x14			; 0000F02F  B414  '..'
                  xf031:	cld				; 0000F031  FC  '.'
                  	mov	bp,sp			; 0000F032  8BEC  '..'
                  	mov	si,0x40			; 0000F034  BE4000  '.@.'
                  	mov	ds,si			; 0000F037  8EDE  '..'
                  	mov	dl,[0x10]		; 0000F039  8A161000  '....'
                  	and	dl,0x30			; 0000F03D  80E230  '..0'
                  	mov	si,0xb800		; 0000F040  BE00B8  '...'
                  	cmp	dl,0x30			; 0000F043  80FA30  '..0'
                  	jnz	xf04b			; 0000F046  7503  'u.'
                  	mov	si,0xb000		; 0000F048  BE00B0  '...'
                  xf04b:	mov	dx,[0x63]		; 0000F04B  8B166300  '..c.'
                  	mov	es,si			; 0000F04F  8EC6  '..'
                  	xchg	al,ah			; 0000F051  86C4  '..'
                  	mov	si,ax			; 0000F053  8BF0  '..'
                  	xchg	al,ah			; 0000F055  86C4  '..'
                  	and	si,0xff			; 0000F057  81E6FF00  '....'
                  	shl	si,1			; 0000F05B  D1E6  '..'
                  	call	near [cs:si+0x97c6]	; 0000F05D  2EFF94C697  '.....'
                  xf062:	jmp	x97f0			; 0000F062  E98BA7  '...'
                  
                  xf065:	sti				; 0000F065  FB  '.'
                  	push	es			; 0000F066  06  '.'
                  	push	ds			; 0000F067  1E  '.'
                  	push	bp			; 0000F068  55  'U'
                  	push	di			; 0000F069  57  'W'
                  	push	si			; 0000F06A  56  'V'
                  	push	bx			; 0000F06B  53  'S'
                  	push	cx			; 0000F06C  51  'Q'
                  	push	dx			; 0000F06D  52  'R'
                  	push	ax			; 0000F06E  50  'P'
                  	jmp	short xf025		; 0000F06F  EBB4  '..'
                  
                  	times	47 db 0xFF		; 0000F071 - 0000F09F
                  
                  	db	0xFF,0xFF,0xFF,0xFF,0x38,0x28,0x2D,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07	; 0000F0A0
                  	db	0x00,0x00,0x00,0x00,0x71,0x50,0x5A,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07 ; 0000F0B0
                  	db	0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x7F,0x06,0x64,0x70,0x02,0x01,0x06,0x07 ; 0000F0C0
                  	db	0x00,0x00,0x00,0x00,0x61,0x50,0x52,0x0F,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F0D0
                  	db	0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x1F,0x06,0x19,0x1C,0x02,0x07,0x06,0x07 ; 0000F0E0
                  	db	0x00,0x00,0x00,0x00,0x71,0x50,0x5A,0x0A,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F0F0
                  	db	0x00,0x00,0x00,0x00,0x38,0x28,0x2D,0x0A,0x7F,0x06,0x64,0x70,0x02,0x01,0x06,0x07 ; 0000F100
                  	db	0x00,0x00,0x00,0x00,0x61,0x50,0x52,0x0F,0x19,0x06,0x19,0x19,0x02,0x0D,0x0B,0x0C ; 0000F110
                  
                  	times	8 dw 0x0000		; 0000F120 - 0000F12E
                  
                  xf130:	push	bp			; 0000F130  55  'U'
                  	push	ds			; 0000F131  1E  '.'
                  	push	es			; 0000F132  06  '.'
                  	push	ax			; 0000F133  50  'P'
                  	push	bx			; 0000F134  53  'S'
                  	push	cx			; 0000F135  51  'Q'
                  	push	dx			; 0000F136  52  'R'
                  	push	si			; 0000F137  56  'V'
                  	push	di			; 0000F138  57  'W'
                  	mov	al,0xe0			; 0000F139  B0E0  '..'
                  	out	0x84,al			; 0000F13B  E684  '..'
                  	cld				; 0000F13D  FC  '.'
                  	call	xf30a			; 0000F13E  E8C901  '...'
                  	mov	bx,0x0			; 0000F141  BB0000  '...'
                  	mov	ax,0xe000		; 0000F144  B800E0  '...'
                  	mov	ds,ax			; 0000F147  8ED8  '..'
                  	mov	ax,0xaa55		; 0000F149  B855AA  '.U.'
                  	cmp	ax,[0x0]		; 0000F14C  3B060000  ';...'
                  	jnz	xf1ac			; 0000F150  755A  'uZ'
                  	xor	ch,ch			; 0000F152  32ED  '2.'
                  	mov	cl,[0x2]		; 0000F154  8A0E0200  '....'
                  	shl	cx,0x9			; 0000F158  C1E109  '...'
                  	mov	si,0x0			; 0000F15B  BE0000  '...'
                  	call	xf2b0			; 0000F15E  E84F01  '.O.'
                  	jnz	xf1ac			; 0000F161  7549  'uI'
                  	mov	bx,cx			; 0000F163  8BD9  '..'
                  	sub	sp,byte +0x48		; 0000F165  83EC48  '..H'
                  	mov	bp,sp			; 0000F168  8BEC  '..'
                  	mov	ax,ss			; 0000F16A  8CD0  '..'
                  	mov	es,ax			; 0000F16C  8EC0  '..'
                  	mov	di,bp			; 0000F16E  8BFD  '..'
                  	xor	ax,ax			; 0000F170  33C0  '3.'
                  	mov	cx,0x48			; 0000F172  B94800  '.H.'
                  	rep	stosb			; 0000F175  F3AA  '..'
                  	mov	si,bp			; 0000F177  8BF5  '..'
                  	lea	di,[si+0x10]		; 0000F179  8D7C10  '.|.'
                  	mov	byte [es:di+0x4],0xe	; 0000F17C  26C645040E  '&.E..'
                  	mov	word [es:di],0xffff	; 0000F181  26C705FFFF  '&....'
                  	mov	byte [es:di+0x5],0x9a	; 0000F186  26C645059A  '&.E..'
                  	lea	di,[si+0x18]		; 0000F18B  8D7C18  '.|.'
                  	mov	byte [es:di+0x4],0xfe	; 0000F18E  26C64504FE  '&.E..'
                  	mov	word [es:di],0xffff	; 0000F193  26C705FFFF  '&....'
                  	mov	byte [es:di+0x5],0x92	; 0000F198  26C6450592  '&.E..'
                  	mov	ah,0x87			; 0000F19D  B487  '..'
                  	mov	cx,bx			; 0000F19F  8BCB  '..'
                  	shr	cx,1			; 0000F1A1  D1E9  '..'
                  	int	0x15			; 0000F1A3  CD15  '..'
                  	add	sp,byte +0x48		; 0000F1A5  83C448  '..H'
                  	mov	al,0xe1			; 0000F1A8  B0E1  '..'
                  	out	0x84,al			; 0000F1AA  E684  '..'
                  xf1ac:	mov	al,0xe2			; 0000F1AC  B0E2  '..'
                  	out	0x84,al			; 0000F1AE  E684  '..'
                  	mov	ax,0xc000		; 0000F1B0  B800C0  '...'
                  	mov	ds,ax			; 0000F1B3  8ED8  '..'
                  	mov	ax,0xaa55		; 0000F1B5  B855AA  '.U.'
                  	cmp	ax,[0x0]		; 0000F1B8  3B060000  ';...'
                  	jnz	xf1f9			; 0000F1BC  753B  'u;'
                  	call	xf2c0			; 0000F1BE  E8FF00  '...'
                  	jnz	xf1f9			; 0000F1C1  7536  'u6'
                  	xor	ch,ch			; 0000F1C3  32ED  '2.'
                  	mov	cl,[0x2]		; 0000F1C5  8A0E0200  '....'
                  	shl	cx,0x9			; 0000F1C9  C1E109  '...'
                  	mov	ax,0xffff		; 0000F1CC  B8FFFF  '...'
                  	cmp	bx,ax			; 0000F1CF  3BD8  ';.'
                  	jz	xf1f9			; 0000F1D1  7426  't&'
                  	sub	ax,bx			; 0000F1D3  2BC3  '+.'
                  	cmp	ax,cx			; 0000F1D5  3BC1  ';.'
                  	jc	0xf1f9			; 0000F1D7  7220  'r '
                  	add	bx,byte +0xf		; 0000F1D9  83C30F  '...'
                  	and	bx,0xfff0		; 0000F1DC  81E3F0FF  '....'
                  	mov	ax,0xffff		; 0000F1E0  B8FFFF  '...'
                  	sub	ax,bx			; 0000F1E3  2BC3  '+.'
                  	cmp	ax,cx			; 0000F1E5  3BC1  ';.'
                  	jc	xf1f9			; 0000F1E7  7210  'r.'
                  	mov	si,0x0			; 0000F1E9  BE0000  '...'
                  	call	xf2b0			; 0000F1EC  E8C100  '...'
                  	jnz	xf1f9			; 0000F1EF  7508  'u.'
                  	shr	cx,1			; 0000F1F1  D1E9  '..'
                  	call	xf298			; 0000F1F3  E8A200  '...'
                  	call	xf20c			; 0000F1F6  E81300  '...'
                  xf1f9:	call	xf305			; 0000F1F9  E80901  '...'
                  	call	xf273			; 0000F1FC  E87400  '.t.'
                  	call	xf2eb			; 0000F1FF  E8E900  '...'
                  	pop	di			; 0000F202  5F  '_'
                  	pop	si			; 0000F203  5E  '^'
                  	pop	dx			; 0000F204  5A  'Z'
                  	pop	cx			; 0000F205  59  'Y'
                  	pop	bx			; 0000F206  5B  '['
                  	pop	ax			; 0000F207  58  'X'
                  	pop	es			; 0000F208  07  '.'
                  	pop	ds			; 0000F209  1F  '.'
                  	pop	bp			; 0000F20A  5D  ']'
                  	ret				; 0000F20B  C3  '.'
                  
                  xf20c:	push	ds			; 0000F20C  1E  '.'
                  	call	xf305			; 0000F20D  E8F500  '...'
                  	mov	ax,0x0			; 0000F210  B80000  '...'
                  	mov	es,ax			; 0000F213  8EC0  '..'
                  	mov	ax,cs			; 0000F215  8CC8  '..'
                  	mov	ds,ax			; 0000F217  8ED8  '..'
                  	mov	di,0x40			; 0000F219  BF4000  '.@.'
                  	mov	ax,[es:di]		; 0000F21C  268B05  '&..'
                  	mov	[0x7124],ax		; 0000F21F  A32471  '.$q'
                  	add	di,byte +0x2		; 0000F222  83C702  '...'
                  	mov	ax,[es:di]		; 0000F225  268B05  '&..'
                  	mov	[0x7126],ax		; 0000F228  A32671  '.&q'
                  	shr	bx,0x4			; 0000F22B  C1EB04  '...'
                  	add	bx,0xe000		; 0000F22E  81C300E0  '....'
                  	mov	[es:di],bx		; 0000F232  26891D  '&..'
                  	mov	di,0x7c			; 0000F235  BF7C00  '.|.'
                  	mov	ax,[es:di]		; 0000F238  268B05  '&..'
                  	mov	[0x7128],ax		; 0000F23B  A32871  '.(q'
                  	add	di,byte +0x2		; 0000F23E  83C702  '...'
                  	mov	ax,[es:di]		; 0000F241  268B05  '&..'
                  	mov	[0x712a],ax		; 0000F244  A32A71  '.*q'
                  	mov	[es:di],bx		; 0000F247  26891D  '&..'
                  	mov	di,0x10c		; 0000F24A  BF0C01  '...'
                  	mov	ax,[es:di]		; 0000F24D  268B05  '&..'
                  	mov	[0x712c],ax		; 0000F250  A32C71  '.,q'
                  	add	di,byte +0x2		; 0000F253  83C702  '...'
                  	mov	ax,[es:di]		; 0000F256  268B05  '&..'
                  	mov	[0x712e],ax		; 0000F259  A32E71  '..q'
                  	mov	[es:di],bx		; 0000F25C  26891D  '&..'
                  	mov	al,0xe3			; 0000F25F  B0E3  '..'
                  	out	0x84,al			; 0000F261  E684  '..'
                  	pop	ds			; 0000F263  1F  '.'
                  	xor	ch,ch			; 0000F264  32ED  '2.'
                  	mov	cl,[0x2]		; 0000F266  8A0E0200  '....'
                  	shl	cx,0x9			; 0000F26A  C1E109  '...'
                  	shl	bx,0x4			; 0000F26D  C1E304  '...'
                  	add	bx,cx			; 0000F270  03D9  '..'
                  	ret				; 0000F272  C3  '.'
                  
                  xf273:	cmp	bx,byte +0x0		; 0000F273  83FB00  '...'
                  	jz	xf297			; 0000F276  741F  't.'
                  	dec	bx			; 0000F278  4B  'K'
                  	add	bx,0xfff		; 0000F279  81C3FF0F  '....'
                  	and	bx,0xf000		; 0000F27D  81E300F0  '....'
                  	shr	bx,0xc			; 0000F281  C1EB0C  '...'
                  	mov	ax,0x10			; 0000F284  B81000  '...'
                  	sub	ax,bx			; 0000F287  2BC3  '+.'
                  	mov	cx,0xf000		; 0000F289  B900F0  '...'
                  	mov	es,cx			; 0000F28C  8EC1  '..'
                  	mov	di,bim_table_offset	; 0000F28E  BFE0FF  '...'
                  	mov	di,[es:di]		; 0000F291  268B3D  '&.='
                  	mov	[es:di],al		; 0000F294  268805  '&..'
                  xf297:	ret				; 0000F297  C3  '.'
                  
                  xf298:	call	xf305			; 0000F298  E86A00  '.j.'
                  	xor	si,si			; 0000F29B  33F6  '3.'
                  	mov	ax,0xe000		; 0000F29D  B800E0  '...'
                  	mov	es,ax			; 0000F2A0  8EC0  '..'
                  	mov	di,bx			; 0000F2A2  8BFB  '..'
                  	xor	ch,ch			; 0000F2A4  32ED  '2.'
                  	mov	cl,[0x2]		; 0000F2A6  8A0E0200  '....'
                  	shl	cx,0x8			; 0000F2AA  C1E108  '...'
                  	rep	movsw			; 0000F2AD  F3A5  '..'
                  	ret				; 0000F2AF  C3  '.'
                  
                  xf2b0:	push	ax			; 0000F2B0  50  'P'
                  	push	cx			; 0000F2B1  51  'Q'
                  	push	dx			; 0000F2B2  52  'R'
                  	xor	dx,dx			; 0000F2B3  33D2  '3.'
                  xf2b5:	lodsb				; 0000F2B5  AC  '.'
                  	add	dl,al			; 0000F2B6  02D0  '..'
                  	loop	xf2b5			; 0000F2B8  E2FB  '..'
                  	test	dl,dl			; 0000F2BA  84D2  '..'
                  	pop	dx			; 0000F2BC  5A  'Z'
                  	pop	cx			; 0000F2BD  59  'Y'
                  	pop	ax			; 0000F2BE  58  'X'
                  	ret				; 0000F2BF  C3  '.'
                  
                  xf2c0:	push	ds			; 0000F2C0  1E  '.'
                  	push	es			; 0000F2C1  06  '.'
                  	push	si			; 0000F2C2  56  'V'
                  	push	di			; 0000F2C3  57  'W'
                  	push	cx			; 0000F2C4  51  'Q'
                  	mov	cx,0xc000		; 0000F2C5  B900C0  '...'
                  	mov	es,cx			; 0000F2C8  8EC1  '..'
                  	xor	ch,ch			; 0000F2CA  32ED  '2.'
                  	mov	cl,[es:0x2]		; 0000F2CC  268A0E0200  '&....'
                  	shl	cx,0x9			; 0000F2D1  C1E109  '...'
                  	sub	cx,byte +0x16		; 0000F2D4  83E916  '...'
                  	mov	di,cx			; 0000F2D7  8BF9  '..'
                  	mov	cx,cs			; 0000F2D9  8CC9  '..'
                  	mov	ds,cx			; 0000F2DB  8ED9  '..'
                  	mov	si,0xe02e		; 0000F2DD  BE2EE0  '...'
                  	mov	cx,0x3			; 0000F2E0  B90300  '...'
                  	repe	cmpsw			; 0000F2E3  F3A7  '..'
                  	pop	cx			; 0000F2E5  59  'Y'
                  	pop	di			; 0000F2E6  5F  '_'
                  	pop	si			; 0000F2E7  5E  '^'
                  	pop	es			; 0000F2E8  07  '.'
                  	pop	ds			; 0000F2E9  1F  '.'
                  	ret				; 0000F2EA  C3  '.'
                  
                  xf2eb:	push	bx			; 0000F2EB  53  'S'
                  	mov	bl,0xfc			; 0000F2EC  B3FC  '..'
                  xf2ee:	push	eax			; 0000F2EE  6650  'fP'
                  	push	bp			; 0000F2F0  55  'U'
                  	push	es			; 0000F2F1  06  '.'
                  	pushf				; 0000F2F2  9C  '.'
                  	cli				; 0000F2F3  FA  '.'
                  	xor	di,di			; 0000F2F4  33FF  '3.'
                  	mov	bp,0xf2fc		; 0000F2F6  BDFCF2  '...'
                  	jmp	x8796			; 0000F2F9  E99A94
                  
                  	popf				; 0000F2FC  9D  '.'
                  	pop	es			; 0000F2FD  07  '.'
                  	pop	bp			; 0000F2FE  5D  ']'
                  	pop	eax			; 0000F2FF  6658  'fX'
                  	pop	bx			; 0000F301  5B  '['
                  	xor	ah,ah			; 0000F302  32E4  '2.'
                  	ret				; 0000F304  C3  '.'
                  
                  xf305:	push	bx			; 0000F305  53  'S'
                  	mov	bl,0xfe			; 0000F306  B3FE  '..'
                  	jmp	short xf2ee		; 0000F308  EBE4  '..'
                  
                  xf30a:	push	bx			; 0000F30A  53  'S'
                  	mov	bl,0xff			; 0000F30B  B3FF  '..'
                  	jmp	short xf2ee		; 0000F30D  EBDF  '..'
                  
                  xf30f:	call	xf337			; 0000F30F  E82500  '.%.'
                  	mov	ah,0xff			; 0000F312  B4FF  '..'
                  	jz	xf326			; 0000F314  7410  't.'
                  	and	al,0xc			; 0000F316  240C  '$.'
                  	mov	ah,0x1			; 0000F318  B401  '..'
                  	cmp	al,0xc			; 0000F31A  3C0C  '<.'
                  	jz	xf326			; 0000F31C  7408  't.'
                  	mov	ah,0x2			; 0000F31E  B402  '..'
                  	test	al,0x4			; 0000F320  A804  '..'
                  	jnz	xf326			; 0000F322  7502  'u.'
                  	mov	ah,0x0			; 0000F324  B400  '..'
                  xf326:	mov	al,ah			; 0000F326  8AC4  '..'
                  	xor	ah,ah			; 0000F328  32E4  '2.'
                  	ret				; 0000F32A  C3  '.'
                  
                  xf32b:	push	ax			; 0000F32B  50  'P'
                  	cli				; 0000F32C  FA  '.'
                  	call	xec2e_wait_8042_ready	; 0000F32D  E8FEF8  '...'
                  	mov	al,0xa3			; 0000F330  B0A3  '..'
                  	out	0x64,al			; 0000F332  E664  '.d'
                  	sti				; 0000F334  FB  '.'
                  	pop	ax			; 0000F335  58  'X'
                  	ret				; 0000F336  C3  '.'
                  
                  xf337:	cli				; 0000F337  FA  '.'
                  	call	xec2e_wait_8042_ready	; 0000F338  E8F3F8  '...'
                  	mov	al,0xad			; 0000F33B  B0AD  '..'
                  	out	0x64,al			; 0000F33D  E664  '.d'
                  xf33f:	in	al,0x64			; 0000F33F  E464  '.d'
                  	test	al,0x1			; 0000F341  A801  '..'
                  	jz	xf349			; 0000F343  7404  't.'
                  	in	al,0x60			; 0000F345  E460  '.`'
                  	jmp	short xf33f		; 0000F347  EBF6  '..'
                  
                  xf349:	call	xec2e_wait_8042_ready	; 0000F349  E8E2F8  '...'
                  	mov	al,0xa5			; 0000F34C  B0A5  '..'
                  	out	0x64,al			; 0000F34E  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000F350  E8DBF8  '...'
                  	push	cx			; 0000F353  51  'Q'
                  	mov	cx,0x2710		; 0000F354  B91027  '..',0x27
                  xf357:	in	al,0x64			; 0000F357  E464  '.d'
                  	test	al,0x1			; 0000F359  A801  '..'
                  	loope	xf357			; 0000F35B  E1FA  '..'
                  	pop	cx			; 0000F35D  59  'Y'
                  	jz	xf362			; 0000F35E  7402  't.'
                  	in	al,0x60			; 0000F360  E460  '.`'
                  xf362:	push	ax			; 0000F362  50  'P'
                  	pushf				; 0000F363  9C  '.'
                  	call	xec2e_wait_8042_ready	; 0000F364  E8C7F8  '...'
                  	mov	al,0xae			; 0000F367  B0AE  '..'
                  	out	0x64,al			; 0000F369  E664  '.d'
                  	push	cs			; 0000F36B  0E  '.'
                  	call	xf372			; 0000F36C  E80300  '...'
                  	jmp	short xf373		; 0000F36F  EB02  '..'
                  
                  	nop				; 0000F371  90  '.'
                  
                  xf372:	iret				; 0000F372  CF  '.'
                  
                  xf373:	pop	ax			; 0000F373  58  'X'
                  	sti				; 0000F374  FB  '.'
                  	ret				; 0000F375  C3  '.'
                  
                  	dw	0xFFFF			; 0000F376  FFFF
                  
                  ;
                  ;   Pattern buffers for memory tests
                  ;
                  pattern1:
                  	db	0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02						; 0000F378
                  	db	0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20 ; 0000F380
                  	db	0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00 ; 0000F390
                  	db	0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00 ; 0000F3A0
                  	db	0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00 ; 0000F3B0
                  	db	0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00 ; 0000F3C0
                  	db	0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ; 0000F3D0
                  	db	0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00 ; 0000F3E0
                  	db	0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00			; 0000F3F0
                  pattern2:
                  	db	0xFF,0xFF,0xFF,0xFE 								; 0000F3FC
                  	db	0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF ; 0000F400
                  	db	0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF ; 0000F410
                  	db	0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF ; 0000F420
                  	db	0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF,0xFF ; 0000F430
                  	db	0xFF,0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF ; 0000F440
                  	db	0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF ; 0000F450
                  	db	0xFD,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF ; 0000F460
                  	db	0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000F470
                  
                  xf480:	mov	al,0x7d			; 0000F480  B07D
                  	out	0x84,al			; 0000F482  E684
                  	mov	si,bim_table_offset	; 0000F484  BEE0FF
                  	mov	si,[cs:si]		; 0000F487  2E8B34
                  	test	word [cs:si],0x0f00	; 0000F48A  2EF704000F
                  	jz	xf494			; 0000F48F  7403
                  	jmp	xf684			; 0000F491  E9F001
                  
                  xf494:	mov	al,0x0			; 0000F494  B000
                  	out	0x80,al			; 0000F496  E680
                  
                  ;
                  ;   When we arrive here, the A20 line has been disabled; on most systems, that would
                  ;   mean that the ROM's GDT would only be accessible at the "low" ROM address (%0F0730),
                  ;   not the "high" address (%FF0730).  But fortunately, A20 management on Compaq
                  ;   DeskPros affects wrap-around only from the 1st to the 2nd megabyte; no other address
                  ;   range is affected.
                  ;
                  ;   FYI, it seems this code doesn't do anything if bits 6 and 7 of the RAM Settings
                  ;   register are set to anything other than 0x40 (ie, it returns to real-mode almost
                  ;   immediately after entering protected-mode).
                  ;
                  	lgdt	[cs:0x077e]		; 0000F498  load [gdtr_hi] into GDTR
                  	mov	eax,cr0			; 0000F49E  0F2000
                  	or	ax,0x1			; 0000F4A1  0D0100
                  	mov	cr0,eax			; 0000F4A4  0F2200
                  	jmp	0x28:xf4ac		; 0000F4A7  EAACF42800
                  
                  xf4ac:	mov	ax,0x8			; 0000F4AC  B80800  '...'
                  	mov	ds,ax			; 0000F4AF  8ED8  '..'
                  	in	al,0x61			; 0000F4B1  E461  '.a'
                  	mov	ah,al			; 0000F4B3  8AE0  '..'
                  	or	al,0x8			; 0000F4B5  0C08  '..'
                  	out	0x61,al			; 0000F4B7  E661  '.a'
                  	mov	al,[0x0]		; 0000F4B9  A00000  '...'
                  	xchg	ah,al			; 0000F4BC  86E0  '..'
                  	out	0x61,al			; 0000F4BE  E661  '.a'
                  	and	ah,0xc0			; 0000F4C0  80E4C0  '...'
                  ;
                  ;   (AH) contains only bits 6 and 7 from the RAM Settings/Diagnostics register
                  ;
                  	cmp	ah,0x40			; 0000F4C3  80FC40
                  	jz	xf4cb			; 0000F4C6  7403
                  	jmp	xf655			; 0000F4C8  E98A01
                  
                  xf4cb:	or	byte [0x2],0x40		; 0000F4CB  800E020040  '....@'
                  	mov	ax,0x38			; 0000F4D0  B83800  '.8.'
                  	mov	es,ax			; 0000F4D3  8EC0  '..'
                  	mov	cx,0x2000		; 0000F4D5  B90020  '.. '
                  	xor	si,si			; 0000F4D8  33F6  '3.'
                  	es	rep lodsd		; 0000F4DA  66F326AD  'f.&.'
                  	cld				; 0000F4DE  FC  '.'
                  	mov	cx,0x2000		; 0000F4DF  B90020  '.. '
                  	xor	di,di			; 0000F4E2  33FF  '3.'
                  	mov	eax,0xaaaaaaaa		; 0000F4E4  66B8AAAAAAAA  'f.....'
                  	rep	stosd			; 0000F4EA  66F3AB  'f..'
                  	mov	ebx,eax			; 0000F4ED  668BD8  'f..'
                  	mov	ax,0x38			; 0000F4F0  B83800  '.8.'
                  	mov	ds,ax			; 0000F4F3  8ED8  '..'
                  	xor	si,si			; 0000F4F5  33F6  '3.'
                  	mov	cx,0x2000		; 0000F4F7  B90020  '.. '
                  xf4fa:	lodsd				; 0000F4FA  66AD  'f.'
                  	cmp	eax,ebx			; 0000F4FC  663BC3  'f;.'
                  	jz	xf504			; 0000F4FF  7403  't.'
                  	jmp	xf599			; 0000F501  E99500  '...'
                  
                  xf504:	dec	cx			; 0000F504  49  'I'
                  	jz	xf509			; 0000F505  7402
                  	jmp	short xf4fa		; 0000F507  EBF1  '..'
                  
                  xf509:	mov	cx,0x2000		; 0000F509  B90020  '.. '
                  	xor	di,di			; 0000F50C  33FF  '3.'
                  	mov	eax,0x6db66db6		; 0000F50E  66B8B66DB66D  'f..m.m'
                  	rep	stosd			; 0000F514  66F3AB  'f..'
                  	mov	ebx,eax			; 0000F517  668BD8  'f..'
                  	mov	ax,0x38			; 0000F51A  B83800  '.8.'
                  	mov	ds,ax			; 0000F51D  8ED8  '..'
                  	xor	si,si			; 0000F51F  33F6  '3.'
                  	mov	cx,0x2000		; 0000F521  B90020  '.. '
                  xf524:	lodsd				; 0000F524  66AD  'f.'
                  	cmp	eax,ebx			; 0000F526  663BC3  'f;.'
                  	jnz	xf599			; 0000F529  756E  'un'
                  	dec	cx			; 0000F52B  49  'I'
                  	jz	xf530			; 0000F52C  7402
                  	jmp	short xf524		; 0000F52E  EBF4  '..'
                  
                  xf530:	mov	cx,0x2000		; 0000F530  B90020  '.. '
                  	xor	di,di			; 0000F533  33FF  '3.'
                  	mov	eax,0x55555555		; 0000F535  66B855555555  'f.UUUU'
                  	rep	stosd			; 0000F53B  66F3AB  'f..'
                  	mov	ebx,eax			; 0000F53E  668BD8  'f..'
                  	mov	ax,0x38			; 0000F541  B83800  '.8.'
                  	mov	ds,ax			; 0000F544  8ED8  '..'
                  	xor	si,si			; 0000F546  33F6  '3.'
                  	mov	cx,0x2000		; 0000F548  B90020  '.. '
                  xf54b:	lodsd				; 0000F54B  66AD  'f.'
                  	cmp	eax,ebx			; 0000F54D  663BC3  'f;.'
                  	jnz	xf599			; 0000F550  7547  'uG'
                  	dec	cx			; 0000F552  49  'I'
                  	jz	xf557			; 0000F553  7402  't.'
                  	jmp	short xf54b		; 0000F555  EBF4  '..'
                  
                  xf557:	mov	ax,0x30			; 0000F557  B83000  '.0.'
                  	mov	ds,ax			; 0000F55A  8ED8  '..'
                  	mov	bx,pattern1		; 0000F55C  BB78F3  '.x.'
                  xf55f:	mov	ax,0x4			; 0000F55F  B80400  '...'
                  	mov	dx,0x7c			; 0000F562  BA7C00  '.|.'
                  	xor	di,di			; 0000F565  33FF  '3.'
                  	mov	bp,0xf56d		; 0000F567  BD6DF5  '.m.'
                  	jmp	0xf68d			; 0000F56A  E92001  '. .'
                  	mov	dx,0x7c			; 0000F56D  BA7C00  '.|.'
                  	mov	bp,0xf576		; 0000F570  BD76F5  '.v.'
                  	jmp	xf68d			; 0000F573  E91701  '...'
                  
                  	xor	di,di			; 0000F576  33FF  '3.'
                  	mov	dx,0x7c			; 0000F578  BA7C00  '.|.'
                  	mov	bp,0xf581		; 0000F57B  BD81F5  '...'
                  	jmp	xe80b			; 0000F57E  E98AF2  '...'
                  
                  	jc	xf599			; 0000F581  7216  'r.'
                  	mov	dx,0x7c			; 0000F583  BA7C00  '.|.'
                  	mov	bp,0xf58c		; 0000F586  BD8CF5  '...'
                  	jmp	xe80b			; 0000F589  E97FF2  '...'
                  
                  	jc	xf599			; 0000F58C  720B  'r.'
                  	cmp	bx,pattern2		; 0000F58E  81FBFCF3  '....'
                  	jz	xf5a0			; 0000F592  740C  't.'
                  	mov	bx,pattern2		; 0000F594  BBFCF3  '...'
                  	jmp	short xf55f		; 0000F597  EBC6  '..'
                  
                  xf599:	mov	al,0x1			; 0000F599  B001  '..'
                  	out	0x80,al			; 0000F59B  E680  '..'
                  	jmp	xf63b			; 0000F59D  E99B00  '...'
                  
                  xf5a0:	mov	ax,0x8			; 0000F5A0  B80800  '...'
                  	mov	es,ax			; 0000F5A3  8EC0  '..'
                  	and	byte [es:0x2],0xbf	; 0000F5A5  2680260200BF  '&.&...'
                  	mov	ax,0x40			; 0000F5AB  B84000  '.@.'
                  	mov	es,ax			; 0000F5AE  8EC0  '..'
                  	mov	ax,0x4			; 0000F5B0  B80400  '...'
                  	mov	bx,pattern1		; 0000F5B3  BB78F3  '.x.'
                  	mov	dx,0x7c			; 0000F5B6  BA7C00  '.|.'
                  	xor	di,di			; 0000F5B9  33FF  '3.'
                  	mov	bp,0xf5c1		; 0000F5BB  BDC1F5  '...'
                  	jmp	xf68d			; 0000F5BE  E9CC00  '...'
                  
                  	mov	dx,0x7c			; 0000F5C1  BA7C00  '.|.'
                  	mov	bp,0xf5ca		; 0000F5C4  BDCAF5  '...'
                  	jmp	xf68d			; 0000F5C7  E9C300  '...'
                  
                  	mov	ax,0x8			; 0000F5CA  B80800  '...'
                  	mov	cx,es			; 0000F5CD  8CC1  '..'
                  	mov	es,ax			; 0000F5CF  8EC0  '..'
                  	or	byte [es:0x2],0x40	; 0000F5D1  26800E020040  '&....@'
                  	mov	es,cx			; 0000F5D7  8EC1  '..'
                  	mov	ax,0x4			; 0000F5D9  B80400  '...'
                  	mov	dx,0x7c			; 0000F5DC  BA7C00  '.|.'
                  	xor	di,di			; 0000F5DF  33FF  '3.'
                  	mov	bp,0xf5e7		; 0000F5E1  BDE7F5  '...'
                  	jmp	xe80b			; 0000F5E4  E924F2  '.$.'
                  
                  	jc	xf599			; 0000F5E7  72B0  'r.'
                  	mov	dx,0x7c			; 0000F5E9  BA7C00  '.|.'
                  	mov	bp,0xf5f2		; 0000F5EC  BDF2F5  '...'
                  	jmp	xe80b			; 0000F5EF  E919F2  '...'
                  
                  	jc	xf599			; 0000F5F2  72A5  'r.'
                  	mov	ax,0x4			; 0000F5F4  B80400  '...'
                  	mov	bx,pattern2		; 0000F5F7  BBFCF3  '...'
                  	mov	dx,0x7c			; 0000F5FA  BA7C00  '.|.'
                  	xor	di,di			; 0000F5FD  33FF  '3.'
                  	mov	bp,0xf605		; 0000F5FF  BD05F6  '...'
                  	jmp	xf68d			; 0000F602  E98800  '...'
                  
                  	mov	dx,0x7c			; 0000F605  BA7C00  '.|.'
                  	mov	bp,0xf60e		; 0000F608  BD0EF6  '...'
                  	jmp	xf68d			; 0000F60B  E97F00  '...'
                  
                  	mov	ax,0x8			; 0000F60E  B80800  '...'
                  	mov	cx,es			; 0000F611  8CC1  '..'
                  	mov	es,ax			; 0000F613  8EC0  '..'
                  	and	byte [es:0x2],0xbf	; 0000F615  2680260200BF  '&.&...'
                  	mov	es,cx			; 0000F61B  8EC1  '..'
                  	mov	ax,0x4			; 0000F61D  B80400  '...'
                  	mov	dx,0x7c			; 0000F620  BA7C00  '.|.'
                  	xor	di,di			; 0000F623  33FF  '3.'
                  	mov	bp,0xf62b		; 0000F625  BD2BF6  '.+.'
                  	jmp	xe80b			; 0000F628  E9E0F1  '...'
                  
                  	jc	xf638			; 0000F62B  720B  'r.'
                  	mov	dx,0x7c			; 0000F62D  BA7C00  '.|.'
                  	mov	bp,0xf636		; 0000F630  BD36F6  '.6.'
                  	jmp	xe80b			; 0000F633  E9D5F1  '...'
                  
                  	jnc	xf63b			; 0000F636  7303  's.'
                  xf638:	jmp	xf599			; 0000F638  E95EFF  '.^.'
                  
                  xf63b:	mov	ax,0x8			; 0000F63B  B80800  '...'
                  	mov	ds,ax			; 0000F63E  8ED8  '..'
                  	and	byte [0x2],0xbf		; 0000F640  80260200BF  '.&...'
                  	mov	byte [0x0],0xfc		; 0000F645  C6060000FC  '.....'
                  	in	al,0x80			; 0000F64A  E480  '..'
                  	cmp	al,0x0			; 0000F64C  3C00  '<.'
                  	jnz	xf655			; 0000F64E  7505  'u.'
                  	or	byte [0x2],0x40		; 0000F650  800E020040  '....@'
                  
                  xf655:	mov	ax,0x10			; 0000F655  B81000  '...'
                  	mov	es,ax			; 0000F658  8EC0  '..'
                  	mov	ds,ax			; 0000F65A  8ED8  '..'
                  	mov	eax,cr0			; 0000F65C  0F2000
                  	and	eax,0x7ffffffe		; 0000F65F  6625FEFFFF7F  'f%....'
                  	mov	cr0,eax			; 0000F665  0F2200
                  	jmp	0xf000:0xf66d		; 0000F668  EA6DF600F0  '.m...'
                  
                  	lidt	[cs:0x0784]		; 0000F66D  load [idtr_lo] into IDTR
                  	in	al,0x80			; 0000F673  E480  '..'
                  	cmp	al,0x0			; 0000F675  3C00  '<.'
                  	jz	xf684			; 0000F677  740B  't.'
                  	xor	dx,dx			; 0000F679  33D2  '3.'
                  	mov	cx,err205_len		; 0000F67B  B91300  '...'
                  	mov	bx,err205		; 0000F67E  BBD0B6  '...'
                  	call	xc745			; 0000F681  E8C1D0  '...'
                  
                  xf684:	mov	al,0x7e			; 0000F684  B07E  '.~'
                  	out	0x84,al			; 0000F686  E684  '..'
                  	xor	al,al			; 0000F688  32C0  '2.'
                  	out	0x80,al			; 0000F68A  E680  '..'
                  	ret				; 0000F68C  C3  '.'
                  
                  ;
                  ;   Repeatedly copy 0x84 bytes from DS:BX to ES:DI for DX iterations, followed by AX more
                  ;   bytes after DX is exhausted.  DI advances, BX does not.  Return to BP.
                  ;
                  xf68d:	mov	si,bx			; 0000F68D  8BF3  '..'
                  	mov	cx,0x21			; 0000F68F  B92100  '.!.'
                  	rep	movsd			; 0000F692  66F3A5  'f..'
                  	dec	dx			; 0000F695  4A  'J'
                  	jnz	xf68d			; 0000F696  75F5  'u.'
                  	mov	si,bx			; 0000F698  8BF3  '..'
                  	mov	cx,ax			; 0000F69A  8BC8  '..'
                  	rep	movsd			; 0000F69C  66F3A5  'f..'
                  	jmp	bp			; 0000F69F  FFE5  '..'
                  
                  xf6a1:	push	ds			; 0000F6A1  1E  '.'
                  	xor	ebp,ebp			; 0000F6A2  6633ED  'f3.'
                  xf6a5:	mov	eax,0x1			; 0000F6A5  66B801000000  'f.....'
                  	xor	eax,ebp			; 0000F6AB  6633C5  'f3.'
                  	mov	cx,0x4000		; 0000F6AE  B90040  '..@'
                  	xor	di,di			; 0000F6B1  33FF  '3.'
                  	sahf				; 0000F6B3  9E  '.'
                  xf6b4:	rcl	eax,1			; 0000F6B4  66D1D0  'f..'
                  	stosd				; 0000F6B7  66AB  'f.'
                  	loop	xf6b4			; 0000F6B9  E2F9  '..'
                  	in	al,0x61			; 0000F6BB  E461  '.a'
                  	or	al,0xc			; 0000F6BD  0C0C  '..'
                  	out	0x61,al			; 0000F6BF  E661  '.a'
                  	and	al,0xf3			; 0000F6C1  24F3  '$.'
                  	out	0x61,al			; 0000F6C3  E661  '.a'
                  	mov	ebx,0x1			; 0000F6C5  66BB01000000  'f.....'
                  	xor	ebx,ebp			; 0000F6CB  6633DD  'f3.'
                  	mov	eax,ebp			; 0000F6CE  668BC5  'f..'
                  	push	es			; 0000F6D1  06  '.'
                  	pop	ds			; 0000F6D2  1F  '.'
                  	xor	si,si			; 0000F6D3  33F6  '3.'
                  	mov	dh,ah			; 0000F6D5  8AF4  '..'
                  	mov	cx,0x4000		; 0000F6D7  B90040  '..@'
                  xf6da:	mov	ah,dh			; 0000F6DA  8AE6  '..'
                  	sahf				; 0000F6DC  9E  '.'
                  	rcl	ebx,1			; 0000F6DD  66D1D3  'f..'
                  	lahf				; 0000F6E0  9F  '.'
                  	mov	dh,ah			; 0000F6E1  8AF4  '..'
                  	lodsd				; 0000F6E3  66AD  'f.'
                  	xor	eax,ebx			; 0000F6E5  6633C3  'f3.'
                  	loope	xf6da			; 0000F6E8  E1F0  '..'
                  	jnz	xf700			; 0000F6EA  7514  'u.'
                  	in	al,0x61			; 0000F6EC  E461  '.a'
                  	test	al,0x40			; 0000F6EE  A840  '.@'
                  	mov	eax,0x0			; 0000F6F0  66B800000000  'f.....'
                  	jnz	xf700			; 0000F6F6  7508  'u.'
                  	dec	ebp			; 0000F6F8  664D  'fM'
                  	jpe	xf6a5			; 0000F6FA  7AA9  'z.'
                  	pop	ds			; 0000F6FC  1F  '.'
                  	xor	ax,ax			; 0000F6FD  33C0  '3.'
                  	ret				; 0000F6FF  C3  '.'
                  
                  xf700:	mov	byte [si],0x0		; 0000F700  C60400  '...'
                  	push	ax			; 0000F703  50  'P'
                  	in	al,0x61			; 0000F704  E461  '.a'
                  	or	al,0xc			; 0000F706  0C0C  '..'
                  	out	0x61,al			; 0000F708  E661  '.a'
                  	and	al,0xf3			; 0000F70A  24F3  '$.'
                  	out	0x61,al			; 0000F70C  E661  '.a'
                  	pop	ax			; 0000F70E  58  'X'
                  	or	eax,eax			; 0000F70F  660BC0  'f..'
                  	jnz	xf72d			; 0000F712  7519  'u.'
                  	call	x86db			; 0000F714  E8C48F  '...'
                  	xchg	ah,al			; 0000F717  86E0  '..'
                  	and	ah,0xf			; 0000F719  80E40F  '...'
                  	xor	si,si			; 0000F71C  33F6  '3.'
                  	mov	cl,0x4			; 0000F71E  B104  '..'
                  xf720:	rcr	ah,1			; 0000F720  D0DC  '..'
                  	jnc	xf729			; 0000F722  7305  's.'
                  	inc	si			; 0000F724  46  'F'
                  	loop	xf720			; 0000F725  E2F9  '..'
                  	xor	si,si			; 0000F727  33F6  '3.'
                  xf729:	xor	al,al			; 0000F729  32C0  '2.'
                  	jmp	short xf73e		; 0000F72B  EB11  '..'
                  
                  xf72d:	sub	si,byte +0x4		; 0000F72D  83EE04  '...'
                  	mov	cx,0x4			; 0000F730  B90400  '...'
                  xf733:	test	al,0xff			; 0000F733  A8FF  '..'
                  	jnz	xf73e			; 0000F735  7507  'u.'
                  	shr	eax,0x8			; 0000F737  66C1E808  'f...'
                  	inc	si			; 0000F73B  46  'F'
                  	loop	xf733			; 0000F73C  E2F5  '..'
                  xf73e:	mov	cl,al			; 0000F73E  8AC8  '..'
                  	mov	dx,si			; 0000F740  8BD6  '..'
                  	pop	ds			; 0000F742  1F  '.'
                  	stc				; 0000F743  F9  '.'
                  	ret				; 0000F744  C3  '.'
                  
                  xf745:	pusha				; 0000F745  60  '`'
                  	push	ds			; 0000F746  1E  '.'
                  	push	gs			; 0000F747  0FA8  '..'
                  	push	fs			; 0000F749  0FA0  '..'
                  	mov	al,0x75			; 0000F74B  B075  '.u'
                  	out	0x84,al			; 0000F74D  E684  '..'
                  	mov	ax,0x40			; 0000F74F  B84000  '.@.'
                  	mov	ds,ax			; 0000F752  8ED8  '..'
                  	mov	[0x67],sp		; 0000F754  89266700  '.&g.'
                  	mov	[0x69],ss		; 0000F758  8C166900  '..i.'
                  	mov	cx,0x0			; 0000F75C  B90000  '...'
                  	mov	al,0x76			; 0000F75F  B076  '.v'
                  	out	0x84,al			; 0000F761  E684  '..'
                  	push	cx			; 0000F763  51  'Q'
                  	call	x80e2			; 0000F764  E87B89  '.{.'
                  	pop	cx			; 0000F767  59  'Y'
                  	jz	xf770			; 0000F768  7406  't.'
                  	or	cl,0x1			; 0000F76A  80C901  '...'
                  	jmp	xf800			; 0000F76D  E99000  '...'
                  
                  xf770:	mov	al,0x77			; 0000F770  B077  '.w'
                  	out	0x84,al			; 0000F772  E684  '..'
                  	push	cx			; 0000F774  51  'Q'
                  	xor	bx,bx			; 0000F775  33DB  '3.'
                  	pop	cx			; 0000F777  59  'Y'
                  	or	bx,bx			; 0000F778  0BDB  '..'
                  	jz	xf782			; 0000F77A  7406  't.'
                  	or	cl,0x2			; 0000F77C  80C902  '...'
                  	jmp	short xf782		; 0000F77F  EB01  '..'
                  
                  	nop				; 0000F781  90  '.'
                  xf782:	mov	al,cl			; 0000F782  8AC1  '..'
                  	out	0x80,al			; 0000F784  E680  '..'
                  	mov	ah,0x6			; 0000F786  B406  '..'
                  	or	cl,cl			; 0000F788  0AC9  0x0A,'.'
                  	jz	xf78e			; 0000F78A  7402  't.'
                  	mov	ah,0x7			; 0000F78C  B407  '..'
                  xf78e:	mov	al,0x78			; 0000F78E  B078  '.x'
                  	out	0x84,al			; 0000F790  E684  '..'
                  	push	ax			; 0000F792  50  'P'
                  	in	al,0x60			; 0000F793  E460  '.`'
                  	mov	al,0x20			; 0000F795  B020  '. '
                  	out	0x64,al			; 0000F797  E664  '.d'
                  	call	xec2e_wait_8042_ready	; 0000F799  E892F4  '...'
                  xf79c:	in	al,0x64			; 0000F79C  E464  '.d'
                  	test	al,0x1			; 0000F79E  A801  '..'
                  	jz	xf79c			; 0000F7A0  74FA  't.'
                  	in	al,0x60			; 0000F7A2  E460  '.`'
                  	mov	ah,al			; 0000F7A4  8AE0  '..'
                  	or	ah,0x4			; 0000F7A6  80CC04  '...'
                  	push	ax			; 0000F7A9  50  'P'
                  	call	xec2e_wait_8042_ready	; 0000F7AA  E881F4  '...'
                  	pop	ax			; 0000F7AD  58  'X'
                  	mov	al,0x60			; 0000F7AE  B060  '.`'
                  	out	0x64,al			; 0000F7B0  E664  '.d'
                  	push	ax			; 0000F7B2  50  'P'
                  	call	xec2e_wait_8042_ready	; 0000F7B3  E878F4  '.x.'
                  	pop	ax			; 0000F7B6  58  'X'
                  	mov	al,ah			; 0000F7B7  8AC4  '..'
                  	out	0x60,al			; 0000F7B9  E660  '.`'
                  	pop	ax			; 0000F7BB  58  'X'
                  	mov	al,0x8f			; 0000F7BC  B08F  '..'
                  	call	xb549			; 0000F7BE  E888BD  '...'
                  	call	xec2e_wait_8042_ready	; 0000F7C1  E86AF4  '.j.'
                  	mov	al,0xfe			; 0000F7C4  B0FE  '..'
                  	out	0x64,al			; 0000F7C6  E664  '.d'
                  xf7c8:	hlt				; 0000F7C8  F4  '.'
                  	jmp	short xf7c8		; 0000F7C9  EBFD  '..'
                  
                  	mov	al,0x79			; 0000F7CB  B079  '.y'
                  	out	0x84,al			; 0000F7CD  E684  '..'
                  	clc				; 0000F7CF  F8  '.'
                  	jmp	short xf7d8		; 0000F7D0  EB06  '..'
                  
                  	nop				; 0000F7D2  90  '.'
                  	mov	al,0x7a			; 0000F7D3  B07A  '.z'
                  	out	0x84,al			; 0000F7D5  E684  '..'
                  	stc				; 0000F7D7  F9  '.'
                  xf7d8:	mov	ax,0x40			; 0000F7D8  B84000  '.@.'
                  	mov	ds,ax			; 0000F7DB  8ED8  '..'
                  	mov	ss,[0x69]		; 0000F7DD  8E166900  '..i.'
                  	mov	sp,[0x67]		; 0000F7E1  8B266700  '.&g.'
                  	jc	xf7ea			; 0000F7E5  7203  'r.'
                  	jmp	short xf812		; 0000F7E7  EB29  '.)'
                  
                  	nop				; 0000F7E9  90  '.'
                  xf7ea:	in	al,0x80			; 0000F7EA  E480  '..'
                  	mov	cl,al			; 0000F7EC  8AC8  '..'
                  	test	cl,0x2			; 0000F7EE  F6C102  '...'
                  	jz	xf800			; 0000F7F1  740D  't',0x0D
                  	mov	dx,0x0			; 0000F7F3  BA0000  '...'
                  	mov	bx,err102		; 0000F7F6  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000F7F9  B91A00  '...'
                  	call	xc745			; 0000F7FC  E846CF  '.F.'
                  	hlt				; 0000F7FF  F4  '.'
                  
                  xf800:	test	cl,0x1			; 0000F800  F6C101  '...'
                  	jz	xf812			; 0000F803  740D  't',0x0D
                  	mov	dx,0x0			; 0000F805  BA0000  '...'
                  	mov	bx,err102		; 0000F808  BB8CB6  '...'
                  	mov	cx,err102_len		; 0000F80B  B91A00  '...'
                  	call	xc745			; 0000F80E  E834CF  '.4.'
                  	hlt				; 0000F811  F4  '.'
                  
                  xf812:	mov	al,0x7b			; 0000F812  B07B  '.{'
                  	out	0x84,al			; 0000F814  E684  '..'
                  	pop	fs			; 0000F816  0FA1  '..'
                  	pop	gs			; 0000F818  0FA9  '..'
                  	pop	ds			; 0000F81A  1F  '.'
                  	popa				; 0000F81B  61  'a'
                  	ret				; 0000F81C  C3  '.'
                  
                  	mov	ax,0x0			; 0000F81D  B80000  '...'
                  	iret				; 0000F820  CF  '.'
                  
                  	sbb	ax,0x30f8		; 0000F821  1DF830  '..0'
                  	add	[bx+si],al		; 0000F824  0000  '..'
                  	xchg	al,[bx+si]		; 0000F826  8600  '..'
                  	add	bh,bh			; 0000F828  00FF  '..'
                  
                  	times	23 db 0xFF		; 0000F82A - 0000F840
                  	sti				; 0000F841  FB  '.'
                  	push	ds			; 0000F842  1E  '.'
                  	mov	ax,0x40			; 0000F843  B84000  '.@.'
                  	mov	ds,ax			; 0000F846  8ED8  '..'
                  	mov	ax,[0x13]		; 0000F848  A11300  '...'
                  	pop	ds			; 0000F84B  1F  '.'
                  	iret				; 0000F84C  CF  '.'
                  
                  	call	x9e82			; 0000F84D  E832A6  '.2.'
                  	iret				; 0000F850  CF  '.'
                  	db	'********'
                  
                  	cmp	ah,0x7f			; 0000F859  80FC7F  '...'
                  	jna	xf8aa			; 0000F85C  764C  'vL'
                  	cmp	ah,0xc0			; 0000F85E  80FCC0  '...'
                  	jz	xf87a			; 0000F861  7417  't.'
                  	cmp	ah,0x92			; 0000F863  80FC92  '...'
                  	jnc	xf8aa			; 0000F866  7342  'sB'
                  	push	di			; 0000F868  57  'W'
                  	mov	di,ax			; 0000F869  8BF8  '..'
                  xf86b:	and	di,0x7f00		; 0000F86B  81E7007F  '....'
                  	shr	di,0x7			; 0000F86F  C1EF07  '...'
                  	call	near [cs:di+0xf884]	; 0000F872  2EFF9584F8  '.....'
                  	jmp	short xf880		; 0000F877  EB07  '..'
                  
                  	nop				; 0000F879  90  '.'
                  xf87a:	push	di			; 0000F87A  57  'W'
                  	mov	di,0x9200		; 0000F87B  BF0092  '...'
                  	jmp	short xf86b		; 0000F87E  EBEB  '..'
                  
                  xf880:	pop	di			; 0000F880  5F  '_'
                  	retf	0x2			; 0000F881  CA0200  '...'
                  
                  	ret	0xc4f8			; 0000F884  C2F8C4  '...'
                  
                  	clc				; 0000F887  F8  '.'
                  	db	0xC6			; 0000F888  C6  '.'
                  	clc				; 0000F889  F8  '.'
                  	pop	cx			; 0000F88A  59  'Y'
                  	mov	ax,[0xa1d9]		; 0000F88B  A1D9A1  '...'
                  	enter	0x8ef8,0xa2		; 0000F88E  C8F88EA2  '....'
                  	shl	word [bp+si+0xa49d],cl	; 0000F892  D3A29DA4  '....'
                  	lodsb				; 0000F896  AC  '.'
                  	movsb				; 0000F897  A4  '.'
                  	mov	si,0xbef8		; 0000F898  BEF8BE  '...'
                  	clc				; 0000F89B  F8  '.'
                  	mov	si,0xbef8		; 0000F89C  BEF8BE  '...'
                  	clc				; 0000F89F  F8  '.'
                  	mov	si,0xbef8		; 0000F8A0  BEF8BE  '...'
                  	clc				; 0000F8A3  F8  '.'
                  	retf	0xccf8			; 0000F8A4  CAF8CC  '...'
                  
                  	clc				; 0000F8A7  F8  '.'
                  	db	0x88			; 0000F8A8  88  '.'
                  	movsw				; 0000F8A9  A5  '.'
                  xf8aa:	cmp	ah,0x4f			; 0000F8AA  80FC4F  '..O'
                  	jnz	xf8b3			; 0000F8AD  7504  'u.'
                  	stc				; 0000F8AF  F9  '.'
                  	retf	0x2			; 0000F8B0  CA0200  '...'
                  
                  xf8b3:	sti				; 0000F8B3  FB  '.'
                  	mov	ah,0x86			; 0000F8B4  B486  '..'
                  	stc				; 0000F8B6  F9  '.'
                  	retf	0x2			; 0000F8B7  CA0200  '...'
                  
                  xf8ba:	sti				; 0000F8BA  FB  '.'
                  	xor	ah,ah			; 0000F8BB  32E4  '2.'
                  	ret				; 0000F8BD  C3  '.'
                  
                  	pop	di			; 0000F8BE  5F  '_'
                  	pop	di			; 0000F8BF  5F  '_'
                  	jmp	short xf8aa		; 0000F8C0  EBE8  '..'
                  
                  	jmp	short xf8ba		; 0000F8C2  EBF6  '..'
                  
                  	jmp	short xf8ba		; 0000F8C4  EBF4  '..'
                  
                  	jmp	short xf8ba		; 0000F8C6  EBF2  '..'
                  
                  	jmp	short xf8ba		; 0000F8C8  EBF0  '..'
                  
                  	jmp	short xf8ba		; 0000F8CA  EBEE  '..'
                  
                  	pop	di			; 0000F8CC  5F  '_'
                  	pop	di			; 0000F8CD  5F  '_'
                  	xor	ah,ah			; 0000F8CE  32E4  '2.'
                  	iret				; 0000F8D0  CF  '.'
                  
                  ;
                  ;   11 pairs of I/O ports/values for early I/O port (eg, PIC) initialization
                  ;
                  xf8d1:	db	0xF1,0x00
                  	db	0x20,0x11
                  	db	0x21,0x08
                  	db	0x21,0x04
                  	db	0x21,0x01
                  	db	0x21,0xFF
                  	db	0xA0,0x11
                  	db	0xA1,0x70
                  	db	0xA1,0x02
                  	db	0xA1,0x01
                  	db	0xA1,0xFF
                  
                  xf8e7:	dw	0xba95			; SHUTDOWN 0x00
                  	dw	0xba95			; SHUTDOWN 0x01
                  	dw	0xd9ca			; SHUTDOWN 0x02
                  	dw	0xd9d4			; SHUTDOWN 0x03
                  	dw	0xfa21			; SHUTDOWN 0x04
                  	dw	0xfa17			; SHUTDOWN 0x05
                  	dw	0xf7cb			; SHUTDOWN 0x06
                  	dw	0xf7d3			; SHUTDOWN 0x07
                  	dw	0xf7d3			; SHUTDOWN 0x08
                  ;
                  ;   The entry for 0x09 is empty because the ROM dispatches directly to xa43c,
                  ;   bypassing I/O port (eg, PIC) re-initialization.
                  ;
                  	dw	0x0000			; SHUTDOWN 0x09
                  ;
                  ;   The entry for 0x0a seems useless, because the ROM dispatches directly to xfa0a,
                  ;   also bypassing I/O port (eg, PIC) re-initialization.
                  ;
                  	dw	0xfa0a			; SHUTDOWN 0x0a
                  ;
                  ;   ROM dispatch addresses
                  ;
                  xf8fd:	dw	0x0003,0xe000
                  xf901:	dw	0x0003,0xc800
                  
                  reset:	mov	al,0x0			; 0000F905  B000  '..'
                  	out	0x84,al			; 0000F907  E684  '..'
                  	mov	al,0x0			; 0000F909  B000  '..'
                  	out	0x85,al			; 0000F90B  E685  '..'
                  	mov	ah,0x2			; 0000F90D  B402  '..'
                  	sahf				; 0000F90F  9E  '.'
                  	cli				; 0000F910  FA  '.'
                  	mov	ax,0xfff0		; 0000F911  B8F0FF  '...'
                  	lmsw	ax			; 0000F914  0F01F0  '...'
                  	mov	ax,0x40			; 0000F917  B84000  '.@.'
                  	mov	ds,ax			; 0000F91A  8ED8  '..'
                  	in	al,0x64			; 0000F91C  E464  '.d'
                  	test	al,0x4			; 0000F91E  A804  '..'
                  	jnz	xf984			; 0000F920  7562  'ub'
                  	mov	gs,dx			; 0000F922  8EEA  '..'
                  	mov	al,0x1			; 0000F924  B001  '..'
                  	out	0x84,al			; 0000F926  E684  '..'
                  	mov	al,0xaa			; 0000F928  B0AA  '..'
                  	out	0x64,al			; 0000F92A  E664  '.d'
                  	mov	cx,0xffff		; 0000F92C  B9FFFF  '...'
                  xf92f:	in	al,0x64			; 0000F92F  E464  '.d'
                  	test	al,0x1			; 0000F931  A801  '..'
                  	jnz	xf93a			; 0000F933  7505  'u.'
                  	loop	xf92f			; 0000F935  E2F8  '..'
                  	jmp	short xf976		; 0000F937  EB3D  '.='
                  	nop				; 0000F939  90  '.'
                  
                  xf93a:	mov	al,0x2			; 0000F93A  B002  '..'
                  	out	0x84,al			; 0000F93C  E684  '..'
                  	in	al,0x60			; 0000F93E  E460  '.`'
                  	mov	al,0x3			; 0000F940  B003  '..'
                  	out	0x84,al			; 0000F942  E684  '..'
                  	mov	al,0x4			; 0000F944  B004  '..'
                  	out	0x84,al			; 0000F946  E684  '..'
                  	mov	ax,0xe000		; 0000F948  B800E0  '...'
                  	mov	ds,ax			; 0000F94B  8ED8  '..'
                  	xor	bx,bx			; 0000F94D  33DB  '3.'
                  	cmp	word [bx],0x55aa	; 0000F94F  813FAA55  '.?.U'
                  	jnz	xf95d			; 0000F953  7508  'u.'
                  	mov	bp,0xf976		; 0000F955  BD76F9  '.v.'
                  	jmp	far [cs:0xf8fd]		; 0000F958  2EFF2EFDF8  '.....'
                  
                  xf95d:	mov	al,0x5			; 0000F95D  B005  '..'
                  	out	0x84,al			; 0000F95F  E684  '..'
                  	mov	ax,0xc800		; 0000F961  B800C8  '...'
                  	mov	ds,ax			; 0000F964  8ED8  '..'
                  	xor	bx,bx			; 0000F966  33DB  '3.'
                  	cmp	word [bx],0x55aa	; 0000F968  813FAA55  '.?.U'
                  	jnz	xf976			; 0000F96C  7508  'u.'
                  	mov	bp,0xf976		; 0000F96E  BD76F9  '.v.'
                  	jmp	far [cs:0xf901]		; 0000F971  2EFF2E01F9  '.....'
                  
                  xf976:	mov	al,0x6			; 0000F976  B006  '..'
                  	out	0x84,al			; 0000F978  E684  '..'
                  	mov	ax,0x40			; 0000F97A  B84000  '.@.'
                  	mov	ds,ax			; 0000F97D  8ED8  '..'
                  	mov	ax,0x0			; 0000F97F  B80000  '...'
                  	jmp	short xf992		; 0000F982  EB0E  '..'
                  
                  xf984:	mov	al,0x7			; 0000F984  B007  '..'
                  	out	0x84,al			; 0000F986  E684  '..'
                  ;
                  ;   Request the CMOS SHUTDOWN byte at CMOS address 0x0F, and then zero it
                  ;
                  	mov	al,0x8f			; 0000F988  B08F  '..'
                  	out	0x70,al			; 0000F98A  E670  '.p'
                  	jmp	$+2			; 0000F98C  EB00  '..'
                  	jmp	$+2			; 0000F98E  EB00  '..'
                  	in	al,0x71			; 0000F990  E471  '.q'
                  xf992:	mov	bx,ax			; 0000F992  8BD8  '..'
                  	mov	al,0x8f			; 0000F994  B08F  '..'
                  	out	0x70,al			; 0000F996  E670  '.p'
                  	jmp	$+2			; 0000F998  EB00  '..'
                  	jmp	$+2			; 0000F99A  EB00  '..'
                  	mov	al,0x0			; 0000F99C  B000  '..'
                  	out	0x71,al			; 0000F99E  E671  '.q'
                  ;
                  ;   Special CMOS SHUTDOWN dispatch for 0x09
                  ;
                  	cmp	bl,0x9			; 0000F9A0  80FB09  '...'
                  	jnz	xf9a8			; 0000F9A3  7503  'u.'
                  	jmp	xa43c			; 0000F9A5  E994AA  '...'
                  
                  xf9a8:	mov	al,0x8			; 0000F9A8  B008  '..'
                  	out	0x84,al			; 0000F9AA  E684  '..'
                  ;
                  ;   Special CMOS SHUTDOWN dispatch for 0x0a
                  ;
                  	cmp	bl,0xa			; 0000F9AC  80FB0A  '..',0x0A
                  	jnz	xf9b4			; 0000F9AF  7503  'u.'
                  	jmp	short xfa0a		; 0000F9B1  EB57  '.W'
                  
                  	nop				; 0000F9B3  90  '.'
                  xf9b4:	xor	al,al			; 0000F9B4  32C0  '2.'
                  	out	0xf1,al			; 0000F9B6  E6F1  '..'
                  	mov	ax,0xf000		; 0000F9B8  B800F0  '...'
                  	mov	ds,ax			; 0000F9BB  8ED8  '..'
                  	xor	dx,dx			; 0000F9BD  33D2  '3.'
                  	mov	si,xf8d1		; 0000F9BF  BED1F8  '...'
                  	mov	cx,0xb			; 0000F9C2  B90B00  '...'
                  xf9c5:	lodsb				; 0000F9C5  AC  '.'
                  	mov	dl,al			; 0000F9C6  8AD0  '..'
                  	lodsb				; 0000F9C8  AC  '.'
                  	out	dx,al			; 0000F9C9  EE  '.'
                  	loop	xf9c5			; 0000F9CA  E2F9  '..'
                  	mov	dx,0xa0			; 0000F9CC  BAA000  '...'
                  xf9cf:	mov	cx,0x8			; 0000F9CF  B90800  '...'
                  xf9d2:	mov	al,0xb			; 0000F9D2  B00B  '..'
                  	out	dx,al			; 0000F9D4  EE  '.'
                  	in	al,dx			; 0000F9D5  EC  '.'
                  	or	al,al			; 0000F9D6  0AC0  0x0A,'.'
                  	jz	xf9df			; 0000F9D8  7405
                  	mov	al,0x20			; 0000F9DA  B020  '. '
                  	out	dx,al			; 0000F9DC  EE  '.'
                  	loop	xf9d2			; 0000F9DD  E2F3  '..'
                  xf9df:	cmp	dx,byte +0x20		; 0000F9DF  83FA20  '.. '
                  	jz	xf9e9			; 0000F9E2  7405  't.'
                  	mov	dx,0x20			; 0000F9E4  BA2000  '. .'
                  	jmp	short xf9cf		; 0000F9E7  EBE6  '..'
                  
                  xf9e9:	mov	al,0x0			; 0000F9E9  B000  '..'
                  	out	0x20,al			; 0000F9EB  E620  '. '
                  	out	0xa0,al			; 0000F9ED  E6A0  '..'
                  	mov	al,0x9			; 0000F9EF  B009  '..'
                  	out	0x84,al			; 0000F9F1  E684  '..'
                  ;
                  ;   Verify that the CMOS SHUTDOWN byte is <= 0x0B (and if not, set it to 0x00)
                  ;
                  ;   NOTE: This test permits 0x0B, but there is no entry for 0x0B in the table at xf8e7.
                  ;
                  	cmp	bl,0xb			; 0000F9F3  80FB0B  '...'
                  	jna	xf9fa			; 0000F9F6  7602  'v.'
                  	mov	bl,0x0			; 0000F9F8  B300  '..'
                  ;
                  ;   Dispatch according to the CMOS SHUTDOWN byte
                  ;
                  xf9fa:	xor	bh,bh			; 0000F9FA  32FF  '2.'
                  	shl	bl,1			; 0000F9FC  D0E3  '..'
                  	mov	si,[cs:bx+xf8e7]	; 0000F9FE  2E8BB7E7F8  '.....'
                  	mov	ax,0x40			; 0000FA03  B84000  '.@.'
                  	mov	ds,ax			; 0000FA06  8ED8  '..'
                  	jmp	si			; 0000FA08  FFE6  '..'
                  
                  xfa0a:	mov	al,0xa			; 0000FA0A  B00A  '.',0x0A
                  	out	0x84,al			; 0000FA0C  E684  '..'
                  	mov	ax,0x40			; 0000FA0E  B84000  '.@.'
                  	mov	ds,ax			; 0000FA11  8ED8  '..'
                  	jmp	far [0x67]		; 0000FA13  FF2E6700  '..g.'
                  
                  	mov	al,0xb			; 0000FA17  B00B  '..'
                  	out	0x84,al			; 0000FA19  E684  '..'
                  	mov	al,0x20			; 0000FA1B  B020  '. '
                  	out	0x20,al			; 0000FA1D  E620  '. '
                  	jmp	short xfa0a		; 0000FA1F  EBE9  '..'
                  
                  	mov	al,0xc			; 0000FA21  B00C  '..'
                  	out	0x84,al			; 0000FA23  E684  '..'
                  	in	al,0x61			; 0000FA25  E461  '.a'
                  	and	al,0xf3			; 0000FA27  24F3  '$.'
                  	out	0x61,al			; 0000FA29  E661  '.a'
                  	mov	al,0xe			; 0000FA2B  B00E  '..'
                  	out	0x70,al			; 0000FA2D  E670  '.p'
                  ;
                  ;   Begin warm boot
                  ;
                  	int	0x19			; 0000FA2F  CD19  '..'
                  
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF     	; 0000FA31
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000FA40
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 0000FA50
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ; 0000FA60
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E,0x7E,0xFF ; 0000FA70
                  	db	0xDB,0xFF,0xC3,0xE7,0xFF,0x7E,0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x10,0x38 ; 0000FA80
                  	db	0x7C,0xFE,0x7C,0x38,0x10,0x00,0x38,0x7C,0x38,0xFE,0xFE,0x7C,0x38,0x7C,0x10,0x10 ; 0000FA90
                  	db	0x38,0x7C,0xFE,0x7C,0x38,0x7C,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0xFF,0xFF ; 0000FAA0
                  	db	0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0xFF,0xC3 ; 0000FAB0
                  	db	0x99,0xBD,0xBD,0x99,0xC3,0xFF,0x0F,0x07,0x0F,0x7D,0xCC,0xCC,0xCC,0x78,0x3C,0x66 ; 0000FAC0
                  	db	0x66,0x66,0x3C,0x18,0x7E,0x18,0x3F,0x33,0x3F,0x30,0x30,0x70,0xF0,0xE0,0x7F,0x63 ; 0000FAD0
                  	db	0x7F,0x63,0x63,0x67,0xE6,0xC0,0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99,0x80,0xE0 ; 0000FAE0
                  	db	0xF8,0xFE,0xF8,0xE0,0x80,0x00,0x02,0x0E,0x3E,0xFE,0x3E,0x0E,0x02,0x00,0x18,0x3C ; 0000FAF0
                  	db	0x7E,0x18,0x18,0x7E,0x3C,0x18,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00,0x7F,0xDB ; 0000FB00
                  	db	0xDB,0x7B,0x1B,0x1B,0x1B,0x00,0x3E,0x63,0x38,0x6C,0x6C,0x38,0xCC,0x78,0x00,0x00 ; 0000FB10
                  	db	0x00,0x00,0x7E,0x7E,0x7E,0x00,0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0xFF,0x18,0x3C ; 0000FB20
                  	db	0x7E,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x18 ; 0000FB30
                  	db	0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00 ; 0000FB40
                  	db	0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x18 ; 0000FB50
                  	db	0x3C,0x7E,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00 ; 0000FB60
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00,0x6C,0x6C ; 0000FB70
                  	db	0x6C,0x00,0x00,0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,0x30,0x7C ; 0000FB80
                  	db	0xC0,0x78,0x0C,0xF8,0x30,0x00,0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00,0x38,0x6C ; 0000FB90
                  	db	0x38,0x76,0xDC,0xCC,0x76,0x00,0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x18,0x30 ; 0000FBA0
                  	db	0x60,0x60,0x60,0x30,0x18,0x00,0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00,0x00,0x66 ; 0000FBB0
                  	db	0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00,0x00,0x00 ; 0000FBC0
                  	db	0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00 ; 0000FBD0
                  	db	0x00,0x00,0x00,0x30,0x30,0x00,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x7C,0xC6 ; 0000FBE0
                  	db	0xCE,0xDE,0xF6,0xE6,0x7C,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00,0x78,0xCC ; 0000FBF0
                  	db	0x0C,0x38,0x60,0xCC,0xFC,0x00,0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00,0x1C,0x3C ; 0000FC00
                  	db	0x6C,0xCC,0xFE,0x0C,0x1E,0x00,0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,0x38,0x60 ; 0000FC10
                  	db	0xC0,0xF8,0xCC,0xCC,0x78,0x00,0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00,0x78,0xCC ; 0000FC20
                  	db	0xCC,0x78,0xCC,0xCC,0x78,0x00,0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00,0x00,0x30 ; 0000FC30
                  	db	0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60,0x18,0x30 ; 0000FC40
                  	db	0x60,0xC0,0x60,0x30,0x18,0x00,0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,0x60,0x30 ; 0000FC50
                  	db	0x18,0x0C,0x18,0x30,0x60,0x00,0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00,0x7C,0xC6 ; 0000FC60
                  	db	0xDE,0xDE,0xDE,0xC0,0x78,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00,0xFC,0x66 ; 0000FC70
                  	db	0x66,0x7C,0x66,0x66,0xFC,0x00,0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,0xF8,0x6C ; 0000FC80
                  	db	0x66,0x66,0x66,0x6C,0xF8,0x00,0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00,0xFE,0x62 ; 0000FC90
                  	db	0x68,0x78,0x68,0x60,0xF0,0x00,0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00,0xCC,0xCC ; 0000FCA0
                  	db	0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x1E,0x0C ; 0000FCB0
                  	db	0x0C,0x0C,0xCC,0xCC,0x78,0x00,0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0xF0,0x60 ; 0000FCC0
                  	db	0x60,0x60,0x62,0x66,0xFE,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,0xC6,0xE6 ; 0000FCD0
                  	db	0xF6,0xDE,0xCE,0xC6,0xC6,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0xFC,0x66 ; 0000FCE0
                  	db	0x66,0x7C,0x60,0x60,0xF0,0x00,0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00,0xFC,0x66 ; 0000FCF0
                  	db	0x66,0x7C,0x6C,0x66,0xE6,0x00,0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00,0xFC,0xB4 ; 0000FD00
                  	db	0x30,0x30,0x30,0x30,0x78,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00,0xCC,0xCC ; 0000FD10
                  	db	0xCC,0xCC,0xCC,0x78,0x30,0x00,0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00,0xC6,0xC6 ; 0000FD20
                  	db	0x6C,0x38,0x38,0x6C,0xC6,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00,0xFE,0xC6 ; 0000FD30
                  	db	0x8C,0x18,0x32,0x66,0xFE,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0xC0,0x60 ; 0000FD40
                  	db	0x30,0x18,0x0C,0x06,0x02,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x10,0x38 ; 0000FD50
                  	db	0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x30,0x30 ; 0000FD60
                  	db	0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00,0xE0,0x60 ; 0000FD70
                  	db	0x60,0x7C,0x66,0x66,0xDC,0x00,0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00,0x1C,0x0C ; 0000FD80
                  	db	0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00,0x38,0x6C ; 0000FD90
                  	db	0x60,0xF0,0x60,0x60,0xF0,0x00,0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8,0xE0,0x60 ; 0000FDA0
                  	db	0x6C,0x76,0x66,0x66,0xE6,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00,0x0C,0x00 ; 0000FDB0
                  	db	0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00,0x70,0x30 ; 0000FDC0
                  	db	0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00,0x00,0x00 ; 0000FDD0
                  	db	0xF8,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00 ; 0000FDE0
                  	db	0xDC,0x66,0x66,0x7C,0x60,0xF0,0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E,0x00,0x00 ; 0000FDF0
                  	db	0xDC,0x76,0x66,0x60,0xF0,0x00,0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00,0x10,0x30 ; 0000FE00
                  	db	0x7C,0x30,0x30,0x34,0x18,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00 ; 0000FE10
                  	db	0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00,0x00,0x00 ; 0000FE20
                  	db	0xC6,0x6C,0x38,0x6C,0xC6,0x00,0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8,0x00,0x00 ; 0000FE30
                  	db	0xFC,0x98,0x30,0x64,0xFC,0x00,0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00,0x18,0x18 ; 0000FE40
                  	db	0x18,0x00,0x18,0x18,0x18,0x00,0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00,0x76,0xDC ; 0000FE50
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00 		; 0000FE60
                  
                  	sti				; 0000FE6E  FB
                  	push	bx			; 0000FE6F  53
                  	mov	bl,ah			; 0000FE70  8ADC
                  	xor	bh,bh			; 0000FE72  32FF
                  	cmp	bx,0x7			; 0000FE74  81FB0700
                  	ja	xfe81			; 0000FE78  7707
                  	shl	bx,1			; 0000FE7A  D1E3
                  	jmp	near [cs:bx+0xfe85]	; 0000FE7C  2EFFA785FE
                  xfe81:	xor	ah,ah			; 0000FE81  32E4
                  	pop	bx			; 0000FE83  5B
                  	iret				; 0000FE84  CF
                  
                  	db	0xBD,0x9C,0xD9,0x9C,0xF4,0x9C,0x1D,0x9D,0x50,0x9D,0x72,0x9D,0xAA,0x9D,0xF1,0x9D,0xFF ; 0000FE85-0000FE95
                  
                  xfe96:	and	byte [0x003f],0xf0	; 0000FE96  80263F00F0
                  
                  xfe9b:	int	0x1c			; 0000FE9B  CD1C  '..'
                  	mov	al,0x20			; 0000FE9D  B020  '. '
                  	out	0x20,al			; 0000FE9F  E620  '. '
                  	pop	dx			; 0000FEA1  5A  'Z'
                  	pop	ax			; 0000FEA2  58  'X'
                  	pop	ds			; 0000FEA3  1F  '.'
                  	iret				; 0000FEA4  CF  '.'
                  
                  	push	ds			; 0000FEA5  1E  '.'
                  	push	ax			; 0000FEA6  50  'P'
                  	push	dx			; 0000FEA7  52  'R'
                  	mov	ax,0x40			; 0000FEA8  B84000  '.@.'
                  	mov	ds,ax			; 0000FEAB  8ED8  '..'
                  	inc	word [0x6c]		; 0000FEAD  FF066C00  '..l.'
                  	jnz	xfeb7			; 0000FEB1  7504  'u.'
                  	inc	word [0x6e]		; 0000FEB3  FF066E00  '..n.'
                  xfeb7:	cmp	word [0x6e],byte +0x18	; 0000FEB7  833E6E0018  '.>n..'
                  	jnz	xfed1			; 0000FEBC  7513  'u.'
                  	mov	ax,0xb0			; 0000FEBE  B8B000  '...'
                  	sub	ax,[0x6c]		; 0000FEC1  2B066C00  '+.l.'
                  	jnz	xfed1			; 0000FEC5  750A  'u',0x0A
                  	mov	[0x6c],ax		; 0000FEC7  A36C00  '.l.'
                  	mov	[0x6e],ax		; 0000FECA  A36E00  '.n.'
                  	inc	ax			; 0000FECD  40  '@'
                  	mov	[0x70],al		; 0000FECE  A27000  '.p.'
                  xfed1:	mov	al,[0x40]		; 0000FED1  A04000  '.@.'
                  	cmp	al,0xff			; 0000FED4  3CFF  '<.'
                  	jnz	xfef7			; 0000FED6  751F  'u.'
                  	test	byte [0x3f],0x7		; 0000FED8  F6063F0007  '..?..'
                  	jz	xfef7			; 0000FEDD  7418  't.'
                  	in	al,0x86			; 0000FEDF  E486  '..'
                  	test	al,0x80			; 0000FEE1  A880  '..'
                  	jz	xfef7			; 0000FEE3  7412  't.'
                  	test	al,0x40			; 0000FEE5  A840  '.@'
                  	jz	xfef7			; 0000FEE7  740E  't.'
                  	and	al,0x3f			; 0000FEE9  243F  '$?'
                  	out	0x86,al			; 0000FEEB  E686  '..'
                  	mov	al,0x92			; 0000FEED  B092  '..'
                  	out	0x4b,al			; 0000FEEF  E64B  '.K'
                  	mov	al,[cs:0x67dd]		; 0000FEF1  2EA0DD67  '...g'
                  	out	0x4a,al			; 0000FEF5  E64A  '.J'
                  xfef7:	dec	byte [0x40]		; 0000FEF7  FE0E4000  '..@.'
                  	jnz	xfe9b			; 0000FEFB  759E  'u.'
                  	mov	al,0xc			; 0000FEFD  B00C  '..'
                  	mov	dx,0x3f2		; 0000FEFF  BAF203  '...'
                  	out	dx,al			; 0000FF02  EE  '.'
                  	test	byte [0x3f],0x7		; 0000FF03  F6063F0007  '..?..'
                  	jz	xfe96			; 0000FF08  748C
                  	in	al,0x86			; 0000FF0A  E486  '..'
                  	test	al,0x80			; 0000FF0C  A880  '..'
                  	jnz	xfe96			; 0000FF0E  7586
                  	test	al,0x40			; 0000FF10  A840  '.@'
                  	jnz	xfe96			; 0000FF12  7582
                  	or	al,0xc0			; 0000FF14  0CC0  '..'
                  	out	0x86,al			; 0000FF16  E686  '..'
                  	mov	al,0x92			; 0000FF18  B092  '..'
                  	out	0x4b,al			; 0000FF1A  E64B  '.K'
                  	jmp	xfe96			; 0000FF1C  E977FF
                  
                  	times	4 db 0xFF		; 0000FF1F - 0000FF22
                  
                  	jmp	xe900			; 0000FF23  E9DAE9  '...'
                  
                  	times	44 db 0xFF		; 0000FF26 - 0000FF51
                  
                  	dec	di			; 0000FF52  FFCF  '..'
                  	pusha				; 0000FF54  60  '`'
                  	push	ds			; 0000FF55  1E  '.'
                  	xor	dx,dx			; 0000FF56  33D2  '3.'
                  	mov	ah,0x2			; 0000FF58  B402  '..'
                  	int	0x17			; 0000FF5A  CD17  '..'
                  	test	ah,0x80			; 0000FF5C  F6C480  '...'
                  	jz	xffb3			; 0000FF5F  7452  'tR'
                  	mov	bx,0x40			; 0000FF61  BB4000  '.@.'
                  	mov	ds,bx			; 0000FF64  8EDB  '..'
                  	mov	al,0x1			; 0000FF66  B001  '..'
                  	xchg	al,[0x100]		; 0000FF68  86060001  '....'
                  	cmp	al,0x1			; 0000FF6C  3C01  '<.'
                  	jz	xffb3			; 0000FF6E  7443  'tC'
                  	sti				; 0000FF70  FB  '.'
                  	call	x8d6f			; 0000FF71  E8FB8D  '...'
                  	mov	ah,0xf			; 0000FF74  B40F  '..'
                  	int	0x10			; 0000FF76  CD10  '..'
                  	mov	ch,ah			; 0000FF78  8AEC  '..'
                  	push	cx			; 0000FF7A  51  'Q'
                  	mov	ah,0x3			; 0000FF7B  B403  '..'
                  	int	0x10			; 0000FF7D  CD10  '..'
                  	pop	cx			; 0000FF7F  59  'Y'
                  	push	dx			; 0000FF80  52  'R'
                  	xor	dx,dx			; 0000FF81  33D2  '3.'
                  xff83:	mov	ah,0x2			; 0000FF83  B402  '..'
                  	int	0x10			; 0000FF85  CD10  '..'
                  	mov	ah,0x8			; 0000FF87  B408  '..'
                  	int	0x10			; 0000FF89  CD10  '..'
                  	call	x8d78			; 0000FF8B  E8EA8D  '...'
                  	jc	xffa7			; 0000FF8E  7217  'r.'
                  	inc	dl			; 0000FF90  FEC2  '..'
                  	cmp	dl,ch			; 0000FF92  3AD5  ':.'
                  	jc	xff83			; 0000FF94  72ED  'r.'
                  	call	x8d6f			; 0000FF96  E8D68D  '...'
                  	jc	xffa7			; 0000FF99  720C  'r.'
                  	xor	dl,dl			; 0000FF9B  32D2  '2.'
                  	inc	dh			; 0000FF9D  FEC6  '..'
                  	cmp	dh,0x19			; 0000FF9F  80FE19  '...'
                  	jc	xff83			; 0000FFA2  72DF  'r.'
                  	call	x8d6f			; 0000FFA4  E8C88D  '...'
                  xffa7:	sbb	cl,cl			; 0000FFA7  1AC9  '..'
                  	pop	dx			; 0000FFA9  5A  'Z'
                  	mov	ah,0x2			; 0000FFAA  B402  '..'
                  	int	0x10			; 0000FFAC  CD10  '..'
                  	cli				; 0000FFAE  FA  '.'
                  	mov	[0x100],cl		; 0000FFAF  880E0001  '....'
                  xffb3:	pop	ds			; 0000FFB3  1F  '.'
                  	popa				; 0000FFB4  61  'a'
                  	iret				; 0000FFB5  CF  '.'
                  
                  	dw	0xFFFF			; 0000FFB6  FFFF
                  	db	0x0000			; 0000FFB8  0000
                  	dw	0x0000			; 0000FFBA  0000
                  	dw	0x0000			; 0000FFBC  0000
                  	dw	0x0003			; 0000FFBE  0300 (replaced during ROM relocation with 0x03nn where nn is the CPU revision identifier)
                  
                  	times	29 db 0xFF		; 0000FFC0 - 0000FFDC
                  
                  	jmp	x9f17			; 0000FFDD  E9379F
                  
                  ;
                  ;   Offset for storing built-in memory table
                  ;
                  ;   (Refer to "Compaq Built-in Memory" description at the top of this file)
                  ;
                  bim_table_offset:
                  	dw	0x7FB6			; 0000FFE0  B67F
                  
                  ;
                  ;   Offset for storing CPU identifier (low byte) and revision number (high byte)
                  ;
                  cpu_idrev_offset:
                  	dw	0x7FBE			; 0000FFE2  BE7F
                  
                  	db	'G'			; 0000FFE4  Product Family Code
                  	db	'4'			; 0000FFE5  Point-Release Code
                  	db	'J '			; 0000FFE6  Revision Code
                  	db	'03'			; 0000FFE8  BIOS Type Code
                  	db	'COMPAQ'		; 0000FFEA  Machine ID
                  
                  	jmp	0xf000:reset		; 0000FFF0  EA05F900F0
                  
                  	db	0x20			; 0000FFF5
                  	db	'01/28/88'		; 0000FFF6  BIOS Revision Date
                  	db	0xFC			; 0000FFFE  Machine Type Code
                  	db	0x98			; 0000FFFF  Checksum
                  
                • makefile
                  #
                  # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it.
                  #
                  
                  all: 1988-01-28-test.rom
                  
                  1988-01-28.rom: 1988-01-28.json
                  	node ../../../../../../modules/filedump/bin/filedump --file=1988-01-28.json --output=1988-01-28.rom --format=rom
                  
                  1988-01-28-test.nasm: 1988-01-28.rom
                  	ndisasm -o0x8000 -se105h -se05ah -se6ffh -sf025h -sf8aah 1988-01-28.rom > 1988-01-28-test.nasm
                  	node ../../../../../../modules/textout/bin/textout --file=1988-01-28-test.nasm --nasm > temp.nasm
                  	mv temp.nasm 1988-01-28-test.nasm
                  
                  1988-01-28-test.rom: 1988-01-28-test.nasm
                  	nasm -f bin 1988-01-28-test.nasm -l 1988-01-28-test.lst -o 1988-01-28-test.rom
                  
              • 1988-05-10
                • 109591-003.hex
                  2D BE FF 8B 2E 04 00 74 EB 90 24 80 C0 FC 75 E8 
                  00 58 13 33 E8 72 88 00 2E 1E 00 64 61 9C BA 0C 
                  E4 8A F6 80 10 61 10 E0 F8 FF EC F8 9D 86 32 D1 
                  8B 50 89 02 0E 00 4E C7 00 00 B0 EE EC E0 B0 EE 
                  EC 50 51 B8 00 C0 02 09 01 17 05 00 7C B1 B5 B0 
                  E8 00 7E 07 5B C3 52 8A 8C 88 4C 8E BB 00 C7 00 
                  26 47 FF FC 26 1F FC FC 83 00 C6 00 00 08 4C 2A 
                  EB 90 2E 00 06 16 00 C7 4C 2A FE 32 C1 06 5A C3 
                  51 56 BB 00 05 BF 00 D2 F3 C2 B6 89 93 4F E2 FC 
                  93 BF 00 0B F3 FC 93 BF 80 0B F3 5F 5A 5B 53 52 
                  56 18 B7 B3 B8 1C C0 00 B4 CD 0A 5E 5A 5B 60 06 
                  00 8E 8E FC C0 00 B9 00 AB 08 B8 1C 10 F7 05 00 
                  D2 89 02 54 C6 05 C7 5F BE 00 00 BB 00 E3 B8 80 
                  00 44 88 04 44 92 04 00 30 8C B3 E8 00 18 B8 1C 
                  92 61 BE 00 40 B3 E8 00 28 8C B3 E8 00 40 B8 B0 
                  92 41 BE 00 00 B3 E8 00 50 B8 C0 92 2B C6 54 C0 
                  06 00 BE 00 00 B3 E8 00 C8 D8 B8 BF 00 07 41 E9 
                  A5 1F C3 04 FF FC E0 C0 04 44 88 04 5C C7 06 00 
                  50 8E A3 A8 74 F9 1F 96 97 8A B0 E8 76 76 B0 E8 
                  76 E0 97 81 A3 00 58 50 8E 75 8A 80 10 C9 03 E4 
                  B0 E8 76 C3 E8 44 E8 00 00 BB B6 11 E8 44 56 63 
                  5B 0D BA 00 94 B9 00 94 C3 60 24 3C 74 E9 00 E3 
                  80 FE 73 FB 74 0A 74 B7 8A 24 3C 74 3C 74 B7 3A 
                  72 BE B6 C7 8A 24 C0 02 03 4E 02 03 C7 3A 72 BE 
                  B6 C7 8A 24 C0 04 03 32 02 03 C7 3A 72 BE B7 C7 
                  8A 24 C0 06 03 16 02 05 C7 74 3A 73 1E C8 D8 41 
                  1F 1E C8 D8 00 32 B9 80 02 E2 74 BA 50 37 B9 00 
                  E2 EB 1F 30 30 30 30 30 20 4B 42 20 4F 4B 8A 49 
                  88 01 1E 03 5D 8A 07 03 A3 52 56 B4 E8 00 4E E3 
                  8B 0C 46 8E FC 8B 06 7E 01 13 07 0F 08 0B 0A 07 
                  0D 03 AC 51 50 40 8E 58 1D 1F E2 5A 8A 07 46 01 
                  05 02 4F 1F 26 00 66 C3 07 3B 08 37 0A 33 0D 2F 
                  01 B4 E8 00 03 29 FE 3A 4A 75 32 FE 80 19 0B CE 
                  0A 0E 0F 32 B4 E8 00 B4 E8 00 F8 53 BB 00 C3 42 
                  8C 26 07 5B 74 CD C3 0E 12 C3 0E 91 8A B0 E8 74 
                  01 03 CC 8A A8 74 BA 20 7D B9 00 CC EB A8 74 BA 
                  20 7D B9 00 BA F6 10 01 0C 00 BB B8 1B E8 42 10 
                  0C 00 BB B8 18 E8 42 06 00 74 32 0A 12 74 E8 72 
                  9E E8 72 37 C0 64 A0 72 E8 72 29 60 80 23 C0 06 
                  00 0F 83 74 80 96 10 94 EB BA 20 38 B9 00 46 33 
                  E8 72 01 E8 00 C0 06 00 03 06 C6 12 00 60 00 BB 
                  B9 18 E8 42 3C 74 E8 00 06 00 61 FA 21 FD 21 33 
                  8E 26 1E 00 C7 24 72 FB E8 40 26 1E 00 B0 E6 B9 
                  FF 35 E4 A8 74 E2 B0 E6 C3 E4 B0 E6 58 B4 CD 80 
                  3B F7 B8 00 8E C6 00 FF C7 8D 00 C6 8C FA DB FF 
                  F0 FF 88 4C B8 00 C0 C7 00 26 45 FF FC 26 05 FC 
                  FC 0B 26 05 04 C1 0B C3 3A 74 FE EB 81 80 76 89 
                  8D 88 8C 07 B4 C7 82 80 C6 8F FF 06 00 BD 00 95 
                  81 80 0B 74 88 66 89 67 88 69 81 64 41 C3 7F 84 
                  C0 50 C7 FF 89 02 44 0F 44 92 44 88 07 48 C7 FF 
                  89 02 44 FF 44 92 44 88 07 1E 50 8E B8 00 C0 F6 
                  FF 00 FC F3 BB FF 3F E2 8B 1F 06 00 C6 57 80 1E 
                  00 B8 00 D8 61 0C E6 A0 00 06 00 24 26 45 58 61 
                  C6 10 B1 70 71 E0 B0 70 71 00 B9 3F CB C1 02 DB 
                  E3 26 5D 26 5D B5 32 C1 04 89 06 FE E8 88 26 45 
                  B9 7F 00 32 FC AC E0 FA D4 C4 88 C6 00 FC 84 07 
                  E8 00 60 8B BB 02 C1 74 BB 02 C1 74 BB 01 00 F7 
                  FE 88 90 8A 24 3C 74 BB 04 C1 75 BB 08 C1 75 BB 
                  28 00 F7 FE 88 91 C3 FD 00 04 8A C0 02 03 02 05 
                  C3 EB 3C 75 80 04 E7 B8 00 D8 00 8A 02 B0 C3 44 
                  C6 FF 04 C6 FF 04 1F E4 62 0A 75 B3 32 B8 04 E3 
                  00 F7 FE 88 91 C3 06 00 FF 06 00 00 06 00 C6 55 
                  92 06 00 C6 57 80 53 50 8E E4 8A 0C E6 E6 8B 00 
                  C6 00 FF 84 FC FC FC FC FC FC FC FC E0 61 C3 1F 
                  00 00 00 00 FF 00 C0 00 FF 00 00 00 FF 00 0F 00 
                  FF 00 00 00 FF 00 FF 00 FF 00 FF 00 FF 00 0E 00 
                  FF 00 FD 00 FF 00 FE 00 4F 01 0F 4F 01 FF FF 00 
                  00 87 18 D5 18 05 18 DB 18 2E 01 51 0F C0 01 0F 
                  C0 FF 63 B8 00 C0 2F 88 E6 FC FC FC FC FC FC FC 
                  FC B8 00 C0 20 66 FE FF 0F C0 B9 00 2E 01 5D FF 
                  2E 01 51 0F C0 01 0F C0 FF 67 B8 00 C0 61 E0 08 
                  61 C4 8A 26 06 00 E6 EB 2E 01 51 0F C0 01 0F C0 
                  FF 6B B8 00 D8 C0 64 FF FA 64 02 05 F8 90 B9 FF 
                  64 01 05 F8 82 E4 A8 75 66 06 C0 00 B8 00 A1 C4 
                  00 25 80 00 0D 00 C7 00 00 00 EB EB 66 06 C0 00 
                  56 00 C7 00 00 00 EB 66 06 C0 00 64 00 C7 00 00 
                  00 EB 66 06 C0 00 30 00 C7 00 00 FF B0 E6 E4 86 
                  B0 E6 86 0C E6 EB B0 E6 E4 86 B0 E6 86 24 E6 B8 
                  00 D8 DC 2E 01 51 0F C0 01 0F C0 FF 6F B8 00 D8 
                  F6 04 E6 B8 00 D8 48 8E 33 B9 40 66 A5 08 8E 33 
                  C6 FC 84 10 8E E9 FE 0D 04 72 B0 52 D2 C0 02 20 
                  00 17 C4 74 F9 C3 3E 64 36 AB AD AF 6F C3 D9 29 
                  37 7C 8A A0 51 8B 50 52 1E 0B 20 20 20 55 ED C8 
                  D8 46 8B 04 8A 80 F2 05 F9 75 43 4E B5 EB 8B FC 
                  2C AC 00 09 C1 F7 8B EB BE 8A DE 3C 74 3A 75 8B 
                  08 E4 2B 4E E6 FF 3B EB 1F 5A 58 59 15 1F 5A 58 
                  59 8B 80 01 03 4E 80 00 04 4F 02 47 8B 3B 75 80 
                  01 06 4E FF 02 FC 74 4F 4E 4E EB 47 46 46 EB 83 
                  FF 0D FC 74 4E EB 46 EB 80 01 03 4E 80 00 06 4F 
                  4E 04 47 46 8B 80 00 04 4E 02 46 8B 3B 75 80 00 
                  08 4F 4F 4E 31 47 47 46 29 FE 75 80 00 06 4E 4F 
                  19 46 47 13 FD 75 FF 02 FC 74 4F EB 47 C3 F2 FC 
                  74 4F EB 47 C3 F2 FD 75 FF 02 FC 74 4F EB 47 C3 
                  F2 FC 74 4E EB 46 C3 8A 4A 8B 02 D3 04 D3 CA C4 
                  74 87 2A 2A F6 F6 EB 2A 2A FE FE E8 01 21 3E 00 
                  72 80 49 03 13 52 16 00 C2 A0 00 F7 5A EB 80 49 
                  04 07 3E 00 75 8B 2B 81 FF D1 8B 8A F6 32 03 D1 
                  03 4E 97 C6 DE F0 E3 C6 01 04 D8 DD E0 C7 0A 74 
                  3A 73 2A 8A F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 
                  75 B8 00 D8 36 74 80 49 02 12 3E 00 77 8B 63 83 
                  04 65 EE 80 49 06 04 E1 E2 50 52 F8 C5 ED BA 01 
                  E2 C1 06 00 8B 98 40 F7 F7 00 74 F7 F7 81 F0 80 
                  49 06 01 03 8C 8E 96 53 DF C0 30 C6 2C F0 D0 D0 
                  8B 8B 8B 8A F3 8B 8B 81 00 81 00 8A F3 03 03 FE 
                  75 58 F0 E6 E6 8A 8B 8A F3 8B 81 00 8A F3 03 FE 
                  75 C3 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 
                  0C 61 F3 61 BB 00 00 33 66 C5 1F F6 00 9E D1 9F 
                  46 46 C3 F3 23 61 C0 00 1B 09 66 D3 83 04 DA B1 
                  66 D3 66 7A 1F C0 C6 00 E4 0C E6 24 E6 59 D6 F9 
                  F6 87 04 FF FF FF FF FF 31 00 50 1E 40 8E B8 00 
                  4E 1F 58 8B 83 10 8E 8B 8E B9 04 CB D1 49 FC 00 
                  BE 8E 2E A1 02 06 02 03 00 3D 01 0A 24 B8 E9 8C 
                  AB 6C B8 8D 8C AB 53 AB C8 8E 26 06 00 90 8C 92 
                  FB DC BF 03 85 B4 CD EB 33 8E 8B 52 85 75 E9 59 
                  C0 2E 02 B4 CD B8 0C 21 3D 75 C6 FF 0D 06 19 21 
                  41 5F 41 DC 59 24 A2 03 B3 C9 0E 03 0E 03 C7 93 
                  00 33 1E DB 1A 21 BA 03 27 21 8E 8B 14 8B 04 1F 
                  49 BA 03 27 21 02 75 91 C8 8B 81 E0 8E 33 B4 CD 
                  1F 85 B4 CD B4 CD 80 00 0C 3A B4 CD B8 0C 21 C5 
                  DD 80 B4 CD CB 00 0A 6E 65 74 43 4D 41 20 53 44 
                  53 64 73 65 74 0D 45 74 72 64 69 65 73 65 69 69 
                  72 24 0A 0A 65 6E 65 74 64 73 65 74 20 6E 64 69 
                  65 41 69 20 65 65 73 72 0D 53 72 6B 20 6E 20 65 
                  20 68 6E 72 61 79 0A 00 41 49 41 20 58 00 5B A8 
                  74 E8 02 27 62 E8 39 C0 F7 EC 80 0B 06 4E 01 88 
                  41 C3 33 A8 75 32 EB E8 FF 5B D9 F6 10 0F 27 FC 
                  75 80 03 EC EB E8 41 87 03 08 07 04 02 61 27 0C 
                  E8 3A 46 50 46 02 AD C6 05 E8 5E 88 05 06 F7 EC 
                  80 02 80 26 00 4E 01 C3 FF 8F 74 F6 80 44 F8 E4 
                  46 3C 72 B4 81 16 00 30 C0 22 93 01 10 74 02 11 
                  15 03 0B 97 07 01 76 EB B0 E8 41 37 88 E8 41 C7 
                  E8 01 27 84 F6 10 03 01 C3 1B 8A 88 02 76 8A 05 
                  27 35 C9 75 E8 40 7E 00 03 E8 24 3C 73 E8 39 EF 
                  B4 88 E8 41 06 46 04 46 01 E8 5C 74 E8 39 D1 B4 
                  88 E8 41 06 46 04 46 01 E8 5C 74 E8 39 B3 B4 88 
                  E8 41 04 46 04 46 01 E8 5B 74 E8 39 95 B4 88 E8 
                  40 06 46 04 46 01 E8 5B 74 81 16 00 75 8A 02 27 
                  CA 8A 41 EB EB E8 40 17 29 80 06 75 C0 04 0F 04 
                  05 07 EC E8 40 C4 E8 00 27 98 C6 02 8F 00 C0 76 
                  9D 32 8A 06 FC 72 B4 81 16 00 19 00 15 0A 74 B4 
                  A8 75 04 24 2C 74 B4 C3 DB 5E 81 90 C3 9C E4 8A 
                  E4 E4 2A 3C 77 E4 9D C3 F6 B0 EE E6 E8 65 A8 84 
                  BA 03 FD FD FD FC 0F C0 03 56 83 0D EC C0 D8 36 
                  00 40 8E C6 40 FF 14 C6 06 C6 07 E8 00 46 01 92 
                  C6 05 E8 5C AF 84 F2 B0 EE 26 00 83 0D B3 E0 C9 
                  24 86 B0 E8 66 C0 D8 C8 1E 00 02 C5 3E 00 02 C5 
                  ED 0C CD E5 80 01 2E 00 E8 3F 40 39 FD 8A C0 04 
                  E4 0A 74 86 E8 00 08 E8 00 1D 0E B3 E0 6D 0C 86 
                  E8 66 02 8A 80 20 8E 5E FB FF 05 07 2A B4 E8 3F 
                  ED C6 00 46 30 EF C6 05 E8 5B 04 68 8A 06 62 B9 
                  A8 FA 75 E2 EB E8 FE A8 75 80 05 74 FE 05 D3 07 
                  01 7E 00 05 C7 EB B4 B0 E8 3E 99 88 E8 3E 01 8F 
                  05 3C 74 3C 75 B0 EB B0 3A C3 0A 6F 2D 79 74 6D 
                  64 73 20 72 64 73 20 72 6F 0D 72 70 61 65 61 64 
                  73 72 6B 20 6E 20 65 20 68 6E 72 61 79 0A 0D 36 
                  32 44 73 65 74 20 6F 74 52 63 72 20 72 6F 0D 24 
                  02 B9 FD 80 70 71 FF 0A F4 74 B9 FD EC E5 FF FF 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  8B 66 53 FC 01 85 5E 8E 8B 02 1F FB 75 B0 E6 FF 
                  02 A5 81 0F 74 B0 E6 1F 66 5D F9 B0 E6 E8 5C 07 
                  A0 BB 00 DB 20 66 11 00 8B 06 66 E1 00 00 0B 66 
                  66 C0 18 66 A1 00 AB 26 B9 00 66 E2 0F F0 AB 21 
                  66 66 C0 16 66 BE 00 66 8C 66 8C 66 B9 00 66 E2 
                  BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 
                  00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 
                  33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 BE 00 33 
                  8B 02 AB 8B 66 FF FF 66 66 C0 44 66 66 00 92 66 
                  66 C0 E8 E0 66 B8 FF AB B8 00 00 AB 33 8C C1 04 
                  AB FF 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 
                  44 66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 
                  66 BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 
                  BE 00 33 8B 02 AB 8B 66 FF FF 66 66 C0 44 66 E8 
                  5B 33 BF 13 07 5B 58 CF 9E 9E 97 97 97 97 05 0B 
                  E4 F0 E6 FF 70 C3 26 00 0A 75 80 87 10 C3 0A 74 
                  8B 63 83 04 65 0C A2 00 EB 8B 63 83 04 65 24 A2 
                  00 5A C3 A6 AC AC 80 DF A7 8B 8B C2 98 98 A7 F5 
                  F5 CE A7 83 83 83 83 97 5A 5B 5F 1F CF FF FF FF 
                  FF FF E9 03 FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF D3 FF FF FF FF FF FF 
                  E9 03 3A 74 80 49 04 0A 3E 00 74 EB 90 9E 8B 63 
                  83 06 E0 A8 75 FA A8 74 8A AA FB EE 80 49 04 07 
                  3E 00 75 E8 2A 47 FC E8 F4 2E 3E 00 72 80 49 07 
                  36 E3 54 8B 63 83 06 D8 A8 75 FA A8 74 8B AB E2 
                  C3 3E 00 72 80 49 07 08 E3 26 F3 C3 42 8A 06 3E 
                  00 CA DA 6E 0A 79 33 8E C5 7C 25 00 E0 E0 E0 F0 
                  FF 74 83 10 C4 06 D7 C7 53 F8 E3 B5 AC 08 E2 E2 
                  E0 02 D3 C9 F2 C6 E2 FE 75 5B 07 8C 8E B9 00 F4 
                  D0 79 26 05 81 FE AD FB 03 33 AB EF 1F E4 EF 01 
                  75 83 10 2E E3 D1 DE 04 8B AC FC 03 32 AA C7 1F 
                  D0 79 26 05 81 B1 E2 81 3F 4A D8 B8 C8 E8 00 80 
                  76 B8 E0 D8 DB 3F AA 39 F6 00 AD D8 DC F9 18 40 
                  8E 80 12 FF 00 BB B7 0F E8 2D 13 40 8E 1E D8 03 
                  50 EC 5E 58 B8 00 D8 8E 33 81 55 75 33 33 8A 02 
                  E1 D1 02 E2 75 B1 D3 52 40 8E 1E D8 03 50 F4 33 
                  36 1C ED 0C B8 00 D8 0E 00 1F 58 D8 5A DB DA C3 
                  1C 80 72 EB 60 1E 00 BB B8 14 E8 2C 07 BA 00 D8 
                  C2 1E B8 C0 27 75 3D C7 F6 C0 1F 1E B8 C0 E8 00 
                  74 50 C2 4B 58 80 76 07 C3 8E 33 81 55 75 33 33 
                  8A 02 E1 D1 02 E2 75 B1 D3 8C 03 C3 06 BA 50 69 
                  B9 00 5E 1F 61 80 8C 03 33 C3 D8 40 8E 1E 03 50 
                  EC 5E 58 C3 2E 0C 46 3A 74 E2 F8 05 2E 04 59 FF 
                  B1 B3 B5 B7 B9 2D 08 71 65 74 75 6F 5B 0D 61 64 
                  67 6A 6C A7 FF 7A 63 62 6D AE FF FF FF 21 23 25 
                  26 28 5F 08 0B 1A 1B 1C 27 28 29 2B 33 34 35 39 
                  37 39 34 36 31 33 2E 00 77 84 73 74 75 76 8D 8E 
                  8F 90 91 92 93 00 1E 1F 1B 1D 0A 1C 00 97 98 99 
                  9B 9D 9F A0 A1 A2 A3 FF B0 E6 B0 E6 58 23 FA F7 
                  C2 EE E0 EE EA 32 8A EE FE AC 4A F5 E5 20 8E 06 
                  FF 00 F3 8B 8A 03 FF FF FF FF FF FF FF FF FF E9 
                  00 FF FF FF 06 01 85 17 84 40 8E B0 E6 E6 32 E6 
                  26 06 00 74 26 26 00 07 CD CF 55 56 1E EC 8B 26 
                  0E 00 D9 00 8B 06 F0 E6 00 E8 8B 08 E3 F0 C3 D8 
                  10 AC E0 F8 D8 05 F5 0D AC FF 81 08 F8 46 9B 66 
                  83 10 59 5B 07 CF B0 E6 B0 E6 B0 E6 58 0A 1E B8 
                  00 D8 32 FA 06 00 0E 00 16 00 1F A8 1E B8 00 D8 
                  89 6E 89 6C C6 70 00 58 E9 61 18 B0 E8 5B F0 02 
                  E7 8A B0 E8 5B E8 72 B0 FA D5 A8 74 FB F3 E8 FF 
                  00 E6 C8 B0 8A E8 5B 04 E5 BA B0 E8 5B 02 FB FE 
                  D2 02 01 E0 0B A2 E9 61 BC B0 E8 5B D0 08 8B 8A 
                  B0 E8 5B C8 32 7D 8A E9 61 9A B8 00 74 B0 8A E8 
                  5B 08 E6 66 B0 8A E8 5B 0B 55 0C 24 8A B0 E8 5B 
                  32 E5 48 E9 60 B0 E8 5B 20 08 5B C0 CA 00 0A 29 
                  A8 75 B0 8A E8 5B 03 E1 1C B0 8A E8 5B A1 FE A1 
                  0B 05 0C 8A B0 E8 5B 90 FA 0B F3 24 8A B0 E8 5A 
                  7E 8A B9 F4 84 75 E8 F3 F6 CC EF 80 B4 C3 C0 FE 
                  26 05 F9 F9 26 05 F9 F9 C3 0E FA B1 0E 03 EB 90 
                  A8 75 9C B0 E8 5A E8 00 02 CF 01 33 C3 8E FA 89 
                  0E 03 EB 90 A8 75 9C B0 E8 5A E8 00 02 CF 01 33 
                  C3 1E 40 8E 66 10 66 FF 00 66 B0 E6 E4 A8 66 74 
                  66 00 00 1F E8 FF 68 3E 00 74 80 49 03 02 58 FF 
                  C7 74 8A 00 00 09 01 46 E4 EB B8 F0 3B 74 FC AB 
                  C8 FB 65 8A 66 8B 63 B9 00 A0 BB 01 3D 83 04 65 
                  EE 0F 2F B4 E8 E5 02 25 B4 E8 E5 FC AD E4 A8 58 
                  25 EE 66 04 50 48 8E E4 8A 0C E6 8A 00 C6 00 FF 
                  C4 61 1F CB F7 7E 00 17 FD 75 B0 E6 E4 A8 74 24 
                  75 0C EB E8 31 2E 11 74 BE A0 63 A8 74 BE A0 0F 
                  8A 8A 80 06 FF 74 BE A0 E3 74 BE A0 31 24 B4 FE 
                  74 FE 74 83 05 F3 46 00 C7 04 00 46 00 46 00 C7 
                  0A 00 89 75 EB E8 31 DC 4E 2E 54 89 0A DB 71 75 
                  E8 31 05 8A 32 89 02 8A 02 6E 2E 4C 88 04 46 01 
                  7D 75 E8 F1 3F 75 87 E8 F2 F7 7C 88 06 C0 66 FE 
                  87 C3 09 FB 02 4F 21 09 22 04 4F 21 F7 CD 8B 04 
                  0D 75 E8 31 26 01 1A C6 3C 74 83 0C 03 0C C6 2E 
                  54 74 83 06 3B 01 0C 35 00 28 3B 01 36 13 80 00 
                  07 F7 0C 87 2E 54 E8 F1 17 4E 2E 54 89 0A 66 01 
                  33 EB 81 16 00 0C C0 1A 4E 01 B4 32 E8 F0 3F 75 
                  87 50 CC 58 F7 F7 01 27 FB 02 27 08 02 4F 15 03 
                  4F 22 03 4F 2F 04 4F 3C FF FF FF FF FF DF 25 09 
                  FF F6 08 80 02 02 2A 50 0F 27 DF 25 0F FF F6 08 
                  00 02 02 2A 50 0F 4F DF 25 09 FF F6 08 80 02 02 
                  1B 65 0F 4F 8B 20 2A 38 FF 00 00 00 FB 1E BF 00 
                  DF 01 33 1D 06 00 75 80 A0 01 51 FA A1 FE A1 E8 
                  00 EB F6 A0 01 03 EB E8 00 26 00 EB F9 B4 1F CA 
                  00 B0 E8 57 40 8A B0 E8 57 FB FA 0B 2F 24 50 E0 
                  0B 2A 58 C3 1E 00 06 00 16 00 0E 00 FB FA 74 4A 
                  0F 86 C3 E4 01 EC F0 8C BA 02 24 3C 75 33 33 33 
                  33 EB 55 EC 8B 88 00 E8 00 F9 0F C7 0C 00 5E 89 
                  0A E0 24 32 75 8B E8 00 D9 5E 3B 0A E2 2C DF 3E 
                  2B F6 01 03 5E F6 02 03 5E F6 04 03 5E F6 08 03 
                  5E 38 00 B4 58 5B 5A 5D C1 04 EB C1 04 EA F8 50 
                  00 43 40 C8 40 E8 C3 5F 53 40 8E F6 A0 01 2E 06 
                  00 06 C3 1E 00 1B 07 E4 24 EB EB E6 FB E5 F6 A0 
                  80 F9 26 00 F8 01 5B 5F 02 FB 5F 06 B8 00 D8 26 
                  00 16 00 00 80 F3 74 1F 61 03 FB 5C 26 07 FF C8 
                  E0 26 47 8C C1 0C 88 04 C6 05 8D 28 C7 FF 8C C1 
                  04 89 02 D0 E8 26 47 26 47 92 56 C8 C0 36 A5 E4 
                  8B E8 00 07 5C 26 57 26 47 26 07 00 B0 E6 26 01 
                  E8 00 89 02 C2 26 47 26 07 FF C6 05 26 01 0F E0 
                  01 0F F0 FF 49 33 0F D0 28 8E B8 00 D8 18 8E FC 
                  F6 FF 00 70 D1 66 A5 F7 01 74 A5 80 70 28 8E 8E 
                  8E 66 0F 00 25 FF 7F 22 66 EA A3 F0 0F 1E A1 5C 
                  E8 48 19 D1 64 41 75 B0 E6 E8 48 07 FF 64 2F C3 
                  02 61 40 17 4E E8 01 02 04 04 0C E6 24 E6 B4 8A 
                  E6 EB 8C C1 04 C6 51 C1 C6 E8 03 C1 0C C3 40 8E 
                  8E 69 8B 67 E8 00 00 70 07 86 E4 86 55 EC E4 0C 
                  66 FE 81 06 00 0A 66 BF 81 06 00 CF B3 75 B0 E6 
                  E8 47 12 DD 60 A1 75 B0 E6 E8 47 04 03 80 5F B0 
                  E8 54 E0 30 3F CF 5F E8 FF 06 FF CA 00 53 5C 26 
                  07 FF C8 E0 26 47 8C C1 0C 88 04 C6 05 5B B0 E6 
                  8A E6 B0 E6 B0 E6 B0 E6 B0 E6 8A E6 B0 E6 B0 E6 
                  B0 E6 8D 08 0F 17 5C 26 01 55 EC 46 30 5D 01 0D 
                  00 01 2E 2E A1 C0 00 B8 00 D0 18 8E B8 00 C0 E4 
                  CA 00 1E B8 00 D8 10 80 07 75 80 04 75 83 02 75 
                  BB 00 47 92 20 8E BB FF 8B 26 07 0F 05 FF EB B8 
                  00 DB 1F C3 C8 C0 F5 33 C3 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A4 00 86 00 A4 00 86 
                  00 A4 00 86 00 A4 00 86 00 A1 00 30 3C 58 17 07 
                  15 1E 00 E3 C0 04 FF 8A 42 EB B0 A2 00 49 BB B0 
                  B4 3C 74 BB B8 D4 8E 89 63 98 B0 83 04 83 04 C0 
                  4E A2 00 8A 12 A3 00 E3 8B 1A A3 00 EB 8A 2A 80 
                  3F 65 24 0A A2 00 8A 32 88 66 B9 00 E8 00 8A 0A 
                  8A 0B 49 24 3C 75 26 7C 0D 0E C5 47 8A 8A E8 00 
                  C8 89 60 A0 00 07 07 04 00 73 B8 07 FF 00 F3 1E 
                  BF 00 C0 08 F3 F6 87 10 06 F4 E8 1E 65 83 04 C3 
                  25 00 03 E0 0E F1 FC 72 FE 59 32 8A 49 1E F6 DE 
                  36 00 8A 3A 03 56 B2 E9 F4 5E D8 C0 C3 07 62 98 
                  52 26 00 4E 5A D1 B4 E8 05 D1 8B 50 E9 05 66 0A 
                  75 80 1F E0 C3 0B 05 E3 E3 24 0A A2 00 C2 EE A0 
                  00 46 A0 00 46 A0 00 46 C3 28 50 28 50 08 08 10 
                  10 40 40 40 40 28 29 2E 29 30 30 30 30 00 10 20 
                  30 01 07 1B 1B E2 1B 1B FF 95 1B FE E9 1B 1B 1B 
                  8A EF 1B F0 F8 F8 EC E7 F8 E8 EF E7 E6 FE FF FF 
                  F0 EF 00 4A 1C 1B 1B 1B 1C 1B 1B 1B 03 02 03 03 
                  02 14 14 01 01 00 00 30 84 40 8E 8B 13 5A ED C0 
                  00 33 8E B9 80 AB C5 10 EE EF B8 00 C0 1E 00 C0 
                  C0 80 B9 00 C8 96 2E AB F8 C0 C0 80 B9 00 00 AB 
                  E2 B0 E6 33 8E BE A8 C0 B9 00 C8 A5 E2 B0 E6 BE 
                  A8 00 B9 00 C8 A5 E2 57 7E 33 26 05 B0 E6 B8 00 
                  D8 00 E4 3C 75 8A 89 72 B0 E6 B4 B9 00 DB D2 C4 
                  87 8A 03 FE E2 B0 E8 4F D0 AE 73 8A 3B 74 B0 E8 
                  4F 40 E0 8E 64 B0 E6 B0 E6 BB 00 D8 C0 38 84 98 
                  BF 00 02 2E 92 42 3C 74 80 02 4A AB ED 39 84 9C 
                  BF 00 03 2E 92 F6 EE E0 3A 75 80 40 AB EB 3A 84 
                  A2 BF 00 06 F3 A5 C9 F9 40 8E 89 10 B0 E6 E8 18 
                  0E 00 B0 E8 4E 40 10 AD D7 A8 74 80 87 FB 11 84 
                  2E 47 E8 F3 05 26 00 C6 84 18 94 B1 24 8A 50 B0 
                  E6 E8 F0 58 0F FC 74 E8 01 53 84 3E C3 40 8E E8 
                  4C 09 05 05 26 00 C3 FF E9 03 50 84 40 8E B0 E6 
                  B0 E8 4E C0 05 FF 0A B0 E8 4E 30 E0 1E 52 84 E2 
                  1F 74 C3 06 E8 F3 0C C0 C0 74 26 05 F0 26 00 80 
                  10 30 00 07 10 26 00 80 10 20 00 03 10 C0 58 1F 
                  54 84 65 73 BB B7 1D BD AA 02 EB 24 50 20 58 1C 
                  D0 40 B0 E6 58 10 73 B0 E6 E8 1C 78 E8 1C BA BA 
                  DA C3 0A 75 87 B0 B5 80 10 10 03 20 FC 74 E8 00 
                  03 20 26 00 08 10 50 2E 47 E8 F2 58 02 C3 B0 E6 
                  58 00 10 C0 53 FC 74 E8 00 0E 00 5B 8E 06 9D B0 
                  74 F9 E8 37 03 01 C3 8E 57 0C 8A B0 E8 4D B0 E6 
                  0E BB BA 59 84 47 E8 F2 03 82 B0 E6 B0 81 B8 75 
                  B0 8B EE 5B 84 D2 FF 4F 8B 32 7B FE 32 AA F3 FF 
                  4F 8B 32 7B FE 32 AE F3 05 F2 75 B0 E6 9C 02 E9 
                  EF C9 57 B4 E8 00 74 B0 E6 53 57 33 8A 0C 5F 1E 
                  40 8E A0 00 E8 1B 35 58 03 12 1F B0 E6 83 0F FB 
                  BA 03 5F B0 E6 C3 20 72 E8 4B C0 64 14 72 E8 4B 
                  02 60 FF FF FF FF FF FF FF FF FF FF EA 8E F0 0E 
                  00 49 24 3C 75 33 8E C5 74 80 19 75 F7 18 75 8B 
                  81 60 8A E8 00 E8 C1 0A 8A 0B B4 E8 00 24 B4 F6 
                  D1 D1 D1 14 C3 FF 77 86 32 D1 8B 02 8F 00 62 3A 
                  07 33 33 86 F7 4A 03 A1 00 E8 C8 B4 8A EE 8A EB 
                  EB EE FE 8A EB EB EE 8A EB EB EE C3 C4 42 C5 00 
                  00 4A C4 C4 00 00 42 C1 00 00 4A E5 B8 00 D8 FE 
                  BA 01 10 33 BD AD 87 E4 0C E6 24 E6 BA 01 10 33 
                  BD AD 83 73 56 E8 47 5E 1B 4B 61 40 B8 00 00 0F 
                  FB F9 05 82 EB 33 1F 50 8A 26 05 61 0C 61 F3 61 
                  66 C0 19 03 86 80 0F F6 04 DC 05 E2 33 32 EB 66 
                  04 26 05 F7 04 A8 75 66 E8 46 F5 C8 D6 F9 FF FF 
                  FF FF FF AE AE AE AF B0 B0 B2 B2 B0 B0 AE AF B1 
                  B1 B2 B2 B1 B2 B2 B2 B2 B2 FA 73 CD 50 55 EC 46 
                  89 0A 9D EB 60 06 00 EC FC 76 B8 00 D8 66 EB 81 
                  1A FF 4E 00 FB 33 8E C4 04 F6 01 04 36 01 40 8E 
                  8B 8A 15 E3 FF E6 07 1F CF 66 88 74 B2 CD 8A 10 
                  9F 80 11 81 0D 05 E8 02 05 05 DB C3 74 88 14 26 
                  00 66 C3 DB 72 E8 04 20 F6 08 74 0C 80 15 75 0C 
                  50 8A 07 C0 02 04 46 58 48 E8 05 C2 F8 7F 7E 0A 
                  06 C4 02 C6 66 88 01 04 E6 04 09 4A C3 E8 05 42 
                  DD 72 8A E8 06 12 FC 74 F6 08 2C 12 EB E8 05 2D 
                  72 E8 05 7E 0A 05 05 72 FE 01 C5 46 01 75 E8 05 
                  03 2D C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 9C E8 04 7D E7 B0 26 44 C0 02 01 7E 0B 11 
                  02 26 44 0A 75 B0 88 00 A2 00 0F B6 80 15 74 0A 
                  75 FE 0A 14 66 74 3A 76 B4 EB E8 04 EB 8B 8B E8 
                  04 FB 80 15 75 E8 03 19 BE 72 E8 02 0F F3 72 FE 
                  01 DB 42 EB E8 04 E8 04 28 61 B0 26 44 C0 02 01 
                  48 E8 04 88 72 E8 02 0A BD 72 E8 04 03 15 C3 23 
                  72 E8 03 8A 0E 43 C6 48 50 49 E8 03 1E 69 8B 8B 
                  E8 03 4A 72 E8 02 0A 7F 72 E8 03 03 D7 C3 46 A2 
                  00 8A 10 E3 80 81 76 89 12 46 B4 E8 03 25 8B 3D 
                  03 03 FF 48 86 C0 06 0A 0E 46 26 64 FE A0 00 46 
                  C3 9F 72 8A 10 8A 02 CF CF F6 01 03 CF 26 5C 26 
                  44 C1 02 1E BF 00 8A AA 01 8A AA 8A AA 05 07 9D 
                  E8 03 0F B7 72 E8 03 05 36 EB B4 E8 03 E8 03 05 
                  26 EB E8 03 E8 03 1F 45 C6 48 70 65 E8 03 0F 7F 
                  72 E8 03 05 FE EB E8 03 E8 03 08 FC 75 E9 00 33 
                  8E C4 04 1F 0B C6 45 00 06 00 80 47 E0 43 B0 BA 
                  01 E8 03 A8 E8 03 3E 00 72 80 47 10 25 B0 BA 01 
                  E8 03 8A E8 03 66 FE C6 15 E8 13 3B 33 8E C4 04 
                  1F 80 03 72 E8 00 25 3E 00 73 F8 20 33 8E C4 18 
                  1F 81 E3 72 80 47 10 10 73 B4 E8 02 E8 02 1F 75 
                  C6 48 10 95 E8 02 0F AF 72 E8 02 05 2E EB E8 02 
                  46 C3 3D 72 E8 01 06 00 E8 02 7A 72 E8 00 0E 14 
                  32 89 14 01 05 20 03 C3 1E 00 CB C3 2A 10 0B 46 
                  89 12 46 EB C7 14 03 8A 02 F6 0E 8B 4B E3 46 89 
                  12 C6 14 B4 88 15 26 00 4E 01 C3 27 72 8A 10 01 
                  E0 0C BA 01 E8 00 0E 20 04 CC 06 40 05 AA 93 C3 
                  51 80 3C 75 86 EB BB 00 24 A8 74 E8 DE 68 E2 4B 
                  EE 80 59 C3 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 50 B8 00 D8 06 00 B0 E6 E6 33 8E B8 91 FA 1E 
                  00 58 BA 01 A2 00 0A 00 00 40 BA 01 A2 00 20 D7 
                  10 BE B3 E0 03 EB 2E 5E E0 8D C3 8B 05 E8 A2 00 
                  46 A2 00 46 24 A2 00 46 A2 00 46 C0 06 66 80 60 
                  EC 0A A2 00 46 24 C0 04 A0 76 80 0F C6 47 26 44 
                  BA 03 C3 10 F7 02 46 80 00 C1 0C E8 0B 58 0F C3 
                  8E B9 01 F0 F3 1F 32 8A 00 85 E8 FE 10 31 72 1E 
                  DB 1F F0 EE E8 B9 01 F0 F3 C3 ED 4E E8 DD A1 72 
                  E8 00 07 F0 EC E2 C3 B9 F4 8B 72 BA 01 A8 75 E8 
                  DD F3 80 59 E8 FE E4 46 C3 66 C6 14 88 74 81 1A 
                  00 C3 06 00 88 74 8A 75 0A 74 8A 10 9F 80 0E CC 
                  04 81 06 FA F9 11 F6 B0 EE DD E8 FD 03 6C C3 51 
                  42 BA 01 07 AC 42 FB 5E 53 1E C0 D8 B8 90 FA 1E 
                  00 73 33 0A 8E 75 EB 33 BB 00 24 0A 8E 75 E8 DC 
                  F5 75 B4 F9 06 00 59 C3 20 04 CC 0F 01 05 56 EB 
                  A8 74 B4 F9 B9 F4 F7 33 EC 10 08 61 E2 B4 F9 BA 
                  03 02 C3 40 84 40 8E A1 00 80 34 02 E5 E5 FF FF 
                  66 E9 D3 41 84 61 D0 10 E0 FF E4 24 3A 74 E2 BB 
                  B6 18 BD B5 6C EB B0 E6 66 ED 00 66 01 00 66 C5 
                  00 8E 33 9E D1 66 E2 80 10 FA 20 E8 43 84 61 0C 
                  61 F3 61 44 84 00 66 01 00 66 DD 8B 8A 8E 33 B9 
                  40 E6 66 D3 8A 66 66 C3 F0 44 45 84 61 C0 00 1B 
                  C7 10 FF 20 D1 4D 02 84 46 84 40 8E FF 33 BD B6 
                  9E 80 0F F6 04 DB 05 E2 33 32 EB 90 04 2B A8 75 
                  66 E8 46 F5 C8 47 84 D6 DE 00 BD B6 50 BB B6 11 
                  BD B6 92 EB 31 32 53 73 65 20 6F 72 20 61 6C 72 
                  0D 20 30 2D 65 6F 79 45 72 72 32 33 4D 6D 72 20 
                  64 72 73 20 72 6F 20 30 2D 65 6F 79 45 72 72 0A 
                  32 37 49 76 6C 64 4D 6D 72 20 6F 66 67 72 74 6F 
                  0A 20 61 65 4D 64 6C 00 4D 64 6C 20 00 4D 64 6C 
                  20 00 4D 64 6C 20 00 0A 61 69 79 43 65 6B 31 00 
                  61 69 79 43 65 6B 32 00 3F 3F 3F 31 31 52 4D 45 
                  72 72 0A 34 32 4D 6E 63 72 6D 20 64 70 65 20 61 
                  6C 72 0D 20 30 2D 69 70 61 20 64 70 65 20 61 6C 
                  72 0D 20 30 2D 65 62 61 64 45 72 72 6F 20 65 74 
                  46 78 75 65 49 73 61 6C 64 0A 33 31 4B 79 6F 72 
                  20 72 6F 0D 20 30 2D 65 62 61 64 6F 20 79 74 6D 
                  55 69 20 72 6F 0D 33 33 4B 79 6F 72 20 6F 74 6F 
                  6C 72 45 72 72 0A 36 31 44 73 65 74 20 6F 74 6F 
                  6C 72 45 72 72 0A 37 32 43 70 6F 65 73 72 44 74 
                  63 69 6E 45 72 72 20 6C 61 65 43 65 6B 49 73 61 
                  6C 74 6F 0D 20 30 2D 2F 20 4F 20 72 6F 0D 20 36 
                  2D 79 74 6D 4F 74 6F 73 4E 74 53 74 28 75 20 65 
                  75 29 0A 20 20 49 73 72 20 49 47 4F 54 43 64 73 
                  65 74 20 6E 44 69 65 41 0D 20 36 2D 79 74 6D 4F 
                  74 6F 73 45 72 72 0A 31 34 4D 6D 72 20 69 65 45 
                  72 72 0A 31 33 54 6D 20 20 61 65 4E 74 53 74 0A 
                  0A 28 45 55 45 3D 22 31 20 45 29 0A 0A 33 32 53 
                  73 65 20 6E 74 53 63 72 74 20 6F 6B 69 20 6F 6B 
                  64 0A 20 20 2D 55 6C 63 20 79 74 6D 55 69 20 65 
                  75 69 79 4C 63 0D 0D 53 63 72 74 20 6F 6B 41 74 
                  76 20 72 4E 20 65 62 61 64 41 74 63 65 0D 31 39 
                  2D 69 6B 30 45 72 72 0A 37 31 44 73 20 20 72 6F 
                  0D 31 38 2D 69 6B 30 46 69 75 65 0A 37 31 44 73 
                  20 20 61 6C 72 0D 31 38 2D 69 6B 43 6E 72 6C 65 
                  20 61 6C 72 0D 20 30 2D 69 6B 74 65 44 69 65 54 
                  70 20 72 6F 2D 52 6E 53 74 70 0D 20 20 20 6E 65 
                  74 44 41 4E 53 49 20 69 6B 74 65 69 20 72 76 20 
                  3A 0A 03 29 F0 B8 60 B7 00 B8 B4 D4 00 00 46 21 
                  10 A8 E9 D8 8E 70 00 C0 71 B3 70 C0 00 71 40 86 
                  B0 E6 B0 E6 FC 00 8E B0 E6 E6 BB FF 1F 07 0F 0B 
                  E2 8B 8B 86 8E B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 32 
                  E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 BA 03 B0 E6 
                  B0 BA 03 B0 BA 03 BA 03 BA 03 BA 03 C0 BB BA 64 
                  B0 8B EE 77 8A 02 12 BD BB 96 83 05 FA 03 03 30 
                  4A E7 12 84 6E E9 E0 C9 57 B4 BD BB 9D 83 0F FB 
                  BA BA 13 84 00 33 E2 B0 E6 E4 8A E4 3D 00 0E 69 
                  B9 00 AA E9 0C FE 14 84 8B 70 00 71 07 E0 8B 70 
                  C4 71 8C 70 15 84 8D 70 00 71 80 E0 8E 70 00 71 
                  80 C4 8A 75 80 80 16 84 17 84 8E 70 C4 71 18 84 
                  06 E9 F9 61 F3 61 30 8E BC 01 19 84 93 E8 3B 09 
                  AD 64 48 73 BB B7 1D BD BC C2 EB B9 00 60 BB 13 
                  F5 59 64 01 04 EE DB 8F E8 EE 1A 84 19 B0 E6 E8 
                  C6 1C 84 E8 B0 E6 E8 10 2D 84 8E B0 E6 E8 3A 1F 
                  84 2E B0 E6 E8 17 96 E8 36 98 E9 CD 67 FB 21 84 
                  BF B0 E6 E8 39 22 84 AA BB FF 8B 2E 47 24 3C 75 
                  B0 E6 BD BC 26 B0 E6 E8 3A 9A 72 B0 E6 E8 3A 16 
                  A0 72 E4 24 8A B0 E6 50 7C 58 03 30 8A E6 B0 E6 
                  E8 D4 26 84 75 B0 E6 B0 BA 03 B0 E6 E8 DC 29 84 
                  31 B0 E6 B4 CD B4 CD E4 8A 0C E6 86 E6 B0 E6 B0 
                  E8 3B 04 0C 00 BB B9 1A E8 09 A1 FD A1 21 FB 21 
                  40 8E C6 12 00 06 00 75 80 96 80 0E 00 FA AF B0 
                  E6 FB FF F6 96 20 07 F7 06 00 E4 81 72 34 74 B0 
                  50 1C 0A 58 02 80 86 2C B0 E6 E8 09 37 40 04 80 
                  07 D9 B0 EB 24 3C 72 3C 77 EB E8 09 00 E8 34 B0 
                  E6 58 00 02 4A 06 00 12 E8 09 2C 84 35 E8 25 19 
                  C4 7F 07 BF BF 08 F2 5F 74 E9 01 FC 75 F6 96 02 
                  03 25 BB 10 C3 E4 7B FC 74 80 B6 0A 06 00 74 E9 
                  01 D3 FC 75 F6 96 02 13 26 00 80 96 FD 06 00 74 
                  EB 80 18 FD 06 00 74 EB 80 9D 2D 06 00 75 F6 96 
                  02 13 26 00 80 96 FD 06 00 74 EB 80 18 FE 06 00 
                  75 21 17 F9 80 38 1F 06 00 74 80 96 08 26 00 EB 
                  80 18 02 0E 00 F9 80 1D 26 06 00 75 F6 96 02 0C 
                  0E 00 80 96 FD 05 0E 00 80 17 04 C3 1E 00 47 1E 
                  00 06 00 75 80 52 33 06 00 75 F6 17 03 10 06 00 
                  75 F6 17 20 10 15 06 00 75 F6 17 20 07 26 00 EB 
                  30 17 80 52 01 C3 1D 36 3A 46 06 00 75 80 18 04 
                  00 E8 2B 15 F9 80 18 FB 01 EB BB 00 60 F9 B4 B0 
                  9C E8 28 F1 0E A1 3C 74 BB 00 E8 08 3C 74 3C 74 
                  3C 74 BB 00 8D BB 00 2A F9 80 FF 02 BB FC 75 EB 
                  80 D4 02 A3 FC 75 EB 90 FC 75 E9 00 FC 75 E9 00 
                  FC 75 E9 00 FC 75 E9 00 49 74 3A 15 74 80 53 03 
                  80 80 0C 78 FC 75 B0 E9 00 FC 75 B0 E9 00 C3 06 
                  00 75 F6 17 04 F0 06 00 74 E9 00 06 00 75 EB 80 
                  96 FE 0E 00 FA BF 45 80 49 02 07 3E 00 75 50 05 
                  B3 CD 58 06 00 75 F9 50 C0 06 00 C0 03 94 58 9C 
                  4E FA 85 FB F6 F6 96 10 15 06 00 74 F6 17 04 0E 
                  26 00 EB F6 17 03 03 6B FA 57 45 05 F9 F6 18 80 
                  02 C3 C3 06 00 74 F6 17 08 F0 F2 96 F6 17 04 E4 
                  06 00 75 F6 96 10 0C 06 00 74 80 96 FD 0E 00 E8 
                  01 E8 2A FB 1B C0 65 BF 10 ED C3 03 0A 78 80 3B 
                  2E FC 7E 80 57 05 FC 75 B0 F6 17 08 35 32 06 00 
                  75 B0 F6 17 03 23 2E 1F C3 2D 06 00 75 B0 F6 17 
                  04 0B 19 06 00 75 32 02 32 E8 0F C3 E4 0F C4 47 
                  04 53 07 06 00 F8 8A 2C BB 9B D7 06 00 75 BE 9B 
                  06 00 75 F6 17 03 32 06 00 75 F6 96 02 0D 2E 0B 
                  FC 75 B0 EB 32 F6 96 02 07 26 00 B0 E8 0F C0 43 
                  06 00 75 EB E8 D9 E0 D9 34 06 00 75 3C 74 3C 75 
                  E8 00 D6 F0 EB 3C 75 E8 00 C8 F0 EB 2C 7C 8A 19 
                  D5 A2 00 C3 26 00 BE 9B B7 36 00 36 00 C3 06 00 
                  74 F6 17 04 9C A1 00 1A A3 00 E8 00 02 CF E8 CB 
                  2B 26 00 FC 72 80 06 35 A8 8B 63 83 06 A8 75 FA 
                  A8 74 26 05 46 FB 8A 49 80 04 05 EC 76 E8 00 8B 
                  89 00 E8 00 C1 D9 F7 D1 C1 EC 8B B7 B3 8A D0 79 
                  8A 8A 01 08 D1 79 F9 D0 E2 F5 81 00 FE 75 83 50 
                  CF D5 C8 D8 6E 8B E8 00 22 C0 D8 36 00 53 C8 DB 
                  C3 58 05 FE 74 8B E8 00 02 80 C4 89 00 8B 8A 32 
                  A1 00 E3 D0 E3 9F 00 4A F6 32 03 D1 03 97 8B 50 
                  33 86 8B D1 D1 03 F6 49 02 02 E2 FA 8B 8B 32 BA 
                  00 8B 8B B1 F3 74 05 00 75 5E C0 C3 2B B1 D3 C3 
                  40 8E B0 E6 32 A2 00 8E BA 01 55 32 EC 55 06 B1 
                  84 0D 0E 00 E8 00 03 05 B0 E6 C3 E8 01 15 B2 84 
                  0D B9 00 00 E8 03 B2 EB B0 E6 33 8E 26 3E 01 80 
                  1B 80 75 02 12 B4 84 C0 C0 C4 18 B2 E8 00 C3 05 
                  02 12 B4 CD 73 52 F7 EC A8 75 80 80 0F 04 10 12 
                  77 E2 FE 75 FE 75 E8 01 5C 09 13 F5 11 13 4D 26 
                  05 02 8A 8A C0 06 C9 80 0C E4 8A 58 D0 8A 02 CE 
                  01 CD 73 80 0A 16 FC 74 80 10 0C C1 11 11 0D C1 
                  DE 01 B4 CD 73 E8 00 C3 8E 55 A8 74 B0 E6 B1 F9 
                  79 B0 E8 34 C0 ED D8 33 8B 8E 8A C0 04 0D 0F 05 
                  99 25 FE FE B5 F6 05 E4 A3 01 0E 01 C0 C3 0F 0D 
                  0F 05 9A 01 FE FE F6 05 E4 18 8C 1A A1 00 00 A1 
                  00 02 C7 4C 12 8C 4E C7 D8 43 8C DA FB 88 75 C3 
                  B5 84 BD F6 01 03 D0 B9 00 00 E8 02 B0 E6 BB B9 
                  C2 75 E8 00 E3 B9 00 00 E8 01 E8 00 44 BA 01 3C 
                  B9 F4 A8 74 E8 CC F6 75 B4 EB BA 01 3C 74 B4 F9 
                  FA 8E 63 0C 8A B0 E8 33 C3 21 FB 21 A1 BF A1 B8 
                  00 F6 EE 04 E8 CB 00 C3 53 52 57 55 EC 40 8E 81 
                  03 8B 80 04 04 9C 00 E6 94 00 D2 34 E4 05 22 EB 
                  FE 75 E8 05 22 CC 05 6D EB FE 75 E8 05 10 CC 05 
                  C8 EB FE 75 E8 06 1F 5E 59 CF FF FF FF FF FF FF 
                  FF FF FF FF FF 6A 10 53 01 E8 00 C3 50 E8 00 58 
                  C3 CB FA 00 43 40 E0 40 E8 00 02 CF C4 D8 FA 00 
                  43 40 E0 40 E8 00 02 CF C4 2B 81 50 5B E0 C6 8B 
                  B0 E6 E4 8A E4 86 8B B0 E6 E4 8A E4 86 2B 81 50 
                  72 E2 FF 03 EB 87 86 8B 8B B9 00 EA 02 BE C6 26 
                  8B 81 03 B9 00 D0 EB 90 20 88 00 AA 8B B9 00 E4 
                  EB 90 E5 B8 B0 C0 2E 26 C6 04 27 40 26 85 80 47 
                  EA E6 E9 52 D6 E2 B9 00 18 5A E2 00 04 E8 00 20 
                  B0 5A 02 E8 00 FC 2E 26 C6 04 27 40 52 50 94 58 
                  5A E8 1E 40 8E C6 12 FF 53 F6 C0 08 50 80 40 F3 
                  C6 74 E8 00 EE EB 59 2E 07 E8 00 43 F5 8A 53 52 
                  5B E2 C3 0D 48 B0 E8 00 BB 00 44 BB 01 9B C3 7D 
                  E8 00 7D E8 FE BB 03 2A BB 01 81 C3 E8 04 E8 06 
                  8A E8 00 24 04 27 40 E8 00 BB 00 0E 10 B0 E6 B0 
                  E6 B0 E6 E4 0C E6 E8 FE 61 FC 61 33 FC 00 8E 2E 
                  07 26 85 80 47 F3 E5 33 FC 00 8E 8A 43 88 00 AA 
                  E2 07 60 06 D0 84 40 8E 89 67 8C 69 B0 E6 E8 B8 
                  03 AA B0 E6 B0 E8 30 E0 B0 95 33 BB 00 F3 F8 10 
                  99 E8 BD 8D 05 00 D2 40 F7 8A 8A 8C E8 00 9D B0 
                  E6 B8 00 D8 C0 D0 20 66 FE FF 0F C0 9D 00 2E 01 
                  51 B0 E6 B8 00 D8 16 00 26 00 C1 A1 00 D2 40 F7 
                  3D 00 03 23 2D 00 F8 00 80 00 15 C2 33 B9 40 FF 
                  66 AB CF C6 EB 07 61 BA 00 69 B9 00 4A F4 53 57 
                  06 18 8E C7 4A 00 80 00 1B 1E 00 48 8E 66 C0 00 
                  33 FC F3 FE FE EB 07 5F 5B C3 CC 88 41 0A 74 81 
                  16 00 8A 00 26 00 E4 05 4E 01 C3 C6 40 FF 10 4E 
                  D2 0C 0A 06 26 00 E4 0A BA 03 8A A0 00 E8 BA 03 
                  C0 04 3F 24 3A 74 08 3F FB B8 90 15 23 7D 08 8A 
                  0A 7E 03 08 7E 05 02 05 D9 02 D9 E3 D8 7B FB 51 
                  F4 B9 00 D1 EC 80 06 F6 80 04 C3 EC A8 59 8A A0 
                  00 46 D0 26 64 8A A0 00 46 26 64 02 02 47 2A 04 
                  E7 BA 03 3F 24 74 D0 A8 74 B0 8A 3F B1 D2 0A 0C 
                  EE 75 80 3E 00 04 B9 F4 06 00 75 E8 C7 F4 80 EB 
                  80 3E 7F 26 E8 25 E4 B8 00 66 03 02 D2 FA 0C 04 
                  C4 04 C4 D8 C2 81 C1 05 C4 05 C4 C3 7E C0 02 7E 
                  E8 07 7E E8 07 FF FF FF FF FF FF 50 20 A0 20 0B 
                  47 8A B0 E8 2E C4 40 03 0E A8 74 E8 00 CF CD 58 
                  06 1E B8 00 D8 06 00 74 81 9C D0 73 83 9E 01 1C 
                  50 0B E4 E8 2E 26 00 A1 00 C0 1E 00 80 80 1F 07 
                  50 E0 96 C2 B0 EE EA B1 D3 2E 84 CC 8A 42 42 58 
                  1F 4A 32 EE 83 05 8A 42 C3 52 03 82 74 B7 E8 D2 
                  06 B7 E8 D2 59 E4 0D 83 05 8A 8A 5A EB 8A C3 01 
                  58 74 BE 00 24 4A 01 5A B4 50 00 43 40 C4 40 C4 
                  F8 EC C7 29 24 1E B0 E6 E4 86 E4 86 57 F8 FF 5D 
                  58 DF CD CB C4 CC 32 EB 8A 83 05 80 1E 83 04 42 
                  B7 E9 D2 08 28 3C F5 DC DC E5 E3 E3 E3 DB FB C6 
                  03 2E 24 FC C2 B0 EE EA 32 8B D1 2E 84 CC 86 42 
                  42 8A EE 4A C0 4A 1A C3 02 19 C2 0A 75 EC 46 EB 
                  80 1F C3 83 04 FC C3 04 03 01 00 00 00 00 00 00 
                  00 00 AA 01 04 10 40 FF B0 E6 B9 00 44 E2 EB 2E 
                  8A B0 E8 2C 8F 7D 3A 74 B0 E6 E9 00 91 84 B0 E6 
                  B0 E6 E6 E6 E6 B9 00 44 E2 E9 00 AC D9 00 B9 00 
                  EE E2 BA 00 08 EE 42 E2 E6 E6 E6 E6 E6 E6 E6 8A 
                  E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB 
                  E4 3A 75 EB E4 3A 75 EB E4 3A 75 EB B0 E6 BA 00 
                  08 EC 42 C4 17 F7 C0 B9 00 EC 42 C4 07 F6 CB 70 
                  BA 00 69 B9 00 18 EB B0 E6 E6 E6 B0 E6 E6 B0 E6 
                  B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 B0 E6 
                  C3 FA 8A 81 A8 74 EB B0 E8 2B F0 82 6F 8A B0 E8 
                  2B E8 8A E8 00 3B 65 C4 F0 C1 BA 3C 77 8A 8A E8 
                  00 17 4D F8 C3 C9 CC B9 22 E1 58 B9 00 E1 23 F7 
                  03 59 D1 C6 C8 C4 92 E4 E1 C8 C0 CB D0 D1 C2 13 
                  D1 D1 D1 D1 D1 D1 B4 CD EB B0 E8 2A 04 E0 8E EE 
                  06 40 8E 33 8E 26 2E 00 C7 20 3E 80 6B FE 21 FE 
                  21 3C E8 F8 06 00 75 E9 FE 89 20 80 6B FE C3 50 
                  40 8E 80 6B 01 20 20 1F 8A C0 04 0F 0A B8 00 D8 
                  1E 00 E3 DD 10 A0 00 C0 11 CB B0 E8 2A 10 E0 B3 
                  6C E8 11 C3 A8 75 F6 02 20 0B C3 75 80 FD 20 80 
                  FD BA 00 2C B9 00 96 5B 0C A1 DF A1 21 FB 21 1E 
                  00 8A 62 3C 74 3C 74 3C 74 3C 74 B9 00 0A 57 B4 
                  E8 B5 C2 16 00 1C D2 C6 FE 75 FE B4 E8 B5 08 35 
                  53 FC 40 5B 02 29 8A 49 88 01 B4 E8 B5 D2 EF CA 
                  E6 03 0F 32 EB BB 01 AA C3 03 FF 80 18 04 C6 C8 
                  08 F1 8A 51 80 49 07 09 3E 00 76 B7 B8 06 C9 18 
                  16 00 E8 B4 59 1C 2A 37 46 E4 03 05 C3 15 80 39 
                  F7 DC FF 8A 1F F6 17 08 E8 06 00 75 24 F6 17 03 
                  03 AF F6 17 40 63 99 80 0F 05 00 EB 80 35 11 06 
                  00 74 80 96 FD 00 EB 0A 78 80 03 5E FC 74 80 1C 
                  5C FC 75 F6 96 10 46 06 00 75 B8 96 35 26 00 EB 
                  3C 7E 3C 7C 3C 7D 24 F6 96 02 19 8C 8E BF CF 07 
                  8A F2 58 07 26 00 B4 E8 00 C3 72 C0 D5 7F D1 AA 
                  E8 CA C9 EA 61 C3 7A BF 20 BB FC 74 80 35 0E 06 
                  00 74 80 96 FD C3 FC 74 7F 2E 87 9B 95 C0 91 69 
                  E8 CA 89 06 00 75 2C E9 FF 7F FC 75 F6 96 02 0A 
                  26 00 B4 EB 90 FC 75 F6 96 02 0A 26 00 B4 EB 90 
                  FC 75 B4 EB 90 8A 8C 8E B9 00 FC 04 F2 58 22 20 
                  14 FC 7C 80 0E 0F 61 09 7A 05 C0 18 F9 80 76 F4 
                  F0 F2 0E 1B 27 29 33 35 FA 36 00 04 46 36 00 04 
                  36 00 36 00 11 36 00 E8 19 50 02 CD 58 FB BB 00 
                  98 58 B4 8A 00 4E 01 C3 E8 00 40 C3 90 02 10 89 
                  C3 E8 FF 56 0A 75 C0 04 0F C0 07 04 03 EB F9 C3 
                  0D 8A F6 10 B0 EB B0 E8 27 8B 10 F6 01 12 E2 74 
                  80 40 08 02 07 01 03 00 C3 FC 66 0A 74 C0 04 06 
                  00 E7 8A 8A 06 E4 03 E0 F6 20 8F 8A C3 C0 8F 8A 
                  06 E4 03 E8 25 00 50 52 C4 E8 BA 03 A0 00 D8 C0 
                  E8 F6 01 02 01 E4 0A 88 8B 5A 58 E8 F7 FB 7B EC 
                  E8 F7 FB 71 8A EE 26 1C FB EC 86 E8 FF 50 5D B7 
                  E8 FF 7E C0 02 7E E8 FF 32 75 B9 00 42 E8 FF 05 
                  E2 E8 00 26 00 C3 42 A8 74 A8 74 B4 EB 8A 43 F6 
                  30 04 EC 14 C4 74 FE EB F6 80 02 04 02 00 BB 00 
                  DB 90 8B 80 93 03 C7 8A 24 C0 06 C0 51 C8 24 05 
                  27 00 13 74 E3 B8 04 01 D2 13 03 84 80 04 04 C0 
                  7B 00 13 97 C3 80 28 09 B1 33 CD 73 80 04 04 C0 
                  3D CB 7B ED EB B3 32 B4 CD B4 E8 00 01 B1 33 CD 
                  73 B4 CD B4 E8 00 01 B1 33 CD 73 FE 74 FE EB BB 
                  00 3F 74 B4 E8 00 3C EB 90 34 6B BA A1 4E B4 E8 
                  00 90 80 74 06 15 EB 90 08 EB 90 01 47 BA A0 2A 
                  89 90 E8 FD 23 CF 24 C0 04 C8 FB 74 FE BA A1 0A 
                  C8 22 74 BA A1 83 C3 BB 00 27 0A 27 32 80 8F 06 
                  C3 8B 75 E8 FD E8 3A 74 80 34 08 03 47 04 43 33 
                  07 0C 24 0A 8A B0 E8 24 9A A8 75 8A 80 20 0E EE 
                  BA 20 2B B9 00 38 BD 00 08 B4 CD B4 CD B0 E6 EB 
                  B0 8A E8 24 FB C4 C0 C3 8B 33 8E BF 00 8C AB C3 
                  1E 0F 0F B0 E6 B8 1C D8 40 8E 26 16 00 89 67 C7 
                  64 00 B0 E6 E8 AC 09 0E 00 00 61 E8 B2 62 84 06 
                  00 00 06 00 00 F6 26 3E 00 12 0F 7C A3 00 7E A3 
                  00 FE FC 57 06 DB C3 30 8E BE 83 93 B9 00 A5 1F 
                  5E 63 84 78 73 B0 E6 EB 90 3E 00 00 16 0E 00 00 
                  1E 00 1E 00 1E 00 1E 00 92 E8 B0 C0 03 EE 8B 76 
                  81 80 89 7A 8B 7C 81 80 89 80 A0 00 8F B4 C6 92 
                  01 F9 8B 8A 81 80 89 86 0B 74 81 64 01 88 66 89 
                  67 88 69 B0 E6 8B 78 89 7A 8B 7E 89 80 8B 86 81 
                  80 A0 00 8F B4 C6 92 01 AB 8B 8A 89 88 0B 74 81 
                  64 02 88 6E 89 6F 88 71 A1 00 00 BB 3F 1E 00 C3 
                  39 2E 00 2E 00 C5 00 8D A3 00 06 00 8A 8C C6 92 
                  01 D1 0B 74 81 64 02 88 6E 89 6F 88 71 06 40 8E 
                  BD 00 C5 17 07 80 C6 92 01 FE 00 65 A9 00 12 0E 
                  00 00 2E 00 16 00 0E 00 86 BB 04 E3 02 C2 21 E2 
                  06 00 E8 03 02 74 81 64 04 88 6A 89 6B 88 6D A1 
                  00 C0 28 00 F7 B0 8A C6 92 01 07 A9 00 12 0E 00 
                  00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 73 A0 
                  00 FE 06 00 E8 02 02 74 81 64 08 88 72 89 73 88 
                  75 B0 E6 8B 86 26 1E 00 1E 00 B0 E3 34 B0 8A E8 
                  22 00 06 00 00 02 01 9E B0 E6 81 86 80 72 B0 E8 
                  22 80 E0 B3 04 B4 F7 64 FF 74 B4 B0 E8 21 68 84 
                  60 20 64 25 E4 A8 74 E4 8A 80 04 60 64 E8 15 8A 
                  E6 E8 15 FE 64 EB B0 E6 BB 00 08 B0 E6 BB 00 40 
                  8E 8E 69 8B 67 53 37 5B DB 03 98 B0 E6 B8 1C D8 
                  06 00 00 16 1B 32 8A 66 8B 8A 69 8B 67 E8 AB 06 
                  00 00 16 FD 32 8A 6A 8B 8A 6D 8B 6B E8 AB 06 00 
                  00 16 DF 32 8A 6E 8B 8A 71 8B 6F E8 AA 06 00 00 
                  16 C1 32 8A 72 8B 8A 75 8B 73 E8 AA 06 00 00 0F 
                  A3 BA 00 69 B9 00 56 F7 64 FF 74 E8 EF 06 00 00 
                  03 25 E4 A8 74 B0 E6 E8 06 6C 84 A9 A1 1F C3 8A 
                  B0 E6 8A 8A B0 E6 8A 8B 80 39 7A 76 81 64 80 8B 
                  7A 89 82 E8 00 1E 00 1E 00 04 1E 00 1E 00 30 74 
                  81 64 80 89 82 E8 00 1E 00 1E 00 16 50 6F 84 89 
                  82 E8 00 1E 00 1E 00 0B 74 F9 C3 57 B0 E6 88 4C 
                  8A 32 8B BB 00 3E 00 75 B8 00 C0 C5 45 83 82 00 
                  0C 00 C7 84 00 E9 00 71 84 48 8E 53 57 A0 00 06 
                  00 05 51 EB E8 B4 5F 5B 0A 2E 00 01 EB 90 C3 FC 
                  51 8A 4C B9 00 FF C0 DB 00 AB F6 1E 00 00 F6 02 
                  03 01 AB 59 80 92 01 0C 40 8E 8B 03 E8 A7 1E 00 
                  06 00 EB 90 06 00 E9 FF 1E 00 B0 E6 58 5F C3 57 
                  50 72 84 A2 00 BB 00 C3 08 8A 33 33 D1 1D 00 75 
                  E2 26 05 61 C0 06 C0 FF 37 26 05 61 C0 07 C0 01 
                  EB 80 92 01 0F 40 8E 8B 05 00 E8 47 58 28 4F 32 
                  75 47 32 8A 26 05 8A 8A 4C B0 E6 58 C5 84 8B B8 
                  00 11 C0 E0 03 7A 3D 00 F8 00 5B 07 E8 11 E8 E8 
                  75 B8 90 CD FA 25 FB 74 3B 82 75 8B 80 89 1A FB 
                  E8 11 E8 E8 C3 17 C3 FC 74 3D E0 05 0D EB 3D E0 
                  05 2F EB 80 84 0F F0 0B E0 02 00 FF EB 33 85 C3 
                  FC 74 3C 75 B0 C3 8A 18 8A 24 80 04 E3 0A 8A 96 
                  80 0C E0 17 5B 3C 75 80 03 56 FB 77 51 81 75 80 
                  97 EF 87 B0 E6 B9 FF 06 00 75 E2 E8 11 F4 60 24 
                  26 00 E8 11 C7 E0 0A E6 B9 FF 06 00 75 E2 E8 11 
                  F4 60 26 00 59 FA 36 00 0C 46 36 00 04 36 00 36 
                  00 09 36 00 C0 EB B0 F9 C3 3C 74 3C 74 84 75 E4 
                  24 0C 24 2E 06 00 86 8A 01 EB FE 75 E4 24 0C 24 
                  2E 06 00 86 8A 00 EB FE 75 E4 24 0C E6 B4 EB FE 
                  75 E4 B4 A8 74 8A 80 3F 40 86 2D 86 7F C0 86 00 
                  21 F9 72 83 32 26 32 2B 40 8A E4 24 0C 24 0A E6 
                  EB B0 FA 4B FC 74 8A E6 FB C3 86 40 08 80 04 08 
                  2D 40 21 00 3F 3A 01 74 B4 2E 06 00 15 E4 32 2B 
                  41 B4 EB B4 A8 75 B4 8A 32 C3 F2 B4 74 B4 A8 74 
                  B4 8A 32 C3 06 60 02 03 0A 83 38 EC D0 C0 D8 FD 
                  C0 38 F3 8B 8D 10 C7 FF 26 45 80 C6 06 26 45 92 
                  C7 02 00 C6 04 8D 18 C7 FF 26 45 00 C6 06 26 45 
                  92 D0 10 F7 03 80 00 30 80 00 89 02 88 04 DB D4 
                  73 E9 00 7C 26 05 C0 40 07 46 00 81 BB 00 B6 72 
                  8A 46 C0 5D 7C 8B 8D 18 70 8B BF FF 8B 2E 05 0F 
                  7C 26 35 06 C6 FF 04 C6 FC DB 6F 8D 30 8F FE 74 
                  26 25 BB 00 5B 72 C6 46 EB 26 0D BB 00 49 72 C6 
                  46 EB 8D 30 8A 80 40 06 46 01 04 46 02 C4 61 07 
                  E2 FC 35 75 FF 04 75 B9 00 A5 EE 83 08 44 8F 04 
                  44 8F C3 7C 26 5D B9 00 87 15 8D 10 EF 00 11 08 
                  04 01 FF 11 70 02 01 FF BA BA D7 D7 DE DE E3 E3 
                  E3 00 DE 00 E0 00 C8 00 84 00 85 02 FA F0 0F F0 
                  B3 70 00 71 10 08 20 24 0F C0 40 8E E4 A8 75 8E 
                  B0 E6 B0 E6 B9 FF 64 01 05 F8 3D B0 E6 E4 B0 E6 
                  B0 E6 B8 E0 D8 DB 3F 55 08 13 2E 2E DD 05 84 00 
                  8E 33 81 AA 75 BD DE FF 8A B0 E6 B8 00 D8 00 EB 
                  B0 E6 B0 E6 EB EB E4 8B B0 E6 EB EB B0 E6 80 09 
                  03 F7 B0 E6 80 0A 03 57 32 E6 B8 F0 D8 D2 5A B9 
                  00 8A AC E2 BA 00 08 B0 EE 0A 74 B0 EE F3 FA 74 
                  BA 00 E6 00 20 A0 09 84 FB 76 B3 32 D0 2E B7 DD 
                  40 8E FF B0 E6 B8 00 D8 2E 00 0B 84 20 20 E9 0C 
                  84 61 F3 61 0E 70 19 FA F6 EA E5 D6 AA A5 95 56 
                  FE BF 00 EC E9 A9 E3 80 40 37 01 BD DE C4 06 C8 
                  C0 CE B9 00 C3 AE 02 1A 00 BB B6 23 E8 E8 0E C9 
                  0C B4 86 E8 19 5D C6 01 83 06 83 06 04 6E 02 6E 
                  46 01 10 42 8A 4A 11 42 4A 06 00 05 7C 33 32 8A 
                  49 2E 87 DF DC 79 33 8A 4A 80 04 37 FB 74 B1 F6 
                  8A D0 D0 88 03 66 D0 88 05 03 E0 E4 E0 46 80 49 
                  06 06 66 D1 06 C2 EE F6 88 03 66 B1 8A D3 89 06 
                  E0 46 EB 03 05 03 03 60 FA 06 00 DF 0E 00 26 00 
                  16 00 88 B8 0A 02 B0 E6 F4 FD 16 00 26 00 61 FF 
                  5C 55 48 52 20 41 39 47 42 33 57 39 44 43 33 50 
                  28 29 6F 79 69 68 20 4F 50 51 43 6D 75 65 20 6F 
                  70 72 74 6F 20 39 32 38 2C 34 38 2C 36 E9 DA 31 
                  00 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 4F 
                  4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 6F 
                  72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 38 
                  33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 6C 
                  6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65 
                  64 2E B0 E6 B0 E6 B0 BA 00 B3 E8 00 12 4B 0E 84 
                  92 4B 22 4A EE 80 05 B0 E6 C3 00 8A E6 EC E0 3D 
                  00 18 F1 92 4B 12 4B 69 B9 00 5A E9 E6 FE FF FF 
                  FF FF FF FF FF 50 61 40 02 CF 01 85 11 84 B0 E6 
                  B0 E6 E6 E8 01 61 E4 E0 96 EB 90 FE CC 02 C5 C8 
                  D8 C0 30 8E BC 01 20 E8 00 ED 08 30 E8 00 27 FA 
                  04 D3 B9 00 A2 8B 81 03 B9 00 96 B0 B4 CD 33 B9 
                  00 88 F4 F5 FF FF F2 E9 A6 EE C0 D8 DB 07 07 61 
                  08 61 F5 FF FF 10 E9 A6 EE 61 F7 61 61 40 03 FF 
                  B8 00 D8 3E 04 E7 BB 00 00 8E 66 AD 61 40 0C C3 
                  10 DF EA C0 E5 F3 D5 FF 56 E9 A6 EA E3 33 B1 D0 
                  73 42 F9 D2 FF 10 92 26 E2 04 3C 76 04 B4 CD E2 
                  C3 0A 74 B4 CD EB C3 E1 75 0E 33 8E BF 00 24 AB 
                  26 AB 7C A1 71 A1 71 BF 01 2C AB 2E AB 07 B8 00 
                  10 EA E1 F0 53 52 1E 40 8E 81 03 8B 8A 78 D1 8B 
                  08 0B 74 50 E4 0B CC 49 CC 5B EB EE EB EB EC F8 
                  28 B8 90 CD 58 11 24 E8 AE 24 78 E2 FE 75 EB EB 
                  EC F8 04 01 2D EC 1C 01 00 00 24 EB 42 B0 EB EE 
                  05 E8 E2 04 00 00 4A 42 00 00 24 34 8A 58 E7 5E 
                  59 CF BB 8E 04 BB 0E C7 77 A8 74 32 EB 8A E8 15 
                  02 C3 E8 0F C6 84 80 0C C3 80 84 80 18 00 BB B9 
                  30 E8 E3 B8 00 D8 06 00 1F C3 00 CF E3 00 86 00 
                  80 00 18 7F 31 75 E8 9C 58 0A 09 B9 00 16 0E 86 
                  80 08 40 04 92 4B C3 FF FF FF FF FF FF FF FF FF 
                  32 04 00 00 00 00 31 11 67 04 00 00 00 00 7E 11 
                  67 06 00 00 00 00 67 11 00 08 00 02 00 00 FF 11 
                  AC 06 00 02 00 00 AB 11 B9 05 00 00 00 00 B8 11 
                  CE 08 00 01 00 00 FF 11 9D 05 00 00 00 00 9C 11 
                  84 0F 00 FF 08 00 83 11 D4 05 00 FF 00 00 D4 11 
                  9D 07 00 00 00 00 9C 11 9D 09 00 00 08 00 9C 11 
                  64 08 00 01 00 00 63 11 D4 04 00 00 00 00 D4 11 
                  00 00 00 00 00 00 00 00 64 04 00 00 00 00 64 11 
                  D4 05 00 00 00 00 D4 11 C6 05 00 00 00 00 C6 11 
                  F2 0B 00 FF 08 00 F1 11 DD 05 00 01 00 00 DC 11 
                  DD 07 00 01 00 00 DC 11 0C 04 00 FF 00 00 0C 28 
                  9C 08 00 FF 00 00 9C 11 C6 0E 00 FF 08 00 C6 11 
                  C6 10 00 FF 08 00 C6 11 FF 0E 00 FF 08 00 FF 11 
                  40 06 00 FF 00 00 40 21 C6 0F 00 FF 08 00 C6 22 
                  D8 07 00 FF 00 00 D8 22 67 04 00 00 00 00 67 19 
                  67 08 00 00 00 00 67 19 89 09 00 00 08 00 89 19 
                  40 08 00 FF 00 00 40 21 C6 07 00 FF 00 00 C6 22 
                  C6 08 00 FF 00 00 C6 22 C6 09 00 FF 08 00 C6 22 
                  C6 05 00 FF 00 00 C6 22 63 10 00 FF 08 00 63 3F 
                  FF 0B 00 FF 08 00 FF 21 FF 0F 00 FF 08 00 FF 22 
                  5E 0F 00 FF 08 00 5E 34 FF 10 00 FF 08 00 FF 3F 
                  25 04 00 FF 00 00 25 1A 25 02 00 FF 00 00 25 1A 
                  EC 08 00 FF 00 00 EC 21 EC 06 00 FF 00 00 EC 21 
                  C6 05 00 00 00 00 C6 19 FF 0B 08 FC 00 00 00 83 
                  06 FC 0F 84 00 85 C7 E8 ED DA 8A 84 B0 E6 B9 00 
                  B4 CD BB 7C 01 B8 02 13 73 72 FF FF E9 DE E2 BB 
                  84 FA 74 B0 E8 11 40 1E DA 40 8E 8A 75 8E 0A 74 
                  A8 75 B0 E6 BA 00 AB 18 C2 75 60 06 22 07 61 84 
                  BD 95 07 09 8B F3 75 BE 93 34 EB B0 8A E8 11 FB 
                  C4 4A 81 FE 55 75 E8 FC BC 84 00 00 83 06 BE 93 
                  06 B4 CD CD FC AC 24 05 00 EB C3 F3 21 66 A5 75 
                  8B 8B 66 A5 E5 F3 21 66 A7 0C 75 8B 8B 66 A7 07 
                  EF 83 04 FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FC 56 8B BE 00 DE E4 0B B8 
                  E8 F1 F8 B3 FE 75 81 0A 02 66 FE E8 F1 03 9D E8 
                  F1 05 92 EB 81 0A FF 4E 01 E9 00 CC 05 AD EB FE 
                  75 E8 F2 74 CC 02 6E CC 05 56 EB 80 0B 08 5A E8 
                  F1 58 FC 75 81 0A 02 66 FE E8 F1 44 A5 81 0A FF 
                  4E 01 EB 80 0D 05 9D EB 80 EB 05 39 EB 80 EC 05 
                  D1 EB 80 ED 05 07 EB 80 EF 05 11 EB 80 0D 5E CF 
                  50 40 8E B8 FF A0 A0 C0 0C E0 A1 C4 A1 A0 16 0B 
                  20 20 C0 0C E0 04 06 21 C4 21 FC 74 B0 E6 88 6B 
                  58 CF B9 00 F4 E8 A8 A8 75 E2 F9 08 E8 A8 42 40 
                  C3 FF 4C 72 E8 D4 0D A8 72 E8 D8 03 F7 C3 AF B0 
                  E6 E8 02 FC 1E BB 00 DB 06 00 74 E4 3C 75 80 96 
                  40 26 00 B0 E6 FB FF E9 01 06 00 74 E4 3C 75 80 
                  96 BF 0E 00 80 17 20 B0 E8 0F 40 0E 2C 0D A8 75 
                  80 17 DF B0 E6 FB B6 80 96 DF FF E9 00 17 E8 FF 
                  D8 60 B4 CD BD 00 08 20 20 E9 00 E0 3C 75 F6 18 
                  08 0E B2 73 FA 20 20 E9 00 20 20 80 E0 07 0E 00 
                  EB 80 E1 07 0E 00 EB 80 FE 0A FC 75 80 97 10 EB 
                  90 B1 F6 18 08 65 1C FF FF FF FF FF FF FF FF FF 
                  C7 72 34 E9 F5 FC 74 80 D4 07 06 00 75 80 46 1C 
                  FC 75 F6 96 01 28 51 72 80 52 1E E4 1A 0E 06 00 
                  75 F6 17 04 07 26 00 EB E8 FE 88 15 E8 00 C6 85 
                  07 61 04 E8 00 50 26 00 F6 96 01 12 E4 80 45 05 
                  FC 74 80 96 FE C3 E8 01 AE 64 C3 16 E8 D7 17 FC 
                  75 FE EB 80 4A 09 C8 28 16 EB 3A 15 74 80 2A 05 
                  FC 75 F6 96 02 31 FC 75 F6 96 01 25 E4 21 DB 1E 
                  00 19 E4 50 FC 61 0F 0C E6 E8 00 75 58 61 C3 53 
                  00 43 40 D8 40 F8 00 43 40 E0 40 E0 2B 81 1D 5B 
                  EA 58 50 17 C0 04 07 26 00 E4 3A 74 80 97 F8 06 
                  00 02 58 50 E8 00 4D 26 00 E8 00 ED 60 FF F6 97 
                  10 0B F7 45 B0 E6 EB 80 97 EF 37 A0 00 E8 24 80 
                  97 F8 06 00 60 FF F6 97 10 02 F7 26 00 59 C3 FA 
                  97 0C 86 97 A8 FB C3 B9 04 65 E4 A8 E0 59 FF 34 
                  45 C0 C0 C0 E1 A6 A6 48 63 7C 10 38 FB 1E 57 52 
                  53 8B 33 8E C4 78 B8 00 D8 06 00 81 16 00 46 8A 
                  06 FC 73 3C 77 3C 76 3C 72 2C 8A 32 D1 2E 97 EC 
                  07 01 EF 9C 26 5C 88 40 81 16 02 5B 5A 5F 1F CF 
                  E1 75 E8 A3 0A 23 74 81 16 00 B0 E6 32 0A 74 B9 
                  00 01 E2 E2 FA 03 EE C3 7E 02 28 46 BB 00 E3 46 
                  83 00 FA 73 8A 00 FF DB C3 D2 80 0F 04 46 04 3E 
                  00 74 80 41 09 07 D4 0A 75 33 8A 00 8A 03 80 D3 
                  F7 48 C8 06 03 73 8A 01 04 0A 09 4E 01 EB 90 3B 
                  75 32 8A 01 E3 8B D1 E6 B0 EB E6 8A E8 E4 F9 8A 
                  07 9C 8A 04 96 83 03 9C 46 80 01 75 E8 E4 1A 8B 
                  B7 24 74 B7 A8 75 B7 E8 E4 7C E8 E4 EE E8 01 17 
                  07 BF 00 F6 74 E8 A3 88 47 F2 95 88 41 E8 FE E4 
                  1E 56 B9 00 C0 D8 AC 56 10 B8 10 D8 AC 59 E8 A1 
                  66 8B 8A F6 10 0D FC 75 80 03 C4 88 E8 E3 4A 0B 
                  FF E8 DC 04 E4 66 03 73 B4 EB E8 00 2E 02 0A 4D 
                  DE 8A 07 E7 0A 06 D2 83 03 D8 83 04 D2 83 07 5A 
                  74 81 16 00 26 00 66 0A C3 E1 B9 00 44 74 E2 B4 
                  EB E8 A3 07 8A 06 92 E8 00 07 D8 A8 B4 C3 01 4E 
                  D2 84 3E 75 08 3E E8 A2 47 00 BB 74 24 3C 75 E8 
                  FF 7A 8F E8 A2 27 46 F6 20 02 E0 4F 32 3A 74 88 
                  04 BB 00 4F 5B B7 E8 E3 7E C0 02 7E E8 E3 91 8A 
                  04 1C FB 7C 75 33 26 5C 8A 01 03 04 05 14 E8 A2 
                  B0 80 02 02 0F D8 02 C3 DB 03 01 E8 00 C0 40 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 50 B8 00 D8 0E 
                  00 B0 E6 B8 91 15 58 B7 E8 E2 02 EB A2 00 98 E2 
                  A0 00 F8 01 CD 73 F6 3E 80 1B E4 1C 04 B9 3D C0 
                  06 00 75 E8 A1 F4 75 E8 DA 80 26 00 0A C3 2A 2A 
                  2A 2A 2A DF 25 0F FF F6 08 F3 46 4A 42 B7 E8 E2 
                  4A C3 08 8E BE 00 04 C6 FE 04 C6 FE 38 8E B9 20 
                  F6 F3 B8 00 C0 33 33 B9 20 F3 FF FF FF FF FF FF 
                  FF FF 80 14 07 FC 75 B4 FC EC 40 8E 8A 10 80 30 
                  00 80 30 03 00 8B 63 8E 86 8B 86 81 FF D1 2E 94 
                  97 8B FB 1E 57 53 52 EB 4F CF B9 00 C9 74 E2 59 
                  EB E8 A1 EE E2 F8 FF FF FF FF FF FF FF FF FF FF 
                  FF FF 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 07 
                  00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 
                  00 00 28 0A 06 1C 07 07 00 00 50 0A 06 19 0D 0C 
                  00 00 28 0A 06 70 01 07 00 00 50 0F 06 19 0D 0C 
                  00 00 00 00 00 00 00 00 1E 50 51 56 B0 E6 FC 00 
                  B8 E0 D8 55 3B 00 75 33 33 E8 01 06 8B EB 90 E2 
                  84 00 8E B8 AA 06 00 3B FF 75 32 8A 02 C1 09 FF 
                  3B 74 2B 3B 72 83 0F E3 FF FF 2B 3B 72 BE 00 C1 
                  75 D1 E8 00 13 E8 01 74 E8 00 5E 59 58 1F C3 E8 
                  00 00 8E 8C 8E BF 00 8B A3 71 C7 26 05 26 C1 04 
                  C3 E0 89 BF 00 8B A3 71 C7 26 05 2A 26 1D 0C 26 
                  05 2C 83 02 8B A3 71 89 B0 E6 1F ED 0E 00 E1 C1 
                  04 D9 83 00 1F 81 FF 81 00 C1 0C 10 2B B9 F0 C1 
                  E0 26 3D 88 C3 6A 33 B8 E0 C0 FB ED 0E 00 E1 F3 
                  C3 51 33 AC D0 FB D2 59 C3 06 57 B9 C0 C1 ED 8A 
                  02 C1 09 E9 8B 8C 8E BE E0 03 F3 59 5E 1F 53 FC 
                  50 06 FA FF AE E9 95 07 66 5B E4 53 FE E4 B3 EB 
                  E8 00 FF 10 0C 01 0C 08 02 04 02 00 C4 E4 50 E8 
                  F9 A3 64 58 FA 41 B0 E6 E4 A8 74 E4 EB E8 F9 A5 
                  64 29 51 10 E4 A8 E1 59 02 60 9C 15 B0 E6 0E 03 
                  EB 90 58 C3 7D 84 E0 2E 34 8A 01 C0 40 03 B7 E8 
                  B0 00 80 2E 01 57 0F C0 01 0F C0 5B 28 B8 00 D8 
                  06 00 E6 80 02 40 BB AA AA 78 E9 06 76 BB 6D DB 
                  86 E9 06 68 BB 55 55 94 E9 06 5A FE B8 00 D8 48 
                  8E B8 00 7C 33 BD F3 25 BA 00 BA E9 F4 C0 E9 FC 
                  30 8E B8 00 C0 04 BA 00 FF D8 E9 F4 16 7C BD F3 
                  07 72 81 82 74 BB F9 A9 01 80 AE B8 00 D8 48 8E 
                  B8 00 FE BA 00 00 BD F4 C3 BA 00 1C E9 F3 38 8E 
                  B8 00 7C BF 80 30 E9 F3 BE 7C BD F4 AF 72 8C B8 
                  00 D8 C0 F6 00 66 AD DB 04 BB F9 7C BF 00 62 E9 
                  F3 7C BD F4 6B B8 00 D9 D8 00 80 02 C6 FE 04 C6 
                  FE 04 8E B8 00 7C 33 BD F4 55 72 BA 00 A0 E9 F3 
                  03 4B B8 00 D8 00 80 02 C6 FC 04 C6 FC 04 E4 3C 
                  75 80 02 B8 00 C0 D8 20 66 FE FF 0F C0 DF 00 2E 
                  01 5D E4 3C 74 33 B9 00 AD E8 D2 7F B0 E6 32 E6 
                  C3 66 ED B8 00 00 33 B9 40 FF 66 D0 AB F9 61 0C 
                  61 F3 61 BB 00 00 33 66 C5 1F F6 F4 00 8A 9E D1 
                  9F F4 AD 33 E1 75 E4 A8 66 00 00 75 66 7A 1F C0 
                  C6 00 E4 0C E6 24 E6 58 0B 75 E8 92 E0 E4 33 B1 
                  D0 73 46 F9 F6 C0 11 EE B9 00 FF 07 C1 08 E2 8A 
                  8B 1F C3 32 26 05 D7 C7 E8 46 C3 22 98 C3 E0 FC 
                  0B 30 8A 49 88 01 26 3D C7 8A 49 88 01 33 8B 02 
                  EA 03 00 D1 D1 D1 D1 03 D1 D1 03 B7 80 49 06 04 
                  D1 E7 DF D3 D1 EA EA EA D1 E1 D2 03 C3 8B 84 1F 
                  72 3C 75 BA 00 85 B9 00 1E E8 00 3C 74 E8 00 7B 
                  B0 E6 B0 E6 B9 00 34 73 E2 EB 90 60 FA F5 87 84 
                  32 E8 01 1A F9 40 8E 80 96 EF ED 74 80 96 10 EB 
                  90 88 84 60 AA 03 2D B0 E6 B0 E6 E8 00 1F E4 72 
                  B0 E6 E4 50 AD 64 C0 58 05 EB 90 8D 84 BA 00 B4 
                  B9 00 09 00 BB B7 24 E8 D0 B0 E6 E8 00 0E 00 BB 
                  B7 1F E8 D0 FE B0 E6 E8 00 2E AD 64 74 72 E8 00 
                  81 84 AA 64 64 E8 00 04 F9 0A 82 84 60 55 12 83 
                  84 00 BB B7 1F E8 D0 FE 84 84 60 64 34 B0 E6 C3 
                  2C 72 E8 00 AB 64 20 72 E8 00 09 8C 84 60 EB F9 
                  E8 CE 64 01 04 60 F3 51 64 E4 A8 74 51 B2 59 F3 
                  59 51 64 E4 A8 75 51 9E 59 F3 59 0E FC A0 84 F2 
                  B0 EE A1 84 64 E8 CE 0C B0 E6 BB 00 7D BE F8 04 
                  E8 F8 54 1C F2 EE A3 84 ED 9C 72 BB 01 5B E8 F8 
                  38 64 E8 F1 30 F9 2C A9 EC C0 03 EB 81 01 74 3C 
                  75 E8 F1 12 8F EC F9 BF 00 BE A5 84 04 A4 84 0C 
                  B9 00 00 E8 CF 04 A6 84 21 BF 21 00 D2 D4 FF FF 
                  FB B8 00 D8 13 1F E8 A6 2A 2A 2A 2A 80 7F 4C FC 
                  74 80 92 42 8B 81 00 C1 07 FF 84 EB 90 BF 92 EB 
                  CA 00 F8 F8 F8 A1 A1 F8 A2 A2 A4 A4 F8 F8 F8 F8 
                  F8 F8 F8 F8 A5 FC 75 F9 02 FB 86 CA 00 32 C3 5F 
                  E8 F6 F4 F2 F0 EE 5F E4 8A 32 FE 02 0E 55 83 04 
                  75 80 45 EE C3 70 71 E6 8A E6 C3 DF 07 08 FF 00 
                  01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 
                  00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 
                  7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF 48 8E B9 20 FF 8B 66 AB 08 8E BE 00 04 
                  C6 FE 04 C6 FE 38 8E 33 B9 20 F3 33 B9 20 8B 66 
                  D0 F3 33 B9 20 AD 3B E1 74 F9 E5 FF FF FF FF FF 
                  FF FF FF FF FF FF FF 00 00 00 00 81 81 99 7E FF 
                  FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 10 
                  7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 C3 
                  BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 63 
                  63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 3C 
                  18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 00 
                  00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 18 
                  FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 18 
                  7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 6C 
                  00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 6C 
                  76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 66 
                  FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 00 
                  00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 CC 
                  38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 60 
                  F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 30 
                  00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 30 
                  0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 66 
                  7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 62 
                  78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 0C 
                  0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 E6 
                  DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 66 
                  7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 CC 
                  CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 C6 
                  18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 38 
                  C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 60 
                  7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 6C 
                  F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 00 
                  0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 00 
                  CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 00 
                  76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 00 
                  CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 00 
                  98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 DC 
                  00 00 00 10 6C C6 00 53 DC FF FB 00 07 E3 FF 85 
                  32 5B BD D9 F4 1D 50 72 AA F1 FF 26 00 CD B0 E6 
                  5A 1F 1E 52 40 8E FF 6C 75 FF 6E 83 6E 18 13 B0 
                  2B 6C 75 A3 00 6E 40 70 A0 00 FF 1F 06 00 74 E4 
                  A8 74 A8 74 24 E6 B0 E6 2E 00 E6 FE 40 75 B0 BA 
                  03 F6 3F 07 8C 86 80 86 40 82 C0 86 92 4B 77 FF 
                  FF E9 E9 FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF CF 1E D2 02 17 C4 74 
                  BB 00 DB 01 06 01 01 43 E8 8A 0F 10 EC B4 CD 59 
                  33 B4 CD B4 CD E8 8A 17 C2 D5 ED 75 72 32 FE 80 
                  19 DF 67 1A 5A 02 10 88 00 1F CF FF 00 00 00 00 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF E9 9F 
                  7F 7F 32 20 33 4F 50 51 8E 00 30 2F 30 38 20 19 
                  
                • 109592-003.hex
                  2C 60 E0 2E 34 8B A9 0F 03 26 BB 22 E4 80 40 0A 
                  19 3C 75 BB 32 8B 2E 3E 00 88 01 E8 72 C3 52 7C 
                  FA 61 E0 D4 E4 E4 24 3A 75 B0 EE 24 5A C3 FB FF 
                  E3 97 00 56 8B 60 89 04 46 00 C3 0E 42 8A 4A 0F 
                  42 C3 53 06 48 8E B1 B5 B0 E8 00 80 A3 00 10 FD 
                  01 08 A3 00 59 58 53 55 D0 C5 0E 00 C5 00 26 07 
                  00 C7 02 FF FC 8B FC FC FC FB 26 06 00 74 A0 00 
                  C1 14 38 4C 74 00 4C EB A0 00 C1 C0 E4 E0 5D 5B 
                  53 52 57 0A B9 00 08 33 F7 80 30 07 95 00 4F EF 
                  BE 00 00 B9 00 A5 BE 00 00 B9 00 A5 5E 59 C3 51 
                  57 E8 00 08 70 00 8E BE 00 89 15 E4 5F 59 C3 1E 
                  B8 1C D8 C0 33 BF 00 04 F3 BE 00 00 BB 00 E3 00 
                  80 00 44 88 04 44 92 04 00 10 B8 F0 10 F7 05 E3 
                  D2 89 02 54 C6 05 C7 07 BE 00 C8 9A 6C BE 00 00 
                  B3 E8 00 20 B8 00 92 56 BE 00 D0 92 4C BE 00 00 
                  B3 E8 00 48 B8 20 92 36 BE 00 00 B3 E8 00 06 00 
                  C6 57 80 58 B8 F0 92 16 8C 8E BE E3 A9 B9 00 D1 
                  F3 07 61 C7 FF 8A C1 04 EF 89 02 7C 88 05 44 00 
                  C3 B0 E8 76 C0 03 EB B0 E8 76 E0 95 90 A3 00 98 
                  88 8A B0 E8 76 78 F8 C3 B0 E8 76 E0 CC 0A 75 80 
                  EF 8E 69 58 56 78 5B 22 BA 00 83 B9 00 A9 C3 E8 
                  44 E8 00 00 BB B6 19 E8 44 A1 00 C0 40 03 84 BE 
                  B6 FB 74 80 FF 6E DB 6A 10 C4 03 03 69 02 02 40 
                  DF 56 F0 80 10 C4 0C E8 3C 74 3C 74 80 30 DF 3A 
                  FA 80 10 C4 30 E8 3C 74 3C 74 80 30 DF 1E 04 80 
                  10 C4 C0 E8 3C 74 3C 74 80 30 04 DF 09 8C 8E E8 
                  5F C3 8C 8E BE 80 E4 00 AC E0 FB 0E 00 BB B7 0F 
                  E8 43 FE C3 07 07 07 07 07 07 07 07 07 07 07 26 
                  00 66 C3 3C 77 06 7E B4 E8 00 8B 02 02 9A 8B 04 
                  36 76 8B 10 D8 AC 5E 80 00 76 3C 74 3C 74 3C 74 
                  3C 74 93 93 1E B8 00 D8 E8 00 59 D3 07 7E F6 00 
                  75 B4 E8 00 8A 49 88 01 3C 74 3C 74 3C 74 3C 74 
                  B9 00 09 2E B4 E8 00 C2 16 00 14 D2 C6 FE 75 FE 
                  B0 B4 E8 00 D2 02 08 C3 0E 02 EB 50 06 00 8E BB 
                  00 C8 39 07 58 03 10 9C E8 6C B0 E8 74 E0 14 8A 
                  A8 75 80 20 C4 C0 0E 00 BB B8 56 E8 42 33 20 0C 
                  00 BB B8 56 E8 42 06 00 75 BA 20 D3 B9 00 A7 A8 
                  74 BA 20 EE B9 00 97 F6 96 10 0B C0 06 00 31 06 
                  E8 72 A9 72 B0 E6 E8 72 2E AF 72 E4 A8 75 32 0A 
                  12 75 E8 5E 0A 0E 00 E8 5E 0C 00 BB B9 55 E8 42 
                  ED 3C 72 95 2D 33 0A 12 74 E8 00 06 00 C3 BA 00 
                  20 B9 00 1D 95 05 03 4B C6 12 00 C3 E4 24 E6 06 
                  C0 C0 8B 24 26 06 00 85 53 DB 5B 89 24 07 60 64 
                  FF E8 0C 64 02 02 F5 45 60 50 60 20 20 CF 00 16 
                  FC 75 C3 50 1E D8 06 00 1F 06 00 00 06 00 33 B1 
                  B5 33 06 0E 00 48 8E 26 05 00 C7 02 FF FC 8B FC 
                  FC FC C0 89 74 FE EB 83 40 CD 04 C9 CC EB 00 08 
                  1E 00 0E 00 C3 FE 06 00 00 06 00 C6 92 01 80 E8 
                  52 C5 00 C0 12 2E 00 16 00 0E 00 0E 00 00 B0 E6 
                  33 BE 00 04 FF 44 C6 04 C6 05 88 06 44 BE 00 04 
                  FF 44 C6 04 C6 05 88 06 44 06 B8 00 D8 48 8E 33 
                  33 B9 40 66 A5 E0 8B BB FF 37 C6 54 C0 06 00 8B 
                  8D 1E 50 8E E4 50 08 61 00 C6 00 FF F0 88 01 E6 
                  26 05 B0 E6 E4 8A B0 E6 E4 05 04 80 2B 3B 72 33 
                  C1 06 89 02 89 04 FE C9 E1 26 4D 8B 8C 26 25 88 
                  01 FF BE 80 E4 26 02 E2 F6 FE 26 24 06 00 E6 1F 
                  C3 A8 A3 00 C8 80 F6 20 0B 00 F6 10 03 00 B8 04 
                  E3 CA 16 00 C1 C0 40 1F 00 F6 40 0B 00 F6 80 03 
                  00 B8 04 E3 CA 16 00 8A B3 B9 00 C7 EF 24 3C 75 
                  80 01 07 01 05 C3 E2 1E 50 8E BE 00 44 24 0A 88 
                  02 04 C6 FF 04 C6 FF 32 A3 00 DB 02 01 FF 00 F7 
                  BB 04 E3 CA 16 00 C7 50 FF C7 52 00 C6 54 C0 06 
                  00 C6 56 00 06 00 1E B8 00 D8 61 E0 08 61 84 1E 
                  00 06 00 E6 FC FC FC FC FC FC FC FC 86 E6 8B 5B 
                  C3 00 00 00 00 FF 00 92 80 FF 00 92 00 FF 00 9A 
                  00 FF 00 92 C0 FF 00 9A FF FF 00 92 00 FF 00 92 
                  00 FF 00 92 00 FF 00 92 00 00 08 00 00 08 FF FF 
                  00 00 88 00 88 00 89 00 89 00 0F 16 08 20 0D 00 
                  22 2E 2E 88 08 8E B0 26 1D 84 FC FC FC FC FC FC 
                  FC FC 10 8E 0F C0 25 FF 7F 22 EA 88 F0 0F 1E 08 
                  E5 0F 16 08 20 0D 00 22 2E 2E 88 08 8E E4 8A 0C 
                  E6 8A 26 1D C6 00 FF 61 B2 0F 16 88 20 0D 00 22 
                  2E 2E 88 20 8E B0 E6 B9 FF E4 A8 74 E2 E9 00 FF 
                  E4 A8 75 E2 E9 00 60 08 7C C7 00 00 00 EB 66 00 
                  EB 66 00 00 75 EB 66 06 C0 00 16 16 00 C7 00 00 
                  00 EB 66 06 C0 00 98 00 C7 00 00 00 EB 66 06 C0 
                  00 A0 00 C7 00 00 00 EB 66 06 C0 00 03 B3 70 71 
                  E0 B3 70 C4 20 71 12 B3 70 71 E0 B3 70 C4 DF 71 
                  10 8E E9 FE 0F 16 08 20 0D 00 22 2E 2E 88 08 8E 
                  33 C6 FF 84 38 8E B8 00 C0 FF 00 FC F3 B8 00 D8 
                  F6 04 E6 B8 00 D8 95 B0 E8 00 16 0A 33 84 75 B0 
                  B4 CD F6 01 01 5A 2E 26 65 00 A5 A7 6D 00 8A 8A 
                  8B 8B 8B 8B 8B 55 EC 53 06 B0 E6 E4 A8 75 32 8C 
                  8E 8E 06 5E 26 0F F9 74 80 F3 08 FF 02 01 EB D6 
                  BE 8A 3C 74 3A 75 43 F2 D7 33 8B AC 00 16 C1 F7 
                  46 80 04 F3 D1 2E 94 8A 0A 07 5B 5D E9 11 07 5B 
                  5D CF F2 FD 75 FF 02 FC 74 4F EB 47 C3 F2 F7 20 
                  FD 75 FF 02 4E 80 00 08 4F 4E 4E 31 47 46 46 29 
                  FE 75 80 00 04 4E 1B 46 17 FD 75 FF 02 FC 74 4F 
                  4E EB 47 46 C3 F2 FC 74 4E EB 46 C3 F2 F7 15 FC 
                  74 4F 4F 4E EB 47 47 46 EB 83 FF 11 FC 74 4E 4F 
                  EB 46 47 EB 80 01 03 46 80 00 04 4F 02 47 8B 80 
                  00 04 4F 02 47 8B 80 01 03 4E 80 00 04 4F 02 47 
                  8B 80 00 04 4E 02 46 FD 1E 00 56 3A 72 8A FE F6 
                  01 0C CA F5 D1 DE DA 04 F5 D1 C6 C2 C7 74 80 49 
                  02 28 3E 00 77 50 8B 63 83 04 65 24 EE 58 0E 3E 
                  00 72 80 49 07 7C EB EA E5 00 E5 F8 C5 E3 ED C1 
                  E0 06 00 8C 8E 8B F6 F7 00 74 F7 F7 D1 03 96 C0 
                  14 C6 10 F0 CA A5 F5 FD CE F4 F0 E7 20 CA AB FD 
                  CE F6 40 8E E8 01 19 3E 00 72 80 49 03 0B 16 00 
                  C2 A0 00 C3 3E 00 74 D0 D0 BD 00 8B 8A 32 98 40 
                  F7 03 03 4E 97 F0 BA 01 E2 C6 01 10 D8 DD C7 20 
                  3E 00 74 47 C7 C2 DA 5A 8B 0A 74 3A 73 2A 50 E6 
                  E6 C6 F0 FB CA A4 F0 FB F6 20 F7 20 CA A4 C5 DD 
                  CE E0 8A D0 D0 58 C4 FB CA AA FB F7 20 CA AA DD 
                  CE EA 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 
                  0C E6 24 E6 66 01 00 66 DD 8B 06 33 B9 40 66 D3 
                  AC 46 32 E1 75 E4 A8 B0 75 B1 9E D3 46 FE 72 9E 
                  1F D3 9F 4D 9F 33 C3 04 50 61 0C 61 F3 61 8B 1F 
                  C3 06 00 C3 FF FF FF FF EA 8E F0 56 B8 00 D8 03 
                  E8 43 5E CF EB C3 FA D3 E1 C1 20 03 8E B9 00 BF 
                  03 EA F3 A5 50 3B 58 75 A2 03 57 75 BF 00 87 AB 
                  C8 BF 00 B5 AB C8 B8 FF 8C AB C5 C4 12 A3 00 06 
                  00 8E 53 01 BA 03 0F 21 0F C9 D9 1E 02 DB 8A 79 
                  0A 74 BA 03 09 21 01 CD 80 00 0D 05 3C 75 B4 CD 
                  04 24 3C 72 A2 03 0F 85 EB 33 89 A6 89 A8 41 06 
                  03 02 D2 8E B4 CD 1F 85 B4 CD 1E DB 16 00 0E 00 
                  52 51 85 B4 CD 3C 58 1A 2B 1E D3 C2 0F DA D2 1A 
                  21 BA 03 27 21 10 21 3D 74 BA 03 09 21 08 CD 8E 
                  8E BA 00 1A 21 00 0D 49 73 72 20 4F 50 51 4D 2D 
                  4F 20 69 6B 74 65 0A 6E 65 20 72 76 20 70 63 66 
                  65 20 0D 0D 52 69 73 72 20 69 6B 74 65 69 20 72 
                  76 20 20 66 6E 63 73 61 79 0A 74 69 65 61 79 6B 
                  79 77 65 20 65 64 0D 24 42 53 43 20 45 45 E8 42 
                  01 15 0A 8A E8 42 C8 33 BA 03 A8 74 B4 81 16 00 
                  26 00 E8 42 01 04 E4 60 CA 74 E8 01 07 74 8A 80 
                  97 03 C4 80 13 11 94 B4 3C 74 B4 3C 74 B4 88 E8 
                  42 1F 8A 05 C6 05 E8 5E 46 00 A6 58 46 B4 BA 03 
                  A8 74 B4 88 41 81 16 00 33 E8 FF 07 C4 75 8B 32 
                  8A 00 05 09 01 4E 01 EB 0A 74 B4 3C 74 B4 3C 74 
                  B4 3C 74 B4 EB B0 E8 41 05 01 5C E8 01 27 8F 8B 
                  C3 2C 8A E8 41 C4 75 E8 00 E8 01 07 47 FF 00 46 
                  3C 77 E8 40 12 D0 80 06 75 C0 04 0F 03 1E 65 E8 
                  00 61 27 45 B0 C6 01 C6 00 50 3A 58 70 47 E8 00 
                  02 27 27 B0 C6 01 C6 00 50 1C 58 54 29 E8 00 87 
                  27 09 B0 C6 01 C6 00 50 FE 58 4F 0B E8 00 61 27 
                  EB B0 C6 01 C6 00 50 E0 58 34 4E 01 E8 00 67 88 
                  E8 40 26 00 2C 1C 22 75 E8 40 7E 00 03 E8 24 3C 
                  75 B4 80 03 68 80 13 40 88 E8 40 47 00 46 32 FF 
                  16 C3 C0 66 80 02 09 01 4E 01 EB B4 E8 00 07 10 
                  01 10 02 13 07 03 02 02 33 8A 06 C3 00 50 FA 40 
                  E0 40 40 C4 DA F6 40 58 BA 01 A0 E8 33 DB B0 E6 
                  FB F4 EC FD FD FD 24 0A 74 EB 90 EC 8B 33 8E C4 
                  78 B8 00 D8 06 00 E8 38 46 00 46 00 99 C6 06 E8 
                  00 46 00 94 B0 E6 BA 03 0C 80 3F F0 C4 B0 8A E8 
                  66 F8 E0 33 C5 33 8B 8B 0A 90 74 FE 0A 91 74 FE 
                  0A 74 FE C0 06 CD 08 10 FA 35 A8 75 E8 3E E0 E8 
                  80 0F DB 0F DC 97 75 93 91 74 EB B0 8A E8 66 04 
                  C4 6B E8 3F E0 CC B0 E8 66 C3 76 B0 E8 3F 93 4D 
                  E8 FE 07 C6 05 E8 5B 46 08 E8 B7 E8 3F 7E E8 3F 
                  6B E8 36 04 F9 33 CC EC 10 0B 7E 00 26 4E EB B4 
                  B0 80 05 75 E8 3E 07 93 01 D1 E8 FE 27 F1 EB F9 
                  46 C3 00 0A 01 04 93 02 07 E0 0D 4E 6E 53 73 65 
                  20 69 6B 6F 20 69 6B 65 72 72 0A 65 6C 63 20 6E 
                  20 74 69 65 61 79 6B 79 77 65 20 65 64 0D 24 0A 
                  30 2D 69 6B 74 65 42 6F 20 65 6F 64 45 72 72 0A 
                  BB 00 E8 B0 E6 E4 3C 75 E2 4B 05 E8 EB FF FF FF 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  55 EC 50 1E B0 E6 8B 04 DB 5E 8B 80 F0 0A 12 84 
                  46 E9 01 FB 05 0C 14 84 5B 58 E9 05 13 84 D9 0E 
                  BF 13 80 8E 0F C0 25 00 80 0E 00 81 0F 00 66 C1 
                  AB 33 A1 00 AB 1A 66 BE 00 08 AD AB FB 21 66 0F 
                  F8 AB 33 A1 00 AB 1C AD AB E8 AB E0 AB 04 AD AB 
                  FB 60 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 
                  5A 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 4E 
                  66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 54 66 
                  C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB B8 00 00 
                  AB 33 8C C1 04 AB FF 66 66 00 92 66 66 C0 E0 E0 
                  66 B8 FF AB 48 66 C0 44 66 66 04 25 FF 00 AB 33 
                  8B 04 AB 42 66 C0 44 66 66 04 25 FF 00 AB 33 8B 
                  04 AB 3C 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 
                  AB 36 66 C0 44 66 66 04 25 FF 00 AB 33 8B 04 AB 
                  3B 66 FF A0 0F 1F 66 5D A9 A9 8B 8B 8C 9C 3C 77 
                  32 8B D1 2E A4 97 80 87 EF DB 05 0E 00 F8 52 DB 
                  12 16 00 C2 A0 00 08 65 EE 10 16 00 C2 A0 00 F7 
                  65 EE F8 92 7E CA 5B 2D BA AF AE 5D AF 64 DC B6 
                  A6 C3 FF 7D 7D 7D 85 7C 58 59 5E 5D 07 FF FF FF 
                  FF FF FF C8 FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF E9 03 FF FF FF FF FF 
                  FF BB E8 F5 30 3E 00 72 80 49 07 03 7F E8 2A 16 
                  00 C2 8A EC 01 FB EC 01 FB C4 47 E2 C3 3E 00 72 
                  80 49 07 51 71 AA E2 C3 EF 74 80 49 04 07 3E 00 
                  72 8A E8 2A 16 00 C2 8B EC 01 FB EC 01 FB C3 FB 
                  EF 80 49 04 07 3E 00 75 8A E8 2A AB E8 2A 5E 8A 
                  49 8C 8E BE FA C0 08 D2 DA 36 00 7F D1 D1 D1 03 
                  80 06 63 EC 8B 57 8C 8E 51 8B 80 03 08 B1 D1 D1 
                  D0 73 0A FE 75 8A 8A AB CD E6 5A 5F D0 D8 04 8B 
                  AD FB 03 33 AB C7 1F D0 79 26 05 81 B2 E2 81 3E 
                  4A D8 C4 EB 8A 8B 8B B9 00 F3 D0 79 26 05 81 FF 
                  AC FC 03 32 AA EF 1F E4 EF 01 75 C3 00 FC 51 3D 
                  DF F8 00 8E 33 81 55 75 33 B9 80 02 02 E2 74 B8 
                  00 D8 0E 00 BA 50 37 B9 00 51 EB B8 00 C0 8E B8 
                  00 8B FF 00 58 40 8E C3 D8 DB 3F AA 62 F6 C9 6F 
                  D1 8B AC D8 FB 3E 04 EA B8 00 C0 8E B8 00 8B 55 
                  ED FF 0B 74 1E 40 8E 80 12 FF 5D 8C 1F 8C 03 3B 
                  76 3D DF 1B 15 06 BA 50 69 B9 00 CD 1F 61 80 8C 
                  03 C3 06 00 E8 00 07 80 76 33 07 C3 06 00 50 12 
                  5A 07 8B E8 00 3D C7 ED 1F FC D8 DB 3F AA 2D F6 
                  C9 6F D1 8B AC D8 FB 09 04 EA D8 C2 60 1E 00 BB 
                  B8 14 E8 2C 07 BA 00 D8 C2 D2 8E B8 00 C0 B8 00 
                  8B FF 00 1F 51 8B 46 2E 24 05 F7 EB 46 8A F9 C3 
                  1B 32 B4 36 B8 B0 BD 89 77 72 79 69 70 5D FF 73 
                  66 68 6B BB E0 5C 78 76 6E AC AF 2A 20 1B 40 24 
                  5E 2A 29 2B 0F 00 7B 7D 0D 3A 22 7E 7C 3C 3E 3F 
                  20 38 2D 35 2B 32 30 0D 47 49 4B 4D 4F 51 48 4A 
                  4C 4E 50 52 53 06 07 0C 1A 1B 1C 2B 0A 47 48 49 
                  4B 4D 4F 50 51 52 53 FF 50 01 85 10 84 E9 4D 24 
                  83 04 86 42 83 05 E4 C4 42 C4 EE E2 FF B8 07 47 
                  33 B9 20 AB 17 47 EE E5 FF FF FF FF FF FF FF FF 
                  8A FF FF FF 50 B0 E6 B0 E6 B8 00 C0 20 A0 20 C0 
                  F0 F6 97 20 0B 80 97 DF 58 02 FC 53 51 83 10 EC 
                  80 97 20 76 9B 46 8B 81 0F C1 04 5E 81 00 0B 8E 
                  B9 00 8A 24 3C 74 E2 EB 90 25 07 66 00 09 08 D9 
                  00 C4 1F 5E 5D 58 50 01 85 16 84 20 A0 CD CF 50 
                  40 8E 58 C0 86 70 8B 6E 8B 6C FB E9 61 50 40 8E 
                  FA 0E 00 16 00 06 00 FB 1F 8D E8 00 00 EE 8A B0 
                  E8 5B C8 04 E0 8A E9 61 0A E8 5B 80 03 EB C3 EF 
                  B0 8A E8 5B 02 E1 C1 B0 8A E8 5B 0B B0 0C 24 24 
                  84 74 0C 8A B0 E8 5B 31 E8 FF 07 92 8A B0 E8 5B 
                  F0 09 84 8A B0 E8 5B E8 0F E8 FF 06 E8 5B 07 E2 
                  6D B0 8A E8 5B 09 E1 5F B0 E8 5B 02 FB E0 0B 4F 
                  B0 8A E8 5B D7 FA 0B 3A A8 74 FB 33 F9 02 B0 E8 
                  5B 80 F7 01 E6 23 B0 8A E8 5B 05 E5 15 E4 24 E6 
                  B0 E8 5B 20 E0 0B 01 E9 60 B0 E8 5A DF E0 0B EF 
                  E9 60 E3 24 EC C7 0C 8A E2 FE 75 B4 C3 00 33 BF 
                  0F 89 F9 F9 F9 39 F9 F9 F9 B0 9C E8 5A E8 00 02 
                  CF C0 12 FA 2D 9E 0E 03 EB 90 24 C3 C0 B0 9C E8 
                  5A E8 00 02 CF C0 12 FA AD 76 0E 03 EB 90 24 C3 
                  C0 FB B8 00 D8 A1 00 25 FF 00 50 33 70 71 20 58 
                  06 0D 00 01 C3 86 74 80 49 02 09 3E 00 74 EB 33 
                  8E BF 00 46 3C 74 3C 75 B8 F0 03 A4 26 05 39 FA 
                  8C AB A0 00 26 00 16 00 0C E8 08 F4 E8 27 C2 A0 
                  00 B4 E8 E5 03 2A B4 E8 E5 01 20 C3 66 50 61 40 
                  74 83 04 89 1E B8 00 D8 61 E0 08 61 16 00 06 00 
                  86 E6 58 F9 87 80 06 75 E8 31 17 33 70 71 04 08 
                  FC 37 04 33 F8 73 E8 32 3B 24 E8 32 01 50 29 E8 
                  F2 3F DF E7 80 04 3E 33 80 C0 36 2E EB BE A0 04 
                  CC 28 C8 24 C6 EB C7 02 00 46 00 C6 07 C7 0C 00 
                  46 00 E8 31 3C 49 C5 72 8C 0C 8B 03 56 33 E8 31 
                  0A 7E 72 2E 1C FF 5E 2E 6C 88 05 8A 01 4E C6 07 
                  E8 31 0F 88 80 00 07 F7 81 87 E8 31 56 33 81 16 
                  FF F7 01 27 20 0F 15 03 4F 21 12 3C 87 BE A0 56 
                  E8 31 2F 1A 72 3C 74 83 06 02 0A C6 3C 74 83 06 
                  3B 01 15 C6 2E 54 74 EB 3C 74 2E 54 75 E8 F1 3F 
                  75 87 E8 F2 F7 8A 03 00 88 8C 0C 8B 04 56 81 16 
                  00 C0 14 4E 01 B4 32 EB 81 16 00 0C C0 D4 80 00 
                  09 F7 E8 F1 87 87 C3 09 93 20 09 74 21 0F 15 21 
                  09 97 21 09 97 21 12 17 21 FF FF FF FF FF 02 02 
                  2A 50 0F 27 DF 25 09 FF F6 08 40 02 02 1B 54 0F 
                  4F DF 25 09 FF F6 08 80 02 02 2A 50 0F 4F DF 25 
                  12 FF F6 08 00 A3 00 A5 00 FF 00 00 00 5F 50 40 
                  8E 3C 77 74 F6 A0 01 2A 0E 00 E8 00 E4 24 E6 FB 
                  20 F8 15 06 00 75 F8 0B 23 80 A0 FE 01 58 00 5F 
                  02 FA 0B 42 0C 50 E0 0B 3D 58 C3 B0 E8 57 BF 8A 
                  B0 E8 57 FB 89 98 8C 9A 89 9C 89 9E C3 83 00 07 
                  74 B4 F9 32 BA 02 24 E9 00 01 EC 0F 0F 0A C0 DB 
                  C9 D2 78 83 0E EC 46 FA 6D 8B B0 EE 46 00 8B 0C 
                  5E 8A EC 0F E0 11 DF 4F 2B 89 0C 5E 77 EB 8B E8 
                  00 D9 C4 74 89 02 C4 74 89 04 C4 74 89 06 C4 74 
                  89 08 46 75 FB 58 59 5D 5D E8 C1 04 E9 C1 04 C3 
                  B0 E6 E4 8A E4 8A 58 FB 1E BB 00 DB 06 00 75 C6 
                  A0 01 8E 8D A0 E8 FF FA A1 FE 00 00 A1 E8 FE 06 
                  00 74 80 A0 7F EB F9 1F CA 00 5F 60 1E 40 8E 89 
                  67 8C 69 B0 E6 E8 00 06 07 B4 CF 8D 20 C7 FF 8C 
                  C1 04 89 02 C8 E8 26 47 26 47 9A 5C 26 07 FF D0 
                  E0 26 47 8C C1 0C 88 04 C6 05 06 8C 8E 8D 92 E8 
                  00 D0 E7 5E 8D 08 89 02 88 04 C7 FF FA 80 70 0F 
                  1F C1 26 47 E8 00 88 04 C7 FF 26 47 92 0F 17 01 
                  0D 00 01 2E 2E A1 C0 00 B8 00 D0 10 8E B8 00 C0 
                  33 33 B0 E6 51 E9 F3 59 C1 00 01 B0 E6 B8 00 D8 
                  C0 D0 50 20 66 FE FF 0F 00 58 D8 00 2E 01 51 EB 
                  FA 4A 75 B0 E6 E8 48 10 DF 60 38 75 B0 E6 E8 48 
                  B4 E4 A8 74 4E 50 36 74 8B 89 58 08 61 F7 61 01 
                  C4 80 91 C0 E0 03 C3 8C 8B C1 04 C1 E8 59 B8 00 
                  D8 16 00 26 00 2C B0 E6 1F 61 C4 80 C4 8B 0A 75 
                  81 06 FF 4E 40 EB 81 06 FF 4E 01 5D E8 47 1B D1 
                  64 AA 75 B0 E6 E8 47 09 FF 64 98 74 B0 E6 C3 5F 
                  31 46 8A B0 E8 54 FB 5F 2E 74 B4 F9 02 FB 8D 38 
                  C7 FF 8C C1 04 89 02 C8 E8 26 47 26 47 9A FA 11 
                  20 C7 21 04 21 01 21 FF 21 11 A0 C3 A1 02 A1 01 
                  A1 FF A1 5C 26 01 8D 10 0F 1F 8B C7 04 00 0F E0 
                  01 0F F0 FF 4D 33 0F D0 28 8E B8 00 D8 20 8E 32 
                  F8 02 53 06 08 8E BB 00 7F 80 2F 7F C0 29 7F 00 
                  23 20 C6 05 B8 00 C0 E0 26 1F F7 00 74 B8 00 03 
                  FC 33 07 5B 8C 8E BB E6 C0 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 00 20 00 00 00 20 00 
                  00 00 20 00 00 00 20 00 00 50 10 25 00 30 74 3C 
                  72 8B 10 80 30 EB 32 2E 87 A8 02 07 49 A0 00 00 
                  BA 03 07 06 00 BA 03 C3 16 00 93 01 C2 EE EA 33 
                  A3 00 62 2E 87 A8 4A D1 2E 87 A8 4C D1 2E A7 A8 
                  E4 A0 00 C0 C4 65 2E A7 A8 26 00 10 06 79 26 6C 
                  26 4C A0 00 FE 02 15 80 09 75 8A E8 00 E8 C1 40 
                  8A 07 0E 00 49 3C 74 3C B8 00 03 20 33 B9 20 AB 
                  07 50 33 B9 00 AB 06 00 74 BB 01 C0 A0 00 C2 EE 
                  51 1F B1 D2 B1 F6 80 07 02 C0 C3 FF 1E 00 33 8E 
                  C5 74 2E 9F A8 F3 BD A7 2B FB 8C 8E 1F 24 A2 00 
                  50 F7 4C A3 00 91 E9 0C 27 5E E6 8C 00 08 A0 00 
                  FF 09 E3 24 0A EB B1 D2 80 20 DF C3 66 83 05 C3 
                  49 88 00 4A 88 01 62 88 07 28 50 28 50 00 00 00 
                  00 00 00 00 00 2C 2D 2A 1E 30 30 30 3F 00 10 20 
                  20 03 03 D0 D0 C3 D0 D0 54 A0 D0 A5 87 D0 D0 D0 
                  49 57 D0 65 4D 41 59 39 59 2E D2 B9 F2 6E 53 53 
                  A4 C7 00 97 1F D0 D0 D0 28 D0 D0 D0 F8 F8 BC 78 
                  78 14 14 01 01 1E 3E B0 E6 B8 00 C0 1E 00 33 33 
                  BE 20 FF C5 00 F3 81 00 3B 72 52 40 8E 89 13 33 
                  8E BF 00 50 8C BE A8 A5 E2 33 8E BF 01 08 B8 00 
                  AB FC 31 84 C0 C0 86 BF 01 08 8C 2E AB FB 32 84 
                  46 BF 00 20 8C 2E AB FB BF 00 C0 89 5F 33 84 40 
                  8E BA 12 80 34 02 D0 16 00 34 84 90 1E 33 33 8A 
                  E8 4F D0 DA C4 F3 AF 7A 8A B0 E8 4F F0 D3 12 8E 
                  68 0C 8A B0 E8 4F 35 84 36 84 00 8C 8E B0 E6 BE 
                  A8 00 B9 00 AD 42 EC FF 07 C7 4A 92 E2 B0 E6 BE 
                  A8 08 B9 00 AD EC D0 8A EC C4 05 C7 92 E2 B0 E6 
                  BE A8 78 B9 00 2E 85 75 B8 00 D8 1E 00 3B 84 49 
                  80 87 14 8E E0 A8 75 B0 E8 4E 05 07 26 00 EB BB 
                  BA 8E 06 F4 74 80 87 FB 06 00 B0 E8 4E 30 E0 1E 
                  52 84 3D 1F 74 80 00 03 3C B0 E6 E8 F0 B8 00 D8 
                  DE 72 3C 75 80 87 FB FF FF 9E B0 E6 B8 00 D8 51 
                  84 8E 64 A8 74 B4 EB 90 94 56 24 8A 50 B0 E6 E8 
                  EF 58 01 1E 50 AE 74 33 8E BF 00 C7 E4 80 10 CF 
                  0E 00 B4 B0 CD 80 10 CF 0E 00 B4 B0 CD E8 00 07 
                  B0 E6 E8 01 0E ED B9 00 F5 E9 1D FE 40 E8 00 73 
                  F6 24 50 55 84 E8 00 0D 56 84 95 E8 1C 75 C3 84 
                  8B 83 0F C0 40 D3 01 10 FC 74 B0 B5 80 20 07 45 
                  B0 B5 80 10 CF 2E 00 53 8E 06 C6 5B 74 F9 50 57 
                  84 B4 CD 33 C3 80 30 03 13 80 10 30 2E 47 E8 F2 
                  07 D9 C3 DC 75 E8 00 B0 E8 4D 20 E0 8E 53 C3 58 
                  84 1F 84 B0 E6 8E 06 6C 74 E9 00 5A 84 01 3F 03 
                  02 01 17 B0 E6 33 33 8B 0D C7 C4 02 C0 C2 E2 33 
                  8B 0D C7 C4 02 C0 C2 E1 75 80 FF D5 5C 84 BD AC 
                  F8 33 8A 02 0E ED 9D 28 5D 84 8B 08 C9 4F 8B 0A 
                  B8 00 D8 12 50 19 E8 37 74 A2 00 5B 5E 84 C3 81 
                  A2 73 E9 FF 5F 84 E8 4B 13 0D B0 E6 E8 4B 07 23 
                  72 E4 C3 FF FF FF FF FF FF FF FF FF FF 31 00 89 
                  60 A0 00 FE 02 2A DB DB 36 00 7C 0D 1C C1 18 16 
                  D9 E3 60 C5 11 8A 8A E8 00 C8 CB 0A 3F C3 0F 0E 
                  E4 E8 E8 E8 00 80 07 48 FB FF E3 4E 89 50 A0 00 
                  46 75 52 C0 C5 26 00 C8 4E D1 03 5A 0E C4 42 C5 
                  00 00 4A C4 C4 00 00 42 C1 00 00 4A 8A EE 8A EB 
                  EB EE FE 8A EB EB EE 8A EB EB EE FF 1E 58 8E BB 
                  F8 F0 B8 00 FF 4F E9 3A 61 0C 61 F3 61 F0 B8 00 
                  FF 67 E9 3A 0B 57 94 5F 72 EB E4 A8 66 00 00 75 
                  81 82 74 BB F9 B6 C0 C3 26 05 88 E4 0C E6 24 E6 
                  58 0B 75 E8 DA E0 E4 33 B1 D0 73 46 F9 F6 C0 17 
                  8B 66 33 8B B9 00 FF 07 C1 08 E2 8A 8B 1F C3 FF 
                  FF FF FF 72 98 A6 A7 2D 5E A3 A3 9C E2 A6 A7 49 
                  71 A3 A3 3B 19 A3 A3 44 70 80 80 12 40 9C 8B 8B 
                  02 46 5D 58 48 1E 6A 8B 80 15 0A 40 8E E8 04 2E 
                  66 FE 81 1A 02 FC C0 D8 36 01 C2 74 C4 18 BB 00 
                  DB D8 5E D1 2E 97 AD 07 61 88 15 26 00 00 40 46 
                  24 3C 72 3C 77 E8 17 EE 73 B4 E8 05 A0 00 46 88 
                  74 88 15 E8 05 53 E8 B0 26 44 C0 02 01 7E 0A 11 
                  02 26 44 0A 75 B0 88 00 A2 00 10 8E 8B B6 80 15 
                  74 0A 75 FE 0A 14 66 74 3A 76 B4 EB E8 05 D3 72 
                  E8 03 3D F8 06 73 80 11 0A C7 74 E8 05 27 54 E8 
                  05 1F 05 80 15 75 E8 05 11 4E 75 F7 1A 00 08 29 
                  EB E8 05 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A E9 03 DA 72 E8 03 30 F6 08 74 0C 80 15 75 
                  0C 50 8A 07 C0 02 04 46 58 48 E8 04 7F 7E 0B 06 
                  C4 02 C6 66 88 01 04 E6 04 09 34 C6 E8 03 DA F0 
                  4C E8 03 7E 0B 05 FF 72 E8 04 14 C8 72 E8 04 0A 
                  4E 75 E8 04 03 46 C3 54 72 E8 03 40 F6 08 74 0C 
                  A2 00 78 E8 04 0F 92 72 E8 04 05 11 EB E8 04 E8 
                  04 35 30 26 44 A2 00 06 00 E8 04 D6 72 E8 03 DA 
                  F0 7C E8 04 0F 54 72 E8 04 05 D3 EB E8 03 89 14 
                  74 53 5E 80 9F FB 5B 0D 46 89 10 07 B8 EB 26 04 
                  FF 76 B8 03 48 E0 E0 26 44 89 12 8A 02 CC 75 89 
                  10 E8 03 50 5E 26 7C FE 80 A0 C3 74 80 10 8A 0E 
                  8B 05 E8 06 07 42 AA C3 B0 AA C4 AA C7 C6 91 E8 
                  03 AD 72 E8 01 0A E2 72 E8 03 05 07 38 C3 46 72 
                  E8 03 03 2A C3 38 72 E8 02 06 00 E8 03 75 72 E8 
                  01 0A AA 72 E8 02 03 02 C3 10 73 80 01 03 97 1E 
                  C0 D8 36 01 E8 02 06 00 C6 46 00 26 00 E8 01 A0 
                  F6 EE 83 E8 FF 7D 80 75 02 17 0E 00 E8 01 B0 F6 
                  EE 65 E8 FF 5F 81 1A FF 46 00 7F 72 1E C0 D8 36 
                  01 B3 E8 FF 2A 35 72 80 75 02 03 EB 1E C0 D8 36 
                  01 B3 E8 FE 0A 0E 00 E8 00 05 05 5A C3 68 72 E8 
                  01 06 00 E8 02 A5 72 E8 00 0A DA 72 E8 02 03 32 
                  88 14 E8 02 23 4A C6 48 90 6A E8 02 13 84 72 E8 
                  01 E4 46 3C 74 B4 E8 02 8A 75 FE 80 80 5E 73 89 
                  14 46 89 10 19 46 00 26 44 26 64 26 1C F7 89 10 
                  56 C3 46 00 01 66 88 74 81 1A 00 E8 00 21 46 24 
                  C0 04 A0 F6 EE 14 72 A8 74 B4 EB A8 75 B4 E8 01 
                  53 E8 00 FF 04 C4 17 06 B9 F4 80 0E A0 E8 00 F4 
                  75 B4 F9 5B 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
                  2A 2A 1E 40 8E C6 8E FF 20 20 A0 C0 D8 00 9C FF 
                  54 1F CF F7 EC 8C C3 10 04 20 02 F1 EC 8D B4 24 
                  74 56 6D D0 72 46 F9 AC 86 A0 00 26 44 C1 02 42 
                  8A 14 43 8A 12 3F 44 8A 13 45 8A 12 E8 8A 10 E4 
                  C0 03 C4 46 8A 10 01 E0 0C 8A 11 E6 0A A2 00 8A 
                  08 F6 EE B8 00 66 03 0E D2 50 E2 C1 04 D0 25 00 
                  1E DB 00 BA 01 6F C3 ED 4E E8 DD C8 72 E8 00 0B 
                  8E AC BA 01 E2 C3 00 BA 01 6D 32 8A 00 5E E8 FE 
                  0C 0A 72 BA 01 AA EC 51 24 E8 FE 10 F7 EC 08 08 
                  38 E2 B4 F9 C3 F9 32 89 14 88 15 46 00 26 00 4E 
                  01 F9 C6 8E 00 26 00 26 00 E4 11 46 24 3C 74 FE 
                  74 3C 74 E8 FD EB BA 03 00 E8 10 FE 72 E8 00 56 
                  BE 00 F1 B9 00 EE E2 59 C3 51 33 8E F8 00 9C FF 
                  54 1F 0A C0 06 00 1B 16 C0 14 B9 F4 06 00 0B 9A 
                  E2 4B EF 80 C6 8E 00 5B A8 74 B4 EB A8 74 E8 FE 
                  06 04 03 11 C3 24 BA 01 C0 A8 75 E8 DC F6 80 C3 
                  F6 B0 EE B0 E6 B8 00 D8 72 E6 3C 75 FF 8B B3 33 
                  BD B5 0D B0 E6 E4 F6 24 8A B9 FF 61 10 C4 10 F6 
                  69 B9 00 8B E9 12 D9 42 84 33 BA 00 B8 00 00 33 
                  B9 40 C2 FF 66 D0 AB F9 C6 81 00 72 B0 E6 E4 0C 
                  E6 24 E6 B0 E6 BF 00 BB 00 00 33 66 C5 F4 DF F6 
                  00 8A 9E D1 9F F4 AD 33 E1 75 B0 E6 E4 A8 B0 75 
                  81 00 81 00 72 66 7B EB B0 E6 B8 00 D8 E4 FF 23 
                  E9 D2 E3 33 B1 D0 73 46 F9 F6 C0 11 B9 00 F1 FF 
                  07 C1 08 E2 8B B0 E6 8B 8C BF 00 5B E9 10 83 B9 
                  00 67 E9 11 FE 30 2D 79 74 6D 42 61 64 46 69 75 
                  65 0A 32 31 4D 6D 72 20 72 6F 20 30 2D 65 6F 79 
                  41 64 65 73 45 72 72 32 35 4D 6D 72 20 72 6F 0D 
                  20 30 2D 6E 61 69 20 65 6F 79 43 6E 69 75 61 69 
                  6E 0D 42 73 20 6F 75 65 20 6F 75 65 41 20 6F 75 
                  65 42 20 6F 75 65 43 0D 50 72 74 20 68 63 20 20 
                  50 72 74 20 68 63 20 20 3F 3F 3F 00 30 2D 4F 20 
                  72 6F 0D 20 30 2D 6F 6F 68 6F 65 41 61 74 72 46 
                  69 75 65 0A 35 31 44 73 6C 79 41 61 74 72 46 69 
                  75 65 0A 33 31 4B 79 6F 72 20 72 6F 20 72 54 73 
                  20 69 74 72 20 6E 74 6C 65 0D 20 30 2D 65 62 61 
                  64 45 72 72 0A 33 34 4B 79 6F 72 20 72 53 73 65 
                  20 6E 74 45 72 72 0A 30 2D 65 62 61 64 43 6E 72 
                  6C 65 20 72 6F 0D 20 30 2D 69 6B 74 65 43 6E 72 
                  6C 65 20 72 6F 0D 20 30 2D 6F 72 63 73 6F 20 65 
                  65 74 6F 20 72 6F 2C 50 65 73 20 68 63 20 6E 74 
                  6C 61 69 6E 0A 31 31 49 4F 52 4D 45 72 72 0A 31 
                  32 53 73 65 20 70 69 6E 20 6F 20 65 2D 52 6E 53 
                  74 70 0D 20 20 20 6E 65 74 44 41 4E 53 49 20 69 
                  6B 74 65 69 20 72 76 20 3A 0A 31 32 53 73 65 20 
                  70 69 6E 20 72 6F 0D 20 36 2D 65 6F 79 53 7A 20 
                  72 6F 0D 20 36 2D 69 65 26 44 74 20 6F 20 65 0D 
                  0D 20 52 53 4D 20 20 46 22 4B 59 0D 0D 20 30 2D 
                  79 74 6D 55 69 20 65 75 69 79 4C 63 20 73 4C 63 
                  65 0D 20 20 20 20 6E 6F 6B 53 73 65 20 6E 74 53 
                  63 72 74 20 6F 6B 0A 0A 65 75 69 79 4C 63 20 63 
                  69 65 6F 20 6F 4B 79 6F 72 20 74 61 68 64 0A 37 
                  30 44 73 20 20 72 6F 0D 31 39 2D 69 6B 31 45 72 
                  72 0A 37 30 44 73 20 20 61 6C 72 0D 31 38 2D 69 
                  6B 31 46 69 75 65 0A 37 32 44 73 20 6F 74 6F 6C 
                  72 46 69 75 65 0A 36 35 44 73 65 74 20 72 76 20 
                  79 65 45 72 72 28 75 20 65 75 29 0A 20 20 49 73 
                  72 20 49 47 4F 54 43 64 73 65 74 20 6E 44 69 65 
                  41 0D D8 D4 B4 00 00 67 1E 40 03 29 F0 B0 60 B7 
                  00 BD BA D8 B0 E6 EB 33 E6 B0 E6 32 EB E6 B0 E6 
                  FA 0F 84 00 85 B8 F0 D8 FF 21 A1 E0 8B F7 00 75 
                  BB FF 1F 07 C4 E8 0C 61 10 84 12 4B 42 4B 92 4B 
                  C0 8F 54 43 12 41 36 43 00 40 00 40 0C F2 EE 11 
                  84 01 B8 EE 01 D8 EE BA EC DA EC C0 32 EE 84 BF 
                  BB 01 17 8B 04 57 B9 00 55 E9 E0 C2 81 D9 75 B0 
                  EE FF B0 E6 BD BB 8C 33 8A 02 0E 7B E9 F1 C3 81 
                  A2 72 B0 E6 B9 01 C0 FC 00 43 40 E0 40 00 75 BB 
                  B6 18 BD BB 4D EB B0 E6 B0 E6 EB E4 24 8A B0 E6 
                  8A E6 B0 E6 B0 E6 B0 E6 EB E4 24 8A B0 E6 EB E4 
                  24 F6 80 E0 07 CC B0 E6 B0 E6 B0 E6 8A E6 B0 E6 
                  BD BC 40 E4 24 E6 B8 00 D0 00 B0 E6 E8 EC 51 72 
                  B0 E6 E8 3B 0E ED B9 00 35 E9 0B FE 02 E4 51 88 
                  E8 09 E4 A8 74 E2 EB E8 E7 06 B0 E6 E8 EE 1B 84 
                  E1 B0 E6 E8 0F 1D 84 0D B0 E6 E8 24 1E 84 6D B0 
                  E6 E8 27 20 84 B4 E8 0B 96 BD BC 2F E8 C3 B0 E6 
                  E8 10 23 84 70 B0 E6 E8 11 E0 2E 1F 8A 01 C0 40 
                  0A BE 84 CB E9 CC 24 84 8F E8 3A 1F D0 64 91 72 
                  E8 3A 11 60 F1 E0 D1 64 E8 3A 73 E9 FF C4 60 25 
                  84 AC B0 E6 E8 06 27 84 EC BE EE 28 84 9B B0 E6 
                  E8 C7 2A 84 0F 10 00 10 61 E0 6C 61 E0 61 2B 84 
                  0E A6 A8 74 BA 20 06 B9 00 F1 E4 24 E6 E4 24 E6 
                  B8 00 D8 06 00 F6 96 10 24 0E 00 80 96 20 E8 2E 
                  F2 60 B9 FF 06 00 74 E2 C6 96 00 86 3E 00 12 1B 
                  40 E8 35 C0 75 0C E6 E8 35 92 4B E6 EB A8 75 A8 
                  75 E8 09 00 11 3F 00 06 34 02 05 C6 B0 50 FF FA 
                  92 4B 3C 74 E6 C7 72 00 FB AA B0 E6 E8 33 94 CD 
                  8A 24 0E 57 4C B9 00 AE F8 03 35 80 2A 0A 06 00 
                  74 E9 01 00 D3 0A 79 80 AA 05 FC 75 F6 96 02 03 
                  08 F7 80 B8 28 06 00 74 80 96 F7 26 00 F6 18 02 
                  42 44 26 00 F6 96 08 34 36 FC 75 F6 96 01 2A 06 
                  00 74 80 96 FB 26 00 F6 18 01 0E 10 26 00 F6 96 
                  04 04 1E 00 C3 FC 75 F6 96 02 0C 0E 00 80 96 FD 
                  05 0E 00 80 17 08 C3 FC 75 F6 96 01 1D 06 00 74 
                  80 96 04 26 00 EB 80 18 01 0E 00 F9 85 17 75 09 
                  17 F6 17 04 3C FC 75 F6 17 08 36 06 00 74 F6 96 
                  02 17 06 00 74 EB F6 96 02 0E 06 00 74 80 18 7F 
                  04 3E 00 FC 74 F9 38 2A 52 45 F6 18 04 0E 0E 00 
                  B8 85 A6 CD 45 C3 26 00 B8 85 EE 7D E8 08 C3 F0 
                  03 0E A8 B4 9C E8 28 FF 20 7D 50 43 58 00 14 01 
                  10 09 0C 7D E8 06 7D E8 08 C3 FC 75 EB 80 54 02 
                  93 FC 75 EB 80 45 03 4F 80 B8 03 97 80 37 03 AB 
                  80 52 03 D3 80 46 03 D6 E8 02 27 26 00 72 FC 75 
                  E9 00 FC 74 80 33 05 00 FC 80 34 05 01 F2 F8 F6 
                  96 01 1A 06 00 74 F6 17 08 03 9E F6 96 10 DF 05 
                  26 00 80 18 08 E8 2A FB 3E 00 74 80 49 03 09 B8 
                  BF 01 10 F6 18 08 F9 C3 33 86 19 84 74 E8 10 EB 
                  E9 38 E8 2A E9 29 06 00 74 F6 96 02 15 06 00 75 
                  80 96 FD 0A 06 00 75 E9 FF E8 2A CD FB C3 06 00 
                  74 F9 F8 F6 17 04 F7 06 00 74 B0 E9 00 06 00 74 
                  F6 17 08 DD 06 00 74 F6 96 02 CF 26 00 80 71 80 
                  47 FA 06 45 CD 33 EB B4 CD 33 F9 E9 FF E4 33 FC 
                  7C 80 44 2B FC 74 80 58 1F 34 06 00 75 B0 F6 17 
                  04 2C 30 06 00 75 B0 EB F8 B0 F6 17 08 14 23 06 
                  00 75 B0 F6 17 03 02 C0 E0 C0 9B F9 0A 78 8A 3C 
                  7C 3C 7E C6 19 00 C3 C4 47 81 2E F6 17 08 55 8E 
                  F6 17 04 42 06 00 75 F6 17 20 16 06 00 75 3C 7C 
                  80 4C 04 F0 02 C0 06 00 74 80 96 FD E0 35 32 EB 
                  F6 17 20 D5 E2 1C 8A 72 EB F6 96 02 2F 2E 89 2B 
                  0A 38 75 B8 4E CE 2D 0A 2A 75 B8 4A C0 30 BF 26 
                  00 0A 19 F9 80 96 FD B8 EB 8B 1A 3B 1C AD F6 17 
                  08 05 06 00 C3 FA 80 A3 00 1C 0E 03 EB 90 C3 41 
                  74 8A 49 80 04 05 EC 76 E8 00 16 00 C2 EC 01 FB 
                  EC 01 FB 8B 89 00 C3 26 00 FC 72 80 06 0A 7D 26 
                  05 46 C3 95 8C 8E 8B 8C 8E 83 08 FC 04 02 04 FC 
                  13 F0 54 B9 00 E2 01 D0 D1 E2 AA F6 20 CB DE C6 
                  FE 75 8C 8E BE FA FC 69 73 33 8E C5 7C 50 8C 8C 
                  3B 5B 75 83 00 09 FC 49 72 04 83 08 46 C3 F8 DF 
                  FF 4C F7 8B D1 8B 50 A0 00 E7 FF C3 E0 C2 C3 1E 
                  00 D2 DA FB EF EF FB 06 00 75 D1 03 C3 C6 DF ED 
                  80 56 F0 FB 04 A7 0B 08 4A F0 33 F9 5E C6 03 E8 
                  B8 00 D8 B0 84 C0 75 A2 00 F2 B0 EE C0 3C 74 B0 
                  E6 EB 80 8B 01 E4 72 E8 00 B8 84 06 9B 73 B0 E6 
                  BB BA 1E BA 00 79 E8 01 2B B3 84 C0 C0 C4 04 B2 
                  E8 00 3E 00 72 B0 E6 33 8E 26 3E 01 81 02 07 B7 
                  B3 B9 7A 10 13 11 BA 01 5A 80 18 FC 74 EB A8 75 
                  E8 CD E0 CB D9 CF D3 09 EB B4 CD 72 B4 CD 72 52 
                  8B 2D 00 E8 CC E1 80 01 E4 C0 03 D4 0A 26 75 FE 
                  B8 04 13 1B FC 74 80 11 11 FC 74 8A 24 3C 74 FE 
                  EB B9 00 0C 13 04 92 F9 B0 E8 34 40 0A B7 84 00 
                  EB 90 92 42 0A 74 8A 1E C0 C8 D8 C3 E8 74 3C 75 
                  B0 E8 34 C1 C8 10 E5 01 FA 04 8C 06 33 8A 24 74 
                  3C 75 B0 E8 34 C8 C1 E5 01 A3 01 0E 01 4C A3 01 
                  4E A3 01 06 00 2E 0E 00 06 01 33 0E 01 1F 0E 00 
                  B0 E6 BB B9 C2 74 BB B9 13 BA 00 0D C3 B6 84 F8 
                  F6 01 06 39 BB B9 15 BA 00 F1 C3 3A E8 00 F7 BB 
                  00 24 EC 80 0C 2E E2 4B F0 80 0A F1 EC 01 03 20 
                  C3 B0 E8 33 08 E0 8E 5F FB E4 24 E6 E4 24 E6 C3 
                  00 BA 03 B0 EE EE B0 EE FB 51 56 1E 8B BE 00 DE 
                  E2 00 F2 FC 73 8A 7C D1 8B 00 0B 74 84 75 E8 05 
                  2B CC 05 4A EB FE 75 E8 05 19 CC 05 2F EB FE 75 
                  E8 05 07 CC 03 04 5D 5F 5A 5B FF FF FF FF FF FF 
                  FF FF FF FF FF E9 04 00 BB 00 02 5B 55 51 04 59 
                  5D 8B 9C B0 E6 E4 8A E4 0E 03 EB 90 86 8B 9C B0 
                  E6 E4 8A E4 0E 03 EB 90 86 53 D8 FB 09 72 E2 C3 
                  CB 00 43 40 E0 40 C4 D8 00 43 40 E0 40 C4 D8 FB 
                  09 04 DC E5 D8 E4 F2 E9 D9 E6 04 D3 B9 00 C1 EB 
                  90 D4 E2 00 04 BE C6 17 B0 26 85 80 47 D3 02 BE 
                  C6 03 FF FC 00 8E 92 F7 2D 92 90 14 27 88 00 AA 
                  E2 FF 86 51 8B C1 08 02 E8 00 81 03 B9 00 0D B0 
                  E8 00 B9 00 01 C3 92 F7 2D 92 90 14 27 51 E8 00 
                  59 E2 C3 B8 00 D8 06 00 1F 51 C6 74 E8 00 EE EB 
                  F6 30 08 29 80 10 F3 5B 8A 53 5D 5B E2 C3 07 E8 
                  00 43 F6 B0 E8 00 0A 43 C3 FA E8 00 00 E8 FE BB 
                  00 37 BB 00 8E C3 20 E8 00 00 E8 FE 8A B1 D2 E8 
                  00 C5 01 C3 0F 90 14 27 01 C3 07 B4 CD C3 B6 43 
                  38 42 05 42 61 03 61 48 E4 24 E6 C3 FF B8 B0 C0 
                  8A 43 88 00 AA E2 FF 06 FF B8 B0 C0 07 26 85 80 
                  47 F4 C3 1E B0 E6 B8 00 D8 26 00 16 00 D1 84 FD 
                  74 E9 00 D2 84 B1 9C 8A B0 E8 30 D2 40 F7 8A B3 
                  E8 00 1F A1 00 80 33 BB 00 F3 F8 1E 00 80 E8 BD 
                  D3 84 28 8E 8E 8E 0F C0 25 FF 7F 22 EA C8 F0 0F 
                  1E A1 D4 84 40 8E 8E 69 8B 67 E8 DB 13 33 BB 00 
                  F3 00 75 EB 90 01 8A BA 10 FF 74 8E 66 C0 00 33 
                  FC F3 FE 80 10 E6 1F C3 00 BB B6 1A E8 FE 50 51 
                  1E B8 00 D8 06 00 00 FF 74 88 4C B8 00 C0 33 B9 
                  40 FF 66 AB CF C3 E0 1F 59 58 E8 00 26 00 E4 05 
                  4E 01 C3 46 8A 41 0A 74 81 16 00 FA 06 00 B0 8A 
                  06 E0 0C 46 8A 3F C0 04 C4 F2 EE E0 8B C0 06 F7 
                  EE EC A0 00 0F C4 30 26 00 F8 FD CD 72 B0 B1 26 
                  5C 80 01 74 80 01 75 B1 3A 73 86 F6 8B E8 FC C3 
                  BA 03 BC E8 C7 A8 75 E2 B0 EB E8 C7 42 40 C3 FC 
                  45 2A 05 E0 F6 04 D8 46 2A 07 F6 04 C3 06 00 46 
                  8A C3 F2 A0 00 0F 12 E8 04 02 03 26 00 04 E4 C4 
                  08 E8 C7 26 00 0C EE 24 F6 3E 80 0A 60 E2 B4 F9 
                  0D 26 00 E8 25 8F 32 C3 10 F7 0C 46 80 00 E6 E6 
                  86 E6 86 8B 8A E6 8B E6 86 E6 86 FB 8A 07 E7 0A 
                  06 9D 8A 05 97 C3 FF FF FF FF FF FF B0 E6 E6 B0 
                  E8 2E E0 0C 40 22 A8 74 E8 00 20 03 02 58 50 4A 
                  C3 53 50 40 8E F6 A0 01 2B 2E 00 03 23 2E 00 73 
                  58 B0 80 BF 05 80 A0 FE 9A 8E 8B 98 26 0F 58 5B 
                  C3 25 00 83 03 80 83 03 04 EE 8B 2E EE C4 EE 42 
                  24 EE 4A C0 4A C2 EC E0 EC 50 B0 E8 00 0D 10 C3 
                  74 4A 20 BB 5A 84 75 52 C2 EC E0 C1 EE 02 C1 B0 
                  E8 00 45 71 80 7F B7 B9 00 80 B0 E6 E4 86 E4 86 
                  8B 58 84 75 84 75 50 00 43 40 C4 40 C4 2B 81 20 
                  5F 72 E2 FE 75 80 80 C0 09 E0 EA EC E4 C3 C2 EE 
                  42 20 3D 00 18 38 01 D0 D0 0A D0 D0 0A 32 86 BE 
                  CB F3 0A 8A 83 03 80 83 03 ED F1 E6 8B 2E EE E0 
                  EE 42 C7 4A 32 EE E8 FF 3C 73 83 04 C0 06 88 0C 
                  06 E3 8A EE EA E8 FE 17 00 80 C0 60 30 18 0C 06 
                  03 02 00 55 02 08 20 80 00 90 84 0E BE CC 02 19 
                  AC E0 8F 87 B0 E8 2C E0 EA 92 84 A9 B0 E6 C3 93 
                  84 04 08 D0 0D DA 0E BE CC 03 99 2E 8B BA 00 08 
                  EE 42 FB C0 B9 00 EE 42 FA 87 83 81 82 8B 89 8A 
                  E0 87 C4 5A 00 83 C4 52 00 81 C4 4A 00 82 C4 42 
                  00 8B C4 3A 00 89 C4 32 00 8A C4 2A 00 94 84 00 
                  B9 00 EC 3A 75 E2 BA 00 08 EC 42 3A 75 E2 8B E9 
                  FF 00 BB B6 1A E8 FA FE 95 84 0D DA 00 08 D0 40 
                  0B 41 0B 42 0B 43 0B C0 D6 41 D6 42 D6 43 D6 96 
                  84 9C B0 E8 2B 80 02 F5 80 76 8A B0 E8 2B C8 84 
                  68 8A 9D C6 C7 3C 77 86 8B 8A E8 00 3B 58 D8 C5 
                  AF 3C 77 8A 8B 33 86 51 23 F7 93 52 3C F7 B9 22 
                  E1 D8 13 8B 8A 8A B4 F6 D1 03 33 03 13 87 83 07 
                  C8 E9 DA E9 DA E9 DA 01 1A 0E 8E F2 0C 8A B0 E8 
                  2A B8 00 D8 C0 C0 8B 20 26 06 00 CE 26 00 E4 24 
                  E6 BB 00 10 F6 6B 01 03 EF 26 2E 00 26 00 07 1E 
                  B8 00 D8 0E 00 B0 E6 58 CF E0 EC 24 D5 C3 40 8E 
                  8B 10 DB 9B 3E 00 10 0A 75 80 02 B3 70 0C 8A B0 
                  E8 2A 49 E8 DD 04 07 C3 75 EB F6 02 06 E3 EB 90 
                  E3 53 00 BB B8 3D E8 F8 EB E4 24 E6 E4 24 E6 89 
                  10 C3 3E 00 07 60 08 46 0A 5F 0D 4B 01 B4 E8 B5 
                  03 52 FE 3A 4A 75 32 FE 80 19 13 CE 02 3A B4 E8 
                  B5 8A E8 00 B4 E8 B5 26 00 66 C3 03 1C 0A 74 FE 
                  EB B4 E8 B5 D2 DD F4 E8 F8 B4 E8 B4 FE 74 FE EB 
                  B4 E8 B4 FC 52 3E 00 74 80 49 03 02 00 01 33 B6 
                  8A 4A 4A CE 5A C3 1D 35 38 0A 74 79 F9 E9 01 FC 
                  7F 8A 32 2E 87 9B 06 00 75 F6 17 04 16 7F 06 00 
                  74 E9 00 06 00 74 E9 00 FC 75 B8 94 76 FC 75 F6 
                  96 02 0A 26 00 B8 95 60 C0 5F FC 74 80 0E 5D FC 
                  74 80 37 1A 06 00 74 F6 96 02 05 00 EB 80 96 FD 
                  33 20 0A 61 35 7B 31 1F 06 00 74 50 C9 C1 6B B9 
                  00 C4 AE 75 80 96 FD E0 DF F9 B4 32 EB B0 EB BE 
                  9B C4 72 EB 3C 7C 3C 7F 2C EB 80 37 D6 FC 75 F6 
                  96 02 07 26 00 EB 80 0F 09 0B 8A 59 EB 32 EB BE 
                  9B 84 72 F6 17 40 82 20 7D 24 80 35 11 06 00 74 
                  80 96 FD A4 4B 80 1C 11 06 00 74 80 96 FD A6 35 
                  80 0F 05 A5 2B 50 C4 C9 C1 0D 90 BF D1 AE 74 3C 
                  74 80 02 12 FC 7C 3C 7C 3C 7F 32 E8 00 C3 C4 EB 
                  B0 EB 01 1A 1C 28 2B 34 37 8B 1C 89 46 3B 82 75 
                  8B 80 3B 1A 74 89 1C FB DA 45 B8 91 15 C3 50 7D 
                  E8 F6 C3 01 46 81 16 00 52 39 A8 5A B0 EB B0 E8 
                  27 52 F6 8A 06 D2 03 E8 24 0A 74 3C 77 F8 01 5A 
                  E8 C0 27 C4 C3 8E 02 0E 58 C3 16 00 C2 74 80 C0 
                  09 FA 75 B2 EB B2 EB B2 F9 8A 8A 06 E4 03 E0 08 
                  8F 8A C3 FC 66 0A 74 C0 04 D0 06 00 E7 33 A0 00 
                  66 0A 74 C0 04 0F C3 53 8A C0 06 F7 EE 8B 8A 24 
                  C0 04 C3 74 0C 80 C0 E0 26 00 5B C3 A5 74 E8 BF 
                  C3 9B 75 E8 BF C7 C3 8B 86 E8 FF FB E7 C3 E8 1C 
                  4A DD 8A 07 E7 0A 06 D1 E8 1D 11 07 BF 00 B9 88 
                  47 F8 06 88 41 58 A0 00 C0 27 08 04 80 21 26 00 
                  C4 74 D0 EB F6 03 04 C4 0B C4 74 B4 EB B4 C3 40 
                  8E BB 00 2F 3F 75 E9 00 07 C0 E8 0A 74 FE 75 B3 
                  B5 B4 CD B4 E8 00 09 B1 33 CD 72 E9 00 FC 75 0A 
                  75 B4 CD B4 E8 00 C5 B8 04 01 D2 13 46 FC 75 0A 
                  75 FE 74 80 29 B7 05 ED 00 13 17 96 B8 04 10 D2 
                  13 1C 00 13 15 82 B8 04 0F D2 13 26 CB 46 C5 D0 
                  90 80 97 0B 04 76 BA A1 59 B4 E8 00 2F EB 90 02 
                  60 BB 00 3F 74 BA A1 3B BA A1 35 B4 E8 00 FB EB 
                  90 2E 00 C8 75 E8 FD F0 E8 FE BA A0 11 C8 08 74 
                  FE BA A1 03 3C E8 00 53 90 38 74 88 E8 FE 0E 00 
                  5B E8 FD 68 92 C0 04 E0 50 FC 75 3C 74 3C 74 B0 
                  E8 25 04 FC C4 E0 33 FF E8 FD 20 38 E0 CC B0 E8 
                  24 00 BB BA 59 E8 F3 01 E8 B1 0F 10 00 10 BD 84 
                  0E 33 E0 C2 24 86 E8 24 50 C2 D2 C2 78 AB C8 58 
                  60 06 A0 A8 60 84 00 8E BB 00 C3 8C 69 26 26 00 
                  06 00 00 61 84 D1 74 81 64 10 E9 03 87 B0 E6 C7 
                  86 80 C7 88 00 E8 AB 81 72 34 75 A1 00 86 A1 00 
                  88 E9 01 56 1E 8C 8E BB 00 DB 67 BF 00 0B F3 07 
                  5F B0 E6 E8 AD 07 64 84 0F 81 76 80 73 81 64 80 
                  8B 7C 89 76 8B 7E 89 78 E8 B0 F3 0B 74 E9 01 1E 
                  00 EB 00 1E 00 1E 00 EB 00 1E 00 90 A2 00 02 06 
                  00 E8 02 1E 00 C3 00 1E 00 C0 12 0E 00 00 2E 00 
                  16 00 0E 00 65 84 1E 00 1E 00 1E 00 1E 00 2E 00 
                  C5 00 91 A2 00 10 06 00 E8 02 1E 00 1E 00 C0 12 
                  0E 00 00 2E 00 16 00 0E 00 88 05 04 80 2B 8D 3B 
                  73 8B 88 03 86 81 80 A1 00 82 C6 8F FF 26 00 06 
                  00 E8 02 C0 12 0E 00 00 2E 00 16 00 0E 00 B8 00 
                  C0 80 8B E8 AB BD 00 06 00 B0 B4 E8 03 02 74 81 
                  64 44 88 6A 89 6B 88 6D A1 00 00 F7 B0 3A 74 8A 
                  C6 92 01 36 A9 00 12 0E 00 00 2E 00 16 00 0E 00 
                  88 0B 74 05 04 E3 10 E2 06 00 E8 03 02 74 81 64 
                  08 88 72 89 73 88 75 A1 00 00 BB 3F 1E 00 C3 24 
                  8C B4 C6 92 01 D2 A9 00 12 0E 00 00 2E 00 16 00 
                  0E 00 66 84 1E 00 89 13 8B 88 B0 8A E8 22 B1 E7 
                  2D B1 F7 64 80 74 B1 E8 AB 67 84 3E 00 02 0E B3 
                  08 0C 8A B0 E8 22 02 06 00 FF 02 03 8F F3 B0 E6 
                  E4 B0 E6 E8 15 64 01 FA 60 E0 CC B0 E6 50 10 58 
                  C4 60 08 B0 E6 F4 FD 69 84 00 EB 90 6A 84 01 B8 
                  00 D8 16 00 26 00 E8 F0 0B 75 E9 00 6B 84 00 8E 
                  F7 64 01 74 E8 F0 ED 0E 00 F1 0E 00 16 00 0A F7 
                  64 04 74 E8 EF ED 0E 00 F1 0E 00 16 00 01 F7 64 
                  02 74 E8 EF ED 0E 00 F1 0E 00 16 00 CE F7 64 08 
                  74 E8 EF ED 0E 00 F1 0E 00 16 00 C5 F7 64 10 74 
                  E8 EF 00 BB B6 1A E8 EF 06 00 FF 18 8C F7 64 40 
                  74 E9 FF 61 C0 04 74 84 D0 B0 E6 0F 0F 07 61 53 
                  D8 6D 84 C3 D8 6E 84 C3 1E 00 1E 00 26 0E 00 00 
                  1E 00 1E 00 4C 8B 84 39 80 73 8B 80 89 8A EB 90 
                  18 0E 00 00 1E 00 28 8B 84 89 8A EB 90 B0 E6 58 
                  1E 00 10 8B 84 89 8A F8 C0 01 5B 53 06 70 84 26 
                  00 C4 E4 F8 00 80 92 01 0A 40 8E 8B E8 A8 3E 00 
                  75 B8 00 06 00 00 86 B0 E6 B8 00 C0 56 55 8F 38 
                  4C 77 E8 D4 03 38 5D 5E 73 8A 4C B8 00 55 83 40 
                  57 53 1E 00 08 33 33 D1 1D 00 E2 8A 4C B8 00 C3 
                  74 B8 01 5B 5F 3E 00 75 B8 00 C0 C5 C3 C4 39 82 
                  77 B8 00 09 80 4C 01 7E 89 84 50 73 84 07 5B 06 
                  53 B0 E6 58 4C 50 48 8E B9 00 D8 FF C0 DB 00 AF 
                  3B F4 8A E4 A8 74 32 33 EB 47 8B E4 A8 74 32 BF 
                  00 26 3E 00 75 B8 00 C0 C5 40 8B E8 A7 EB 4F 26 
                  05 06 26 25 C4 C6 00 C8 2E 00 7C 84 8B A3 00 D7 
                  02 EB FE 3A 76 E9 FF FF 74 B8 00 5F C3 A9 FA 32 
                  FB 0E 02 F8 15 E8 E8 90 F8 36 00 04 36 00 36 00 
                  C3 81 FA 0A FB A0 00 80 00 23 0D 75 B8 1C 19 2F 
                  75 B8 35 0F FC 77 3C 74 3C 75 B0 BE FF 02 F6 F6 
                  80 00 06 F0 02 00 53 1E 00 C3 73 E3 C0 05 C3 26 
                  00 E4 0A A0 00 C3 05 5B FF 77 80 1F 51 E8 11 FB 
                  26 00 E8 11 F3 60 FF F6 97 10 0B F7 74 B0 E6 EB 
                  80 97 EF 66 8A C0 05 C3 60 FF F6 97 10 09 F7 4E 
                  B0 E6 80 97 BF C3 8B 1C 89 46 3B 82 75 8B 80 3B 
                  1A 74 89 1C 32 F8 03 01 FB 50 08 5F 09 67 C0 16 
                  86 BF 80 C0 0A 01 E6 2E 26 00 6E C8 16 86 BF 80 
                  C0 0A 00 E6 2E 26 00 54 C8 0C 86 7F 40 86 00 44 
                  C8 4F 86 00 40 05 E0 E4 34 E6 EB E4 24 0C E6 B4 
                  EB 83 01 2B F9 77 B8 00 C1 40 E0 86 BF 80 C0 C4 
                  86 00 92 E6 80 00 04 C4 4A 58 E4 A8 75 A8 75 B4 
                  EB A8 75 B4 24 2E 06 00 1E 01 3A 00 74 32 B9 00 
                  C8 41 09 08 08 80 02 02 C4 E4 E8 16 FF 08 00 20 
                  02 01 C4 E4 FB 1E 3C 76 E9 01 EC 8B 8C 8E 8E 8B 
                  33 B9 00 AA F5 7C 26 05 FF C6 07 26 45 00 C6 05 
                  26 45 00 26 45 C0 7C 26 05 FF C6 07 26 45 00 C6 
                  05 8C BB 00 E3 C5 D2 05 00 D2 26 45 26 55 33 E8 
                  00 03 94 8D 30 8A 24 3C 74 C6 46 E9 00 02 E8 00 
                  79 46 0A 74 8D 10 DE 74 E8 00 F3 E0 2E 3D F7 00 
                  8D 30 FF 74 26 05 EB 26 05 33 E8 00 7C 26 05 C8 
                  12 80 BF 02 E8 00 2D 46 02 27 80 40 02 E8 00 1B 
                  46 01 15 7C 26 1D E3 74 C6 46 EB C6 46 83 38 1F 
                  B4 C3 FF FF 02 75 FF 06 04 F3 83 08 EF 8F 06 44 
                  8F 02 04 8D 18 89 02 01 B4 CD C3 7C EB F1 20 21 
                  21 21 21 A0 A1 A1 A1 A1 A2 A2 2D 37 BE B4 B4 B4 
                  B4 00 A7 03 00 03 00 B0 E6 B0 E6 B4 9E B8 FF 01 
                  B0 E6 EB E4 A8 75 0F C0 EF 22 B8 00 D8 64 04 62 
                  EA 01 84 AA 64 FF E4 A8 75 E2 EB 90 02 84 60 03 
                  84 04 84 00 8E 33 81 AA 75 BD DE FF 86 B0 E6 B8 
                  C8 D8 DB 3F 55 08 13 2E 2E DD 06 84 40 8E B8 00 
                  0E 07 84 8F 70 00 00 71 D8 8F 70 00 00 00 71 FB 
                  75 E9 C5 08 84 FB 75 EB 90 C0 F1 00 8E 33 BE DD 
                  0B AC D0 EE F9 A0 B9 00 0B EC C0 05 20 E2 83 20 
                  05 20 EB B0 E6 E6 B0 E6 80 0B 02 00 FF E3 8B 70 
                  B8 00 D8 E6 0A 84 40 8E FF 67 B0 E6 B0 E6 EB B0 
                  E6 E4 24 E6 B0 E6 CD FD F9 F5 E9 DA D5 A9 9A 96 
                  55 55 00 BD DE D5 80 C0 FB 75 BF 00 FD E9 A9 8C 
                  8E BF DE 14 8A F2 75 EB BA 00 C0 B9 00 29 B0 E8 
                  19 20 0E E0 C5 07 C3 46 00 C2 EC EA A8 75 A8 74 
                  C6 01 B0 EE EC E0 B0 EE EC 2B 4E 3D 10 02 C0 FF 
                  1E 00 2A C7 80 00 02 C0 0E 00 FB 72 80 07 32 28 
                  F1 C8 E9 E9 4E 88 02 E0 46 B1 86 32 D3 89 06 3E 
                  00 75 D0 02 66 83 07 C3 F1 46 88 02 03 DC E3 5E 
                  D2 88 05 E3 03 05 03 04 9C C7 67 F4 8C 69 89 98 
                  8C 9A E8 17 8F E8 19 FE 64 EB 8E 9A 8B 98 9D C3 
                  EB 41 54 4F 53 43 42 33 4C 39 52 53 33 4A 39 4E 
                  42 43 43 70 72 67 74 43 4D 41 20 6F 70 74 72 43 
                  72 6F 61 69 6E 31 38 2C 33 38 2C 35 38 2C 62 EA 
                  8E F0 28 43 29 43 6F 70 79 72 69 67 68 74 20 43 
                  4F 4D 50 41 51 20 43 6F 6D 70 75 74 65 72 20 43 
                  6F 72 70 6F 72 61 74 69 6F 6E 20 31 39 38 32 2C 
                  38 33 2C 38 34 2C 38 35 2C 38 36 2C 38 37 2D 41 
                  6C 6C 20 72 69 67 68 74 73 20 72 65 73 65 72 76 
                  65 64 2E 0D 84 12 4B 22 48 EE 00 1C B0 E6 B0 E6 
                  B0 E6 B0 BA 00 B3 E8 00 92 4B B9 01 C3 4B 8A EC 
                  22 75 E2 B0 E6 B0 E6 BB B6 18 BD E1 9D EB C3 FF 
                  FF FF FF FF FF FF E4 A8 75 58 B0 E6 B0 E6 FC 80 
                  70 FF 21 A1 04 E4 32 8B BD E1 51 8B 8B 72 FE 8C 
                  8E 8E B8 00 D0 00 BE B7 D0 84 74 BE B7 C6 EB 87 
                  B9 00 EA 02 E8 00 D7 E2 00 04 E8 00 20 0E 10 D2 
                  02 E8 00 8B B3 33 BD E1 81 8B 33 8E 33 8B 89 E4 
                  0C E6 8B B3 33 BD E2 63 8B E4 24 E6 E4 A8 74 F8 
                  E5 40 8E 8B 13 C1 06 00 B9 40 DB F3 E4 A8 75 81 
                  00 3B 76 33 FF 8B 8B 33 BD E2 6B 8B 80 0F D2 04 
                  DB 05 E2 33 F9 E5 00 F7 6B 92 30 39 02 07 0E 10 
                  EC AC C0 06 0E 10 F5 E8 0F 27 1F C0 C0 40 A1 71 
                  A1 71 BF 00 28 AB 2A AB 0C A1 71 A1 71 BB 00 03 
                  CD C3 6B 00 FB 51 56 BB 00 DB E2 00 F2 9C 00 E6 
                  94 00 D2 77 84 74 FE 74 FE 74 58 67 42 00 00 24 
                  78 50 FE F8 15 72 B9 F4 88 EC F8 13 F6 CB EF 00 
                  00 24 78 0C EB 42 24 0C EB EB EE 1C 0F 42 08 00 
                  BB 00 F2 0C EB EB EE 4A EB EB EC F8 48 F8 8A 1F 
                  5A 5B 53 93 EB 53 13 8A E8 15 40 04 C0 07 C3 6A 
                  A8 5B 00 2F 2E 06 63 E8 0F 2E 3E 63 75 BA 00 8D 
                  B9 00 9F 1E 40 8E C6 12 00 C3 B8 00 B4 30 00 00 
                  60 FA 75 81 07 30 11 6B 3C 75 B8 F0 28 CD EB E4 
                  A8 75 A8 75 B0 E6 61 FF FF FF FF FF FF FF FF FF 
                  FF 01 00 80 00 00 00 01 00 02 00 80 00 00 00 02 
                  00 02 00 80 00 00 00 02 00 04 00 00 00 00 00 03 
                  00 03 00 00 00 00 00 03 00 02 00 80 00 00 00 02 
                  00 01 00 00 00 00 00 01 00 03 00 80 00 00 00 03 
                  00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 
                  00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 
                  00 02 00 00 00 00 00 02 00 03 00 80 00 00 00 03 
                  00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 02 
                  00 03 00 80 00 00 00 03 00 03 00 80 00 00 00 03 
                  00 02 00 FF 00 00 00 02 00 02 00 00 00 00 00 02 
                  00 02 00 00 00 00 00 02 00 02 00 FF 00 00 00 02 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 04 00 FF 07 00 00 04 
                  00 04 00 FF 07 00 00 04 00 02 00 80 00 00 00 02 
                  00 02 00 80 00 00 00 02 00 03 00 80 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 07 00 00 03 00 02 00 FF 07 00 00 02 
                  00 03 00 FF 07 00 00 03 00 03 00 FF 07 00 00 03 
                  00 06 00 FF 07 00 00 06 00 03 00 FF 07 00 00 03 
                  00 03 00 FF 00 00 00 03 00 03 00 FF 00 00 00 03 
                  00 02 00 FF 07 00 00 02 00 02 00 FF 07 00 00 02 
                  00 03 00 80 00 00 00 03 00 EB 90 00 01 70 00 00 
                  C4 FB B0 E6 B0 E6 BA EF 1E 8E 2E 16 63 B9 84 03 
                  51 00 13 00 B9 00 01 CD 59 3D 07 FF FF 74 E2 B0 
                  E6 80 80 27 0E 9E A8 75 8C BB 00 DB 2E 00 DA ED 
                  0D 08 09 BA 84 80 EB CD F6 80 22 1E E8 EB 1F E4 
                  3C 74 8B B9 00 FB AF 1E 5D E8 00 FE 33 E0 4C 24 
                  86 E8 11 BF 01 AA C1 10 B0 E6 EA 7C 00 C4 FB 14 
                  E8 00 00 16 19 2E 3C 74 E8 E0 F5 8B B9 00 F3 4A 
                  F5 F3 C8 F3 FF 8B B9 00 F3 75 4A F3 F3 C8 F3 74 
                  83 04 EE F9 E5 FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FB 1E 55 EC 40 8E 84 75 E8 
                  F1 EA 74 E9 00 CC 29 4E 40 81 0A FF C7 75 E9 00 
                  CC 75 E8 F1 EE 66 BF 81 0A 00 86 FE 75 E8 F1 7D 
                  CC 05 05 EB FE 75 EB FE 75 E8 F2 65 FC 75 E8 F1 
                  BE EB 80 0C 1E 4E 40 81 0A FF 6B 74 E8 F1 66 BF 
                  81 0A 00 35 FC 75 E8 F1 2B FC 75 E8 F2 21 FC 75 
                  E8 F2 17 FC 75 E8 F3 0D FC 75 E8 F3 03 EC 5D 1F 
                  1E B8 00 D8 0B E6 E4 84 74 8A E4 0A E6 E6 EB B0 
                  E6 E4 84 74 8A A8 75 E4 0A E6 80 FF 04 20 20 26 
                  00 1F 51 78 BA 03 4C EC 80 06 F6 EB 90 3E EC A8 
                  59 FF E8 D6 12 94 72 E8 D7 08 02 72 E8 E5 E8 02 
                  AD 64 A8 C3 60 06 40 8E F6 96 80 1B 60 AB 0A 0E 
                  00 80 96 7F 20 20 BD FF 2D F6 96 40 41 60 41 E8 
                  26 00 80 96 10 0E 00 50 0E 16 A8 75 B0 E8 0F 40 
                  05 26 00 58 20 20 E8 01 26 00 BD FF E5 BF 00 7C 
                  8A E4 F9 4F 15 00 72 B0 E6 FB C9 8A 50 46 15 06 
                  00 75 E8 D6 09 B0 E6 FB A2 B0 E6 FB FC 75 80 96 
                  02 1B FC 75 80 96 01 0F FC 74 80 FA 09 0E 00 58 
                  7E E8 00 06 00 74 EB FF FF FF FF FF FF FF FF FF 
                  FF 06 00 12 D1 80 54 05 FC 75 F6 17 08 36 FC 74 
                  80 45 07 06 00 75 E8 D3 23 FC 74 84 78 EB F6 17 
                  08 0E 06 00 74 80 18 F7 03 90 58 26 00 0F E8 00 
                  ED 1F 75 FA 22 CF 80 96 FD 06 00 74 80 7F FC 74 
                  80 1D 05 26 00 58 50 1E B0 E6 58 A0 00 20 74 80 
                  4E 04 C0 07 FC 75 FE 78 A2 00 23 26 00 42 FC 74 
                  80 36 07 06 00 75 80 1D 07 06 00 75 84 78 33 0A 
                  16 74 50 61 24 E6 E8 00 02 61 08 4B EF E6 58 50 
                  B0 E6 E4 8A E4 8A B0 E6 E4 8A E4 86 53 D8 FB 01 
                  76 5B C3 A0 00 E8 24 8A 97 80 07 C4 0C 26 00 08 
                  97 E8 00 C3 51 52 75 80 97 EF 58 B0 E6 B9 FF 06 
                  00 75 E2 E8 00 F4 60 27 26 00 E8 00 17 C0 04 07 
                  26 00 08 97 E6 B9 FF 06 00 75 E2 80 97 BF 58 50 
                  A0 00 40 06 00 40 58 51 E2 E8 A5 64 02 F7 C3 FF 
                  C9 C9 EC EC EC ED EC EC 9F 91 8F 90 A0 55 06 56 
                  51 50 EC C0 D8 36 00 40 8E C6 40 FF 66 FE 8A 01 
                  66 80 02 1B 18 1B 08 06 15 13 0C D8 FF E3 FF 3F 
                  EB 3C 76 E8 E4 8A 02 1E 00 4E 00 5B 59 5E 07 5D 
                  E8 A2 0F 99 72 E8 00 05 4E 01 C3 06 0A C0 E4 0D 
                  04 B2 D0 3A E0 75 E8 DC 80 01 75 8B 0C 10 F7 03 
                  02 D2 80 0F 11 7E 02 32 03 83 00 FA 72 C6 01 80 
                  41 00 0E 3E 00 74 E8 DC E4 28 C0 46 26 4C BA 00 
                  E2 E2 8B E8 DD C3 11 46 A8 75 B4 81 16 00 7A E8 
                  01 74 FF 5E D1 2E 87 EF 0B 02 00 0A FC A5 E8 DC 
                  7E E8 E4 7E E8 E4 C6 E8 E4 46 7E 05 05 91 EB A0 
                  00 1B C0 08 23 40 02 2A 6F 8A 01 69 83 05 C7 75 
                  B9 00 42 E8 DB FB CC EC 05 E2 E8 E4 26 00 F7 0A 
                  C3 51 FC 10 33 8E F3 5E B9 00 00 8E F3 5E 1F A4 
                  75 E8 A3 27 C4 75 80 87 03 EC 80 13 27 D1 B0 E6 
                  B9 FF 29 B0 32 F6 00 C3 04 09 2E 64 75 B0 E6 B7 
                  E8 E3 7E C0 02 7E E8 E3 C6 E8 E3 C6 E8 E3 EE E8 
                  FF 0E 4E 01 88 41 E8 FE E4 E8 DA 64 E8 DB 06 F9 
                  80 18 14 B0 EE 7E E8 E3 F3 75 E8 00 C0 80 B0 8A 
                  06 E0 06 00 1B 06 00 E0 C6 04 E8 FF 0B 70 70 7F 
                  B0 75 E8 DA C6 8A 8A 05 C4 74 D0 8A 04 E4 C1 5F 
                  47 53 04 E8 D7 FA 0F 31 8A 07 E7 0A 06 25 E8 A2 
                  7F E8 E3 E8 00 33 DB 8A 09 46 3C 74 3C 75 53 43 
                  5B 14 FC 75 B0 3A 73 86 0B 74 E8 D7 35 A8 B4 C3 
                  2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 1E 40 8E 80 
                  3E 80 20 20 01 CD 1F CF 08 AD B9 00 03 42 E8 E2 
                  F8 42 C3 B8 90 15 0B 06 00 74 32 EB BB 00 09 33 
                  F6 3E 80 0D F0 E2 4B EC 51 B4 80 3E 7F E4 2A 2A 
                  2A 2A 2A 2A 02 02 1B 54 0F E9 F2 E6 C5 E6 03 41 
                  E8 E2 B8 00 D8 00 C6 FE 04 C6 FE 04 B8 00 D8 00 
                  33 66 AD 48 8E 66 C0 FF 00 66 AB E5 FF FF FF FF 
                  FF FF FF FC 72 80 BF 33 14 8B BE 00 DE 16 00 E2 
                  BE B8 FA 75 BE B0 16 00 C6 C4 F0 C4 E6 00 E6 FF 
                  C6 E9 A7 06 55 56 51 50 B4 8B 51 64 E8 F8 06 F9 
                  F9 09 14 AC 59 E9 C3 FF FF FF FF FF FF FF FF FF 
                  FF FF 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 
                  00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 
                  00 00 38 2D 1F 19 02 06 00 00 71 5A 19 19 02 0B 
                  00 00 38 2D 7F 64 02 06 00 00 61 52 19 19 02 0B 
                  00 00 00 00 00 00 00 00 55 06 53 52 57 E0 84 BB 
                  00 00 8E B8 AA 06 00 0F C9 F6 0C 75 49 D9 4E B0 
                  E6 B8 C0 D8 55 3B 00 75 E8 00 36 ED 0E 00 E1 B8 
                  FF D8 26 C3 C1 20 C3 81 F0 B8 FF C3 C1 10 00 E8 
                  00 08 E9 A2 E8 00 09 E8 00 E9 5F 5A 5B 07 5D 1E 
                  F5 B8 00 C0 C8 D8 40 26 05 24 83 02 8B A3 71 EB 
                  81 00 26 1D 7C 26 05 28 83 02 8B A3 71 89 BF 01 
                  8B A3 71 C7 26 05 2E 26 1D E3 84 32 8A 02 C1 09 
                  E3 03 C3 FB 74 4B C3 0F E3 F0 EB B8 00 C3 00 8E 
                  BF FF 8B 26 05 E8 00 F6 00 8E 8B 32 8A 02 C1 08 
                  A5 50 52 D2 02 E2 84 5A 58 1E 56 51 00 8E 32 26 
                  0E 00 E1 83 16 F9 C9 D9 2E B9 00 A7 5F 07 C3 B3 
                  66 55 9C 33 BD F2 C5 9D 5D 58 32 C3 B3 EB 53 FF 
                  DF 25 B4 74 24 B4 3C 74 B4 A8 75 B4 8A 32 C3 FA 
                  4C B0 E6 FB C3 E8 F9 AD 64 64 01 04 60 F6 30 B0 
                  E6 E8 F9 B9 27 64 01 FA 74 E4 50 E8 F9 AE 64 E8 
                  00 02 CF FB B0 E6 BE FF 8B 2E 44 24 3C 74 E9 01 
                  9E B0 E6 66 0F 16 08 20 0D 00 22 EA F3 00 08 8E 
                  C6 00 FE 84 0E 00 66 AA AA BD F3 8E 72 66 B6 6D 
                  BD F3 80 72 66 55 55 BD F3 72 72 BB F8 30 8E B8 
                  00 C0 04 BA 00 FF B1 E9 F4 7C BD F3 1C BD F3 24 
                  B8 00 D8 38 8E B8 00 7C 33 BD F3 12 72 BA 00 E3 
                  E9 F4 0B FB F9 0C 82 EB B0 E6 E9 00 30 8E B8 00 
                  C0 04 BB F8 7C BF 80 13 E9 F3 7C BD F4 BA B8 00 
                  C0 04 BA 00 00 BD F4 BA 72 BA 00 3B E9 F3 B3 DB 
                  40 8E 8E 33 B9 20 F3 8E B8 00 82 BA 00 00 BD F4 
                  74 BA 00 6B E9 F3 08 8C 8E BE 00 64 BF 04 C6 FE 
                  04 C6 FE D9 04 BA 00 FF 95 E9 F3 0B 7C BD F4 4A 
                  73 E9 FF 08 8E BE 00 64 BF 04 C6 FC 04 C6 FC 80 
                  00 04 4C 40 10 8E 8E 0F C0 25 FF 7F 22 EA F4 F0 
                  0F 1E 08 80 00 0B D2 13 BB B6 4F E8 AF 7E 84 C0 
                  80 1E 33 66 01 00 66 C5 00 33 9E D1 66 E2 E4 0C 
                  E6 24 E6 66 01 00 66 DD 8B 06 33 8A B9 40 E6 66 
                  D3 8A 66 66 C3 F0 14 61 40 B8 00 00 08 4D A9 33 
                  C3 04 50 61 0C 61 F3 61 66 C0 19 34 86 80 0F F6 
                  04 DC 05 E2 33 32 EB 83 04 04 A8 75 66 E8 46 F5 
                  C8 D6 F9 E8 00 8A F6 22 D2 88 00 E8 00 22 D2 D0 
                  79 26 05 26 00 66 C3 22 0A AA 26 00 66 C3 FF 56 
                  D1 73 BF 20 E2 E2 E2 E2 FA E2 E2 FA FE 3E 00 73 
                  D1 D0 8A F6 8B D1 D1 D1 F6 80 07 C7 FA B0 E6 E8 
                  01 1B 05 10 00 BB B7 2F E8 D1 9D C3 00 06 95 EB 
                  90 86 84 FF 60 0A E8 01 05 F9 71 E4 3C 75 B0 E6 
                  B9 00 1D 73 E2 B8 00 D8 26 00 E8 EC 06 0E 00 C3 
                  45 B0 E6 E4 3C 74 EB 90 89 84 AE 64 D5 72 E8 00 
                  15 8A 84 60 B0 E6 E8 00 E8 D1 06 B0 E6 C3 00 BB 
                  B7 15 EB BA 00 C9 B9 00 73 C3 AE 64 95 73 BA 00 
                  ED B9 00 5D EB C3 80 84 7D 72 B0 E6 E8 00 25 61 
                  B0 E6 B0 E6 B9 00 75 73 E2 EB B0 E6 E4 3C 74 B0 
                  E6 BA 00 ED B9 00 17 EB B0 E6 B0 E6 E8 00 5D 60 
                  E8 00 1A 19 B0 E6 E8 00 0E 2F 72 B0 E6 E4 F8 01 
                  C3 CB E4 A8 74 E4 EB C3 B9 00 64 02 08 E8 CE E2 
                  F9 C3 B9 00 64 01 08 E8 CE E2 F9 C3 1F B0 E6 BA 
                  03 00 B0 E6 BB 00 8A B0 EE A2 84 64 E8 CE F6 BF 
                  00 AD 72 B0 BA 03 B0 E6 33 E8 F8 43 F4 E8 CE 91 
                  72 B9 00 5C 72 E1 74 E8 99 A8 75 EC 33 F5 00 15 
                  70 11 3E 72 E8 99 BE F8 03 EB B0 E6 EB B0 E6 BB 
                  B8 20 BA 00 1B EB B0 E6 E4 24 E6 B0 E6 E6 C3 FF 
                  FF 1E 40 8E A1 00 CF 32 CF 2A 2A 2A 2A FC 76 80 
                  C0 17 FC 73 57 F8 E7 7F EF 2E 95 F8 07 57 00 EB 
                  5F 02 C2 C4 C6 59 D9 C8 8E D3 9D AC BE BE BE BE 
                  BE BE CA CC 88 80 4F 04 CA 00 B4 F9 02 FB E4 5F 
                  EB EB EB EB EB EB 5F 32 CF 45 24 3C 75 8B 4C C2 
                  80 4E 8A 4E F9 E6 E4 C3 70 C4 71 03 02 00 FF 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  01 00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 
                  00 02 00 04 00 08 00 10 00 20 00 40 00 80 00 00 
                  00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 
                  7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FE FF FD FF FB FF F7 FF EF FF DF FF BF FF 7F 
                  FF FF FF B8 00 C0 00 33 66 C3 F3 B8 00 D8 00 C6 
                  FE 04 C6 FE 04 B8 00 D8 F6 00 66 AD FF 00 66 C3 
                  F7 66 AB F6 00 66 66 C3 F9 01 FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF 00 00 00 00 7E A5 BD 81 7E 
                  DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 10 
                  38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C FF 
                  99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 7F 
                  7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 18 
                  7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 00 
                  00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 00 
                  0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 00 
                  3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 6C 
                  6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 38 
                  38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 00 
                  3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 00 
                  00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 78 
                  0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 38 
                  C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 00 
                  30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 60 
                  18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC FC 
                  66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE FE 
                  68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 1E 
                  0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 C6 
                  F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C FC 
                  66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC CC 
                  CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 FE 
                  8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 10 
                  6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 E0 
                  60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 38 
                  60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 0C 
                  0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 00 
                  F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 00 
                  DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 00 
                  CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 00 
                  FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 76 
                  00 00 00 00 38 C6 FE FB 8A 32 81 07 77 D1 2E A7 
                  FE E4 CF 9C 9C 9C 9D 9D 9D 9D 9D 80 3F F0 1C 20 
                  20 58 CF 50 B8 00 D8 06 00 04 06 00 3E 00 75 B8 
                  00 06 00 0A 6C A3 00 A2 00 40 3C 75 F6 3F 07 18 
                  86 80 12 40 0E 3F 86 92 4B A0 00 4A 0E 00 9E 0C 
                  F2 EE 06 00 74 E4 A8 75 A8 75 0C E6 B0 E6 E9 FF 
                  FF FF DA FF FF FF FF FF FF FF FF FF FF FF FF FF 
                  FF FF FF FF FF FF FF FF FF FF 60 33 B4 CD F6 80 
                  52 40 8E B0 86 00 3C 74 FB 9A B4 CD 8A 51 03 10 
                  52 D2 02 10 08 10 89 72 FE 3A 72 E8 8A 0C D2 C6 
                  FE 72 E8 8A C9 B4 CD FA 0E 01 61 FF 00 00 00 03 
                  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 37 
                  B6 BE 47 4B 30 43 4D 41 EA DD F0 35 31 2F 38 FC 
                  
                • 1988-05-10.json
                  {"data":[
                  -1100993236,-1959854112,76230196,1947140265,-1876497661,-2145246021,-58670876,-401967808,1480327193,867898229,1921771570,4098094,512241152,1692925953,-1664917134,209500754,
                  -1973295878,-2133526816,1642336484,-533065692,-5179275,-131797778,-2034000550,-771804421,1352109027,39225600,6295179,-956019063,70,-301027133,-527766462,-300961718,
                  1355017282,-1207545517,-1064435640,162857649,401080752,8389888,-1325368157,-1325550320,583681,117472931,-1017619623,-1974119853,-2000319280,-1912583154,48069,509734,
                  1204233728,-50331902,529213180,-50529028,16483324,443942,141819904,704662688,-1877677119,4992568,369100404,-940900276,704662688,851508929,115392996,-1017423267,
                  1448235347,703319,-1090517575,-768409592,-1031736329,-1995983312,1325437845,-51387825,-1090481218,196673536,-56233216,-1090481218,196706304,1604711168,1532582494,1381061571,
                  417879639,-1291274496,469809264,12501134,-846613504,1592003093,1532582495,102654147,-1910767432,-54489384,12566579,309504,146713587,469809152,-150990661,1507,
                  -1996434816,1418199620,88393220,1594148754,1097216,-1141899080,-470351856,-2132559867,1149829330,72648706,-1845148474,459975,-1946144578,-392514616,415105132,469809152,
                  1642631859,2145792,-1291829064,5695634,-1946146626,-393038896,1086193740,-1342130176,1105760947,4767232,-1289748296,3598482,-1207938882,-1833713664,-973067288,-1073720314,
                  5703366,5815936,-1276116808,1501330,-661731188,-1075595074,129564841,-372162304,520594931,80200545,-57999361,-1073422143,1149830383,75270146,-955949944,1604,
                  -1901047613,-1468619800,-117214016,-1766842389,-1971939352,-392843040,1990424208,-392646656,-527796600,-2115463248,7906166,1354979576,1978175152,-2132768138,-922087220,-461372555,
                  -393301777,-1017612695,1148774486,2287707,-1157627718,297383555,1151985664,1676170947,233331524,47616,-1179216709,-1796734951,1621214020,1019225088,-385649600,-474087292,
                  -17071946,-75467916,175011071,-1217760037,616860176,1946369027,1946303593,977319682,-1101630753,-947865872,616860176,48807948,1316225852,57934396,976275328,-1103465761,
                  -947865862,616860176,82362416,846463804,57934396,976275328,-1105300769,-947865852,616860176,115916992,376701756,91488828,1949353856,1944009220,-930341367,1105778830,
                  516104031,-661731188,847249598,-2147436060,-488635732,-1173457669,935022592,1030583,-347872536,818094078,805777415,805777415,1258758151,537346567,1258770183,1227262471,
                  23496704,54271683,-1979294345,62130046,1375773672,-1274915189,10151938,-486257013,209095478,-1911535989,-1951597352,2122319454,326500608,259262268,192153660,125045308,
                  57937212,1368632467,1085820958,1490587136,520101352,1523835481,125733383,16795382,45352309,520114152,4793994,-1023318392,997459772,930351164,863242812,796134716,
                  -1275067975,3074057,703071156,985857536,1962953238,-19779052,436109510,-822211723,246680240,838864872,-402475822,-1262288888,190478,1397815531,47878,1119601550,
                  650677248,1527187257,-855411624,245154576,-1016327448,-1847062864,-1327461772,1955260436,57999784,-1977561984,1958783172,536918542,-1179091525,-857210794,-1472992446,-1173588960,
                  2109415424,5683640,-163398936,16781318,12192885,-1194083552,-402646087,279462567,12192884,-1192314080,-402646855,116802199,1947205782,180367883,1946161670,1913055281,
                  -395141400,930247337,1692844208,1920114920,1924130862,1625565554,594903208,101367858,259325970,1952351208,-1777434614,-1796730880,-1173558434,951787520,5618105,859981544,
                  1916594413,-392887950,-1070399443,1181194,115868532,302433792,1623392256,-1157627718,414824736,1109256192,1946500245,4974595,1181382,-87858944,-47963676,856039910,
                  650153664,2367115,604423974,-75140608,1088153683,512304731,-1341718492,-1184569760,904462335,-1469783028,-503155710,-431640331,-464469152,-434065312,-1261479904,-2145989376,
                  -143311876,5290179,-958886370,-16777210,-1928935649,-973078528,-100627450,-5121229,-13373259,1276020742,4765696,-953761650,637534213,-16628281,654114047,-50592373,
                  201129212,92874432,-1040317324,-1014821909,1959606848,-339083772,-2132049460,-1995934208,-2013229794,117476366,-939608893,-2147450362,-1895381504,113704704,-1124007790,-1779957632,
                  -2134539950,1958742784,1714325522,1729530112,1762560000,1678672128,-1023393536,-2065268816,1354678323,-16464128,38046207,251937990,-1845148474,-2012855160,1220413252,-16464128,
                  38046207,-16497466,-1845148474,-2012855160,503711556,-1912581960,4765912,-164380530,12189491,-211354560,-2049115,-491044981,523734015,5506758,1460061888,512458752,
                  -1205993331,-661782448,206594532,-1604196856,113639424,620691456,1166550768,1642485761,268813862,1894166960,-527797788,1894166704,356836,1065400580,-1053045973,-617414030,
                  637985729,637689225,-1258005111,-1043778818,-1993997087,-24443315,-2010716020,1166550565,2147465473,847249598,-1406731036,-85794814,-989932298,-970684378,-67108858,119506150,
                  11069635,-1962909533,41991112,1948303862,33602315,1947255286,16825091,-150732616,-1999962397,-1979674602,1019225281,-1155566528,-1040841728,-1156876992,-1040840704,-1157401216,
                  12068864,-18614524,-1860794166,-41237760,79233203,-1060664832,52691695,91554364,-352205952,1963015175,79921157,-1205934110,-661782448,-1979711298,-1339817404,1149813514,
                  -16464382,-956365626,80150276,-466477057,167797411,-1291684389,-1191235071,-470350848,-150732613,-1999962397,-1023373034,5244615,113770495,82,5506758,1426507456,
                  113676800,-973078442,-2147461370,1354257182,-455569920,216042081,-429791736,2001796,443904,-2065236224,-50529028,-50529028,-50529028,-50529028,1642520710,526107531,
                  195,0,16776960,9617408,16777088,9568256,16776960,10096384,16776960,9568256,16777152,10157824,16777215,9633536,16776960,9571840,
                  16776960,9633024,16776960,9633280,16797440,1325403912,-16252672,16777215,-2030043136,-721414008,83892360,-620750711,771758217,1360396559,-1071640824,251658509,
                  -13713374,-1199021266,-1064435704,-2010763344,-58399203,-50529028,-50529028,-50529028,-1191379716,-1064435696,1723867151,-475,-1071509633,8960490,17772272,-16229090,
                  17772261,252203286,17678368,-1071509760,1731133230,571528,1642381454,135061642,-997563930,639470118,1734,-345905409,17772210,260591894,17678368,-1071509760,
                  1798242094,2144392,-1062152050,-4627226,1692728063,91488936,-1863714590,-18176,27813092,-119405195,-469728535,1963501664,113731196,49152,15448064,-1006591642,
                  627441899,32768,15404405,444262,192,-350819562,113731072,49152,15422976,444262,192,1711336344,-1073740089,1677721600,-949616405,12582918,
                  -341835776,113731072,49152,15413248,444262,-16777024,-424431613,-2039356304,-424431392,214206064,-344857056,-424431598,-2039356304,-424431392,616859248,-1200494881,
                  -661782512,788454633,1360396559,-1071640824,251658509,-13713374,-1199018194,-661782520,80148019,-1199249665,-661782472,-1912584008,-1174457408,1727807488,146318835,869830144,
                  -66795786,280528102,-371683840,229703317,1912603880,1376432150,-1065037261,548405877,399311028,1946273014,-1017448191,1680227886,-1426049435,-1347965531,-1023381651,696965514,
                  2089498507,-1601467765,-1957342837,1381191916,196091398,551821542,1433739432,-930288334,1183766670,73304838,-2146465242,91550457,1978923392,1325351688,-352209662,-53048341,
                  -1400230722,158597180,-143277766,-336426173,-1976320297,1017962123,974550016,-1946716735,-461371322,1324559108,-13703471,-343262316,1510416138,1499289691,521213417,1482381831,
                  -1949345443,33390834,1325335413,16547842,1330578548,1195836139,1005751235,-2145356297,108331517,-16625921,-58719666,1325954048,1313754703,1194453838,1179010631,-2094404794,
                  225837054,1946221696,-347189756,-347716069,33390615,1325335413,16547842,1330579060,82529870,1179010887,-2131588157,74711292,48975438,-1950136762,1979137010,16547861,
                  1330579572,1313754959,1195848171,1179010887,-24958485,-2146339329,108265724,1330597454,1178999275,334186311,1963064704,38207235,1946221696,-347123964,-1018738942,-58658165,
                  1325691904,1191373647,-225721529,1963064704,38731523,1946221696,-347123964,-1018738942,-58658165,1308914688,1174596430,-1963080890,-1962915298,-751173034,-745929614,-990459138,
                  -2029227007,720710346,-153159983,704965594,-19846411,-389873978,561250759,4800128,-2144833022,50350398,1380979575,6493835,-1610300797,-148635547,-346531090,1228832782,
                  124912640,4800128,-1954777849,-2115359765,-788463643,-1963422747,853800645,-775879699,1309017056,-963864832,-259268978,-956832778,74711296,-570959625,-956047151,1958742678,
                  1942370836,-1963972080,61207498,-16972811,-1963690546,-1327002896,-204830176,-16972885,-1191807538,-661782464,1946236648,1228832793,309461504,4800128,-1962182909,-2097126634,
                  1704985794,-2134643200,100682046,-506461068,1354621648,-125087232,-315439734,21019288,-1056709897,5113347,-1729066089,-150912838,13039586,-149916671,-2116159528,-2145324857,
                  100682046,54985076,-1899852601,1398445786,-1073029237,-969265036,-265671565,-790179760,-1949922330,-1963226128,-1952123958,-2114221072,-2128609034,-1977614089,61141962,-19070011,
                  1491105230,-422514550,-1973885232,-1963226172,-1951730742,16220667,-204830176,-19070038,-1008044594,-315398626,112742,862322688,1073789381,1721696051,-1419325231,1642396130,
                  1642466316,1642525476,113510,862322688,-980719907,-164421882,-1639972679,-1613508250,1179010732,-203308238,1642341237,11583656,162601845,-741120354,83788614,-1314989454,
                  -741120481,2051892895,-1070391393,313027,207742032,610395660,1499588339,-115353973,-2029586749,-3996672,-1,-1,9318890,508973296,-1912586056,243928,
                  524504808,-1949345698,281248747,-1949069574,-1178497311,-888994784,1236914574,12581888,-1897218557,-1583010061,104530512,57999960,1023606946,175440215,-1207950145,-1934890617,
                  1824500680,-1917470720,-1412920149,-1409330248,-1901344628,113518277,-1868365806,-1845064704,-594609408,50446163,-1274837574,-350106353,-1899416817,1377733593,1977320706,1501161866,
                  779403274,-1274871110,-1205744375,567086081,1962950016,-16398835,108334396,567089588,1596211460,-596491972,604199330,59089423,-919358485,61214345,61345417,-1828272319,
                  855769091,-611442990,567089844,59095583,567093172,-1948545506,-1962929130,520094734,-1169077934,666108805,37495245,-1860537000,-1960916949,-524123693,869961231,-853887790,
                  -2051399903,-853036029,-854543327,4030497,985271412,-855002109,201898017,-980540979,-2135237234,-853888000,52001,1850280461,1953654131,1297040160,542196048,1143821133,
                  1679840079,1701540713,224752756,1953383690,1679848037,1702259058,1701868320,1768319331,606106213,168626701,1852400978,1953654131,1936286752,1953785195,1852383333,1769104416,
                  1092642166,543582496,1701012846,1918989171,1393167737,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,2361869,1230192962,538984771,4544581,-1472046104,
                  -401247231,663355914,-398302488,-1070384696,-335284294,192184488,1317078708,-2013265642,-1023393498,-1472056344,839152897,-396301340,1534394314,-167650840,259264519,-58710134,
                  -2147256937,-327154748,-401478893,-2018229868,141820732,71042996,1639187060,216541064,975169602,1342523018,33900230,-966873624,-402651834,-2007474522,112461126,-335284294,
                  41189544,646480052,1317077057,-1023409898,-1880555725,-167283457,1148551364,-466421621,1006651018,-1274449403,374243585,820707329,578076682,20747188,1957957748,292815420,
                  54269364,-1749808268,28313579,-348031256,-402542587,937967964,-400062463,-947175025,19720387,-2065160310,281343553,31982453,468239104,-2012771839,1996423751,88508928,
                  897001276,1967180264,1087432722,425600,-390069387,1007625220,-400657661,-269993627,-2006862848,1095100455,1187382960,1187382273,-397410048,1951947834,961013872,-1275014680,
                  -400062462,112214311,67192518,16795334,1545398352,-397118376,-1276626647,-2004372480,1091168295,1187382448,1187382273,-397410048,1951947774,957081679,-1275030040,-400062367,
                  112214251,67192518,16795334,1541466192,-2127268776,71246,-1979681304,663224935,-1975465240,-352304858,-400757972,393560098,-2143278616,1962935934,82362371,71044900,
                  129238389,-402396032,-998227864,4253715,-1729615992,38258240,4624128,1996472370,851680534,107383488,1912798336,-2130594807,71246,11803115,167777768,-1273990137,
                  1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,-1017602752,-1342048582,-420942176,1708910643,-2065258320,
                  66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,-969403160,-973076922,-402651322,1187381401,-1830289146,
                  88524288,1553262592,-2065256528,-1341918534,645983756,-2081423297,-1280307772,-907485046,-2030558106,-399265568,-1070373179,-930359157,9444874,-973208972,9518602,-973208972,
                  208989450,-440349186,30244870,1060360,1060497658,963985576,-1975583256,82362592,168813696,-2045807397,9955548,-393017227,494141585,-1280307477,1843978378,-2046555034,
                  1718347972,-1975581976,550273248,1592299184,-3933338,128976246,-1270928664,1062070419,-956371480,1187381255,-269996027,88524379,1541990408,1760036023,108956223,-1187028248,
                  -85415829,-503024330,-399250439,-1460863284,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-348207128,-1332497401,1053943809,-1996580376,1056040999,-1879506453,
                  1019413830,1007318016,-1341885183,-1341985901,-1008715257,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,225603442,1885696522,1701011820,1684955424,
                  1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,1667584544,543453807,1869771333,604638578,
                  -1191181637,-2135884312,1910796518,175505212,1951134946,-35079931,-436212501,-1,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
                  -1511456186,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381785,-1156341569,-611450752,1723867151,4389,101616512,-511613440,15,1723927398,
                  -1070373205,1711282337,1745323,650029926,571648,-492083539,-266268677,554675046,1722509048,379699251,-1096063488,1722613788,1726516395,1725992107,309675,-492083539,
                  6340347,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322778,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,5160619,
                  -1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322772,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,12084907,1711313408,
                  -1070373205,-524162932,-1196726780,-1419313153,47206,-1419378542,-1933560986,81838560,-4674714,-1096063233,862322760,38046656,-1956205722,-14326268,1711341567,-1070373205,
                  1711555723,4374187,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-1096063484,862322748,38046656,-1956205722,-14326268,1711341567,-1070373205,1711555723,
                  3587755,-1950338202,-1419378108,1711573862,-219,1722508800,1150009395,-391420412,862346043,329302015,1528760079,-815966106,-1633050967,-1752459381,-1751345268,192349500,
                  -259267534,-13703471,-1013485404,8857216,1977289455,-2029092859,-1007153152,1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,
                  1525547109,-1500331016,-1396003714,-550666149,-1951422534,-1034056786,-1738237777,-172578852,-826018394,-2088916993,-2088926339,-1753447547,1532582488,526212958,-12537,-1,
                  -1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1962228456,1228832816,175244288,4800128,-352095225,-1628925825,1662421802,
                  113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202334321,-389808926,779416815,4800128,-2146995708,117459262,
                  -477481358,-1960160024,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,652796810,-1012141270,-1976941848,1049232990,
                  -896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
                  41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
                  -2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
                  -1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,263829303,760342528,1085805547,515935744,62445710,
                  -326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
                  486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715689,751691776,-1168046305,-661913472,
                  516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
                  40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,1773883392,1358264,523001576,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
                  1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
                  1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
                  959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
                  -1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,602495108,-148571571,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
                  12189491,-1951665376,55020055,-1703954,-1,-1,-1,-369098753,-65398,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
                  116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427691893,-390004721,140413700,-268377215,-661732597,
                  -1409281863,-131800950,91543612,233567714,-14308208,140935431,1175058432,1725537032,281314048,1532909855,-816314531,-436096944,-434720635,-434065276,181229728,-1202708785,
                  -661782464,-88067496,7341702,7212683,7083659,-1461116933,-1202708895,-661782464,1846446586,1813416192,1879492096,1492844544,1636690207,-1342170904,1542383616,45150346,
                  -1973688344,-402345784,-393585696,-1335790871,-706151926,1954588763,-202638589,-1054525,-427163472,-1336162072,-387872254,78666689,-1159142006,-401887141,34364336,-31130844,
                  41210500,-527826676,-1561850960,1630660955,-1325417240,1536354311,145805450,-1973711896,-402018064,-930456700,2112369328,-370636197,-1696046833,440575,-1336183576,-387806713,
                  145775469,1726539402,-1979076517,1533012193,1441270704,604114011,-1327461637,1531963403,-443927888,-379893528,-1325768489,1530587147,141828264,-1070375941,183033,703072944,
                  1971365979,-1979600649,1529080038,-511048784,-1336206104,-387610107,-1578869995,-1578697180,99093424,-1977611173,-401887008,-1863755007,196147808,609940456,-1327461665,1525671947,
                  -1973387543,-198919709,1976009964,-209000436,-855705886,-2135625867,-1023363901,-20987853,92874255,-101058055,87631609,-101058055,246465529,-1310131556,65539674,-1878856960,
                  1975560399,-1325753326,1520363565,256014,-812645653,868417828,-1901018176,-1981220196,65539674,-1878856960,1975560399,-1325753326,1517742253,256014,-812645653,868417828,
                  519816128,-1912586056,279013080,-14326272,1711276287,-432820144,-1468930960,1951950368,878086,520159232,-7935805,1048602740,1946288201,1228832777,41157376,-13412117,
                  1958725518,4622848,158597180,1182073148,-336534344,-257640445,1946499878,-1409614791,-72628084,-1979685472,-1962908122,-1191156970,-1595408372,32815880,-2094580248,1704985794,
                  263515648,-1260048408,-450172925,635962036,-402541339,-54270688,-464474778,1480632417,-293395084,76113412,1220038686,-455569920,216042081,-1973295608,-973078506,-16777210,
                  1642513542,-872865960,2122381191,393543686,1966210536,-432820201,-1468930960,604533764,204961276,-399250684,779301368,1949438440,-1608204741,-1473092632,-1102023679,266903593,
                  -1975547150,115835103,1946484608,-1607221698,1958798208,-1607549386,616444395,-33246048,-30903092,-2094762808,-202701370,149191,71747328,1187381248,1187446791,-956301300,
                  2630,1966180840,-397808836,-596495931,772558476,-1996270453,-617412010,1966174696,830400522,-1976695438,-1979764196,-1976696226,1854407276,1284124165,72255489,17254086,
                  1966177768,-242685937,1962950528,-386431225,-142085503,-2010022680,-1070397866,-32086399,-1007187969,-81327871,1326383648,151200021,69280335,557600530,-843122809,72780704,
                  1966149096,823846959,20719218,-964486540,1946303494,214336266,208929596,772195971,1946244155,113672981,22297390,904596596,678690876,22297390,333985397,4161777,
                  -142145675,-2014180120,1418342135,-251598845,1317803912,1418407436,173443332,18245249,-339725568,374243604,213123073,451657778,18239105,839693312,-254482240,1962950528,
                  1358399241,1492241640,-142084217,654901699,35715987,141829897,1326383649,52499733,580341513,1325990689,69283735,1008160530,-223,-1,-536870913,151135490,
                  -162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
                  1711217426,1325928438,547588864,950348288,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
                  -336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,1464002571,-1974452212,-401887008,-78096579,196147907,609693672,-527806273,
                  719850416,-1006938025,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
                  -338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
                  -153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
                  1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
                  -109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
                  637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515310,
                  -388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
                  251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
                  1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1212868858,-776988299,1105749222,-1341098680,-396302625,125126712,1692860336,-1018679320,
                  1642332852,393494696,-397390258,41156918,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
                  1763086040,1730579200,2942976,1894121648,-2040461537,-2038373180,-326412860,209052682,-33134975,105808383,183173184,-1090099583,105808383,-815988735,1967633384,-422465509,
                  1202382948,-575663499,-1578606362,-1341557433,-396040449,74729368,-2132409424,-1335926845,1413933105,816898186,-816562200,-396402693,108330798,-889585740,1408958466,641227917,
                  -63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,
                  -419450719,140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,
                  183032,-1207558573,-661782520,-2147479365,1971324799,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717196,-1207702784,
                  -617414404,-1017438457,-1064384372,870774203,-1543453760,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,-1543503872,-2046820320,
                  -1543503872,-2046820320,-1543503872,-2046820320,-1588592640,807731216,1479556096,121378676,512431474,-478150640,82559024,-1976631502,-341294457,-1576554494,1235222601,-1342129408,
                  1006875834,-1157204985,-725960704,-1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1549266297,-472842166,445090606,5022632,-1976636463,-2136462681,
                  1705000932,180364288,6660804,849840686,1713801384,1095936,7989254,174885414,189565478,603998624,1963080958,2088773141,242552073,1206437258,-1964471808,4253889,
                  -1995978614,-1610588146,121372745,71042932,1929380024,119584771,12189491,514585376,5291783,146391091,-156503296,268470022,-189069708,515958785,-2097125984,-1007811390,
                  2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,983534126,1458766760,-374885699,1593570347,-1064380276,119849759,-1744805214,
                  653742672,1319305292,-779003392,-401820439,-782367449,1351388134,84470016,167798432,-2146863617,-534503453,200000266,-472775247,606135168,-1564276001,-1031602074,-1597772283,
                  1183318089,4890624,-1610529144,1183318114,673760007,673730640,134238288,268437504,1073745920,1073758208,673988608,774514989,808462622,808464432,12351,538972176,
                  16986144,466618115,-490529840,466623440,-1784610988,-22733872,466676103,466623440,-279475639,-261809200,-129894323,-415634343,-399574951,-407244846,-26286350,-11272365,
                  -272109404,1251409920,466623519,466623440,466623528,466623440,49808376,58196924,336855672,16847892,1966337,816840766,1085834470,-1950315008,1509954334,-1070338765,
                  857735358,-1178235137,-1410105344,268486017,-277680581,4241490,512344206,-1070399469,-2134916978,5290240,-1765881716,-1415237976,-1070335774,-2134916978,571649,-1426063176,
                  -1325604181,864347697,-1094676800,-1061181306,571649,-1523660660,-1325669717,-1098586574,12560454,2144512,-1523660660,1476125355,855670463,92874432,-432820129,4241540,
                  12245134,1015079954,-1979550412,1914079696,-432754688,-1181698940,-617414626,-997535181,-1974499352,-19266608,-1326193980,1333455023,-1364143990,-1974504472,1960000496,-393301998,
                  1074548584,-1901010806,-1336974104,-1333467595,-1148918218,-661913600,951107726,-1732344602,49064,771752633,1111659181,1962884332,46628871,-1416476086,967896546,-1665235738,
                  573352,771752889,-152268115,-527765808,1975794412,1086816261,-337466478,-2065286480,-1079467330,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,407496836,
                  8851072,-393301996,1084772064,-1380970379,-1471227928,-2146995195,-83851482,-2068114965,1200500410,-202053626,645924212,-956628857,402686982,-1310157648,-1976556466,-1340190496,
                  -393943470,1478488125,-58716300,-402426880,1404043580,1055425766,1085850608,-388461056,158485726,91555132,8857216,-15365,60746239,-2065280848,-1912586056,-430853928,
                  -393301884,-1062711708,-4979340,-1332737301,1314318484,-527814620,1387273808,-488078106,1951932399,102679297,-206641072,-1070396300,1958723726,96937472,645984484,-2133917680,
                  805310478,128975028,645927117,-2133917680,536875022,61866164,-1058533171,520574976,-2065279824,1929471464,-1209156850,-1124065863,48868085,620686109,552095808,477321216,
                  1076154614,-430591920,283662468,-1341295872,-393943466,2028477589,477489180,-1165706557,-1014769013,1975519759,-1328314560,-2146388735,276041980,548733872,1948318848,4581383,
                  548733872,1058432,271452367,777211904,-402241650,1482420934,-1007091084,-430460848,11819140,-1070395187,-58698813,-402426832,243269651,1529872400,105352750,-1326277144,
                  -103189497,937224387,31982453,-1901018368,206395368,-1327461856,1297344654,-430395197,-1155592572,1504754308,1200522470,-227743738,-2098658444,-430264320,-2130595708,1963178047,
                  -1962823678,1538321943,-768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-374603075,
                  -919343112,-1274914934,15591438,-1339525987,1401218653,856184715,206539465,503996299,-1912586056,1220824,454682704,1480013288,312607604,-1336205568,-2088442274,-75427901,
                  57916066,-1325441047,-1014700449,1917526248,1259202579,1692844208,1917523176,1260644359,1625555570,-61,-1,-1,-1,-1,-1909331201,243920896,
                  1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
                  -773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
                  -301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,5814302,-21243762,
                  32553720,855642296,-1387282945,-465926167,-435418015,-420273055,32553569,855642296,-1385710081,1933214697,-396929525,1583302548,1273699186,1084776932,47206,259325952,
                  -108856447,-2101672588,867625977,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,65542517,-2132769062,-164425756,-590347087,-498727565,854995961,1712843712,
                  644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1368195073,-1364808040,-1339183193,-1297895330,-1331907933,-1364807454,-1320570969,
                  -1297895055,-1321487709,-1297894887,-1304120669,-92229008,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1726535822,-2127631612,
                  -124314,1724033,872217346,-992440640,-167705546,74711490,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,273058368,
                  -2143510748,-2126769806,99093879,49211415,95683955,-1023026200,-2013236064,646452294,1720189044,-605502699,-397184507,548406504,138737190,201487552,360611841,202470666,
                  -1977200638,-1073084604,78643829,1476413064,-402634590,-1030879984,2142697611,169180800,-1005975948,-956431755,-2011929078,74711398,74901050,1256917428,-402275352,1114768851,
                  1912856040,-386364867,309528070,1947335808,147322378,317205620,-400037115,770180436,-400592379,2122319109,91556373,1912931816,21954065,1190643061,1962934554,86632456,
                  770180075,707445509,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
                  707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,-402416407,2104624346,-1341921304,1156982320,41205768,2122318092,292883221,
                  642777612,168248458,-1342016064,4622340,4760152,-1241247768,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,80144436,-1962677272,-386888742,
                  -68680628,360611843,-402295541,426902527,1912913640,46721044,-202895502,-32869884,-613088946,-352042264,71755779,72673475,1642604658,641773571,-1073199882,17564276,
                  -402634590,-1998060424,-401640956,175243922,1912913384,68282373,367526891,602456836,-399150588,-1977220304,1134693956,1208403456,1239961600,64415748,1776819826,-1948611837,
                  58517744,1912883944,39118863,2145913458,-402296316,65733587,-1023158296,-1575729527,-1974271884,-478146466,-2114223969,-1995606437,1183388230,-402148336,636158904,1023707942,
                  58065919,1208221624,-1059027384,170264288,1183387204,1686775314,-1597178366,1183383669,-1612135664,-1974439421,-1977216930,-805436804,-157233280,57934275,638635904,638475402,
                  -1056619381,503710440,4374279,-1430025558,-1968569936,-1968526652,96905927,-1645738095,61728771,-1209528462,-401968639,91358178,-352110872,-402148347,-389872840,91358022,
                  -352114968,53143555,54061251,1172840306,1208403458,1709731840,58058755,2145914738,-401968639,91358122,-352125208,50522115,51439811,-58718093,-385649407,857604247,
                  -992440640,520160310,-972944408,17670,4589254,1193705472,1139335168,-1163874303,-387055114,-1461189757,58583295,7683712,-2145947134,268453646,-1342102040,32946864,
                  57010414,-385905944,1719731039,-956301798,-402647738,997331839,-1900006626,70698200,-2135744767,1929315304,3532842,1048585586,1929511029,552335363,-1900006626,406242520,
                  -2118967551,1929307112,1192132618,283643904,-1274711296,39512069,40429763,1978146674,1208403457,-1779953664,44427266,-1343746190,-401968640,91357914,-352178456,36890627,
                  -1022081400,1912749544,21686307,4720326,40560784,1912765160,8710163,350752370,-1981533695,20714566,548668788,-1023278104,7675530,-1014969346,274606720,1183386483,
                  306612500,-351254903,340182809,-1977220352,-165281212,-1960440220,-470332644,-1995422071,-960294314,-1275063226,359041025,7612040,18501249,669565696,-1977519616,19140678,
                  201646272,32946848,1370350,547884658,-860617612,1084753643,-1431042699,-1023306776,-2132258477,1979661312,-339442172,441111,-1460394823,-401705856,1760091808,1274339840,
                  -2135626123,-1017423367,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
                  1344940586,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,520092316,1478426708,33012431,9216748,1051331,1075838980,32619010,9282284,-685498188,
                  -1101655948,-523193491,-347733134,1588342521,-1918836602,-1960393984,-390003388,4366850,-1575729526,1183449155,-1572920302,1183449156,4563475,-1072544118,1720321768,1625587728,
                  168029376,4629188,605046410,81838081,1988796428,266764305,1201849866,1149904384,66501128,280544238,40302336,-2146548221,-1051721518,-390001438,1490029316,-1023406299,
                  -1176793570,-256245504,527430401,-1964166461,-2048393138,-20387619,837292146,504066560,531422094,-301862726,-1178343198,-256245504,-1016204543,1317727538,-580982784,1929290216,
                  714764,-256243854,-492114943,-1185823764,-1947667420,-1173327106,-1460928009,-402098936,-203236040,1509523636,-17176381,1183441970,1720238868,340182549,1948682240,441352448,
                  -1007091711,9307846,1948682240,1965459968,1961101824,273058321,-2143510748,-855765388,-2126773132,-85457292,300677629,-1341917510,-571937280,-33626096,1827144562,1364640512,
                  -1174388034,129565169,1122937856,1582955490,508646339,-661733325,-1879000840,520092316,1931411540,180368138,1962970630,857139995,1358784,183772345,1962970630,-593827829,
                  1967912418,-109005585,9307846,-1017423616,74719400,267111604,91488680,-335653144,1946462214,-116280317,-198919741,855766970,279506112,1642596469,-1258888484,-1161561728,
                  45089782,1085326318,1085834470,-1579643392,-2132410254,41235516,-443816449,-13369421,-373987651,1102107405,1642366182,270848246,-4595574,610395391,1959016976,-1141448176,
                  414824041,-1249133312,-351114007,-431836967,-315398524,1711276218,440,-986487296,-1908408135,-1627442238,1724961126,-2131107157,-92204858,-395173888,-2065284176,202138084,
                  -215719450,1152410086,12551398,29058560,1711276032,-1956192973,-1896576315,-1175047201,-427147264,-741251426,1727302303,-1020041555,1148580065,-2065283664,-1062706716,460652720,
                  268486529,536936321,1298583922,-2064973189,-2065283408,-1912586056,870645720,-1239171585,-2133680407,-164425757,-607124303,-498727565,854995961,-1877873728,721421497,1979689201,
                  -389978617,-169720312,1202768011,-695499546,12574348,-1235501824,-1156558615,297383555,-1234715392,-351169815,842019326,1937330989,544040308,1918988098,1631985764,1920298089,
                  537529701,758198322,1869440333,1159756146,1919906418,858796576,1835355437,544830063,1919181889,544437093,1869771333,808591474,1699556661,2037542765,1920091424,168653423,
                  925905440,1986939181,1684630625,1835355424,544830063,1718513475,1920296809,1869182049,537725550,1702060354,1685015840,6646901,1685015840,543517813,1293942849,1819632751,
                  4333669,1685015840,543517813,168624195,1769103696,1126201716,1801676136,2109728,1769103696,1126201716,1801676136,2109984,1061109567,822099775,1378693424,1159744847,
                  1919906418,874514957,1294807600,1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,544367988,1818845510,
                  224752245,808656906,1699425585,1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,2036681517,1918988130,
                  1917132900,225603442,808656906,1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,858796810,2036681517,1918988130,1866670180,1869771886,
                  1919249516,1920091424,168653423,825243168,1936278573,1953785195,1866670181,1869771886,1919249516,1920091424,168653423,842020640,1886339885,1701015410,1919906675,1952793632,
                  1769235301,1159753327,1919906418,1817190444,1702060389,1701331744,1226861411,1635021678,1952541804,225341289,808525834,793324849,1330782287,1917132877,225603442,909189130,
                  2035494194,1835365491,1953517344,1936617321,1953451552,1952797472,1968318509,1699946606,695235956,538970637,1226842144,1919251310,1229201524,1330530113,1128879187,1936286752,
                  1953785195,1852383333,1769096224,1092642166,537529658,758265393,1953724755,1327525221,1869182064,1159754606,1919906418,824183309,1294808118,1919905125,1767055481,1159751034,
                  1919906418,824183309,1412248374,543518057,1631854630,1310745972,1394635887,168653925,673188365,1431520594,1025525069,826679840,1162551330,168634713,857737741,1395470896,
                  1702130553,1851072621,1394635881,1920295781,544830569,1801678668,544434464,1801678668,168649829,538976288,1428172064,1668246638,2035490923,1835365491,1768838432,1699946612,
                  1769108835,1277196660,225141615,1393167626,1920295781,544830569,1801678668,1952661792,543520361,1310749295,1699422319,1634689657,1092641906,1667331188,224683368,959918346,
                  1766075696,807431027,1920091424,168653423,825833265,1936278573,540090475,1869771333,822742386,758134839,1802725700,1176514592,1970039137,168650098,825767729,1936278573,
                  540090475,1818845510,224752245,943141130,1766075698,1126198131,1920233071,1701604463,1631985778,1920298089,537529701,758460470,1802725700,1702130789,1769096224,1411409270,
                  543518841,1869771333,1378364786,1394634357,1886745701,537529641,538976288,1702063689,1142977650,1313292617,1230263119,1768169539,1952803699,1763730804,1917067374,543520361,
                  168639041,701760472,-1207897932,-1217961984,-1203765218,-735464445,11534576,565659232,-1464004608,-656873030,1894158000,-1070399253,-1280282138,-1070436122,1910898923,-2031730512,
                  -435179270,-436162428,12123269,-1327984912,-433985793,-2049119,133635979,192220928,-1946164549,-2046325985,-1326936380,-1335761396,-1333467632,-1337203182,-1337203134,843835026,
                  -1332746560,-1337727404,-1337858542,-1337727434,-1337924096,-1337924096,66238988,-435048210,-1174294396,-1326578760,64535041,62569198,64666348,62962412,-1141981134,1690286724,
                  -1962823493,2005659159,39291396,-1124068679,-1763067051,96633824,64617089,816841589,-402699538,-2065296720,-373592387,-919347060,-1274914934,-1149518578,-2081317399,-75427901,
                  -1166886238,-2065296464,855703737,-1325604160,-465312256,-455046592,15680,1773866613,1620406,-373577027,-18150323,-2065296208,1894157232,1910767851,-527825116,1894157232,
                  1910949002,1894157488,-2065295952,1894157744,1910767851,-527794140,1894158000,1910767851,-990478300,1977649792,-2134081529,-2065295696,-2065295440,1894158000,1910949002,-2065295184,
                  -373553475,1642395968,1642525476,-1912590152,16825552,-2065294928,-387148824,158481233,1692839344,1933265128,-1209156850,-1124065863,-1024869323,-1174476021,1625554946,327727953,
                  1493825000,27813092,-287177612,-1880564757,-301537049,-2065294672,-1326573080,-393943525,481347297,-387414810,-434262001,269346948,-2065289808,-1339781400,-393943522,531642989,
                  786990310,-434065369,397731972,-401893656,-1732430186,-852497988,-71079960,-2065292880,-1341079576,-393943517,581974384,-1427602202,-2049263,773819182,604063626,1967144128,
                  -423710710,-1127498364,-1328797975,-393943516,-1696056689,-1340116422,-396040496,376584849,1916444904,610329617,-1327461647,1348789969,1480228072,820577139,-423326977,-433737632,
                  -726865788,-2065291600,-1341753880,-1333467609,62831340,-433540882,-593762172,-2065290832,-1329122840,-1266358742,-1273967345,-468660992,216042081,-2040404372,-1335761184,-1333467605,
                  1000794126,208929960,-1155530566,448379142,166848512,-47930908,568631782,568785700,-1912586056,302434008,116785152,1963982998,-1777434588,243302400,-98565994,-1339117592,
                  -77535502,-150995015,536909318,-136181900,9832134,-2121866240,872444478,-1340378094,484986944,1488980533,-2146696587,753436390,-426594251,166127691,1084766187,-2136472459,
                  -639105163,-352276471,1010770961,1007055360,-352159948,164030469,-397410128,-1325779713,1481369234,41156668,113724134,301990002,162195707,-2065290064,-399297048,432874900,
                  2133116042,-1084815602,146390860,1605300736,-385649416,-58719947,-167086806,33592838,636027764,268483329,-469056557,-58688647,-2147126102,175486716,9832182,-385649662,
                  -738787064,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,-2142966974,-50325466,9832182,-348883960,-1644396490,116796789,1962999958,-1777928662,
                  326369792,9840256,-1775861509,116849920,1946222616,-2146374898,-33548250,9832182,553940228,-117434594,956072131,116793205,1946288278,-1777434612,645924864,-335740778,
                  403603461,243270144,-116916201,503087299,116794997,1962999958,-1777928675,208929280,9834112,-1775861756,99351808,1576576,386826241,-1007090688,1515141,503924597,
                  116785175,1963196439,1392279612,116798325,1963458583,386332214,276038400,9832182,-166234878,536876806,367726708,9832182,-166824702,536876806,645924724,-343998440,
                  389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365767590,-2134640315,-83879898,-343604808,8240110,-116891416,-1326402365,
                  -401695741,-239851352,-1578627428,1962884136,8239904,138668112,1946172504,1946237972,1946762256,8239884,-1157198360,719847549,-2134640376,41287676,-58672149,-352160428,
                  -721649517,-1544879499,1967520896,-1873810685,1975057536,9955587,1966603392,11266307,1968372864,13887747,1967586432,14084355,1946307048,354826791,-2139982848,58020860,
                  -2147450647,2020871420,1966341248,-385830907,-58720004,-1341819596,15919361,116835320,1962999958,386332186,-260832256,1509110,-385649656,116785310,1963982998,-2147095585,
                  -33515994,1576576,-1075250680,-2131016406,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,1355020793,109494323,-1065091047,-1796734092,-1662298096,
                  -96973079,-81099288,-165021975,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,1810432885,1474886399,97338666,-154928645,-2147477498,
                  -1007091084,116835320,1946419223,386332407,-260831232,-1763052880,386332160,-462158848,1509110,-153258744,268473862,116788340,1946288278,-1775861553,243334400,-394264463,
                  -386268857,-79353338,-1070392371,-1078696469,-315420467,65651705,2028210943,1006403635,-58708356,-2144633276,91510780,1968766080,-164319201,134223622,850408821,1509110,
                  -1339263740,386332208,594871040,535506608,766559224,1509110,-1340836600,386332195,192218112,116791728,1963130903,46150146,-390057248,-1007087717,259580938,1195164810,
                  1396442236,113641342,-134217703,751078083,-1685996729,116840238,1963458583,-1685143979,1509110,-163416828,50337542,116798069,1965031447,-1777928682,225772032,192687676,
                  1967979648,-336547836,-155176446,33592838,645924724,-1325596522,255191264,1139523634,1509110,-338332384,-652416798,-646782838,116798699,1963065494,1949187119,1965767817,
                  3729418,-256321931,1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-1682391299,915126251,909836314,-1012072420,1509110,
                  -167414776,67114758,-1577411389,446890112,1876736,256014,-812645653,-884873021,646589300,-58720183,-2147126780,896927468,-1962891032,-2097126634,-1460926782,-84183807,
                  1946265836,93005563,-83868023,1227262659,83656704,-327154318,-401967610,-1960443779,4622597,9824451,-644955764,-779290741,-326909554,-1208186104,-1979534588,2046611460,
                  -1963947501,146342228,2044907776,-791611135,-169680175,16155050,1976303136,1355187166,-713699330,-661731188,-1946521922,6940924,-1070390669,918935694,1397751932,-611530612,
                  1482408763,-24967819,-1962314752,4843772,-2147220878,-1995914109,-1950154682,853510904,5022207,-796138505,-1618222127,1251999824,854062592,-775748609,-1748892704,1344179139,
                  -2033044736,-772043814,66048495,1225193211,41222656,-100408623,-1949922365,-1158860065,-1957298048,-1308914704,1957163780,525579,1592816970,-1007042509,-1312412834,-1008151805,
                  -1912586056,-424628008,-1564462460,-1901985675,32684544,854480304,1430056128,-1313864076,233538790,9113216,15001601,99091314,-424103936,-402209916,359858587,-2065255760,
                  -1178989125,12189726,58320896,-352210200,-424431573,-1900006524,1053042368,-2135817980,-2147476504,33584446,-1263529358,-1070365466,-1004093298,-1308551106,190593,95929095,
                  314114739,-854543238,1376875283,-335415366,1971365978,-2130935784,82513780,309661864,-489850904,1976303328,1976565465,17426643,162815211,-177073203,332206516,642927986,
                  36504971,-1964471808,115458252,-2147366528,-457175836,1490323971,-1977167862,-822214027,-855375432,-2145684717,376703740,1947335808,284983313,-1047917452,289149220,-1040315020,
                  28958443,-854805504,-402361581,-1007091566,1441304240,1950394420,-424169462,-117395068,-1332708885,876800146,-311115766,857659530,-1899459648,-1060926760,225707240,91557692,
                  636000688,-20840908,-166677048,-469695003,17081338,17174156,-1014317005,225709860,91557692,32021168,-20382156,98956993,413393921,437160961,5021953,-1593769821,
                  44236878,1275512577,-1943137792,-956281330,1124194310,-636580813,-2011170047,-1023380210,-2065254992,-155599429,57934274,-1179004741,12189715,34465792,-424234813,-1174881404,
                  1963049718,3794950,-1178999877,12189717,32630784,3860675,-1174387480,1018888695,-198919936,1954588908,-869341172,1967912674,-343886608,32619018,1946238188,-115297277,
                  -1901004093,204694504,-1327461880,861923470,568640507,568785700,-1088118300,-1195138586,-155582464,78704131,-873535250,-1007812432,1381061627,1428051798,1086254219,-2116121088,
                  -1962933278,83656946,-1668676493,-422510468,38027,880071179,91612292,-351984920,1976368683,88795141,-855760149,1843922293,-31855867,-402295348,283837743,91606270,
                  -351942424,1976368647,100984835,1583292253,-816096934,-1,-1,-1,-1,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
                  -880032931,11598492,1088701414,1088741514,256014,-812645653,-661928826,11598492,1088701414,1088741514,256014,-812645653,726910086,1358660056,-529376503,-1950103838,
                  -436162357,-1975458749,-2042567456,-1327985724,-465312256,-455046592,734299712,1358660056,-503025143,65404892,-2015040552,-1947629838,-1176073255,-355270652,-1107295559,652986049,
                  -2116777072,-1191181342,-792854524,-1877480506,-2010767184,-1434451835,-1177318585,-457310206,-1878791226,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,
                  -419435806,1381099910,-490613109,178440,1509955816,254593,-402651975,548405261,1509994728,-402652487,-54329343,653733522,76727853,1075062672,1347506727,1476433128,
                  -387818919,1085808323,-958886400,-16772602,-162442465,141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,
                  -498902272,229688310,-1342158616,4450314,16432067,-1157610264,-1679294208,2109457406,3663872,-402620997,-1144783218,719848224,16825088,-1006730776,78768266,115927250,
                  -389707264,616759297,663749647,-400080876,-1144848383,246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-28776351,-64724508,868442598,12123391,784371376,
                  641927050,-2147449464,-203274326,856090111,12123391,-1967092048,-2010758393,-1434451835,133489223,102654147,-2065248080,-1912586056,1730578904,1763085312,-422465536,-1191319420,
                  -1427569804,-422400000,-391008124,-527814500,-1779912528,-1143852240,-201916352,280230026,-402613784,-1918780129,8389888,1086050867,-1963723008,-1944155400,8448000,-1329750552,
                  -1199249709,-661782488,-795950962,1723867151,-475,-1071509633,13147626,17772272,-1331605218,-1199249708,-661782464,6887054,6760075,-1579433496,-768409581,-150978373,
                  15859,602604405,77200,12253322,16744464,-1030875788,-1178586266,-13418496,-1410111748,-964636674,132573968,-1161600737,1773862912,1751478,-184661272,1464947536,
                  414713374,-942109184,18950,16744448,512236404,1220018252,1723895296,12173363,-50384064,-22285466,-339476785,1595869152,-1017619623,-2013213464,167788838,-2130348828,
                  71246,4623043,4269706,91546634,18239105,-956644608,-16760826,1317671088,216060422,105253388,4138634,168092864,66239172,-1595897106,-390070133,66566662,
                  82624750,603996064,1959016975,1059457072,-1191642368,365793533,2108695410,-1977218895,2122320476,141820673,83984000,95486581,41146682,-470361722,2078857355,1371798524,
                  -1190923078,-773324612,-2136412985,-152959371,82542768,-322452504,1497409602,-1594062141,1177157701,652267525,-1979423498,4628696,638010922,33842422,1191576259,71707136,
                  -1161566326,1067451378,1947149312,-1461137390,-1342016508,1059490307,-771444480,214174436,1978199560,1042710727,67895296,-198919698,4065014,-401967744,-186464416,-335970124,
                  1042710541,652771072,630188069,-1195121614,1727463440,38142732,-100609408,82185446,82232454,-661928826,-2115583350,99008907,99009670,-1006910330,-1073250678,2114585319,
                  127789062,-402293110,-3995753,-1,-1,1358954495,-1595531088,196092134,-1976678424,-401821472,-1004392896,57950376,-1476391192,-402426848,-816316414,1481297232,
                  508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645934597,-1577189216,-1064435558,9969291,-2146467802,123412312,
                  -534425405,-1031563776,-293556221,-1325143421,787403524,-869366645,1120176878,1480737518,1257119524,-289394102,96633674,1122011884,1381024748,-2098723920,-1223855104,-758913008,
                  -1219885452,-759437280,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946179816,7454277,1249846400,1522074039,1350611968,1139146928,-997834524,-997834524,
                  -329713525,695584644,510993540,-436162480,-2042567613,-2042567484,-131377212,1562443649,-546154401,-872493598,-863976331,-339725696,-2082436599,-2132015638,-2084364572,1122895042,
                  -383731902,134271549,1010313240,-590285567,-452272944,-472849456,-617422070,-960562298,787678155,-58055670,-1341930877,-360452480,-1947389437,786878961,-869366645,1122010862,
                  -1975368978,1246424775,1257160754,-1006691608,426967612,168084099,-335120960,-351517048,535003142,-2081504374,-51903254,68666366,25166592,6291648,1572912,393228,
                  131075,22391296,268960770,-8372192,-426725376,964996,-489929538,773450498,-1327461716,747104399,2112393136,1960852012,-426594070,11135364,-2065264208,-426528573,
                  -435900284,-422517240,-1176836595,1153302542,-385621300,-1406271335,12245387,571648,-498929938,12630779,-301987655,-498973970,-427301126,-427694461,-427039102,-1970608503,
                  981984480,-346393148,981722112,-346917436,981591040,-347441724,981656576,-347966012,982246400,-348490300,982115328,-349014588,982180864,-349538876,-426463232,47748,
                  -335542087,-1002814740,-136177803,-1191132998,-320077816,-1002814910,-152959115,1894370187,47871,-1179227717,417857562,-1325470726,-427497835,-1327831539,-435624448,-431968048,
                  -431902709,-431837173,-431771637,-423579637,-431902506,-431836970,-431771434,-426331946,-90389628,-2115466576,1954588715,-1326060798,729213056,-2102333302,-1976864792,-393957176,
                  -393598104,-389641571,993788103,-997825161,-1047859061,1006680808,-1973913797,-389707048,389808303,-125153929,-919354485,-1185821562,-503897565,-1185785709,-503906244,-148757575,
                  1507328993,-963915501,-997537654,-453602636,-939269679,-888946637,-779628525,319275651,-773205560,-773205542,-773205542,-855526182,-1341199590,720562318,-527825908,-286749008,
                  1085802026,869830144,650153664,2109067,537315110,-2133967360,-33527002,-31186460,1018896870,-133109760,7014134,-385649407,-1993933073,-2147475410,-33527002,1344193287,
                  -1912586056,1796112600,548405504,525869286,-1059026225,254018796,-1195177259,-661782464,1056395,-576986149,-1610608578,-1073086448,-880799371,-390877182,269232752,-1280253814,
                  -399872792,-1008201399,1963239645,46396935,199958645,1963115510,-35422202,-2138038037,-1168900637,750452736,4045240,1543018216,-1578890005,-1578705116,-81518108,512303590,
                  -1966931952,1006658110,1012954119,1011250184,1012888586,-1186237427,179568641,-1263183896,-1252857853,372949758,477429834,-956378574,1964637824,-1261502957,-1254430718,904399028,
                  -58043467,1526743272,703070900,1227262645,23496704,-402410301,-771050212,-889262220,62187243,850726888,-1143084078,-1427635724,62178296,-2135621656,74717438,-924072194,
                  -236451660,1375505076,1228832850,158598912,4800128,-1224575485,100775936,414632243,4855434,-1261508534,482564442,926231069,-469088712,91816820,367641593,972849153,
                  -594872449,-1976631502,-157606009,134223622,116844661,1963196439,-159439850,50337542,-1343683724,386332160,1668562944,-2147444247,91557884,-342622024,905740406,116789621,
                  1946288278,-1775861750,12123392,174123925,-2141226816,1584661500,1947139200,486309981,-58696588,-166038217,268473862,116803188,1963065494,-1778337787,645936619,-335740778,
                  2116041779,2086747146,2105228341,-165731279,33592838,-1940907660,-1077834039,129617771,-222000640,125130926,9840256,-387926787,-1007091489,-1070435660,2142295531,-1430334997,
                  -893065061,-353646222,-1015258820,-1082164676,-1142218708,1949826176,905740502,116788853,1946288278,-1775861753,-1007944448,1947204736,772505353,-1688631414,-1070426645,1774096875,
                  -897259365,116820338,1967128599,-383767422,2133131133,1966472320,-1777928687,175374848,9840256,-341527299,-58683317,-166628068,33592838,645925492,-1258487658,-1875514458,
                  1963981952,-341462011,-1974431701,-1899393852,899521,79690896,1487860433,540811892,-58715020,-2146272254,259788540,159146300,92240444,417906738,-2134640384,-185895228,
                  -219418448,454692353,690497308,892613419,915143223,76087324,909854278,74776706,8402571,1717819,914952564,-386203620,1346705882,-846134600,-71084011,8239952,
                  1492556008,-1979599677,1317077062,-1023409898,3795026,-1017495384,48992432,-1981280080,-397229273,1451950070,1976699398,82362371,-1073082588,71042932,-336067721,-1017448191,
                  -1967125016,281343527,-342970173,-401690622,-1950144680,-167768042,309592514,1958797952,1090158601,45222005,28444651,11666411,-58014727,168191626,-1073515292,101188832,
                  -410386289,-1963160893,-469105050,-524287116,550565380,-1979674874,-1070349337,-1979674720,-469105050,-390069388,992516,1381191875,-390019958,66566662,9150702,-1071327094,
                  -167450432,41157059,-461373172,-1998583104,1509985062,-389851045,-76220507,-322995224,-140777277,1911094133,-288912705,478881475,-320275578,-386169089,1355022311,-1222877720,
                  -2234294,-1073250678,2114585319,-3020794,1964847848,506129,-402636097,92864441,-386342329,646447110,-1017642943,-1476377952,-1473809216,-1274776568,-1977488512,-167754970,
                  74723524,351005904,1946404086,-339411452,-2134575605,78905972,11797227,4242371,-1866736754,-2144367872,58037055,-1979660311,-1061149689,-1073084696,-922857100,95626357,
                  11806645,1957958605,-1207901208,28378121,332255795,-2065104014,83656704,-1073085323,11828085,-1749806131,-2147433496,163064005,855748868,1930677714,83656774,-1073085323,
                  -872530571,-310346892,-1279792343,-1259523579,-1273770752,9889815,-1325137480,-841862384,-1273203949,-1273770752,8579093,-1325137480,-841862385,-31034605,-28937013,-1143936059,
                  1065353360,-1274317673,7792644,-341754694,884248665,-1174377496,1324065071,-402475888,-1866792864,1950318592,364512884,-1875121247,-341768006,28610613,-1174386712,720085243,
                  -1875998320,-37165056,-806870155,-1058003715,-922876696,1956707258,-1161232879,175415560,582666494,-1174178655,-2081906372,-1152138496,657981584,663226996,-2130824472,100699918,
                  -1947679909,-395807235,-390005358,1960851972,888963152,54265973,71059316,867189620,203753448,184296452,-1327461692,620750899,-1459774744,-1976011488,550273248,-286781776,
                  536918564,-1178981445,954728537,114163,-1263466264,-1273967345,-1341076224,-343611715,-1976324082,616753376,-997786844,-1021001496,868387664,-1077768494,-1934950280,-1017599032,
                  252059232,-1331163232,-1199249824,-661775360,-1912586053,378283715,-1993998231,-956274906,25606,-429805568,-1395529596,243337588,1048676,-402431511,1655747207,113738982,
                  8388742,8914631,-152567808,1048651435,305397874,2090930037,8823552,-1560248671,-18284408,1465318401,-611580386,817611662,-1092907520,-1816165529,768256,520594931,
                  1672502879,2028504294,-1341688915,-343611804,1048678415,8388726,243340915,8388708,8134283,7741065,8265355,7872137,-391081240,-1072975629,-286719116,1981713153,
                  -2132049664,2048821504,2082376448,-2132049664,-2145482496,9478144,-1275031646,-1845049854,-102235904,-1977709822,-2134671104,-2044819200,1958742784,1678672146,-2013265664,-1996462546,
                  -2013239530,-1342150386,-1954224539,-1996457954,-1962903010,-1996456418,-1962901474,-2130672082,-1610579771,-1885208431,-971983872,16814598,-1962759192,-1996453346,184584222,-2129496896,
                  33580046,1848543232,1863747840,1896777728,8954112,-1157365755,506150784,-1019543411,780876147,771948680,-981401466,-1918828416,8561408,9373382,-1943631105,-1845049856,
                  -773324544,1958742786,1678672146,-2013265408,-1996460498,-2013237482,100692238,-1912586056,8437184,401130891,-2135095381,-1845049856,-22019840,1709703348,174339,243339892,
                  4456548,6958728,7018121,7147144,-1157593439,-470350848,-1036385616,-494263948,9569990,53929985,1946157737,1678672146,-2013264896,-1996461522,-2013238506,-1593807602,
                  -1073020792,338036,-1327237372,-958232048,16814598,-1459419160,309592066,6557313,780664840,378077298,243794035,-2002714507,67110144,725582011,989891870,-1608223805,
                  -21757812,9569990,47376385,1946157737,1678672146,-2013263872,-1996459474,-2013236458,-1342147314,-1954224538,637568542,1253001,8920715,-477450064,-1339935512,-387478863,
                  11608621,6555383,41156736,-1628962383,-429412181,-2042723964,1912766464,-390877170,-2146688504,-1280253814,-1272838936,1678178050,1962934016,-1341934590,569632911,-2065274704,
                  548430052,635987174,-1469783019,-453348351,-2132768160,1622148300,-397384474,-1973938928,-396302652,-22014712,-336304922,-429281027,48004,-1332737813,-1148918166,1085800449,
                  -1898410496,-1962907370,1392535334,1542469608,58055435,-1342138135,-1199249813,-661775360,6555383,376700929,854596584,1712229101,-1963881728,-1962907378,-402626794,116894474,
                  262244,-35121548,-1964166417,-1962907122,1829669617,1796639488,-1425938432,6555383,376700930,854581224,1846446829,-1963881728,-1962905330,-402624746,116894414,524388,
                  -1041754508,-1964166417,-1962905074,1963887345,1930857216,-1429870592,6555383,259260432,-1158700056,1773862912,1751478,-135309592,-16751610,-401050369,116912012,4194404,
                  636027764,-1469979393,-1341885248,-393943436,1823475408,-1458600730,520593679,-1974221983,-429018920,-1966896508,-428953384,-1950119292,956334110,1979742750,1678672166,-1962901504,
                  -1996457442,-402619874,512426060,507052164,74645632,8396427,9051785,1955606763,1678672152,-1996455936,-402619874,512426024,512295044,384499850,1873825936,-1990687514,
                  -402619874,512426000,512295044,200802442,-117345088,1465107291,-428822522,1277593732,851741184,-1141339164,1048576000,1962999954,4241418,-980696946,-2086124056,33342,
                  12061813,-2079930624,-385875968,1907359878,1220052198,1405128192,-1605019818,104333455,91684940,-338406936,-1271339005,1532911453,780798579,28835916,-1873417472,-62864509,
                  -1974251177,-1191162850,-13434872,-607010765,-1426063331,512423650,12058700,46396928,28836724,1499179777,-1841397665,208994560,-1912586056,63278016,-1480267581,8527417,
                  12060279,-1878398208,4982400,-8460031,8658569,-428625840,1594316932,1460061019,1924157523,-1571257114,-1152384948,-1014103992,-1979709255,872362968,500945344,1974403072,
                  653582907,1642333578,108314792,-13385678,642201579,1642333579,125092008,29343794,-2144933120,16814654,1085804405,-1950315008,4195781,1206446219,686512295,841371471,
                  1191605509,-1977273818,96872132,-1966568960,-1342157778,1485104764,-2069641845,-1193833728,300613634,-533020418,2062091126,16727551,12122228,123689728,296347843,-399316742,
                  -1207011845,-839348222,636025365,1955658728,-2110374920,-1962642176,-1996455882,-83879370,293726403,-401938182,396411899,-58670336,1025733632,91611149,-350483016,-533775079,
                  800589173,-2146440395,259491068,192213052,41279548,-4325200,855829503,-1007254026,1946221696,1978678278,-1023365118,404654675,616794624,82018419,168158144,-1775859005,
                  216301568,396419082,1019435776,-2141489915,1450640383,1998584704,-2115481263,-2131004143,-285173978,-1341028376,-1184831757,116850687,1963982999,-386407925,-189787788,619405542,
                  9905792,291956975,-524236918,-423425531,-18080,9897718,-502696688,290384119,1625748656,9905792,-87860801,1848971,1178995849,8533563,915080309,909836416,
                  158597146,1848969,-336019406,-117329917,1011926011,1012888584,-2073594871,-468290112,213853318,784344192,67082,-1976662298,-352321242,1976106606,612819990,612371647,
                  101330624,-2031747072,2525742,-27989248,-468945464,209659014,-1266227648,-29037824,-464554552,-1476348794,-1979354048,1071939808,-2031730636,-2031866389,-1072922844,11831014,
                  -108846613,-2094304767,645346041,721433272,-1975500607,612820192,612371647,-423359808,-1342116986,1273428626,1946221696,-423327228,-1017578678,1084786404,-2136471435,146015349,
                  1084763627,11805045,976109348,1946157318,771863582,1594,-466479756,721433273,-1270791736,-1274483959,1971365896,-1979534334,-1008454972,-1273564440,-1274514177,1948297216,
                  -1979599870,-1008454972,1612580603,58065468,-2097083671,-326420244,-1064382324,-41166706,951697459,-1951730944,276598261,-16398554,1170614015,-970555385,637535813,-1845148218,
                  38127398,-970588160,-1916795835,-953804676,654311173,476614,105236006,1170613760,-796093947,-150990661,-2134572061,805634258,13795328,38111526,72714278,-722937037,
                  -385649920,2089615508,92939824,1077723172,1187383156,-2115436474,178944,1912649448,1179028089,1567932426,-1961853811,410291678,-1962905368,-2048013,775785262,251659767,
                  640711821,108279295,-16398810,-970586901,-617350139,-1929351192,-1893322628,1959329285,629155346,179135,1912626152,1179043373,640150274,-1153430144,1239941122,-971279872,
                  -352238010,813468949,-2145547738,108282083,21382854,1187382507,-998047162,119497016,-54271308,1979659775,74841858,-1190758913,-1510801404,-2096566653,1150224623,71601926,
                  -1895676785,2089665284,1569269272,112898,365791156,276598211,15855595,136384800,18940961,295763745,44134561,-6225503,-1163740510,-684206291,-558571842,-474684492,
                  58292,253607,253952,11585536,11568358,45385190,-256312674,-268365825,1894167472,1910767851,141889704,616570895,-1071509521,-1912586056,-1469782824,-1906150140,
                  -436096790,-425021308,-18076,27813092,-119405195,-1332724245,-461052414,-435965856,-435900284,-536823676,-617359218,1437220737,331155573,788475614,95477126,12092646,
                  869830344,-1438678565,-1123519147,-13705709,-1327658450,-1199249914,-661782464,-352321352,-435703794,-426790780,-352261264,-1955470336,-426790696,-352261264,-436162560,167477361,
                  -135724171,-435638075,184254596,1475019637,-423611760,-268388111,-768354162,-1176675650,-1968439285,-487674672,10533625,-1342175047,183299595,-1341819712,-203231712,1948318339,
                  2144773,11593451,-1595531034,-2065299024,1980496768,838906626,786682111,-579815541,-1912586056,-1327038504,-1199249910,-661782464,6762239,-2065298512,551952560,212920811,
                  1642366182,1642525476,1894125232,-84076083,-352979207,-690297367,-1515607339,1452709274,-1084883371,-323158016,-1445598754,-2134842496,930431227,-1124073025,-991305987,-930347351,
                  -826294130,1358302,-1359821942,451609205,-1157627718,599373504,-399906816,-907538768,-1272968167,-387938802,1560746437,21415619,113410816,116032492,1853162664,1853096616,
                  16860870,1122898096,1256229612,1122898352,103500524,87883854,855800848,-1962986816,771770654,-540571862,2030099584,-1967115518,-2147464690,930219259,1946680192,-165105358,
                  -792163599,-1997942551,1720189774,-1998532606,61932870,-466427770,1183441107,1228832774,108332544,-788371760,-1031600538,-154931705,54954225,-1325242744,-740521469,106858979,
                  1183375570,65268485,50660611,1610875651,113769116,-537657241,6885004,9971337,10098316,-1206417176,48761487,-419516391,-34868124,10098318,9971339,-3972707,
                  1430346987,1380927572,1094918227,1194539330,859390540,961763154,1128940595,1347302201,692267074,2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,
                  1919905906,1869182049,959520878,942420536,876096563,741685292,-382978504,837474914,686817422,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
                  1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
                  741552952,876099628,942418996,741684536,909654060,942418998,758593336,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,
                  778331237,-435310546,-434982780,-1172131765,-1276247992,1894400,1273369264,-2065297744,1273402032,1253712560,-2135691776,-1342175768,-1018435950,-1979645767,-330570045,1038934154,
                  410320930,-1833897502,313543654,1773882342,1620406,-371107139,-18094435,-61,-1,-1,1358954495,1084776932,-816315787,-2048523856,-2065296976,-427773700,
                  -419450768,-392042975,1642332420,-527702990,-337537347,-24407983,41077899,-930298370,-1064380274,-1912590152,16825552,-390651714,-310116144,817760372,13035703,-91805717,
                  -754973511,178666,-1962892568,65176023,309504,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292837759,-661733325,126606131,1642334089,
                  1642465292,-4983413,280887091,-1503401502,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
                  -549777408,-1070339466,-208935425,-13380213,-371042627,-359946645,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
                  179094508,-1274645312,-351220466,-504839179,237466895,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
                  -356314931,-268377749,1381061627,1086004822,-2116317696,-1962933278,2023525106,-1947807488,184551572,1350005970,192210052,1232391422,1534381310,-295179432,-352261310,-131798016,
                  -1202706312,-839347970,292706325,-386652999,619490952,-502040328,1976303350,-352261137,-131798016,17564792,-331207189,17570852,15401195,-350477074,-1337834993,-301929720,
                  -402651717,67953394,15401195,1112165102,15401195,888677612,1492683336,1579149194,-816096934,-1902920877,-1152187157,-947253741,-1474988056,839152704,-1979192384,359327939,
                  -1017445720,254797824,-2079930834,216563811,-2144419057,-2140961730,12195957,-1181893888,-402640711,-1205935201,-661782464,1181382,-1010622720,-822083400,3204020,34304,
                  16416864,2139166837,1966092551,-1670649839,175462460,-1175451208,382533672,-2031874325,141918376,74793128,1273402032,-15519,-1,-1,-1,-1,
                  67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
                  100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,0,285343488,84122880,8388608,0,285449216,
                  251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
                  134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
                  84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
                  117628160,16777216,0,285400064,67243008,-65536,0,671222784,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
                  268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,100876288,-65536,7,553861120,251971072,-65536,2055,570738176,
                  117757952,-65536,7,570742784,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
                  134430720,-65536,7,553861120,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
                  84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
                  252075520,-65536,2055,872832512,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
                  134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
                  -50657596,-2065297488,-2048524112,-386938950,-628167394,-2078897618,-424038301,244100,-855591855,2080422675,-1207959111,332202497,1916629849,-249,-562763265,-1146035486,
                  -92240666,-1339591552,295626766,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416132075,1971372790,102653986,132850408,-2065407713,
                  -1787511492,163121035,-201618688,-1105300049,887657309,-1325470976,-387937741,-81522356,1256768646,-21004015,1974097153,-66000703,-2065253200,8126698,113541888,-1827356933,
                  -1275066648,-854143744,-1406206951,91497532,-337641240,-208944139,1711284665,1967826419,-1946973195,-1510775096,-208935425,1711284665,209037299,-1946978998,1724419059,125085683,
                  -2096828541,-457490,-27,-1,-1,-1,-1,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,-1192752267,
                  -236263183,-1276512140,1976368640,172917033,1719730752,-385876470,58061255,-402612759,91615692,-336489752,174490094,1317142463,-385875702,-855768954,-1377303179,-25302031,
                  -402295348,1961619973,41274622,-855740693,1458046325,-2140804110,141888508,-386835736,1491857854,1963785344,172917022,1719730752,-385876470,1148514667,-2114869784,-4257178,
                  17452673,-2143950080,91557372,-336486936,-335773653,971507061,-2145260558,91614460,-336408088,-302219241,132646261,-2146571277,91615228,-336391704,233603075,-820027811,
                  1085820958,-1193767424,-1595474165,-1065049884,-527823756,-1005936156,-1595498010,196089579,551821542,208978052,78176394,568591989,568771594,1962933376,-434065404,1797687328,
                  -820029440,7911761,-402393926,-1460885428,-502893184,149682678,-1472272240,1084769004,-15527,1926647016,-728438766,-1461187214,-402099497,57858050,-1008338968,-1342001176,
                  -396040531,-54328664,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
                  -1090480602,9834112,386826256,-1336926208,253159438,242565288,233319600,1967171599,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
                  1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1943450344,548469257,-369418010,548405410,-2131025690,125165820,9834112,
                  -2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657399,-346550272,-1310158722,403109376,1702103040,-58133,-1,-1,-1,-1,
                  1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1926451688,1392279587,-461103500,250288760,1509110,
                  -166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
                  1948122240,-1775861755,-1017577984,18802768,1692839600,379634520,-685709312,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
                  1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
                  1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
                  48758935,1354979328,5433425,645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,
                  -134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1709704418,-1469782875,1509416962,889192387,
                  -1060551223,-1058225940,-1494359572,1223468780,2089903007,948965519,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
                  -58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,-1662455946,1552557796,1075742722,374243584,1532690944,1600019033,-815980793,
                  1973608936,-1550194673,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1008931096,33652352,1183524981,1096460,1174660087,
                  13796098,1930427008,8292881,-617414910,-763116797,268075008,1187382386,1048577025,1946157121,1094615054,125044992,182244584,858289636,4623040,55347750,-754941766,
                  1222834146,115918987,1942160349,21400081,175441064,1317079476,-352321258,1005097082,846492929,22973183,-1959861295,-420490873,-352145397,-1978997248,-458888964,-1965229592,
                  -1662515330,75401956,-2082171160,-1662516282,-2142877980,1963262334,-460199931,-1952441621,605796096,-1224182592,1967171619,-399853822,2089477231,-462821375,-402264445,393544135,
                  -1090517063,-152567742,-386173733,-1997757492,-220051707,-1998285336,-402636506,-469041417,1448156867,1096188,-661733325,1449045235,-1207955271,-661778432,1499376883,-1583028193,
                  -1947703691,-165180765,225775812,1971846272,65830915,-2011970432,-472782809,199641776,-385876039,78699561,1727456306,1942160128,-351685628,6613038,45100661,1303841510,
                  -1964777752,-406845570,108923394,-2082221336,-655883322,80118755,-2082221336,1525155822,-2129758977,71246,4269704,184444648,-504839196,6601178,1960527080,-1258692090,
                  -401020032,129016596,108956398,-387738904,125108467,-1476339480,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1562318848,280518,1962916840,1013982219,-394300048,
                  2054553520,-388329496,663397062,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,1340604420,-1208329257,-483268593,-1073250678,2114585319,-484055034,-1969057304,
                  484967551,2095643619,859010304,1552557787,21400073,74711868,343213372,-1572607917,-2146127781,41222908,-667283536,-1014627725,57989899,-388562456,-1062731723,717439156,
                  707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-491919352,-352320839,4366851,-488466200,
                  4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474000,-387156661,-2135631279,4073088,-1008465281,707406378,
                  707406378,-550884822,251798786,-162201829,-202831857,1256605426,-1209646395,-498997245,-1008579864,-1912600392,48856,-956431162,80150020,-33241346,-1912588104,536918488,
                  -211356109,4765869,862371982,-1174457408,-211410944,-1704021,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
                  -2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-1947625530,503774119,1398167381,-347057583,-812953676,6601041,1962461672,1509548550,
                  -402002951,-290676460,-118889895,-61,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,12319876,
                  -536823808,1438177422,408490,856651008,-386518071,108331276,-338064567,-491745202,12092646,-1193767232,104573525,997523456,1962999784,-1964166602,-1056964082,-4716063,
                  1960328191,1002646310,-2095025471,-478081085,-4653072,1002646527,-1106218303,-1041760256,-787974912,10676457,-402648088,1961361673,15329280,1499094623,520575067,-400637091,
                  12058869,-1933537792,-1076326712,-1960443840,1898226437,637716355,648217995,82559345,-536820863,-1088583386,-1960443780,1898488581,637716355,715326859,495527537,637603007,
                  748881291,46629745,-1559917786,-1993969362,-421285859,-315482236,134794,-1056316991,-654113565,16483267,-2125783180,-2129657917,-1041235741,280497387,-1178391808,-1047597056,
                  654303423,-2010759797,1793639173,-1191824640,-1064378368,-315425909,134794,-217521727,1364247461,-1395510446,-69021694,1499124356,102679384,-1185851562,-1047609344,-1977160398,
                  -1056964082,-377288223,-1929802986,-1093038391,62513198,1504178944,520576607,-55356477,106254438,-13370724,-369971523,127768005,1532520029,1405346866,-454295885,-335563949,
                  2484447,276103092,28576804,141823036,78119604,11797109,-466434934,-386248509,-1548682932,1492870374,1105787587,-424824583,-1469782940,-469470207,-386471072,-1515128528,
                  703096038,280580601,-1469783001,1509613825,1625555572,367565904,-424759047,65539684,-1878856960,-1006937905,-2065269328,788521150,-1976683381,-1071382204,57950268,-402540567,
                  11579550,778469606,1461059855,-1071640824,251658509,1542111266,-1207949069,-661782520,1734,-2138773762,1073742350,-1431651482,2025695914,110029299,-1150912910,-613585482,
                  -369916227,1752303232,1431681894,-1799531179,108194291,-21276046,3193080,1220073614,-1195340288,2092564484,-1107348736,636089265,8174324,-369902915,-1061293028,-64689677,
                  -1912590152,3717336,79216782,8174080,-658637005,-200087053,2092570226,-203178752,1928595433,-2097446645,-1156811527,-1444152958,-2132409936,-1207914775,-661782480,-1912584008,
                  309440,-1158086981,12517500,-200032896,-1158429719,482148476,-205854220,-1912588104,309440,-1090487110,817725440,-205854220,2092613234,-197411584,1928572905,-1193571149,
                  -661782464,-164380530,1713373369,-611406349,-1157626696,2092628354,48896,-369859907,2092626804,-194265856,-1192006679,-645136376,12507278,40140800,-33241409,-956431162,
                  80150020,-1193701634,2092564484,-1107348736,1441395861,-1173654797,-1598226308,-213194252,1273561971,571647,12507278,40140800,-66795841,-956562234,80149508,1015080188,
                  -2147191552,-1203764660,-1064435696,537909390,-31103296,260046847,-538263518,787480820,1562247439,1015079944,856388608,1292754,-390681157,2145964623,-427904849,-423611772,
                  1713292160,-1201214157,1,-1178258586,-13418496,-791583074,-102585498,202138084,-215719450,-1150918170,1,1725772646,520537483,-192219597,-1975516999,-781803802,
                  -192241709,862367078,1978720707,-1469979628,12084800,1962934272,2051892744,-1070391383,313027,207742032,610395660,1482811123,1975520102,-1842026471,-461315962,-1309265137,
                  1943851012,-102611451,-1070401997,-293400085,309508,125173672,149471590,-1963597242,534154184,854115321,92939776,-954017802,1183377618,585679616,-1021143040,-53419822,
                  807799673,1227262469,23496704,1025648323,-1968519414,-2013247194,868417894,39226367,57928401,-786431809,-773664286,65196514,-773664262,-1208351774,1228833022,74647040,
                  -405745199,-738795638,-355348085,-355341615,-511651338,63427079,-1951349766,535332070,1008431617,-1173326587,-2051342336,3127735,-388948248,1019412637,-402230272,2078998677,
                  -427380592,-419450748,702816,1929458920,-335945211,1625591921,-176817604,-2065266768,-402640199,443744541,1085864418,-2133291520,-285174234,1961684456,-1777434618,-339537920,
                  -2001694651,1625588966,57977404,-1332728341,-1333467511,-396040530,527565013,1912661224,-427118571,1348527236,1692839344,1476444392,-338623000,-1917808634,-1161591578,-1262813184,
                  1423799,12192235,-1211516160,-402643783,-1329344397,-396040530,242417813,-1157627718,532264941,-799152128,-1329332501,-393943424,779223165,1692839344,1912632552,6416421,
                  -2065268304,1692838576,-402627399,74645621,183237090,-2065268048,1430020324,-2085612940,12223718,-1209156864,-402645063,-18100201,-2065267536,1692819632,-1342163736,-1017059747,
                  1912614120,1697818,1692838832,1912611048,3139598,-1934620302,1625588966,-117314568,-825497405,27813092,1625556084,1371796459,-469736263,1946331236,-1293397752,-203269682,
                  1371757049,-469736263,1963042916,-1628942072,-203269682,247683577,-1599013857,-222657306,-301944829,-2065260112,-402627397,212913802,-425545490,6601604,-1093763608,79689974,
                  -122820608,481318002,-301731142,-2065259600,-1662456525,-1153207560,1541931508,-124655410,1689860210,-245569536,-102682510,-1444402060,-1062671207,-336854155,32866611,1008038912,
                  -401509008,309522750,-325480472,-1074202178,-1091895293,-2065259088,-1531968277,213615846,2144696,-402652998,82562843,-2065258832,-1088151068,11543014,-723070234,-61,
                  -1205928961,-661782464,520098721,-1506613041,707406543,707406378,2147254314,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
                  182879,-121308990,-1587939130,-121069095,-1563188594,-1532189539,-121702210,-121702210,-121702210,-120784694,-58677880,-117148337,-83885366,-889616716,855310338,1600111588,
                  -152311573,-219417365,-286527253,-466460833,843418319,37551652,1435176565,79856460,-2142341760,-296860278,1894171641,-423398940,-423327120,-553401487,134219522,65535,
                  256,512,1024,2048,4096,8192,16384,32768,1,2,4,8,16,32,64,16777344,
                  33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,65536,131072,262144,524288,1048576,2097152,4194304,8388608,0,
                  -65536,-257,-513,-1025,-2049,-4097,-8193,-16385,-32769,-2,-3,-5,-9,-17,-33,-65,
                  -16777345,-33554433,-67108865,-134217729,-268435457,-536870913,-1073741825,2147483647,-65537,-131073,-262145,-524289,-1048577,-2097153,-4194305,-8388609,
                  -1,1220083711,-1178563072,-13426688,1724091238,146320371,-1093104128,80084992,-33241346,-956431162,951647748,869830144,536918518,867038054,536918527,1724091238,
                  -211365641,-1175047253,-1385816064,-507298970,-117345031,-6657,-1,-1,-1,-1,-1,65535,0,-2122448896,-1715633755,-8487295,
                  -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
                  -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
                  2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
                  403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
                  108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
                  1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
                  -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
                  805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
                  1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
                  -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
                  1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
                  1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
                  1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
                  -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
                  1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
                  1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
                  1541681918,-644039217,496825500,1922912413,-241325411,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
                  1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,10497611,-28645888,1962950670,-1173573474,
                  -152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-5670,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1969559301,281874356,-1269699446,1494273283,
                  -1261292718,-1273967358,-401552120,393382537,-717569282,1978199410,839676554,-2134442286,-546170370,445278184,45374153,-1996877619,520159246,-12447,0,196608,
                  -1,-1,-1,-1,-1,-1,-1,-1623725569,2143190966,541798983,1329804080,1363234893,14520042,792015088,942616625,435953720]
                  }
                • makefile
                  #
                  # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it.
                  #
                  
                  all: 1988-05-10-test.rom
                  
                  1988-05-10.rom: 1988-05-10.json
                  	node ../../../../../../modules/filedump/bin/filedump --file=1988-05-10.json --output=1988-05-10.rom --format=rom
                  
                  1988-05-10-test.nasm: 1988-05-10.rom
                  	ndisasm -o0x8000 1988-05-10.rom > 1988-05-10-test.nasm
                  	node ../../../../../../modules/textout/bin/textout --file=1988-05-10-test.nasm --nasm > temp.nasm
                  	mv temp.nasm 1988-05-10-test.nasm
                  
                  1988-05-10-test.rom: 1988-05-10-test.nasm
                  	nasm -f bin 1988-05-10-test.nasm -l 1988-05-10-test.lst -o 1988-05-10-test.rom
                  
              • 1989-04-14
                • 1989-04-14.json
                  {"data":[
                  -215511036,-1446729497,-970077091,-889074117,-1059597233,0,0,0,4793994,-1023318392,1996700702,2122974813,-402410489,-1957560157,45351510,-1962894616,
                  920847438,-1962117493,-661778362,1586212092,8290310,1007908353,1007645703,1007383560,1007121418,-1828490227,508662700,4241488,-396830578,1495203869,123392994,-167281014,
                  1962999878,-402476027,-1977679793,-2013247194,1019412838,1010529287,1010267144,1010005002,-1188072435,162791425,-1275056408,2746371,372949758,343212106,-956378574,1964637824,
                  -1328611829,-401689590,-768475121,149422772,246727424,-352320792,106123512,-1912602437,4373443,958843020,1482360583,281871220,-401695549,-389845137,729049176,4793994,
                  1912929408,116162565,-1461176970,1662421760,113410816,1963043052,-1460864261,654013441,1183384971,-1966867712,-2147464922,91358460,1980165248,8251402,-1996125402,-389873594,
                  -1047789419,-141829746,-1047604852,-1962349437,-1291536388,-805008894,-1978435076,22317808,-788526919,-117343774,-489566000,-2119502366,-31457034,-2082572853,-805416762,-930294411,
                  1858001038,-386102278,577962089,-661733325,8140485,-930327728,-1019487348,91576411,1946222211,-386102519,41025609,-998014972,4622600,-1963422781,-1577110817,-470351796,
                  -472788853,5283723,-167753056,67056359,65065411,-1950115902,855658526,-1948612910,-772812293,-151321617,33573126,-489618827,-1950090749,853511110,8436461,-1947169962,
                  -217796101,84636839,1967783944,-1070375184,727630841,-754732602,626050024,-2087321376,-2135948350,65700846,-288160591,1199868718,-997527933,1111682626,-299948968,-1070446006,
                  -1031582994,-527766523,1355017282,-402411438,225706114,-1645735753,1241936988,-1779949385,-2074518948,1376613860,-335166845,-1047863158,49016410,-1329348214,5826561,1908295028,
                  2133098496,-1191069878,-2135687078,-436162480,-2042567613,-2042567484,1492683716,1976009964,1965327401,11554846,1088701414,1088734342,727172230,553615864,1918394205,-20061473,
                  -2134608437,-1070432052,-527824405,-335156605,-1021385600,-301677949,548880962,6035433,942151688,-789249732,182243548,-790376219,853740259,-1090812197,-217873697,-1977349586,
                  63079420,-2081521488,-315489302,-422448757,1199868718,-528028029,1111682626,1257162634,-289394102,-15013814,1929526467,79856409,108380170,205949164,-478148885,-289175009,
                  -402331005,398720764,-2147287036,1610661889,402665472,100666368,33555200,616860160,1460080255,-1182475585,-1359871992,57997407,-2147391767,175450876,9832182,-385649662,
                  12255574,180605712,-2139391516,91532028,1974926464,-1777928694,57934336,-150914583,-1191411501,116795509,1946288278,-1775861741,645986048,-151191402,33560582,1156268660,
                  1582720,-1777928451,880019456,-58706197,-164792931,16815622,116796021,1946288278,-1775861741,645987072,-151191402,16783366,283840116,1582720,-1777928450,74777600,
                  1515041,-58670087,-165710536,33592838,243272820,-2146959210,-50293210,243271147,-2147352552,134223630,-58670087,-165251811,16815622,116792693,1946288278,-1777434612,
                  645923840,-335740778,403603461,243269888,-117178345,386332355,91490304,1951595648,386332249,91489280,1979971968,387876173,155677952,-167766242,67114758,-58704779,
                  -164399790,134223622,116805493,1946353687,-1777928688,510984704,1509110,-351243232,-1777928683,242549248,1509110,-2146995168,2130712614,1043334379,-58720233,-166038446,
                  134223622,116789876,1946419223,989626379,12060277,1282533440,490259449,978466346,116803141,1963196440,403603470,12059648,1712908421,-112912947,405176515,28900096,
                  -1141970043,-722993027,-1262225085,-1677479696,1662707726,245166516,1013126120,-1155500801,-397410179,1012417463,1007973376,1007711233,-1156811767,736624765,8239938,-113008920,
                  -229181,-1142226315,1968503936,-2137789694,41276668,-58678293,-352094907,-58683306,-385649224,-58720099,-385649353,-58720079,-385649326,-58720039,-385649338,1374159068,
                  -2144439294,-1660938946,641338996,1903427605,1968438400,8382723,1947008128,872185975,11535733,-2147418647,91567356,-202833488,-154929152,16815622,116791669,1946419223,
                  386332400,41158656,116835321,1963982998,-2147095584,-33515994,1576576,736688648,-2131016347,33573182,1048577908,1963130953,95965193,-855526465,116807696,1963458584,
                  1355020793,109494323,-1065091047,954729332,-1645520821,-99494423,-77270552,-161193239,268473862,116790644,1946288278,386332181,242549760,9840256,-167056387,50337542,
                  1827210101,-1008141569,97338724,-154928645,-2147477498,-1007091084,116835320,1946419223,386332407,-260831232,-223296519,-167733527,67114758,116843124,1963458583,-1777928485,
                  208932864,9832182,-2134019070,-50293210,7409280,21489792,1685121274,466484037,1709948979,281919412,-1007030989,184484585,-2144110364,779893756,2118450304,1476165675,
                  -58718860,-1340115624,386332212,896862208,116798128,1963196439,-164581332,50337542,783295349,-1007149077,116796848,1963458583,-165433324,67114758,430967669,1509110,
                  839021827,853541568,1245571264,-469056519,-997585032,75253564,125719356,1640134,-1966868480,-1152963388,-684811391,1509110,-1101695736,116824974,1963196439,386332226,
                  846529280,1509110,-166300384,33592838,775687541,-58717316,-1341885108,839052272,-1777928512,125043200,9840256,-387927811,-1070446121,116802539,1965031447,-387781675,
                  -527821946,887871858,9832182,1009743106,1015641134,-401967829,-696975304,-347148104,1965898958,2811914,-256325515,750840650,-1967162320,-721413850,1679882,645972985,
                  -1090715498,-1209295944,1717899,1848891,116835245,1946681367,386332165,-1664941056,8430074,-1560274269,-401735652,48955395,-1195126896,-1910636464,444120,-954204416,
                  36102,-1945713152,-617350656,-256507983,-2012807373,-1207940082,-1064435640,378662,1170679296,-50331902,93005564,-50529028,650120188,74712457,199999998,977322883,
                  -33262387,-2117276727,1979744491,-1927378680,-1945204736,-1262287104,-2113484802,-973045760,-16740602,9569990,8436993,-2125445400,184582341,-2012121920,-1996462546,-2013239530,
                  -2097125106,1090544654,-427839293,-1094700156,80150608,1149894655,71616002,88393231,105154706,-1106819960,80150600,1149894655,71616002,88393471,105154706,101139592,
                  5290014,1220073614,868257280,-1174457354,1727807488,-524573197,-1153463297,931921890,1409730079,113688576,-1954545577,503352606,-1912581960,1348592856,1642465292,-973078368,
                  -16777210,-2010714076,-430440123,96872033,-424562672,-1972247440,-424628000,91350128,-2135358464,1003170623,855798465,115589595,39684390,73238822,-919404875,637854145,
                  -1962521207,652774654,-1191099000,12484607,-52153728,-536695770,-722011422,-2010725122,443940,-2065236992,-389871841,1621295305,-1144485120,-1040842112,-1156877280,-1040842240,
                  -1157401584,12058880,-18614524,-1877571382,616663552,1950366912,67156767,1967178230,134265611,1971372534,671136515,-150732616,-1999962397,-1023373034,11795850,-1979710279,
                  49266887,37487396,-1015020171,1007151873,-2147126015,-404618045,5290014,12507278,38046208,-1152363770,-1014104032,-436096877,-2128178296,872444478,604468498,115916864,
                  1532528870,179315719,38045891,-956365626,80150276,-16464129,-1545326049,-620101534,28508789,12123954,-1142687996,-470350848,378063614,-943521647,-16756730,1376176127,
                  -973078528,-1073720314,5572294,1443284626,113639424,511705175,5290067,1642387598,135061642,-2065276442,7819,1734,-58398977,-50529028,-50529028,-50529028,
                  -2030240516,-1956518176,-1021355069,1680227886,-1426049435,-1347965531,587231085,-1987364469,-594831477,9169547,-1957342836,1381191916,196091398,551821542,1433739432,-930288334,
                  1183766670,73304838,-2146465242,91550457,1978923392,1325351688,-352209662,-53048341,-1400206146,158597180,-143277766,-336426173,-1970028841,1017962123,974550016,-1946716735,
                  -461371322,1324559108,-13703471,-343237740,1510416138,1499289691,521188841,1482381831,-1949345443,33390834,1325335413,16547842,1330578548,1195836139,1005751235,-2145356297,
                  108331517,-16625921,-58719666,1325954048,1313754703,1194453838,1179010631,-2094404794,225837054,1946221696,-347189756,-347716069,33390615,1325335413,16547842,1330579060,
                  82529870,1179010887,-2131588157,74711292,48975438,-1950136762,1979137010,16547861,1330579572,1313754959,1195848171,1179010887,-24958485,-2146339329,108265724,1330597454,
                  1178999275,334186311,1963064704,38207235,1946221696,-347123964,-1018738942,-58658165,1325691904,1191373647,-225721529,1963064704,38731523,1946221696,-347123964,-1018738942,
                  -58658165,1308914688,1174596430,-1963080890,-1962915298,-751173034,-745929614,-990459138,-2029227007,720710346,-153159983,704965594,-19846411,-154992954,67143430,1048584564,
                  1912733769,1228832808,326566656,378229328,-1031602077,6660100,1525610276,-2146505896,67127614,1048577906,1963393097,736856956,-1736214,-1947873024,-154825992,65876707,
                  65065409,-1761587706,-561068404,-470355829,16828151,-654900108,-523117065,177653507,974419136,705721286,-204829968,66388901,1976499965,-1963947276,-1977569049,61600714,
                  1976499965,4241654,-2048337778,-2145815460,33573182,1048580722,1996685385,1662421771,79856384,-301963872,1228832963,74647040,-489627184,1375752381,-980748149,-1164382926,
                  -487128768,100909315,-1953038258,1085970672,-1243416831,1226213890,1090158592,78971506,16828151,-654897548,-947790345,-92274448,1191277318,-1030961405,1519835790,182422355,
                  976778432,708080582,-422555408,-963909936,1372228177,-259265230,-1527514229,536872281,536920961,-344601090,-2128609499,1495269347,-586955517,-663367938,-789542312,1491521766,
                  -1974352758,-315469366,-1426850933,12812633,1976434208,-1867280,-586983137,-495595778,-61,-1,-1,-1,9560810,508973296,-1912586056,243928,
                  524519144,-389064610,27804743,333976948,-400061950,1474839630,-1161809093,-1460927497,-1274383232,374244102,1093044225,552125184,1963042884,-337366524,-3413911,-471309196,
                  268957185,225716106,1972894848,63209475,-351015808,268206107,1793594996,-401509053,-2018229385,141820732,71042996,1639187060,-269998200,1000728643,1342523018,33900230,
                  -966765080,-402651834,-2007474098,112461126,-335284294,41189544,646480052,1317208129,868417814,-7935745,-990509196,-1958513280,-1964756232,87818310,28575858,18239107,
                  -1073073941,-1816911244,276037948,37516468,364122484,192152380,132880308,1541931440,-1341789373,1128392705,-2013185560,1131735079,-389822581,663355694,-163354136,58003652,
                  -1023409688,-1979638296,38242311,1006663423,-1975749617,658244934,-1427622537,-401443518,2122334897,57999366,604301504,1929591823,988407838,-1275007512,-400062367,112214822,
                  67192518,16795334,1575151696,-395348904,-806864181,-2013088768,1124657191,1187382960,1187382273,-397410048,1951948228,984475731,-1275022872,-400062329,78660330,67192518,
                  16795334,1571219536,-397511592,-1813497201,-2006862848,1120725031,1187382960,1187382273,-397410048,1951948168,374244147,7661569,-2013108342,1118627879,4269706,485174507,
                  1967260904,1108076567,425600,-390069387,1007625220,-1274710780,65830919,-2143139096,1072174020,-400062464,1204175482,1183776770,-4181504,-1013115274,1720369202,50102278,
                  28575858,18239107,11803115,167777768,-1273990137,1964025857,605225986,1946364935,-1023233022,1586158387,-1866235642,-1672428800,-1975458566,-465509152,1019488832,-453609510,
                  -1017602752,-1342048582,1575546528,1391847525,-2065258320,66370299,-33686036,-50463235,-1073082588,1458242420,233603984,-1070338933,918870158,1085800568,-958886400,-16760826,
                  -969303320,-973076922,-402651322,1187381401,-1830289146,88524288,1581049856,-2065256528,-1341918534,645983756,-2081423297,-1280307772,-2031558518,-2030558103,-399265568,-1070372478,
                  -930359157,9444874,-973208972,9518602,-973208972,208989450,-440349186,30244870,1060360,1092151546,963985576,-1975459608,82362592,168813696,-2045807397,10414300,
                  -393017227,494141592,-1280307477,719904906,-2046555031,1764288708,-1975458328,550273248,468225712,-3933335,128976246,-1270805016,1093724307,-956371480,1187381255,-1746391035,
                  88524381,1569777672,1273496759,108956225,-1186904600,-2132236181,-503024328,-398791687,-1460863284,-2146732784,1946158462,89062957,129291243,2122318256,208994309,1968277992,
                  -401624062,132858019,28349364,-398414360,663289490,-348074520,1183840513,3982085,20714356,-1817181067,-58717205,-1341885425,-1274877177,-1008715260,-1014764661,-745604592,
                  -1047600757,50602169,-1177448757,-1074003895,-1682046208,-1523649646,990007457,1963087878,50373123,1963022141,2408202,-1410758728,-1079261044,-1246232468,-930305139,-11290453,
                  -1412920149,-1004092018,-1560276474,109838480,-1896152942,29316060,59095555,567087028,-919400469,512481678,-612040110,803834485,1958742632,50510382,567085492,-854851144,
                  4030497,96865653,1963801855,-853953530,608240673,1916877919,56206044,-2052976860,867429123,-1508996663,-1475442429,113721603,33555347,-1910582733,-853887781,-2051399903,
                  -853036029,-611443167,1316491,265867,1363759647,-1274837574,1008848167,443897858,516434833,-1031679093,-628224032,448057907,-1172364851,666108805,280240589,1031807437,
                  -1173588992,162792250,146285005,-1910387444,-1159885115,448004224,13312461,1225395456,1919251310,1329799284,1363234893,760433952,542330692,1802725732,1702130789,1850018317,
                  544367988,1986622052,1886593125,1718182757,544367977,218762532,1768247818,1919251310,1768169588,1952803699,1763730804,1919164526,543520361,1718165569,1667591712,1634956133,
                  168655218,1769108563,1629513067,1797290350,1998616933,544105832,1684104562,604638585,1396785664,541147977,1163412768,1309281536,1395486319,1702130553,1768169581,1864395635,
                  1768169586,1696623475,1919906418,1701972493,1667329136,1851859045,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,226059361,168633354,758263862,1802725700,
                  1702130789,1869562400,1699881076,1685221219,1920091424,168653423,-220,-1,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,1726778197,-65121456,-2048523856,-1912316277,39750619,-75489397,-1341491728,-8067566,
                  -1528233402,268140801,-1341361147,528803348,1566074459,-1341785623,-393943533,118381784,-1156341569,-611450752,1723867151,4389,101616512,-511482368,1711276047,-1419329269,
                  -1581239450,-1419378664,1711282849,2539179,-1392506695,-69031066,1727013135,-132051029,862366566,1483200,482257766,-1419334400,-1419319156,-1419321204,-1392507719,-69031066,
                  1711300798,1150009395,1722508802,627442827,16777215,862366566,71601088,1522445158,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,1711296190,
                  1150009395,1722508802,627442827,16777215,862366566,71601088,1421781862,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,47206,-1419378542,
                  -1933560986,81838568,-4674714,1722509055,-1845493576,1722508800,-527646669,1711595713,-18261,1220455270,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,
                  -1419377596,1711293118,1150009395,1722508802,627442827,16777215,862366566,71601088,1019128678,-1070373376,1711424651,76244651,-55962,-1419378433,-1950338202,-1419377596,
                  1711290046,1150009395,1722508802,627442827,16777215,862366566,71601088,1005103974,-13408677,252944575,1717247751,516906328,1726821222,440,-986487296,859832505,
                  -781803777,-492083504,207742201,610395660,1717692147,443,-583834112,113609574,-1175047393,1721647104,-1398811695,843466310,1978917315,-1469979613,1962979520,-1643532005,
                  1188287334,1912929923,531734234,-1613507738,-1619374746,-1010814177,1342178502,202138084,-215719450,-1957076506,-1007083562,607274378,1963080958,1280674574,-2147171709,-1971302795,
                  -101822907,63498691,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1951460328,1228832816,175244288,4800128,-352095225,954765439,1662421993,
                  113410816,-1460871030,-84183807,1946265836,-1429959941,-287114425,1228832963,124912640,4800128,-397314809,1202383115,-389808926,779374752,4800128,-2146995708,117459262,
                  -477481358,-1947668760,-2097126634,-661977406,1963043052,-1460864261,-1946455039,-486822973,1048626159,1912864841,1228832775,141887232,-1058479222,-1012141080,-1964450584,1049232990,
                  -896794551,1858001550,2042628858,-1898827000,2083964378,8332544,-523116335,-268181295,1946615680,283935587,106415243,-946940020,-125086895,-1258036352,145861640,-489561391,
                  41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,-20479573,-70210273,858129273,-276714747,-454942798,20901761,
                  -2082966198,787157188,-779361398,79289995,-1393325312,58326224,-1442500058,536856449,2046611628,87172611,-1309703766,-2115706337,1241595887,-1195124619,-386086912,-2143485871,
                  -1191676193,-661725184,1065474867,964012629,12187187,-670913152,-102573054,1085806708,-2133291520,-16772594,-1152384838,280606378,777971712,1085805547,515935744,62445710,
                  -326414336,1476419327,4241496,-1899767666,-2116340776,1974097215,871773026,40864457,-779361839,-489160020,-1321306629,1391121156,-1912586056,-661774656,1342178232,861271179,
                  486487789,208989451,4241438,243325070,536805394,-661890979,-611558881,-1019487741,-2143478666,-350522657,503734293,-1152384838,347715566,769320960,-1168046305,-661913472,
                  516145667,-1073694714,1962944488,-947897081,-1070336394,516103943,-1073694714,1239120,1342665818,1273545355,-2143463424,133002951,-1896037601,-2116340776,1974097215,871772973,
                  40864457,-779361839,-489160020,-1324780037,-1930767612,-1010695208,-1172437408,-289714176,1358263,523070440,-2135269113,64523264,-1009634366,1085855886,515935744,1342178232,
                  1593830539,-1021356032,210447953,976111174,-502959068,99350775,76164678,-3974663,-1288523493,-1221151308,766556600,1904806077,1953654135,1869182329,224222064,1685283327,
                  1785227110,-1480889237,2052915168,1651925880,-1364431506,-13959249,555482912,623125312,673850974,137060137,436210447,477961083,674899725,729688354,876360572,960443710,
                  959985440,909456429,858927403,863792,-2075560121,1951232843,1985049935,-1907716792,-1873899700,-1840082608,430931,520887815,488315674,472582684,-1756954614,-1723230136,
                  -1655858357,-1605329073,-1571643055,-23725,-436096944,-435113851,1693014148,-148571573,-301677949,-297607034,839248515,-289109276,-1396375998,-169719058,548988415,105352711,
                  12189491,-1951665376,55020055,-1703954,255,50331648,-256,-369098753,-65399,-1,28313168,397444582,1085834470,-1329558016,-425662944,-423611872,
                  116795120,1948254359,645932555,132055191,-821899944,1448302076,-326951343,653036304,9899648,7788832,105286555,-427560821,82362639,-2130157941,200278243,-1176990013,
                  -1968439280,1022895328,-502958888,-1878135819,134161836,550529,138807800,6740379,521192579,1566269017,1355765767,-2048523856,-2065295696,-1595531088,-821375656,1085820958,
                  1490587136,-2030387150,-1962905594,-1962906098,-83858410,1638525215,1085820958,-86471168,7212681,7083657,7341766,525925120,-396259607,11534360,-1973616408,-402476816,
                  -930456327,-219675472,-370636196,179331443,1558702330,57966760,-1007424517,-1325404184,-387544576,45112538,-739712630,-1979404196,1556932837,-1024980048,604114012,-2063719173,
                  201487570,-1327461887,1555359755,-396283159,129040316,-1973639960,-402083632,-259367779,-1763178064,-1329034660,1552934962,283764874,-6625183,-402651464,128998534,2145968778,
                  -1979142052,1551427814,-511047248,-1336118808,1550313483,-81526260,196141194,-1336122904,-387610062,-655795110,196147808,-1470346008,-83332064,-104844453,-1342176566,1547429898,
                  -143294296,-427163216,-1336134168,-387872253,95444014,669574538,614589532,-1331566850,1545070603,-527818740,333974448,1620175196,-401886982,-551265275,196141194,-379846168,
                  1049256063,121372770,138176372,171724148,222062196,28922484,-401951744,62186171,-18696472,1242970818,841184512,1405550290,8658570,-214252546,-32279205,-402475826,
                  146072215,1407357672,1105788042,45374208,-1964865816,-2013247194,-1262288538,-495327229,-277556726,-420754690,1827144628,-338545950,32816093,-1020631320,1558709172,-2076820766,
                  -33262592,-1261966394,-498210808,1381104778,4800128,-2146864121,50350398,11993718,856031672,-2076800311,1242991104,686311936,-1017554206,1950379752,1228832872,158597632,
                  4800128,-352160765,-1895877800,7651271,1006651018,1007252480,-1203342079,65794276,653305016,963904827,-1934886148,-1594119224,646578277,378208358,213450851,143845376,
                  -402524997,-1031591842,6660100,-401623826,62185927,-1260272920,-507647998,-1192754764,1727841249,1642352813,1951940776,82740005,503613798,4765776,1642387598,135061642,
                  378167782,113639424,-2030108672,1482811076,-2016675553,108953847,-401115904,393556521,1894134704,78148068,-64747404,67909493,619197419,-399609038,997470781,-392155458,
                  27800207,868110452,-262608736,-544587894,-2147031168,1047790847,-2136982082,913621219,-341821250,-1607549391,-855767884,-922867596,-964483980,-940315899,582,280263,
                  122078720,205965056,1187446784,-402653174,1014313397,-236434965,-1931709903,-1959916466,1451819860,-388287734,175452573,1915857640,478817797,1586102066,1820995074,91129858,
                  21793326,-972796280,-402585786,259338665,-2131766808,125108287,-890701945,-386430992,1451766184,-2084556026,-2013391258,151110647,35715879,555044623,575604995,1326580769,
                  -142139076,-1952394050,988283990,-399542991,645017927,443810108,1007076995,-2096466942,54267078,-964490124,1413164550,-2095746047,992872134,208929108,3945707,992880756,
                  880083284,-2131796504,125108287,1458108295,787974128,-402434934,394850122,772558476,-1996204917,1719863894,-1070399210,1317212907,213123350,434880562,18239107,-1070461772,
                  -2131811864,158662719,-397346937,-2024214503,-1007187977,-1826158335,151134459,554202151,357502722,151200021,555915087,-1756428029,302260527,557586255,-536870913,151135490,
                  -162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979999,
                  1711217426,1325928438,547588864,950347264,16776960,0,509606656,4243280,20766606,494154615,10487542,-2144701183,16818190,-100642328,-31153692,-386162202,
                  -336068576,-1610156523,57999616,-401871880,645922851,-335675232,-1269237503,-899735808,-1325793278,1481893899,-1974452212,-401887008,-78096306,196147907,609763560,-527806273,
                  1005063088,-1006938024,9969289,10094220,10229385,10358409,-92013629,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,870003648,
                  -338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,1055448971,
                  -153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,1355020292,
                  1139146928,-930463516,-393592604,1610335064,1086018334,-153383424,16818182,113651317,100728992,512607118,468189344,-453376001,-335666015,-436147456,-437716063,-1610156290,
                  -109805568,10495616,32241791,1595890681,-83885366,106979167,4241438,646568078,378273895,11534441,-202866458,520516608,62152967,1552808911,130491936,-930283521,
                  637853889,-1946007671,216580552,71796774,88589862,677154202,-16267482,-1043297025,-1993997088,-796130745,638380225,637814664,-1845147706,-930327034,915259534,-454515313,
                  -388986112,123601127,638082189,637687689,637814664,16713671,-427773702,17770096,12707871,38242598,637584104,637814664,-63545,88589862,17770130,-536801513,
                  251658509,-13701119,866208046,-805302336,-1912592200,1095888,414767246,-54489600,-13371853,1894121648,1726599505,-145119757,1946157505,-2135907071,683176166,-1898410496,
                  1724944064,2101072,-121498,571441151,-363305472,-268393512,503385902,1558946129,1165289722,-776988299,1810392294,-1341098683,-396302625,125125986,1692860336,-1018865176,
                  1642332852,393494696,-397390258,41156914,76088459,-435680168,-420010911,-1979599775,-343873852,-1044345711,-972880672,-1047768637,-389953909,-1044315388,-1017574168,-1912586056,
                  1763086040,1730579200,2680832,1894121648,-2040461537,-2038373180,-326412860,175498250,-33134973,1074155139,1719863531,1317256966,-815988474,1967448552,-422465509,1155065956,
                  -575663499,-806854426,-1341557436,-396040449,74728646,-2132409424,-1335926845,1432086577,816898186,-816491288,-396402693,108330802,-889585740,1408958466,641227917,-63545,
                  -524171124,1200170500,-1043821566,-2010772248,-970587065,1536820551,-435048198,-423130592,-435900383,-436096991,-419450847,-435048415,-423392608,-436031327,-436096863,-419450719,
                  140283297,385945382,638606477,1428095247,1187507339,1560293380,232784143,17760257,788475632,-1070358195,-1194328049,-796000216,-1912596296,2144472,-466435954,183032,
                  -1207558573,-661782520,-2147479365,1971324799,75464751,-2094434880,1962934911,2145059,-1845147706,-1912594248,-2049088,639601446,251660279,-4717196,-1207702784,-617414404,
                  -1017438457,-1899459333,-420103232,12828723,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
                  8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
                  8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
                  8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,8356,134,
                  8356,134,8356,1342177414,620761249,809238576,1008170072,-1961528825,-2147479522,-339726109,788476420,-1472231542,128975595,-1610593886,12255305,62175920,
                  108267324,-1162346309,-1014103084,6493833,28349336,-301677949,855960195,5153728,771777186,-1475377270,-788510045,-2020921629,1285793815,787206400,-1473796214,-1606425472,
                  -1071382427,1705165834,-1484116480,646490159,280559718,2045249024,1820993024,1284122122,4825099,37551652,-2144987787,1963788668,-389707250,-393609145,1088995722,130583040,
                  6295177,1006651808,1007121415,47108,548930419,-1174457593,-1410129920,1354696478,-1178586368,-1410138104,8849142,-1157204976,-270007820,6660127,-301677949,522539459,
                  -771510016,-166809120,133988593,-1057095054,-13450407,4791946,-1896467682,1949746654,-1618334208,-217864137,-1481654954,-67883287,-1898410914,616767424,6464007,-145600360,
                  -1560261594,-1856372658,213182929,1577396968,-1936988463,199819344,6725637,158727946,606069632,-339539232,-771378933,551780579,-1022697692,-2097125726,-1007811134,-2013247072,
                  1251999814,21399552,-2013240672,683870022,676352040,5263400,524296,1048592,4194368,742391872,707341608,808001070,808464432,3161904,537923584,53485600,
                  503776001,1726821222,440,-986487296,859832505,-781803777,-492083504,207742201,610395660,1717692147,443,-583834112,113609574,-1963576545,1073789428,1721689738,
                  -1969237039,1722640116,-253639885,1642337397,-1201258328,0,1298532469,857713018,80135104,1642352640,1642466316,1642525476,-1072994728,2129140085,-2132769055,-164425756,
                  -590347087,-498727565,854995961,-2095977536,79234286,1979688960,-389978617,-169720312,-695482230,-1329333985,-393943413,460456235,276104508,-1157627718,800700153,526313472,
                  -1023366680,108265532,-385834520,-2035285882,-5208858,179921126,21030912,-102627981,-460292629,1979333728,-427314955,3324292,1929456104,519692838,-1912586056,-1760657192,
                  -1205925888,-661782464,9840256,975562991,243271284,-1022361450,-1332722197,-461052280,1957313632,-1876038909,-2065266256,1692839600,1912657384,15001631,-1968171662,1625588966,
                  -424824752,12642404,523167832,-1332738325,-1014700403,-1157627718,364492584,-1173755136,1035665408,2406839,-1021401112,1692839600,1929418216,47630,-1179164229,-1847066592,
                  -1006703842,-2065268560,1912634856,-424824786,7661668,1642603890,-427708416,-425021308,6601060,1929410024,-335945212,-427642870,1012982916,-1340967851,-1165695357,1639645184,
                  2144695,-350336024,-427511554,-429870972,3467364,1625710000,2943171,434641522,-424955904,2156644,803737202,-1341558272,-461052276,32241760,518571001,-1469783011,
                  -469470207,-1007424672,6601041,44590308,-397342604,-497476347,-1017513485,6601041,27813092,-397342603,-497476367,-1017513485,60746239,-2065280848,-1912586056,-430853928,
                  -393301884,-1062711435,-4979340,-1332737301,1332209812,-527814620,1387273808,-488078106,1951932399,102679297,883026000,-1070396300,1958723726,96937472,645984484,-2133917680,
                  805310478,128975028,645927117,-2133917680,536875022,61866164,-1058533171,520574976,-2065279824,1929471464,-1218331890,-1124065607,82422517,620686110,552095808,477321216,
                  1076154614,-430591920,283662468,-1341295872,-393943466,2062032279,494397469,-1169900861,-1014769013,1975519759,-1328314560,-2146388735,276041980,548733872,1948318848,4581383,
                  548733872,1058432,271452367,777211904,-402241650,1482372025,-1007091084,-430460848,11819140,-1070395187,-58698813,-402426832,243269651,1529872400,105352750,-1338797848,
                  -103189497,938338499,31982453,-1901018368,206465256,-1327461856,1315235982,-430395197,-1155592572,1504754244,1200522470,861923334,-2098658444,-430264320,-2130595708,1963178047,
                  -1962823678,1538321943,-768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-374603075,
                  -919343112,-1274914934,15591438,-1339525987,1401218653,856184715,206539465,503996299,-1912586056,1220824,472311888,1480017640,312607604,-1336205568,-2088442274,-75427901,
                  57916002,-1325441047,-1014700449,1929247208,-35198957,1692844208,1929244136,-33757177,1625555570,-1175221309,-211419103,-176862555,-930352245,-5901466,-1847399707,243920896,
                  1235222624,1023288320,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,197691904,-401951541,616759359,-166808561,
                  -773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,-388956082,-1269118973,-289109490,-339375550,
                  -301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,15401195,-436253970,2144286,79419534,
                  32553477,855642296,-1387282945,-453044503,-435418015,-420273055,32553569,855642296,-1385710081,1934418921,-396929525,1583348437,1273699186,1084776932,47206,259325952,
                  92863361,-2001009292,867625733,1354964928,637897254,1642333576,1642466316,1642525476,-1072994728,-1897391755,-2132769060,-164425756,-590347087,-498727565,854995961,1712843712,
                  644220043,-141884109,-1476393799,1711764991,1174988993,-930417182,-115353973,-61,-1,-1367932929,-1365461640,-1339183193,-1296715682,-1331907915,-1365462814,-1319325785,
                  -1296715388,-1320242507,-1296715221,-1302941003,-92228990,-854428800,1436307520,1183575179,172394754,-346514083,102654028,-326958998,-2131981564,175511036,-1912586056,74836184,
                  1719873003,1317142046,-83754978,-1900006404,70698200,29554177,918815860,1085997336,-1948545536,425626328,-13704239,-2085755241,520554180,1720242017,1948682265,-855592448,
                  340167232,-2143510748,-2126769806,-857207433,50194502,95683955,-1023012376,1913003752,83028051,-165273424,1958742084,-2147415038,1963596158,1342311441,121932326,41271306,
                  1183319216,1218598916,89450496,-125058418,2122350518,108268057,41272330,1711982334,90605592,-432405388,162792566,115886827,102164486,-118996366,-1975684605,105507064,
                  -58715533,-167087087,745801927,-351971608,93906983,1912959464,88729631,169442944,1239942517,-32411131,-982186674,18761463,-402098944,65733997,-1023053336,-1612145568,
                  113769204,-1352400793,6885004,9971337,10098316,-1191513624,-1545074033,-419516342,-34868124,10098318,9971339,-1644886552,-2141142175,410321146,822574977,-401509072,
                  1480347700,163056245,2669040,250287821,-2136439068,1084754037,-1833958283,-1017033754,-1,-402416407,2104624403,-1341921304,1156982320,41205768,2122318092,292883225,
                  642777612,168248458,-1342016064,71731204,4760152,-1241232920,427720831,168195083,-33393212,409340614,1946510984,1994799620,-351685628,83879988,-1962662424,-386888742,
                  904397958,427720708,-402295541,426902585,1912928232,47835156,753405810,-32869883,-613087922,-352027416,75556867,76409027,1642604658,641773571,-1073199882,17564276,
                  -402634590,-1041759055,-401640956,175243939,1912927976,72083461,1340605419,1558758148,-399150588,-1977220304,1134693956,1208403456,-2098704384,68216836,-1545068942,-1948611837,
                  62318832,1912898536,40232975,-1192752526,-402296316,65733645,-1023143448,-1575467383,-1974271884,-478145442,-2114223969,-1995606437,1183389254,-402148332,636158962,1023707942,
                  58065919,1208221624,-1059027384,170264288,1183387204,1686775318,-1597178366,1183383669,-655834348,-1973194237,-1712843682,638219524,638280842,-352041846,1686775304,1149904386,
                  -17004018,-1597013809,1946272758,282034179,-1960388470,-390003388,119408130,-1442823489,-1330986102,-997545471,-947213654,-1861892438,63170567,1912853480,28698639,149424754,
                  -402296316,99287901,1609041844,1827193603,-402296317,65733453,-1023192600,1912823528,36890655,4720326,59500656,1912839144,25028623,-790099342,-402296317,65733413,
                  -1023202840,1929590504,33325064,-1763114123,-1070391808,918870158,-400621308,113639928,-973078459,17926,4662912,21096672,-155541328,-1444352511,-5707773,-2147245080,
                  33584446,243275634,-401604537,-1330642653,-301861190,-402420760,-2048327798,510034691,424068862,1127802880,857619314,-992440640,520160310,-236420941,-399871234,628228149,
                  7683712,-133991678,857612523,-992440640,520165430,-773291597,-2146798850,268453646,1929384168,-402279419,-389873022,527565455,-972987416,268453894,-402473752,259130060,
                  1912647400,50456586,1458046322,-402396414,1183318618,1692975896,-400330238,113639736,-393215928,-1578630511,-401378814,242352259,838927080,407276004,91488572,736633012,
                  512410370,-872546187,713081728,192091230,-1994897783,1183389254,-954602732,50337862,38046246,241497638,1260161830,1183441911,374769940,407291587,-2013154304,646453606,
                  1317208180,-389873378,561119271,605308554,81838081,-155541492,350809601,-1475448320,-1274776544,-1475941428,-1274710720,29157546,-397323325,-12844945,-997849995,112924651,
                  -198919936,242516136,-388176920,-186515369,-1259440821,1532623232,-401755965,376569860,861014704,1975551186,-1272926206,-166212352,24379844,1489197817,1583044954,119496031,
                  1358954447,4241438,113694862,-1325465458,-434051552,-1900006496,-1862223656,520092316,1478426708,33012431,9216748,1051331,1075838980,32619010,9282284,-685498188,
                  -1101655948,-523193491,-347733134,1588342521,-1918836602,-303512832,-1976208127,1059395142,4497920,638928522,-1978960650,-306178450,340691462,-1067392640,-385219607,-787001718,
                  -2134375711,243794133,780664901,686489670,605439626,4497983,-1575532918,1183449157,115916822,-2146146678,-322936604,-1564210685,1720320070,266633237,605308554,81838081,
                  -1005936628,637552546,-1056619381,1117913832,407276032,637551522,-1173863286,-1007811594,-150990664,1174603366,13795346,216187216,184871105,254105808,-1910586624,16824795,
                  -217976646,851648367,72256237,-388259864,275971743,1912615400,-611443189,-256237652,-387781119,16824771,-217976646,-315440275,-402370934,2028526456,-401837314,124911626,
                  -335417158,-1007885654,-198919855,1929274088,33012240,1963501804,-615323640,-2135624734,-389850631,-466420033,-1021819255,-971413880,-2013259706,-2097122266,-117367218,-1912158525,
                  646447104,646578292,-469106571,1183453556,1017062420,-32607104,1006925004,-402230143,-335938093,66501137,-387055440,-689422225,-402427139,1455620204,4374097,-1191054918,
                  -290717689,1509679682,1364443998,-1900006626,12122328,-353136,520115230,-1070396813,9307658,384506741,347848755,-198919936,9307658,-1243083915,1274405594,-2135625867,
                  -1912158471,1532559360,1948297411,-338906108,1946265615,-31594491,78120683,297010036,616154105,33012468,-1460879309,-402098928,-152905092,-1007058764,-2013236064,646453318,
                  1720189044,509002521,7802506,-661733325,909836725,141885700,104579212,41156870,-853409099,-2144990859,1974338428,639101718,-1375503232,-467005323,637538489,-488635732,
                  520320506,263504734,11800781,163254477,3914170,-390070086,552866424,758263857,1953724755,1109421413,1685217647,1767982624,1701999980,840960525,1294807344,1919905125,
                  1917132921,544370546,758329394,1869440333,1092647282,1701995620,1159754611,1919906418,892351008,1835355437,544830063,1869771333,537529714,758591538,1635151433,543451500,
                  1869440333,1126201714,1768320623,1634891111,1852795252,1109396746,543519585,1969516365,536896876,1969516365,1092642156,1867325440,1701606756,536887840,1969516365,1126196588,
                  1342835968,1953067617,1749229689,543908709,1342185521,1953067617,1749229689,543908709,1056972850,1061109567,824180799,1378693424,1159744847,1919906418,874514957,1294807600,
                  1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,544367988,1818845510,224752245,808656906,1699425585,
                  1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,2036681517,1918988130,1917132900,225603442,808656906,
                  1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,808656906,1699425587,1634689657,1126196338,1920233071,1701604463,1917132914,225603442,
                  808853514,1766075697,1952803699,1126196596,1920233071,1701604463,1917132914,225603442,808919050,1866673458,1668248176,1869837157,1698963570,1952671092,544108393,1869771333,
                  1344285810,1935762796,1749229669,543908709,1953721929,1634495585,1852795252,1394608653,1702130553,1632116845,1684370540,824183309,1227698480,1377849135,1159744847,1919906418,
                  824183309,1395470902,1702130553,1884233837,1852795252,1867391091,1699946612,1378364788,1394634357,1886745701,537529641,538976288,1702063689,1142977650,1313292617,1230263119,
                  1768169539,1952803699,1763730804,1917067374,543520361,168639041,842412320,1937330989,544040308,1769238607,544435823,1869771333,537529714,758396465,1869440333,1394637170,
                  543521385,1869771333,537529714,758330929,1701669204,1142957600,543519841,544501582,225731923,537529610,1397051944,541412693,1176641597,1260397105,220813637,537529610,
                  758263859,1953724755,1428188517,544500078,1969448275,2037672306,1668238368,1936269419,1668238368,224683371,538976266,539828256,1869377109,1394633571,1702130553,1851072621,
                  1394635881,1920295781,544830569,1801678668,168626701,1969448275,2037672306,1668238368,1665212523,1702259060,544370464,1260416846,1868724581,543453793,1635021889,1684367459,
                  925960717,1143812153,543912809,1917132848,225603442,959918346,1766075697,824208243,1920091424,168653423,808990513,1936278573,540024939,1818845510,224752245,943141130,
                  1766075697,824208243,1767982624,1701999980,925960717,1143812664,543912809,1953394499,1819045746,1176531557,1970039137,168650098,892352032,1936278573,1953785195,1917067365,
                  543520361,1701869908,1920091424,674067055,544109906,1970562387,168634736,538976288,1936607520,544502373,1195460932,1414745934,1679835977,1701540713,543519860,1142976105,
                  1702259058,221921568,2020165130,1142973541,543912809,1634885968,1702126957,1632903282,543517794,1109422703,542330697,541933906,1869771333,1393167730,1702130553,1632116845,
                  1684370540,701760472,-1207897932,-1227137024,-1203765218,-735464445,11534576,565623392,1757220864,764668346,1894158000,-1070399253,-1280282138,-1070436122,1910898923,7487105,
                  74715700,-2031730512,-435179270,-436162428,12123269,-1327984912,-433985793,-2049119,133635979,192220928,-1946164549,-2046325985,-1326936380,-1335761396,-1333467632,-1337203182,
                  -1337203134,843835026,-1332746560,-1337727404,-1337858542,-1337727434,-1337924096,-1337924096,66238988,-435048210,-1174294396,-1326578760,64535041,62569198,64666348,62962412,
                  -1141981134,750762564,-1962823493,2005659159,39291396,-1124068679,-823543011,96633824,64617089,816841589,-402699538,-2065296720,-373606723,-919347004,-1274914934,-1153188594,
                  -2081303063,-75427901,-1166886302,-2065296464,855703737,-1325604160,-465312256,-455046592,15680,-608498059,1685941,-373591363,-18150009,-2065296208,1894157232,1910767851,
                  -527825116,1894157232,1910949002,1894157488,-2065295952,1894157744,1910767851,-527794140,1894158000,1910767851,-990478300,1977649792,-2134081529,-2065295696,-2065295440,1894158000,
                  1910949002,-2065295184,-373567811,1642336051,1642525476,-1912590152,16825552,-2065294928,-398851864,158527074,1692839344,1945000424,-1218331890,-1124065607,-51790851,-1174476020,
                  1625554946,327727953,1493916136,27813092,-287177612,-941040661,997452007,-2065294672,-1326558744,-393943525,481298788,15238374,-434262000,270919812,-2065289808,-1339765528,
                  -393943522,531688830,-504855322,-434065361,402385028,-402427416,1623000189,52554172,-81304600,-2065292880,-1341073432,-393943517,582020213,-1024949018,-2049263,773819182,
                  604063626,1967144128,-423710710,-1131168380,-1342039831,-393943516,-1410798176,-1340116243,-396040496,376630690,1928180200,610329617,-1327461647,1348789969,1491963368,820577139,
                  -423326977,-433737632,-751245180,-2065291600,-1338616600,-1333467609,62831340,-433540882,-590092156,-2065290832,-1341570328,-461052374,216042081,-2040404372,-1335761184,-1333467605,
                  1022879758,208929960,-1155530566,448379019,188672000,-47930908,568631782,568785700,-1912586056,-1777928488,611651584,9834112,-1777434496,-386260992,-223335394,-1174707994,
                  116850687,1948254358,-956833273,38406,1048676068,305397874,1085283188,895543376,1968750602,-427815934,896592006,1273402032,-351588888,1967171639,1971365892,186705927,
                  300613808,3948324,876349042,99287671,-1341452824,1139298304,-1833895371,1012419558,-436046848,1913046858,-82706432,-1341459992,-393943508,-353881222,1690917,0,
                  -16777216,-1073741569,-8388462,255,-16777070,251658495,-16777062,255,-4194158,-16776961,-65382,-16776961,-16777070,234881279,-16777070,-50331393,
                  -16777070,-33554177,1325400210,255703808,-1157607680,-195,255,415121664,415141632,415153920,415208704,17772032,255724310,17678368,-1071509760,489619246,
                  571582,800112782,-434272218,-50529148,-50529028,-50529028,-50529028,1095932,537903246,-31103296,260046847,1944764450,787480766,387842319,786825022,185991439,
                  -1071640770,251658509,-13713374,-1195499218,-1064435704,-527801884,1642465292,-1977170806,113649181,-419495936,783477601,185991439,-1071640642,251658509,-13713374,-1195498194,
                  -661782496,1692844208,-83886151,44590308,-119405196,-1191145239,1692729343,91554216,-2098595614,-1470045184,1719432456,-1073740089,-1207959552,-1587150613,15451136,-2147474074,
                  225771520,-949616405,12582918,-350879744,1711336214,-1073740089,1442840576,-949616405,12582918,-342360064,113731072,49152,15426560,444262,192,1711336352,
                  -1073740089,805306368,-949616405,12582918,-1341915392,-462362957,-1327462799,-2039421261,-434107196,-1340937359,-462362957,-1327462799,-2039421261,-421583676,1095793,-588654450,
                  17772286,255724310,17678368,-1071509760,690945838,571582,-164374386,-419494714,3717252,1220073614,868257280,1073789439,-1510775044,-1912600392,-956943400,-2065236988,
                  -1912598344,-23729704,-1341776288,-1199249712,-661782464,6760073,6887052,-2065247824,1946396136,11200771,-2065247568,183022000,-1327461830,973334704,1086050867,-1963723008,
                  -401558536,-353894247,9281991,855670789,4242386,-125111305,9182858,-402620184,-743389081,683181286,-1898410496,265326272,627490848,2147483646,-356507121,-268386240,
                  503385902,-726621871,1085834470,-1898410496,-1962907370,-402626778,329376794,-1143852288,-201916352,1962934333,-1876694269,-1979711187,268483320,1946222464,1724026389,12173363,
                  -50384064,-22285466,281444559,520611563,12239713,-1243890944,-402646087,1358170036,509038931,1619974,113760398,74,1946222464,1277069339,4765696,862371982,
                  1073789376,1727856435,-805393421,-521419778,1499406087,-1329375141,-1098586499,-1959854112,1149906484,1019225089,-385649600,-270007852,-436162334,254699136,1041307137,230694927,
                  571408385,-1056249152,146276392,-958886400,-33554426,243303654,1715470338,-1431655749,-1054360150,1915212777,-1229232612,-1109693075,-974536395,1712222759,1431655867,-1052525227,
                  1931982825,-352145404,-100155826,-1192201798,-1064435640,856686777,-1050755585,12183295,-1050231536,1824384767,779676097,-1912588104,268483032,2076046899,1927479233,268482840,
                  -4094531,-2129759518,1961917178,-99566065,-336561478,-435965766,10086784,-1912584008,268483008,-1115684673,1525268909,268482872,-373180739,951597137,-1176990208,12455936,
                  -1043874432,1915661033,268482827,-373173571,74657439,-1075116880,-1912586056,868257496,536918518,-1179782298,-13430784,-373165379,12138526,-1040466672,-1204283927,-661782520,
                  -2147483458,-960560540,80150020,-33241346,-1191312186,-661782464,856686777,-1037845002,1915639785,268482827,-373150019,91434572,1659438512,571647,12507278,40140800,
                  -66795841,-956562234,80149508,1015080188,-469076736,1946265736,38567940,1095744,-661733234,1723867151,-475,-1071509633,12744170,17772272,-465692898,1946172544,
                  -259370175,-402652487,548406702,-1962522904,309719,-1341808152,104458272,-1956228261,-356423981,309520,1510313448,-402651975,548406662,856039144,1292754,-390717253,
                  -1343748720,-427904799,-423611772,1397801856,1220019793,-1312780800,-1341541118,1566721,-1560248315,280035452,28376501,-1560278808,1493631102,1405311067,-796240558,243844492,
                  -980549556,637534395,1991,38258470,-50528257,-65041626,-50529028,637598595,1734,-1610058752,-1054212020,948966635,1946176558,1276510214,-1597510912,-1054212020,
                  -466435842,1560731841,1405311834,1465274961,-1191179589,146735109,-137219328,818053363,-1786181706,1330577555,-1090719774,12517523,768256,-1090738701,12517523,768384,
                  1583326707,-1017423526,1465012563,1632342,1890781367,-1910767432,48832,365791668,1600054282,-1017423526,-1207558560,-661775360,872202382,49088,-218102599,573099,
                  -1155792712,-470351856,-2147483643,1149829330,72648706,-1845148474,6227143,-1207955266,280752128,98825984,-763302861,38045952,-972794744,-946731708,-1107294460,-930349008,
                  1827183283,1621504,-1290010440,6416530,-1207951170,-1833762752,-1107274008,-796131288,1290310323,4242944,-1280311112,4319378,-1207940930,-1833754624,-1107282200,12058704,
                  -393038912,113639467,-960495532,-2147461370,-1207936834,-1833701376,-1946151192,-1093103928,-1447039949,506112,-202780351,1629423525,-16463933,-1040413953,-272628512,38045956,
                  -2012971896,1153893724,-1023410170,-393301936,-1062718103,-336002188,-392777697,-527813283,1458083248,7775029,1323866288,-1327461835,893905047,-134186845,-1336884392,893118606,
                  -863969142,1976109584,-270237693,803770032,1455642677,1526938600,-1174396184,-155516928,1161653,-1023185944,52881494,911451,-1157627718,431601159,56027136,6332867,
                  1077723172,-2065104012,-1235829248,1962867584,-294797,-620073356,280455796,52741258,1769210684,41157180,-549830473,1673418354,281510070,203736202,1006823616,1011774467,
                  -2147257342,-549834553,1841183346,281510070,807715978,1006954688,1009939459,-2147257342,-549834553,2008948338,281510070,-1071332214,1007085760,1008104451,-2147126270,74723527,
                  158588730,-1899459554,485943512,-1944141025,-1093103928,-466452480,-1400897351,-69017598,12193396,-1230324912,-402648903,-18152796,120636191,120588080,120588080,122357536,
                  119539522,122357583,-151389443,-437654795,-1428826406,-1785027159,-27961706,48981,-372906307,-478087019,1090224320,29308789,-973619968,116950249,-1064384372,-1178220353,
                  -1014366188,41266930,12196587,-1238123776,-402644039,246415932,204726504,-2045856736,870115552,-3973881,1793720319,-401690620,-527813687,-1024977744,1963042867,550273027,
                  -1062681462,12193396,-1207780576,-402630983,871039488,208937128,-1155530566,1455011842,32434176,1050358,-1173588735,1488658432,1817016,-1476273176,-1173588976,1941643264,
                  1620408,-167654424,268473862,-1070462092,1181194,115880308,-476124957,1927522792,-423579593,-475994012,-1343738254,-467045661,1971365984,180367907,1962938886,482076687,
                  243272308,-401604458,216734924,-1155530566,1438234813,24832000,-1023397656,47712,-1179081285,1776812056,87856385,-1763176076,-1341557494,855894061,58001576,-1207938840,
                  -661782464,1181382,-87858944,-47963676,856039910,650153664,2367115,604423974,-70826496,3401811,512304731,-1341718492,-1184569760,-1243021313,-1469782840,-503155710,
                  -431640331,-464469152,-434065312,-1261479904,-2145989376,-143311876,1392513219,-402652741,-1017446398,-397324203,1482227716,-1957510307,156285643,11598492,1088701414,1088741514,
                  256014,-812645653,-661921658,11598492,1088701414,1088741514,256014,-812645653,-1957568378,1926769611,-338482427,-785674237,1935267979,1522197207,-225983496,-645142138,
                  79292043,-1175792896,-792854526,-1876563001,-494676853,309507,-339222850,548442135,8751142,-1958237568,178643,-339217730,-436236285,-1342129924,781369486,-950458633,
                  663749778,640106516,-2147449464,-354269270,-377035009,-695512495,-1190599999,401080322,-494708224,309507,-1342173720,10872864,178522,-1023409688,-147942660,-1832429274,
                  338137092,1364338496,9037904,-497395368,-1205943320,-661782464,1181382,1364402175,1958790902,4581384,-348066176,818345715,518522996,284065792,1532621803,1393003054,
                  1526747880,-1007295933,1223167408,-401952768,-1144848317,1156055290,16825088,-1006713368,-402620997,2109407287,-21436416,52476867,-1157616920,-1410858752,-393559042,-388889423,
                  -1979709720,125125,68101315,1075062672,124967,506819,281874100,-424234813,-432492477,-435834814,207742018,-396237309,1642397298,1642527780,-50383933,-1901068104,
                  126496448,-2054674877,1202356224,-436210718,-2013213976,167788838,-2096859932,-1023338930,-1979693430,167788838,-2096859932,-1023338930,1074185978,280035072,-771338614,168561888,
                  646579782,-457179073,-1161557500,-1964112910,9150688,-1173952320,-1058143241,1067451628,974070784,137393348,-83869914,-1862420232,594679245,145849776,173836838,50429568,
                  2122319988,41223425,-650508879,-645528973,-661920778,-67252760,-189115965,12368131,-322548760,108363944,-2135886110,1038615787,-1472009018,-1966909120,4563196,-804960726,
                  1693853408,-1596421628,1177157702,1693853191,46334468,704661254,-410385338,66239171,603996064,-804097009,1946462440,-1979469822,-1325383898,182768132,-301462332,-2134511640,
                  15910,-1175583732,116847652,1971322942,-975509494,-2135624478,-2146571271,2130722342,-400208664,-466475595,1095875,51144439,-763362746,216463872,-997849882,-997849882,
                  -1031087989,-1047821850,-997849626,-997849626,2123023355,48742407,-402227702,2122975226,133490693,2124844995,-508769620,-1211169031,244060071,-1350502516,-644324200,-2014865497,
                  -56753433,545267879,679485568,-2121600,-1,1358954495,-1595531088,196092134,-1976608536,-401821472,-1004392623,57950376,-1476391192,-402426848,-816316414,1481297232,
                  508757699,4241488,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645934870,-1577189216,-1064435558,9969291,-2146467802,123412312,
                  -431968061,4241540,1923209358,1015080448,-16616140,-1276802075,-1107348481,216648481,-431902477,-161356668,-1978653488,-17952,270819812,276087866,-608438558,1685941,
                  -372554051,-638845517,-2065284432,-1158859930,-1201274880,1,-1178258586,-1030864896,1721696051,-1419325231,-964625950,16417040,-1326943712,-461052349,-435418015,-420273055,
                  -431706015,49028,113510,862322688,-980719907,-544279414,12187187,-1629058496,-1613508250,-1385761654,-507301018,-1337690640,-461052347,-1329551263,-2128907008,-2129657657,
                  1914700031,2068670161,-1333466366,-1199249850,-661782464,-13376257,-372515139,-478088547,-1309265137,1943785476,-102611451,-1070401997,-1181740565,-248840188,125173672,149471590,
                  -1946820026,-431509304,-1932096636,49118,-372500803,-155452508,1161653,-372497731,-18088743,22391296,268960770,-8372192,-426725376,964996,-489937730,773450498,
                  -1327461716,767092879,-1360490576,1960852013,-426594070,11135364,-2065264208,-426528573,-435900284,-422517240,-1176836595,616431630,-385621300,-1406271335,12245387,571648,
                  -498929938,12630779,-301987655,-498973970,-427301126,-427694461,-427039102,-1970608503,981984480,-346393148,981722112,-346917436,981591040,-347441724,981656576,-347966012,
                  982246400,-348490300,982115328,-349014588,982180864,-349538876,-426463232,47748,-335542087,-1002814740,-136177803,-1191132998,-320077816,-1002814910,-152959115,1894370187,
                  47871,-1179264069,1172832283,-1325470725,-427497835,-1327831539,-435624448,-431968048,-431902709,-431837173,-431771637,-423579637,-431902506,-431836970,-431771434,-426331946,
                  -90389628,-1293382992,1954588716,-1326060798,749201536,-2102333302,-1976786712,-393957176,-393597799,-389641571,993788103,-997825161,-1047859061,1006680808,-1973913797,-389707048,
                  389808303,-125153929,-919354485,-1185821562,-503897565,-1185785709,-503906244,-148757575,1507328993,-963915501,-997537654,-453602636,-939269679,-888946637,-779628525,319275651,
                  -773205560,-773205542,-773205542,-855526182,-1341199590,740550798,-527825908,535334576,1085802028,869830144,650153664,2109067,537315110,-2133975552,-33527002,-31186460,
                  1018896870,-111351808,7014134,-385649407,-1993933073,-2147475410,-33527002,1344193287,-1912586056,1796112600,548405504,525869286,-1059026225,254018796,-1195177259,-661782464,
                  1056395,-576986149,-1610608578,-1073086448,-880799371,-390877182,269233057,-1280253814,-399794712,-471277354,1963239645,46396935,199958645,1963115510,-35422202,-2138038037,
                  -1168900637,-1581580288,5093815,1543095272,-1578828053,-1578705116,-81518108,512303590,-71106544,1448235347,-1957355945,4243180,-494674290,-2131588349,74646780,8166538,
                  -1802770735,-771031040,-461097868,1239942517,-30676045,-402295348,585872241,91606270,-340552472,1976368665,-1286150139,-855764757,-270006923,-33035341,-402426420,526234667,
                  1499094623,1187434331,-1031602175,-360453114,1963239430,1946331239,21415527,-300896255,-527766462,-300830646,726330434,838880774,1226738431,-2027278848,-595538023,855800064,
                  1242467008,83591168,-75483278,-1322093561,-1963854296,-789983032,55478505,-805149048,88508640,-528088143,-522984398,-2147072375,100682046,1724909173,107401474,-301481341,
                  -1997408573,1720189766,-1979469566,-1981557796,-523106722,-351975800,84083683,50529029,706550788,1178089269,57992202,-1007090311,-2147411991,-142657028,-13443958,528976430,
                  386332315,-394983424,1509110,605451524,386332287,57934592,-167727127,1073747718,-1712757900,268206080,12060021,-2139690092,292894204,9832182,-2146798590,-50293210,
                  -342556488,2025851488,66879583,-58696076,-2141359090,1551113468,1966603392,-1777928678,1182011392,9832182,-1207601918,904631808,9840256,1010035709,1007320608,1010138209,
                  607223163,-1777928673,427033088,-1899393968,-811483199,-1979709511,1487860420,645924725,-1258487658,14805216,1924449273,-705970126,-773095504,-392451394,-915223922,1631382251,
                  2050802556,539803519,-58672149,-2133429193,276116988,9832182,-2146864126,-50293210,-1041506124,1947204736,772505353,-1688631414,-1070427157,1774096363,-900929381,116819826,
                  1967128599,-383767424,2133131131,1966472320,-1777928687,175374848,9840256,-341527299,-58683317,-166628068,33592838,645925492,-1258487658,-1875514458,1963981952,-341462011,
                  -1974431701,-1899393852,899521,1019214992,1487860433,540811892,-58715020,-2146272254,259788540,159146300,92240444,417906738,-2134640384,-185895228,-219418448,454692353,
                  690497308,892613419,915143223,76087324,909854278,74776706,8402571,1717819,914952564,-386203620,1346705826,-846134600,-71084011,8239952,1492607720,-1979599677,
                  1317208134,1388511510,-1476380184,-1329374656,-1341985904,677636112,-152546621,106334975,58053130,604301504,1958742543,1996766215,32241667,-389850375,663404074,-1022311178,
                  48991920,854068912,378258216,-1024065520,-2146274303,158646498,1967192704,-352144888,-352210425,-117394941,-1963160893,-469105050,-524287116,-1895430140,-1008236032,1720384650,
                  1961101830,81838083,102813942,-410386289,-1598016573,1720320143,1961101830,82362371,-1023406299,-1974316208,115916996,-301729862,-1979675744,-1061149480,-1007287064,201487361,
                  -1058766847,646504458,1532625035,1223213912,-386173705,-1007895144,1979137768,-1114707717,-1007761526,-2044949722,-1251077,-404161658,1117832191,1958782976,1946724391,-343886844,
                  1126599201,818214400,-321911692,-990505749,-33262589,-166990908,41189572,48956596,-1144848204,-611450816,-1962897221,-1824554961,-941030539,604473856,115916992,1366605834,
                  611698942,666174899,332202164,-471305036,67745792,-768409167,57807821,-2147449623,74777852,2071314442,332202164,-1008166988,684032000,-1325135432,-841862399,-2142866669,
                  74777852,1031127050,2071251966,-349573760,839234487,-855591699,-401099757,28835990,856731908,1930677714,-855591908,-401230829,28835970,856666372,1930677714,1959525926,
                  -339345850,9485264,1956069248,-402344949,1018822774,-1873155167,1810379956,-1590707712,-1265611029,6350850,-2147446597,108295231,-341764678,146444347,-1875514463,1206387124,
                  -1594115584,-1987040533,-402616274,594935289,620626152,82362608,-71644930,-32410464,-1593263416,-922875276,1956717242,-1589855741,-1023374104,9485139,175384376,1676158856,
                  -1894874882,-1017444864,1979563240,-37492623,973400256,-2141621024,192230652,1349780284,1282671676,504358016,-2128674710,-16757186,-2129954833,20030,520319688,-1340129045,
                  637003827,-64748532,-527776758,-269995088,-38737883,645210280,-863969142,-401690592,12199390,-1179600096,-402630215,250344484,-527813712,606455016,-389773573,1354966466,
                  -768359797,2025833102,-930305280,1623414955,-1609628130,1622190095,12092646,-1143435748,-1014104000,1763085350,646522368,113705063,100,-2065276496,1961823720,1678672648,
                  1927876608,-1260132349,-2065276240,8783559,113705088,136,653145064,7487105,259330612,-1560249183,2124480646,8954624,-66973719,102651734,-1014047860,-1912590149,
                  -978141477,-1191144513,-1510801397,1583292167,-1090510407,-591593212,623634900,-1090510407,-390266488,623438292,-2065275984,1945083368,-429608953,-1878004860,7749249,376635520,
                  6557313,512426112,512295036,512426102,512295038,-622329736,-1287919438,57982987,-1962809367,-2130676194,-1996455701,-1962903010,-2130674658,-1996455701,-1610579938,-1885208432,
                  -972901376,16814598,-1962741016,-2130671074,-1996455741,184583710,-2096008000,16802830,6696584,6755977,6885000,-2065275472,7872139,8003209,8265355,8396425,
                  8793739,8439169,-1577021024,280232079,9569990,44427265,9051787,8920713,292864011,6557315,1848543234,1863747840,1896777728,8954112,-1157365755,506150784,
                  -1019543411,780875891,771948680,-981401466,-1918828416,8561408,9373382,-1943631105,-1845049856,-857210624,1958742786,1678672657,780665344,378077294,243794031,-1207566223,
                  -1064435648,-1962901315,-314578747,8436999,9569990,-1258377215,56748032,1946157737,1678672657,780682240,378077290,243794027,-2036268947,67156736,45147127,544522810,
                  113697418,-402587502,44630835,-2096008192,67134478,6958728,7018121,7147144,184584353,86471872,-470350848,-494268240,9569990,50718721,1946157737,1678672657,
                  780666880,378077298,243794035,-2002714507,67110144,725582011,989891870,-1608289341,-21757812,9569990,47310849,1946157737,1678672657,780666880,378077298,243794035,
                  1722810485,512460006,-1993998202,-1962929378,-1342142434,-387741008,-1313856730,535357322,-150949597,-2147458042,-1325239296,-305469439,-2065274960,8797825,242352768,-85412944,
                  -1971319774,-390876960,45359862,6555383,41222143,-1884290124,-1339890200,-461052312,-434065312,305195108,27813092,1625619060,-863969142,-429871100,468209764,-997566446,
                  333996262,-419516398,-34868124,-2065274448,-352321349,1789956104,29066470,4241408,378460302,646643817,-397213593,190574874,-385649189,1806696600,12092646,-136802788,
                  16802822,-401181696,-315428610,6688394,243986827,378208361,921174119,1678178285,1946158080,-253695978,243985714,-242548630,7147146,7018123,-135451160,33580038,
                  -401181696,-315428670,7212682,243986827,378208369,-85458833,1678178284,1946159104,-257628138,243985714,-242548622,7671434,7542411,-135466520,268461062,-401640448,
                  12251270,-1243890944,-402646087,116912196,-65436,1877481588,1678178288,1946173440,-14292733,-1062706716,1957692532,-1410824986,-429084435,262737796,1629423521,-662023229,
                  -2065273424,-661994614,-2065273168,512476042,507052160,645267578,6557313,512426112,512295034,1290272898,-2078373120,-2145502976,-1962642688,-1996455906,-352286178,410292272,
                  6557313,512295040,686293122,-2078373120,-1977710336,-1877546240,-428887984,512317572,283639938,-2078373120,-1977710336,-1072957440,1543045492,106386371,-2065272656,4990600,
                  -466434934,12318859,-1841397760,175440128,-1912586056,-389706816,1048832625,1962934402,47116,8652487,-2031550464,-428756992,4765828,1448329358,-1885317801,1275475968,
                  -402295040,65786930,1572758760,1935367775,1278118410,112640,-2087692821,1476149443,512381777,146341964,872362752,500945344,-492109824,1277070070,47104,1946338294,
                  16889859,1599691691,9584256,-1207143167,-1064435648,-1023162997,971632872,1996522014,47110,-2138043925,16796678,-1979744535,1342211102,-2065271888,1532954456,1398212291,
                  -428691376,1285707908,1220235264,-1178366464,-662044664,-1070334157,1956817,997568256,-1977158430,-1469979643,839283904,-335596608,-1960425673,-1469979643,839349440,114624,
                  1048585963,1962999954,4241423,-980696946,-1962917883,-378279704,1328081752,87172687,642188917,-997579470,378406,780847242,2091909196,-1957133082,8692677,45668235,
                  -32380160,1994406592,-8722173,1946222397,47352,-1022927013,-99513624,-72504856,45616757,365820048,-1382225670,-126578437,8533563,915080309,914948224,-1006960614,
                  -99523864,-72515096,1548483,16548035,171781236,-1207601696,585833482,1977617725,470661125,-58713877,-1274776096,-2146440395,259491068,192213052,41279548,-4325200,
                  855829503,-1007254026,1946221696,1978678278,-1023365118,404654675,616794624,82018419,168158144,-1775859005,216301568,396419082,1019435776,-2141489915,1450640383,1998584704,
                  1508397393,-2131004143,-285173978,-1341224472,-1184831757,116850687,1963982999,-386407925,-189788554,619405542,9905792,241756399,-524236918,-423425531,-18080,9897718,
                  -502696688,240183543,1625748656,9905792,-87860801,1848971,1178995849,8533563,915080309,909836416,158597146,1848969,-336019406,-117329917,1011926011,1012888584,
                  -2073594871,-468290112,213853318,784344192,1673856522,-1976662298,-345783002,1976106606,612819990,612371647,101330624,-2031721532,-1004107218,-27989149,-468945464,209659014,
                  -1266227648,-29037824,-464554552,-1476348794,-1979354048,1071939808,-2031730636,-2031866389,-1072922844,11831014,-108846613,-2094304767,645346041,721433272,-1975500607,612820192,
                  612371647,-423359808,-1342116986,1273428626,1946221696,-423327228,-1017578678,1084786404,-2136471435,146015349,1084763627,11805045,976109348,1952695558,771863582,1673791034,
                  -466479756,721433273,-1270791736,-1274483959,1971365896,-1979534334,-1008454972,-1273574936,-1274514177,1948297216,-1979599870,-1008454972,1612580603,58065468,-2097083671,-326420244,
                  -1064382324,-41166706,951697459,-1951730944,276598261,-16398554,1170614015,-970555385,637535813,-1845148218,38127398,-970588160,-1916795835,-953804676,654311173,476614,
                  105236006,1170613760,-796093947,-150990661,-2134572061,805634258,13795328,38111526,72714278,-722937037,-385649920,2089615508,92939824,1077723172,1187383156,-2115436474,
                  178944,1912649448,1179028089,1567932426,-1961853811,410291678,-1962905368,-2048013,775785262,251659767,640711821,108279295,-16398810,-970586901,-617350139,-1929351192,
                  -1893322628,1959329285,629155346,179135,1912626152,1179043373,640150274,-1153430144,1239941122,-971279872,-352238010,813468949,-2145547738,108282083,21382854,1187382507,
                  -998047162,119497016,-54271308,1979659775,74841858,-1190758913,-1510801404,-2096566653,1150224623,71601926,-1895676785,2089665284,1569269272,112898,365791156,276598211,
                  15855595,136384800,18940961,295763745,44134561,-6225503,-1167934878,-682174644,-555950362,-332403665,60463,253647,253952,11585536,11568358,45385190,
                  -256312674,-268365825,1894167472,1910767851,141889704,616570895,-1071509521,-1912586056,-1469782824,-1906150140,-436096790,-425021308,-18076,27813092,-119405195,-1332724245,
                  -461052414,-435965856,-435900284,-536823676,-617359218,1437220737,1002244213,788475614,95477166,12092646,869830344,-1438678565,-1123519147,-13705669,-1327648210,-1199249914,
                  -661782464,-352321352,-435703794,-426790780,-352261264,-1955470336,-426790696,-352261264,-436162560,167477361,-806812811,-435638075,184254596,1475019637,-423611760,-268388111,
                  -768354162,-1176665410,-1968439285,-487674672,10533625,-1342175047,183299595,-1341819712,-203231712,1948318339,2144773,11593451,-1595531034,-2065299024,1980496768,838906626,
                  786682111,-577194101,-1912586056,-1327038504,-1199249910,-661782464,6762239,-2065298512,551952560,212920811,1642366182,1642525476,1894125232,-477488691,-319544135,209045380,
                  -491721752,1976368886,-1014975249,868417716,268353472,-117077722,-101058055,-117098202,-101058055,-1676758845,449833210,256014,-812645653,309706920,766573212,236633320,
                  -352320536,617582594,-1070349567,-1668370237,447211770,256014,-812645653,309706920,-1380910436,236623080,-352320536,617582594,-1070349567,-1205929021,-661782464,-1329581210,
                  -462363085,-1591695247,108265488,3430,-820051712,-1632330060,-542122065,-541007952,192349500,-259267534,-13703471,-1008757596,8857216,1977289455,-2029092859,-1007153152,
                  1960512082,1662421778,79856384,201352608,6660616,-1961825298,-2097126634,1704985794,-1560861696,1525547109,-15368,-1,-1,-1,-1,-1,
                  1430346987,1380927572,1094918227,1194539330,859390540,960711236,1112559155,1126777640,1920561263,1952999273,1297040160,542196048,1886220099,1919251573,1919894304,1634889584,
                  1852795252,943272224,859319346,741619756,942421304,926428214,-382191572,-487925206,686817425,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
                  1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
                  741552952,876099628,942418996,741684536,909654060,942418998,741816120,943208492,1093479736,1819044929,1914708076,1734961522,1952999527,544437108,1701999136,1702064997,
                  1987211877,1684366710,-1339150748,-1333467635,-1337203182,4766242,-402607122,313524252,246434790,-1833925402,581979110,-301970758,99123379,-426594304,12174155,-423392767,
                  -527766453,2244076,-236840843,1273402032,1273369264,-1179264069,1622999065,-409343519,-3932437,-1,-1,-1469979568,1476556096,-436096817,-435048315,-2135884668,
                  -5213978,-1578753562,-469695512,-1947979167,-510149152,-1953476373,1926007806,-1933181438,-1898410296,3193024,12374158,-1231831551,-2080321560,-1106742035,-974604637,-2027492608,
                  309754,45738707,10610688,-494676085,309507,-1342138648,-854674400,-1177406704,-1998061566,-175377408,-13369421,-371068227,-292824005,-661733325,126606131,1642334089,
                  1642465292,-4983413,280887091,-602019358,1642393227,1642526500,1084776932,-523404,4241637,1049352334,-406780909,47878,-1908408135,-1376557349,1084776932,-1014952843,
                  -549777408,-1070339466,-208935425,-13380213,-371042627,-359932891,856679296,-804998702,1107653595,-768345630,283508729,653758976,76735083,1983462448,-1274608638,-502215410,
                  179094508,-1274645312,-351220466,-521616395,237466895,-1900006625,4243392,-1418648415,-1418647903,-1593803585,-1582599896,-1079283414,748749068,782347121,129739633,243712,
                  -356314931,-268377748,-394218416,96071510,-1390745600,1642396642,-722018166,-468654976,974136417,-1158122016,-5241871,1358687470,9119370,-2147162944,669565156,-435099409,
                  1484826712,-425676605,233603972,15409636,568770340,-756629454,15401195,-466430746,332255794,-326421134,-661733325,7878340,-1912586056,105301720,122078720,-1962490368,
                  113677056,-385941440,561253156,192245820,1946885096,-425414632,-1341854844,-1148918107,549042049,47616,-337319960,-425283580,230982532,-1816439869,1392831374,-1978788933,
                  376957127,74727592,132890674,1793639306,1526900758,501743811,113651215,-394239083,784535290,1670725248,-1172802176,314245120,3193273,518298600,-1912586056,302434008,
                  -1021378560,-1100993236,-1959854112,76230196,1947140265,-1876497661,-2145246021,-58670876,-401967808,1480334288,867898229,247916594,-1002534866,512241251,-1612160059,-3972850,
                  67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
                  100869376,-65536,0,285418752,84064512,8388608,0,285390848,134336000,16777216,0,285343488,84122880,8388608,0,285449216,
                  251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
                  134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
                  84136960,8388608,0,285463552,84133376,8388608,0,285459968,184742400,-65536,2048,285405440,84073728,16777216,0,285400064,
                  117628160,16777216,0,285400064,67243008,-65536,0,671222784,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
                  268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,100876288,-65536,7,553861120,235104256,-65536,2055,872638464,
                  117757952,-65536,7,570742784,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
                  134430720,-65536,7,553861120,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
                  84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
                  252075776,-65536,2055,872832768,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
                  134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,-588699136,-67106799,7602177,-301989888,
                  503525425,-52050,106891271,872624143,229,0,0,0,0,0,0,0,707406336,707406378,-412620502,707406378,
                  -1202708950,-661782464,-419492936,-2069830496,-1978764096,178382048,-1331566908,-341776864,-435441642,-2078219232,-1978895168,1963239648,169993222,-2145261884,74776572,551952560,
                  7022216,-389079208,-1977221070,584578565,-1998007609,-389873594,580386850,-790572349,638286332,646579504,1720189001,572965633,-1429796291,4793994,-1023318392,1452015411,
                  1944768770,536919811,-489561391,-489561391,-489555453,-100408623,1048641207,1929773129,-791555836,-153122073,-774796333,-773139990,-2133723414,-942536735,-1144784381,-390529022,
                  -427773699,1014097008,-502630913,91507700,-335681351,-1703956,-1,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,-672658571,
                  -234231567,-1377175436,1976368640,172917030,1719861824,-404161014,-385649167,-320339816,-402295311,-286527054,-1089837437,17452675,-33520663,-402295348,2062283215,91606270,
                  -336449304,1976368753,-26481918,-402295348,1659630209,1963719808,-243472376,-336467480,217874517,1317084021,-2097004534,-386004378,1114960270,-2081304088,-2084631962,-352253362,
                  234651701,-873986699,-2144605199,91614204,-336435224,-318996447,-1571467,-2145915918,91614716,-336382488,-268664819,1072170357,-2147226637,1583156716,1220071199,-1178563072,
                  -13426688,1724091238,146320371,-1093104128,80084992,-33241346,-956431162,951647748,869830144,536918518,867038054,536918527,1724091238,-211365641,-1175047253,-1385816064,
                  -507298970,1711895801,-293349325,-100758780,116844031,-1023147897,654358865,44590308,-1017513248,1922816744,-1712199662,1055395186,-402099555,57843096,-1008325144,-1325409816,
                  -396040531,-54263854,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785453,1950351510,1012982849,-2132249279,
                  -1090480602,9834112,386826256,-1336926208,271050766,242565288,518532272,1967171600,388399109,-1336353024,-81730016,-2147371288,-553609690,-369098819,398393573,-8591360,
                  1625610378,-850414343,48405,548407410,-369418010,-527826743,1967537232,403109397,242550784,1939622120,548469257,-369418010,548405410,-2131025690,125165820,9834112,
                  -2145654014,125166076,9834112,-2146440447,175439612,1979382912,-1760657400,-346550272,11724926,1574646,-345607160,-227,-1,-1,-1,-1,
                  1913047039,-384683008,-58657327,-2147126188,125162748,1509110,-2143914744,477382396,1967520896,-1777928697,678756608,1922608872,1392279587,-461103500,250288760,1509110,
                  -166824696,67114758,645924724,-336134120,-24057853,354846808,1042432,-2063546648,1629423597,-386268043,1355743266,9840256,-1777928451,309592320,-2139102080,91506172,
                  1948122240,-1775861755,-1017577984,-28776368,1692839600,379634520,-1665734656,-58714252,-33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,
                  1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,
                  1139146928,-662028060,-125157148,1139146928,-527810332,-528072476,-2116539565,1526799867,1482418806,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,
                  48758935,1354979328,5433425,645942645,-386989929,-307167870,-4628250,-1761151233,192221184,1877538786,-420171523,-2144867488,-285173978,-1594007064,-390070249,-2147015676,
                  -134179034,9897480,-4628250,-1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1195130024,802095104,12524,-16777082,285212671,
                  -1077337911,-1075003412,-1511137556,1408017900,-946882401,1116627853,508951456,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2080440256,-1963059610,1720320326,
                  50102278,406592371,138156919,356255350,204215154,-13444982,-13704239,-336838761,1979792391,-455743249,39619110,4202120,1461889,1499159298,123690586,-389063393,
                  242589996,1923214568,2287625,1317209204,-1329397482,839575046,1961102016,309517,-489684558,-85925318,-890764427,2122367964,678756865,-1156823413,-470351856,-2097003005,
                  -92274478,-1978567921,-16646018,-1023157454,-2147429757,74584058,67192518,4275840,-2146536448,151011646,-1326971020,1977879260,-1967115481,-1977221050,-2135293108,-136129792,
                  -930395934,64807656,-1978633277,78119238,162793845,18239107,-393184533,1953825082,1586167602,786682113,-271480949,45091814,182845675,-538379126,-589895452,-402162038,
                  2123031766,-456071164,-402405757,1179051222,83984000,-873986699,-1608848412,464978059,141869092,1084761015,716636789,-1964725784,-1545076356,99517412,1963051752,506135,
                  -402636097,-76227629,-324918296,-498662008,-459347726,4269704,184482024,1360970724,280624214,-1900006656,1588392920,1096022,-1911553864,1588392920,-236445863,-396003937,
                  663396834,1964033270,-2013495283,-327154827,331644931,199763848,-431312668,-18165,-1327757592,-152817148,-1023213466,162792563,1676160747,-1339198208,-1224022526,-468129715,
                  -1073250678,2114585319,-468916218,-402405757,-964434926,-468916220,-402133373,225771354,18239107,4269704,184445160,-1075264540,6601178,1960518376,-1258692090,-401020032,
                  129016172,108956398,-387723800,125108471,-1476338456,-1014975296,1317667248,-2065640954,1962950150,1040582683,-1590106112,280518,1962916840,1013982219,-394300048,2054553520,
                  -388338200,663396638,-167426422,41164996,1334501584,988033540,-2007010111,-1152187321,2145910788,-1208329256,-479401969,-1073250678,2114585319,-480188410,-1969165848,1474823295,
                  -2132214813,859010304,1552557787,21400073,74711868,343213372,-1600329645,-2146127781,41222908,-667283536,-1014627725,57989899,-388484632,-1062731719,717439156,707406378,
                  707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-488314872,-352320839,4366851,-488452120,
                  4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181125,-1070383863,4065014,-401771136,-186474428,-387156661,-2135631317,4073088,-1008465281,707406378,
                  707406378,-550884822,251798786,-162201829,-823588849,1256605191,-1209646395,-495392765,-1008565784,-1912600392,48856,-956431162,80150020,-33241346,-1912588104,536918488,
                  -211356109,4765869,862371982,-1174457408,-211410944,-1704021,-1,-1,-1,352092415,-58718350,-1271695937,-326370284,-1912586050,269912798,820150272,
                  -2135424834,58011898,-1951399746,-1912577258,-1950054714,-2117826832,-788463642,-1795215642,-756430235,503774146,1398167381,-347057583,-1150879564,1,1727596523,-325,
                  -125067265,862367078,-1760922173,-741251426,-336007198,82739977,-1948742810,-436209154,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
                  0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,0,0,0,1342578261,1448235347,-421482409,12319876,
                  -536823808,1438177422,408490,856651008,-386518071,108331275,-338064567,-491745203,12092646,-1193767232,104573525,980746240,1962999528,-1964166603,-1056964082,-4716063,
                  1960328191,1002646309,-2095091007,-477950013,-18192,-1053048021,12456050,12707840,-372176779,-402611480,166199315,7661569,1593895400,1532582494,1562314584,-169337149,
                  47104,-930299762,1086314638,93005312,-2089737053,-1960443193,1898357509,-2130383935,652214467,2092899721,93005312,-2089736029,-1960443193,1898619653,-1088583386,-1960443636,
                  1898750725,637716355,782435723,495527537,-2065243216,-1964166625,-1056964082,-473888287,-1009188092,1946221443,-1014936801,-478081025,-339611648,1095692,12174123,-1077834000,
                  -1960378400,92808765,7006403,12121651,-1950314784,-1964166405,-1056964082,-1510799135,1381060803,44880435,-2063867184,1482250962,1443241667,12144983,851545792,243934957,
                  -507445246,384402185,-913507957,700373390,244192,1599711219,-1021376674,1727837011,-1677306544,-1107348486,-2132151635,1560780235,844847206,-1286355996,1407511550,-538181709,
                  -1275058712,605058303,1006744588,-1274514420,1963239426,-1979665406,-1008454972,2011757136,-425479946,-1017578652,-160634630,1692839344,27813092,1625556084,1541994219,-425348874,
                  -162207644,655407441,27813092,1952053985,1348527106,-163518308,1692839600,256014,-812645653,-1195115688,-661782464,-2065256272,1973600306,9347584,-1174374494,1437598194,
                  -322948370,108287292,-2065256016,243273195,-402587509,57802980,-1342175768,-1014700360,29157382,-1297083021,-1833204506,2013625,-402652998,-739715876,-1339299071,864347827,
                  650153664,17055428,468222130,1967030272,309461504,-2065255248,-1064386509,406766630,-394153471,-1022951422,45286839,-1267068231,1930677520,-138784239,-1470436351,-2145880704,
                  259293436,279446763,568857205,-18816356,-19302965,-388794929,1558905130,332204468,297071986,1299321805,93005394,-1979710931,-1060336920,-914356511,216301569,-1979456320,
                  -804628268,41257510,28888830,1930677508,184320027,-58714508,-2146339823,208933116,287621514,225710396,-554974722,-1275067975,1930677516,11790340,-1901018119,-1476018968,
                  -1341492160,-1316690249,-1712719616,-393039872,-1073085015,-661983884,-1064380276,-1950338274,-1965519160,82362563,255593844,-1716517515,-33191704,-1245118783,98956816,-1543838719,
                  244056324,-125107962,58556462,637957550,7802496,616794625,1007514639,-1341819633,89647258,-1040267010,17163766,18392036,18484876,-2144405365,1974338429,243279366,
                  -1593704329,10682444,5153025,-956235101,302009350,1309576238,-670644480,-1942797567,-83764722,243857439,-1329397643,-1148918091,-1024018110,-1157401599,330938709,47616,
                  -1009561624,-2065254736,-155615813,108331458,-1157613080,364493160,47616,-1009568792,-402638104,-138805180,3980033,-319544135,208961704,-493176856,-260748298,183206068,
                  -335416902,57934140,-1007083340,-393301766,135005353,-1901010806,-83581464,606201027,-467540229,-423680863,12108705,66501120,-301682450,-1332054040,-792465920,-1021587429,
                  -803483422,-1593879525,-1524903787,-790001666,-803483621,1468705051,1696321775,1106791920,971790840,788027879,552588008,1860629242,1409242110,-940530433,-1761607441,-803463350,
                  -803483621,-803461093,-803483621,-133957605,2013510658,335706115,18093076,503382273,-1342161408,-1199249872,-1064435648,1253003,871183194,536919744,-980484301,-209715015,
                  12943787,1928215312,1085821679,-1983869440,855642910,-1077899584,1354301568,-1094153216,-1523649077,871948971,-1077899584,146342272,47104,-52253781,-2065288784,-1064386509,
                  -1074414658,146342336,784894976,-69031003,-2065288528,-1074431042,548995072,784894976,-69031003,8306519,-1993949133,867196677,1085834470,-1160212992,-2132536832,41235516,
                  378130570,883949682,-1867217690,855645881,-1965935653,56879300,-637284214,-203242242,1458089904,-1328510461,55568558,-751046518,-1901063564,201540840,-1327461824,54585486,
                  -2065287760,-2065287504,-1946156869,-1329557800,-1098586568,12580301,178432,1116908846,-12784574,-947910796,-1840625150,-1326587221,-1098586567,146798033,243968,-325931730,
                  -1964060426,-1002771232,-947911307,-492072384,-432361237,-170410364,-1191151425,787677190,1976141221,4241657,512350350,1001390096,-1427602202,-2029092720,-1901063168,-1476215576,
                  -1341098688,45344941,125044136,8857216,-1156453381,-1909540284,-1293416889,-2147126041,-83851482,8652486,-392908776,807666317,508616842,-2065280336,530778344,-2146470824,
                  57934076,-1330378776,-393943469,-1195138295,-661782464,1924301544,1963277321,-2027519995,-71042304,1448235347,4242206,-494675058,-1963816189,-788498276,143952870,1959922432,
                  -461090697,-855766156,-855750284,-346530956,-347935129,-335484160,679016484,-1862354864,1477823992,616108402,-1744639756,2029528300,-17374701,-336628277,-335484160,75036708,
                  770375948,472181826,15401228,619577579,1108339484,-351752126,96202240,-817567744,15401996,1257111787,15417930,619446507,-1974979336,-410363656,1499094559,-12453,
                  -1205928961,-661782464,520098721,-416945713,707406378,707406378,2147254527,-58700682,-2145946432,1114870524,-2114417833,-1048641305,-13760529,-336034667,-1084780537,-336883200,
                  182879,-121308990,-1587939130,-121069095,-1563188594,-1532451687,-121702210,-121702210,-121702210,-120784694,-58677884,-117148337,-83885366,-889616716,855310338,1600111588,
                  -152311573,-219417365,-286527253,-466460833,113542095,263257339,11568358,-944077338,-614733585,-1976640882,-1184656106,-1269759997,-1156330240,28933120,33667072,1935217613,
                  -1326718385,-2138773829,661946618,-353890640,1967171584,-1143305186,-611450816,7679626,-318055794,145231220,-1162868363,-2135259930,515435264,-1912586056,306086104,1948188672,
                  16377861,263493867,-466480947,416092365,1971372790,102653980,131680488,126574879,-1962931783,1974465531,-1820934624,-352271896,867193598,-2098667382,-2030361600,8448196,
                  -21003942,1974097153,-1243158358,-2065253200,1085808224,-2133291520,4670,-92262540,-1155370112,-2128184320,2033387903,246421365,-1476376344,-167283212,134256390,113641332,
                  -352321518,7727112,300507423,-1759084289,263517952,-466480947,1629425869,8126698,855344640,-1948003841,-1996468073,243991126,1317601376,4638468,-423428096,-1015946128,
                  -997560090,-121409050,112742,132841472,-21469447,1728053247,-791583061,-436209182,-83442557,-393007682,11796486,432871117,1017917180,-402295772,-169095525,-85118013,
                  -72362264,-1813452661,-208944180,1711284665,209037299,-1946978998,1724419059,125085683,-2096828541,-457490,-27,65535,0,-2122448896,-1715633755,-8487295,
                  -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
                  -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
                  2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
                  403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
                  108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
                  1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
                  -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
                  805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
                  1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
                  -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
                  1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
                  1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
                  1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
                  -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
                  1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
                  1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
                  1541681918,-660816689,480048028,1906134941,-258102883,645988253,-839909313,-434065380,525883936,1380982479,-1912586056,1812398040,-16485120,-2097123834,402681406,-1330113675,
                  1812343552,-1559595776,1856176236,1889681408,4235264,527826748,4130550,-468159481,1954588806,1950394386,-432069618,-426594170,-996135349,-28645789,1962950670,-1173573474,
                  -152173582,117456646,-2031842188,-2039119704,-2106244952,-2031697908,1273402032,-34839,-369098753,-6117,-1,-1,-1,-1,-1,-1,
                  -1,-1,-1,-1,-805306369,-768401824,399311540,1954596086,4242258,28367758,16778886,1131675964,-1280972549,281874356,-1269699446,1494273283,
                  -1261292718,-1273967358,-401552120,393393044,-717569282,-2132218510,839676595,-2134442286,-546170370,447967976,45374153,-1996877619,520159246,1386008417,-99844934,-527801884,
                  -461318922,610395152,1977629200,-285232904,1526211820,-15459,-1,-1623004673,471276559,541995335,1329804080,1363234893,14530282,791949552,942617649,503062585]
                  }
                • makefile
                  #
                  # Steps to produce a binary ROM from a JSON-encoded ROM, and then disassemble and re-assemble it.
                  #
                  
                  all: 1989-04-14-test.rom
                  
                  1989-04-14.rom: 1989-04-14.json
                  	node ../../../../../../modules/filedump/bin/filedump --file=1989-04-14.json --output=1989-04-14.rom --format=rom
                  
                  1989-04-14-test.nasm: 1989-04-14.rom
                  	ndisasm -o0x8000 1989-04-14.rom > 1989-04-14-test.nasm
                  	node ../../../../../../modules/textout/bin/textout --file=1989-04-14-test.nasm --nasm > temp.nasm
                  	mv temp.nasm 1989-04-14-test.nasm
                  
                  1989-04-14-test.rom: 1989-04-14-test.nasm
                  	nasm -f bin 1989-04-14-test.nasm -l 1989-04-14-test.lst -o 1989-04-14-test.rom
                  
              • README.md
                Compaq DeskPro 386 ROMs
                ---
                The oldest Compaq DeskPro 386 ROM I have is a Rev J.4 ROM from a "Version 2" motherboard designed
                in 1987 and released in 1988.
                
                ![Compaq DeskPro 386 System Board Version 2](/pubs/pc/reference/compaq/static/images/Compaq_DeskPro_386-16_System_Board_V2-640.jpg "link:/pubs/pc/reference/compaq/static/images/Compaq_DeskPro_386-16_System_Board_V2.jpg")
                
                Thanks to folks on the [Vintage Computer](http://www.vintage-computer.com/) forums, I also have a Rev N.1 ROM from 1989.
                
                However, I'm still on the lookout for any "Version 1" motherboards from 1986, so that I can obtain dumps of Compaq's
                ROMs for their earliest 80386-based systems.
                
                ### System ROM Locations on COMPAQ DESKPRO 386 System Board Version 2 (Assembly No. 000558-001)
                
                	U13 (EVEN)
                	U15 (ODD)
                
                ### System ROM Revisions
                
                	Rev  Even ROM #  Odd ROM #   Size  Date
                	---  ----------  ----------  ----  ----
                	E    108285-001  108284-001
                	F    108328-001  108327-001
                	G    108328-002  108327-002
                	H.8  113270-008  113269-008
                	J.4  109592-001  109591-001  32Kb  1988-01-28 (from a 386/16 motherboard)
                	K.2  109592-003  109591-003  32Kb  1988-05-10 (from a 386/25 motherboard)
                	M.1  109592-004  109591-004
                	N.1  109592-005  109591-005  32Kb  1989-04-14	
                
                [1988-01-28.json](1988-01-28/1988-01-28.json) was created with the following [FileDump](/modules/filedump/) command:
                
                	cd 1988-01-28
                	filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.json
                
                For a more human-readable dump, use the `--comments` option:
                
                	filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.dump --comments
                
                And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data:
                
                > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1988-01-28/1988-01-28.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1988-01-28/1988-01-28.json&format=rom)
                
                Similarly, [1989-04-14.json](1989-04-14/1989-04-14.json) was generated by first creating [1989-04-14.rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/bios/compaq/deskpro386/1989-04-14/1989-04-14.json&format=rom)
                from the two 16Kb BIN files provided by [Al Kossow](http://www.vintage-computer.com/vcforum/member.php?2256-Al-Kossow):
                
                	cd 1989-04-14
                	filedump --file=static/109592-005.U11.bin --merge=static/109591-005.U13.bin --output=static/1989-04-14.rom --format=rom
                	filedump --file=static/1989-04-14.rom --output=1989-04-14.json
                
                Dumping the ROMs
                ---
                The *.hex* files for the 1988-01-28 DeskPro ROM were produced by running [eeprom_read](http://github.com/phooky/PROM/blob/master/tools/eeprom_read/eeprom_read.pde)
                on a [chipKIT Uno32](http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,892,893&Prod=CHIPKIT-UNO32) Arduino-compatible
                prototyping board, and capturing the serial port output on my MacBook Pro -- as outlined in
                "[Stick a Straw in Its Brain and Suck: How to Read a ROM](http://www.nycresistor.com/2012/07/07/stick-a-straw-in-its-brain-and-suck-how-to-read-a-rom/)"
                by [NYC Resistor](http://www.nycresistor.com/) contributor [phooky](http://www.nycresistor.com/author/phooky/).
                
                The DeskPro 386 ROMs were P27128A-2 chips, so I wired my Uno32 based on this [27128A](/pubs/pc/datasheets/static/27128A.pdf)
                datasheet -- the closest match I could find online.
                
                ![Compaq DeskPro 386 System ROM Version 2](/pubs/pc/reference/compaq/static/images/Compaq_DeskPro_386-16_System_ROM_V2_Breadboard-640.jpg "link:/pubs/pc/reference/compaq/static/images/Compaq_DeskPro_386-16_System_ROM_V2_Breadboard.jpg")
                
                On my first dump attempt, every ROM address returned 0xFF.  After looking at the 27128A datasheet more closely, I noticed
                the DEVICE OPERATION table indicated that, for a READ operation, /CE and /OE pins should be connected to INPUT LOW VOLTAGE,
                while the /PGM should be connected to INPUT HIGH VOLTAGE.  So I wired pin 27 (/PGM) to +5V instead of GND, and the dump
                worked perfectly.  The NYC Resistor article implied that every *active low* pin should be connected to GND, but apparently
                there are exceptions to that general rule.
                
                Recreating ROM Source Code
                ---
                In the current directory, an original ROM can be regenerated from the JSON-encoded file:
                
                	cd 1988-01-28
                	node ../../../../../../modules/filedump/bin/filedump --file=1988-01-28.json --output=1988-01-28.rom --format=rom
                
                The ROM can then be fed into NDISASM, the disassembler included with NASM:
                
                	ndisasm -o0x8000 -se105h -se05ah -se6ffh -sf025h -sf8aah 1988-01-28.rom > 1988-01-28.nasm
                
                The `-o0x8000` argument is required to "org" the file at the proper starting address, but the `-s` arguments
                are optional; they simply establish a few sync points within the ROM image that save a little cleanup effort, by
                preventing disassembly in the middle of instructions.
                
                Next, the PCjs [TextOut](/modules/textout/lib/) command, with the *--nasm* option, prepares the code for reassembly:
                
                	node ../../../../../../modules/textout/bin/textout --file=1988-01-28.nasm --nasm > temp.nasm
                	mv temp.nasm 1988-01-28.nasm
                
                The result, [1988-01-28.nasm](1988-01-28/1988-01-28.nasm), after a small amount of manual cleanup, can now be
                successfully reassembled:
                
                	nasm -f bin 1988-01-28.nasm -l 1988-01-28.lst -o 1988-01-28.rom
                
                However, it does NOT produce a binary identical to the original ROM, in part because of instruction ambiguities (ie,
                instructions that can be assembled multiple ways). It's possible the reassembled ROM may still work, but more research
                is required.
                
                One interesting section of the Compaq DeskPro ROM is this string at offset 0xE002:
                 
                	db	'AUTHORS CAB93GLB93RWS93DJC93NPB(C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86'
                
                which appears to list the initials of 5 authors: **CAB**, **GLB**, **RWS**, **DJC**, and **NPB**.  The meaning of the
                "93" sequences is unknown; they may have simply been a form of obfuscation.
                
            • portable3
              • 1987-01-29.json
                {"data":[
                -2065284944,-1912586056,7512536,876380390,-436272523,1102112139,1642366182,270848246,-4595574,610395391,1959016976,-1141448176,414823662,-2143568640,-347608855,-431836967,
                536919684,-768348877,855638456,-2147436091,-13385074,-1412378210,-964625438,1926642448,-431771412,207742084,-352261364,610395648,-352261133,-1335761408,-2021333436,-1143852034,
                -583860223,-628177525,12187187,-741237120,843492511,1979113923,-431640529,-1469979516,1962979520,1189007651,-1314987917,-2133601528,-683994938,-142094222,-1333036467,-1199249850,
                -661782464,-436212597,1202768011,-695499546,12574348,-2133082880,-1153045271,297383212,-2132296448,-347652375,-1340186370,-1199249803,-661782464,6760073,6887052,-1342177095,
                1367664246,1497410024,-914356620,-1872827647,-2065270864,-388287663,190382188,-2147060517,32178889,-423523696,168211584,-1274907447,-428298233,497871236,-2065270352,-1878594568,
                -2065270096,4241657,378460302,646643817,57802855,-460314133,-154629504,225706689,-1157627718,448378094,1174792192,29488884,12193140,-1259422976,-402646343,-1326168589,
                528803451,-779304095,13489291,1946157117,20113667,20775373,-385649664,46989608,1946157629,18802947,212428,367592308,1023724801,57933828,-855569431,343301,
                32047988,1023855873,57933830,-855574551,474375,-303496332,1023986944,57933832,-855579671,605449,-639040652,1024118016,57933834,-855584791,736523,-974584972,
                1024249088,57933836,-855589911,867597,-1310129292,1024380160,57933838,-855595031,998671,-1645673612,1024511232,57933840,-855600151,1129745,-1981217932,1024642304,
                57933842,-855605271,1260819,1995113332,1024773520,57933844,-846172949,1391893,1659569012,1024904592,57933846,-846178069,1522967,1324024692,1025035664,57933848,
                -846183189,1654041,988480372,1025166736,57933850,-846188309,1785115,652936052,1025297808,57933852,-846193429,1916189,317391732,1025428880,57933854,-846198549,
                2047263,-880737164,-779223038,-1195122037,-1194393600,-1194393599,-1194393598,-1194393597,-1194393596,-1194393595,-1194393594,-1194393593,-1194393592,-1194393591,-1194393590,-1194393589,
                -1194393588,-1194393587,-1194393586,-1194393585,-1194393584,-1194393583,-1194393582,-1194393581,-1194393580,-1194393579,-1194393578,-1194393577,-1194393576,-1194393575,-1194393574,-1194393573,
                -1194393572,-1194393571,-1194393570,-808517601,12418,-754974586,12418,-687865722,12418,-620756858,12418,-553647994,12418,-486539130,12418,-419430266,
                12418,-352321402,12418,-285212538,12418,-218103674,12418,-150994810,12418,-83885946,12418,-16777082,12418,50331782,12419,117440646,
                12419,184549510,12419,251658374,12419,318767238,12419,385876102,12419,452984966,12419,520093830,12419,587202694,12419,654311558,
                12419,721420422,12419,788529286,12419,855638150,12419,922747014,12419,989855878,12419,1056964742,12419,1124073606,12419,1191182470,
                12419,1258291334,12419,-402653050,125126129,1964413416,-401347727,1786003197,4800128,-2146995198,50350398,-13411211,1958725518,4622848,158597180,1249182012,
                -336534344,-257640445,1946499878,1169418301,921174901,-1409614848,-72628084,-1979685472,-1962908122,-1191156970,-2132279284,32815965,-2092857880,1704985794,263515648,62132429,
                45355213,28577997,1354961101,-1169010349,-1964239930,61931622,-461314862,183968776,-617419068,91556008,-350913048,363784195,1482381658,1648265923,1946631168,1946696793,
                1946827841,1947024472,112965,281873076,281871284,372949758,443875402,-956378574,1964637824,-1261502959,-1273967358,1393609992,1005124746,45374208,646582477,1720189001,
                62178049,-771092275,-889261964,62187755,-768470835,-189013781,1118562305,-855395133,419332112,-956431244,146066667,-58060595,1048597073,1946615881,1228832777,41288448,
                28836023,-1228328186,1242991128,281889280,-37529254,4857482,973231755,-1979419949,-154468653,208929220,-181745017,-554249942,82565878,-785713878,-1023490306,1948696552,
                1228832801,678560256,4800128,1343452931,1662421842,79856384,604005792,1482354423,1048579819,1912864841,1228832775,2088044288,-366220405,16770433,-125049391,-470366838,
                -1056707278,100917457,-1936261042,-1948348730,-136055056,1946222790,-136775932,65065437,-1073047865,-969272204,-265678733,-1510749558,-50072317,-193605890,-410324854,-896917328,
                -50091021,-160051458,-1912586056,640608472,1048582516,1912733769,1228832786,192348928,6493835,-1610300797,-1007812507,4800128,-805014778,-1109208863,-1957560240,851806968,
                1085970669,65206017,1309017025,-259287296,21019288,45474551,4789898,1916861056,-150686462,1946222790,-136775913,-255360547,1090158624,-947846030,-92258304,1191277318,
                -1030961405,1519835790,182422355,976778432,708080582,-422555408,-963909936,1372228177,-259265230,-1527514229,536872281,536920961,-344601090,-2128609499,1495269347,-586955517,
                -663367938,-789542312,1491521766,-1974352758,-315469366,-1426850933,12812633,1976434208,-1867280,-586983137,-495595778,-1959898685,776357388,91497530,-336005150,-1976678907,
                -1017513724,850467839,917877939,-1330005833,-1995915987,1919252337,1769306484,1566273647,1935802125,1751606884,-1150522518,1560273063,1986230394,-1402114462,721399726,469704959,
                606289953,707157541,727656744,724744,2098952986,975637788,2116624936,1010007083,1060453940,943136825,892611897,842083126,221130803,1232553728,1299401604,1366642548,
                1250773110,1318014094,1385255056,110318482,203294464,454760991,722082845,1191184924,1234716823,1302023065,1352617885,1386303904,10703778,33641898,537921540,16744512,
                -2065264464,-1107292487,48400371,-1406262037,-1884233590,-1335333144,1751181455,-361439174,-2065263952,-1157627718,448378094,1061283840,-1850671381,-1329363738,-343611757,-1342117120,
                -435624444,-352261168,-436147456,-337975795,-352261376,964864,-494406722,16247043,-645157842,-1191182150,-336723960,-352261376,15461888,15401195,-1158684094,146342080,
                15461888,15401195,-352261138,1107356416,-420552126,-352261241,-436147456,-352261245,-436147456,-352261247,-436147456,-352261246,-436147456,-352261237,-436147456,-352261239,
                -436147456,-352261238,-1979651328,981984480,-344558140,981722112,-345082428,981591040,-345606716,981656576,-346131004,982246400,-346655292,982115328,-347179580,982180864,
                -347703868,-426463232,-352261244,47616,-335542087,15401195,-336854805,-352261376,-1002814976,-337501323,-1191132998,-336855032,-352261376,15461376,15401195,-1002814910,
                -354285707,317311883,47871,-1179324741,484966426,-1325470914,-343611755,-352261376,8436224,280559792,-498930176,-435296516,-1342116902,-436147456,-338631160,-1342117120,
                -351541696,-1342117120,-351541695,-1342117120,-351541694,-1342117120,-351541693,-1342117120,-338237760,-1342117120,-338237887,-1342117120,-338237886,-1342117120,-338237885,-1342117120,
                -1014700394,-393563910,-2136447310,-335871116,-394219277,-259365210,-1612152144,-1329034650,1721297028,-1963202422,14084294,1702312764,-259275642,-907492982,2000370688,-1965520296,
                12511429,1299650364,-1014237046,-863581901,572766545,1486086647,3979602,599384567,65140514,-787260968,-930429301,-1833646966,-506338058,-1070348285,-804009213,-1031548537,
                -775417081,-774188567,-774188567,-1260727831,-350565119,-393302002,67921442,-1901010806,107356904,-1912586056,-1900006440,780871360,-953810912,-1358946298,1797685386,568655360,
                15466020,568721643,-402637637,116800426,1962999915,47630,-1179324741,-790101990,654240572,2109065,7022208,516098046,4241488,243325070,-1342111637,1478551072,
                -527773921,604302528,-1022700273,-1912586056,270437336,-1679566080,1064669,167776416,-2145815104,-464518453,-337697631,-436147456,606200993,-352261125,1478616576,1056393,
                -430919485,4241540,1370544270,-1901034266,-1469748760,-1274710848,-1878332417,1541969072,-1976556443,-1340190496,-393943470,1478452930,516096372,1256738822,856454200,-1077899584,
                -953810828,-2131696635,-822079450,1052288,-1342131152,-2146382585,-822079450,1052288,-1342131168,-401552125,123207851,-430657505,-1955086972,604060137,568873024,494098432,
                1076154614,-430591920,300439684,-1341230336,-393943466,619199553,1008855100,1320862659,-2082829384,-1073082429,-746110859,280297904,1947270272,-1258049520,553418784,1172834164,
                -1258049536,270958624,772329216,1397751824,105352750,1530361064,-117279656,1471172803,-1269267226,856739072,-2141994048,57946364,-2147478552,805310478,1200500315,927721478,
                -646707280,-1901018119,207909352,-1327461856,1685186702,-430395197,-1155592572,1504753742,1200522470,925100038,1877672820,-430264176,-2130595708,1963178047,-1962823678,1538321943,
                -768375578,1334574899,851938061,-33391676,-1430113600,-13372446,-1962061941,2076455623,851508738,-203313470,-226491019,-1328187905,-1669011876,-376669507,-919399321,-1274914934,
                356902926,-1340836707,1401218653,856184715,206539465,-401973365,-1336198441,-2088442274,-75427901,57915500,-1325435927,-1014700449,1692844208,-335544391,-352261376,-1469783040,
                -503024638,-1190401038,1692729343,276103592,901511394,1948086,-376643907,-18138299,-436248348,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,
                225603442,1885696522,1701011820,1684955424,1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,906628388,1143812656,1701540713,543519860,1953460034,
                1667584544,543453807,1869771333,604638578,-1205971376,-661782464,-402652232,1579096164,1011928920,1946448385,-1312597995,1661069312,-1168967819,1525426118,-930463964,-253170709,
                -2146142878,41304057,-1169014863,-1047910458,-1336386834,1490283264,-347045712,-52,-1,-1,-1,-1,12849898,527427824,359924136,-1979594520,
                527886375,856679144,66566848,1954588908,-2130267125,71246,4269704,524806339,74777000,1626072114,1962920680,26732635,1947207670,-2144892401,58038268,-2147236736,
                300618732,-1273060888,1946369159,1007137800,-1274907644,-400062367,770187040,88508944,88524368,1613424642,345798,1482695656,-1274722680,66566662,1954588908,-2004831230,
                -2130689754,71246,-385928253,125108111,1971373302,855149380,4623076,158467388,1317077428,-352321258,1958742576,1016312866,-1273990143,1946303604,1008055313,-1274317821,
                -1341658217,512419841,28313067,-400658200,663224565,-1960926232,-353844281,-400061952,-990503272,-402426608,-389873663,126484697,-16627832,1183449206,1999059973,260761630,
                -1275018008,-400062367,112205424,67192518,16795334,1578690640,-396135336,-1494741140,-2013088768,508749863,1187382960,1187382273,-397410048,1951948282,256829492,-1275033368,
                -400062329,78650932,67192518,16795334,1574758480,-2128317352,71246,-1979684632,663224935,-1977740312,-352304858,492824607,1726483573,1963211805,-2146978811,-1092090900,
                331644957,-2013249304,502196263,149446,838878863,376897472,-1070414947,-2147064182,158466812,1317077428,-352321258,-402607079,118095893,28577908,41226408,119804676,
                41157420,868418228,106859227,9487233,-95203133,1139146928,15401195,-662028060,1088684267,11597962,15418342,1088684267,15458442,-528072476,-2082985133,1985685755,
                1482423269,32946883,-387014480,132670908,-425152407,-189072508,-33690621,-33686019,168764668,-352095040,-326922170,871140109,-992440640,-1207928778,-661782464,4196038,
                239528191,411334,476870,-973045528,-402586042,1187381369,904396805,-424693666,66239108,-2131882832,-268419290,856540291,-1948742720,-1877079352,-33393664,-1858204987,
                -33393664,1961691845,-1060241908,-847247643,271452161,1994979840,1967171612,473425968,-390012790,266633220,225762058,-1897341818,-1828293376,1946192104,475260948,-863969142,
                -1165053920,-1410858896,-423327213,-3933327,128976246,-1273201688,480176275,-956372760,1187381255,-1444401147,88524381,1570957320,-1243085641,108956188,-1189302296,1172875371,
                -503024371,-399250439,-1460863289,-2146732784,1946158462,89062950,129291243,2122318256,91553797,-350480152,-1332497401,472049665,-1996581656,474146855,-1879506453,1019413830,
                1007318016,-1341885183,-1341985901,-1008715257,-2065265744,15401195,1913285096,1963277339,47632,-1179267653,1357381679,14870582,1946172611,14346246,-1342133783,-1333467514,
                -1184831745,-397343768,-463915803,1963042916,-369892859,15401125,15401195,-96706332,-488503948,-1342139159,-1182472569,1692668808,175440296,884467793,-336338343,-2001694594,
                1625588966,57977404,-1332716821,-1333467511,-1184569682,15466495,15401195,44590308,-220068492,-1181729045,1692663818,158663080,880535633,-336338343,-427118554,-352261244,
                1348527104,15401195,1692839344,15401195,1692664043,-193658200,906553432,-1332738325,-1014700403,-1912586056,302940376,12254976,-1241728256,-402647623,-1195166345,-661782464,
                1183360,47871,-1179250245,1625817124,-1364147403,-4627226,-352261121,-469701888,1946331236,-1158487536,901447680,2079158,-348832024,-2135899138,-1380940570,15426790,
                15401195,44590308,15463541,15401195,27813092,15403124,1625555179,-2119111445,15434982,-1431306005,15426790,15401195,-349761351,-352261376,-1469783040,1359574273,
                1496558824,250342882,-2065268048,15401195,1430020324,-2085612940,12223718,-1237992704,-402645063,-18139957,-2065267536,1692819632,15401195,1692664043,-193658200,15424944,
                -1966907162,243213508,-792766713,571795,-127947022,-152501388,268483328,-469056557,-738762631,1975057536,-1777928664,326369792,9840256,-1775861513,116849920,1946288152,
                -2143425733,-50325466,9832182,-349342712,-1644396497,116794997,1946288278,-1775861741,645987072,-151191402,16783366,283840116,1582720,-1777928450,74777600,1515041,
                -58670087,-165710536,33592838,243272820,-2146959210,-50293210,243271147,-2147352552,134223630,-58670087,-165710563,33592838,243272820,-2147221354,-50293210,243271147,
                -2147418088,67114766,512082937,963969047,1515017,1509110,-2144439036,628445948,1509110,-165120760,50337542,116787572,1948254231,-166794487,536876806,645924724,
                -343998440,389951492,1392279552,-1007091340,908729656,1178942034,1574646,-2146536188,67115022,-393936712,365778690,-2134640315,-83879898,-343604808,8240110,-114030360,
                -1326402365,-401695741,-991407068,1962884195,8239896,871360592,1946172504,8239884,-1154345496,-555220867,-2134640333,41287676,-58669077,-352160428,-721649505,-1343552907,
                1967520896,-1872434429,1975057536,11200771,1966603392,12511491,1968372864,14346499,1967586432,14543107,1946307048,354826812,-385649408,-58720126,-385649325,-58720112,
                -385649396,-58720123,-1341819597,16640256,1966406784,-385765371,-58720013,-385649365,-58654881,-117279317,-154928957,67114758,116848500,1946681367,9955587,9832182,
                -166956016,16815622,645980020,-2130837354,134223886,1444210938,1048640325,1946288201,1228832775,158663424,-1090144176,281870771,403109464,-109770752,860931065,419858112,
                1958773760,280684547,-375461032,-386245930,-369404454,116807019,1946353687,-1777928564,208932864,9832182,-2145881086,-50293210,1438181626,-83505851,116835321,1954545688,
                -121374462,386332355,-143391744,1509110,-1326418936,9890290,1509110,-152800252,134223622,116841845,1947205782,-1777928692,-814480896,9840256,1896775933,1088978944,
                1743321601,-839170731,-339725541,-843074459,-101895408,-15603261,863560714,2084306048,1157398574,-58709122,-2147126185,527784188,116798640,1963458583,-164450251,67114758,
                816852085,1509110,-1339853565,-132125906,-164777789,134223622,598742133,1509110,-1341426428,386332185,41222912,-536690638,-840384462,180615439,-1978697500,2085043396,
                2119384068,419874311,-1007157248,1194116234,780641979,386332375,1316292608,-158878786,67114758,116800373,1963130903,386332203,259334144,192687676,1967979648,-336547836,
                -155176446,33592838,645924724,-1325596522,258926816,1139523634,1509110,-338332384,-255203102,-646782838,116798699,1963065494,1949187119,1965767824,3729418,-256321931,
                1020193614,-401967827,-931856342,-347410248,2083531968,421956287,-1576348416,-1007091687,9840256,-2015510787,915126251,909836314,-1012072420,1509110,-167414776,67114758,
                -1577411389,446890112,1876736,256014,-812645653,-436162365,-1643989884,-1001222,-1192230641,-661782464,78144740,28339829,-1431272218,-4627226,-352261121,-469701888,
                1946265700,1012982790,-502959019,-1874859028,-2065300816,-2065300560,15401195,-2065300304,-1897922376,-2116340776,1968548415,-1756447480,-1607532754,-435834710,-939476860,-617359218,
                1437220737,1321011317,788475543,112241316,1085834470,-1193767424,283836416,-2065299536,1894158256,15401195,1910767851,-1884235637,15429862,11534571,-75468314,-385649399,
                145756300,-75463450,-352094966,12095536,869830384,-1435189550,-1409283143,-290664310,162593250,-75463450,-1291684341,-788581888,-1215615261,1085844106,-2585088,-435506970,
                4241540,788519054,196083815,548439270,-370466586,-2065298256,-215719452,15401195,1642463467,1894125232,-58931,-1,-1,-1,-1,-1,
                -1,63498751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                -1,-1,-1,-1,-739639297,-253,-1,-1,62646783,1947473896,1227262516,83656704,-58717582,-2143063232,1047922412,-1962885144,
                -2097126634,-336853310,1963042816,-336790791,1946265600,93005561,-83868023,1227262659,83656704,-58717582,-2146471104,175507180,637570024,1183384971,45728512,1090289672,
                79233916,10020880,-611400820,-745736309,-779369586,-315437686,-57941717,-1946007576,-1093103928,-2135295378,285114368,12126325,-877478399,1256721899,856192305,-975663424,
                -1962864586,7661820,-25154957,858092560,-975663424,1342209078,-1933013933,1539521499,-2096794280,208929022,-2135294837,5040128,-2147220878,-315437430,1183441155,-125058304,
                -13443190,-150975327,-774861853,1352633315,4890624,-13441034,-523123965,-1013464573,5250699,-628698573,-271451253,-83628079,4800128,-788368634,-1007025182,-1948284074,
                -1964166463,-372222258,242526195,63867486,1224444913,-111218827,1582827499,-151599573,-1715944456,-1707238970,192348988,-259267534,-13703471,-1013341532,-334248262,-1912449397,
                317198406,-960838912,145288211,-1746401931,-402396416,1438843080,-141877498,-1007222989,-1090292735,-359985152,12193972,1007101112,-1174178557,-1030836224,-997534325,-152532072,
                -1963457566,-1946209569,2044537811,-1159034110,1240212422,16769409,-301462463,-997792718,-204633263,197888932,-150570551,-341117991,1508967170,-997528862,1575941924,1364414659,
                600226386,-1325694740,78840437,1957821312,83591183,95489399,522511314,49005322,1525551156,-1017619623,1381061456,102651734,-661733325,-2135357257,-992857344,-402583490,
                -1070334123,146266254,-1174372167,1053032576,1122500732,1595869183,1532582494,1397801816,1465274961,280430110,855703737,-1928917294,-389303746,520617761,1499094623,1388533851,
                -960831350,-31134685,1950416000,1962704902,201684472,-116870143,1522830062,-1169010493,-1460923450,-1017619960,1235243600,1946631168,600226310,167847148,-1017619776,-24488106,
                -793978230,637762044,-2119563982,-31457337,-32672561,-2115275317,-2095054873,-521449273,-498639265,-24460329,-793978230,1377532412,-1979709255,182505712,-1978365200,182505666,
                -790441520,-488451632,-2119542024,-31457338,-32672561,-2116848181,-2095054874,-924102458,6725827,158727946,606069632,-339539232,-771378933,551780579,-1022697692,-2097125726,
                -1007811134,1692838832,15401195,1692664043,-193658200,-469736263,1963042916,-1897377527,-203269846,-1934619157,15401195,1625588966,-117314568,-61,-1,-1,
                -1,-1,-1,-1,-2040935703,-771804421,1352109027,39225600,6295179,-956019063,70,-301027133,-352261310,-527766528,-351293366,-301929728,
                -352261310,-3937280,-1,-1,-1,-1,-1,1358954495,-1595531088,-821375656,-434065328,841016992,1492182720,516883149,4241488,844683406,
                109509312,243990640,378208366,536543340,509751017,4241488,-1980049266,-1996460530,-973050858,28678,-383821573,417882643,-402608128,-259369978,-1572176,-1329034669,
                1408821252,-118888310,-99962783,-1470894616,-83659648,-389811221,11599855,-454498678,-1979535277,1407052001,-443939664,-1336682776,1405675531,-98303476,41210500,-1974468340,
                -401887008,-380087361,-1125621321,-402149121,-796240982,-1545074512,-1326413229,1402791945,850446474,-1974233624,1637214696,-1191208216,-1863843834,-1979207597,1401546978,-427161424,
                -1336704280,-387872247,196105083,206794216,1358636034,196141194,1481861864,-443927888,-380411160,-1325768357,1397811211,141828264,-1070375941,183033,1072171696,1971365971,
                -1979600649,1396566246,-511048784,-1336723736,-387610107,-1578872017,15466020,-1578762005,401083312,1344277587,196141194,1481840360,-94302487,65538992,1356801107,196141194,
                1481835240,-396297495,646447296,-469106623,1317078388,-1023409898,-1979693430,167788838,-2130348828,71246,113703619,-1325465536,105810448,202170578,-1173993974,-1964112910,
                9150688,-1173952320,-1058143241,646186220,812974143,4138632,-38209285,1914031504,-1317162973,1552557576,25067530,-2146929661,1963262334,973451522,-2046659623,-1947994407,
                674556120,-1169046533,-1128725516,-243144704,1971366124,-1325997562,-402330752,1122824563,-1017560920,1168178314,88484352,-165224240,-662043548,704661152,-165279930,-1023277980,
                4654594,-1979431382,-222641177,4169731,309595940,78178512,61866612,4138634,-455998287,135054346,619204846,645945585,201326654,616164868,1040643828,175472640,
                -487518488,-109005580,645926379,-394330050,1189630173,-1008455087,-150990664,1174604902,13795330,-351475974,-436147456,-339442172,-436147456,-1950054908,-423458088,-339637375,
                -436147456,-339442171,-436147456,-71006715,125733571,167962560,-1914173826,92178958,-1022457880,-1662480464,-345971631,-1342117120,-396040672,15420716,1692664043,-160169560,
                15401195,-527802140,1342491776,1481446376,1692819632,1292560464,-423327144,1292036192,1692860080,1358818292,509038931,1619974,113760398,74,1946222464,1277069337,
                4765696,-1070350194,864026809,-1410073345,-1006710786,520610539,1482381663,-534425405,-1031563776,-293556221,-1325143421,787403524,-1607039861,1120176878,1480737518,1257119524,
                -289394102,96633674,1122011884,1381024748,-1763179600,-1223855104,596764688,-1219885452,596240416,-461088422,-2091774603,-1964243518,1522633440,-1979520018,28361665,1946184936,
                7454297,1249846400,1522074039,1350611968,1139146928,15401195,1088684267,15451270,1088684267,-125057914,-947590056,612643701,-1336924043,-347871744,-352261376,-2042567680,
                -352261180,-2042567680,-131377212,1562443649,-713926561,-872498718,-863981451,-339725696,-2082436599,-2132015638,-2084364572,1122895042,-383731902,68625143,25166592,6291648,
                1572912,1364393996,-1879000840,175314381,101367859,460652686,-1070393621,-1191177029,101381156,192217230,-487643416,-277525515,-956727116,36358,-1463592103,-1274776544,
                -1475351604,-402295807,116068043,57935016,-1007087180,-1899459554,-2147434792,12182578,-536695680,242547682,-1152384838,263828863,649979904,-1021313301,-2080955142,-2031221566,
                15418080,-2081554197,-466483734,1122944138,-340998914,-301929728,-352261302,-1187328,119584997,856049550,536918527,395029491,-301774966,-6657,-536870913,151135490,
                -162463958,-2144925681,35979999,1358899721,654839798,620945216,-15003902,135263828,48169039,705233445,267800831,-545239288,151135490,-162463958,-2142304241,35979951,
                1828657938,1325928438,1611565312,4825088,485031460,1009677391,858420482,-975466789,-2147453898,1963792764,415364892,-1961462504,1625522649,-389707168,-393609199,183026058,
                197691904,-401951541,616759359,-166808561,-773271068,350802408,-8338688,-2042071289,-771804421,38702051,5279625,973103776,863307590,-2034224302,1244067781,-1580727552,
                -388956082,-1269118973,-289109490,-339375550,-301929728,-1966801334,-352261180,-1975325184,-352261183,-1018499584,1122944138,15451530,1257111787,-997538562,15401195,-1047903506,
                15401195,-436253970,466623440,466674371,-11265072,466623440,-376963419,466623440,466623440,466677591,-129109915,-329648063,-128325831,-271390674,-420288615,-11272594,
                -257622189,61383,471812759,466623440,472390608,466623440,66591696,62653176,41419640,336860180,16843009,4063262,-2065289040,-1912586056,320768960,-315401728,
                12501043,-1895877856,-2147436091,-981357581,-298119168,-1202524302,-1064435648,1253001,-1064386509,-1191149377,-930348976,782391486,-119362651,-1064386509,-1191083841,12058632,
                -492066048,-432951044,-1900006524,-1572290880,-1191067457,-930349048,-492067538,-432885509,-1576485244,-1191182145,-930349024,-492067538,2126469115,650130176,-396425847,477449587,
                -1077375913,-953810820,651932165,-1090370167,-953810672,653946373,1593984393,-2065288272,-1912586056,302037720,876380388,-796261771,7476873,-2065288016,515477684,870003456,
                -389772590,-796242634,-989931005,-1347357726,-1974654488,-391204656,-259371742,309646139,401116848,-1975514035,-393301792,900746519,917538022,12289254,-1898411008,-432557888,
                33667716,1007625452,-2147257329,951062735,1522435302,49058,771752633,1111659181,1962884332,46628871,-1416476086,967896546,1589544166,573346,771752889,-152268115,
                -352261168,-527766016,15401195,1975794412,1086816261,-471684206,-2065286480,-1079876418,112787576,-1523649792,-109721211,-1912586056,270436824,-432295936,-221910908,8851072,
                -393301996,1084771446,-1380970891,-1471386136,-2147126267,-83851482,8652486,1085850392,-388461056,158529374,91555132,8857216,-1007893509,-469056530,91816820,48874489,
                972849153,-594872449,-1976631502,-158907257,134223622,116844661,1963196439,-159439850,50337542,-1645673612,386332160,1668562944,-2147448855,91557884,-342622024,905740388,
                116789621,1946288278,-1775861750,12123392,172944277,-2142406464,1282671612,1947139200,486309963,-58701196,-166038217,268473862,116798580,1963065494,-1778337787,645932011,
                -335740778,2116041761,2086747146,2105228323,-165731297,33592838,645924724,-1258487658,14608608,1924449273,-403980238,-471105616,-393752642,-613227977,1631382251,2050807164,
                539808127,-58667541,-2133429193,242562556,9832182,-2146995198,-50293210,-58670101,2131325967,-2020987381,-1477736578,-1544830926,-393769282,-1686969865,1509110,747926848,
                613477152,905740415,116789621,1946288278,-1775861750,-1531642624,-2138027029,292887804,9832182,-2146798590,-50293210,904636084,268206224,-1514928779,1351625707,-913521526,
                230277518,-1073967104,-1359829579,1008890968,-2146143200,310117116,2081356928,2086747151,2138717193,-390057467,-1007091688,-344537984,-336547596,437125618,673651739,875768617,
                -1946536139,-1996481482,994461188,1962967606,-2143909116,439761664,-1995344896,-83878858,1162152424,-1862092720,-1017637427,2109427963,571729920,-1482374312,-1455161312,1610285112,
                1086279710,1021283840,1949792001,-1610156511,779419904,10489472,5629953,614589690,-352261122,-73275904,-134209304,116790763,1962999968,200013827,-2147474456,-33513434,
                1492713963,1595867316,-100662582,736627632,1346374730,196141194,1481255656,-1325743109,1243146251,-1974419676,-401887008,-78099945,-1742829117,-1710846976,-1676244736,-1643214592,
                1610334976,4241438,116840590,1962999968,-1610168784,106103040,512606350,-790101856,-94697473,-31153692,15401195,-386162202,116850585,1954545824,-1608089351,-336036096,
                1595930881,-83885366,106979167,4241438,646568078,378273895,11534441,-386236186,561333568,-776994581,904422630,-350849723,-421548032,1160439904,15403893,1692860336,
                1950687208,1627856646,-70319180,639655053,-63545,-524171124,1200170500,-1043821566,-2010772248,-970587065,-1919285945,-953800612,-1929380089,81838544,38242598,-389951348,
                1200104972,1204168196,1443271173,-1064384372,-1452788083,-1962893080,10741968,1552746334,1468605960,1200104962,130491908,-1325793025,-402017137,254167311,2062032641,1200170496,
                8120322,71796774,-16267482,1204168447,254185989,17766145,69088,787480847,-1510592769,1032243,2668752,280547470,-1193767424,-1064435688,871773180,-436162305,
                -391777424,-22002596,-1259051802,-1469979646,-1476102848,1310356608,76238926,207094921,-435942392,-352261279,620176384,-1268652293,-423327231,-1932727424,81838528,1371784707,
                -963919476,50653377,216580545,1085850457,-1898410496,-1962907370,-402626778,561333252,-776994581,-102210330,-350849725,-421679104,1139730528,15403893,1692860336,1950606312,
                -435965948,-436162432,1627856752,-2132491130,-1957313402,1977879276,107381004,1317142526,-352305146,107381002,1317142463,1560281350,-1335926833,1208281137,816898186,-817365528,
                -94412805,1967365096,-1342117087,-396040495,376783760,-542113557,-2048368410,-351570621,-419450880,1132128356,-4979084,183033,1552765947,130491960,-930283521,637853889,
                -1946007671,216580552,71796774,88589862,-1325769830,-350165487,-1979651328,-350099769,-1342117120,-350099964,-1342117120,-350099967,-1342117120,-350099713,-1342117120,-341776879,
                -1979651328,-341711165,-1342117120,-341711358,-1342117120,-341711359,-1342117120,-1918769409,254150748,1552750337,17770000,-326413025,805586631,17784064,69088,787480847,
                -1510330625,1032243,2668752,414765198,-1193767424,-1064435680,-889658318,-930349054,-172244850,-1010813978,2140107,34304,2140107,34304,2140107,34304,
                2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
                2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
                2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,
                2140107,34304,2140107,34304,2140107,34304,2140107,34304,2140107,34304,-1,-1,60746239,287310065,69273633,-14614239,
                1889604000,27329185,-1200816223,-1102530452,-1747665326,-2126997558,-2126479040,-1749178354,-536870909,-939524093,-1192414434,-986513407,864026809,-791568641,-453254485,-351531935,
                -436147456,-336386975,-436147456,113505,-980689613,-164421882,-1635778375,-1398811695,-507301306,-468093450,-1329551263,-787385088,-462207266,-754404962,-1350939181,-1010814177,
                1342178502,202138084,15401195,-215719450,15401195,-1957076506,-1007083562,1946247144,1228832817,124912640,4800128,-399543033,378269196,-1031602077,-320828922,27787499,
                -319096459,27787499,-997525132,-486848598,1048626154,1912864841,1228832775,1433732864,-1427252248,-1006837177,1946227688,1228832818,124912640,4800128,-1975880441,-306255645,
                6493835,-1962491261,15461592,-109772376,15461626,-109837912,-72629365,-2134643742,67127614,1048577906,1963393097,-387741176,-1410077300,-307697469,-1979294070,-1946138306,
                -1092972854,-466433102,1933639552,-93405668,175685642,1964928232,17874448,2092828139,863970304,-975532334,-773795532,-2132749856,41042175,-268181295,1929838464,283935587,
                106415243,-946940020,-125086895,-1258036352,145861640,-489561391,41148624,-906046710,-963972491,-22289782,1541830093,-1939929254,-1176990000,-192217084,2046546093,87238147,
                -20479573,-70210273,858129273,-276714747,-454942798,20901761,-2082966198,283840708,45802378,1090486280,79299442,-292755440,-61,-1,-1005393153,116846592,
                -1023147897,1183449524,374243584,1388511233,-1476378392,-1329374656,-1341985904,7387664,1123521000,-1007186968,-1054638,168187530,-1073515054,254018792,125091850,58131516,
                -117314568,-1092041894,-165180702,-1329393468,-1341985906,7387662,1123506664,-1007201304,1054347,1946272502,-1058897902,-92272268,-1308068544,-1308103934,-1308366079,-1966868224,
                107383548,57992202,134537408,-1979674874,-58014745,168191626,-1073515292,-789183264,9373216,868476810,9412800,168191626,-1073515292,254084328,-1974418688,115916996,
                -301729862,-1979675744,-1061149480,-1007287064,201487361,-1058766847,646504458,-1017642869,1961927656,-500569861,-1712798740,-386173456,-947199457,-1960393746,-386169316,-75038740,
                -1006639128,1087039568,-571979081,125733631,167962560,-773323138,1105848575,129569141,4374272,-1996506648,-119388411,-2013264152,1476411686,4366531,661962920,74713256,
                569082036,4400778,1949353206,-336801788,63239700,-989985676,-990508053,-1274907520,-1274877180,-1368210688,-1364873577,-1339183193,-1298878370,-1331907948,-1364873005,-1321554009,
                -1298878110,-1322470764,-1298877942,-1305103724,-92229023,-854428800,1436307520,1183575179,172394754,-346514083,102654024,-326434710,1981152384,4241418,1474877582,-2127631612,
                -124314,1724033,872217346,-992440640,-2147417034,74744058,18364100,-1912586053,-1965519909,-472836770,-426246354,520554413,1720242017,1948682261,-855592448,276725824,
                -2146209152,2004947070,1189472269,1929568488,-402279419,-1597818510,1183318132,1948682260,359041024,822798531,1374180210,639676474,-1073199882,17564276,169180800,34345333,
                1149904464,1975519751,-2012958718,-1571291066,619184200,-1950183932,-2139113736,1946817918,1975781894,180813314,1720194150,973370369,-1274775834,-397743351,1239953637,-398298383,
                1030882255,1927870602,-2146274319,175378940,1946732534,8185900,-337106965,975431736,1877483378,360611840,-402295542,292684786,1963020030,440858565,141885441,-348602136,
                952428547,33012419,9216748,1051331,1075838980,32619010,9282284,-685498188,-1101655948,-523194547,-347733134,1588342521,-1918836602,-315440384,-402633078,1357438995,
                -401575421,192035261,-1394897378,32553503,-1008147730,-1174339399,1844642288,707406531,707406378,-402416407,2104635400,-1338421272,1156982320,41205768,2122318092,292883221,
                642777612,168248458,-1342016064,4622340,4760152,-1241308440,360611967,168195083,-33393212,342231750,1946248840,1994799620,-351685628,803727412,-1962737944,-386888742,
                250100033,360611843,-402295541,426966888,1928344552,45738004,1592266610,-32869648,-613088946,-348661528,937224195,797108419,-907532174,641773624,-1073199882,17564276,
                -402634590,-35115111,-401640721,175243907,1928341736,933750789,-1410858005,1374208823,-399150545,-1977206632,1134693956,1208403456,1793609728,952887343,2095586930,-1948611838,
                42985712,1928314856,38135823,-353891726,-402296081,65746793,-1019777560,-1575729527,2122317940,225870096,-1995290999,129241158,-348695064,76228125,-528070584,637984960,
                -1995553782,-1977216442,-855768476,-1996458592,-389869498,1349660380,638606986,-33391478,-1597013809,1946272758,282034179,240945702,88378150,100853953,1119815454,-1014322688,
                -1442729814,-1431649142,-961886326,-402157307,837299917,-401640721,175243703,1928289512,920381445,129238507,-1019814424,1915651048,919332869,-806878229,1978188598,-400592338,
                113653692,-395313080,-102224235,-401640722,175243647,1928275176,916711429,-1477966869,1307099958,-2146929874,57999868,503355369,-661733325,17053380,931325983,4523718,
                1174849024,645922816,-387973049,-1599078077,-301861190,-398997528,-1041694808,1967030327,393347584,4656768,19261456,-155537232,-1444352511,-7673801,-2127059992,-124314,
                1394374,1917021672,-1070391749,918870158,-1289813756,-16521088,904407666,-2145029632,33584446,-336067725,-1070391776,918870158,-1289813736,-18618239,243272306,-401604537,
                91422736,-1571404,-1511472331,-400592339,113653484,-401604536,703081925,-401640722,175243439,1928221928,903079941,-672660501,340166709,763029699,-1041751182,1208403510,
                -1696034816,-302061523,-2065165454,-401706496,-466420477,1007961737,-1274711039,900261920,1964935875,-2134114816,1579843779,-1995738352,1183388742,273058066,1187453419,637730836,
                637682826,638477558,-146072437,273058275,-1022208375,1328838,1720189364,1948682261,441352448,-389873663,561119271,605046410,81838081,-155541492,350809601,-1475448320,
                -1274776544,-1475941428,-1274710720,892922026,-397323325,-12780433,-997849995,112924651,-198919936,242516136,-388192536,-186450857,-1259440821,1532623232,1095875,50489079,
                -763359674,-490647552,82362636,626577419,516096015,12180366,32553473,-1021349901,1317727538,-597039104,1929357032,907274252,-256243854,-492114943,707445740,707406378,
                1344940586,4241438,113694862,-1325465458,-434051552,-1862223712,1478432205,-386431025,91617581,1945715176,-111482834,566115188,-105649996,1349779880,-390846786,1066064905,
                -410984566,83853318,817774196,-1058832204,733886068,-1104024652,78951457,678743294,611633406,-351943037,38193139,1187446784,-973078524,-956299450,3142,673479,
                -120854528,1240153205,1928926696,206474460,55872302,856315529,-122427173,-941094283,772109048,-13493110,771907209,-2013107062,-1976695442,1317536076,122078724,-121182207,
                -2098720907,4161755,-142145675,-2015592216,-120788745,856053384,375816640,-142082050,654901699,251830523,60888399,-1591587063,1011814916,-1091074143,1451996362,-128980988,
                1676160885,1009152760,-2095418367,37488326,-964490636,1946369036,113672972,22297390,-964487820,1413164550,-351505407,1946172469,1413164584,-399084287,1065409293,-2029554432,
                -603199241,-1976633465,-85458092,-1944614694,-1959916466,1451820116,375816458,-1070399487,1317082347,-1275068138,-339725812,374243610,213123073,-823607246,4161754,-142145163,
                -607393712,-2013821096,151110647,-1594125529,1948715266,251830536,-1592453809,-1756428029,151232802,-1590716593,391057924,808558908,2035494194,1835365491,1634681376,1176527986,
                1970039137,168650098,758263857,1953724755,1864396133,1699553394,2037542765,1634681376,1176527986,1970039137,168650098,825242144,1835355437,544830063,1869771333,808591474,
                1699556659,2037542765,1684291872,1936942450,1920091424,168653423,1769103696,1126201716,1801676136,2109728,1769103696,1126201716,1801676136,2109984,1061109567,822099775,
                1378693424,1159744847,1919906418,874514957,1294807600,1668247151,1836020328,1681989733,1702129761,1631985778,1920298089,537529701,758198325,1886611780,544825708,1885430849,
                544367988,1818845510,224752245,808656906,1699425585,1634689657,1159750770,1919906418,544370464,1953719636,2020165152,1701999988,1936607520,1819042164,168649829,825242400,
                2036681517,1918988130,1917132900,225603442,808656906,1699425588,1634689657,1864393842,2035490930,1835365491,1768838432,1917132916,225603442,858796810,2036681517,1918988130,
                1866670180,1869771886,1919249516,1920091424,168653423,825242656,1769099309,1919251566,1920091424,168653423,825243168,1936278573,1953785195,1866670181,1869771886,1919249516,
                1920091424,168653423,808923424,1766206769,543450488,1802725700,1920091424,168653423,825243424,842020909,1126184760,1869770863,1936942435,1159754351,1919906418,825241888,
                1328498989,1297044000,1920091424,168653423,842412320,1937330989,544040308,1769238607,544435823,544501582,762602835,1853182504,1952797472,220819573,538976266,1850286112,
                1953654131,1095320608,1397706311,541280596,1802725732,1702130789,544106784,1986622020,977346661,824183309,1395470902,1702130553,1884233837,1852795252,1917132915,225603442,
                909189130,1699556660,2037542765,2053722912,1917132901,225603442,909189130,1767124275,639657325,1952531488,1867391077,1699946612,218762612,1378361354,1297437509,540876869,
                573654562,1497713440,218762537,808656906,2035494194,1835365491,1768838432,1699946612,1769108835,1277196660,543908719,1277195113,1701536623,537529700,538976288,1851072557,
                1801678700,1937330976,544040308,1953066581,1667584800,1953067637,1867260025,168651619,809056049,1936278573,540024939,1869771333,822742386,758200631,1802725700,1159737632,
                1919906418,925960717,1143812152,543912809,1631985712,1920298089,822742373,758200375,1802725700,1176514848,1970039137,168650098,842544945,1936278573,1866670187,1869771886,
                1919249516,1767982624,1701999980,64489997,-256628268,1610659840,2012591,-1274824640,15782953,-1906310992,268444085,1894158000,15401195,1910947891,12123386,-1327984912,
                -433985793,-435375967,-435113887,-423611772,-430657393,-351096765,-436147456,-348737471,-436147456,-352276413,-436147456,-352276416,-436147456,-1173573568,-1326578702,-1165695471,
                145757126,-352261138,1084812288,-725788555,-740496968,62380170,-373760323,-1019554862,-662043020,-260714498,-1464336199,-1341754304,12185099,600226480,-662011728,-1930557428,
                -1093103928,-1047606350,12189491,-1096420600,12176306,-1968835832,-960827709,-300961749,-1339570502,28372495,-301745990,-658898512,-1162154493,-625284093,-1061491709,-289394173,
                -1078440261,28359017,-1947330677,1468662903,1227010,-373728579,-1031542928,-637894395,-1341950717,-11866576,-434982681,-1183597180,870805225,39291593,-2135093580,-395777607,
                -2129673341,1924689147,-434917190,16824708,15401195,-119357389,1139146928,-527810332,15401195,4014308,-1156680448,414823662,-1179140864,-351376151,-434851586,-427052924,
                -352261264,-469701888,-1979243407,-427052832,-352261264,-423327232,-426987407,-352261264,-434786304,-426921852,-352261264,-469701888,-1971313551,-426856224,-352261264,-469701888,
                -159374223,-527793980,-864024715,-434720640,-434655100,-426856316,-352261264,-423327232,-352261263,-434589696,-1171276412,-456797719,-336386975,-436147456,3192929,12374158,
                -434524159,-399972220,803771568,-1976556490,-1340190496,-393943470,1478440854,-58716300,-402426880,1404096928,-1746369306,-424824777,-352261276,-18176,15426788,44564715,
                -186511244,-1179241029,-1866661859,227797434,45743851,-345971712,1359014656,-401372997,-463926378,1946265700,-1142234608,498710069,-1162363648,-351441687,-379393794,-2065294672,
                -1328529688,-393943525,481355210,803767526,-434261811,-849352572,-2065293648,-1328064536,-393943521,548455939,1860732134,565246721,-806845210,-433934130,-808392572,-2065292368,
                -1328149016,-461052380,-352261280,-422531072,-352261276,-469701888,1946331236,-453842174,1946265700,610329850,-1963776771,-422465312,-352261276,-469701888,1963108452,-423326988,
                -433737632,-729945980,-2065291600,-1338494232,-1333467609,62831340,-433540882,902097028,-2065290832,839707368,-1266227520,-1978216975,1014753496,443876008,145815690,-940144922,
                -402295804,410334443,343202570,-2031695696,45616875,169266675,-1207601957,382595074,-672657744,1967171636,-399724515,1059337422,-299383110,-1008194128,-1963973580,600226528,
                168764652,716238532,263488742,11800781,1642336461,1812783242,-528064026,1642463467,-2065290320,-1813508432,1946462260,536918540,-1179166277,2028470298,614589451,-335600387,
                -352261376,-1197349376,-661782464,7472839,113644032,-1275068398,169266673,1007514816,-469338879,1963501702,194963459,-2146722840,-2147445234,9834112,-437716448,-420302801,
                -4588704,-1777928449,15409152,-169736332,9832134,-433278976,1612303748,1622148638,12092646,-1143435748,-1014104000,1763085350,646522368,113705063,80,-2065276496,
                1946496488,1343127817,-385871872,1655702117,113738982,8388722,7603911,1642332160,15404044,-1259839002,610395139,-436147213,1048651361,305397874,1755393397,7512832,
                1086050867,-1963723008,704820216,-497555205,-1560253791,-768409484,-150978373,-1275557133,-498866160,-1342108951,-393943453,124978621,-2065275728,-2121265173,-2147458498,-2129235200,
                -2147463154,1746832128,1646168320,1780386560,1679722752,8436992,6430347,512351531,512426086,-584384408,7085705,-320339276,1981713153,-2134671104,1914603776,1958742784,
                1343127826,-2013265664,-1996467666,-2013244650,-1342155506,-1954224539,-1996463074,-1962908130,-1996461538,-1962906594,-1275039186,28174352,7741067,7609993,309641227,5246593,
                780664834,378077274,243794011,-1207566243,-1064435648,-1962901315,64481477,7512327,-150732613,973254883,-1977846590,53340386,1946157737,1343127826,-2013264896,-1996466642,
                -2013243626,-1593812722,-1073020812,336756,-1327237372,-387806704,44630787,-2129497088,134238222,1580107776,1595312384,1628342272,-429477888,1914604420,512304640,512426003,
                -1330642828,2095637386,-1968066510,846588135,116850865,8388688,28377716,-1341867032,-2121996697,-2147454402,-1341230590,843901107,-527794164,1290318768,-150817742,-16756730,
                -1274907648,-526587645,-2065274448,-352321349,1789956104,29066470,4241408,378460302,646643817,-397213593,190515528,-385649189,1806696600,12092646,-136802788,16797702,
                -401181696,-315487956,5377674,243986827,378208341,1592262739,1342633732,1946158080,151971862,243985714,-242548650,5836426,5707403,-150712088,33574918,-401181696,
                -315488016,5901962,243986827,378208349,585629787,1342633732,1946159104,148039702,243985714,-242548642,6360714,6231691,-150727448,268455942,-401640448,12191924,
                -1259422976,-402646343,116852839,-65456,-1645739148,-429084664,1629423492,-662023229,-2065273424,1459405706,-1945756073,-1144811813,-611450832,-1077733442,196673656,128316160,
                -1973526753,-428953384,-1950119292,956328990,1979737630,1343127846,-1962901504,-1996462562,-402624994,512426060,507052144,74645612,7085707,7741065,1955606763,1343127832,
                -1996455936,-402624994,512426024,512295024,384499830,1873825936,-1990687514,-402624994,512426000,512295024,200802422,-117345088,1465107291,-428822522,1277593732,851741184,
                -1141339164,1085800448,-1950315008,27519173,7224963,-1207143168,113704960,112,-1332710933,-1199249807,-1064435640,1431787091,1575663080,1935367775,1278118410,112640,
                -2087694869,1476149443,512381777,146341964,872362752,500945344,-492109824,1277070070,47104,1946338294,16889859,1599691691,-1912586056,63278016,20441283,7216697,
                12060279,-1878463744,4982400,-1986729215,1342205982,-2065271888,1532954456,1364414659,4765702,45203598,28314037,83892200,1755512960,-1257197312,-402542339,1789067272,
                1532561152,1381221208,-1932490155,1276020933,-1144680960,-953810944,637534215,-16627769,654114047,-50585717,-2080572164,-970587909,6,1285556340,-339662336,775458839,
                175243340,704662688,-339673407,369135623,-1108672436,-524164046,1532648710,1398212291,-428691376,-4630396,-1560354049,-1152384948,-1014103992,-1979709255,872362968,500945344,
                1974403072,653582910,1642333578,108314792,-13385678,642202347,1642333579,125092008,29343794,858385152,-1174893632,-1410105344,-1912586056,96832448,-393543616,1476408552,
                1334845931,87172687,642188917,-997579470,780847242,-1957167028,7381957,45668235,-32707840,1994406592,-8722173,1526726840,1405290335,1465274961,-1191179589,146735109,
                -137219328,818053363,-1786181706,1330577528,-1090719774,12517496,768256,-1090738701,12517496,768384,1583326707,-1017423526,1465012563,1632342,1890781367,-1910767432,
                48832,365791668,1600054282,-1017423526,102650704,-1910767432,-54489384,12566579,309504,146713587,1325713152,469809152,-524157814,82821124,-1996488699,-679476668,
                75270144,-1845148474,410823,1097216,16712903,-1977876296,81838588,84209600,1149829262,14123010,-972784504,-946731708,1604,-1699493748,-402640706,12058706,
                -1097682148,1206386712,4241408,549360307,3991552,-1833709428,-402642754,12058674,-1097682000,669515840,536918016,1220448947,1894400,-1910767432,-1899459392,-2091925800,
                -1191145793,-784269057,128316393,-1017619681,-64313,-524157814,82821124,-2013117303,1552417916,105170693,1354956800,-873951568,1958783021,552335620,-392777584,-527815234,
                -1209494096,6464301,-1343711056,-1327461843,766044311,-134191965,-1336884392,765257870,-922034038,-461371787,-1878725649,-1341076352,764536974,-389850888,12190766,-1255359744,
                -402648647,-389872533,12190750,-1254245632,-402646599,818087003,805777415,805777415,1258758151,537346567,1258770183,-1176270329,-2064907388,1393653191,-402652741,-497351942,
                1976368881,-1014975254,868417716,268353472,-351958746,637594368,-1329396423,-386229234,-401724134,48955395,-1062678640,-90434955,132656560,65539629,-1878856960,-1023335217,
                -1329348557,-386229106,-401724174,48955395,-1062678640,-90379659,-538399312,65539628,-1878856960,-1023335217,-1014764661,-745604592,-1047600757,50602169,-1177448757,-1074003895,
                -876739840,-1523649596,990007457,1963087878,50373123,1963022141,2408202,-1410758728,-1079261044,1354236012,-930305139,-11290453,-1412920149,-1004092018,-1560276474,109838480,
                -1896152942,29316060,59095555,567087028,-919400469,512481678,-612040110,2028571253,1958742563,50510382,567085492,-854851144,4030497,96865653,1963801855,-853953530,
                608240673,1916877919,56206044,-2052976860,867429123,-1508996663,-1475442429,113721603,33555347,-1910582733,-853887781,-2051399903,-853036029,-611443167,1316491,265867,
                1363759647,-1274837574,1008848167,443897858,516434833,-1031679093,-628224032,448057907,-1172364851,666108805,280240589,1031807437,-1173588992,162792250,146285005,-1910387444,
                -1159885115,448004224,13312461,1225395456,1919251310,1329799284,1363234893,760433952,542330692,1802725732,1702130789,1850018317,544367988,1986622052,1886593125,1718182757,
                544367977,218762532,1768247818,1919251310,1768169588,1952803699,1763730804,1919164526,543520361,1718165569,1667591712,1634956133,168655218,1769108563,1629513067,1797290350,
                1998616933,544105832,1684104562,604638585,1396785664,541147977,1163412768,-92013824,1242002432,-2035019916,-466435079,-335412806,-1930825692,33667584,1007625452,856323343,
                870003648,-338545719,-326937224,-1997763826,-386269114,-108330899,-940699728,3142,-1995678069,-527824290,839853292,-1961789984,5236959,1586092331,173947660,753656439,
                1055448971,-153539840,57934276,-167616887,57934532,-167485815,57935044,-167354743,57936068,940072585,-1267400634,1532516603,1566399065,82362717,-1056642111,-356449047,
                1355020292,1139146928,15401195,1088684267,15401195,1088735370,-1017583478,-1,-1,-1,1793720319,1392513028,-402652741,-1017446398,-397324203,1482227716,
                -880032931,11598492,1088701414,15458442,1088684267,256014,-812645653,-661928826,11598492,15418342,15401195,-527810332,15401195,-401719068,48955395,-997798000,
                -2116539565,1527337211,-1193093518,-1328837693,-465312256,-337606080,-469701888,-1950054848,-436162344,-352261309,-469701888,-337606080,-469701888,734299712,1358660056,-503025143,
                65404878,-2015695912,-772984078,-2046659874,-1948855831,-1176073255,-355270652,-1107295559,652986085,-2116777072,-1191181854,-188874748,-1877480506,-2010767184,-1434451835,-1177318585,
                146669572,-1878791225,-1191385601,-1064390656,653733522,76727853,1075062672,-2054674905,1202356224,-419435806,-623776462,-377093518,1381094097,-490613109,178440,1509955816,
                123521,-402651975,548405261,1509994728,-402651975,-54329343,653733522,76727853,1075062672,1347506727,1476433128,-387818919,1085808323,-958886400,-16772602,-162442465,
                141869254,-2147462936,-202686226,1949353718,2746376,-351211904,777738739,-397211766,1130037341,-1966869022,1390957319,-498902272,229688310,-1342158616,4450314,16432067,
                -1157610264,1877475584,2109457406,3663872,-402620997,-1144783262,719848224,16825088,-1006742040,78768266,115927250,-389707264,616759297,663749647,-400080876,-1144848383,
                246677511,-1329393459,-1337727306,-1337792968,-465377787,-436007839,-31659935,-64724508,868442598,12123391,784371376,641927050,-2147449464,-203274326,856090111,12123391,
                -1967092048,-2010758393,-1434451835,133489223,-393301821,-527816666,535336112,1963042856,550273027,-1062681462,12194676,-1227834592,-402630983,243334907,-335609838,1948297282,
                536918545,-1179201349,-454557610,302940414,116850432,1962999824,536918545,-1179179333,-857210853,302940414,279510784,12194164,-1220429024,-402646855,243334839,-453050350,
                -352261280,-1342117120,-345708864,-352261376,-1469783040,-352160766,-352261134,-469701888,1946265700,-1470044940,-1173260928,-1950670848,5618103,-2130806040,-16772594,-2081886925,
                -1795067182,855647464,302385856,-972655360,4614,47811,-1179159621,1357381656,87856638,1055451508,-85660928,-47963676,856039910,650153664,2367115,604423974,
                -70689280,-51910573,512304731,-1341718492,-463149472,1963108452,-431640326,-464469152,-434065312,-1261479904,-2145989376,-143311876,1239480771,-744383839,1391855003,-1819962142,
                1754817669,1638603947,1224300699,1954870777,30081506,164299211,-1449547573,1334071241,248116100,-909526582,1996831945,-1947979253,786878960,-912415489,-2027519805,-620040448,
                243271029,-133169017,-620080445,378212980,-1031602077,6660100,1705117708,283897344,6493835,-1610300797,-148635547,-301963870,-389810086,359989325,-960867760,-410325997,
                -2147160960,-131856412,1525597194,854115160,-1171294976,854334406,-754667036,-1981230368,-960888250,-789124073,1183441970,331790852,-1462029332,-33393656,67577031,-1982297596,
                -389872034,645211691,-960867760,119860243,54322226,1048578932,1963393097,-339411443,1228832777,41158400,-469056258,-3975078,-1,-1,-1,-1,
                -1,-1,-1,-1,-1,1358954495,-1595531088,196092134,-1977230872,-401821472,-1004395054,57950376,-1476391192,-402426848,-816316414,1481297232,
                508776643,4241414,116840590,1946222752,-1674673877,1929629696,-1641118941,477298944,196104280,-390077312,645932443,-1577189216,-1064435558,9969291,-2146467802,1482366727,
                1227262659,23496704,54271683,-1979295113,62130046,-1957556019,45351510,1317736653,-1959337212,1183517814,-52916720,106859436,16809600,121377654,138153844,171707252,
                222037876,-1399651468,1344164243,-1912586056,484989144,-497475840,-1979229485,1190528894,74776832,281871028,1227262495,23496704,1946631363,1946696759,1946827827,1947024431,
                112939,281872820,281871284,372949758,326434890,-956378574,1964637824,-1328611830,-854674422,-1261293040,-1022309118,281874100,63979,0,0,0,
                0,-2119859842,-1715633791,32385,0,-2359426,-406585345,32511,0,-26476544,2097086206,4152,0,940572672,947715708,16,
                0,1010571264,417851367,15384,0,2117867520,410976255,15384,0,0,406600728,0,-65536,-1,-406600729,-1,
                65535,1006632960,1715618406,60,-65536,-1006632961,-1715618407,-61,65535,437132800,-859015118,30924,0,1717976064,2115517542,6168,
                0,1060323072,1882206256,57584,0,2137227008,1734566755,12642023,0,-619177984,-616765636,6168,0,-524255232,-520552712,32960,
                0,235274752,239009342,518,0,2117867520,2115508248,6204,0,1717986816,6710886,26214,0,-606372096,454786011,6939,
                0,945866364,1824966252,2093354040,0,0,-33554432,65278,0,2117867520,2115508248,8263740,0,2117867520,404232216,6168,
                0,404226048,404232216,1588350,0,402653184,403504652,0,0,805306368,811662944,0,0,0,-20922176,0,
                0,671088640,678231660,0,0,940572672,-25396168,254,0,-16908288,943225980,16,0,0,0,0,
                0,1010580504,1579068,6168,1711276032,2385510,0,0,0,-26448896,-26448788,27756,402653184,-1027179496,-2046395200,404257990,
                0,-1040187392,806882502,50790,0,1819031552,-857967048,30412,805306368,6303792,0,0,0,806882310,405811248,1548,
                0,202911840,403442700,24624,0,1711276032,1715273532,0,0,402653184,404258328,0,0,0,0,806885400,
                0,0,65024,0,0,0,0,6168,0,201720320,-1067438056,128,0,-825833860,-420020514,8177350,
                0,410531864,404232216,8263704,0,113690236,1613764620,16697024,0,113690236,101071878,8177350,0,1815878668,218025164,1969164,
                0,-1061109506,101121216,8177350,0,-1061134276,-960037696,8177350,0,113690366,808458252,3158064,0,-960051588,-960070458,8177350,
                0,-960051588,101088966,7867398,0,404226048,402653184,24,0,404226048,402653184,12312,0,403441152,405823536,1548,
                0,0,2113929342,0,0,405823488,403441164,24624,0,-960070600,404232204,1579008,0,-960070600,-858861874,3964096,
                0,-965986288,-956381498,13027014,0,1717987068,1717992550,16541286,0,-1061001668,-1061109568,3958466,0,1717988600,1717986918,16280678,
                0,1617061630,1617459304,16672354,0,1617061630,1617459304,15753312,0,-1061001668,-958480192,3827398,0,-960051514,-960037178,13027014,
                0,404232252,404232216,3938328,0,202116126,202116108,7916748,0,1818650342,1819048044,15099494,0,1616929008,1616928864,16672354,
                0,-17906046,-960047362,13027014,0,-423180602,-824246538,13027014,0,-960074696,-960051514,3697862,0,1717987068,1616936038,15753312,
                0,-960051588,-960051514,209510102,14,1717987068,1718385766,15099494,0,-960051588,-972277664,8177350,0,408583806,404232216,3938328,
                0,-960051514,-960051514,8177350,0,-960051514,-960051514,1063020,0,-960051514,-19474746,2649212,0,1824966342,1815623736,13027014,
                0,1717986918,404241510,3938328,0,243713790,-529516516,16697026,0,808464444,808464432,3944496,0,-524255232,236730480,518,
                0,202116156,202116108,3935244,268435456,13003832,0,0,0,0,0,-16777216,805306368,6192,0,0,
                0,0,-864285576,7785676,0,1616928992,1717986940,8152678,0,0,-1061108100,8177344,0,202116124,-858993540,7785676,
                0,0,-20527492,8177344,0,1617194040,1616965728,15753312,0,0,-858993546,209505484,30924,1616928992,1717986940,15099494,
                0,6168,404232248,3938328,0,1542,101058062,1717962246,60,1616928992,2020370022,15099500,0,404232248,404232216,3938328,
                0,0,-690553108,13027030,0,0,1717987036,6710886,0,0,-960051588,8177350,0,0,1717987036,1618765414,
                61536,0,-858993546,209505484,7692,0,1617323740,15753312,0,0,2093008508,8177158,0,808464400,808464636,1848880,
                0,0,-858993460,7785676,0,0,1717986918,1588326,0,0,-691616058,7143126,0,0,946652870,13026924,
                0,0,-960051514,108971718,31750,0,940361470,16696928,0,404232206,404254744,923672,0,404232216,404226072,1579032,
                0,404232304,404229656,7346200,0,56438,0,0,0,268435456,-960074696,254,0,-1061001668,-1027555136,101465190,
                124,52428,-858993460,7785676,201326592,12312,-20527492,8177344,268435456,27704,-864285576,7785676,0,52428,-864285576,7785676,
                1610612736,6192,-864285576,7785676,939524096,14444,-864285576,7785676,0,1006632960,1616928870,101465190,268435516,27704,-20527492,8177344,
                0,52428,-20527492,8177344,1610612736,6192,-20527492,8177344,0,26214,404232248,3938328,402653184,26172,404232248,3938328,
                1610612736,6192,404232248,3938328,-973078528,940572870,-20527508,13027014,1815609344,940572728,-20527508,13027014,806879232,1727922272,1618763872,16672352,
                0,-872415232,-662817162,28376,0,-859018178,-858980660,13552844,268435456,27704,-960051588,8177350,0,50886,-960051588,8177350,
                1610612736,6192,-960051588,8177350,805306368,52344,-858993460,7785676,1610612736,6192,-858993460,7785676,0,50886,-960051514,108971718,
                -973046778,1815609542,-960051514,3697862,-973078528,-960102202,-960051514,8177350,0,1715214360,1717592160,1579068,0,1617194040,1616965728,16574048,
                0,1013343846,2115534360,1579032,0,-858993416,-557005576,13028556,234881024,404232219,404258328,-669509608,402653296,24624,-864285576,7785676,
                201326592,12312,404232248,3938328,402653184,24624,-960051588,8177350,402653184,24624,-858993460,7785676,0,56438,1717987036,6710886,
                1979711488,-960102180,-553715994,13027022,0,1047292988,32256,0,0,946629688,31744,0,0,12336,1613770800,8177350,
                0,0,-1061093888,192,0,0,101121536,6,0,-859389760,-597675816,1041763494,0,-859389760,-832163624,101072542,
                0,402659352,1010571288,1588284,0,905969664,913102956,0,0,-671088640,-663996820,0,289669120,289673540,289673540,289673540,
                1437208900,1437226410,1437226410,1437226410,-579381846,-579347081,-579347081,-579347081,404282743,404232216,404232216,404232216,404232216,404232216,418912280,404232216,
                404232216,404232216,418912504,404232216,909514776,909522486,922105398,909522486,13878,0,922615808,909522486,13878,0,418912504,404232216,
                909514776,909522486,922093302,909522486,909522486,909522486,909522486,909522486,13878,0,922093310,909522486,909522486,909522486,16647926,0,
                909508608,909522486,16660022,0,404226048,404232216,16259320,0,0,0,418906112,404232216,404232216,404232216,2037784,0,
                404226048,404232216,16717848,0,0,0,419364864,404232216,404232216,404232216,404690968,404232216,6168,0,16711680,0,
                404226048,404232216,419371032,404232216,404232216,404232216,404690975,404232216,909514776,909522486,909588022,909522486,909522486,909522486,4141111,0,
                0,0,909586495,909522486,909522486,909522486,16711927,0,0,0,922157311,909522486,909522486,909522486,909586487,909522486,
                13878,0,16711935,0,909508608,909522486,922157303,909522486,404239926,404232216,16711935,0,909508608,909522486,16725558,0,
                0,0,419365119,404232216,6168,0,922681344,909522486,909522486,909522486,4142646,0,404226048,404232216,2037791,0,
                0,0,404690975,404232216,6168,0,910098432,909522486,909522486,909522486,922695222,909522486,404239926,404232216,419371263,404232216,
                404232216,404232216,16259096,0,0,0,404684800,404232216,-59368,-1,-1,-1,65535,0,-65536,-1,
                -252641281,-252645136,-252645136,-252645136,252702960,252645135,252645135,252645135,-61681,-1,65535,0,0,0,-656640512,7789784,
                0,2080374784,-960037690,1086374140,0,-1060714754,-1061109568,12632256,0,0,1819045118,7105644,0,811648766,806882328,16696928,
                0,0,-656900608,7395544,0,0,1717986918,-1067425668,0,0,404282486,1579032,0,1008212094,1013343846,8263704,
                0,-960074696,-960037178,3697862,0,-960074696,1819068102,15625324,0,202911774,1717976582,3958374,0,0,2128337790,0,
                0,100859904,-203695234,12607614,0,1616916508,1616936032,1847392,0,-964952064,-960051514,13027014,0,16646144,65024,254,
                0,404226048,1579134,65280,0,202911744,806882310,32256,0,806882304,202911840,32256,0,454757888,404232216,404232216,
                404232216,404232216,-669509608,28888,0,404226048,402685440,24,0,1979711488,-596246308,0,0,946629688,0,0,
                0,0,1579008,0,0,0,1572864,0,251658240,202116108,1013771276,28,-671088640,1819044972,108,0,
                1879048192,-933220136,248,0,0,2080374784,2088533116,124,0,0,0,0,-864550912,410569920,-872384500,-858993664,
                1835134,-1057174408,-1015152520,1715340860,13369407,-864285576,14680190,-864285576,808452222,-864285576,126,2025898104,-1015138292,1618896444,13369404,-1057174408,
                14680184,-1057174408,13369464,808464496,-964951944,404232248,14680124,808464496,952500344,-956381588,808452294,-53708800,1835212,1618501884,252,-864088961,
                1816002687,-858980660,-864550706,-859015168,-872415112,-859015168,-536870792,-859015168,-864550792,-858993664,-536870786,-858993664,-872415106,2093796352,415496204,1013343804,
                13369368,-858993460,404226168,2126561406,1815615512,-429854620,-859045636,-63898504,-856149968,-809043252,453953478,404241432,1863896,-864285576,3670142,808464496,
                469762168,-859015168,469762168,-858993664,-134217602,-858982400,16515276,-587404084,1815871692,2113945196,1815609344,2080389228,3145728,-859807696,120,-1061094400,
                0,202177536,-960299008,1714675404,-960294964,1865931724,404227023,404232192,855638040,862375014,-872415232,-865717402,-2011037696,-2011002846,-1437235166,-1437226411,
                2010884693,2010902235,404287195,404232216,404232216,418912280,404232216,418912504,909514776,922105398,13878,922615808,13878,418912504,909514776,922093302,
                909522486,909522486,13878,922093310,909522486,16647926,909508608,16660022,404226048,16259320,0,418906112,404232216,2037784,404226048,16717848,
                0,419364864,404232216,404690968,6168,16711680,404226048,419371032,404232216,404690975,909514776,909588022,909522486,4141111,0,909586495,
                909522486,16711927,0,922157311,909522486,909586487,13878,16711935,909508608,922157303,404239926,16711935,909508608,16725558,0,419365119,
                6168,922681344,909522486,4142646,404226048,2037791,0,404690975,6168,910098432,909522486,922695222,404239926,419371263,404232216,16259096,
                0,404684800,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-590816138,2013266038,-120784692,
                -67059520,-1061109556,-33554240,1819044972,-855900052,-866111392,252,-656877442,1711276144,2087085670,1979760736,404232412,821821464,2026687608,1815673904,1824980678,
                1815609400,1819068102,807141614,-859014120,120,2128337790,201719808,2128337790,1614332000,1623259328,-864550856,-858993460,-67108660,-67044352,808452096,3158268,
                811598076,6303768,806879484,1585248,453902588,404232219,404232216,-669509608,808480984,805370880,1979711536,-596246308,1815609344,14444,0,1579008,
                0,1572864,202309632,1827408908,1819810876,7105644,409993216,7888944,0,1010580540,0,0,113639424,-2013265778,-1610583002,-922877835,
                1177190404,-402230512,-335949110,66501137,-387055440,-823650917,-402427182,1455622528,4374097,-1191054918,-290717689,-503256254,-1017226759,-1,-1,-1,
                1397382379,1313875782,1212360513,1127556940,673204818,1866672451,1769109872,544499815,1347243843,1126191425,1970302319,544367988,1886547779,1952543343,544108393,842545457,
                741554220,942421048,53,0,0,0,-385875968,317380634,686817476,692273960,1866679081,2037411951,1769108089,1751607145,544502888,1329808160,
                1347243343,1363231056,1126178897,1836019523,1970303085,1702130805,544371301,1866679072,1886548591,1919905648,1952538994,1869179252,544108143,959525152,842545209,942418994,
                741552952,876099628,942418996,758461752,1816215853,543976556,1769108000,1751607145,1937011816,1914708083,1936024946,1919247731,1702262386,778331237,-394320850,91557747,
                1924775144,279007270,3155200,1951936572,1913076760,270437142,820215808,-338557775,-1976631502,-337461881,-1576554494,1235222601,-1342129408,1006875834,-1157204985,-725960704,
                -1983672829,-1744805098,-2097041261,-2081553214,-1070398230,-1577038173,-1976696734,-1545435257,-472842166,-1870165202,5022690,-1976636463,-1595759961,-1071316891,-1564210625,-1976696731,
                -1998410841,-1191156186,1426456592,1560321768,174885414,189565478,-402634336,91557587,1958296296,1023288347,638940418,218725504,-980808075,-1979686424,-389969176,-930480038,
                1611565319,4825088,1008730297,-788367865,1007121633,47108,548930419,-151047417,1971322950,514585346,5291783,146391091,-1599343872,279445639,-189069708,-466032639,
                -2097125984,-1964112702,2133065798,74727484,58029116,-1023391326,2041169,-523107407,-235532623,1913126016,1505820162,-1962986813,503335198,-561056205,7616197,-1264612818,
                1458766818,-371045699,1593556590,-1064380276,119849759,-1744805214,653742672,1319305292,-779003392,-401820439,-782319777,1351388134,-1086265088,-2013247072,1251999814,21399552,
                -2013240672,683870022,676352040,1347440680,134219776,268439552,1073758208,1073758208,674004992,774514989,807282974,808464432,1060126512,269484032,807411744,50397984,
                1358954247,-1062706716,-816315787,-1444937457,1920270337,568786864,1642373606,-527702990,-337451331,-24407962,41077899,-1929591298,-1898410296,3193024,12374158,506625,
                -855637064,-1251426800,1954595318,-1252475389,-2080323864,-1106742035,-1125599880,-2027427072,309754,45738707,10020864,-494807157,79233025,9234432,246685872,-768405299,
                -402651975,-2135949186,871657702,869830336,-1995994149,-352261369,-469701888,-351531935,-352261376,610395648,-352261133,-436147456,-352261279,-469701888,1958783073,-436209661,
                1894154416,-1056800584,-125106464,-67108677,712302395,-352321346,114179,-1904213831,-498684709,-1469979396,-150178368,1946157510,12812776,-1948652784,-101479466,-1070340609,
                1107455,-1037633646,805606115,41302332,246679300,-320728883,-1073042237,246679156,-169144115,-61,-1,-1,-1,-1,-1,-1,
                67187455,8388608,0,285290752,67266304,8388608,0,285376000,100820736,8388608,0,285370112,134479872,33554432,0,285474560,
                100903936,33554432,0,285453056,84064512,8388608,0,285390848,134336000,16777216,9,285343488,84122880,8388608,0,285449216,
                251888640,-65536,2048,285442816,84136960,-65536,0,285463552,117677312,8388608,0,285449216,151231744,8388608,2048,285449216,
                134374400,16777216,0,285369088,67359744,8388608,0,285463552,0,0,0,0,67265536,0,0,285369344,
                84136960,8388608,0,285463552,100910592,8388608,0,285459968,134479616,-65536,0,285474560,84073728,16777216,0,285400064,
                117628160,16777216,0,285400064,100869376,-65536,0,285418752,134454272,-65536,7,285449216,235128320,-65536,2055,285459968,
                268682752,-65536,2055,285459968,235142912,-65536,2055,285474560,168019456,-65536,2055,285459968,268626944,-65536,2055,285404160,
                100869376,-65536,0,436413696,67266304,8388608,0,419587840,134375168,8388608,0,419587840,151226624,8388608,2055,419662080,
                134409216,-65536,7,570616832,117687808,-65536,7,570672640,134465024,-65536,7,570672640,151242240,-65536,2055,570672640,
                84133376,-65536,7,570672640,268591872,-65536,2055,1057121024,184811264,-65536,2055,553910016,251920128,-65536,2055,570687232,
                251920128,-65536,2055,553910016,268697344,-65536,2055,1057226496,67314944,-65536,0,436413696,33760512,-65536,0,436413696,
                134409216,-65536,7,553839616,100854784,-65536,7,553839616,84133376,8388608,0,419677696,200015616,-67106672,7340033,-2097152000,
                -50657596,-2065253968,-1030827469,-1207928641,-1934889017,-628184120,1358955449,332202164,-1183055685,28835841,1494469890,208814707,-1,-1,8055295,-1146036766,
                -92240666,-1339591552,154200078,511000744,1086053004,-1965322752,-1912572626,1961691866,1963501581,-423972855,8436356,416131819,1971372790,-1190687981,-74776567,276148211,
                -393400898,-18153437,33472385,-562714027,-2065253200,8126698,113541888,-1931165957,-1275066648,-854143744,-1406206951,91497532,-337621784,1409008629,1465274961,4242206,
                -494806130,-225771517,8166538,-1802770735,-771031040,-461102476,-2132277899,-31855689,-402295348,283883432,91606270,-340276248,1976368647,-1215436797,1516134175,-389063847,
                -466434237,-1022081399,-971676024,-2013260730,-2130676698,72270,-15367,-1,-1,-1,-1,-50593793,-1957341666,4243180,-461054322,887622517,
                174516234,-1310066572,1976368640,172917033,1719730752,-385876470,58001987,-402613271,91556424,-351662360,174490094,1317142463,-385875702,-855768956,703071605,-25433334,
                -402295348,1928006260,41274622,-855741205,-974649995,-2140935414,141888508,-402008344,1458244154,1963785344,172917022,1719730752,-385876470,1114900967,-2130042392,-4257178,
                17452673,-2144081152,91557372,-351659544,-335773655,-555219595,-2145391859,91614460,-351381272,-302219243,-790100619,-2146702578,58060540,-2146525720,1583156716,-1960390881,
                -390003388,4366850,-1575729526,1183449155,-1572920302,1183449156,4563475,-1072544118,1185023720,273058304,-524287708,-1969222652,-427814538,-1564079601,-1977221049,-155580348,
                1371794947,-386652999,275958151,-335415366,141887656,-492422424,-109005581,616153945,33012468,-1460879309,-402098928,-152918493,-1007058764,-1341917510,-3936766,-1,
                -1,-50331649,-1157226912,-611450816,9832182,-467962752,1974156384,-1777434614,645939200,-1333854058,-81730016,-369098819,116785382,1950351510,1012982824,-2132249279,
                -1090480602,9834112,386826256,548413440,-386195226,645923267,-1109458794,-1209401345,1556224,-1979647256,-111090472,365776820,1912602813,-434065400,-1679164640,1356892672,
                360007228,1574646,-401705720,158575434,-434065158,1978399520,-434065264,-58655968,-2146994720,33592846,-58713109,-2146994719,16815630,-58716181,-2146798338,158726908,
                9899648,1357600784,11200656,1574646,-2144701432,276055804,1923639528,1392279600,-461100172,250292088,1509110,-166824696,67114758,645928820,-336134120,-15996144,
                1913047039,-384683008,401143249,646469632,669515797,16902144,520613253,-100371103,-822064664,1923712232,-1474828270,-404222606,-402099542,57846593,-1011254296,209314948,
                9840256,-1775861506,351010048,1949891712,503087343,-58658956,-2132446166,-529254660,20900035,1692839344,-1023330328,20113488,1692839600,379634520,-1413945344,-58714252,
                -33262258,-2146964544,158681852,679004414,-352315742,354826787,-2143128576,91499260,1966537856,-1777928697,829751808,1964899456,-1777928697,628424960,561570948,504027955,
                427032598,1348592720,1642527780,201330664,-396237310,1967849480,1642485999,1397801816,1139146928,15401195,1088684267,15456394,1088684267,11597962,15418342,15401195,
                -527810332,15401195,-528072476,-2116539565,1526799867,1482416246,396382403,82362368,646580004,-461373289,1959016967,-1759084532,101251072,48758935,1354979328,5433425,
                645942645,-386989929,-307232680,-4628250,-1761151233,192221184,1172895714,-420171776,-2144867488,-285173978,-1610598424,-390070249,-2147015676,-134179034,9897480,-4628250,
                -1761151233,41226240,645986274,1505689751,-95370408,201365408,-1761180096,-79648768,-1185823912,1692673808,-85982552,-15527,-1,-1,-1,-2013265921,
                -1063413603,-1058225940,-1494371348,1575790316,-1248896333,898517389,508951476,1381390086,-1957670063,-1900006420,2016855256,4241408,113694862,-2113994688,16651878,-1979627894,
                -58718618,1008431874,1008432920,1007056392,739471893,853051916,786682367,-331376641,20711403,-605491338,1552557759,1075742722,374243584,1532690944,1600019033,-815980793,
                1973492456,-1580013553,602409586,-2130349056,71246,-435769149,180367882,-1190300444,28442628,-499457328,58063584,-1011796504,4275840,-2146536448,151011646,1239943028,
                1977879217,-1967115480,-1977221050,-2135293108,-136129792,-930395934,61963752,-1978567741,78119238,162794101,18239105,-1870992640,1963007976,-1962986892,-472841890,-779646162,
                -1341397265,-436147454,-386102774,-2132230116,125733553,-1967123480,233309310,63341504,1186993128,25067590,-402295547,451657736,-1224701024,1958749211,-1474054392,-1224575680,
                -1075386326,-402555766,-293355552,32892933,129570677,4374272,1957719016,-1577981701,1191545068,216593122,1093044416,-14292992,-389815286,1718984743,-1969107736,281343527,
                -58716811,-2147256953,-998243348,-400062445,1253097320,-4650010,-1329796865,-466484048,50358006,-1274776637,-399578359,779419748,182846128,1911049655,125733567,167962560,
                1709704830,63341503,-2084607000,1709704390,133071807,1962899176,374243598,646447105,-1326972863,-1008465154,-1179681048,-706215836,-502893393,-343886599,-1588205544,-1964111952,
                635963006,20834495,585631605,-1262442495,28361600,-771338614,1040614624,136017152,-402637306,1204199713,-1142423548,604730623,1970289776,-5183371,753430645,-1593317201,
                1183459210,549778949,-523238796,839143306,1958820580,71796821,-840429641,125733566,167962560,-1041758594,-1596200770,-402358390,-790053192,859010304,1552557787,21400073,
                74711868,343213372,-1601247149,-2146127781,41222908,-667283536,-1014627725,57989899,-388540952,-1062731639,717439156,707406378,707406378,707406378,707406378,707406378,
                707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,707406378,
                707406378,707406378,707406378,707406378,707406378,1344940586,4241438,243325070,-1333788610,-1205803488,365793537,-1211148257,-1107892216,-352320839,4366851,-490872344,
                4366584,28899523,1930808720,1040643595,460619776,485221426,-1191181637,-1070383863,4065014,-401771136,-186474521,-387156661,-2135642472,4073088,-1008465281,707406378,
                707406378,-550884822,251798786,-162201829,-169277425,1256605193,-1209646395,-1114970109,-1010986008,607274378,1963080958,1280674574,-2147171709,-1971302795,-101822907,-61,
                -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2130706433,124917244,1975516288,-65686483,1086254219,-1948348928,
                -1107270890,-1023952896,57999424,-1901068098,-1950054714,-2117826832,-788463642,-1795215642,-1763063439,503773957,1398167381,-347057583,-1169010502,-1460923450,-1017619904,15429862,
                1910767851,-344922429,-1979651328,-1015945532,-1,-1,-1,-1,-1,170731576,471402015,117835522,0,173690993,471402015,117835522,
                0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,170731576,471402015,117835522,0,173690993,421070361,202050818,
                0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,-54001480,1023431144,-126427264,-1897922376,-2116340776,1974097215,-1175047367,
                44924928,-488897832,-1206356743,-661782464,1183360,1342225151,-1179287621,283639823,-1206653994,-1064435648,-1193767394,-1957691389,6225900,1085823064,-1009218048,-617359218,
                -1437253759,-164404619,1871366451,-1948135166,-670913327,1047919586,-355269455,4241490,-1910587250,243928,1442089808,-13177549,1961691932,1085808140,-2133291520,-16772594,
                -1940366049,-1940250664,1004143579,1025275587,460513152,106960363,1342224926,-1179206469,-1930952684,1627856853,-1946124102,-1010695208,12060190,2615488,-2143484043,871790279,
                -1021376576,12060190,317214912,125065728,-389903536,1029177419,-310982784,-54321401,-617359218,-1437253759,-164418187,1871366451,-1948135166,-670913327,158727138,-355269455,
                -1039935348,503734467,-1152384838,347715260,-719460352,-1168046305,-661913472,-768359933,-1193767229,-1064435648,243742,-1275056,525860958,-115218237,-1540429574,-1191506059,
                -839348222,568916501,1955658660,-2110374920,-1962642176,-1996455882,-83879370,-117839677,-1543051014,396411899,-58670336,1025733632,91611149,-350483016,-533775079,800589173,
                -2146440395,259491068,192213052,41279548,-4325200,855829503,-1007254026,1946221696,1978678278,-1023365118,603986080,-1775859197,216301568,396419082,87868160,-8365195,
                -2141817085,1366761467,-116987823,645987189,-386989929,-206505716,-4628250,-1761151233,192221184,-102172702,-420171528,-2145064096,-285173978,-1963398168,98615495,1625735946,
                -150995015,268474118,-136181387,-1325870104,-2141133068,-1090480346,-1946500263,-1996481482,994461196,1962967606,-2143909116,439761664,-1995869184,838868022,65796288,-67567184,
                4241603,-1330587506,-1070431002,-1577028190,-222691186,-296374271,15401195,-1070464789,1951743212,-424562682,-2146571388,16812814,1912650984,387075,-2065254224,24438979,
                -1297083021,817595622,2013624,-402652998,-1947675745,-1340478719,-1299913037,1173632,7683712,-1341558270,-1299913036,125057,-1291470909,2048047362,332206260,-1169026701,
                1525416439,410353832,1954610304,-1476072689,-401443568,-522019973,-646591490,-747253762,-352258584,-855002040,-1258982893,1913900305,146035257,-511700019,29982912,-1194292648,
                332203009,-58713229,-2146012150,292819452,1947270272,616663564,1947286545,-339608051,113118,332205236,-1830288269,-1329334016,-66525042,175390888,-2065254480,-336002895,
                -1833922439,184284648,-1964149568,-1070391592,-661731189,-390020214,1007514628,-1341819633,-69670759,-922828290,-436858699,-85720827,-1946090333,855705102,616794816,1007514639,
                -1341819633,-72030054,-1040267010,17163766,18392036,18484876,-1560261471,1319174400,16950016,4982471,244067858,113705038,860029400,31067788,243802107,-1329397643,
                -1148918091,-92227616,-1157401472,330938355,47616,-1009624344,-2065254736,-2135417925,108298746,-1157613080,364492806,47616,-1009631512,-402638104,-138805168,3980033,
                -319544135,208961704,-493205784,-260748298,183206068,-335416902,57934140,-1007083340,-393301766,135068438,-1901010806,-67430680,606201027,-352261125,-436147456,614589473,
                -352261185,-436147456,12108705,66501120,-1342116882,-118952444,-301944679,-1202708797,-661782464,-419492936,-352261216,-2069830656,-1978108736,-352261152,178381824,-352261180,
                -341711360,-434065408,-1340019808,-350165493,-469701888,1958773792,-1461679598,-468945660,-339473887,-436147456,-2147423455,74776572,551952560,7022216,1489968984,1583044954,
                119496031,21415631,113410816,116032492,2054489256,2121532072,16860870,1122898096,15401195,1256229612,15405488,1122894059,15401195,103500524,87883854,855800848,
                -1962986816,771770654,-156268758,2030099584,-1967115518,-2147464690,997328123,1946680192,-165105354,-792163599,-1997942551,1720189774,-1998532606,61932870,-466427770,1183441107,
                1228832774,108332544,-788371760,15402598,-1031601941,-154931705,54954225,-1325242744,-740521469,106858979,1183375570,65006341,50660611,-100400381,-455046576,-154892666,
                1433667780,1903427644,242550844,-2134848384,-997793820,28346086,54281707,779443063,-990510672,-163285888,91570372,-348074880,-1075544047,1948304630,-538673143,-2031696762,
                -461359125,-423328033,-339442042,-461336546,-423328225,-20674938,-2069777208,-1273858880,1959329442,-22825972,-1274645304,1976106660,-185669624,1692845194,-1262266117,612819976,
                1958755520,2877481,578092980,-464516060,1476962438,45353588,309658792,250282420,205259188,45353076,41223336,-997588812,-87825358,-1326142488,-1335564627,7727269,
                -1645700016,-424759052,65539684,-1878856960,-1006937905,-456882608,1963501702,1019512350,1343780610,-193271558,1692837552,15401195,1492414440,15401195,1492869350,-4986685,
                141885364,547881140,28574324,-466434934,-391794493,-4980705,203690100,205259188,45353076,41223336,-997588812,-1329339342,125120,-335916861,-352261376,-1469783040,
                -351767551,-469701888,-387126432,-430377964,-200349596,-18095,15401195,27813092,1952052961,-352261368,-345971712,-71290366,-1467554621,-1476234112,-15552,-1,
                -1205928961,-661782464,520098721,-1205929009,-661782464,520097953,1090289871,-1084815755,418091776,1988099200,-1057193909,-1084815755,149656064,1939012736,-125085893,2130765697,
                772272065,-125004289,182879,-120850231,-1510016819,-120601251,-1496865150,-1467963279,-121243451,-121243451,-121243451,-120325935,-1922913954,1968176256,-1258565887,46856582,
                -466420992,-346071101,-336139285,-336401420,1609493488,-807128481,-2065260368,-468849533,604039969,841082559,-338499904,-436147456,853816020,1913900498,871140149,-992440640,
                -1207928778,-661782464,411334,476870,9111238,1074185875,199819008,1008825589,-401902224,410318082,-2065259344,-1515191061,1757119718,2144694,-402652998,82562611,
                -2065258832,-1022507901,637547240,-671742582,-388839646,-1023392120,-1744821528,-523058398,192543952,-1979371482,-2013247194,650314086,-955630302,1227262634,23496704,-1946209341,
                512361046,-355401655,-75440175,-788105722,-337653270,-772812542,-773664273,-773664286,-772144158,65196514,-2130790406,74647291,-405745199,-738795638,-355348085,-355341615,
                -511651338,63427079,1409008634,508973649,-1912586053,65176027,-1963816192,-788498276,143952870,1959922432,-461090692,-855766156,-855749004,-346529676,-347935124,-335484160,
                762902564,-1862354864,1477823992,-809953678,29053699,-870258688,-131797925,-236842120,-361378818,15401195,2029528300,-352252924,619463213,-352252898,-301929728,267066916,
                145769026,-1142030101,-337117179,-352056117,-301929728,-347977142,-335484160,1211430948,-1973880694,1516117991,-3187879,65535,0,-2122448896,-1715633755,-8487295,
                -406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,
                -1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,
                2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,
                403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,
                108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,
                1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,
                -866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,
                805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,
                1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,
                -859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,
                1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,
                1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,
                1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,
                -871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,
                1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,
                1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,1408958718,-13443958,523137,-472840329,-2052587730,
                1541681918,1402746831,-1751355748,-325268836,1939678876,-99,-1,-1,-1,1380982527,7126614,-1912586056,1963261912,38076163,402816128,-1330114443,
                1963207424,-1996191479,-2009071036,1048577092,1979646016,1057420823,276039424,1962496744,-434107381,-314906490,1692836272,4198142,212870005,-301731142,4130550,-468618233,
                1948297350,-421583861,-317265786,1692836528,4138624,483221232,551952560,-820029350,-369098753,-2441,-1,-1,-1,-1,-1,-1,
                -1,-1,-1,-1,-805306369,1381061456,4242206,28367758,16778886,1131675964,4581627,281874356,-1269699446,1494273283,-1261292718,-1273967358,
                -401552120,393347124,-717569282,552136050,839676416,-2134442286,-546170370,436212456,45374153,-1996877619,520159246,1482381658,-401755953,376569860,861014704,1975551186,
                -1272926206,-166212352,24379844,-3974407,-13390,-1,-1,-1,-1,541851647,1329803568,1363234893,9885162,791752944,942618930,-906223561]
                }
              • README.md
                Compaq Portable III Information
                ---
                
                ### System ROM Locations
                
                	U89 (EVEN)
                	U72 (ODD)
                
                ### System ROM Revisions (Spare Part 107592-001)
                
                	Rev  Even ROM #  Odd ROM #   Size  Date
                	---  ----------  ----------  ----  ----
                	K    106779-002  106778-002  16Kb  1987-01-29
                	N.2  107825-001  107824-001  32Kb
                	P.2  109738-001  109737-001  32Kb
                	R.2  109738-002  109737-002  32Kb
                
        • hdc
          • ibm-xebec-1982.json
            [85,170,16,235,30,53,48,48,48,48,53,57,32,40,67,41,67,79,80,89,82,73,71,72,84,32,32,73,66,77,32,49,57,56,50,43,192,142,216,
            250,161,76,0,163,0,1,161,78,0,163,2,1,199,6,76,0,86,2,140,14,78,0,184,96,7,163,52,0,140,14,54,0,199,6,100,0,134,1,140,14,
            102,0,199,6,4,1,231,3,140,14,6,1,251,184,64,0,142,216,198,6,116,0,0,198,6,117,0,0,198,6,67,0,0,198,6,119,0,0,185,37,0,232,
            242,0,115,5,226,249,233,191,0,185,1,0,186,128,0,184,0,18,205,19,115,3,233,175,0,184,0,20,205,19,115,3,233,165,0,199,6,108,
            0,0,0,161,114,0,61,52,18,117,6,199,6,108,0,154,1,228,33,36,254,230,33,232,180,0,114,7,184,0,16,205,19,115,11,161,108,0,61,
            190,1,114,236,235,117,144,185,1,0,186,128,0,184,0,17,205,19,114,103,184,0,9,205,19,114,96,184,0,200,142,192,43,219,184,0,
            15,205,19,114,82,254,6,117,0,186,19,2,176,0,238,186,33,3,236,36,15,60,15,116,6,199,6,108,0,164,1,186,19,2,176,255,238,185,
            1,0,186,129,0,43,192,205,19,114,64,184,0,17,205,19,115,11,161,108,0,61,190,1,114,235,235,47,144,184,0,9,205,19,114,39,254,
            6,117,0,129,250,129,0,115,29,66,235,212,189,15,0,43,192,139,240,185,6,0,144,183,0,46,138,132,104,1,180,14,205,16,70,226,244,
            249,250,228,33,12,1,230,33,251,232,165,0,203,49,55,48,49,13,10,81,82,248,185,0,1,232,7,6,238,232,3,6,236,36,2,116,3,226,242,
            249,90,89,195,43,192,142,216,250,199,6,4,1,231,3,140,14,6,1,199,6,120,0,1,2,140,14,122,0,251,185,3,0,81,43,210,43,192,205,
            19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,10,128,252,128,116,10,226,222,235,6,144,234,0,124,0,0,43,
            192,43,210,205,19,185,3,0,81,186,128,0,43,192,205,19,114,18,184,1,2,43,219,142,195,187,0,124,186,128,0,185,1,0,205,19,89,
            114,8,161,254,125,61,85,170,116,203,226,215,205,24,207,2,37,2,8,42,255,80,246,25,4,30,184,64,0,142,216,138,38,119,0,80,198,
            6,119,0,0,232,105,5,42,192,238,198,6,119,0,4,232,94,5,42,192,238,198,6,119,0,8,232,83,5,42,192,238,198,6,119,0,12,232,72,
            5,42,192,238,176,7,230,10,250,228,33,12,32,230,33,251,88,136,38,119,0,31,195,128,250,128,115,5,205,64,202,2,0,251,10,228,
            117,9,205,64,42,228,128,250,129,119,239,128,252,8,117,3,233,26,1,83,81,82,30,6,86,87,232,106,0,80,232,136,255,184,64,0,142,
            216,88,138,38,116,0,128,252,1,245,95,94,7,31,90,89,91,202,2,0,56,3,77,3,86,3,96,3,106,3,114,3,121,3,128,3,48,3,39,4,207,4,
            221,4,242,4,56,3,249,4,7,5,21,5,28,5,35,5,42,5,49,5,198,6,116,0,0,81,138,234,128,202,1,254,202,208,226,136,22,119,0,138,213,
            128,226,1,177,5,210,226,10,214,136,22,67,0,89,195,80,184,64,0,142,216,88,128,252,1,117,3,235,85,144,128,234,128,128,250,8,
            115,47,232,194,255,254,201,198,6,66,0,0,136,14,68,0,136,46,69,0,162,70,0,160,118,0,162,71,0,80,138,196,50,228,209,224,139,
            240,61,42,0,88,115,5,46,255,164,156,2,198,6,116,0,1,176,0,195,232,67,4,238,232,63,4,236,36,2,116,6,198,6,116,0,5,195,233,
            218,0,160,116,0,198,6,116,0,0,195,176,71,198,6,66,0,8,233,229,1,176,75,198,6,66,0,10,233,219,1,198,6,66,0,5,233,196,1,198,
            6,66,0,6,235,12,198,6,66,0,7,235,5,198,6,66,0,4,160,68,0,36,192,162,68,0,233,166,1,30,6,83,43,192,142,216,196,30,4,1,184,
            64,0,142,216,128,234,128,128,250,8,115,47,232,27,255,232,223,3,114,39,3,216,38,139,7,45,2,0,138,232,37,0,3,209,232,209,232,
            12,17,138,200,38,138,119,2,254,206,138,22,117,0,43,192,91,7,31,202,2,0,198,6,116,0,7,180,7,42,192,43,210,43,201,249,235,234,
            50,1,2,50,1,0,0,11,0,12,180,40,0,0,0,0,119,1,8,119,1,0,0,11,5,12,180,40,0,0,0,0,50,1,6,128,0,0,1,11,5,12,180,40,0,0,0,0,50,
            1,4,50,1,0,0,11,5,12,180,40,0,0,0,0,198,6,66,0,12,198,6,67,0,0,232,16,0,114,13,198,6,66,0,12,198,6,67,0,32,232,1,0,195,42,
            192,232,25,1,115,1,195,30,43,192,142,216,196,30,4,1,31,232,52,3,114,87,3,216,191,1,0,232,95,0,114,77,191,0,0,232,87,0,114,
            69,191,2,0,232,79,0,114,61,191,4,0,232,71,0,114,53,191,3,0,232,63,0,114,45,191,6,0,232,55,0,114,37,191,5,0,232,47,0,114,29,
            191,7,0,232,39,0,114,21,191,8,0,38,138,1,162,118,0,43,201,232,211,2,236,168,2,117,9,226,246,198,6,116,0,7,249,195,232,181,
            2,236,36,2,117,241,195,232,197,1,114,7,232,167,2,38,138,1,238,195,232,25,0,114,107,198,6,66,0,229,176,71,235,104,232,11,0,
            114,93,198,6,66,0,230,176,75,235,90,160,70,0,60,128,245,195,198,6,66,0,11,235,61,198,6,66,0,14,198,6,70,0,1,176,71,235,62,
            198,6,66,0,15,198,6,70,0,1,176,75,235,48,198,6,66,0,0,235,26,198,6,66,0,1,235,19,198,6,66,0,224,235,12,198,6,66,0,227,235,
            5,198,6,66,0,228,176,2,232,39,0,114,33,235,22,198,6,116,0,9,195,232,87,1,114,245,176,3,232,19,0,114,13,176,3,230,10,228,33,
            36,223,230,33,232,170,1,232,59,0,195,190,66,0,232,27,2,238,232,28,2,238,43,201,232,12,2,236,36,15,60,13,116,9,226,247,198,
            6,116,0,128,249,195,252,185,6,0,232,232,1,172,238,226,249,232,238,1,236,168,1,116,6,198,6,116,0,32,249,195,160,116,0,10,192,
            117,1,195,184,64,0,142,192,43,192,139,248,198,6,66,0,3,42,192,232,171,255,114,35,185,4,0,232,203,0,114,32,232,173,1,236,38,
            136,69,66,71,232,177,1,226,237,232,184,0,114,13,232,154,1,236,168,2,116,15,198,6,116,0,255,249,195,26,6,39,6,106,6,119,6,
            38,138,30,66,0,138,195,36,15,128,227,48,42,255,177,3,211,235,46,255,167,227,5,0,32,64,32,128,0,32,0,64,16,16,2,0,4,64,0,0,
            17,11,1,2,32,32,16,187,2,6,60,9,115,99,46,215,162,116,0,195,187,11,6,139,200,60,10,115,84,46,215,162,116,0,128,225,8,128,
            249,8,117,42,198,6,66,0,13,42,192,232,27,255,114,30,232,62,0,114,25,232,32,1,236,138,200,232,51,0,114,14,232,21,1,236,168,
            1,116,6,198,6,116,0,32,249,138,193,195,187,21,6,60,2,115,19,46,215,162,116,0,195,187,23,6,60,3,115,6,46,215,162,116,0,195,
            198,6,116,0,187,195,81,43,201,232,238,0,236,168,1,117,8,226,249,198,6,116,0,128,249,89,195,80,160,70,0,60,129,88,114,2,249,
            195,81,250,230,12,80,88,230,11,140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,6,138,196,230,6,138,197,36,
            15,230,130,160,70,0,208,224,254,200,138,224,176,255,80,160,66,0,60,229,116,7,60,230,116,3,88,235,17,88,184,4,2,83,42,255,
            138,30,70,0,82,247,227,90,91,72,80,230,7,138,196,230,7,251,89,88,3,193,89,195,251,83,81,6,86,30,43,192,142,216,196,54,4,1,
            31,42,255,38,138,92,9,138,38,66,0,128,252,4,117,6,38,138,92,10,235,9,128,252,227,117,4,38,138,92,11,43,201,232,68,0,236,36,
            32,60,32,116,10,226,244,75,117,241,198,6,116,0,128,232,35,0,236,36,2,8,6,116,0,232,48,0,50,192,238,94,7,89,91,195,80,176,
            32,230,32,176,7,230,10,228,33,12,32,230,33,88,207,186,32,3,80,42,228,160,119,0,3,208,88,195,232,240,255,66,195,232,248,255,
            66,195,232,248,255,66,195,232,243,255,236,80,232,233,255,236,36,2,88,117,22,138,38,67,0,128,228,32,117,4,208,232,208,232,
            36,3,177,4,210,224,42,228,195,249,195,48,56,47,49,54,47,56,50,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
            255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,201] 
            
          • ibm-xebec-1982.map
                 0320   =   HF_PORT
            0000:0034   4   HDISK_INT
            0040:0042   1   CMD_BLOCK
                 0003   .   DISK_SETUP: JMP SHORT L3
                 0005   .   DB '5000059 (C)COPYRIGHT  IBM 1982' ; COPYRIGHT NOTICE
                 0023   .   L3: SUB AX,AX
                 016E   @   HD_RESET_1
            
        • keyboard
          • 8042_1503033.TXT
            1503033 DISASSEMBLY
            ===================
            A. Tarpai 2010 October
            Comments and corrections are welcome to tarpai76 at gmail! Feel free
            This file has been downloaded from http://www.halicery.com/8042/8042_1503033.TXT
            For more detailed info on the 8042 please look at http://www.halicery.com/8042/8042_INTERN.TXT. 
            
            TOC
              Intro
              8042 ROM disassembly
              8042 RAM map
            
            
                What is this?
                =============
                Commented disassembly of the file 1503033.bin, a 2KB IBM ROM dump of an AT 8042 keyboard controller (KBC) from 1983. The rom is from the MESS project, I wrote a simple 41/42 disassembler and did my best to comment this wonderful vintage piece. 
            
                Why?
                ====
                It is for historical interest.. and fun. An attept to understand how one of the 8042 KBC internally worked. I love keyboard hardware programming and it gave me a lot of headache to understand why are things like they are, and I was hoping to find some answers in this quite old and outdated code. Reading and commenting the code reminded me of the good ol' 8-bit days anyway and that I'm still alive..
                
                Conclusions
                ===========
                Not much actually..:) The 8042 programming interface is well documented by IBM and the firmware really does what it said to do. No hidden code or undocumented features. Still, it's very interesting - IMHO! 
            
                Syntax
                ======
                Everything is hexa, $ is the sign. Eg. #$CF is an immediate hexa 8-bit value. The 2K Program memory (ROM) is separate from the small RAM (128 bytes). The RAM is also the place for 8 general purpose registers, R0-R7. @R0 and @R1 can be used to indirectly address the other RAM locations. There is an Accumulator (A). @A addresses locations in program ROM. P1 and P2 are the two 8-bit I/O ports. The two test input pins (T0 and T1) are directly tested by the conditional branch instructions, eg. JNT0 $0310 jumps when T0=0.
            
                
                This firmware relies on the following
                =====================================
                
                    +---------------+
                    |            P27| -> DATA 
                    |   8042     P26| -> _CLK (inverted)
                    |   ====        |   
                    |            P17| <- KEYBOARD SWITCH (0=INHIBITED)
                    |               |   
                    |             T0| <- CLK
                    |             T1| <- DATA
                
                    (NB: P26 connects to an INVERTER and then drives the keyboard CLOCK line!)
            
                    
                STATUS bits
                ===========
                STATUS is a physical register. Host reads it on 0x64:
                    
                              sw-bits           hw-bits
                         +----------------  ----------------+ 
                     <-- |PER|RTO|TTO|INH|  |A0 |   |IBF|OBF| 
                         +----------------  ----------------+ 
                
                         
                Command Byte (CMD) bits in this 8042 firmware
                =============================================
                    CMD is a byte in the 8042's RAM. Host can read it by writing 0x20 (or 0) to 0x64, then reading 0x60: 
                
                        +--------------------------------+ 
                    <-- | - |XLAT|XT |_EN|OVR| F0|IBF|OBF|            
                        +--------------------------------+ 
            
                            
                TODO
                ====
                - There are some white spots, like the ROM checksum, and many small details to be cleared up.
                - Find a PS/2-style keyboard/mouse controller ROM dump(!)
                - Find a keyboard ROM dump (the 'other side')
                
                
            
                
            ***
            
                
            Opening 1503033.bin
            
              ; START VECTORS
            
            0000: 04 45   JMP $0045     ; -> Reset
            0002: 00      NOP
            0003: 04 3A   JMP $003A     ; -> IBF intr
            0005: 00      NOP
            0006: 00      NOP
            0007: 04 21   JMP $0021     ; -> Timer intr
            
              ; Timer intr
              ; ==========
              ;   This is something special: used as a general timeout in subroutines.
              ;   It manipulates the Stack Pointer and pretends the
              ;   called function returned with value 2 in the Accumulator.
              ;   (And disables kbd on the wire). Brilliant.
            
            
            0021: 65      STOP TCNT
            0022: C7      MOV A,PSW
            0023: 53 07   ANL A,#$07
            0025: 07      DEC A         ; dec SP
            0026: A8      MOV R0,A
            0027: C7      MOV A,PSW
            0028: 53 F8   ANL A,#$F8
            002A: 48      ORL A,R0
            002B: D7      MOV PSW,A
            002C: B8 20   MOV R0,#$20   ; check bit5 in CMD
            002E: F0      MOV A,@R0
            002F: B2 35   JB5 $0035
            0031: 74 DE   CALL $03DE    ; AT-KBD: we pull CLK low and hold
            0033: 04 37   JMP $0037
            0035: 9A 7F   ANL P2,#$7F   ; XT-KBD: we just pull DATA low
            0037: 23 02   MOV A,#$02
            0039: 93      RETR
            
              ; IBF intr
              ; ========
              ; This is not supposed to happen
              ; and is considered as ERROR. We just count it in @2F.
              ; Then back to Main
            
            003A: 65      STOP TCNT
            003B: 15      DIS I
            003C: B8 2F   MOV R0,#$2F
            003E: F0      MOV A,@R0
            003F: 17      INC A
            0040: C6 43   JZ $0043
            0042: A0      MOV @R0,A
            0043: 24 02   JMP $0102     ; -> Main
            
              ; Reset routine
              ; =============
              ; 
              ;   \/\/\__________  CLK pulled low
              ;         _________    (AT-KBD disabled state?)
              ;   \/\/\/           DATA set high
              
            0045: 23 CF   MOV A,#$CF    ; DATA=1 CLK=0 (KBD DISABLED)
            0047: 3A      OUTL P2,A
            0048: F5      EN FLAGS      ; OBF/_IBF routing ON to P24/P25, but so far disabled (P2=CF)
            0049: 26 4D   JNT0 $004D
            004B: 9A BF   ANL P2,#$BF
            004D: 09      IN A,P1
            004E: 90      MOV STS,A     ; Stage1
            004F: D6 4F   JNIBF $004F   ; wait for data from Host..
            0051: 23 10   MOV A,#$10
            0053: 90      MOV STS,A
            0054: 22      IN A,DBB
            0055: 76 59   JF1 $0059
            0057: 04 4F   JMP $004F
            0059: D3 AA   XRL A,#$AA    ; Command Self-Test?
            005B: 96 4F   JNZ $004F
            005D: E4 06   JMP $0706     ; do Command AA (it will return here on success)
            
            005F: 23 60   MOV A,#$60    ; Stage2. Init RAM variables
            0061: 90      MOV STS,A
            0062: B8 20   MOV R0,#$20
            0064: B0 10   MOV @R0,#$10  ; @20=10 (CMD = kbd disable by default)
            0066: 18      INC R0
            0067: B0 01   MOV @R0,#$01  ; @21=1 (this is how many times we try after parity error)
            0069: 18      INC R0
            006A: B0 06   MOV @R0,#$06  ; @22=6
            006C: 18      INC R0
            006D: 18      INC R0
            006E: 18      INC R0
            006F: B0 01   MOV @R0,#$01  ; @25=1
            0071: 18      INC R0
            0072: 18      INC R0
            0073: B0 FB   MOV @R0,#$FB  ; @27=FB (Timer reload value for send data to kbd)
            0075: 18      INC R0
            0076: B0 E0   MOV @R0,#$E0  ; @28=E0 (Timer reload before read scan code?)
            0078: 18      INC R0
            0079: B0 06   MOV @R0,#$06  ; @29=6
            007B: 18      INC R0
            007C: B0 10   MOV @R0,#$10  ; @2A=10 (pull CLK low and hold for AT-KBD in a loop of @2A)
            007E: 18      INC R0
            007F: B0 20   MOV @R0,#$20  ; @2B=20 (base for RAM address read/write commands)
            0081: 18      INC R0
            0082: B0 15   MOV @R0,#$15  ; @2C=15 (set and hold CLK/DATA for XT-KBD in a loop of 256 x @2C before IDLE) 
            0084: BC 55   MOV R4,#$55   ; Send 55 to Host (Self-test completed)
            0086: B9 00   MOV R1,#$00
            0088: 74 D3   CALL $03D3
            008A: 24 02   JMP $0102     ; -> Main
            
              ; to read this page
            008C: A3      MOVP A,@A
            008D: 83      RET
            
              ; to read this page
            0100: A3      MOVP A,@A
            0101: 83      RET
            
              ; Main Entry
              ; ==========
            
            0102: 86 0A   JOBF $010A	; DBBOUT still full? (wait until Host reads out previous byte sent)
            0104: D6 10   JNIBF $0110	; DBBOUT empty, go an poll kbd if enabled
            
              ; DBBIN is full: parse command/data
            
            0106: 76 49   JF1 $0149     ; Command written to 0x64. Returns to $0102
            0108: 44 02   JMP $0202     ; Data is written to 0x60. Returns to $0102
            
            010A: D6 02   JNIBF $0102	; DBBOUT full, loop until emptied or we receive sth
            010C: 76 06   JF1 $0106
            010E: 24 02   JMP $0102     ; -> Main
            
              ; DBBIN empty: deal with kbd
            
            0110: B8 20   MOV R0,#$20   ;
            0112: F0      MOV A,@R0
            0113: 92 02   JB4 $0102     ; _EN set -> kbd disabled, back to Main loop
            
              ; KBD enabled: do XT- or AT-protocol based on CMD5
            
            0115: B2 3F   JB5 $013F     ; XT-kbd?
            
              ; AT-KBD enabled
              ; (or has just been enabled by Host, @2E=1: then we make sure DATA is high)
            
            0117: B8 28   MOV R0,#$28   ; Preload Timer for later call $03AE (READ BYTE FROM AT-KBD)
            0119: F0      MOV A,@R0
            011A: 62      MOV T,A
            011B: B8 2E   MOV R0,#$2E   ; Host has just enabled kbd by clearing _EN in CMD?
            011D: F0      MOV A,@R0
            011E: C6 26   JZ $0126
            0120: 46 02   JNT1 $0102    ; ??? start all over if DATA is pulled low??
            0122: 46 02   JNT1 $0102	; ??? make sure DATA is still high??
            0124: 27      CLR A         ; OK, DATA is Idle
            0125: A0      MOV @R0,A     ; clear flag, release CLK and do the poll loop
            
            0126: 9A BF   ANL P2,#$BF   ; release CLK!
            0128: 24 2A   JMP $012A     ; and do the AT-KBD Main Poll Loop
            
              ; AT-KBD Main Poll Loop of CLK and IBF
              ; ====================================
              ; Either CLK gets pulled down by AT-KBD
              ; or Host sends a byte will exit from here
            
            012A: 26 32   JNT0 $0132    ; kbd pulled CLK down?
            012C: D6 2A   JNIBF $012A   ; Host wrote 0x60 or 0x64
            
              ; byte arrived from Host in AT-mode
            
            012E: 74 DE   CALL $03DE    ; pull CLK low and hold (disable kbd.. it will be re-enabled when reading the response byte)
            0130: 24 06   JMP $0106     ; and deal with command/data from Host. Returns to $0102
            
              ; DBBIN empty
              ; AT-KBD pulled CLK down
            
            0132: 26 4B   JNT0 $014B
            
              ; CLK fall was noise, count ERROR in @24 and loop again
              ; CLK |_| short fall
            
            0134: 74 DE   CALL $03DE
            0136: B8 24   MOV R0,#$24
            0138: F0      MOV A,@R0
            0139: 17      INC A
            013A: C6 26   JZ $0126
            013C: A0      MOV @R0,A
            013D: 24 26   JMP $0126
            
              ; XT-KBD Main Poll Loop of CLK and IBF
              ; ====================================
              ; (strange, CLK always checked twice.. ?)
            
            013F: 36 45   JT0 $0145
            0141: 36 3F   JT0 $013F
            0143: 84 02   JMP $0402     ; XT-KBD has pulled CLK low -> read scan code
            0145: D6 3F   JNIBF $013F
            
              ; byte arrived from Host in XT-mode: now what?
              ; (XT-KBD is uni-directional.. funny)
            
            0147: 24 06   JMP $0106     ; Command, XT-mode(!)
            
            0149: A4 02   JMP $0502     ; Command Parser, AT-mode
            
              ; OK, AT-KBD pulled the CLK down
              ; (scan code is expected)
            
            014B: 74 AE   CALL $03AE    ; READ BYTE FROM AT-KBD
            014D: 12 53   JB0 $0153     ; parity error?
            014F: 32 79   JB1 $0179     ; timeout error?
            0151: 24 7F   JMP $017F     ; OK ->
            
              ; scan code received with Parity Error
            
            0153: B8 21   MOV R0,#$21   ; # of retry-s variable @21 (=1 init)
            0155: F0      MOV A,@R0
            0156: C6 75   JZ $0175
            
            0158: AD      MOV R5,A      ; if we allow retry (normally do, 1) -> loop in R5
            
              ; Resend RETRY after Parity error
            
            0159: B8 23   MOV R0,#$23   ; inc ERROR COUNTER @23
            015B: F0      MOV A,@R0
            015C: 17      INC A
            015D: C6 60   JZ $0160
            015F: A0      MOV @R0,A
            0160: BC FE   MOV R4,#$FE   ; Send FE (resend) to AT-KBD
            0162: 54 32   CALL $0232
            
            0164: 32 75   JB1 $0175     ; did sending FE timed out?
            0166: B9 29   MOV R1,#$29   ; Receive scan code again from AT-KBD, call 380 passing R1=29(?)
            0168: 74 80   CALL $0380
            016A: 12 73   JB0 $0173     ; did second attempt ended with Parity Error again? Try again, loop
            016C: 32 75   JB1 $0175     ; did second attempt ended with Time Out?
            016E: FC      MOV A,R4
            016F: D3 FE   XRL A,#$FE
            0171: 96 7F   JNZ $017F
            0173: ED 59   DJNZ R5,$0159
            
            0175: B9 80   MOV R1,#$80   ; sending FE to AT-KBD Timed out
            0177: 24 7B   JMP $017B
            
              ; Scan code receive ended with Timeout Error
            
            0179: B9 40   MOV R1,#$40
            017B: BC 00   MOV R4,#$00
            017D: 24 81   JMP $0181
            
              ; Send received scan code from AT-KBD to Host
              ; Translation set?
            
            017F: B9 00   MOV R1,#$00
            
            0181: B8 20   MOV R0,#$20
            0183: F0      MOV A,@R0
            0184: 37      CPL A
            0185: D2 BE   JB6 $01BE     ; XLAT?
            
              ; XLAT=1
              ; Translate set-2 to set-1
              ; Watch for
              ;   - set-2 scan codes over 0x7f
              ;   - F0 break codes
              ;   - INH and key switch
            
            0187: FC      MOV A,R4      ; XLAT ON: translate to set-1 (7-bit make codes, msb set for break codes)
            0188: D3 83   XRL A,#$83
            018A: 96 90   JNZ $0190
            018C: BC 02   MOV R4,#$02   ; 0x80 -> 0x02 (=F7)
            018E: 24 97   JMP $0197
            0190: FC      MOV A,R4
            0191: D3 84   XRL A,#$84
            0193: 96 97   JNZ $0197
            0195: BC 7F   MOV R4,#$7F   ; 0x84 -> 0x7F (=SysRq, the new key pressed)
            
            0197: F0      MOV A,@R0     ; Send scan code to Host only if (INH || SW)
            0198: 72 A6   JB3 $01A6     ; (INH=CMD3, SW=P17)
            019A: 09      IN A,P1
            019B: F2 A6   JB7 $01A6
            
            019D: FC      MOV A,R4      ; KBD disabled.
            019E: F2 B4   JB7 $01B4     ; Just store make/break in @2D and exit
            01A0: 27      CLR A
            01A1: B8 2D   MOV R0,#$2D
            01A3: A0      MOV @R0,A
            01A4: 24 C0   JMP $01C0
            
            01A6: FC      MOV A,R4      ; KBD enabled.
            01A7: F2 B4   JB7 $01B4     ; Is it break code?
            
            01A9: E3      MOVP3 A,@A    ; No, do the translation (table at $0300, 128 bytes)
            01AA: AC      MOV R4,A      ; get possible break code bit
            01AB: B8 2D   MOV R0,#$2D
            01AD: F0      MOV A,@R0
            01AE: 4C      ORL A,R4
            01AF: AC      MOV R4,A
            01B0: 27      CLR A
            01B1: A0      MOV @R0,A
            01B2: 24 BE   JMP $01BE     ; send to Host
            
            01B4: D3 F0   XRL A,#$F0    ; did AT-KBD send us the break code (F0)?
            01B6: 96 BE   JNZ $01BE     ; no, send R4 to Host and exit
            01B8: B8 2D   MOV R0,#$2D   ; yes, set flag @2D and exit
            01BA: B0 80   MOV @R0,#$80
            01BC: 24 C0   JMP $01C0
            
              ; XLAT=0, do nothing
              ; Send byte and status to Host
            
            01BE: 74 D3   CALL $03D3    ; R4->DBBOUT, R1->STATUS
            01C0: 24 02   JMP $0102     ; -> Main
            
            
            
            ***************************************************************
            **   BANK 2:                                                 **
            **                                                           **
            **       $0202 Send Keyboard Command to KBD and read reply   **
            **       $0232 Send byte to KBD                              **
            ***************************************************************
            
              ; to read this page
            0200: A3      MOVP A,@A
            0201: 83      RET
            
              ; Host has written to 0x60
            
            0202: 22      IN A,DBB
            0203: AC      MOV R4,A
            0204: B8 20   MOV R0,#$20
            0206: F0      MOV A,@R0
            0207: 53 EF   ANL A,#$EF
            0209: A0      MOV @R0,A     ; enable kbd in CMD BYTE (for reading response?) - will be disabled before back to Main
            020A: B2 2E   JB5 $022E     ; CMD5?
            
              ; Send Byte to AT-kbd
            
            020C: 54 32   CALL $0232    ; Send byte in R4
            020E: 8A 80   ORL P2,#$80   ; DATA=1 (above returned with CLK pulled low)
            0210: B9 20   MOV R1,#$20
            0212: 32 28   JB1 $0228     ; Timeout Error? Set TxTO and Resend
            
            0214: B8 22   MOV R0,#$22   ; pass @22 to $0380 if non-zero (=6 on reset)
            0216: F0      MOV A,@R0
            0217: C6 30   JZ $0230
            
            0219: A9      MOV R1,A      ; receive reply (pass 6 in R1?)
            021A: 74 80   CALL $0380
            021C: B9 A0   MOV R1,#$A0
            021E: 12 28   JB0 $0228     ; Parity Error? Set PERR & RxTO and Resend
            0220: B9 60   MOV R1,#$60
            0222: 32 28   JB1 $0228     ; Timeout Error? Set RxTO & TxTO and Resend
            0224: B9 00   MOV R1,#$00   ; OK. Send reply byte to Host
            0226: 44 2A   JMP $022A
            
              ; Parity Error occured during sending byte to kbd
            
            0228: BC FE   MOV R4,#$FE   ; Send FE to Host (resend)
            022A: 74 D3   CALL $03D3
            022C: 44 30   JMP $0230     ; -> Main
            
            022E: 94 50   CALL $0450    ; Send Byte to XT-kbd
            0230: 24 02   JMP $0102     ; -> Main
            
              ; Send byte in AT-keyboard protocol (byte in R4)
            
            0232: 9A 7F   ANL P2,#$7F   ; pull DATA low
            0234: 74 DE   CALL $03DE    ; pull CLK low and hold (prepare AT-kbd to receive byte?)
            
            0236: B8 26   MOV R0,#$26
            0238: F0      MOV A,@R0
            0239: 62      MOV T,A       ; Timer Reload with @26 for start bit
            023A: 55      STRT T
            023B: B8 27   MOV R0,#$27
            023D: BA 08   MOV R2,#$08
            023F: BB 00   MOV R3,#$00
            0241: 9A BF   ANL P2,#$BF   ; release CLK!
            
            0243: FC      MOV A,R4      ; loop for sending 8 data bits
            0244: 67      RRC A
            0245: AC      MOV R4,A
            0246: 36 46   JT0 $0246     ; wait for CLK falling edge..
            0248: F6 4E   JC $024E
            024A: 9A 7F   ANL P2,#$7F   ; then write DATA
            024C: 44 51   JMP $0251
            024E: 8A 80   ORL P2,#$80
            0250: 1B      INC R3        ; compute parity
            0251: 65      STOP TCNT
            0252: F0      MOV A,@R0
            0253: 62      MOV T,A       ; Timer Reload with @27 for data bits
            0254: 55      STRT T
            0255: 26 55   JNT0 $0255    ; wait for CLK rising edge..
            0257: EA 43   DJNZ R2,$0243 ; next data bit
            
            0259: 23 01   MOV A,#$01    ; send Parity bit
            025B: DB      XRL A,R3
            025C: 67      RRC A
            025D: 36 5D   JT0 $025D
            025F: F6 65   JC $0265
            0261: 9A 7F   ANL P2,#$7F
            0263: 44 67   JMP $0267
            0265: 8A 80   ORL P2,#$80
            0267: 65      STOP TCNT
            
            0268: F0      MOV A,@R0     ; send Stop bit..
            0269: 62      MOV T,A
            026A: 55      STRT T
            026B: 26 6B   JNT0 $026B
            026D: 44 6F   JMP $026F
            026F: 36 6F   JT0 $026F
            0271: 8A 80   ORL P2,#$80
            0273: 65      STOP TCNT
            
            0274: F0      MOV A,@R0     ; Wait for |_| on DATA (ACK)..
            0275: 62      MOV T,A
            0276: 55      STRT T
            0277: 56 77   JT1 $0277
            0279: 44 7B   JMP $027B
            027B: 46 7B   JNT1 $027B
            027D: 65      STOP TCNT
            
            027E: 00      NOP
            027F: 74 DE   CALL $03DE    ; pull CLK low and hold
            0281: 27      CLR A         ; return A=0, OK
            0282: 83      RET
            
            
            
            *******************************************************************************
            **   BANK 3:                                                                 **
            **                                                                           **
            **       $0300  set-2 to set-1 translation table (128 entries)               **
            **       $0380  Read byte from AT-KBD (wait first for CLK pulled low by kbd) **
            **       $03AE  Read byte from AT-KBD (CLK already pulled low by kbd)        **
            **       $03D3  SEND BYTE to HOST (R4) and set STATUS (R1)                   **
            **       $03DE  PULL CLK LOW and HOLD for AT-KBD                             **
            *******************************************************************************
            
            0300: ff 43 41 3f 3d 3b 3c 58 | 64 44 42 40 3e 0f 29 59
            0310: 65 38 2a 70 1d 10 02 5a | 66 71 2c 1f 1e 11 03 5b
            0320: 67 2e 2d 20 12 05 04 5c | 68 39 2f 21 14 13 06 5d
            0330: 69 31 30 23 22 15 07 5e | 6a 72 32 24 16 08 09 5f
            0340: 6b 33 25 17 18 0b 0a 60 | 6c 34 35 26 27 19 0c 61
            0350: 6d 73 28 74 1a 0d 62 6e | 3a 36 1c 1b 75 2b 63 76
            0360: 55 56 77 78 79 7a 0e 7b | 7c 4f 7d 4b 47 7e 7f 6f
            0370: 52 53 50 4c 4d 48 01 45 | 57 4e 51 4a 37 49 46 54
            
              ; This was always a little mistique.. what is this really?
            
            0380: B8 28   MOV R0,#$28   ; reload Timer with @28
            0382: F0      MOV A,@R0     ; that is for $03AE!
            0383: 62      MOV T,A
            
            0384: 9A BF   ANL P2,#$BF   ; release CLK.. and wait for kbd to answer in a doesn't-make-sense-way(?)
            
            0386: 27      CLR A         ; loop R1-times (6?)
            0387: 26 AC   JNT0 $03AC    ;CLK pulled low by kbd?
            0389: 17      INC A
            038A: C6 90   JZ $0390
            038C: 26 AC   JNT0 $03AC
            038E: 64 87   JMP $0387
            0390: 26 AC   JNT0 $03AC
            0392: C9      DEC R1
            0393: F9      MOV A,R1
            0394: 96 86   JNZ $0386
            
            0396: 64 A7   JMP $03A7     ; disable kbd and return with Timeout Error
            0398: AA      MOV R2,A
            0399: 74 DE   CALL $03DE    ; pull CLK low and hold
            039B: FA      MOV A,R2
            039C: 17      INC A
            039D: C6 A3   JZ $03A3
            039F: 9A BF   ANL P2,#$BF   ; release CLK..
            03A1: 64 87   JMP $0387
            03A3: C9      DEC R1
            03A4: F9      MOV A,R1
            03A5: 96 84   JNZ $0384
            
            03A7: 74 DE   CALL $03DE    ; pull CLK low and hold
            03A9: 23 02   MOV A,#$02    ; disable kbd and return with Timeout Error
            03AB: 83      RET
            
            03AC: 36 98   JT0 $0398     ; CLK pulled low by kbd AND stable? Yes.. we fall thru start reading byte
            
              ; Receive byte from AT-keyboard
              ; CLK fell.. and CMD5=0. Timer should be preloaded.
              ; we read DATA on falling edges of CLK
              ; and compute parity (will be returned in A)
              ; (Amazing how much 8-bit code fits into 37 bytes!:)
            
            03AE: 55      STRT T
            03AF: BA 09   MOV R2,#$09
            03B1: BB 00   MOV R3,#$00
            03B3: 26 B3   JNT0 $03B3
            03B5: 67      RRC A
            03B6: 36 B6   JT0 $03B6     ; wait for CLK falling edge..
            03B8: 97      CLR C
            03B9: 46 BD   JNT1 $03BD    ; read in DATA into Carry
            03BB: A7      CPL C
            03BC: 1B      INC R3
            03BD: EA B3   DJNZ R2,$03B3
            03BF: AC      MOV R4,A
            03C0: 26 C0   JNT0 $03C0
            03C2: 64 C4   JMP $03C4
            03C4: 36 C4   JT0 $03C4
            03C6: 65      STOP TCNT     ; done
            03C7: 00      NOP
            03C8: 74 DE   CALL $03DE    ; pull CLK low
            03CA: FB      MOV A,R3      ; return parity: A=0 is OK
            03CB: 12 D1   JB0 $03D1
            03CD: 23 01   MOV A,#$01
            03CF: 64 D2   JMP $03D2
            03D1: 27      CLR A
            03D2: 83      RET
            
              ; Send data and status to Host
              ;   R1 -> STATUS (host can read 0x64)
              ;   R4 -> DBBOUT (host can read 0x60)
              ;   this then sets OBF -> IRQ1 on AT
            
            03D3: 09      IN A,P1       ; Copy keylock status bit
            03D4: 53 80   ANL A,#$80
            03D6: 77      RR A
            03D7: 77      RR A
            03D8: 77      RR A
            03D9: 49      ORL A,R1
            03DA: 90      MOV STS,A     ; write STATUS
            03DB: FC      MOV A,R4
            03DC: 02      OUT DBB,A     ; write DBBOUT
            03DD: 83      RET
            
              ; Frequently called.
              ; What does this mean to an AT-keyboard? Disable? Abort sending scan codes and wait for command?
              ; __
              ;   \____ _ _   pull CLK low and hold stable a while
            
            03DE: 8A 40   ORL P2,#$40
            03E0: B8 2A   MOV R0,#$2A
            03E2: F0      MOV A,@R0
            03E3: A8      MOV R0,A
            03E4: E8 E4   DJNZ R0,$03E4
            03E6: 83      RET
            
            
            *****************************************************************
            **   BANK 4:  XT-keyboard protocol routines                    **
            **                                                             **
            **       $0402  Read byte from XT-KBD                          **
            **       $0450  Send byte to XT-KBD (hae?)                     **
            *****************************************************************
            
              ; to read this page
            0400: A3      MOVP A,@A
            0401: 83      RET
            
              ; Read scan code from XT-KBD and handle errors
              ; send result to Host
            
            0402: 94 1C   CALL $041C
            0404: 12 1A   JB0 $041A     ; 
            0406: 32 14   JB1 $0414
            0408: B9 00   MOV R1,#$00
            040A: B8 20   MOV R0,#$20
            040C: F0      MOV A,@R0
            040D: 72 18   JB3 $0418
            040F: 09      IN A,P1
            0410: F2 18   JB7 $0418		; SW=1 send scan code to Host
            0412: 84 1A   JMP $041A		; SW=0 exit to Main
            0414: B9 40   MOV R1,#$40	; 
            0416: BC FF   MOV R4,#$FF
            0418: 74 D3   CALL $03D3
            041A: 24 02   JMP $0102     ; -> Main
            
              ; Receive byte in XT-keyboard protocol
              ; CLK fell.. and CMD5=1
            
            041C: 27      CLR A
            041D: 62      MOV T,A
            041E: 55      STRT T
            041F: B8 09   MOV R0,#$09
            0421: 27      CLR A
            0422: 8A 80   ORL P2,#$80
            0424: 00      NOP
            0425: 00      NOP
            0426: 00      NOP
            0427: 00      NOP
            0428: 26 37   JNT0 $0437
            042A: B8 24   MOV R0,#$24
            042C: F0      MOV A,@R0
            042D: 17      INC A
            042E: C6 31   JZ $0431
            0430: A0      MOV @R0,A
            0431: 23 01   MOV A,#$01
            0433: 9A 7F   ANL P2,#$7F
            0435: 84 4E   JMP $044E
            0437: 26 37   JNT0 $0437
            0439: 26 37   JNT0 $0437
            043B: 97      CLR C
            043C: 46 3F   JNT1 $043F
            043E: A7      CPL C
            043F: 67      RRC A
            0440: 36 40   JT0 $0440
            0442: 36 40   JT0 $0440
            0444: E8 37   DJNZ R0,$0437
            0446: 9A 7F   ANL P2,#$7F
            0448: 26 48   JNT0 $0448
            044A: 26 48   JNT0 $0448
            044C: AC      MOV R4,A
            044D: 27      CLR A
            044E: 65      STOP TCNT
            044F: 83      RET
            
              ; Send byte to XT-keyboard???
            
            0450: D2 54   JB6 $0454     ; XLAT?
            0452: 84 68   JMP $0468
            
            0454: B9 00   MOV R1,#$00   ; XLAT=1
            0456: E9 56   DJNZ R1,$0456
            0458: FC      MOV A,R4
            0459: AA      MOV R2,A
            045A: D3 EE   XRL A,#$EE
            045C: C6 60   JZ $0460
            045E: BC FA   MOV R4,#$FA
            0460: B9 00   MOV R1,#$00
            0462: 74 D3   CALL $03D3    ; Send to Host
            0464: FA      MOV A,R2
            0465: 17      INC A
            0466: 96 7A   JNZ $047A
            
              ; Set and hold.. then IDLE for XT-keyboard(?)
              ;                      ___
              ;     CLK   \___ __ __/
              ;             __ __ _
              ;    DATA    /       \____
            
            0468: 8A 40   ORL P2,#$40   ; XLAT=0
            046A: 8A 80   ORL P2,#$80
            046C: B8 2C   MOV R0,#$2C   ; pull CLK low and set DATA high
            046E: F0      MOV A,@R0
            046F: A8      MOV R0,A
            0470: B9 00   MOV R1,#$00
            0472: E9 72   DJNZ R1,$0472
            0474: E8 72   DJNZ R0,$0472 ; hold it in a loop of 256 x @2C
            0476: 9A 7F   ANL P2,#$7F   
            0478: 9A BF   ANL P2,#$BF   ; set the XT idle state
            047A: 83      RET
            
            
            *******************************************************************************
            **                                                                           **
            **        BANK 5:  Command parser and most Commands                          **
            *******************************************************************************
            
              ; to read this page
            0500: A3      MOVP A,@A
            0501: 83      RET
            
              ; There is a byte in DBBIN written to 0x64 bu the Host
            
            0502: 22      IN A,DBB
            
              ; xxxx xxxx
            
            0503: F2 09   JB7 $0509
            
              ; 0xxx xxxx
            
            0505: D2 12   JB6 $0512
            
              ; 00xx xxxx
            
            0507: A4 0D   JMP $050D
            
              ; 1xxx xxxx
            
            0509: D2 8C   JB6 $058C
            
              ; 10xx xxxx
            
            050B: A4 62   JMP $0562
            
              ; Command 00xx xxxx: Read RAM
              ; 0x00-0x1F will read 0x20-0x3F
              ; 0x20-0x3F will read 0x20-0x3F
            
            050D: B4 59   CALL $0559    ; Compute RAM address
            050F: F0      MOV A,@R0     ; read RAM into A
            0510: A4 DE   JMP $05DE     ; -> send A to Host and go Main
            
              ; Command 01xx xxxx: Write RAM
              ; 0x40-0x5F will write 0x20-0x3F
              ; 0x60-0x7F will write 0x20-0x3F
            
            0512: B4 59   CALL $0559    ; Compute RAM address
            0514: D6 14   JNIBF $0514   ; wait for byte from Host..
            0516: 76 02   JF1 $0502     ; command? abort
            0518: D3 20   XRL A,#$20    ; Host writes CMD BYTE?
            051A: C6 20   JZ $0520      ; no, write RAM and exit
            051C: 22      IN A,DBB
            051D: A0      MOV @R0,A
            051E: A4 E3   JMP $05E3     ; -> Main
            
              ; This is special: Host writes CMD BYTE at 0x20
              ; watch the bits
            
            0520: F0      MOV A,@R0     ; save CMD
            0521: A9      MOV R1,A      ; into R1 (for re-enabling the AT-KBD)
            0522: 22      IN A,DBB      
            0523: A0      MOV @R0,A     ; write CMD (!)
            
            0524: 12 42   JB0 $0542     ; CMD0 (OBF)
            0526: 9A EF   ANL P2,#$EF   ; P24=0 (OBF routed)
            
            0528: 32 46   JB1 $0546     ; CMD1 (_IBF)
            052A: 9A DF   ANL P2,#$DF   ; P25=0
            
            052C: 52 4A   JB2 $054A     ; CMD2 (mirror of F0 in STATUS)
            052E: 85      CLR F0        ; F0=0 
            
            052F: 92 4F   JB4 $054F     ; CMD4 (_EN) 
            0531: F9      MOV A,R1      ; check previous _EN
            0532: 37      CPL A
            0533: 92 39   JB4 $0539     ; _EN 1->0 transition? Host enabled a previously disabled keyboard?
            0535: B9 2E   MOV R1,#$2E   ; just set flag @2E=1 for Main and do next bit
            0537: B1 01   MOV @R1,#$01  ; (bc that will leave the AT-KBD disabled, CLK low!)
            0539: F0      MOV A,@R0
            053A: B2 53   JB5 $0553     ; CMD5?
            
              ; CMD5=0, set AT-KBD protocol: DISABLE AT-KBD on the wire immediately
              ;     ______
              ;  __/        set DATA high (idle)
              ;  ___  
              ;     \_____  pull CLK low (= disable AT-KBD) 
              
            053C: 8A 80   ORL P2,#$80
            053E: 8A 40   ORL P2,#$40
            0540: A4 E3   JMP $05E3     ; -> Main
            
              ; Host wrote CMD0 (OBF)
              
            0542: 8A 10   ORL P2,#$10   ; P24=1 means enable OBF routing (= IRQ1 enable on AT)
            0544: A4 28   JMP $0528     ; next bit..
            
              ; Host wrote CMD1 (_IBF)
            0546: 8A 20   ORL P2,#$20   ; P25=1
            0548: A4 2C   JMP $052C
            
              ; CMD2 (mirror of F0 in STATUS)
            054A: B6 2F   JF0 $052F
            054C: 95      CPL F0        ; F0=1
            054D: A4 2F   JMP $052F
            
              ; Host set CMD4 (_EN) = DISABLE KEYBOARD 
              ;  __  
              ;    \______  pull CLK LOW immediately
            
            054F: 8A 40   ORL P2,#$40
            0551: A4 3A   JMP $053A
            
              ; CMD=1 (XT-keyboard protocol): SET XT-KBD to IDLE on the wire immediately
              ;  __  
              ;    \______  DATA pulled low 
              ;      _____
              ;  ___/       CLK high (idle) = this is XT-mode IDLE state. 
            
            0553: 9A 7F   ANL P2,#$7F
            0555: 9A BF   ANL P2,#$BF
            0557: A4 E3   JMP $05E3     ; -> Main
            
              ; Compute RAM address for R/W commands 
              ;   if 001x xxxx (0x20 - 0x3F) we leave it (actual RAM address)
              ;   if 000x xxxx (0x00 - 0x1F) we add the value @2B (that is reset to 0x20)
              
            0559: 53 3F   ANL A,#$3F
            055B: B2 60   JB5 $0560
            055D: B8 2B   MOV R0,#$2B
            055F: 60      ADD A,@R0
            0560: A8      MOV R0,A
            0561: 83      RET           ; return RAM address in R0
            
              ; 10xx xxxx
            
            0562: 03 56   ADD A,#$56
            0564: 96 68   JNZ $0568
            
              ; Command AA
              ; Self-test and Reset
              
            0566: E4 00   JMP $0700
            
            0568: 07      DEC A
            0569: 96 6F   JNZ $056F
            
              ; Command AB
              ; Test kbd interface (DATA and CLK lines)
                
            056B: D4 69   CALL $0669    ; returns 0 (OK), 1, 2, 3 or 4 in R4
            056D: A4 DF   JMP $05DF     ; -> send R4 to Host with OK, then ->Main
            
            056F: 07      DEC A
            0570: 96 76   JNZ $0576
            
              ; Command AC
              ; Diagnostic Dump of 20 bytes in scan code set-1 format
                
            0572: D4 12   CALL $0612
            0574: A4 E3   JMP $05E3     ; -> Main
            
            0576: 07      DEC A
            0577: 96 81   JNZ $0581
            
              ; Command AD
              ; Disable kbd interface
              ; = set _EN
            
            0579: B8 20   MOV R0,#$20
            057B: F0      MOV A,@R0
            057C: 43 10   ORL A,#$10    ; CMD4=1 _EN (kbd disabled)
            057E: A0      MOV @R0,A
            057F: A4 E3   JMP $05E3     ; -> Main
            
            0581: 07      DEC A
            0582: 96 E3   JNZ $05E3     ; -> Main
            
              ; Command AE
              ; Enable kbd interface
              ; = clr _EN
            
            0584: B8 20   MOV R0,#$20
            0586: F0      MOV A,@R0
            0587: 53 EF   ANL A,#$EF    ; CMD4=0 _EN (kbd enabled)
            0589: A0      MOV @R0,A
            058A: A4 E3   JMP $05E3     ; -> Main
            
              ; 11xx xxxx
            
            058C: B2 AC   JB5 $05AC
            
              ; 110x xxxx
            
            058E: 92 CE   JB4 $05CE
            
              ; 1100 xxxx
            
            0590: D3 C0   XRL A,#$C0
            0592: 96 97   JNZ $0597
            
              ; Command C0
              ; Read P1 into A and return
            
            0594: 09      IN A,P1
            0595: A4 DE   JMP $05DE     ; -> send A to Host and -> Main
            
            0597: D3 02   XRL A,#$02
            0599: 96 A1   JNZ $05A1
            
              ; Command C2
              ; Read P1 higher nibble into STATUS (4..7 only) 
              ; and loop until Host writes a dummy byte to 0x60 or 0x64 (!)
              ; (what is this? to let Host poll P1 through STATUS?)
            
            059B: 09      IN A,P1
            059C: 90      MOV STS,A
            059D: D6 9B   JNIBF $059B
            059F: A4 E3   JMP $05E3     ; -> Main
            
            05A1: D3 01   XRL A,#$01    ; ignore all other 0xCx
            05A3: 96 E3   JNZ $05E3     ; -> Main
            
              ; C1 
              ; Read P1 lower nibble into STATUS (4..7 only) 
              ; and loop until Host writes a dummy byte to 0x60 or 0x64 (!)
              ; (what is this? to let Host poll P1 through STATUS?)
            
            05A5: 09      IN A,P1
            05A6: 47      SWAP A
            05A7: 90      MOV STS,A
            05A8: D6 A5   JNIBF $05A5
            05AA: A4 E3   JMP $05E3     ; -> Main
            
            05AC: 92 BC   JB4 $05BC
            05AE: D3 E0   XRL A,#$E0    ; we ignore if not E0
            05B0: 96 E3   JNZ $05E3     ; -> Main
            
              ; Command E0
              ; Read T0/T1 input pins (CLK/DATA)
             
            05B2: 26 B6   JNT0 $05B6    
            05B4: 43 01   ORL A,#$01
            05B6: 46 DE   JNT1 $05DE
            05B8: 43 02   ORL A,#$02
            05BA: A4 DE   JMP $05DE     ; -> send A to Host and -> Main
            
              ; Command F0..FF
              ; Pulse P2 bits 0..3 
            
            05BC: AA      MOV R2,A
            05BD: 37      CPL A
            05BE: A9      MOV R1,A
            05BF: B8 20   MOV R0,#$20
            05C1: F0      MOV A,@R0
            05C2: 47      SWAP A
            05C3: 53 30   ANL A,#$30
            05C5: AB      MOV R3,A
            05C6: 0A      IN A,P2
            05C7: 4B      ORL A,R3
            05C8: 5A      ANL A,R2
            05C9: 3A      OUTL P2,A
            05CA: 49      ORL A,R1
            05CB: 3A      OUTL P2,A
            05CC: A4 E3   JMP $05E3     ; -> Main
            
            05CE: D3 D0   XRL A,#$D0
            05D0: C6 DD   JZ $05DD
            
            05D2: 07      DEC A         
            05D3: 96 E3   JNZ $05E3     ; -> Main
            
              ; Command D1
              ; Write P2
              
            05D5: D6 D5   JNIBF $05D5   ; wait for byte from Host (NB! infinite loop)
            05D7: 76 02   JF1 $0502     ; 0x64 written? Parse command
            05D9: 22      IN A,DBB      ; read byte written to 0x60
            05DA: 3A      OUTL P2,A     ; out P2
            05DB: A4 E3   JMP $05E3     ; -> Main
            
              ; Command D0
              ; Read P2
            
            05DD: 0A      IN A,P2       ; read P2
            
              ; Return to Main with sending A to Host   
            
            05DE: AC      MOV R4,A      ; send to Host fall through
            
              ; Return to Main with sending R4 to Host  
            
            05DF: B9 00   MOV R1,#$00   ; STATUS=OK
            05E1: 74 D3   CALL $03D3    ; send R4 to Host
            
                ; Return to Main 
            
            05E3: 27      CLR A         ; 
            05E4: 24 02   JMP $0102     ; -> Main
            
            
            ****************************************
            ***    BANK 6:  Command AC and AB     **
            ****************************************
            
              ; 16 ASCII hexa digits in scan code set-1 format
              ; Eg. 0B in scan code set-1 is the '0'-key..
            
            0600: 0B 02 03 04 05 06 07 08 09 0A 1E 30 2E 20 12 21
            
              ; to read this page
            0610: A3      MOVP A,@A
            0611: 83      RET
            
              ; Command AC
              ; ==========
              ; Will send 20 bytes to Host in scan code set-1 format(!), like "10 06 E0 ..."
              ; First it stored these: 
              ;   @30=P1
              ;   @31=P2
              ;   @32 T0/T1 (KB CLK and DATA from Test pins)
              ;   @33 PSW
              ; Then pumps 20 bytes out from @20-@33
              ;   @20 (CMD byte)
              ;   @21-@2F (different variables, error counters, see above)
            
            0612: 23 10   MOV A,#$10    ; set _EN
            0614: 90      MOV STS,A
            0615: B8 30   MOV R0,#$30
            0617: 09      IN A,P1
            0618: A0      MOV @R0,A     ; @30=P1
            0619: 18      INC R0
            061A: 0A      IN A,P2
            061B: A0      MOV @R0,A     ; @31=P2
            061C: 18      INC R0
            061D: 27      CLR A
            061E: 26 22   JNT0 $0622
            0620: 43 01   ORL A,#$01
            0622: 46 26   JNT1 $0626
            0624: 43 02   ORL A,#$02
            0626: A0      MOV @R0,A     ; @32=T0/T1
            0627: 18      INC R0
            0628: C7      MOV A,PSW
            0629: A0      MOV @R0,A     ; @33=PSW
            
            062A: B9 14   MOV R1,#$14   ; Dump 20 bytes
            062C: B8 20   MOV R0,#$20   ; from @20
            062E: D6 32   JNIBF $0632   ; Host should just read patiently
            0630: C4 57   JMP $0657     ; Host sending aborts dumping
            0632: 86 2E   JOBF $062E
            0634: D4 58   CALL $0658
            0636: F0      MOV A,@R0
            0637: 47      SWAP A        ; hexa hi-nibble first
            0638: 53 0F   ANL A,#$0F
            063A: A3      MOVP A,@A     ; look-up
            063B: 02      OUT DBB,A     ; send scan code to Host
            063C: D6 40   JNIBF $0640
            063E: C4 57   JMP $0657
            0640: 86 3C   JOBF $063C
            0642: D4 58   CALL $0658    ; delay..
            0644: F0      MOV A,@R0     ; hexa lo-nibble
            0645: 53 0F   ANL A,#$0F
            0647: A3      MOVP A,@A
            0648: 02      OUT DBB,A
            0649: D6 4D   JNIBF $064D
            064B: C4 57   JMP $0657
            064D: 86 49   JOBF $0649
            064F: D4 58   CALL $0658
            0651: 23 39   MOV A,#$39    ; send 0x39 (set-1 space? yes!)
            0653: 02      OUT DBB,A
            0654: 18      INC R0        ; inc pointer
            0655: E9 2E   DJNZ R1,$062E ; loop
            0657: 83      RET
            
              ; Some delay to give Host to remove characters
            
            0658: F8      MOV A,R0
            0659: AA      MOV R2,A
            065A: F9      MOV A,R1
            065B: AB      MOV R3,A
            065C: B8 00   MOV R0,#$00
            065E: B9 40   MOV R1,#$40
            0660: E8 60   DJNZ R0,$0660
            0662: E9 60   DJNZ R1,$0660
            0664: FB      MOV A,R3
            0665: A9      MOV R1,A
            0666: FA      MOV A,R2
            0667: A8      MOV R0,A
            0668: 83      RET
            
              ; Command AB
              ; ==========
              ;   "lines stuck test"
              ;   returns 0 (OK), 1, 2, 3 or 4
            
            0669: 9A BF   ANL P2,#$BF   ; release CLK line (=> should be HIGH)
            066B: 8A 80   ORL P2,#$80   ; release DATA line (=> should be HIGH)
            
            066D: B8 00   MOV R0,#$00
            066F: 36 77   JT0 $0677     ; OK, CLK high
            0671: E8 6F   DJNZ R0,$066F
            0673: BC 01   MOV R4,#$01   ; Error, CLK stuck low
            0675: C4 98   JMP $0698
            
            0677: 8A 40   ORL P2,#$40   ; pull CLK low
            0679: C4 7B   JMP $067B     ; delay
            067B: 26 83   JNT0 $0683    ; OK, CLK low
            067D: 9A BF   ANL P2,#$BF   ; (release CLK line anyway from my side)
            067F: BC 02   MOV R4,#$02   ; Error, CLK stuck low
            0681: C4 98   JMP $0698
            
            0683: B8 00   MOV R0,#$00   ;
            0685: 56 8D   JT1 $068D     ; OK, DATA high
            0687: E8 85   DJNZ R0,$0685
            0689: BC 03   MOV R4,#$03   ; Error, DATA stuck low
            068B: C4 98   JMP $0698
            
            068D: 9A 7F   ANL P2,#$7F   ; pull DATA low
            068F: 00      NOP
            0690: BC 00   MOV R4,#$00   ;
            0692: 46 96   JNT1 $0696    ; OK
            0694: BC 04   MOV R4,#$04   ; Error, DATA stuck high
            0696: 8A 80   ORL P2,#$80   ; release DATA line anyway, exit
            
            0698: 83      RET
            
            
            **********************************
            ***     BANK7: SELF-TEST       ***
            **********************************
            
              ; Entry point when Host sends Command AA
            
            0700: 89 FF   ORL P1,#$FF
            0702: 23 CF   MOV A,#$CF
            0704: 3A      OUTL P2,A
            0705: C5      SEL RB0
            
              ; Entry point after Reset
            
            0706: 23 20   MOV A,#$20
            0708: 90      MOV STS,A
            0709: 96 0D   JNZ $070D
            070B: 04 4F   JMP $004F
            070D: 27      CLR A
            070E: C6 12   JZ $0712
            0710: 04 4F   JMP $004F
            0712: 97      CLR C
            0713: E6 17   JNC $0717
            0715: 04 4F   JMP $004F
            0717: A7      CPL C
            0718: F6 1C   JC $071C
            071A: 04 4F   JMP $004F
            071C: 23 30   MOV A,#$30
            071E: 90      MOV STS,A
            071F: B8 00   MOV R0,#$00
            0721: F8      MOV A,R0
            0722: 96 52   JNZ $0752
            0724: B8 55   MOV R0,#$55
            0726: F8      MOV A,R0
            0727: D3 55   XRL A,#$55
            0729: 96 52   JNZ $0752
            072B: B8 AA   MOV R0,#$AA
            072D: F8      MOV A,R0
            072E: D3 AA   XRL A,#$AA
            0730: 96 52   JNZ $0752
            
            0732: B8 7F   MOV R0,#$7F   ; 128 bytes of RAM
            0734: F8      MOV A,R0
            0735: A0      MOV @R0,A
            0736: E8 34   DJNZ R0,$0734
            
            0738: B8 7F   MOV R0,#$7F   ; 128 bytes of RAM
            073A: F8      MOV A,R0
            073B: D0      XRL A,@R0
            073C: 96 52   JNZ $0752
            073E: 23 55   MOV A,#$55
            0740: A0      MOV @R0,A
            0741: D0      XRL A,@R0
            0742: 96 52   JNZ $0752
            0744: 23 AA   MOV A,#$AA
            0746: A0      MOV @R0,A
            0747: D0      XRL A,@R0
            0748: 96 52   JNZ $0752
            074A: A0      MOV @R0,A
            074B: D0      XRL A,@R0
            074C: 96 52   JNZ $0752
            074E: E8 3A   DJNZ R0,$073A
            0750: E4 54   JMP $0754
            0752: 04 4F   JMP $004F
            
            0754: 23 40   MOV A,#$40    ; ROM checksum?
            0756: 90      MOV STS,A
            0757: 23 FF   MOV A,#$FF
            0759: AE      MOV R6,A
            075A: AF      MOV R7,A
            075B: BA 08   MOV R2,#$08
            075D: B8 00   MOV R0,#$00
            075F: FA      MOV A,R2
            0760: AB      MOV R3,A
            0761: F8      MOV A,R0
            0762: 37      CPL A
            0763: 17      INC A
            0764: EB 67   DJNZ R3,$0767
            0766: A3      MOVP A,@A
            0767: EB 6B   DJNZ R3,$076B
            0769: D4 10   CALL $0610
            076B: EB 6F   DJNZ R3,$076F
            076D: B4 00   CALL $0500
            076F: EB 73   DJNZ R3,$0773
            0771: 94 00   CALL $0400
            0773: EB 76   DJNZ R3,$0776
            0775: E3      MOVP3 A,@A
            0776: EB 7A   DJNZ R3,$077A
            0778: 54 00   CALL $0200
            077A: EB 7E   DJNZ R3,$077E
            077C: 34 00   CALL $0100
            077E: EB 82   DJNZ R3,$0782
            0780: 14 8C   CALL $008C
            0782: DE      XRL A,R6
            0783: AD      MOV R5,A
            0784: 47      SWAP A
            0785: AC      MOV R4,A
            0786: DD      XRL A,R5
            0787: AE      MOV R6,A
            0788: E7      RL A
            0789: 53 E0   ANL A,#$E0
            078B: DD      XRL A,R5
            078C: 2E      XCH A,R6
            078D: F7      RLC A
            078E: 47      SWAP A
            078F: 67      RRC A
            0790: 67      RRC A
            0791: E7      RL A
            0792: 53 F1   ANL A,#$F1
            0794: 2C      XCH A,R4
            0795: 53 0F   ANL A,#$0F
            0797: AD      MOV R5,A
            0798: E7      RL A
            0799: DC      XRL A,R4
            079A: DF      XRL A,R7
            079B: 2E      XCH A,R6
            079C: DD      XRL A,R5
            079D: AF      MOV R7,A
            079E: E8 5F   DJNZ R0,$075F
            07A0: EA 5F   DJNZ R2,$075F
            07A2: FE      MOV A,R6
            07A3: 96 AA   JNZ $07AA
            07A5: FF      MOV A,R7
            07A6: 96 AA   JNZ $07AA
            07A8: E4 AC   JMP $07AC
            07AA: 04 4F   JMP $004F
            
            07AC: 23 50   MOV A,#$50    ; Test Timer intr
            07AE: 90      MOV STS,A
            07AF: 27      CLR A
            07B0: 62      MOV T,A
            07B1: 25      EN TCNTI      ; INT enable
            07B2: B9 0F   MOV R1,#$0F
            07B4: F4 C4   CALL $07C4    ; A=0 here
            07B6: 32 C2   JB1 $07C2     ; A=2? Timer Intr occured
            07B8: B9 02   MOV R1,#$02
            07BA: F4 C4   CALL $07C4
            07BC: 32 C0   JB1 $07C0
            07BE: E4 C2   JMP $07C2
            07C0: 04 5F   JMP $005F
            07C2: 04 4F   JMP $004F
            
            07C4: 55      STRT T        ; loop and let Timer intr happen
            07C5: B8 00   MOV R0,#$00
            07C7: E8 C7   DJNZ R0,$07C7
            07C9: E9 C7   DJNZ R1,$07C7
            07CB: 65      STOP TCNT
            07CC: 00      NOP
            07CD: 83      RET
            
              ; A0 38 (what is this at the end of the ROM?)
            07FE: A0      MOV @R0,A
            07FF: 38      OUTL P0,A
            
            
            
            RAM Memory Map
            ==============
            The 8042 has 128 bytes of RAM. The RAM also stores 2 x 8 General Registers and the Program Stack. The rest is used by the firmware for variables (eg. the COMMAND BYTE @20, timer reload values, flags) and for different *Error Counters*: they count an event from zero to 255, but not more, and can be read by the AC Command. 
            Theoretically.. the Host could write these parameters and affect the operation of the 8042! Eg. to change a timer reload value, clear an Error Counter, etc.. just thinking.
            
            
            @00 --+     R0-R7
            @01   |     8 BANK0 registers
            @02   |     Direct RAM access:
            @03   |       R0-R7 implicite in instruction byte
            @04   |     Indirect RAM access:
            @05   |       Indexed through @R0 or @R1
            @06   |
            @07 --+
            @08 --+
            @09   |
            @0A   |
            @0B   |
            @0C   |
            @0D   |     8 words (2 x 8 bytes)
            @0E   |
            @0F   |     PROGRAM STACK
            @10   |
            @11   |
            @12   |
            @13   |
            @14   |
            @15   |
            @16   |
            @17 --+
            @18 --+
            @19   |
            @1A   |     R0'-R7'
            @1B   |     8 BANK1 registers
            @1C   |
            @1D   |
            @1E   |
            @2F --+
            
            @20 ---  COMMAND BYTE, the *mighty*
            @21 ---  This is how many times we resend (FE) after parity error (init to 1)
            @22 ---  (=0x06) Used in 380. checked for zero after succesful sending byte to kbd. If zero, jump back into main loop..
            @23 ---  ERROR CNT: # of parity errors detected since reset
            @24 ---  ERROR CNT: too short signal fall on CLK detected (noise?)
            @25 ---  (=0x01) ?
            @26 ---  TIMER RELOAD, first pulse, when Send BYTE to KBD (init to 0x00)
            @27 ---  TIMER RELOAD, bit pulses, when Send BYTE to KBD (init to 0xFB)
            @28 ---  Timer reload (=0xE0): after kbd pulls down CLK, this is how much we wait to set it high again.
            @29 ---  (=0x06) ?
            @2A ---  loop counter for pulling CLK low and hold it stable for a while (how long? 60us? 250us?)
            @2B ---  base for RAM write command = 0x20
            @2C ---  loop counter for XT-keyboard before set to IDLE
            @2D ---  make/brake code (0x00 or 0x80) for scan code set-2
            @2E ---  flag, Host has enabled a previously disabled kbd by clearing _EN in Command Byte
            @2F ---  ERROR CNT: IBF interrupt occured (not supposed to, we poll IBF)
            @30 ---  We copy P1 here for CMD AC (Diagnostic Dump)
            @31 ---  We copy P2 here for CMD AC (Diagnostic Dump)
            @32 ---  bit0: T0, bit1:T1 (KB CLK and DATA from Test pins) for CMD AC (Diagnostic Dump)
            @33 ---  PSW (Program Status Word) of the 8042, for CMD AC (Diagnostic Dump)
            
            @34-@7F   unused?
            
            
            <EOF>
            
            
          • 8042_INTERN.TXT
                               8042 INTERN
                               ===========
            An attempt to reveal the internal operation of the IBM PC AT 8042 keyboard controller based the disassembly of 2KB ROM from 1983. This is of historical interest. 
            
                             A. Tarpai 2010
                        A little 8-bit nostalgia :)
             (Questions & comments are welcome to tarpai76 at gmail)
                     This file has been downloaded from
                http://www.halicery.com/8042/8042_INTERN.TXT
            
              
            ***  TOC  
                 ===  
               
                 PART I 
                 -
                 All the information I could collect on the 8042
                 
                 PART II 
                 - 
                 ROM Disassembly
                 
                 PART III
                 - 
                 An UPI 41/42 disassembler 
                 
            
            *** 
                      
                 
                                 PART I 
                 
            About the 8042
            ==============
            
                   +----------------+
                   |                |
                   |   IBM PC/AT    | 
                   |    ("Host")    |       <- scan codes
                   |            +----+                        +-------------------------+
                   |       0x60 |8042|  <--- DATA ----------> |     AT  KEYBOARD        |
                   |       0x64 |KBC |  <--- CLOCK ---------> |       84-key            |
                   |            |    |                        +-------------------------+
                   |            +----+      kbd commands ->
                   |                |      
                   |                |       
                   |                |       
                   +----------------+       
             
            IBM used an 8042 slave UPI microcomputer in the AT in 1984 as the keyboard controller. The AT keyboard was an improvement to the previous keyboard of the IBM PC and XT: it not only had 1 extra key (84 keys), but it could also receive commands from the host. Thus the connection became bi-directional and the interface much more complex. They chose to program up an 8042 for the job and solder it onto the new AT motherboard. Today all Super I/O chips sitting on the LPC bus is emulating the functions of the 8042 for the PC when turned on. 
            
            I was always very interested in the keyboard - as I'm currently typing it - and in the low-level keyboard hardware programming. Using a pre-programmed microcontroller (as it would be called today) is a quite advanced and cool feature I think (the PC and XT had only a simple serial-to-parallel converter IC to interface the keyboard). 
            
            The 'programming interface' for the AT- and PS/2-like keyboard and mouse controllers, just as the whole IBM PC is well-documented - except the program, the firmware, that drives the 8042 to function as a keyboard controller (KBC). The only thing I knew was that IBM, Award and Phoenix all wrote firmware for the 8042 and derivates used in the AT and PS/2 line of computers. The code itself was never found. 
            
            Then someone talented has dumped the 2K program ROM of a 8042-like KBC in the AT. This is a 2KB binary file and I had no idea what's inside! But peeked in with a hex editor and it looked very exciting: IBM 1983. OK, so what are these microcomputers anyway and how they work? I found these always very confusing when programming ibm-style keyboards, mice and controllers: the status register and the command byte? both has status bits... where are they exactly? When sending commands? to the KBC, to the KBD (and to the mouse)? This is the base of the whole exciting quest, that hopefully adds a bit and clears up some of the mist how these controllers really operate. 
            
            How this was done
            ==================
            
              From the MESS project: "the 1503033 AT i8042 keyboard controller was dumped by Kevin Horton", "Keyboard Controller is effectively dumped (it is almost certainly the same as on the AT, has same P/N but is on a preprogrammed eprom-based i8642 instead of a mask rom i8042)" - isn't it 8742??
            
              1. get 1503033.bin  
              2. study Intel UPI-41/42 USER'S MANUAL 
              3. wrote a (dumb) 41/42 disassembler
              4. comment it.. with some love of 8-bit-nostalgia :))
            
            
            TODO
            ====
            
              1. there are still some white spots in the code (eg. the ROM checksum?)
              2. and I certainly made mistakes.. feel free to contribute! 
              3. a PS/2-style firmware dump would be GREAT!
            
            
            *******************************************************************************  
              
            The 8042 in general
            ===================
            
              The 8042 was a slave UPI from Intel used for controlling hardware peripherials (it became famous for being used as the KBC of the AT and later for kbd/mouse of the PS/2). 
            
              The 8042 faces 2 sides: the Host system (eg. AT ISA bus) and the I/O lines to the peripherials. There is a microcomputer 'in the middle' with its own little 8-bit CPU, 2KB program memory in the ROM it executes, and some 128 bytes RAM: 
               
            
                                +-------------------+
                          ----> |R               P27| --
                          ----> |W      8042     P26| --
                          ----> |A0     ====     P25| --
                                |                P24| --
                                |                P23| --
                                |                P22| --      I/O lines    
                                |                P21| --
                                |       C P U    P20| --
                Host            |       R O M       | 
                system          |D7     R A M    P17| --
                R/W             |D6              P16| --
                                |D5              P15| --
                         <----> |D4              P14| --
                                |D3              P13| --
                                |D2              P12| --
                                |D1              P11| --
                                |D0              P10| --
                                |                   | 
                                |                 T0| --
                                |                 T1| --
                                +-------------------+ 
                                                        
                               
            History of the 8042
            ===================
              
              February, 1978.. a preliminary description from iNTEL of the 8041/8741 UPI 8-bit microcomputer:  
              - Pin Compatible ROM (8041) and UV-erasable EPROM (8741) versions
              - 1K words of program memory, 64 words data memory on-chip
              - CPU, ROM, RAM, I/O, Timer and Clock in a Single Package
              - clocked at 6 MHz
              This was the same year as the MCS-48 (8048) products. 
              
              The later 8042/8742 model had doubled the memory and clock frequency: 
              - 2KB ROM, 128 byte RAM
              - 12 MHz
              
              8242. Pre-programmed versions for the keyboard and keyboard/mouse controller, firmware from IBM, Award and Phoenix for the AT and PS/2. 
              
              8742. EPROM (UV-erasable ROM) version of the 8042. 
                 
              
              
            8042 architecture 
            =================
                 
              I/O lines
              ---------
              - 2x8 input and output lines, open-collector
              - pins in, out, in/out
              - open collector with high imp internal pull-up
              - 2 Test input pins, T0 and T1 (can be tested by machine instructions: JT0, JNT0, JT1, JNT1)
              
              
              Host interface 
              --------------
              - 8-bit data bus
              - 3 physical registers
              - 2 DATA BUS BUFFER registers (DBBIN and DBBOUT)
              - 1 status register (STATUS)
              - R, W, A0 input to chose register and R/W
              - the 8042 never initiates bus cycles (='slave') only answers them
            
              
              How the DATA BUS BUFFER registers work?
              ---------------------------------------
            
              The name is very descriptive actually: data bus buffers. They buffer between the external- and the internal 8-bit data buses in both (R/W) directions:
              
            
                          +------------------------------------------------------------+
                          |          R=1   +----------+                          8042  |
                          |        <-----  |  STATUS  | <----->-+ MOV STS,A      ====  |
                   R ---> |         A0=1   +----------+         | MOV A,STS            |
                   W ---> |                                     |                      |
                  A0 ---> |      R=1   +---------------+     (OUT DBB,A)               |
                          |   +----<-- |    DBB OUT    | <------+                      |
                          |   | A0=0   +---------------+        |                      |
                D0-7 <--> | <->                                 '<-----> Accumulator   | 
                          |   |        +---------------+        |                      |
                          |   +------> |    DBB IN     | -->----+                      |
                          |     W=1    +---------------+      (IN A,DBB)               |
                          |                                                            |
                          |                                                            |
                          +------------------------------------------------------------+
            
                                                        
                    DBBIN             
                    - Host write sets IBF in STATUS
                    - 8042 read clears IBF in STATUS
                                      
                    DBBOUT            
                    - 8042 write sets OBF in STATUS
                    - Host read clears OBF in STATUS
                    (OBF can also be routed to output P24 to interrupt Host)
                    
                    In the STATUS register these bits are controlled by the 8042 hardware automatically (the remaining bits are for software use and don't-care for the 8042):  
                    
                    +-----------------------+
                    | | | | |A0 |   |IBF|OBF|  
                    +-----------------------+
                    
                    They reflect the data bus buffer registers' status and the A0 input pin. The Host can read out the content of this register any time by setting A0 and make a read from the 8042. 
                   
              
              8-bit CPU
              ---------
              - 2K program ROM
              - 128 byte RAM
              - 2 banks of 8 registers
              - Accumulator for ALU (add, or, and, xor..) 
              - 8 words stack
              - 3-bit stack pointer SP
              - PSW and flags
              - 10-bit Prg Cnt
              - Timer and IBF interrupts
              - port (P1 and P2) instructions 
              - TEST pin instr
              - inc/dec registers
              - jmp abs and conditional
              - instructions can wait for data from the Host
              - or some signal change on the input pins
              - subroutines
              - nice instruction set 
              - faces the ISA Host 
            
              
            Open collector
            ==============
            
              Took me a while to understand.. but there is a very important principle: 
              
              - if the line is not controlled by anybody, it's HIGH
              - if anybody pulls the line LOW, it stays low. 
              
                 
                                5V
                                 |              Line pulled low..
                                 |            
                       0 ->------+
                                 |
                                 +---> '0'         ..read as '0'
                                 |
               
                  
                                5V
                                 |    
                                 |            
                       1 ->--    +              'Disconnected'..
                                 |
                                 +---> '1'         ..read as '1'
                                 |
            
                                                      
                                5V
                                 |    
                                 |            
                       1 ->--    +-----<---      When disconnected, others drive the bus..
                                 |
                        0/1 <----+                  ..and level can be read as input
                                 |
                
              
            The 8042 in the AT
            ==================
              
              To understand and comment the disassembly these were *must* to know how the 8042 was soldered on the AT mobo: the 8042 is in a HARDWIRED configuration and the firmware is programmed accordingly. This means the code controls certain lines and I had to know the schematics to understand. 
                
              The main function of the keyboard controller (KBC) is to handle the bi-directional data flow between the computer and the keyboard (KBD). It appeared on the IBM PC/AT motherboard as a 8042-variant in 1984: 
              
                   +----------------+
                   |                |
                   |   IBM PC/AT    | 
                   |                |       <- scan codes
                   |            +----+                        +-------------------------+
                   |            |8042|  <--- DATA ----------> |     AT  KEYBOARD        |
                   |       0x60 |KBC |  <--- CLOCK ---------> |       84-key            |
                   |       0x64 |    |                        +-------------------------+
                   |            +----+       kb commands ->
                   |                |      
                   |                |       
                   |                |       
                   +----------------+       
                                          
               Data flows in both directions (half-duplex) on 2-wires, CLK and DATA, using a 5 pin DIN plug: 
               
                      ____ ____  
                     /    -    \  
                    |           | 
                    | 1       3 | 
                    |  4     5  | 
                     \    2    /  
                       -------    
            
            
            AT schematics of 8042: The Host interface
            -----------------------------------------
            
              The AT provides the chip select signal when the CPU reads/writes I/O-space 0x60 or 0x64. Bit 2 of the address line is connected to the A0 input of the 8042, so the 4 legal combinations from the Host side are:
                
                            >> AT <<      R  W  A0     >> 8042 <<      
                           """"""""""     |  |  |     """"""""""""       
                                                 
                           read 0x60      1  0  0      <-----  DBBOUT
                            
                           read 0x64      1  0  1      <-----  STATUS
                                                                
                           write 0x60     0  1  0      ---+                 +--> KBD CMD
                                                          |--> DBBIN + F1 --|
                           write 0x64     0  1  1      ---+                 +--> KBC CMD
                         
              
              - when Host makes a read cycle the 8042 places the contents of the DBBOUT or STATUS onto the external data bus based on the state of A0
              - when Host makes a write cycle, the 8042 places the data into the DBBIN register and sets bit3 of the STATUS register based on the state of A0 (this is the reason for "before writing to 0x60 or 0x64 check if IBF=0 in the STATUS register"). Note that it is the 8042's program that will interpret the contents of the DBBIN register (data byte with write address of 0x60 or a so called command byte written to 0x64). 
                             
            The AT-style STATUS register (read 0x64)
            ----------------------------------------
                
                              +---------------+
                   0x64  <--  |    STATUS     |  <---->
                              +---------------+
                              
                              7  Parity error 
                              6  Receive timeout
                              5  Transmit timeout
                              4  INH (copy of P17 input, the keyboard switch, when a byte sent to Host)
                              
                              3  F1 (hw, A0 input)
                              2  F0 
                              1  IBF (hw)
                              0  OBF (hw)                  
                             
                There are 3 hardware status bits: OBF, IBF and F1, which are set/cleared by the 8042 hardware during operation.
                
                F0 ('SYS'): This firmware never touches it. Host can write it by setting bit2 in the Command Byte. 
                
                The upper 4 bits (and F0) are software status bits and can mean anything.. (that's the reason they differ in AT- or PS/2-mode programmed 8042). These bits can be set in software by executing 8042 machine instructions: 
                
                  "MOV STS,A" 
                    writes the upper nibble, bits 4-7 of the STATUS register 
                    
                  "CLR F0" and "CPL F0"
                    clears and complements the F0 bit 
                    
                  "CLR F1" and "CPL F1"
                    clears and complements the F1 bit 
                
              
            AT schematics of 8042: The I/O interface
            ----------------------------------------
            
              I drew only the pins that has meaning in the code:  
            
            
                 +----------------+
                 |             P27| ------> DATA
                 |     8042    P26| ------> _CLK
                 |     ====    P25| ------> 
                 |             P24| ------> OBF (IRQ1)
                 |             P23| ------> _IBF (NC)
                 |             P22| ------>
                 |             P21| ------> 
                 |             P20| ------>
                 |                |  
                 |             P17| <-----  KEY INHIBIT SWITCH
                 |             P16| <----- 
                 |             P15| <-----  
                 |             P14| <----- 
                 |             P13| <-----  
                 |             P12| <----- 
                 |             P11| <-----  
                 |             P10| <----- 
                 |                | 
                 |              T0| <----- CLK
                 |              T1| <----- DATA
                 +----------------+  
            
            
              Because of the hardwired configuration of the pins this is very important to know when reading the code. There are 2 8-bit I/O ports on the 8042, any pins can be input, output, or both(!) - cool and flexible by the way. In the AT P1 is set for input on reset, P2 is for output: 
             
              P27 -> Keyboard Data
              P26 -> inverted(!) -> Keyboard Clock 
              P25 -> (not connected) _IBF routing for host interrupts: inverted, we interrupt host when DBBIN had been emptied by 8042
              P24 -> OBF routing for host interrupts: we interrupt host when DBBOUT had been written by 8042
            
                (The rest of the pins left free and was used for various things in the AT, don't care for the 8042, like A20-line and Reset-line). 
              
              P17 <- keyboard switch (I've seen this in my life=): it's really a KEY in a keyhole, kbd INHIBITED when the key is not in and locked (=0). 
              
                (The rest of the input lines are don't care for the 8042)
                
                
            AT schematics of 8042: Keyboard CLOCK and DATA
            ----------------------------------------------   
                
              When I first read the disassembly it was very confusing and didn't make any sense, setting/clearing CLK and DATA.. then I saw this: an AT-compatible implementation (VT82C42) of the 8042, which cleared it up. 
              
              C L O C K   I S   I N V E R T E D ! (DATA is not, and don't ask me why, and the whole code is written for this schematics - caused me days of headache.. eg. "ANL P2,#$BF" pulls output P26 low, which will set the CLK HIGH): 
            
              
                +----------------------------+
                |                            |
                |                    |\      | 
                |                    | \     |
                +--> T0       P26 ---|  0----+------   Keyboard CLOCK
                                     | /      
                                     |/         
                                     
               
                                     |\       
                                     | \      
                +--> T1       P27 ---|  -----+------   Keyboard DATA
                |                    | /     |
                |                    |/      |  
                |                            |  
                +----------------------------+
             
                
              The following CLK schematics is actually from a PS/2-style datasheet (8242BB), but it's interesting. Note the inverter on the output pin! 
            
                             5V
                              |
                              � 10K
                              |
                      |\      |
                      | \     |
              P26 ----|  0----+
                      | /     |
            	      |/      +---<---->--- KBD
            	              |
               T0 <-----------+
            	              |
            	              = 47pF
            	              |
                             GND
            
            
            
            H  _____ idle = input that can be tested by reading the level back
                    \
            L        \_____  pulled down: written, read as low for sure
            
                                                  
            ****************************************************************************************************************     
            
            The disassembler was written by me and is totally free of use, full source code included. 
            
            
            About the code
            ==============
            
            This code is from an AT-style 8042 controller so it's keyboard controller only. It was written by IBM in 1983: this keyboard controller firmware was already done in 1983 for the AT to be released in 1984. 
            
            It implements the keyboard serial protocol by direct programming of 2 lines (CLK and DATA are pulled-up open-collector lines), for both the bi-directional AT- and the previous uni-directional PC/XT-keyboard. 
            
            It really does what is well documented in reference manuals.. (but it's still interesting how - at least for me :) ). 
            
            It's amazing how much code fits into 2KB! 8-bit really rulez!
            
            Obvious that the code was originally not written in assembly (many redundant jumps, register saves sometimes as a product of some kind of compiler - as I don't know too much about that)
            
            
            
            *******************************************************************
            
            THe disassembly in details
            ==========================
            
              All the details I could figure out are in the source code, here is the big picture only.
               
            
            The 8042 internals
            ==================
            
            Reset
            =====
            After reset the 8042 fetches the first instruction from program ROM at $0000. In my file here is a 0x04: JMP! That was promising so I wrote a disassembler to learn the instruction set.. 
            
            - dis i
            - P1=ff
            - P2=cf
            - waits for AA command from Host - and nothing else  
            - then does the self-test
            - enter the main poll loop
            
            
            The Main Poll Loop
            ==================
            
            When 'nothing' is happening, the 8042 runs in a crazy loop and waiting for things happen from the 2 sides:
            
              host writes, IBF set    <------+
              KBD pulls down the CLK line  --+
            
            This is the main loop (note, that 8042 polls IBF and doesn't use interrupts). 
            
            I. Host writes to input buffer (DBBIN - INput Data Bus Buffer)
            
              The IBF bit in the STATUS register is set. 8042 disables KBD by pulling CLK low. Checks, if write was 0x60 or 0x64 (by examining the F1 bit in the STATUS register).
              - if Host has written data to 0x60, it will send it to the KBD, read the reply, and puts it into DBBOUT
              - if Host has written data to 0x64, that is a 'Controller Command' and the 8042 will execute the appropriate program code
              Then loops again. 
            
            II. KBD pulls down the CLK line
            
              Probably, because the user has pressed or released a key and the KBD wants the send the 'scan code' (see another chapter on scan codes). Transmission happens on the Keyboard Data line guided by the Keyboard Clock line: this is the "AT-keyboard protocol" - see there. 
              
            Sending and receiving data from the kbd
            =======================================
            
            See the 2-wire protocol in details.  
            It can not only time out, but the AT serial protocol transfers with parity bit. When parity error occurs, the 8042 will try 1 more time (variable @21). 
            
              
            General timeout
            ===============
            
            The 8042 implements a safety timeout function during each transfer. It uses the on-chip Timer and the Timer Interrupt for this function. The implementation is actually brilliant!! This is where assembly comes handy, C cannot do this. 
            
            The idea is the following. In a subroutine (eg. 'Read byte from KBD') the 8042 has to wait for a pin to change state and there is a danger for an infinite loop. So first, it starts the Timer. If the 8042 has been waiting too long, the Timer will overflow and cause an interrupt. At this point the stack looks like this:
            
              |      |  Timer Interrupt Stack 
              |      |
              | INT  |  
              | CALL |   
              +------+
              
            First the return address for the subroutine was pushed by the original caller, then the interrupt occured. The Timer interrupt then does only one thing: "it returns to the original caller placing A=2 as a Timeout error code in A", by manipulating the stack: decrements the 3-bit stack pointer before executing its RETR. For the caller it looks like as if the subroutine simply returned with a 'timeout error' code!! We're in 1983.. :) 
            
            This construct is used by many functions, and the caller can decide what to do when a subroutine returns with A=2. 
            
            
            Earlier (IBM PC and XT) keyboard support
            ========================================
            
            After days of confusion I've finally figured out what bit 5 of the Command Byte means! The IBM PC keyboard protocol mode!! So.. Did you know that the first AT-style 8042 keyboard controllers did support the old IBM PC and PC/XT keyboards? Well, I didn't.. :)
            
            In this 'mode' all lines are driven by the keyboard and data flows only from the keyboard (uni-directional). The code at $041C does: 
            
            1. IDLE is when CLK is HIGH and DATA is LOW. 
            2. kbd pulls down CLK to start transmitting 
            3. makes a long startbit (that's why wait CLK hig.. then low.. then high again) to read first bit
            4. data bit is valid on DATA line on CLK RISING EDGE
            5. NO PARITY bit
            
            
            XLAT
            ====
            
            The other compatibility feature that can be confusing with the PC-keyboard compatibility. I hope the following will clear it up (see http:...) 
            
            The hardware part of the IBM PC keyboard was simple and straightforward: 83-keys with 83 scan codes (make codes, msb set for break codes), read from 0x60 after IRQ1. It was the PC ROM BIOS that made many confusions by implementing Special codes, functions, etc..) 
            
            XLAT is used to pretend for programs, which directly read the scan code from 0x60, that the 84-key AT keyboard is an 83-key PC/XT-keyboard: 
              - AT-kbd sends 0x1C when 'A' is pressed, while the XT-kbd sends 0x1E
              - AT-kbd sends 0xF0 0x1C when 'A' is released, while the XT-kbd sends 0x9E. 
            
            The 8042 firmware is capable of this translation. 
            
            Why is this?? 
            
            Legacy programs that read scan codes from 0x60 has relied on that 'A' is 0x1E. The 8042 could further provide this illusion even when an AT-keyboard was attached to the computer. That's it. 
            
            What about both XT-keyboard and XLAT??
            ======================================
            
            Now.. we have 4 cases: XT and XLAT. The 8042 firmware cares about XLAT only in AT-mode. This means 3 cases:
            
            	XT=0 XLAT=0 => AT-KBD is attached, set-2 program reads 0x60
            	XT=0 XLAT=1 => AT-KBD is attached, set-1 program reads 0x60 (compatibility)
            	XT=1        => XT-KBD is attached, set-1 program reads 0x60 
            	
            	(There is no 'REVERSE XLAT' function, when set-2 with XT-KBD)
            
                
            The AT keyboard protocol
            ========================
              (Code at $03AE)
              
              This is important, the whole keyboard protocol is programmed by 8042 code. Main features of the protocol, when the KBD is sending data to the 8042 KBC: 
                - KBD starts transmission by pulling CLK low
                - CLK is driven by the KBD
                - DATA is valid on falling edges of CLK 
                - CLK is INVERTED and connected to the T0 test-input pin of the 8042
                - DATA on T1.
                  
               _____
              C
               _____
              D
              
                In the Idle state both lines are high, passively pulled up (see the open-collector 'bus protocol'). The 8042 runs in a crazy circle and constantly monitors the CLK line. When it falls.. that is a sign, so (probably) the KBD wants to send a scan code ('probably' means the 8042, before start reading in bits, will make sure that CLK is stable low). 
                
               __
              C  \__
               _____
              D
              
                CLK pulled low by KBD (the protocol also talks about the 'start bit' on the DATA line, which is 0 when this CLK falls happen, but this 8042 code doesn't seem to care about it(?)).  
              
               __       _
              C  \___ _/ \__
               __        ^
              D  \___ ~~~0    
              
                The first data bit (bit 0, LSB) will be valid on the next falling edge of CLK. 8042 simply waits for this to happen.. (loop: JT0 loop). Then reads the level of T1 (^ here) and right rotates into accumulator register, A. Here we have the first bit! (~ represents unknown state of DATA, 0 is 'bit 0', high or low depending on the data byte to send). 
              
               __       _       _    
              C  \___ _/ \__  _/ \__ 
               __        ^       ^  
              D  \___ ~~~0    ~~~1  
                
                The next bit is the same: 8042 waits for the next falling edge, then reads in DATA. 
                  
                  _      _      _      _      _      _      _   
              C _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__
                   ^      ^      ^      ^      ^      ^      ^ 
              D ~~~1   ~~~2   ~~~3   ~~~4   ~~~5   ~~~6   ~~~7 
              
                It happens 8 times for all the data bits to arrive. 
                
                   _      _   
              C  _/ \__ _/ \__
                    ^      ^ 
              D  ~~~7   ~~~P 
              
                After the last data bit the AT-keyboard will send the PARITY bit, in the same way as the 8 data bits (as a 9th bit), using 'odd-parity' (odd parity is a method to append a bit to the data, so the overall number of 1-s will be an odd number). 
              
                   _      _      _
              C  _/ \__ _/ \__ _/
                    ^      ___ ___   
              D  ~~~P   ~~/    
              
                After the parity bit another bit, called a '1' stop-bit is written by the KBD. After that the KBD pulls up ('releases') both lines, which returns to the high Idle state. 
              
                
              Compare timing of the AT and PC/XT keyboard protocol - both supported by this firmware
              --------------------------------------------------------------------------------------
              Here is the whole cycle when the KBD is sending data to the 8042. There are a few time constrains, and many things can go wrong during transfer. The code is dealing with all these, see the details. 
              
              AT
              ==
                       ___        _      _      _      _      _      _      _      _      _      _     __   
                      C   \____ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ /  C  
                IDLE   __  ^       ^      ^      ^      ^      ^      ^      ^      ^      ^      ^__ ___  IDLE
                      D  \___   ~~~0   ~~~1   ~~~2   ~~~3   ~~~4   ~~~5   ~~~6   ~~~7   ~~~P   __/       D  
            
                AT short version:
                       ___        _                _      _      _    __
                      C   \____ _/ \__           _/ \__ _/ \__ _/ \__/  C
                IDLE   __  ^        ^      ...       ^      ^      ^____  IDLE
                      D  \___    ~~~0             ~~~7   ~~~P   __/     D
                      
                      
                - IDLE is when both CLK and DATA is high
                - CLK falls..
                - 11 falling edges - 11 bits 
                - start bit (=0) .. 8 data bits .. Parity bit .. stop bit (=1)
                
                                                                                                                           
              PC/XT
              =====
                       __         _      _      _      _      _      _      _      _      _      ___
                      C  \_____ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/ \__ _/   C
                IDLE       ____  ^      ^      ^      ^      ^      ^      ^      ^      ^      ^      IDLE
                      D___/            ~0     ~1     ~2     ~3     ~4     ~5     ~6     ~7     \____D
                                
                PC/XT short version: 
                       __        _      _               _      ___
                      C  \____ _/ \__ _/ \__          _/ \__ _/   C
                IDLE       ___  ^      ^       ...     ^      ^      IDLE
                      D___/           ~0              ~7     \____D
                   
                      
                - IDLE is when CLK is high and DATA is pulled low
                - CLK falls
                - 10 rising edges - 10 bits
                - start bit (=1) .. 8 data bits .. stop bit (=0)
                
            
                
                
            Host Commands of this 8042 firmware
            ===================================    
                
            	
            	Bit 0 and 1 of the Command Byte @20
            	-----------------------------------
            	= enable/disable keyboard IRQ. 
            	
            	Background:
            	
            	When the 8042 writes a byte into DBBOUT, the OBF bit in the STATUS register gets set by the hardware. This is the normal operation, but the Host has to periodically read, poll, the OBF bit in the STATUS register to check whether a byte has been written by the 8042. 
            	
            	Using the "EN FLAGS" instruction (and when a '1' has been previously written to P24) the 8042 will also set the P24 output pin. If this pin is connected to the IRQ-system of the Host, it will cause an IRQ. 	
            	
            	This firmware executes the "EN FLAGS" instruction after RESET. Better cited: "This instruction allocates two I/O lines on PORT 2 (P24 and P25). P24 is the Output Buffer Full interrupt request line to the host system. P25 is the Input Buffer empty interrupt request line. These interrupt outputs reflect the internal status of the OBF flag and the IBF inverted flag " - in the STATUS register. "Note, these outputs may be inhibited by writing a '0' to these pins. Reenabling interrupts is done by writing a '1' to these port pins." UPI-41AH/42AH manual. 
            	
            	So.. the 8042 can route the OBF bit of the STATUS register to one of the output pins (P24), causing an interrupt request (IRQ) to the Host system when connected. Routing OBF is the proper configuration for an interrupt-driven system, like the AT. 
            	
            	Note, that _IBF-routing is handled similarly to OBF and this 8042 firmware handles them together (bit 1 of the Command Byte will be written to P25), because they are not separable: "EN FLAGS" will allocate P24 and P25 together. In the AT bit 1 is specified as Reserved, because pin P25 is not connected, not used (seems like it was fine to poll IBF when the Host is writing to 0x60/0x64 and not use interrupts for that). 
            	
            	The 8042 firmware uses the Command Byte bit 0 to write P24, thus enabling/disabling OBF-routing to P24, thus enabling/disabling IRQ1, Keyboard Interrupt, in the AT system. 
            
            	STATUS bits
            	===========
            	This register is a hardware register. 
            	The lower nibble part is used for maintaining the Data Bus Buffer (DBB) registers' status and the A0-line by the hardware. 
                The upper nibble part can be set by software and are therefore firmware-dependent (8042 uses "MOV STS,A" to write data into the STATUS register). 
                The host reads this register on 0x64. 
                In the AT-firmware the bits are defined as:	
            	
            	             +----------------  ----------------+ 
            	    0x64 <-- |PER|RTO|TTO|INH|  |A0 |   |IBF|OBF| <----> 8042
            	             +----------------  ----------------+ 
                                      
                         7  Parity error 
                         6  Receive timeout
                         5  Transmit timeout
                         4  INH (copy of P17 input, the keyboard switch, updated when a byte sent to Host)
                         
                         3  F1 (hw, A0 input)
                         2  F0 
                         1  IBF (hw)
                         0  OBF (hw)                  
                .
                
                
            	
            	Writing the Command Byte @20
            	============================
            	The Command Byte is _not_ a register for the Host: just one of the 128 memory bytes at address 0x20 in the 8042's RAM. It is special when the Host issues a RAM write command to address 0x20 (by writing 0x60/0x40 to 0x64, then the value to 0x60). The 8042 firmware monitors the bits and performs different tasks, *in this order*:  
            	
            	1. save @20
            	
            	2. write the new @20
            	
            	3. Examine bit 0: OBF (set/clr P24 to en/dis IRQ1 for the Host)
            	
            	4. bit 1: _IBF (same, but N/C on AT)
            	
            	5. bit 2: SYS (don't care for 8042, set/clr F0 in STATUS)
            		
            	6. bit 3: OVR (nop): scan code received from KBD will be passed to Host if (P17 || OVR)
            	
            	7. bit 4: _EN (=1 disable kbd interface)
            	          Setting _EN: the 8042 pulls down the CLK line immediately, disabling serial communication with the KBD. 
            	          Clearing _EN (Host enables the keyboard interface from the disabled state): nothing happens here, only set the flag @2E=1 for Main, bc of the next bit will leave the AT-KBD DISABLED(!) 
            	          
            	8. bit 5: set AT/XT-keyboard protocol (NB. this gets examimned after _EN)
            	          =0 Set AT-KBD protocol: DATA=1 CLK=0 (pull CLK low, DISABLE AT-KBD), go to Main and Main will enable if flag @2E is set
            	          =1 Set XT-KBD protocol: DATA=0 CLK=1 (pull DATA low, this is IDLE-state of XT-KBD), go to Main 
            	
            	9. bit 6: XLAT (nop)
            	10. bit 7: (nop) 
            	
            
            	
            	KBD EN variations
            	=================
            	
            	           CMD _EN                   CLK/DATA
            
            	  RESET     1                         0/1 (P2=#$CF at $0045)
            	  CMDAA     1                         0/1 (P2=#$CF at $0700)
            	  CMD60/AT  0                         0/1 (disabled & @2E=1)
            	  CMD60/XT  0                         1/0 (idle)
            	  CMDAE     0                         N/A
            	  CMDAD     1                         N/A
            	  CMD (write P2 directly)
            
            	  
            	  
            	  
                                 ****
                                 
                                PART II 
                                  - 
                             ROM Disassembly
                           
                  see http://www.halicery.com/8042/8042_1503033.TXT
                           
                           
                                 ****   
                              
                               PART III
                                  - 
                        A UPI 41/42 disassembler 
            
                 http://www.halicery.com/8042/dasm42.c
               
              (and a simple win32 console front-end, main.c)
            .
            
            
            .
          • README.md
            8042 Keyboard Controller Internals
            ---
            
            The following documents were obtained from [halicery.com](http://halicery.com/):
            
            - [8042_INTERN.TXT]()
            - [8042_1503033.TXT]()
            - [dasm42.c]()
            
            Additional information (eg, undocumented 8042 commands) is also available from [OS/2 Museum](http://www.os2museum.com/wp/?p=589).
            
          • dasm42.c
            #include <stdio.h>		// we use printf() 
            
            
            /*  
            	Small Intel UPI-41/42 DISASSEMBLER
            	==================================
            	A. Tarpai 2010 (tarpai76 gmail com)
            
            	It was written to look at some 8042 ROM dump code. 
            	You can use and modify it for any purpose. 
            	I'm happy if you mention me, the author. 
            	No warranties (what for?). 
            
            	Usage:
            	------
            	Call dasm42() passing a pointer, an offset and number of bytes. 
            	Uses 1 external: printf(). 
            
            	The disassembler is based on the book
            	  "Microprocessor Peripherals UPI-41A/41AH/42/42AH User's Manual, INTEL CORPORATION, 1996"
            */
            
            
            
            
            static int PC; 
            
            
            /* Operand Addressing Mode writers */
            
            typedef void (*Tfop)(unsigned char *p);
            
            static void fopJMP(unsigned char *p)				// JMP and CALL: 11-bit absolute address (2K)
            {
            	printf("$%04X", ((*p<<3)&0x700) | p[1]);
            }
            
            static void fopJ(unsigned char *p)					// jumps: 8-bit in-page address
            {
            	printf("$%04X", (PC&0xff00)|p[1]);	// TODO!! Jump at page boundary?? PC or PC+2 here?
            }	
            
            static void fopRx(unsigned char *p)					// Register Direct (x=0-7)
            {
            	printf("R%x", *p&7);
            }
            
            static void fopPx(unsigned char *p)					// Port Direct (x=[1,2])
            {
            	printf("P%x", *p&3);
            }
            
            static void fopRRx(unsigned char *p)				// Indexed @R0 or @R1
            {
            	printf("@R%x", *p&1);
            }
            
            static void fopA(unsigned char *p)					// Accumulator
            {
            	printf("A");
            }
            
            static void fopIMM(unsigned char *p)				// Immediate 8-bit value
            {
            	printf("#$%02X", p[1]);
            }
            
            
            
            typedef void (*Tfmnop)(unsigned char *p, Tfop fop1, Tfop fop2);
            
            static void fopJB(unsigned char *p, Tfop fop1, Tfop fop2)	// JBx is special (have to complete the mn)
            {
            	printf("%x ", *p>>5);
            	fopJ(p);
            }
            
            static void fmnop2(unsigned char *p, Tfop fop1, Tfop fop2)	// 2-operand instructions 
            {
            	printf(" ");
            	fop1(p);
            	printf(",");
            	fop2(p);
            }
            
            static void fmnop1(unsigned char *p, Tfop fop1, Tfop fop2)	// 1-operand instructions 
            {
            	printf(" ");
            	fop1(p);
            }
            
            
            
            
            
            struct instr {
            	char *mn;
            	unsigned char opcd;
            	unsigned char opcdmsk;
            	char len; 
            	Tfmnop fmnop;
            	Tfop fop1, fop2;
            };
            
            
            static struct instr instrs[] = {
            	{ "ADD", 0x68, 0xf8, 1, fmnop2, fopA, fopRx},	// ADD A,Rr Add Register Contents to Accumulator
            	{ "ADD", 0x60, 0xfe, 1, fmnop2, fopA, fopRRx},	// ADD A,@Rr Add Data Memory Contents to Accumulator
            	{ "ADD", 0x03, 0xff, 2, fmnop2, fopA, fopIMM},	// ADD A,�data Add Immediate Data to Accumulator
            	{ "ADDC", 0x78, 0xf8, 1, fmnop2, fopA, fopRx},	// ADDC A,Rr Add Carry and Register Contents to Accumulator
            	{ "ADDC", 0x70, 0xfe, 1, fmnop2, fopA, fopRRx},	// ADDC A,@Rr Add Carry and Data Memory Contents to Accumulator
            	{ "ADDC", 0x13, 0xff, 2, fmnop2, fopA, fopIMM},	// Add Carry and Immediate Data to Accumulator
            	{ "ANL", 0x58, 0xf8, 1, fmnop2, fopA, fopRx},	// AND A,Rr Add Register Contents to Accumulator
            	{ "ANL", 0x50, 0xfe, 1, fmnop2, fopA, fopRRx},	// AND A,@Rr Add Data Memory Contents to Accumulator
            	{ "ANL", 0x53, 0xff, 2, fmnop2, fopA, fopIMM},	// AND A,�data Add Immediate Data to Accumulator
            	{ "ANL", 0x98, 0xfc, 2, fmnop2, fopPx, fopIMM},	// ANL PP,�data Logical AND PORT 1�2 With Immediate Mask
            	{ "ANLD", 0x9C, 0xfc, 1, fmnop2, fopPx, fopA},	// ANLD Pp,A Logical AND Port 4�7 With Accumulator Mask
            	{ "CALL",  0x14, 0x1f, 2, fmnop1, fopJMP},
            	{ "CLR A", 0x27, 0xff, 1, 0},	// CLR A
            	{ "CLR C", 0x97, 0xff, 1, 0},	// CLR C Clear Carry Bit
            	{ "CLR F1", 0xA5, 0xff, 1, 0},	// CLR F1 Clear Flag 1
            	{ "CLR F0", 0x85, 0xff, 1, 0},	// CLR F0 Clear Flag 0
            	{ "CPL A", 0x37, 0xff, 1, 0},	// CPL A Complement Accumulator
            	{ "CPL C", 0xA7, 0xff, 1, 0},	// CPL C Complement Carry Bit
            	{ "CPL F0", 0x95, 0xff, 1, 0},	// CPL F0 COMPLEMENT FLAG 0
            	{ "CPL F1", 0xB5, 0xff, 1, 0},	// CPL F1 COMPLEMENT FLAG 1
            	{ "DA A", 0x57, 0xff, 1, 0},	// DA A Decimal Adjust Accumulator
            	{ "DEC A", 0x07, 0xff, 1, 0},	// DEC A Decrement Accumulator
            	{ "DEC", 0xC8, 0xf8, 1, fmnop1, fopRx},		// DEC Rr Decrement Register
            	{ "DIS I", 0x15, 0xff, 1, 0},		// DIS I Disable IBF Interrupt
            	{ "DIS TCNTI", 0x35, 0xff, 1, 0},	// DIS TCNTI Disable Timer/Counter Interrupt
            	{ "DJNZ",  0xE8, 0xf8, 2, fmnop2, fopRx, fopJ},		// DJNZ Rr, address Decrement Register and Test
            	{ "EN DMA", 0xE5, 0xff, 1, 0},	// EN DMA Enable DMA Handshake Lines
            	{ "EN FLAGS", 0xF5, 0xff, 1, 0 },		// EN FLAGS Enable Master Interrupts
            	{ "EN I", 0x05, 0xff, 1, 0 },		// EN I Enable IBF Interrupt
            	{ "EN TCNTI", 0x25, 0xff, 1, 0},	// EN TCNTI Enable Timer/Counter Interrupt
            	{ "IN A,DBB", 0x22, 0xff, 1, 0},		// IN A,DBB Input Data Bus Buffer Contents to Accumulator
            	{ "IN", 0x08, 0xfc, 1, fmnop2, fopA, fopPx},		// IN A,Pp Input Port 1�2 Data to Accumulator
            	{ "INC A", 0x17, 0xff, 1, 0},	// INC A
            	{ "INC", 0x18, 0xf8, 1, fmnop1, fopRx},		// INC Rr Increment Register
            	{ "INC", 0x10, 0xfe, 1, fmnop1, fopRRx},	// INC @Rr Increment Data Memory Location
            	{ "JB",    0x12, 0x1f, 2, fopJB},					// JBb address Jump If Accumulator Bit is Set
            	{ "JC",    0xF6, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JF0",   0xB6, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JF1",   0x76, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JMP",   0x04, 0x1f, 2, fmnop1, fopJMP},
            	{ "JMPP @A",   0xB3, 0xff, 1, 0 },		// JMPP @A Indirect Jump Within Page
            	{ "JNC",   0xE6, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JNIBF", 0xD6, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JNT0",  0x26, 0xff, 2, fmnop1, fopJ },			// JNTO address Jump if TEST 0 is Low
            	{ "JNT1",  0x46, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JNZ",   0x96, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JOBF",  0x86, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JTF",   0x16, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JT0",   0x36, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JT1",   0x56, 0xff, 2, fmnop1, fopJ },			// 
            	{ "JZ",    0xC6, 0xff, 2, fmnop1, fopJ },			// 
            	{ "MOV", 0x23, 0xff, 2, fmnop2, fopA, fopIMM },		// MOV A,�data Move Immediate Data to Accumulator
            	{ "MOV A,PSW", 0xC7, 0xff, 1, 0},	// MOV A,PSW Move PSW Contents to Accumulator
            	{ "MOV", 0xF8, 0xf8, 1, fmnop2, fopA, fopRx },		// MOV A,Rr Move Register Contents to Accumulator
            	{ "MOV", 0xF0, 0xfe, 1, fmnop2, fopA, fopRRx },		// MOV A,@Rr Move Data Memory Contents to Accumulator
            	{ "MOV A,T", 0x42, 0xff, 1, 0},	// MOV A,T Move Timer/Counter Contents to Accumulator
            	{ "MOV PSW,A", 0xD7, 0xff, 1, 0},	// MOV PSW,A Move Accumulator Contents to PSW
            	{ "MOV", 0xA8, 0xf8, 1, fmnop2, fopRx, fopA },		// MOV Rr,A Move Accumulator Contents to Register
            	{ "MOV", 0xB8, 0xf8, 2, fmnop2, fopRx, fopIMM },	// MOV Rr,�data Move Immediate Data to Register
            	{ "MOV", 0xA0, 0xfe, 1, fmnop2, fopRRx, fopA },		// MOV @Rr,A Move Accumulator Contents to Data Memory
            	{ "MOV", 0xB0, 0xfe, 2, fmnop2, fopRRx, fopIMM },	// MOV @Rr,�data Move Immediate Data to Data Memory
            	{ "MOV STS,A", 0x90, 0xff, 1, 0},		// MOV STS,A Move Accumulator Contents to STS Register
            	{ "MOV T,A", 0x62, 0xff, 1, 0},	// MOV T,A Move Accumulator Contents to Timer/Counter
            	{ "MOVD", 0x0C, 0xfc, 2, fmnop2, fopA, fopPx },		// MOVD A,Pp Move Port 4�7 Data to Accumulator
            	{ "MOVD", 0x3C, 0xfc, 2, fmnop2, fopPx, fopA },		// MOVD Pp,A Move Accumulator Data to Port 4, 5, 6 and 7
            	{ "MOVP A,@A", 0xA3, 0xff, 1, 0},	// MOVP A,@A Move Current Page Data to Accumulator
            	{ "MOVP3 A,@A", 0xE3, 0xff, 1, 0},	// MOVP3 A,@A Move Page 3 Data to Accumulator
            	{ "NOP", 0x00, 0xff, 1, 0},
            	{ "ORL", 0x48, 0xf8, 1, fmnop2, fopA, fopRx},	// ORL A,Rr Logical OR Accumulator With Register Mask
            	{ "ORL", 0x40, 0xfe, 1, fmnop2, fopA, fopRRx},	// ORL A,@Rr Logical OR Accumulator With Memory Mask
            	{ "ORL", 0x43, 0xff, 2, fmnop2, fopA, fopIMM},	// ORL A,�Data Logical OR Accumulator With Immediate Mask
            	{ "ORL", 0x88, 0xfc, 2, fmnop2, fopPx, fopIMM},	// ORL Pp,�data Logical OR Port 1�2 With Immediate Mask
            	{ "ORLD", 0x8C, 0xfc, 2, fmnop2, fopPx, fopA},		// ORLD Pp,A Logical OR Port 4�7 With Accumulator Mask
            	{ "OUT DBB,A", 0x02, 0xff, 1, 0},	// OUT DBB,A Output Accumulator Contents to Data Bus Buffer
            	{ "OUTL", 0x38, 0xfc, 1, fmnop2, fopPx, fopA },		// OUTL Pp,A Output Accumulator Data to Port 1 and 2
            	{ "RET", 0x83, 0xff, 1, 0},	// RET Return Without PSW Restore
            	{ "RETR", 0x93, 0xff, 1, 0},	// RET Return Without PSW Restore
            	{ "RL A", 0xE7, 0xff, 1, 0},	// RL A Rotate Left Without Carry
            	{ "RLC A", 0xF7, 0xff, 1, 0},	// RLC A Rotate Left Through Carry
            	{ "RR A", 0x77, 0xff, 1, 0},	// RR A Rotate Right Without Carry
            	{ "RRC A", 0x67, 0xff, 1, 0},	// RRC A Rotate Right Through Carry
            	{ "SEL RB0", 0xC5, 0xff, 1, 0},	// SEL RB0 Select Register Bank 0
            	{ "SEL RB1", 0xD5, 0xff, 1, 0},	// SEL RB1 Select Register Bank 1
            	{ "STOP TCNT", 0x65, 0xff, 1, 0},	// STOP TCNT Stop Timer/Event Counter
            	{ "STRT CNT", 0x45, 0xff, 1, 0},	// STRT CNT Start Event Counter
            	{ "STRT T", 0x55, 0xff, 1, 0},	// STRT T Start Timer
            	{ "SWAP A", 0x47, 0xff, 1, 0},	// SWAP A Swap Nibbles Within Accumulator
            	{ "XCH", 0x28, 0xf8, 1, fmnop2, fopA, fopRx},	// XCH ARr Exchange Accumulator-Register Contents
            	{ "XCH", 0x20, 0xfe, 1, fmnop2, fopA, fopRRx},	// XCH A,@Rr Exchange Accumulator and Data Memory Contents
            	{ "XCHD", 0x30, 0xfe, 1, fmnop2, fopA, fopRRx},	// XCHD A,@Rr Exchange Accumulator and Data Memory 4-bit Data
            	{ "XRL", 0xD8, 0xf8, 1, fmnop2, fopA, fopRx},	// XRL A,Rr Logical XOR Accumulator With Register Mask
            	{ "XRL", 0xD0, 0xfe, 1, fmnop2, fopA, fopRRx},	// XRL A,@Rr Logical XOR Accumulator With Memory Mask
            	{ "XRL", 0xD3, 0xff, 2, fmnop2, fopA, fopIMM},	// XRL A,�data, Logical XOR Accumulator With Immediate Mask
            
            	{ "???", 0, 0, 1, 0}	// All others (zero-mask will be true - if reached, len=1)
            };
            
            
            static int instr1(unsigned char *p)
            {
            	struct instr *i= instrs;
            	for (; ; i++) {
            		if ((*p & i->opcdmsk) == i->opcd) {
            			printf("%04X: ", PC);							// print Program Counter 
            			PC+=i->len;										// we increment PC as if CPU did for JMP instructions(?)
            			printf("%02X ", p[0]);							// write 1 or 2 code bytes 
            			if (i->len==2) printf("%02X   ", p[1]);
            			else printf("     ");
            			printf("%s", i->mn);							// write mnemonic
            			if (i->fmnop) i->fmnop(p, i->fop1, i->fop2);	// write 0, 1 or 2 operands
            			printf("\n");
            			return i->len;
            		}
            	}
            }
            
            
            
            
            /*	Extern.
            	Disassemble iNTEL UPI-41/42 machine code 
            	of n bytes, from p + offset
            
            	*/
            
            void dasm42(char *p, int offs, int n)
            {
            	p+=offs;
            	PC=offs;
            	n+=offs;
            	for (; PC < n;) p+=instr1(p);
            }
            
            
            
            
            
            /**********   NOTES   ****************************************************
            
            	Addressing:
            	- implicite (in instr)
            	- register Rn (0..7)
            	- indexed @Rn (0..1) 
            	- A
            	- # (0..$ff)
            	- addr, 1 byte + PC (0..$ffff)
            
            
            	--------------------
            	RAM (DATA) 256 bytes
            	--------------------
            	0..7   R0..R7           BANK0 (Bs in PSW) 
            	8..23  STACK (8x16bit)  .....
                24..31 R0..R7           BANK1
            	...... to top: "RAM"    .....
            
            	R0, R1 can be index register
            
            	----------------
            	ROM (PROGRAM) 2K
            	----------------
            	RESET:      $0000
            	IBR INT:    $0003
            	TIMER INT:  $0007
            
            	-----------
            	PC - 10-bit (not 11?)
            	-----------
            	PC always points to next instruction. 
            
            	----
            	JUMP
            	----
            	a.) absolute address: JMP $35E = aa a9 a8 0 0 1 0 0  a7 a6 a5 a4 a3 a2 a1 a0 (2-byte instr)
            	b.) "relative" (op -> PC-LO): JZ $addr = $C6 $op (2-byte instr) 
            	// OK.. "If a conditional JUMP or indirect JUMP begins in location 255 of a page, it must reference a destination on the following page"
            
            	--------
            	PC-stack
            	--------
            	8x16 bits: call/int saves PSW[7..4]&PC[11..0]
            	
            	-------------------------
            	PSW - program status word
            	-------------------------
            	7  6  5  4 | 3 | 2  1  0
            	C  AC F0 Bs| - |   SP
            
            	CALL: push PC&PSW[7..4]
            	RET: pop PC
            	RETR: pop PC&PSW[7..4]
            
            	
            	On-chip oscillator
            	------------------
            	1 to 12.5 MHz
            	or external
            
            	-------------------
            	8-bit Timer/Counter
            	-------------------
            
            	Timer-mode
            	- increments on OSC + 32-prescale
            	- START T .. STOP TCNT
            
            	Counter-mode
            	- increments on falling edges on TEST1-pin
            	- START CNT .. STOP TCNT
            
            	- MOV T,A and MOV A,T for reading/writing 
            	
            
            	Timer/Counter OVERFLOW
            	----------------------
            	fe..ff..00
            
            	1. sets timer flag (TF) - then can be tested by JTF (which clears TF)
            	2. generates IRQ
            	3. EN/DIS TCNTI
            	4. if enabled: CALL $0007 happens
            
            
            	----------
            	INTERRUPTS
            	----------
            	
            	IBF:
            	- higher pri
            	- EN/DIS I
            	- CS & RW triggers 
            
            	Timer
            	- EN/DIS TCNTI
            	- 
            
            	1. IRQ set + disable all interrupts
            	2. CALL 3 (IBF) or 7 (T)
            	3. entering ISR clears IRQ
            	4. ISR
            	5. RETR (re-enables interrupt)
            
            	HOST INTERRUPTS
            	---------------
            
            	EN FLAGS will allocate P24/P25 to OBF/_IBF (only RESET clears it)
            	"These interrupt outputs reflect the internal status of the OBF flag and the IBF inverted flag." 
            	"Note, these outputs may be inhibited by writing a '0' to these pins. Reenabling interrupts is done by writing a '1' to these port pins."
            
            	==> so host cpu doesn't have to poll the same bits in STATUS REG (0x64); it can have it as interrupts (this is set in the code after RESET..)
            
            	------------
            	HOST CPU I/O
            	------------
            
            	!!! There are 3 registers in the UPI on the host side !!! (NB. host CPU writes into DBBIN..)
            
            	               <--R--    STATUS   <---  MOV STS,A + JF0,JF1,JOBF,JNIBF
            	HOST CPU I/O   <--R--    DBBOUT   <---  OUT DBB,A
            	                --W-->   DBBIN     --->  IN A,DBB
            
            	RD WR A0
            	0  1  0   (0x60) Read DBBOUT register 
            	0  1  1   (0x64) Read STATUS register
            	1  0  0   (0x60) Write DBBIN! 
            	1  0  1   (0x64) Write DBBIN!
            
            	==> A0-pin simply latches into STATUS-F1-bit on host write, what the UPI can test by JF1 $xx. 
            
            	-----------------
            	Data buffers: DBB
            	-----------------
            
            	DBBIN, DBBOUT
            
            	"When CS, A0 and RD are low, the contents of the DBBOUT register is placed on the three-state Data lines D0-D7 and the OBF flag is cleared." 
            	"When CS and WR are low, the contents of the system data bus is latched into DBBIN. Also, the IBF flag is set and an interrupt is generated, if enabled." 
            	
            	--------------------
            	ST - status register
            	--------------------
            
            	= Bus buffer register status word. 
            
            	ST7 ST6 ST5 ST4 | F1  F0 | IBF OBF
            	
            	ST7-4: user defined, MOV STS,A writes them, UPI doesn't care more about it. 
            	F0: user defined (JF0 $xx)
            	F1 = A0-pin (Command/Data)
            	"OBF Output Buffer Full: This flag is automatically set when the UPI-Microcomputer loads the DBBOUT register and is cleared when the master processor reads the data register."
            	"IBF Input Buffer Full: This flag is set when the master processor writes a character to the DBBIN register and is cleared when the UPI INputs the data register contents to its accumulator." 
            
            	---------
            	I/O PORTS
            	---------
            
            	2 x 8-bit: P1 and P2
            	OUTL Pn,A 
            	IN A,Pn
            	"To use a particular PORT pin as an input, a logic '1' must first be written to that pin."
            
            */
            
          • keyboard-minimal-arrows.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <keyboard id="keyboard" padleft="8px">
            	<control type="button" binding="esc">ESC</control>
            	<control type="button" binding="ctrl-c">CTRL-C</control>
            	<control type="button" binding="f1">F1</control>
            	<control type="button" binding="f10">F10</control>
            	<control type="button" binding="left">&lt;</control>
            	<control type="button" binding="right">&gt;</control>
            	<control type="button" binding="up">^</control>
            	<control type="button" binding="down">v</control>
            </keyboard>
            
          • keyboard-minimal-functions.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <keyboard id="keyboard" padleft="8px">
            	<control type="button" binding="esc">ESC</control>
            	<control type="button" binding="ctrl-c">CTRL-C</control>
            	<control type="button" binding="ctrl-alt-del">CTRL-ALT-DEL</control>
            	<control type="button" binding="f1">F1</control>
            	<control type="button" binding="f2">F2</control>
            	<control type="button" binding="f3">F3</control>
            	<control type="button" binding="f4">F4</control>
            	<control type="button" binding="f5">F5</control>
            	<control type="button" binding="f6">F6</control>
            	<control type="button" binding="f7">F7</control>
            	<control type="button" binding="f8">F8</control>
            	<control type="button" binding="f9">F9</control>
            	<control type="button" binding="f10">F10</control>
            </keyboard>
            
          • keyboard-minimal.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <keyboard id="keyboard" padleft="8px">
            	<control type="button" binding="esc">ESC</control>
            	<control type="button" binding="ctrl-c">CTRL-C</control>
            	<control type="button" binding="f1">F1</control>
            	<control type="button" binding="f10">F10</control>
            </keyboard>
            
          • keyboard-us83.xml
            <keyboard id="keyboard" model="us83" pos="center" width="900px" height="210px" padleft="8px">
            	<control type="container">
            		<control type="key" binding="f1" width="34px" top="0px" left="0px">F1</control>
            		<control type="key" binding="f2" width="34px" top="0px" left="42px">F2</control>
            		<control type="key" binding="f3" width="34px" top="42px" left="0px">F3</control>
            		<control type="key" binding="f4" width="34px" top="42px" left="42px">F4</control>
            		<control type="key" binding="f5" width="34px" top="84px" left="0px">F5</control>
            		<control type="key" binding="f6" width="34px" top="84px" left="42px">F6</control>
            		<control type="key" binding="f7" width="34px" top="126px" left="0px">F7</control>
            		<control type="key" binding="f8" width="34px" top="126px" left="42px">F8</control>
            		<control type="key" binding="f9" width="34px" top="168px" left="0px">F9</control>
            		<control type="key" binding="f10" width="34px" top="168px" left="42px">F10</control>
            		<control type="key" binding="esc" width="46px" top="0px" left="96px">Esc</control>
            		<control type="key" binding="1" width="34px" top="0px" left="150px">1 !</control>
            		<control type="key" binding="2" width="34px" top="0px" left="192px">2 @</control>
            		<control type="key" binding="3" width="34px" top="0px" left="234px">3 #</control>
            		<control type="key" binding="4" width="34px" top="0px" left="276px">4 $</control>
            		<control type="key" binding="5" width="34px" top="0px" left="318px">5 %</control>
            		<control type="key" binding="6" width="34px" top="0px" left="360px">6 ^</control>
            		<control type="key" binding="7" width="34px" top="0px" left="402px">7 &amp;</control>
            		<control type="key" binding="8" width="34px" top="0px" left="444px">8 *</control>
            		<control type="key" binding="9" width="34px" top="0px" left="486px">9 (</control>
            		<control type="key" binding="0" width="34px" top="0px" left="528px">0 )</control>
            		<control type="key" binding="-" width="34px" top="0px" left="570px">- _</control>
            		<control type="key" binding="=" width="34px" top="0px" left="612px">= +</control>
            		<control type="key" binding="bs" width="46px" top="0px" left="654px">Back</control>
            		<control type="key" binding="num-lock" width="76px" top="0px" left="708px">Num</control>
            		<control type="key" binding="scroll-lock" width="76px" top="0px" left="792px">Scroll</control>
            		<control type="key" binding="tab" width="46px" top="42px" left="96px">Tab</control>
            		<control type="key" binding="q" width="34px" top="42px" left="150px">Q</control>
            		<control type="key" binding="w" width="34px" top="42px" left="192px">W</control>
            		<control type="key" binding="e" width="34px" top="42px" left="234px">E</control>
            		<control type="key" binding="r" width="34px" top="42px" left="276px">R</control>
            		<control type="key" binding="t" width="34px" top="42px" left="318px">T</control>
            		<control type="key" binding="y" width="34px" top="42px" left="360px">Y</control>
            		<control type="key" binding="u" width="34px" top="42px" left="402px">U</control>
            		<control type="key" binding="i" width="34px" top="42px" left="444px">I</control>
            		<control type="key" binding="o" width="34px" top="42px" left="486px">O</control>
            		<control type="key" binding="p" width="34px" top="42px" left="528px">P</control>
            		<control type="key" binding="[" width="34px" top="42px" left="570px">[ {</control>
            		<control type="key" binding="]" width="34px" top="42px" left="612px">] }</control>
            		<control type="key" binding="enter" height="76px" width="46px" top="42px" left="654px"><br/>Enter</control>
            		<control type="key" binding="num-home" width="34px" top="42px" left="708px">7</control>
            		<control type="key" binding="num-up" width="34px" top="42px" left="750px">8</control>
            		<control type="key" binding="num-pgup" width="34px" top="42px" left="792px">9</control>
            		<control type="key" binding="num-sub" width="34px" top="42px" left="834px">-</control>
            		<control type="key" binding="ctrl" width="46px" top="84px" left="96px">Ctrl</control>
            		<control type="key" binding="a" width="34px" top="84px" left="150px">A</control>
            		<control type="key" binding="s" width="34px" top="84px" left="192px">S</control>
            		<control type="key" binding="d" width="34px" top="84px" left="234px">D</control>
            		<control type="key" binding="f" width="34px" top="84px" left="276px">F</control>
            		<control type="key" binding="g" width="34px" top="84px" left="318px">G</control>
            		<control type="key" binding="h" width="34px" top="84px" left="360px">H</control>
            		<control type="key" binding="j" width="34px" top="84px" left="402px">J</control>
            		<control type="key" binding="k" width="34px" top="84px" left="444px">K</control>
            		<control type="key" binding="l" width="34px" top="84px" left="486px">L</control>
            		<control type="key" binding=";" width="34px" top="84px" left="528px">; :</control>
            		<control type="key" binding="quote" width="34px" top="84px" left="570px">' "</control>
            		<control type="key" binding="`" width="34px" top="84px" left="612px">` ~</control>
            		<control type="key" binding="num-left" width="34px" top="84px" left="708px">4</control>
            		<control type="key" binding="num-center" width="34px" top="84px" left="750px">5</control>
            		<control type="key" binding="num-right" width="34px" top="84px" left="792px">6</control>
            		<control type="key" binding="num-add" height="118px" width="34px" top="84px" left="834px"><br/>+</control>
            		<control type="key" binding="shift" width="46px" top="126px" left="96px">Shift</control>
            		<control type="key" binding="\\" width="34px" top="126px" left="150px">\ |</control>
            		<control type="key" binding="z" width="34px" top="126px" left="192px">Z</control>
            		<control type="key" binding="x" width="34px" top="126px" left="234px">X</control>
            		<control type="key" binding="c" width="34px" top="126px" left="276px">C</control>
            		<control type="key" binding="v" width="34px" top="126px" left="318px">V</control>
            		<control type="key" binding="b" width="34px" top="126px" left="360px">B</control>
            		<control type="key" binding="n" width="34px" top="126px" left="402px">N</control>
            		<control type="key" binding="m" width="34px" top="126px" left="444px">M</control>
            		<control type="key" binding="," width="34px" top="126px" left="486px">, &lt;</control>
            		<control type="key" binding="." width="34px" top="126px" left="528px">. &gt;</control>
            		<control type="key" binding="/" width="34px" top="126px" left="570px">/ ?</control>
            		<control type="key" binding="right-shift" width="46px" top="126px" left="612px">Shift</control>
            		<control type="key" binding="prtsc" width="34px" top="126px" left="666px">PrtSc</control>
            		<control type="key" binding="num-end" width="34px" top="126px" left="708px">1</control>
            		<control type="key" binding="num-down" width="34px" top="126px" left="750px">2</control>
            		<control type="key" binding="num-pgdn" width="34px" top="126px" left="792px">3</control>
            		<control type="key" binding="alt" width="46px" top="168px" left="96px">Alt</control>
            		<control type="key" binding="space" width="434px" top="168px" left="150px">Space</control>
            		<control type="key" binding="caps-lock" width="66px" top="168px" left="592px">Caps</control>
            		<control type="key" binding="num-ins" width="76px" top="168px" left="666px">Ins</control>
            		<control type="key" binding="num-del" width="76px" top="168px" left="750px">Del</control>
            	</control>
            </keyboard>
            
        • machine
          • 5150
            • cga
              • 384kb
                • softkbd
                  • machine.xml
                    <?xml version="1.0" encoding="UTF-8"?>
                    <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?>
                    <machine id="ibm5150" class="pc" border="1" width="1000px" pos="center" style="background-color:white">
                    	<name>IBM PC (Model 5150), CGA, 384K</name>
                    	<computer id="pc-cga-384k" name="IBM PC"/>
                    	<cpu id="cpu8088" model="8088"/>
                    	<debugger id="debugger"/>
                    	<ram id="ramLow" addr="0x00000" test="false" comment="no memory test"/>
                    	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/>
                    	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/>
                    	<video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/>
                    	<keyboard ref="/devices/pc/keyboard/keyboard-us83.xml"/>
                    	<panel ref="/devices/pc/panel/wide.xml"/>
                    	<fdc ref="/disks/pc/samples.xml" width="280px"/>
                    	<chipset id="chipset" model="5150" sw1="01001001" sw2="10100000" pos="left" padleft="8px" padbottom="8px">
                    		<control type="switches" label="SW1" binding="sw1" left="0px"/>
                    		<control type="switches" label="SW2" binding="sw2" left="0px"/>
                    		<control type="description" binding="swdesc" left="0px"/>
                    	</chipset>
                    </machine>
                    
              • 64kb
                • donkey
                  • debugger
                    • machine.xml
                      <?xml version="1.0" encoding="UTF-8"?>
                      <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?>
                      <machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
                      	<name pos="center">IBM PC (Model 5150), CGA, 64K</name>
                      	<computer id="pc-cga-64k" name="IBM PC" state="/devices/pc/machine/5150/cga/64kb/donkey/state.json"/>
                      	<ram id="ramLow" addr="0x00000"/>
                      	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/>
                      	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/>
                      	<video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/>
                      	<cpu id="cpu8088" model="8088" autostart="true"/>
                      	<keyboard ref="/devices/pc/keyboard/keyboard-minimal.xml"/>
                      	<debugger id="debugger"/>
                      	<panel ref="/devices/pc/panel/wide.xml"/>
                      	<fdc ref="/disks/pc/samples.xml" width="280px"/>
                      	<chipset id="chipset" model="5150" sw1="01001001" sw2="11110000" pos="left" padleft="8px" padbottom="8px">
                      		<control type="switches" label="SW1" binding="sw1" left="0px"/>
                      		<control type="switches" label="SW2" binding="sw2" left="0px"/>
                      		<control type="description" binding="swdesc" left="0px"/>
                      	</chipset>
                      </machine>
                      
                  • README.md
                    [IBM PC](machine.xml "PCjs:ibm5150")
                    
                    The above simulation is configured for a clock speed of 4.77Mhz, with 64Kb of RAM and a CGA display,
                    using the original IBM PC Model 5150 ROM BIOS and CGA font ROM.  This configuration also includes a
                    predefined state, with PC-DOS 1.0 already booted and DONKEY.BAS ready to run.
                    
                    And now that PCjs automatically saves all your changes (subject to the limits of your browser's local
                    storage), you can even close the browser in the middle of a game of DONKEY, and the next time you load
                    this page, your progress (and the donkey) will be perfectly restored.
                    
                    For more control over this machine, try the [Control Panel](debugger/) configuration, featuring the
                    built-in PCjs Debugger.
                  • machine.xml
                    <?xml version="1.0" encoding="UTF-8"?>
                    <?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.18.2/machine.xsl"?>
                    <machine id="ibm5150" class="pc" border="1" width="980px" pos="center" style="background-color:#FAEBD7">
                    	<name pos="center">IBM PC (Model 5150), CGA, 64K</name>
                    	<computer id="pc-cga-64k" name="IBM PC" state="/devices/pc/machine/5150/cga/64kb/donkey/state.json"/>
                    	<ram id="ramLow" addr="0x00000"/>
                    	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="/devices/pc/basic/ibm-basic-1.00.json"/>
                    	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="/devices/pc/bios/5150/1981-04-24.json"/>
                    	<video ref="/devices/pc/video/ibm/cga/ibm-cga-960.xml"/>
                    	<cpu id="cpu8088" model="8088" autostart="true" padleft="8px">
                    		<control type="button" binding="run">Run</control>
                    		<control type="button" binding="reset">Reset</control>
                    	</cpu>
                    	<keyboard ref="/devices/pc/keyboard/keyboard-minimal.xml"/>
                    	<fdc ref="/disks/pc/samples.xml" pos="right"/>
                    	<chipset id="chipset" model="5150" sw1="01001001" sw2="11110000"/>
                    </machine>
                    
                  • screenshot.png
                    �PNG
                    
                    
                  • state.json
                    {"timestamp":"2013-03-07 13:53:43","version":"1.08","ibm5160.cpu8088":{"0":[4096,256,4,1550,2176,0,0,4],"1":[61541,61440,1687,1550,0,61442],"2":[26992,24800,0,0,0,-1,-1],"3":[1,195272478],"4":[0,[14889283,7340351,-268371873,7340351,7340351,-268370092,-268370141,-268370141,-268370267,-268375673,-268370141,-268370141,-268370141,-939522208,-268374185,7340351,-268373915,-268371891,-268371903,-939523498,-268376263,-268371879,-268376018,-268374062,-167772160,-939523706,-268370322,7340344,-268370101,-268373852,1314,-268435456,14879739,88211840,88212108,88212121,88212706,14882004,14882081,14886887,14879751,7340326,0,0,0,0,88212333,0,-485750550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-268374951,-939523097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-18546688,-4096,-4259,-295108544,-226299904,6,4194305,60527,8452521,0,2080374785,-939523491,29096067,-230242304,-428933117,-234426368,49808376,0,0,0,1133,513,2752512,525533226,290921485,827201353,470621197,541339203,290928928,827201353,407838788,69975,34078851,67593,5244418,16384,0,0,0,0,-738195961,54468099,13107200,845,1073741824,256,336860180,16843009,4063262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1651310592,538968064,661483363,0,0,1610612736,132712,4608,48194153,705233445,16142591,2,0,1610612736,722536,17152,1296912195,541347393,541937475,0,0,1610612736,2950760,17664,1230196289,538976288,542333267,0,0,1610612736,5244520,1664,1297239878,538989633,541937475,0,0,1610612736,5506664,6016,1145784387,538987347,541937475,0,0,1610612736,6293096,6400,542333267,538976288,541937475,0,0,1610612736,7145064,1408,1263749444,1498435395,541937475,0,0,1610612736,7341672,2444,1263749444,1347243843,541937475,0,0,1610612736,7669352,2074,1347243843,538976288,541937475,0,0,1610612736,7997032,2523,1229734981,538976334,541937475,0,0,1610612736,8324712,4608,1162104653,538976288,541937475,0,0,1610612736,8914536,3139,1397310534,538976331,541937475,0,0,1610612736,9373288,6177,1262698818,538988629,541937475,0,0,134742016,-4259,-4259,-295108544,-226299904,6,4195585,60527,75889065,7340037,905970945,-939523491,97777795,112,-18481549,-234360832,18022823,7209235,1065681014,460571,0,0,0,0,1560281088,235133702,-1744765948,302053380,-1526656511,302292228,302060033,1392573441,302087937,-989746687,302105857,302060033,-83821567,302129665,1661098753,1157784322,302060034,-67038719,-133994240,302060032,201526273,302060035,-67038719,-134149888,302060032,-1425888511,302173186,-486454527,-1993424640,771784990,8586892,733894347,1445915392,-339725744,-1336912380,4177409,1347821803,183222322,28332118,1347814635,1774060208,1443621632,-352299586,398349828,1381060608,102651223,-2052968877,516238848,1200226433,224889345,-1961734261,-1969810345,-466484665,-268177405,209128252,243254423,620699406,418055092,516228016,1328087169,-343821294,-2128689909,-1983892736,28578375,-2128689874,55019776,1562314587,1482250847,1358678878,-1275066437,1477496078,-2062120241,-1007275520,1376175662,-812645631,7340501,8814611,1329791121,538976334,-486531040,115888392,-492152576,867429368,1376159424,1975519745,186043669,1039168704,41251328,-1073082192,646448245,-1597832878,-1073086126,28579701,460592845,108380171,382533812,4057579,-1342016142,-2128689904,222791680,-369136663,48824142,-956962048,86534,-1897057506,436651741,113647108,522060828,652075971,1363608970,1596575063,-336272807,1879213775,-2038431744,1090557696,538990677,-1742725088,28674,-1761573248,1297040128,538976305,-486539232,8185873,126271539,58048522,-1442838808,32111330,-402475777,-990511041,1476817934,-571929680,1474872318,168266240,-401312320,-990511067,-1475382271,-401902560,1072234455,-385382400,-1276510373,780542,-160161624,1948304630,-1262752783,-19273725,-389868339,130416670,-475272448,92939945,-402541497,-990445593,-1341819776,-24712950,-1830032414,-1946242328,-104627750,49857281,-2147483536,10879110,542003792,538976288,7341683,8814592,1347158182,538980692,-486531040,92939804,-1442396601,-466485246,1946165480,-1439268854,-227213054,-486656023,-28907036,1962937064,-2134575373,535425909,-402475778,399375955,-990510416,-1341098751,147125770,-990508684,-1342016480,-1010824695,7340989,8814600,1279459515,608912207,8224,-1559917786,-1070398710,-1960437043,-1960443315,1018168405,11920886,1891221763,-136672489,-1329034271,65533540,13796296,-888995657,-1845439869,-385107055,-779623433,65271698,13796289,375698,-930417674,-997588811,-201878888,28627083,-1444341043,-843041795,168165658,-1950250237,-773664294,-773664303,332596177,196711105,-1947076631,-138398760,-1177318415,-235470648,1919220352,1693089795,-774206731,-788483376,3979730,-91557385,-997789194,51028304,-1951704917,1441377219,1879173117,-2046820352,50381056,216066,512,33554432,134939264,-1089801728,-990511103,857830404,63487743,410321978,449642676,453071915,-922025140,-771028363,-92076428,1191278376,8462021,-384925815,-1977156348,1108005,8462021,-1995610232,1334579839,-51451628,1397903696,-511652726,-117866248,-21757324,973544639,1946407686,-1090162109,1022035759,146473392,21018944,-1090453062,-990509947,-33065726,-2084307264,-990500671,50885633,-26167351,-2000486714,2106065525,139299078,-2012584568,1569196869,257263629,1482250843,16908483,1073872897,-67016704,589826,1,-352314392,-855193839,-352255229,-855193850,-402652413,57868301,-369341463,113704028,-134085683,-928900125,-651785981,-388004093,-225706150,1426321667,141900561,145753206,104514553,158467027,1946622880,-339673586,-817987574,57999619,-1576945944,243860436,865207249,225834962,378061566,1300956118,-137219313,-719943439,64463619,-1945906783,-773402170,-773402138,-2114780186,1912733638,-790722789,713077999,987662311,-1979549984,-997568288,1476416232,443860010,-397212080,-947912670,6547458,-396884133,-922877930,-402471040,11796531,378084045,243860425,-1007156277,-1957670057,46629115,-1174604917,-1960443648,76228125,-1424193242,-220051898,63977088,1599821825,1958742723,224758523,640337150,-533068842,-527826314,-389772720,710410251,48550084,-1327567876,376321,63776394,-686388400,-771313405,-701101338,-2033546493,-736719895,1913900291,-2125440960,50580798,-1274645247,1913900292,-511682512,702820927,33804550,-703690552,223164931,113646198,-1979644970,-33303242,259340998,-164493710,64423679,64304776,11817155,1314395085,-58718092,1476621440,1048614635,1946158032,123427590,251607528,-1564177913,129566293,105889536,1166716658,-787576058,-651785469,-2134640381,67637312,100794371,525316,-953775604,107462403,-2046972439,470058244,470232839,-2063126777,28678,-1409251712,1414548480,538976306,1879480096,-2038431744,1275113984,540234832,-14671840,28927,-1660909952,1297040128,538976306,-164422112,-527769970,84158086,1959016991,-1572797420,-641857803,199774982,-85465088,382592050,-1010814373,1954489516,-349581830,1225395703,1919251310,1768169588,1952803699,1713399156,1679848047,1702259058,540688672,543452769,1769108595,168650091,544829025,544826731,1852139639,1634038304,168655204,-2147418102,17302016,33554944,150491395,67113216,256,222301417,1986610186,543515753,1919252079,2003790950,52693517,5653828,84219904,131584,1481982208,538976288,538976288,65536,0,720929,1879168448,0,0,132608,1313817344,538976288,538976288,65536,0,720929,1879130323,0,29555,66048,1314017280,538976288,538976288,65536,0,720929,1879213760,0,0,536870912,1313429251,538976288,1297040160,65574,4867,759237487,16794690,2114816,1245955,0,0,0,0,0,0,0,0,0,0,16777216,512,-2147352576,396800,83832640,603979776,771763200,0,0,1109329175,1769699,49807587,20971632,196720,-482341118,1879130112,-914357248,1309725712,538987605,18882592,1,134349312,-16777216,256,369434624,16778242,0,0,536875256,1241514245,1879097602,83889664,781,0,-1291845632,16835330,234881024,1280,0,0,-486362368,256,-928593920,-928659291,522002341,522067742,505355807,396831,1230441663,1313410382,1398230852,13,0,0,1073750221,-1009152,16838669,201786647],1,[1,201785571,1,227,1,-16777216,4,-1,9,0,1,13312461,39,0,1,1596672,1,1,1,1313429248,1,538976288,1,1297040160,1,5632,1,0,1,184549376,1,8448,1,0,1,637603840,1,18089612,1,-452984694,1,-1943605966,1,19274308,1,50266369,1,14893787,1,264,1,-15055872,1,-1107164929,1,1879213570,1,-486499328,1,1245952,1,-16777216,1,1157628415,1,33566976,1,637534208,1,199,1,50331648,1,151061249,1,-256,1,-1525678081,1,10692097,1,335872,1,1207959975,1,7340352,1,21025747,1,112,1,65536,1,723910656,1,-150931706,1,61032664,1,-1084743936,1,61866017,1,17743786,1,203,417,0,1,-1879048192,35,0,1,-268370203,1,60748295,1,88220962,1,14879839,1,14938627,3,0,1,134744072,1,125896704,1,134217728,1,1921,1,126224257,1,37750667,1,4194368,1,134218372,1,134219548,1,1921,1,126224257,1,37750667,1,4194368,1,134218372,1,329500,1,7341344,1,134873728,1,97714192,1,112,1,7405171,1,7341410,1,77328966,1,14877003,1,1121648752,1,38404096,1,38405408,1,722485263,1,1048577,1,76560,1,16,1,16974410,1,1121648640,1,263456,1,965410818,1,290804999,1,88211499,1,213847608,14,0,1,2097152,1,14938112,1,2097408,1,16837646,1,14938112,1,-18481435,1,-226234368,1,54132736,1,458758,1,-234556906,1,1835040,1,101122055,1,4197632,1,-143673344,1,-230232064,1,28181261,1,458828,1,58654727,1,14876899,1,7340335,1,913922,1,14880923,1,51048962,1,722154710,1,908999856,1,213845314,1,653083788,1,1018178639,1,1107303680,1,-1728052475,1,33612544,1,188479488,1,-16775930,1,255,2,0,1,-1275067904,1,-2145326336,1,1989171196,1,-822038502,1,-1892788136,1,-1677531898,1,-13741830,1,-2147293898,1,2005935353,1,-387872024,1,-1943142180,1,771967006,1,54926985,1,-611398772,1,21038846,1,-1560091231,1,-408876078,1,198222594,1,646533208,1,378274533,1,512623335,1,646513061,1,378273838,1,-880017360,1,-1866673266,1,521075466,1,1049165618,1,113639748,1,-973012667,1,59654,1,-472785782,1,1961102076,1,217874459,1,-58717578,1,-2147126191,1,209015036,1,21118592,1,-1138854656,1,434834384,1,21104326,1,1124517376,1,817692417,1,1174861323,1,91553537,1,593750096,1,-1472790696,1,-1208013311,1,512429332,1,512623430,1,-87882936,1,1091501614,1,646655489,1,-1909587227,1,-1962744042,1,4622572,1,198353198,1,48603950,1,198222126,1,48735022,1,-822082584,1,-1892807449,1,1477240838,1,1582979419,1,119496031,1,-399048914,1,-1892760820,1,101509126,1,1448563998,1,1347637586,1,-986780949,1,-1023220426,1,883363502,1,893596848,1,895890784,1,275320893,1,898184570,1,928724373,1,268187493,1,779948079,1,249048803,1,762515257,1,755707139,1,770781013,1,271191492,1,231149524,1,230952393,1,266276292,1,756747716,1,258944291,1,285151149,1,757797147,1,283389235,1,747318382,1,750529707,1,264244785,1,666766841,1,238555105,1,284102231,1,338890351,1,301796882,1,313332618,1,970734387,1,1003371193,1,989674491,1,1018117217,1,1009007870,1,1038302283,1,372118962,1,666441283,1,665528308,1,1070153497,1,298848714,1,342167139,1,286592556,1,1043218023,1,-1295794126,1,-1977674240,1,308144322,1,359858096,1,639154920,1,1242388107,1,71731750,1,-1960394498,1,-981269938,1,-14489578,1,-1996206967,1,1820919380,1,239373314,1,-1960896829,1,-1962150114,1,-1593051890,1,99093497,1,39619071,1,-1996206967,1,-1073036540,1,28312948,1,503565289,1,375345671,1,16498207,1,-204960851,1,-1010814043,1,15704118,1,906044611,1,-1023348830,1,192266250,1,922669032,1,-2013182304,1,-20773308,1,-2146863672,1,-2009726494,1,-1023326698,1,-389808208,1,1153957556,1,-1946074878,1,-389869484,1,1153957544,1,-1946087934,1,381882452,1,-389903841,1,-4714057,1,-400264449,1,-768403437,1,637534907,1,1225608843,1,386132049,1,1128399221,1,643561442,1,-33274230,1,652489408,1,-402502005,1,1284111980,1,106727684,1,-1996335991,1,-1070415100,1,1309066806,1,-1976172541,1,906186278,1,-402436957,1,1552875084,1,-1900006636,1,704192,1,-1526691649,1,-1515870811,1,592570789,1,-1307958296,1,173175296,1,-1593476892,1,-1023540929,1,272992550,1,637726881,1,-1592638071,1,-1993997582,1,396432453,1,1166616067,1,-990672106,1,-1207897282,1,104464639,1,158663393,1,-1413415253,1,46506155,1,49258666,1,178962686,1,-1912310574,1,-1190972130,1,-1510801392,1,516145202,1,-18425,1,272992550,1,612034755,1,-277677429,1,-1005566581,1,-1073016211,1,1569449336,1,1344164374,1,-265385674,1,109852162,1,501744370,1,113727499,1,-64725,1,-401975832,1,1594296820,1,-385913623,1,-5240436,1,-947666318,1,1300964897,1,1976110061,1,8435971,1,1179046451,1,53812878,1,-150846325,1,-139636495,1,1523715057,1,1967129716,1,-1951710719,1,11578050,1,1933638019,1,629679619,1,435218627,1,-2011085431,1,2105746261,1,57884686,1,-1021020792,1,-216102090,1,244004352,1,1105723637,1,39619069,1,-1022342007,1,-216626890,1,512505344,1,-1295843083,1,-1977674240,1,273017026,1,-1528295566,1,-48306154,1,-1945998199,1,-1070461372,1,-1006653245,1,-5234922,1,-954469144,1,-16692986,1,1191626751,1,-385876223,1,1170610797,1,2105540871,1,141885188,1,-16497209,1,444917760,1,1964667368,1,-1607023639,1,918749502,1,973151904,1,906326992,1,20846216,1,1019382467,1,909800959,1,48578244,1,-840377549,1,-1259507185,1,101705729,1,719850357,1,1300244000,1,-1070448618,1,1702897347,1,451460886,1,-388287712,1,-260960340,1,-286785100,1,854553605,1,99084516,1,29053891,1,261548032,1,1156979570,1,292847640,1,1959089694,1,71628313,1,1948212752,1,-349582076,1,583683,1,-389850120,1,-93188236,1,-402396336,1,62136277,1,1946530024,1,45373686,1,-133846808,1,1017917123,1,-386304988,1,-169139220,1,512306883,1,-1943141576,1,-888980986,1,-1003597050,1,637745182,1,216961,1,-888710399,1,1445050344,1,-1879301144,1,-389871548,1,-1004142568,1,-65607649,1,-1946002295,1,-389869500,1,-1993998328,1,1603020311,1,-617364734,1,-661994610,1,-472783919,1,113653443,1,-1895890521,1,116797122,1,1962869159,1,512634375,1,116064677,1,-1896095768,1,-164424612,1,-2135294325,1,782627584,1,27723510,1,238449919,1,-1176816865,1,-402259948,1,343025788,1,854087430,1,637760040,1,123667966,1,117803558,1,126494214,1,-488488185,1,27604735,1,-1893313701,1,-1946151418,1,-1912494842,1,113651419,1,-1593835097,1,-919404542,1,-1030825586,1,-1090484034,1,112787466,1,648409856,1,721420963,1,268385730,1,-4717706,1,834319,1,78764075,1,-628170541,1,-1996487005,1,-956299234,1,-855638010,1,84330016,1,113744384,1,567083088,1,5375686,1,-1993423925,1,-1023302370],2,[788216808,27604735,-1023261553,-315416,-123922828,-466482453,-318488,-107145612,-1885600631,-373090748,-1410793296,651225088,-225708686,118918190,113716739,174588677,-953282384,188934,143190245,-680393808,1053153397,-148176077,141950806,922689302,-1070398697,-402450525,1366427186,-1006141976,637743934,17122758,-1206859901,-1951719378,-402450666,783812229,-396711122,784598653,844759792,418244800,51844747,53690053,-1980300450,-1982713068,1418265172,88458756,639571457,-402635126,1340676461,-1000711425,839053358,415099072,53690053,-2080963746,80091886,-2758427,971572656,639691007,1377720946,-1914113397,1968140808,51880269,-2027497333,-1073013666,-1099686050,-947651189,785877790,49626752,1174565888,785288006,49692288,1174696960,187427649,858354907,1031808731,1191474176,-1325995197,104476207,41222393,1135238320,1482169067,-706149456,-75283458,-617364672,1958742700,1949187174,3008541,1916861315,1166681839,558426367,844038517,-953767232,-58298,179097323,1010791616,-388926162,179044387,-348949312,-391489593,326369211,1946172544,401124364,-1427147487,1946135272,1606637570,994791363,1358525690,-12219866,1478557160,1263529588,-1437602325,-369207831,1139277989,-1946652123,129165554,561377650,51854987,427097867,474909478,1979709827,109635605,-1946591256,1552811604,1490283278,-385503144,-113508824,279970933,1053160939,-550829261,141950803,118890262,-1341998657,768319,-1070421261,152692906,-1912220952,-1962724066,775794163,-2084276960,1034755782,-1149948370,113712918,131391,-972705048,369280262,1929714920,-265370458,387877634,373483523,-390057382,1053103923,56296243,-452475169,-1325510935,378661635,1975519775,-115963386,-31462656,-2012908088,-1023346410,108382462,16389770,-922874645,378013045,-1329397510,-1377254401,106203640,-2080535613,-1414724921,-22228853,-1057051960,27845682,-989985163,-152311600,-1968520054,-1431525928,-1414662006,-355269199,-1950219448,-137219126,1204325361,648848711,-1391049080,652736170,-1425652221,-1993948925,723913542,-654897850,-388772982,1183393344,1187456525,-1023410148,67896834,1082130440,50595842,378285818,-1993473305,235070758,187743255,1090977334,503773953,166207254,443686659,1946927592,118359573,112845874,348700416,74821362,90540582,-100140793,1091501622,646657537,-1909062939,-83695850,-1943078197,771942166,48572041,817633038,117323275,117113153,-400615906,1914634940,194570445,-1590251029,619184396,-1023315200,507059974,108331009,67271,1048576000,1952055296,190698,-661855253,198147,650153536,16000,638219341,16000,-117279654,-2134640445,1509949502,-639043468,653488895,81539,652965120,200331,51249473,243934720,243793920,-672464896,-1070399488,211891792,-4855807,520492402,81539,-2145553408,1509949502,-1712845964,1491825663,233375664,-147658500,39618907,-219477840,1929355496,51284970,-902080000,-779419018,2010725202,-1943702322,1086522328,512344206,-886374397,243869257,1303576579,7814,2000934,113714688,1,27631926,-1946156637,-379895592,-1064502354,-12720056,-953808526,262,-1326650624,-1935676663,686311616,-352160769,-388460921,-143458507,200331,1993947985,-8787556,922126312,24450700,1929824054,906146561,24577735,-1556742143,1156973235,58032152,-402620183,371127928,857675271,1746831835,1914603521,23444225,168040121,-1189579548,-855767794,381227380,1959591432,168671570,1265945854,-1274605639,1695451270,1731102721,533498369,906022120,23608971,-2147432457,-511045772,1008368104,914715649,23668352,-2145446147,108332541,-1576963424,646578867,-722075287,-402463616,-1590233616,-1262288205,179760007,-31034140,-33196852,-1022266164,-14584577,350757748,591695616,-1021229937,-402643992,384305151,5302294,1501379,1359395816,1494616296,1072220427,-1281346048,-1326877438,-1892236518,-402563834,-13175376,906031926,16070399,-1960896994,-1996393202,-1962871538,-1996393714,-1962872050,520189710,17712327,-388592896,317395106,1560710966,110048769,-1892286219,-402590970,-13175460,-989766362,1149966708,1638086150,512505345,-13237917,-1962843874,-1556740028,-13237919,-1023319778,-162441386,134399238,633217141,71628545,259293184,180781910,-1191003713,-1477246972,-988908450,-97484,385475445,1583307039,512505539,2089419523,-1060143100,920643456,50411145,784655851,1059324174,18744890,638350069,1946175034,1858348550,-1980437736,-1945964498,-1023217146,-1320136361,370585604,21741319,1353341098,866828682,-947672128,-528066552,1355056810,-1934900341,1482271704,-1851026773,-1151348345,1472397643,145838161,-284294602,-1580799232,-12778711,-2089388545,202558,-1007091083,51846795,57989899,-1190003736,1139277825,-1947438575,184751894,-401902126,113705456,-65217,1048646635,267911955,512296050,-745864429,-353838286,1317676560,851574276,-5221907,638755560,100814475,53690052,281510743,-372129741,24357875,-1057071190,88442918,-498968313,20947416,-1178339264,548929540,-1431571680,50673291,-2086006608,1149962951,1150003990,-1031034092,-1413467221,-1159150677,1392144922,583710,-389849337,-93185363,-1612177642,-402361602,-389866887,1048576991,1963459269,19589123,503353064,53812878,-469096566,976630644,1946346278,189265452,906327048,53937918,118944651,-1191003713,-1494024181,-2144981132,1950351229,784605173,-2098724112,-339447040,243998541,238747967,74646313,53022345,48440890,243916916,-336002261,523012657,46474890,1946732022,147125769,-466433932,-58714901,-2084604920,1827147718,-167283709,-16588282,784642164,-1977220368,118882406,20947395,-1325318237,870372100,-773795374,1586177746,-521961470,-628362249,107604051,857115483,281182979,52877827,-1581055402,104530239,628359979,549684032,527620667,48963210,507167742,410125044,53288587,267975553,-75298957,-352161278,-1547437657,-1007156929,48963208,503398307,53690053,1107842443,105572383,-1511269581,475958054,376757003,267975553,520501362,-400656755,645071346,474400550,521535488,396607539,48996867,51618632,189172518,274107174,-190660053,353798402,396477187,1183393283,-619986148,521589876,51846793,71731750,-190660354,184543234,51592841,-617426037,48963208,-1995509528,-1023208170,10414160,911856010,46468744,259246219,-771095435,78644341,-1070414855,1950018553,906211372,46466806,169375000,1360558317,891194934,191859203,1963050486,36562947,-1341885351,852617989,-352079680,906080268,46466806,-121539568,521556163,-1187086180,91565570,-352210787,-1006199536,503514430,-1047853481,521431784,1488980487,45089908,-1006189575,1191380286,512644638,-208993483,-218100807,119496356,74907964,-1007108086,-1070349319,49652534,-989411786,-391375358,1131682082,1017962634,1315271738,374742606,1048589831,1946157306,10807301,417876083,-375376384,-969519104,59654,1493086696,15311414,-1259790498,-390057472,-1317927781,-119005418,516159498,-1185706,-30007458,-2147289594,1081344060,-402237922,1929838656,-383820283,1482162306,-756545770,-1010762217,-184091082,214206978,509619232,118902870,1476410856,-1293361037,1914658559,-1813467934,1320907800,-1981065698,855532520,118932416,855644351,243939017,-1494024169,-397538188,975575081,-227213499,-391330823,-126543770,-1191003713,317194249,1949187096,408217614,-1073084556,-492173964,-2084308499,548405953,521579251,-1006929432,-32315362,-397015521,-930474225,1602275712,1979136775,9103619,76174878,1048583958,1946157306,118883863,133909992,-1073082766,1583248501,518522646,-1010762217,-397343145,123337885,-982486433,-167562434,1947208519,1048589909,1946157289,-1932031215,-2145427496,1349779517,-91531490,344709262,-148119765,1364611155,-1962379777,-37558054,-390057382,1582894743,1049320280,-150797517,526376707,-1073085046,-1958273420,396421367,1692992373,-919449857,526369785,-1073085046,-141884300,-1057045511,1589845782,-1962636769,-104854793,-265370429,-1547685118,933364031,698566659,53191427,-1607053117,-789183803,371508514,1460061016,29053782,476047360,-1979463805,-989642466,637747766,639202697,639327628,370695560,-388287713,-947708863,1075743235,1010222339,1971922435,1569465881,1569203739,-971041256,82950,21300934,1600019201,1460060935,113660758,-973012668,83206,115923763,63406876,408783398,54533768,427148582,1010207030,512505347,-986315970,-1979513546,1959073884,1569203737,1971922456,1569465881,-1155590629,-823656447,63406875,408783398,54599304,427148582,1110870326,512505347,-986315964,-1979513546,1959073884,1569203737,1971922456,1569465881,-383838693,451477371,2027620867,70248452,-213990205,1086584320,-1007286412,842626052,11200960,-544530682,-1070345677,922355176,50673349,-1946585880,914797783,21905035,-2147432457,535300468,1023052563,-1948814335,1040398074,1995112797,1965081590,29619911,-1612119180,-1899983872,870288344,1371704274,-402652743,911866302,50673349,-400984891,703074725,-2035001351,1312721718,13104897,-401378176,912200402,22873799,20709377,-1070408332,912200427,22888067,505378049,1528729142,520456705,1493630774,113718785,334,1947876423,-536003580,535515058,222079660,80085877,-536200182,856126963,367454454,521535756,-1979823128,369160246,155093279,-1006013181,637732158,-1088920192,-1023132952,-1946255384,184610870,-2134805002,-2147341762,113706612,-8388054,-1168701871,-1998061014,1493655318,-2147341122,-1602938308,1336548016,-1847063888,-336186603,31713449,1702419210,639132648,638862729,-401189495,516097112,770187030,-208986114,440183889,1709704564,1492574741,-400572117,703331784,-219627469,918894328,786957061,-1260942344,1049310855,-940113586,158629888,-1961764376,1946238170,1570840539,87999489,651309827,-1961986569,66185416,1087078595,-370950093,-977040866,-1962872034,-1462619141,-1464765152,-1466927870,-1956154108,440369346,-1185850764,-1830289407,-986293768,-989657802,1189615988,-137697264,914863191,21905035,-2147432457,1944588660,-952738031,16866566,1946237952,1594485725,1564377910,477364225,117388866,507969881,1528729142,440238081,906589215,21890759,-1226702848,-383794549,-779354261,521598699,1726502662,-1962446311,63341559,123674374,104347331,-126746338,75090174,20881462,49259062,-200373565,-1997408766,-1979520218,-1947389240,33756438,14057684,51584651,53288585,719853795,-2116057339,1930426619,-1980505598,-1962726114,-388199721,-1070462699,-722989132,-108281078,139364902,256281126,-326441934,-1957670574,2156751,443832664,-236793853,-389051558,-1737228270,-301545930,-1243086846,1946237968,-1017461778,1720329809,1183458838,-402238719,585889622,1108112,-969479820,16969222,1007718376,-1007782911,1720329809,1183458838,-402238719,-645073051,-985784801,-1578626442,131698422,244004443,727646557,920254415,-1459532127,1354989568,-922876534,49259062,-1961343606,-167047563,-2135030155,242583808,119442486,-1994451453,167970110,839023040,-154998592,856257368,-335100215,-1017445374,1916862083,-1980354046,-1560080626,378077963,512426765,512295155,113640201,-973077780,191750,-419964277,1375936419,-419970165,-2084371621,1584726226,-1962729053,52404688,39750438,1316213563,430175223,488016131,651201283,-1576778206,-1047854357,89033254,378137299,-420019437,100911243,-763166477,-1592101888,-654901005,860356981,-1544095790,-420019441,49022662,-473396478],3,[87999504,1569334787,113689368,855704300,87999689,-1581032701,-645201123,242532363,38152998,-668215049,-1023212429,597941043,868453123,1995908818,52929282,52762249,52631051,20828277,650867968,-1560131957,378077989,650314535,638600587,722623883,453189382,1912807710,185234718,991458496,-1962773567,-265370424,-6559742,51580555,184933096,-385256247,-1326906959,12970240,51451529,51584649,52641411,-402426880,1048774177,1946157863,109832417,113696626,-1979645203,-1962743018,-1962727666,-402451682,1347880613,-182546861,-397323776,1515978245,-1977165309,-689438650,122013191,71645697,1429815669,960262664,930285661,359808,1347956340,1428902487,-1948584184,-1946645513,1317742274,65140482,281445368,906422737,16057998,24356339,1599735716,4622886,-402147864,-1317730398,1499012886,-2129730725,1930426619,-16731616,-352120570,52797826,292864011,-402447453,158467565,52233927,1860698112,87475205,50962691,103544971,-768409357,239897382,104591863,578028303,49022662,1959922433,-335100391,-903150846,-184119802,-1070361856,24373713,-1817447510,-930398201,-165216629,2029983813,51618068,493191462,153546752,295771461,1166616067,51093787,51189387,55117795,13796289,-478100671,1569203775,-265370600,-28841982,-1962729567,-486334186,-2084502664,-148504366,-661978506,24498699,1317676616,1357435653,1053034066,-1960443131,-1960439739,637997653,-1962772745,1959922632,463683585,-1547685117,832766767,-651470845,947150706,647219851,721577719,14320577,-763116797,-1960056064,72214728,-1209526045,856912645,-335100215,195100930,219581187,87999491,1575731971,17557904,561431083,799265331,823560451,624853763,292814851,52903555,-16092160,-956094714,206086,244013056,-588774637,320768259,286689539,1958882051,1369498400,1541982347,-1552787451,378259595,1229062929,-588774540,320768259,286689539,591299331,125042691,51584651,-1593558296,-1073020121,100754804,1860698905,-318323196,378142978,512426731,243991315,-1964506329,1380996868,1183458899,64588544,96725210,17253830,1963214138,139802898,1564020082,-955747576,16712773,-402271768,-529201730,-1909040549,-402590434,1532623843,199434006,117375154,-1226112239,-1577118487,-1073020123,597888884,67364867,52233927,-1192755200,87999491,53453059,53546635,74825739,141871371,272957734,307040550,51318411,-1946273815,1959398344,77115,637590147,637695735,-754626934,-389510168,484639459,1912893928,87999651,52404483,272992550,637739425,856835465,-31856183,-401604678,-504691470,-1006183629,637732158,639327625,639196551,1926529,-620034064,-773273740,650308356,1997364795,8579093,124992907,-754667183,-2114364945,370147303,-1269775585,268418944,1477178600,6482115,208876939,-754667183,-427730462,82509839,-268376447,898232843,859227446,88393219,1048589825,369099511,1355904031,-106868397,891194882,281445123,521544840,-82408624,114178,1458094130,859751685,88458755,281510657,2114135631,92821506,1532567318,113689432,1342178039,-1957539501,65589699,651310019,-150843765,1174611697,1380993286,852527953,114368,-989522712,-1929170122,1482231932,1006109530,-1976994367,-31517179,-1576863994,378077945,843186939,114368,-989532952,-1929170122,92934268,-90038506,49921794,-1956947622,1491653059,-1605181,-1610435584,451412719,49258507,-1326357528,1720329743,21734145,21825222,1309067009,637534209,-1575598454,503710040,637619131,118650565,384882664,1049298719,-940113586,-1183481856,-2044271566,-274720922,1495665154,1947564033,-989936895,18955973,1946436923,-2093103628,-193593345,-972845848,973145925,141886533,-16497209,61138944,1963168232,2126849770,71694098,242556928,45817622,-25958400,53690053,1426459883,557761846,84338689,-947714211,512505360,521535835,22625929,-1977215312,1268973926,1292289537,113705473,334,373721638,100751522,1996432926,1996432916,21740306,-402186402,369618988,1312721695,13104897,640775552,-988395894,973167926,326371908,921493224,22625989,138840614,258378278,385500553,-18401,474383654,650314101,-1021557111,922671849,855854241,378091218,602473292,-385765142,911272488,55445190,109983235,-92077659,-1174179066,-628424698,1793590867,1918574574,64523271,172995,-1205540008,-1031589632,-754667249,-468981270,-2043222990,167832102,113653476,1946157902,113653254,-402586802,-13179648,-1895717578,-1645669308,113126,1031862923,-2096925185,1166739399,592808737,1053034179,-1960443131,-478077603,-1960439809,-620029099,-903143820,-905770893,-1960390093,-486074019,-46405618,267976577,-544799373,-1007492542,-1018543865,51582603,48963210,-402579224,113640163,-1962867987,-1962735306,588155902,-1980169469,-1006433986,-2096942274,1040388295,113443613,-402521928,-1014169654,16057998,-24650866,24373713,128316324,859751734,274566403,-35065045,1983587841,-402427390,521536079,52011459,52011840,52102715,41353648,-402210766,512688010,-372178699,-207355533,-986314843,-972868834,-1929312953,-30732169,-74713205,637647848,1912763963,34465795,-154984682,-16585466,-341826188,650182146,1979991610,320768791,-117735165,-401444081,1049230441,117375763,11535121,-134026334,1388575171,1183458899,-1967063548,-1950209312,47569,50087144,13992136,762563131,994296970,1273853179,51584649,-1957506773,1727473345,154569474,-1547304189,1515717385,503437867,-396688623,-561315823,717892547,-1999831327,-1962743002,1372449738,89033254,-489469366,52876042,-1017574570,1031862923,-2096925185,28903367,541428224,-804498037,-789917216,-1964864808,-1023363370,-388287661,1049230281,1381696255,-1014279343,641979275,2114805307,81195,-1168430209,2078806015,-1054124032,6482010,650249026,-1241229686,-487112192,237750411,41353995,-1007040205,1962641640,-964802548,-75503469,-342686860,-1948612675,-73799486,-1327310709,-401604678,1499200399,-77338534,-2030034968,1979648991,1053034190,-478084347,-1993994241,-2128209571,-268427931,492636454,1381221127,-1948568745,-402456810,1516239707,-768359589,1962618088,-389575688,-130155701,1926793999,451462125,-117472773,-1946782961,921955295,18955973,-2000669872,1036322629,1979711363,1053112054,-1017642719,1962934147,125665530,-973835007,-1007555779,-399129594,520486920,-1022886261,1172854763,-2096249630,1299513337,119457164,557237558,8054785,-1992946571,906043662,19082889,1444812011,1709716677,1476686848,1593043800,-1995667169,1444807276,-24955707,1476687103,1593043800,-1942189793,-953810364,654311173,-16628281,-505747201,-504698685,-986314978,906043702,18955913,587631670,898180609,39685158,885347870,1946162152,-346531836,-954245389,-939524348,-64956,-147077141,1381090933,-1030956660,1499122235,-1544145981,-1977220355,1053098054,-8191673,990672127,125110357,1963214138,913304322,18955973,1963480379,71645703,1240138357,-8176187,921531903,18955973,106254934,117480424,912153181,50136822,-1927776769,28905565,1381455360,91551243,-336277528,-185866237,-1990303910,1837697109,239438860,-1977162702,1166606406,112644,141882891,138840614,258378278,-401980023,-1942552876,906179870,21569164,1049173782,1049166643,-977075897,-1274994370,73742591,-533059980,1161430388,-2145553148,1946158461,1979666455,1763332,920924760,21169722,-5242251,1476674953,-8176187,382629375,-4668641,71665408,-176881860,-243997686,1124481590,-991267839,1569524845,139823888,-1979036277,-1964166459,1347508197,1392509369,-194647982,1498962778,-287125501,521585503,-1593096984,512426297,-1847066313,106727904,-1995981819,-1607072700,-1329397443,-1125547521,-2095615481,309819385,242546186,175428106,1997340288,-400615931,381881240,185067551,-1981785112,1284048468,-1010814460,-41877584,-2131201256,-210551559,1933377152,1694138606,1381099891,-1380245738,440578,-1031024077,-348592045,372688158,-357898239,1592285983,-1324970005,-1358524670,372688130,-359208959,-389824462,-437715814,-402199568,350813330,88400882,-763166719,-398660864,-840369413,-400233488,-51840269,-400757775,-1108804882,-402199568,-320275738,-539825935,-486257527,66822,637588099,639714697,170087816,637826294,-1960544888,645866696,-2145368696,-506363679,-980757807,-1993940342,-1607070651,-389872916,-5241275,48538166,-1607011214,522453701,309665596,-1342174279,45727551,108375795,-486095306,1944584194,1929359595,2028210897,-265370419,-484013566,1053105666,-164232397,16958726,1207306613,57934091,907864863,48498374,88458752,-1960343551,-620028132,992348532,58133854,-386105368,2045307863,-390171669,-459275942,-1981168894,96987136,-964429710,46579461,1913001704,-351475475,-469047182,-1178672008,47431426,-218100295,45727652,-1191000386,1017905163,503870783,53812878,-1440807030,1206903363,-401209914,1064561022,922730547,-622329537,863197418,49295044,-1947504152,889622267,45727235,-218100807,859736996,1170613763,118882565,-1090333762,230228665,-391843072,-1586238740,-402600471,-5242678,-360781629,1347876978,-469057486,-274724744,891194882,866795523,197624768,-1417629525,-1513059411,-129725531,-163279957,-1973528405,-1438643004,-1031067784,-1070378837,-1968547669,646592196,-1320090857,182768132,-1590252860,78709527,-1973821229,-1070355772,17221059,-1943622909,-1946948835,-12746502,-947715211,407238151,-396593728,1517421760,-225763758,-1323410293,1407963908,-1998053610,1843944439,-368318229,1047682823,53681861,552684672,424512294,-1960440695,1418268757,1435182594,72648978,341150502,654201993,-1995025013,1204223060,521535749,49295044,4622886,855419112,-5192768,73656515,-1178654350,768258,-1359855696,-969532044,-16588282,-1612177838,-265370391,-401181950,91416801,-336970264,-346415303,1493654221,-351907502,183662052,511080676,53690053,1972046987,451092232,223230758,-550824841,-645179821,1526378472,-1595359182,503536635,116785971,1946682053,926842887,-1183514621,53806734,-1178666101,375042,-1599736924,-1314258235,-205507835,128903339,-1416451182,-1420312525,915123115,-970587341,-1006566076,637726766,1342195338,-67901357,-1973528485,1594357984,922644969,21053056,-1023314943,508757585,235343446,-959892705,83983622,24839878,2114881806,24886017,18495173,921132008,25036535,779420160,25731126,678757180,2097595958,-969538559,369195782,-2012313546,243873281,910229886,26021513,1592208360,1493654303,-1070438421,123412318,272417625,54281588,-1664925324,1161723958,175374337,1111392310,41222145,-1013110579,-388287661,1918627708,-402541322,-613096003,-831188164,-1293360078,906619877,15603446,-3675965,-1561853516,1408660709,1374214963,-881697809,-1830230990,1947221221,1963146462,-402411297,1676149840,-2145446395,83006,837288820,646707948,378405605,-236453145,113651419,771752257,21104326,646524416,600638282,48735022,992893084,1963149862,-408867321,-622860030,1244562222,992870915,1946372646,1275115531,-368654802,-437518592,-1892770480,1929570054,1458236376,245328,1491038952,-819737250,-1224307658,780744194,-2125069643,-1946091545,5761245,-2120760482,-2097086489,175440127,1183458896,1134704128,-1054124031,642961411,1510106871,-466429949,106314534,-989982094,274086694,-989984142,190200614,-989986190,171369680,637726246,905987722,45549196,-1255241418,1992566274,918916114,21118592,911045888,48834185,922355478,21104382],4,[1091501622,378418689,-1960443161,-855448282,646522404,-1943665947,-1945966826,919899844,48834187,1090977334,113653249,-83885758,-1255226314,1946303490,113653259,-1006698173,-320094158,1048583958,1946157380,-352393213,55445190,-1524724222,581967361,920568040,45549196,-1256289994,512439810,-611450459,1493178017,578077499,511039803,1048589904,1946354510,-487659504,-1962928967,-397717031,-497481641,110049014,521011621,-2031550544,113703673,-973078207,-16694522,27598478,3151502,3024523,1490706408,45635672,-13741838,771929910,45430527,-969486341,60166,44618290,-970587019,-1186529275,78118920,1948299411,871957252,-1314196535,147060227,-117242764,-1426863821,-2085901423,-1007283985,-402033663,1961361523,1174697217,-402625816,376832329,1966750848,1076643345,976619382,1979784710,-1426083326,1196314438,-402650951,1015021587,1174893870,-402652231,-1031143411,1324942275,18081987,-397478026,594673933,-164230027,-16717050,540809588,-337439371,1965702217,-213929980,1060940458,-897524363,-1327961343,1319826208,552119491,1325036545,113653443,369164523,45727495,-1189040041,-1426915317,-796213198,1015046058,-1534233298,16836780,-1073080972,775688564,-1398141835,1946218984,1958742534,1313754626,-1195130830,-1044439008,866822914,702912,-391468045,-809565204,-1834249726,-1178889301,855083778,29344704,855829248,113719039,-452984094,917303947,839049634,1979661540,130188042,-1979267453,-391315612,-713888689,1347834398,-1090054569,686293689,393371392,326500107,-1142415594,-401837085,-969477485,369280262,1491480040,-987330506,526016002,-1178663146,540835842,-1181059847,250085387,1963684352,-115327995,-492139659,-1396442895,1631354660,2050754162,539755127,-294375876,-361487812,1946169832,1952136421,1952267489,1949973725,1950104793,1954299093,1950235857,1948990669,1950170313,1950039237,1949056193,1946762429,-1021297479,-76271812,12803132,1396395328,1027423804,1095912255,-768225215,1731677750,1412905526,204921142,37150519,-466164681,-399026634,-397410096,-1017643004,540852874,2134655858,-30014092,503376902,117323350,-2143944462,50393638,-397408907,-396821562,526310311,-301533642,-814416128,-1151984045,837287937,-166956309,1954551876,310022,-339509781,1947024509,1946696736,1963539494,-325044550,-151516160,-930459176,132317365,-1712840528,1509548799,113653443,-352321300,915139482,15470334,540840427,154989427,-1336873100,-8984482,-398455720,-389808272,62651218,-355538944,65795186,-1258606360,-519313407,-466422156,-1008663320,244563,-1152187157,-1031143420,-81205168,-397009320,526310189,1444856667,1962613224,-387697925,526311645,-1393390653,-126606276,-335601688,-1898935050,854756288,-1073041939,-594876812,-1019544182,947914102,-1979550707,1255181021,15507510,15573558,27967318,-131168202,-1963095550,-5314315,58001980,1023387624,922317830,880739898,2134653044,138161012,222046068,171720820,456941684,-231054732,-22406797,-13440826,-130121674,-864747518,-931923142,-339214778,-1336349757,-23140345,1642642155,1460515327,-231440193,-506372178,-1493177973,-391498611,-2006974844,-956366987,-611531380,-577846386,-1979602242,-1012599858,1776815536,-385175298,-202834332,-8590849,1508400304,-404201730,-308267265,-22419456,184503785,-401509130,-1977221038,1931492357,1946762247,4712469,-130121674,125108226,57999114,-380710914,1331167042,-1328641283,129192736,1991118563,2105550345,158599425,-220017666,-316790218,48114176,132219083,1952406524,518339,-1125385246,-1336946946,-34936824,-437772112,-385306371,-1607008800,434713727,717982463,-402134065,48955444,-969539151,194566,259322426,192215866,904440492,-20447490,-370679098,-80019762,-939591308,-20649658,50333672,-369556751,1642659514,717982462,1226273999,503714932,-24422649,1605300807,-167283449,717947601,-379730993,1085341334,1610445800,-400685481,119537390,-371291554,-164167924,-385681386,447807098,-385968151,11598138,-15936652,861032643,-391190309,78906738,1524560104,1021348440,1007907841,1007645702,1007383559,1007121416,-1341950966,-369442048,106026184,117448936,-506404400,-506338863,-288300591,-779366902,-1325320031,-773795324,101341664,1455620407,44940115,855639737,-389903406,-987832234,-402581962,1528815560,44933470,45026955,45160075,20645435,909984372,-1556253781,1364590907,-1177406638,-235469387,-523116335,-930357039,-402550338,-372178909,-1031732109,619184328,-1107185408,283640217,940476416,378028545,-1830289097,1582914048,-1409239869,359845947,-348008405,957253878,63043073,41229488,-1700609794,-253181183,-1144616193,987169176,1929359554,-2234252,20387465,-372119087,-1962560072,-1964902438,-2147403506,-1849818143,-774862079,5433569,-1715548278,1239959809,1238075904,-1550659325,1398145339,44940112,855639737,1405258706,517965288,18233029,534706152,-542381989,44893839,372688158,-555292671,-1587651809,-768409285,1073743801,-1997408448,838941974,11846592,61668323,-1006902576,-1957277360,16759282,-1073085301,-58709644,-2147060422,1946157692,-1073042402,1060910708,708582004,2145916532,-470911493,-1073042422,1944587892,1105425915,485214475,-638858957,-24907221,-2096270334,-344652546,2088825483,-478856703,24496395,1482252025,-6231869,-225768078,1944195048,167948531,-1342016055,1355020547,922726481,27592334,-1191176001,-1359871980,1325561337,-1017619976,306103376,-31999,723918452,92013637,-348273626,1157834480,683365124,1541666304,50333189,32241912,1354979577,1912618984,92940023,-260767940,-1008147406,1407904767,516175441,-164429550,1962933123,442136,72321830,3768358,-947712396,-186497496,-350239706,65796579,1509489411,-75250853,-1911852268,-1962826490,415728635,-1007041544,-469318090,37486603,212862326,920124393,198581900,378085142,-660468780,-12064757,78644339,109897451,1049168859,-1897395239,-1980796161,-1995711178,-1945379010,504094982,198448837,536808168,-655687053,53806734,199435912,1971373302,1200236068,1947248651,-351948796,1963501797,1946265848,-465666030,192217099,198721152,-337218304,-1190717950,-1957298165,-549549069,-1912201717,520872198,638281610,-2096994936,-1527577401,1053056543,-947713057,-484013565,-201791477,1053040406,-31061025,198746117,21334054,-1993949133,-1993989051,641738309,-1005501047,-1593059010,-2010772515,418349829,602523531,-400615721,91488012,568919728,92939991,-193659076,-16398810,-2014780366,115962622,-1928462817,1173750613,393592859,-402491905,911997132,46472840,1022625256,-1341884929,-339219710,-30545735,-169147789,-986313868,-167562434,1946225479,-351948796,-452475155,17122758,-2116514899,370147299,-402426849,-1977159884,-957874106,-389485584,74710426,-672463952,521543250,48367303,378332671,113705735,174588677,-1047858549,-2013142656,520872974,-549132258,-1073063393,54265972,95421556,45141227,922644457,199689868,-383874762,110048779,-1003090971,100725534,922695251,719850469,378091008,-1942617869,906032414,199689870,-383874250,-1892236533,906749190,15926927,-184119498,922695168,1371737061,-754667182,64589034,1524207306,1041025,-1561803943,3926271,-2144990862,1963000189,-402280441,-1997799484,-386841368,1150013732,244004356,1284049899,-5314556,-388636183,250150773,651981312,97664,652792692,383314929,-351368929,-42997749,243992240,1435306987,-1021377021,451419926,102265597,-44570537,326246238,-1979318746,76027975,-1961300349,-1330254906,-1331959036,-2013598970,-397323303,521600615,1911053145,1943635965,-351883058,1912814824,-352210940,-400615690,520551705,1173810034,108298267,-768360397,-922872085,-922873988,-2020467076,323290065,-350923501,-779644413,-1994111607,1911039573,106203600,-1645542263,64063378,1427317829,1021700902,-1341884927,1924197121,-2116449522,1962924259,-351948794,1375529968,-60692400,-177055398,859751478,169809411,638940370,-670341248,189728806,88458790,-385896447,-1293160695,-1977169613,367528783,72124880,-561188629,54271766,-397259145,1935342717,-351883260,1929526452,637549618,1947944330,1962281490,-351424508,1954588906,1434986067,852355867,1954588900,2110006792,1703552540,-808523771,1418317963,652667654,-2145696266,-1004130700,1240145021,-922826498,678822716,69992884,62129780,343263486,-491853744,-401509800,-527771407,41287600,-907296514,-1544879696,-85260880,1448104529,-1595358326,-402099486,-1004082945,1593315966,1918458456,1173825251,1950351364,-20381993,-972589880,201418502,113640939,-1207762585,1705181206,-1547685119,1923219816,1997441281,1930856705,1966508289,-1960901119,-1157163273,-1175977627,2007054041,513272577,-118991277,1979661521,1482184711,-1897197648,38047583,240945499,478053158,1393391103,113653335,-401210683,1533008934,520549771,2089010062,74776604,1983686,-1189165437,-1431568320,-85934070,37532651,28312690,521583851,1945849064,-351883260,1975519987,1300964883,1435182617,-826349545,-1996206967,-722794924,424511782,391481638,459636774,921693119,200087177,-283210698,1049179659,-1942615055,-401870074,41155247,712293867,891194934,410517251,-15042561,2013208183,376962844,906721279,49231615,-248068810,-593565685,-2096663976,95423684,976670443,1946349318,214205191,-253029968,-248068810,911235083,48367303,-1942559233,906168086,50661063,-941094296,919368411,53688005,189237336,-1894365297,1200561223,440897310,-971487345,906036548,200095429,920404968,53688005,-958068794,369165636,-385896417,-1008079647,-105584430,74712691,-1695874384,911340171,15271678,-502872266,-387645438,911858704,46468744,313525363,-1909006101,-1979501282,-991425681,906851549,20920063,387877686,10545411,-213990346,-979356160,-1607030270,-1180040465,-1101856757,371065529,530903839,20947254,-257870165,-1590252798,917177074,-1425860703,-1442101366,-1424603253,-1424472181,-1424210037,-1424078965,571742,540846764,24509152,-2131688625,259268668,-1180029264,-1431568381,-85974980,844038517,334080704,918894290,-695533325,-504867262,91447027,166269616,222596050,185560260,-1947109184,344593244,-988379082,-1992929278,906162222,49415820,1490713576,53151431,-1276575745,-648877863,16723433,33890304,1090584576,-620756734,-385817790,889192894,0,1702063689,1142977650,1227117391,1919251310,1883316340,1667853424,1869182049,1850287214,1953654131,1852397344,1937207140,1635013408,1886745714,1768169508,1763732339,1919164526,543520361,168639096,1936028240,1851859059,1701519481,1752637561,1914728037,2036621669,168633376,1344539149,1919381362,1948282209,1646292847,1948280681,1768300655,1852383348,1835363616,7959151,544501582,1970237029,1679845479,543912809,1667330163,1868963941,1668489330,1852138866,1668834592,1735287144,1631780965,1953459822,1852401184,1767317604,2003788910,1953702003,1970565729,1768300656,7562604,1130117697,1095585103,1127105614,1124093263,1347636559,4014917,1213481296,1230438461,808464718,1313423918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1543503872,1734894456,606348334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],5,[0,0,0,0,-402091844,434635907,444164,-1274906111,-1574843088,-857210270,1465432067,-972921949,164102,-1677643032,72935504,695442776,40451712,1007777024,-402295544,13435103,131072,33554688,589888,84017504,1879293184,2097216512,58178,0,0,0,0,0,0,0,0,0,-385875968,1861,0,0,0,0,106758144,66011,16777218,4194816,23068681,-1124072190,-67080189,-482157569,16777216,29688234,17957317,17957138,33227004,17957410,40043099,38077027,17957138,16515346,16253801,17957138,51118860,17957138,16515346,16253193,34734354,117571586,33554691,3211776,285739547,1879293184,-16713728,50331647,1313429248,1398230852,28332032,-352305218,844125728,1443556288,-352210864,-1336912380,6929922,-1101657109,82509909,1556054,1465012560,1392909909,8757806,-2128689874,-989746688,302105857,692024653,-83821568,302129665,1661098753,1073807359,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,16777218,66122,14893787,12648387,15794175,-1056964861,12648195,16580352,15793983,-65536,-65344,16777215,-251658496,-64768,-251723584,0,218042112,-62979265,-251723776,-1006697728,50381055,-1,50393343,49407,50396223,-1,16580607,-61696,61695,-253,15794175,15793920,0,806158095,16531395,12599040,-3932413,50331840,-251658241,-16580608,1056964800,251658492,-1,255,-49408,0,-253,240,61695,251658240,817889535,0,0,0,0,0,0,0,0,15794175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1123728819,0,0,0,1073750221,-1009152,60747789,43582786,201786690,88211683,65793,-254,-1,-1,-1,21626880,1346,0,0,0,0,0,0,0,13312461,0,0,538976256,538976288,538976288,0,538976256,538976288,538976288,0,0,1230441728,1464812622,852051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,753129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,855641319,16711680,23594496,256,216465408,1067910475,101642310,80157184,88212005,186403584,743376194,16777472,1018167296,42730818,-230292158,1951136896,788475397,503712683,1381390165,777016145,196417164,-1289320146,375066123,1958951768,-1126986235,-4521600,-850873089,1509654817,-1267699200,1914817864,920126314,157752969,5892993,-1323398858,-1262449141,237096265,7727135,196548155,968506484,1023457289,1064444365,-1061496693,1891795216,-1194773714,567099904,-1878700359,196157070,567099316,-851528624,-108963551,393545038,905984744,196548155,-969536139,602630,-1356923082,907209483,196294341,525511,-1659472641,1150262521,378418710,-1959916619,1477161766,1582979419,119496031,-1909580081,-1190416098,865076558,73853430,1024007610,410255362,1946158397,144685587,1946159165,144030219,1946159933,143178243,-1259856114,-1944851709,-1127117111,567083392,1303694962,-1557257779,99158380,-930284799,229955726,116859341,-63181,-315415179,158795462,1996932608,1048772618,1946159475,1929824006,-2130706679,617278,166265717,-389285631,1908015604,56485896,-854851144,1012868129,1008170062,-1897171623,-1274465530,-954086071,602886,1845937664,-219676407,-1163138302,521013487,-2147275032,619070,1048776564,1962936691,150321672,-352118040,151763710,-2147282200,619070,382015093,565709739,773967141,772353185,-1207953757,567102464,113712910,2419,196937358,567101876,153755275,567103668,-2146866015,617278,-1070398859,158009030,640614145,110046729,-1892808410,1476995078,-2134964466,4241664,1370793459,-1993465395,-1274467810,-842298288,113716769,8456563,1795606062,-2144468727,617278,-4509580,-850873089,1895530785,-385649917,1219821385,-143515187,1795606062,-1557266423,-670889027,1730054446,1357611273,512306691,-930346653,-2135109490,-388461055,-315424589,-2013265992,1024029958,74776575,567094964,158547587,-385649153,-840368347,-28710910,196548155,-1427633803,1763064578,-971017207,17379846,-402502168,373030447,158665655,990023912,1946773782,41936901,12118507,-2011050697,-2146713834,91566074,197134022,839304796,-1178730487,748601099,157484686,571900,1738647027,172809,157363967,-889191960,1975519824,-853953530,1405156897,298702986,-1060060976,41222948,-1057046274,1985730618,-339736060,1488990978,125123,-1948568629,-1962316018,973084694,-1274514230,-2011050690,1124079630,141880890,567099060,1650312,-1190870141,1051983887,-498916915,1394525177,-850283440,-1579446751,-1557266408,446695728,-1545565696,1532493848,519815967,1347507974,1150016910,646458884,118360079,-1190676545,-964493304,1487205130,-402170023,521076672,19327058,-1572797350,-990509140,-167086976,-2146955514,-1192688779,127122944,1946273014,127385091,127837101,127968173,16770945,1980563331,835331,154025609,-1114904623,-91814169,-1174346008,-521664613,252114432,158629896,-1274564678,-350106359,128301586,-2147431704,602686,2062026100,-1166873856,-1192753159,201439232,-1377295923,-1272968192,1953053696,1019543107,-29526926,1969306820,-2033044514,168458006,-2096270126,619326,113706612,-63117,154025603,-2096663552,34156094,113644149,-2097149577,619326,113706612,-63117,-678706038,520100072,135314127,-1174382872,1357383589,-352145408,1894635,519956457,1370771539,815866317,-1545892343,1532493848,-1128611041,-50665208,-1610076742,1474824549,-386959874,1035599903,1698594824,57999369,-402111046,1387921423,649224,-854849608,-1380269279,1381191687,-1393390762,1014965328,1008038448,739342137,-523134928,50790843,-401110056,116129759,45404298,-1470619187,1591243904,-1017619622,154778181,-851640136,1024488225,108331012,-385294406,-2014774140,-1947866113,281066200,12110131,1914817858,868137232,1662946846,16824841,567099316,1052023839,1922900429,-1090944762,-1162316749,1458047008,514976767,157490830,-1191116610,-772003322,-1378733079,-69021693,-1631927521,623032323,-1715854899,623097858,-491118131,623163396,365109709,705110535,1057436423,1376207623,1644647943,2047308295,-1895332601,-1039684345,-905497849,-603466233,-402136825,-217584377,1769101063,1881171316,1702129522,1631777891,1853169764,1867445353,1701978228,1123640417,1663067233,1634561391,1151362158,1122071649,1663067233,543976545,1836216166,1700000865,1867443045,1329868142,1768169555,1699998579,1919906915,1953459744,1970234912,1867441262,1885433888,1918366309,543519849,1819631974,1634030324,1634082916,1156869237,1928033129,2003067237,544500082,1920415077,1852404841,1919164647,543520361,545918273,1769366884,2123107,0,218103808,1126179850,1095585103,1629537358,1668246636,1869182049,1713414254,-1603965847,1919906418,1851868064,-1602982034,1919905125,1633820921,1239966580,1919251310,1868710388,539784306,1920230738,1226845305,1919905383,10501989,1818838576,1635005285,543517794,-1402707614,1986939184,1684630625,1329802801,825831501,1297040174,1936286752,1852383339,1769104544,1092642166,1717920928,1953264993,1769104416,1630594422,1931502702,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,1700016304,1852403058,946173025,1651468832,794372128,-1606473394,1128618053,1767990816,1701999980,1765098928,1480925294,1353724997,1919381362,1948282209,1646292847,1948280681,1768300655,1852383348,-1338544864,1684095536,544370464,1936943469,543649385,1835888451,543452769,1702129225,1701998706,821192052,1713401678,879060338,1684955496,821257580,1697855309,1815490741,828662127,2037588012,1835365491,1818322976,820274548,1635021622,741438578,1769497888,1735289204,1919890096,1835101748,45157,0,1346,0,0,1547321600,1296912195,776228417,5066563,0,0,0,0,0,0,-1342100480,316,25947712,16842752,65537,16776960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16711680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,623852127,1162889552,606350897,979304484,1229989167,775046480,2368548,185207548,8390144,6030658,7079234,1346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16777216,58123,1749001984,503661057,1107595661,788925189,1107460956,1107584005,5,0,168116813,0,0,0],6,[1213481296,1329791037,1162892109,977354051,1297040220,1145979213,1297040174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33951309,13108480,-1593066077,512491522,1213481296,1329791037,1162892109,977354051,1297040220,1145979213,1297040174,-65536,-234484134,-1930898631,-1547566118,12061468,1073750221,-1009152,42790925,43582786,81921346,88212802,65793,-254,-1,-1,-1,21366283,1346,0,0,0,0,0,0,0,13312461,0,0,538976256,538976288,538976288,0,538976256,538976288,538976288,0,0,1230441728,1464812622,852051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114409,53,1936607488,544502373,609439556,1702063689,1092646002,1768714352,1769234787,1227124335,1919251310,1767317620,2003788910,1951604851,1970565729,1679828080,543912809,1679847017,1702259058,221935648,1701990410,1629516659,1797290350,1998616933,544105832,1684104562,220471417,604638474,1735357008,544039282,544173940,543648098,1713401716,1763734633,1701650542,2037542765,1953451520,1869505824,543713141,1802725732,1634759456,1713399139,1931506287,1701147235,2019893358,1851877475,1124099431,1869508193,1768300660,1461740654,1868852841,1931506551,1953653108,1713401973,1936026729,1547321600,1296912195,776228417,5066563,1397575491,1027818832,1413566464,1459633480,808537673,1229073968,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1751349340,606350951,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143703040,-402357272,113706009,41550080,567095476,-402496862,1488454604,40084311,42010310,20113408,1491619996,1939691524,1765703721,292880386,91555900,-855580696,29081120,-855581976,1963473952,54847493,-974600725,14870529,113688043,-2147417495,164158,-1763114123,41281536,184712865,-1106283328,-1930952704,43640834,-402652226,-2118516093,19851266,37560947,-1173654272,-2118254316,10872834,138275051,-2146667264,50487870,-337115789,-103290110,8390343,-2086925056,163390,113116788,38135808,-402230371,1374224472,45869311,-1962931778,855827398,-2147027264,58003458,-402512152,1369178734,-402500632,-1655110757,1203242610,-14030505,-1849817373,2484225,-1157686295,1102316120,-474078771,17950726,1001707147,1303650765,1286873549,138158541,1891500917,-1073042431,-796260236,567083700,229831659,-1308622104,-855460854,666551073,-1576760575,162791757,1052385741,-855002111,201898017,1807360461,-855002111,385663777,40083719,-1107231069,230228475,1765703680,242483202,-1962801474,-17922,-1359822797,-2134912521,-1967115520,96535045,2116878339,671251968,-1967115515,-134002939,-1951789648,1048619713,1962934889,-853953524,-1270807519,-377246918,-1163595006,-661913082,113754254,8389228,40771212,40896199,512491612,113705586,7078516,41295500,-1090485826,28835932,-1088303831,28835948,-1155412695,119407210,-1996477279,106044935,2877523,1763523,-1073042346,1555168117,1963735118,313083,-851725222,-1962112991,113165298,-2146137598,246694378,1438851533,-326898549,-973332908,118884470,-1951498611,792505567,1547438196,977011828,-544537739,-1073042877,1586097013,139904428,-402366780,1601372264,74711612,1450509116,1963023336,142525521,973175936,431229300,1090789837,-1398064460,1950039210,1975519749,1555058422,-29018074,642711925,520045960,-1960896938,-1431524234,-92946422,-1006086459,434635870,1931435520,1946303502,1963146244,3964933,536457077,-1034033781,519569416,378285653,-1993473787,-1207892186,567102208,85364270,646655489,526188807,-1960966461,-1962771426,-850873141,-2017423839,-1912440314,871773144,-773729793,-52309535,119514611,914955971,512623224,-13237638,520255518,252006595,-754667264,-1260876824,1914817864,868257300,-1547684865,109838949,-1414856089,-1949158568,244040698,65208935,-1962932504,-486376946,-1262383610,-1021194935,-486525720,-1041752535,39369470,1018480947,376578509,382064779,-91553179,-2097001077,1085539521,1051992525,-1323359795,1488634625,-851332094,-993789663,-1946000066,637854657,-1023259253,-1191056193,736624648,235238400,31309343,76275596,21865006,-695476338,-851246920,1931415073,17414664,-335707160,-171981845,375041,-1910110442,855649310,-212381194,1952014246,-1073042420,1015085941,200176896,519881673,33996551,567089588,-1196801788,-1951704006,-1261292553,-1105081017,-474021370,178957318,-1325763136,-29083556,-2008153739,-24379580,-1409156162,1975519914,96729338,78710943,-661919533,1253312278,-4513331,-850873089,507194913,158531843,-402636056,-1226179368,1048653564,555745409,724447861,771818270,8521414,784347936,738231200,1997093936,113651223,-1323302781,199283468,-1207732800,-1019542528,-668268941,567101620,507843,79629803,-2143387648,57933824,516145203,-1615278452,-754667256,-1896872984,868234206,1279033846,-2129693361,1330053756,-1207039883,508561278,-1021326505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-268370203,64287363,4194304,-268373645,262208,0,101580804,1687,110559743,13365762,101582718,46597646,1330073420,855687401,-1597993280,-1574567911,413139984,-888091392,5270787,94373280,1073741824,236959744,1919117645,1718580079,1767317620,2003788910,253821043,1936876886,544108393,825241137,1125582848,1920561263,1952999273,694364192,1667845408,1869836146,1126200422,1869640303,1769234802,539782767,892877105,1092624430,1377856620,1952999273,1699881075,1987208563,3040357,1766660109,1936683619,544499311,1629516649,1734701600,1702130537,543450482,1684107892,1918987621,1718558827,1667845408,1869836146,1126200422,779121263,-67108864,-1912534808,-402643962,-890765127,437684992,1139441664,2102827,2102827,1049350659,1122500636,473860864,507380480,2269440,-133961519,6154319,-52202166,-1979701570,3932484,115869044,-1191908608,-53805030,869305261,-1258310693,-1408185086,108314634,281874100,-54266389,-1093520814,-288292828,1707659,-1960384047,-775649787,-1966550584,-1058635532,171959424,-2032760094,-421352508,1524462926,844299715,2408146,244051665,-372178918,-2046457050,-775892540,-2131719488,-64748570,-695549430,-492059514,-562737433,-1094452134,313524743,1713910,1040447627,314245152,-1340019968,438760978,438209280,1139507200,512475907,-338624478,-125058301,2113067,-1593830725,1127022618,4438272,-218086471,1274545060,-1262226571,-1575957233,-1070399464,-1608073074,430048272,-1462700544,-167217872,653206736,-1207693150,281870342,-1223688008,-1206858495,28774401,12783821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-12648448,192,-1006682368,49407,-50393344,50331648,-251658241,0,-49408,49407,-15794176,240,-15794176,252,-256,-3841,-1,-251707408,0,-3932161,-16777024,-1,-16580416,-50331649,0,0,0,-253,192,-1,49407,-1,-16,-251658241,16580415,-16580608,-1056979969,-49408,-1,-64768,-1056964609,-61696,-12648256,1057014015,-50331649,-12648448,-1,-16776961,-251658241,-1,1072758783,65535,-61696,62980035,64767,-251719936,12648195,15793935,0,0,-65536,16777215,16580355,-15794176,-251723536,0,16715520,-12648448,49407,-1006633153,-12599041,0,67059456,49407,-16515841,192,-62980096,16580352,1057029903,255,-12648448,15793920,0,65295,-49408,-16776976,-3932161,15794112,0,-3932413,1056964800,252,0,0,65535,-251723776,0,-1057029376,61695,251658240,255,-50331841,-64768,-1006648321,49407,0,-1056979969,-50397184,64575,0,1069612803,64767,12648192,0,-4129024,240,-15794176,1056964608,16777212,-786673,-3932221,192,0,12648195,15793935,0,0,-15794176,50397183,49407,0,-3841,15794175,16715520,-62980096,1069612863,-1006648321,-1056979969,0,50331648,-1,-16129,49407,-49408,-65296,-16518913,192,-16777216,-16,61695,65295,268189440,-3841,-3932413,12648387,0,-16580608,-50331649,0,0,0,-65536,-1057029121,0,-251723776,-1,251658480,255,-16516033,66912255,-1056979969,49407,0,-64768,16777215,64575,0,12648195,-12648448,12648384,0,-4129024,240,-15794176,1056964608,-65284,-16518913,-4128829,240,-16580608,12648387,12648255,0,0,-1057029376,-1057029376,61695,50331648,-251674369,0,16715520,-62930881,-49408,-1006697536,-12599041,0,67059456,50381055,-16518913,192,-62980096,15793923,1069612815,255,-12648448,15793920,0,261903,16531212,16776975,-3932413,-50396224,251658240,-16518913,-16777024,252,0,50331648,-1,-16531201,252,15793935,61695,251658240,-1020261121,50396223,50396415,-1056979969,-49408,-1,-1057029376,-62980096,-61696,-12648256,1056964863,-50331649,-12648448,-1,-16776961,240,-15794176,1057174284,-16776964,-16580368,12648387,-256,12648447,12648195,16531200,0,0,-16580608,12648447,-65536,-1056964609,-251723776,0,67047168,-62977024,-1069613056,-1006697728,49407,-50393344,50331648],7,[49407,64575,-49408,49407,-15794176,240,-15794176,252,15793920,0,1057029903,192,0,0,0,0,0,0,0,-251658496,0,0,0,0,0,0,0,0,12648255,1056964608,-1056979969,-16580608,15794175,-64768,65535,-15794176,-1,0,16777215,50331648,-251658241,-16777216,-251658241,-1,1072758783,61695,-65536,12648387,-253,15794175,-253,64767,-253,-50331649,-15794176,15794175,-64768,-251658241,-65536,-983041,-1,-12586753,252,-1006633213,-16727809,50393343,62980095,-1,1057014015,61695,-1056964864,-49408,65535,15794175,-1056964861,-256,-3841,-1,-49168,251658240,-3932161,-251719744,50331648,-16515841,-16777024,-64528,-1,16580607,-4128769,-15744769,240,16580355,61695,251658240,255,-1056964801,-12648448,-1056979969,64575,251658240,-1057029121,-62980096,65295,0,-16711921,-15793924,16531200,0,-16711921,240,-15794176,1056964608,15794175,-256,-4128829,240,-16580608,12648387,1073495808,16777215,-61696,-12599041,192,61695,50331648,-251674369,0,16715520,-62980096,50396415,-1006636033,-1056979969,0,50331648,49407,-264244993,0,-16777216,-49216,-16580368,192,-16777216,-16,61695,65295,1073495808,-15793921,-3932221,12648387,0,-16580608,-1,15794112,0,-251723776,-253,-1057029184,0,-251723776,-1,251658480,255,-15729601,67059648,-1006648321,49407,0,-64768,16777215,61695,0,15793920,-50331889,12648195,0,-983296,-251658241,-15794176,1056964608,-251722756,-16515841,-3932221,192,0,-253,1057029375,240,0,49407,67108611,49407,0,-3841,15794175,16715520,-62980096,-256,-1006697488,-251674369,0,50331648,-16727809,-12648193,65535,-241,192,-4129009,240,-16580608,15794112,0,65295,16531200,-1056964801,-3932413,16531392,0,-16515313,-15793984,16715712,0,67047168,50393343,-62930689,0,16715520,61695,251658240,817889535,251722815,50397183,-1056979969,15793935,-16580608,-1057029124,-251723776,-253,-1,-16515841,-12648196,-251719744,50331648,-16712449,240,-15794176,1057177356,-16580356,-16580356,12648387,15794175,-1056964861,12648195,16580352,15793983,-65536,-65344,16777215,-251658496,-64768,-251723584,0,218042112,-62979265,-251723776,-1006697728,50381055,-1,50393343,49407,50396223,-1,16580607,-61696,61695,-253,15794175,15793920,0,806158095,16531395,12599040,-3932413,50331840,-251658241,-16580608,1056964800,251658492,-1,255,-49408,0,-253,240,61695,251658240,817889535,0,0,0,0,0,0,0,0,15794175,0,0,0,0,0,0,0,0,-397904802,-370671397,-399054080,1014235364,-1403593933,259263804,-143311556,1015071742,-17795827,1592585159,108317694,-383202630,-397150506,-27590596,-401574705,-1595408190,222080000,-471333516,-1007228160,748691086,186392206,1015084595,-1947175936,309455062,-1392814360,-76169206,2092887275,-1107039448,508962945,1912612328,-386430192,-142147429,721479912,-216070450,-1017241692,-349668162,679591427,1912604136,-1870992589,3008764,748684942,470191654,1375679243,-391358634,642187375,1979663674,1609818626,208951646,5630033,1031808601,-102730496,-1962467645,1088968702,1459940096,1493188328,-108529365,222068931,-391378060,1072169015,1966947328,-2134981648,-1073042432,-1394080396,-1022542596,748684942,470191654,-385928437,-2144993269,-143327171,-348278589,-1178586622,-1359871744,1918975171,2004499462,-1021301758,988304209,-2082895104,-80018709,1364207730,-193009581,46367579,-338492239,-850742205,-1912169439,-399728634,-1660423053,108222553,-383383878,648738214,1479,113465691,1220578384,-1591295858,78708739,-930357037,-1262287016,69324057,139389249,-402650648,-960234965,23558,6035082,1074053770,108347452,749733378,-1102003970,1202990424,91431373,-2132205810,760594418,-1269246069,-1516197062,216640044,109970961,-1591333728,-1557788372,-2144993258,619070,-987362699,-1207194858,567092513,109983239,1236544674,12067277,-400437940,45677850,1914817853,-1193768176,567100416,1971372790,-851528691,682080801,-351225368,-164458455,-1207711104,567100417,244051,1052039987,-498916915,1169447929,1169433037,1169433037,1051992525,-1909055027,506241054,-1560274783,-692582033,-1144303613,12058625,-165556924,880050370,1947255542,891926575,-1064558131,1996525629,856405027,-1273967141,-1978610417,-1228210476,-1950338279,-1274562616,856739078,-1275021358,-1022309118,-1406549826,-315438966,-1968437580,-501101104,-1281244167,-1190786260,653048364,-2118240907,-84547584,125046076,977120582,-385649395,1273560774,-1224280324,108331565,567098292,-2098636941,1304825,968099445,1232282061,-383256902,-2084899806,-1090983127,-1192755071,1947024634,749969905,750323211,1965485242,-66262814,766969590,-555171070,-1274644993,1931595066,672381460,-1158418967,-1645730099,201439247,-1863835187,213894136,79858220,1967144000,-1341783546,-1430192596,749020810,111884976,-1258845409,1914817863,-1021374974,-1409283911,24387644,-1392975190,309600316,783343754,-1429961046,1017905841,-1442614240,-1070401310,113689514,-2130704009,619326,-955877889,-16157946,-311105025,167657088,-1169197825,236858709,-853887969,-4579551,-2146257911,654910,297011060,167642822,169987328,515864000,-1105261049,2042572117,1049175561,78383612,1950366784,1048585739,1946159480,-1422216189,654276072,234833350,118365958,167517835,1946173312,-1393325175,-76214980,-1581328757,730578697,1017956659,-1978108635,973732646,1175483684,-1393325226,74714428,-135550399,-1427903650,1963801665,-2009708067,-1993635314,-167117802,-16159226,326377230,-12204506,730577444,638488040,234833350,-370213399,-1910575363,-1171480546,1048651993,-16774797,113706613,-63117,-224073441,855671230,-1610182967,158973740,-1574518734,-2044327560,168392454,650868160,167526025,-33110490,485031689,624733689,-2010747531,-401999066,222099727,1034757236,91508297,1970170173,-117577642,1965571244,-118101938,125118780,748691086,-1392592919,1114901820,510929212,1948925098,1967078404,113649158,-402585090,-478807849,-12204506,-121247731,230218219,2105550336,41225727,-391397325,1034811571,91508548,1970234429,-123344827,1047792956,-1408654913,1963801770,117319418,-2094659209,-16157890,-953809035,619270,1048585983,1963002366,-1088485865,2042497535,24936457,-33262278,-1207339002,567093504,-893757245,-239277784,749668038,8502784,1022907112,-1947503603,703447022,-175439691,-481882742,1963125555,-1977177072,-1002813659,-864025228,-490456544,-117202962,1195842955,-1394903650,-1166799556,1979196136,-132781871,385278975,-1192547153,-1396100266,-1586229956,1962412776,-202686205,125058364,-1854665412,-1393169492,-1988805316,1022880488,1602384909,343189235,234847360,1017953396,-390630387,-160040997,418119600,-137238356,-1070404235,1438584555,687978541,263463373,567138187,749668086,-167611137,1958742736,-352524029,-1946705176,-2115403314,-2146555904,-2146530816,-1978759168,730578731,229680371,-316413526,-617477449,1947024556,-142481244,808193140,-403258490,-1014578430,-1910576405,-1976786914,520711206,-482688974,-922835341,512664299,866200736,-22263,-1064422540,-919349106,-108281461,-1951468983,-1186576649,-1510801399,1962884483,-952792296,922746629,748691086,1963801772,3965179,-1993997452,512672565,116862112,-63181,-768347276,154474121,154605193,-1090486552,196673629,-232738816,1090614702,-150214269,243873497,-1813500587,1949973750,-158537695,125110844,1022789096,-149720006,-16174330,-387287553,521011261,-383207238,1572859934,244004352,-397333163,207222370,87696928,132842101,975577132,1204843781,1273555170,1998601462,1947024582,-163518457,-109769412,787888616,785456779,567099060,512630467,-768407245,-851640136,521499169,785490742,378263691,243992885,12060983,-1021194942,126540427,-115392468,9496771,512627314,108342432,158205638,113689345,-1023407762,1006665888,-1173786110,1323827330,-197269237,748691086,158211722,1589255950,-383194327,1474883450,855750656,91556978,567083442,-841862461,243974945,-922091392,-1070407307,-628481587,-399947334,1153043222,1977289257,691976707,-401929751,28835874,1963618862,-1021195005,567134462,-2146530621,1976109568,-850086738,-1160213983,-873780909,-1409262146,1866211340,229448565,1849434144,-58718603,-1022462688,1969645117,540847112,-1057094795,675986115,503759865,-1064384372,113760398,852097,730400454,-1979267200,-401800917,-1712848890,-888725760,-402619970,222098799,767244660,17492015,110117867,-1090056617,716451014,-1952964147,65458672,13009392,-1176925401,-1527578621,-1951784784,-1295348797,-2030897564,766743236,-1174331671,1340614436,-3676150,-1155058246,-1326960851,1916171264,-1019565003,-952499084,-706204555,-1188597248,1015023468,-1341426675,-1947928988,12773576,-997583758,-939327308,1963801772,-852773879,1975519777,364561153,168093735,-2118207765,-187045888,309595452,-398837061,518717556,-852708208,-382029023,1471807656,165734439,872410856,661174985,-398837061,1718878271,-896846990,1017958963,975336461,-1289325117,6219822,-192274574,1947024556,1975728656,5171220,-729149582,1963801772,-852642808,1958742561,659077681,-351693336,159574198,-1984296268,-400437973,-1950420365,222068779,501748852,-1978699264,-1019564812,-75493772,1308915002,985858226,-92931641,-1979710488,283689940,-1964019200,649440,181732466,17621130,738495171,1022980656,-193792758,106414918,-960559346,-1211790804,2746384,-1968520310,2222273,-1968520310,1697990,1966799744,-1439780861,216580746,-1430244608,-399718726,1594296591,-2046110525,808455620,41234492,12044074,1351795627,1476970216,1377747858,777081680,748691086,175586944,-402230016,719847433,1482381568,-2134696102,665150,649729908,1023457290,-608558643,-1962184155,-2030063400,413276231,521061120,-2131957271,675646,1048589940,1946159694,172997143,-851639880,856519201,-1949748270,1107474648,283845069,856313786,-851659575,639744545,-661927822,1200029616,1679896,272531651,225771310,784545419,772880009,772802246,-1947388929,-1288781002,779075371,-167209240,594837703,1963050998,32303344,-1074614296,12070105,-1155412695,-625070695,356420396,109766702,-402486295,-1070398536,-1557349470,-1130222401,288787244,-1019836114,46196782,-1947663500,38856961,-1180450765,749904428,-1573991262,-878563640,751084334,-1573992030,279063729,779068206,-1557284701,-1734136296,760587053,1210914211,-1574125150,-1281217009,8502829,-315413581,-399609921,1198655495,1954596854,-871971323,-940179154],8,[151680001,153925422,-349390546,-2134378787,117310581,-1588187982,1874734803,-1077531858,-956093000,-2010270301,1093514254,1049142515,113716663,11447,-1599083682,-1314771252,-790573012,784704224,-1607892038,-1073075022,37487732,-1813445770,766754283,544538940,70037664,-969231295,-1090387642,-945082952,2930438,71747072,4638210,110159872,33652352,1048581493,1966747065,72253454,767213314,18118,-1962510872,1031799422,-1173064448,2105550818,-1435157762,33572550,100945536,-1173988888,-1180621076,-2147467988,279549044,-1273728000,505531732,748691086,1973675058,28843785,857853230,8503021,1874799539,118614062,1963050998,-1221719563,147191596,-2146667264,2928958,113640820,1443114699,-1104227423,-970248593,53352639,773170119,773066376,-2002455743,1580078910,552125835,-406853628,-402384152,-1679228835,34793472,751056523,1978203955,646298351,-385454616,1048634526,1962945713,773372507,-402234648,-608506046,61860133,785621334,724463550,773373894,363054851,336496686,-1527561938,773275272,-389706914,1726481351,63039719,749813376,856388864,750494400,-1574125661,914959548,213855939,773045548,-1962631448,-1020390090,785137280,-352160512,-1947389056,-1288781002,779075371,-167363864,-344686393,1963050998,-7280400,-1207935809,567093504,-2144462687,41171708,1076641968,-1275044702,8972305,-264836964,-385649507,-1070399660,750847622,192200714,-1090515783,1438526872,849670957,784835264,773144203,-399681858,1048639006,1962945713,386332167,158597678,-399632198,1894253963,5368046,749813376,-401967872,91357452,750454470,-1321304064,225706028,-167655704,-13758458,-320273548,846076,113641333,-352310084,-12260954,116789940,1963077143,-1008465405,-1172655024,567094613,6077016,-1073077811,-1358510397,414842924,1023457326,-260955699,512350347,12070508,-1994273449,-1993421546,-1204891890,567100416,-2004819328,1949199894,-935428083,108265518,-383182918,512426573,244002412,378219709,-903140161,1088949877,-901873663,1702166574,750587531,-1575055842,-851463124,1433542433,1373882507,778976896,-2146994944,3066686,-779412620,750730891,-1912202576,-231955962,91555758,749668094,-1949226175,-1089600566,-1089566420,-1123140820,-401837524,1048576235,1962946250,-2138051824,3042878,1048577908,1946168495,1813941121,-851528658,1048625953,1962945724,750231800,1946284776,-1088517322,-1122092244,-402033364,41156770,-617364487,-1575055842,436717356,117382912,113650879,-1610600761,-466473271,750716419,20776306,-396135424,-730529674,784940672,-1957202944,-1959916514,-1959866610,-2144416490,3065150,750006644,-506453555,-506338864,-506338863,-838144304,-852839343,-1125547743,-773224953,-790179615,-790179610,-2132356890,-703987499,-1202063990,567105281,567099060,751044351,750520062,512476152,-420991476,767081215,567099828,751044295,-387252224,1345106336,1476396776,749798970,-905525565,1048576046,1946168507,8448259,-402572056,376767238,778976896,-2146470656,2928958,1948661690,-955857317,28836142,-952205251,74776622,-919389004,-852641606,639744545,212024946,-1157183954,-661978836,-851181384,236357665,-2134706642,-1214238092,1963729964,785096713,784860682,544872564,477366440,843317688,550142198,772675208,216736205,113669611,-2147209525,70173966,784809600,-400722688,410321538,778976896,-1173261056,-135780773,-1090074878,-33554388,-1020343802,772546187,243779891,-203215681,784926462,784809600,861238528,512630482,1085549730,-1172364851,527574508,-747321301,772671222,-166431616,539889158,1048578677,1962946245,1014253887,-399924550,117310114,1048587452,1946168507,203328276,-851528658,767080993,567099828,750454470,-66983680,-779627981,-851312200,-1354858463,74711084,567099572,2047616195,136597520,1479461026,-878574556,-989460434,785096750,-2134654966,-13782210,213847157,766754092,-402599192,-1070404432,772736646,58048522,-1962901527,-1087523530,12070165,-1591620311,-58708552,-1342016454,-888239552,-1572852690,-1214239467,388401709,33695022,326418442,259376186,785137280,-33000448,841879558,872868800,-792452606,-872019224,749838894,-523181872,-2144418398,3065918,-878566283,1976109614,1958742557,-1089565927,-1340873940,-13433318,748816014,1963437810,1049186053,1455107263,-1321304019,57933868,-1104307781,1049308438,146353589,1060940800,126485109,24387644,-236829782,1015022513,-1340967904,1017948718,-1979550401,1948269575,-498882047,-1430244623,71759555,-1960676094,96633813,-851640136,-1961463263,1140898008,1051992525,-1024056883,-163482240,1946420294,89557819,1950023296,-2143243774,-1729609494,-2083157007,2122974658,115834884,1963392896,41323286,989756544,1187382901,99287552,16795334,-2141263026,91554559,18118,-851725117,-400133599,-91495090,-930365389,1336865353,-970152544,973209670,91553605,4638378,72253441,3991558,4638403,75401728,1946470390,4638451,41323266,1946172544,775716896,2088770420,91503358,16795334,-2032455090,-851725284,1914471969,-453711868,-366220861,-2147320183,-1207172794,146353727,-2035617024,-997807420,-1426914383,-1012219854,415125585,767082286,749735562,2088823178,91568641,-1975440211,25002184,-1979157190,742868741,988318273,-400525847,460587040,-1946205045,575733581,259348673,74788412,132899850,1966012800,1491929602,1973863257,-8617810,-341281792,1364336373,521031763,-2010331461,-1143764201,-880082943,567099572,1515805528,1397801759,45819056,1343351552,149622192,-349917104,-1070379005,113491,-91531439,117440441,-1359870178,1239021319,-851397559,990474785,1594193345,-1017619623,109977358,-323343200,1048585765,1946159735,113649161,-1174402441,-202823439,-1547684893,-694014253,785883694,1469905034,-391329485,326494855,-160161732,-227276484,785843846,-361447414,-402593047,-1019548193,-813693579,1021045632,-385649395,104464592,58010788,-2147429911,326449724,-1409220888,-1996424472,-970009794,3069190,-1996454423,-970009794,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044,125153010,-754974280,1508379616,11536223,-123904086,-29250877,-1020340986,1364678150,12079952,650153712,-115072,-133663491,1599690843,-1195178146,-1064386560,-2128150733,1957319997,8389898,1928331325,652274669,839015818,-773598721,2143519715,-8330367,637535935,843517322,1976110061,-339541244,1190300631,125085427,-947652349,-2132481277,91504444,1965046912,109850351,-1993462351,-114446530,-4482325,-850873089,-850873311,-1202695391,773727522,748691086,-855470406,-1898279903,-1269162046,-1910387371,8436442,567089844,186425638,1526738083,-754722164,136841,-1907697012,378094298,-628228095,268499841,-617414030,-472709967,-762389876,-1070341237,785446736,766588671,-1355350226,-876442067,1631717901,543712116,1701603686,1936289056,1735289203,220465677,1936607498,544502373,1802725732,1953068832,1633820776,543712116,1701603686,1851853325,1919950948,544437093,544829025,544826731,1852139639,1634038304,168655204,1684095524,1836016416,1684955501,544370464,1701603686,1835101728,604638565,1819309380,1952539497,1768300645,1847616876,543518049,1176531567,543517801,544501614,1853189990,604638564,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1968120842,1718558836,1986946336,1852797545,1953391981,1634759456,168650083,1818838564,1919098981,1769234789,1696624239,1919906418,1176766989,543517801,1852727651,1646294127,1868767333,1684367728,1953394464,1953046639,1718379891,1126435341,1702129263,1864397934,1701060710,1852404851,1869182049,1869357166,1646294131,1919903333,1868767333,168655216,1766203428,1932027244,1868767273,1684367728,539232781,1701603654,539587368,2036473892,544433524,1701147238,1227098637,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1920226084,543517545,1701519457,1752637561,1914728037,2036621669,773860896,606088736,1635151433,543451500,1634886000,1702126957,604638578,1299084627,1968467567,1684363109,1182099540,1632856434,1225395572,1818326638,1679844457,610628705,1920103747,544501349,1702125924,544434464,1158286628,1919251566,2003136032,1952539680,606091877,1850280461,1768710518,1769218148,1126458733,1701999221,1948284014,543518057,606106473,1850018317,544367988,544695662,1701669236,1092886586,2032166258,1931507055,543519349,1311725864,606093097,1229208608,538984018,1112089632,1699749965,1852797810,1126198369,1970302319,544367988,542330692,1936876886,544108393,1867915300,1701672300,544106784,1986622052,539238501,606106473,1935763488,544173600,1700946284,1850287212,1768710518,1768169572,1952671090,226062959,1851073546,1701601889,544175136,1634038371,1679844724,1667592809,2037542772,1227098637,1818326638,1881171049,745043041,1953459744,1919509536,1869898597,221018482,544370442,1701996900,1919906915,1869488249,1835343988,226063472,1967989770,1931506803,1768121712,1327528294,1919885390,1179012896,539232781,1701996868,1919906915,1718558841,1310990368,1632641135,606103668,1213481296,1330794557,1028935757,1635151433,543451500,1986622052,1852383333,1634038560,543712114,1752457584,1227098637,1818326638,1679844457,1667855973,604638565,1700946252,1869488236,1868963956,224685685,2035491850,2019652718,1920099616,168653423,1329990948,1633886290,1953459822,543515168,1953719662,168649829,1953384740,1701671525,1952541028,1768300645,1696621932,1919906418,1920295968,543649385,1701865840,1126435341,1869508193,1868832884,1852400160,544830049,1684104562,1919295603,1629515119,1986356256,224748393,1718559754,604638566,168652399,1163018788,1763724097,1445208179,1179210309,1936269401,1128604704,1763725128,1227104371,1818326638,1881171049,543716449,1713402479,543517801,1701667182,1227098637,1818326638,1847616617,1700949365,1718558834,1918988320,1952804193,225669733,1917133834,544370546,1953067639,543649385,1679847284,1667855973,604638565,532488,844831492,407585866,1343807828,-2092035693,241194513,1276053319,255987467,196960015,1159322148,-112718077,251613454,1330512640,169187924,1330795077,1447382098,371739717,1230521605,367678547,1229194240,167379282,1313165831,21318977,1375997106,-1308537275,1380255244,21320513,1141115965,1023495237,1498678540,-285129392,1163002892,17039437,1347371781,449577305,1430343686,520111443,1094976787,939541844,1230243096,-838843059,1163265048,240582738,1280267780,51234817,-1509866429,1212352018,22169924,1292047014,316211524,1145785606,-654224823,1146225426,101912065,1229213010,319684946,1163018758,-1845474495,1163265815,1497778514,68667136,5522771,1342640143,1347243858,268042324,1413566469,262144072,1230521605,298385492,1414808325,301400409,1212368133,391708751,1414481669,378929231,1229476614,1442862150,1179190038,68505600,5394246,1124340840,1392530252,18,0,0,0,0,0,0],9,[276,0,1,12066574,1,-2011050701,1,856000022,1,855750866,1,1370759629,1,512303565,1,-1014102647,1,-1289829322,1,109848075,1,-1993998288,1,-1275056610,1,-1977496295,1,-854674224,1,93037089,1,-759692111,1,250139392,1,-1547500709,1,-270006905,1,-1962636540,1,1418396252,1,272928262,1,1007574158,1,-1341688317,1,79227137,1,37551083,1,-1993411212,1,772099614,1,89130636,1,89301550,1,1728497198,1,12058629,1,1914817853,1,1403203295,1,-1193768187,1,567100416,1,1954595574,1,-352145404,1,113716939,1,1381,1,1376187950,1,1618280965,1,1312212270,1,184847109,1,772830656,1,92872334,1,771763361,1,184902051,1,-62556992,1,-13385586,1,847249337,1,1957622464,1,-385175547,1,1974337694,1,-544516108,1,-1324366973,1,116118276,1,567101620,1,57891103,1,-1912569879,1,1638084288,1,-1047768827,1,992922371,1,1493534494,1,-164402057,1,-1527513293,1,515448590,1,1394510592,1,90749445,1,-857203194,1,-851463165,1,63891489,1,1316095775,1,1962942013,1,1950253849,1,91553797,1,90638022,1,90743295,1,1952075069,1,1297759496,1,-1024916620,1,91005185,1,-523041359,1,91227691,1,-167422045,1,33903110,1,1053043572,1,-1960442546,1,92578565,1,38112038,1,-385526365,1,145752250,1,196084459,1,512437840,1,1760036179,1,-851528701,1,-1746315231,1,-4501501,1,1219763967,1,1478435277,1,-2097147899,1,-697167365,1,-763903173,1,90652288,1,51934464,1,1912959494,1,2009283525,1,1913007041,1,1946551045,1,990147077,1,-1962772797,1,-661971261,1,90381961,1,567101620,1,-1549569505,1,268764517,1,1732149248,1,192151557,1,90375683,1,89589291,1,-1560276947,1,-2069691051,1,-2029634811,1,53114629,1,990205702,1,1980073734,1,1732149295,1,628359173,1,371970187,1,369296739,1,372966743,1,360121735,1,721782689,1,-351971578,1,-2117432118,1,989878722,1,-338267198,1,-12129829,1,91231883,1,-754667182,1,212949218,1,-930354989,1,89333387,1,1107343390,1,-1960894003,1,-2130356450,1,1913651451,1,266386179,1,89595433,1,-754667181,1,-1949594653,1,503665438,1,92544654,1,-397290957,1,1068761723,1,2112365005,1,991910146,1,192240584,1,92544513,1,89603715,1,-1950321408,1,-1593486066,1,-1056766602,1,-1593483357,1,1570964856,1,2080818181,1,89760517,1,-1056718708,1,855989155,1,-2146006071,1,1394510597,1,12066309,1,522308930,1,-1175911565,1,1846971390,1,1757041157,1,1882373,1,1394510638,1,417865221,1,-851463166,1,35317793,1,-562931193,1,-1090517063,1,-1959918232,1,-2096802506,1,57999610,1,637586921,1,-661905979,1,-661731837,1,-972879989,1,-947714167,1,-471709180,1,-1175773434,1,788424681,1,89261814,1,772568066,1,89011909,1,-2069680467,1,-1153307899,1,1219821567,1,-620027443,1,-1993417100,1,-1274715362,1,773967176,1,84239779,1,-1557266416,1,-343734908,1,244002320,1,-1053096569,1,-936703881,1,41405243,1,-75376245,1,141758464,1,78758795,1,65790163,1,1358954424,1,1394510638,1,-1949748475,1,1107343569,1,-1959910963,1,1493521182,1,-2078372306,1,1372730117,1,-1274976536,1,-400437953,1,996016488,1,-385649210,1,-164692512,1,33903110,1,-1590812043,1,271385988,1,1537420800,1,113716741,1,16778585,1,914959950,1,-1557265059,1,-661781153,1,1223,1,1394510638,1,19261445,1,567099060,1,771827688,1,89261814,1,-385649662,1,-1959919271,1,-1106942698,1,-1590820863,1,-1073019551,1,-1907882636,1,773097944,1,1208313249,1,344578190,1,-850021294,1,784502305,1,92870281,1,922693210,1,-1893333663,1,771763206,1,90388107,1,-1993936381,1,771752502,1,89011909,1,1959089694,1,833798,1,6078289,1,-1527571318,1,-1414807501,1,505372249,1,175424854,1,-1979683649,1,-1415253188,1,-987799893,1,-2135358860,1,-201749760,1,784989860,1,93011514,1,-108395402,1,-13499669,1,-1960953298,1,-1979419131,1,839052249,1,13953243,1,-15436545,1,1962873460,1,309657364,1,168202022,1,110044672,1,-1070399476,1,110090382,1,110035080,1,508690570,1,-1994486226,1,8436229,1,567089844,1,-164734433,1,17125894,1,-986831244,1,772103478,1,89013956,1,274566182,1,478760526,1,242583846,1,1493615918,1,1569465861,1,1166616084,1,-1872434414,1,771782888,1,89732805,1,378416890,1,-1959918241,1,-83534554,1,-1030859234,1,-1014244722,1,12276683,1,911360,1,777241435,1,92872331,1,1526727400,1,777002691,1,184902049,1,1208448192,1,512350350,1,-1590820863,1,-1073019547,1,-1907882124,1,18778584,1,-1021356032,1,-16769560,1,-466479500,1,-107150199,1,-393213461,1,1962868750,1,-1661428458,1,-1895822104,1,-1460988348,1,918888214,1,1354959795,1,378154578,1,28837254,1,1512164659,1,50008,408,0],10,[1024,0],11,[1024,0],12,[1024,0],13,[1024,0],14,[1024,0],15,[1024,0],16,[1024,0],17,[1024,0],18,[1024,0],19,[1024,0],20,[1024,0],21,[1024,0],22,[54,0,1,16777216,1,1550,968,0],23,[1024,0],24,[1024,0],25,[1024,0],26,[1024,0],27,[1024,0],28,[1024,0],29,[1024,0],30,[1024,0],31,[1024,0],32,[1024,0],33,[1024,0],34,[1024,0],35,[1024,0],36,[1024,0],37,[1024,0],38,[1024,0],39,[1024,0],40,[1024,0],41,[1024,0],42,[1024,0],43,[1024,0],44,[1024,0],45,[1024,0],46,[1024,0],47,[1024,0],48,[1024,0],49,[1024,0],50,[1024,0],51,[1024,0],52,[1024,0],53,[1024,0],54,[1024,0],55,[1024,0],56,[1024,0],57,[1024,0],58,[1024,0],59,[1024,0],60,[727,0,1,538976256,2,538976288,1,0,1,538976256,2,538976288,2,0,1,1230441728,1,1464812622,1,852051,29,0,1,567086772,1,-1608610258,1,-18388,1,158664327,1,1962934077,1,-852577276,1,520039969,1,-315413346,1,158547587,1,235238911,1,278784287,1,-1899459332,1,795065552,1,-1909014386,1,-80961506,1,101107254,1,-969506773,1,-2144630522,1,158657803,1,117884726,1,-351469269,1,1899921426,1,192151561,1,-1172369890,1,1001663500,1,-2145443379,1,686142,1,1048578676,1,1962936951,1,100329475,1,158009030,1,1896269312,1,-930349047,1,103536782,1,280636578,1,199423744,1,-1207733038,1,-1113325569,1,-1608610260,1,1845949996,1,141885193,1,1912957928,1,168945667,1,567089588,1,749773366,1,158205686,1,-402098945,1,57804116,1,-166927640,1,-16091386,1,552141684,1,1996944902,1,57999113,1,-971916823,1,665094,1,172951238,1,1309066752,1,116850698,1,-63181,1,99156852,1,1933476609,1,494141449,1,-2013265986,1,-1089899722,1,-919393397,1,1010936492,1,1241085197,1,243801870,1,870919050,1,-1172369919,1,179579654,1,243933645,1,-315479290,1,-1107050109,1,-1983960314,1,-375065813,1,1444806934,1,752533335,1,-391499772,1,1017776926,1,1007252493,1,653554981,1,1040139718,1,237820606,1,239396895,1,118365958,1,1935669131,1,-1105261051,1,179055834,1,1007580352,1,1007318029,1,-1442614211,1,632353003,1,1008688810,1,-384928755,1,-605552484,1,1948597258,1,1963801604,1,10021123,1,-1569574868,1,-1636366020,1,-772764776,1,-1906899226,1,856240902,1,-1950250039,1,-1359853063,1,-1960378877,1,-2096668875,1,1718943742,1,1947024556,1,-118773151,1,908422074,1,749346559,1,109978484,1,1236535603,1,113713613,1,2355,1,158795462,1,1996932608,1,521011210,1,-400206662,1,468262876,1,-400617730,1,28843988,1,-383660788,1,887684622,1,-1077841388,1,1541942155,1,1966750730,1,173336600,1,-109769412,1,-150319640,1,-16174330,1,-370706945,1,1072233962,1,1965374474,1,-10819325,1,1963801770,1,-1930460687,1,650611499,1,-399799646,1,-353891802,1,1845949971,1,521076489,1,-1950742156,1,528738347,1,-402099480,1,57935160,1,-1107014935,1,-641782901,1,687978540,1,20718029,1,-12843148,1,-790034827,1,60549376,1,-1130232438,1,-1189040084,1,-230227959,1,705278126,1,752460481,1,855671231,1,-1431546167,1,-85979844,1,243847670,1,-396492672,1,-1281163151,1,6078252,1,-852950600,1,749838881,1,-1543095636,1,1007252524,1,-402295795,1,-260765181,1,5236814,1,-1087588957,1,28835948,1,-1574843095,1,1055403186,1,750232320,1,750061067,1,-2144552541,1,175377724,1,2877510,1,750323209,1,-643763733,1,-1139373524,1,1959922220,1,8907011,1,1266010366,1,748691086,1,158547587,1,-385649409,1,585760170,1,868455421,1,161605851,1,748947002,1,-880675979,1,-398032896,1,-398063213,1,884935943,1,375044,1,1974399632,1,112649,1,-670310189,1,-705964053,1,1346454102,1,649050711,1,-1107112471,1,11872777,1,-1976772161,1,-214768884,1,-251420762,1,-1365070690,1,-327832276,1,1048629387,1,1946168494,1,749838347,1,749864458,1,-847970500,1,-15371288,1,-57611822,1,-17004055,1,1959329482,1,-1358510345,1,378142764,1,378023100,1,-1578619687,1,-1086345202,1,-1431687966,1,760593066,1,567089844,1,200337414,1,-1089996917,1,96873551,1,-1375287808,1,297009197,1,-642113778,1,531949612,1,117311347,1,-420926034,1,169987329,1,1964160192,1,1581154627,1,1968128813,1,1614708751,1,141905197,1,749670016,1,29878532,1,761151105,1,242571333,1,761282176,1,-2146994875,1,19705614,1,1048689387,1,1094856030,1,1048621685],61,[1968450912,-1358004053,-1528102356,749668086,-955354111,1160601094,1611056728,-2031532755,-1358498303,527696428,761136839,113656130,-1168888480,263466325,-1073077811,250087028,29616392,-1174360343,1001663500,512631245,113650848,-1090516623,-695522225,186392206,1958742700,-1428475378,175423498,259275580,-369824852,-970587759,1312554821,1342135434,-1957538221,-2133708046,1966735740,-2146137595,236863722,-652834785,-1847044308,108224269,-399996742,1511988522,1552309086,-851725057,-10713055,-1608610250,1896283692,-375885303,-1912144148,-1272143354,119655753,-17469,567101620,567101620,196977446,-1960009053,734563544,1096387,-770972937,-4717708,750625791,334162115,748684942,1996932646,-970588151,685830,856094502,1979711241,-5314543,-1275066693,639749448,-402050141,637992875,154338958,760551050,15269683,-1950338291,-1359853112,749051983,-12240346,-1096154764,199765334,-18419,179953547,128709376,-1106839320,717171595,702731,1007110888,-484215795,-1910110708,638137094,1124548489,1021881411,-1442352121,175377724,229700587,1239016362,-1070410005,113259434,154510111,-2096547933,-16157890,113706613,-1046157,-386245143,1031800485,-1978764288,-1326907579,-1609599998,-341168987,760586249,-1331019772,1455335994,210298925,-1911352344,-1272143354,-1910387383,640458758,158009086,1896269350,1556021257,-1174959360,-1510801326,-1154723910,12061468,-1375275445,57999149,-14818327,237807150,631880223,-384060440,1048836594,1946159475,1933476114,-1007681783,-1910636112,-1574133730,-1021376143,751044343,91619327,-349840454,751018195,750913082,2028471156,-1003058428,-385928404,-1749416828,461170726,378156724,567083100,1962934077,-136185910,-1946514461,73853168,-383344198,-1169024162,1102318332,179970509,-851332085,-1547685087,113642103,1510017390,684374723,-239467541,-2430936,1877548814,-1608610049,2013724204,-853953526,-1572797407,-54850806,-1962440694,-1261882413,1914817852,-1260876843,-1172189890,1018432266,-965598771,1052039307,719856077,1845937682,915079177,1048775289,1979648371,1929824006,-336592887,1845937699,915079177,1017907833,-1955105412,-1207232490,567098624,-661943182,1200029616,1614360,858491839,222068937,1894318965,2084339967,-1431504780,947129660,1971076161,1170614005,910757375,730467976,2033617230,437685002,-919383797,-851705672,-1200465631,-5187445,-1575467130,377946137,378080024,233507610,-1978759114,914968107,-1226306951,-383840751,-35063071,1933476350,1978662921,1929824006,-369098999,110033022,-919393120,-1960080450,222080254,574359668,-973146251,-141822997,1965178028,1959656976,1191544844,1017954814,-17402590,1967013069,1044152370,648808053,172885758,1006954216,638153997,172951239,1760231433,172998487,1947024556,81127492,104480628,963914916,1022225322,-401181380,222037179,-953808523,151660038,1463675648,-351656257,-2132768045,594902268,1996946982,77195274,74714428,326466620,1827217158,652248830,989822336,844038517,-2006996288,-58702043,-33197043,-10163775,2000584742,343146506,638221247,175718025,-399799362,-1431567269,-92992196,730467976,2000584742,118358026,-1539407677,74723116,41168700,-1966908356,-402629610,-1746400844,-1224280571,376767021,567098292,-1813507982,-1086344963,196673629,850064128,915129280,-1974587992,-1058472124,991982847,-1977060110,-4855804,-347208844,24936690,-1978895314,977076036,-1595403916,-117279233,313027,567098292,-1966925965,-7477244,855078393,22841051,567098292,1552477298,-46864383,-1254717114,6078253,-852950344,-303512799,-1086345213,196673629,-1096092928,-85458815,6078457,-852947528,749969697,750323211,-970087261,388869126,28311976,95421044,-1574124638,113716418,11460,-1272097350,-400437990,1939668785,-1287749622,57933869,-1107161879,1438580828,-1177056467,-1527578612,567087028,1344824250,-401053208,1357383458,-1073063935,116787829,1954557293,-54990589,113643956,-956366763,268458758,1948676765,-1086345192,196673629,-1951730944,-1087523530,246939740,-1272853207,5618193,-397401651,-346553695,5618181,-1057087027,1877542517,10611196,751044351,-399680066,116785362,1963011492,761839340,1947206902,663796232,-350752280,15132675,187528609,-1082755904,-1202705210,1487609888,95539339,254077139,-924315465,-1439846386,522502794,-1341210904,-963990995,1342564560,1919171584,-396088318,512429739,-620024461,548942452,-338580704,-338564143,-338629680,1639368586,108137532,41185462,-1073083348,212861557,2095583415,-1438994418,1961411466,-1429829106,-1163214797,1961372870,-1039204841,-1607568084,-1029559101,5105708,765724406,-31886334,1965927438,-1408842221,-843442387,390653990,-854849352,3008545,485036724,-402018049,-185921984,-1188247873,-1527578616,-1180032848,-1527578621,1386922035,-399718726,-1017506017,501817520,-1178971634,521018921,521603560,915129178,1049308537,-1070387845,-393488245,-788520775,-1781018138,-1795141656,4909203,-503311213,751222766,-1843916615,-1828706328,-1795158552,855640552,-960845120,382593324,-388724144,-1973813247,-789917454,-789917462,190698,-494872950,-1325239281,583925248,818577613,-1031089878,-1072512086,314869287,-997840960,696498883,-1409253186,376750090,1006723816,-401640435,225705249,766721664,-1173982208,-1410783262,768506,-1409262146,41238332,-108791326,-1171557120,1474832251,8437270,80205451,179830904,-1390293748,-411769846,201400040,1953381408,-1669776356,-1644223768,330618229,-855614278,-1494724575,-608544768,1958805029,-1092041925,-2146864132,2995006,-1679097228,765998731,-402625345,28836067,-2145268439,536898878,1948877754,-1172851693,567083100,7071824,633649752,-982138626,-1090904599,-1192755071,1963801600,99543299,-1207822872,567098624,1915083706,-1898411037,858563102,244004562,1068772541,-930405939,-1152172573,1085538305,1918575053,1958820617,-1053079068,29043060,1140897792,-1024056883,-384010880,-1910630982,-2144559074,618814,-1173588961,1001663500,-1070456371,-1007040536,154470019,924222209,-1168965623,-1959392922,-1272000226,112959,-1956961843,-485920056,157720583,678763068,856067590,-850807799,113706785,2355,-1341551384,1933476109,1979707401,1929824006,-956301559,17395206,82357443,1325036544,1948269763,1950170126,1949056010,1950039046,-1022804990,-402619970,1048641503,1946157148,-1958328821,-3020578,175496763,108268860,-383340614,-790038238,-1090052355,-4718507,-1070355713,-1330992213,-1186485752,1068498955,1438296819,-853887955,5618209,567087540,666745424,-1609255448,1074004060,91570236,70037664,196012097,1958742616,668252681,-384525848,-809828989,345040935,-1188209218,-960561141,-203977940,168671396,-1430244437,-401309975,65600867,-44177152,-400057670,-960555926,-852446164,-466464735,-235533647,-523107151,280609802,-388986351,783351181,-997566294,179430450,78770678,-1005920046,-1978658631,-42735408,-1163214797,820587718,521018900,32106502,-2144991630,175439933,-1341993752,186574910,-1977206549,-1073068283,607924340,233309556,653257483,-1152973430,-1073075774,-1014817676,38135811,125044538,1962950528,114551793,-16314793,123666775,520603883,700234435,-1340877079,-1341199555,-1341461733,-1341723842,-1341985988,180808060,-1409253186,-1499208654,-1472820947,-1224292819,113639469,-1962922573,-1959942090,-1959942642,1362879446,-187963306,1529719459,56221227,-472478773,-391362263,74840599,766707454,91569980,766971520,1965702146,-1223786491,1290273325,973501694,1965859846,-1070444842,1011221638,-2013104883,-1472820988,-1508996819,-2134981843,-1073042432,65537396,-1022542848,-31594324,993789045,-1018235275,-402592280,712310752,-402603032,887619926,-2955263,376716092,1947024556,23455761,91503420,1962798824,23390213,-1070339349,82363307,-68818944,1031808707,-1173850880,521021555,101902825,99582751,753457035,-425727,-370641920,1994920667,17098752,15919190,-397904802,-370671397,-399054080,1014235364,-1403593933,259263804,-143311556,1015071742,-17795827,1592585159,108317694,-383202630,-397150506,-27590596,-401574705,-1595408190,222080000,-471333516,-1007228160,748691086,186392206,1015084595,-1947175936,309455062,-1392814360,-76169206,2092887275,-1107039448,508962945,1912612328,-386430192,-142147429,721479912,-216070450,-1017241692,-349668162,679591427,1912604136,-1870992589,3008764,748684942,470191654,1375679243,-391358634,642187375,1979663674,1609818626,208951646,5630033,1031808601,-102730496,-1962467645,1088968702,1459940096,1493188328,-108529365,222068931,-391378060,1072169015,1966947328,-2134981648,-1073042432,-1394080396,-1022542596,748684942,470191654,-385928437,-2144993269,-143327171,-348278589,-1178586622,-1359871744,1918975171,2004499462,-1021301758,988304209,-2082895104,-80018709,1364207730,-193009581,46367579,-338492239,-850742205,-1912169439,-399728634,-1660423053,108222553,-383383878,648738214,1479,113465691,1220578384,-1591295858,78708739,-930357037,-1262287016,69324057,139389249,-402650648,-960234965,23558,6035082,1074053770,108347452,749733378,-1102003970,1202990424,91431373,-2132205810,760594418,-1269246069,-1516197062,216640044,109970961,-1591333728,-1557788372,-2144993258,619070,-987362699,-1207194858,567092513,109983239,1236544674,12067277,-400437940,45677850,1914817853,-1193768176,567100416,1971372790,-851528691,682080801,-351225368,-164458455,-1207711104,567100417,244051,1052039987,-498916915,1169447929,1169433037,1169433037,1051992525,-1909055027,506241054,-1560274783,-692582033,-1144303613,12058625,-165556924,880050370,1947255542,891926575,-1064558131,1996525629,856405027,-1273967141,-1978610417,-1228210476,-1950338279,-1274562616,856739078,-1275021358,-1022309118,-1406549826,-315438966,-1968437580,-501101104,-1281244167,-1190786260,653048364,-2118240907,-84547584,125046076,977120582,-385649395,1273560774,-1224280324,108331565,567098292,-2098636941,1304825,968099445,1232282061,-383256902,-2084899806,-1090983127,-1192755071,1947024634,749969905,750323211,1965485242,-66262814,766969590,-555171070,-1274644993,1931595066,672381460,-1158418967,-1645730099,201439247,-1863835187,213894136,79858220,1967144000,-1341783546,-1430192596,749020810,111884976,-1258845409,1914817863,-1021374974,-1409283911,24387644,-1392975190,309600316,783343754,-1429961046,1017905841,-1442614240,-1070401310,113689514,-2130704009,619326,-955877889,-16157946,-311105025,167657088,-1169197825,236858709,-853887969,-4579551,-2146257911,654910,297011060,167642822,169987328,515864000,-1105261049,2042572117,1049175561,78383612,1950366784,1048585739,1946159480,-1422216189,654276072,234833350,118365958,167517835,1946173312,-1393325175,-76214980,-1581328757,730578697,1017956659,-1978108635,973732646,1175483684,-1393325226,74714428,-135550399,-1427903650,1963801665,-2009708067,-1993635314,-167117802,-16159226,326377230,-12204506,730577444,638488040,234833350,-370213399,-1910575363,-1171480546,1048651993,-16774797,113706613,-63117,-224073441,855671230,-1610182967,158973740,-1574518734,-2044327560,168392454,650868160,167526025,-33110490,485031689,624733689,-2010747531,-401999066,222099727,1034757236,91508297,1970170173,-117577642,1965571244,-118101938,125118780,748691086,-1392592919,1114901820,510929212,1948925098,1967078404,113649158,-402585090,-478807849,-12204506,-121247731,230218219,2105550336,41225727,-391397325,1034811571,91508548],62,[1970234429,-123344827,1047792956,-1408654913,1963801770,117319418,-2094659209,-16157890,-953809035,619270,1048585983,1963002366,-1088485865,2042497535,24936457,-33262278,-1207339002,567093504,-893757245,-239277784,749668038,8502784,1022907112,-1947503603,703447022,-175439691,-481882742,1963125555,-1977177072,-1002813659,-864025228,-490456544,-117202962,1195842955,-1394903650,-1166799556,1979196136,-132781871,385278975,-1192547153,-1396100266,-1586229956,1962412776,-202686205,125058364,-1854665412,-1393169492,-1988805316,1022880488,1602384909,343189235,234847360,1017953396,-390630387,-160040997,418119600,-137238356,-1070404235,1438584555,687978541,263463373,567138187,749668086,-167611137,1958742736,-352524029,-1946705176,-2115403314,-2146555904,-2146530816,-1978759168,730578731,229680371,-316413526,-617477449,1947024556,-142481244,808193140,-403258490,-1014578430,-1910576405,-1976786914,520711206,-482688974,-922835341,512664299,866200736,-22263,-1064422540,-919349106,-108281461,-1951468983,-1186576649,-1510801399,1962884483,-952792296,922746629,748691086,1963801772,3965179,-1993997452,512672565,116862112,-63181,-768347276,154474121,154605193,-1090486552,196673629,-232738816,1090614702,-150214269,243873497,-1813500587,1949973750,-158537695,125110844,1022789096,-149720006,-16174330,-387287553,521011261,-383207238,1572859934,244004352,-397333163,207222370,87696928,132842101,975577132,1204843781,1273555170,1998601462,1947024582,-163518457,-109769412,787888616,785456779,567099060,512630467,-768407245,-851640136,521499169,785490742,378263691,243992885,12060983,-1021194942,126540427,-115392468,9496771,512627314,108342432,158205638,113689345,-1023407762,1006665888,-1173786110,1323827330,-197269237,748691086,158211722,1589255950,-383194327,1474883450,855750656,91556978,567083442,-841862461,243974945,-922091392,-1070407307,-628481587,-399947334,1153043222,1977289257,691976707,-401929751,28835874,1963618862,-1021195005,567134462,-2146530621,1976109568,-850086738,-1160213983,-873780909,-1409262146,1866211340,229448565,1849434144,-58718603,-1022462688,1969645117,540847112,-1057094795,675986115,503759865,-1064384372,113760398,852097,730400454,-1979267200,-401800917,-1712848890,-888725760,-402619970,222098799,767244660,17492015,110117867,-1090056617,716451014,-1952964147,65458672,13009392,-1176925401,-1527578621,-1951784784,-1295348797,-2030897564,766743236,-1174331671,1340614436,-3676150,-1155058246,-1326960851,1916171264,-1019565003,-952499084,-706204555,-1188597248,1015023468,-1341426675,-1947928988,12773576,-997583758,-939327308,1963801772,-852773879,1975519777,364561153,168093735,-2118207765,-187045888,309595452,-398837061,518717556,-852708208,-382029023,1471807656,165734439,872410856,661174985,-398837061,1718878271,-896846990,1017958963,975336461,-1289325117,6219822,-192274574,1947024556,1975728656,5171220,-729149582,1963801772,-852642808,1958742561,659077681,-351693336,159574198,-1984296268,-400437973,-1950420365,222068779,501748852,-1978699264,-1019564812,-75493772,1308915002,985858226,-92931641,-1979710488,283689940,-1964019200,649440,181732466,17621130,738495171,1022980656,-193792758,106414918,-960559346,-1211790804,2746384,-1968520310,2222273,-1968520310,1697990,1966799744,-1439780861,216580746,-1430244608,-399718726,1594296591,-2046110525,808455620,41234492,12044074,1351795627,1476970216,1377747858,777081680,748691086,175586944,-402230016,719847433,1482381568,-2134696102,665150,649729908,1023457290,-608558643,-1962184155,-2030063400,413276231,521061120,-2131957271,675646,1048589940,1946159694,172997143,-851639880,856519201,-1949748270,1107474648,283845069,856313786,-851659575,639744545,-661927822,1200029616,1679896,272531651,225771310,784545419,772880009,772802246,-1947388929,-1288781002,779075371,-167209240,594837703,1963050998,32303344,-1074614296,12070105,-1155412695,-625070695,356420396,109766702,-402486295,-1070398536,-1557349470,-1130222401,288787244,-1019836114,46196782,-1947663500,38856961,-1180450765,749904428,-1573991262,-878563640,751084334,-1573992030,279063729,779068206,-1557284701,-1734136296,760587053,1210914211,-1574125150,-1281217009,8502829,-315413581,-399609921,1198655495,1954596854,-871971323,-940179154,151680001,153925422,-349390546,-2134378787,117310581,-1588187982,1874734803,-1077531858,-956093000,-2010270301,1093514254,1049142515,113716663,11447,-1599083682,-1314771252,-790573012,784704224,-1607892038,-1073075022,37487732,-1813445770,766754283,544538940,70037664,-969231295,-1090387642,-945082952,2930438,71747072,4638210,110159872,33652352,1048581493,1966747065,72253454,767213314,18118,-1962510872,1031799422,-1173064448,2105550818,-1435157762,33572550,100945536,-1173988888,-1180621076,-2147467988,279549044,-1273728000,505531732,748691086,1973675058,28843785,857853230,8503021,1874799539,118614062,1963050998,-1221719563,147191596,-2146667264,2928958,113640820,1443114699,-1104227423,-970248593,53352639,773170119,773066376,-2002455743,1580078910,552125835,-406853628,-402384152,-1679228835,34793472,751056523,1978203955,646298351,-385454616,1048634526,1962945713,773372507,-402234648,-608506046,61860133,785621334,724463550,773373894,363054851,336496686,-1527561938,773275272,-389706914,1726481351,63039719,749813376,856388864,750494400,-1574125661,914959548,213855939,773045548,-1962631448,-1020390090,785137280,-352160512,-1947389056,-1288781002,779075371,-167363864,-344686393,1963050998,-7280400,-1207935809,567093504,-2144462687,41171708,1076641968,-1275044702,8972305,-264836964,-385649507,-1070399660,750847622,192200714,-1090515783,1438526872,849670957,784835264,773144203,-399681858,1048639006,1962945713,386332167,158597678,-399632198,1894253963,5368046,749813376,-401967872,91357452,750454470,-1321304064,225706028,-167655704,-13758458,-320273548,846076,113641333,-352310084,-12260954,116789940,1963077143,-1008465405,-1172655024,567094613,6077016,-1073077811,-1358510397,414842924,1023457326,-260955699,512350347,12070508,-1994273449,-1993421546,-1204891890,567100416,-2004819328,1949199894,-935428083,108265518,-383182918,512426573,244002412,378219709,-903140161,1088949877,-901873663,1702166574,750587531,-1575055842,-851463124,1433542433,1373882507,778976896,-2146994944,3066686,-779412620,750730891,-1912202576,-231955962,91555758,749668094,-1949226175,-1089600566,-1089566420,-1123140820,-401837524,1048576235,1962946250,-2138051824,3042878,1048577908,1946168495,1813941121,-851528658,1048625953,1962945724,750231800,1946284776,-1088517322,-1122092244,-402033364,41156770,-617364487,-1575055842,436717356,117382912,113650879,-1610600761,-466473271,750716419,20776306,-396135424,-730529674,784940672,-1957202944,-1959916514,-1959866610,-2144416490,3065150,750006644,-506453555,-506338864,-506338863,-838144304,-852839343,-1125547743,-773224953,-790179615,-790179610,-2132356890,-703987499,-1202063990,567105281,567099060,751044351,750520062,512476152,-420991476,767081215,567099828,751044295,-387252224,1345106336,1476396776,749798970,-905525565,1048576046,1946168507,8448259,-402572056,376767238,778976896,-2146470656,2928958,1948661690,-955857317,28836142,-952205251,74776622,-919389004,-852641606,639744545,212024946,-1157183954,-661978836,-851181384,236357665,-2134706642,-1214238092,1963729964,785096713,784860682,544872564,477366440,843317688,550142198,772675208,216736205,113669611,-2147209525,70173966,784809600,-400722688,410321538,778976896,-1173261056,-135780773,-1090074878,-33554388,-1020343802,772546187,243779891,-203215681,784926462,784809600,861238528,512630482,1085549730,-1172364851,527574508,-747321301,772671222,-166431616,539889158,1048578677,1962946245,1014253887,-399924550,117310114,1048587452,1946168507,203328276,-851528658,767080993,567099828,750454470,-66983680,-779627981,-851312200,-1354858463,74711084,567099572,2047616195,136597520,1479461026,-878574556,-989460434,785096750,-2134654966,-13782210,213847157,766754092,-402599192,-1070404432,772736646,58048522,-1962901527,-1087523530,12070165,-1591620311,-58708552,-1342016454,-888239552,-1572852690,-1214239467,388401709,33695022,326418442,259376186,785137280,-33000448,841879558,872868800,-792452606,-872019224,749838894,-523181872,-2144418398,3065918,-878566283,1976109614,1958742557,-1089565927,-1340873940,-13433318,748816014,1963437810,1049186053,1455107263,-1321304019,57933868,-1104307781,1049308438,146353589,1060940800,126485109,24387644,-236829782,1015022513,-1340967904,1017948718,-1979550401,1948269575,-498882047,-1430244623,71759555,-1960676094,96633813,-851640136,-1961463263,1140898008,1051992525,-1024056883,-163482240,1946420294,89557819,1950023296,-2143243774,-1729609494,-2083157007,2122974658,115834884,1963392896,41323286,989756544,1187382901,99287552,16795334,-2141263026,91554559,18118,-851725117,-400133599,-91495090,-930365389,1336865353,-970152544,973209670,91553605,4638378,72253441,3991558,4638403,75401728,1946470390,4638451,41323266,1946172544,775716896,2088770420,91503358,16795334,-2032455090,-851725284,1914471969,-453711868,-366220861,-2147320183,-1207172794,146353727,-2035617024,-997807420,-1426914383,-1012219854,415125585,767082286,749735562,2088823178,91568641,-1975440211,25002184,-1979157190,742868741,988318273,-400525847,460587040,-1946205045,575733581,259348673,74788412,132899850,1966012800,1491929602,1973863257,-8617810,-341281792,1364336373,521031763,-2010331461,-1143764201,-880082943,567099572,1515805528,1397801759,45819056,1343351552,149622192,-349917104,-1070379005,113491,-91531439,117440441,-1359870178,1239021319,-851397559,990474785,1594193345,-1017619623,109977358,-323343200,1048585765,1946159735,113649161,-1174402441,-202823439,-1547684893,-694014253,785883694,1469905034,-391329485,326494855,-160161732,-227276484,785843846,-361447414,-402593047,-1019548193,-813693579,1021045632,-385649395,104464592,58010788,-2147429911,326449724,-1409220888,-1996424472,-970009794,3069190,-1996454423,-970009794,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044,125153010,-754974280,1508379616,11536223,-123904086,-29250877,-1020340986,1364678150,12079952,650153712,-115072,-133663491,1599690843,-1195178146,-1064386560,-2128150733,1957319997,8389898,1928331325,652274669,839015818,-773598721,2143519715,-8330367,637535935,843517322,1976110061,-339541244,1190300631,125085427,-947652349,-2132481277,91504444,1965046912,109850351,-1993462351,-114446530,-4482325,-850873089,-850873311,-1202695391,773727522,748691086,-855470406],63,[-1898279903,-1269162046,-1910387371,8436442,567089844,186425638,1526738083,-754722164,136841,-1907697012,378094298,-628228095,268499841,-617414030,-472709967,-762389876,-1070341237,785446736,766588671,-1355350226,-876442067,1631717901,543712116,1701603686,1936289056,1735289203,220465677,1936607498,544502373,1802725732,1953068832,1633820776,543712116,1701603686,1851853325,1919950948,544437093,544829025,544826731,1852139639,1634038304,168655204,1684095524,1836016416,1684955501,544370464,1701603686,1835101728,604638565,1819309380,1952539497,1768300645,1847616876,543518049,1176531567,543517801,544501614,1853189990,604638564,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1968120842,1718558836,1986946336,1852797545,1953391981,1634759456,168650083,1818838564,1919098981,1769234789,1696624239,1919906418,1176766989,543517801,1852727651,1646294127,1868767333,1684367728,1953394464,1953046639,1718379891,1126435341,1702129263,1864397934,1701060710,1852404851,1869182049,1869357166,1646294131,1919903333,1868767333,168655216,1766203428,1932027244,1868767273,1684367728,539232781,1701603654,539587368,2036473892,544433524,1701147238,1227098637,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1920226084,543517545,1701519457,1752637561,1914728037,2036621669,773860896,606088736,1635151433,543451500,1634886000,1702126957,604638578,1299084627,1968467567,1684363109,1182099540,1632856434,1225395572,1818326638,1679844457,610628705,1920103747,544501349,1702125924,544434464,1158286628,1919251566,2003136032,1952539680,606091877,1850280461,1768710518,1769218148,1126458733,1701999221,1948284014,543518057,606106473,1850018317,544367988,544695662,1701669236,1092886586,2032166258,1931507055,543519349,1311725864,606093097,1229208608,538984018,1112089632,1699749965,1852797810,1126198369,1970302319,544367988,542330692,1936876886,544108393,1867915300,1701672300,544106784,1986622052,539238501,606106473,1935763488,544173600,1700946284,1850287212,1768710518,1768169572,1952671090,226062959,1851073546,1701601889,544175136,1634038371,1679844724,1667592809,2037542772,1227098637,1818326638,1881171049,745043041,1953459744,1919509536,1869898597,221018482,544370442,1701996900,1919906915,1869488249,1835343988,226063472,1967989770,1931506803,1768121712,1327528294,1919885390,1179012896,539232781,1701996868,1919906915,1718558841,1310990368,1632641135,606103668,1213481296,1330794557,1028935757,1635151433,543451500,1986622052,1852383333,1634038560,543712114,1752457584,1227098637,1818326638,1679844457,1667855973,604638565,1700946252,1869488236,1868963956,224685685,2035491850,2019652718,1920099616,168653423,1329990948,1633886290,1953459822,543515168,1953719662,168649829,1953384740,1701671525,1952541028,1768300645,1696621932,1919906418,1920295968,543649385,1701865840,1126435341,1869508193,1868832884,1852400160,544830049,1684104562,1919295603,1629515119,1986356256,224748393,1718559754,604638566,168652399,1163018788,1763724097,1445208179,1179210309,1936269401,1128604704,1763725128,1227104371,1818326638,1881171049,543716449,1713402479,543517801,1701667182,1227098637,1818326638,1847616617,1700949365,1718558834,1918988320,1952804193,225669733,1917133834,544370546,1953067639,543649385,1679847284,1667855973,604638565,532488,844831492,407585866,1343807828,-2092035693,241194513,1276053319,255987467,196960015,1159322148,-112718077,251613454,1330512640,169187924,1330795077,1447382098,371739717,1230521605,367678547,1229194240,167379282,1313165831,21318977,1375997106,-1308537275,1380255244,21320513,1141115965,1023495237,1498678540,-285129392,1163002892,17039437,1347371781,449577305,1430343686,520111443,1094976787,939541844,1230243096,-838843059,1163265048,240582738,1280267780,51234817,-1509866429,1212352018,22169924,1292047014,316211524,1145785606,-654224823,1146225426,101912065,1229213010,319684946,1163018758,-1845474495,1163265815,1497778514,68667136,5522771,1342640143,1347243858,268042324,1413566469,262144072,1230521605,298385492,1414808325,301400409,1212368133,391708751,1414481669,378929231,1229476614,1442862150,1179190038,68505600,5394246,1124340840,1392530252,58720274,223234391,1329876553,873303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1459847168,1225608777,1464812622,3411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1465662019,1329876553,21335,0,0,0,0,0,0,0,0,0,0,0,0,0,1124073472,1313429306,1297040174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76611584,101385538,42163247,73663810,67110210,2,0,0,16776960,0,809369600,976236602,959329330,808976435,0,1230438400,538976334,1061101600,63,-620754944,33612610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1230439168,538976334,1329799200,8269,0,0,191835457,318963780,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-419430400,16777484,34400000,33554688,-1993754368,-416695253,168617740,2690310,1630276608,2906413,-415453184,-1341729012,15877692,0,0,0,12066574,-2011050701,856000022,855750866,1370759629,512303565,-1014102647,-1289829322,109848075,-1993998288,-1275056610,-1977496295,-854674224,93037089,-759692111,250139392,-1547500709,-270006905,-1962636540,1418396252,272928262,1007574158,-1341688317,79227137,37551083,-1993411212,772099614,89130636,89301550,1728497198,12058629,1914817853,1403203295,-1193768187,567100416,1954595574,-352145404,113716939,1381,1376187950,1618280965,1312212270,184847109,772830656,92872334,771763361,184902051,-62556992,-13385586,847249337,1957622464,-385175547,1974337694,-544516108,-1324366973,116118276,567101620,57891103,-1912569879,1638084288,-1047768827,992922371,1493534494,-164402057,-1527513293,515448590,1394510592,90749445,-857203194,-851463165,63891489,1316095775,1962942013,1950253849,91553797,90638022,90743295,1952075069,1297759496,-1024916620,91005185,-523041359,91227691,-167422045,33903110,1053043572,-1960442546,92578565,38112038,-385526365,145752250,196084459,512437840,1760036179,-851528701,-1746315231,-4501501,1219763967,1478435277,-2097147899,-697167365,-763903173,90652288,51934464,1912959494,2009283525,1913007041,1946551045,990147077,-1962772797,-661971261,90381961,567101620,-1549569505,268764517,1732149248,192151557,90375683,89589291,-1560276947,-2069691051,-2029634811,53114629,990205702,1980073734,1732149295,628359173,371970187,369296739,372966743,360121735,721782689,-351971578,-2117432118,989878722,-338267198,-12129829,91231883,-754667182,212949218,-930354989,89333387,1107343390,-1960894003,-2130356450,1913651451,266386179,89595433,-754667181,-1949594653,503665438,92544654,-397290957,1068761723,2112365005,991910146,192240584,92544513,89603715,-1950321408,-1593486066,-1056766602,-1593483357,1570964856,2080818181,89760517,-1056718708,855989155,-2146006071,1394510597,12066309,522308930,-1175911565,1846971390,1757041157,1882373,1394510638,417865221,-851463166,35317793,-562931193,-1090517063,-1959918232,-2096802506,57999610,637586921,-661905979,-661731837,-972879989,-947714167,-471709180,-1175773434,788424681,89261814,772568066,89011909,-2069680467,-1153307899,1219821567,-620027443,-1993417100,-1274715362,773967176,84239779,-1557266416,-343734908,244002320,-1053096569,-936703881,41405243,-75376245,141758464,78758795,65790163,1358954424,1394510638,-1949748475,1107343569,-1959910963,1493521182,-2078372306,1372730117,-1274976536,-400437953,996016488,-385649210,-164692512,33903110,-1590812043,271385988,1537420800,113716741,16778585,914959950,-1557265059,-661781153,1223,1394510638,19261445,567099060,771827688,89261814,-385649662,-1959919271,-1106942698,-1590820863,-1073019551,-1907882636,773097944,1208313249,344578190,-850021294,784502305,92870281,922693210,-1893333663,771763206,90388107,-1993936381,771752502,89011909,1959089694,833798,6078289,-1527571318,-1414807501,505372249,175424854,-1979683649,-1415253188,-987799893,-2135358860,-201749760,784989860,93011514,-108395402,-13499669,-1960953298,-1979419131,839052249,13953243,-15436545,1962873460,309657364,168202022,110044672,-1070399476,110090382,110035080,508690570,-1994486226,8436229,567089844,-164734433,17125894,-986831244,772103478,89013956,274566182,478760526,242583846,1493615918,1569465861,1166616084,-1872434414,771782888,89732805,378416890,-1959918241,-83534554,-1030859234,-1014244722,12276683,911360,777241435,92872331,1526727400,777002691,184902049,1208448192,512350350,-1590820863,-1073019547,-1907882124,18778584,-1021356032,-16769560,-466479500,-107150199,-393213461,1962868750,-1661428458,-1895822104,-1460988348,918888214,1354959795,378154578,28837254,1512164659,186434392,83887426,1392853760,234946632,251657734,-234484986,396857,114409,53,1936607488,544502373,609439556,1702063689,1092646002,-1275066850,50728511,0],184,[1024,0],185,[1024,0],186,[1024,0],187,[1024,0],200,[1,-351229355,1,808465694,1,959787056,1,692267040,1,1498435395,1,1212631378,1,1226842196,1,824200514,1,724711481,1,-86470976,1,-1560261471,1,1319174400,1,16950016,1,4982471,1,244056662,1,1622671438,1,3449607,1,3542668,1,6555335,1,244056454,1,113705062,1,65470724,1,17174156,1,4241659,1,113694862,1,-973078412,1,29958,1,4392646,1,1996932608,1,632881152,1,15919104,1,-102627981,1,-1191133207,1,-2135293951,1,302036992,1,57873357,1,-1207914519,1,332207104,1,-1511455885,1,1812383488,1,-1593835520,1,876413042,1,-955878126,1,-1711248378,1,606200833,1,-400431362,1,124911796,1,-854589256,1,-1593085165,1,-1103298452,1,-336825855,1,28938357,1,8436224,1,-854523720,1,-1201180141,1,332204288,1,12083314,1,734039752,1,251705563,1,1383207885,1,7669502,1,-1342041158,1,565898752,1,254077955,1,108269372,1,7079623,1,330957220,1,-285233150,1,-1174404679,1,-1070923647,1,1081217997,1,-854523720,1,-1593085165,1,-1103298452,1,-336891391,1,12095535,1,1913900297,1,1963392551,1,-2114289408,1,1109226240,1,264099051,1,-1950340352,1,440816,1,771798928,1,23626890,1,281874100,1,-101391802,1,203547898,1,-81664511,1,-889149976,1,825243441,1,1381042701,1,16824824,1,-301594648,1,-335150104,1,57934372,1,1526330082,1,-1070873767,1,-939861874,1,-419363834,1,101616643,1,2013710081,1,-1946025728,1,-83854834,1,1358955449,1,-1070869973,1,259134413,1,721551800,1,-1144877358,1,28933120,1,1494469888,1,-58717581,1,-502631296,1,-1878594594,1,8126698,1,734014208,1,-1189884462,1,-1169096701,1,-1070923648,1,309466061,1,721551800,1,-1144811813,1,-2135262208,1,112896,1,1918440397,1,2113839368,1,1957319997,1,-841489717,1,620941080,1,-14022654,1,68810320,1,4241438,1,646633614,1,-967835529,1,30470,1,704997864,1,113700544,1,-402390921,1,-1070987938,1,1996932846,1,1407715328,1,-289396219,1,7800518,1,88664076,1,-1326530518,1,-99949049,1,537666020,1,1492853222,1,7808648,1,-92224737,1,-855280768,1,182848,1,1977879291,1,708889865,1,-2114289436,1,-58658953,1,-385649400,1,1364394266,1,1443241554,1,7006295,1,-7804848,1,-1912586056,1,646600920,1,-58720140,1,1583346945,1,1499078407,1,182875,1,55378744,1,56623958,1,57803626,1,58721145,1,69665584,1,81593551,1,54002930,1,84346105,1,85722389,1,86639907,1,113640753,1,1358954612,1,-897521014,1,-792003071,1,1997965538,1,-2133489152,1,95486434,1,-703929646,1,4396680,1,-1202666663,1,-661782464,1,33325144,1,1441465205,1,-2132115312,1,1929968256,1,-4003793,1,113691134,1,-2013265854,1,-2013248498,1,-1577040594,1,1990197318,1,4694528,1,851741264,1,-1948200476,1,2768368,1,772109144,1,43820287,1,7603910,1,-1023365119,1,-301710360,1,-335265816,1,108266020,1,7603910,1,-622214395,1,7643136,1,7603910,1,1202766592,1,4327110,1,31844616,1,113658800,1,-385220542,1,113639899,1,-385548222,1,113639876,1,-351928254,1,1107740172,1,99288832,1,4327110,1,4497412,1,1151516708,1,27715840,1,726861342,1,-992440640,1,-1207892962,1,-661782464,1,-2139035008,1,796068090,1,-385934360,1,661783519,1,-1960388605,1,142599,1,2484362,1,-773271293,1,-1978594072,1,2005542600,1,-1966146046,1,721450262,1,520575936,1,-973077814,1,117470214,1,-1070987340,1,-919875029,1,854256633,1,20054529,1,720896,1,2667532,1,1996488704,1,24578049,1,84606976,1,2667532,1,838860800,1,8390145,1,84607232,1,2667532,1,838860800,1,20055041,1,84606976,1,2667532,1,-973078528,1,201343494,1,4392646,1,1107968,1,113642866,1,-972292030,1,536888070,1,-1023409688,1,434683946,1,-1023315199,1,-1900008674,1,69125336,1,887627521,1,56062467,1,114648,1,1912627176,1,48973,1,1912625128,1,180037,1,1912623080,1,311101,1,1912621032,1,245557,1,1912618984,1,442157,1,1912616936,1,376613,1,1912614888,1,507677,1,1912612840,1,573205,1,-1576957402,1,-919928714,1,-335359000,1,158663336,1,113702626,1,-116981644,1,45476035,1,1963074796,1,-974601231,1,-402165247,1,-1977220441,1,-389812735,1,1802633241,1,4327110,1,-347623195,1,780392,1,113663346,1,-1327103934,1,-1604654261,1,-2143551418,1,113689589,1,-351600574,1,1107740221,1,113643008,1,-1342111674,1,-968955065,1,251675142,1,4589254,1,-347361279,1,1107740208,1,451608576,1,4327110,1,-971773183,1,-536854010,1,113642731,1,-337444798,1,1107740165,1,45147136,1,1912612840,1,-971576543,1,151024646,1,22538435,1,61928818,1,1912607720,1,-435965939,1,606200842,1,-400431393,1,1005060522,1,1119798016,1,35383296,1,35449070,1,-389469202,1,619446796,1,1947024399,1,-956833271,1,-2147453946,1,-1174617095,1,-387448826,1,-487674879,1,32434425,1,1946265836,1,1946600966,1,-1007083520,1,167802016,1,-1023314496,1,-1912586056,1,-1950340160,1,1107740408,1,-1070988544,1,1929358312,1,309539,1,1912654824,1,28174368,1,1166550764,1,-1310177470,1,-387063295,1,225575096,1,-335439128,1,259261096,1,7603910,1,449051135,1,1778788102,1,637957894,1,4333194,1,254067594,1,707847040,1,-754732545,1,-1476448533,1,536872419,1,8396864,1,272629792,1,67109392,1,285212736,1,537002251,1,45813792,1,1929985030,1,-1562956189,1,-1144848268,1,-930413045,1,1416825404,1,1956828974,1,148996096,1,1963522432,1,1107740202,1,-1070985984,1,1929321448,1,4122654,1,552081778,1,-930419711,1,1912615912,1,18212878,1,1946265836,1,1946600966,1,-1963384832,1,364626881,1,1929526278,1,-1562956269,1,-1144848268,1,54265367,1,-684849549,1,-1023380318,1,7603910,1,726778811,1,15657161,1,1963043052,1,-956702200,1,-2147453946,1,1354979833,1,1006651040,1,41048193,1,-95304711,1,1481641190,1,-1064563738,1,-1059912527,1,-266016630,1,41140995,1,-430914050,1,-423327226,1,616925702,1,-1602034161,1,-523239354,1,-527775490,1,-1605304400,1,-449052606,1,-432273548,1,-346553484,1,79190033,1,-14003454,1,4595338,1,1524889426,1,-430946213,1,-423327225,1,1482291975,1,-1017528061,1,105993211,1,-1070916010,1,918870158,1,706674948,1,1552557823,1,1109821961,1,83656704,1,-1977219467,1,166398556,1,1977875584,1,1552557572,1,-389469429,1,619446340,1,1948269600,1,1274339850,1,113701237,1,-394264460,1,619446307,1,1946552322,1,3205120,1,1592705074,1,-1017423609,1,-434065328,1,-435703776,1,203547658,1,1478616608,1,52476623,1,-1595659696,1,-805109641,1,-253181096,1,-389856513,1,-1019019272,1,1124071656,1,-792381,1,-370650900,1,35974399,1,-1978239656,1,-2147466458,1,74784996,1,-388962096,1,78709540,1,-466951982,1,818149827,1,909193016,1,-13486033,529,-1],201,[1023,-1,1,-905969665],246,[-394358807,-389321817,1573610754,1949288424,-382301427,776243716,41221692,12844348,0,-1808911616,1534289933,1712675089,-1894367689,-1240404719,202569744,890293806,756113169,1343440942,455030063,1477574189,-1860440034,-1104247518,1393016327,773014302,-1979711457,-1676583138,-1557226194,-550571218,1477617974,-1205716718,-81602542,17825295,-653261808,809305108,6135869,0,1061005568,69508644,1816351296,-834572991,-413978815,324871762,692466502,-782758568,-1824010937,391129681,-1524012972,472494377,-1770094491,-2022641283,209325688,-194870157,-847598215,1026264186,-400852450,-383379672,187234345,1193443369,304483625,-1390709466,-2106896021,-94004117,307664981,-1740324777,927247428,1459701761,-1274967295,-452863743,-117312511,369235201,1342315010,1828872706,-1459452414,-553473534,973284098,1292059395,1761830147,1426287107,1319817044,-750588220,248402950,1426259,-984202925,1095716034,1162200004,1325450704,-1076736180,-984395956,-733065285,1095060633,1381208786,-607237812,483675721,499600979,516702788,1208800079,1092002898,1286851660,1157677267,-984332980,-1051442775,-2033366652,1414743621,1178971346,-1378595255,1314080325,1178971847,-1345568188,9946693,-1580903604,1384236110,-1513794751,-1496037052,-766553518,-724807001,1490408018,-967898160,-237612765,-2100146432,-984428082,534268175,-816558336,1411403657,1397721551,9290325,446978117,1431326208,-1949923884,-766225586,97799896,1292947534,1263465168,-559654587,-649789440,1129251017,-893037503,1313428048,1229757908,1352586323,1159451471,1313442004,1095741637,1397341380,-951086124,616779530,1158860357,27546694,2475599,-766553009,1196574145,-1001407035,-1539028493,1480916995,-683310124,-741060716,-834318336,-1663806022,-271411762,430199875,1330205776,-968443698,1230110941,1334957134,1335412043,1162154451,1163073483,1163052756,-942389933,-733066929,550389212,-833290240,1431586186,1166986834,1166525505,1380930643,-851079995,1431520655,1235797325,-1537980345,147082754,-850047419,1145979307,1514753359,1124121029,-834321070,-800107320,-801024112,-984202844,-1471983426,-800762670,80627663,1225249361,1381239246,1381241764,-1538830775,1128354006,1327014981,-993767851,-884782764,1230132257,1207968455,1389219397,1386401359,-1547286961,-827833791,-834548529,1230176269,1406650190,1090572498,1379996876,-623750064,1413761280,1229037768,1229493972,1169278284,1387447374,-1211804599,-254652672,-1426063360,-1427460631,-554913813,-1477124883,-1108951335,15252711,2088532345,1011241087,2071603250,27522,1681615789,1722313553,1817404163,1702126368,1662608146,1663591233,1667916849,1669948239,1706301655,1480936960,1769414740,1970235508,1329995892,2035482706,2019652718,1920099616,1375761007,1381323845,1769414734,1970235508,1330061428,4347219,544503119,1142974063,4281409,1701604425,543973735,1668183398,1852795252,1818321696,1984888940,1818653285,1325430639,1864397941,1701650534,2037542765,1684952320,1852401253,1814062181,543518313,1651340654,1392538213,1668506229,1953524082,1953853216,543584032,1735287154,1967390821,1667853424,543519841,1768318276,1769236846,1140878959,1936291433,544108393,2048948578,7303781,1701604425,543973735,1701996900,1409315939,543518841,1836280173,1751348321,1953844992,543584032,1769108595,1931503470,1701011824,1920226048,543649385,544173940,1735290732,1920226048,543649385,1836216166,543255669,544173940,1886220131,7890284,661545283,1868767348,1852404846,1426089333,1717920878,1684369001,1702065440,1969627250,1769235310,1308651119,1163010159,1162696019,1397051904,541412693,1752459639,544503151,1869771365,1851064434,1852404336,1818386804,1919230053,7499634,1936943437,543649385,1919250543,6581857,1701734732,1718968864,544367974,1919252079,2003790950,1986348032,543515497,1701669204,7632239,1769366852,1176528227,1953264993,1380926976,1953060640,1953853288,1480936992,1968111700,1718558836,1885425696,1056993893,1229477632,1998603596,1869116521,1461744757,4476485,1145980247,1953068832,1953853288,1229477664,1174422860,1145849161,1702260512,1869375090,1850278007,1852990836,1696623713,1919906418,1684095488,1818846752,1970151525,1919246957,1818838528,1869488229,1868963956,6581877,543449410,1701603686,1685024032,1766195301,1629513068,1634038380,1864399204,7234928,1698955327,1701013878,1328498976,1920091424,1174434415,543517801,1701997665,544826465,1936291941,1056994164,1140866816,543912809,1819047270,1886275840,1881175157,544502625,6581861,543449410,1868785010,1847616626,1700949365,1631715442,1768300644,1847616876,6647137,1766064191,1952671090,1635021600,1701668212,1763734638,1768300654,1409312108,1830842223,544829025,1701603686,115,270451456,1338462720,1338462848,-889133952,-1,-1,-1,-1,-1,1342177281,124911672,118489086,1034,0,0,0,0,0,1792,2098951,0,0,404226304,0,65616,117899264,0,16777216,16842752,16843009,16843009,16843009,16843009,16843009,16843009,544106784,-9744640,1916928013,7037285,50332859,126501852,1974549571,440583,-236201725,24412732,1125092035,1396912010,-770975349,74766983,-633611641,1526730937,-654055820,-1246113813,9562376,512460493,-947257298,-1057045726,1335888244,-1296037373,-380799725,1035085501,-1187401031,-1296484686,884128053,-1187794247,-1296482638,1085454647,-1187007815,-1296485710,984791363,512434923,512295735,45219886,-1190415687,-1296498254,313702666,-1189825863,-1296496974,229816598,916635698,6267397,-1576770910,512426080,512294958,-1070464185,-1576770142,-947256213,-1057045726,512296052,213451593,1159629576,632416515,-1966962087,2663114,54730379,55254665,512481927,-947256505,-1057045726,512297588,-628685996,55975561,55385739,-628630773,1946374075,1963401739,-2028995065,108259802,126402610,149475722,62176036,-1031108659,141771836,108212796,108142396,321661104,-1976643446,-1073069305,1129052277,-227161346,1193184083,-561553917,780717398,1060898698,-1151662475,-722795596,1534246632,1006632634,1971965402,1978591491,-1021130870,57983230,-1336108568,586279167,-1966253648,1872937010,1010558976,-1155294488,-1930950867,2662514,57999916,-852627736,-17525,3022473,167984800,-1958120256,1392721694,1516004840,24635474,41036464,-1394073424,679798818,839807834,54436544,-1070419733,-352108894,1092520725,1926890243,-105229583,1524251647,512354419,-140508353,1958742529,766044586,1915245032,99215522,-922828546,-392390284,141756205,1965462504,-25761533,-1979434776,1965046791,1542514691,20047954,512335194,-1932721341,1877541746,-397323717,-1326957074,-1665136123,55121545,1912664296,1973198089,129034499,-1672364022,447604819,1364827483,-689437837,1386043928,-1604696204,-1073085333,512428149,512295690,512426799,-2023881896,1398363870,-397158141,-1990501611,-2029823970,1497336026,1128485722,1128470409,1224784058,-1958131383,126397682,-1974910397,1975847617,1519242738,-1962926360,-1996166882,-402435554,-1899158711,55713419,82386569,-1946232599,-2030030818,-1963029798,1124567770,24446730,1128481731,-1073084534,540807284,188544371,-35065486,83486724,-2025591573,-350778918,47828,1008170066,1511224364,1376134120,742137204,-1343743628,41216547,-88462276,-402426625,125044236,57945148,-1979882519,-2029831394,-2023859494,-1957472546,-1962921954,1124567755,1268713226,1133868190,991923011,-1948677158,-2005600993,-343575563,-1564462366,-56491267,-1181758206,-1195769541,168266240,-1155500608,-1014365888,-930430678,-988100726,-1212422006,-1950338560,-1958565126,-1958565126,1019456250,-385649374,540803123,-56620684,-1967126014,1127183367,39118928,1949969496,1967799302,-1576947704,-39714052,1968516098,126505132,1951973386,1946630826,126505178,36497475,172223723,1267890368,-1850720452,58020178,-1174347031,-756546709,606726158,787022707,1589269249,2156555,-253215115,191019523,-1342171672,-352094839,1706725387,583691,-1917835659,11397465,-1406209397,24494090,-389510461,-1053159787,1111750261,1330113259,1330905120,4347136,243263579,-1148138157,1093402883,-930430974,-654114635,1528269614,1726501699,-1949791730,615263986,-385649281,977469867,-1957661247,1118580466,-495337462,675070346,-225763980,-784552914,-801368716,921178484,1949187086,365422595,57802928,1476492009,-1406209397,-1073049139,602473337,207247616,-5222272,838947304,50176704,21555288,1543418601,-1406209397,2042628674,-1913961737,-1832038325,-1978921798,787647432,1958742700,-1053146601,351007605,-1448367476,-1579898714,-1986096246,9293198,49004594,-39714384,1515804674,1968218428,16443395,1974549592,16050181,-650319440,-957807756,-437760000,-393236480,1347944674,-1963020823,1949187079,1916419086,9496835,57880636,-1610577431,-1073085699,1515784074,1659437945,1009218814,-385649362,246480473,1375776232,-402396952,-2023882499,-628664610,-1679244406,1539803648,-385837592,1364393471,535299978,14674013,-1605150119,37487355,512432757,-947256157,45137930,-1014362507,263453578,-931984836,-873787132,80269392,6088731,-402349125,57806415,1476698043,-402159024,1129840714,-193607426,-38934181,1107520186,-1406209397,58031908,1107323881,-225769670,-344609746,1006661609,-385649626,-397148731,-396688885,1211894999,41225136,199756976,-397323776,-380039975,984678236,1118501515,180456009,-1023314747,-1679222862,1536413178,-1563886005,1515782909,-401825560,-398196770,-253227879,1022653217,1007186746,1022128944,-370641874,126549299,175317052,108267836,41159228,-1605361488,-1057094915,-922877324,1274978281,540805002,154990964,171767156,-1018957452,966943920,701687811,-417311256,991332690,50044931,159115344,703091544,72792848,1532380648,-397190822,512295837,45810485,-388234496,511048051,1263720707,-1974782070,1396917015,53812875,1515969083,-1956977291,1159629283,-2024099581,-402083366,-1957486877,1577268510,1398201991,3022475,1457424222,-870322712,1963793128,-104404733,-1041693838,250125561,2018745609,1894659,1583188712,-1168712057,126484481,58052412,1376834792,-388331693,669734598,-396553496,1364940209,-2130658990,-695537270,126522573,28364604,-806875531,-186100984,1435756636,1533874920,-930459055,-1978877208,-397717016,57933995,-386316311,-1595402623,-1957473536,-1996203490,-1962922466,1577270046,-1252598137,-2036379262,-997830460,1355056799,-806763386,1367520612,-873905429,-116200968,7727299,-1781706517,-384867351,-1073085739,-1975260299,118113031,-1958485900,378094359,116785198,1962869878,1538282278,-2028156184,1450240218,-1058513488,334191388,-1679255859,1160153373,1126074627,1007127043,1136620858,977012618,-390419598,-1535880690,-1418559188,-1569502660,-1073552334,-1748111221,632618798,126501632,24263228,1948269763,1007186676,-1057032912,180603134,1023112384,1014133259,-1610189538,-1073085696,1947221187,-1572646852,472646400,-181651085,-29620365,126491509,-31553213,-1979664638,35555800,-1576882173,79364865,-1073063936,1124567747,-31553213,1066027778,938009067,-31552768,-23860478,-1564421952,1364329217,-2029845830,-387413286,-628665069,512318041,-1151859970,-1073086460,1913208003,-9836285,-17485764,-1010237760,1006829728,1008169743,-1961659891,1963131422,1128481546,-1975314550,-371554505,27284586,50045443,292816956,50470539,77799049,50601611,77930121,50510787,-1303077399,45267203],247,[-1190874439,988285106,129939743,753234513,-1966568895,-16389912,259385916,-385941784,-797827295,-393592532,-1963003160,1925262021,1589706435,-1151934841,11862880,394844419,1976106563,126508025,-1468715972,-335622424,-20322123,2031006696,-385502565,126547834,378220092,58000201,1274983145,1023323880,1006793742,35031821,-385649405,-1070399841,1258487970,-402652998,24313491,1352618947,991533243,-1977912614,64654078,64685018,1490748378,-1976554338,50378448,1541048282,-1638345237,58049371,1008499945,1007121422,-385649651,1978151075,250132764,61939435,-400817432,1398407061,773753683,-561553920,-1618104234,-2041527162,82530756,-8656815,1006829728,1960478477,1947090108,-155260669,-1957438841,1577254430,-396960121,1396899921,3022475,1935399483,-112203773,1189610354,1225618425,1034030512,-51881213,-1009153262,-1545008974,1972948470,-385894666,-477366790,54861449,62033212,-1947663500,512318454,-390397906,-561553906,-1319391146,-1325208774,-1979665152,-1966241087,-1326953496,1958742781,1959082686,574374842,-1057035916,-1943212940,-985995403,-259340782,72933355,-401282301,1609049564,378136348,-1605237957,-397409541,1582826885,-1974018425,50045160,-980761286,635962996,50044940,1006937018,-1174179323,1012073631,-1959693053,1392812830,-1961391293,989868062,-1961790502,990075934,292772570,990063803,-1341492262,384231514,870898311,383707156,1457424222,1515372264,-1489190053,417870453,468510973,-27268983,225759755,-1963438104,1540459253,334037874,1293322751,-1596296701,-1073085617,-780877174,-1979701088,-170989104,-1978866200,1021872647,-402295667,1267276722,-906048886,58049930,-386090519,742194714,-286546059,167989152,856192448,55419840,-17471767,2663104,1954758528,-34084846,-771027851,1944588404,-1564462338,-389872817,-92930921,-1070462997,-33337438,55026112,-1962922333,1963150110,4161765,-1014824075,401163012,208726041,-1073030539,-1528233099,-182392323,1375734458,-1645731980,1591379965,1951850119,-388331754,-1960043738,1946370326,-40638456,-504822924,-1965389836,1975716551,-42866429,54599305,1526939298,54468233,-170137255,-1979437848,1965833223,-65411069,91523388,-853874200,-756526261,427055953,1979451112,238863105,-857144459,1947024637,-69146365,50470539,-402540861,-1073021399,-454494604,1973501179,1976499954,-388895762,65732970,1261542376,1979436776,421390339,1072235381,1977039873,661383427,58052156,1006676969,-385649198,1012072612,1013806124,-385649349,-396820201,-397212759,259262371,-396541464,130421442,-1558279392,-855114236,-1558279271,971526916,-401771492,58196273,-402640407,65750401,-1979700832,1958805224,471787555,1726482292,-351827387,996730883,-1073065125,117575284,-33262603,1925528264,412739587,316598363,-9705125,851024589,-383874304,-388431100,126491624,715135093,-387413504,-12829902,-986051468,1827144562,-385650152,237764743,-789119885,-397380885,-236389625,1011898378,1241609426,-1073035638,65602424,47616,463923283,-1628959372,-385648640,-286785515,-1610355900,-662044631,125092094,2095579319,1541048145,689545704,-768845749,-1189907373,512426034,-654113559,-1977913368,-402426617,-789169474,275956226,427081982,-1978140952,2043215554,911619,-393559810,417865904,1976434199,-1998038023,-21173766,-1070425139,-397323693,1515793542,-125124558,512350346,-1017445143,-1614794157,-2041527162,719972548,-488045708,783897586,-1241337344,-1999043587,1526771767,-399907095,-1073074637,1954888899,866314499,-2061954584,58008380,-399496983,1944591664,578480128,1380926696,480766035,57891162,1360610793,-402606766,-1336209083,-57415421,1684361791,1919295599,1931505007,1953653108,-1975320563,1975519751,-225253117,-227204548,1526766569,-854791333,54173852,57982986,1509061609,-401272645,512452107,-389872829,-1152176236,-521600522,1948466176,482273522,1360366777,11543100,1604517808,-388008700,126488795,175451196,1604501554,-107091964,1877476587,-397198568,-1017442000,73375827,175423498,216547248,-400510954,48764423,57891100,1360568809,983744562,738706947,1398528647,-1337241006,54108800,-386310424,126493349,1965571147,11879200,1290323454,-385649159,574419432,1172898677,1948794111,1965636843,1976434409,-114169627,742131572,-907476108,-561553679,1007127126,-385649620,28376881,-402347614,-1449131934,1959329284,-14685949,84797523,-1930951819,-397714670,-2023819013,126506718,-1955320772,-320320677,1539312376,183042932,738707199,-1957493013,218324510,983744562,-561553917,-402330794,-399763550,-2023874280,-1974315298,1949056007,54173706,57982986,218139625,1386397746,425912324,-1947663500,78243886,-398953136,-259327845,574417034,983567988,-1967126013,-1241352976,1261221178,1477424872,-930479356,168055456,-1023314496,-628637302,1578551995,1381424775,-386207511,1348008035,-1682373316,57889046,-380438039,-397716739,125106255,57945148,1593729257,1263984263,1962426088,-9705213,54173786,-628637686,904463220,-379891177,1659436450,1975519994,126501653,-1308161469,-385649404,-1958481714,378094359,149422903,1971600632,-11540003,-417933848,-402651927,1260918478,-1320025930,363194369,-1293378099,-1564462591,512296104,512426834,-1973877934,824084743,1944468483,-381893887,-382962318,209047690,1006828448,1975683587,282519811,-445445060,-1241284421,-1965423872,931802821,-713832902,389986641,-842626479,1954495646,1917926500,1023288429,-1603832710,53215995,1038680949,-4191504,2030347062,1173763,77936383,149488506,-1623785728,-1590231292,-1979513852,1374194378,1360536505,53550731,-1224776727,1927687168,1929591860,-805225424,986067664,1945144006,-270604029,53550729,-336120088,1399187680,-1186187288,2142659881,-397227541,1398428595,-350539335,1019579070,-1023315356,79319633,453229412,51505235,1994982260,-1558279169,-927378684,1503456037,-56442486,50044930,225822010,678691388,58000444,1929412585,-1963947463,1946696901,1019644462,-1973980152,1946434757,1019644518,-385649405,1702096764,-1258050885,64553728,260714201,797584963,-1558279334,-389852924,635982604,512318284,-1990523743,1493475102,1264248922,-1152190488,-56622186,46190594,316181187,-1966921017,529215224,-980753409,1274472528,50045528,-747371460,-1558279845,-388895996,1515803287,-352083781,1642617805,1248192587,1531652328,77930121,-1558279845,1407576836,1357437575,1172855626,1246357579,-397657111,58062387,1945036009,1355606275,1914064616,14412035,57876540,-839483415,1975582367,23783683,-381892354,-365111948,-1343683723,1965177856,221112579,58053436,1006759145,-385649370,-717487919,-387445643,2662645,38004819,-734215333,-655880843,512447477,-135789753,1019435850,-399608358,-1679231545,591144980,-1192751755,1088967429,1541048102,-402652183,-2081939719,-2024593132,1977289690,-153229053,1531678184,1976581315,33614083,58054716,1007717353,-385649208,-600032304,1290339189,1977498670,318368003,58054204,1007644905,-385649275,-616814024,-1528233099,1976646715,41871619,-386047768,-1020718034,1575517622,1377733629,-689417469,-389850269,-2024596076,-1558279718,21096452,-1343749260,-1966908598,1918974983,1937456377,-1017174795,57943612,-1158255383,417857536,-1709835,963923772,880101436,-1975319115,-2758649,-2028655896,1007317978,743273274,-347508176,1934048262,53947459,64685019,182125531,-2015851837,1976434394,-309532207,-187307957,611572359,57817148,-1175622679,55642064,60584667,60322523,1502900955,808190133,-654063478,-705963385,-2025154072,-1975270438,1015098375,1393456391,1022663400,57957160,-1337335575,-805260025,1372097216,-1963686168,1929723073,-58464222,739463656,-2025220888,-1558279206,-561553916,-628665514,-2029754904,-561553702,-400430250,-2023817474,-1014343970,192023612,-1580393668,-402427053,-1168420741,-1336796715,78160385,-855590471,785974176,-822204417,-2055935428,-2123092676,725403390,1019412853,-1610910487,-20734389,1505759936,-16464606,-118964198,-1240470711,-65869734,-145714456,-1558279725,434723076,50045180,-922875844,-922826498,1355123395,1481668328,1970945114,1250552067,58030908,-1186437399,1011967244,184776006,1346159578,-635239563,1966881987,-1009110269,91566652,-738731469,601094083,-1009518630,-806757845,6529096,-1343749141,-1967063501,-1967115560,1233447416,1375743720,1593717224,-1957241209,-360425,-1125579915,129699572,922702693,-1605237936,1011876603,-402426621,-2024272649,77839322,-211687221,1006633145,1007711003,-401837551,44102483,-792720893,-2016900400,1227738,-628631293,-2496317,303097938,113436903,1457424222,-1017440375,-378220484,477417788,1393687016,1158804968,1192358376,125098636,-418256408,-1996055576,-1023193066,-402525208,-628686368,-628680823,675022730,854131572,-219027211,-1977925656,1965636615,-182195965,739359208,-907481365,50044929,-1991196662,-2029825506,186616794,-385649189,126544756,57944124,-402600215,512357051,-628686031,55713419,672237032,1397801010,-2135893369,-402441822,-628679952,1457424222,1342372768,-90445742,55713417,824084827,1105745923,-402345727,-121958345,-1948515329,1207560419,1342372768,55713419,691799946,1005065076,-1957483503,-402444002,-349433550,-459122511,-1073063933,-73249164,47874,-1075258365,572231,-477373437,-33311910,-225752381,2025851564,1246382838,33749920,-1595372861,-930479132,1681704194,1424556914,-1014345485,-423952203,-1965489405,14674120,1360840121,-191239855,55713419,1408367336,53550731,688966120,512316080,2090861361,1342440451,-930428720,1477416680,-789133174,-661995266,-603717705,-1168907381,-1628961926,512318208,512426874,512295908,-880082052,-1174176069,-2031615002,-1963423232,-467760680,1344178947,512312068,-947256240,1302512394,824085252,-107943933,-242358197,703136628,-41031446,750391669,-1558279421,1926904580,142403590,-1962350872,-1979483618,1137937143,1125091907,1094791050,2059092289,3139587,-477373817,72359563,1344178507,180849156,72196803,609441883,59554567,11913354,-51848957,-1950131204,126397682,-1974910397,1975585477,-1957444622,1124085278,1968954123,-385043724,-404166194,-2135895793,167983522,-372733433,2117867867,-1645673612,126501865,1971534915,212134147,58040380,1010282473,-385649246,-2115422016,74836201,-370353529,1642659129,-1477946876,-873976817,-389850624,-1007747088,1392503784,1258336848,1961933544,260892679,11593772,1592822360,-1604919673,-1073086370,-628683915,853182444,1959142082,-373072914,591194420,-1763165068,-57546504,2112378997,-1228502496,181466624,-385648192,-796200525,256436306,7137324,-997810342,1405388368,46303826,-1328510272,-997810412,-372996528,1357389832,5040368,253814864,4515884,-397257896,854073543,2042628666,-244193021,394811971,787006299,867756032,738208162,83653390,-19859940,-1564343616,-389873622,451473427,-1662495752,1541048140,-1073035638,-268310333,-386397976,57999339,1274098409,-1963986200,2145960898,-387429387,1503841775,1374352104,-1960306200,1258502942,1961875176,245950478,532932652,-1070464334,-1155426584,512360447,1978138670,-1341819632,7315969,260725339,1127189059,-1056258678,1038680949,-527374103,132645749,260722957,1127189059,-561553839,1004177238,57891290,1592336105,1398201991,-1982167215,-402437858,-1973729878,1946762247,-400510971,417860595,33012480,-402651672,-1746203469,-1073084534,-389873291,-347924631,33012211,-1070399562,839056546,73310912,-349734424,-29146874,-1965067058,-1950348793,-696997127,678562620,-796254148,574371954,-56620427],248,[-1576979454,581960444,276118076,-805110624,-804818216,-1560468272,984613628,58310666,-1979695895,1949187280,22538249,-1070463885,1587550443,1958742532,1975582223,-1960792053,-29250823,-1023314482,1587675568,1019382276,1007120907,-385649888,-108330697,-1602032726,-657456388,-657439886,1383323856,-650377334,-1514450605,-814394592,-1393456311,-948613828,-1393456311,-1082833604,-1393456311,-1217048004,-1393456311,-1351271876,-27568040,-20513082,-339280186,-1973724883,-13244153,201522336,50110978,-1597784014,67896060,-791612437,126543730,58033212,1023402472,-402426481,126549989,126533886,-1975319179,1132405767,58040636,1011087592,-1979025999,-381926649,24424880,1381061451,918266829,-1310160383,1136787008,-745867382,168266286,-1611500352,-193356221,973572654,-2014808635,1959804122,-1965999102,-1973855551,-1609796144,-1073085346,1587675312,1008069380,839349595,73310912,1587551723,-1329591804,73310975,548408692,1101724043,58052350,-1979341591,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039530611,-1472403079,-1070463627,1527013026,-385981207,24251839,1915763907,-180732677,-1998042173,1347506925,1492001256,1361163705,58002236,1010983145,-385649396,512442979,334037762,-1604691633,1337066240,108268348,1219628092,649073781,1101724043,-1066086658,-108281206,-822197846,27309684,-1308345341,-1308200448,-1308462047,1007127075,-402426592,126501714,1958742595,-1426486486,1959722561,50438287,-361626564,-1952560737,1100983537,1006925214,1007186990,1006924868,-1294764731,-1966085376,1958742722,-1426486519,1976499777,512475905,-1360461058,-403576579,32893009,1364286041,1944592616,-1963488757,-561553709,-633646250,15270770,120437742,1499002600,1577704891,-2024350073,1478396890,-1393390845,1101724043,1977236290,-1982231564,-1023191010,-402640152,-1910627133,-1979494370,-286712057,1501432,615639122,738941416,1526496744,1342606854,-1426420989,2062074631,82334708,1541048064,1806547395,-127276975,-1530005896,1006937760,-387091056,-394766165,-1186430232,12226944,1077602560,1358957241,-712313462,742143348,-397276300,-292885132,1952107146,184608806,-312022996,-396878476,1378618102,1961715944,-457774845,58053131,-2014491927,-561553702,1373275990,1525107944,1189630290,1524206567,-628630981,753468275,1482250989,367743571,57923843,-2014503191,-105163814,1541028863,283706227,395006701,-628633077,-1978895270,118113031,-2019669089,1372943834,1493181672,-1957536934,-771013865,-628681612,1457424222,-1992041849,64653079,1541048281,-1246108437,222056712,1034076210,807308035,-1975301376,118113031,1136853365,-398256245,-1073026181,-930419596,167984544,1958841024,1017498971,-401050201,-1992496285,1558766709,1963867371,-1394060579,1976699884,1009380106,1389131022,1408016104,-1612280600,229678665,2028486514,603765512,1466558546,1096869979,1364417369,1531007464,-1544860838,1701080661,1701734758,1768693860,2123118,-361427652,-329127854,1138394963,260719427,-1339061693,603437838,-31552685,-2008329470,260590383,1527220299,54370499,-126566390,-385922583,-398325326,-398390866,-397211222,-1606088282,-1073085347,1860764532,512447459,-628685990,56368779,57989691,1541627113,808191882,1240007539,1912749283,-482154237,-33268574,73245376,-1008036120,168266286,-386370368,-347930621,-997810189,-372996528,158598937,1408402664,-347666712,-759475424,1453713444,1510793704,-1880554637,-1975299575,1157687303,-1073084534,-454499211,203327814,1067378688,1632813915,1836016750,1836412448,544367970,1684366707,858597408,943077170,544175136,909586995,-1325389513,-1325208803,-2029996774,773753818,1511950592,-19233020,216550341,1008170218,-401902302,-1073026557,574360692,-1589840523,-851698316,-1073027979,-1975315083,118113031,58053002,1138925033,-1992091765,-402367978,-1891833385,-397342859,-346428399,1971600601,48779527,-823436820,440189322,225707914,-1552633540,-1586122180,-1653223938,1954692291,1971534998,1959657108,-375527181,-628643724,3022475,1511951187,773753092,1373275904,1494341608,-377362357,1948592826,139520008,2042252076,-561553883,773753174,-1018012928,-1465888609,78225924,1352638040,-1465728974,-1013032956,-1979524120,260719367,1513065027,-689418159,-259368958,-1975314550,797590287,180521563,-1023314490,19711626,-1070401166,-1057045958,-822152845,-242496770,121258412,1956529055,1927935452,1039657023,-51902229,-402396355,803752622,42592256,1361647545,1396901770,1526770664,-1975316598,911407,-388461997,-1017511333,-1779957328,53263104,1124567123,-1017440375,-1977436853,-5155851,-33060285,1958742721,1959148040,1975859716,1965178095,-390993917,1019578963,-32672468,1959395009,126503687,-176938948,-561553829,-628669610,-1259814518,53263103,512447152,512295692,61867171,-402457694,800734743,-1982186749,1526926366,-1686829174,-385871686,-398204638,-320274542,1048373249,-822163714,-242514572,81389740,58002748,1090889192,-1073025813,-1638399253,512446623,-628685988,53419659,-930426634,-654049355,1926904643,790530319,-628669693,1489215064,-1013005178,247111256,-385649408,-1069883190,-625389409,512446758,512295690,12256047,512447232,-1152187556,378209038,-633666804,1948723897,10283267,-1996234053,-1962652130,-1996269026,-1962652898,-1962715106,990137110,-1977912102,1128481543,323348560,1963146328,7464965,-796213198,-637337418,512482795,394986574,512479755,427033434,512350855,1128465486,1128470411,-637281657,72031881,-1209279865,1544981337,1977236227,7137539,1346570122,-118996157,1125091858,1480798090,1020855123,-1981975293,1526936350,11865994,-654059261,-1948612797,-2029833442,1960459226,667269572,180367953,-1639735545,1134499722,-1623749986,24485443,-1949594685,990064414,1926859738,-2023859213,-633645346,1457424222,1943636819,1482185187,-1018080685,-620012710,-1974732428,260721455,529156947,-654114633,-779422326,-1949594805,-402444514,-2007286624,797459215,-380905077,1397882592,77799051,1457424222,1592828136,-396960121,126499821,-1558279341,117592836,1929383866,-545724157,1526586344,1577076968,-396960121,-1957494721,-2029834978,977114,-1157624856,-2023876806,-380414242,1583087111,-1974018425,260719367,-1976595901,-20709672,-1023314485,-1951600245,1111599866,-1830227477,-1558279365,-388331772,-628686816,-1974278795,1255246581,512429962,-633666769,-1070462347,-654055286,53419657,-288504997,51125899,1261406795,994774922,-1980860966,-1023210466,1360756665,855619560,-1963947328,-1010824697,1360756665,1979706856,-413800189,-1961391293,-389829390,250150190,756976630,1494714371,-386043159,-739711489,-135780348,-873966859,-85447676,80013549,-561553879,-320318634,-402295567,65795553,1526708712,-402651672,548468181,-389903792,-393544468,-20578728,-1950583603,-2013057762,-838974713,-1343489675,838902760,-561553728,-1329034666,126505811,57853242,-1313159798,1374179584,1398495741,1127189059,-578142326,-654114635,-1461138549,-388461828,-396689673,-387318003,6744316,-225750438,-339400020,-1965389892,6088711,-838941186,-1729559691,-1243065882,-997828607,-561553762,695581014,986250833,1912648967,-930430207,-1054210166,-393559494,-359992462,-16717629,-1897331851,1137740529,55779211,-2010150182,-561553865,-397717162,-1092033257,-2007279297,-628636881,688120296,-1974379943,15254506,-318510875,-1326382360,376721409,-185341864,58048522,1357260521,738442728,-387126040,-1276626435,-1957483517,1577362206,-396960121,-1545016103,-397203197,-628621744,1364745049,1365575609,1360756665,1156076112,-1973921026,-1966539032,-1341703480,-1952288000,-1073042190,-1720400502,-1975318646,1066025775,11918730,-1054156541,1381099658,1457424222,-1958539382,1381194519,-1393390767,510986042,1959394882,-838974708,1515908981,-1070441895,1515871171,717589081,-20905273,1515832256,-838974629,-437530507,671293928,-401827864,1381185889,-1958487417,1545505559,1926904579,807308050,1943681792,-397190390,1398537006,1530511080,1457424222,738390504,183768552,-385649216,-1974409909,6744071,-335222702,-41228205,1499191943,1592298072,1398201991,1583679419,-1974018425,1958742721,705137296,-385649723,-1057037029,41075002,-846544502,11913726,394937170,-1975547325,-1965489190,-628663576,-1958539382,-1965390049,1975519937,-225721599,1107789996,1959394883,1976434420,-5061647,125053244,738357736,-386689560,-1020722582,1961858792,452867,-386067736,378272636,512426844,-873921745,-1615540753,-2041527162,635982788,-385649660,1482364893,1369359494,317411487,1336066098,-443291389,-389480935,145761123,154941675,548409461,-385889560,119808846,-1638337419,540853081,698359922,-387413504,-973200582,-838988940,58049850,1946186472,1962884105,-390005243,-1638391001,1481678681,578611358,-390738493,1031013308,1930933992,1397903859,604321440,87466696,1528351976,1805670746,1958742532,822798595,168095648,-1157139264,-380432664,1364394221,120437586,1515127528,1527623769,554887363,583854275,-126566390,130419691,57337856,1963062971,-1330197241,-13768691,1946377192,-1010814461,-1394032590,-1010814430,1587591117,1975519744,-991378687,-402426369,-1863777828,854583297,548399187,-1326964364,1975519999,45109264,-1946579992,1510157598,-790030455,2078822649,-796239623,-1141093656,512294918,61867171,1526922146,512447427,11862794,-654059261,-1020647760,-5187446,-125122790,-603781518,-1023315109,2891403,512314187,129631045,-623580928,53419577,1381099891,-100210605,962157147,1929588510,1977871322,807308246,24766464,-1576770398,1034027838,1124567043,-1992095864,-855418850,807308206,-1345500416,54206089,168060320,840398272,73245376,-1258005342,56671002,130461901,-838974716,129693813,768768,842516200,55550656,-125118326,55385737,55975561,50994827,168061856,-1996196416,839069470,8186048,56106635,56237705,56368777,168060320,-402426432,916460980,1963009029,87466499,740199257,-1991554304,1124287774,-1951281853,51297251,51125897,-386403352,-1070405942,-661981046,58465929,-1996206686,-1996233698,-1996206050,-1576830434,1364394809,54206091,-1009108029,-50623650,-1957255634,-1979025953,1916419079,485081857,-642586143,512481927,292814896,1390992007,1256739810,1524206556,199820146,512314339,-628685986,-16943677,1963584448,58039543,-1660248088,54730377,-1996288325,-1157428194,-1957036276,1392520734,583240348,1958805191,1411287308,1126075139,1444841731,-34215933,120765341,350815092,-633214502,-1336930384,-47585186,-398457768,-320209629,1444842493,-1160049917,57999377,-1948695063,-1996270570,-1023398378,-1564462408,-389872522,1397885128,-402362693,512439819,-2023881894,1827165918,937971948,-1377293057,-393586680,988569320,-385649467,-2023827192,-628664610,1511951187,1977236227,1583045139,1381424775,1530254056,-402362694,-1017432629,-1327405335,54108673,1963488232,966939635,-1963095549,1229539801,1236070795,-126304246,-637318839,512481927,-633666724,-1951599989,1117760249,-1639866466,-1958088587,1545505241,126507779,-1217057732,-337648920,-997828426,-1966908514,1916877831,-178569991,-34674237,742194036,-68679308,-1058518048,-387025697,1949105810,739675112,1949056000,4712451,-542513077,-397511598,1949105786,3663944,-543561653,904463220,-561553704,-289713322,1943681792,921197357,1395094016,56106635,50336953,1943682009,-1982167271,1526925854,2891401,-392762533,-770968848,-1729559691,803849184,739675133,169224960,-1950684413,-1950209085,-1295137840,-383874221,1541081860,1311769027,-47128272,1529868591,456142896,1444842288,4909056,-339541644,-352210940],249,[-1560301566,-1057095568,-1224645144,780289,199813237,6219807,-1597784014,-1019608996,125040756,-1070409590,-31525399,519104963,973101984,-1327270717,1958951425,-372506915,698359518,1959213568,-372769071,512433874,28770395,5774985,-1960917527,-402631138,-1233846263,-1979700832,-1329206280,1959213569,-372244823,1537220266,-1594324480,-662044580,-1770862806,-397360898,1486880921,985923072,1942748867,1925659149,-1342016247,-1563886079,-27787176,-385649208,-555220989,1537262366,-1596421632,-125173668,-244137174,-397360898,1486880895,1925396992,2026322448,649475,-5242251,1487061246,-922855424,-1142304908,1528728350,6135808,-980752246,41141050,-952444790,-125173133,12044170,-1057045718,1342206650,-637281657,-2008873080,-922860793,-628622987,-1564462504,1503789144,5939712,1358900201,-1258276888,-1966568959,-1426420795,-1393390774,-930420342,1976106584,-347028735,28659946,-1979705368,-1949988152,-1958565126,-376787726,-27735926,1357018312,-1168905237,11993204,-637285378,-628684918,-1010818469,7649875,-872546121,126409219,-1017390457,1105766093,1444842241,1478396160,2727936,518766846,216547248,-400510726,-1070401017,-855627870,18802855,5643915,5774985,1520617354,81913856,91540478,-1343749712,588048639,-400342552,149429156,590932003,58048522,1344042984,5643915,2696842,507167998,309657688,5848634,1049101427,1043988569,108396634,646506378,-396885926,275906607,65583988,-107354110,-402541589,-1377044077,1962476348,-155454207,993837825,-118883467,-29144100,787642569,-160102598,848608195,-320336207,-385648129,844103687,7512768,849525592,-655881039,-385648129,-1974468576,-792720703,852003520,-1142388032,-654101842,1125616174,1480034862,1444842322,-1073036544,-1071512637,1444842435,33521664,-872543371,1979635688,691964423,479258624,-1007034647,84279821,470551299,236920349,168369023,100798984,235733765,889133951,885666902,867119929,891630855,872494413,854799479,233321409,1489532157,-138674507,-113121279,222037896,171708788,-980810123,-311099844,1976434243,852360936,-1157134144,-1597832714,-1073086350,1642609268,-628666114,-2030041146,-389808422,698352425,1959209472,1354825227,1476457960,-143275778,5643915,1493056488,-1070413686,1118501515,-91504246,-1010814294,-1073083728,39512259,-1258162246,5808382,28820282,1962944928,1478396691,166220288,698374910,-1610255360,-922877862,-402629982,-980811204,276086818,-34674606,-1224116902,-1597768191,-454361047,-21964153,-259340758,1007127115,168326176,-33065536,1258517710,-968626197,-628686841,-1219490384,461170689,-51901008,32947191,851704152,33006272,1979557864,-339476988,-352079625,-20477219,83371208,-1967063544,2728168,41141562,-980752246,167801504,1975880384,1959213580,-386364923,-1070458058,1959209667,1352683771,1370112,1492626152,-243939074,7512259,1923272950,-1010814464,1444842323,1923108864,1958742528,256003,-1597809832,-1019609000,-1152184203,134086746,973089184,-2013105401,1352686343,-389510656,275906959,844160116,-47650624,-420953090,-872523775,28820478,-1605114901,-952500183,11996021,973102496,-33524285,-389546301,1398472713,840609256,-1329374272,1959213569,-338690556,-872525036,698355316,-386364928,74841296,1457424222,445179995,973101216,-1609927229,-922877862,1520567156,21161984,-55646125,-1006759563,99090871,-561553918,33286230,1541860187,840586728,-1847016512,-1609861636,-1019608997,-1006762892,698413291,-1594324480,-930480048,438495313,1958742617,1958820364,-389546488,-1070458326,1959788227,-387585036,28770452,1394219496,-402632544,-27590227,2728135,-952450818,1105784181,-1213893124,-339476991,1879492322,149618688,-400955928,259129674,1946173672,-386798829,1005066710,-402164991,74711089,-1070403093,-1564462397,149618800,-400966168,259195170,1946167016,-386798613,333978030,-402165247,-596377577,48820715,-1949046016,-402631138,-864683324,-1763114569,1444842490,-85989376,698400373,-369587712,-872482150,-1041758860,-17337093,-1605254205,-952500134,1743264370,1501209,1118501515,1457424222,-2023829506,74733278,-538195970,-1073036455,548405877,4581571,-74782640,576198004,1022457024,-1595050976,-1053163440,-1047861644,1489223714,698401785,1959213568,-389546471,-28114748,12314831,-1597505957,-1057095639,-344602822,1352716286,11003904,-397323325,1348010148,-1696022134,-930457600,-33543776,986185408,-1964542521,1405311937,704666784,1949266627,1528728354,-561553920,-1014344874,-1610589278,1554120797,-94705664,-561553829,1528727894,-1219273984,419031041,-385765285,512490246,-872546218,-1410858124,-100734952,-1010041253,-76402628,309475900,-210616004,175266620,-344825540,41057084,-1071463431,28791747,-1979700832,1709724136,-12822248,-939653004,-243937794,1398522715,-1528299081,-373073128,1240012867,2662936,54992523,-1021130998,-628637442,334227572,1946285755,1134361057,-388860439,57989500,1540977385,55121545,1926461672,-633542397,1128520075,1128470411,-388331693,-1973735858,1946762247,-400510971,-1125583721,33012712,-387405336,512490335,-872546218,-872543884,904398196,-17337094,401664195,1020371177,-385649654,-1957432213,-1979389666,1539508935,141888176,-401756080,-1017580457,-1326165272,-196220915,1271073456,1977073384,-1880571135,1538862326,-927968969,-1070464277,-1979516254,-390869745,57931721,852508649,-1561818432,-1975320434,1915632647,1007514690,1006924602,-402296016,863172523,-1252923254,9353983,-973176820,1118501515,1007127107,1006924602,-387091664,-395053173,-462148036,658294154,-169278606,-1901962801,1007127040,-1172409562,-1236125693,1948597250,1019674244,-1023314652,557631230,146209140,-210492612,616663640,-1227847041,532370176,-1965423869,-1974772937,50045638,-1596517656,-922877127,2062091125,-385648639,126484496,58009644,738250217,-385649357,-1070464826,1392720290,168054176,72000192,512433780,2126119804,-1982201085,-2029761762,771221978,168053408,841249984,72000192,56237707,72031881,56106635,-399647511,851705604,-1963947328,-2023859760,1539528414,1457424222,946518610,-411772357,991550138,1232362202,1457424222,-73379501,-1595373054,-989724530,-930430722,1090565457,512442689,55771996,-397190695,-1990513639,-1962714082,1511950809,130435843,1977236224,931683064,394877507,31320131,1531107975,1116137667,113641707,-385875121,1088948856,-1157138974,512294918,-1017445213,-98661549,-561553918,1391495766,9353809,179106443,-2026015552,-805174054,-389510440,-1047858237,-1975316598,-28228817,1408595400,1342213792,686348935,512317655,73072821,1507381250,1261406283,-922873976,512488821,149618869,852953832,9347776,168058016,185103552,-385649198,1498021983,-1631287720,-2023826809,-2024581410,-1967063334,1007127280,1015575596,1007121449,-385649571,-1662464448,1377733077,512318211,11666170,1393027922,1355056799,512476294,-1343683750,49979436,57982986,1489903849,-1952529274,-385649205,120204117,-1729559691,637440,-1597105687,126354171,-1227847101,-997828608,-385649250,260571338,-399538109,-1975320365,-218765112,512312131,260571953,49979459,-1047867184,1352601458,872701088,-1245148661,1939757056,1100962052,-1626371938,797459280,712697923,-922837416,1352653429,-896864630,-637281657,-806812813,-220403470,56368777,509515,-126494149,-1975402446,824085488,-2028500477,64685018,1272612825,1125615947,1922979907,-1964471738,1124567752,395008950,-2023865533,995120862,-385649958,501808975,1490682666,-880031490,-73342091,63671042,1912876251,182125320,51082432,2059406043,190723,56219907,-1948612647,-1023192546,1539316473,1124567747,-1979665071,1507394504,-1621995069,9353808,-1968377205,-1949958424,1128443122,-838989944,-1638337163,-389850790,1793645658,-215947223,-1948612805,-352017634,54173706,292864010,1406830426,983744562,-1665073661,170887762,-385649171,-1958488737,-1977292001,45175765,1011025802,-385649316,540803485,-1040316811,-327823874,-1326806437,30861404,854622952,-1966044480,30075120,126546058,1965112387,24111363,1383342908,58009148,-33464087,-385649203,725352750,-646707024,1124567627,1433677372,58023740,1006712809,983331932,1018590471,1008235556,-1968278230,37503941,126485618,548414524,-838989195,851362558,1125123264,-972897538,-1023479670,-838991695,126509428,1949187139,1948466206,1965833453,214338083,-336557504,1007127265,1949216803,-10098429,-29163087,1959657153,1124567606,-210492612,1005894226,-1963488686,1952333011,121291521,977533813,1140225287,-243988678,751143491,1525314052,-18314662,65749958,-1973757305,-1023521850,477431844,-980759810,343195658,757860234,-29620620,145754741,-972946428,-838930294,1702141275,48779857,1364810459,-1964340653,1019282117,-385650151,-963980253,1558741004,-361240517,-655864997,292878802,1006844578,1007121467,-385649620,-991376536,-628663854,1385976667,-987101302,-1979664829,52399056,180718298,-385649472,116129453,-402621464,-1654919385,1491665780,-402426882,-2023821337,484988638,65625068,1575535576,-1966211584,82330375,-1312101393,-1325012224,1476520705,1172884990,1956469504,1860719056,662694106,-1957473959,-1979407586,-1979665943,-980791099,57982986,-387145240,512485860,173540515,-385649216,120258398,548464778,-838941186,1340670837,-290330369,-1974405909,-1329591610,-402426837,-1017581917,53812873,-387453720,-628633073,-1627363608,1151311428,50886046,-1981576231,-1962719970,1392520734,53812875,686510675,-1981217932,-388331574,1735721023,512353163,378209093,378077230,1128465498,1128470411,512302987,-628686802,1406782696,1529316584,-1313273484,1374259712,-1949205015,-1996203490,1526738462,1877563737,310225,-1975264253,-2101787897,1975597568,1227015,-286533373,973124025,-1023314751,112793401,66614272,-1159992359,803799070,121301194,-781326261,1927828852,1827165145,-398625571,-1947716854,-1558279192,394937092,-1959294397,540847346,-2008938123,394808119,-401605045,1264314588,1959869160,1950039074,-267851771,753421100,-399724335,-1158943313,-1461181776,-390403859,-1595399504,-388502547,-1947603353,1403571670,-2014776694,1007252481,-401640390,-143064706,844879498,-839077696,-963984469,-922828246,91423292,1642704077,1912945865,-916788989,-1974381991,-1159165240,-2023866724,-1974249762,1918974983,1937456134,1361062914,-225711990,1111731246,1968817466,1976172053,787647458,2025851564,452867,173693787,-1073036352,-225711240,-1073042386,2040414879,1540197109,787647315,1975519916,-922818122,1145198923,1380144127,1347223118,1140666708,-63876287,-1856472320,-1118263464,1403637080,-997810350,-1161525680,-637337554,120258480,-796213246,11971277,54440379,394931930,931802691,-1631287720,12048522,-1976641021,-1976679657,1524270903,1457424222,18371,0,0,0,0,0,-402653184,-397158383,126544268,1333051402,1125616195,-628473974,-1070411638,-402194526,-2036334885,-997830460,-1241190215,-20775413,-1974635318,1914715143,1949187110,-1426486488,-822197439,-2040993419,-2036359484,-997830460,-257888118,1958804996,-997828602,-373072994,-347879384,-1576947510,-964032769,-277607620,-344849604,548465780,1101724043,-353644802,-108322640,-822197846,-1158941067,-29161590,2062074826,-1596421409,-1019607841,-370605197,50378695,-1948612645,50651166,-1608545318,-1057094346,126540660,-713768950,3062355,126540291,91425084,-1058415411,126507975,-1007042550,-818550709,58008380,-389075224,-2023825622,-397191458,58064811,-1983407127],250,[-1023088354,1360304313,-1965613848,1965833223,-1847045287,168266472,-385649216,-1958492292,604473887,1006744287,-1307216823,1951349762,1006940687,-1308003246,1950432264,-950736637,-1343729061,591146221,-790101131,-556996402,753770984,-1073036662,1038680949,-1293397817,-1973856002,-371339823,-1444413309,1007127294,1963242114,-827987879,28476732,1329352052,1228677236,1810380660,1743274477,1676169453,1609060589,1541948909,1474842349,145900781,2028481771,-313726770,-313989035,-314251180,-314513328,-314775467,-352144812,-832706543,1122841064,1307389416,-397729614,602459727,535314925,-1974316051,1965243399,-834803709,182335976,-385649216,-556939600,-1974775116,-836114224,-974584972,-561553722,-1614640554,-2041527162,-1662495804,-385649410,-1973762411,-855032634,-385649697,-1185692029,-654114770,11548552,-40769189,1975519827,87465994,57934116,-402438423,359988843,82386569,1929556051,-42866429,1357504717,52750534,834294619,-1998978304,-1963423225,-383874600,117594884,1526728646,65796547,-1614794227,-39851952,-1638340147,343167135,741083018,209043466,-389179672,1481829482,1352661406,-1070444385,1424490930,-383874049,3258628,-1638344445,-2145075174,916586764,-1617012731,-1564468656,126485743,58310666,1476450537,-402426722,-1070404777,-369218328,1122551557,1273679357,-1295169816,58063232,1946515944,-334436328,-1303364564,-402229870,-335950545,-335484920,-1296037311,-1974427902,-1576000318,-1638398878,-1057075041,838885282,-19011392,-1957454248,-1979389666,-2145101049,350815093,1676170205,73572577,57982986,-1962640920,-1996269538,-1962474466,1392521246,82386571,167823080,-385648192,1307115542,73572549,57982986,1527030504,1654833202,-20387580,190555,-1595349013,1979464704,437119235,535423949,807308229,-390067712,1189675011,-397369600,-63176573,921240437,-845260774,-989795860,616799832,73638432,58039896,-389746199,1671490167,73703940,838904808,-51255104,-1988098106,-402331362,-1073086389,-305286280,-1597713431,-1073085340,686293876,-953686012,512312131,1525154648,-1564462358,1139279158,82813182,57982986,-372508183,-628636220,53419659,-633611641,485005426,-1564462358,-337050314,-1957538839,-1174083298,-637337554,1532626826,1394505155,649744465,173101635,1498989504,-260454146,1532609371,742131594,-454494347,126505419,58008380,-389293336,-2023826474,-1168943394,-112049362,683271167,81764417,916504555,2025851397,1093188044,-543113166,850324228,-1964471616,-63838011,-1610610746,-973208353,-277625558,916635698,-376051707,3153547,509515,1539562473,-1631287720,-1622060461,-2041527162,-383874108,-402214908,-473104379,-1614550039,-2041527162,-628665660,50343611,-2029548838,154950362,-890698893,-997828608,-561553762,-454468778,1381192186,82386571,-823654224,-370881025,1532674996,820560729,-368777013,-369039324,512447272,-1152187159,512294912,1583023337,-396960121,-1974281454,1965833223,-888543221,1543228904,126533682,-739749729,-1638389271,1457424222,-1014345569,58048522,1405888233,-2015229976,-1638376998,678711455,1021843176,-2011991037,-906083577,-1638339467,512318297,-380566295,-1638342093,3022475,54992521,-1022957221,1946118888,-1020204797,-439495189,1392513768,48759221,851663616,1124567232,-109720066,-383874109,3389956,1489230339,-1013005178,1979385832,-1023743741,57871024,-839249175,-1024529946,1979380712,-1025054461,57871536,-839254295,-1025840665,1979375592,-1026365181,57872048,-839259415,-1027151384,1978335208,-903878397,1206435890,-381504772,591184626,753446261,-385554214,1405258284,1543176424,-1178400886,844180972,-64689728,-1177149720,549066395,-1977912020,-1189614634,-397339496,1374224332,521922802,294304082,-259342286,1364250762,-22681517,1810432883,1965046978,-20513274,1022260686,-1978436318,1019382504,1975880236,-1963619831,-25040683,-138718350,-1962953471,1019644616,1958840866,1393376302,1012619636,-1977322230,1019382472,1958840876,9037827,-27924397,1009152603,-1978895091,1948269762,-1339278315,168784909,973829312,974025926,-401967934,-397213597,1935408687,574378930,540804212,552084853,1008759550,1022850080,1008235564,-855345907,-1961855775,-1979389666,-401428280,-489816611,1539425257,-1157625914,-1031142922,125050924,1726480565,-389850144,1352652087,1489578728,1934663582,600107011,57843288,1529070824,1958742723,1124567291,-193606146,-389682343,1621229638,1958804992,-1046550269,45240659,1543161576,855391208,6333120,-386131223,-1073086426,-1057093772,2112422773,-1563885887,1364394080,28491826,1543151336,855387880,6333120,-87234213,1392030952,-927340469,-1341950630,-397229311,-399710330,1263665195,1976084200,844781829,1944634304,417869031,-628664064,512350467,-628685052,-930486197,636027764,-5219647,-796399421,-602806189,-1009088678,-1962079303,-2030030818,1478396890,1977236227,398181121,46369378,-1965520191,-1979706169,-1393390600,841925930,1991987207,46369377,-1965520187,-1979706169,841898232,-1950285305,-29185286,-1325238839,1976434187,-351423044,218872248,3153547,512481927,-633666728,1992011636,46369377,-1965520187,-1979706169,-1393390600,841924906,398151687,46369378,-1965520191,-1979706169,841898232,-1950023161,-29185286,-1325238839,1976434187,-351423043,512447417,-947257298,-27540702,-1023314752,1688227999,1958742532,-923408125,-1966891432,1967143943,-944904189,-1979711303,1020365557,-1977649942,-1664140281,-1729625227,-429070137,-679548888,-429594542,-680073172,702963176,-1957454503,1946500382,47875,-774306913,-690905378,87891593,87498377,512478091,57935163,50331835,991857114,958302469,1541048069,-339725629,1342418946,1493148904,1392520936,1929586920,41936902,1526879720,-953030461,1409256680,-1157425944,175374335,-402495256,-662044133,132645047,-1329374435,-1974316797,216550352,-401902393,1009575390,-402426836,-1031088386,46262355,820577139,1499093960,-1949896727,-1979369698,-1967052093,449284824,1945668293,717238981,450398915,-1966921017,-1950090760,-1979369186,-1966986557,449284824,-336033082,512447454,-628685511,87629449,-253181093,-1957604353,1577400094,-1990795641,1493514014,-488062117,-397258242,-387259030,1994981101,1952013055,-446896045,-447158228,-385649342,1340604512,-397195547,-1041759651,39315711,1946131688,-5642237,1927828291,-402426881,1396965295,1510055144,-397323687,1397752027,1776867975,-396862718,-119013161,1230657792,-1056258678,-1017388171,-397192623,512426053,512296253,512427319,512296251,1515914553,-1957444775,1392851230,-388331694,-1990459430,-2029700834,-3086118,958302555,924748549,-880062203,1543487976,87498377,-1209480309,-842834945,30402744,-385928216,250085833,-402426881,1397948200,-2013338392,1240579034,96142195,-561553846,1943681878,-48330476,512318214,-709163273,-115439287,-338000122,-561553898,-115439274,1238743814,116858505,512350855,1515915005,-81884845,13887494,99111514,-381593344,-964034016,-657407990,-1031081846,-796206896,-216101949,116760582,-216102461,116761094,-216101949,16482566,-2130087392,-1994391317,-1022954722,542163841,116596361,-216101949,16482566,-2130087392,-1994411797,-1022954722,536920961,116596361,-1967027517,-771730162,-1979255538,-1023315256,116590335,-1967027517,-771730162,-1979255546,-1023315256,116592383,-1077506877,-946948096,116596363,-1979217370,570881302,1427016386,1927991808,-337063420,-1010397448,12568204,-1949856072,-1962478818,116760809,572969206,-166819321,-183623162,650185222,-846526584,-1950103922,-1612000791,45210251,-754720045,-489487183,-2130414690,-1994391358,-1962478826,-154498347,16798982,128980084,-2135898078,-173872942,-754732794,-216661526,61915910,-922564574,-388841296,-1324943966,32166658,-1022954730,-956282720,1678064390,1946565632,1008497426,-971476476,33576198,87885511,-960298848,16798982,87885511,-960298688,21766,1929657539,1426519567,208929024,-654966492,-133761374,-983701053,1437664036,-157097482,-1597769722,-1073086379,-318051468,-2135218312,17204226,-1157401600,-885325504,1258517151,-167064693,-92205960,74580168,-1023359046,-768359522,-1614203965,-963843861,-1900543809,198413255,-1955826478,637989662,-174051446,-153056762,1427016400,-165770752,-1964498426,184230652,1081363183,-858601262,512487283,-2010773773,-217645265,-182024186,-775255290,-152448535,16798982,-494860683,116064259,516737,-1411126831,116826364,116604555,1049209587,-1679096077,116596363,-2010150874,-1912146650,2145960902,-48888834,-82429178,722039302,1040644886,116987647,-149487810,-1008475642,-811341741,-397163685,-1017439961,1899921654,57933824,-1023084055,-1979700832,-754980656,323049,263454720,1218580685,1009300480,-1274187262,1963408464,185383175,6819465,2696840,-1982100230,503533598,-1912602438,270436826,1295301381,7085705,-1990769477,-1946128354,-1946128882,520122894,-1157614872,12124696,-1178497536,-1943666566,637534863,1284769735,-536558717,-1898214159,-515315517,-855526149,108521495,-397632581,1676226271,1290649138,-1190767685,-61669366,126397486,1975519811,-1014801418,-1007689712,788479695,1422591744,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,544108393,825110851,1866670128,1769109872,544499815,541934153,1886547779,943272224,917297,1093481778,942502512,1397312561,1375739988,872021,1145130828,1095958562,2245974,1414418243,573308941,827609164,860730,1313821268,1381236749,222709327,1497713408,1129512992,1313162578,808202272,864300,1377718428,-1912602438,270438106,171632645,6952584,378063614,525992030,1456446808,167796384,-1609468480,-1073086358,28576373,11540173,-922877324,1587594078,1958742528,-1564462584,61866078,-1604888893,-1073086358,11826293,-1073080627,1583285108,-58698813,-2147126725,1014121980,3022475,1977289539,1312078611,976100017,1124889639,-906051330,-1070402443,852749147,-1948200732,-1618268456,512295171,251527275,-389021590,244072708,-521469843,751076944,-166677701,106150883,133617667,-864790273,7020169,7151244,6950654,-28111637,-1576569400,548405354,-987843861,-1979684066,117382919,-1073086357,-1602682252,-879958990,7216778,74637114,2133116158,6956680,-2005549046,293071195,539897886,589439250,639968279,421015858,337580816,756100886,1364405269,1315749462,788270769,1960852140,-906082807,-1070402443,-1406270741,-1017423522,508037959,474815819,169615184,41092724,307364214,240090963,209126773,471670303,168496141,1381061532,1946631248,1963801677,1862727178,57999104,-402617368,74711596,963968828,578030652,-1186035781,-29163512,773617865,-160102598,-645144112,1364126137,-508035282,1444842287,250135296,-401675516,250085438,-519182336,619185131,1499093001,1354997083,4800138,5119626,-1275067975,1477496073,1911051203,-1579008,-397163685,146014312,-1017442099,-1962937368,-1010005272,5643915,5643913,1307071388,-1013097728,-33532000,-1974418488,704653582,-33532146,-1979664959,-1979692738,-1342157026,-855002080,1444317968,-17660416,-1261764914,1477496066,367547331,1228835328,1327401472,688818688,-1342130944,-855002080,1380997904,-226045045,-889270530,4800138,281871028,1405311066,-1979666094,-386692369,112459803,267063501,11620947,-141890678,-1275065624,-401552121,1532624924,1173699,2692746,-822162690,28364286,5193354,4825283,1252000747,17229824,646586485,-58720184,1377268743,-2146959174,41026300,-466426160,-1910578441,72262618,-1664919009,-1169141165,11796480,-997582899],251,[-2144803712,225716476,1963508982,1946265612,-350703091,-350506490,-384191998,1347991482,1575554364,1532647439,-1824734307,-1791205260,-583252364,-471316876,1958742734,1019805240,-1171098870,-487194608,-1031679862,-397277613,-399712862,-397162799,260757580,1913649536,1125101826,1599813515,-67062445,763929843,1543205608,-1075713597,49020848,104464560,1906442353,-402426880,-1863843746,-1101806658,179897939,1455816192,149440176,-578137637,-1410858825,-400510956,1582947067,-1392750250,91537418,-352316440,-401755915,1582947047,-32455037,1540257225,1012318443,-1342016243,-623777765,-1605319842,121372744,71042164,-1070464397,-1017593846,-1230123693,-1979665896,-1275049666,-1609511678,-1073086351,512365429,243925071,11862057,281872820,1543376360,-402148413,158728128,167791776,-1291684416,106151536,698353077,-1339540480,-1258130383,-1974251510,-402633186,1448804407,-61798735,-1665135956,839021910,2484416,24485214,-906077874,384362613,-964469248,-1057073136,41040444,-838979408,-1343699083,851663869,-1073065024,548406901,5185162,41225532,-1185866832,162791425,-1023536947,281871028,-1966908583,-1258272498,1210485248,29685248,-847248524,83656832,-973207182,1913060480,1371930114,208940092,1506632168,-397285238,1081392476,752627176,359935036,181226984,-1342016320,-444573312,1374161411,1958559720,-602871773,1949056044,-852432884,1372097113,1958554600,-604182513,-853481428,-346427254,-1101666042,-1963881895,-1979700954,176104645,839546048,181799634,-337218095,687636507,-25162636,-2133167356,208798969,-25111573,-2133953784,-915207943,-1073032822,1048584308,1946615880,1007071580,1951446018,-30886870,1976106697,-2134509908,-906093195,45160939,1948843136,-2134510071,-1040315020,-906098197,1971373558,-2000028158,-1593824986,243793992,378077256,-1053163447,129505908,4956928,1302578310,1327925248,-29693952,1336017780,7268352,-1275049312,-1022309115,2688570,646591604,1346109512,675022708,-1729559692,133988541,1353712757,-192930581,133988354,-855768459,2728528,4728456,4785863,770179072,1405310976,-1292051736,691961895,41166848,414601138,5193354,-1979711303,-855198527,47632,4800138,281871028,-1185738773,243859456,1218445385,-855591936,-574756848,-386348568,-1645676662,-389850116,1534393764,1371406513,1212055552,58000896,-1967319319,-397322708,1081392084,125054012,1506527720,1498540170,-108375215,-8331894,-2146929408,57805051,-1273967744,1527827723,1958456296,-1146755069,747134553,-28964748,83460289,113687922,-1023410097,-3973543,-16757450,1006652214,-401574868,540855166,-1973872525,1978159560,-399739717,1009572422,-401378260,272419686,-1662450830,-393586244,-1151670191,736629108,1340615898,1930443979,-1973790231,1498501840,-2131654054,243863526,-980811701,270852304,-444546550,-790245369,-790245147,281147109,-847248524,1408109184,12048522,1302466340,1311672320,1328449536,-854871040,-3974384,1006655030,-400526292,-1073034502,440163188,646600563,-469106575,423363700,-1973793933,-504868144,-394562374,1009572274,-401050580,-1073034542,646591348,-533069783,-1973802126,-1041739024,-10783558,-402626506,1009572238,-400985044,-1073034578,41222320,173613232,-1578610200,-349342534,-1143609085,752446952,1019908584,1509061408,169928064,1372097256,1958380520,-648746993,-898045908,-646766532,1372097113,-444575399,1745783055,28596480,-1990586163,-2046798314,-19988750,1049252810,45350985,-1017442099,-352276400,548425731,1347637660,1492794856,1745783643,1913058816,41221888,-401996619,281870772,-1017602727,0,-1,-1,-1,-907502512,1397454075,-963882415,-1912602433,922691271,-14286724,637566518,8128199,-1943644936,-1912570354,42053830,-1291816442,1228835459,112896,281872820,12568204,650612224,8259215,2080804646,1522961920,1486707545,-1178736445,-385853792,-1259800974,6678713,1450569226,-385160694,646598772,-499515351,-109033358,-1606192358,-1073086351,-109050508,1396142873,-822152822,1049283326,45350985,146018509,1348145357,1018787816,-1341885396,-402134272,-399714238,-397358746,1479137338,1951973386,-372995582,-1863715310,387258,702031336,-668931901,-919410648,-669456302,-919934932,954778457,1955937465,-670504952,-339725603,-1188435963,883097520,882950912,1958742528,-920917968,695405116,448419411,-466464170,-259268399,498401070,1532937046,1062614211,1280722518,1918266198,-2141816746,-1873377194,-1171920554,-1979697733,509447,-1946837015,-385861858,966790854,-175314688,281871540,1961101904,975079692,1009682432,1058441472,-997566464,-789133058,-1946848279,-385861090,1017122458,-178198272,-33538400,-178722368,-33538656,-179246656,-33537888,-179770944,-33538144,-180295232,180913384,1007842496,-1269533948,1102795520,-1965554944,669604615,28988405,16890114,-100659269,254078190,-102644934,-1020130333,-28253814,-338152761,1962871532,-1143502310,79233089,-722053120,-388963838,663224947,-17309117,-68651574,4300891,-369827351,552122719,1955937464,-688855032,-339725603,-1206786043,1168310192,1168163584,1958742528,-939267874,-680328132,242483624,-922873676,1085538932,-385822488,-1152125780,-1073086394,-1975320204,509447,-191174309,1448431772,12197463,-1898279424,-1593503714,-1005977498,251595124,57999462,-1610602520,-1073086412,921174900,4562944,57982986,520120808,1482514015,113692573,-1593835419,-1073020826,-95283084,6620918,-1173916161,619446369,113766140,102,1405311739,78926417,173019341,-1995672348,-2013251042,-1996473298,1476411158,838874784,169440452,908495076,-1995344896,-2013251810,-1996474066,-1342161642,3515135,-1017423526,4635475,1962950528,-401558521,126353425,4161603,1085540213,-2013264664,1388534535,-335412806,-922827742,1522829976,649411,-1174023240,-346947580,1712753464,1962019328,1694942727,-236192000,-958469949,1915091587,-1075293678,1911041237,189946314,1510438354,-369148951,-790054893,1227519,-147530568,1694955249,141950720,4438608,1492039344,-301972806,1978582154,6404615,-301789972,1712752986,1694942720,180551680,1497451866,420501776,1494243674,1494243600,1499082000,1297757200,1158699329,1494243674,1494243600,1494243600,1666866448,1497451866,1499102224,1494243600,1494243600,-1441769200,1851437402,-1424991909,1499197531,1813010704,1980782940,571496796,-1675463230,512316240,394790121,-970079357,1128464391,-968675448,-2008875001,130433807,-1655153920,-1365710397,-2134680744,41255162,1489175218,1503577222,1522752346,-2084349605,126496451,-1950101258,-2096830178,-1950143549,-2096830178,-1950141757,-1979389666,-1023398009,-967747754,-1526382842,-1090195266,146343232,-492504064,1583307261,-1152298045,145818944,1965047680,-906083571,1556018805,88653573,1421742315,88129285,-1493432143,-906090635,92993909,158598202,427147274,1963001078,-1962636780,-2012944098,-1157615225,250108404,-339725824,1509866247,-117439256,1405311833,3022475,1960512323,-1144825086,1129514323,126486705,1140119016,-160052738,-873976144,-1014801420,-163270647,393535751,133583024,-1341098720,-2146961854,1102055797,1967130614,1531817986,787785192,172165002,-1007323712,1970226720,-13736850,1394606093,1886415211,-13736859,12124173,1376684032,-387272699,-471204163,89308158,130418570,1975519744,-213456891,-487997430,1376684286,-341579515,-1963013912,-1325389522,-387076096,-1209401711,-2041554690,-196810556,5705354,512477694,-1886911255,-1427570638,-997828354,-1963439639,-1325374930,-23861248,1659399600,-22025986,-2013240416,-25106169,-997830568,-385874968,1793654401,6536181,58002748,1006953705,-1023315168,-397211650,-27525491,-17533760,-385402680,-2041051963,6464196,6398147,57982986,-2136151831,41286626,1369571762,-1564410363,-896924336,-2139037312,452264425,-2132705079,1947255542,550076419,167796896,-1325239104,1976109569,1594291721,41221888,243810481,-4913848,-756520784,-400061699,-990446034,-166955775,58032577,-1342165016,-400561153,820510771,-1946651906,-167450338,-2130693753,300419701,-972721407,348166,1638007216,-35133440,-385808442,1069284794,1161477,365757364,89373635,1392513465,365757108,48825203,1587567361,1975519744,-1522565114,-373037451,1637919785,1958804992,-1564462581,1621229665,-439490304,82386571,3246070,-387287679,535298107,1407380225,939549115,-1962052313,-167450338,-2130693753,-1023314597,-1263801879,-1840897,-997830568,-385874968,652803405,-33060864,-401902399,260635997,-44570429,1404768138,-33508091,260587977,365757364,-956480280,-389873401,260767037,1404764341,-1009188091,-1628962380,256255,-1594026775,19662160,-1144848013,126485841,167774150,-1023314752,1929382632,1342621191,-1073086459,-3938109,-1040316534,-1996686104,-51386353,57937722,-2134654966,-579534785,190544,1404814168,16824581,365757108,1403000178,-53745659,-823654520,17286908,1962526974,-2134640639,91555068,1877547186,-1423578709,738545824,-373286399,243796115,1525220689,1594279657,-1991049216,-1962586850,-1996271594,-1962587370,721880078,1225689547,-397258491,1499135652,6332507,1946599434,-1262318078,118869251,-1174369816,12124165,-42645248,-386239158,-1094516618,-1937046189,1621098506,-1665136128,1343059281,55988563,-434706215,1482381662,74776892,957579,1958742534,211061518,1959329280,1343654660,-1262318077,118869250,-1655106958,512428917,-654114768,1478396227,-444536573,-804919216,83656792,414319989,-374688279,-397694357,91599347,-352295776,-1041700861,74825738,48955824,1688338608,-840922624,-607272171,-134091783,-1952648309,-1979407090,-1564396861,-947256153,-578100174,1939734322,767755015,48955649,-469056725,-2143482504,-1961528832,46433246,85417449,192479360,-997990773,501213442,-1577025531,-1514470234,-2146467836,-13443445,-1014969472,54068934,-641275776,-388330669,82314986,1579059653,-400510716,-396636389,393523552,684732904,1389996008,742131594,1290274165,-386798671,-1993748450,235092766,1348331960,55588607,73283327,991857611,-397163773,1815872782,1279003252,1899759220,1362887284,640074587,640034342,640034342,640034342,640034342,640034342,623257126,606348581,589505316,572662306,539042081,522133536,505290527,488447262,471604253,437984027,421075482,404232473,387389208,370546199,353703190,320082964,303239955,286331410,269488145,252645136,219024910,202181901,185273356,168430091,151587082,117966856,101058311,84215302,67372037,50529027,16908802,257,-65536,-16843009,-33686019,-67306244,-84214789,-101057798,-117901063,-134744073,-168364298,-185272843,-202115852,-218959117,-235802127,-269422352,-286330897,-303173906,-320017171,-336860181,-370480406,-387388951,-404232216,-421075225,-454695451,-471538460,-488447005,-505290270,-166993695,-621346183,1030805291,-397198732,1939610768,208332803,259576331,1915222659,57908509,1527528936,-2095730199,243129082,-2094611837,293395194,-1174400024,233373658,57908480,1527520744,471853251,-770968597,-150832740,244186,-1031675181,-628662222,-1659034136,-320273544,485287948,1913181417,-1878151159,-956624919,126484487,-1996905240,108380935,-393213264,1515778153,-2134663845,27198,1394479732,7020229,1526742912,-972720865,27142,1605333737,-306255522,-2007297931,-1157322954,113643520,-385613061,113710376,1189,-2007297853,-1157322954,113643520,-385613061,113710352,1189,-304718653,-419508547,-1264165029,1885290806,1640981257,-864611964,2051237419,-1080764955],252,[1818913110,935134639,1199926534,-978565349,426143783,-1223206686,1340109649,309237645,-1546094845,-687194768,-858949085,-858993460,32076,0,33024,0,33824,0,34632,0,35450,1073741824,36380,1342177280,37187,603979776,38004,-1769996288,38936,-1138753536,39742,1797783552,40558,49872896,41493,1136082944,42298,-727379968,43112,-2065225216,44049,-434047872,44853,1604923808,45667,466206468,46606,-1564725563,1073789233,191576694,-402604962,-954006391,1644216330,2028717484,2055258925,-685328617,-1399798184,-2038943122,1471531527,1746288394,-308097751,-1038364980,344313939,1498505536,430363652,1873131920,537974565,-879810572,-1811228082,1060731128,-1190339071,-1895311562,1733288225,-221655804,-2128354231,1870413893,1891035004,-978474965,1290070813,924389942,-534974907,-2065738045,1813180790,319526458,118945050,-1748075575,1222441024,-1111352645,227146608,1989759157,65302,0,82935808,-1710981067,612571639,1971536739,-1450930739,75662207,-2130706432,-2092060446,-2096008694,2134181108,-2144243176,625304878,1682186531,-2147471316,-1921080122,2051014659,5960464,1316134912,2328,-388717296,-402653184,1525878,199491584,596,1000000000,0,390625,-1769996288,152,256000000,0,-1609612736,655360390,-400093184,167797763,256,-7307264,-1,-32769,-1,1006632959,125909162,1952024700,1999017952,2048794052,2086883422,2121661978,-2144243176,-2130706432,517470981,-1725536890,590633095,-1520574073,1225776006,-1277754749,33117,1644462464,1350468405,2038320164,8366761,193003520,-2089923004,-42065159,-1631386813,294,858927408,926299444,1111570744,1178944579,-1146471494,1927840056,78028810,1014204476,1265788988,77805311,77936383,-1978638104,-2117828382,-162520204,-2147178746,839926760,300345572,1348098904,-1157322520,-1914150377,-768386286,854186634,79987466,77932160,-385649536,-466478959,78063240,-1089340951,865076387,-945029952,-1014956027,1964552168,-1528895229,-945029949,-1014956027,-844358935,-1523154759,914391044,-377486159,-1160969334,1525275015,-2017735420,71821785,870890701,85715225,-1310074489,-1984049915,-385572066,-1093859221,-796157870,1510534888,-2017473085,163047897,-645414707,-2129793559,1971323131,-389952237,-768407341,-393183045,1273496581,138799386,55827447,1476686042,-855533079,146139330,-1556676774,-1523122428,145352708,-353805733,1388546819,1918561015,-371684603,-1009974922,143779923,-1556676774,-1523122428,142993412,1391024731,1977289481,-1489598452,-83442172,770245634,-1558279919,47108,-1845189213,58310667,201326522,-955876901,-16472826,-1556154369,-371684604,-645463766,-2028415000,-397163559,-2091181499,-1950153533,-1962630378,-1023105778,434656156,-1014801638,-389833468,512343723,1743324323,-1096685558,77799049,-854956567,-1961391164,-385875297,-10615987,-16473290,-16472778,-2017079834,413198553,-389817977,57939812,-1012689943,-840377721,-1245695488,-1144599144,-930478938,11874184,-802191293,1942474192,18933763,-645208694,-401591319,861142674,-1558279717,-1987987708,-972774114,67304198,1528038632,50005702,-1047805180,1939006199,-718935805,78363587,-379275334,-1413808122,1689893380,77838930,1914107880,77576707,852331203,-2029458451,50045146,-53965928,-74714485,-695491341,-389816437,-242497482,738065291,-1527561782,-812918133,-1664877503,-389833399,58005180,-844960791,-385648440,-1549724029,1958742788,2030153734,-1006653438,-619986893,1539568501,-661940029,50005702,-1558279934,113689348,-1023147269,-369113880,-909246489,-1242998181,103147523,199842395,309516,-1660974871,-1656547446,1127713436,-1656549493,-1013103716,120109907,1528170216,1361491641,855619048,-1563767360,-1262812367,537380356,-968685814,1793667079,-1597256437,166397093,-437728051,-167218153,450941136,-1019382592,914410957,864027815,-1948387621,-1950213181,449022672,-1010267455,2014708712,-389100038,58201551,-401025559,-806873086,402450712,-1037319285,124784244,-1070463112,2026094846,-1071973895,1977236419,-371510523,-1031077850,77799049,-739714293,-1869573895,113706617,-64347,12238859,-1174177536,1056440319,-628423517,77799049,-516248125,38146420,-1732182524,-180621309,-695472267,986855913,1963129606,1965832937,-796244251,-1912194388,33846272,182250434,-1743752000,9420689,1955702515,-1963982074,-1949766718,-1950131242,1261341683,-1091830780,780923787,-369360036,984416269,1175549153,-268199764,1005585325,-1947240978,-749475362,50005562,742058357,-1404639883,9307706,-1073029259,-1852305804,-218067009,74748326,-789843965,-1949267027,-754587170,-1021962008,168076705,-2131397404,-2147179210,11589581,-1576755550,-1298135894,1958742532,77963746,-663428086,78716555,77926016,-1324449664,-863338492,-1482502358,1931637764,-154958318,78095065,78003848,1877496144,-2141693675,1601387001,568916051,78094357,-1144835493,-1430387554,309508,511245560,1124536749,1945756227,78035730,880019454,79252299,1260376320,-369434037,430772713,-498908409,-166038535,-1191181929,1263206404,-85846025,-16776007,1124496647,1962467907,217377224,-1609724439,-2145123161,77932160,-1526331265,512344836,378078373,-1581054813,-469105499,914419828,176161957,-1578142465,-469105499,-919347084,77805195,-1979406430,1942956748,-2032536051,-1507948065,-1814067708,-527772025,-1264786638,180619904,-1964756260,1959332860,435782470,-1986194830,-1979407562,621061926,-1005944705,-1023105630,1913190784,50719004,854821520,149520603,1948239094,550273232,-863974421,-352067040,-607062002,-590292271,1964033270,-1644961043,-869653127,-233053814,-1021651317,796121226,78059254,-755510026,-989932554,1967268213,1975778846,50785050,1943540438,-1509491188,-804686844,-790965797,287631836,-385046039,635964520,-1314864365,78094852,-166942743,-16472570,116846708,1962869938,-1323398171,-185341948,78716553,-133913413,-1156341272,-386399056,922686362,1592263846,-1509519595,4241668,1359539025,78298104,-1961658392,149718012,-1107103869,79234224,-1510736640,-1190889282,-1430585340,-1375930364,1128466201,276036066,-1962933063,78299124,-1952058372,82573542,-116865917,-402350405,-497478856,-1526270282,158629892,77989631,132712821,77511436,-384622616,-1796730831,-2012777198,-385571042,-16118784,2062091125,-195565550,-768345461,-208929142,549052298,780883200,-1516239709,-337147388,-674105339,1465308881,-266601173,1583285363,-998046485,-772409340,-489434670,2044398564,-1509491190,1560835332,-787765783,-1965829678,-1965651230,1574931187,319819241,1364677625,-397397972,-1739058608,512433785,-75430749,426970317,-472790133,-654056495,-670833711,512297848,1223361699,-351767984,619204659,-954930430,293894,2114373412,-1147898876,-2081946498,-401180397,-10874308,-16473290,-402348746,1515913867,-335688472,31975443,-401464344,-396750098,-622329225,-51451903,-1017421991,-1070409267,-855635479,-972967718,134413062,78120646,632602113,-1946209450,-134771761,-2031595311,-1073063919,113640821,-1979579653,1965440007,-1341658877,1956392252,1948990469,-68662527,-402230280,-169214147,1638120959,-225717709,8796718,-2130021376,1952554237,-269923036,-1662156289,786813281,1781573375,1784638027,1785162335,1785948781,1782606400,-1662468046,4319232,1090530793,1374222197,1370454289,1223186259,1499160321,-385899543,-512429172,1140841449,199875563,12380160,838862313,11987136,-401771107,568857389,1392867857,1527967208,-193533501,72681158,-1534465793,-471214965,1979648520,283699205,-1499413511,1975519748,-154957304,283437264,-454507527,343039487,-1957490453,-2496481,141712731,-1514186925,-1017802748,19710206,-3868989,57991818,-1977561984,-51516970,1048616720,1963459323,149528068,1465097728,1593859304,-1946799269,-133895978,758911858,-688454539,725353963,-389873292,24311794,-855998013,-1174048244,-269778945,702544,-2141527305,-164482838,-538193917,1465057548,484968309,-1878660352,4647056,-164406433,-1108814197,-389856269,-109572008,1956409321,273606705,58021499,-845382679,-402294321,1223360575,-73268048,-1524725246,-1491171324,-1558803708,-1574532604,1087143940,-377435264,501747157,1965388560,-1672812285,58314957,-1342173464,50045448,-1616658381,77701892,-1957276989,-402349290,1516109955,267577539,512427385,-842857309,-385649199,-1499423720,1922055172,-385649615,-1516200954,2025851396,-1677924093,-1157627718,-1964474368,114026747,-1173238296,-2135228416,283961488,-538377356,-2147435621,-1516229141,-1665136124,2133067129,-1174100574,12255232,-77076352,1006937760,-1660521072,-1209410696,115861659,2040388235,-1982073086,-972774626,33749766,853226435,78102244,-31546,312976,91869707,80141047,-1965127040,-958952718,67304198,-855094295,78029014,175423498,168080032,-385583680,-1950150920,-402345698,922743002,512296102,1458046129,-1544516847,2025522342,78816004,-1962628163,1958742784,48940,9162635,-1957485577,-2116090914,50632643,1107391239,24363267,-1962440382,-8168502,1191474182,-1948521657,-1615113279,1526761732,1946615427,-347716092,77446846,506365,-507508052,-2147126021,537173518,168076704,-1509519424,-1156614140,79234206,1125634304,-369434045,117312537,-143326042,-402137623,74714739,58064650,-401710871,244052026,-315489115,-1979407455,1381061629,-487108527,-145175925,1942488035,-628407807,-487106470,24365059,1524237122,65205848,-787647528,-19279397,1963238918,126937347,158990090,77989630,-2081880203,-774778617,-1965716781,-1965061389,200075745,145773507,296747634,-930420598,1223203921,1958742530,-1660126974,192630873,2035814404,-1660294374,69659481,259610631,200730704,48269912,35028705,34401256,986054341,1912845800,-18314740,-352145211,-1245380092,-20382205,-1672455224,1307101490,805815808,-398261899,-2142568216,-93048769,1949187968,1486701313,1352412020,-1274167320,-1274905787,1126664260,130456920,-972719829,-654955257,-989974604,-93124052,-2042414588,1124567492,509507,-1262757497,-838941948,512300665,130417490,130433838,1975909936,-919387144,-838984981,130419829,1377732910,-919387389,-906097941,130418293,61948716,75566729,-1123699517,-639081995,-1769263361,1162149888,77805195,-1057083472,-93064661,126415363,-1556707005,1976368644,-4790051,-1023408186,-1107099207,116064262,-1107032903,-1279328252,1958476804,-1558803614,-964012540,-522984398,-684793722,-1964846166,-294302003,-1157626426,-27720525,809468105,-498924683,-370621448,1366784780,77577811,-1190876225,-201588732,58058917,78756691,1527643624,-1090212930,79234207,-1510736896,-823655564,-1508996596,-1192656892,-386344458,1499136858,-1335777602,-13703159,1345302608,1354825304,1929417960,10742007,1963715416,822593033,805815875,126354155,-922855357,-1101932683,-1547762529,178436,1504048124,1364404715,-401663768,1532625777,1947048424,-1524725493,-1558804220,208922628,-1293418064,-1524725501,-1558804220,-1336190716,1642904067,1358874600,1592283731,800087309,-1057073072,236447824,53409651,771752086,171538,-398113467,-2024272584,126376917,-922855357,1111674485,78965387,1375646697,506198,-133914689,413937404,-102611195,1371756894,-1090517063,-50854753,84978734,1509548615,860967875,45832191,78028894,-1073031378,-1738601356,-1957169109,-281876272,1723590891,210298976,1930243560,199682054,-396931233,527567792,-396330309,1491602574,153901308],253,[2146876240,-401838616,125177175,1477163496,1481687294,-1073063079,1532582083,-1144799222,797574324,646586545,-990509949,973960224,1965732329,80016903,-376831371,-1075310712,-1120766734,976118181,1946157190,-1661107959,1294365793,-310251285,-439262820,1638334254,1970304368,2037414256,2037414256,2037413232,1013988464,130435952,-2094626256,281343492,-968162188,-990501881,1258648836,-315478136,-339735869,805815814,1976106563,-1981234184,805816061,1976106563,-1262763019,537380356,180480083,175742043,1395460038,1527573736,-968687348,-1013108729,-571942707,1124627967,-1157625914,-389872460,309922504,856096953,75736000,75566729,-369271064,2028601137,176285948,1625883513,-1023314529,-805001568,113660136,-801110874,-1157323242,166200491,309517,221767761,78321291,78454411,1526184936,-162797477,77991678,-502631335,-1073456925,77989376,170912195,1462091455,-972773185,753402117,-385649398,125432118,175505162,168006633,-385649153,-620099059,1048585849,1922630822,-1628575485,922702674,922682531,854066341,-396731647,1038617434,1952078603,-1630410493,168076704,-1089898048,609710532,77963903,-880782765,922721407,922682533,48759971,-396666367,477432618,-768388270,-393215813,1515916062,1520242297,-1875055781,12309043,-149755519,1393457565,19916882,-974601590,-799319550,-1559851048,-1526296828,645963524,-1635842907,-1329658765,1381193597,1510020584,-83629989,1408271849,16771154,78780041,77792967,113704960,-2130705243,78786257,1532626803,-555199917,-1308166150,1962934020,-396666347,-1914172383,-87300086,384326490,176351244,1532679915,-1508996413,-1192656892,-638174861,77904796,100234,231304,211599370,25659520,42452480,-1667385344,585630585,-387108352,2040332306,2549763,77465286,57908480,-1023296023,-386378927,1499138426,1405351650,-2096848965,74645807,-135576765,-1152138405,134087839,-347929739,-1966908423,-2147178994,1098094825,-1952654858,-1962630378,168076574,512269531,113640615,-2137520986,-1667399477,-360511879,14385153,-922030798,-338688396,-85796143,91856797,-33393342,91463107,-1444289486,175742465,-738798857,-2147368317,-1312620333,-1509021032,-1427376124,2114479848,47697,-394198853,158665150,77797001,77928073,78028995,1352171564,77989574,186378368,-396265797,1532625432,-401927960,-2017785476,34269281,-1847043238,-18326795,-119937014,451435354,-2144224268,-378398534,-185992803,-1805850212,1356891807,48955824,1436729394,-997828604,47774,72556169,-370670732,991857091,-1817384957,-477374603,72562315,-847956167,44534354,-2091757568,-2013920061,2021720063,178497,-1074557956,-1510800221,-162310565,-16493306,1455296373,82805508,-218103111,1958752933,-263460861,77839967,-67108167,-1956731405,42765076,80118528,-263591850,-1014814741,1125092100,344677955,72681206,-1962510849,-352037354,1892745988,1377077557,1128470411,-1511500968,710499313,-249567035,378080116,-779419602,2095698823,-1981576294,-1962719970,-2147271906,158673983,-386509336,-1813381310,-1700206189,1465275217,-1153846702,-1514208098,78036484,-1185736213,-772276220,-498908393,133585914,-30837440,-30772212,-165251894,561577733,746643573,-2145749496,360057066,-1190878018,-201523193,-1641643868,-1091887100,-350220416,1583307474,58087771,-385583895,1049233088,79234214,2027620864,-2146339551,393349359,-225780086,-466430838,192211938,-774582024,-19672878,-371296817,1049101985,-2081880922,-350172156,-1505851148,75032836,190547,770229083,67812096,-397210389,-1017446398,-1157619736,1048577123,2013332648,-971868921,33859590,-1330675224,-1349916659,-2065167696,184337327,1644412671,116787828,2038432935,1644936707,1913027560,77577992,-352320327,80118537,-1190878273,-1523711998,-389808926,-397211379,-1226307711,99113975,-379889152,-1976633427,-152528889,776163336,-1549596789,46367492,-1559786706,-1014823771,1499092994,1360819272,-2024583086,-142350119,-1959898277,-1618268649,-353894398,-1014801423,-1008801020,1944637523,17426691,-396315973,803735254,1527345671,1274749928,-1020983354,-1257901080,-1258130672,96331783,82314100,1064852474,-989671286,75630122,-654965383,855294696,11659465,75577087,-119871406,-2130276518,-2127102204,180367876,-402230078,971569843,-2130276360,-2127102204,75603972,-1979550999,75604176,41205770,-259340034,-930430462,-1070463880,293193866,1397903696,1527097832,-27764390,-1963886400,717392609,2042954433,75669527,-956671256,512306695,843252562,717654729,161606085,1376027296,75577087,-1037384406,58245378,-386255128,922681383,1374160001,75669752,75564687,1515765770,512427893,1743323986,-20839935,-402425656,1542060559,46500353,-20895038,753437376,83656451,-1597470205,1076102275,-930479499,83814595,41027508,-924315468,1962498820,-397389047,1532688651,1352459914,75568779,178058762,-33393454,-1645083958,116787572,1963197571,718208514,1357286132,1323893624,1347441408,1476714984,-143276802,-402341912,1347946382,-771750983,78047460,-997584782,1622326168,1810421763,106293253,1857752811,-1731949984,1407768579,100198405,293100376,-1040295592,1347637329,1476697576,839052123,-1596131612,-536738686,-1073036034,116787572,1963197571,-1966277118,1489580780,75577087,-2110879664,-144775164,2128874072,-389772795,-1554450113,-1073085311,-1974793099,1949187079,512312065,-1655176366,-1006496398,75638410,-469056470,116787572,1963197571,180420098,-162862912,1206507915,-153056768,62144708,-466484619,-1996192861,-1979416306,78953440,-165673018,57936068,1395328966,1526970088,130418809,-488090835,-968664315,-773312505,75735299,75566731,-1276574856,6875645,-130291629,-2013039525,130433839,78887680,1379830595,-2129229053,75669508,-81009614,1131739179,540805002,708634228,28631668,-397388981,-466425110,-160158404,-227267780,-294378436,376778812,-355145661,-347402125,126372611,1961101912,46433272,173585387,1543206116,-1020983354,-1979415647,-804866612,-2129228824,1393259268,-213522350,-379928526,-963969473,58197292,1391994600,1492507368,1975519824,-922858751,350750328,509688,75564687,-385918487,1836319467,-1549726599,762628,-1576753760,195100685,653733376,-125083029,-1607546230,653681261,-939393013,892974,1797715502,851968610,378220224,-687644050,1881049646,-1562832286,-2135948121,-1996183902,-2013263082,-1342173922,50045444,16497641,-1279590400,2144516,1128466179,-31130910,-352318557,186026913,220105216,-1329581312,78029440,78063240,1408995305,77511505,8390529,1929380793,-12369138,-502762233,-1509490952,1495257348,116793460,1979647134,-1624866811,-1514406396,-1979217404,603980455,-2132508545,663281674,-1869560997,-74913392,-2132745088,477331652,309674652,1975778973,-607061741,77989630,-376436107,1973287786,-18710525,77839958,1178997897,78069386,-2139102335,478732042,-242498722,-1962625816,166220238,-2146864638,-1207654850,132845433,78003840,-402228840,-806878720,75938564,1493455336,76463953,-402356549,-2034564043,73263108,-402522648,-2034563918,70576132,-1157497880,-974650220,-2096925951,1474823403,74799364,-856964610,1978198411,-1009939708,77932160,8841343,-973036056,2131014150,-387144728,468385924,-1516114587,2013036548,180552051,604600768,77963903,1350414520,-1610589208,-1073085274,109053300,-402520922,-1314848671,-2097381372,29685404,1084752501,4843676,-1157008227,937975858,-330766334,77999744,-402427134,65536256,78029041,192115772,-1156588614,-1897364663,-1157174286,-957849036,91594234,77936256,1673249664,33613922,-386856728,115929543,-334960640,-402449943,-1528298579,33614071,-1023163416,-379571525,-256376354,-1523122237,-1556676860,-11081724,922704730,922682531,-102234971,-13834239,300505691,77963758,158973962,1467855039,-1516077276,-2114158588,968821874,-768387205,-394198853,-1564807696,2131344176,2013389288,2067971898,-1556676777,-1523122428,-1277707772,-394175045,1515973733,77805311,77936383,-1157520408,837313097,-10855430,-16473290,-402348746,1515913616,-1142051864,115958354,266058490,-377402949,-1833243611,-2147042550,-387176215,222081111,602407797,126496433,1975519811,-1614822418,309508,-67108680,-1195136013,-1549598720,77964036,-411506493,-1549726087,1958742788,2030153760,-1009191396,-1499409203,1958742532,77963280,125091850,91816368,214161654,-73350399,-33014782,-20382008,-236403768,1393324799,-396268869,-303562546,868441066,-2147435566,-1007964952,-1140860952,292708394,-840431381,1614461951,-1410857102,-260708352,-1523122237,-1556676860,-83442172,-1662515198,-277813248,115891034,79283185,1125634304,-1006968253,-788527943,-498382049,-1887386630,-501219326,-1329872127,150568964,-1185864078,-1430585337,-1977120252,-2013265529,-136166649,126402610,149520473,1948312704,-1440347943,-2955004,259311882,-1209468847,-2013898241,1963982850,-1010834759,-1090216002,-1174666069,92995588,-24868443,-1007164673,-1190888257,116064258,-1190889281,788267012,1135282059,-1946623421,-1018475553,-352015425,77578218,-1413487125,309508,-201531769,-1008826459,-1151904943,-1413544801,309508,1610607080,1371756891,-1413785773,77577988,378137579,512296099,-1950153563,-1962630378,-1023105762,1929301992,9038143,1408096232,851675735,2013570310,2027620924,77963536,1064485675,-1549715595,-339596540,734235408,1912907014,-1960413906,-1559876670,1965322756,-339725796,1206632522,-1863474200,839355280,2030347526,-1524200941,2028210692,167882758,-1339233344,669776383,178513,-1516183929,2042628612,-34109694,-502893145,-352276229,-1341754611,-339736063,184528901,1599732160,-1313094821,-313071612,92967056,41486130,-1185827861,-991231996,-396230725,-1746338062,-972327425,33749766,77792967,784564224,38443,43915822,166249216,-1610057474,-1073085275,-1581052296,-1073019741,-389869192,142147060,914412237,-1015020379,1023714209,175472640,-397159475,-379851301,519569382,-1144847197,870843513,77053696,-1207957319,-201588736,75014827,-1023104350,1929230312,-22877949,-1618274421,-1178402814,-1511522300,-385649923,45743766,-24057600,-2030041927,77577211,1929220072,-25106173,45735815,77840128,1944714119,309758,-402350145,57867636,-1174510103,-1547763710,-27465468,1929208808,-14817021,-385954327,79297880,-1190956288,-1084424190,905905317,-85831857,-1413495979,309508,971510251,77578237,1929381049,77840134,1476395705,1195836815,-1018103070,2046631912,-707935487,-1259797646,-199497229,-1158021120,-628228000,-762396018,1688387634,-1148078844,-1699086336,787647238,1124567212,1976434242,118406388,-1141239091,-470351808,-1020535924,-167771973,108392644,-523041615,-1991518069,-1962922978,-853349917,-157143888,12040961,842663878,49914560,-1577056606,1705116779,2662916,-1996288325,-1157428194,512295802,512426978,-1991573460,1258490398,118405971,-543030096,512316164,-543161120,46202372,-1227846976,1524237056,512481927,394790112,1127712835,-1190862944,-1073086412,-628683148,-628631293,1128470409,-227161858,-654058873,-922856637,-1962592606,-1962614754,3390231,512350723,1130038500,3153545,54861449,616729178,-1966044418,-1966921022,449219288,1945668295,-1385633533,-338492495,37537674,12256114,717392386,-1965520189,-1966662970,-385649672,512339274,-628686070,2891401,53419657,512353163,512426821,-628686800,732773864,1397443546,-444536741,-394273605,-1729561729,-1013978708,1954103840,1713402725,6645106,-257562604,-11351757,-385580746,-133528,466206467,46606],254,[825242929,540160309,1380994883,1112088622,959520845,-522768072,1260446078,1263476802,437512205,250149770,-1964275174,-1074070321,-38796032,179315174,1639588070,1288485632,-1014365516,-288912658,572580938,-319130428,-287161686,327914,-83886336,1939789236,2068477260,-1622771384,-321780303,1085292403,963764432,1990124594,2050127924,95526704,695397586,628155600,-100663368,-611526514,-1047739506,-762523250,-326376821,-24382069,-952957069,-336066699,1959201763,-1595476991,-658865178,-1057034749,-1326532430,-1335630199,-1335761243,-1939806719,-1898934584,12319960,-535380768,1964514281,-436031276,-435900320,-430657528,-423523773,-431968191,-294845,1105463156,-236791798,734235380,-1337858359,-1874598336,574743696,-503089960,61928690,233201894,-661979216,146405514,47616,-1326558994,-527766527,1960328172,-498928639,1958805231,-1898213663,-419450685,31870977,199645360,-393609040,-430962458,-434982902,-431902655,149180427,24383524,-431836940,-431771637,34847243,-1947336272,-1190890978,-75423744,376705588,-371189572,309593329,78698634,-919904026,-662241566,-1070860565,512338931,12190834,1096452,-13909362,-1951771208,92874440,-1960439888,1975595781,536918289,-1031689229,-1014823936,-1593933808,512350837,817366035,-1127182848,330301696,145760486,162537958,-5234202,-1189207578,-13959136,599312270,-930305025,-1074273621,521011264,62838924,280596735,1195877632,505412578,254042852,-1380917110,-460299802,-771444382,183510208,-1545327932,-1716517872,99116006,-1426358248,-75491212,-385649307,951123439,-1869585946,-14393116,117310581,278987794,816861188,704909475,-1341075996,68199200,281928746,68199256,175452196,-956284737,-369145083,809238688,-989984652,41230396,-528088140,-840684976,-1152362480,-1195724800,134265091,-58719824,-1224117200,64535224,-922869579,1916699118,-1911409660,-1912113981,63432923,1347962485,281870516,-344973128,-239,-1,-1,-369098753,-13953639,-218093383,-2142218069,-1162202884,-1174178813,146015194,585943339,-503024188,722070521,-1004344119,-102624908,113647135,-1174011883,-605552382,-1324946666,1978454531,11819223,12193997,735743680,1393003483,-1437254309,921175413,-2130384106,-2130673470,2093482234,113647588,-1341848555,-467540480,1975519777,-419450853,69329953,-1575914239,737870955,-486612279,1799258366,158597124,-1862729794,-99201304,352765684,-22019580,279978470,381240294,-423523840,1795618368,74776836,-655624222,-5239631,113656038,-1342176149,-165550338,17066758,-136134027,568786864,1139160752,1088815280,-1716502298,278946790,1946231812,306085937,712245508,-485067800,-431378402,-1426358175,-927984267,1219518950,-919903770,1625620194,175374396,-1105873688,-393155508,723391947,-1178562880,521011208,-1862339650,-1526718273,-69056697,134661919,-940024064,1409291270,1644611583,-2131361792,17044030,113707637,-113508240,568786608,-1207824198,-1326557867,-1002771455,-789101451,-335433490,980796474,-1174404677,280560149,126365184,-952439664,-331210379,460702522,-488386230,571884,-1974861392,28372704,1975794412,-488583162,-1106777102,-393152241,-320334529,1048649237,305397874,-1612119179,1095680,512436459,-343736301,-754667248,-1144288277,-611449856,-1014905970,1364329472,12144723,30402592,89672821,-1152385008,62455818,-137219328,818577651,-1175002542,-396886013,-85846818,-1107294279,-1976639462,-806861308,1492640276,1946161213,1515805609,179352802,-468402712,1963009032,113647411,-385679339,-393544090,-1477964368,-401952748,-2091379550,-628357436,329457183,355895296,449767424,2062075274,-117129708,345106576,-1899495238,-1948570662,1029395207,108374613,-351000344,-1031696379,-92209024,-478349824,-1265630741,-1898239228,330229978,-2098723980,12747009,1976368642,278929388,1946231808,606200894,-1272846657,-841709056,-3869165,-222683019,-300109821,-18691797,-768344350,378012085,-51904450,-1257803256,150333474,1388185459,417894636,-1173573612,-957479950,27398,-1996480834,-1996481994,-1996481482,-2097119178,914956486,2025783426,-1207493120,-1414851564,-1425997384,606201003,-2094930180,427032829,-402652486,163451910,-236416792,-855591917,1006403606,250345333,306086032,108265728,-402652742,278926310,1963009024,-94377725,1235280938,-1122972416,-1097795165,-1959919616,-1431306154,535568110,91597372,1174951049,-2126166714,1979296253,48101,-335283526,108394664,66586567,-88456381,-123147262,130483829,1128465144,61982347,-1022703406,-1174400606,-1863581183,262705296,243271029,-468713455,-433058719,-422632351,-427773855,-65417824,-1070858453,92931464,1299563570,-997538562,-645139851,-1430723631,-11158870,1642376179,1642475532,-422632304,-1946333343,-1395946505,628474930,-492125558,1961108214,-2032104938,1977885426,-338392572,1950874848,28987358,-455677184,-1329585054,1388575744,651856976,1390216,-939459967,-35123844,-116736488,314960016,-1161602472,-337116926,-660718,737935359,-942108992,-956270586,2047773935,309504,-855591855,-1206947309,-768933375,12305038,113020,1935217613,-840572412,2080434712,-65536,268287,-1073643517,805330944,201332736,1377762048,1397839702,-91491701,283698897,185895699,169047250,-32082716,-29002548,-26577716,-385649204,1499136131,526016095,-2082436401,-2135948350,-1311470866,-2117938684,-1090515230,-100407511,776082571,-301906550,92941898,63079406,522503306,-1337308434,1240198656,79856464,1122894768,-399460542,141819976,-2134799783,-1360297780,-400509110,-260767688,1493559939,-336674422,79856541,1122894256,-400509118,-613089248,-402540726,-747306984,-1960909696,2112482324,-2095805441,-1964243518,-370392352,1569390448,-322360452,-954015606,141870906,-872483358,-16060555,1381123523,539906639,1397051944,541412693,1176641597,1260397105,220813637,-246,-1,519831551,304474195,175432714,510971134,729074942,-1862587157,438209530,471743232,-1946979328,1959943,1711753,-1946544917,989862430,-1962927074,526121735,-1610612022,526057495,994264015,1962967582,-2145481980,978502400,490227269,1082144298,67637280,-15007486,-256,-226,2147426303,85398015,353965074,454037257,33491485,117834771,202050056,-1,51911196,219021846,-1,-14614529,1633705822,1701077858,-39066,-8061065,-9109645,-8978571,842079231,909456435,809056311,151534893,1919252337,1769306484,1566273647,1935802125,1751606884,996961130,1560240167,1986230394,745369186,721366830,469704959,606289953,707157541,727656744,1464926216,1498698309,1347373397,-15893125,1178882881,1263159367,2116172364,1482325247,1312970307,1061043277,553582847,1448432895,1515804759,1750948955,1818978921,1886350957,959985521,909456429,858927403,1212624432,-11796663,1347419981,-11316655,-67108865,1381061456,102651734,281405692,-464494364,216042081,-2040404352,1482811104,-12787574,2062091125,243213314,-394346745,-234878791,1959037614,8775939,-394268799,-2035971538,1971366120,284983377,638060403,-2132213737,386332160,1702167552,578114108,1509110,-161843960,536876806,116788597,1946353687,1378924557,-167651607,50337542,646247284,1299513368,1582600,1517104,1098207804,-380501832,-58719817,-166038768,388374740,1975008256,1679404,646447284,3932185,-1578557580,550827521,-352315354,1937783828,403109392,393480192,91505980,1582720,548469495,520560870,1499094623,-154183589,134223622,-1847000203,386332160,863241216,796218172,7472839,1542066740,1391460576,1263620175,1212632396,303108169,370480147,504961047,572596255,639968291,791555372,1009922352,-1341819591,18999584,-1175812161,-1359871990,-276753803,429976200,-167070720,-1564015644,-1981087719,1640134,1751296,91598578,-186056528,1912749056,1930312716,1992589320,-454491984,1933261824,-10360573,-109885636,-370581573,116785435,1946419223,1967537240,-2145481960,438208768,471763200,1896269312,466452480,-1326858197,1967471616,403603489,548407296,1048584422,1946615881,64535047,-301963872,1574646,-369527544,926744340,12060277,8513906,1021873851,-1149865413,-1125521208,1934048256,386332204,1517552384,91557692,-351338312,1966554208,-434065399,-385495776,993853148,1438320242,9562601,-337044549,386332224,544546816,1509110,1008760067,1007383626,739013710,-378094777,767062507,-1205671094,501960235,1509110,752907523,-378946746,993790955,11535474,-507836437,784924392,1962884311,-229345,116791924,1950351383,386332192,259261184,359809340,293034556,233512964,1023303401,1007055457,738359162,471763744,-386692352,507247715,326369306,512296073,1021902876,775630078,-1327461673,-1330713856,-1155471840,1642332288,-419683248,4766049,34406114,1220108774,1274995200,-430380171,-32315039,825242400,808847885,-16118479,1364458495,1431787038,-387151022,484969971,310016,-2013135384,-1979695066,-2147466970,1526006268,526278493,46816089,-2131719680,2130722598,661971978,1937034494,4261574,83525632,-855764109,-855742092,-1779891339,1959591424,1959591527,1090963047,-1161625344,-1594227726,78708799,547938514,1084755061,-2136471947,-1057094028,-1057046274,-957478900,15878,4261574,-301724672,36366587,1006650016,-2147060544,536887566,-402410301,29032775,23914496,-402652229,-1597832858,-1329397695,28895302,921429684,-169131344,4132480,-397758336,1303642534,129705195,21030912,-402650693,263913786,20244480,-385871429,243269803,-1333788609,25225290,141804980,4261574,-1023365111,-896904880,-523107920,1074185978,109379328,829751359,4138624,1057360112,280034048,-1039474478,-1169028084,1525548018,4130550,-1156418432,-538443756,1961101824,-490132728,-338886914,-396755978,-1973944097,1912649468,-302989749,-1796712816,23497216,-456071984,168092800,8775906,1968045952,-10295037,2028529034,23497216,-1979682072,7203041,-402651205,163250322,9234432,-402650181,230359174,8448000,21227614,1961379186,-62950911,-1409269058,997507108,695550012,-1260334932,-802917884,-1260334880,-803442160,1913173216,-790573034,1912911072,-1260335090,-804752893,1912780000,136360962,-402636506,-389873288,-389873361,-466484880,-1169075517,-919403532,1950394604,-2131107316,-2147466994,-111650215,-322358333,74809512,-336856606,-172833654,-1017488914,-1900008674,2016855512,-1964257024,-982376672,1359065283,-1059927414,1040614489,135492864,-1275052538,-5380089,-1461132662,7792895,263465330,-1962959128,-6690590,-1796676214,6482175,1227676,1375712744,167913145,-502893340,-338886914,-1013097997,216463953,199645264,78758028,-393559853,-1023152092,-973208973,-1979390384,-1979390268,-435215163,719751809,1357435328,-402651461,-863305870,1222693720,-1979324848,-83499324,-1056745383,-436031399,518570762,-1273728512,-14292984,1912621800,4366346,1614569508,-1007156620,4263552,-71042752,45306195,116836659,1971322942,-17309172,-2131528245,-2147466994,645963001,-1652621250,-71083175,-51884002,1041137674,548438016,525869286,1119878351,1397903616,-919402573,-335285062,209027240,243333602,-109051839,-1017554341,1967171820,1091469319,-269803520,92859458,702791,-330629406,108269736,-898249730,1515971563,1168163673,-1597687296,175374407,-402650949,-997523794,-1054162690,-805306429,134358274,-162463958,519767065,1397839442,-1962246424,2019330802,1418454737,1959922440,1961101836,1959591438,1959591487,1582914344,1355751258,-919911698],255,[-1461679380,-502368896,1976303351,30179569,-335944576,1108193299,-301158162,1418416216,-1964228088,-119242528,-2134734246,-974436108,-1337834928,-390533624,-42645501,-336720720,-35,-839844609,972156657,402103538,955422450,-1175227149,1324608755,519319538,1962350836,117242866,1397838366,-1974446250,-773573948,1039174624,74580000,21358936,-1207314712,1049344000,-410976240,-8191952,-1274907344,1489014448,4793994,1168441134,-16,170731576,471402015,117835522,0,173690993,471402015,117835522,0,170731576,1885603455,117833986,0,257052769,421070361,202050818,0,268437504,1073758208,1347430440,1347430440,690825260,689843754,-1291594566,822051584,128976501,-1006717774,1235411082,1662421248,1380982272,-1979399549,727379651,-975663424,1476424734,-2147479367,275907324,-58664701,50950660,133988569,-654114190,-1964756400,-29167932,-301495612,-203273661,-13426856,5127817,6424262,536918272,1912929408,133988363,-1070398348,146081259,-217636680,1611057067,-1610217728,-466485175,378269835,-1031602077,-2071319036,-1561399052,-1976696731,854649988,4891620,976513,-460551378,1276021232,571648,503337151,-205507833,816857771,4800128,-1342016250,1721953855,1532911360,119495257,-1995787057,-402628594,-303366142,6493835,1122944138,1257162122,-1057045366,-1047903506,-812989458,-506335950,1418326411,1648244816,-1962576640,190658,2095628267,63474432,-788509170,-401689351,-1564213310,243990626,1352138828,1319363063,-775386368,-401820423,-782499926,1346866147,-335556632,853510796,-1948003841,244011095,1583284320,525883483,378261255,-1031602077,6725637,242614026,-478093276,-289207777,-385849694,-551223461,-210506800,-269803508,4859530,-1979692640,1593860670,1139366238,-661957633,653706378,-13500342,-523123965,-661994661,1912929408,133988360,-253164684,-1047833855,1946171368,-1963982031,-387765530,-184352654,-855704317,-1336347275,7202848,-872481533,-1930889355,1228832775,125044480,-1174379104,-370277416,-561316121,1048632555,1912733769,1228832792,293012224,64666194,145288272,632355700,1492048050,-8263590,5113347,-259262325,-956378837,-315440386,4861579,-1014305533,4859638,520536067,-1023345792,1465305738,1583326707,1472891587,-1017140237,-2133292291,141690108,1946680448,27715843,-389903533,544538516,-427102165,-806821078,737487871,1976368893,548428021,738183912,1976303357,-10819081,-303309174,1912929408,133988360,-1461124236,1763330,378270603,-1031602077,-333511162,-76217944,27847930,-374473868,-812974553,-242488014,1150019281,-472173744,1277035270,-386211328,-670826801,83656899,-58718094,-385649657,-477494862,-773303984,1509657599,1662421851,113410816,1963043052,-1460864261,-1946455039,-486822973,-36050456,1912929408,133988360,2145977204,-397324287,-74711136,378231641,-1031602077,27847686,-319095947,-76283480,-72694902,-370679225,837352871,76162560,-523058142,-1059926390,1358796521,2025552,-1004345134,1527548454,1971373046,584381965,650185420,-380107640,-1053622921,1347679723,-2142099280,-487129374,29554266,328564,1492159264,-1061432949,50510082,4800128,-1157205498,62456192,-739630585,-1963850774,-792122633,-20118840,-1963428401,1542247139,-1948742973,40495297,-785647477,16892545,-422517040,4800128,-805014778,115855842,-789763553,1961087203,-1262253523,-1947929008,-1963981833,-387765530,-293535616,-276750416,-855760976,-947195531,-2130671384,-31477521,-369789493,-561316645,-1963070229,-389903400,-125107697,-1031679701,-422575871,1048635088,1929773129,-773664763,520505319,-947786454,-472907536,779412432,1354023818,-141826826,-427102165,568910634,1357807872,1357873440,1976368672,-389575951,-276758487,-872538032,-369298059,-561316741,-896865301,-1527556266,-964600225,-947838976,1465262080,-1527526774,-1966907809,-1426892854,13074783,-896903392,-1017140493,-397410124,-125107836,1937783896,-93405690,739240718,-164946304,918937230,-628359044,-523152865,-523116335,1048637443,520486985,1448553586,-156498762,376799427,-2010731350,-2095054971,-822194233,1600056437,-370941369,841415675,648849925,536839474,-745873173,-773265455,-1235855616,-555176956,-154983680,125075650,639971878,637617458,-2010765944,-391380667,-1021116219,1954595574,-1523440118,841359360,639631749,536913288,25528358,1355252512,-1049243906,1195859806,-1662404638,14084347,-326897525,-2131981560,100682046,443686662,76154038,1157645960,536904842,1157645960,-28260733,-336890418,-422473705,-1998060362,13009152,8513568,531689089,-294269186,-1862635841,-310180082,-51016952,521535664,1442873530,571735,1583326963,-1057087884,1242089347,3992949,-1070919052,1053087886,-1064566660,74761995,-756318032,-385301373,-478086377,1371769347,-805305415,182505696,-1963400488,1388534267,-768912559,-1962933831,198779864,-773795373,601394145,-774698023,-1947438111,1515805634,-1977316669,12124484,-2063551808,24443073,-774713095,1944703465,5671154,1352778565,-661957888,653706378,-523173814,-13967151,-1017396477,62148688,6438538,1012404429,1012036616,1012364301,1012364298,-1269140473,112906,-1023536947,4855354,11678581,1964572288,-855460822,4825104,108135484,11994940,146015861,-58060595,721813944,-1978091831,-33535466,1477496266,-17149207,-352144186,16417012,-889260172,11727851,-25104405,-337087208,-402476100,-605355402,84214531,67306243,378208436,-1031602077,78179334,44596853,-2115435659,-1961839616,-1979686122,-331157820,-28645238,-289109308,-443880382,4791946,-1976631510,737645727,1310624707,736874752,721582531,-2147241536,67127614,1048586866,1946615881,-165105117,48794354,719096557,1228833023,74778112,-456129359,-729095213,-288296822,317451984,4863734,-729091958,-393551662,-13443958,28632019,1662421842,130188032,1583307502,522133279,-12537,-1,-400622593,329318931,-3203328,-400622593,278987271,-3203328,-2034959873,1342177994,-1062706460,-2014772363,4241920,364829326,1084788985,633209973,11833593,-855619168,21424144,-1595539280,806117860,-819699226,512451046,737935379,-1898279214,1073789378,-1393297877,-1071357212,-1031728523,-343735296,-1092193008,-393152203,-184942320,434690700,34847239,-1326579536,13690920,-1952097608,-1982125112,-1953460217,1958820615,-398086137,99287226,-1276619856,-399921152,-184942418,12177240,46150176,-69057785,834912266,168636720,825242144,1330776589,822742349,221327416,1380012042,542725193,1128613955,221388875,1380012042,542725193,1128613955,221323339,1061109514,168640319,1642352891,-789127030,-461357020,-423359809,-434065311,-1194371040,-1064435648,1200284714,-754339582,1372097504,-754973511,1506804712,1962903272,-313006074,1385174251,1728497446,637534976,6889100,1730084646,1354979840,-388889423,1476396008,-1878782172,658510887,11996852,-1128066867,2013493251,-387020030,-400687076,278921383,1963009024,-1984890353,-2052037658,362832358,-194976256,-1976646881,-397392380,1012465610,-1007454966,-400622948,-167116677,112399476,-503307800,1976499966,306086133,41222400,28558315,-503312920,1976237822,-486612235,-1013112834,1139193520,-435866696,-423327166,-1973296062,-436007712,-490132639,1976303358,-423326982,145802081,1454989798,-1325473239,-1335761208,-1335761336,-970856707,289542,-154588165,33843974,-136183179,-662019868,1642514608,1085821123,1490587136,-61,-1,-1,65535,0,-2122448896,-1715633755,-8487295,-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,-1006698436,-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,1008205826,2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,402653208,403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,1819017264,108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,1711276128,1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,-864550660,-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,805306480,805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,1727791308,1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,203292792,-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,1727791132,1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,-956432264,1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,1625292918,1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,786552,-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,7692,1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,63500,1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,519766270,184280808,-33065756,-82414388,-1594175713,113639536,-1962934160,-1962906098,-352293866,378141418,243859564,113639534,-352321424,-38,1344207871,-72488878,7079679,117376117,1048772718,1964507246,1816035605,1962979328,-1547687155,1822621806,1879492096,251527424,192217152,4138624,-1173573392,-840039438,-434065380,525883936,-49,-1509949441,602507262,603923455,1476338687,1711219695,1106791920,971790840,788027879,15717096,1860628992,1275022334,-940530433,503316719,820531282,-435441413,551850016,-1005920118,-4979595,568593131,568771594,551952560,7022216,-820028840,-1,-805306369,1397759739,1354256977,-2133291520,16777278,113663860,-1275002880,-1978610417,-400968244,-1269759915,1494273283,-1261292718,-1273967358,168873224,-1342016064,-768388576,399369266,633665114,-1023532683,-545928646,-494218702,2353234,986119770,1523611118,281871028,1734,1510664960,281871028,1734,1532582655,869211992,-1327222062,840420618,-854740764,-963984617,-1963348760,-106436414,-1276628816,-400510727,-3933778,14703594,791753200,942618672,687800114]]},"ibm5160.panel":null,"ibm5160.chipset":{"0":[109,240,109,240],"1":[12,0,null,0,[[false,[0,0],[255,255],[0,0],[255,255],88,null,null],[true,[0,0],[0,0],[0,0],[0,0],65,null,null],[true,[79,78],[255,1],[79,80],[255,1],70,0,null],[true,[16,82],[255,1],[16,84],[255,1],71,0,null]]],"2":[[[0,[19,8,null,9],4,188,0,0,7,11]]],"3":[182,[[[0,0],[0,140],[0,140],[0,0],0,6,48,2,2,true,false,true,195272478],[[18,0],[18,0],[18,0],[121,0],0,4,16,1,1,true,true,true,195272478],[[51,5],[51,5],[51,5],[0,0],0,6,48,2,2,false,false,true,195272478]]],"4":[3,72,null,153,128]},"ibm5160.romHDC":null,"ibm5160.romBASIC":null,"ibm5160.romBIOS":null,"ibm5160.ramLow":null,"ibm5160.keyboard":{"0":[true,true]},"ibm5160.videoCGA":{"0":[false,41,null,null,15,[97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0]],"1":[true,30,63,9,15,[56,40,45,10,127,6,100,112,2,1,6,7,0,0,0,0]],"2":[2,3,6]},"ibm5160.com1":{"0":[0,0,48,0,1,3,0,96,48,[]]},"ibm5160.com2":{"0":[0,0,48,0,1,3,0,96,48,[]]},"ibm5160.mouse":{"0":[false,-1,-1,0,0,false,false,0]},"ibm5160.fdcNEC":{"0":[0,0,128,[0,0,0,0,0,8,2,42,255],0,0,12,[[0,true,0,2,0,8,9,512,512,102,"PC-DOS 2.00 (Disk 1)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json"],[192,true,0,2,0,null,null,null,null,102,"PC-DOS 2.00 (Disk 2)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json"],[192,true,0,2,0,null,null,null,null,102,null,""],[192,true,0,2,0,null,null,null,null,102,null,""]],[["PC-DOS 2.00 (Disk 1)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json",[["/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json",1517270209]]],["PC-DOS 2.00 (Disk 2)","/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json",[["/disks/pc/dos/ibm/2.00/PCDOS200-DISK2.json",-1667401150]]]]]},"ibm5160.hdcXT":{"0":[12,13,[0,2,9,8,1,0,1,50,2,1,50,0,0,11],0,0,null,3,0,-1,[[0,0,false,[1,50,4,1,50,0,0,11],null,2,null,8,10,null,512,512,[["/disks/pc/fixed/win101/10mb.json",-1212644243]]]]]},"ibm5160.debugger":{"0":[61542,61440,1044582],"1":[0,0,0],"2":["d",false,0]}}
                    
                • README.md
                  Compaq Enhanced Color Graphics Board (EGA)
                  ---
                  
                  The Compaq [EGA ROM BIOS](000412-001B/compaq-ega.json) in [000412-001B](000412-001B/) comes from
                  [bitsavers](http://bitsavers.trailing-edge.com/pdf/compaq/firmware/000412-001B_EGA/).
                  
                  	cd 000412-001B
                  	filedump --file=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/000412-001B_EGA/108281-001.bin --output=compaq-ega.json
                  
              • vga
                • 109360-001
                  • 109793-002.hex
                    AA E8 05 F4 E8 02 03 DF 8B 33 8E E8 00 D9 9C 42 
                    45 73 E9 00 C4 40 26 3F 75 B8 F0 C0 65 8C 0A 89 
                    08 B8 00 D8 E4 ED 03 CC BA 03 03 CC B3 B7 F7 02 
                    74 BA 03 07 CB B7 A2 00 26 00 1E 00 3E 00 16 00 
                    4D E8 02 03 8A 49 E8 02 B7 80 89 F9 8B 8B 2E BC 
                    01 EF 09 C6 F0 71 33 0B 74 2E BE 01 EE 01 86 E8 
                    56 FB 75 80 89 06 55 52 D2 03 C4 86 E8 01 DC 5A 
                    D2 07 B4 0B 74 86 E8 01 ED C8 00 8E E8 04 BA 46 
                    06 C3 BA 46 FC FC FC A8 74 B0 EE 02 B0 EE E8 B0 
                    EE C3 03 D2 06 00 74 F6 89 04 12 07 0E 06 00 74 
                    B6 8A 80 04 10 20 10 20 10 20 10 20 00 0E 0F 0F 
                    00 07 08 C0 00 00 00 00 00 00 01 C0 00 00 00 00 
                    08 E8 00 00 00 00 00 00 01 E8 00 00 00 00 00 01 
                    C0 00 00 00 00 00 00 00 00 00 00 00 01 E8 00 00 
                    00 00 00 00 00 00 00 00 E0 00 00 07 08 0E 00 00 
                    01 00 00 01 02 01 04 01 05 05 06 06 06 08 08 07 
                    07 07 11 11 11 11 11 11 11 11 11 11 11 11 11 11 
                    11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 5D 
                    5D 5D 5D 5D 5D 5D 5D 5E 5E 5E 5E 5E 5D 5D 5E 5E 
                    5D 5D 5D 5D 5D 5D 5D 5D 5D 5D 5D 5E 04 14 06 16 
                    0C 1C 0E 1E 2A 3F 52 16 00 C2 32 EE 58 53 DA E3 
                    00 C3 8A 49 8A 10 80 CF DF 1E 00 D1 5B E8 05 DE 
                    72 E8 04 1D B8 72 E8 05 13 49 B2 D0 D0 D0 D0 E8 
                    FF FB C3 84 B0 EE E4 D4 E8 00 03 CC BA 03 17 75 
                    80 01 FC F5 08 10 0F B4 F9 C4 C3 B0 EE EC E0 5A 
                    FA 00 FD FD FD EC FD FD FD FB C4 4A FC 58 1E BA 
                    00 07 8C 3D E8 08 D8 16 5F 4D 36 5F FE 00 8E B8 
                    E8 D8 10 FC FA FC FC 26 05 75 47 F0 16 5F 8B E6 
                    3B E6 77 72 26 1E 5F 1E 5F 0D 70 85 8C 8E 8D 64 
                    33 8E 8D 6A BF 00 AB 36 5F 7C A5 8D 6C BF 01 AB 
                    40 8E 92 3E 00 92 07 C3 BA 00 05 BA 03 0F 42 05 
                    EC 8A D0 D0 D0 0A B3 80 C0 FC 75 8A B0 EE EC 24 
                    8A F6 40 0C 51 06 00 74 80 04 C7 75 B3 B9 C8 D9 
                    20 74 81 80 81 00 72 80 02 0B EB 8A E8 00 E4 0F 
                    1F 81 00 55 C3 BA 00 06 FC 16 00 C2 BF 03 1F 36 
                    05 02 FF 63 01 E8 00 2A E4 03 E8 00 D5 64 2C D0 
                    32 D0 72 8A D0 73 B3 E8 00 D0 D0 9D 09 C3 C7 7D 
                    32 FE E2 8A 1F 53 AC D8 8A FB FA A8 74 87 32 EE 
                    AC C3 81 4A D7 90 EC 08 F8 A8 75 BA 03 8A 87 32 
                    EE 8A 8A E8 5A 87 F6 10 01 5A C3 84 B0 EE C8 00 
                    F8 19 CE B0 EE FA 00 FD FD FD FC A8 F8 01 C3 53 
                    52 E8 03 BA 00 24 B1 D2 98 D8 8A B2 BB 04 ED E0 
                    E4 B1 D2 8A E3 BA 00 80 03 E8 E8 00 FB E0 E4 B1 
                    D2 8A E3 BA 00 10 03 E8 E8 00 FB 5A 5B C3 ED 85 
                    B0 EE 84 B0 EE A9 C3 ED A3 32 BA 00 BA 00 C3 53 
                    52 CA D9 B9 01 C5 5A 5B C3 A8 A8 80 A8 A8 80 80 
                    80 08 15 08 08 25 08 15 08 08 25 08 15 08 08 25 
                    06 03 FC FF BA 00 0A BA 03 02 0F BA 03 05 08 F1 
                    B4 B9 A0 D9 C1 01 8B B0 F3 33 B0 AA 00 0F D3 BE 
                    00 01 8B AC C0 2D C8 E2 B0 24 E8 50 F6 FF CB FE 
                    75 AA F8 FE 75 B0 24 E8 50 F6 FE 74 FE 4E 0C 0C 
                    E8 FE EB F8 1F 33 F6 3C 73 BF 00 DB 04 BA 03 07 
                    01 6D 8A FE 75 FE D0 E2 B0 EB 32 03 2E 87 08 BA 
                    00 02 8B 63 83 06 32 E8 51 D8 D6 A8 75 E8 51 F4 
                    ED 20 58 8D 8B 8B EC 08 0B 93 73 E2 B0 EB 8B FA 
                    43 B0 EE C0 40 EE 87 EC 08 FB EC 08 FB CA C4 8B 
                    EC 08 FB A8 74 E8 51 1A BA C0 0C 72 F8 06 21 FD 
                    F9 3B 72 3B F5 BA 00 03 B9 00 36 00 C6 E8 51 D8 
                    D6 A8 74 E8 51 F4 ED 2C 03 8B 8B EC 01 0E 09 73 
                    E2 EB E8 50 D8 D6 A8 75 A8 74 E8 50 F0 E9 30 9D 
                    F9 BA 00 08 8B 63 83 06 03 BA 03 0F DA 90 EC 08 
                    F8 DA 32 8A EE E0 DA A8 75 EC 24 3C 75 80 10 DA 
                    F2 C0 B4 B0 E8 4F 20 B4 B0 32 B3 B9 00 AD BA 00 
                    09 8B B9 00 C0 B4 87 FB FA A8 74 87 B0 EE C4 8A 
                    87 EC 01 FB FB 30 30 0C C4 E2 F8 1D 80 02 90 E4 
                    B1 D2 D0 D0 B1 D2 0A 0A E8 FC C3 BA 00 36 BA 00 
                    C0 EE C3 84 B0 EE 99 BA 03 01 B0 B9 02 EE FD EE 
                    B0 EE 00 EB EE C7 B0 EE FD BA 03 3C 75 E2 4A 01 
                    42 3F FD EE FD C7 B0 EE FD BA 03 3C 75 E2 4A 00 
                    42 00 FD EE FD C7 B0 EE C9 B9 00 3C 75 E2 BA 03 
                    00 BA 03 03 EC 00 16 F9 03 BA 03 C0 C8 FE 42 E2 
                    F8 06 40 35 F9 04 05 06 07 00 18 00 09 00 63 27 
                    90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 
                    12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 
                    90 A0 1F C7 07 00 00 8E 14 96 A3 00 02 04 06 10 
                    12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 
                    82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 
                    12 14 16 08 0F 00 00 00 0E FF 18 00 01 00 63 4F 
                    82 81 1F C7 07 00 00 8E 28 96 A3 00 02 04 06 10 
                    12 14 16 08 0F 00 00 00 0E FF 18 00 09 00 63 27 
                    90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 
                    12 14 16 01 03 00 00 00 0F FF 18 00 09 00 63 27 
                    90 80 1F C1 00 00 00 8E 14 96 A2 00 15 02 06 10 
                    12 14 16 01 03 00 00 00 0F FF 18 00 01 00 63 4F 
                    82 80 1F C1 00 00 00 8E 28 96 C2 00 17 17 17 17 
                    17 17 17 01 01 00 00 00 0D FF 18 00 00 00 A6 4F 
                    82 81 1F 4D 0C 00 00 85 28 63 A3 00 08 08 08 10 
                    18 18 18 0E 0F 00 00 00 0A FF 18 00 21 00 63 4F 
                    82 81 1F 40 00 00 00 8E 28 96 E3 00 02 04 14 38 
                    3A 3C 3E 01 0F 00 00 00 05 FF 00 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 18 00 00 00 23 27 
                    37 15 11 47 07 00 00 24 14 E0 A3 00 02 04 06 10 
                    12 14 16 08 0F 00 00 00 0E FF 00 00 29 00 62 4F 
                    82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 
                    00 00 00 01 0F 00 0F 00 05 FF 00 00 29 00 63 4F 
                    82 81 1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 
                    00 00 00 01 0F 00 0F 00 05 FF 18 00 09 00 63 27 
                    90 80 1F C0 00 00 00 8E 14 96 E3 00 02 04 06 10 
                    12 14 16 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 
                    82 80 1F C0 00 00 00 8E 28 96 E3 00 02 04 06 10 
                    12 14 16 01 0F 00 00 00 05 FF 18 00 05 00 A2 4F 
                    1A E0 1F 00 00 00 00 2E 14 5E 8B 00 00 18 00 00 
                    00 00 00 0B 05 00 00 00 07 FF 18 00 05 00 A7 4F 
                    17 BA 1F 00 00 00 00 2B 14 5F 8B 00 00 04 00 00 
                    00 04 00 01 05 00 00 00 07 FF 18 00 01 00 A2 4F 
                    82 80 1F 40 00 00 00 85 28 63 E3 00 00 18 00 00 
                    00 00 00 0B 05 00 00 00 05 FF 18 00 01 00 A3 4F 
                    82 80 1F 40 00 00 00 85 28 63 E3 00 02 04 14 38 
                    3A 3C 3E 01 0F 00 00 00 05 FF 18 00 09 00 A3 27 
                    90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 
                    3A 3C 3E 08 0F 00 00 00 0E FF 18 00 09 00 A3 27 
                    90 A0 1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 
                    3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 
                    82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 
                    3A 3C 3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 
                    82 81 1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 
                    3A 3C 3E 08 0F 00 00 00 0E FF 18 00 08 00 67 27 
                    90 A0 1F 4F 0E 00 00 8E 14 96 A3 00 02 04 14 38 
                    3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 67 4F 
                    82 81 1F 4F 0E 00 00 8E 28 96 A3 00 02 04 14 38 
                    3A 3C 3E 0C 0F 00 00 00 0E FF 18 00 00 00 66 4F 
                    82 81 1F 4F 0E 00 00 8E 28 96 A3 00 08 08 08 10 
                    18 18 18 0E 0F 00 00 00 0A FF 1D 00 01 00 E3 4F 
                    82 80 3E 40 00 00 00 8C 28 E7 C3 00 3F 3F 3F 3F 
                    3F 3F 3F 01 0F 00 00 00 05 FF 1D 00 01 00 E3 4F 
                    82 80 3E 40 00 00 00 8C 28 E7 E3 00 02 04 14 38 
                    3A 3C 3E 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 
                    82 80 1F 41 00 00 00 8E 28 96 A3 00 02 04 06 08 
                    0A 0C 0E 41 0F 00 00 00 05 FF 10 2F 3F 3F 3F 3F 
                    2F 10 00 00 00 00 27 37 3F 3F 3F 3F 37 27 1F 1F 
                    1F 1F 31 3A 3F 3F 3F 3F 3A 31 2D 2D 2D 2D 07 15 
                    1C 1C 1C 1C 15 07 00 00 00 00 11 18 1C 1C 1C 1C 
                    18 11 0E 0E 0E 0E 16 1A 1C 1C 1C 1C 1A 16 14 14 
                    14 14 04 0C 10 10 10 10 0C 04 00 00 00 00 0A 0E 
                    10 10 10 10 0E 0A 08 08 08 08 0C 0F 10 10 10 10 
                    0F 0C 0B 0B 0B 0B 01 03 05 07 01 03 05 07 39 3B 
                    3D 3F 39 3B 3D 3F 01 03 05 07 01 03 05 07 39 3B 
                    3D 3F 39 3B 3D 3F 01 03 05 07 09 0B 0D 0F 11 13 
                    15 17 19 1B 1D 1F 21 23 25 27 29 2B 2D 2F 31 33 
                    35 37 39 3B 3D 3F 00 00 00 00 07 07 07 07 00 00 
                    00 00 3F 3F 3F 3F 00 00 00 00 07 07 07 07 00 00 
                    00 00 3F 3F 3F 3F 01 03 05 07 39 3B 3D 3F 05 0B 
                    11 18 20 28 32 3F 80 BF 04 1D 05 FC 73 FB 56 40 
                    8E 06 57 51 8B FC 00 80 49 07 08 00 72 BF A0 C4 
                    F0 C4 E6 00 E6 FF 40 5A 5B 5D 5E 58 02 58 42 90 
                    12 14 15 15 15 15 16 16 18 19 1A 1B 1D 1D 1E 14 
                    1F 22 25 26 2D 2D 2D 2D 2D 2D 27 28 29 2D E0 7F 
                    E4 3C 76 C6 84 18 06 00 00 0E 00 33 8E 8D 7A A3 
                    01 0E 01 C3 0E 00 E1 8A 89 F6 01 1E D8 FF 16 00 
                    E2 2E 97 14 16 00 F2 EE D6 EA 4F 1E 00 FB EF FB 
                    EF D7 D9 E3 E3 FB D7 DD E3 E3 E3 DF D3 E3 0A 75 
                    8A 80 07 C6 F2 C6 74 8B 10 80 30 EB EB EB EB FF 
                    8A 86 80 7F CC C5 74 E8 01 0E 00 D4 8A 80 07 C3 
                    80 20 D3 16 00 33 A3 00 62 8D 50 B9 00 07 AB E8 
                    45 16 00 C2 FA BA 03 20 FB 16 00 C2 EC 1E 00 FF 
                    FB 73 2E 87 14 65 2E 87 14 66 32 89 10 C3 06 53 
                    A2 00 6D 8C 26 37 C4 04 C3 86 D1 D1 03 33 8E AC 
                    A3 00 26 84 AC A3 00 26 4C 8E E8 48 0D E8 48 5C 
                    8E F6 87 80 39 00 80 49 07 08 00 7C BF A0 C7 79 
                    40 26 00 D8 C8 3E 00 20 80 49 07 09 3E 00 76 33 
                    F3 8B 86 E8 00 D1 5A 58 1F C3 EA EA E2 80 FD CA 
                    D8 FF 16 00 F2 E2 80 0F E5 D3 ED 0A 9E 88 88 86 
                    2E AF 14 2E 00 90 87 24 0A 49 88 10 4A 88 11 62 
                    88 05 C3 01 07 20 20 20 30 00 00 20 30 20 20 08 
                    08 08 08 08 08 08 0B 08 08 08 0B 08 08 08 0B 08 
                    08 08 08 80 00 00 80 00 00 00 00 28 29 2E 29 30 
                    30 30 30 06 00 F9 03 66 8B 8B 85 8B 63 89 60 F6 
                    20 05 00 EB 0A 74 80 20 2F 06 00 75 3A 76 8A 8A 
                    FE EB 80 03 17 C0 E6 C4 3A 73 FE 80 03 02 C0 4B 
                    E8 44 CA D6 0A E5 B0 8A EF 46 F8 90 DF FF E3 97 
                    00 EB 1E 00 09 CA 16 00 57 F8 90 DF FF E3 97 00 
                    0E 00 4E 89 00 C3 CB E6 E2 E3 0C D3 2D E3 CC E6 
                    25 C0 15 E2 E6 C3 FB 72 FE 8A 8A 2A EB 8A FE 74 
                    8A FE D0 FE C3 4A F6 32 03 8B 4E D1 03 8A 8A B0 
                    EF 0E E1 C3 C3 D8 07 D8 02 D8 1E 00 4C 32 F7 A3 
                    00 16 00 FA 76 80 07 02 E8 16 00 C8 E0 0D EF E5 
                    0C FB E3 8F 00 9D F8 00 90 1E 00 39 8E 8A 4A 3A 
                    72 8A FE 80 01 DC 0C CA F5 D1 DE DA 04 F5 D1 C6 
                    C2 3E 00 76 80 49 07 6F 0C 3E 00 72 E9 00 C3 EB 
                    EA E5 00 E5 F8 C5 E3 ED C1 E0 C6 8B F6 85 79 F7 
                    F7 D1 03 96 06 00 74 E8 41 06 84 74 3A 73 2A 8A 
                    F3 03 03 FE 75 8A 8A B0 8A F3 03 FE 75 1F 87 80 
                    49 06 04 E1 E2 50 52 8A 32 98 40 F7 03 03 97 F0 
                    BA 01 E2 F6 10 D8 DD C7 20 3E 00 74 47 C7 1F 5A 
                    8B 84 74 3A 73 2A 50 E6 E6 C6 F0 FB CA A4 F0 FB 
                    F6 20 F7 20 CA A4 C5 DD CE E0 8A D0 D0 58 C4 FB 
                    CA AA FB F7 20 CA AA DD CE EA F9 52 EB E5 00 3E 
                    00 75 D1 D1 D1 8B 2A 8A 98 A0 00 E5 C2 F7 5A ED 
                    3E 00 75 2B D1 D1 D1 03 03 03 97 F0 26 00 E5 8A 
                    B6 80 49 13 06 E2 E2 E2 EA F6 04 D8 DD C7 84 74 
                    3A 73 2A 50 3E 00 74 52 CE B8 01 BA 03 02 EF A0 
                    00 E3 8C 8E 8B F3 03 03 48 F5 58 D8 85 F6 96 DA 
                    3E 00 74 BA 03 05 EF C4 32 B0 B4 EF 8A B0 F3 EB 
                    8B 8A F3 03 4E F5 22 02 E7 8A 5F FF AA FD 75 B0 
                    B4 EF 0A 06 00 74 E8 3F C3 53 52 01 3A 76 8A A1 
                    00 FF E3 F0 59 58 00 C7 26 00 FC 76 80 07 0B 51 
                    67 E8 00 C5 32 E8 3E C3 51 04 C3 75 86 8B D1 0B 
                    B4 86 D1 D0 D1 E2 86 AA F6 20 F7 E0 E3 83 50 D2 
                    33 8E C5 7C 8C B5 B1 EB E8 3E C3 1E 00 77 51 13 
                    22 F9 D2 04 AD 01 D0 80 01 D0 E2 8A AA CF 1C C6 
                    01 E0 CE B0 B4 EF 04 D0 03 E2 B0 B4 EF B5 33 8B 
                    33 8E C5 0C 8B 86 86 E8 00 11 DA F3 DA 09 E5 49 
                    72 02 32 41 E1 FF E1 46 F8 90 8B 85 41 E1 FF E1 
                    FC 0E 00 16 1F C3 06 00 74 8B 63 83 06 A8 75 FA 
                    A8 74 26 05 C3 51 55 D1 F6 EA D5 F4 C6 DF 8B 8B 
                    8B F3 74 03 FE 75 32 5E FB EB 5E C6 CD F1 FB 8A 
                    5D 59 C3 C7 26 00 FC 76 80 07 05 77 EB 8B 8B E8 
                    3D DE CD E3 1E 00 16 00 C2 F6 04 0F F0 A8 75 FA 
                    A8 74 8B AB E2 F8 90 C7 26 00 FC 76 80 07 05 2F 
                    EB 8B E8 3C CD 1E 00 16 00 C2 F6 04 0F F8 A8 75 
                    FA A8 74 8A AA 47 E7 C3 D3 FA E9 FC 74 80 07 02 
                    FF E8 3C 8B 85 87 8B 33 80 13 10 EA E5 80 7F FB 
                    72 E9 00 DE 36 01 E4 E1 F0 DA F1 EE 56 04 8A 8A 
                    D0 72 8A 8A D0 72 8A AB C9 EB CD 06 C7 01 DC 5F 
                    C7 4D D0 F4 8E C5 0C A8 74 33 8E C5 7C 24 F6 03 
                    80 03 56 8A AC FB 74 53 08 F8 E0 E0 E7 02 C2 CB 
                    F2 86 0A 74 26 05 89 EB 0A 74 26 05 88 81 00 80 
                    80 03 C7 FE 75 5F 5B 80 06 01 4D AC 82 8A 8B 4A 
                    B7 22 86 8E C5 0C F6 03 52 ED 25 8A BA 03 02 8A 
                    33 86 26 35 FA CC F7 D3 8A BA 03 02 EB BA 03 02 
                    E7 BA 03 03 18 56 33 86 8A 0A 74 26 05 26 05 FA 
                    CC EF D3 5E 5A 75 8A BA 03 02 BA 03 E4 03 C3 06 
                    00 F9 2B 2E 00 26 00 FC 74 77 80 03 3F FF 0F 79 
                    8A E8 00 11 FF EB E8 00 C3 FF 1E 61 80 0F 59 CC 
                    81 B5 E8 00 FC 77 B5 E8 00 43 51 EB 80 06 23 FF 
                    17 35 32 E8 00 00 BB B5 E8 00 6D EB E8 00 65 EB 
                    0A 75 E8 00 C9 37 B5 E8 00 03 11 F8 90 66 24 80 
                    1F C3 66 C3 E3 B1 D2 A0 00 DF C3 66 C5 A8 C4 04 
                    34 90 36 00 7C C5 8A 32 B1 D3 03 80 0F FF C3 03 
                    8A C3 06 E8 D4 F6 E2 F2 01 03 C6 F6 20 03 C6 80 
                    10 C5 BA 03 EA 90 EC 08 F8 EA 24 0A E8 39 C3 FE 
                    B0 EE FE 75 C3 56 93 90 EC 08 F8 BA 03 E8 39 FC 
                    75 FE E8 40 C4 20 86 FB C3 C7 FF 1E 00 FB 75 E8 
                    01 88 F8 80 07 14 FB 77 8B 86 98 26 00 D7 F8 C7 
                    E3 CF 80 07 54 E3 0F 8A 22 F6 86 B0 BA 03 0A 74 
                    B0 B4 EF 02 E1 C4 EF 8A EB B0 8A BA 03 F6 26 1D 
                    D3 02 E1 26 1D 02 E5 B0 32 BA 03 B0 FE EF 14 22 
                    D2 0A 74 26 05 06 22 0A AA C3 C7 FF 1E 00 FB 75 
                    E8 00 8A EB 80 07 0D FA C7 F7 4C 8B 8B 8A E8 00 
                    FC 72 D2 B0 32 BA 03 04 DF 26 2D EB ED E7 FD C8 
                    EE C7 09 8A F6 22 D2 88 10 C3 FC 77 74 D1 73 81 
                    00 D1 D1 D1 D1 03 D1 D1 03 B7 80 06 04 D1 E7 DF 
                    D3 D1 EA EA EA FA D1 E1 D2 C3 F9 06 E2 FA E2 E2 
                    FA 00 0E 00 F9 ED CE E6 94 00 0D 19 41 0A 41 08 
                    31 07 0B 84 B9 01 D1 F8 B9 00 57 E8 FB 5F FE 3A 
                    4A 72 32 FE 3A 84 76 FE EB 84 74 FE EB 32 EB 3A 
                    84 73 FE 8A 62 E8 F6 C3 57 8A 62 E8 F6 00 3E 00 
                    76 80 49 07 0A 3E 00 7D 8A 11 5F B8 06 C9 16 00 
                    CA 0D F8 00 06 00 F9 22 1C 72 8B 8B 63 1E 1F 26 
                    3E 00 C4 04 D1 93 FF 54 F8 90 1F 1F 1F 20 22 22 
                    22 20 20 20 22 22 22 22 22 22 21 22 21 21 22 21 
                    22 22 22 22 22 22 C4 83 06 90 EC 08 F8 BA 03 51 
                    E8 3E 20 FB 90 C4 31 83 06 90 EC 08 F8 BA 03 31 
                    E8 3D C3 00 10 EA C5 BA 03 ED EA 90 EC 08 F8 EA 
                    E8 37 DB FE FE FE 74 87 EC 08 E8 EA E8 36 C3 FE 
                    FE 74 FE 75 B0 EE EB B0 EE EA 90 EC 08 F8 EA 31 
                    E8 36 CC 99 FB 90 03 E0 08 C8 40 8E A0 00 D5 98 
                    C4 E8 E8 D8 C2 EC C0 B4 2E 87 09 F7 C1 95 C3 E0 
                    C2 8B FB FA A8 74 8A BA 03 42 8A 4A DA 87 B0 EE 
                    88 05 90 31 C2 FB FA A8 74 8A BA 03 42 FB 46 C3 
                    D8 C0 FE 00 10 F2 C6 BA 03 ED F2 90 EC 08 F8 F2 
                    C4 42 4A FE FE FE 74 87 EC 08 E8 F2 C4 42 4A FE 
                    FE 74 87 EC CD EA F2 20 FB BE F2 87 B0 EE F2 90 
                    EC 08 F8 F2 31 42 AA C3 66 8B 02 C4 40 8E F6 89 
                    02 03 E7 50 C2 FB FA A8 74 8A BA 03 EB EB BA 03 
                    E8 3E 90 E0 9D BB 00 C3 C8 8A EE 00 00 C4 C9 AC 
                    D8 8A AC C3 F6 89 02 03 9B E8 3D D8 83 C3 D8 FF 
                    FB 73 D1 2E 97 21 90 21 21 C2 FB FA A8 74 B0 BA 
                    03 42 4A 7F 07 E4 C4 FB 90 C2 8B FB FA A8 74 B0 
                    BA 03 42 F6 24 4A 07 E8 E0 C8 E4 DA 87 B0 EE C4 
                    FB 90 E0 C2 FB FA A8 74 8A BA 03 BA 03 00 00 88 
                    01 00 88 03 00 88 02 C3 DB C3 FE E0 CD BA 03 C4 
                    EB EB FE BA 03 AA 00 AA 00 AA E5 C5 C3 C6 EE 90 
                    C6 EC 46 C3 C2 8B EC C0 B0 EE EC 8A 87 EC DA 30 
                    42 24 B1 D2 8A F6 80 80 E1 EC 46 C3 E0 6B BA 03 
                    C4 EB EB BA 03 EC D8 00 8A EB EC C3 E8 3C C8 86 
                    EE C4 C9 E8 3C C4 CF 4D C3 00 30 04 2E C3 03 18 
                    06 00 75 32 B1 D3 D2 80 02 72 09 90 DF 75 BA 03 
                    E3 03 F8 90 D9 C0 D8 16 00 FF 3A 16 01 CF 32 07 
                    16 3F CF 28 16 4E CF 20 16 52 CF 18 16 4D CF 10 
                    16 2E CF 08 16 3E CF 14 D9 46 89 08 85 89 02 84 
                    88 00 C3 07 D2 DA C0 0D 4E 89 7C 8C 7E EB FE 75 
                    06 4E 89 0C 8C 0E 07 4E EB FE 75 8D 4C B9 00 18 
                    C8 09 36 4E 08 EB FE 75 8D 08 B9 00 36 01 0E 01 
                    89 85 8A 04 FF 46 0A 74 B0 80 03 05 8A DC FE 26 
                    84 32 26 1E 00 8B 50 3A 76 8A 26 97 00 C3 0E 2B 
                    A0 00 16 00 C7 8B 58 53 8A 33 C5 08 5E 8B 02 56 
                    0A 74 8D 08 BB 00 04 0B FC 75 8D 08 EB 8D 4C BB 
                    00 C8 0B FC 75 8D 4C EB 8D 7A BB 00 C8 06 5B E9 
                    00 FB 5E B9 01 D2 1F 57 CB 5F 8B 0B 74 53 0B 59 
                    C4 A8 8B 63 58 79 E8 33 CD CD CD FE 8A 75 B8 00 
                    FB 74 8A 05 DB 0A 0E FE 74 B8 00 DF FF 2F EB E8 
                    F0 16 00 C2 FA BA 03 20 FB FF 1E 00 97 00 36 00 
                    08 36 00 97 00 C3 53 A3 00 C8 E0 09 42 24 0A EE 
                    03 8C C4 A8 26 37 5B 86 D1 D1 03 8A 1C 01 F6 13 
                    74 D1 8E 99 0E 00 F1 FF 74 8A FE A2 00 C0 F7 48 
                    16 00 E0 12 E8 34 FB 75 B0 8A EF 4A 8A 84 FE F6 
                    D1 A3 00 00 FB 74 80 20 4E EB 80 07 09 FF E3 FF 
                    66 F9 90 25 26 26 26 26 26 26 87 8A 80 02 01 EC 
                    60 05 E8 46 88 10 88 8A 80 F0 04 EC 0F 46 F8 90 
                    C0 C0 06 2D A3 00 8C 16 C3 03 4D 26 00 C4 75 8A 
                    89 8A 88 BA 10 C4 74 0A 74 04 B2 98 E0 F8 01 E7 
                    CC F4 F4 F6 F7 23 2E 8D 26 EC D9 3E 00 1E 00 46 
                    12 F8 90 80 00 10 00 10 02 16 26 00 03 E0 E4 0A 
                    88 89 C7 10 00 C3 02 11 01 03 E0 06 E8 EE 46 12 
                    F8 90 02 18 01 26 00 01 E0 E4 0A 88 89 C7 10 00 
                    C3 02 16 26 00 00 E0 E4 0A 88 87 C7 10 00 C3 46 
                    12 F8 90 02 18 05 E0 E0 C4 B0 EE EC DF C4 C7 10 
                    00 C3 03 32 FB F3 FB E6 00 E6 B4 00 02 CD E3 C4 
                    08 AC E8 00 E2 5A 46 01 08 7E B4 E8 30 C3 0D 47 
                    15 0A 11 08 0D 07 02 37 0E 95 EB 8A 32 D1 8B 50 
                    D1 86 3C 75 32 B4 E8 30 3C 75 84 74 FE B4 E8 30 
                    3C 75 EB 8B 04 46 02 04 26 93 01 B4 E8 30 DF FF 
                    E3 97 00 EB DF C2 16 00 04 D2 06 02 2F C3 C6 36 
                    00 F2 CE 02 1F 80 49 03 0D 3E 00 74 8A 32 EB B4 
                    E8 30 DF FC 52 56 55 B4 B0 33 8A 4A FE E8 EE 5D 
                    5E 5A 86 C3 3E 00 C4 10 C4 02 C0 33 E3 0F C3 8A 
                    32 8B 83 04 F2 74 86 8B 26 0D ED C7 F2 75 2B 83 
                    06 C7 E8 8A EB A0 00 D1 8B 26 59 A0 00 07 C0 E8 
                    E8 E8 FB 74 24 32 74 86 EB BB FF 5E B8 00 46 F8 
                    90 DB 03 24 FC 7E 8D D0 AB C8 B9 00 36 00 A5 03 
                    8D 84 F3 26 45 B8 1A 39 8B AB 1E 00 FF 8A ED 32 
                    04 80 00 7F 2E 87 2D E0 0F 8A B1 D2 79 B0 F6 89 
                    10 0B C8 06 00 75 FE AA 03 C4 EE EC D8 E8 E8 F8 
                    E0 EC E3 03 04 0B 86 AB D8 0F 26 00 87 8A F6 24 
                    B1 D2 0A 8B 63 83 06 BA 03 30 42 24 D0 D0 0A 8A 
                    AA D5 C0 03 F3 8A 24 B1 D2 AA C0 DF 02 01 06 36 
                    00 5C 8C 0B 74 0C C4 08 C1 CB 02 04 5C 8C 0B 74 
                    0C C5 10 5C 8C 0B 74 0C C4 02 C3 C9 CB 02 20 1F 
                    32 B9 00 AA 46 1B F8 90 3C 72 74 E9 01 E1 00 05 
                    C0 80 BB 00 E9 D3 D1 83 00 E9 03 C3 E9 03 E1 00 
                    05 C0 5E 8B 83 20 E9 03 41 26 3F C4 EC 8B 63 EC 
                    8B BA 03 AA C0 EC 32 B5 BA 03 C4 42 AA C4 FE 75 
                    BA 03 AA E4 19 D6 C4 42 AA C4 FE 75 83 06 E4 C0 
                    B5 FB FA A8 74 87 8A EE EC AA C4 CD 10 F2 A8 75 
                    87 B0 EE D6 D9 30 04 F2 87 8A EE 42 AA 87 FE FE 
                    75 83 06 F2 E4 CE B5 8A EE EC 4A C4 CD F3 C6 BA 
                    03 02 42 8A B0 EE B0 EE EC B0 EE CE B0 EE EC E0 
                    04 4A 05 42 50 01 1E 00 8E A2 FF B0 EE EC 32 B5 
                    8A EE FF AA C4 CD F3 EE 4A 05 58 EE B0 EE 8A EE 
                    C4 B0 EE 58 4A 02 42 C4 4A 8A 20 8B 26 47 EE CE 
                    26 47 EE D6 C2 EC C0 26 47 EE E9 4D 89 02 1E 10 
                    24 AA 0F 8D 49 F3 B9 00 36 00 A4 36 00 02 F3 33 
                    8E BE 00 02 F3 BE 00 02 F3 BE 00 02 F3 BE 01 02 
                    F3 1F D0 72 E9 01 89 04 C7 ED BA 03 AA C7 32 EE 
                    C9 B9 01 AA 00 AA 00 AA F4 8D 81 07 75 33 E9 01 
                    06 07 E9 03 FC 8B 83 42 B8 A0 C0 C4 B0 B4 EF CE 
                    B0 B4 EF 05 00 BA 03 02 B4 B5 42 C4 AC A2 FF E4 
                    CD F2 0F A0 FF 8B 83 04 BF 00 8A B4 B0 EF C4 86 
                    EF C4 C4 75 BA 03 EE C4 B0 8A EF 54 B0 32 EF E4 
                    19 86 EF C4 C4 CD F4 C2 BF 03 E4 10 90 EC 08 F8 
                    FA C4 AC FE FE 74 87 EC 08 EC D7 20 87 EB B4 B5 
                    87 EC FA C4 FB EE FA C4 CD EF EA 8B BA 03 E4 09 
                    86 EF C4 C4 CD F4 37 C4 AC 8B AC BA 03 EE D7 C2 
                    EC C0 AC D0 73 51 77 AC 80 10 CF 08 10 B9 00 3E 
                    00 A5 07 8D 84 F3 8D A8 B9 00 A5 33 8E BF 00 02 
                    F3 BF 00 02 F3 BF 00 02 F3 BF 01 02 F3 07 D0 73 
                    8B 04 BA 03 EE C8 32 EE C9 B9 01 EE 00 EE 00 EE 
                    F4 1C 89 10 5E F8 0F 0F 03 01 7F 7F 7F 0F 0F 0F 
                    88 88 01 01 00 00 00 04 12 31 00 C3 C3 C3 2D 2D 
                    2D 2D 2D 2D 08 0E E4 F0 E6 2F 2E A4 2D C3 90 90 
                    C3 1D 46 00 C7 02 00 89 24 D0 D0 34 04 32 89 00 
                    C3 C3 06 00 F9 01 C3 0D DB 05 21 EB E8 2A C3 53 
                    52 BB 00 DB 01 06 01 01 41 B4 CD 8A 51 03 10 52 
                    D2 34 72 B4 CD B4 CD E8 00 13 C2 D5 ED D2 C6 36 
                    00 DE 12 1A 5A 02 10 88 00 1F 59 58 B0 E8 00 16 
                    0A 33 84 75 B0 B4 CD F6 01 01 5A 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 00 00 00 81 81 BD 
                    81 7E 00 00 00 FF FF C3 FF 7E 00 00 00 00 FE FE 
                    7C 10 00 00 00 00 38 FE 38 00 00 00 00 18 3C E7 
                    18 3C 00 00 00 18 7E FF 18 3C 00 00 00 00 00 3C 
                    18 00 00 00 FF FF FF C3 E7 FF FF FF 00 00 3C 42 
                    66 00 00 00 FF FF C3 BD 99 FF FF FF 00 0E 32 CC 
                    CC 78 00 00 00 66 66 3C 7E 18 00 00 00 33 30 30 
                    70 E0 00 00 00 63 63 63 67 E6 00 00 00 18 DB E7 
                    DB 18 00 00 80 E0 F8 F8 E0 80 00 00 02 0E 3E 3E 
                    0E 02 00 00 00 3C 18 18 3C 00 00 00 00 66 66 66 
                    00 66 00 00 00 DB DB 1B 1B 1B 00 00 7C 60 6C C6 
                    38 C6 00 00 00 00 00 00 FE FE 00 00 00 3C 18 18 
                    3C 7E 00 00 00 3C 18 18 18 18 00 00 00 18 18 18 
                    7E 18 00 00 00 00 18 FE 18 00 00 00 00 00 30 FE 
                    30 00 00 00 00 00 00 C0 FE 00 00 00 00 00 28 FE 
                    28 00 00 00 00 00 38 7C FE 00 00 00 00 00 FE 7C 
                    38 00 00 00 00 00 00 00 00 00 00 00 00 3C 3C 18 
                    00 18 00 00 66 66 00 00 00 00 00 00 00 6C FE 6C 
                    FE 6C 00 00 18 C6 C0 06 86 7C 18 00 00 00 C6 18 
                    60 86 00 00 00 6C 38 DC CC 76 00 00 30 30 00 00 
                    00 00 00 00 00 18 30 30 30 0C 00 00 00 18 0C 0C 
                    0C 30 00 00 00 00 66 FF 66 00 00 00 00 00 18 7E 
                    18 00 00 00 00 00 00 00 18 18 00 00 00 00 00 FE 
                    00 00 00 00 00 00 00 00 00 18 00 00 00 00 06 18 
                    60 80 00 00 00 6C C6 D6 C6 38 00 00 00 38 18 18 
                    18 7E 00 00 00 C6 0C 30 C0 FE 00 00 00 C6 06 06 
                    06 7C 00 00 00 1C 6C FE 0C 1E 00 00 00 C0 C0 06 
                    06 7C 00 00 00 60 C0 C6 C6 7C 00 00 00 C6 06 18 
                    30 30 00 00 00 C6 C6 C6 C6 7C 00 00 00 C6 C6 06 
                    06 78 00 00 00 00 18 00 18 00 00 00 00 00 18 00 
                    18 30 00 00 00 06 18 60 18 06 00 00 00 00 7E 00 
                    00 00 00 00 00 60 18 06 18 60 00 00 00 C6 0C 18 
                    00 18 00 00 00 7C C6 DE DC 7C 00 00 00 38 C6 FE 
                    C6 C6 00 00 00 66 66 66 66 FC 00 00 00 66 C0 C0 
                    C2 3C 00 00 00 6C 66 66 66 F8 00 00 00 66 68 68 
                    62 FE 00 00 00 66 68 68 60 F0 00 00 00 66 C0 DE 
                    C6 3A 00 00 00 C6 C6 C6 C6 C6 00 00 00 18 18 18 
                    18 3C 00 00 00 0C 0C 0C CC 78 00 00 00 66 6C 78 
                    66 E6 00 00 00 60 60 60 62 FE 00 00 00 EE FE C6 
                    C6 C6 00 00 00 E6 FE CE C6 C6 00 00 00 C6 C6 C6 
                    C6 7C 00 00 00 66 66 60 60 F0 00 00 00 C6 C6 C6 
                    D6 7C 0E 00 00 66 66 6C 66 E6 00 00 00 C6 60 0C 
                    C6 7C 00 00 00 7E 18 18 18 3C 00 00 00 C6 C6 C6 
                    C6 7C 00 00 00 C6 C6 C6 6C 10 00 00 00 C6 C6 D6 
                    FE 6C 00 00 00 C6 7C 38 6C C6 00 00 00 66 66 18 
                    18 3C 00 00 00 C6 0C 30 C2 FE 00 00 00 30 30 30 
                    30 3C 00 00 00 80 E0 38 0E 02 00 00 00 0C 0C 0C 
                    0C 3C 00 00 38 C6 00 00 00 00 00 00 00 00 00 00 
                    00 00 FF 00 30 00 00 00 00 00 00 00 00 00 78 7C 
                    CC 76 00 00 00 60 78 66 66 7C 00 00 00 00 7C C0 
                    C0 7C 00 00 00 0C 3C CC CC 76 00 00 00 00 7C FE 
                    C0 7C 00 00 00 6C 60 60 60 F0 00 00 00 00 76 CC 
                    CC 7C CC 00 00 60 6C 66 66 E6 00 00 00 18 38 18 
                    18 3C 00 00 00 06 0E 06 06 06 66 00 00 60 66 78 
                    6C E6 00 00 00 18 18 18 18 3C 00 00 00 00 EC D6 
                    D6 C6 00 00 00 00 DC 66 66 66 00 00 00 00 7C C6 
                    C6 7C 00 00 00 00 DC 66 66 7C 60 00 00 00 76 CC 
                    CC 7C 0C 00 00 00 DC 66 60 F0 00 00 00 00 7C 60 
                    0C 7C 00 00 00 30 FC 30 30 1C 00 00 00 00 CC CC 
                    CC 76 00 00 00 00 66 66 66 18 00 00 00 00 C6 D6 
                    D6 6C 00 00 00 00 C6 38 38 C6 00 00 00 00 C6 C6 
                    C6 7E 0C 00 00 00 FE 18 60 FE 00 00 00 18 18 18 
                    18 0E 00 00 00 18 18 18 18 18 00 00 00 18 18 18 
                    18 70 00 00 00 DC 00 00 00 00 00 00 00 00 38 C6 
                    C6 00 00 00 00 66 C0 C0 66 0C 7C 00 00 00 CC CC 
                    CC 76 00 00 0C 30 7C FE C0 7C 00 00 10 6C 78 7C 
                    CC 76 00 00 00 00 78 7C CC 76 00 00 60 18 78 7C 
                    CC 76 00 00 38 38 78 7C CC 76 00 00 00 00 66 60 
                    3C 06 00 00 10 6C 7C FE C0 7C 00 00 00 00 7C FE 
                    C0 7C 00 00 60 18 7C FE C0 7C 00 00 00 00 38 18 
                    18 3C 00 00 18 66 38 18 18 3C 00 00 60 18 38 18 
                    18 3C 00 00 C6 10 6C C6 C6 C6 00 00 6C 00 6C C6 
                    C6 C6 00 00 30 00 66 7C 60 FE 00 00 00 00 CC 36 
                    D8 6E 00 00 00 6C CC CC CC CE 00 00 10 6C 7C C6 
                    C6 7C 00 00 00 00 7C C6 C6 7C 00 00 60 18 7C C6 
                    C6 7C 00 00 30 CC CC CC CC 76 00 00 60 18 CC CC 
                    CC 76 00 00 00 00 C6 C6 C6 7E 0C 00 C6 7C C6 C6 
                    C6 7C 00 00 C6 C6 C6 C6 C6 7C 00 00 18 3C 60 60 
                    3C 18 00 00 38 64 F0 60 60 FC 00 00 00 66 18 18 
                    18 18 00 00 F8 CC C4 DE CC C6 00 00 0E 18 18 18 
                    18 18 70 00 18 60 78 7C CC 76 00 00 0C 30 38 18 
                    18 3C 00 00 18 60 7C C6 C6 7C 00 00 18 60 CC CC 
                    CC 76 00 00 00 DC DC 66 66 66 00 00 DC C6 F6 DE 
                    C6 C6 00 00 3C 6C 00 00 00 00 00 00 38 6C 00 00 
                    00 00 00 00 00 30 30 60 C6 7C 00 00 00 00 00 C0 
                    C0 00 00 00 00 00 00 06 06 00 00 00 C0 C2 CC 30 
                    DC 0C 3E 00 C0 C2 CC 30 CE 3E 06 00 00 18 18 18 
                    3C 18 00 00 00 00 36 D8 36 00 00 00 00 00 D8 36 
                    D8 00 00 00 44 44 44 44 44 44 44 44 AA AA AA AA 
                    AA AA AA AA 77 77 77 77 77 77 77 77 18 18 18 18 
                    18 18 18 18 18 18 18 F8 18 18 18 18 18 18 F8 F8 
                    18 18 18 18 36 36 36 F6 36 36 36 36 00 00 00 FE 
                    36 36 36 36 00 00 F8 F8 18 18 18 18 36 36 F6 F6 
                    36 36 36 36 36 36 36 36 36 36 36 36 00 00 FE F6 
                    36 36 36 36 36 36 F6 FE 00 00 00 00 36 36 36 FE 
                    00 00 00 00 18 18 F8 F8 00 00 00 00 00 00 00 F8 
                    18 18 18 18 18 18 18 1F 00 00 00 00 18 18 18 FF 
                    00 00 00 00 00 00 00 FF 18 18 18 18 18 18 18 1F 
                    18 18 18 18 00 00 00 FF 00 00 00 00 18 18 18 FF 
                    18 18 18 18 18 18 1F 1F 18 18 18 18 36 36 36 37 
                    36 36 36 36 36 36 37 3F 00 00 00 00 00 00 3F 37 
                    36 36 36 36 36 36 F7 FF 00 00 00 00 00 00 FF F7 
                    36 36 36 36 36 36 37 37 36 36 36 36 00 00 FF FF 
                    00 00 00 00 36 36 F7 F7 36 36 36 36 18 18 FF FF 
                    00 00 00 00 36 36 36 FF 00 00 00 00 00 00 FF FF 
                    18 18 18 18 00 00 00 FF 36 36 36 36 36 36 36 3F 
                    00 00 00 00 18 18 1F 1F 00 00 00 00 00 00 1F 1F 
                    18 18 18 18 00 00 00 3F 36 36 36 36 36 36 36 FF 
                    36 36 36 36 18 18 FF FF 18 18 18 18 18 18 18 F8 
                    00 00 00 00 00 00 00 1F 18 18 18 18 FF FF FF FF 
                    FF FF FF FF 00 00 00 FF FF FF FF FF F0 F0 F0 F0 
                    F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF 00 
                    00 00 00 00 00 00 76 D8 D8 76 00 00 00 CC CC CC 
                    C6 CC 00 00 00 C6 C0 C0 C0 C0 00 00 00 00 6C 6C 
                    6C 6C 00 00 00 FE 60 18 60 FE 00 00 00 00 7E D8 
                    D8 70 00 00 00 00 66 66 7C 60 00 00 00 00 DC 18 
                    18 18 00 00 00 7E 3C 66 3C 7E 00 00 00 38 C6 FE 
                    C6 38 00 00 00 6C C6 6C 6C EE 00 00 00 30 0C 66 
                    66 3C 00 00 00 00 7E DB 7E 00 00 00 00 03 7E DB 
                    7E C0 00 00 00 30 60 60 60 1C 00 00 00 7C C6 C6 
                    C6 C6 00 00 00 00 00 FE 00 00 00 00 00 00 18 18 
                    00 FF 00 00 00 30 0C 0C 30 7E 00 00 00 0C 30 30 
                    0C 7E 00 00 00 1B 18 18 18 18 18 18 18 18 18 18 
                    D8 70 00 00 00 00 18 7E 18 00 00 00 00 00 76 00 
                    DC 00 00 00 38 6C 00 00 00 00 00 00 00 00 00 18 
                    00 00 00 00 00 00 00 00 00 00 00 00 0F 0C 0C EC 
                    6C 1C 00 00 D8 6C 6C 00 00 00 00 00 70 30 C8 00 
                    00 00 00 00 00 00 7C 7C 7C 00 00 00 00 00 00 00 
                    00 00 00 00 00 00 00 66 66 00 00 00 30 00 66 C3 
                    DB C3 3C 00 00 00 C3 FF DB C3 C3 00 00 54 00 DB 
                    18 18 18 3C 00 00 00 C3 C3 C3 C3 3C 00 00 57 00 
                    C3 C3 DB FF 66 00 00 00 C3 66 18 3C C3 00 00 59 
                    00 C3 66 18 18 3C 00 00 00 FF 86 18 60 C3 00 00 
                    6D 00 00 E6 DB DB DB 00 00 00 00 00 C3 C3 3C 00 
                    00 77 00 00 C3 C3 DB 66 00 00 00 00 00 66 18 66 
                    00 00 91 00 00 6E 1B D8 77 00 00 00 18 C3 C0 C3 
                    18 00 00 9D 00 66 18 18 18 18 00 00 00 66 7C 66 
                    66 66 00 00 AB C0 C2 CC 30 CE 06 1F 00 00 C0 C6 
                    18 66 96 06 00 00 00 00 00 00 00 00 00 00 81 81 
                    BD 81 00 00 00 FF FF C3 FF 00 00 00 6C FE FE 38 
                    00 00 00 10 7C 7C 10 00 00 00 3C E7 E7 18 00 00 
                    00 3C FF 7E 18 00 00 00 00 18 3C 00 00 00 FF FF 
                    E7 C3 FF FF FF 00 00 66 42 3C 00 00 FF FF 99 BD 
                    C3 FF FF 00 0E 32 CC CC 00 00 00 66 66 18 18 00 
                    00 00 33 30 30 F0 00 00 00 63 63 63 E7 C0 00 00 
                    18 3C 3C 18 00 00 00 C0 F8 F8 C0 00 00 00 06 3E 
                    3E 06 00 00 00 3C 18 18 3C 00 00 00 66 66 66 66 
                    00 00 00 DB DB 1B 1B 00 00 7C 60 6C C6 38 C6 00 
                    00 00 00 00 FE 00 00 00 3C 18 18 3C 7E 00 00 3C 
                    18 18 18 00 00 00 18 18 18 3C 00 00 00 00 0C 0C 
                    00 00 00 00 00 60 60 00 00 00 00 00 C0 C0 00 00 
                    00 00 00 6C 6C 00 00 00 00 10 38 7C FE 00 00 00 
                    FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 3C 3C 
                    18 18 00 00 66 66 00 00 00 00 00 00 6C 6C 6C 6C 
                    00 00 18 C6 C0 06 C6 18 00 00 00 C6 18 66 00 00 
                    00 6C 38 DC CC 00 00 30 30 00 00 00 00 00 00 18 
                    30 30 18 00 00 00 18 0C 0C 18 00 00 00 00 3C 3C 
                    00 00 00 00 00 18 18 00 00 00 00 00 00 00 18 30 
                    00 00 00 00 00 00 00 00 00 00 00 00 18 00 00 00 
                    06 18 60 80 00 00 00 C6 DE E6 C6 00 00 00 38 18 
                    18 18 00 00 00 C6 0C 30 C6 00 00 00 C6 06 06 C6 
                    00 00 00 1C 6C FE 0C 00 00 00 C0 C0 06 C6 00 00 
                    00 60 C0 C6 C6 00 00 00 C6 0C 30 30 00 00 00 C6 
                    C6 C6 C6 00 00 00 C6 C6 06 0C 00 00 00 18 00 00 
                    18 00 00 00 18 00 00 18 00 00 00 0C 30 30 0C 00 
                    00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 00 00 
                    C6 0C 18 18 00 00 00 C6 DE DE C0 00 00 00 38 C6 
                    FE C6 00 00 00 66 66 66 66 00 00 00 66 C0 C0 66 
                    00 00 00 6C 66 66 6C 00 00 00 66 68 68 66 00 00 
                    00 66 68 68 60 00 00 00 66 C0 DE 66 00 00 00 C6 
                    C6 C6 C6 00 00 00 18 18 18 18 00 00 00 0C 0C 0C 
                    CC 00 00 00 66 6C 6C 66 00 00 00 60 60 60 66 00 
                    00 00 EE FE C6 C6 00 00 00 E6 FE CE C6 00 00 00 
                    6C C6 C6 6C 00 00 00 66 66 60 60 00 00 00 C6 C6 
                    D6 7C 0E 00 00 66 66 6C 66 00 00 00 C6 60 0C C6 
                    00 00 00 7E 18 18 18 00 00 00 C6 C6 C6 C6 00 00 
                    00 C6 C6 C6 38 00 00 00 C6 C6 D6 7C 00 00 00 C6 
                    38 38 C6 00 00 00 66 66 18 18 00 00 00 C6 18 60 
                    C6 00 00 00 30 30 30 30 00 00 00 C0 70 1C 06 00 
                    00 00 0C 0C 0C 0C 00 00 38 C6 00 00 00 00 00 00 
                    00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 78 
                    7C CC 00 00 00 60 78 66 66 00 00 00 00 7C C0 C6 
                    00 00 00 0C 3C CC CC 00 00 00 00 7C FE C6 00 00 
                    00 6C 60 60 60 00 00 00 00 76 CC 7C CC 00 00 60 
                    6C 66 66 00 00 00 18 38 18 18 00 00 00 06 0E 06 
                    06 66 00 00 60 66 78 66 00 00 00 18 18 18 18 00 
                    00 00 00 EC D6 D6 00 00 00 00 DC 66 66 00 00 00 
                    00 7C C6 C6 00 00 00 00 DC 66 7C 60 00 00 00 76 
                    CC 7C 0C 00 00 00 DC 66 60 00 00 00 00 7C 70 C6 
                    00 00 00 30 FC 30 36 00 00 00 00 CC CC CC 00 00 
                    00 00 66 66 3C 00 00 00 00 C6 D6 FE 00 00 00 00 
                    C6 38 6C 00 00 00 00 C6 C6 7E 0C 00 00 00 FE 18 
                    66 00 00 00 18 18 18 18 00 00 00 18 18 18 18 00 
                    00 00 18 18 18 18 00 00 00 DC 00 00 00 00 00 00 
                    00 38 C6 FE 00 00 00 66 C0 C2 3C 06 00 00 CC CC 
                    CC CC 00 00 0C 30 7C FE C6 00 00 10 6C 78 7C CC 
                    00 00 00 CC 78 7C CC 00 00 60 18 78 7C CC 00 00 
                    38 38 78 7C CC 00 00 00 00 66 66 0C 3C 00 10 6C 
                    7C FE C6 00 00 00 CC 7C FE C6 00 00 60 18 7C FE 
                    C6 00 00 00 66 38 18 18 00 00 18 66 38 18 18 00 
                    00 60 18 38 18 18 00 00 C6 10 6C C6 C6 00 00 6C 
                    00 6C C6 C6 00 00 30 00 66 7C 66 00 00 00 00 76 
                    7E D8 00 00 00 6C CC CC CC 00 00 10 6C 7C C6 C6 
                    00 00 00 C6 7C C6 C6 00 00 60 18 7C C6 C6 00 00 
                    30 CC CC CC CC 00 00 60 18 CC CC CC 00 00 00 C6 
                    C6 C6 7E 0C 00 C6 38 C6 C6 6C 00 00 C6 00 C6 C6 
                    C6 00 00 18 3C 60 66 18 00 00 38 64 F0 60 E6 00 
                    00 00 66 18 18 18 00 00 F8 CC C4 DE CC 00 00 0E 
                    18 18 18 18 D8 00 18 60 78 7C CC 00 00 0C 30 38 
                    18 18 00 00 18 60 7C C6 C6 00 00 18 60 CC CC CC 
                    00 00 00 DC DC 66 66 00 00 DC C6 F6 DE C6 00 00 
                    3C 6C 00 00 00 00 00 38 6C 00 00 00 00 00 00 30 
                    30 60 C6 00 00 00 00 00 C0 C0 00 00 00 00 00 06 
                    06 00 00 C0 C6 D8 60 86 18 00 C0 C6 D8 66 9E 06 
                    00 00 18 18 3C 3C 00 00 00 00 6C 6C 00 00 00 00 
                    00 6C 6C 00 00 00 44 44 44 44 44 44 44 AA AA AA 
                    AA AA AA AA 77 77 77 77 77 77 77 18 18 18 18 18 
                    18 18 18 18 18 F8 18 18 18 18 18 F8 F8 18 18 18 
                    36 36 36 F6 36 36 36 00 00 00 FE 36 36 36 00 00 
                    F8 F8 18 18 18 36 36 F6 F6 36 36 36 36 36 36 36 
                    36 36 36 00 00 FE F6 36 36 36 36 36 F6 FE 00 00 
                    00 36 36 36 FE 00 00 00 18 18 F8 F8 00 00 00 00 
                    00 00 F8 18 18 18 18 18 18 1F 00 00 00 18 18 18 
                    FF 00 00 00 00 00 00 FF 18 18 18 18 18 18 1F 18 
                    18 18 00 00 00 FF 00 00 00 18 18 18 FF 18 18 18 
                    18 18 1F 1F 18 18 18 36 36 36 37 36 36 36 36 36 
                    37 3F 00 00 00 00 00 3F 37 36 36 36 36 36 F7 FF 
                    00 00 00 00 00 FF F7 36 36 36 36 36 37 37 36 36 
                    36 00 00 FF FF 00 00 00 36 36 F7 F7 36 36 36 18 
                    18 FF FF 00 00 00 36 36 36 FF 00 00 00 00 00 FF 
                    FF 18 18 18 00 00 00 FF 36 36 36 36 36 36 3F 00 
                    00 00 18 18 1F 1F 00 00 00 00 00 1F 1F 18 18 18 
                    00 00 00 3F 36 36 36 36 36 36 FF 36 36 36 18 18 
                    FF FF 18 18 18 18 18 18 F8 00 00 00 00 00 00 1F 
                    18 18 18 FF FF FF FF FF FF FF 00 00 00 FF FF FF 
                    FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF 
                    FF FF 00 00 00 00 00 00 76 D8 DC 00 00 00 00 C6 
                    C6 FC C0 00 00 C6 C0 C0 C0 00 00 00 00 6C 6C 6C 
                    00 00 00 C6 30 30 C6 00 00 00 00 7E D8 D8 00 00 
                    00 00 66 66 60 C0 00 00 00 DC 18 18 00 00 00 18 
                    66 66 18 00 00 00 6C C6 C6 6C 00 00 00 6C C6 6C 
                    6C 00 00 00 30 0C 66 66 00 00 00 00 7E DB 00 00 
                    00 00 06 DB F3 60 00 00 00 30 60 60 30 00 00 00 
                    7C C6 C6 C6 00 00 00 FE 00 00 FE 00 00 00 18 7E 
                    18 00 00 00 00 18 06 18 00 00 00 00 18 60 18 00 
                    00 00 00 1B 18 18 18 18 18 18 18 18 18 D8 00 00 
                    00 18 00 00 18 00 00 00 00 DC 76 00 00 00 38 6C 
                    00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 18 
                    00 00 00 0F 0C 0C EC 3C 00 00 D8 6C 6C 00 00 00 
                    00 70 30 C8 00 00 00 00 00 00 7C 7C 7C 00 00 00 
                    00 00 00 00 00 00 00 00 24 FF 24 00 00 22 63 63 
                    00 00 00 00 00 00 00 18 FF 18 00 00 2D 00 00 00 
                    00 00 00 00 00 C3 FF C3 C3 C3 00 54 00 DB 18 18 
                    18 00 00 00 C3 C3 C3 66 18 00 57 00 C3 C3 DB 66 
                    00 00 00 C3 66 18 66 C3 00 59 00 C3 66 18 18 00 
                    00 00 FF 86 18 61 FF 00 6D 00 00 E6 DB DB 00 00 
                    00 00 00 C3 66 18 00 77 00 00 C3 DB FF 00 00 00 
                    00 6E 1B D8 77 00 9B 18 7E C0 C3 18 00 00 00 C3 
                    3C FF FF 18 00 9E FC 66 62 6F 66 00 00 00 18 18 
                    18 18 FF 00 F6 00 18 00 00 18 00 00 00 00 00 00 
                    00 81 81 99 7E FF FF E7 7E FE FE 38 00 38 FE 38 
                    00 7C FE 7C 7C 10 7C 7C 7C 00 3C 18 00 FF C3 E7 
                    FF 3C 42 66 00 C3 BD 99 FF 07 7D CC 78 66 66 18 
                    18 33 30 70 E0 63 63 67 C0 5A E7 3C 99 E0 FE E0 
                    00 0E FE 0E 00 3C 18 7E 18 66 66 00 00 DB 7B 1B 
                    00 63 6C 38 78 00 00 7E 00 3C 18 3C FF 3C 18 18 
                    00 18 18 3C 00 18 FE 18 00 30 FE 30 00 00 C0 FE 
                    00 24 FF 24 00 18 7E FF 00 FF 7E 18 00 00 00 00 
                    00 78 30 00 00 6C 00 00 00 6C 6C 6C 00 7C 78 F8 
                    00 C6 18 66 00 6C 76 CC 00 60 00 00 00 30 60 30 
                    00 30 18 30 00 66 FF 66 00 30 FC 30 00 00 00 30 
                    60 00 FC 00 00 00 00 30 00 0C 30 C0 00 C6 DE E6 
                    00 70 30 30 00 CC 38 CC 00 CC 38 CC 00 3C CC 0C 
                    00 C0 0C CC 00 60 F8 CC 00 CC 18 30 00 CC 78 CC 
                    00 CC 7C 18 00 30 00 30 00 30 00 30 60 30 C0 30 
                    00 00 00 FC 00 30 0C 30 00 CC 18 00 00 C6 DE C0 
                    00 78 CC CC 00 66 7C 66 00 66 C0 66 00 6C 66 6C 
                    00 62 78 62 00 62 78 60 00 66 C0 66 00 CC FC CC 
                    00 30 30 30 00 0C 0C CC 00 66 78 66 00 60 60 66 
                    00 EE FE C6 00 E6 DE C6 00 6C C6 6C 00 66 7C 60 
                    00 CC CC 78 00 66 7C 66 00 CC 70 CC 00 B4 30 30 
                    00 CC CC CC 00 CC CC 78 00 C6 D6 EE 00 C6 38 6C 
                    00 CC 78 30 00 C6 18 66 00 60 60 60 00 60 18 06 
                    00 18 18 18 00 38 C6 00 00 00 00 00 FF 30 00 00 
                    00 00 0C CC 00 60 7C 66 00 00 CC CC 00 0C 7C CC 
                    00 00 CC C0 00 6C F0 60 00 00 CC 7C F8 60 76 66 
                    00 00 30 30 00 00 0C CC 78 60 6C 6C 00 30 30 30 
                    00 00 FE D6 00 00 CC CC 00 00 CC CC 00 00 66 7C 
                    F0 00 CC 7C 1E 00 76 60 00 00 C0 0C 00 30 30 34 
                    00 00 CC CC 00 00 CC 78 00 00 D6 FE 00 00 6C 6C 
                    00 00 CC 7C F8 00 98 64 00 30 E0 30 00 18 00 18 
                    00 30 1C 30 00 DC 00 00 00 10 6C C6 00 CC CC 18 
                    78 CC CC CC 00 00 CC C0 00 C3 06 66 00 00 0C CC 
                    00 00 0C CC 00 30 0C CC 00 00 C0 78 38 C3 66 60 
                    00 00 CC C0 00 00 CC C0 00 00 30 30 00 C6 18 18 
                    00 00 30 30 00 38 C6 C6 00 30 78 FC 00 00 60 60 
                    00 00 0C CC 00 6C FE CC 00 CC 78 CC 00 CC 78 CC 
                    00 E0 78 CC 00 CC CC CC 00 E0 CC CC 00 CC CC 7C 
                    F8 18 66 3C 00 00 CC CC 00 18 C0 7E 18 6C F0 E6 
                    00 CC FC FC 30 CC FA CF C7 1B 3C 18 70 00 0C CC 
                    00 00 30 30 00 1C 78 CC 00 1C CC CC 00 F8 F8 CC 
                    00 00 EC DC 00 6C 3E 7E 00 6C 38 7C 00 00 60 CC 
                    00 00 FC C0 00 00 FC 0C 00 C6 DE 66 0F C6 DB 6F 
                    03 18 18 18 00 33 CC 33 00 CC 33 CC 00 88 88 88 
                    88 AA AA AA AA 77 EE 77 EE 18 18 18 18 18 18 18 
                    18 18 18 18 18 36 36 36 36 00 00 36 36 00 18 18 
                    18 36 06 36 36 36 36 36 36 00 06 36 36 36 06 00 
                    00 36 36 00 00 18 18 00 00 00 00 18 18 18 18 00 
                    00 18 18 00 00 00 00 18 18 18 18 18 18 00 00 00 
                    00 18 18 18 18 18 18 18 18 36 36 36 36 36 30 00 
                    00 00 30 36 36 36 00 00 00 00 00 36 36 36 30 36 
                    36 00 00 00 00 36 00 36 36 18 00 00 00 36 36 00 
                    00 00 00 18 18 00 00 36 36 36 36 00 00 18 18 00 
                    00 00 18 18 18 00 00 36 36 36 36 36 36 18 18 18 
                    18 18 18 00 00 00 00 18 18 FF FF FF FF 00 00 FF 
                    FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 DC DC 
                    00 78 F8 F8 C0 FC C0 C0 00 FE 6C 6C 00 CC 30 CC 
                    00 00 D8 D8 00 66 66 7C C0 76 18 18 00 30 CC 78 
                    FC 6C FE 6C 00 6C C6 6C 00 30 7C CC 00 00 DB 7E 
                    00 0C DB 7E C0 60 F8 60 00 CC CC CC 00 FC FC FC 
                    00 30 30 00 00 30 30 00 00 30 30 00 00 1B 18 18 
                    18 18 18 D8 70 30 FC 30 00 76 00 DC 00 6C 38 00 
                    00 00 18 00 00 00 00 00 00 0C 0C 6C 1C 6C 6C 00 
                    00 18 60 00 00 00 3C 3C 00 00 00 00 00 07 8A 87 
                    F6 08 09 CA D2 00 EB 80 60 E9 05 ED C5 BA 03 06 
                    42 24 B1 D2 98 2E 8F 59 5A E9 02 E9 C5 8B 33 D1 
                    D1 D1 D1 D1 D1 D1 D1 53 1E 00 DB 75 B8 00 13 36 
                    00 D1 C0 09 3D 00 03 07 C3 C4 EE FA 03 01 86 EE 
                    81 C0 74 4A 90 F8 C7 8B F7 4C 8B D1 8B 50 A1 00 
                    E7 FF C3 E0 C2 C3 DC C7 8A 8B F7 4C 8B D1 8B 50 
                    A1 00 E7 ED F9 74 77 D1 73 81 00 80 80 E0 E0 E0 
                    E0 D0 E0 E0 C2 FF F9 75 D1 D1 D1 D1 D1 80 06 02 
                    E3 C3 F0 D9 90 50 C0 D8 9C 1E 00 C3 50 16 00 06 
                    00 75 83 06 B0 BA 03 EB 83 04 65 0C EE 65 58 C3 
                    50 16 00 06 00 75 83 06 32 BA 03 EB 83 04 65 24 
                    EE 65 58 C3 52 C4 B0 EE EC 20 E0 01 EF 58 90 52 
                    C4 B0 EE EC DF E0 01 EF 58 90 3C 77 74 3C 77 F6 
                    89 10 0B E8 03 1C 04 EB 8A 88 80 0F FB 74 80 03 
                    12 13 0E 0F 0A 10 04 02 02 09 C3 BA 00 00 BA 00 
                    8A EC C4 C3 EB 2B 3D F6 90 E1 8B E8 FF FB F4 90 
                    12 B8 34 F3 D8 BA 00 B6 BA 00 C3 8A EE BA 00 24 
                    0C EE CB BA 00 24 EE 90 06 1E 00 E3 E8 00 1F 90 
                    36 2E 3E 3E 10 07 62 2C 03 5C FF 06 00 75 8D 4C 
                    B5 8A 88 80 0F F9 74 80 03 19 36 4E 08 11 06 00 
                    75 8D 4C 8D 4C B5 E8 02 D1 E8 00 CD F6 01 39 85 
                    8A 84 FE 8B 60 E8 CB 27 36 4E 13 10 0F 0C 36 3F 
                    10 04 36 2E C9 D9 36 01 0E 01 81 C3 04 02 5B 74 
                    0A 74 FE 3A 75 FE 3A 75 FE C3 43 74 E8 00 02 42 
                    FE EE B0 EE EC C8 4A 49 C3 25 74 B0 EE EC A8 74 
                    42 BF 4A 12 42 FE 8A 4A 18 42 C4 4A 90 52 B8 00 
                    D8 16 00 C2 EC 40 5A C3 11 42 24 EE C3 11 42 0C 
                    EE C3 06 52 FD DB C9 C1 89 0C 26 0E 01 00 33 0E 
                    57 E8 01 5F FF 03 5B 5A 07 C3 06 52 00 53 C4 08 
                    C3 DF 57 DF 8A 0B FD 74 43 E8 F2 C9 8A 0A C9 0E 
                    00 8A 89 85 8A 26 4D 26 55 26 75 26 7D 8B 81 00 
                    75 0A 75 33 8E 26 36 01 8C 0E 8B E8 00 CC 5B 26 
                    5F 26 7F 8C 0B 74 8B 26 6F 80 FF 3B 3A 75 33 26 
                    0D 0E 00 2B E9 8A 01 D2 C5 03 00 8B 0A 75 33 8E 
                    26 36 01 8C 0E 8B E8 00 CC 5A 07 C3 06 52 C4 0C 
                    C3 DF 74 8B 26 6F 80 FF 27 3A 75 26 0D C9 0E 00 
                    8B 01 0E 00 C4 03 C9 D9 36 01 06 01 5A 07 C3 B8 
                    A0 C0 C3 87 B1 D3 D2 D0 D0 86 B1 D3 B1 D3 03 8B 
                    87 86 FE 80 1F C3 FF 20 2B 0B 74 49 ED 87 8B F3 
                    03 87 E2 58 90 B8 A0 C0 C3 B1 D3 D2 D0 D0 86 B1 
                    D3 8B FE 80 1F C7 20 DF F7 0A 74 32 8B B1 D3 03 
                    32 32 8A F3 8A F3 EB 58 90 51 CA C4 B0 B4 EF 04 
                    06 BA 03 05 00 B0 B4 EF 04 02 8A 83 06 BA 03 C0 
                    8A 59 C3 51 CA C4 B0 B4 EF 04 02 BA 03 05 10 B0 
                    B4 F6 87 02 02 0A B0 B4 EF D1 C2 EC C0 B0 EE D1 
                    58 00 51 8B BA 03 04 B4 B0 EF 01 6F BA 03 EE C4 
                    B4 B0 EF D3 85 B9 00 E4 55 E8 FD 39 83 10 E8 FD 
                    13 C2 FB FA A8 75 FB FA A8 74 BA 03 10 AC 46 12 
                    E8 FA 13 E8 FA BA 03 09 32 E8 01 D3 C2 32 EE EC 
                    C0 B4 32 E8 FA EB FB 59 C3 52 1E D8 D9 06 00 75 
                    1E D8 C2 83 1E EC C0 B9 00 E4 DD 46 B4 E8 FA CC 
                    DF FB C6 B0 EE E8 00 29 1F 5A C3 A0 00 16 00 40 
                    00 0F 98 E0 D8 8B 04 8C 8E 2E 97 02 C3 06 2E 00 
                    85 8A A0 00 16 00 36 00 7C C5 10 74 8C 0B 74 8B 
                    8A 14 F9 74 43 C8 F3 AC C0 09 02 20 CC 14 83 06 
                    BA 03 C6 AD C0 28 C8 8A 1E C5 AC FC 74 E8 F9 41 
                    FE FE 75 AC C4 65 FE E8 00 1F D5 0B 74 8A AD E8 
                    34 51 07 C3 AC 45 FE E2 FB 90 AC 39 E8 00 C4 F5 
                    C3 C3 DF 0A DC E3 32 26 01 90 8A BA 03 C5 BA 03 
                    E8 00 C4 74 E8 01 59 FE FE 75 C3 8A BA 03 C5 BA 
                    03 8A AC F8 86 F6 06 03 FB E8 01 C5 C9 DD 90 8A 
                    B1 B5 BF 00 C8 8A EE C9 8A 8A 10 5C F6 06 03 CD 
                    E8 01 C5 4F DE 08 BA 03 C5 BA 03 04 7C 8A 08 C4 
                    74 E8 00 DF FE 46 75 BF 00 C8 8A EE C9 8A 8A F8 
                    5C F6 06 03 83 E8 00 C5 4F DE C9 8D C8 B0 EE C9 
                    B9 00 36 11 8A 8A E8 00 F6 C8 B0 EE C9 B9 00 36 
                    11 E8 00 C4 74 E8 00 77 E2 C3 90 8A 24 80 DE EB 
                    FF 0A 78 8A 80 03 8A 88 D0 D0 8A 80 03 8A 88 D0 
                    D0 8A 2E 87 02 DA C3 56 33 33 50 CD 98 E2 F8 F2 
                    0A 8A 98 E2 F8 F2 29 8A 98 E2 C7 D6 E0 D2 58 C2 
                    FA DA 5E C3 EE 00 C7 EB 8A EE C3 FF FF FF FF FF 
                    FF FF FF FF FF 11 4E 52 01 00 00 00 00 6F 79 69 
                    68 20 4F 50 51 43 6D 75 65 20 6F 70 72 74 6F 2C 
                    31 38 2C 31 38 2C 31 38 2C 31 38 2C 31 38 2C 31 
                    38 2C 31 38 20 52 53 50 41 4E 42 44 43 43 42 41 
                    4C 00 34 20 35 4F 50 51 FF FF 30 2F 38 38 FF AB 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    
                  • 109794-002.hex
                    55 30 76 E8 00 DA 73 E9 00 E8 C0 D8 EA E8 04 49 
                    4D 9D 03 C8 FA 1E 00 80 CF 08 00 8E BB F0 06 01 
                    1E 01 40 8E 32 0B 75 80 01 D4 B0 80 10 60 F9 C5 
                    00 0A B4 B0 80 02 FB 49 88 89 88 87 88 88 89 63 
                    E8 03 B7 E8 02 16 00 0B E8 03 26 00 98 F0 DD 8A 
                    59 D0 73 8B 0C E8 04 F6 ED 05 8A 61 8B B8 1A DF 
                    C8 80 07 05 0E 00 E8 00 0A 74 E8 01 D6 BF E8 01 
                    0A 74 E8 01 ED 05 D6 AB 33 8C 05 06 D8 92 CB E8 
                    B0 EE FA E8 FA FC FC EC 08 0C 16 BA 01 01 BA 46 
                    0E FB B6 32 F6 89 01 0B 06 00 74 B6 EB F6 87 02 
                    02 07 D6 F2 C3 10 20 10 30 10 20 10 30 0F 0F 0F 
                    10 08 F4 00 00 00 00 00 00 00 9C 00 00 00 00 00 
                    F4 00 00 00 00 00 00 00 B6 00 00 00 00 00 1A E0 
                    00 00 00 00 00 00 00 00 00 00 00 1A E0 00 00 00 
                    00 00 00 00 00 00 00 00 FF 0F 00 00 02 FF 00 3F 
                    10 08 00 00 00 02 00 04 00 02 00 01 05 00 01 00 
                    02 06 0C 0C 0C 0C 0C 0C 0C 8C 4C 0C 0C 0C 0C 0C 
                    0C 8C 4C 8C 4C 4C 4C 4C 4C 4C 4C 8C 4C 4C 34 D4 
                    D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 
                    D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 1E 00 10 02 12 
                    08 18 0A 1A 00 15 50 8B 63 83 06 C0 5A C3 8B 81 
                    0F 8B 2E BF 01 1E 00 E3 0A 88 10 E8 54 C3 78 E8 
                    03 22 65 72 E8 04 18 76 72 A0 00 07 E8 E8 E8 D2 
                    B9 E8 02 BA 00 01 32 BA 03 22 75 80 02 B4 E8 00 
                    03 CC 80 03 73 B0 E8 02 03 8A 98 50 0F 42 8A B0 
                    EE EB FD FD FD FC FD FD FD FC 86 EE 80 5A C3 06 
                    84 B0 EE C8 00 75 8E 8B 70 EB 8D 7A 8B B8 C0 C0 
                    00 8E B9 00 AC FC FC FC 3A FB 24 E2 8B 70 26 1E 
                    5F 1E 5F 0D 18 8A E5 3A E5 76 B0 E8 01 C8 D8 16 
                    01 DB C3 36 5F 40 A5 8D 6E BF 00 AB 36 5F 0C A5 
                    BB 00 C3 8D A8 AB AB 1F 1E 84 B0 EE CE B0 EE B0 
                    EE 4A E0 E4 E4 FC E0 50 E4 80 C0 40 F8 0B 42 4A 
                    F9 E0 C7 75 B3 F6 89 01 26 CC F6 80 19 52 00 8E 
                    E8 00 12 C1 00 F9 D0 EF CC B0 EF 05 C3 E2 32 B0 
                    EF C3 3E 00 AA 1E 84 B0 EE 8B 63 83 06 C8 0E 8D 
                    C2 B4 32 B3 B9 00 3D 73 32 B9 00 33 D0 B3 E8 00 
                    D0 C5 E8 13 C5 E8 02 60 19 9C ED D4 73 8A 0A E8 
                    00 ED C7 CE C4 C3 52 8A AC F8 90 EC 08 F8 D7 C0 
                    42 86 E8 5A 87 FB FA A8 75 EC 01 FB C2 EC D0 D7 
                    C0 42 F8 D8 5E 4A D7 C2 74 F9 5B BA 00 0B 8C 3D 
                    C0 74 BA 03 09 42 EB EC FD FD FD FB 80 74 F9 50 
                    51 50 10 58 84 EE F0 04 E8 8B 2E 87 05 B0 32 8A 
                    80 60 05 EC CC 0F FA A8 74 BA 03 46 E2 8A 80 0C 
                    02 EC CC 0F FA A8 74 BA 03 2A E2 F9 59 58 33 BA 
                    00 05 BA 00 00 E8 02 33 E8 02 C0 85 EE 84 EE 50 
                    51 8B E8 52 00 E8 52 59 58 80 A8 A8 A8 A8 A8 80 
                    80 08 08 08 1B 08 08 08 08 1B 08 08 08 08 1B 08 
                    1E E8 52 BB FF 84 B0 EE C4 B0 B4 EF CE B4 B0 E8 
                    50 02 00 8E 8E BF 00 CB 00 AA FF FF B0 24 E8 50 
                    01 BF 00 CB FE 75 FE AA F6 FF 0F BA 33 33 8B AC 
                    C0 16 E2 AC C0 0E 00 0F A0 33 AC C0 0E C8 E8 00 
                    A0 BA F9 01 07 C3 FF D0 10 03 04 32 B9 00 CE B4 
                    B0 E8 50 3C C7 0A C3 E0 F1 0F 09 FF DF 8A EB C3 
                    84 B0 EE 36 00 C6 B9 00 A4 8B 8B EC 08 10 AA 73 
                    E2 B0 EB E8 51 D8 D6 A8 74 E8 51 F4 ED 20 41 CA 
                    BA 00 30 33 BA 00 FB CA A8 75 FA A8 74 87 8A EE 
                    D1 A8 75 EC 08 FB 48 B9 BA C2 E8 00 03 EB B0 E8 
                    FD C3 C1 03 C2 C3 84 B0 EE 14 8B 63 83 06 18 8B 
                    8B EC 01 0E 1E 73 E2 EB E8 51 D8 D6 A8 75 E8 51 
                    F4 ED 17 EE 8B 8B EC 08 CF 01 0D F0 73 E2 B0 E8 
                    FD C3 84 B0 EE 1E 00 C3 B9 00 C0 B4 87 FB FA A8 
                    74 87 B0 EE C4 8A 87 EC 01 FB FB 30 00 5D C4 E2 
                    8B BA 03 0F 3F 26 B0 EE 09 DB FF 0F 50 E8 4F 84 
                    B0 EE DE 03 BA 03 0F DA 90 EC 08 F8 DA 32 8A EE 
                    E0 DA A8 75 EC 24 3C 75 80 10 DA EB B2 EB B2 80 
                    30 04 EC E4 E4 04 E8 C4 C2 EA F9 FA 43 B0 EE 40 
                    32 EE FB BA 00 04 E8 4F C8 B0 EE 00 FD 42 E2 4A 
                    42 3F EB EE 00 BA 03 01 B9 02 C9 EC 00 69 F9 B0 
                    EE B0 B9 02 E2 BA 03 00 B9 02 C9 EC 3F 49 F9 B0 
                    EE B0 B9 02 E2 BA 03 FF BA 03 03 EC 3F 29 F9 C7 
                    B0 EE C9 B9 00 3C 75 E2 B9 00 C8 32 FE EE C0 EE 
                    FD EB B0 E8 FC C3 08 01 02 03 28 08 08 03 02 2D 
                    28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 10 00 28 08 08 03 02 2D 
                    28 2B BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 
                    50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 10 00 50 08 10 03 02 5F 
                    50 55 BF 00 06 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 10 00 28 08 40 03 02 2D 
                    28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 
                    11 13 15 17 00 00 00 00 30 00 28 08 40 03 02 2D 
                    28 2B BF 00 00 00 00 9C 8F 00 B9 FF 13 17 04 07 
                    11 13 15 17 00 00 00 00 30 00 50 08 40 01 06 5F 
                    50 54 BF 00 00 00 00 9C 8F 00 B9 FF 17 17 17 17 
                    17 17 17 17 00 00 00 00 00 00 50 0E 10 03 03 5F 
                    50 55 BF 00 0B 00 00 83 5D 0D BA FF 08 08 08 08 
                    18 18 18 18 00 08 00 00 10 00 50 10 7D 0F 06 5F 
                    50 55 BF 00 00 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 00 0F 00 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 28 08 40 00 03 37 
                    2D 31 04 00 06 00 00 E1 C7 08 F0 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 10 00 50 00 00 0F 06 5F 
                    50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 
                    00 00 00 3F 00 00 00 00 08 0F 50 00 00 0F 06 5F 
                    50 55 BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 
                    00 00 00 3F 00 00 00 00 08 0F 28 08 20 0F 06 2D 
                    28 2B BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 00 0F 50 08 40 0F 06 5F 
                    50 54 BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 
                    11 13 15 17 00 00 00 00 00 0F 50 0E 80 0F 00 60 
                    56 50 70 00 00 00 00 5E 5D 00 6E FF 08 00 18 00 
                    08 00 18 00 00 00 00 00 10 0F 50 0E 80 0F 00 5B 
                    53 50 6C 00 00 00 00 5E 5D 0F 0A FF 01 00 07 00 
                    01 00 07 00 00 00 00 00 10 0F 50 0E 80 0F 06 5F 
                    50 54 BF 00 00 00 00 83 5D 0F BA FF 08 00 18 00 
                    08 00 18 00 00 00 00 00 00 05 50 0E 80 0F 06 5F 
                    50 54 BF 00 00 00 00 83 5D 0F BA FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 00 0F 28 0E 08 03 02 2D 
                    28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 10 00 28 0E 08 03 02 2D 
                    28 2B BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 
                    50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 
                    50 55 BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 10 00 28 10 08 03 02 2D 
                    28 2B BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 
                    50 55 BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 
                    39 3B 3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 
                    50 55 BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 
                    18 18 18 18 00 08 00 00 10 00 50 10 A0 0F 06 5F 
                    50 54 0B 00 00 00 00 EA DF 00 04 FF 3F 3F 3F 3F 
                    3F 3F 3F 3F 00 00 00 00 00 01 50 10 A0 0F 06 5F 
                    50 54 0B 00 00 00 00 EA DF 00 04 FF 01 03 05 07 
                    39 3B 3D 3F 00 00 00 00 00 0F 28 08 FA 0F 0E 5F 
                    50 54 BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 
                    09 0B 0D 0F 00 00 00 00 40 0F 00 1F 3F 3F 3F 3F 
                    3F 1F 00 00 00 00 1F 2F 3F 3F 3F 3F 3F 2F 1F 1F 
                    1F 1F 2D 36 3F 3F 3F 3F 3F 36 2D 2D 2D 2D 00 0E 
                    1C 1C 1C 1C 1C 0E 00 00 00 00 0E 15 1C 1C 1C 1C 
                    1C 15 0E 0E 0E 0E 14 18 1C 1C 1C 1C 1C 18 14 14 
                    14 14 00 08 10 10 10 10 10 08 00 00 00 00 08 0C 
                    10 10 10 10 10 0C 08 08 08 08 0B 0D 10 10 10 10 
                    10 0D 0B 0B 0B 0B 00 02 04 14 00 02 04 14 38 3A 
                    3C 3E 38 3A 3C 3E 00 02 04 14 00 02 04 14 38 3A 
                    3C 3E 38 3A 3C 3E 00 02 04 06 08 0A 0C 0E 10 12 
                    14 16 18 1A 1C 1E 20 22 24 26 28 2A 2C 2E 30 32 
                    34 36 38 3A 3C 3E 00 00 00 00 07 07 07 07 00 00 
                    00 00 3F 3F 3F 3F 00 00 00 00 07 07 07 07 00 00 
                    00 00 3F 3F 3F 3F 00 02 04 14 38 3A 3C 3E 00 08 
                    0E 14 1C 24 2D 38 50 FC 75 B4 EB 80 1D 40 1E BE 
                    00 DE 55 53 52 EC BF B0 3E 00 74 BF B8 03 00 86 
                    8B 86 81 FF D1 2E 94 12 59 5F 07 1F 72 CF CD CF 
                    7C E6 58 76 E8 EA 32 30 8E E6 2E DE 32 D4 84 6C 
                    28 B4 48 A4 16 18 1A 1A 1A 1A A8 22 50 28 8A 24 
                    80 80 13 21 06 00 C7 85 08 80 87 08 C0 D8 06 4E 
                    0C 8C 0E F9 8A 87 80 F7 2E 00 C5 74 8A 32 8B 10 
                    80 CF 0A 8A 89 10 8A D0 22 D0 EB 8B 10 8A D0 22 
                    D0 8A 8A D0 D0 32 F6 8A D0 D0 D0 0A F6 80 08 DB 
                    86 F0 E6 FE 32 F6 08 16 1E 00 E3 D0 D0 D0 D0 32 
                    2E 87 14 E1 0A F6 01 03 02 88 87 BA 03 D8 E3 80 
                    19 E3 2A 89 63 93 C0 4E A2 00 3E 00 08 1E F3 93 
                    4E 8B 63 83 06 EC C0 B0 EE 8B 63 83 06 8A 49 32 
                    80 08 10 8A D6 A2 00 8A DE A2 00 E4 46 F8 1E 50 
                    52 49 E8 44 D9 C5 26 7F 8C 98 C4 E8 E8 F0 C0 C1 
                    26 4A AC A2 00 26 85 AD A3 00 C3 4C E8 44 D4 8B 
                    0F D9 06 00 75 BF B0 3E 00 74 BF B8 03 00 8E E8 
                    42 F7 4C D1 8B 8B 4E B8 07 3E 00 74 80 49 03 02 
                    C0 AB CB CD BC E8 43 5B 07 F8 D0 D0 80 02 E1 0A 
                    8A 32 8A 88 8A 80 F0 E6 D0 D0 D0 2E 97 14 16 00 
                    F3 0A C6 88 89 C3 A0 00 80 06 00 46 A1 00 46 A0 
                    00 46 F8 03 03 20 20 20 20 00 00 00 20 20 20 09 
                    09 09 09 09 09 09 0B 09 09 09 0B 09 09 09 0B 09 
                    09 09 09 80 80 00 80 80 00 00 00 2C 2D 2A 1E 30 
                    30 30 3F F6 87 08 74 EB 90 D1 1E 00 36 00 0E 00 
                    C6 74 BA 1E 38 D2 34 FA 73 F6 87 01 28 F2 08 F2 
                    D3 CA 1C FA 76 32 8A 80 02 E2 09 C0 FE 72 FE E8 
                    00 18 8B 8B B0 8A EF 0B E1 89 10 C3 8A 32 D1 89 
                    50 D1 3A 62 75 8B 8B 63 E8 00 C3 8A 32 D1 8B 50 
                    8B 60 89 02 56 F8 FE 8A 0A 3A 77 3A 74 8A FE 3A 
                    74 0A 75 8A 2A 8A 80 0D 02 C8 D0 F2 F4 0C D3 C8 
                    06 F3 C6 EE C3 A1 00 E5 ED C1 0E 00 E9 C1 CC E0 
                    0F B0 8A EF F9 8A B0 3A 76 8A 88 62 A1 00 FF E3 
                    4E 8A 49 80 03 05 FA 75 D1 8B 63 8B 8A B0 FA 8A 
                    B0 EF D1 8B 50 E8 FF C3 FD 8A 62 E8 02 C7 1E 00 
                    D3 04 D3 CA E4 F6 79 87 2A 2A F6 F6 EB 2A 2A FE 
                    FE 80 49 03 15 3E 00 72 74 80 49 0D 03 FB F9 8B 
                    2B 81 FF D1 8B 8A F6 32 03 D1 03 97 F0 E3 F6 04 
                    D8 DD E0 C7 F6 87 04 03 0E 1E 1F C0 14 C6 10 F0 
                    CA A5 F5 FD CE F4 F0 E7 20 CA AB FD CE F6 E9 01 
                    3E 00 74 D0 D0 BD 00 97 C5 ED BA 01 E2 C1 C6 8B 
                    98 40 F7 85 79 F7 F7 81 F0 80 49 06 01 03 06 96 
                    53 DF C0 30 C6 2C F0 D0 D0 8B 8B 8B 8A F3 8B 8B 
                    81 00 81 00 8A F3 03 03 FE 75 58 F0 E6 E6 8A 8B 
                    8A F3 8B 81 00 8A F3 03 FE 75 E9 00 8B 81 FF 80 
                    49 13 06 E5 E5 E5 F8 EC C4 99 85 F6 03 52 E5 32 
                    80 49 13 0A CA E1 E1 E1 CA C1 C6 8B F6 85 F7 5A 
                    DE 00 3E 00 75 D1 D1 D1 2B 85 79 F7 F7 03 96 C0 
                    37 C3 33 D8 80 49 13 10 BA 03 05 EF C4 B8 0F 5A 
                    85 F6 1E C1 D9 CA A4 F5 FD 75 1F 8A A0 00 E3 8A 
                    80 49 13 1A CE B8 00 BA 03 ED 02 0F 57 CB 00 AA 
                    0D CA C7 AA FD 75 EB B0 8A EF CB B0 F3 03 4E D4 
                    02 0F EB F6 87 04 03 28 F8 50 51 E8 3E D8 02 D8 
                    4C 32 F7 8B 5A 5B C3 8E 8A 49 80 03 07 FC 72 77 
                    E8 3E E6 E9 00 FF 7E E8 00 8B F6 02 16 C4 D0 E0 
                    D0 08 E1 E2 D0 E2 F8 E1 81 00 80 80 D9 05 C6 EB 
                    58 DB DB 1E 00 DA 80 80 50 38 8A 8B 4A E8 00 3C 
                    75 8A 32 B9 00 3C F5 D2 FC F5 D2 F2 C2 FE 74 81 
                    38 EB BA 03 05 08 8A F6 AA F3 F7 05 00 58 00 D2 
                    DA F6 DE 36 01 FC C4 E1 58 73 8E 8B 0B 74 86 E8 
                    00 02 C5 ED 81 FE 03 89 10 C3 5A 0E 00 81 FE 2B 
                    8B 8B 85 06 07 52 F6 87 04 12 16 00 C2 EC 01 FB 
                    EC 01 FB 8B FB 53 52 8A 32 8B 8A 8A 8B 8B 56 F0 
                    FB CD A6 0E C5 CA F0 C0 8B F9 0A 2B 8B F6 8B F8 
                    E6 5A 5B 8E 8A 49 80 03 0A FC 74 E8 00 30 F3 E9 
                    08 8B 8B 8A 8A 87 8B 63 83 06 C3 74 8B EC 01 FB 
                    EC 01 FB C6 FB E8 C3 8E 8A 49 80 03 0A FC 74 E8 
                    00 2B E9 C2 8B 8A 87 8B 63 83 06 C3 74 8A EC 01 
                    FB EC 01 FB C7 FB E2 F8 8B 8B 8B 80 13 05 FC 77 
                    32 50 A6 58 0E 00 F7 D6 F6 FB 74 8A 80 80 E2 80 
                    07 46 B5 8E C5 0C 32 F6 03 8B 8A 8A 57 B1 AC D0 
                    C3 E2 02 C7 E3 E2 02 E7 FE 75 FE 74 81 38 EB 5E 
                    83 08 75 E9 00 DE 36 01 80 0A F6 DE 36 00 7F E1 
                    F0 E2 53 57 F1 80 06 22 B3 8A D1 D1 D0 73 0A FE 
                    75 5B C4 ED 03 33 26 05 0A ED 03 32 26 05 F7 20 
                    F7 75 83 50 CE BE 5E 47 FB 74 47 75 E9 00 E3 1E 
                    00 0F D7 FA DE 36 01 E1 F0 0A 75 57 E2 C4 B0 EF 
                    E1 D2 D3 88 03 FE 75 86 5F E7 C4 B0 EF 10 C4 B0 
                    8A EF CE B0 B4 EF 57 D2 DA E1 ED 03 8A AC 88 03 
                    FE 75 86 5F 47 4D A4 E2 C4 B0 EF CE 32 B0 EF F6 
                    87 08 75 8B 63 8A 49 80 07 1D 1D FC 77 0A 75 E8 
                    00 CC 9E B5 E8 00 03 78 F8 0A 75 E8 00 FC 74 8A 
                    E8 00 00 E2 80 0F 4A 11 D8 EB E8 00 3E FC 74 0A 
                    75 E8 00 C9 5A B5 E8 00 11 B6 E8 00 1E 2C E8 00 
                    16 FF 0F 12 32 E8 00 01 98 EB E8 00 C3 A0 00 E0 
                    E3 0A A2 00 80 01 05 E3 66 24 0A A2 00 36 00 7C 
                    C5 C3 C5 A8 C4 04 34 D1 F6 06 E2 D6 E3 32 83 23 
                    DA 0F B1 8A 8A 32 D3 03 B4 B1 83 24 C5 75 83 03 
                    E5 83 06 C0 87 FB FA A8 74 87 AC EF C5 F6 E8 40 
                    C4 20 FB C9 DF 8D 06 FB FA A8 74 93 C0 91 D4 80 
                    11 02 CC 9A 86 B0 EE C4 91 8E 33 8A 49 80 13 08 
                    32 26 05 C3 FB 72 80 10 0F FA C7 F7 4C 8B 8B 86 
                    8A E8 00 FC 72 D2 B5 98 C8 CD D7 E7 08 CE EF FF 
                    12 03 18 B0 8A BA 03 26 05 14 02 E5 C4 EF D3 20 
                    F6 B0 8A EF 88 B0 8A EF 03 E4 CE EF 08 CC EB 98 
                    C3 E0 E4 05 30 EB 26 3D C7 F8 8E 33 8A 49 80 13 
                    08 90 26 05 46 FB 72 8B 8A 98 26 00 D7 F8 E3 34 
                    80 07 21 E3 03 FF CE B4 E8 38 8A 22 D2 D0 0A FE 
                    79 8A EB 26 05 D7 C7 E8 46 F8 80 0D 0A 0A EA 04 
                    C7 20 E2 E2 E2 E2 FA E2 E2 FA FE FC 73 D1 D0 8A 
                    F6 8B D1 D1 D1 03 F6 80 07 C7 8B B1 D3 03 D1 D1 
                    03 C3 8A 62 8A 32 87 D1 8B 50 3C 77 74 3C 74 3C 
                    74 3C 75 BB 03 F4 E8 39 C3 01 52 1E 74 1F 5A C2 
                    16 00 22 D2 C6 36 00 18 CE 1D D2 17 CA 0C D2 08 
                    36 00 0B C6 3E 00 6A F8 52 1E 3E 00 5E B7 80 49 
                    03 07 3E 00 75 8A 62 E8 F9 7E 1F 5A 01 33 8A 4A 
                    FE E8 F7 C3 F6 87 08 75 3C F5 1C F2 16 00 06 07 
                    C4 A8 26 7D 98 E0 2E 97 1F C3 8C AA C6 2C B2 B2 
                    B2 5E 86 A0 B2 B2 B2 B2 B2 B2 10 B2 46 7C B2 E4 
                    B2 10 3A 40 48 78 86 93 C2 FB FA A8 74 93 C0 E8 
                    37 1E B0 EE C3 86 B4 93 C2 FB FA A8 74 93 C0 E8 
                    37 FE FB B4 B1 8B 83 06 C0 32 87 FB FA A8 74 87 
                    AC 0E E8 3D C4 C5 C9 20 EA A8 75 87 AC F6 E8 3D 
                    C4 C9 0A CD EF 20 FB C3 20 87 FB FA A8 74 87 B4 
                    AC CE FE E8 3D C3 B1 D2 24 8A B8 00 D8 49 E8 37 
                    86 D1 D1 8B 83 06 BA 03 30 8A 27 24 0A E8 36 8A 
                    83 06 DA 90 EC 08 F8 C4 C0 EE EC E0 87 EC DA 20 
                    FB 66 C3 B4 83 06 90 EC 08 F8 C4 C0 EE EC 88 05 
                    8C 8E 8B B4 B1 8B 83 06 C0 32 87 FB FA A8 74 87 
                    8A EE EC AA C4 C5 C9 25 F2 A8 75 87 8A EE EC AA 
                    C4 C9 0F F2 FE 75 87 B0 EE EB 87 EC F2 20 87 FB 
                    FA A8 74 87 B0 EE EC FB 8A 01 5E 86 B9 00 D9 06 
                    00 74 E8 3D 83 06 90 EC 08 F8 C4 C8 EE 00 00 C9 
                    58 04 C3 8A E8 36 40 8E BA 03 C4 EB EB FE BA 03 
                    8A AC F8 86 26 06 00 74 E8 3D D2 E2 E8 36 8A 32 
                    83 02 07 E3 FF 8E C3 92 B2 83 06 90 EC 08 F8 30 
                    C0 EE EC 24 B1 D2 0A EE C3 83 06 DA 90 EC 08 F8 
                    30 C0 EE EC D0 80 B1 D2 D0 8A D2 87 EC DA 34 8A 
                    EE C3 8A 83 06 90 EC 08 F8 C4 C7 EE C9 EB EB EC 
                    46 EB EC 46 EB EC 46 FB 8C 8E 8B 8A E8 35 C7 8A 
                    EE 00 00 C4 C9 EC EB EC EB EC E2 E8 35 BA 03 C3 
                    BA 03 88 04 83 06 DA BA 03 34 42 4A E0 DA 87 B0 
                    EE EC 80 07 E8 C8 D1 E1 D0 D2 89 04 8A E8 35 C7 
                    8A EE 00 00 C9 FA 8A EB EC F8 00 86 FB 72 BA 03 
                    C4 86 BA 03 9E FE E2 E8 35 C3 3C 72 74 F8 3C 74 
                    F6 87 08 F3 E4 04 E0 E8 FC 74 E9 01 E8 36 08 C4 
                    8A B0 EF C3 8C 33 8E C4 7C 0A 74 C4 0C FE 74 0E 
                    8D 4C FE 74 8D 7A FE 74 8D 7A FE 74 8D 4C FE 74 
                    8D 08 FE 74 8D 08 FE 75 8E 8C 0A 56 A1 00 46 A0 
                    00 46 F8 1E 33 8E 0A 75 C4 08 0E 00 06 00 7D C8 
                    12 C4 08 0E 01 06 01 8B 02 2D C8 09 36 3F 0E EB 
                    FE 75 8D 7A B9 00 0B C8 49 36 2E 10 89 0C 8C 0E 
                    26 0E 00 5E 32 8A 00 DB 0C 19 FB 77 2E 87 23 C8 
                    A2 00 FF 8A 62 26 97 00 F0 07 F0 89 50 F8 00 19 
                    50 49 8B 63 E8 37 D8 50 1E E3 FF 76 8B 04 4E 8B 
                    00 C0 49 36 2E 10 3C 75 80 07 2D 3E 3E 27 36 3F 
                    0E FE 75 80 07 17 3E 4D 11 36 4E 08 FE 74 1F 58 
                    88 8A 8A 04 00 33 0E 53 E8 36 5B CB FF 05 E8 37 
                    1F 1E 00 16 00 E8 37 A4 FE 8A FE 5B CF F8 22 10 
                    80 04 11 46 0A 74 B8 00 CB 03 08 8A B4 E8 00 03 
                    44 8B 63 83 06 EC C0 B0 EE 32 8A 62 8B 50 3A 84 
                    76 8A 84 89 50 F8 50 98 85 FE 8A B0 EE EC E0 C4 
                    E8 F0 D9 1E 00 C5 58 98 C4 E8 E8 F0 44 B4 40 44 
                    80 02 E8 D9 8B 85 F7 80 FF 02 C7 C8 84 FE 98 E1 
                    8B 63 8A B0 EF 66 80 07 05 14 E1 A1 00 1E 00 C3 
                    E3 E0 4C C3 80 10 27 FB 74 80 30 FB 73 32 D1 2E 
                    A7 25 C3 B2 10 2C 44 62 7E 86 A0 00 E0 E4 B1 D2 
                    24 B1 D2 89 04 46 A0 00 E0 E4 B1 D2 24 89 02 C3 
                    33 8E 8D 7E 26 14 26 0E 00 3C 73 8A 87 F6 08 44 
                    3E 00 1E 00 01 F6 02 08 C0 30 02 0F D1 8B B4 22 
                    D0 0A 80 80 D4 D2 DA 8B 06 22 0B 88 89 88 88 C7 
                    10 00 C3 00 01 01 0B 0B 3C 73 8A 89 B1 D2 80 F7 
                    E0 26 00 46 12 F8 3C 73 34 B1 D2 0C BA 46 C7 10 
                    00 C3 3C 77 34 8A 89 B1 D2 80 FD E0 26 00 46 12 
                    F8 3C 73 8A 87 B1 D2 80 FE E0 26 00 46 12 F8 C7 
                    10 00 C3 3C 73 B1 D2 8A BA 03 01 42 24 0A EE 46 
                    12 F8 3C 77 86 8B 86 81 FF D1 FF 50 B4 E8 30 0C 
                    76 26 51 14 59 F7 F6 10 75 8A 05 02 B0 F8 3C 77 
                    74 3C 74 3C 74 3C 74 75 B4 E8 30 64 DF FF E3 97 
                    00 EB DF 0D 08 D2 02 7A C3 08 0C D2 42 CA 02 6A 
                    C3 0A 36 35 5E F6 10 74 93 AC B9 00 09 4E 8A 32 
                    D1 8B 50 D1 86 FE 3A 4A 72 32 EB B4 E8 30 FE 3A 
                    84 76 FE B4 E8 30 3E 00 76 80 49 07 06 DF FF 09 
                    08 06 8A 8A 53 06 57 1E 06 01 C9 16 00 CA 98 1F 
                    5F 07 5B FB C4 A8 26 7D 26 7D 0A 74 81 0F 8B 26 
                    0D ED DF C7 FC AF 10 E0 FB 8A 32 83 04 AF 36 FB 
                    EF 8B D1 A2 00 2E 8A 98 E0 D8 8B 04 49 24 FE D0 
                    D0 D0 80 00 06 01 C3 07 FB 03 FF 89 04 1A 89 10 
                    C3 0B 74 E9 01 8B 06 06 01 8C AB 0F 8D 49 F3 B9 
                    00 36 00 A4 FE FD 00 E8 2F C3 8A 49 32 2E 87 2C 
                    E4 01 D4 24 AB 8A 01 8A 24 AA C4 04 F8 14 02 06 
                    00 75 FE F6 88 01 02 C8 B0 BA 03 42 8A D0 D0 8A 
                    8A D0 81 03 25 04 C3 C4 8B B4 22 89 A0 00 E8 D0 
                    01 04 E0 E0 16 00 C2 EC C0 B0 EE EC 08 E0 E0 E0 
                    C4 8A 32 B9 00 AA C2 60 05 E8 32 3A 74 0C 1E C5 
                    A8 C4 04 C1 CB 02 02 5C 8C 0B 74 0C C4 0C C1 CB 
                    02 08 74 C4 0A C1 CB 02 10 5C 8C 8C 3B 74 0C 07 
                    AA C0 0D F3 C7 10 00 C3 FC 01 05 25 FB 81 07 75 
                    33 E9 03 01 D1 83 00 E9 D3 D1 73 83 0C 66 81 07 
                    75 33 E9 03 FB C7 D0 72 E9 01 89 BA 03 AA 16 00 
                    AA F2 CE EC BA 03 AA E4 05 C4 8A EE EC FE 4A CD 
                    F3 CC EC 32 B5 8B 8A EE EC FE 4A CD F3 C2 32 BE 
                    03 10 90 EC 08 F8 F2 C4 42 4A FE FE 74 87 EC 08 
                    EA D6 20 87 EB B4 B5 87 EC F2 C4 FB EC 4A F2 C4 
                    CD ED EA 8B 32 BA 03 09 C4 42 AA FE FE 75 8B AB 
                    C4 B0 EE EC E0 0F 4A 04 42 50 06 BA 03 06 42 8A 
                    B0 EE B0 EE EC B0 EE B8 A0 D8 FF 4A 04 42 50 E4 
                    04 C4 A0 FF FE FE 75 58 1F B0 EE 42 4A 06 42 C4 
                    BA 03 04 42 EE B0 EE 8A EE 26 47 EE D6 8A 21 BA 
                    03 8A 22 8B 83 06 BA 03 8A 23 D0 73 26 7F 51 A0 
                    00 30 B9 00 36 00 A5 07 8D 84 F3 8D A8 B9 00 A5 
                    C9 D9 14 B9 00 A5 74 B9 00 A5 7C B9 00 A5 0C B9 
                    00 A5 59 E9 03 B6 26 7F BA 03 AB C6 EC BA 03 C0 
                    BA 03 00 EC EB EC EB EC E2 E9 01 E1 00 05 C0 85 
                    1E 1F D0 72 E9 00 37 C6 06 00 8E BA 03 04 06 BA 
                    03 06 04 B0 B4 EF C4 B0 EE 01 04 8A EE 26 FF D0 
                    FE 75 B0 EE FF 07 37 C6 4A 04 AC E8 00 01 FE AC 
                    C4 86 FE 4F F5 C2 AC BA 03 00 E5 8B 36 11 E4 32 
                    B5 AC C4 86 FE FE 75 83 06 C0 32 B5 FB FA A8 74 
                    87 8A EE EE C4 CD 10 FA A8 75 87 B0 EE D7 DB 30 
                    04 FA 87 8A EE AC 87 FE FE 75 83 06 FA CE 32 B5 
                    AC C4 86 FE FE 75 8B BA 03 EE D7 EE CE AC 8B 83 
                    06 BA 03 EE E9 52 8B 02 26 26 00 26 06 00 0F 8D 
                    49 F3 B9 00 3E 00 A4 3E 00 02 F3 06 C9 C1 14 B9 
                    00 A5 74 B9 00 A5 7C B9 00 A5 0C B9 00 A5 59 E9 
                    21 77 AD C6 AC BA 03 C0 BA 03 00 AC EB AC EB AC 
                    E2 B8 00 46 89 04 C3 0F 0F 03 7F 7F 7F 0F 7F 01 
                    FF 88 88 01 88 00 00 08 12 31 01 F9 F9 F9 3C 3E 
                    40 42 62 6E 3C 77 32 8B D1 E8 00 FF 1C F9 C3 C3 
                    F8 72 C7 04 00 46 00 A0 00 02 E8 E8 01 05 E4 46 
                    F8 F8 F6 87 08 75 F8 72 0A 74 E8 2A 04 44 F8 50 
                    51 1E 40 8E B0 86 00 3C 74 FB 0F 10 EC B4 CD 59 
                    33 E8 00 20 02 10 08 10 30 72 FE 3A 72 32 FE 3A 
                    84 76 E8 00 C9 B4 CD FA 0E 01 5A 5B CF 0D 04 72 
                    B0 52 D2 C0 02 20 00 17 C4 74 F9 C3 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 00 00 00 00 7E A5 81 
                    99 81 00 00 00 7E DB FF E7 FF 00 00 00 00 6C FE 
                    FE 38 00 00 00 00 10 7C 7C 10 00 00 00 00 3C E7 
                    E7 18 00 00 00 00 3C FF 7E 18 00 00 00 00 00 18 
                    3C 00 00 00 FF FF FF E7 C3 FF FF FF 00 00 00 66 
                    42 3C 00 00 FF FF FF 99 BD C3 FF FF 00 1E 1A 78 
                    CC CC 00 00 00 3C 66 66 18 18 00 00 00 3F 3F 30 
                    30 F0 00 00 00 7F 7F 63 63 E7 C0 00 00 00 18 3C 
                    3C 18 00 00 00 C0 F0 FE F0 C0 00 00 00 06 1E FE 
                    1E 06 00 00 00 18 7E 18 7E 18 00 00 00 66 66 66 
                    66 66 00 00 00 7F DB 7B 1B 1B 00 00 00 C6 38 C6 
                    6C 0C 7C 00 00 00 00 00 FE FE 00 00 00 18 7E 18 
                    7E 18 00 00 00 18 7E 18 18 18 00 00 00 18 18 18 
                    18 3C 00 00 00 00 00 0C 0C 00 00 00 00 00 00 60 
                    60 00 00 00 00 00 00 C0 C0 00 00 00 00 00 00 6C 
                    6C 00 00 00 00 00 10 38 7C FE 00 00 00 00 FE 7C 
                    38 10 00 00 00 00 00 00 00 00 00 00 00 18 3C 18 
                    18 18 00 00 00 66 24 00 00 00 00 00 00 00 6C 6C 
                    6C 6C 00 00 18 7C C2 7C 06 C6 18 00 00 00 C2 0C 
                    30 C6 00 00 00 38 6C 76 CC CC 00 00 00 30 60 00 
                    00 00 00 00 00 0C 30 30 30 18 00 00 00 30 0C 0C 
                    0C 18 00 00 00 00 00 3C 3C 00 00 00 00 00 00 18 
                    18 00 00 00 00 00 00 00 00 18 30 00 00 00 00 00 
                    00 00 00 00 00 00 00 00 00 18 00 00 00 00 02 0C 
                    30 C0 00 00 00 38 C6 D6 C6 6C 00 00 00 18 78 18 
                    18 18 00 00 00 7C 06 18 60 C6 00 00 00 7C 06 3C 
                    06 C6 00 00 00 0C 3C CC 0C 0C 00 00 00 FE C0 FC 
                    06 C6 00 00 00 38 C0 FC C6 C6 00 00 00 FE 06 0C 
                    30 30 00 00 00 7C C6 7C C6 C6 00 00 00 7C C6 7E 
                    06 0C 00 00 00 00 18 00 00 18 00 00 00 00 18 00 
                    00 18 00 00 00 00 0C 30 30 0C 00 00 00 00 00 00 
                    7E 00 00 00 00 00 30 0C 0C 30 00 00 00 7C C6 18 
                    18 18 00 00 00 00 C6 DE DE C0 00 00 00 10 6C C6 
                    C6 C6 00 00 00 FC 66 7C 66 66 00 00 00 3C C2 C0 
                    C0 66 00 00 00 F8 66 66 66 6C 00 00 00 FE 62 78 
                    60 66 00 00 00 FE 62 78 60 60 00 00 00 3C C2 C0 
                    C6 66 00 00 00 C6 C6 FE C6 C6 00 00 00 3C 18 18 
                    18 18 00 00 00 1E 0C 0C CC CC 00 00 00 E6 66 78 
                    6C 66 00 00 00 F0 60 60 60 66 00 00 00 C6 FE D6 
                    C6 C6 00 00 00 C6 F6 DE C6 C6 00 00 00 7C C6 C6 
                    C6 C6 00 00 00 FC 66 7C 60 60 00 00 00 7C C6 C6 
                    C6 DE 0C 00 00 FC 66 7C 66 66 00 00 00 7C C6 38 
                    06 C6 00 00 00 7E 5A 18 18 18 00 00 00 C6 C6 C6 
                    C6 C6 00 00 00 C6 C6 C6 C6 38 00 00 00 C6 C6 D6 
                    D6 EE 00 00 00 C6 6C 38 7C C6 00 00 00 66 66 3C 
                    18 18 00 00 00 FE 86 18 60 C6 00 00 00 3C 30 30 
                    30 30 00 00 00 00 C0 70 1C 06 00 00 00 3C 0C 0C 
                    0C 0C 00 00 10 6C 00 00 00 00 00 00 00 00 00 00 
                    00 00 00 00 30 18 00 00 00 00 00 00 00 00 00 0C 
                    CC CC 00 00 00 E0 60 6C 66 66 00 00 00 00 00 C6 
                    C0 C6 00 00 00 1C 0C 6C CC CC 00 00 00 00 00 C6 
                    C0 C6 00 00 00 38 64 F0 60 60 00 00 00 00 00 CC 
                    CC CC 0C 78 00 E0 60 76 66 66 00 00 00 18 00 18 
                    18 18 00 00 00 06 00 06 06 06 66 3C 00 E0 60 6C 
                    78 66 00 00 00 38 18 18 18 18 00 00 00 00 00 FE 
                    D6 D6 00 00 00 00 00 66 66 66 00 00 00 00 00 C6 
                    C6 C6 00 00 00 00 00 66 66 66 60 F0 00 00 00 CC 
                    CC CC 0C 1E 00 00 00 76 60 60 00 00 00 00 00 C6 
                    38 C6 00 00 00 10 30 30 30 36 00 00 00 00 00 CC 
                    CC CC 00 00 00 00 00 66 66 3C 00 00 00 00 00 C6 
                    D6 FE 00 00 00 00 00 6C 38 6C 00 00 00 00 00 C6 
                    C6 C6 06 F8 00 00 00 CC 30 C6 00 00 00 0E 18 70 
                    18 18 00 00 00 18 18 00 18 18 00 00 00 70 18 0E 
                    18 18 00 00 00 76 00 00 00 00 00 00 00 00 10 6C 
                    C6 FE 00 00 00 3C C2 C0 C2 3C 06 00 00 CC 00 CC 
                    CC CC 00 00 00 18 00 C6 C0 C6 00 00 00 38 00 0C 
                    CC CC 00 00 00 CC 00 0C CC CC 00 00 00 30 00 0C 
                    CC CC 00 00 00 6C 00 0C CC CC 00 00 00 00 3C 60 
                    66 0C 3C 00 00 38 00 C6 C0 C6 00 00 00 C6 00 C6 
                    C0 C6 00 00 00 30 00 C6 C0 C6 00 00 00 66 00 18 
                    18 18 00 00 00 3C 00 18 18 18 00 00 00 30 00 18 
                    18 18 00 00 00 00 38 C6 FE C6 00 00 38 38 38 C6 
                    FE C6 00 00 18 60 FE 60 60 66 00 00 00 00 00 76 
                    7E D8 00 00 00 3E CC FE CC CC 00 00 00 38 00 C6 
                    C6 C6 00 00 00 C6 00 C6 C6 C6 00 00 00 30 00 C6 
                    C6 C6 00 00 00 78 00 CC CC CC 00 00 00 30 00 CC 
                    CC CC 00 00 00 C6 00 C6 C6 C6 06 78 00 00 C6 C6 
                    C6 C6 00 00 00 00 C6 C6 C6 C6 00 00 00 18 66 60 
                    66 18 00 00 00 6C 60 60 60 E6 00 00 00 66 3C 7E 
                    7E 18 00 00 00 CC F8 CC CC CC 00 00 00 1B 18 7E 
                    18 18 D8 00 00 30 00 0C CC CC 00 00 00 18 00 18 
                    18 18 00 00 00 30 00 C6 C6 C6 00 00 00 30 00 CC 
                    CC CC 00 00 00 76 00 66 66 66 00 00 76 00 E6 FE 
                    CE C6 00 00 00 6C 3E 7E 00 00 00 00 00 6C 38 7C 
                    00 00 00 00 00 30 00 30 C0 C6 00 00 00 00 00 FE 
                    C0 C0 00 00 00 00 00 FE 06 06 00 00 00 C0 C6 18 
                    60 86 18 00 00 C0 C6 18 66 9E 06 00 00 18 00 18 
                    3C 3C 00 00 00 00 00 6C 6C 00 00 00 00 00 00 6C 
                    6C 00 00 00 11 11 11 11 11 11 11 11 55 55 55 55 
                    55 55 55 55 DD DD DD DD DD DD DD DD 18 18 18 18 
                    18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 
                    18 18 18 18 36 36 36 36 36 36 36 36 00 00 00 00 
                    36 36 36 36 00 00 00 18 18 18 18 18 36 36 36 06 
                    36 36 36 36 36 36 36 36 36 36 36 36 00 00 00 06 
                    36 36 36 36 36 36 36 06 00 00 00 00 36 36 36 36 
                    00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 00 
                    18 18 18 18 18 18 18 18 00 00 00 00 18 18 18 18 
                    00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 
                    18 18 18 18 00 00 00 00 00 00 00 00 18 18 18 18 
                    18 18 18 18 18 18 18 18 18 18 18 18 36 36 36 36 
                    36 36 36 36 36 36 36 30 00 00 00 00 00 00 00 30 
                    36 36 36 36 36 36 36 00 00 00 00 00 00 00 00 00 
                    36 36 36 36 36 36 36 30 36 36 36 36 00 00 00 00 
                    00 00 00 00 36 36 36 00 36 36 36 36 18 18 18 00 
                    00 00 00 00 36 36 36 36 00 00 00 00 00 00 00 00 
                    18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 
                    00 00 00 00 18 18 18 18 00 00 00 00 00 00 00 18 
                    18 18 18 18 00 00 00 00 36 36 36 36 36 36 36 36 
                    36 36 36 36 18 18 18 18 18 18 18 18 18 18 18 18 
                    00 00 00 00 00 00 00 00 18 18 18 18 FF FF FF FF 
                    FF FF FF FF 00 00 00 00 FF FF FF FF F0 F0 F0 F0 
                    F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F 0F FF FF FF FF 
                    00 00 00 00 00 00 00 DC D8 DC 00 00 00 78 CC D8 
                    C6 C6 00 00 00 FE C6 C0 C0 C0 00 00 00 00 FE 6C 
                    6C 6C 00 00 00 00 C6 30 30 C6 00 00 00 00 00 D8 
                    D8 D8 00 00 00 00 66 66 66 60 C0 00 00 00 76 18 
                    18 18 00 00 00 00 18 66 66 18 00 00 00 00 6C C6 
                    C6 6C 00 00 00 38 C6 C6 6C 6C 00 00 00 1E 18 3E 
                    66 66 00 00 00 00 00 DB DB 00 00 00 00 00 06 DB 
                    F3 60 00 00 00 1C 60 7C 60 30 00 00 00 00 C6 C6 
                    C6 C6 00 00 00 00 FE 00 00 FE 00 00 00 00 18 7E 
                    18 00 00 00 00 00 18 06 18 00 00 00 00 00 18 60 
                    18 00 00 00 00 0E 1B 18 18 18 18 18 18 18 18 18 
                    D8 D8 00 00 00 00 18 00 00 18 00 00 00 00 00 DC 
                    76 00 00 00 00 6C 38 00 00 00 00 00 00 00 00 00 
                    18 00 00 00 00 00 00 00 18 00 00 00 00 0C 0C 0C 
                    6C 3C 00 00 00 6C 6C 6C 00 00 00 00 00 D8 60 F8 
                    00 00 00 00 00 00 7C 7C 7C 7C 00 00 00 00 00 00 
                    00 00 00 00 1D 00 00 24 FF 24 00 00 00 00 3C C3 
                    DB C3 66 00 00 4D 00 E7 FF C3 C3 C3 00 00 00 FF 
                    99 18 18 18 00 00 56 00 C3 C3 C3 66 18 00 00 00 
                    C3 C3 C3 DB 66 00 00 58 00 C3 3C 18 66 C3 00 00 
                    00 C3 C3 3C 18 18 00 00 5A 00 C3 0C 30 C1 FF 00 
                    00 00 00 00 FF DB DB 00 00 76 00 00 C3 C3 66 18 
                    00 00 00 00 00 C3 DB FF 00 00 78 00 00 C3 3C 3C 
                    C3 00 00 00 00 00 3B 7E DC 00 00 9B 18 7E C0 C0 
                    7E 18 00 00 00 C3 3C FF FF 18 00 00 9E FC 66 62 
                    6F 66 F3 00 00 00 C0 C6 18 60 9B 0C 00 AC C0 C2 
                    CC 30 CE 3E 06 00 00 00 00 00 00 00 00 00 7E A5 
                    81 99 7E 00 00 7E DB FF E7 7E 00 00 00 FE FE 7C 
                    10 00 00 00 38 FE 38 00 00 00 18 3C E7 18 3C 00 
                    00 18 7E FF 18 3C 00 00 00 00 3C 18 00 00 FF FF 
                    FF C3 E7 FF FF 00 00 3C 42 66 00 00 FF FF C3 BD 
                    99 FF FF 00 1E 1A 78 CC 78 00 00 3C 66 3C 7E 18 
                    00 00 3F 3F 30 70 E0 00 00 7F 7F 63 67 E6 00 00 
                    18 DB E7 DB 18 00 00 80 E0 FE E0 80 00 00 02 0E 
                    FE 0E 02 00 00 18 7E 18 7E 18 00 00 66 66 66 00 
                    66 00 00 7F DB 7B 1B 1B 00 00 C6 38 C6 6C 0C 7C 
                    00 00 00 00 FE FE 00 00 18 7E 18 7E 18 00 00 18 
                    7E 18 18 18 00 00 18 18 18 7E 18 00 00 00 18 FE 
                    18 00 00 00 00 30 FE 30 00 00 00 00 00 C0 FE 00 
                    00 00 00 28 FE 28 00 00 00 00 38 7C FE 00 00 00 
                    00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 18 3C 
                    18 00 18 00 00 66 24 00 00 00 00 00 6C FE 6C FE 
                    6C 00 18 7C C2 7C 86 7C 18 00 00 C2 0C 30 C6 00 
                    00 38 6C 76 CC 76 00 00 30 60 00 00 00 00 00 0C 
                    30 30 30 0C 00 00 30 0C 0C 0C 30 00 00 00 66 FF 
                    66 00 00 00 00 18 7E 18 00 00 00 00 00 00 18 18 
                    00 00 00 00 FE 00 00 00 00 00 00 00 00 18 00 00 
                    02 0C 30 C0 00 00 00 7C CE F6 C6 7C 00 00 18 78 
                    18 18 7E 00 00 7C 06 18 60 FE 00 00 7C 06 3C 06 
                    7C 00 00 0C 3C CC 0C 1E 00 00 FE C0 FC 06 7C 00 
                    00 38 C0 FC C6 7C 00 00 FE 06 18 30 30 00 00 7C 
                    C6 7C C6 7C 00 00 7C C6 7E 06 78 00 00 00 18 00 
                    18 00 00 00 00 18 00 18 30 00 00 06 18 60 18 06 
                    00 00 00 00 00 7E 00 00 00 60 18 06 18 60 00 00 
                    7C C6 18 00 18 00 00 7C C6 DE DC 7C 00 00 10 6C 
                    C6 C6 C6 00 00 FC 66 7C 66 FC 00 00 3C C2 C0 C2 
                    3C 00 00 F8 66 66 66 F8 00 00 FE 62 78 62 FE 00 
                    00 FE 62 78 60 F0 00 00 3C C2 C0 C6 3A 00 00 C6 
                    C6 FE C6 C6 00 00 3C 18 18 18 3C 00 00 1E 0C 0C 
                    CC 78 00 00 E6 6C 78 6C E6 00 00 F0 60 60 62 FE 
                    00 00 C6 FE D6 C6 C6 00 00 C6 F6 DE C6 C6 00 00 
                    38 C6 C6 C6 38 00 00 FC 66 7C 60 F0 00 00 7C C6 
                    C6 DE 0C 00 00 FC 66 7C 66 E6 00 00 7C C6 38 C6 
                    7C 00 00 7E 5A 18 18 3C 00 00 C6 C6 C6 C6 7C 00 
                    00 C6 C6 C6 6C 10 00 00 C6 C6 D6 FE 6C 00 00 C6 
                    6C 38 6C C6 00 00 66 66 3C 18 3C 00 00 FE 8C 30 
                    C2 FE 00 00 3C 30 30 30 3C 00 00 80 E0 38 0E 02 
                    00 00 3C 0C 0C 0C 3C 00 10 6C 00 00 00 00 00 00 
                    00 00 00 00 00 FF 30 18 00 00 00 00 00 00 00 00 
                    0C CC 76 00 00 E0 60 6C 66 7C 00 00 00 00 C6 C0 
                    7C 00 00 1C 0C 6C CC 76 00 00 00 00 C6 C0 7C 00 
                    00 38 64 F0 60 F0 00 00 00 00 CC CC 0C 78 00 E0 
                    60 76 66 E6 00 00 18 00 18 18 3C 00 00 06 00 06 
                    06 66 3C 00 E0 60 6C 6C E6 00 00 38 18 18 18 3C 
                    00 00 00 00 FE D6 C6 00 00 00 00 66 66 66 00 00 
                    00 00 C6 C6 7C 00 00 00 00 66 66 60 F0 00 00 00 
                    CC CC 0C 1E 00 00 00 76 60 F0 00 00 00 00 C6 1C 
                    7C 00 00 10 30 30 30 1C 00 00 00 00 CC CC 76 00 
                    00 00 00 66 66 18 00 00 00 00 C6 D6 6C 00 00 00 
                    00 6C 38 C6 00 00 00 00 C6 C6 06 F8 00 00 00 CC 
                    30 FE 00 00 0E 18 70 18 0E 00 00 18 18 00 18 18 
                    00 00 70 18 0E 18 70 00 00 76 00 00 00 00 00 00 
                    00 10 6C C6 00 00 00 3C C2 C0 66 0C 7C 00 CC 00 
                    CC CC 76 00 00 18 00 C6 C0 7C 00 00 38 00 0C CC 
                    76 00 00 CC 00 0C CC 76 00 00 30 00 0C CC 76 00 
                    00 6C 00 0C CC 76 00 00 00 3C 60 3C 06 00 00 38 
                    00 C6 C0 7C 00 00 CC 00 C6 C0 7C 00 00 30 00 C6 
                    C0 7C 00 00 66 00 18 18 3C 00 00 3C 00 18 18 3C 
                    00 00 30 00 18 18 3C 00 00 C6 38 C6 FE C6 00 38 
                    38 38 C6 FE C6 00 18 60 FE 60 60 FE 00 00 00 CC 
                    36 D8 6E 00 00 3E CC FE CC CE 00 00 38 00 C6 C6 
                    7C 00 00 C6 00 C6 C6 7C 00 00 30 00 C6 C6 7C 00 
                    00 78 00 CC CC 76 00 00 30 00 CC CC 76 00 00 C6 
                    00 C6 C6 06 78 00 C6 6C C6 C6 38 00 00 C6 C6 C6 
                    C6 7C 00 00 18 66 60 3C 18 00 00 6C 60 60 60 FC 
                    00 00 66 3C 7E 7E 18 00 00 CC F8 CC CC C6 00 00 
                    1B 18 7E 18 18 70 00 30 00 0C CC 76 00 00 18 00 
                    18 18 3C 00 00 30 00 C6 C6 7C 00 00 30 00 CC CC 
                    76 00 00 76 00 66 66 66 00 76 00 E6 FE CE C6 00 
                    00 6C 3E 7E 00 00 00 00 6C 38 7C 00 00 00 00 30 
                    00 30 C6 7C 00 00 00 00 FE C0 00 00 00 00 00 FE 
                    06 00 00 00 C0 CC 30 DC 0C 3E 00 C0 CC 30 CE 3E 
                    06 00 18 00 18 3C 18 00 00 00 36 D8 36 00 00 00 
                    00 D8 36 D8 00 00 11 11 11 11 11 11 11 55 55 55 
                    55 55 55 55 DD DD DD DD DD DD DD 18 18 18 18 18 
                    18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 
                    36 36 36 36 36 36 36 00 00 00 00 36 36 36 00 00 
                    00 18 18 18 18 36 36 36 06 36 36 36 36 36 36 36 
                    36 36 36 00 00 00 06 36 36 36 36 36 36 06 00 00 
                    00 36 36 36 36 00 00 00 18 18 18 18 00 00 00 00 
                    00 00 00 18 18 18 18 18 18 18 00 00 00 18 18 18 
                    18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 18 
                    18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 18 
                    18 18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 
                    36 30 00 00 00 00 00 00 30 36 36 36 36 36 36 00 
                    00 00 00 00 00 00 00 36 36 36 36 36 36 30 36 36 
                    36 00 00 00 00 00 00 00 36 36 36 00 36 36 36 18 
                    18 18 00 00 00 00 36 36 36 36 00 00 00 00 00 00 
                    00 18 18 18 00 00 00 00 36 36 36 36 36 36 36 00 
                    00 00 18 18 18 18 00 00 00 00 00 00 18 18 18 18 
                    00 00 00 00 36 36 36 36 36 36 36 36 36 36 18 18 
                    18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 
                    18 18 18 FF FF FF FF FF FF FF 00 00 00 00 FF FF 
                    FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 0F FF 
                    FF FF FF 00 00 00 00 00 00 DC D8 76 00 00 00 7C 
                    FC C6 C0 40 00 FE C6 C0 C0 C0 00 00 00 FE 6C 6C 
                    6C 00 00 FE 60 18 60 FE 00 00 00 00 D8 D8 70 00 
                    00 00 66 66 7C 60 00 00 00 76 18 18 18 00 00 7E 
                    3C 66 3C 7E 00 00 38 C6 FE C6 38 00 00 38 C6 C6 
                    6C EE 00 00 1E 18 3E 66 3C 00 00 00 00 DB 7E 00 
                    00 00 03 7E DB 7E C0 00 00 1C 60 7C 60 1C 00 00 
                    00 C6 C6 C6 C6 00 00 00 00 FE 00 00 00 00 00 18 
                    18 00 FF 00 00 30 0C 0C 30 7E 00 00 0C 30 30 0C 
                    7E 00 00 0E 1B 18 18 18 18 18 18 18 18 D8 70 00 
                    00 00 18 7E 18 00 00 00 00 76 00 DC 00 00 00 6C 
                    38 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 
                    00 00 00 00 0C 0C 0C 6C 1C 00 00 6C 6C 6C 00 00 
                    00 00 D8 60 F8 00 00 00 00 00 7C 7C 7C 00 00 00 
                    00 00 00 00 00 00 1D 00 00 66 66 00 00 00 00 63 
                    22 00 00 00 00 2B 00 18 18 18 18 00 00 00 00 00 
                    FF 00 00 00 4D 00 E7 DB C3 C3 00 00 00 FF 99 18 
                    18 3C 00 56 00 C3 C3 C3 3C 00 00 00 C3 C3 DB FF 
                    66 00 58 00 C3 3C 3C C3 00 00 00 C3 C3 3C 18 3C 
                    00 5A 00 C3 0C 30 C3 00 00 00 00 00 FF DB DB 00 
                    76 00 00 C3 C3 3C 00 00 00 00 00 C3 DB 66 00 91 
                    00 00 3B 7E DC 00 00 00 18 C3 C0 7E 18 00 9D 00 
                    66 18 18 18 00 00 00 66 7C 66 66 F3 00 F1 00 18 
                    FF 18 00 00 00 00 18 00 FF 00 18 00 00 00 00 00 
                    00 7E A5 BD 81 7E DB C3 FF 6C FE 7C 10 10 7C 7C 
                    10 38 38 FE 38 10 38 FE 38 00 18 3C 00 FF E7 C3 
                    FF 00 66 42 3C FF 99 BD C3 0F 0F CC CC 3C 66 3C 
                    7E 3F 3F 30 F0 7F 7F 63 E6 99 3C E7 5A 80 F8 F8 
                    80 02 3E 3E 02 18 7E 18 3C 66 66 66 66 7F DB 1B 
                    1B 3E 38 6C CC 00 00 7E 7E 18 7E 7E 18 18 7E 18 
                    18 18 18 7E 18 00 0C 0C 00 00 60 60 00 00 C0 C0 
                    00 00 66 66 00 00 3C FF 00 00 FF 3C 00 00 00 00 
                    00 30 78 30 30 6C 6C 00 00 6C FE FE 6C 30 C0 0C 
                    30 00 CC 30 C6 38 38 DC 76 60 C0 00 00 18 60 60 
                    18 60 18 18 60 00 3C 3C 00 00 30 30 00 00 00 00 
                    30 00 00 00 00 00 00 00 30 06 18 60 80 7C CE F6 
                    7C 30 30 30 FC 78 0C 60 FC 78 0C 0C 78 1C 6C FE 
                    1E FC F8 0C 78 38 C0 CC 78 FC 0C 30 30 78 CC CC 
                    78 78 CC 0C 70 00 30 00 30 00 30 00 30 18 60 60 
                    18 00 FC 00 00 60 18 18 60 78 0C 30 30 7C DE DE 
                    78 30 CC FC CC FC 66 66 FC 3C C0 C0 3C F8 66 66 
                    F8 FE 68 68 FE FE 68 68 F0 3C C0 CE 3E CC CC CC 
                    CC 78 30 30 78 1E 0C CC 78 E6 6C 6C E6 F0 60 62 
                    FE C6 FE D6 C6 C6 F6 CE C6 38 C6 C6 38 FC 66 60 
                    F0 78 CC DC 1C FC 66 6C E6 78 E0 1C 78 FC 30 30 
                    78 CC CC CC FC CC CC CC 30 C6 C6 FE C6 C6 6C 38 
                    C6 CC CC 30 78 FE 8C 32 FE 78 60 60 78 C0 30 0C 
                    02 78 18 18 78 10 6C 00 00 00 00 00 00 30 18 00 
                    00 00 78 7C 76 E0 60 66 DC 00 78 C0 78 1C 0C CC 
                    76 00 78 FC 78 38 60 60 F0 00 76 CC 0C E0 6C 66 
                    E6 30 70 30 78 0C 0C 0C CC E0 66 78 E6 70 30 30 
                    78 00 CC FE C6 00 F8 CC CC 00 78 CC 78 00 DC 66 
                    60 00 76 CC 0C 00 DC 66 F0 00 7C 78 F8 10 7C 30 
                    18 00 CC CC 76 00 CC CC 30 00 C6 FE 6C 00 C6 38 
                    C6 00 CC CC 0C 00 FC 30 FC 1C 30 30 1C 18 18 18 
                    18 E0 30 30 E0 76 00 00 00 00 38 C6 FE 78 C0 78 
                    0C 00 00 CC 7E 1C 78 FC 78 7E 3C 3E 3F CC 78 7C 
                    7E E0 78 7C 7E 30 78 7C 7E 00 78 C0 0C 7E 3C 7E 
                    3C CC 78 FC 78 E0 78 FC 78 CC 70 30 78 7C 38 18 
                    3C E0 70 30 78 C6 6C FE C6 30 00 CC CC 1C FC 78 
                    FC 00 7F 7F 7F 3E CC CC CE 78 00 CC 78 00 00 CC 
                    78 00 00 CC 78 78 00 CC 7E 00 00 CC 7E 00 00 CC 
                    0C C3 3C 66 18 CC CC CC 78 18 7E C0 18 38 64 60 
                    FC CC 78 30 30 F8 CC C6 C6 0E 18 18 D8 1C 78 7C 
                    7E 38 70 30 78 00 00 CC 78 00 00 CC 7E 00 00 CC 
                    CC FC CC FC CC 3C 6C 00 00 38 6C 00 00 30 30 C0 
                    78 00 00 C0 00 00 00 0C 00 C3 CC 33 CC C3 CC 37 
                    CF 18 00 18 18 00 66 66 00 00 66 66 00 22 22 22 
                    22 55 55 55 55 DB DB DB DB 18 18 18 18 18 18 F8 
                    18 18 F8 F8 18 36 36 F6 36 00 00 FE 36 00 F8 F8 
                    18 36 F6 F6 36 36 36 36 36 00 FE F6 36 36 F6 FE 
                    00 36 36 FE 00 18 F8 F8 00 00 00 F8 18 18 18 1F 
                    00 18 18 FF 00 00 00 FF 18 18 18 1F 18 00 00 FF 
                    00 18 18 FF 18 18 1F 1F 18 36 36 37 36 36 37 3F 
                    00 00 3F 37 36 36 F7 FF 00 00 FF F7 36 36 37 37 
                    36 00 FF FF 00 36 F7 F7 36 18 FF FF 00 36 36 FF 
                    00 00 FF FF 18 00 00 FF 36 36 36 3F 00 18 1F 1F 
                    00 00 1F 1F 18 00 00 3F 36 36 36 FF 36 18 FF FF 
                    18 18 18 F8 00 00 00 1F 18 FF FF FF FF 00 00 FF 
                    FF F0 F0 F0 F0 0F 0F 0F 0F FF FF 00 00 00 76 C8 
                    76 00 CC CC C0 00 CC C0 C0 00 6C 6C 6C FC 60 60 
                    FC 00 7E D8 70 00 66 66 60 00 DC 18 18 FC 78 CC 
                    30 38 C6 C6 38 38 C6 6C EE 1C 18 CC 78 00 7E DB 
                    00 06 7E DB 60 38 C0 C0 38 78 CC CC CC 00 00 00 
                    00 30 FC 30 FC 60 18 60 FC 18 60 18 FC 0E 1B 18 
                    18 18 18 18 D8 30 00 00 30 00 DC 76 00 38 6C 00 
                    00 00 00 18 00 00 00 18 00 0F 0C EC 3C 78 6C 6C 
                    00 70 30 78 00 00 3C 3C 00 00 00 00 00 B8 00 0E 
                    00 C1 74 8B 33 B8 40 40 E1 8A B1 D2 FE 52 CE B0 
                    EE EC 0C 02 E8 93 8A 58 93 3A 76 8A 8A 98 CA D2 
                    C8 C8 C8 C8 E0 D2 E0 D2 8B 4C 0B 5B 05 07 EB F7 
                    4C 8B 0B 74 48 07 76 B8 00 86 FA 81 C0 74 42 C4 
                    FB FA 03 01 C3 8B 8A 98 D8 26 00 D0 E3 9F 00 4A 
                    F6 32 03 D1 03 97 8A 8A 98 CB D8 26 00 F0 E3 9F 
                    00 85 F6 32 80 0D 0F 0B E8 07 F6 20 F5 D1 D1 D1 
                    D1 8B D1 D1 03 32 80 13 0A E0 E0 E3 E3 E3 F9 73 
                    D1 03 03 87 C3 1E 33 8E 58 FF 40 1F 52 8B 63 F6 
                    87 08 0C C2 EC 20 C0 EE 0C C2 A0 00 08 A2 00 5A 
                    52 8B 63 F6 87 08 0C C2 EC C0 C0 EE 0C C2 A0 00 
                    F7 A2 00 5A 50 BA 03 01 42 0C 8A B0 4A 5A C3 50 
                    BA 03 01 42 24 8A B0 4A 5A C3 53 07 2D 04 03 35 
                    06 00 74 D0 3C F5 00 17 23 1E 00 E3 80 09 05 FB 
                    75 04 EB 3C 72 3C 77 04 EB 04 5B FA 43 B0 EE 40 
                    EC E0 86 FB E8 FF C3 AE C3 E8 FF D8 EE 73 E2 C3 
                    BA 00 28 F7 8B FA 43 B0 EE 42 8B EE C4 FB 61 EC 
                    FE 03 E8 FF 61 EC FC C3 1E C4 A8 E8 BA 04 07 C3 
                    8D 08 8D 08 B5 3C 77 74 3C 77 33 F6 89 10 30 36 
                    3F 0E 0E 00 E1 80 09 1E F9 74 8D 7A B5 EB F6 89 
                    10 0A 36 3F 3E 4D 0E A2 E8 00 FE E8 02 C4 74 A1 
                    00 26 00 C4 0E 00 9E EB 8D 7A 3C 74 3C 72 8D 4C 
                    3C 76 8D 08 33 8E 89 0C 8C 0E E8 01 08 02 E8 00 
                    12 F6 0E CB D3 08 CA F3 02 CE E8 00 18 54 B0 EE 
                    EC C8 4A 03 42 FE EE E8 00 E8 00 21 09 42 4A 80 
                    17 24 EE B0 EE EC C0 E0 B0 EE 8A EE C3 50 1E 40 
                    8E 8B 63 83 06 A8 1F 58 B0 EE EC 7F 4A B0 EE EC 
                    80 4A 1E 53 8A 32 33 8E 26 36 01 8C 0E B9 01 D2 
                    1F 53 18 5B 0B 74 E8 01 5B 1F 1E 53 B4 06 26 7F 
                    8C 0B 74 8B 26 6F 80 FF 4C 3A 75 33 26 4D FE 88 
                    84 26 0D 0E 00 E9 8A 01 8B 04 C5 06 8B 02 D9 FF 
                    01 12 DB 0E C9 C1 89 0C 26 1E 01 CF A4 80 01 07 
                    C4 10 C4 06 C3 DF 46 DF 8A 07 FD 74 43 E8 F2 C9 
                    8A 3B 85 75 8A 26 4D 33 26 75 BF 01 D9 DB 0E C9 
                    C1 89 0C 26 1E 01 CF 4E 80 02 5B 1F 1E 53 26 7F 
                    8C 0B F8 32 DF 8A 07 FD 74 43 E8 F2 8A FE 88 84 
                    26 4D 89 85 26 75 33 8E 89 0C 8C 0E F9 5B 1F 50 
                    00 8E 8A 98 D9 02 C8 C4 E8 D4 C4 0D E0 05 E2 C2 
                    F8 D9 DF CB E3 FE 32 B8 00 C3 C9 10 32 41 CA CB 
                    A4 F8 CA F4 C3 50 00 8E 8A 98 02 C8 C4 E8 D4 C4 
                    0D E0 D0 CF E7 FE B3 2A 87 AC C0 18 E4 FA 05 E0 
                    F8 C0 ED CF A4 CB AA E3 C3 50 8A BA 03 02 04 B0 
                    B4 EF CE B0 B4 EF 06 04 B0 B4 EF D1 C2 EC C0 32 
                    EE D1 58 50 8A BA 03 02 03 B0 B4 EF CE B0 B4 EF 
                    06 0E 06 00 74 B4 EF 04 00 8A 83 06 BA 03 20 8A 
                    59 C3 56 52 DA C4 B9 00 01 00 B4 E8 01 C2 AC BA 
                    03 03 00 8B E8 FD 19 32 E8 01 1E E8 FD C6 FA 5A 
                    74 83 06 90 EC 08 F8 90 EC 08 F8 C0 B0 EE EE B4 
                    AC 6E B4 AC 68 FB CE B9 00 E4 12 8B 83 06 C0 FA 
                    BA 03 14 C0 48 E8 FA 5A 5E 51 56 8C 8E F6 89 08 
                    30 8E 83 06 C6 FA BA 03 10 32 E8 00 AC 11 14 FE 
                    E8 00 BA 03 FF 1F 08 E8 00 5E 59 1E 49 8A 89 B1 
                    B5 E8 FB D1 8B 2E B7 02 C8 D8 FF 3E 1F 1E 8A 89 
                    A1 00 E0 49 8B 63 C5 A8 C4 04 74 C5 0A DB DE 66 
                    DE 4F 80 FF 5C 3A 75 FC 0A 74 79 B4 FE B0 EF C2 
                    EC C0 83 03 0B 74 8A AD E0 56 34 80 10 0D 74 E8 
                    00 C4 C9 EE FE E8 F9 CC 30 5E 8A AD C0 0A C8 8A 
                    C5 E8 00 1F FA E8 F9 C4 F8 C3 FA E8 F9 06 FE E2 
                    FB 8C 0B 74 8A 80 1F FF 88 C3 FC E2 C8 8A EE C9 
                    AC F2 F6 06 03 22 E8 01 C5 C9 E2 FC E2 C8 8A EE 
                    C9 AC D8 8A AC C3 C4 74 E8 00 32 FE FE 75 C3 FC 
                    E2 09 20 08 BA 03 C5 BA 03 04 7C 8A 08 C4 74 E8 
                    00 04 FE 46 75 BF 00 C8 8A EE C9 8A 8A F8 5C F6 
                    06 03 A8 E8 00 C5 4F DE 08 BA 03 C5 BA 03 04 7C 
                    8A F0 C4 74 E8 00 BA FE 46 75 FE 75 BA 03 10 BA 
                    03 10 8D DC AC F8 D8 98 E2 BA 03 00 BA 03 10 8D 
                    CC AC 10 F6 06 03 40 E8 00 EF C3 52 D8 21 E3 D0 
                    32 2E 87 02 D8 E3 2E 97 02 E8 E8 D8 E3 2E B7 02 
                    E8 E8 D8 8A 88 8B 5A 52 57 F6 FF BA 4C F7 03 13 
                    BA 97 C7 F7 03 13 BA 1C C3 F7 03 13 D1 83 00 8A 
                    8A 8A 5F 5A FA EB 8A EE 00 C3 FB FF FF FF FF FF 
                    FF FF FF FF FF EC 7A 7A 80 FF FF FF FF 43 70 72 
                    67 74 43 4D 41 20 6F 70 74 72 43 72 6F 61 69 6E 
                    20 39 32 20 39 33 20 39 34 20 39 35 20 39 36 20 
                    39 37 20 39 38 00 57 2A 4E 2A 50 2A 4A 2A 41 2A 
                    4C 2A 56 43 30 43 4D 41 20 FF FF 35 31 2F 38 FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                    
                  • 1987-10-27.json
                    {"data":[
                    -399463851,-303561389,46589952,-622263437,-393504768,-661733325,1075758330,1112117248,-2144975539,141938495,-1896873800,-261768256,17434252,17309321,-1912586056,199504600,
                    -2147256851,-726007348,-2147241981,1622347980,-973604425,175374338,-1341934406,46891015,1235418039,-1993963520,-2028042240,-2009167872,1662421248,9168896,1912887528,53471342,
                    -402479640,378143218,-85458871,60418049,8988288,-259286791,-1976640117,-805222980,201815023,72607984,-317997005,-1976695436,-1962848834,436320488,-2048335994,133922902,
                    243271029,-402259831,173146182,-402426670,-695860811,-402542360,173670861,-402164526,-318045787,-695859852,-1946051352,100664776,1994971278,-390411516,-300502970,-1342111046,
                    -1161564672,28311810,1189657326,-1007808848,-768474186,8980214,-167021567,67143942,129372788,116788971,1946288263,-1979206142,83001558,537923779,537923616,537923632,
                    537923616,235864112,252645135,117964816,-1073739502,0,0,0,-1073741432,0,0,-402650862,0,0,0,-402652766,
                    0,0,30146586,49152,0,0,0,0,1703936,-402652724,0,0,0,0,0,1040639,
                    117440512,251594754,4128768,524560,16777216,16908800,17040384,84018432,100730368,134219269,117442561,117835522,287969578,287969578,287969578,296358186,
                    287969642,287969578,287969578,296358186,296358250,292163946,292163946,292163946,296358250,292163946,1568149586,1568169336,1568169336,1568169336,1584946552,1584946808,
                    1584946808,1568169336,1584946808,1568169336,1568169336,1568169336,1568169336,1568169336,1573019000,336593920,370279938,471337992,505024010,1058351616,378229328,-1031602077,
                    -289394170,1405311066,-478029173,-1014300657,901745198,270436865,-807174144,512286474,-1645740016,-389850284,-806877782,-400395773,494011478,1912926440,94955544,1235227506,
                    -804802048,-790048536,-388837144,-320274503,-2068135166,-301879296,-725949390,2222083,-864025739,62175746,1962940136,30179331,-184288128,279971955,-1274937112,-997525245,
                    263213251,-1964227858,-296046368,-50271238,-33686019,-34800387,-33686019,-2030306051,-2142572860,-1017619716,-2068183522,-301486080,4049036,-1912048152,1981189080,-1925059745,
                    -1956675530,-1073694466,12107918,-1176989976,-201588720,-1960741466,643790358,1608916619,1608916539,410127735,-450983386,-451003809,-1341295009,25421936,-661731188,22025869,
                    -1014047949,1601189517,-1526710081,1949732267,8175455,915254181,213868402,-1146379007,-1014104000,-1472295534,-1416451328,516103943,-1342143302,-826610171,-300961789,-301617086,
                    -527807764,-456071984,-536150832,-461352781,-1057193792,-125157259,1122896816,-115062036,-940121974,-1291029184,-1996032431,645136640,-167457664,427131079,12145331,-388395320,
                    309592096,8438145,-805242495,-863965326,-284446718,-1014364693,838918376,-284184348,1048691487,-1437270016,-2068177213,-301551616,1662422012,113410816,235129023,-1623814881,
                    839037957,-1184648193,1038614529,841642752,244196,-805293080,-396053547,-791674836,-388971214,-980806798,41150672,434659507,-305095680,1939723472,180587017,8120519,
                    -939594446,-997536030,1381221151,-1395094868,-84150134,1946724588,852985849,-1404899648,1206436742,-678999462,-1460864261,-319195896,-76217944,-335297862,-678965110,1122943026,
                    -661981046,1247421928,-1024010361,-117345264,-1161602214,196083844,1036553454,1962459136,63879705,1122896304,-335483910,-33686019,-67305987,1962442920,1355020545,1347572051,
                    1476612584,-301955910,78770212,-1952913198,-2020987176,-1329920625,-1964166652,1625587936,-321780303,266587274,-1476330822,-1174178688,1189610472,-1963204096,216301792,-321781071,
                    266587274,-1476330822,-1174178800,719848424,-100933120,1482381658,-1158859837,95420549,8698606,-387055440,868418282,48556269,-2051358670,-2068124160,1355017728,-1957539501,
                    1387587786,-402587463,1499091616,-2134681509,-1465341784,-1465341824,-2139051864,142639232,135596040,134748936,134744101,453511189,136644616,135596040,134748936,-402252251,
                    -1141091874,-2068119553,-301289472,-1341930310,-284183550,-1274818886,-402083835,45371596,-1902116679,-1077834023,-880082943,-1426915152,-5177549,604025002,1353639951,-1090518594,
                    -880082943,1975582380,-1429668307,-5179678,-1779953884,871773008,-1395946497,376815870,-1392975190,242598142,254017712,860912616,-1057051402,-922874252,845902,-1159159796,
                    32242174,-1021376520,-789119181,57872444,838862015,309723,-1274818886,-402542585,1015697480,175491070,-523189250,263254498,-13497877,-1976639741,-1022817913,-1342143302,
                    915140098,-964493213,3324166,-1957593112,-321483816,276105384,1934722536,-1326587148,-396825824,-661958296,-1460873589,-401902584,-193769106,548466146,-896843285,4438778,
                    871248048,4242112,-897057810,1963501804,-1460864261,-2013563896,-289109302,-1460874869,-319064824,-76281688,-1185864728,-1027950054,846016,-336067726,-400445434,-1007026691,
                    57852219,-1007304133,-1342143302,915140099,-695533469,1122898352,-293657364,-1342065590,1334241320,-2097146695,-504887610,-1948742832,27847894,-404222348,-487296176,-399709203,
                    -661958452,-1460873589,-401705727,-193769262,401337826,-1957644312,-321483816,-814413656,192151976,1934670312,-1326849296,-332141776,-76281688,-322358278,-76217944,1946265836,
                    145288443,27788917,-253560971,-1193674757,-1195703960,1925724929,2009807623,116127747,1458057648,-1161561603,145752196,1662946286,113476352,-1174404167,263455680,-1460872569,
                    -84184056,850451079,-289109266,-628629366,1963043052,807730171,1517617212,-502217600,-1158509603,263455680,-1108852816,-299847602,-609220172,263454514,-402632519,-2068164796,
                    -301355008,62512779,62962176,-628682828,1946724588,-628622597,-1964100944,-527765820,-1460872569,-67406591,809250852,-998241163,-119676400,-2135810581,-1867382037,-1322195840,
                    -789786108,-1310404380,183030276,-389936444,-1007027031,4438778,-1158793552,-1070464960,-1006899474,-1342143302,870903300,63486543,-1326579280,50182400,-35459518,-1337790902,
                    15461951,-301929490,-1341929542,-38146559,63552002,1962949868,1257890409,1122894256,-38191184,-35459582,-1341929542,-38146560,63552002,1967078636,1257890377,1122894000,
                    -38207312,-35459582,-1341929542,-910496001,243971,1967078636,-1158028759,11535303,63552238,-335543367,376766524,62519778,63486464,-922828750,1119944430,-117579026,
                    1085277931,-100928280,84411587,117573121,405274627,151519240,1661075459,-1876416723,532652075,117884672,0,344952476,-1548118497,33620223,100992003,303108103,
                    370480147,251660311,0,235929600,405339904,151519240,1661075459,-1876416723,532652075,117884672,0,344952476,-1548118497,33620223,100992003,303108103,
                    370480147,251660311,0,235929600,407961344,17825800,1661075459,-2108666017,532644181,117884672,0,680496796,-1548118497,33620223,100992003,303108103,
                    370480147,251660311,0,235929600,407961344,17825800,1661075459,-2108666017,532644181,117884672,0,680496796,-1548118497,33620223,100992003,303108103,
                    370480147,251660311,0,235929600,405339904,155189256,1661075459,-1876416723,532643883,49408,0,344952476,-1564895744,353566975,100925975,303108103,
                    370480147,50331927,0,254803968,405339904,155189256,1661075459,-1876416723,532643883,49408,0,344952476,-1564895744,353566975,100925975,303108103,
                    370480147,50331927,0,254803968,407961344,20971528,1661337601,-2108666017,532643924,49408,0,680496796,-1028024832,387383551,387389207,387389207,
                    387389207,16777495,0,218103808,407961344,1048590,-1509752829,-2108666017,532644181,202067200,0,677217667,-1548066035,134742271,134744072,404230152,
                    404232216,251661848,8,168820736,407961344,561840144,1661337615,-2108666017,532644181,16384,0,680496796,-474376673,33620223,335873027,976828423,
                    1044200507,251658559,0,83886080,65295,0,0,0,0,0,0,0,0,0,0,0,
                    0,0,0,0,405274624,4194312,587399168,925706039,285480241,117851904,0,348595425,-1544495096,33620223,100992003,303108103,
                    370480147,251660311,0,235929600,5308160,687865856,1644560399,-2108666017,532644181,16384,0,680496796,-474376673,255,0,0,
                    0,251658559,251658240,84410368,5308175,687865856,1661337615,-2108666017,532644181,16384,0,680496796,-474376673,255,0,0,
                    0,251658559,251658240,84410368,405339919,153092104,1661337615,-1876416723,532643883,49152,0,344952476,-474376704,33620223,100992003,303108103,
                    370480147,251658519,0,83886080,407961359,20971528,1661337615,-2108666017,532643924,49152,0,680496796,-474376704,33620223,100992003,303108103,
                    370480147,251658519,0,83886080,407961359,92274702,-1577058289,441864032,527491152,0,0,341651038,-1955701248,524543,1579008,524288,
                    1572864,83888896,0,118489088,407961359,92274702,-1493172209,391335771,527219280,0,0,341650270,-1962254577,65791,459776,65536,
                    459776,83886336,0,118489088,407961359,25165838,-1576665073,-2108666017,532643924,16384,0,677217667,-474324209,524543,1579008,524288,
                    1572864,83888896,0,83886080,407961349,25165838,-1559887857,-2108666017,532643924,16384,0,677217667,-474324209,33620223,335873027,976828423,
                    1044200507,251658559,0,83886080,405339919,151519246,-1560150013,-1876416723,532652075,202067200,0,341673347,-1548066017,33620223,335873027,976828423,
                    1044200507,251660351,0,235929600,405339904,151519246,-1560150013,-1876416723,532652075,202067200,0,341673347,-1548066017,33620223,335873027,976828423,
                    1044200507,251660351,0,235929600,407961344,17825806,-1560150013,-2108666017,532644181,202067200,0,677217667,-1548066017,33620223,335873027,976828423,
                    1044200507,251660351,0,235929600,407961344,17825806,-1560150013,-2108666017,532644181,202067200,0,677217667,-1548066017,33620223,335873027,976828423,
                    1044200507,251660351,0,235929600,405339904,134742032,1728184323,-1876416723,532652075,235753216,0,344952476,-1548118497,33620223,335873027,976828423,
                    1044200507,251661375,8,235929600,407961344,1048592,1728184323,-2108666017,532644181,235753216,0,680496796,-1548118497,33620223,335873027,976828423,
                    1044200507,251661375,8,235929600,407961344,1048592,1711407107,-2108666017,532644181,235753216,0,680496796,-1548118513,134742271,134744072,404230152,
                    404232216,251661848,8,168820736,491847424,27262992,-486146033,-2108666017,1040941140,16384,0,685739242,-1023088896,1061093631,1061109567,1061109567,
                    1061109567,251658559,0,83886080,491847425,27262992,-486146033,-2108666017,1040941140,16384,0,685739242,-486217984,33620223,335873027,976828423,
                    1044200507,251658559,0,83886080,405339919,33161224,1661861903,-2108666017,532643924,16640,0,680496796,-1548118464,33620223,100992003,168364039,
                    235736075,251674895,0,88080384,268500751,1061105439,1061109567,792674111,4127,0,656343040,1061107503,1061109567,926891839,522135343,522133279,
                    825040671,1061108278,1061109567,977223487,757936438,757935405,117452077,471602446,471604252,354163740,1806,0,286130176,471603221,471604252,404495388,
                    235802901,235802126,370413070,471603736,471604252,438049820,336860696,336860180,67114004,269487112,269488144,202379280,1032,0,168296448,269487628,
                    269488144,235933712,134744588,134744072,202049544,269487885,269488144,252710928,185273357,185273099,16780043,84148994,16779028,84148994,959973140,1027357498,
                    959987518,1027357498,16793406,84148994,16779028,84148994,959973140,1027357498,959987518,1027357498,16793406,84148994,151521030,218893066,286265102,353637138,
                    421009174,488381210,555753246,623125282,690497318,757869354,825241390,892613426,959985462,1027357498,16190,0,117899264,117901063,1799,0,
                    1061093376,1061109567,16191,0,117899264,117901063,1799,0,1061093376,1061109567,16793407,84148994,959973140,1027357498,83902270,286133000,
                    538712084,841820196,-2142224584,74825724,99294644,1931345024,1444870976,-1912586050,1465190110,-1957539501,12582124,1228832944,141821696,1924661439,-1610563837,-259275642,
                    -427703162,-422510337,1586822958,1532582418,1577540959,41048095,1120753871,312119503,357176512,365434216,370283978,409867792,437131718,487988166,511188416,521933914,
                    620896898,751707742,751971536,751971538,660745426,688531420,-527815456,-461340892,1980972160,-2079930847,113711104,524421,8851072,-1900006648,839290328,17605454,
                    17698444,243975161,-511704953,-1993438473,270437120,-788821504,-788847889,-1965585681,-790376231,-151309597,-790787369,-790376221,-153154845,149127379,-1451894006,-427757430,
                    851901959,147257074,512431732,-478150640,-789852112,-789851925,788476651,343181194,176152960,29750988,-169344140,-2029090816,64272896,-478095222,432242695,706798464,
                    1662421459,-1070361856,-1577038173,1049428066,146341968,-217637376,199791531,1662421829,113410816,-1061491462,-299847677,1226738427,-2130759168,275974395,-1333294546,6660628,
                    -1199076818,6726164,102679544,-1571663024,937951305,651791428,-1004128315,-1014233985,-775649640,65589736,-1900006416,-1557746495,648806474,-1409252190,8758054,1285760685,
                    -389837312,-672643048,1217062979,-1911595893,-2029586727,964001792,-2135949121,117459262,12519540,-1090290504,-946954240,1078084584,4990711,-930359087,5127819,-2147016520,
                    117459262,1048578420,1979908169,-205507838,-2033480789,11069645,1514380264,520575067,-355417096,-494867760,-35553278,-661992950,378208050,-225836920,-2131697024,-439349274,
                    -305081392,2023164462,-2011789292,787711488,346074890,8990344,-2019520317,176169984,-2013247226,1252069446,289835008,-2013240672,-1007155898,117637379,134809609,134809609,
                    134809609,185272329,134809609,185272329,134809609,185272329,134809609,134809609,8421504,-2139095040,128,0,690825260,689843754,808464432,809447472,
                    8849142,57997576,-1953464341,-2061595695,1664518912,1611565312,1959922176,1073643607,-956935561,-1174047712,1223368192,62193281,116802164,1962999943,1995586107,-2131589630,
                    158664954,-25113858,-33393400,150700238,146219636,192075578,1947138944,974042903,-1978567721,5695686,-1031081846,1307099390,5826560,-1958487576,-1328116790,-270169590,
                    -511046736,273058287,-544553992,-472776910,5281673,507177937,158662754,378260107,1172832355,-1866205184,-13443190,-1752439855,243990608,1317601376,5671170,-470367240,
                    -456067082,-63257346,-1866268652,-443887478,343204138,-1003830390,-134814670,-989928240,1375290,-802504450,1252102339,853931520,-1950284819,-788509170,-1967062039,-1327461684,
                    246476559,-1007689334,-661994503,977298408,-1979549992,1646168280,5021952,-470286542,-1979691357,-2147464938,91620346,1963457152,-1947676414,-1962908906,-1327461688,-1963984371,
                    -284380955,-1948003845,-402632561,-1007091812,512397565,971505762,-1966633470,973097502,-1979419949,-2134180141,-587857436,-897119111,-785713878,-621355274,-181795605,-956378838,
                    1048625918,1979908169,1228832789,1869743872,1048579188,1913454665,16509187,-343161863,-444470741,-439287553,-980748149,-315431946,-523124477,-1952987645,-2048657680,-150701578,
                    -773982248,-1765342240,8849142,-402426876,102645990,1958773791,1942370836,-1963972080,61207498,-16972811,-1963690546,-1327002896,-204830176,-16972885,536245710,-2147383319,
                    100682046,-506461068,1354621648,-1969794560,-1729285435,-150912838,62981090,-259287098,21019288,-158997769,-654897031,-947790345,1048584432,1946550345,-956086527,1519787782,
                    -2065724589,976254144,707556294,-422555408,-963909936,-74714997,-1527526774,-74714997,536934017,536934273,-1527526774,-586955517,-529150210,-789542312,1491521766,-74726262,
                    -1426863478,-142476405,-896917504,-586962189,-361378050,1375795689,-444470389,1048576255,1964179529,-773467898,-1947872795,-1964233992,-1600546620,-436862843,-145571325,-315467035,
                    4800128,722105619,-773729846,65130977,62981066,-259287098,8726262,-1973754377,-2147436834,318785854,-489617803,-489561391,-158995925,-654900103,-956047881,1958773910,
                    1942174263,1356343859,4800128,1376810003,-1207710022,-1158741755,45614020,-1604653297,-470417275,-1899918306,-204829735,66388900,-176862979,-662022113,-167737952,-628451613,
                    4800128,-1172671469,95945678,-994382080,-1326632445,-284183550,-1328838057,-341118208,-1966437619,61535175,-176861443,45097707,-1963989110,-5218357,-50091277,-1328253618,
                    -284183550,116787947,1946419335,1057024003,1397801976,-639085999,1993882173,-1579644414,-13500340,-259267593,1482381658,-946995005,4793994,1979972736,133988359,1366756210,
                    -398573592,-974585626,-385928704,-1008189866,76239104,1963115510,-1950054890,199283152,-2046249776,-790441503,-488451632,-1428060424,536934017,-528418944,-2096765991,-756330298,
                    -1898237096,2082391515,-1243968512,-343887488,1041295440,512476042,2011693130,322720000,-108387723,79286834,20753664,-2133667595,-789249540,-1963793710,-805393726,-964617100,
                    -521469640,-1341927750,-284642299,-789183350,-487390294,-1274695433,-1252462848,-1949158656,-1896467494,204916190,-2030269695,-387873084,292749400,-208938354,158652939,1239999878,
                    33714688,1106064069,-73343,1183441155,-1866205168,-2062644390,-511622912,-517210114,244055179,369492101,-1018028281,8849142,-1961724924,-2097126634,-1460926782,-84183807,
                    1946265836,93005563,1364444155,-779463342,-359926222,-192227958,-544487797,-1947169962,-204633093,51279014,1976237765,1589654256,-335938677,-970236406,-235483765,-1963394165,
                    1499094502,-946945189,4793994,1979972736,133988362,2011694452,-1959728384,-387347469,-561300256,-477442677,8855178,6493835,-167329149,259261635,-1460866933,-84183807,
                    1946265836,-1413051397,-118955269,-946958141,4793994,1979972736,133988362,803734900,-1960056064,1016785129,512413067,378208391,-1031602077,79951366,-125169804,1963043052,
                    -1460864261,-1963232255,1207675591,-1007097886,-91499637,-58660469,-2147126253,41355260,-397344974,-1957151618,-2030009074,869698551,335249654,-360050572,-2139036288,-75464734,
                    -381259257,-561119051,17577669,-503913422,-628363261,-292884086,78730839,-1966044500,1927467203,-1966634494,1927467235,-1410889214,-344602114,108318206,20498305,1600052459,
                    1292420995,-68562827,-975270400,-1476326346,856323200,-975270154,604011574,65140351,65175792,-1973987757,-75453199,1394766854,-125171533,-523116335,41150416,-872496630,
                    -2040794507,1961691844,87238147,-351958746,1961691658,87172611,-2130343898,-2145386249,58032375,-28260477,1606317518,-2142807202,24381179,-1401598649,-1979676183,1243515875,
                    -2146453760,41226748,-685637193,-561055098,17577669,-268181002,1978468946,-494250203,-1341930310,-510988542,-746139085,53839910,1976368890,1607698167,-994383990,-285036541,
                    -994438933,-1979535357,-826609689,-1274826749,1465315096,-628698573,-318054006,-1977220236,-2010731515,-17169659,-2031127092,1197367251,-1535816358,-994385270,-285036541,839110330,
                    -284970780,116785347,-116916089,780872565,646578275,-58720183,1998418951,66879517,-16105609,2045251445,-389248512,297074846,-352256536,7923715,-16071688,1642602101,
                    268206080,-863348364,-1258257944,14739456,1997536384,-401492662,1139474646,-352300568,117211198,-16112780,904402805,-389467648,11862106,-1258243608,11855889,-352293400,
                    2943006,-352295448,1979648534,1239055,938002738,-402541312,65732758,-134213144,1721798851,-2132794368,-1022746653,-1023383902,-1325276288,-1595682299,-551288730,1721942794,
                    -1472805632,75285504,-1866255163,11024069,-989561660,852593204,-754535946,-2133457950,-13496349,52675459,-1022391590,-393607503,-164440950,-234626349,61931956,-165362045,
                    58007749,-2147236221,-981266203,62962182,-319100281,-76281688,615312007,-389739793,-2115487288,-1329267136,-17043936,-1008634423,-1828301171,145288442,-1164706956,-393149504,
                    -58705496,-33393391,1079699660,548455558,-71006482,-946945135,512425779,-75497399,-402098925,-2010775230,-2134640635,343017467,1997601664,-2030400753,653760711,-678756276,
                    -947455861,-538385526,133988352,-472753294,-58716235,-1258130159,-930441215,-671691486,145811334,-284963142,309657354,414450608,-1979535121,63224545,92940015,45094123,
                    -994384502,-738791677,-165863386,-1979535149,-2010714143,-1979535331,61927397,-826612686,145813251,-336605954,-1021143020,-469049134,807798132,637987589,-955630302,-1866205014,
                    -13383794,4791946,1964243840,10020872,-351958490,133922893,-91550350,-140982390,-1962914778,-1963422761,3991779,1913126016,-1327246808,301760515,28639861,-826605774,
                    -402344957,-1977206620,-756342227,182964461,2043215613,-339244306,92939785,-954017802,1183377618,-1866205168,1997405312,-787844086,-2130414614,-786431801,-773664286,65196514,
                    -773664262,-1208351774,117211390,-774830989,-544544816,-779365386,-355341615,-100406575,-511651338,-1010314745,112327051,-100408621,-489561391,12843523,6426250,-315426422,
                    -422457721,5280907,427232572,171721076,138166644,121385332,-2068116619,32815363,-130443800,113091,-400664750,1595931488,985857626,1912621590,-19779038,-2076820794,
                    -31951360,-2078413874,-32017198,839707594,973663186,1929413686,-1966670325,-402628034,-1007094168,-1977723054,-402628034,12056156,4800128,-2146994685,117459262,1049234037,
                    1776812130,293505785,-1202036961,-919403007,4855434,-102184194,12843254,8849142,578156808,1928666172,-1947038948,503341846,638000902,11026116,75351078,-1813982824,
                    1217920814,-1866205153,530325376,538714040,578822784,542253696,546447480,578822784,578822784,578822784,578822396,558768426,565322368,568205952,571351560,575021590,
                    -2087467898,-84212030,1946724588,-1061514247,924248067,-1338126360,-1006899680,833930374,113410963,-1460864261,-1812368376,-402407238,-1310181640,-1866204355,280035508,-981210485,
                    62962182,-360190670,-1460864261,-2013694968,-706171670,1032775734,-973159170,544524798,-1460868473,-2014808824,-1108824854,1031202870,-906050306,-838989196,548466549,-991167506,
                    -2014437200,-319095830,-109836120,833940103,915859628,1307102462,-1866204355,-523107407,-930478044,-1912586056,4825304,-1741185560,-388905850,-661919535,-335101309,-1274822470,
                    -2020987344,-148633275,1575534858,1024911414,-527789885,-1962491261,-319095846,-109836120,-1061501814,-331158013,-2025135990,-628626214,-68280144,-1023056248,-1031589452,-319096058,
                    -109836120,-1061501814,-331158013,88508667,-661876541,-24395634,280035508,-964431221,62962182,-225972942,-1460864261,-2013694968,-289109262,-1437930430,-973159170,628410878,
                    -1460866425,-2014808824,-289109262,-1437930430,-906050306,-226029708,1976434412,-1326282774,-335811040,-299847489,-84151673,1946724588,-1326282759,-331157967,-1866204246,-1962842486,
                    -662044082,-83443069,145288442,-1014302348,-301741894,15401195,-1979463238,15462084,-336673398,-289306112,-527776773,-1170837016,-997588024,-352261138,-1161495040,-290716727,
                    -290717461,-290717461,1776870882,-661994698,-75235534,-788040958,-1744883997,-1866260128,562176356,-83443069,145288442,816904564,-301743942,608889922,-771247745,-289142044,
                    -1031552005,-69563642,145288442,816904564,-301743942,-789124030,-1320517596,-790048249,-758609184,-321222684,884005511,-289109266,-527776773,-83443069,145288442,-997525132,
                    -301742150,-352073286,-335484160,-352237944,1183378432,-335484157,-83736952,-611544893,-24394866,-1209474934,63420981,-336673654,-33494272,63552196,15444716,15444716,
                    -438129940,-1019891736,-301742406,-960851773,1183378435,-1031552252,-321221882,-1341931334,-331157964,-2015327670,-628626214,1122906288,-1317002004,-1964453369,-2133723448,-506429215,
                    1183444178,-527777020,-1170909720,-997588025,-352261138,63552000,-661984006,-1964244757,-335483912,-386153594,-927318968,-289110525,-910506874,1014294531,-807222018,-1019922456,
                    809238723,645137522,54313976,-466481036,-523041615,-58660654,-378440702,-1008205560,-1173850826,-477494332,-118553680,-645099325,-661733325,8132292,980745994,17569476,
                    846516222,378341134,-805421308,378349684,-805417422,378347636,-805416398,378345588,-805417724,378343540,-805425728,378341492,-805421632,-645000075,-1995815284,-2053044138,
                    38177024,-2013231968,-1007157178,-768407778,-1073030514,1321471349,2081327368,2114358272,-25302272,101873096,-1995944252,-1946088434,117509638,-352170357,1976106541,70683913,
                    964927,-922871573,915212661,146361906,-32773376,-1924565560,-1188184010,914948112,244056332,-1993998066,-1979677426,-13499298,167790218,-1341360933,66813977,-1976695433,
                    -31219065,-2069748024,654258688,6430346,1352108838,1995454976,653298183,5281673,234931192,-1605358823,378208329,-1142423453,1490586423,-1977724080,-973130781,1586169974,
                    38701828,167794315,-1924565824,-1154629578,71041040,-58717323,-1926400761,-348274626,70683943,965439,192268542,1963457664,71208215,-1928205491,-1152503242,-922877944,
                    1528759924,8776024,1586166666,16824580,521065011,-1008183469,-1956946122,1962871755,-1551611,-1004578506,-1962891234,1476420374,-29921816,-20084019,-805413939,578156682,
                    -2147479368,292816123,168117898,-1207274277,-872546290,146277236,-1260418560,3205375,1541932011,1662422000,113410816,-1061491462,-299847677,-1962986757,-1962909154,973099159,
                    1979745334,-2076800504,1352108288,-1866205184,-1550298288,-922877819,162586762,619463406,-289142048,-1930421784,-1474378535,935667200,-2036835496,-773271100,-2081422360,-1263788858,
                    -644988927,-2062644327,-2131626240,41222143,-922826870,-33520478,-503867200,1662421832,-1327461888,-75436270,-1341819641,-270431724,-1979692383,-33520610,-773589309,5022688,
                    -75497277,-2144898032,1316233467,-2144277632,158533627,-472776910,547880750,-1866204891,634004844,637412838,641213980,-2019547584,-2132768256,28377828,1613032658,-388889167,
                    -2012985719,-2002775994,-2132768256,78770404,254078162,-134068599,-1070362429,109953166,-1557779146,-1943666668,-1023404530,1299383100,8857226,1963508982,-1992390076,-2011264512,
                    268548608,1946338550,1958742536,-1308490704,-523134961,28637323,-858724574,-192875510,-137038208,786047954,633376139,-653530078,8994440,8920712,303056583,-1866205184,
                    98304,724993,37490699,646583923,61931657,-461315886,-1998583049,-956266202,1183814,37536760,20189555,-523107407,-390461940,1187507782,-134213104,37523651,
                    20191351,8988298,-523107919,184411264,-1993963296,273073920,-1007157230,376635964,8857226,-523108175,184476800,-2027517728,273073920,-1007157230,303056583,-1866205184,
                    410190396,-523106895,-994385782,-301879293,-551228350,-940653558,1183814,54313976,-75091337,-75041909,16770689,-1258297647,45350992,-483341336,142001164,-397300698,
                    -497483756,1190550263,141885712,-1274708342,816769026,222086136,359942007,292817468,225708092,41158460,246691701,-349137944,853510756,-1948003841,-788508521,1021282027,
                    839415053,-402475822,1019424888,-2079558392,-29199150,-402475830,1019424872,-348752630,73304885,34621174,647169140,28939180,-402017280,-544591796,-472776910,5281675,
                    -544805935,372949758,74580042,116118066,770179764,-956382416,8664634,-822152586,501744308,1228832816,225837824,4800128,-1979288569,-335596833,-402082807,-544591868,
                    1381235850,1431787014,-1341737954,-1966525695,-33535466,-289478454,1583308063,-2040833529,1053082619,-1004142424,-1004138371,-1073085827,-478071948,-1014296817,839748134,-2082501651,
                    -218364729,-2045741905,654019552,-315486838,-234567805,724989359,116360187,-388905077,-352286046,9084974,-1948200552,1502291672,4825092,-1057093852,-388962096,-75437872,
                    604402688,1958949377,-335837689,-17661,-1207673207,1183383578,-1866205168,57989899,-67033879,-1928954229,-1425949690,-1179924340,915210255,-1510801335,-1929378887,-218069962,
                    1174283940,436254973,-1959839768,512404419,-13500343,-1517843922,82063916,13926401,782991140,750356362,254075018,-1312519510,2046349828,-167596012,268470534,-922875019,
                    8914678,-33393407,61909704,-301742918,-661984190,-388962096,-527763318,-478024496,69534467,-2034038012,-661935164,639766452,-2019557239,-152532480,-1325325104,182505988,
                    1662421984,113410816,62962412,1122906288,-804772628,182505696,-1429959968,-1070410358,-218102855,616729258,-771378848,-1070421272,41213754,102629644,11024069,-1945871164,
                    1959463873,-1006498814,-1047787428,41208587,1556349964,197233676,201487563,276088072,-1945477948,1959463873,-1005581310,-1014234532,-885274228,537657972,850009863,899520,
                    1187490547,-134210800,1023185091,1946513921,33220901,516481,-1070398091,-1157398807,-372178943,-788475005,13861865,57928145,-385039485,-511638684,91553799,1558822963,
                    -2080666877,-372236089,1089012594,1065952769,-335297350,1662421930,-1951732736,63879922,-1061508372,850062339,-1174030876,-997588028,-1427356946,-28654338,-1158449715,-1427373108,
                    431350834,-997534069,-1427356946,-28654338,-2081196595,-466483518,-1258045250,-319096048,-109836120,-997526905,1256997614,-20644182,-2028964659,145288434,-695735691,-2014437200,
                    -1260721194,-2029734608,-225973006,-68238198,1252715586,-989924729,-311046658,-1962481021,-1159449870,162857934,1122944138,-28661012,1976434372,-1413051405,-1341930310,-331158014,
                    263250058,78662382,1357660910,-1158805840,112198606,-1964227858,-301682464,-301617078,-1336873918,-1205932543,-661741568,1258291106,1122895024,-466464532,-997587787,-24338,
                    -20644182,1492350413,-1337319442,1113124357,112216814,-997571858,63224558,1122895024,-1337266600,-1975325182,642444996,-299874422,-1977166197,-1158799033,-1977220146,-1947327929,
                    113411030,62962412,591890982,1944703214,2139694669,-1608625918,807665680,1030570,4798093,129607155,-2076799744,-1918569728,-1191139274,-1510801406,-644953805,-1191177026,
                    -1510801406,-1191152450,-1510801406,-1191150402,-1510801406,-1191113538,-1510801406,-372221665,-1243020430,2139694593,63420932,-960844819,-1163203581,-1070464057,63552238,-335478599,
                    -335483990,-335483990,-369827158,-511639156,91553799,-2065055693,520494593,1927925767,16509187,-964479093,12060226,-1161785696,78644164,-1158740300,112198606,-1326512972,
                    -285166587,-1341930310,28634626,-1975384907,648867524,-788529246,1976434404,-300961550,134217632,-964479093,79645188,-393565184,28311732,-1396375825,-2031106938,1338310340,
                    -1027934859,-1158763517,11535300,-1947212406,296760916,854582322,-1407601180,-2031106938,-20644156,-2081131059,-1061222718,-1243336189,-319096048,-109836120,-997524857,-17912594,
                    1959657156,-319125744,-327874392,548460423,-338196498,-1255099172,-319125756,-997524857,-290653202,-989922681,-277492226,-1962481021,63879930,162915378,-272333140,-989936506,
                    -193606146,-994429045,-1947292669,-1158763305,-290716722,-1031546997,-1061491706,-789664765,1364358121,-1409124469,270958630,136761088,-1191178234,1049427983,-1510801335,-1929377863,
                    -218069954,-1472295516,178432,856073715,-1077834039,45678612,-1079643392,45678708,-1079643392,45678716,-1079643392,45678860,128316160,1944703065,74943265,63355565,
                    -927273300,-289394173,-1190934086,-290717440,-290717461,-290717461,481883362,273058048,-133931383,252645315,16974607,2139062143,252673919,251727743,-2004317953,16843144,
                    136,67633152,825299474,-1007091711,-1007041543,754330868,754593016,757476634,242681148,-259267534,803792593,-1526780416,-1007080236,-1866231613,494060536,280263,
                    38192896,-1986002944,-788716544,887673064,839126017,4622820,-1007107080,8849142,24508680,225625080,91544330,-349560344,709158916,1397801976,-1155640751,-611450816,
                    109445552,20709632,-1258602124,-1978610417,62149100,1381568717,887673395,-1272942080,-1273967358,-401552120,326238256,-717569282,-768414350,909821694,-562691964,436212456,
                    45374153,-1996877619,520159246,1482381658,-401755953,376569860,861014704,1975551186,-1272926206,-166212352,24379844,12802809,0,0,0,0,
                    0,0,0,0,-2122448896,-1115586139,2122416537,0,-8519680,-1006632997,2130706407,0,0,-16843156,272137470,0,
                    0,-25413616,1063036,0,402653184,-404276164,1008212199,0,402653184,-33220,1008212094,0,0,1008205824,6204,0,
                    -1,-1008205825,-6205,-1,0,1113996288,3958338,0,-1,-1113996289,-3958339,-1,236847104,-864538086,2026687692,0,
                    1715208192,1013343846,404258328,0,859766784,808464447,-521113552,0,1669267456,1667457919,-421042333,192,402653184,-415442152,404282172,0,
                    -524255232,-117507856,-2134843152,0,235274752,1056849438,33951262,0,1008205824,404232318,1588350,0,1717960704,1717986918,1717960806,0,
                    -612433920,461102043,454761243,0,1623620608,-960074696,-972277652,124,0,0,-16843010,0,1008205824,404232318,2115517566,0,
                    1008205824,404232318,404232216,0,404226048,404232216,406617624,0,0,-32761856,6156,0,0,-27250688,12384,0,
                    0,-1061158912,65216,0,0,-26466304,10348,0,0,2084059152,16711292,0,0,2088566526,1062968,0,
                    0,0,0,0,1008205824,404241468,404226072,0,1717986816,36,0,0,1811939328,1819082348,1819082348,0,
                    -964945896,108839106,2093385222,6168,0,403490498,-2033819600,0,1815609344,-596232084,1993133260,0,808464384,96,0,0,
                    403439616,808464432,202911792,0,405798912,202116108,806882316,0,0,-12818944,26172,0,0,2115508224,6168,0,
                    0,0,404232192,48,0,-33554432,0,0,0,0,404226048,0,0,403441154,-2134876112,0,
                    1815609344,-690567482,946652870,0,941096960,404232312,2115508248,0,-964952064,806882310,-20529056,0,-964952064,104596998,2093352454,0,
                    470548480,-20157380,504105996,0,-1057095680,117227712,2093352454,0,1614282752,-956514112,2093401798,0,-956432384,403441158,808464432,0,
                    -964952064,-964901178,2093401798,0,-964952064,108971718,2014053894,0,0,6168,1579008,0,0,6168,806885376,0,
                    100663296,1613764620,101455920,0,0,32256,126,0,1610612736,101455920,1613764620,0,-964952064,404229318,404226072,0,
                    2080374784,-555825466,2093014238,0,940572672,-20527508,-960051514,0,1727791104,1719428710,-60397978,0,1715208192,-1061109566,1013367488,0,
                    1828192256,1717986918,-127113626,0,1727922176,1752721506,-26844576,0,1727922176,1752721506,-262119328,0,1715208192,-557793086,979814086,0,
                    -960102400,-956381498,-960051514,0,406585344,404232216,1008211992,0,203292672,202116108,2026687692,0,1726349312,2021157990,-429496724,0,
                    1626341376,1616928864,-26844576,0,-289013760,-958988546,-960051514,0,-423231488,-824246538,-960051514,0,-964952064,-960051514,2093401798,0,
                    1727791104,1618765414,-262119328,0,-964952064,-960051514,2094978758,3596,1727791104,1820092006,-429496730,0,-964952064,205021382,2093401606,0,
                    2122186752,404232282,1008211992,0,-960102400,-960051514,2093401798,0,-960102400,-960051514,272133318,0,-960102400,-690567482,1827602134,0,
                    -960102400,943225964,-960074628,0,1717960704,406611558,1008211992,0,-956432384,806882438,-20528544,0,809238528,808464432,1009791024,0,
                    -2147483648,946921664,33951260,0,205258752,202116108,1007422476,0,-965986288,0,0,0,0,0,0,65280,
                    1585200,0,0,0,0,2081191936,1993133260,0,1625292800,1718384736,2087085670,0,0,-1060733952,2093400256,0,
                    203161600,-865321972,1993133260,0,0,-20546560,2093400256,0,1815609344,1626366052,-262119328,0,0,-859015680,2093796556,7916556,
                    1625292800,1719037024,-429496730,0,404226048,404240384,1008211992,0,101056512,101060096,101058054,3958374,1625292800,2020370016,-429495176,0,
                    406323200,404232216,1008211992,0,0,-687936512,-958998826,0,0,1718017024,1717986918,0,0,-960070656,2093401798,0,
                    0,1718017024,2087085670,15753312,0,-859015680,2093796556,1969164,0,1719065600,-262119328,0,0,1623620608,2093354040,0,
                    806354944,808516656,473313328,0,0,-858993664,1993133260,0,0,1717986816,406611558,0,0,-691616256,1828640470,0,
                    0,946652672,-965986248,0,0,-960051712,2126956230,16256006,0,416087552,-20553680,0,403570688,409999384,236460056,0,
                    404226048,402659352,404232216,0,409993216,403576856,1880627224,0,-596246528,0,0,0,0,-965986288,16697030,0,
                    1715208192,-1061109566,205285058,31750,13369344,-858993664,1993133260,0,806882304,-20546560,2093400256,0,1815613440,2081191936,1993133260,0,
                    13369344,2081191936,1993133260,0,405823488,2081191936,1993133260,0,946616320,2081191936,1993133260,0,0,1616930364,101465190,60,
                    1815613440,-20546560,2093400256,0,12976128,-20546560,2093400256,0,405823488,-20546560,2093400256,0,6684672,404240384,1008211992,0,
                    1715214336,404240384,1008211992,0,405823488,404240384,1008211992,0,268486144,-960074696,-960051458,0,3697720,-960074696,-960051458,0,
                    6303768,2086692606,-26845088,0,0,913755136,1859704958,0,1816002560,-855716660,-825439028,0,1815613440,-960070656,2093401798,0,
                    12976128,-960070656,2093401798,0,405823488,-960070656,2093401798,0,-864538624,-858993664,1993133260,0,405823488,-858993664,1993133260,0,
                    12976128,-960051712,2126956230,7867398,2080425472,-960051514,2093401798,0,-973027840,-960051514,2093401798,0,1008211968,1616928870,404241510,0,
                    1684813824,1616965728,-52010912,0,1717960704,410916924,404232318,0,-858982400,-557005576,-959656756,0,404426240,410916888,404232216,28888,
                    1613764608,2081191936,1993133260,0,806882304,404240384,1008211992,0,1613764608,-960070656,2093401798,0,1613764608,-858993664,1993133260,0,
                    -596246528,1718017024,1717986918,0,-973022090,-553715994,-960051506,0,1819032576,8257598,0,0,1819031552,8126520,0,0,
                    808452096,1613770752,2093401792,0,0,-1057095680,12632256,0,0,117309440,394758,0,-1027555328,806931654,210164832,15896,
                    -1027555328,806931654,1050594918,1542,404226048,404232192,406600764,0,0,-663996928,13932,0,0,913102848,55404,0,
                    1141982225,1141982225,1141982225,1141982225,-1437226411,-1437226411,-1437226411,-1437226411,2011002845,2011002845,2011002845,2011002845,404232216,404232216,404232216,404232216,
                    404232216,-132638696,404232216,404232216,404232216,-132581352,404232216,404232216,909522486,-164219338,909522486,909522486,0,-33554432,909522486,909522486,
                    0,-132581376,404232216,404232216,909522486,-167315914,909522486,909522486,909522486,909522486,909522486,909522486,0,-167313920,909522486,909522486,
                    909522486,-33098186,0,0,909522486,-30001610,0,0,404232216,-132581352,0,0,0,-134217728,404232216,404232216,
                    404232216,521672728,0,0,404232216,-15198184,0,0,0,-16777216,404232216,404232216,404232216,521672728,404232216,404232216,
                    0,-16777216,0,0,404232216,-15198184,404232216,404232216,404232216,521674520,404232216,404232216,909522486,926299702,909522486,909522486,
                    909522486,1060124470,0,0,0,925908736,909522486,909522486,909522486,-16713930,0,0,0,-150929664,909522486,909522486,
                    909522486,925906742,909522486,909522486,0,-16711936,0,0,909522486,-150931658,909522486,909522486,404232216,-16711912,0,0,
                    909522486,-13224394,0,0,0,-16711936,404232216,404232216,0,-16777216,909522486,909522486,909522486,1060517430,0,0,
                    404232216,521674520,0,0,0,521674496,404232216,404232216,0,1056964608,909522486,909522486,909522486,-13224394,909522486,909522486,
                    404232216,-15139048,404232216,404232216,404232216,-132638696,0,0,0,520093696,404232216,404232216,-1,-1,-1,-1,
                    0,-16777216,-1,-1,-252645136,-252645136,-252645136,-252645136,252645135,252645135,252645135,252645135,-1,16777215,0,0,
                    0,-656640512,1994184920,0,-864550912,-858207028,-859388218,0,-956432384,-1061109562,-1061109568,0,0,1819045118,1819044972,0,
                    -33554432,405823686,-20553680,0,0,-656900608,1893259480,0,0,1717986918,1616936038,192,0,404282486,404232216,0,
                    2113929216,1717976088,2115517542,0,939524096,-20527508,946652870,0,1815609344,1824966342,-294884244,0,807272448,1715342360,1013343846,0,
                    0,-606372352,32475,0,50331648,-606372346,-1067417869,0,807141376,1618763872,472932448,0,2080374784,-960051514,-960051514,0,
                    0,-33554178,16646144,0,0,410916888,-16777192,0,805306368,201722904,2113941528,0,201326592,811610136,2113932312,0,
                    453902336,404232219,404232216,404232216,404232216,404232216,1893259480,0,0,2113935384,1579008,0,0,14448128,56438,0,
                    1819031552,56,0,0,0,402653184,24,0,0,0,24,0,202116864,-334754804,473721964,0,
                    1819072512,7105644,0,0,819490816,16304224,0,0,0,2088533116,8158332,0,0,0,0,0,
                    29,1713635328,2385663,0,12288,-1010604484,-1010574373,15462,5046272,-1588480,-1010574337,12829635,1409286144,-604045312,404232345,1008211992,
                    0,-1023410090,-1010580541,1013367747,24,22272,-1010580541,-2368573,26214,5767168,1724105472,1008212028,12829542,1493172224,-1010630656,406611651,
                    1008211992,0,-16777126,403474115,-1010737104,255,27904,-436207616,-606348289,56283,7733248,0,-1010580541,1588326,1996488704,0,
                    -1010580736,1728043995,0,120,1724055552,1715214396,195,37120,1845493760,-662824133,30684,10158080,-1015146472,-1010777920,1579134,-1660944384,
                    1724055552,419371068,404232447,0,1727791262,1717730406,1717986927,243,-1073698048,-859389248,-832557032,520881819,11272192,-960315200,1714428108,104765134,
                    6,0,0,0,0,-2119859842,-2120630911,126,-8519680,-1006632997,8323047,0,-16880640,947715838,16,268435456,
                    2097052728,4152,0,-415482856,404285415,60,1008205824,2130706302,3938328,0,402653184,1588284,0,-1,-1010571265,-25,
                    65535,1715208192,1013334594,0,-1,-1111647805,-15463,65535,840568350,-858993544,120,1715208192,406611558,1579134,0,809448255,
                    -261083088,224,1669267456,1667457919,-1058609305,0,1020991512,417021159,24,-1065353216,-117507872,8437984,0,1041106434,101596926,2,
                    1008205824,404232318,1588350,0,1717986918,1711302246,102,-612433920,461102043,1776411,2080374784,1815634118,946652870,8177164,0,0,
                    16711422,0,410926104,1014896664,32280,1008205824,404232318,1579032,0,404232216,1014896664,24,0,217975832,24,0,
                    1613758464,3170558,0,0,-1061109760,254,0,1814560768,2649342,0,268435456,2088515640,65278,0,2097085952,272119932,
                    0,0,0,0,0,1010580504,402659352,24,1717986816,36,0,0,1828613228,1828613228,108,-964945896,
                    108839106,410830470,24,-960364544,1714427916,198,1815609344,-596232084,7785676,805306368,6303792,0,0,403439616,808464432,792624,
                    0,202119216,403442700,48,0,1023360102,102,0,404226048,1579134,0,0,0,806885400,0,0,
                    254,0,0,0,1579008,0,403441154,-2134876112,0,-964952064,-420028722,8177350,0,410531864,404232216,126,
                    -964952064,806882310,16696928,0,101107324,-972683716,124,470548480,-20157380,1969164,0,-1061109506,-972683524,124,1614282752,-956514112,
                    8177350,0,201770750,808464408,48,-964952064,-964901178,8177350,0,-960051588,201721470,120,402653184,24,6168,0,
                    1579008,404226048,48,201719808,811610136,396312,0,2113929216,8257536,0,811597824,201722904,6303768,0,214353532,402659352,
                    24,-964952064,-555819322,8175836,0,-965986288,-960037178,198,1727791104,1719428710,16541286,0,-1061001668,1724039360,60,1828192256,
                    1717986918,16280678,0,1751279358,1717725304,254,1727922176,1752721506,15753312,0,-1061001668,1724309184,58,-960102400,-956381498,13027014,
                    0,404232252,404232216,60,203292672,202116108,7916748,0,1819043558,1718381688,230,1626341376,1616928864,16672354,0,-16847162,
                    -960051498,198,-423231488,-824246538,13027014,0,-960074696,1824966342,56,1727791104,1618765414,15753312,0,-960051588,2094978758,3596,
                    1727791104,1820092006,15099494,0,1623639676,-960099272,124,2122186752,404232282,3938328,0,-960051514,-960051514,124,-960102400,-960051514,
                    1063020,0,-960051514,2097075926,108,-960102400,943208556,13026924,0,1717986918,404232252,60,-956432384,1613764748,16697026,0,
                    808464444,808464432,60,-1065353216,473460960,132622,0,202116156,202116108,60,-965986288,0,0,0,0,0,
                    16711680,1585200,0,0,0,2013265920,-859014132,118,1625292800,1718384736,8152678,0,2080374784,-960446266,124,203161600,
                    -865321972,7785676,0,2080374784,-960430394,124,1815609344,1626366052,15753312,0,1979711488,2093796556,7916556,1625292800,1719037024,15099494,
                    0,939530264,404232216,60,101056512,101060096,1717962246,60,1717592288,1718384748,230,406323200,404232216,3938328,0,-335544320,
                    -690563330,198,0,1718017024,6710886,0,2080374784,-960051514,124,0,1718017024,1616936038,240,1979711488,2093796556,1969164,
                    0,1719065600,15753312,0,2080374784,-971214650,124,806354944,808516656,1848880,0,-872415232,-858993460,118,0,1717986816,
                    1588326,0,-973078528,-19474746,108,0,946652672,13003832,0,-973078528,2126956230,16256006,0,416087552,16672304,0,
                    404232206,404232304,14,404226048,402659352,1579032,0,404232304,404232206,112,-596246528,0,0,0,940572672,-20527508,
                    0,1715208192,-1027555134,101465190,124,-872362804,-858993460,118,806882304,-20546560,8177344,268435456,2013293624,-859014132,118,-859045888,
                    2081191936,7785676,1610612736,2013272112,-859014132,118,946616320,2081191936,7785676,0,1715208192,205284960,15366,1815613440,-20546560,8177344,
                    0,2080427212,-960430394,124,405823488,-20546560,8177344,0,939550310,404232216,60,1715214336,404240384,3938328,1610612736,939530288,
                    404232216,60,281462272,-960074696,13027070,1815609344,1815609400,-956381498,198,6303768,2086692606,16672352,0,1993080832,-656900554,110,
                    1816002560,-855716660,13552844,268435456,2080402488,-960051514,124,-960102400,-960070656,8177350,1610612736,2080380976,-960051514,124,-864538624,-858993664,
                    7785676,1610612736,-872409040,-858993460,118,-960102400,-960051712,201752262,-973078408,-965986106,1824966342,56,13026816,-960051514,8177350,402653184,
                    1617312792,406611552,24,1684813824,1616965728,16574048,0,406611558,410916990,24,-858982400,-557005576,13028556,234881024,404232219,404232318,
                    7395352,1613764608,2081191936,7785676,201326592,939536408,404232216,60,1613764608,-960070656,8177350,402653184,-872390608,-858993460,118,-596246528,
                    1718017024,6710886,-596246528,-152648192,-959521026,198,1819032576,8257598,0,939524096,3697772,124,0,808452096,1613770752,8177350,
                    0,0,-1061109506,0,0,117309440,1542,-1073741824,-657668416,-2032377808,4069388,-960446464,1714477260,104767182,6,402659352,
                    1010580504,24,0,1826122806,54,0,1826095104,14183478,0,1141982225,1141982225,1141982225,-1437252591,-1437226411,-1437226411,-1437226411,
                    2011002845,2011002845,2011002845,404256733,404232216,404232216,404232216,404232216,-132638696,404232216,404232216,-132638696,404289560,404232216,909522486,-164219338,
                    909522486,13878,0,909573632,909522486,0,-132581376,404232216,909514776,-164219338,909571590,909522486,909522486,909522486,909522486,13878,
                    -33554432,909571590,909522486,909522486,-33098186,0,909508608,909522486,65078,0,404232216,-132581352,0,0,0,404289536,
                    404232216,404232216,521672728,0,404226048,404232216,65304,0,0,-16777216,404232216,404232216,404232216,404234008,404232216,0,
                    -16777216,0,404226048,404232216,404291352,404232216,404232216,521674520,404232216,909514776,909522486,909522742,909522486,909522486,1060124470,0,
                    0,1056964608,909522736,909522486,909522486,-16713930,0,0,-16777216,909571840,909522486,909522486,925906742,909522486,13878,-16777216,
                    65280,0,909522486,-150931658,909522486,404239926,-15198184,65280,0,909522486,-13224394,0,0,-16777216,404291328,404232216,
                    0,-16777216,909522486,909522486,909522486,16182,0,404232216,521674520,0,0,520093696,404234008,404232216,0,1056964608,
                    909522486,909522486,909522486,909573942,909522486,404232216,-15139048,404232216,404232216,404232216,63512,0,0,520093696,404232216,-59368,
                    -1,-1,-1,0,-16777216,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,-61681,-1,255,
                    0,0,-656640512,7789784,0,-964952064,-54081796,4243648,-956432384,-1061109562,12632256,0,1828585472,1819044972,108,-956432384,
                    806891616,16696928,0,2113929216,-656877352,112,0,1717986918,-1067425668,0,-596246528,404232216,24,410910720,1717986876,8263740,
                    0,-960074696,1824966398,56,1815609344,1824966342,15625324,0,202911774,1717986878,60,0,-606372352,126,0,-612497917,
                    1618932699,192,807141376,1618763872,1847392,0,-960070656,-960051514,198,-33554432,16646144,65024,0,2115508224,6168,255,
                    405798912,403441164,8257584,0,1613764620,792624,126,453902336,404232219,404232216,404232216,404232216,-656926696,112,402653184,8257560,
                    6168,0,-596246528,14448128,0,1819031552,56,0,0,0,6168,0,0,402653184,0,251658240,
                    202116108,1013771276,28,1819072512,7105644,0,1879048192,-933220136,248,0,0,2088533116,31868,0,0,0,
                    0,29,-10083328,9318,570425344,1667457792,34,0,2818048,404226048,404291352,24,11520,0,255,0,
                    -1023410099,-1008992281,-1010580541,1409286144,-604045312,404232345,3938328,5636096,-1010580736,1724105667,6204,22272,-1010580541,1728043995,102,-1023410088,
                    406611651,-1010604484,1493172224,-1010630656,406611651,3938328,5898240,-2033975552,1630541836,65475,27904,-436207616,-606348289,219,118,-1010630656,
                    406611651,1996488704,0,-607927552,6750171,9502720,1845493760,-662824133,30684,402692864,-1060930024,410960832,24,-1023410019,-15188890,404291352,
                    -1644167168,1718025216,1868980860,15951462,15794176,404232192,404232447,65280,62976,6168,402653439,24,0,0,-2122448896,-1715633755,
                    -8487295,-406585381,-26444033,947715838,940572688,947715708,2084044816,2097086008,269515832,2097052728,31800,406600728,-65536,-406600729,1006698495,1715618406,
                    -1006698436,-1715618407,118489027,-859013873,1715239116,406611558,859773054,1882206271,1669325040,1734566783,1520025830,1021830972,-528443046,-520552712,235012224,239009342,
                    1008205826,2115508350,1717966908,6710886,-612433818,454786011,1665007643,946629688,30924,2122186752,1008205950,1014896766,1008271128,404232318,404226072,1014896664,
                    402653208,403504652,805306368,811662944,0,-20922176,603979776,610729830,402653184,-33220,-16777216,406617855,0,0,2016411648,3158136,
                    1819017264,108,1819017216,1828613374,2083520620,-133400384,-973078480,1714428108,1815609542,-857967048,1616904310,192,806879232,811622496,811597848,806885400,
                    1711276128,1715273532,805306368,808516656,0,805306368,24624,64512,0,805306368,201719856,-1067438056,-964951936,-420028722,1882194044,808464432,
                    -864550660,-866109428,-864550660,-871614452,1008468088,218025068,-1057226722,-871625480,1614282872,-858982208,-855900040,808458252,-864550864,-859014964,-864550792,403471564,
                    805306480,805306416,805306416,805306416,806903856,811647072,24,-67108612,811597824,806882328,-864550816,3151884,-964952016,-1059135778,2016411768,-855847732,
                    1727791308,1717992550,1715208444,1723908288,1828192316,1818650214,1660813560,1651013736,1660813566,1617459304,1715208432,1724825792,-859045826,-858981172,813170892,808464432,
                    203292792,-859042804,1726349432,1718384748,1626341606,1717723232,-289013506,-958988546,-423231290,-959521034,1815609542,1824966342,1727791160,1616936038,-864550672,2027736268,
                    1727791132,1718385766,-864550682,-870551328,-1258553224,808464432,-859045768,-858993460,-859045636,2026687692,-960102352,-285288762,-960102202,1815623788,-859045690,808483020,
                    -956432264,1714559116,1618477310,1616928864,1623195768,101455920,410517506,404232216,940572792,50796,0,0,808517376,24,0,-864285576,
                    1625292918,1717992544,220,-859779976,203161720,-859014132,118,-1057174408,1815609464,1616965728,240,2093796470,1625356300,1717991020,3145958,808464496,
                    786552,-871625716,1625323724,1819831398,812646630,808464432,120,-687931700,198,-858993416,204,-858993544,120,2087085788,61536,2093796470,
                    7692,1617327836,240,209240188,806355192,875573372,24,-858993460,118,2026687692,48,-16853306,108,1815637190,198,2093796556,
                    63500,1680906492,807141628,808509488,404226076,404226072,819986456,808459312,-596246304,0,268435456,-960074696,-864550658,410569920,-872384500,-858993664,
                    1835134,-1057174408,-1015152520,1715340860,13369407,-864285576,14680190,-864285576,808452222,-864285576,126,2025898104,-1015138292,1618896444,13369404,-1057174408,
                    14680184,-1057174408,13369464,808464496,-964951944,404232248,14680124,808464496,952500344,-956381588,808452294,-53708800,1835212,1618501884,252,-864088961,
                    1816002687,-858980660,-864550706,-859015168,-872415112,-859015168,-536870792,-859015168,-864550792,-858993664,-536870786,-858993664,-872415106,2093796352,415496204,1013343804,
                    13369368,-858993460,404226168,2126561406,1815615512,-429854620,-859045636,-63898504,-856149968,-809043252,453953478,404241432,1863896,-864285576,3670142,808464496,
                    469762168,-859015168,469762168,-858993664,-134217602,-858982400,16515276,-587404084,1815871692,2113945196,1815609344,2080389228,3145728,-859807696,120,-1061094400,
                    0,202177536,-960299008,1714675404,-960294964,1865931724,404227023,404232192,855638040,862375014,-872415232,-865717402,-2011037696,-2011002846,-1437235166,-1437226411,
                    2010884693,2010902235,404287195,404232216,404232216,418912280,404232216,418912504,909514776,922105398,13878,922615808,13878,418912504,909514776,922093302,
                    909522486,909522486,13878,922093310,909522486,16647926,909508608,16660022,404226048,16259320,0,418906112,404232216,2037784,404226048,16717848,
                    0,419364864,404232216,404690968,6168,16711680,404226048,419371032,404232216,404690975,909514776,909588022,909522486,4141111,0,909586495,
                    909522486,16711927,0,922157311,909522486,909586487,13878,16711935,909508608,922157303,404239926,16711935,909508608,16725558,0,419365119,
                    6168,922681344,909522486,4142646,404226048,2037791,0,404690975,6168,910098432,909522486,922695222,404239926,419371263,404232216,16259096,
                    0,404684800,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-590816138,2013266038,-120784692,
                    -67059520,-1061109556,-33554240,1819044972,-855900052,-866111392,252,-656877442,1711276144,2087085670,1979760736,404232412,821821464,2026687608,1815673904,1824980678,
                    1815609400,1819068102,807141614,-859014120,120,2128337790,201719808,2128337790,1614332000,1623259328,-864550856,-858993460,-67108660,-67044352,808452096,3158268,
                    811598076,6303768,806879484,1585248,453902588,404232219,404232216,-669509608,808480984,805370880,1979711536,-596246308,1815609344,14444,0,1579008,
                    0,1572864,202309632,1827408908,1819810876,7105644,409993216,7888944,0,1010580540,0,0,129499136,-2029090304,146929152,-896857740,
                    12112435,-2143229120,-376807199,-305003087,-1168980482,112198606,619463406,-771575540,781424872,1493929866,-382051693,-376831370,-1952922230,-774753334,-775368248,-775368248,
                    -774712864,1406325216,4988555,1968954123,505861,922162155,-779419572,158646283,474440,129500022,-997801216,-92147974,24380352,-289110462,-1057324549,1241609219,
                    -125071165,-1952921718,1277622232,-774862080,1352633315,4890880,-13441034,-523123965,-1013464573,-947200886,-1949594984,1277622232,-772764928,1352633315,8757504,-315430922,
                    1947072896,-787777777,-2130218008,-2145386250,-523140875,-523116335,-796139311,-523116335,-13450749,1964243328,-773795574,-773598752,-2132553245,41092857,-1023155247,-645402621,
                    1344180419,-661733325,520068184,-1021378496,378228818,116785251,1963458695,113410828,-1172262676,-336723008,79856396,201352608,1705176584,-1017489408,378228818,116785251,
                    1963458695,113410828,-1161809172,-336723008,79856396,604005792,1705176823,-1017489408,-994422192,-301879293,537717826,28369034,1482354506,1381011651,-1341930310,-331158015,
                    -527769820,-280362576,-1866246054,1996962899,1006924845,-164268285,268470534,-389018764,485819196,-350813184,-2011264477,266567680,1946811264,66813957,319033973,255594219,
                    272370290,33817719,151257835,-1157971109,11534403,4242158,-320828692,-1006910330,738192360,-156353085,-504852285,-388461569,-76283922,-1866205982,-1207954758,-201903064,
                    -1157965685,-1229979581,4373230,-1964063861,-1157894460,619446369,-301789954,-1157641240,619446369,-1866207490,516163102,434634920,-1070166597,-1069642451,1007727933,1952610055,
                    1996700716,-151047332,268470534,915222645,246759172,8916618,-2146442880,510921209,1946417536,842435865,-351750834,-1996032495,175443968,1057240717,1292123789,-1410855243,
                    14608386,-402584600,-990510378,-1590070271,646578309,-989986684,6295179,-338972184,842435879,1947417678,1913601040,70683916,1980775487,-1070166780,-1899416787,204900825,
                    235834369,26142721,147005191,131588,1946178024,1962281490,986447374,-32999981,1978874570,-1009844734,1946171880,6219800,1122894512,-288817428,-301748150,-922817470,
                    1407732462,468239104,-1340640256,-331158007,1954588746,-1088142835,414206702,-1867496722,-1866249490,-390442416,-300502970,-1342111046,-335876608,-33690624,-33686019,27851772,
                    -301879140,-1337530182,1520299534,296797016,619463406,-1018499457,1122898352,-293597972,102679370,-41266605,-919348430,-1993948786,637602870,17698444,855703737,1461653202,
                    18409555,-16031909,1474823028,123427329,102679327,11817555,-1004121338,-1014232961,1467277067,-1977163893,-41940113,1129084159,-227153862,-1977169613,-906098099,8654472,
                    -1995601370,-1979677426,1300899561,1435182593,1975854596,2106271238,-2116449534,1963000063,1977289234,-1899416818,914958017,-1943666420,-1962865122,10807503,1526844544,1606690311,
                    2143561232,197364742,-1958316833,1871324895,-163833,977484660,871527912,227157705,8719931,-376820875,21858854,-987311565,12518261,182029057,856585691,650219209,
                    17577609,236882982,-389051647,-864026546,123427330,102679327,-1004121517,-1014231937,1962467083,652184370,-2146996342,661979133,1978153539,227157746,243845630,-1960443772,
                    243859789,-1004142459,-919403659,915003790,109838604,1526268174,-1021376677,-1610565552,-1014316914,-1311144040,-758590718,-790048572,-1312520492,-1310665971,65196805,-2013754430,
                    -2133852455,-939647001,-550887245,1106063945,-164446158,-812987769,-880106253,-897078541,-1017580830,-1610565552,-1014316914,-754798184,-792407352,-2032873240,-754077244,-19887136,
                    535265487,548653054,-142090454,1958742700,-1947979240,-754601478,855114720,-1964166464,-1968901169,-341118005,-1866245917,-896904880,-1341930310,-284904446,112460976,63879919,
                    11797936,-1274629905,78704388,-1964047692,113411025,62962412,-1964064718,-1017620015,-896904880,-994383734,-1274892285,78704387,-1158741324,95421390,-1326509900,-2146520058,
                    41224189,-1326511436,-285166588,-1031548534,-1061491706,-299847677,1482281354,1364590787,-1160082606,79233988,-1342065664,28634880,-1174316568,-290716734,-1274821446,-285167613,
                    -1981230197,1686013,1072227378,-48699391,-2080558104,-319158590,-1274822470,281445168,-91821908,-1405963194,-1258651672,2045291571,-826606598,637187,266921010,-2083288319,
                    -1070463294,-1158874386,884212672,1508425778,1499134970,1381090142,-661905834,116840846,1963458697,-661774800,-2096708989,-319152442,-1190936390,-466485232,1174461928,-401492820,
                    -855705048,-83828760,-1341929798,-400560385,703070216,1516117760,-1608596647,378142793,1085341833,602407093,-523134725,-1959864181,-1946029897,785944264,36345855,102679327,
                    8990346,-1979677279,4825312,6493835,11024069,-989561660,1959071860,198937610,-1956219682,340757214,1962932608,-935705764,-1392708747,158646282,548668025,347131134,
                    113411055,62962412,-1392261501,678739979,-1968322422,-984211744,-58676172,-401771504,1105787272,-20644352,-1393658423,2045297918,-389218567,526254128,195941770,-1979026240,
                    -393564728,1374172357,-1021376768,1508420858,-490406151,-1866204168,1307094266,452857,-169687810,-1014184965,175431435,-478094198,654258719,-1866268280,-1159558404,-980810808,
                    63552238,15919276,1946600694,19064835,-33465880,1976172229,-1963146270,63486690,-1158756982,-1968438327,-125129512,-154958164,57935556,-402588696,-973209294,-579483138,
                    -1963159357,-1257655838,573216,-1979463494,-910496059,-1979414013,1552552060,113571336,-840432780,17098752,1330038270,146792053,63486464,-1158756982,76153801,-1963426678,
                    -990508964,-402426874,-538443608,1187380736,-1075940017,-927334392,-289043965,-1979463238,-126055932,-152019830,57935556,-402619416,-973209414,-562737338,-1921660418,-1341929286,
                    -910496240,1095939,301610637,-1963423060,10021080,-927271198,-301944829,-1190934086,915210256,-391376406,-990511088,-402426874,2011693120,-1007689216,-1974300477,-2145311528,
                    -338632989,170852146,-1979554681,65241304,1956088366,-790048766,-2133292312,-1976695837,-805145417,-1964453656,-2020987176,-628424076,1448264538,871773015,-843427585,-487090100,
                    -233572349,-1969812806,-487089977,-233572349,-1977865798,-487089981,-703346941,-763109167,-1031120896,-628426102,-1017487777,15462138,-336672886,-289175040,-15365,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1311904266,23876146,16711935,16711935,
                    2037411651,1751607666,1329799284,1363234893,1836008224,1702131056,1866670194,1919905906,1869182049,824192110,741488697,943272224,824192051,741619769,943272224,824192053,
                    741750841,943272224,1375739959,1344951127,1311392078,1143620176,1126843210,1093288513,2772044,541143382,1329804592,1363234893,-224,791687679,942618418,-1962934473,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
                    }
                  • 1988-05-18.json
                    {"data":[
                    820532650,-386632187,-637402904,-371231997,-399310709,-655834994,-388371968,1229063324,-1653387963,-939523095,507574980,-2143354842,146329461,-1900019472,-259212443,25757194,
                    28843528,-1898430464,200094436,-2134084349,-738000454,-2134069245,1622610099,-989660681,179961972,-1341672445,45580491,1224801186,-1996453850,-2030008290,-2013231042,1660979478,
                    65595469,-402409726,373883530,184680680,58779831,16328329,-259286901,-1967334098,-789620479,-1949928695,-395244304,-167050189,86961524,1627491006,-1207858194,-538436986,
                    -2130982826,92276597,396937,5433429,1946356434,25618628,-1090398488,22735068,1946618578,17557684,92728692,-1425942808,-1933036563,109970688,-1845176088,-398013510,
                    -289165306,-398001478,-50529540,-324469508,212863092,-1174268178,32375216,1185987304,-71102738,852669955,-1996425722,200671604,263817,-1241025518,-167318770,41191168,
                    126485174,-234563968,270582544,270540816,270544912,270540816,252588032,252645135,134680576,12645384,0,0,0,12622849,0,0,
                    15266824,0,0,0,15250945,0,0,-536798720,192,0,0,0,0,436207616,15261697,0,
                    0,0,0,0,251723744,458752,-15859192,1056964608,134221825,65536,33619970,67174404,33882117,17170438,525574,459016,
                    101122567,202443793,202443793,202443793,-1945039855,202460177,202443793,202443793,-1945039855,-1945023471,1276202001,1276202001,1276202001,-1945023471,1276202001,-732089328,
                    -732048291,-732048291,-732048291,-731982755,-731982754,-731982754,-732048291,-731982754,-732048291,-732048291,-732048291,-732048291,-732048291,509531229,269746180,303432198,
                    404490252,438176270,356450346,-1961471918,-2084412672,-1058142670,-1017947560,-2115793958,-1950150912,-1085722998,504365450,-472973184,-2011297057,-388952064,-1008184229,-388073467,
                    585630578,1914529028,74639544,1980045544,-1605799405,131072178,-388962096,-756487984,-386156033,-1165753661,32374960,-1160498460,570426344,-2134084349,-1274871110,7727127,
                    -872348800,66420988,-1341099256,45410319,-1966865415,1353750723,1122766830,-1336243488,-352260358,-33686019,-51577347,-33686019,-50594307,-297105724,1515749628,112902942,
                    -1341684736,-935465332,1963458792,-1961455912,-347246497,2053082422,-1207923714,-1061633906,-1898446616,16562448,-50549510,-64553732,-76203515,-487578553,1885309718,518399627,
                    518414139,225599351,-1977739226,975103327,1980622175,-393891728,-930217588,375707789,-611450573,912966541,1073766335,-1925798485,-1082364321,-1416822619,1606366828,-1515516927,
                    9354048,-1925266542,-1416452096,532916999,-2080366918,-289755131,-1341141501,-1341788606,1250619116,-456073008,-66394928,1350623411,-2130910016,1082835061,200210608,1243890412,
                    -520685174,1963771712,-167333039,24414464,-872143232,-2139752761,1387862451,-1898381112,7661600,-1048571263,-117440383,-276770702,-1341404158,92991467,-503266328,-1341181212,
                    -1014894817,5586432,515549891,-1341750272,-1961431300,-2084412672,-939325761,-1925837281,-1274887675,-1285344513,15251713,1932147968,-1190972700,855638248,-1285238571,13690924,
                    -976170958,327870578,-395065904,1625817779,-1664083712,-727847472,-1966902519,-394458425,-302120910,-829765662,-1017920481,-1965534548,-117724022,-324497158,-125368204,-1058089166,
                    -2034023764,1514858625,-74414121,-1475806484,-324504072,-71696011,-326450685,-684535673,1116389614,-655820662,1250385498,-1039083530,-111512575,-1165730877,200147120,1023446216,
                    1947844856,61913806,1123682798,-318903552,-33686019,-72811012,1946255608,1347680707,1357402450,1488588803,-299596800,80933041,-1948718952,-2018365814,-1341913669,-1965018387,
                    1622245604,-326498862,263900387,-1467942400,-1159171069,1174406120,-1964973317,212959460,-326499630,263900387,-1475282432,-1159171069,704644072,-111484165,1489197403,-1165675539,
                    99483824,11582084,-391577362,871170755,36890787,-2063548230,-2080313670,1347677891,-1949675182,1387915481,-389742591,1499157082,-2136450877,-1467963224,-1465341784,-2139051904,
                    134774912,134744085,136649480,135596040,453511176,134744101,134744085,136649480,-402448890,-1140894980,-2080309318,-289755126,-1341996029,-272976881,-1274687997,-386813944,
                    45699252,-1898381152,-1090416959,-877657973,-1439497997,-5570640,605007872,1354688723,-1090453248,-877920117,1965948608,-1427964216,-14354768,-1169158168,872362998,-1392604213,
                    380289141,-1392581896,246464629,266862628,871800912,-1066095362,-934408450,845836,-1157717784,33094123,-1020066017,-801308682,62853235,853214208,12237060,-1274556925,
                    -395464703,1023299722,184469365,-522009648,267121072,-16578254,-1970806994,-1011160312,-1342012416,912518795,-972685181,15251762,-1948736431,-324498474,283641973,1945414225,
                    -1340022035,-393352360,-661958261,-1475815700,-392989685,-186494605,552332720,-889568885,11582019,868233454,15645248,-890438777,1979426824,-1475806484,-2016774917,-292844860,
                    -1475816980,-324504069,-68679564,-1189459887,-1027556678,7530508,-351927304,-386027487,-1019478535,54247794,-1011170571,-1341946880,335605433,1660980022,115901382,-1948772271,
                    -324498474,250085748,1945378385,-349379859,1368123395,-689121141,1963894785,1366550537,-303303454,-296740888,-1948873768,141946024,24432552,-263189016,-488016912,-392318928,
                    -1011155463,-1341619200,509865611,-1023016829,12237059,-1274036221,-74414118,-1475806484,-2015726344,-292900814,-1964981010,-324499494,-68419211,809302820,1568669813,-488979440,
                    -1161786382,263193524,642727912,-290148320,-617477712,263847859,-391294976,-2080354374,-292835319,50388665,62175936,-621080697,-324497158,-125368204,854514352,-292910396,
                    -622010233,1979426817,607186171,1963736112,283279556,-350364936,-352144768,-2132495728,80883889,-456069936,80929969,-1005918198,-352533784,-88409661,-1338621184,1073802938,
                    -286379328,-1165689917,82706608,1337649305,-1342060541,12185264,1122958594,1257169661,1072579248,-286528768,-1161363218,32375728,45791741,-331560701,1776418933,-1342047926,
                    -1337987518,49199613,-1161305347,15598512,45791741,-331560701,1239564149,-1342113462,-1342116286,49199613,-1161305347,-1178704,62503625,-331611392,702693237,-956040774,
                    -289755136,-1190934269,1006633196,-486968042,12237059,851494915,-285278520,-287129534,-351863304,-399134656,-1023083271,17172485,50332167,134227992,50333705,757531235,
                    731916432,13090591,1543,-1668415488,529960724,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134227992,50333705,757531235,
                    731916432,13090591,1543,-1668415488,529960724,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134238232,50335745,1599013475,
                    1434538114,13090591,1543,-1668415488,529960744,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134238232,50335745,1599013475,
                    1434538114,13090591,1543,-1668415488,529960744,-16729693,50594050,118490374,320082194,386405654,15,0,16715790,134227992,50348041,757531235,
                    729819280,12697375,0,-1668415488,9867028,-16729694,386011925,118490118,320082194,385946902,3,0,16723983,134227992,50348041,757531235,
                    729819280,12697375,0,-1668415488,9867028,-16729694,386011925,118490118,320082194,385946902,3,0,16723983,134238232,16793601,1599014499,
                    1417695362,12697375,0,-1668415488,9867048,-16729662,387389207,387389207,387389207,385947415,1,0,16711693,234901528,50335744,1599013798,
                    1434538114,5095199,2828,-2088435712,224615720,-16729437,134744072,135268360,404232216,403576856,134217743,0,16715786,268455960,251690273,1599014499,
                    1434538114,4243231,0,-1668415488,529960744,-16729629,50594050,121111828,993802554,1057045822,15,0,268369925,0,0,0,
                    0,0,0,0,0,0,0,0,0,0,0,0,0,134227992,16384,925303587,
                    823471415,4654097,1543,-517734400,148948756,-16715613,50594050,118490374,320082194,386405654,15,0,16715790,20480,251658281,1599014498,
                    1434538114,4243231,0,-1668415488,529960744,-16729629,0,0,0,1057030144,15,15,268371973,20480,251658281,1599014499,
                    1434538114,4243231,0,-1668415488,529960744,-16729629,0,0,0,1057030144,15,15,268371973,134227992,251666441,757532259,
                    729819280,12631839,0,-1668415488,9867028,-16729629,50594050,118490374,320082194,385946902,15,0,268369925,134238232,251674625,1599014499,
                    1417695362,12631839,0,-1668415488,9867048,-16729629,50594050,118490374,320082194,385946902,15,0,268369925,234901528,251691013,1615790242,
                    1356879386,28703,0,1580072960,6184212,-16748917,1574912,6144,2048,727040,5,0,268374023,234901528,251691013,1531904167,
                    1354388247,27679,0,1579876352,257907988,-16774517,262400,1792,262400,67328,5,0,268374023,234901528,251691009,1599014562,
                    1417695362,4243231,0,-2088435712,258170152,-16729373,1574912,6144,2048,727040,5,0,100597765,234901528,251691009,1599014563,
                    1417695362,4243231,0,-2088435712,258170152,-16729373,50594050,121111828,993802554,1057045822,15,0,268369925,234891288,50333705,757531299,
                    731916432,5095199,2828,-2088435712,526605588,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234891288,50333705,757531299,
                    731916432,5095199,2828,-2088435712,526605588,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234901528,50335745,1599013539,
                    1434538114,5095199,2828,-2088435712,526605608,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,234901528,50335745,1599013539,
                    1434538114,5095199,2828,-2088435712,526605608,-16729437,50594050,121111828,993802554,1057504574,15,0,16715790,268445720,50333704,757531239,
                    731916432,5226271,3342,-1668415488,529960724,-16729693,50594050,121111828,993802554,1057766718,134217743,0,16715790,268455960,50335744,1599013479,
                    1434538114,5226271,3342,-1668415488,529960744,-16729693,50594050,121111828,993802554,1057766718,134217743,0,16715790,268455960,50335744,1599013478,
                    1434538114,5226271,3342,-1668415488,261525288,-16729693,134744072,135268360,404232216,403576856,134217743,0,16715786,268455965,251699201,1599014627,
                    1417695362,4197182,0,-359923712,15195944,-16775997,1061109567,1061109567,1061109567,1057046335,15,0,33488901,268455965,251699201,1599014627,
                    1417695362,4197182,0,-359923712,15195944,-16775965,50594050,121111828,993802554,1057045822,15,0,268369925,134227992,251722241,1599016547,
                    1417695362,4308767,0,-1668415488,1083608872,-16729693,50594050,117966086,185338122,255921422,15,0,268386309,523173904,1061109567,1061109567,
                    521158447,0,0,792141607,1061109567,1061109567,791101239,522133279,522133279,909782321,1061109567,1061109567,909197114,757935405,757935405,236257287,
                    471604252,471604252,235346965,0,0,353898001,471604252,471604252,353442840,235802126,235802126,404362262,471604252,471604252,404102170,336860180,
                    336860180,135004164,269488144,269488144,134483980,0,0,202246154,269488144,269488144,201986062,134744072,134744072,219089676,269488144,269488144,
                    218894351,185273099,185273099,33751041,336004101,33751041,336004101,976959545,1044331581,976959545,1044331581,33751041,336004101,33751041,336004101,976959545,
                    1044331581,976959545,1044331581,33751041,101123077,168495113,235867149,303239185,370611221,437983257,505355293,572727329,640099365,707471401,774843437,842215473,
                    909587509,976959545,1044331581,0,0,117901063,117901063,0,0,1061109567,1061109567,0,0,117901063,117901063,0,
                    0,1061109567,1061109567,33751041,336004101,976959545,1044331581,134938629,337120785,606608416,943664434,-54570880,-1273137916,-2130908411,1090198899,-1103094186,
                    -570031986,1397839191,-319008117,-1333739776,474697,-1090489336,62896242,-2033975136,-2033939472,-16743962,788517350,307926080,1599953243,525862750,-816287230,-812593854,
                    -434865134,1981110293,-367663083,806760982,-434532840,-568644070,-736284131,1813283870,-1272829921,-1540995035,405607981,439163437,439163437,573089831,674058281,612338400,
                    -2143518492,566629238,1574532,-2063546618,-2146564096,137594624,-661798770,1319306874,-1945236479,-104657407,-2030007794,-141917983,16133769,1948173569,855608024,268471062,
                    -819035934,-1978398057,268470550,-789673230,-789962026,-1960907953,-1963257856,586928367,-1965567761,-790394151,855363811,-1965164841,-790376221,182440163,-2132543789,-613087222,
                    -260012406,-20519417,-154782990,378210420,8396304,-789847248,-789851925,855625963,-2021249398,-511765376,-154858804,65536372,-2012347903,-1160476928,-662699126,-2134646009,
                    -484435584,-1995035949,-1825348864,1308672163,9282146,12140112,503777280,-1813449813,-1961472443,-2084412672,-323352838,-1340030973,-1961431301,-2084412672,-1977743636,855591168,
                    141787387,-1970859986,-1570384364,-1970864082,-1570316780,-460783566,-121420272,1347624454,1224757922,1150085229,-986195674,2130978500,-1736012605,-388905775,-265033725,-1045643122,
                    1241523875,-1568363482,648216748,-1389984512,9347916,1279837160,1156114445,-1956850616,-638185586,8390279,-1090489031,1045016704,1946681351,-1199784192,10486719,-394686777,
                    -148487616,-774353920,-1958835256,-1205842432,1044973440,1946746887,1224769598,36897654,-1416904461,-840381562,-388908032,1532511066,-121436385,-789917462,41976034,181068285,
                    855608024,-2013230570,-2132636942,-435163008,-791424795,772460781,344496030,8787592,179303214,-2010200556,-1013937920,2400391,105480202,1175453832,8954186,-1604172271,
                    1174732936,50460867,538968839,538976288,8240,2097152,538976304,151527456,151521544,151521544,151521544,151522059,151521544,151522059,151521544,151522059,
                    151521544,-2139092728,32768,-2147450752,0,740818944,707669289,808459817,808464432,-167362768,150570752,-345607165,-779382645,9117317,8992355,16125536,
                    1946535456,518765056,-764135414,-98552704,-167349457,24479488,-227137478,-225834870,-890514434,-100459392,851473943,-2134603034,-495779270,-1065350658,1912798723,-397672768,
                    407109864,-1948873782,-1964658678,193654704,-1991843345,-1013968648,855608031,-1986539037,-773107712,1644182046,-1949666039,1660979990,16312407,-1965046896,-773639425,1342213015,
                    1610648334,42568014,-121416192,-1964572981,987957986,986937100,-1964805075,988217036,180384805,-1964870379,-1966920986,225607931,-930479362,-232075126,210433259,-931867650,
                    -201455990,-285292848,-1588935741,-449707786,-1047794429,13700686,-1047860989,-525284214,-1341255697,-272397599,-1965491773,987279367,-1965525502,1644202014,3318092,-475791369,
                    -1978249728,-2131080960,92275574,1963129351,-1961438744,-1949801728,-1341289760,-1964639505,-268718068,-1953508893,-392343552,-1023344648,-1977680496,-398892544,-947256690,3808842,
                    76206962,-897526786,-153295871,-2016773876,718351093,-153422114,720759556,-20567343,-2143355198,58083584,1044977024,1919877127,-2143390708,225593600,-83885079,-1947469373,
                    -2115687446,-773456128,-1966765064,854456035,-773848127,-1752497210,-477761290,83359353,-573449993,-946413565,-2029980154,65537140,503713345,-1066131580,-965536710,-259387350,
                    -1526478093,-33622781,-192229771,-407834486,-890036086,-33641725,-165687691,25225607,409161,-790531068,-1118777118,-1752563630,-308755150,33012288,-1056710141,-1947154793,
                    1073846458,-2047412254,-136808176,-2117601315,-2143358944,108284160,63373639,-1772485089,-544975989,809156724,741000819,-790171568,-1949904666,-1946448912,-207320374,-1946448912,
                    2130422,2130423,-207320374,64816069,1977679566,-254781302,-430381360,-1946449212,-206927158,-2114483205,-1966473184,64877482,1978334926,5433849,-2115662869,-2143355136,
                    326453504,-439286063,-443816495,-326436822,-1717517160,-152730368,1391920066,854451546,1224769598,170595189,-506344751,-519839279,-1056716285,-1947154793,-2063534554,1519056869,
                    8445622,1261129,-773688058,-773664286,-2047464470,-136808188,63436765,-1066101116,-1015859398,-665832662,1224769598,273814388,62438094,-273021695,-1207778301,1520439279,
                    -152861440,-1047650676,-889988725,-184310781,1979055432,-1965547688,16162949,-1965366378,1224769598,448402292,-1207579133,-1161559825,-307231950,267322036,-877635702,-1427439373,
                    -896922229,-1442592781,1979055438,-1341986014,-276133145,-1325413537,66974634,-726643083,267322036,-167318774,74745600,675218408,1347680451,-402566830,-663339462,-660536694,
                    855591936,-1947142173,1532516953,-1899511040,1224772134,58097916,-66648192,2001826315,1055451239,-372906496,-1572814,-389841346,-1962672047,41285315,-997517690,-536096559,
                    143052980,-489627183,-488451887,-508888954,2130422,-2132770569,92527075,-338508208,-611428301,511499205,-625672052,-2132049743,943608040,-1960932669,-394835456,1007878225,
                    -1963363038,-1190907182,1006698669,-763300400,-170853375,-225783070,-19938646,-2117700580,-337627135,61913806,149882292,-154105340,-203249149,95745968,1488257263,-762642381,
                    -158410189,906813125,-58326645,-504839034,1930516480,-1946972454,1946749914,-397834523,33685618,-314456782,-16809503,-1991900191,-1013968648,243620491,-2115960767,736231167,
                    -1961980932,102139136,1388513055,-2029980154,311100532,8590947,-324484602,-67501707,24439976,-1962542298,1397881795,-1965993387,-1947585802,-1963685163,-1948283962,-259303797,
                    -839648373,235120244,-898251266,-1067519950,-102003717,734399070,-151942195,-125137925,1515841117,-1899537469,1224772134,58097916,-66647424,-394824699,814416107,-370609269,
                    -1948383171,-1964799027,-2030007778,1660979990,116818882,1947190020,-324498448,-67501707,24439976,-961807477,-386335774,-1899510896,1224772134,58097916,-66647424,-399543291,
                    730530027,-1036195352,-1977709619,-1961457920,-2084412672,-1023146250,-1963428849,24505512,-324469766,-74841740,-79181910,-121380121,-1946514477,-2130932759,92279668,1996684295,
                    1357394687,1485547068,8851077,-701237365,-82577792,-1964346352,-2139062043,-2130976129,1189676914,-1898007296,201442614,-153013532,-1948646416,-1964078351,-1325115562,-796218230,
                    -495795248,-947256694,-495787056,-408223094,1978400457,1946615501,939622855,1583344604,139297735,-369855024,-557514610,27801100,171147380,-557451634,2373244,-519864330,
                    -503058304,1468683094,-2130972244,575866484,-1963412728,-773795360,1929564391,-20247870,1535538674,-311114742,855966502,99296905,-311162358,839189286,92350088,545322752,
                    1963194240,1358857159,-1101017483,1199595099,1946286854,1974224717,9103746,508224395,253886647,-91302010,906813125,-519896586,183365714,1468691749,-1006378310,-276123646,
                    -762912461,-2009738458,-20184070,-2032962057,-407216246,-1341996029,280686571,-1341996029,-272987417,-1341927933,-279530472,-762947789,-519382390,52882804,-1406760443,66750469,
                    1978662604,1600030419,1299531610,-491084662,-1341996029,-838602822,-1341967644,-167317565,150570752,-1959889621,-1977195776,-2130949888,494339956,-66904704,184514367,-394693361,
                    -857210742,-1257136640,15460607,2013266920,184547523,-396266210,-66125696,-1966312359,11921537,-503316248,259490044,300436149,-347875328,15460433,-66699648,184513571,
                    -399149801,-907542478,-1258268160,11921595,-1241509400,15460461,738205416,15460453,-9103862,301993960,-399035703,31981749,-352086016,16312337,-1603878000,-528482268,
                    180609823,12821094,28410083,-476052014,618620416,-1570370877,916979909,2080637124,-1013922508,-1476344522,80069756,-785238902,114554545,-696196605,855630607,587432899,
                    264493706,-1964461818,855018196,66245602,-1325157375,620135366,1963181344,58753990,-2084182768,-1073543494,-74414102,-1475806484,-2014677768,-284513244,-163985944,1090447555,
                    552518832,-915014658,-1923686461,-74447213,-1475806484,-1816496904,-1847017469,-2130914247,50205045,-1707029272,-1340045628,-990122362,-1899523645,-1977732097,-2131015424,149427061,
                    646459905,-1015020040,1913977607,276267259,-91877493,-148453480,-1948824576,-2033742856,-389051677,-66649984,-756845996,-1735740145,-839464926,-407840890,-838661958,-9113846,
                    62132912,-1342039825,-1161524511,646579183,347080171,-440794486,-269040637,538825510,-1341983021,-282686751,-1342011363,-273642779,-457571534,-273625597,-856749826,-1742542060,
                    -536165422,86434932,-351916027,1024075298,-121387094,872386247,1224772126,326467835,-1879045912,99296906,-83409280,-1946521075,-1728607545,9119308,-125118581,872473576,
                    124944636,-474996270,-4586702,-1274753533,942074079,585861677,-790113555,-20444419,-1966638610,646638345,-685636106,-393689134,-121420272,225935612,181471860,75623027,
                    550618880,-489561391,-503061807,-489555247,-88612349,-66650496,-774802684,-1965043481,-1949174061,-773139990,66769386,-2132674863,-943519790,-1324971015,66769890,-773664286,
                    -1023409158,1644202510,854428409,-773421106,1342213012,1998142477,1007318081,1007187009,1007121457,-1148947189,-201260103,972613841,16827321,518541911,526349563,-1036363010,
                    7476810,-755097038,914671162,419299446,495242987,402575988,204655339,138072811,7550596,-964031490,15220322,-121410826,512381527,15220322,-1224712458,1224769598,
                    125830006,474697,-1975618294,-394436096,2115107210,1522016095,868811014,1241549334,-401735990,-1023346696,-2029980154,1965164793,-177062884,-225764213,1971811,119932447,
                    -1476344770,2097424068,-527197999,-1756090625,-1013964808,-1440773089,740345375,-1306349022,1579201058,-1608481248,-1306349022,-1306349022,-1306349022,-1306390495,2082555425,-467553758,
                    270709282,1075984930,2015512610,-1820096828,-74399226,-1475806484,-1816496904,-397295613,507394024,-285495264,-2033925232,-1820085199,-74399226,-1475806484,-1816496904,-399392765,
                    -29542424,-1275003965,-1947553520,112886725,854441987,-74414102,-1475806484,-2014677768,238529768,1040115931,-973159170,545769844,-1475810580,-2014677528,-164188952,1040115907,
                    -915094274,-847967490,552529840,-1011811349,-2014699282,-85132400,1962453000,-1271822358,-835277592,-392560948,-1013957125,-757026557,-1966595064,9353280,1224792224,932767957,
                    -773290300,-1948724760,116163522,62175936,-1970851794,620177161,-392885567,-1965017405,109806530,-1862608133,141880488,-994379638,-297615357,-531960694,-326662182,552524464,
                    1711668104,-1271807088,117146562,-324497158,-125171596,-1073494854,-319033790,96700486,-1899983656,-1275032578,-1947029232,112886726,854441987,-74414094,-1475806484,-2014153480,
                    -297628988,-1426133942,-973159170,629655924,-1475808532,-2014153240,-297628988,-1426133942,-915094274,-219410553,1978334925,-1340045326,-339808517,-326662158,552530608,-74414094,
                    -1475806484,-2014153480,-297619407,-71045974,25922150,-2033951230,9353536,109697526,1946353666,1028712679,117146562,-324497158,-125171596,-939277126,15462123,-922550086,
                    71194856,-1964981360,918284445,-1899806720,59423432,-352271122,-20649216,61651657,-1400206632,-2033977172,109651702,1946353666,1038674075,-489106883,918808707,855608024,
                    41124859,-483522607,-1910374505,-1843281008,-2084392415,-1862662405,141880488,817559728,-297615357,612363338,-756764409,-285537596,-2084387952,-621082997,-324497158,-122681228,
                    -1073532742,-319361470,-2142580700,-756502265,-1966550816,-2015702300,-625939321,-1966852882,-1013911813,-2084402464,-1862662405,141880488,-994379638,-289749245,-352270077,-326571264,
                    -352303615,1174662280,-326571264,-71088638,-1899787045,-1964995586,901441741,-1966815485,15462123,-994443010,-324351741,-324343040,-324343040,-389684507,-1161415229,-1013971986,
                    65845958,79923270,109806530,-1161766164,888013744,1250575084,-622010233,-1338996774,-333124030,131236017,-923342710,-511651456,-756231967,79923526,-395605280,-956090950,
                    -286553404,12189931,-85145341,-352285992,-118756214,-2034040596,1916599272,59161288,-2033924882,65583817,-20668868,-397548849,-1023396413,1912880176,-121408466,1947745283,
                    -2029980154,-214824843,80995505,-394207022,1953692674,26274057,913696991,-1006434118,-1341945117,-1013911560,868256985,-1005154600,184515584,-1005161414,-19985407,235369522,
                    1279233302,1948843727,2051968278,1948319439,2052230422,1947795151,1280150806,1947270863,137268502,1946746575,138317078,1964310223,-1941532967,1443367561,9019781,-1601944062,
                    1174405256,503838915,-1898302510,1963788992,143246414,9178748,15402622,-931824130,-1001516538,235669641,101581196,-1957822201,771621611,160286837,1069102668,-350745088,
                    1963589320,2051968310,15448328,-931853314,906512781,268447417,201427254,234982414,243607177,1577320586,-1975110913,-613154806,427822256,1996880643,-2015613302,-937024514,
                    3318404,-1977680090,646668800,3839824,126546038,-1986531290,-121417728,422248462,1224757408,1660979990,931915975,1347672152,-483189110,1980301253,76254046,-1957278206,
                    -1066139638,906512781,268447419,1963670532,125141244,1040723341,663568107,1069233740,-20443648,-2130938613,395118453,1307262540,913969549,134237883,1946615496,1491672923,
                    -1963227136,79268446,869400577,1398214175,912255179,-888448117,89390964,928638987,514334660,375586955,-394723240,-1540147224,-1966211379,1543438029,-126496886,268444344,
                    74744059,1174737290,1946815195,16693262,62442356,-1965094912,-399526657,65536235,-1961474832,-2084412672,-323352838,-1340030973,855633659,1644202526,1342213015,-2080359882,
                    -1976142328,-1986558976,-121417728,-1734127533,-20413184,-1341551904,-333124030,-990978038,-259201021,514382276,-986251226,-1736026021,-388905775,-259332093,-1274985444,1142112502,
                    47284340,-644224882,-2063561970,-2130708495,42663796,-928856066,-20937728,-515335945,1660979990,-1340962080,1714745320,125141243,344589744,-1588928017,511967370,-1007288066,
                    -526130223,-1023390720,276070651,-81778816,-2132052914,-83414912,855601929,788517347,637118310,-1306147952,740692006,1646674982,-2044297690,9085063,-469573504,-756240127,
                    -1325063072,-1991847192,1175454856,9085064,-453975936,-756240124,-1991891953,-1013972232,-1900006464,2116914438,335554211,236332684,1006829763,-1977191603,-154892544,1149896821,
                    9059977,12197512,-154926832,134873716,805617780,261620402,-1946627616,585610241,183816396,-2131328780,-769403657,-1953637842,585893414,-2009199655,-2011264768,-951678976,
                    16257042,8438672,17826048,185600768,1930836994,-1996453338,-757026557,-150306588,646570120,1175453895,-121433600,1930509314,-1325190143,201773792,1190050536,269666118,
                    -1013972744,1998076930,-1977207807,-1325299456,-2132487456,-527893238,13051529,302007824,1006827715,-1977191658,-1325365504,-2132487456,-527892982,13051527,302007824,-951650109,
                    16257042,1006814096,-1325042920,-1964977440,61913796,1122763246,180626655,1175514823,-121433600,1999780867,-1946974469,-2115598597,-773390592,1342242740,-389172222,214184163,
                    648836616,335565288,-145073694,268564038,-1971423992,48760244,-121393104,2001157133,1007318037,1007186961,1007121421,1966568450,-392842226,1686778091,-3023054,-1756306549,
                    -343539503,225828668,-759953358,2049966824,141935420,-764146556,-894156034,1781531368,175489852,898316011,-163160572,1946423298,-1399614682,11843841,1311771112,855608031,
                    -1952984605,-773107712,-20805921,1241528854,852652548,-1274877178,818145327,976682694,1995604992,-1274872114,813754399,212553,-2143390195,125061376,-550369654,162856939,
                    103811304,-1963160865,106320722,515135317,20121264,374000010,-890765058,526227694,123363166,-71083130,-1476344770,2098210500,2097292996,1949502144,252674531,646613955,
                    -309654222,-955981949,-1351287566,-527757178,-1978795226,-2084097299,-1351285518,-75286997,-1949831418,-1567960600,782237931,-1731098112,-668540789,77630297,604457216,-790036800,
                    -790048536,7635195,20055588,126272372,62651371,-1990262785,436208824,284723526,198951824,-383486973,-1954676228,114296461,-1933049429,251702201,1224772918,-1190923355,
                    914620557,-1541013261,-38207931,-398917606,-1012191349,1224772126,780808959,741509101,25224196,612357120,-1970820306,-1965031123,-1433787377,80921777,347142265,109642486,
                    1963655184,-167313720,24479744,-928382210,-1161515005,1122763758,-790066472,-1963405080,-789804320,50561507,67839236,-995376250,-1274049576,-1996479962,9085063,-802887434,
                    80871857,-527704054,8590947,-323304954,-1338982397,-333124030,-523237168,-527769590,-1965701974,-1190972736,-1433796365,1622262308,-391510574,987706048,201421826,-986309114,
                    -1000560640,-1056242548,34392948,1544028868,197889217,201618434,210551900,-881540853,147128844,-1000573936,-1056241012,34392948,1543639236,-1932948285,1946303435,119475232,
                    -1061574094,-206959360,270255942,-1013972744,24312892,636028276,-2115896575,1963263744,-377474112,16778171,-2083270167,-377290543,-773205248,-2084343037,1711475945,117473761,
                    868250885,59500894,-954139773,1912852713,19327297,-1161524929,-1433730068,15472227,-222647669,-324350461,65845952,-457856462,-1006434886,-297628988,-20648790,-847951106,
                    -872156230,853863594,-1948863207,-297628988,-20648790,-847951106,-1039731837,-1094700316,284885941,-324497158,-125368204,-990973302,1252672236,-20054332,-2014153712,141946024,
                    -693048697,-2016010002,-1271862311,-2014137084,-225776505,-79510290,1250421930,-989924610,-310129291,-1947014650,-1160891676,160039861,1122813166,-20665782,1978924749,-1413837882,
                    -1341996029,-326439358,267313328,82725552,1353728748,-1160902930,116261808,-1965014292,-297095164,-297619451,-1342051248,-1207898594,-660430706,1253113855,1122764014,-457879502,
                    -991034230,-5594881,-20054332,1492022771,-1341841590,1122954840,116279984,-991018358,61913796,1113064686,-1341985206,-1966805438,646639178,-292862176,-1975003610,-1160896018,
                    -1975057626,-1948900626,116163522,52869824,602835527,1934479593,2130847369,-1609543394,816447524,9287951,15939145,117482937,-2080338634,-1925778524,-1191008256,-1523384077,
                    -641807986,-1191046144,-1514274573,-1191021568,-1514274573,-1191019520,-1514274573,-1191048191,-1524694797,-378381872,-1241447447,2130978441,65911495,-972837958,-1161302870,-1058143438,
                    62503625,-324403199,-324343040,-324343040,-376577292,-519634559,87228533,-2063482647,520560134,1912852713,9169404,-968738941,10487480,-1161523520,78906288,-1160902929,
                    112460720,-1341848337,-272976896,-1341996029,28700340,-1966865342,648212140,-790298625,1978859213,-291459057,126615551,-972802173,67127999,-390812534,32440496,-1400439100,
                    -2033924881,1333132996,-1039927878,-1161515794,9044912,-1957370385,288503472,853861615,-1400457959,-2033924881,-20054332,-2084407820,-1073543489,-1257229596,-85132400,1962453000,
                    -1966831622,-285282644,-847985410,-85192569,1978443784,-1340045353,-672403833,817224628,-85195641,-1966831622,-1393627397,-20674566,1978662605,109806570,-838600006,-1257688348,
                    -990925690,-20674876,1978990285,-1161524425,-292879444,-289744980,-1393635837,-2084402217,-1161820436,-288357460,1381099891,44862327,638592640,638058703,12125712,-1925312768,
                    -207271680,9287943,15941252,1051239565,33554617,104068005,-1044395634,-1191046144,-1514209037,-1191021568,-1514209037,-1191019520,-1514209037,-1191048191,-1526267661,-378316336,
                    1996759435,-972837446,-1161253650,-1058143438,62503625,-1393688575,-1393628416,-1393628416,-1206066444,1175453833,83396958,252691215,50401027,2139062143,252673919,17792783,
                    -2004287608,16877569,34816,134479872,825299474,-104660736,-104597053,1043151917,1110261805,1848468013,1997421576,-1947192604,-399519258,-6029266,-104653779,-1013922928,
                    1914566851,67159878,1174536391,-1601634304,47185956,-399185712,87163140,1174463625,-121374525,-2029980154,1963002105,1913518275,1946487515,720103457,1143604456,1347680451,
                    515592530,-1898233856,-2046382079,1006698497,-72059839,277483469,-1274811311,1498598672,-399232046,548667506,280232653,283642061,1913860096,987102914,852652781,976682694,
                    1994294272,1763346,-1274885798,-91697904,18812416,1532516953,233361328,1914045440,1379119114,-1066020220,548668080,401998029,1946272769,-1023346342,0,0,
                    0,0,0,0,0,0,2122383360,-2118277759,-2122409599,0,2130640896,-3941377,-8460289,0,0,-16880386,
                    940637820,0,0,2097025080,268467256,0,1572864,-404276164,406644504,0,1572864,-50050,406617624,0,0,406585344,
                    15384,0,-1,-406585345,-15385,-1,0,1715601468,1006649958,0,-1,-1715601469,-1006649959,-1,504233984,2026641970,
                    -864498484,0,1013317632,1715234406,404232318,0,1060306944,808468272,-253742992,0,2137194496,1667465059,-404331673,49152,1572864,1021778139,
                    404241627,0,-1059061632,-17239816,-1065291552,0,101580802,-29483458,100802062,0,406585344,404258328,402685500,0,1717960704,1717986918,
                    1717986816,0,2145058816,2065423323,454761243,0,-966786948,-960087956,214330424,31744,0,0,-16843010,0,406585344,404258328,
                    410943036,0,406585344,404258328,404232216,0,404226048,404232216,1008212094,0,0,217972760,3096,0,0,1627258928,
                    24624,0,0,-1061158912,49406,0,0,1828585512,27688,0,0,947654712,-33522434,0,0,2088566526,
                    268449848,0,0,0,0,0,406585344,404241468,404232192,0,1717960806,9216,0,0,7077888,1819045118,
                    1819045118,0,2093357080,2080817856,-964950394,6168,0,202949318,-964284320,0,946601984,1994157112,-864629556,0,808452144,24576,
                    0,0,202899456,808464432,403451952,0,806879232,202116108,405801996,0,0,1023344742,15462,0,0,410910744,
                    6168,0,0,0,404226072,12288,0,16646144,0,0,0,0,404226048,0,0,202899974,
                    -1065340832,0,946601984,-690567482,1815660230,0,406323200,404256792,410916888,0,2093350912,405800460,-956407616,0,2093350912,1007027718,
                    -964950522,0,203161600,-855753620,203295756,0,-20971520,-66666304,-964950522,0,945815552,-54083392,-964901178,0,-20578304,202900998,
                    808464432,0,2093350912,2093401798,-964901178,0,2093350912,2114373318,209192454,0,0,6168,402653208,0,0,6168,
                    405798936,0,393216,811600920,201732120,0,0,126,32256,0,6291456,201732120,811600920,0,2093350912,404276748,
                    404232192,0,8126464,-555825466,-1065558308,0,272105472,-956404538,-960051514,0,-60424192,2087085670,1727817318,0,1013317632,-1061109056,
                    1715257538,0,-127139840,1717986918,1828218470,0,-26869760,2020106856,1727946850,0,-26869760,2020106856,1626366048,0,1013317632,-1059142976,
                    1715128006,0,-960102400,-20527418,-960051514,0,1008205824,404232216,406591512,0,504102912,202116108,-864498484,0,-429522944,2021156460,
                    1726377062,0,-262144000,1616928864,1727946850,0,-957480960,-691601666,-960051514,0,-958005248,-556861698,-960051514,0,2093350912,-960051514,
                    -964901178,0,-60424192,2086692454,1626366048,0,2093350912,-960051514,-562247978,3086,-60424192,2087478886,1726375526,0,2093350912,940361312,
                    -964950330,0,2122186752,404249112,406591512,0,-960102400,-960051514,-964901178,0,-960102400,-960051514,940623468,0,-960102400,-690567482,
                    -294856962,0,-960102400,943221884,-960070548,0,1717960704,1008232038,406591512,0,-20578304,405833228,-956407614,0,1009778688,808464432,
                    809250864,0,8388608,1882767584,100801550,0,1007419392,202116108,205261836,0,1824919608,0,0,0,0,0,
                    0,255,402665520,0,0,0,0,209453176,-864629556,0,-530579456,1818648696,1719428710,0,0,-960495492,
                    -964902720,0,470548480,1825311804,-864629556,0,0,-956432260,-964902720,0,946601984,-262118304,1626366048,0,0,-859045770,
                    -864236340,2013269196,-530579456,1986420844,1726375526,0,404226048,404226104,406591512,0,101056512,101056526,101058054,1006659174,-530579456,1819828326,
                    1726380140,0,941096960,404232216,406591512,0,0,-19529492,-691611946,0,0,1717960924,1717986918,0,0,-960102276,
                    -964901178,0,0,1717960924,1719428710,-268410784,0,-859045770,-864236340,503319564,0,1986396380,1626366048,0,0,-966786948,
                    -964937716,0,271581184,808464636,907817008,0,0,-859045684,-864629556,0,0,1717960806,1008232038,0,0,-959053626,
                    -26421546,0,0,1815609542,1824929848,0,0,-960102202,-964770106,-134216180,0,-870842114,-956420000,0,236453888,1880627224,
                    403576856,0,404226048,1579032,404232216,0,1880621056,236460056,409999384,0,1994129408,0,0,0,0,1824919608,
                    -33503546,0,1013317632,-1061109056,1007469158,1660,-872415232,-859045684,-864629556,0,405798924,-956432260,-964902720,0,946602000,209453176,
                    -864629556,0,-872415232,209453176,-864629556,0,806879328,209453176,-864629556,0,1815609400,209453176,-864629556,0,0,1616919654,
                    201745980,15360,946602000,-956432260,-964902720,0,-973078528,-956432260,-964902720,0,806879328,-956432260,-964902720,0,1711276032,404226104,
                    406591512,0,1013317656,404226104,406591512,0,806879328,404226104,406591512,0,1048774,-960087956,-960037178,0,939538540,-960087956,
                    -960037178,0,1610618928,1618804326,1727946848,0,0,1983250636,-663847208,0,1047265280,-20132660,-858862388,0,946602000,-960102276,
                    -964901178,0,-973078528,-960102276,-964901178,0,806879328,-960102276,-964901178,0,2026635312,-859045684,-864629556,0,806879328,-859045684,
                    -864629556,0,-973078528,-960102202,-964770106,2013267468,8126662,-960051514,-964901178,0,12976326,-960051514,-964901178,0,406585368,1616930400,
                    404252220,0,1818492984,1616929008,-419667872,0,1717960704,2115517464,404258328,0,-859045640,-857802556,-859386676,0,454557710,2115508248,
                    404232216,55408,811597848,209453176,-864629556,0,405798924,404226104,406591512,0,811597848,-960102276,-964901178,0,811597848,-859045684,
                    -864629556,0,1994129408,1717960924,1717986918,0,13006556,-18946314,-960049466,0,1819017276,2113945088,0,0,1819017272,2080389120,
                    0,0,808452096,811597872,-964902714,0,0,-20971520,-1073692480,0,0,-33161216,100664838,0,-1061027648,405849804,
                    -2046009124,6206,-1061027648,405849804,-1640077618,1542,404226048,404226072,1008221244,0,0,1826095158,27702,0,0,1815478488,
                    27864,0,289673540,289673540,289673540,289673540,1437226410,1437226410,1437226410,1437226410,-579347081,-579347081,-579347081,-579347081,404232216,404232216,
                    404232216,404232216,404232216,418912280,404232216,404232216,404232216,418912504,404232216,404232216,909522486,922105398,909522486,909522486,0,16646144,
                    909522486,909522486,0,418906360,404232216,404232216,909522486,116799222,909522486,909522486,909522486,909522486,909522486,909522486,0,116785406,
                    909522486,909522486,909522486,117323510,0,0,909522486,922629686,0,0,404232216,418912504,0,0,0,16252928,
                    404232216,404232216,404232216,404690968,0,0,404232216,419371032,0,0,0,16711680,404232216,404232216,404232216,404690968,
                    404232216,404232216,0,16711680,0,0,404232216,419371032,404232216,404232216,404232216,404690975,404232216,404232216,909522486,909588022,
                    909522486,909522486,909522486,809449015,0,0,0,808910911,909522486,909522486,909522486,16725751,0,0,0,16187647,
                    909522486,909522486,909522486,808924727,909522486,909522486,0,16711935,0,0,909522486,16201463,909522486,909522486,404232216,16718079,
                    0,0,909522486,922695222,0,0,0,16711935,404232216,404232216,0,16711680,909522486,909522486,909522486,910112310,
                    0,0,404232216,404690975,0,0,0,404684831,404232216,404232216,0,4128768,909522486,909522486,909522486,922695222,
                    909522486,909522486,404232216,419371263,404232216,404232216,404232216,418912280,0,0,0,2031616,404232216,404232216,-1,-1,
                    -1,-1,0,16711680,-1,-1,-252645136,-252645136,-252645136,-252645136,252645135,252645135,252645135,252645135,-1,-16711681,
                    0,0,0,-589823882,-596191016,0,2026635264,-657666868,-959658298,0,-20578304,-1061108032,-1061109568,0,0,1819082348,
                    1819044972,0,16646144,806930016,-956420000,0,0,-656932738,-663693096,0,0,1717986918,1616930428,49152,0,404256476,
                    404232216,0,8257536,1717966908,410936892,0,3670016,-956404538,1815660230,0,946601984,-965949754,1827564652,0,506462208,1046878220,
                    1715234406,0,0,-606404482,56190,0,196608,-606402946,1623257982,0,472907776,2086690912,807166048,0,8126464,-960051514,
                    -960051514,0,0,16711168,-33554432,0,0,2115508248,16717824,0,3145728,101455884,8263728,0,786432,1613764656,
                    8263692,0,236650496,404232984,404232216,404232216,404232216,404232216,-663693096,0,0,8263704,402653208,0,0,-603979658,
                    30428,0,1819017272,14336,0,0,0,1572864,6144,0,0,0,6144,0,202113039,216796172,
                    1008495724,0,1819017432,1811967084,0,0,-667942800,-134192952,0,0,0,2088533116,2080406652,0,0,0,
                    0,0,7424,610664448,604045158,0,48,-1010615194,-1010574373,26172,1291845632,-402718525,-1010565157,-1023360061,5505024,-2424832,
                    404265240,406591512,0,12801536,-1010580541,1715258307,6144,87,-1010580541,-603995173,26214,1476395008,-1016725309,406600728,-1023383869,5832704,
                    -1010630656,1008255846,406591512,0,16734720,202949510,-1044172704,65280,109,15073280,-606339109,56283,1979711488,0,-1010580541,402679356,
                    7798784,0,-1010630461,-10036261,0,30720,-1016725504,1013333016,49920,145,7208960,2128100123,56439,-1694498816,2126714904,-1060912960,
                    402685464,10289152,-1016725504,-15188968,404291352,0,-60383744,1650878076,1717989222,62208,12583083,-959659838,1624119344,203397894,-1409286144,-1027161920,
                    812043288,1040633494,1536,0,0,0,0,-1518240127,-1719565891,32256,2130640896,-3941377,2113988607,0,-16908180,2084110078,
                    4096,1048576,-25413508,14352,0,1021777980,404285415,15360,406585344,-8487169,1006639128,0,1572864,402668604,0,-1,
                    -1010565145,-6145,65535,1013317632,1715225154,0,-1,-1111637095,-26173,65535,439492110,-859014964,30720,1013317632,1008232038,402685464,
                    0,1060126515,1894789168,57344,2137194496,1667465059,-423598105,0,-616818664,-619124932,6144,-2134900736,-17243912,-2147426112,0,238944774,
                    235339326,512,406585344,404258328,402685500,0,1717986918,6710886,26112,2145058816,2065423323,452991771,8126464,946652768,1815660230,2080378054,
                    0,0,-33489154,0,2115508284,2117867544,6270,406585344,404258328,402659352,0,404232216,2117867544,6144,0,-32761844,
                    6144,0,811597824,805371488,0,0,-1061158720,65024,0,678166528,671153772,0,1048576,2088515640,65278,0,
                    -25427714,940604472,0,0,0,0,0,1010571324,1579032,6144,1717960806,9216,0,0,-26448788,-26448788,
                    27648,2093357080,2080817856,2081982150,6144,-1027211264,811994136,50688,946601984,1994157112,1979763916,3145728,1610625072,0,0,202899456,
                    808464432,201338904,0,202125336,202902540,12288,0,-12818884,26112,0,404226048,402685464,0,0,0,405805080,
                    0,0,65024,0,0,0,402653208,0,202899974,-1065340832,0,2093350912,-152645922,2080425670,0,2014844984,
                    404232216,32256,2093350912,405800460,-33529658,0,101088454,113654790,31744,203161600,-855753620,503319564,0,-1061093696,113703942,31744,
                    945815552,-54083392,2080425670,0,101514950,808458288,12288,2093350912,2093401798,2080425670,0,-960070458,101481990,30720,1572864,6144,
                    6168,0,402653208,404226048,12288,101449728,1613764656,100669452,0,8257536,2113929216,0,1613758464,101455884,1610618928,0,
                    -972260154,1579032,6144,2093350912,-555825442,2080431296,0,1824919608,-960051458,50688,-60424192,2087085670,-67082650,0,-1027589018,-1033453376,
                    15360,-127139840,1717986918,-134191508,0,1651048038,1650882664,65024,-26869760,2020106856,-268410784,0,-1027589018,-966344482,14848,-960102400,
                    -20527418,-973027642,0,404241432,404232216,15360,504102912,202116108,2013318348,0,1819076198,1818654828,58880,-262144000,1616928864,-33529242,
                    0,-16857362,-960047418,50688,-958005248,-556861698,-973027642,0,-960087956,-965949754,14336,-60424192,2086692454,-268410784,0,-960070458,
                    -562247978,3086,-60424192,2087478886,-436181402,0,-966755130,-960088052,31744,2122186752,404249112,1006639128,0,-960051514,-960051514,31744,
                    -960102400,-960051514,268463160,0,-960051514,-25372970,27648,-960102400,943221816,-973050682,0,1717986918,404241432,15360,-20578304,811633688,
                    -33504570,0,808467504,808464432,15360,-2134900736,941416560,33558022,0,202128396,202116108,15360,1824919608,0,0,0,
                    0,0,-16777216,402665520,0,0,0,7864320,-859042692,30208,-530579456,1818648696,2080400998,0,8126464,-1060714816,
                    31744,470548480,1825311804,1979763916,0,8126464,-1060714754,31744,946601984,-262118304,-268410784,0,7733248,-864236340,2013269196,-530579456,
                    1986420844,-436181402,0,3676184,404232216,15360,101056512,101056526,1717962246,15360,1617354848,1818651768,58880,941096960,404232216,1006639128,
                    0,15466496,-690553130,50688,0,1717960924,1711302246,0,8126464,-960051514,31744,0,1717960924,1616930428,61440,7733248,
                    -864236340,503319564,0,1986396380,-268410784,0,8126464,482788976,31744,271581184,808464636,469774390,0,13369344,-858993460,30208,
                    0,1717960806,402679356,0,12976128,-687946026,27648,0,1815609542,-973064084,0,12976128,-964770106,-134216180,0,-870842114,
                    -33542042,0,404229656,404254744,3584,404226048,1579032,402659352,0,404254744,404229656,28672,1994129408,0,0,0,
                    272105472,-956404538,0,1013317632,-1060977984,201745980,31744,13421772,-858993460,30208,405798924,-956432260,2080424134,1048576,7878764,-859042692,
                    30208,-859045888,209453176,1979763916,6291456,7876632,-859042692,30208,1815609400,209453176,1979763916,0,1013317632,1007444070,1596,946602000,
                    -956432260,2080424134,0,8178892,-1060714754,31744,806879328,-956432260,2080424134,0,3696230,404232216,15360,1013317656,404226104,1006639128,
                    6291456,3682328,404232216,15360,-972029754,-960087956,-973013306,946601984,946616320,-20527418,50688,1610618928,1618804326,-33529754,0,-864681984,
                    -656918914,28160,1047265280,-20132660,-838808372,1048576,8140908,-960051514,31744,-960102400,-960102276,2080425670,6291456,8138776,-960051514,31744,
                    2026635312,-859045684,1979763916,6291456,13381656,-858993460,30208,-960102400,-960102202,101500542,13006848,1824966200,-965949754,14336,-973078330,-960051514,
                    2080425670,1572864,1717573692,1008230502,6144,1818492984,1616929008,-67084058,0,1008232038,2115534360,6144,-859045640,-857802556,-973026100,917504,
                    404232984,404258328,1879054552,811597848,209453176,1979763916,786432,3676208,404232216,15360,811597848,-960102276,2080425670,1572864,13381728,-858993460,
                    30208,1994129408,1717960924,1711302246,1994129408,-420085562,-825819426,50688,1819017276,2113945088,0,3670016,939551852,31744,0,808452096,
                    811597872,2080425670,0,0,-1061093696,0,0,-33161216,1542,12582912,-858210106,-595185568,1040190488,-1060765504,812043480,1040633502,
                    1536,1579032,1010571324,6144,0,-663996820,13824,0,-664010752,-671074708,0,289673540,289673540,289673540,1437208900,1437226410,
                    1437226410,1437226410,-579347081,-579347081,-579347081,404282743,404232216,404232216,404232216,404232216,418912280,404232216,404232216,418912280,404232440,404232216,
                    909522486,922105398,909522486,13878,0,909508862,909522486,0,418906360,404232216,909514776,922105398,909510390,909522486,909522486,909522486,
                    909522486,13878,16646144,909510390,909522486,909522486,117323510,0,909508608,909522486,14078,0,404232216,418912504,0,0,
                    0,404226296,404232216,404232216,404690968,0,404226048,404232216,6399,0,0,16711680,404232216,404232216,404232216,404232223,
                    404232216,0,16711680,0,404226048,404232216,404232447,404232216,404232216,404690975,404232216,909514776,909522486,909522487,909522486,909522486,
                    809449015,0,0,4128768,909520951,909522486,909522486,16725751,0,0,16711680,909508855,909522486,909522486,808924727,909522486,
                    13878,16711680,255,0,909522486,16201463,909522486,404239926,419371032,255,0,909522486,922695222,0,0,16711680,
                    404226303,404232216,0,16711680,909522486,909522486,909522486,13887,0,404232216,404690975,0,0,2031616,404232223,404232216,
                    0,4128768,909522486,909522486,909522486,909522687,909522486,404232216,419371263,404232216,404232216,404232216,6392,0,0,2031616,
                    404232216,-59368,-1,-1,-1,0,16711680,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,-61681,
                    -1,65280,0,0,-589823882,1979767004,0,2093350912,-956498746,1073791168,-20578304,-1061108032,-1073692480,0,-26476544,1819044972,
                    27648,-20578304,405823536,-33529658,0,8257536,-656877352,28672,0,1717986918,1623227488,0,1994129408,404232216,6144,2115502080,
                    1717976166,2113944600,0,-960087956,-965935418,14336,946601984,-965949754,-301962132,0,403447344,1717976678,15360,0,-606404482,32256,
                    0,2128282374,2120276979,49152,472907776,2086690912,469786672,0,-960102276,-960051514,50688,16646144,-33554432,254,0,410910744,
                    6168,65280,806879232,202902534,2113941504,0,811600920,201338904,32256,236650496,404232984,404232216,404232216,404232216,-656926696,28672,
                    1572864,2113935360,6168,0,1994129408,-603979658,0,1819017272,14336,0,0,0,6168,0,0,1572864,
                    0,983040,202116108,1815874796,7168,1819017432,1811967084,0,7340032,1623775280,63488,0,0,2088533116,31868,0,
                    0,0,0,7424,1727987748,26148,2228224,1667432547,8704,0,721420288,404226048,404232447,6144,45,0,
                    65280,0,12799232,-607918081,-1010580541,5505024,-2424832,404265240,1006639128,1442840576,-1010630461,-1016675389,15384,87,-1010580541,-10036261,
                    26112,12802048,1008255846,-1010615194,5832704,-1010630656,1008255846,1006639128,1509949440,-1014628097,811666456,50175,109,15073280,-606339109,56064,
                    30208,-1010630656,1008255846,7798784,0,-1009057597,1711332351,-1862270976,7208960,2128100123,56439,1573019,-1010820994,2115551427,6144,12819712,
                    419391036,404232447,10354688,1717960956,1718582370,-218077594,-251658240,404226072,404291352,255,246,6168,1638144,6144,0,0,
                    2122383360,-1114004095,2130674046,-1008215041,1828650878,2084110078,272109568,2084076798,947654656,-25413378,269498492,-25413508,14460,1008212028,-65536,-1008212029,
                    3997695,1114007106,-3982336,-1114007107,252167167,-859041923,1013369976,1008232038,1060339224,812662576,2137256160,1667727203,-1722095936,-415482649,-2132780391,-119473922,
                    34504704,1041121022,406585856,410943000,1717976088,1711302246,2145084928,454810491,1046682368,1815623788,52344,2122186752,406617600,2117893656,406591743,404258328,
                    404232192,2117867544,1579008,202902782,3145728,1613783294,0,-1057046336,2359296,1713661695,1572864,-50050,16711680,1008271230,0,0,
                    813170688,805337136,1819029504,27648,1819017216,-26411412,813460480,217628792,12988416,812043288,946652672,-590595978,1616934400,49152,405798912,1613783136,
                    1613764608,405805080,6709248,1013333247,3145728,808464636,0,3145728,12384,252,0,3145728,101462016,1623201840,2093383680,-152645922,
                    812678144,808464432,2026699776,1623985208,2026699776,214699064,473724928,-32740148,-54518272,214759436,945846272,-858996488,-53708800,808455192,2026647552,-858993544,
                    2026665984,202951804,3174400,3158016,3158016,3158016,405811296,1613783232,6144,16579584,1613758464,405805068,2026659840,805309464,2093363200,-557785378,
                    813201408,-53687092,-60371968,1717986940,1013382144,-1067007808,-127124480,1718380134,-27068416,1751279736,-27066880,1751148664,1013379072,-832126784,-859030016,-858993412,
                    2016463872,808464432,504133632,-859042804,-429492224,1818651768,-262085120,1650876512,-957415936,-691601666,-957954560,-825821474,946652672,-965949754,-60409856,1616930428,
                    2026696704,-596063028,-60417024,1818650236,2026694144,483188848,-55281664,808464432,-859015168,-858993460,-858981376,-864498484,-960090112,-17905962,-960051712,946629688,
                    -858995200,808504440,-20547584,845581336,2019622400,1616928864,-1067419648,201732120,2014839296,404232216,272136192,27846,0,0,808452351,6144,
                    0,2093774860,-530549248,1717985404,56320,-1060341556,470579200,-859042692,30208,-54495028,946632704,1616929008,61440,-864258356,-530576136,1717988470,
                    805365248,808480816,201357312,214699020,-530527112,2020370028,1882252800,808464432,30720,-19477250,50688,-858982196,52224,-859014964,30720,1719458918,
                    24816,-864258356,3102,1717623926,61440,2014084288,271644672,808746032,6144,-858993460,30208,-864498484,12288,-16857386,27648,946652780,
                    50688,-864236340,3320,811924632,472972288,808464608,404233216,404232192,-533719040,808464412,1994186752,0,1048576,-960087956,2026700288,2014888140,
                    13372536,-859045684,469794304,-54495028,2126739456,1046887430,-872399104,2093774860,-536838656,2093774860,808484352,2093774860,32256,-1065846592,2126711864,2120236134,
                    -872399872,-54495028,-536840192,-54495028,-872384512,808480816,2093381632,404240408,-536855552,808480816,-969377792,-20550458,808502784,-855900040,469814272,2019621984,
                    64512,2144108300,1047297792,-858993410,2026688000,-859045768,13400064,-859045768,14710784,-859045768,2026665984,-859045684,14712320,-859045684,13401600,-864288564,
                    -1021833992,1715223654,-872409088,-858993460,404256768,-1065451840,946608152,1625711856,-858981376,821852412,-120836048,-959460102,236701383,404232252,469817456,2093774860,
                    939556352,808480816,1865728,-859045768,1865728,-859045684,16285184,-859045640,-67056640,-52638484,1013763072,8285246,946601984,8154168,805306368,-1060360096,
                    30720,-1061158660,0,202113276,-1010434048,862375134,-1010381809,930073819,404279043,404226072,3348480,1714644684,13369344,1724671539,579338240,579347080,
                    1437213320,1437226410,-612936278,-612901906,404282350,404232216,404232216,-132638696,404232216,-132581352,909514776,-164219338,13878,-30015488,13878,-132581352,
                    909514776,-164170234,909522486,909522486,13878,-164168186,909522486,-33491450,909508608,-33540554,404226048,-134154216,0,-132644864,404232216,520099864,
                    404226048,-16771048,0,-15204352,404232216,521672728,6168,-16777216,404226048,-15198184,404232216,521674520,909514776,926299702,909522486,1056978736,
                    0,926302000,909522486,-16713984,0,-147390720,909522486,926299952,13878,-16711936,909508608,-147392768,404239926,-16711936,909508608,-16763338,
                    0,-15139072,6168,-13238272,909522486,1056978486,404226048,520101656,0,521674520,6168,1060503552,909522486,-13224394,404239926,-15139048,
                    404232216,-134211560,0,521666560,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,-925075748,
                    7894528,-856109832,16564416,-1061106496,16695296,1819044972,-53711872,1624006704,64512,-656900392,6713344,1719428710,7758016,404282392,-63956992,-864519988,
                    946614524,-965949698,946616320,1819068102,472968704,-859039620,30720,-612466981,101449728,-612466981,945840320,-1067400968,2026649600,-858993460,16567296,16515324,
                    808452096,805370928,1613822976,1610618928,405863424,402677808,236715008,404232984,404232216,416815128,808507504,3145980,7745536,1994185728,946601984,27704,
                    0,402653208,0,402653184,252444672,-328463348,2020359196,1811967084,1880621056,2013278304,0,1010580540,0,0,-1207500800,243728522,
                    -1056440074,-1949666295,-1207946286,1082147051,-1964383904,-756174587,1387986629,-1341731325,-333124030,47320241,-1825642344,1482263183,988386138,-1964411390,-1735685435,-758003149,
                    -925775663,-925775663,-757997359,-766254895,1275104030,1534397403,117441976,-147395821,-1949217792,1946749888,117459005,-1207470589,-2033975101,-2114258194,1946271747,-991018362,
                    -88015999,21627764,-1946631280,-1735685433,642570487,-791609205,-1622088821,1241514145,855635687,-773848125,-1748827198,-1966634276,-880043894,642570487,-254738293,-1622088821,
                    -2063597407,854456039,225739001,198250359,125954163,545322496,-773786240,-773795360,-1949249056,-773795360,855573442,326467833,-523171119,-472784687,-478092335,1929574662,
                    63164899,-2015820816,508609424,-1898433600,-14788452,532889600,-1961471408,-167353600,141920000,-1039790973,549121200,-286539773,-1039922045,827493,-1570436882,1522729048,
                    -1961471408,-167353600,141920000,-1039790973,-1061491662,-286539773,-1039922045,2400357,-1570375698,1522729048,-1161539502,32375728,203440876,-1342076192,1515735791,1347601296,
                    61913796,1122763246,-1965021985,1257222145,-1013949864,125260604,71052660,905315191,1050249,-790072309,-182699005,401276932,512238474,-485556096,158630139,-83688064,
                    68384018,1007676174,1007710730,67270404,67758850,-88450109,-1342160128,1073802938,-521343862,-71072060,-13899541,-1359559875,-387857520,-655818869,1945890559,-1013914892,
                    12106258,-135059404,-88437800,-1330232576,1107357370,-292910141,-71645970,-333160192,65994252,-4527925,-333160192,-1013908242,-1004659194,-387733504,67156712,-1013971169,
                    137268534,138317118,1007138064,1949071202,2002533379,-167365633,276138240,910962829,243941301,8392328,-2131107569,511707508,1947859203,2051968310,-351161080,-1996425722,
                    177016949,1066219084,1303723596,-1576923416,15263953,-389153280,-1006566666,-1585089479,646185098,-997523202,15208032,-349724981,2051968310,1947221011,1913404431,1279233334,
                    1979989008,137268534,-1898368055,201427254,234982414,29616257,33687556,7661659,-160165366,-885387522,150918005,-210384326,-826080514,7661635,1409292520,-297619454,
                    -923865858,65948336,-20430100,-397808054,-400228157,565182580,1122765294,-2139862360,616503106,-1340936630,-318837182,-531971958,-297619432,-297104700,1347601296,1073749688,
                    -1961455912,-2084412672,-1472198932,1489182554,-297619439,2146364452,-1341044029,-334696894,1254326510,1397890566,853248765,-1899940919,906765961,-1945239258,-1191178751,-770834125,
                    1407721303,1532958721,1946356735,22734939,532896519,1397890566,106148864,2131240644,199199939,-1948289961,1863001738,-9142019,988302403,868840946,1292510858,-2012283191,
                    646611968,243600777,-383385462,19302989,69634901,103204213,42699645,-16721535,302645621,238279541,-1054422642,201427254,504243852,-806878837,-2134072320,119931227,
                    270976095,109888639,-545996021,-551139701,125864559,1950088703,-394968262,-920194509,990808589,1965786368,646613737,869420289,1963140805,25935616,-613033718,-913437133,
                    -1992900314,646712321,25894414,1308676072,39485644,532896519,1397890566,2131502788,199199939,848033908,-1972379866,-33618048,1127904295,-232331147,-20346355,-2080339954,
                    1291921035,-2063562482,1963140804,-1898368055,201427254,234982406,1527249242,1354244035,-1900019552,-1735947581,47438257,-992950062,-729356080,231982257,97771697,-1031020029,
                    -645465977,-880746498,-20716769,-1205849345,-1022689237,273271156,1099379437,-873215349,-125328381,-195507486,1354285968,-1900019552,-1733195069,-925760813,-388971312,-994978682,
                    -527757869,-813641474,-20453601,719303456,-1408595977,405979252,-89004917,-536672813,-1070401486,-806097526,-873225078,-480728341,1347535760,-1161524534,45351856,-1341913873,
                    -272976890,-1341796861,-273632256,82773684,-1274892284,-779882614,-323304954,851492867,-782635382,1347508419,-1161524534,45351856,-1341914129,-272976894,-1341796861,-273632240,
                    251004596,132743,-1274383358,78966704,-1966014225,116163522,61913792,-1966006034,-1023387304,1384863313,-1006380358,11843844,15663536,-395332607,-1039990342,-1161515794,
                    61866932,-1949105937,-38147963,853809408,32041045,-398909699,-971965053,1526594280,-2084408301,-1862662405,141946024,-1862600453,141880488,-1073481542,-290672624,-1273827770,
                    1861922024,-1394035693,-71669510,-1190539773,-454557646,-1949101567,103973826,-85147410,62175936,-1058532302,-387233542,1515846395,1364352707,-1931979234,-167342375,141920512,
                    -1898434530,109282242,-85146082,62503616,853807104,4647133,300461236,-20179718,16509151,61913798,535363566,-399964160,1582956575,513825219,-1978251008,-1321170688,
                    -401623808,-773784680,780897240,42776324,-668022642,1040383895,503717827,-1996453330,9085317,1224794272,1660979990,-1476344522,80069756,-982223856,-620033396,1720442484,
                    1326767754,-9142023,986209347,-55806477,1946749632,-1272940286,-1340801332,-1039732861,-1073484614,61703110,1948781504,-1383429432,1455808542,-2130955092,233312372,-398363399,
                    -989986562,-290666123,-395968828,-857146882,1579102208,-1391752491,176865396,-1964455763,-397294284,532873223,-398067028,-991757826,-1013909253,-398853460,100727272,-487194940,
                    -1933313085,1946815455,-2132571428,-14278862,-1013938175,-491062134,-1966749693,-922489158,-234836760,108328644,570491880,33482841,-915028482,-58006845,-939269446,-289764667,
                    -1400190717,-1963403092,-1007244154,1946403846,15263995,-20631039,1977482953,-58014832,162914993,134226111,59423432,-1161181714,76153738,-1973650416,-1006237450,-389188605,
                    67174632,1179647685,-1089964578,-939327302,-289764667,-1979397885,-125138308,-154903544,65537652,-387995648,-985267970,-557887627,-1161295872,-974257270,59423433,2096628874,
                    -252278180,1946403846,15263875,-20596224,1977501263,1972240073,61913800,-1161228050,268436409,-602829514,-125129590,-1744774936,-1161239818,15598512,62503625,-1925836800,
                    -1394029551,-154923008,65537652,-394838016,-272432926,1384825744,562092068,-789847074,772420351,42633080,-486287232,-1752682870,-389020976,-662640502,780854019,47232904,
                    -393549616,-1970808786,-1948612606,1381391043,-164407501,-1160904880,-136164200,334627832,-1752516086,-136132712,334627832,478853673,-136133736,332792775,-2083335712,-1966997416,
                    -1965389062,1522753374,-352257298,-286553401,-1007812470,-1085,-1,-1,-1,-1,-334364673,2052225614,-16744447,-16711936,1131413248,1919512697,
                    1948280680,1297105743,541278545,1886744429,1914729573,1919959919,1635020658,1848404335,959979569,540095020,858536248,959979569,540095532,892090680,959979569,540096044,
                    925645112,959979569,5388320,709908307,709774913,709120066,709052995,708919618,704662604,1126192692,1129263157,1095847248,-57089,892337968,792211768,-5555969,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
                    }
                • README.md
                  Compaq Video Graphics Controller (VGA)
                  ---
                  This is the Compaq Video Graphics Controller Board, one of the earliest VGA boards Compaq released
                  for its DeskPro 386 line.
                  
                  ![Compaq VGA Board](/devices/pc/video/compaq/vga/109360-001/static/Compaq_VGA_109360-001-640.jpg "link:/devices/pc/video/compaq/vga/109360-001/static/Compaq_VGA_109360-001.jpg")
                  
                  It was featured in the February 16, 1988 of PC Magazine (p.188).  At that time, it retailed for $599, and it was described
                  as "the sharpest, fastest IBM-standard video board you can slide into your PC."  The article goes on to say:
                  
                  > The Compaq [Video Graphics Controller Board] is the first truly hardware-compatible VGA board with
                  register-level support for all 17 video modes. It's also the first video board from a major manufacturer
                  that uses a full 16-bit interface....
                  
                  > Per the VGA standard, Compaq's board offers 640- by 480-pixel all-points-addressable graphics resolution
                  in 16 colors, as well as 256 colors from a palette of 262,144 at 320- by 200-pixel resolution.
                  
                  > Based on a Paradise Systems VLSI VGA chip and an Inmos DAC, the board includes 256K RAM soldered to it.
                  Relying on surface-mounted components for just about everything except its BIOS and the aforementioned chips,
                  the entire board is just 9 inches long and XT height. Although it will function in an 8-bit expansion slot,
                  it achieves its top speed only when its 16-bit interface is put into play.
                  
                  > The card-retaining bracket of the board holds only the female DB-15 of the IBM VGA system. This connector,
                  coupled with the analog output of the board, means that the [board] will function only with VGA-style monitors.
                  
                  > An extra edge connector at the top of the board matches the video expansion available on the IBM PS/2
                  Display Adapter card, electrically but not physically compatible with the VGA Feature Connector of PS/2
                  computers.
                  
                  > To your system, the board looks like an EGA adapter--that is, you run the appropriate setup procedure for
                  setting CMOS memory as if it were an EGA card. The two jumpers on the board (its only hardware adjustments)
                  alter its base address for matchng unusual systems and ordinarily require no change.
                  
                  > In testing, the Compaq Board proved itself functionally compatible with the IBM PS/2 Display Adapter but
                  faster, because of its 16-bit interface. On an ordinary AT, it nearly achieved the display speeds of the
                  internal VGA system of a stock PS/2 (which has a clock speed advantage over the AT).
                  
                  > Although Compaq claims that this board is designed specifically for its own machines, particularly the
                  DeskPro 386/20, it works great with non-Compaq machines as well. In fact, with this board, Compaq gives you
                  a way of getting the sharpest and fastest graphics without abandoning your commitment to the PC standard.
                  As such, this board is in perfect accord with the Compaq philosophy, and it may be the best way available
                  for mating a VGA-style monitor and VGA graphics to your AT.
                  
                  A copy of the board's [VGA ROM BIOS](109360-001/1988-05-18.json) was created by [dumping](/devices/pc/bios/compaq/deskpro386/#dumping-the-roms)
                  the contents of each EPROM chip to a *.hex* file, and then merging the *.hex* files with the following
                  [FileDump](/modules/filedump/) command:
                  
                  	cd 109360-001
                  	filedump --file=109793-002.hex --merge=109794-002.hex --output=1988-05-18.json
                  
                  For a more human-readable dump, use the `--comments` option:
                  
                  	filedump --file=109793-002.hex --merge=109794-002.hex --output=1988-05-18.dump --comments
                  
                  And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data:
                  
                  > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/compaq/vga/109360-001/1988-05-18.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/compaq/vga/109360-001/1988-05-18.json&format=rom)
                  
                  The Compaq VGA ROM BIOS concludes with the usual copyright string and author initials:
                  
                  	Copyright COMPAQ Computer Corporation, 1982, 1983, 1984, 1985, 1986, 1987, 1988
                  	RWS*PNA*NPB*DJC*CAB*ALL*
                  	V4C 05COMPAQ
                  	05/18/88
                  
                  Four of the authors -- **RWS**, **NPB**, **DJC**, and **CAB** -- are also listed as authors of the
                  [DeskPro 386 ROM BIOS](/devices/pc/bios/compaq/deskpro386/).
                  
                  An older version of the VGA ROM BIOS, [1987-10-27.json](109360-001/1987-10-27.json), is also available online.  It comes
                  from an [earlier revision](http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/) of the same board, with
                  the same part number (109360-001).
                  
                  	cd 109360-001
                  	filedump --file=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/109328-002.BIN --merge=http://bitsavers.trailing-edge.com/pdf/compaq/firmware/109360-001_VGA/109327-002.BIN --output=1987-10-27.json
                  
                • compaq-vga-lock.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoVGA" model="vga" screenwidth="640" screenheight="480" scale="true" autolock="true" pos="center" padding="8px">
                  	<menu>
                  		<title>VGA Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  			<control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
                  		</control>
                  	</menu>
                  </video>
                  
            • ibm
              • cga
                • ibm-cga-960-touch.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" touchscreen="true" pos="center" padding="8px">
                  	<menu>
                  		<title>Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-cga-960.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px">
                  	<menu>
                  		<title>Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-cga-dual.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoCGA" model="cga" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px">
                  	<menu>
                  		<title>Color Display</title>
                  	</menu>
                  </video>
                  
                • ibm-cga-lock.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" autolock="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" padding="8px">
                  	<menu>
                  		<title>Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  			<control type="button" binding="lockPointer" padleft="8px">Lock Pointer</control>
                  			<control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-cga.json
                  [0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,0,0,126,255,219,255,255,195,0,0,0,54,127,127,127,127,0,0,0,8,28,62,127,62,0,0,
                  24,60,60,231,231,231,0,0,24,60,126,255,255,126,0,0,0,0,0,24,60,60,255,255,255,255,255,231,195,195,0,0,0,0,60,102,66,66,255,
                  255,255,255,195,153,189,189,0,0,15,7,13,25,60,102,0,0,60,102,102,102,60,24,0,0,63,51,63,48,48,48,0,0,127,99,127,99,99,99,
                  0,0,24,24,219,60,231,60,0,0,64,96,112,124,127,124,0,0,1,3,7,31,127,31,0,0,24,60,126,24,24,24,0,0,51,51,51,51,51,51,0,0,127,
                  219,219,219,123,27,0,62,99,48,28,54,99,99,0,0,0,0,0,0,0,0,0,0,24,60,126,24,24,24,0,0,24,60,126,24,24,24,0,0,24,24,24,24,24,
                  24,0,0,0,0,12,6,127,6,0,0,0,0,24,48,127,48,0,0,0,0,0,96,96,96,0,0,0,0,36,102,255,102,0,0,0,8,28,28,62,62,0,0,0,127,127,62,
                  62,28,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,99,99,99,34,0,0,0,0,0,54,54,127,54,54,54,12,12,62,99,97,96,62,3,0,0,0,0,97,
                  99,6,12,0,0,28,54,54,28,59,110,0,48,48,48,96,0,0,0,0,0,12,24,48,48,48,48,0,0,24,12,6,6,6,6,0,0,0,0,102,60,255,60,0,0,0,24,
                  24,24,255,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,1,3,6,12,24,48,0,0,62,99,103,111,123,115,0,0,12,28,60,
                  12,12,12,0,0,62,99,3,6,12,24,0,0,62,99,3,3,30,3,0,0,6,14,30,54,102,127,0,0,127,96,96,96,126,3,0,0,28,48,96,96,126,99,0,0,
                  127,99,3,6,12,24,0,0,62,99,99,99,62,99,0,0,62,99,99,99,63,3,0,0,0,24,24,0,0,0,0,0,0,24,24,0,0,0,0,0,6,12,24,48,96,48,0,0,
                  0,0,0,126,0,0,0,0,96,48,24,12,6,12,0,0,62,99,99,6,12,12,0,0,62,99,99,111,111,111,0,0,8,28,54,99,99,127,0,0,126,51,51,51,62,
                  51,0,0,30,51,97,96,96,96,0,0,124,54,51,51,51,51,0,0,127,51,49,52,60,52,0,0,127,51,49,52,60,52,0,0,30,51,97,96,96,111,0,0,
                  99,99,99,99,127,99,0,0,60,24,24,24,24,24,0,0,15,6,6,6,6,6,0,0,115,51,54,54,60,54,0,0,120,48,48,48,48,48,0,0,195,231,255,219,
                  195,195,0,0,99,115,123,127,111,103,0,0,28,54,99,99,99,99,0,0,126,51,51,51,62,48,0,0,62,99,99,99,99,107,0,0,126,51,51,51,62,
                  54,0,0,62,99,99,48,28,6,0,0,255,219,153,24,24,24,0,0,99,99,99,99,99,99,0,0,195,195,195,195,195,195,0,0,195,195,195,195,219,
                  219,0,0,195,195,102,60,24,60,0,0,195,195,195,102,60,24,0,0,255,195,134,12,24,48,0,0,60,48,48,48,48,48,0,0,64,96,112,56,28,
                  14,0,0,60,12,12,12,12,12,8,28,54,99,0,0,0,0,0,0,0,0,0,0,0,0,24,24,12,0,0,0,0,0,0,0,0,0,0,60,6,62,0,0,112,48,48,60,54,51,0,
                  0,0,0,0,62,99,96,0,0,14,6,6,30,54,102,0,0,0,0,0,62,99,127,0,0,28,54,50,48,124,48,0,0,0,0,0,59,102,102,0,0,112,48,48,54,59,
                  51,0,0,12,12,0,28,12,12,0,0,6,6,0,14,6,6,0,0,112,48,48,51,54,60,0,0,28,12,12,12,12,12,0,0,0,0,0,230,255,219,0,0,0,0,0,110,
                  51,51,0,0,0,0,0,62,99,99,0,0,0,0,0,110,51,51,0,0,0,0,0,59,102,102,0,0,0,0,0,110,59,51,0,0,0,0,0,62,99,56,0,0,8,24,24,126,
                  24,24,0,0,0,0,0,102,102,102,0,0,0,0,0,195,195,195,0,0,0,0,0,195,195,219,0,0,0,0,0,99,54,28,0,0,0,0,0,99,99,99,0,0,0,0,0,127,
                  102,12,0,0,14,24,24,24,112,24,0,0,24,24,24,24,0,24,0,0,112,24,24,24,14,24,0,0,59,110,0,0,0,0,0,0,0,0,8,28,54,99,0,0,30,51,
                  97,96,96,97,0,0,102,102,0,102,102,102,0,6,12,24,0,62,99,127,0,8,28,54,0,60,6,62,0,0,102,102,0,60,6,62,0,48,24,12,0,60,6,62,
                  0,28,54,28,0,60,6,62,0,0,0,0,60,102,96,102,0,8,28,54,0,62,99,127,0,0,102,102,0,62,99,127,0,48,24,12,0,62,99,127,0,0,102,102,
                  0,56,24,24,0,24,60,102,0,56,24,24,0,96,48,24,0,56,24,24,0,99,99,8,28,54,99,99,28,54,28,0,28,54,99,99,12,24,48,0,127,51,48,
                  62,0,0,0,0,110,59,27,126,0,0,31,54,102,102,127,102,0,8,28,54,0,62,99,99,0,0,99,99,0,62,99,99,0,48,24,12,0,62,99,99,0,24,60,
                  102,0,102,102,102,0,48,24,12,0,102,102,102,0,0,99,99,0,99,99,99,0,99,99,28,54,99,99,99,0,99,99,0,99,99,99,99,0,24,24,126,
                  195,192,192,195,0,28,54,50,48,120,48,48,0,0,195,102,60,24,255,24,0,252,102,102,124,98,102,111,0,14,27,24,24,24,126,24,0,12,
                  24,48,0,60,6,62,0,12,24,48,0,56,24,24,0,12,24,48,0,62,99,99,0,12,24,48,0,102,102,102,0,0,59,110,0,110,51,51,59,110,0,99,115,
                  123,127,111,0,60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,0,24,24,0,24,24,48,0,0,0,0,0,0,127,96,0,0,0,0,0,0,127,3,0,96,
                  224,99,102,108,24,48,0,96,224,99,102,108,24,51,0,0,24,24,0,24,24,60,0,0,0,0,27,54,108,54,0,0,0,0,108,54,27,54,17,68,17,68,
                  17,68,17,68,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
                  24,24,24,24,24,248,24,248,54,54,54,54,54,54,54,246,0,0,0,0,0,0,0,254,0,0,0,0,0,248,24,248,54,54,54,54,54,246,6,246,54,54,
                  54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,54,54,54,54,246,6,254,54,54,54,54,54,54,54,254,24,24,24,24,24,248,24,248,0,0,0,0,
                  0,0,0,248,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,0,0,0,0,0,0,0,255,24,
                  24,24,24,24,24,24,255,24,24,24,24,24,31,24,31,54,54,54,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
                  54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,0,0,0,0,0,255,0,255,54,54,54,54,54,247,0,247,24,24,24,24,24,255,
                  0,255,54,54,54,54,54,54,54,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,63,24,24,24,24,24,31,24,31,0,0,
                  0,0,0,31,24,31,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,255,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,
                  31,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,
                  255,255,255,255,0,0,0,0,0,0,59,110,108,0,0,0,0,62,99,126,99,0,0,127,99,99,96,96,96,0,0,0,0,127,54,54,54,0,0,127,99,48,24,
                  12,24,0,0,0,0,0,63,108,108,0,0,0,0,51,51,51,51,0,0,0,0,59,110,12,12,0,0,126,24,60,102,102,102,0,0,28,54,99,99,127,99,0,0,
                  28,54,99,99,99,54,0,0,30,48,24,12,62,102,0,0,0,0,0,126,219,219,0,0,3,6,126,219,219,243,0,0,28,48,96,96,124,96,0,0,0,62,99,
                  99,99,99,0,0,0,127,0,0,127,0,0,0,24,24,24,255,24,24,0,0,48,24,12,6,12,24,0,0,12,24,48,96,48,24,0,0,14,27,27,24,24,24,24,24,
                  24,24,24,24,24,24,0,0,24,24,0,0,255,0,0,0,0,0,59,110,0,59,0,56,108,108,56,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,15,12,
                  12,12,12,12,236,0,216,108,108,108,108,108,0,0,112,216,48,96,200,248,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  153,129,126,0,0,0,0,0,231,255,126,0,0,0,0,0,62,28,8,0,0,0,0,0,28,8,0,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,0,
                  0,0,0,0,0,0,231,255,255,255,255,255,0,0,102,60,0,0,0,0,0,0,153,195,255,255,255,255,0,0,102,102,60,0,0,0,0,0,126,24,24,0,0,
                  0,0,0,112,240,224,0,0,0,0,0,103,231,230,192,0,0,0,0,219,24,24,0,0,0,0,0,112,96,64,0,0,0,0,0,7,3,1,0,0,0,0,0,126,60,24,0,0,
                  0,0,0,0,51,51,0,0,0,0,0,27,27,27,0,0,0,0,0,54,28,6,99,62,0,0,0,127,127,127,0,0,0,0,0,126,60,24,126,0,0,0,0,24,24,24,0,0,0,
                  0,0,126,60,24,0,0,0,0,0,12,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,127,127,0,0,0,0,0,0,28,8,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,127,54,54,0,0,0,0,0,67,99,62,12,12,0,0,0,24,51,99,0,0,0,0,0,102,
                  102,59,0,0,0,0,0,0,0,0,0,0,0,0,0,48,24,12,0,0,0,0,0,6,12,24,0,0,0,0,0,102,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,24,24,24,48,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,96,64,0,0,0,0,0,0,99,99,62,0,0,0,0,0,12,12,63,0,0,0,0,0,48,99,127,0,0,0,0,0,3,99,62,
                  0,0,0,0,0,6,6,15,0,0,0,0,0,3,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,24,24,24,0,0,0,0,0,99,99,62,0,0,0,0,0,3,6,60,0,0,0,0,0,24,
                  24,0,0,0,0,0,0,24,24,48,0,0,0,0,0,24,12,6,0,0,0,0,0,126,0,0,0,0,0,0,0,24,48,96,0,0,0,0,0,0,12,12,0,0,0,0,0,110,96,62,0,0,
                  0,0,0,99,99,99,0,0,0,0,0,51,51,126,0,0,0,0,0,97,51,30,0,0,0,0,0,51,54,124,0,0,0,0,0,49,51,127,0,0,0,0,0,48,48,120,0,0,0,0,
                  0,99,51,29,0,0,0,0,0,99,99,99,0,0,0,0,0,24,24,60,0,0,0,0,0,102,102,60,0,0,0,0,0,54,51,115,0,0,0,0,0,49,51,127,0,0,0,0,0,195,
                  195,195,0,0,0,0,0,99,99,99,0,0,0,0,0,99,54,28,0,0,0,0,0,48,48,120,0,0,0,0,0,111,62,6,7,0,0,0,0,51,51,115,0,0,0,0,0,99,99,
                  62,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,60,24,0,0,0,0,0,255,102,102,0,0,0,0,0,102,195,195,0,0,0,0,0,24,24,
                  60,0,0,0,0,0,97,195,255,0,0,0,0,0,48,48,60,0,0,0,0,0,7,3,1,0,0,0,0,0,12,12,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,
                  0,0,0,0,0,0,0,0,102,102,59,0,0,0,0,0,51,51,110,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,48,48,
                  120,0,0,0,0,0,102,62,6,102,60,0,0,0,51,51,115,0,0,0,0,0,12,12,30,0,0,0,0,0,6,6,102,102,60,0,0,0,54,51,115,0,0,0,0,0,12,12,
                  30,0,0,0,0,0,219,219,219,0,0,0,0,0,51,51,51,0,0,0,0,0,99,99,62,0,0,0,0,0,51,62,48,48,120,0,0,0,102,62,6,6,15,0,0,0,48,48,
                  120,0,0,0,0,0,14,99,62,0,0,0,0,0,24,27,14,0,0,0,0,0,102,102,59,0,0,0,0,0,102,60,24,0,0,0,0,0,219,255,102,0,0,0,0,0,28,54,
                  99,0,0,0,0,0,99,63,3,6,60,0,0,0,24,51,127,0,0,0,0,0,24,24,14,0,0,0,0,0,24,24,24,0,0,0,0,0,24,24,112,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,99,127,0,0,0,0,0,0,51,30,6,3,62,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,
                  0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,0,60,12,6,60,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,24,
                  24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,127,99,99,0,0,0,0,0,127,99,99,0,0,0,0,0,48,51,127,0,0,0,0,0,216,220,
                  119,0,0,0,0,0,102,102,103,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,
                  59,0,0,0,0,0,99,63,3,6,60,0,0,0,99,54,28,0,0,0,0,0,99,99,62,0,0,0,0,0,126,24,24,0,0,0,0,0,48,115,126,0,0,0,0,0,255,24,24,
                  0,0,0,0,0,102,102,243,0,0,0,0,0,24,24,24,216,112,0,0,0,102,102,59,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,
                  59,0,0,0,0,0,51,51,51,0,0,0,0,0,103,99,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,62,0,0,0,0,0,96,96,0,0,0,0,0,0,
                  3,3,0,0,0,0,0,0,110,195,6,12,31,0,0,0,103,207,31,3,3,0,0,0,60,60,24,0,0,0,0,0,27,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,17,68,17,
                  68,17,68,0,0,85,170,85,170,85,170,0,0,221,119,221,119,221,119,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,24,24,24,24,
                  24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,54,
                  54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,
                  0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,
                  54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,
                  24,24,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,0,0,240,240,240,240,240,240,0,0,15,15,15,15,15,15,0,0,0,0,0,
                  0,0,0,0,0,108,110,59,0,0,0,0,0,99,126,96,96,32,0,0,0,96,96,96,0,0,0,0,0,54,54,54,0,0,0,0,0,48,99,127,0,0,0,0,0,108,108,56,
                  0,0,0,0,0,62,48,48,96,0,0,0,0,12,12,12,0,0,0,0,0,60,24,126,0,0,0,0,0,99,54,28,0,0,0,0,0,54,54,119,0,0,0,0,0,102,102,60,0,
                  0,0,0,0,126,0,0,0,0,0,0,0,126,96,192,0,0,0,0,0,96,48,28,0,0,0,0,0,99,99,99,0,0,0,0,0,0,127,0,0,0,0,0,0,24,0,255,0,0,0,0,0,
                  48,0,126,0,0,0,0,0,12,0,126,0,0,0,0,0,24,24,24,24,24,24,0,0,216,216,112,0,0,0,0,0,0,24,24,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,
                  124,254,124,56,16,0,56,124,56,254,254,214,16,56,16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,
                  255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,3,5,125,132,132,132,120,60,66,66,66,60,24,126,24,63,33,63,
                  32,32,96,224,192,63,33,63,33,35,103,230,192,24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,
                  0,24,60,126,24,24,126,60,24,36,36,36,36,36,0,36,0,127,146,146,114,18,18,18,0,62,99,56,68,68,56,204,120,0,0,0,0,126,126,126,
                  0,24,60,126,24,126,60,24,255,16,56,124,84,16,16,16,0,16,16,16,84,124,56,16,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
                  0,0,64,64,64,126,0,0,0,36,102,255,102,36,0,0,0,16,56,124,254,254,0,0,0,254,254,124,56,16,0,0,0,0,0,0,0,0,0,0,16,56,56,16,
                  16,0,16,0,36,36,36,0,0,0,0,0,36,36,126,36,126,36,36,0,24,62,64,60,2,124,24,0,0,98,100,8,16,38,70,0,48,72,48,86,136,136,118,
                  0,16,16,32,0,0,0,0,0,16,32,64,64,64,32,16,0,32,16,8,8,8,16,32,0,0,68,56,254,56,68,0,0,0,16,16,124,16,16,0,0,0,0,0,0,0,16,
                  16,32,0,0,0,126,0,0,0,0,0,0,0,0,0,16,16,0,0,2,4,8,16,32,64,0,60,66,70,74,82,98,60,0,16,48,80,16,16,16,124,0,60,66,2,12,48,
                  66,126,0,60,66,2,28,2,66,60,0,8,24,40,72,254,8,28,0,126,64,124,2,2,66,60,0,28,32,64,124,66,66,60,0,126,66,4,8,16,16,16,0,
                  60,66,66,60,66,66,60,0,60,66,66,62,2,4,56,0,0,16,16,0,0,16,16,0,0,16,16,0,0,16,16,32,8,16,32,64,32,16,8,0,0,0,126,0,0,126,
                  0,0,16,8,4,2,4,8,16,0,60,66,2,4,8,0,8,0,60,66,94,82,94,64,60,0,24,36,66,66,126,66,66,0,124,34,34,60,34,34,124,0,28,34,64,
                  64,64,34,28,0,120,36,34,34,34,36,120,0,126,34,40,56,40,34,126,0,126,34,40,56,40,32,112,0,28,34,64,64,78,34,30,0,66,66,66,
                  126,66,66,66,0,56,16,16,16,16,16,56,0,14,4,4,4,68,68,56,0,98,36,40,48,40,36,99,0,112,32,32,32,32,34,126,0,99,85,73,65,65,
                  65,65,0,98,82,74,70,66,66,66,0,24,36,66,66,66,36,24,0,124,34,34,60,32,32,112,0,60,66,66,66,74,60,3,0,124,34,34,60,40,36,114,
                  0,60,66,64,60,2,66,60,0,127,73,8,8,8,8,28,0,66,66,66,66,66,66,60,0,65,65,65,65,34,20,8,0,65,65,65,73,73,73,54,0,65,34,20,
                  8,20,34,65,0,65,34,20,8,8,8,28,0,127,66,4,8,16,33,127,0,120,64,64,64,64,64,120,0,128,64,32,16,8,4,2,0,120,8,8,8,8,8,120,0,
                  16,40,68,130,0,0,0,0,0,0,0,0,0,0,0,255,16,16,8,0,0,0,0,0,0,0,60,2,62,66,63,0,96,32,32,46,49,49,46,0,0,0,60,66,64,66,60,0,
                  6,2,2,58,70,70,59,0,0,0,60,66,126,64,60,0,12,18,16,56,16,16,56,0,0,0,61,66,66,62,2,124,96,32,44,50,34,34,98,0,16,0,48,16,
                  16,16,56,0,2,0,6,2,2,66,66,60,96,32,36,40,48,40,38,0,48,16,16,16,16,16,56,0,0,0,118,73,73,73,73,0,0,0,92,98,66,66,66,0,0,
                  0,60,66,66,66,60,0,0,0,108,50,50,44,32,112,0,0,54,76,76,52,4,14,0,0,108,50,34,32,112,0,0,0,62,64,60,2,124,0,16,16,124,16,
                  16,18,12,0,0,0,66,66,66,70,58,0,0,0,65,65,34,20,8,0,0,0,65,73,73,73,54,0,0,0,68,40,16,40,68,0,0,0,66,66,66,62,2,124,0,0,124,
                  8,16,32,124,0,12,16,16,96,16,16,12,0,16,16,16,0,16,16,16,0,48,8,8,6,8,8,48,0,50,76,0,0,0,0,0,0,0,8,20,34,65,65,127,0,60,66,
                  64,66,60,12,2,60,0,68,0,68,68,68,62,0,12,0,60,66,126,64,60,0,60,66,56,4,60,68,62,0,66,0,56,4,60,68,62,0,48,0,56,4,60,68,62,
                  0,16,0,56,4,60,68,62,0,0,0,60,64,64,60,6,28,60,66,60,66,126,64,60,0,66,0,60,66,126,64,60,0,48,0,60,66,126,64,60,0,36,0,24,
                  8,8,8,28,0,124,130,48,16,16,16,56,0,48,0,24,8,8,8,28,0,66,24,36,66,126,66,66,0,24,24,0,60,66,126,66,0,12,0,124,32,56,32,124,
                  0,0,0,51,12,63,68,59,0,31,36,68,127,68,68,71,0,24,36,0,60,66,66,60,0,0,66,0,60,66,66,60,0,32,16,0,60,66,66,60,0,24,36,0,66,
                  66,66,60,0,32,16,0,66,66,66,60,0,0,66,0,66,66,62,2,60,66,24,36,66,66,36,24,0,66,0,66,66,66,66,60,0,8,8,62,64,64,62,8,8,24,
                  36,32,112,32,66,124,0,68,40,124,16,124,16,16,0,248,76,120,68,79,68,69,230,28,18,16,124,16,16,144,96,12,0,56,4,60,68,62,0,
                  12,0,24,8,8,8,28,0,4,8,0,60,66,66,60,0,0,4,8,66,66,66,60,0,50,76,0,124,66,66,66,0,52,76,0,98,82,74,70,0,60,68,68,62,0,126,
                  0,0,56,68,68,56,0,124,0,0,16,0,16,32,64,66,60,0,0,0,0,126,64,64,0,0,0,0,0,126,2,2,0,0,66,196,72,246,41,67,140,31,66,196,74,
                  246,42,95,130,2,0,16,0,16,16,16,16,0,0,18,36,72,36,18,0,0,0,72,36,18,36,72,0,0,34,136,34,136,34,136,34,136,85,170,85,170,
                  85,170,85,170,219,119,219,238,219,119,219,238,16,16,16,16,16,16,16,16,16,16,16,16,240,16,16,16,16,16,240,16,240,16,16,16,
                  20,20,20,20,244,20,20,20,0,0,0,0,252,20,20,20,0,0,240,16,240,16,16,16,20,20,244,4,244,20,20,20,20,20,20,20,20,20,20,20,0,
                  0,252,4,244,20,20,20,20,20,244,4,252,0,0,0,20,20,20,20,252,0,0,0,16,16,240,16,240,0,0,0,0,0,0,0,240,16,16,16,16,16,16,16,
                  31,0,0,0,16,16,16,16,255,0,0,0,0,0,0,0,255,16,16,16,16,16,16,16,31,16,16,16,0,0,0,0,255,0,0,0,16,16,16,16,255,16,16,16,16,
                  16,31,16,31,16,16,16,20,20,20,20,23,20,20,20,20,20,23,16,31,0,0,0,0,0,31,16,23,20,20,20,20,20,247,0,255,0,0,0,0,0,255,0,247,
                  20,20,20,20,20,23,16,23,20,20,20,0,0,255,0,255,0,0,0,20,20,247,0,247,20,20,20,16,16,255,0,255,0,0,0,20,20,20,20,255,0,0,0,
                  0,0,255,0,255,16,16,16,0,0,0,0,255,20,20,20,20,20,20,20,31,0,0,0,16,16,31,16,31,0,0,0,0,0,31,16,31,16,16,16,0,0,0,0,31,20,
                  20,20,20,20,20,20,255,20,20,20,16,16,255,16,255,16,16,16,16,16,16,16,240,0,0,0,0,0,0,0,31,16,16,16,255,255,255,255,255,255,
                  255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,0,49,74,
                  68,74,49,0,0,60,66,124,66,124,64,64,0,126,66,64,64,64,64,0,0,63,84,20,20,20,20,0,126,66,32,24,32,66,126,0,0,0,62,72,72,72,
                  48,0,0,68,68,68,122,64,64,128,0,51,76,8,8,8,8,0,124,16,56,68,68,56,16,124,24,36,66,126,66,36,24,0,24,36,66,66,36,36,102,0,
                  28,32,24,60,66,66,60,0,0,98,149,137,149,98,0,0,2,4,60,74,82,60,64,128,12,16,32,60,32,16,12,0,60,66,66,66,66,66,66,0,0,126,
                  0,126,0,126,0,0,16,16,124,16,16,0,124,0,16,8,4,8,16,0,126,0,8,16,32,16,8,0,126,0,12,18,18,16,16,16,16,16,16,16,16,16,16,144,
                  144,96,24,24,0,126,0,24,24,0,0,50,76,0,50,76,0,0,48,72,72,48,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,8,8,8,8,200,40,
                  24,120,68,68,68,68,0,0,0,48,72,16,32,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,
                  129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,214,16,56,
                  16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
                  153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,
                  24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,
                  102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,
                  126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,
                  102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,
                  108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,
                  0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,
                  0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,
                  12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,
                  120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,
                  48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,
                  120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,
                  0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
                  48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,
                  198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
                  252,102,102,124,108,102,230,0,120,204,96,48,24,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,
                  204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,
                  50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,
                  255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,
                  118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,
                  48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
                  0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,
                  96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,
                  254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,
                  24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204,
                  0,204,204,204,126,0,28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,
                  0,48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204,
                  252,192,120,0,204,0,112,48,48,48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48,
                  48,0,120,204,252,204,0,28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204,
                  120,0,0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204,
                  204,124,12,248,195,24,60,102,102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252,
                  0,204,204,120,252,48,252,48,48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112,
                  48,48,48,120,0,0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60,
                  108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204,
                  222,51,102,204,15,195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34,
                  136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24,
                  248,24,24,24,24,24,248,24,248,24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6,
                  246,54,54,54,54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248,
                  0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0,
                  0,255,0,0,0,24,24,24,24,255,24,24,24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,
                  54,54,54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24,
                  24,255,0,255,0,0,0,54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31,
                  0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
                  0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,
                  15,15,15,255,255,255,255,0,0,0,0,0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254,
                  108,108,108,108,108,0,252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24,
                  24,0,252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0,
                  0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252,
                  0,0,48,48,252,48,48,0,252,0,96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,
                  112,48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236,
                  108,60,28,120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0] 
                  
                • ibm-cga.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoCGA" screenwidth="960" screenheight="480" scale="true" charset="/devices/pc/video/ibm/cga/ibm-cga.json" pos="center" padding="8px">
                  	<menu>
                  		<title>Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
              • ega
                • README.md
                  IBM EGA ROM
                  ---
                  
                  To (re)build the JSON-encoded IBM EGA ROM with symbols, run the following command:
                  
                  	filedump --file=static/ibm-ega.rom --format=bytes --decimal
                  	
                  The symbol information in the MAP file will be automatically converted and appended to the dump of the ROM file. 
                  
                  The PCjs server's [Dump API](http://www.pcjs.org/api/v1/dump?file=http://static.pcjs.org/devices/pc/video/ibm/ega/ibm-ega.rom&format=bytes&decimal=true) can be used as well:
                  
                  	http://www.pcjs.org/api/v1/dump?file=http://static.pcjs.org/devices/pc/video/ibm/ega/ibm-ega.rom&format=bytes&decimal=true
                  
                • ibm-ega-128kb-lock.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" autolock="true" pos="center" padding="8px">
                  	<menu>
                  		<title>Enhanced Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  			<control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-ega-640-128kb-lock.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" width="640px" autolock="true" pos="center" padding="8px">
                  	<menu>
                  		<title>Enhanced Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  			<control type="button" binding="lockPointer" padleft="8px">Lock Pointer</control>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-ega-64kb.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoEGA" model="ega" memory="0x10000" screenwidth="640" screenheight="350" pos="center" padding="8px">
                  	<menu>
                  		<title>Enhanced Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-ega.json
                  {"bytes":[
                  85,170,32,235,40,50,52,48,48,54,50,55,55,51,53,54,
                  32,40,67,41,67,79,80,89,82,73,71,72,84,32,73,66,
                  77,32,49,57,56,52,57,47,49,51,47,56,52,182,3,178,
                  218,236,178,186,236,178,192,176,0,238,43,210,142,218,250,199,
                  6,64,0,215,12,140,14,66,0,199,6,8,1,101,240,199,
                  6,10,1,0,240,199,6,168,4,12,1,140,14,170,4,199,
                  6,124,0,96,53,140,14,126,0,199,6,12,1,96,49,140,
                  14,14,1,251,198,6,135,4,4,232,31,0,136,30,136,4,
                  232,75,0,8,6,136,4,138,30,136,4,232,101,0,233,179,
                  1,203,238,80,88,236,36,16,208,232,195,182,3,178,194,176,
                  1,238,176,13,232,235,255,208,232,208,232,208,232,138,216,176,
                  9,232,222,255,208,232,208,232,10,216,176,5,232,211,255,208,
                  232,10,216,176,1,232,202,255,10,216,128,227,15,195,182,3,
                  178,186,176,1,238,178,218,238,178,194,236,36,96,208,232,138,
                  216,178,186,176,2,238,178,218,238,178,194,236,36,96,208,224,
                  10,195,195,42,255,128,227,15,209,227,82,182,3,138,230,90,
                  128,228,1,254,196,246,212,46,255,167,40,1,23,7,0,192,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,115,1,126,1,126,1,137,1,
                  148,1,168,1,188,1,199,1,199,1,210,1,221,1,241,1,
                  4,2,4,2,4,2,4,2,128,38,16,4,207,128,14,16,
                  4,16,184,1,0,205,16,195,128,38,16,4,207,128,14,16,
                  4,32,184,3,0,205,16,195,128,14,16,4,48,184,7,0,
                  205,16,195,32,38,135,4,232,206,255,232,235,255,195,32,38,
                  135,4,232,211,255,232,224,255,195,32,38,135,4,232,200,255,
                  232,213,255,195,182,3,178,194,176,0,238,246,212,8,38,135,
                  4,232,196,255,232,161,255,195,182,3,178,194,176,0,238,246,
                  212,8,38,135,4,232,176,255,232,157,255,195,32,38,135,4,
                  232,165,255,232,130,255,195,32,38,135,4,232,154,255,232,135,
                  255,195,32,38,135,4,232,143,255,232,124,255,195,182,3,178,
                  194,176,0,238,246,212,8,38,135,4,232,91,255,232,120,255,
                  195,182,3,178,194,176,0,238,246,212,8,38,135,4,232,87,
                  255,232,100,255,195,83,187,127,0,139,251,80,232,29,0,139,
                  240,88,80,232,32,0,88,80,232,17,0,59,199,88,117,3,
                  235,5,144,51,192,91,195,184,1,0,91,195,82,139,208,176,
                  14,238,66,236,90,195,80,82,139,208,180,14,176,127,232,212,
                  10,90,88,195,232,183,10,246,6,135,4,2,117,18,184,180,
                  3,232,177,255,61,1,0,116,3,233,187,0,180,48,235,16,
                  184,212,3,232,159,255,61,1,0,116,3,233,169,0,180,32,
                  80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,
                  8,183,184,178,216,181,64,254,200,238,139,46,114,4,129,253,
                  52,18,142,195,116,7,142,219,232,68,0,117,46,88,80,184,
                  32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,
                  3,116,2,178,218,180,8,43,201,236,34,196,117,4,226,249,
                  235,9,43,201,236,34,196,116,10,226,249,186,2,1,232,247,
                  3,235,6,177,3,210,236,117,222,88,235,59,185,0,64,252,
                  139,217,184,170,170,186,85,255,43,255,243,170,79,253,139,247,
                  139,203,172,50,196,117,30,138,194,170,226,246,34,228,116,19,
                  138,224,134,242,34,228,117,4,138,212,235,224,252,71,116,222,
                  79,235,217,176,0,252,195,131,236,10,139,236,232,223,9,176,
                  48,230,67,176,0,230,64,246,6,135,4,2,116,31,232,55,
                  254,199,70,2,94,1,199,70,4,153,141,199,70,6,98,184,
                  178,180,180,1,176,39,232,204,9,178,186,235,42,232,248,253,
                  232,71,11,115,17,178,212,180,1,176,20,232,183,9,199,70,
                  2,94,1,235,6,144,199,70,2,200,0,199,70,4,172,160,
                  199,70,6,96,196,178,218,184,0,5,205,16,43,201,236,168,
                  8,117,7,226,249,179,0,233,190,0,176,0,230,64,43,219,
                  51,201,236,168,8,116,7,226,249,179,1,233,170,0,43,201,
                  236,168,1,116,21,168,8,117,35,226,245,179,2,233,152,0,
                  179,3,233,147,0,179,4,233,142,0,168,8,117,242,236,168,
                  1,225,251,227,240,67,116,4,168,8,116,210,176,0,230,67,
                  59,94,2,116,4,179,5,235,111,228,64,138,224,144,228,64,
                  134,224,144,144,59,70,4,125,4,179,6,235,91,59,70,6,
                  126,4,179,7,235,82,184,219,9,187,15,0,185,80,0,205,
                  16,236,82,178,192,180,15,176,63,232,9,9,184,15,0,90,
                  80,82,178,192,180,50,232,252,8,90,88,43,201,236,168,48,
                  117,9,226,249,179,16,10,220,235,30,144,43,201,236,168,48,
                  116,8,226,249,179,32,10,220,235,14,254,196,128,252,48,116,
                  37,128,204,15,138,196,235,200,185,6,0,186,3,1,232,119,
                  2,131,196,10,176,54,230,67,42,192,230,64,144,144,230,64,
                  189,1,0,233,43,252,232,149,8,184,0,5,205,16,176,54,
                  230,67,42,192,230,64,144,144,230,64,131,196,10,189,0,0,
                  30,232,122,8,246,6,135,4,2,116,18,128,14,16,4,48,
                  184,15,0,128,14,135,4,96,184,15,0,235,13,128,38,16,
                  4,207,128,14,16,4,32,184,14,0,205,16,131,236,6,139,
                  236,184,0,160,142,216,142,192,199,70,2,0,0,199,70,4,
                  0,0,182,3,178,196,184,1,2,232,73,8,178,206,184,0,
                  4,232,65,8,82,178,218,236,178,192,184,0,50,232,53,8,
                  232,172,1,128,252,0,116,3,233,226,0,232,235,0,128,252,
                  0,116,3,233,215,0,90,178,196,184,2,2,232,22,8,178,
                  206,184,1,4,232,14,8,82,178,218,236,178,192,184,0,50,
                  232,2,8,199,70,4,0,0,232,116,1,128,252,0,116,3,
                  233,170,0,232,179,0,128,252,0,116,3,233,159,0,90,178,
                  196,184,4,2,232,222,7,82,178,206,184,2,4,232,213,7,
                  178,218,236,178,192,184,0,50,232,202,7,199,70,4,0,0,
                  232,60,1,128,252,0,116,3,235,115,144,232,123,0,128,252,
                  0,116,3,235,104,144,90,178,196,184,8,2,232,166,7,178,
                  206,184,3,4,232,158,7,82,178,218,236,178,192,184,0,50,
                  232,146,7,199,70,4,0,0,232,4,1,128,252,0,117,61,
                  232,70,0,128,252,0,117,53,85,189,0,0,94,90,232,93,
                  7,54,139,92,2,177,6,211,235,75,177,5,211,227,128,227,
                  96,128,38,135,4,159,8,30,135,4,128,14,135,4,4,138,
                  30,136,4,232,45,251,131,196,6,31,233,196,250,186,3,1,
                  232,245,0,85,189,1,0,235,195,187,0,160,142,219,142,195,
                  139,70,4,138,232,42,201,209,225,232,15,0,128,252,0,117,
                  9,139,70,4,1,70,2,184,0,0,195,85,252,43,255,43,
                  192,232,250,6,139,30,114,4,129,251,52,18,140,194,142,218,
                  116,98,129,251,33,67,116,92,136,5,138,5,50,196,117,64,
                  254,196,138,196,117,242,139,233,184,85,170,139,216,186,170,85,
                  243,171,79,79,253,139,247,139,205,173,51,195,117,34,139,194,
                  171,226,246,139,205,252,70,70,139,254,173,51,194,117,17,171,
                  226,248,253,78,78,139,205,173,11,192,117,4,226,249,235,17,
                  139,200,50,228,10,237,116,2,180,1,10,201,116,3,128,196,
                  2,93,252,195,80,82,182,3,178,196,184,15,2,232,149,6,
                  90,88,243,171,232,119,6,137,30,114,4,142,218,235,226,140,
                  218,43,219,142,194,43,255,184,85,170,139,200,38,137,5,176,
                  15,38,139,5,51,193,117,20,185,0,32,243,171,129,194,0,
                  4,131,195,16,128,254,176,117,218,235,1,144,128,254,160,116,
                  6,1,94,4,184,0,0,195,156,250,30,232,48,6,10,246,
                  116,11,179,6,232,73,6,226,254,254,206,117,245,179,1,232,
                  62,6,226,254,254,202,117,245,226,254,226,254,31,157,195,179,
                  14,239,16,87,17,134,17,157,17,164,18,14,21,176,21,210,
                  23,153,24,221,24,117,26,203,27,159,28,1,29,133,29,197,
                  29,152,31,191,32,24,33,40,24,8,0,8,11,3,0,3,
                  35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,40,24,8,0,8,11,3,0,3,
                  35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
                  35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
                  35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,40,24,8,0,64,11,3,0,2,
                  35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
                  0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
                  6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
                  0,0,0,48,15,0,255,40,24,8,0,64,11,3,0,2,
                  35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
                  0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
                  6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
                  0,0,0,48,15,0,255,80,24,8,0,64,1,1,0,6,
                  35,112,79,89,45,94,6,4,17,0,1,0,0,0,0,0,
                  0,224,35,199,40,0,223,239,194,255,0,23,23,23,23,23,
                  23,23,23,23,23,23,23,23,23,23,1,0,1,0,0,0,
                  0,0,0,0,13,0,255,80,24,14,0,16,0,3,0,3,
                  166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
                  0,94,46,93,40,13,94,110,163,255,0,8,8,8,8,8,
                  8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,
                  0,0,0,16,10,0,255,40,24,8,0,64,0,0,0,3,
                  35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
                  35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
                  35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,80,24,8,0,16,1,4,0,7,
                  35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
                  0,225,36,199,40,8,224,240,163,255,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,
                  0,0,0,0,4,0,255,80,24,14,0,16,0,4,0,7,
                  166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
                  0,94,46,93,40,13,94,110,163,255,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,14,0,15,8,0,0,
                  0,0,0,0,4,0,255,40,24,8,0,32,11,15,0,6,
                  35,55,39,45,55,48,20,4,17,0,0,0,0,0,0,0,
                  0,225,36,199,20,0,224,240,227,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
                  0,0,0,0,5,15,255,80,24,8,0,64,1,15,0,6,
                  35,112,79,89,45,94,6,4,17,0,0,0,0,0,0,0,
                  0,224,35,199,40,0,223,239,227,255,0,1,2,3,4,5,
                  6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
                  0,0,0,0,5,15,255,80,24,14,0,128,5,15,0,0,
                  162,96,79,86,26,80,224,112,31,0,0,0,0,0,0,0,
                  0,94,46,93,20,13,94,110,139,255,0,8,0,0,24,24,
                  0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
                  0,0,0,16,7,15,255,80,24,14,0,128,5,15,0,0,
                  167,91,79,83,23,80,186,108,31,0,0,0,0,0,0,0,
                  0,94,43,93,20,15,95,10,139,255,0,1,0,0,4,7,
                  0,0,0,1,0,0,4,7,0,0,1,0,5,0,0,0,
                  0,0,0,16,7,15,255,80,24,14,0,128,1,15,0,6,
                  162,96,79,86,58,80,96,112,31,0,0,0,0,0,0,0,
                  0,94,46,93,40,13,94,110,227,255,0,8,0,0,24,24,
                  0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
                  0,0,0,0,5,15,255,80,24,14,0,128,1,15,0,6,
                  167,91,79,83,55,82,0,108,31,0,0,0,0,0,0,0,
                  0,94,43,93,40,15,95,10,227,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,
                  0,0,0,0,5,15,255,40,24,14,0,8,11,3,0,3,
                  167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
                  0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,40,24,14,0,8,11,3,0,3,
                  167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
                  0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
                  167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
                  0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
                  167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
                  0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
                  0,0,0,16,14,0,255,251,252,85,6,30,82,81,83,86,
                  87,80,138,196,50,228,209,224,139,240,61,40,0,114,6,88,
                  205,66,233,169,20,232,6,0,88,46,255,164,239,6,80,43,
                  192,142,216,88,195,30,232,245,255,139,22,99,4,128,226,240,
                  128,202,10,31,195,134,196,238,66,134,196,238,74,195,238,195,
                  82,186,67,0,176,182,232,245,255,184,51,5,74,232,238,255,
                  138,196,232,233,255,186,97,0,236,138,224,12,3,232,222,255,
                  43,201,226,254,254,203,117,250,138,196,232,209,255,90,195,232,
                  172,255,196,30,168,4,38,196,31,195,81,82,232,240,255,138,
                  38,73,4,246,6,135,4,96,116,24,128,252,15,117,7,129,
                  195,64,4,235,51,144,128,252,16,117,7,129,195,128,4,235,
                  39,144,128,252,3,119,20,160,136,4,36,15,60,3,116,7,
                  60,9,116,3,235,5,144,129,195,192,4,138,14,73,4,42,
                  237,227,5,131,195,64,226,251,90,89,195,232,172,255,131,195,
                  5,182,3,178,196,184,1,0,250,232,89,255,38,138,7,254,
                  196,232,81,255,254,196,67,38,138,7,232,72,255,128,252,5,
                  114,242,38,138,7,67,178,194,238,178,196,184,3,0,232,52,
                  255,251,139,22,99,4,42,228,38,138,7,232,39,255,67,254,
                  196,128,252,25,114,242,38,139,71,241,134,224,163,96,4,139,
                  243,232,1,255,236,178,192,42,228,38,138,7,134,224,238,134,
                  224,238,67,254,196,128,252,20,114,239,176,0,238,30,6,196,
                  62,168,4,38,196,125,4,140,192,11,199,116,9,31,30,185,
                  16,0,243,164,70,164,7,31,178,204,176,0,238,178,202,176,
                  1,238,178,206,42,228,38,138,7,232,201,254,67,254,196,128,
                  252,9,114,242,195,160,135,4,168,128,117,57,186,0,184,160,
                  73,4,60,6,118,10,186,0,176,60,7,116,3,186,0,160,
                  187,32,7,60,4,114,6,60,7,116,2,43,219,142,194,139,
                  14,76,4,227,16,185,0,128,128,254,160,116,2,181,64,139,
                  195,43,255,243,171,195,232,30,15,195,80,30,232,95,254,160,
                  136,4,31,36,15,60,3,116,7,60,9,116,3,88,248,195,
                  88,249,195,250,199,6,12,1,96,49,140,14,14,1,251,128,
                  38,135,4,243,80,246,6,135,4,2,116,44,161,16,4,36,
                  48,60,48,116,72,198,6,132,4,24,199,6,133,4,8,0,
                  88,128,14,135,4,8,60,1,118,9,60,4,115,5,128,14,
                  135,4,4,205,66,233,166,18,161,16,4,36,48,60,48,117,
                  64,198,6,132,4,24,199,6,133,4,14,0,88,205,66,199,
                  6,96,4,12,11,128,14,135,4,8,233,129,18,88,80,182,
                  3,36,128,128,38,135,4,127,8,6,135,4,88,36,127,60,
                  15,116,2,176,7,162,73,4,178,180,137,22,99,4,235,28,
                  144,88,80,182,3,36,128,128,38,135,4,127,8,6,135,4,
                  88,36,127,162,73,4,178,212,137,22,99,4,199,6,78,4,
                  0,0,198,6,98,4,0,185,8,0,191,80,4,30,7,43,
                  192,243,171,232,228,253,38,138,7,42,228,163,74,4,38,138,
                  71,1,162,132,4,38,138,71,2,42,228,163,133,4,38,139,
                  71,3,163,76,4,43,219,176,1,138,38,73,4,128,252,7,
                  116,12,128,252,3,119,53,232,240,254,114,2,176,2,232,253,
                  14,232,74,253,138,38,73,4,128,252,7,116,3,235,29,144,
                  189,48,48,187,0,14,14,7,38,139,86,0,11,210,116,12,
                  185,1,0,69,232,31,15,131,197,14,235,234,232,204,253,232,
                  115,254,232,177,254,232,22,253,128,62,73,4,15,114,6,199,
                  6,12,1,48,34,128,62,73,4,7,119,9,116,75,128,62,
                  73,4,3,118,68,196,30,168,4,131,195,12,38,196,31,140,
                  192,11,195,116,50,190,7,0,38,138,0,60,255,116,122,58,
                  6,73,4,116,3,70,235,240,250,38,138,7,254,200,162,132,
                  4,38,139,71,1,163,133,4,38,139,71,3,163,12,1,38,
                  139,71,5,163,14,1,251,235,80,196,30,168,4,131,195,8,
                  38,196,31,140,192,11,195,116,64,190,11,0,38,138,0,60,
                  255,116,54,58,6,73,4,116,3,70,235,240,38,138,39,38,
                  138,71,1,38,139,79,2,38,139,87,4,38,139,111,6,38,
                  142,71,8,83,139,216,184,16,17,205,16,91,38,138,71,10,
                  60,255,116,5,254,200,162,132,4,232,98,252,128,62,73,4,
                  7,119,30,187,200,16,160,73,4,42,228,3,216,46,138,7,
                  162,101,4,176,48,128,62,73,4,6,117,2,176,63,162,102,
                  4,139,14,96,4,235,40,144,44,40,45,41,42,46,30,41,
                  128,253,0,117,4,254,193,235,10,254,193,58,14,133,4,114,
                  2,42,201,81,42,205,128,249,16,89,117,2,254,193,195,180,
                  10,137,14,96,4,246,6,135,4,8,117,51,138,197,36,96,
                  60,32,117,5,185,0,30,235,38,246,6,135,4,1,117,31,
                  128,62,73,4,3,119,21,232,128,253,115,16,128,253,4,118,
                  3,128,197,5,128,249,4,118,3,128,193,5,232,161,255,232,
                  3,0,233,105,16,139,22,99,4,138,197,232,215,251,254,196,
                  138,193,232,208,251,195,83,139,216,138,196,246,38,74,4,50,
                  255,3,195,209,224,91,195,232,3,0,233,65,16,138,207,50,
                  237,209,225,139,241,137,148,80,4,56,62,98,4,117,5,139,
                  194,232,1,0,195,232,206,255,139,200,3,14,78,4,209,249,
                  180,14,232,176,255,195,138,223,50,255,209,227,139,151,80,4,
                  139,14,96,4,95,94,91,88,88,31,7,93,207,160,73,4,
                  60,7,119,55,246,6,135,4,2,116,7,60,7,116,44,235,
                  5,144,60,6,118,37,205,66,95,94,131,196,6,31,7,93,
                  207,6,6,7,7,5,5,4,5,0,0,0,0,0,5,6,
                  4,4,4,4,6,6,4,7,4,7,4,139,22,99,4,131,
                  194,6,236,168,4,180,0,116,3,233,165,0,168,2,117,3,
                  233,168,0,180,16,139,22,99,4,138,196,238,66,80,236,138,
                  232,88,74,254,196,138,196,238,66,236,138,229,138,30,73,4,
                  42,255,46,138,159,193,17,43,195,139,30,78,4,209,235,43,
                  195,121,2,43,192,177,3,128,62,73,4,4,114,77,128,62,
                  73,4,7,116,70,128,62,73,4,6,119,40,117,2,209,232,
                  178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,4,
                  6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,
                  238,235,44,144,153,247,54,74,4,139,218,211,227,139,200,82,
                  153,247,54,133,4,90,138,240,235,21,144,246,54,74,4,138,
                  240,138,212,138,220,50,255,211,227,246,38,133,4,139,200,180,
                  1,82,139,22,99,4,131,194,7,238,90,95,94,131,196,6,
                  31,7,93,207,162,98,4,139,14,76,4,152,80,247,225,163,
                  78,4,139,200,138,30,73,4,128,251,7,119,2,209,249,180,
                  12,232,113,254,91,209,227,139,135,80,4,232,167,254,233,205,
                  14,80,138,230,42,229,254,196,58,224,88,117,2,42,192,195,
                  83,30,232,25,250,139,30,74,4,31,81,138,202,42,237,86,
                  87,243,164,95,94,3,243,3,251,89,226,238,91,195,83,30,
                  232,251,249,139,30,74,4,31,81,138,202,42,237,86,87,243,
                  164,95,94,43,243,43,251,89,226,238,91,195,82,182,3,178,
                  196,184,15,2,232,238,249,90,43,192,138,202,42,237,87,243,
                  170,95,138,198,82,182,3,178,196,180,2,232,215,249,90,176,
                  255,138,202,87,243,170,95,195,182,3,178,196,184,15,2,232,
                  195,249,195,30,232,167,249,138,247,42,255,80,82,139,195,247,
                  38,133,4,139,216,90,88,31,232,177,255,30,232,143,249,3,
                  62,74,4,31,75,117,241,232,206,255,195,30,232,127,249,138,
                  247,42,255,80,82,139,195,247,38,133,4,139,216,90,88,31,
                  232,137,255,30,232,103,249,43,62,74,4,31,75,117,241,232,
                  166,255,195,138,216,232,67,3,128,252,4,114,8,128,252,7,
                  116,3,233,191,0,83,139,193,232,55,0,116,49,3,240,138,
                  230,42,227,232,108,0,3,245,3,253,254,204,117,245,88,176,
                  32,232,103,0,3,253,254,203,117,247,232,33,249,128,62,73,
                  4,7,116,7,160,101,4,186,216,3,238,233,176,13,138,222,
                  235,220,246,6,135,4,4,116,18,82,182,3,178,218,80,236,
                  168,8,116,251,176,37,178,216,238,88,90,232,56,253,3,6,
                  78,4,139,248,139,240,43,209,254,198,254,194,50,237,139,46,
                  74,4,3,237,138,195,246,38,74,4,3,192,6,31,128,251,
                  0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,
                  95,195,253,138,216,232,163,2,83,139,194,232,164,255,116,32,
                  43,240,138,230,42,227,232,217,255,43,245,43,253,254,204,117,
                  245,88,176,32,232,212,255,43,253,254,203,117,247,233,106,255,
                  138,222,235,237,138,216,139,193,232,44,2,139,248,43,209,129,
                  194,1,1,208,230,208,230,128,62,73,4,6,115,4,208,226,
                  209,231,6,31,42,237,208,227,208,227,116,45,138,195,180,80,
                  246,228,139,247,3,240,138,230,42,227,232,32,0,129,238,176,
                  31,129,239,176,31,254,204,117,241,138,199,232,40,0,129,239,
                  176,31,254,203,117,245,233,213,12,138,222,235,236,138,202,86,
                  87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,
                  202,243,164,95,94,195,138,202,87,243,170,95,129,199,0,32,
                  87,138,202,243,170,95,195,80,30,232,2,248,138,38,135,4,
                  128,228,96,31,88,116,2,249,195,248,195,233,149,254,232,192,
                  253,138,38,73,4,128,252,7,118,241,128,252,13,115,23,233,
                  124,12,186,0,160,189,17,5,128,252,15,114,8,232,199,255,
                  115,3,189,1,5,195,82,232,232,255,142,194,90,138,216,139,
                  193,83,138,62,98,4,232,125,1,91,139,248,43,209,129,194,
                  1,1,42,228,138,195,82,247,38,133,4,247,38,74,4,139,
                  247,3,240,6,31,90,10,219,116,63,138,206,42,203,42,237,
                  30,232,138,247,80,82,139,193,247,38,133,4,139,200,90,88,
                  31,82,139,197,182,3,178,206,232,138,247,178,196,184,15,2,
                  232,130,247,90,232,73,253,82,77,139,197,182,3,178,206,232,
                  115,247,90,232,173,253,233,245,11,138,222,235,246,233,146,254,
                  232,30,253,138,38,73,4,128,252,3,118,241,128,252,7,116,
                  236,128,252,13,115,12,128,252,6,119,4,180,7,205,66,233,
                  204,11,253,138,216,82,232,73,255,142,194,90,139,194,254,196,
                  83,138,62,98,4,232,222,0,91,43,6,74,4,139,248,43,
                  209,129,194,1,1,42,228,138,195,82,247,38,133,4,247,38,
                  74,4,139,247,43,240,6,31,90,10,219,116,64,138,206,42,
                  203,42,237,30,232,231,246,80,82,139,193,247,38,133,4,139,
                  200,90,88,31,82,139,197,182,3,178,206,232,231,246,178,196,
                  184,15,2,232,223,246,90,232,196,252,82,77,139,197,182,3,
                  178,206,232,208,246,90,232,50,253,252,233,81,11,138,222,235,
                  245,138,207,50,237,139,241,209,230,139,132,80,4,51,219,227,
                  6,3,30,76,4,226,250,232,220,250,3,216,195,128,227,3,
                  138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,
                  89,195,82,81,83,43,210,185,1,0,139,216,35,217,11,211,
                  209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,
                  91,89,90,195,161,80,4,83,139,216,138,196,246,38,74,4,
                  209,224,209,224,42,255,3,195,91,195,83,138,223,42,255,209,
                  227,139,135,80,4,91,83,81,82,42,237,138,207,139,216,138,
                  196,246,38,74,4,247,38,133,4,42,255,3,195,139,30,76,
                  4,227,4,3,195,226,252,90,89,91,195,190,0,184,139,62,
                  16,4,129,231,48,0,131,255,48,117,3,190,0,176,142,198,
                  195,232,231,255,232,74,255,139,243,139,22,99,4,131,194,6,
                  246,6,135,4,4,6,31,116,11,236,168,1,117,251,250,236,
                  168,1,116,251,173,233,118,10,138,36,138,68,1,185,0,192,
                  178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,
                  136,86,0,69,195,232,163,255,232,89,255,139,240,131,236,8,
                  139,236,128,62,73,4,6,6,31,114,26,182,4,138,4,136,
                  70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,
                  117,235,235,23,144,209,230,182,4,232,172,255,129,198,0,32,
                  232,165,255,129,238,176,31,254,206,117,238,30,232,111,245,196,
                  62,12,1,31,131,237,8,139,245,252,176,0,22,31,186,128,
                  0,86,87,185,8,0,243,166,95,94,116,29,254,192,131,199,
                  8,74,117,237,60,0,116,17,232,67,245,196,62,124,0,140,
                  192,11,199,116,4,176,128,235,211,131,196,8,233,207,9,233,
                  47,255,138,38,73,4,128,252,7,116,244,128,252,3,118,239,
                  128,252,6,119,3,233,93,255,128,252,15,114,82,232,7,253,
                  114,77,235,10,128,252,13,115,70,176,0,233,160,9,186,0,
                  160,142,194,232,180,254,139,240,139,30,133,4,43,227,139,236,
                  83,36,1,138,200,176,5,210,224,180,7,182,3,178,206,232,
                  243,244,184,24,5,232,237,244,38,138,4,246,208,136,70,0,
                  69,3,54,74,4,75,117,240,91,184,16,5,235,50,144,186,
                  0,160,142,194,232,115,254,139,240,139,30,133,4,43,227,139,
                  236,182,3,178,206,184,8,5,232,186,244,83,38,138,4,246,
                  208,136,70,0,69,3,54,74,4,75,117,240,91,184,0,5,
                  232,162,244,196,62,12,1,43,235,139,245,252,176,0,22,31,
                  186,0,1,86,87,139,203,243,166,95,94,116,7,254,192,3,
                  251,74,117,239,3,227,233,5,9,232,98,244,138,38,73,4,
                  128,252,4,114,8,128,252,7,116,3,235,116,144,232,59,254,
                  138,227,80,81,232,154,253,139,251,89,91,139,22,99,4,131,
                  194,6,246,6,135,4,4,116,11,236,168,1,117,251,250,236,
                  168,1,116,251,139,195,171,251,226,232,233,193,8,232,30,244,
                  138,38,73,4,128,252,4,114,8,128,252,7,116,3,235,48,
                  144,232,247,253,80,81,232,88,253,139,251,89,91,139,22,99,
                  4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,251,
                  250,236,168,1,116,251,138,195,170,251,71,226,231,233,126,8,
                  128,252,7,114,3,233,175,0,232,192,253,180,0,80,232,115,
                  253,139,248,88,60,128,115,6,197,54,12,1,235,6,44,128,
                  197,54,124,0,209,224,209,224,209,224,3,240,30,232,174,243,
                  128,62,73,4,6,31,114,44,87,86,182,4,172,246,195,128,
                  117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,
                  94,95,71,226,227,233,38,8,38,50,5,170,172,38,50,133,
                  255,31,235,224,138,211,209,231,232,226,252,87,86,182,4,172,
                  232,239,252,35,195,246,194,128,116,7,38,50,37,38,50,69,
                  1,38,136,37,38,136,69,1,172,232,214,252,35,195,246,194,
                  128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,
                  0,32,38,136,133,1,32,131,199,80,254,206,117,193,94,95,
                  71,71,226,183,233,199,7,128,252,15,114,14,232,24,251,114,
                  9,128,227,133,138,227,208,228,10,220,42,228,247,38,133,4,
                  80,232,198,252,139,248,139,46,133,4,186,0,160,142,194,197,
                  54,12,1,88,3,240,182,3,246,195,128,116,11,178,206,184,
                  24,3,232,0,243,235,30,144,87,178,196,184,15,2,232,244,
                  242,43,192,81,139,205,30,232,212,242,170,3,62,74,4,79,
                  226,248,31,89,95,178,196,180,2,138,195,232,215,242,87,83,
                  81,139,221,30,232,183,242,139,14,74,4,31,138,4,38,138,
                  37,38,136,5,70,3,249,75,117,242,89,91,43,245,95,71,
                  226,166,178,206,184,0,3,232,171,242,178,196,184,15,2,232,
                  163,242,233,41,7,128,62,99,4,180,116,9,246,6,135,4,
                  2,116,5,205,66,233,22,7,43,192,139,232,196,62,168,4,
                  131,199,4,38,196,61,140,192,11,199,116,1,69,232,32,3,
                  10,255,117,101,138,251,160,102,4,36,224,128,227,31,10,195,
                  162,102,4,138,223,128,231,8,208,231,138,232,128,229,239,10,
                  237,128,227,15,138,251,208,227,128,227,16,128,231,7,10,223,
                  160,73,4,60,3,118,14,180,0,138,195,232,193,2,11,237,
                  116,3,38,136,29,128,62,73,4,3,119,5,232,171,243,114,
                  7,180,17,138,195,232,167,2,11,237,116,4,38,136,93,16,
                  138,221,128,227,32,177,5,210,235,128,62,73,4,3,118,74,
                  160,102,4,36,223,128,227,1,116,2,12,32,162,102,4,36,
                  16,12,2,10,216,180,1,138,195,232,115,2,11,237,116,4,
                  38,136,93,1,254,195,254,195,180,2,138,195,232,96,2,11,
                  237,116,4,38,136,93,2,254,195,254,195,180,3,138,195,232,
                  77,2,11,237,116,4,38,136,93,3,232,90,2,233,62,6,
                  247,38,74,4,81,209,233,209,233,209,233,3,193,138,223,42,
                  255,139,203,139,30,76,4,227,4,3,195,226,252,89,139,216,
                  128,225,7,176,128,210,232,195,83,80,176,40,82,128,226,254,
                  246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,
                  187,192,2,185,2,3,128,62,73,4,6,114,6,187,128,1,
                  185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,
                  205,254,207,117,248,138,227,210,236,91,195,128,62,73,4,7,
                  119,42,82,186,0,184,142,194,90,80,80,232,170,255,210,232,
                  34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,
                  193,38,136,4,88,233,166,5,50,193,235,245,128,62,73,4,
                  15,114,13,232,241,248,114,8,36,133,138,224,208,228,10,196,
                  80,139,194,232,74,255,182,3,178,206,180,8,232,246,240,82,
                  186,0,160,142,194,90,88,138,232,246,197,128,116,10,180,3,
                  176,24,232,224,240,235,18,144,178,196,180,2,176,255,232,212,
                  240,38,138,7,42,192,38,136,7,178,196,180,2,138,197,36,
                  15,232,193,240,38,138,7,176,255,38,136,7,232,182,240,178,
                  206,180,3,42,192,232,173,240,180,8,176,255,232,166,240,233,
                  44,5,80,82,186,0,160,142,194,90,88,139,194,232,224,254,
                  181,7,42,233,43,210,176,0,195,138,205,180,4,82,182,3,
                  178,206,232,128,240,90,38,138,39,210,236,128,228,1,195,128,
                  62,73,4,7,119,24,82,186,0,184,142,194,90,232,216,254,
                  38,138,4,34,196,210,224,138,206,210,192,233,224,4,128,62,
                  73,4,15,114,37,232,47,248,114,32,232,165,255,232,185,255,
                  10,212,208,228,10,212,176,2,232,174,255,208,228,208,228,10,
                  212,208,228,10,212,138,194,233,180,4,232,133,255,232,153,255,
                  138,200,210,228,10,212,254,192,60,3,118,241,138,194,233,157,
                  4,80,138,62,98,4,83,138,223,50,255,209,227,139,151,80,
                  4,91,60,13,116,92,60,10,116,92,60,8,116,76,60,7,
                  116,92,180,10,185,1,0,205,16,254,194,58,22,74,4,117,
                  53,42,210,58,54,132,4,117,43,232,33,244,160,73,4,60,
                  4,114,6,42,255,60,7,117,6,180,8,205,16,138,252,184,
                  1,6,43,201,138,54,132,4,138,22,74,4,254,202,205,16,
                  88,233,58,4,254,198,180,2,235,244,10,210,116,248,254,202,
                  235,244,42,210,235,240,58,54,132,4,117,232,235,187,179,2,
                  232,157,239,235,219,138,38,74,4,138,62,98,4,160,135,4,
                  36,128,10,6,73,4,95,94,89,89,90,31,7,93,207,80,
                  232,98,239,250,236,168,8,116,251,88,178,192,134,196,238,134,
                  196,238,176,32,238,251,195,232,6,0,178,192,176,32,238,195,
                  232,66,239,236,195,246,6,135,4,2,117,7,128,62,99,4,
                  180,116,51,138,224,10,228,117,48,43,237,196,62,168,4,131,
                  199,4,38,196,61,140,192,11,199,116,1,69,232,209,255,138,
                  227,138,199,232,169,255,232,190,255,11,237,116,9,138,199,42,
                  255,3,251,38,136,5,233,149,3,254,204,117,45,43,237,196,
                  62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,
                  232,157,255,180,17,138,199,232,117,255,232,138,255,11,237,116,
                  213,131,199,17,38,136,61,233,100,3,254,204,117,64,30,6,
                  196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,9,
                  31,30,139,242,185,17,0,243,164,7,31,139,218,232,96,255,
                  42,228,38,138,7,232,55,255,254,196,67,128,252,16,114,242,
                  254,196,38,138,7,232,39,255,232,60,255,233,32,3,254,204,
                  117,41,83,232,212,238,131,195,51,38,138,7,91,10,219,117,
                  10,128,38,101,4,223,36,247,235,12,144,254,203,117,7,128,
                  14,101,4,32,12,8,180,16,232,244,254,233,240,2,80,85,
                  83,81,82,6,232,71,238,160,73,4,80,60,7,116,7,198,
                  6,73,4,11,235,5,198,6,73,4,12,232,221,238,232,45,
                  238,88,162,73,4,7,90,89,91,93,88,10,192,116,23,14,
                  7,43,210,185,0,1,254,200,117,7,183,14,189,48,34,235,
                  5,183,8,189,96,49,6,31,82,186,0,160,142,194,90,81,
                  177,5,211,226,89,10,219,116,8,129,194,0,64,254,203,117,
                  248,138,199,42,228,139,250,139,245,227,13,81,139,200,243,164,
                  43,248,131,199,32,89,226,243,195,232,210,237,163,133,4,139,
                  22,99,4,128,62,73,4,7,117,5,180,20,232,214,237,254,
                  200,180,9,232,207,237,254,200,138,232,138,200,254,193,180,1,
                  205,16,138,30,73,4,184,94,1,128,251,3,119,8,232,57,
                  239,114,3,184,200,0,153,247,54,133,4,72,162,132,4,254,
                  192,42,228,247,38,133,4,72,139,22,99,4,180,18,232,148,
                  237,160,132,4,254,192,246,38,74,4,209,224,5,0,1,163,
                  76,4,232,1,239,233,6,2,60,16,115,55,60,3,115,23,
                  232,11,255,232,5,238,232,237,238,232,82,237,139,14,96,4,
                  180,1,205,16,233,231,1,117,23,182,3,178,196,184,1,0,
                  232,82,237,180,3,138,195,232,75,237,184,3,0,232,69,237,
                  233,203,1,60,32,115,38,44,16,60,2,119,243,80,83,232,
                  204,254,232,198,237,91,88,138,224,10,228,138,199,116,9,176,
                  8,128,252,1,117,2,176,14,42,228,233,44,255,60,48,115,
                  106,44,32,117,17,43,210,142,218,250,137,46,124,0,140,6,
                  126,0,251,233,136,1,82,43,210,142,218,90,60,3,119,243,
                  254,200,116,20,14,7,254,200,117,8,185,14,0,189,48,34,
                  235,6,185,8,0,189,96,49,250,137,46,12,1,140,6,14,
                  1,251,232,185,236,137,14,133,4,138,195,187,103,32,10,192,
                  117,5,138,194,235,9,144,60,3,118,2,176,2,46,215,254,
                  200,162,132,4,233,55,1,0,14,25,43,60,48,116,3,233,
                  44,1,139,14,133,4,138,22,132,4,128,255,7,119,240,128,
                  255,1,119,24,82,43,210,142,218,90,10,255,117,7,196,46,
                  124,0,235,26,144,196,46,12,1,235,19,144,128,239,2,138,
                  223,42,255,209,227,129,195,183,32,46,139,47,14,7,95,94,
                  91,88,88,31,88,88,207,48,34,96,49,96,53,48,48,128,
                  251,16,114,81,116,27,128,251,32,116,3,233,208,0,43,210,
                  142,218,250,199,6,20,0,167,33,140,14,22,0,251,233,189,
                  0,138,62,135,4,128,231,2,208,239,160,135,4,36,96,177,
                  5,210,232,138,216,138,14,136,4,138,233,128,225,15,208,237,
                  208,237,208,237,208,237,128,229,15,95,94,90,90,90,31,7,
                  93,207,233,137,0,233,134,0,60,4,115,249,227,247,83,138,
                  223,42,255,209,227,139,183,80,4,91,86,80,184,0,2,205,
                  16,88,81,83,80,134,224,38,138,70,0,69,60,13,116,61,
                  60,10,116,57,60,8,116,53,60,7,116,49,185,1,0,128,
                  252,2,114,5,38,138,94,0,69,180,9,205,16,254,194,58,
                  22,74,4,114,17,58,54,132,4,117,7,184,10,14,205,16,
                  254,206,254,198,42,210,184,0,2,205,16,235,14,180,14,205,
                  16,138,223,42,255,209,227,139,151,80,4,88,91,89,226,162,
                  90,60,1,116,9,60,3,116,5,184,0,2,205,16,95,94,
                  91,89,90,31,7,93,207,251,30,80,83,81,82,232,78,235,
                  128,62,0,5,1,116,99,198,6,0,5,1,180,15,205,16,
                  138,204,138,46,132,4,254,197,232,85,0,81,180,3,205,16,
                  89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,
                  176,32,82,51,210,50,228,205,23,90,246,196,41,117,33,254,
                  194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,
                  58,238,117,208,90,180,2,205,16,198,6,0,5,0,235,10,
                  90,180,2,205,16,198,6,0,5,255,90,89,91,88,31,207,
                  51,210,50,228,176,13,205,23,50,228,176,10,205,23,195,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  126,129,165,129,129,189,153,129,126,0,0,0,0,0,126,255,
                  219,255,255,195,231,255,126,0,0,0,0,0,0,108,254,254,
                  254,254,124,56,16,0,0,0,0,0,0,16,56,124,254,124,
                  56,16,0,0,0,0,0,0,24,60,60,231,231,231,24,24,
                  60,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,
                  0,0,0,0,0,0,0,24,60,60,24,0,0,0,0,0,
                  255,255,255,255,255,231,195,195,231,255,255,255,255,255,0,0,
                  0,0,60,102,66,66,102,60,0,0,0,0,255,255,255,255,
                  195,153,189,189,153,195,255,255,255,255,0,0,30,14,26,50,
                  120,204,204,204,120,0,0,0,0,0,60,102,102,102,60,24,
                  126,24,24,0,0,0,0,0,63,51,63,48,48,48,112,240,
                  224,0,0,0,0,0,127,99,127,99,99,99,103,231,230,192,
                  0,0,0,0,24,24,219,60,231,60,219,24,24,0,0,0,
                  0,0,128,192,224,248,254,248,224,192,128,0,0,0,0,0,
                  2,6,14,62,254,62,14,6,2,0,0,0,0,0,24,60,
                  126,24,24,24,126,60,24,0,0,0,0,0,102,102,102,102,
                  102,102,0,102,102,0,0,0,0,0,127,219,219,219,123,27,
                  27,27,27,0,0,0,0,124,198,96,56,108,198,198,108,56,
                  12,198,124,0,0,0,0,0,0,0,0,0,254,254,254,0,
                  0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,0,
                  0,0,24,60,126,24,24,24,24,24,24,0,0,0,0,0,
                  24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,
                  24,12,254,12,24,0,0,0,0,0,0,0,0,0,48,96,
                  254,96,48,0,0,0,0,0,0,0,0,0,0,192,192,192,
                  254,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,
                  0,0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,
                  0,0,0,0,0,254,254,124,124,56,56,16,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  24,60,60,60,24,24,0,24,24,0,0,0,0,102,102,102,
                  36,0,0,0,0,0,0,0,0,0,0,0,108,108,254,108,
                  108,108,254,108,108,0,0,0,24,24,124,198,194,192,124,6,
                  134,198,124,24,24,0,0,0,0,0,194,198,12,24,48,102,
                  198,0,0,0,0,0,56,108,108,56,118,220,204,204,118,0,
                  0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,
                  0,0,12,24,48,48,48,48,48,24,12,0,0,0,0,0,
                  48,24,12,12,12,12,12,24,48,0,0,0,0,0,0,0,
                  102,60,255,60,102,0,0,0,0,0,0,0,0,0,24,24,
                  126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  24,24,24,48,0,0,0,0,0,0,0,0,254,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,
                  0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0,
                  0,0,124,198,206,222,246,230,198,198,124,0,0,0,0,0,
                  24,56,120,24,24,24,24,24,126,0,0,0,0,0,124,198,
                  6,12,24,48,96,198,254,0,0,0,0,0,124,198,6,6,
                  60,6,6,198,124,0,0,0,0,0,12,28,60,108,204,254,
                  12,12,30,0,0,0,0,0,254,192,192,192,252,6,6,198,
                  124,0,0,0,0,0,56,96,192,192,252,198,198,198,124,0,
                  0,0,0,0,254,198,6,12,24,48,48,48,48,0,0,0,
                  0,0,124,198,198,198,124,198,198,198,124,0,0,0,0,0,
                  124,198,198,198,126,6,6,12,120,0,0,0,0,0,0,24,
                  24,0,0,0,24,24,0,0,0,0,0,0,0,24,24,0,
                  0,0,24,24,48,0,0,0,0,0,6,12,24,48,96,48,
                  24,12,6,0,0,0,0,0,0,0,0,126,0,0,126,0,
                  0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,
                  0,0,0,0,124,198,198,12,24,24,0,24,24,0,0,0,
                  0,0,124,198,198,222,222,222,220,192,124,0,0,0,0,0,
                  16,56,108,198,198,254,198,198,198,0,0,0,0,0,252,102,
                  102,102,124,102,102,102,252,0,0,0,0,0,60,102,194,192,
                  192,192,194,102,60,0,0,0,0,0,248,108,102,102,102,102,
                  102,108,248,0,0,0,0,0,254,102,98,104,120,104,98,102,
                  254,0,0,0,0,0,254,102,98,104,120,104,96,96,240,0,
                  0,0,0,0,60,102,194,192,192,222,198,102,58,0,0,0,
                  0,0,198,198,198,198,254,198,198,198,198,0,0,0,0,0,
                  60,24,24,24,24,24,24,24,60,0,0,0,0,0,30,12,
                  12,12,12,12,204,204,120,0,0,0,0,0,230,102,108,108,
                  120,108,108,102,230,0,0,0,0,0,240,96,96,96,96,96,
                  98,102,254,0,0,0,0,0,198,238,254,254,214,198,198,198,
                  198,0,0,0,0,0,198,230,246,254,222,206,198,198,198,0,
                  0,0,0,0,56,108,198,198,198,198,198,108,56,0,0,0,
                  0,0,252,102,102,102,124,96,96,96,240,0,0,0,0,0,
                  124,198,198,198,198,214,222,124,12,14,0,0,0,0,252,102,
                  102,102,124,108,102,102,230,0,0,0,0,0,124,198,198,96,
                  56,12,198,198,124,0,0,0,0,0,126,126,90,24,24,24,
                  24,24,60,0,0,0,0,0,198,198,198,198,198,198,198,198,
                  124,0,0,0,0,0,198,198,198,198,198,198,108,56,16,0,
                  0,0,0,0,198,198,198,198,214,214,254,124,108,0,0,0,
                  0,0,198,198,108,56,56,56,108,198,198,0,0,0,0,0,
                  102,102,102,102,60,24,24,24,60,0,0,0,0,0,254,198,
                  140,24,48,96,194,198,254,0,0,0,0,0,60,48,48,48,
                  48,48,48,48,60,0,0,0,0,0,128,192,224,112,56,28,
                  14,6,2,0,0,0,0,0,60,12,12,12,12,12,12,12,
                  60,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,
                  48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,120,12,124,204,204,118,0,0,0,0,0,224,96,
                  96,120,108,102,102,102,124,0,0,0,0,0,0,0,0,124,
                  198,192,192,198,124,0,0,0,0,0,28,12,12,60,108,204,
                  204,204,118,0,0,0,0,0,0,0,0,124,198,254,192,198,
                  124,0,0,0,0,0,56,108,100,96,240,96,96,96,240,0,
                  0,0,0,0,0,0,0,118,204,204,204,124,12,204,120,0,
                  0,0,224,96,96,108,118,102,102,102,230,0,0,0,0,0,
                  24,24,0,56,24,24,24,24,60,0,0,0,0,0,6,6,
                  0,14,6,6,6,6,102,102,60,0,0,0,224,96,96,102,
                  108,120,108,102,230,0,0,0,0,0,56,24,24,24,24,24,
                  24,24,60,0,0,0,0,0,0,0,0,236,254,214,214,214,
                  198,0,0,0,0,0,0,0,0,220,102,102,102,102,102,0,
                  0,0,0,0,0,0,0,124,198,198,198,198,124,0,0,0,
                  0,0,0,0,0,220,102,102,102,124,96,96,240,0,0,0,
                  0,0,0,118,204,204,204,124,12,12,30,0,0,0,0,0,
                  0,220,118,102,96,96,240,0,0,0,0,0,0,0,0,124,
                  198,112,28,198,124,0,0,0,0,0,16,48,48,252,48,48,
                  48,54,28,0,0,0,0,0,0,0,0,204,204,204,204,204,
                  118,0,0,0,0,0,0,0,0,102,102,102,102,60,24,0,
                  0,0,0,0,0,0,0,198,198,214,214,254,108,0,0,0,
                  0,0,0,0,0,198,108,56,56,108,198,0,0,0,0,0,
                  0,0,0,198,198,198,198,126,6,12,248,0,0,0,0,0,
                  0,254,204,24,48,102,254,0,0,0,0,0,14,24,24,24,
                  112,24,24,24,14,0,0,0,0,0,24,24,24,24,0,24,
                  24,24,24,0,0,0,0,0,112,24,24,24,14,24,24,24,
                  112,0,0,0,0,0,118,220,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,
                  0,0,60,102,194,192,192,194,102,60,12,6,124,0,0,0,
                  204,204,0,204,204,204,204,204,118,0,0,0,0,12,24,48,
                  0,124,198,254,192,198,124,0,0,0,0,16,56,108,0,120,
                  12,124,204,204,118,0,0,0,0,0,204,204,0,120,12,124,
                  204,204,118,0,0,0,0,96,48,24,0,120,12,124,204,204,
                  118,0,0,0,0,56,108,56,0,120,12,124,204,204,118,0,
                  0,0,0,0,0,0,60,102,96,102,60,12,6,60,0,0,
                  0,16,56,108,0,124,198,254,192,198,124,0,0,0,0,0,
                  204,204,0,124,198,254,192,198,124,0,0,0,0,96,48,24,
                  0,124,198,254,192,198,124,0,0,0,0,0,102,102,0,56,
                  24,24,24,24,60,0,0,0,0,24,60,102,0,56,24,24,
                  24,24,60,0,0,0,0,96,48,24,0,56,24,24,24,24,
                  60,0,0,0,0,198,198,16,56,108,198,198,254,198,198,0,
                  0,0,56,108,56,0,56,108,198,198,254,198,198,0,0,0,
                  24,48,96,0,254,102,96,124,96,102,254,0,0,0,0,0,
                  0,0,204,118,54,126,216,216,110,0,0,0,0,0,62,108,
                  204,204,254,204,204,204,206,0,0,0,0,16,56,108,0,124,
                  198,198,198,198,124,0,0,0,0,0,198,198,0,124,198,198,
                  198,198,124,0,0,0,0,96,48,24,0,124,198,198,198,198,
                  124,0,0,0,0,48,120,204,0,204,204,204,204,204,118,0,
                  0,0,0,96,48,24,0,204,204,204,204,204,118,0,0,0,
                  0,0,198,198,0,198,198,198,198,126,6,12,120,0,0,198,
                  198,56,108,198,198,198,198,108,56,0,0,0,0,198,198,0,
                  198,198,198,198,198,198,124,0,0,0,0,24,24,60,102,96,
                  96,102,60,24,24,0,0,0,0,56,108,100,96,240,96,96,
                  96,230,252,0,0,0,0,0,102,102,60,24,126,24,126,24,
                  24,0,0,0,0,248,204,204,248,196,204,222,204,204,198,0,
                  0,0,0,14,27,24,24,24,126,24,24,24,24,216,112,0,
                  0,24,48,96,0,120,12,124,204,204,118,0,0,0,0,12,
                  24,48,0,56,24,24,24,24,60,0,0,0,0,24,48,96,
                  0,124,198,198,198,198,124,0,0,0,0,24,48,96,0,204,
                  204,204,204,204,118,0,0,0,0,0,118,220,0,220,102,102,
                  102,102,102,0,0,0,118,220,0,198,230,246,254,222,206,198,
                  198,0,0,0,0,60,108,108,62,0,126,0,0,0,0,0,
                  0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,
                  0,0,48,48,0,48,48,96,198,198,124,0,0,0,0,0,
                  0,0,0,0,254,192,192,192,0,0,0,0,0,0,0,0,
                  0,0,254,6,6,6,0,0,0,0,0,192,192,198,204,216,
                  48,96,220,134,12,24,62,0,0,192,192,198,204,216,48,102,
                  206,158,62,6,6,0,0,0,24,24,0,24,24,60,60,60,
                  24,0,0,0,0,0,0,0,54,108,216,108,54,0,0,0,
                  0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,
                  17,68,17,68,17,68,17,68,17,68,17,68,17,68,85,170,
                  85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,
                  221,119,221,119,221,119,221,119,221,119,24,24,24,24,24,24,
                  24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
                  24,24,24,24,24,24,24,24,24,24,24,248,24,248,24,24,
                  24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,
                  54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,
                  0,0,0,0,0,248,24,248,24,24,24,24,24,24,54,54,
                  54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,
                  54,54,54,54,54,54,54,54,54,54,0,0,0,0,0,254,
                  6,246,54,54,54,54,54,54,54,54,54,54,54,246,6,254,
                  0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,
                  0,0,0,0,24,24,24,24,24,248,24,248,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,
                  24,24,24,24,24,24,24,31,0,0,0,0,0,0,24,24,
                  24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,
                  24,31,24,24,24,24,24,24,0,0,0,0,0,0,0,255,
                  0,0,0,0,0,0,24,24,24,24,24,24,24,255,24,24,
                  24,24,24,24,24,24,24,24,24,31,24,31,24,24,24,24,
                  24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,
                  54,54,54,54,54,55,48,63,0,0,0,0,0,0,0,0,
                  0,0,0,63,48,55,54,54,54,54,54,54,54,54,54,54,
                  54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,255,
                  0,247,54,54,54,54,54,54,54,54,54,54,54,55,48,55,
                  54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,
                  0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,
                  54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,
                  54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,
                  0,0,0,255,0,255,24,24,24,24,24,24,0,0,0,0,
                  0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,
                  54,63,0,0,0,0,0,0,24,24,24,24,24,31,24,31,
                  0,0,0,0,0,0,0,0,0,0,0,31,24,31,24,24,
                  24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,
                  54,54,54,54,54,54,54,54,54,255,54,54,54,54,54,54,
                  24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,24,
                  24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,31,24,24,24,24,24,24,255,255,255,255,255,255,
                  255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,
                  255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,
                  240,240,240,240,15,15,15,15,15,15,15,15,15,15,15,15,
                  15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,
                  0,0,0,0,0,118,220,216,216,220,118,0,0,0,0,0,
                  0,0,124,198,252,198,198,252,192,192,64,0,0,0,254,198,
                  198,192,192,192,192,192,192,0,0,0,0,0,0,0,254,108,
                  108,108,108,108,108,0,0,0,0,0,254,198,96,48,24,48,
                  96,198,254,0,0,0,0,0,0,0,0,126,216,216,216,216,
                  112,0,0,0,0,0,0,0,102,102,102,102,124,96,96,192,
                  0,0,0,0,0,0,118,220,24,24,24,24,24,0,0,0,
                  0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,
                  56,108,198,198,254,198,198,108,56,0,0,0,0,0,56,108,
                  198,198,198,108,108,108,238,0,0,0,0,0,30,48,24,12,
                  62,102,102,102,60,0,0,0,0,0,0,0,0,126,219,219,
                  126,0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,
                  192,0,0,0,0,0,28,48,96,96,124,96,96,48,28,0,
                  0,0,0,0,0,124,198,198,198,198,198,198,198,0,0,0,
                  0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,
                  0,24,24,126,24,24,0,0,255,0,0,0,0,0,48,24,
                  12,6,12,24,48,0,126,0,0,0,0,0,12,24,48,96,
                  48,24,12,0,126,0,0,0,0,0,14,27,27,24,24,24,
                  24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,
                  112,0,0,0,0,0,0,24,24,0,126,0,24,24,0,0,
                  0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,
                  0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,24,0,0,0,0,0,0,0,15,12,12,12,12,
                  12,236,108,60,28,0,0,0,0,216,108,108,108,108,108,0,
                  0,0,0,0,0,0,0,112,216,48,96,200,248,0,0,0,
                  0,0,0,0,0,0,0,0,124,124,124,124,124,124,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  29,0,0,0,0,36,102,255,102,36,0,0,0,0,0,34,
                  0,99,99,99,34,0,0,0,0,0,0,0,0,0,43,0,
                  0,0,24,24,24,255,24,24,24,0,0,0,0,45,0,0,
                  0,0,0,0,255,0,0,0,0,0,0,0,77,0,0,195,
                  231,255,219,195,195,195,195,195,0,0,0,84,0,0,255,219,
                  153,24,24,24,24,24,60,0,0,0,86,0,0,195,195,195,
                  195,195,195,102,60,24,0,0,0,87,0,0,195,195,195,195,
                  219,219,255,102,102,0,0,0,88,0,0,195,195,102,60,24,
                  60,102,195,195,0,0,0,89,0,0,195,195,195,102,60,24,
                  24,24,60,0,0,0,90,0,0,255,195,134,12,24,48,97,
                  195,255,0,0,0,109,0,0,0,0,0,230,255,219,219,219,
                  219,0,0,0,118,0,0,0,0,0,195,195,195,102,60,24,
                  0,0,0,119,0,0,0,0,0,195,195,219,219,255,102,0,
                  0,0,145,0,0,0,0,110,59,27,126,216,220,119,0,0,
                  0,155,0,24,24,126,195,192,192,195,126,24,24,0,0,0,
                  157,0,0,195,102,60,24,255,24,255,24,24,0,0,0,158,
                  0,252,102,102,124,98,102,111,102,102,243,0,0,0,241,0,
                  0,24,24,24,255,24,24,24,0,255,0,0,0,246,0,0,
                  24,24,0,0,255,0,0,24,24,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,
                  126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,
                  16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,
                  16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,
                  255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,
                  255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,
                  60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,
                  127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,
                  128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,
                  24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,
                  127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,
                  0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,
                  24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,
                  0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
                  0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,
                  0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,
                  0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,
                  108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,
                  48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,
                  56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,
                  24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,
                  0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,
                  0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,
                  0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,
                  124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,
                  120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,
                  28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,
                  56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,
                  120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,
                  0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,
                  24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,
                  96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,
                  124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,
                  252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,
                  248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,
                  254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,
                  204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,
                  30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,
                  240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,
                  198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,
                  252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
                  252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,
                  252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,
                  204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,
                  198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,
                  254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,
                  192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,
                  16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,
                  48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,
                  224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,
                  28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,
                  56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,
                  224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,
                  12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,
                  112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
                  0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,
                  0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,
                  0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,
                  16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,
                  0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,
                  0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,
                  0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,
                  24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,
                  118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,
                  120,204,192,204,120,24,12,120,0,204,0,204,204,204,126,0,
                  28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,
                  204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,0,
                  48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,
                  126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,
                  224,0,120,204,252,192,120,0,204,0,112,48,48,48,120,0,
                  124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,
                  198,56,108,198,254,198,198,0,48,48,0,120,204,252,204,0,
                  28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,
                  62,108,204,254,204,204,206,0,120,204,0,120,204,204,120,0,
                  0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,
                  120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,
                  0,204,0,204,204,124,12,248,195,24,60,102,102,60,24,0,
                  204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,
                  56,108,100,240,96,230,252,0,204,204,120,252,48,252,48,48,
                  248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,
                  28,0,120,12,124,204,126,0,56,0,112,48,48,48,120,0,
                  0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,
                  0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,
                  60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,
                  48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,
                  0,0,0,252,12,12,0,0,195,198,204,222,51,102,204,15,
                  195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,
                  0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,
                  34,136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,
                  219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,
                  24,24,24,24,248,24,24,24,24,24,248,24,248,24,24,24,
                  54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,
                  0,0,248,24,248,24,24,24,54,54,246,6,246,54,54,54,
                  54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,
                  54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,
                  24,24,248,24,248,0,0,0,0,0,0,0,248,24,24,24,
                  24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,
                  0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,
                  0,0,0,0,255,0,0,0,24,24,24,24,255,24,24,24,
                  24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,
                  54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
                  54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,
                  54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,
                  54,54,247,0,247,54,54,54,24,24,255,0,255,0,0,0,
                  54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,
                  0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,
                  24,24,31,24,31,0,0,0,0,0,31,24,31,24,24,24,
                  0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,
                  24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
                  0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,
                  0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,
                  15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,
                  0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,
                  0,252,204,192,192,192,192,0,0,254,108,108,108,108,108,0,
                  252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,
                  0,102,102,102,102,124,96,192,0,118,220,24,24,24,24,0,
                  252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,
                  56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,
                  0,0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,
                  56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,
                  0,252,0,252,0,252,0,0,48,48,252,48,48,0,252,0,
                  96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,
                  14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,112,
                  48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,
                  56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,
                  0,0,0,0,24,0,0,0,15,12,12,12,236,108,60,28,
                  120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,
                  0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70]
                  ,"symbols":{"VIDEO_SETUP":{"o":3},"POR_1":{"o":146},"RD_SWS":{"o":155},"F_BTS":{"o":206},"MK_ENV":{"o":243},"ENV_X":{"o":328,"c":"SET 40x25 COLOR ALPHA"}}}
                • ibm-ega.map
                       0003   @   VIDEO_SETUP
                       0092   @   POR_1
                       009B   @   RD_SWS
                       00CE   @   F_BTS
                       00F3   @   MK_ENV
                       0148   @   ENV_X ; SET 40x25 COLOR ALPHA
                       0D20   @   BEEP
                  
              • mda
                • ibm-mda-dual.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoMDA" model="mda" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm/mda/ibm-mda.json" pos="center" padding="8px">
                  	<menu>
                  		<title>Monochrome Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-mda.json
                  [0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,0,0,126,255,219,255,255,195,0,0,0,54,127,127,127,127,0,0,0,8,28,62,127,62,0,0,
                  24,60,60,231,231,231,0,0,24,60,126,255,255,126,0,0,0,0,0,24,60,60,255,255,255,255,255,231,195,195,0,0,0,0,60,102,66,66,255,
                  255,255,255,195,153,189,189,0,0,15,7,13,25,60,102,0,0,60,102,102,102,60,24,0,0,63,51,63,48,48,48,0,0,127,99,127,99,99,99,
                  0,0,24,24,219,60,231,60,0,0,64,96,112,124,127,124,0,0,1,3,7,31,127,31,0,0,24,60,126,24,24,24,0,0,51,51,51,51,51,51,0,0,127,
                  219,219,219,123,27,0,62,99,48,28,54,99,99,0,0,0,0,0,0,0,0,0,0,24,60,126,24,24,24,0,0,24,60,126,24,24,24,0,0,24,24,24,24,24,
                  24,0,0,0,0,12,6,127,6,0,0,0,0,24,48,127,48,0,0,0,0,0,96,96,96,0,0,0,0,36,102,255,102,0,0,0,8,28,28,62,62,0,0,0,127,127,62,
                  62,28,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,99,99,99,34,0,0,0,0,0,54,54,127,54,54,54,12,12,62,99,97,96,62,3,0,0,0,0,97,
                  99,6,12,0,0,28,54,54,28,59,110,0,48,48,48,96,0,0,0,0,0,12,24,48,48,48,48,0,0,24,12,6,6,6,6,0,0,0,0,102,60,255,60,0,0,0,24,
                  24,24,255,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,1,3,6,12,24,48,0,0,62,99,103,111,123,115,0,0,12,28,60,
                  12,12,12,0,0,62,99,3,6,12,24,0,0,62,99,3,3,30,3,0,0,6,14,30,54,102,127,0,0,127,96,96,96,126,3,0,0,28,48,96,96,126,99,0,0,
                  127,99,3,6,12,24,0,0,62,99,99,99,62,99,0,0,62,99,99,99,63,3,0,0,0,24,24,0,0,0,0,0,0,24,24,0,0,0,0,0,6,12,24,48,96,48,0,0,
                  0,0,0,126,0,0,0,0,96,48,24,12,6,12,0,0,62,99,99,6,12,12,0,0,62,99,99,111,111,111,0,0,8,28,54,99,99,127,0,0,126,51,51,51,62,
                  51,0,0,30,51,97,96,96,96,0,0,124,54,51,51,51,51,0,0,127,51,49,52,60,52,0,0,127,51,49,52,60,52,0,0,30,51,97,96,96,111,0,0,
                  99,99,99,99,127,99,0,0,60,24,24,24,24,24,0,0,15,6,6,6,6,6,0,0,115,51,54,54,60,54,0,0,120,48,48,48,48,48,0,0,195,231,255,219,
                  195,195,0,0,99,115,123,127,111,103,0,0,28,54,99,99,99,99,0,0,126,51,51,51,62,48,0,0,62,99,99,99,99,107,0,0,126,51,51,51,62,
                  54,0,0,62,99,99,48,28,6,0,0,255,219,153,24,24,24,0,0,99,99,99,99,99,99,0,0,195,195,195,195,195,195,0,0,195,195,195,195,219,
                  219,0,0,195,195,102,60,24,60,0,0,195,195,195,102,60,24,0,0,255,195,134,12,24,48,0,0,60,48,48,48,48,48,0,0,64,96,112,56,28,
                  14,0,0,60,12,12,12,12,12,8,28,54,99,0,0,0,0,0,0,0,0,0,0,0,0,24,24,12,0,0,0,0,0,0,0,0,0,0,60,6,62,0,0,112,48,48,60,54,51,0,
                  0,0,0,0,62,99,96,0,0,14,6,6,30,54,102,0,0,0,0,0,62,99,127,0,0,28,54,50,48,124,48,0,0,0,0,0,59,102,102,0,0,112,48,48,54,59,
                  51,0,0,12,12,0,28,12,12,0,0,6,6,0,14,6,6,0,0,112,48,48,51,54,60,0,0,28,12,12,12,12,12,0,0,0,0,0,230,255,219,0,0,0,0,0,110,
                  51,51,0,0,0,0,0,62,99,99,0,0,0,0,0,110,51,51,0,0,0,0,0,59,102,102,0,0,0,0,0,110,59,51,0,0,0,0,0,62,99,56,0,0,8,24,24,126,
                  24,24,0,0,0,0,0,102,102,102,0,0,0,0,0,195,195,195,0,0,0,0,0,195,195,219,0,0,0,0,0,99,54,28,0,0,0,0,0,99,99,99,0,0,0,0,0,127,
                  102,12,0,0,14,24,24,24,112,24,0,0,24,24,24,24,0,24,0,0,112,24,24,24,14,24,0,0,59,110,0,0,0,0,0,0,0,0,8,28,54,99,0,0,30,51,
                  97,96,96,97,0,0,102,102,0,102,102,102,0,6,12,24,0,62,99,127,0,8,28,54,0,60,6,62,0,0,102,102,0,60,6,62,0,48,24,12,0,60,6,62,
                  0,28,54,28,0,60,6,62,0,0,0,0,60,102,96,102,0,8,28,54,0,62,99,127,0,0,102,102,0,62,99,127,0,48,24,12,0,62,99,127,0,0,102,102,
                  0,56,24,24,0,24,60,102,0,56,24,24,0,96,48,24,0,56,24,24,0,99,99,8,28,54,99,99,28,54,28,0,28,54,99,99,12,24,48,0,127,51,48,
                  62,0,0,0,0,110,59,27,126,0,0,31,54,102,102,127,102,0,8,28,54,0,62,99,99,0,0,99,99,0,62,99,99,0,48,24,12,0,62,99,99,0,24,60,
                  102,0,102,102,102,0,48,24,12,0,102,102,102,0,0,99,99,0,99,99,99,0,99,99,28,54,99,99,99,0,99,99,0,99,99,99,99,0,24,24,126,
                  195,192,192,195,0,28,54,50,48,120,48,48,0,0,195,102,60,24,255,24,0,252,102,102,124,98,102,111,0,14,27,24,24,24,126,24,0,12,
                  24,48,0,60,6,62,0,12,24,48,0,56,24,24,0,12,24,48,0,62,99,99,0,12,24,48,0,102,102,102,0,0,59,110,0,110,51,51,59,110,0,99,115,
                  123,127,111,0,60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,0,24,24,0,24,24,48,0,0,0,0,0,0,127,96,0,0,0,0,0,0,127,3,0,96,
                  224,99,102,108,24,48,0,96,224,99,102,108,24,51,0,0,24,24,0,24,24,60,0,0,0,0,27,54,108,54,0,0,0,0,108,54,27,54,17,68,17,68,
                  17,68,17,68,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
                  24,24,24,24,24,248,24,248,54,54,54,54,54,54,54,246,0,0,0,0,0,0,0,254,0,0,0,0,0,248,24,248,54,54,54,54,54,246,6,246,54,54,
                  54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,54,54,54,54,246,6,254,54,54,54,54,54,54,54,254,24,24,24,24,24,248,24,248,0,0,0,0,
                  0,0,0,248,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,0,0,0,0,0,0,0,255,24,
                  24,24,24,24,24,24,255,24,24,24,24,24,31,24,31,54,54,54,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
                  54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,0,0,0,0,0,255,0,255,54,54,54,54,54,247,0,247,24,24,24,24,24,255,
                  0,255,54,54,54,54,54,54,54,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,63,24,24,24,24,24,31,24,31,0,0,
                  0,0,0,31,24,31,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,255,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,
                  31,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,
                  255,255,255,255,0,0,0,0,0,0,59,110,108,0,0,0,0,62,99,126,99,0,0,127,99,99,96,96,96,0,0,0,0,127,54,54,54,0,0,127,99,48,24,
                  12,24,0,0,0,0,0,63,108,108,0,0,0,0,51,51,51,51,0,0,0,0,59,110,12,12,0,0,126,24,60,102,102,102,0,0,28,54,99,99,127,99,0,0,
                  28,54,99,99,99,54,0,0,30,48,24,12,62,102,0,0,0,0,0,126,219,219,0,0,3,6,126,219,219,243,0,0,28,48,96,96,124,96,0,0,0,62,99,
                  99,99,99,0,0,0,127,0,0,127,0,0,0,24,24,24,255,24,24,0,0,48,24,12,6,12,24,0,0,12,24,48,96,48,24,0,0,14,27,27,24,24,24,24,24,
                  24,24,24,24,24,24,0,0,24,24,0,0,255,0,0,0,0,0,59,110,0,59,0,56,108,108,56,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,15,12,
                  12,12,12,12,236,0,216,108,108,108,108,108,0,0,112,216,48,96,200,248,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  153,129,126,0,0,0,0,0,231,255,126,0,0,0,0,0,62,28,8,0,0,0,0,0,28,8,0,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,0,
                  0,0,0,0,0,0,231,255,255,255,255,255,0,0,102,60,0,0,0,0,0,0,153,195,255,255,255,255,0,0,102,102,60,0,0,0,0,0,126,24,24,0,0,
                  0,0,0,112,240,224,0,0,0,0,0,103,231,230,192,0,0,0,0,219,24,24,0,0,0,0,0,112,96,64,0,0,0,0,0,7,3,1,0,0,0,0,0,126,60,24,0,0,
                  0,0,0,0,51,51,0,0,0,0,0,27,27,27,0,0,0,0,0,54,28,6,99,62,0,0,0,127,127,127,0,0,0,0,0,126,60,24,126,0,0,0,0,24,24,24,0,0,0,
                  0,0,126,60,24,0,0,0,0,0,12,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,127,127,0,0,0,0,0,0,28,8,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,127,54,54,0,0,0,0,0,67,99,62,12,12,0,0,0,24,51,99,0,0,0,0,0,102,
                  102,59,0,0,0,0,0,0,0,0,0,0,0,0,0,48,24,12,0,0,0,0,0,6,12,24,0,0,0,0,0,102,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,24,24,24,48,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,96,64,0,0,0,0,0,0,99,99,62,0,0,0,0,0,12,12,63,0,0,0,0,0,48,99,127,0,0,0,0,0,3,99,62,
                  0,0,0,0,0,6,6,15,0,0,0,0,0,3,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,24,24,24,0,0,0,0,0,99,99,62,0,0,0,0,0,3,6,60,0,0,0,0,0,24,
                  24,0,0,0,0,0,0,24,24,48,0,0,0,0,0,24,12,6,0,0,0,0,0,126,0,0,0,0,0,0,0,24,48,96,0,0,0,0,0,0,12,12,0,0,0,0,0,110,96,62,0,0,
                  0,0,0,99,99,99,0,0,0,0,0,51,51,126,0,0,0,0,0,97,51,30,0,0,0,0,0,51,54,124,0,0,0,0,0,49,51,127,0,0,0,0,0,48,48,120,0,0,0,0,
                  0,99,51,29,0,0,0,0,0,99,99,99,0,0,0,0,0,24,24,60,0,0,0,0,0,102,102,60,0,0,0,0,0,54,51,115,0,0,0,0,0,49,51,127,0,0,0,0,0,195,
                  195,195,0,0,0,0,0,99,99,99,0,0,0,0,0,99,54,28,0,0,0,0,0,48,48,120,0,0,0,0,0,111,62,6,7,0,0,0,0,51,51,115,0,0,0,0,0,99,99,
                  62,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,60,24,0,0,0,0,0,255,102,102,0,0,0,0,0,102,195,195,0,0,0,0,0,24,24,
                  60,0,0,0,0,0,97,195,255,0,0,0,0,0,48,48,60,0,0,0,0,0,7,3,1,0,0,0,0,0,12,12,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,
                  0,0,0,0,0,0,0,0,102,102,59,0,0,0,0,0,51,51,110,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,48,48,
                  120,0,0,0,0,0,102,62,6,102,60,0,0,0,51,51,115,0,0,0,0,0,12,12,30,0,0,0,0,0,6,6,102,102,60,0,0,0,54,51,115,0,0,0,0,0,12,12,
                  30,0,0,0,0,0,219,219,219,0,0,0,0,0,51,51,51,0,0,0,0,0,99,99,62,0,0,0,0,0,51,62,48,48,120,0,0,0,102,62,6,6,15,0,0,0,48,48,
                  120,0,0,0,0,0,14,99,62,0,0,0,0,0,24,27,14,0,0,0,0,0,102,102,59,0,0,0,0,0,102,60,24,0,0,0,0,0,219,255,102,0,0,0,0,0,28,54,
                  99,0,0,0,0,0,99,63,3,6,60,0,0,0,24,51,127,0,0,0,0,0,24,24,14,0,0,0,0,0,24,24,24,0,0,0,0,0,24,24,112,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,99,127,0,0,0,0,0,0,51,30,6,3,62,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,
                  0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,0,60,12,6,60,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,24,
                  24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,127,99,99,0,0,0,0,0,127,99,99,0,0,0,0,0,48,51,127,0,0,0,0,0,216,220,
                  119,0,0,0,0,0,102,102,103,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,
                  59,0,0,0,0,0,99,63,3,6,60,0,0,0,99,54,28,0,0,0,0,0,99,99,62,0,0,0,0,0,126,24,24,0,0,0,0,0,48,115,126,0,0,0,0,0,255,24,24,
                  0,0,0,0,0,102,102,243,0,0,0,0,0,24,24,24,216,112,0,0,0,102,102,59,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,
                  59,0,0,0,0,0,51,51,51,0,0,0,0,0,103,99,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,62,0,0,0,0,0,96,96,0,0,0,0,0,0,
                  3,3,0,0,0,0,0,0,110,195,6,12,31,0,0,0,103,207,31,3,3,0,0,0,60,60,24,0,0,0,0,0,27,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,17,68,17,
                  68,17,68,0,0,85,170,85,170,85,170,0,0,221,119,221,119,221,119,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,24,24,24,24,
                  24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,54,
                  54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,
                  0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,
                  54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,
                  24,24,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,0,0,240,240,240,240,240,240,0,0,15,15,15,15,15,15,0,0,0,0,0,
                  0,0,0,0,0,108,110,59,0,0,0,0,0,99,126,96,96,32,0,0,0,96,96,96,0,0,0,0,0,54,54,54,0,0,0,0,0,48,99,127,0,0,0,0,0,108,108,56,
                  0,0,0,0,0,62,48,48,96,0,0,0,0,12,12,12,0,0,0,0,0,60,24,126,0,0,0,0,0,99,54,28,0,0,0,0,0,54,54,119,0,0,0,0,0,102,102,60,0,
                  0,0,0,0,126,0,0,0,0,0,0,0,126,96,192,0,0,0,0,0,96,48,28,0,0,0,0,0,99,99,99,0,0,0,0,0,0,127,0,0,0,0,0,0,24,0,255,0,0,0,0,0,
                  48,0,126,0,0,0,0,0,12,0,126,0,0,0,0,0,24,24,24,24,24,24,0,0,216,216,112,0,0,0,0,0,0,24,24,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,
                  124,254,124,56,16,0,56,124,56,254,254,214,16,56,16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,
                  255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,3,5,125,132,132,132,120,60,66,66,66,60,24,126,24,63,33,63,
                  32,32,96,224,192,63,33,63,33,35,103,230,192,24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,
                  0,24,60,126,24,24,126,60,24,36,36,36,36,36,0,36,0,127,146,146,114,18,18,18,0,62,99,56,68,68,56,204,120,0,0,0,0,126,126,126,
                  0,24,60,126,24,126,60,24,255,16,56,124,84,16,16,16,0,16,16,16,84,124,56,16,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
                  0,0,64,64,64,126,0,0,0,36,102,255,102,36,0,0,0,16,56,124,254,254,0,0,0,254,254,124,56,16,0,0,0,0,0,0,0,0,0,0,16,56,56,16,
                  16,0,16,0,36,36,36,0,0,0,0,0,36,36,126,36,126,36,36,0,24,62,64,60,2,124,24,0,0,98,100,8,16,38,70,0,48,72,48,86,136,136,118,
                  0,16,16,32,0,0,0,0,0,16,32,64,64,64,32,16,0,32,16,8,8,8,16,32,0,0,68,56,254,56,68,0,0,0,16,16,124,16,16,0,0,0,0,0,0,0,16,
                  16,32,0,0,0,126,0,0,0,0,0,0,0,0,0,16,16,0,0,2,4,8,16,32,64,0,60,66,70,74,82,98,60,0,16,48,80,16,16,16,124,0,60,66,2,12,48,
                  66,126,0,60,66,2,28,2,66,60,0,8,24,40,72,254,8,28,0,126,64,124,2,2,66,60,0,28,32,64,124,66,66,60,0,126,66,4,8,16,16,16,0,
                  60,66,66,60,66,66,60,0,60,66,66,62,2,4,56,0,0,16,16,0,0,16,16,0,0,16,16,0,0,16,16,32,8,16,32,64,32,16,8,0,0,0,126,0,0,126,
                  0,0,16,8,4,2,4,8,16,0,60,66,2,4,8,0,8,0,60,66,94,82,94,64,60,0,24,36,66,66,126,66,66,0,124,34,34,60,34,34,124,0,28,34,64,
                  64,64,34,28,0,120,36,34,34,34,36,120,0,126,34,40,56,40,34,126,0,126,34,40,56,40,32,112,0,28,34,64,64,78,34,30,0,66,66,66,
                  126,66,66,66,0,56,16,16,16,16,16,56,0,14,4,4,4,68,68,56,0,98,36,40,48,40,36,99,0,112,32,32,32,32,34,126,0,99,85,73,65,65,
                  65,65,0,98,82,74,70,66,66,66,0,24,36,66,66,66,36,24,0,124,34,34,60,32,32,112,0,60,66,66,66,74,60,3,0,124,34,34,60,40,36,114,
                  0,60,66,64,60,2,66,60,0,127,73,8,8,8,8,28,0,66,66,66,66,66,66,60,0,65,65,65,65,34,20,8,0,65,65,65,73,73,73,54,0,65,34,20,
                  8,20,34,65,0,65,34,20,8,8,8,28,0,127,66,4,8,16,33,127,0,120,64,64,64,64,64,120,0,128,64,32,16,8,4,2,0,120,8,8,8,8,8,120,0,
                  16,40,68,130,0,0,0,0,0,0,0,0,0,0,0,255,16,16,8,0,0,0,0,0,0,0,60,2,62,66,63,0,96,32,32,46,49,49,46,0,0,0,60,66,64,66,60,0,
                  6,2,2,58,70,70,59,0,0,0,60,66,126,64,60,0,12,18,16,56,16,16,56,0,0,0,61,66,66,62,2,124,96,32,44,50,34,34,98,0,16,0,48,16,
                  16,16,56,0,2,0,6,2,2,66,66,60,96,32,36,40,48,40,38,0,48,16,16,16,16,16,56,0,0,0,118,73,73,73,73,0,0,0,92,98,66,66,66,0,0,
                  0,60,66,66,66,60,0,0,0,108,50,50,44,32,112,0,0,54,76,76,52,4,14,0,0,108,50,34,32,112,0,0,0,62,64,60,2,124,0,16,16,124,16,
                  16,18,12,0,0,0,66,66,66,70,58,0,0,0,65,65,34,20,8,0,0,0,65,73,73,73,54,0,0,0,68,40,16,40,68,0,0,0,66,66,66,62,2,124,0,0,124,
                  8,16,32,124,0,12,16,16,96,16,16,12,0,16,16,16,0,16,16,16,0,48,8,8,6,8,8,48,0,50,76,0,0,0,0,0,0,0,8,20,34,65,65,127,0,60,66,
                  64,66,60,12,2,60,0,68,0,68,68,68,62,0,12,0,60,66,126,64,60,0,60,66,56,4,60,68,62,0,66,0,56,4,60,68,62,0,48,0,56,4,60,68,62,
                  0,16,0,56,4,60,68,62,0,0,0,60,64,64,60,6,28,60,66,60,66,126,64,60,0,66,0,60,66,126,64,60,0,48,0,60,66,126,64,60,0,36,0,24,
                  8,8,8,28,0,124,130,48,16,16,16,56,0,48,0,24,8,8,8,28,0,66,24,36,66,126,66,66,0,24,24,0,60,66,126,66,0,12,0,124,32,56,32,124,
                  0,0,0,51,12,63,68,59,0,31,36,68,127,68,68,71,0,24,36,0,60,66,66,60,0,0,66,0,60,66,66,60,0,32,16,0,60,66,66,60,0,24,36,0,66,
                  66,66,60,0,32,16,0,66,66,66,60,0,0,66,0,66,66,62,2,60,66,24,36,66,66,36,24,0,66,0,66,66,66,66,60,0,8,8,62,64,64,62,8,8,24,
                  36,32,112,32,66,124,0,68,40,124,16,124,16,16,0,248,76,120,68,79,68,69,230,28,18,16,124,16,16,144,96,12,0,56,4,60,68,62,0,
                  12,0,24,8,8,8,28,0,4,8,0,60,66,66,60,0,0,4,8,66,66,66,60,0,50,76,0,124,66,66,66,0,52,76,0,98,82,74,70,0,60,68,68,62,0,126,
                  0,0,56,68,68,56,0,124,0,0,16,0,16,32,64,66,60,0,0,0,0,126,64,64,0,0,0,0,0,126,2,2,0,0,66,196,72,246,41,67,140,31,66,196,74,
                  246,42,95,130,2,0,16,0,16,16,16,16,0,0,18,36,72,36,18,0,0,0,72,36,18,36,72,0,0,34,136,34,136,34,136,34,136,85,170,85,170,
                  85,170,85,170,219,119,219,238,219,119,219,238,16,16,16,16,16,16,16,16,16,16,16,16,240,16,16,16,16,16,240,16,240,16,16,16,
                  20,20,20,20,244,20,20,20,0,0,0,0,252,20,20,20,0,0,240,16,240,16,16,16,20,20,244,4,244,20,20,20,20,20,20,20,20,20,20,20,0,
                  0,252,4,244,20,20,20,20,20,244,4,252,0,0,0,20,20,20,20,252,0,0,0,16,16,240,16,240,0,0,0,0,0,0,0,240,16,16,16,16,16,16,16,
                  31,0,0,0,16,16,16,16,255,0,0,0,0,0,0,0,255,16,16,16,16,16,16,16,31,16,16,16,0,0,0,0,255,0,0,0,16,16,16,16,255,16,16,16,16,
                  16,31,16,31,16,16,16,20,20,20,20,23,20,20,20,20,20,23,16,31,0,0,0,0,0,31,16,23,20,20,20,20,20,247,0,255,0,0,0,0,0,255,0,247,
                  20,20,20,20,20,23,16,23,20,20,20,0,0,255,0,255,0,0,0,20,20,247,0,247,20,20,20,16,16,255,0,255,0,0,0,20,20,20,20,255,0,0,0,
                  0,0,255,0,255,16,16,16,0,0,0,0,255,20,20,20,20,20,20,20,31,0,0,0,16,16,31,16,31,0,0,0,0,0,31,16,31,16,16,16,0,0,0,0,31,20,
                  20,20,20,20,20,20,255,20,20,20,16,16,255,16,255,16,16,16,16,16,16,16,240,0,0,0,0,0,0,0,31,16,16,16,255,255,255,255,255,255,
                  255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,0,49,74,
                  68,74,49,0,0,60,66,124,66,124,64,64,0,126,66,64,64,64,64,0,0,63,84,20,20,20,20,0,126,66,32,24,32,66,126,0,0,0,62,72,72,72,
                  48,0,0,68,68,68,122,64,64,128,0,51,76,8,8,8,8,0,124,16,56,68,68,56,16,124,24,36,66,126,66,36,24,0,24,36,66,66,36,36,102,0,
                  28,32,24,60,66,66,60,0,0,98,149,137,149,98,0,0,2,4,60,74,82,60,64,128,12,16,32,60,32,16,12,0,60,66,66,66,66,66,66,0,0,126,
                  0,126,0,126,0,0,16,16,124,16,16,0,124,0,16,8,4,8,16,0,126,0,8,16,32,16,8,0,126,0,12,18,18,16,16,16,16,16,16,16,16,16,16,144,
                  144,96,24,24,0,126,0,24,24,0,0,50,76,0,50,76,0,0,48,72,72,48,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,8,8,8,8,200,40,
                  24,120,68,68,68,68,0,0,0,48,72,16,32,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,
                  129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,214,16,56,
                  16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
                  153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,
                  24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,
                  102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,
                  126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,
                  102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,
                  108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,
                  0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,
                  0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,
                  12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,
                  120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,
                  48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,
                  120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,
                  0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
                  48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,
                  198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
                  252,102,102,124,108,102,230,0,120,204,96,48,24,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,
                  204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,
                  50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,
                  255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,
                  118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,
                  48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
                  0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,
                  96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,
                  254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,
                  24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204,
                  0,204,204,204,126,0,28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,
                  0,48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204,
                  252,192,120,0,204,0,112,48,48,48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48,
                  48,0,120,204,252,204,0,28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204,
                  120,0,0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204,
                  204,124,12,248,195,24,60,102,102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252,
                  0,204,204,120,252,48,252,48,48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112,
                  48,48,48,120,0,0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60,
                  108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204,
                  222,51,102,204,15,195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34,
                  136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24,
                  248,24,24,24,24,24,248,24,248,24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6,
                  246,54,54,54,54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248,
                  0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0,
                  0,255,0,0,0,24,24,24,24,255,24,24,24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,
                  54,54,54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24,
                  24,255,0,255,0,0,0,54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31,
                  0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
                  0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,
                  15,15,15,255,255,255,255,0,0,0,0,0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254,
                  108,108,108,108,108,0,252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24,
                  24,0,252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0,
                  0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252,
                  0,0,48,48,252,48,48,0,252,0,96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,
                  112,48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236,
                  108,60,28,120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0] 
                  
                • ibm-mda.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoMDA" screenwidth="720" screenheight="350" scale="true" charset="/devices/pc/video/ibm/mda/ibm-mda.json" pos="center" padding="8px">
                  	<menu>
                  		<title>Monochrome Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  		</control>
                  	</menu>
                  </video>
                  
              • vga
                • ibm-vga-lock.xml
                  <?xml version="1.0" encoding="UTF-8"?>
                  <video id="videoVGA" model="vga" screenwidth="640" screenheight="480" scale="true" autolock="true" pos="center" padding="8px">
                  	<menu>
                  		<title>VGA Color Display</title>
                  		<control type="container" pos="right">
                  			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                  			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
                  			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                  			<control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
                  		</control>
                  	</menu>
                  </video>
                  
                • ibm-vga.json
                  [85,170,48,235,54,55,52,48,48,56,50,50,50,53,53,52,32,40,67,41,67,79,80,89,82,73,71,72,84,32,73,66,77,32,67,111,114,112,46,
                  32,49,57,56,52,44,32,49,57,56,54,32,49,48,47,50,55,47,56,54,85,46,142,30,28,7,184,1,18,179,50,205,16,250,199,6,64,0,225,6,
                  140,14,66,0,199,6,180,1,228,6,140,14,182,1,199,6,8,1,101,240,199,6,10,1,0,240,199,6,168,4,198,5,140,14,170,4,199,6,124,0,
                  141,59,140,14,126,0,199,6,12,1,141,55,140,14,14,1,251,198,6,137,4,17,198,6,135,4,96,232,107,0,250,186,232,70,184,22,0,239,
                  186,2,1,184,1,0,239,186,232,70,184,14,0,239,186,232,74,51,192,239,251,14,7,191,180,3,187,2,22,246,6,135,4,2,117,6,191,212,
                  3,187,66,22,137,62,99,4,232,89,16,50,192,238,232,115,4,51,237,232,12,1,232,250,1,232,133,2,246,6,137,4,1,117,3,232,215,3,
                  232,124,4,36,240,162,136,4,232,87,0,232,64,2,131,253,2,114,2,91,203,93,203,183,0,186,204,3,236,36,254,186,194,3,238,178,212,
                  232,165,1,117,11,176,3,183,32,128,14,135,4,2,235,26,186,204,3,236,12,1,186,194,3,238,178,180,232,137,1,117,27,176,7,183,48,
                  128,38,135,4,253,128,38,137,4,254,128,38,16,4,207,8,62,16,4,180,0,205,66,195,246,6,137,4,1,116,24,128,14,135,4,2,246,6,135,
                  4,8,117,12,246,6,137,4,4,117,5,128,38,135,4,253,246,6,135,4,2,117,7,187,9,32,176,3,235,5,187,11,48,176,7,128,38,16,4,207,
                  8,62,16,4,128,38,136,4,240,8,30,136,4,138,30,135,4,128,38,135,4,247,138,62,137,4,128,38,137,4,254,180,0,205,16,128,231,1,
                  8,62,137,4,246,195,8,116,51,246,6,137,4,1,117,44,176,7,187,3,48,246,6,135,4,2,116,5,176,3,187,5,32,128,38,16,4,207,8,62,16,
                  4,128,38,136,4,240,8,30,136,4,128,14,135,4,8,180,0,205,16,195,139,22,99,4,128,194,6,187,1,0,176,48,230,67,176,0,230,64,180,
                  2,51,201,236,168,8,116,5,226,249,233,165,0,250,236,168,8,117,5,226,249,233,154,0,254,204,117,229,176,0,230,64,51,201,236,
                  168,9,224,251,227,24,185,255,255,236,168,1,225,251,227,14,236,168,8,117,11,168,1,224,247,227,3,67,117,232,235,111,176,0,230,
                  67,228,64,138,224,235,0,228,64,134,224,251,129,251,154,1,119,90,129,251,134,1,114,84,61,140,110,114,79,61,29,135,119,74,252,
                  184,0,160,142,192,51,255,185,40,0,184,255,255,243,171,183,15,179,192,236,134,218,176,50,238,138,199,238,134,211,51,201,236,
                  168,48,117,4,226,249,235,32,51,201,236,168,48,116,4,226,249,235,21,128,199,16,128,255,63,117,215,176,54,230,67,42,192,230,
                  64,235,0,230,64,195,251,186,3,1,232,223,2,189,2,0,235,231,176,15,238,179,255,66,236,80,176,26,238,235,0,236,60,26,117,8,176,
                  37,238,235,0,236,138,216,88,238,128,251,37,195,184,0,160,142,192,187,0,128,190,0,0,232,12,0,116,9,186,3,1,232,164,2,189,2,
                  0,195,252,184,170,170,139,203,51,255,243,171,139,203,51,255,243,175,117,15,184,85,85,139,203,51,255,243,171,139,203,51,255,
                  243,175,156,139,198,139,203,51,255,243,171,157,195,184,0,198,142,192,190,212,3,38,138,36,38,198,4,40,186,212,3,30,31,236,
                  38,136,36,60,40,195,183,7,246,6,135,4,2,117,2,183,8,179,0,246,6,137,4,1,117,18,179,1,246,6,135,4,2,116,9,179,2,232,195,255,
                  117,2,179,6,232,252,6,162,138,4,195,180,26,232,125,0,232,142,0,117,10,180,37,232,115,0,232,132,0,116,9,186,3,1,232,18,2,189,
                  2,0,186,198,3,176,0,238,180,0,232,90,0,180,0,232,233,14,190,84,4,185,1,0,232,114,0,116,32,190,80,4,185,1,0,232,103,0,116,
                  37,128,14,135,4,8,128,14,137,4,6,190,88,4,185,5,0,232,82,0,235,30,128,38,137,4,251,190,40,4,185,5,0,232,66,0,235,14,128,14,
                  137,4,6,190,60,4,185,5,0,232,50,0,116,9,186,3,1,232,174,1,131,197,1,195,186,200,3,176,0,238,185,0,3,186,201,3,138,196,238,
                  235,0,226,251,195,186,199,3,238,185,0,3,186,201,3,236,58,196,117,2,226,249,195,46,138,4,46,138,100,1,46,138,92,2,81,232,81,
                  0,89,131,198,4,46,58,68,255,117,2,226,229,195,20,20,20,16,45,20,20,0,20,45,20,0,20,20,45,0,45,45,45,0,4,18,4,16,30,18,4,0,
                  4,45,4,0,4,22,21,0,0,0,0,16,4,18,4,16,18,18,18,16,4,4,4,16,16,4,4,0,4,16,4,0,4,4,16,0,16,16,16,0,80,139,22,99,4,128,194,6,
                  138,250,51,201,250,236,168,8,224,251,51,201,236,168,8,225,251,176,0,186,200,3,238,88,186,201,3,238,235,0,138,196,238,235,
                  0,138,195,238,138,215,51,201,236,168,1,224,251,178,194,235,0,236,36,16,80,176,0,186,200,3,238,235,0,186,201,3,238,235,0,238,
                  235,0,238,251,88,195,191,0,184,186,216,3,187,0,32,246,6,135,4,2,117,9,191,0,176,186,184,3,187,0,8,142,199,160,101,4,36,247,
                  238,190,32,7,232,9,254,116,9,186,2,1,232,161,0,189,2,0,184,32,112,51,255,185,40,0,243,171,128,194,2,180,8,128,250,218,116,
                  2,180,1,51,201,236,34,196,117,4,226,249,235,9,43,201,236,34,196,116,11,226,249,186,2,1,232,110,0,189,2,0,177,3,210,236,117,
                  221,186,216,3,185,40,0,246,6,135,4,2,117,3,186,184,3,184,32,7,51,255,243,171,160,101,4,238,195,236,185,20,0,178,192,180,0,
                  187,101,22,138,196,238,254,196,46,138,7,238,67,226,244,176,20,238,50,192,238,176,32,238,195,139,22,99,4,128,194,6,179,194,
                  176,1,238,235,0,134,218,236,36,96,208,232,138,224,134,211,176,2,238,235,0,134,218,236,36,96,208,224,10,196,195,156,250,11,
                  237,116,2,51,210,10,246,116,20,179,5,185,51,5,232,226,0,51,201,226,254,254,206,117,240,51,201,226,254,10,210,116,16,179,1,
                  185,51,5,232,202,0,51,201,226,254,254,202,117,240,157,195,66,19,0,192,0,0,0,0,0,0,0,0,0,0,0,0,226,5,0,192,0,0,0,0,0,0,0,0,
                  26,0,211,10,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,30,80,83,81,82,46,142,30,28,7,128,62,0,5,1,116,99,198,6,0,5,
                  1,180,15,205,16,138,204,138,46,132,4,254,197,232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,
                  176,32,82,51,210,50,228,205,23,90,246,196,41,117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,
                  208,90,180,2,205,16,198,6,0,5,0,235,10,90,180,2,205,16,198,6,0,5,255,90,89,91,88,31,207,51,210,50,228,176,13,205,23,50,228,
                  176,10,205,23,195,176,182,230,67,138,193,230,66,138,197,230,66,228,97,138,224,12,3,230,97,51,201,226,254,254,203,117,248,
                  138,196,230,97,195,130,26,152,30,47,31,120,31,143,31,168,31,211,31,167,34,253,36,37,39,138,41,59,42,69,50,3,51,254,51,20,
                  8,180,43,89,53,46,8,163,52,19,7,19,7,19,7,19,7,19,7,19,7,45,10,252,10,161,12,205,109,207,251,252,85,6,30,82,81,83,86,87,80,
                  138,196,152,209,224,139,240,88,131,254,58,115,10,46,142,30,28,7,46,255,164,167,6,95,94,91,89,90,31,7,93,205,66,207,235,0,
                  95,94,91,89,90,31,7,93,207,0,0,0,160,0,184,30,46,142,30,28,7,139,22,99,4,128,194,6,31,195,46,142,30,28,7,196,30,168,4,38,
                  196,31,195,86,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,129,254,40,0,115,45,46,255,
                  164,94,7,134,7,134,7,134,7,134,7,174,7,174,7,174,7,134,7,166,7,174,7,174,7,174,7,174,7,174,7,174,7,170,7,170,7,162,7,162,
                  7,174,7,246,6,137,4,16,117,25,160,136,4,36,15,60,3,116,20,60,9,116,16,128,252,7,116,11,235,13,144,176,3,235,10,176,2,235,
                  6,176,1,235,2,176,0,94,195,246,6,135,4,128,117,57,186,0,184,160,73,4,60,6,118,10,186,0,176,60,7,116,3,186,0,160,142,194,187,
                  32,7,60,4,114,6,60,7,116,2,43,219,139,14,76,4,227,16,185,0,128,128,254,160,116,2,181,64,139,195,43,255,243,171,195,139,243,
                  131,198,35,30,6,196,62,168,4,38,196,125,4,140,192,11,199,116,9,31,30,185,16,0,243,164,70,164,7,31,195,138,38,74,4,138,62,
                  98,4,160,135,4,36,128,10,6,73,4,95,94,89,89,90,31,7,93,207,128,251,16,116,61,128,251,32,116,113,128,251,48,117,3,235,121,
                  144,128,251,49,117,3,233,13,1,128,251,50,117,3,233,27,1,128,251,51,117,3,233,40,1,128,251,52,117,3,233,54,1,128,251,53,117,
                  3,233,73,1,128,251,54,117,55,233,171,1,138,62,135,4,128,231,2,208,239,160,135,4,36,96,208,232,208,232,208,232,208,232,208,
                  232,138,216,138,14,136,4,138,233,128,225,15,208,237,208,237,208,237,208,237,95,94,90,90,90,31,7,93,207,50,192,233,106,254,
                  250,199,6,20,0,252,5,140,14,22,0,251,233,91,254,246,6,135,4,8,117,229,246,6,137,4,1,117,78,60,0,117,15,246,6,135,4,2,117,
                  211,176,8,187,0,239,235,40,144,254,200,117,17,176,9,187,0,239,246,6,135,4,2,116,23,176,11,235,19,144,254,200,117,178,176,
                  9,187,16,239,246,6,135,4,2,116,2,176,11,32,62,137,4,8,30,137,4,128,38,136,4,240,8,6,136,4,235,61,144,60,0,117,16,176,8,187,
                  128,239,246,6,135,4,2,116,220,176,11,235,216,254,200,117,16,176,9,187,0,111,246,6,135,4,2,116,200,176,11,235,196,254,200,
                  117,143,176,9,187,16,111,246,6,135,4,2,116,180,176,11,235,176,176,18,233,190,253,60,1,117,7,128,14,137,4,8,235,240,60,0,117,
                  72,128,38,137,4,247,235,229,186,232,70,60,0,117,5,176,14,238,235,217,60,1,117,49,50,192,238,235,208,60,1,117,7,128,38,137,
                  4,253,235,197,60,0,117,29,128,14,137,4,2,235,186,60,1,117,7,128,14,135,4,1,235,175,60,0,117,7,128,38,135,4,254,235,164,50,
                  192,233,98,253,10,192,117,23,246,6,137,4,64,117,240,12,128,205,66,246,6,137,4,64,116,229,232,43,0,235,132,60,1,116,220,246,
                  6,137,4,64,116,213,60,2,117,6,232,23,0,233,111,255,60,3,117,199,250,139,218,232,246,3,186,232,70,176,14,238,251,233,91,255,
                  250,139,218,232,161,3,250,196,30,8,1,137,30,180,1,140,6,182,1,199,6,8,1,228,6,140,14,10,1,251,186,232,70,176,6,238,251,195,
                  180,32,60,1,116,6,180,0,60,0,117,3,232,80,8,233,35,255,60,0,116,6,60,1,116,22,235,28,160,138,4,232,89,0,232,118,0,95,94,89,
                  89,90,31,7,93,176,26,207,232,14,0,162,138,4,176,26,95,94,91,89,90,31,7,93,207,139,211,134,251,139,195,232,34,0,187,0,0,38,
                  138,12,50,237,131,198,4,38,59,0,116,13,38,59,16,116,8,131,195,2,226,241,176,255,195,208,235,138,195,195,196,54,168,4,38,196,
                  180,16,0,38,196,180,2,0,195,232,238,255,38,58,4,114,4,187,255,255,195,131,198,4,50,228,209,224,3,240,38,139,28,128,251,0,
                  117,2,134,223,195,128,255,0,116,23,160,16,4,36,48,60,48,116,7,246,195,1,117,7,235,7,246,195,1,117,2,134,223,195,16,1,8,0,
                  0,0,0,1,0,2,2,1,0,4,4,1,0,5,2,5,0,6,1,6,5,6,0,8,1,8,0,7,2,7,6,7,50,192,233,23,252,11,219,117,247,38,199,5,145,12,71,71,38,
                  140,13,71,71,190,73,4,185,30,0,243,164,190,132,4,138,4,254,192,38,136,5,70,71,185,2,0,243,164,160,138,4,6,232,106,255,7,38,
                  136,29,71,38,136,61,160,73,4,50,228,139,240,209,230,129,198,85,12,46,139,28,71,38,137,29,71,141,54,125,12,3,240,46,138,28,
                  71,38,136,29,134,196,232,227,251,71,38,136,5,186,196,3,176,3,238,66,236,138,224,80,128,228,16,208,236,208,236,36,3,10,196,
                  71,38,136,5,88,128,228,32,208,236,208,236,208,236,36,12,208,232,208,232,10,196,71,38,136,5,176,16,232,142,251,232,180,31,
                  232,212,31,128,228,8,208,228,208,228,160,135,4,36,1,52,1,177,4,210,224,10,196,138,38,137,4,128,228,15,10,196,71,38,136,5,
                  50,192,71,38,136,5,71,38,136,5,71,38,136,5,160,135,4,36,96,177,5,210,232,71,38,136,5,6,50,201,196,30,168,4,6,38,196,119,4,
                  140,192,11,198,116,3,128,201,2,7,6,38,196,119,8,140,192,11,198,116,3,128,201,4,7,6,38,196,119,12,140,192,11,198,116,3,128,
                  201,8,7,38,196,119,16,140,192,11,198,116,47,6,139,222,38,196,119,6,140,192,11,198,116,3,128,201,1,7,6,38,196,119,10,140,192,
                  11,198,116,3,128,201,16,7,38,196,119,2,140,192,140,203,59,195,116,3,128,201,32,7,71,38,136,13,71,185,13,0,50,192,243,170,
                  176,27,233,190,250,16,0,16,0,16,0,16,0,4,0,4,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,0,16,0,2,0,16,0,0,1,8,8,8,8,1,1,1,
                  8,0,0,0,0,0,8,4,2,2,1,1,1,255,224,15,0,0,0,0,7,2,8,255,14,0,0,63,0,60,0,117,2,235,18,60,1,117,2,235,88,60,2,117,79,233,169,
                  0,176,28,233,90,250,184,32,0,51,210,247,193,7,0,116,60,247,193,1,0,116,6,5,70,0,131,210,0,247,193,2,0,116,6,5,58,0,131,210,
                  0,247,193,4,0,116,6,5,3,3,131,210,0,187,64,0,247,243,131,250,0,116,1,64,139,216,95,94,88,176,28,89,90,31,7,93,207,176,0,233,
                  14,250,139,211,131,194,32,247,193,1,0,116,28,81,83,38,137,23,139,218,131,194,70,82,139,62,99,4,30,46,142,30,30,7,232,4,2,
                  31,90,91,89,247,193,2,0,116,18,81,83,38,137,87,2,139,218,131,194,58,82,232,91,0,90,91,89,247,193,4,0,116,182,38,137,87,4,
                  139,218,139,62,99,4,232,237,1,232,20,30,233,87,255,247,193,1,0,116,17,81,83,38,139,31,30,46,142,30,30,7,232,76,3,31,91,89,
                  247,193,2,0,116,11,81,83,38,139,95,2,232,94,0,91,89,247,193,4,0,116,14,38,139,95,4,139,62,99,4,232,79,3,233,27,255,233,100,
                  255,6,139,251,160,16,4,36,48,38,136,5,71,141,54,73,4,185,30,0,243,164,141,54,132,4,185,7,0,243,164,141,54,168,4,250,232,110,
                  0,141,54,20,0,232,103,0,141,54,116,0,232,96,0,141,54,124,0,232,89,0,141,54,12,1,232,82,0,251,7,195,38,138,7,128,38,16,4,207,
                  8,6,16,4,6,140,216,6,31,139,243,142,192,70,141,62,73,4,185,30,0,243,164,141,62,132,4,185,7,0,243,164,141,62,168,4,250,232,
                  31,0,141,62,20,0,232,24,0,141,62,116,0,232,17,0,141,62,124,0,232,10,0,141,62,12,1,232,3,0,251,7,195,185,4,0,243,164,195,85,
                  80,80,189,184,18,37,15,0,209,224,3,232,46,139,110,0,88,134,196,50,228,209,224,3,232,46,139,110,0,129,237,66,19,3,221,88,93,
                  195,60,0,116,19,60,2,116,22,189,141,63,183,14,128,252,7,117,20,128,203,128,235,15,189,141,55,183,8,235,8,189,186,78,183,16,
                  128,203,128,185,0,1,186,0,0,14,31,195,0,64,128,192,32,96,160,224,81,177,5,211,226,89,142,192,139,250,139,243,129,230,7,0,
                  46,138,180,140,14,50,210,3,250,139,245,139,234,138,199,42,228,227,13,81,139,200,243,164,43,248,131,199,32,89,226,243,246,
                  195,128,116,30,138,20,10,210,116,24,50,246,81,177,5,211,226,89,3,213,139,250,70,139,200,243,164,43,248,131,199,32,235,226,
                  195,86,134,196,50,228,139,240,46,138,132,7,15,139,240,209,230,46,139,132,255,14,94,195,255,255,141,55,141,63,186,78,0,0,0,
                  0,1,1,1,0,3,1,1,1,1,1,1,2,2,3,3,1,80,86,134,196,50,228,139,240,46,128,188,7,15,0,94,88,195,232,199,0,232,87,0,232,235,0,139,
                  215,128,194,6,131,195,35,189,1,0,232,249,31,195,232,12,0,185,0,1,51,255,131,195,3,232,166,31,195,139,215,128,194,6,236,178,
                  192,176,20,156,250,238,66,236,157,38,136,71,65,186,199,3,236,36,1,38,136,7,134,196,186,200,3,236,10,228,116,2,254,200,38,
                  136,71,1,186,198,3,236,38,136,71,2,195,83,186,196,3,131,195,5,185,4,0,176,1,232,18,1,91,178,204,236,38,136,71,9,178,202,236,
                  38,136,71,4,139,215,83,131,195,10,185,25,0,50,192,232,245,0,91,139,215,128,194,6,156,250,236,82,178,192,176,16,238,66,236,
                  38,136,71,51,90,236,82,178,192,176,18,238,66,236,38,136,71,53,90,236,178,192,176,19,238,66,236,157,38,136,71,54,83,178,206,
                  131,195,55,185,9,0,50,192,232,182,0,91,195,38,137,127,64,186,196,3,236,38,136,7,186,212,3,236,38,136,71,1,186,206,3,236,38,
                  136,71,2,139,215,128,194,6,236,186,192,3,236,38,136,71,3,195,186,196,3,176,2,156,250,238,66,236,74,80,184,2,15,239,176,4,
                  238,66,236,74,80,184,4,7,239,178,206,176,6,238,66,236,74,80,184,6,4,239,176,5,238,66,236,74,80,184,5,1,239,176,4,238,66,236,
                  74,80,190,255,255,198,4,0,184,4,0,239,138,4,38,136,71,66,184,4,1,239,138,4,38,136,71,67,184,4,2,239,138,4,38,136,71,68,184,
                  4,3,239,138,4,38,136,71,69,88,134,196,176,4,239,88,134,196,176,5,239,88,134,196,176,6,239,178,196,88,134,196,176,4,239,88,
                  134,196,176,2,239,157,195,156,250,238,66,80,236,38,136,7,88,157,74,254,192,67,73,117,238,195,232,252,0,38,139,127,64,232,
                  96,0,139,215,128,194,6,38,138,71,4,238,83,131,195,35,185,16,0,51,255,189,1,0,232,49,30,91,232,176,0,195,38,138,71,2,186,198,
                  3,238,87,185,0,1,51,255,83,131,195,3,186,0,0,232,214,29,91,95,232,1,0,195,139,215,128,194,6,236,178,192,38,138,39,176,20,
                  239,38,138,71,1,38,138,39,10,228,116,6,186,199,3,238,235,4,186,200,3,238,195,186,196,3,184,0,1,156,250,239,83,131,195,5,185,
                  4,0,176,1,232,197,0,91,178,194,38,138,71,9,238,178,196,184,0,3,239,157,139,215,176,17,50,228,239,83,131,195,10,185,25,0,50,
                  192,232,163,0,91,139,215,128,194,6,82,156,250,236,178,192,176,16,238,38,138,71,51,238,176,18,238,38,138,71,53,238,176,19,
                  238,38,138,71,54,238,157,83,178,206,131,195,55,185,9,0,50,192,232,112,0,91,90,195,186,196,3,38,138,7,238,186,212,3,38,138,
                  71,1,238,186,206,3,38,138,71,2,238,38,139,87,64,128,194,6,236,186,192,3,38,138,71,3,238,195,186,196,3,184,4,7,239,178,206,
                  184,6,4,239,184,5,0,239,190,255,255,178,196,184,2,0,239,38,138,71,66,136,4,184,2,1,239,38,138,71,67,136,4,184,2,2,239,38,
                  138,71,68,136,4,184,2,4,239,38,138,71,69,136,4,184,2,15,239,138,4,195,38,138,39,239,254,192,67,73,117,246,195,80,82,186,196,
                  3,184,2,4,239,184,4,7,239,178,206,184,5,0,239,184,6,4,239,184,4,2,239,139,209,128,226,240,128,202,10,236,178,192,176,0,238,
                  90,88,195,80,82,186,196,3,184,2,3,239,184,4,3,239,178,206,184,5,16,239,176,6,180,10,129,249,180,3,116,2,180,14,239,184,4,
                  0,239,90,88,195,186,196,3,176,3,138,227,239,195,38,138,0,60,255,116,7,58,196,116,5,70,235,242,249,195,248,195,186,196,3,176,
                  1,238,66,236,80,37,223,32,10,224,74,176,1,239,88,134,196,195,1,0,1,0,1,0,1,0,2,0,2,0,2,0,1,0,3,0,0,0,0,0,0,0,0,0,3,0,3,0,
                  3,0,3,0,3,0,3,0,4,0,192,18,232,18,10,19,28,19,66,19,130,19,194,19,2,20,66,20,130,20,194,20,0,0,0,0,130,21,194,21,2,22,66,
                  22,130,22,194,22,0,0,0,0,0,0,0,0,66,26,2,24,66,24,130,24,194,24,0,0,0,0,0,0,2,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,23,194,23,
                  2,25,2,25,66,25,66,25,0,0,0,0,0,0,130,25,66,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,25,
                  2,26,40,24,8,0,8,9,3,0,2,99,45,39,40,144,43,160,191,31,0,199,6,7,0,0,0,0,156,142,143,20,31,150,185,163,255,0,1,2,3,4,5,6,
                  7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,8,0,8,9,3,0,2,99,45,39,40,144,43,160,191,31,0,199,6,7,0,0,
                  0,0,156,142,143,20,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,8,0,16,
                  1,3,0,2,99,95,79,80,130,85,129,191,31,0,199,6,7,0,0,0,0,156,142,143,40,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20,
                  21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,2,99,95,79,80,130,85,129,191,31,0,199,6,7,0,0,0,0,156,142,143,
                  40,31,150,185,163,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,8,0,64,9,3,0,2,99,45,39,
                  40,144,43,128,191,31,0,193,0,0,0,0,0,0,156,142,143,20,0,150,185,162,255,0,19,21,23,2,4,6,7,16,17,18,19,20,21,22,23,1,0,3,
                  0,0,0,0,0,0,48,15,0,255,40,24,8,0,64,9,3,0,2,99,45,39,40,144,43,128,191,31,0,193,0,0,0,0,0,0,156,142,143,20,0,150,185,162,
                  255,0,19,21,23,2,4,6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,0,0,0,48,15,0,255,80,24,8,0,64,1,1,0,6,99,95,79,80,130,84,128,
                  191,31,0,193,0,0,0,0,0,0,156,142,143,40,0,150,185,194,255,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,1,0,1,0,0,0,0,0,
                  0,0,13,0,255,80,24,14,0,16,0,3,0,3,166,95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133,93,40,13,99,186,163,255,0,8,
                  8,8,8,8,8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,0,0,0,16,10,0,255,80,24,16,0,125,33,15,0,6,99,95,79,80,130,85,129,191,31,
                  0,64,0,0,0,0,0,0,156,142,143,40,31,150,185,227,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,40,24,8,0,64,0,0,0,3,35,55,39,45,55,49,21,4,17,0,71,6,7,0,0,0,0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,6,7,16,
                  17,18,19,20,21,22,23,8,0,15,0,0,0,0,0,0,16,14,0,255,80,0,0,0,0,41,15,0,6,98,95,79,80,130,85,129,191,31,0,64,0,0,0,0,0,0,156,
                  142,143,40,31,150,185,227,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,1,0,15,0,0,0,15,0,0,8,5,15,255,80,0,0,0,0,41,15,0,6,99,95,
                  79,80,130,85,129,191,31,0,64,0,0,0,0,0,0,156,142,143,40,31,150,185,227,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,1,0,15,0,0,0,
                  15,0,0,8,5,15,255,40,24,8,0,32,9,15,0,6,99,45,39,40,144,43,128,191,31,0,192,0,0,0,0,0,0,156,142,143,20,0,150,185,227,255,
                  0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,0,0,0,0,5,15,255,80,24,8,0,64,1,15,0,6,99,95,79,80,130,84,128,191,31,
                  0,192,0,0,0,0,0,0,156,142,143,40,0,150,185,227,255,0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,0,0,0,0,5,15,255,
                  80,24,14,0,128,5,15,0,0,162,96,79,86,26,80,224,112,31,0,0,0,0,0,0,0,0,94,46,93,20,0,94,110,139,255,0,8,0,0,24,24,0,0,0,8,
                  0,0,0,24,0,0,11,0,5,0,0,0,0,0,0,16,7,15,255,80,24,14,0,128,5,15,0,0,167,91,79,83,23,80,186,108,31,0,0,0,0,0,0,0,0,94,43,93,
                  20,15,95,10,139,255,0,1,0,0,4,7,0,0,0,1,0,0,4,7,0,0,1,0,5,0,0,0,0,0,0,16,7,15,255,80,24,14,0,128,1,15,0,6,162,95,79,80,130,
                  84,128,191,31,0,64,0,0,0,0,0,0,131,133,93,40,15,99,186,227,255,0,8,0,0,24,24,0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,0,0,0,0,5,
                  5,255,80,24,14,0,128,1,15,0,6,163,95,79,80,130,84,128,191,31,0,64,0,0,0,0,0,0,131,133,93,40,15,99,186,227,255,0,1,2,3,4,5,
                  20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255,40,24,14,0,8,9,3,0,2,163,45,39,40,144,43,160,191,31,0,77,11,12,
                  0,0,0,0,131,133,93,20,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,40,24,14,
                  0,8,9,3,0,2,163,45,39,40,144,43,160,191,31,0,77,11,12,0,0,0,0,131,133,93,20,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,
                  60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,2,163,95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133,
                  93,40,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,2,163,
                  95,79,80,130,85,129,191,31,0,77,11,12,0,0,0,0,131,133,93,40,31,99,186,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,8,
                  0,15,0,0,0,0,0,0,16,14,0,255,40,24,16,0,8,8,3,0,2,103,45,39,40,144,43,160,191,31,0,79,13,14,0,0,0,0,156,142,143,20,31,150,
                  185,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,12,0,15,8,0,0,0,0,0,16,14,0,255,80,24,16,0,16,0,3,0,2,103,95,79,80,130,
                  85,129,191,31,0,79,13,14,0,0,0,0,156,142,143,40,31,150,185,163,255,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,12,0,15,8,0,0,
                  0,0,0,16,14,0,255,80,24,16,0,16,0,3,0,2,102,95,79,80,130,85,129,191,31,0,79,13,14,0,0,0,0,156,142,143,40,15,150,185,163,255,
                  0,8,8,8,8,8,8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,0,0,0,16,10,0,255,80,29,16,0,160,1,15,0,6,227,95,79,80,130,84,128,11,
                  62,0,64,0,0,0,0,0,0,234,140,223,40,0,231,4,195,255,0,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,1,0,15,0,0,0,0,0,0,0,5,
                  1,255,80,29,16,0,160,1,15,0,6,227,95,79,80,130,84,128,11,62,0,64,0,0,0,0,0,0,234,140,223,40,0,231,4,227,255,0,1,2,3,4,5,20,
                  7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,0,0,0,0,5,15,255,40,24,8,0,32,1,15,0,14,99,95,79,80,130,84,128,191,31,0,65,0,0,0,0,
                  0,0,156,142,143,40,64,150,185,163,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,65,0,15,0,0,0,0,0,0,64,5,15,255,80,36,127,60,
                  19,88,119,24,80,36,128,128,38,135,4,127,8,6,135,4,88,36,127,58,6,73,4,117,6,233,150,0,233,110,236,246,6,137,4,1,117,3,233,
                  137,0,138,30,136,4,129,227,15,0,46,138,159,136,30,138,251,139,22,99,4,60,7,116,57,60,15,116,53,129,250,212,3,116,104,138,
                  38,16,4,128,228,48,128,252,48,116,31,128,38,135,4,253,186,212,3,128,251,255,144,116,78,138,62,137,4,208,231,245,128,211,0,
                  128,38,137,4,127,235,48,176,7,235,57,129,250,180,3,116,51,138,38,16,4,128,228,48,128,252,48,117,37,128,14,135,4,2,186,180,
                  3,128,251,255,144,116,25,128,231,128,128,38,137,4,127,8,62,137,4,128,38,136,4,240,8,30,136,4,235,2,176,0,250,199,6,12,1,141,
                  55,140,14,14,1,251,128,38,135,4,243,162,73,4,138,38,16,4,128,228,48,128,252,48,117,101,246,6,135,4,2,116,23,186,180,3,60,
                  15,116,115,60,7,116,111,198,6,73,4,7,128,38,135,4,127,235,99,198,6,132,4,24,199,6,133,4,14,0,160,73,4,180,0,205,66,199,6,
                  96,4,12,11,128,14,135,4,8,233,125,235,198,6,132,4,24,199,6,133,4,8,0,160,73,4,180,0,128,14,135,4,8,60,1,118,9,60,4,115,5,
                  128,14,135,4,4,205,66,233,86,235,246,6,135,4,2,117,210,186,212,3,60,15,116,4,60,7,117,10,198,6,73,4,0,128,38,135,4,127,137,
                  22,99,4,199,6,78,4,0,0,198,6,98,4,0,185,8,0,191,80,4,30,7,43,192,243,171,138,38,73,4,232,67,235,232,51,235,232,53,242,38,
                  138,7,42,228,163,74,4,38,138,71,1,162,132,4,38,138,71,2,163,133,4,38,139,71,3,163,76,4,38,139,71,20,134,196,163,96,4,139,
                  62,99,4,232,249,244,50,192,238,250,236,186,192,3,176,20,238,50,192,238,251,180,32,232,56,246,80,246,6,137,4,8,117,41,185,
                  22,0,51,255,189,1,0,83,131,195,35,232,201,234,232,181,18,91,232,147,235,138,38,73,4,232,215,234,138,216,160,137,4,36,6,208,
                  232,232,223,17,232,60,235,88,232,0,246,138,38,73,4,232,154,242,116,79,199,6,96,4,0,0,232,92,242,187,12,1,250,137,7,140,79,
                  2,251,196,30,168,4,38,196,95,12,140,192,11,195,116,43,190,7,0,138,38,73,4,232,186,245,114,31,38,138,7,254,200,162,132,4,38,
                  139,71,1,163,133,4,250,38,139,71,3,163,12,1,38,139,71,5,163,14,1,251,233,242,0,139,14,99,4,232,51,245,138,38,73,4,232,94,
                  234,179,0,232,120,241,184,0,160,232,169,241,46,142,30,28,7,196,30,168,4,38,196,95,8,140,192,11,195,116,68,190,11,0,138,38,
                  73,4,232,96,245,114,56,38,138,39,38,138,71,1,38,139,79,2,38,139,87,4,38,139,111,6,38,142,95,8,6,83,139,216,184,0,160,232,
                  105,241,232,190,25,91,7,38,138,71,10,60,255,116,10,254,200,46,142,30,28,7,162,132,4,196,30,168,4,38,196,95,16,140,192,11,
                  195,116,104,38,196,95,6,140,192,11,195,116,94,190,7,0,138,38,73,4,232,4,245,114,82,138,38,133,4,38,58,39,117,73,38,138,39,
                  38,138,71,1,185,0,1,186,0,0,38,139,111,3,38,142,95,5,6,83,139,216,128,227,127,184,0,160,232,3,241,91,7,176,3,186,196,3,238,
                  66,236,74,36,19,138,200,38,138,71,1,208,224,208,224,138,224,208,228,36,12,128,228,32,10,224,10,225,176,3,239,46,142,30,28,
                  7,139,14,99,4,232,116,244,46,142,30,28,7,196,30,168,4,38,196,95,16,140,192,11,195,117,3,235,119,144,38,196,95,10,140,192,
                  11,195,116,108,190,20,0,138,38,73,4,232,122,244,114,96,38,139,79,4,227,27,6,83,38,139,127,6,38,196,95,8,51,237,232,29,233,
                  246,6,137,4,8,117,3,232,2,17,91,7,38,139,79,12,227,31,6,83,38,139,127,14,38,196,95,16,138,22,137,4,128,226,6,208,234,246,
                  6,137,4,8,117,3,232,159,16,91,7,38,138,7,10,192,116,19,120,8,138,38,133,4,254,204,235,2,180,31,176,20,139,22,99,4,239,46,
                  142,30,28,7,232,22,13,128,62,73,4,7,119,30,187,128,30,160,73,4,42,228,3,216,46,138,7,162,101,4,176,48,128,62,73,4,6,117,2,
                  176,63,162,102,4,233,147,232,44,40,45,41,42,46,30,41,255,255,255,255,255,255,139,139,139,11,72,72,255,255,255,255,232,3,0,
                  233,117,232,137,14,96,4,246,6,135,4,8,117,35,138,197,36,96,60,32,117,5,185,0,30,235,22,246,6,135,4,1,117,15,138,38,73,4,232,
                  87,240,117,6,160,133,4,232,6,0,176,10,232,137,0,195,247,193,224,224,117,86,138,208,254,202,138,242,254,206,58,205,114,18,
                  138,229,10,225,58,224,115,21,58,202,116,62,58,238,116,58,235,11,128,249,0,116,51,138,234,134,205,235,45,128,249,3,118,40,
                  138,229,128,196,2,58,225,114,16,42,233,2,234,138,202,60,14,124,21,129,233,1,1,235,15,128,253,2,119,4,138,202,235,6,138,232,
                  208,237,138,202,195,232,3,0,233,222,231,138,207,50,237,209,225,139,241,137,148,80,4,56,62,98,4,117,5,139,194,232,1,0,195,
                  232,23,0,139,200,3,14,78,4,209,249,176,14,139,22,99,4,138,229,239,254,192,138,225,239,195,83,139,216,138,196,246,38,74,4,
                  50,255,3,195,209,224,91,195,138,223,50,255,209,227,139,151,80,4,139,14,96,4,95,94,91,88,88,31,7,93,207,246,6,135,4,8,117,
                  5,43,192,233,120,231,180,4,205,66,95,94,131,196,6,31,7,93,207,162,98,4,139,14,76,4,152,80,247,225,163,78,4,139,200,128,62,
                  73,4,7,119,2,209,249,176,12,232,148,255,91,209,227,139,135,80,4,232,125,255,233,64,231,232,3,0,233,58,231,232,18,5,138,38,
                  73,4,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254,10,
                  0,115,5,46,255,148,7,32,195,6,32,17,32,167,32,47,33,247,33,138,216,232,9,10,139,193,232,81,0,232,1,0,195,83,50,237,128,251,
                  0,116,49,3,240,138,230,42,227,232,44,0,3,245,3,253,254,204,117,245,88,176,32,232,39,0,3,253,254,203,117,247,46,142,30,28,
                  7,128,62,73,4,7,116,7,160,101,4,186,216,3,238,195,138,222,235,220,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,
                  246,6,135,4,4,116,18,82,182,3,178,218,80,236,168,8,116,251,176,37,178,216,238,88,90,232,223,254,3,6,78,4,139,248,139,240,
                  43,209,254,198,254,194,139,46,74,4,3,237,138,195,246,38,74,4,3,192,6,31,195,138,216,232,115,9,139,193,232,20,5,139,248,43,
                  209,129,194,1,1,208,230,208,230,128,62,73,4,6,115,4,208,226,209,231,232,1,0,195,6,31,50,237,208,227,208,227,116,43,138,195,
                  180,80,246,228,139,247,3,240,138,230,42,227,232,30,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,38,0,129,239,
                  176,31,254,203,117,245,195,138,222,235,238,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,
                  94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,138,216,184,0,160,142,192,139,193,83,138,62,98,4,232,
                  57,5,91,139,248,43,209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,139,247,3,
                  240,90,139,193,10,219,116,47,80,138,206,42,203,50,237,82,139,193,247,229,139,200,186,206,3,184,5,1,239,178,196,184,2,15,239,
                  90,88,232,19,0,82,80,186,206,3,184,5,0,239,88,90,232,24,0,195,138,222,235,248,81,138,202,50,237,86,87,243,164,95,94,3,240,
                  3,248,89,226,238,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,80,232,14,0,88,3,248,75,117,246,186,196,3,184,2,15,
                  239,195,82,186,196,3,184,2,15,239,90,43,192,138,202,50,237,87,243,170,95,138,230,82,186,196,3,176,2,239,90,176,255,138,202,
                  87,243,170,95,195,138,216,184,0,160,142,192,139,193,83,82,232,216,4,90,91,139,248,43,209,129,194,1,1,139,46,133,4,139,14,
                  74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,209,224,209,224,209,224,139,247,3,240,90,139,193,10,219,116,23,80,
                  138,206,42,203,50,237,82,139,193,247,229,139,200,90,88,232,8,0,232,38,0,195,138,222,235,248,80,209,224,209,224,209,224,81,
                  138,202,50,237,209,225,209,225,209,225,86,87,243,164,95,94,3,240,3,248,89,226,232,88,195,138,247,42,255,80,82,139,195,247,
                  229,139,216,90,88,232,14,0,80,209,224,209,224,209,224,3,248,75,88,117,240,195,80,43,192,138,202,50,237,209,225,209,225,209,
                  225,138,198,87,243,170,95,88,195,232,3,0,233,102,228,232,62,2,138,38,73,4,139,240,209,238,209,238,209,238,209,238,209,238,
                  209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,148,219,34,195,218,34,229,34,49,35,150,
                  35,64,36,253,138,216,232,52,7,139,194,232,124,253,232,1,0,195,83,50,237,128,251,0,116,49,43,240,138,230,42,227,232,87,253,
                  43,245,43,253,254,204,117,245,88,176,32,232,82,253,43,253,254,203,117,247,46,142,30,28,7,128,62,73,4,7,116,7,160,101,4,186,
                  216,3,238,195,138,222,235,220,253,138,216,232,232,6,139,194,232,137,2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,
                  4,6,115,5,208,226,209,231,71,232,1,0,195,6,31,50,237,129,199,240,0,208,227,208,227,116,44,138,195,180,80,246,228,139,247,
                  43,240,138,230,42,227,232,142,253,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,150,253,129,239,80,32,254,203,117,
                  245,252,195,138,222,235,237,253,138,216,184,0,160,142,192,139,194,254,196,83,138,62,98,4,232,207,2,91,43,6,74,4,139,248,43,
                  209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,139,247,43,240,90,139,193,10,
                  219,116,48,80,138,206,42,203,50,237,82,139,193,247,229,139,200,186,206,3,184,5,1,239,178,196,184,2,15,239,90,88,232,20,0,
                  82,80,186,206,3,184,5,0,239,88,90,232,25,0,252,195,138,222,235,247,81,138,202,50,237,86,87,243,164,95,94,43,240,43,248,89,
                  226,238,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,80,232,159,253,88,43,248,75,117,246,186,196,3,184,2,15,239,
                  195,253,138,216,184,0,160,142,192,139,194,254,196,83,82,232,140,2,90,139,30,74,4,209,227,209,227,209,227,43,195,5,7,0,91,
                  139,248,43,209,129,194,1,1,139,46,133,4,139,14,74,4,232,1,0,195,6,31,138,195,42,228,82,247,229,247,225,209,224,209,224,209,
                  224,139,247,43,240,90,139,193,10,219,116,24,80,138,206,42,203,50,237,82,139,193,247,229,139,200,90,88,232,9,0,232,39,0,252,
                  195,138,222,235,247,80,209,224,209,224,209,224,81,138,202,50,237,209,225,209,225,209,225,86,87,243,164,95,94,43,240,43,248,
                  89,226,232,88,195,138,247,42,255,80,82,139,195,247,229,139,216,90,88,232,178,253,80,209,224,209,224,209,224,43,248,75,88,
                  117,240,195,80,138,230,42,229,254,196,58,224,88,117,2,42,192,195,232,3,0,233,16,226,160,73,4,50,228,209,224,139,240,46,139,
                  180,144,18,209,230,129,254,10,0,115,5,46,255,148,31,37,195,30,37,41,37,121,37,45,38,177,38,232,243,4,50,237,138,207,139,249,
                  209,231,139,133,80,4,139,30,76,4,139,22,74,4,232,31,0,139,247,139,22,99,4,131,194,6,246,6,135,4,4,6,31,116,11,236,168,1,117,
                  251,250,236,168,1,116,251,173,195,51,255,227,4,3,251,226,252,139,200,138,196,246,226,50,237,3,193,209,224,3,248,195,232,163,
                  4,161,80,4,232,67,0,139,240,138,38,73,4,6,31,131,236,8,139,236,232,70,0,46,142,30,28,7,30,196,62,12,1,184,0,0,186,128,0,187,
                  8,0,232,92,4,31,114,22,196,62,124,0,140,192,11,199,116,12,184,128,0,186,128,0,187,8,0,232,67,4,131,196,8,195,83,139,216,138,
                  196,246,38,74,4,209,224,209,224,42,255,3,195,91,195,128,252,6,117,25,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,
                  198,80,254,206,117,235,235,22,209,230,182,4,232,19,0,129,198,0,32,232,12,0,129,238,176,31,254,206,117,238,131,237,8,195,138,
                  36,138,68,1,185,0,192,178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,186,0,160,142,194,139,243,
                  209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,139,132,80,4,232,44,0,139,240,139,30,133,4,43,227,
                  139,236,186,206,3,184,5,8,239,139,14,74,4,232,57,0,184,5,0,239,196,62,12,1,184,0,0,186,0,1,232,142,3,3,227,195,83,81,82,42,
                  237,138,207,139,216,138,196,246,38,74,4,247,38,133,4,42,255,3,195,139,30,76,4,227,4,3,195,226,252,90,89,91,195,83,38,138,
                  4,246,208,136,70,0,69,3,241,75,117,242,91,43,235,195,186,0,160,142,194,161,80,4,232,33,0,139,240,139,30,133,4,43,227,139,
                  236,139,22,74,4,232,40,0,196,62,12,1,184,0,0,186,0,1,232,42,3,3,227,195,139,216,138,196,246,38,74,4,247,38,133,4,2,195,128,
                  212,0,209,224,209,224,209,224,195,83,83,183,128,42,228,185,8,0,38,138,4,60,0,116,2,10,231,208,207,70,226,242,136,102,0,69,
                  131,238,8,139,202,209,225,209,225,209,225,3,241,91,75,117,213,91,43,235,195,232,3,0,233,232,223,138,38,73,4,128,252,17,117,
                  6,128,227,128,128,203,63,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18,
                  209,230,129,254,10,0,115,5,46,255,148,97,39,195,96,39,107,39,171,39,154,40,50,41,232,177,2,138,227,80,81,50,237,138,207,139,
                  249,209,231,139,133,80,4,139,30,76,4,139,22,74,4,232,217,253,89,91,139,22,99,4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,
                  251,250,236,168,1,116,251,139,195,171,251,226,232,195,232,113,2,138,54,73,4,50,228,80,161,80,4,232,10,254,139,248,88,60,128,
                  115,6,197,54,12,1,235,6,44,128,197,54,124,0,128,254,6,114,5,232,6,0,235,3,232,51,0,195,209,224,209,224,209,224,3,240,87,86,
                  182,4,172,246,195,128,117,20,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,195,38,50,5,170,172,38,
                  50,133,255,31,235,226,209,224,209,224,209,224,3,240,138,211,209,231,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,
                  248,138,251,89,87,86,182,4,172,232,66,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,37,38,136,69,1,172,232,41,0,35,
                  195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,199,80,254,206,117,193,94,95,71,
                  71,226,183,195,82,81,83,43,210,185,1,0,139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,
                  91,89,90,195,50,228,247,38,133,4,80,139,243,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,139,132,
                  80,4,232,189,253,139,248,186,0,160,142,194,139,46,74,4,139,22,133,4,197,54,12,1,88,3,240,232,1,0,195,246,195,128,116,11,82,
                  186,206,3,184,3,24,239,90,235,23,87,82,186,196,3,184,2,15,239,90,43,192,81,139,202,170,3,253,79,226,250,89,95,82,186,196,
                  3,138,227,176,2,239,90,87,83,81,139,218,139,205,138,4,38,138,37,38,136,5,70,3,249,75,117,242,89,91,43,242,95,71,226,178,186,
                  206,3,184,3,0,239,178,196,184,2,15,239,195,246,38,133,4,80,83,161,80,4,232,159,253,139,248,186,0,160,142,194,91,88,139,22,
                  133,4,139,46,74,4,197,54,12,1,3,240,83,81,87,86,232,10,0,94,95,131,199,8,89,91,226,240,195,82,85,209,229,209,229,209,229,
                  252,172,138,224,87,185,8,0,138,195,208,228,114,2,138,199,170,226,245,95,3,253,74,117,232,93,90,195,232,3,0,233,131,221,138,
                  38,73,4,139,240,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,238,209,230,46,139,180,144,18,209,230,129,254,
                  10,0,115,5,46,255,148,187,41,195,186,41,197,41,171,39,154,40,50,41,232,87,0,80,81,50,237,138,207,139,249,209,231,139,133,
                  80,4,139,30,76,4,139,22,74,4,232,129,251,89,91,139,22,99,4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,251,250,236,168,1,
                  116,251,138,195,170,251,71,226,231,195,252,22,31,139,245,86,87,139,203,243,166,95,94,116,10,64,3,251,74,117,240,43,192,248,
                  195,249,195,190,0,184,139,62,16,4,129,231,48,0,131,255,48,117,3,190,0,176,142,198,195,102,38,133,75,20,14,128,62,99,4,180,
                  116,9,246,6,135,4,8,116,5,205,66,233,197,220,51,237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232,19,1,10,
                  255,117,85,138,251,160,102,4,36,224,128,227,31,10,195,162,102,4,138,223,138,232,128,227,15,138,251,208,227,128,227,16,128,
                  231,7,10,223,128,62,73,4,3,118,17,180,0,138,195,232,138,220,232,149,0,11,237,116,3,38,136,29,180,17,138,195,232,121,220,232,
                  132,0,11,237,116,4,38,136,93,16,138,221,128,227,32,177,5,210,235,128,62,73,4,3,118,83,160,102,4,36,223,128,227,1,116,2,12,
                  32,162,102,4,36,16,12,2,10,216,180,1,138,195,232,66,220,232,77,0,11,237,116,4,38,136,93,1,254,195,254,195,180,2,138,195,232,
                  44,220,232,55,0,11,237,116,4,38,136,93,2,254,195,254,195,180,3,138,195,232,22,220,232,33,0,11,237,116,4,38,136,93,3,232,84,
                  0,233,246,219,81,51,201,180,5,236,168,8,117,7,226,249,254,204,117,245,249,89,195,82,83,139,216,232,230,255,156,250,236,178,
                  192,139,195,134,196,238,134,196,238,176,32,238,157,91,90,195,82,83,139,216,232,203,255,156,250,236,82,139,195,178,192,238,
                  66,235,0,236,138,224,90,236,235,0,178,192,176,32,238,157,91,90,195,232,6,0,178,192,176,32,238,195,232,168,219,236,195,195,
                  43,253,43,45,44,103,44,19,7,19,7,19,7,155,44,168,44,181,44,19,7,19,7,19,7,19,7,19,7,19,7,194,44,19,7,218,44,247,44,19,7,58,
                  45,19,7,78,45,98,45,107,45,124,45,169,45,152,139,240,209,230,131,254,56,115,60,46,255,164,124,43,128,62,73,4,19,116,48,51,
                  237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232,151,255,138,227,138,199,232,59,219,232,70,255,232,129,255,
                  11,237,116,9,138,199,42,255,3,251,38,136,5,233,22,219,51,237,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,232,
                  100,255,180,17,138,199,232,8,219,232,19,255,232,78,255,11,237,116,6,131,199,17,38,136,61,233,230,218,128,62,73,4,19,116,48,
                  30,6,196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,9,31,30,139,242,185,17,0,243,164,7,31,139,218,191,0,0,185,17,0,51,
                  237,232,196,218,232,176,2,232,10,255,233,172,218,250,232,12,255,186,192,3,176,16,238,66,236,251,10,219,117,10,128,38,101,
                  4,223,36,247,235,12,144,254,203,117,7,128,14,101,4,32,12,8,180,16,232,144,218,232,155,254,232,214,254,233,120,218,138,195,
                  232,130,218,232,168,254,138,252,233,203,0,176,17,232,117,218,232,155,254,138,252,233,190,0,139,218,232,104,218,51,237,232,
                  125,2,233,81,218,246,6,137,4,6,116,3,232,36,1,82,232,82,218,232,74,254,90,232,93,1,233,57,218,139,251,139,218,180,32,232,
                  151,229,138,22,137,4,128,226,6,208,234,80,232,227,1,88,232,134,229,233,28,218,176,16,232,38,218,232,76,254,10,219,117,24,
                  138,196,12,128,10,255,117,2,36,127,180,16,232,16,218,232,27,254,232,86,254,233,248,217,138,199,246,196,128,117,8,36,3,208,
                  224,208,224,235,2,36,15,180,20,232,241,217,232,252,253,232,55,254,233,217,217,232,229,217,232,221,253,232,135,0,95,94,91,
                  88,88,138,208,31,7,93,207,139,251,139,218,180,32,232,35,229,80,232,157,1,88,232,27,229,233,177,217,186,198,3,139,195,238,
                  233,168,217,186,198,3,236,50,228,139,216,95,94,88,89,90,31,7,93,207,232,163,217,176,16,232,199,253,138,220,128,227,128,177,
                  7,210,235,176,20,232,144,217,232,182,253,138,252,10,219,117,9,128,231,12,208,239,208,239,235,207,128,231,15,235,202,180,32,
                  232,204,228,80,232,7,0,88,232,196,228,233,90,217,81,83,232,12,0,232,47,0,232,112,0,91,67,89,226,240,195,186,199,3,138,195,
                  238,186,201,3,156,235,0,250,236,235,0,36,63,138,224,236,235,0,36,63,138,232,236,157,36,63,138,200,138,244,50,210,195,83,138,
                  198,80,138,197,80,138,193,37,63,0,51,219,51,201,46,247,38,57,42,3,216,19,202,88,37,63,0,46,247,38,55,42,3,216,19,202,88,37,
                  63,0,46,247,38,53,42,3,216,19,202,3,219,19,201,129,195,0,128,131,209,0,138,241,138,233,91,195,82,138,195,186,200,3,238,186,
                  201,3,88,138,196,156,250,238,235,0,138,197,238,235,0,138,193,238,157,139,208,195,80,186,198,3,236,60,255,116,3,176,255,238,
                  128,251,0,185,64,0,116,24,88,80,128,252,15,116,5,128,252,7,117,6,190,177,48,235,87,144,190,177,47,235,59,144,88,80,128,252,
                  19,116,6,190,49,48,235,46,144,88,80,187,32,0,232,102,3,190,17,49,185,16,0,187,16,0,232,249,0,190,241,48,185,16,0,187,0,0,
                  88,80,168,3,116,32,131,198,16,232,228,0,88,235,27,144,88,80,168,3,116,16,131,198,64,185,64,0,187,0,0,232,206,0,88,235,5,144,
                  88,232,140,0,195,139,194,81,38,138,55,67,38,138,47,67,38,138,15,67,83,139,223,80,169,3,0,116,3,232,2,255,232,67,255,88,91,
                  89,71,226,222,195,81,83,139,223,232,203,254,91,71,38,136,55,67,38,136,47,67,38,136,15,67,89,226,232,195,82,236,139,199,134,
                  224,128,252,16,116,15,127,28,38,138,7,90,82,232,10,252,254,196,67,226,236,11,237,116,1,67,254,196,38,138,7,90,232,247,251,
                  195,90,195,139,251,42,219,138,195,232,6,252,38,136,37,254,195,71,128,251,16,114,240,11,237,116,1,71,176,17,232,241,251,38,
                  136,37,195,179,0,81,183,3,46,138,36,70,176,0,246,196,4,116,2,4,42,246,196,32,116,2,4,21,80,208,228,254,207,117,233,88,138,
                  200,88,138,232,88,138,240,86,83,50,255,232,166,254,91,94,254,195,89,58,217,124,201,195,3,203,81,46,138,12,138,233,138,241,
                  86,83,232,141,254,91,94,70,67,89,59,217,124,234,195,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
                  27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,5,17,28,
                  8,11,37,40,2,7,27,32,15,20,40,44,12,17,37,42,20,30,50,54,15,19,39,44,27,32,52,57,6,11,31,36,19,24,44,48,9,13,33,38,21,26,
                  46,51,19,23,43,48,31,36,56,61,14,24,45,50,32,36,56,63,0,1,2,3,4,5,20,7,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,56,57,58,
                  59,60,61,62,63,0,1,2,3,4,5,20,7,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,56,57,58,59,60,61,62,63,0,5,17,28,8,11,20,40,0,5,
                  17,28,8,11,20,40,14,24,45,50,32,36,56,63,14,24,45,50,32,36,56,63,0,5,17,28,8,11,20,40,0,5,17,28,8,11,20,40,14,24,45,50,32,
                  36,56,63,14,24,45,50,32,36,56,63,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,63,63,63,63,63,63,63,63,0,0,0,0,0,0,0,0,
                  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,63,63,63,63,63,63,63,63,0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,0,5,17,28,8,11,20,40,14,
                  24,45,50,32,36,56,63,0,5,8,11,14,17,20,24,28,32,36,40,45,50,56,63,0,16,31,47,63,63,63,63,63,63,63,63,63,47,31,16,0,0,0,0,
                  0,0,0,0,31,39,47,55,63,63,63,63,63,63,63,63,63,55,47,39,31,31,31,31,31,31,31,31,45,49,54,58,63,63,63,63,63,63,63,63,63,58,
                  54,49,45,45,45,45,45,45,45,45,0,7,14,21,28,28,28,28,28,28,28,28,28,21,14,7,0,0,0,0,0,0,0,0,14,17,21,24,28,28,28,28,28,28,
                  28,28,28,24,21,17,14,14,14,14,14,14,14,14,20,22,24,26,28,28,28,28,28,28,28,28,28,26,24,22,20,20,20,20,20,20,20,20,0,4,8,12,
                  16,16,16,16,16,16,16,16,16,12,8,4,0,0,0,0,0,0,0,0,8,10,12,14,16,16,16,16,16,16,16,16,16,14,12,10,8,8,8,8,8,8,8,8,11,12,13,
                  15,16,16,16,16,16,16,16,16,16,15,13,12,11,11,11,11,11,11,11,11,139,235,185,9,0,190,33,49,81,187,0,0,83,46,138,48,128,195,
                  8,128,251,24,124,3,128,235,24,46,138,8,128,195,8,128,251,24,124,3,128,235,24,46,138,40,86,80,139,221,168,3,116,3,232,192,
                  251,232,1,252,88,94,69,91,254,195,128,251,24,124,199,131,198,24,89,226,189,195,138,38,73,4,139,240,81,177,8,211,238,89,209,
                  230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,164,104,50,233,171,212,19,7,19,7,114,50,154,50,235,50,46,142,6,32,
                  7,80,80,232,23,1,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,125,212,50,193,235,
                  245,80,139,194,232,54,1,186,206,3,138,224,176,8,239,46,142,6,30,7,88,138,232,246,197,128,116,6,184,3,24,239,235,14,178,196,
                  184,2,255,239,38,138,7,42,192,38,136,7,178,196,176,2,138,229,128,228,15,239,38,138,39,180,255,38,136,39,239,178,206,184,3,
                  0,239,184,8,255,239,134,224,233,40,212,80,139,194,187,64,1,247,227,3,193,139,240,88,46,142,6,30,7,38,136,4,233,16,212,138,
                  38,73,4,139,240,81,177,8,211,238,89,209,230,46,139,180,144,18,209,230,129,254,10,0,115,5,46,255,164,38,51,233,237,211,19,
                  7,19,7,48,51,70,51,123,51,46,142,6,32,7,232,91,0,38,138,4,34,196,210,224,138,206,210,192,233,205,211,46,142,6,30,7,139,194,
                  232,134,0,181,7,42,233,43,210,180,0,138,205,176,4,82,186,206,3,239,90,38,138,7,210,232,36,1,138,204,210,224,10,208,254,196,
                  128,252,3,118,226,138,194,233,152,211,80,139,194,187,64,1,247,227,3,193,139,248,88,46,142,6,30,7,38,138,5,233,128,211,83,
                  80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,4,6,114,6,187,128,
                  1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,247,38,74,4,81,209,233,
                  209,233,209,233,3,193,138,223,42,255,139,203,139,30,76,4,227,4,3,195,226,252,89,139,216,128,225,7,176,128,210,232,195,138,
                  62,98,4,139,243,177,8,211,238,209,230,139,148,80,4,232,3,0,233,255,210,80,60,13,118,95,30,83,82,185,1,0,232,110,245,90,91,
                  31,254,194,58,22,74,4,117,70,50,210,58,54,132,4,117,60,232,253,234,138,38,73,4,232,220,218,116,4,180,0,235,7,30,83,232,185,
                  240,91,31,138,30,98,4,136,62,98,4,83,138,252,176,1,43,201,138,54,132,4,138,22,74,4,254,202,30,232,112,235,31,91,136,30,98,
                  4,88,195,254,198,232,191,234,235,247,116,19,60,10,116,19,60,7,116,23,60,8,117,147,10,210,116,233,74,235,230,50,210,235,226,
                  58,54,132,4,117,218,235,156,185,51,5,179,1,232,229,209,235,204,60,4,115,75,227,73,139,243,81,177,8,211,238,89,209,230,255,
                  180,80,4,86,80,81,82,232,119,234,90,89,88,94,81,83,80,134,224,38,138,70,0,69,60,8,116,12,60,13,116,8,60,10,116,4,60,7,117,
                  25,86,82,6,85,30,232,48,255,31,93,7,90,94,139,148,80,4,88,91,89,235,77,233,30,210,185,1,0,128,252,2,114,5,38,138,94,0,69,
                  86,82,6,85,30,232,33,242,31,93,7,90,94,88,91,89,254,194,58,22,74,4,114,37,138,22,132,4,254,194,254,198,58,242,178,0,114,23,
                  254,206,80,83,81,82,86,6,85,30,176,10,232,221,254,31,93,7,94,90,89,91,88,86,80,81,82,232,239,233,90,89,88,94,226,10,90,168,
                  1,117,161,232,225,233,235,156,233,105,255,60,0,117,4,6,31,235,103,60,1,117,2,235,97,60,2,117,2,235,91,60,3,117,3,235,93,144,
                  60,4,117,4,254,200,235,76,60,16,117,5,6,31,235,82,144,60,17,117,3,235,75,144,60,18,117,3,235,68,144,60,20,117,4,254,200,235,
                  59,60,32,117,3,233,151,0,60,33,117,3,233,164,0,60,34,117,3,233,157,0,60,35,117,3,233,150,0,60,36,117,3,233,143,0,60,48,117,
                  3,233,227,0,233,75,209,138,224,232,20,0,233,67,209,232,140,220,233,61,209,138,224,128,236,16,232,3,0,233,50,209,30,81,46,
                  142,30,28,7,139,14,99,4,232,29,220,89,31,128,252,0,116,33,183,14,189,141,63,128,252,1,116,15,183,8,189,141,55,128,252,2,116,
                  5,183,16,189,186,78,186,0,0,185,0,1,14,31,80,128,227,127,184,0,160,232,115,216,88,168,16,116,3,232,195,0,46,142,30,28,7,139,
                  14,99,4,232,3,220,232,54,245,195,44,32,46,142,30,28,7,250,137,46,124,0,140,6,126,0,251,233,198,208,44,32,46,142,30,28,7,254,
                  200,116,32,14,7,254,200,117,8,185,14,0,189,141,63,235,18,254,200,117,8,185,8,0,189,141,55,235,6,185,16,0,189,186,78,250,137,
                  46,12,1,140,6,14,1,251,137,14,133,4,138,195,187,164,54,10,192,117,5,138,194,235,9,144,60,3,118,2,176,2,46,215,254,200,162,
                  132,4,233,111,208,0,14,25,43,139,14,133,4,138,22,132,4,128,255,7,119,236,128,255,1,119,23,46,142,30,28,7,10,255,117,7,196,
                  46,124,0,235,26,144,196,46,12,1,235,19,144,128,239,2,138,223,42,255,209,227,129,195,129,55,46,139,47,14,7,95,94,91,88,88,
                  31,88,88,207,46,142,30,28,7,138,199,50,228,163,133,4,254,200,139,22,99,4,138,224,176,20,128,62,73,4,7,117,1,239,80,176,9,
                  238,66,236,36,224,10,224,74,176,9,239,88,138,204,254,204,138,236,128,249,13,124,4,129,233,1,1,137,14,96,4,176,10,232,41,232,
                  138,38,73,4,232,6,208,138,216,184,200,0,128,251,0,116,11,184,94,1,128,251,1,116,3,184,144,1,153,247,54,133,4,72,162,132,4,
                  254,192,42,228,247,38,133,4,128,251,0,117,2,209,224,72,139,22,99,4,138,224,176,18,239,160,132,4,254,192,246,38,74,4,209,224,
                  5,0,1,163,76,4,195,141,63,141,55,141,59,141,77,186,78,186,94,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,
                  255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,16,16,56,124,254,124,
                  56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,
                  125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,
                  60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,
                  219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,
                  24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,
                  126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,
                  108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,
                  96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,
                  0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,
                  204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,
                  48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,
                  48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,
                  204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,
                  0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,
                  12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,
                  198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,
                  0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,
                  198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,
                  96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,
                  12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,
                  0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,
                  204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,
                  120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,
                  0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,
                  198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,
                  224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204,0,204,204,204,126,0,28,0,120,204,
                  252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,0,48,48,120,12,124,204,126,0,0,
                  0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204,252,192,120,0,204,0,112,48,48,
                  48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48,48,0,120,204,252,204,0,28,0,252,
                  96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204,120,0,0,204,0,120,204,204,120,
                  0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204,204,124,12,248,195,24,60,102,
                  102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252,0,204,204,120,252,48,252,48,
                  48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112,48,48,48,120,0,0,28,0,120,
                  204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60,108,108,62,0,126,0,0,56,108,
                  108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204,222,51,102,204,15,195,198,
                  204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34,136,34,136,34,136,34,136,85,
                  170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,248,24,248,
                  24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6,246,54,54,54,54,54,54,54,54,54,
                  54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248,0,0,0,0,0,0,0,248,24,24,24,24,24,
                  24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0,0,255,0,0,0,24,24,24,24,255,24,24,
                  24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,54,54,247,0,255,0,0,0,0,0,255,
                  0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24,24,255,0,255,0,0,0,54,54,54,54,255,
                  0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31,0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,
                  63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,31,24,24,24,255,255,255,255,
                  255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,
                  0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254,108,108,108,108,108,0,252,204,96,
                  48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24,24,0,252,48,120,204,204,120,48,
                  252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0,0,126,219,219,126,0,0,6,12,126,
                  219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252,0,0,48,48,252,48,48,0,252,0,
                  96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,112,48,48,0,252,0,48,48,0,0,
                  118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236,108,60,28,120,108,108,108,
                  108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,
                  189,153,129,126,0,0,0,0,0,126,255,219,255,255,195,231,255,126,0,0,0,0,0,0,108,254,254,254,254,124,56,16,0,0,0,0,0,0,16,56,
                  124,254,124,56,16,0,0,0,0,0,0,24,60,60,231,231,231,24,24,60,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,0,0,0,0,0,0,0,24,60,
                  60,24,0,0,0,0,0,255,255,255,255,255,231,195,195,231,255,255,255,255,255,0,0,0,0,60,102,66,66,102,60,0,0,0,0,255,255,255,255,
                  195,153,189,189,153,195,255,255,255,255,0,0,30,14,26,50,120,204,204,204,120,0,0,0,0,0,60,102,102,102,60,24,126,24,24,0,0,
                  0,0,0,63,51,63,48,48,48,112,240,224,0,0,0,0,0,127,99,127,99,99,99,103,231,230,192,0,0,0,0,24,24,219,60,231,60,219,24,24,0,
                  0,0,0,0,128,192,224,248,254,248,224,192,128,0,0,0,0,0,2,6,14,62,254,62,14,6,2,0,0,0,0,0,24,60,126,24,24,24,126,60,24,0,0,
                  0,0,0,102,102,102,102,102,102,0,102,102,0,0,0,0,0,127,219,219,219,123,27,27,27,27,0,0,0,0,124,198,96,56,108,198,198,108,56,
                  12,198,124,0,0,0,0,0,0,0,0,0,254,254,254,0,0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,0,0,0,24,60,126,24,24,24,24,24,24,0,
                  0,0,0,0,24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,24,12,254,12,24,0,0,0,0,0,0,0,0,0,48,96,254,96,48,0,0,0,0,0,0,0,0,0,0,192,
                  192,192,254,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,0,0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,0,0,0,0,0,254,254,124,124,56,
                  56,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,24,24,0,0,0,0,102,102,102,36,0,0,0,0,0,0,0,0,0,0,0,108,
                  108,254,108,108,108,254,108,108,0,0,0,24,24,124,198,194,192,124,6,134,198,124,24,24,0,0,0,0,0,194,198,12,24,48,102,198,0,
                  0,0,0,0,56,108,108,56,118,220,204,204,118,0,0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,0,0,12,24,48,48,48,48,48,24,12,0,0,0,0,0,
                  48,24,12,12,12,12,12,24,48,0,0,0,0,0,0,0,102,60,255,60,102,0,0,0,0,0,0,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,24,
                  24,24,48,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0,0,0,124,198,
                  206,222,246,230,198,198,124,0,0,0,0,0,24,56,120,24,24,24,24,24,126,0,0,0,0,0,124,198,6,12,24,48,96,198,254,0,0,0,0,0,124,
                  198,6,6,60,6,6,198,124,0,0,0,0,0,12,28,60,108,204,254,12,12,30,0,0,0,0,0,254,192,192,192,252,6,6,198,124,0,0,0,0,0,56,96,
                  192,192,252,198,198,198,124,0,0,0,0,0,254,198,6,12,24,48,48,48,48,0,0,0,0,0,124,198,198,198,124,198,198,198,124,0,0,0,0,0,
                  124,198,198,198,126,6,6,12,120,0,0,0,0,0,0,24,24,0,0,0,24,24,0,0,0,0,0,0,0,24,24,0,0,0,24,24,48,0,0,0,0,0,6,12,24,48,96,48,
                  24,12,6,0,0,0,0,0,0,0,0,126,0,0,126,0,0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,0,0,0,0,124,198,198,12,24,24,0,24,24,0,0,0,
                  0,0,124,198,198,222,222,222,220,192,124,0,0,0,0,0,16,56,108,198,198,254,198,198,198,0,0,0,0,0,252,102,102,102,124,102,102,
                  102,252,0,0,0,0,0,60,102,194,192,192,192,194,102,60,0,0,0,0,0,248,108,102,102,102,102,102,108,248,0,0,0,0,0,254,102,98,104,
                  120,104,98,102,254,0,0,0,0,0,254,102,98,104,120,104,96,96,240,0,0,0,0,0,60,102,194,192,192,222,198,102,58,0,0,0,0,0,198,198,
                  198,198,254,198,198,198,198,0,0,0,0,0,60,24,24,24,24,24,24,24,60,0,0,0,0,0,30,12,12,12,12,12,204,204,120,0,0,0,0,0,230,102,
                  108,108,120,108,108,102,230,0,0,0,0,0,240,96,96,96,96,96,98,102,254,0,0,0,0,0,198,238,254,254,214,198,198,198,198,0,0,0,0,
                  0,198,230,246,254,222,206,198,198,198,0,0,0,0,0,56,108,198,198,198,198,198,108,56,0,0,0,0,0,252,102,102,102,124,96,96,96,
                  240,0,0,0,0,0,124,198,198,198,198,214,222,124,12,14,0,0,0,0,252,102,102,102,124,108,102,102,230,0,0,0,0,0,124,198,198,96,
                  56,12,198,198,124,0,0,0,0,0,126,126,90,24,24,24,24,24,60,0,0,0,0,0,198,198,198,198,198,198,198,198,124,0,0,0,0,0,198,198,
                  198,198,198,198,108,56,16,0,0,0,0,0,198,198,198,198,214,214,254,124,108,0,0,0,0,0,198,198,108,56,56,56,108,198,198,0,0,0,
                  0,0,102,102,102,102,60,24,24,24,60,0,0,0,0,0,254,198,140,24,48,96,194,198,254,0,0,0,0,0,60,48,48,48,48,48,48,48,60,0,0,0,
                  0,0,128,192,224,112,56,28,14,6,2,0,0,0,0,0,60,12,12,12,12,12,12,12,60,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,255,0,48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,12,124,204,204,118,0,0,0,0,0,224,96,96,120,108,102,102,102,
                  124,0,0,0,0,0,0,0,0,124,198,192,192,198,124,0,0,0,0,0,28,12,12,60,108,204,204,204,118,0,0,0,0,0,0,0,0,124,198,254,192,198,
                  124,0,0,0,0,0,56,108,100,96,240,96,96,96,240,0,0,0,0,0,0,0,0,118,204,204,204,124,12,204,120,0,0,0,224,96,96,108,118,102,102,
                  102,230,0,0,0,0,0,24,24,0,56,24,24,24,24,60,0,0,0,0,0,6,6,0,14,6,6,6,6,102,102,60,0,0,0,224,96,96,102,108,120,108,102,230,
                  0,0,0,0,0,56,24,24,24,24,24,24,24,60,0,0,0,0,0,0,0,0,236,254,214,214,214,198,0,0,0,0,0,0,0,0,220,102,102,102,102,102,0,0,
                  0,0,0,0,0,0,124,198,198,198,198,124,0,0,0,0,0,0,0,0,220,102,102,102,124,96,96,240,0,0,0,0,0,0,118,204,204,204,124,12,12,30,
                  0,0,0,0,0,0,220,118,102,96,96,240,0,0,0,0,0,0,0,0,124,198,112,28,198,124,0,0,0,0,0,16,48,48,252,48,48,48,54,28,0,0,0,0,0,
                  0,0,0,204,204,204,204,204,118,0,0,0,0,0,0,0,0,102,102,102,102,60,24,0,0,0,0,0,0,0,0,198,198,214,214,254,108,0,0,0,0,0,0,0,
                  0,198,108,56,56,108,198,0,0,0,0,0,0,0,0,198,198,198,198,126,6,12,248,0,0,0,0,0,0,254,204,24,48,102,254,0,0,0,0,0,14,24,24,
                  24,112,24,24,24,14,0,0,0,0,0,24,24,24,24,0,24,24,24,24,0,0,0,0,0,112,24,24,24,14,24,24,24,112,0,0,0,0,0,118,220,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,0,0,60,102,194,192,192,194,102,60,12,6,124,0,0,0,204,204,0,204,204,204,204,
                  204,118,0,0,0,0,12,24,48,0,124,198,254,192,198,124,0,0,0,0,16,56,108,0,120,12,124,204,204,118,0,0,0,0,0,204,204,0,120,12,
                  124,204,204,118,0,0,0,0,96,48,24,0,120,12,124,204,204,118,0,0,0,0,56,108,56,0,120,12,124,204,204,118,0,0,0,0,0,0,0,60,102,
                  96,102,60,12,6,60,0,0,0,16,56,108,0,124,198,254,192,198,124,0,0,0,0,0,204,204,0,124,198,254,192,198,124,0,0,0,0,96,48,24,
                  0,124,198,254,192,198,124,0,0,0,0,0,102,102,0,56,24,24,24,24,60,0,0,0,0,24,60,102,0,56,24,24,24,24,60,0,0,0,0,96,48,24,0,
                  56,24,24,24,24,60,0,0,0,0,198,198,16,56,108,198,198,254,198,198,0,0,0,56,108,56,0,56,108,198,198,254,198,198,0,0,0,24,48,
                  96,0,254,102,96,124,96,102,254,0,0,0,0,0,0,0,204,118,54,126,216,216,110,0,0,0,0,0,62,108,204,204,254,204,204,204,206,0,0,
                  0,0,16,56,108,0,124,198,198,198,198,124,0,0,0,0,0,198,198,0,124,198,198,198,198,124,0,0,0,0,96,48,24,0,124,198,198,198,198,
                  124,0,0,0,0,48,120,204,0,204,204,204,204,204,118,0,0,0,0,96,48,24,0,204,204,204,204,204,118,0,0,0,0,0,198,198,0,198,198,198,
                  198,126,6,12,120,0,0,198,198,56,108,198,198,198,198,108,56,0,0,0,0,198,198,0,198,198,198,198,198,198,124,0,0,0,0,24,24,60,
                  102,96,96,102,60,24,24,0,0,0,0,56,108,100,96,240,96,96,96,230,252,0,0,0,0,0,102,102,60,24,126,24,126,24,24,0,0,0,0,248,204,
                  204,248,196,204,222,204,204,198,0,0,0,0,14,27,24,24,24,126,24,24,24,24,216,112,0,0,24,48,96,0,120,12,124,204,204,118,0,0,
                  0,0,12,24,48,0,56,24,24,24,24,60,0,0,0,0,24,48,96,0,124,198,198,198,198,124,0,0,0,0,24,48,96,0,204,204,204,204,204,118,0,
                  0,0,0,0,118,220,0,220,102,102,102,102,102,0,0,0,118,220,0,198,230,246,254,222,206,198,198,0,0,0,0,60,108,108,62,0,126,0,0,
                  0,0,0,0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,0,0,48,48,0,48,48,96,198,198,124,0,0,0,0,0,0,0,0,0,254,192,192,192,0,0,0,0,
                  0,0,0,0,0,0,254,6,6,6,0,0,0,0,0,192,192,198,204,216,48,96,220,134,12,24,62,0,0,192,192,198,204,216,48,102,206,158,62,6,6,
                  0,0,0,24,24,0,24,24,60,60,60,24,0,0,0,0,0,0,0,54,108,216,108,54,0,0,0,0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,17,68,17,68,
                  17,68,17,68,17,68,17,68,17,68,85,170,85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,221,119,221,
                  119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,24,24,24,24,248,24,248,
                  24,24,24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,0,0,0,0,0,248,24,248,24,
                  24,24,24,24,24,54,54,54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,
                  54,54,54,54,54,54,54,54,54,54,246,6,254,0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,0,0,0,0,24,24,24,24,24,248,24,248,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,24,24,24,24,24,24,31,0,0,0,0,0,0,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,0,0,0,0,0,0,0,255,0,0,0,0,0,0,24,24,24,24,24,24,24,
                  255,24,24,24,24,24,24,24,24,24,24,24,31,24,31,24,24,24,24,24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,54,54,54,54,54,
                  55,48,63,0,0,0,0,0,0,0,0,0,0,0,63,48,55,54,54,54,54,54,54,54,54,54,54,54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,247,54,54,
                  54,54,54,54,54,54,54,54,54,55,48,55,54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,
                  54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,24,24,24,24,24,24,0,0,
                  0,0,0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,54,63,0,0,0,0,0,0,24,24,24,24,24,31,24,31,0,0,0,0,0,0,0,0,0,0,0,31,24,31,
                  24,24,24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,54,54,54,54,54,54,255,54,54,54,54,54,54,24,24,24,24,24,255,24,255,
                  24,24,24,24,24,24,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,0,0,0,31,24,24,24,24,24,24,255,255,255,255,255,255,255,255,
                  255,255,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,240,240,240,240,
                  15,15,15,15,15,15,15,15,15,15,15,15,15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,118,220,216,216,220,118,0,0,
                  0,0,0,0,0,124,198,252,198,198,252,192,192,64,0,0,0,254,198,198,192,192,192,192,192,192,0,0,0,0,0,0,0,254,108,108,108,108,
                  108,108,0,0,0,0,0,254,198,96,48,24,48,96,198,254,0,0,0,0,0,0,0,0,126,216,216,216,216,112,0,0,0,0,0,0,0,102,102,102,102,124,
                  96,96,192,0,0,0,0,0,0,118,220,24,24,24,24,24,0,0,0,0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,56,108,198,198,254,198,198,
                  108,56,0,0,0,0,0,56,108,198,198,198,108,108,108,238,0,0,0,0,0,30,48,24,12,62,102,102,102,60,0,0,0,0,0,0,0,0,126,219,219,126,
                  0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,192,0,0,0,0,0,28,48,96,96,124,96,96,48,28,0,0,0,0,0,0,124,198,198,198,198,198,198,
                  198,0,0,0,0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,0,24,24,126,24,24,0,0,255,0,0,0,0,0,48,24,12,6,12,24,48,0,126,0,0,0,0,0,12,
                  24,48,96,48,24,12,0,126,0,0,0,0,0,14,27,27,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,112,0,0,0,0,0,0,24,
                  24,0,126,0,24,24,0,0,0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,15,12,12,12,12,12,236,108,60,28,0,0,0,0,216,108,108,108,108,108,0,0,0,0,0,0,0,0,112,216,
                  48,96,200,248,0,0,0,0,0,0,0,0,0,0,0,124,124,124,124,124,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,36,102,255,102,
                  36,0,0,0,0,0,34,0,99,99,99,34,0,0,0,0,0,0,0,0,0,43,0,0,0,24,24,24,255,24,24,24,0,0,0,0,45,0,0,0,0,0,0,255,0,0,0,0,0,0,0,77,
                  0,0,195,231,255,219,195,195,195,195,195,0,0,0,84,0,0,255,219,153,24,24,24,24,24,60,0,0,0,86,0,0,195,195,195,195,195,195,102,
                  60,24,0,0,0,87,0,0,195,195,195,195,219,219,255,102,102,0,0,0,88,0,0,195,195,102,60,24,60,102,195,195,0,0,0,89,0,0,195,195,
                  195,102,60,24,24,24,60,0,0,0,90,0,0,255,195,134,12,24,48,97,195,255,0,0,0,109,0,0,0,0,0,230,255,219,219,219,219,0,0,0,118,
                  0,0,0,0,0,195,195,195,102,60,24,0,0,0,119,0,0,0,0,0,195,195,219,219,255,102,0,0,0,145,0,0,0,0,110,59,27,126,216,220,119,0,
                  0,0,155,0,24,24,126,195,192,192,195,126,24,24,0,0,0,157,0,0,195,102,60,24,255,24,255,24,24,0,0,0,158,0,252,102,102,124,98,
                  102,111,102,102,243,0,0,0,241,0,0,24,24,24,255,24,24,24,0,255,0,0,0,246,0,0,24,24,0,0,255,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,153,129,129,126,0,0,0,0,0,0,126,255,219,255,255,195,231,255,255,126,0,0,0,0,
                  0,0,0,0,108,254,254,254,254,124,56,16,0,0,0,0,0,0,0,0,16,56,124,254,124,56,16,0,0,0,0,0,0,0,0,24,60,60,231,231,231,24,24,
                  60,0,0,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,0,0,0,0,0,0,0,0,0,24,60,60,24,0,0,0,0,0,0,255,255,255,255,255,255,231,195,
                  195,231,255,255,255,255,255,255,0,0,0,0,0,60,102,66,66,102,60,0,0,0,0,0,255,255,255,255,255,195,153,189,189,153,195,255,255,
                  255,255,255,0,0,30,14,26,50,120,204,204,204,204,120,0,0,0,0,0,0,60,102,102,102,102,60,24,126,24,24,0,0,0,0,0,0,63,51,63,48,
                  48,48,48,112,240,224,0,0,0,0,0,0,127,99,127,99,99,99,99,103,231,230,192,0,0,0,0,0,0,24,24,219,60,231,60,219,24,24,0,0,0,0,
                  0,128,192,224,240,248,254,248,240,224,192,128,0,0,0,0,0,2,6,14,30,62,254,62,30,14,6,2,0,0,0,0,0,0,24,60,126,24,24,24,126,
                  60,24,0,0,0,0,0,0,0,102,102,102,102,102,102,102,0,102,102,0,0,0,0,0,0,127,219,219,219,123,27,27,27,27,27,0,0,0,0,0,124,198,
                  96,56,108,198,198,108,56,12,198,124,0,0,0,0,0,0,0,0,0,0,0,254,254,254,254,0,0,0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,
                  0,0,0,0,0,24,60,126,24,24,24,24,24,24,24,0,0,0,0,0,0,24,24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,0,0,24,12,254,12,24,0,0,
                  0,0,0,0,0,0,0,0,0,48,96,254,96,48,0,0,0,0,0,0,0,0,0,0,0,0,192,192,192,254,0,0,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,0,0,0,
                  0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,0,0,0,0,0,0,0,254,254,124,124,56,56,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,24,60,60,60,24,24,24,0,24,24,0,0,0,0,0,102,102,102,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,108,254,108,108,108,254,108,108,
                  0,0,0,0,24,24,124,198,194,192,124,6,6,134,198,124,24,24,0,0,0,0,0,0,194,198,12,24,48,96,198,134,0,0,0,0,0,0,56,108,108,56,
                  118,220,204,204,204,118,0,0,0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,0,0,0,0,12,24,48,48,48,48,48,48,24,12,0,0,0,0,0,0,48,24,12,
                  12,12,12,12,12,24,48,0,0,0,0,0,0,0,0,0,102,60,255,60,102,0,0,0,0,0,0,0,0,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,24,24,24,48,0,0,0,0,0,0,0,0,0,0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,2,6,12,24,48,96,192,128,
                  0,0,0,0,0,0,56,108,198,198,214,214,198,198,108,56,0,0,0,0,0,0,24,56,120,24,24,24,24,24,24,126,0,0,0,0,0,0,124,198,6,12,24,
                  48,96,192,198,254,0,0,0,0,0,0,124,198,6,6,60,6,6,6,198,124,0,0,0,0,0,0,12,28,60,108,204,254,12,12,12,30,0,0,0,0,0,0,254,192,
                  192,192,252,6,6,6,198,124,0,0,0,0,0,0,56,96,192,192,252,198,198,198,198,124,0,0,0,0,0,0,254,198,6,6,12,24,48,48,48,48,0,0,
                  0,0,0,0,124,198,198,198,124,198,198,198,198,124,0,0,0,0,0,0,124,198,198,198,126,6,6,6,12,120,0,0,0,0,0,0,0,0,24,24,0,0,0,
                  24,24,0,0,0,0,0,0,0,0,0,24,24,0,0,0,24,24,48,0,0,0,0,0,0,0,6,12,24,48,96,48,24,12,6,0,0,0,0,0,0,0,0,0,126,0,0,126,0,0,0,0,
                  0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,0,0,0,0,0,124,198,198,12,24,24,24,0,24,24,0,0,0,0,0,0,0,124,198,198,222,222,222,220,
                  192,124,0,0,0,0,0,0,16,56,108,198,198,254,198,198,198,198,0,0,0,0,0,0,252,102,102,102,124,102,102,102,102,252,0,0,0,0,0,0,
                  60,102,194,192,192,192,192,194,102,60,0,0,0,0,0,0,248,108,102,102,102,102,102,102,108,248,0,0,0,0,0,0,254,102,98,104,120,
                  104,96,98,102,254,0,0,0,0,0,0,254,102,98,104,120,104,96,96,96,240,0,0,0,0,0,0,60,102,194,192,192,222,198,198,102,58,0,0,0,
                  0,0,0,198,198,198,198,254,198,198,198,198,198,0,0,0,0,0,0,60,24,24,24,24,24,24,24,24,60,0,0,0,0,0,0,30,12,12,12,12,12,204,
                  204,204,120,0,0,0,0,0,0,230,102,102,108,120,120,108,102,102,230,0,0,0,0,0,0,240,96,96,96,96,96,96,98,102,254,0,0,0,0,0,0,
                  198,238,254,254,214,198,198,198,198,198,0,0,0,0,0,0,198,230,246,254,222,206,198,198,198,198,0,0,0,0,0,0,124,198,198,198,198,
                  198,198,198,198,124,0,0,0,0,0,0,252,102,102,102,124,96,96,96,96,240,0,0,0,0,0,0,124,198,198,198,198,198,198,214,222,124,12,
                  14,0,0,0,0,252,102,102,102,124,108,102,102,102,230,0,0,0,0,0,0,124,198,198,96,56,12,6,198,198,124,0,0,0,0,0,0,126,126,90,
                  24,24,24,24,24,24,60,0,0,0,0,0,0,198,198,198,198,198,198,198,198,198,124,0,0,0,0,0,0,198,198,198,198,198,198,198,108,56,16,
                  0,0,0,0,0,0,198,198,198,198,214,214,214,254,238,108,0,0,0,0,0,0,198,198,108,124,56,56,124,108,198,198,0,0,0,0,0,0,102,102,
                  102,102,60,24,24,24,24,60,0,0,0,0,0,0,254,198,134,12,24,48,96,194,198,254,0,0,0,0,0,0,60,48,48,48,48,48,48,48,48,60,0,0,0,
                  0,0,0,0,128,192,224,112,56,28,14,6,2,0,0,0,0,0,0,60,12,12,12,12,12,12,12,12,60,0,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,12,124,204,204,204,118,0,0,0,0,0,0,
                  224,96,96,120,108,102,102,102,102,124,0,0,0,0,0,0,0,0,0,124,198,192,192,192,198,124,0,0,0,0,0,0,28,12,12,60,108,204,204,204,
                  204,118,0,0,0,0,0,0,0,0,0,124,198,254,192,192,198,124,0,0,0,0,0,0,56,108,100,96,240,96,96,96,96,240,0,0,0,0,0,0,0,0,0,118,
                  204,204,204,204,204,124,12,204,120,0,0,0,224,96,96,108,118,102,102,102,102,230,0,0,0,0,0,0,24,24,0,56,24,24,24,24,24,60,0,
                  0,0,0,0,0,6,6,0,14,6,6,6,6,6,6,102,102,60,0,0,0,224,96,96,102,108,120,120,108,102,230,0,0,0,0,0,0,56,24,24,24,24,24,24,24,
                  24,60,0,0,0,0,0,0,0,0,0,236,254,214,214,214,214,198,0,0,0,0,0,0,0,0,0,220,102,102,102,102,102,102,0,0,0,0,0,0,0,0,0,124,198,
                  198,198,198,198,124,0,0,0,0,0,0,0,0,0,220,102,102,102,102,102,124,96,96,240,0,0,0,0,0,0,118,204,204,204,204,204,124,12,12,
                  30,0,0,0,0,0,0,220,118,102,96,96,96,240,0,0,0,0,0,0,0,0,0,124,198,96,56,12,198,124,0,0,0,0,0,0,16,48,48,252,48,48,48,48,54,
                  28,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,118,0,0,0,0,0,0,0,0,0,102,102,102,102,102,60,24,0,0,0,0,0,0,0,0,0,198,198,214,
                  214,214,254,108,0,0,0,0,0,0,0,0,0,198,108,56,56,56,108,198,0,0,0,0,0,0,0,0,0,198,198,198,198,198,198,126,6,12,248,0,0,0,0,
                  0,0,254,204,24,48,96,198,254,0,0,0,0,0,0,14,24,24,24,112,24,24,24,24,14,0,0,0,0,0,0,24,24,24,24,0,24,24,24,24,24,0,0,0,0,
                  0,0,112,24,24,24,14,24,24,24,24,112,0,0,0,0,0,0,118,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,56,108,198,198,198,254,0,0,0,0,
                  0,0,0,60,102,194,192,192,192,194,102,60,12,6,124,0,0,0,0,204,0,0,204,204,204,204,204,204,118,0,0,0,0,0,12,24,48,0,124,198,
                  254,192,192,198,124,0,0,0,0,0,16,56,108,0,120,12,124,204,204,204,118,0,0,0,0,0,0,204,0,0,120,12,124,204,204,204,118,0,0,0,
                  0,0,96,48,24,0,120,12,124,204,204,204,118,0,0,0,0,0,56,108,56,0,120,12,124,204,204,204,118,0,0,0,0,0,0,0,0,60,102,96,96,102,
                  60,12,6,60,0,0,0,0,16,56,108,0,124,198,254,192,192,198,124,0,0,0,0,0,0,198,0,0,124,198,254,192,192,198,124,0,0,0,0,0,96,48,
                  24,0,124,198,254,192,192,198,124,0,0,0,0,0,0,102,0,0,56,24,24,24,24,24,60,0,0,0,0,0,24,60,102,0,56,24,24,24,24,24,60,0,0,
                  0,0,0,96,48,24,0,56,24,24,24,24,24,60,0,0,0,0,0,198,0,16,56,108,198,198,254,198,198,198,0,0,0,0,56,108,56,0,56,108,198,198,
                  254,198,198,198,0,0,0,0,24,48,96,0,254,102,96,124,96,96,102,254,0,0,0,0,0,0,0,0,0,204,118,54,126,216,216,110,0,0,0,0,0,0,
                  62,108,204,204,254,204,204,204,204,206,0,0,0,0,0,16,56,108,0,124,198,198,198,198,198,124,0,0,0,0,0,0,198,0,0,124,198,198,
                  198,198,198,124,0,0,0,0,0,96,48,24,0,124,198,198,198,198,198,124,0,0,0,0,0,48,120,204,0,204,204,204,204,204,204,118,0,0,0,
                  0,0,96,48,24,0,204,204,204,204,204,204,118,0,0,0,0,0,0,198,0,0,198,198,198,198,198,198,126,6,12,120,0,0,198,0,124,198,198,
                  198,198,198,198,198,124,0,0,0,0,0,198,0,198,198,198,198,198,198,198,198,124,0,0,0,0,0,24,24,60,102,96,96,96,102,60,24,24,
                  0,0,0,0,0,56,108,100,96,240,96,96,96,96,230,252,0,0,0,0,0,0,102,102,60,24,126,24,126,24,24,24,0,0,0,0,0,248,204,204,248,196,
                  204,222,204,204,204,198,0,0,0,0,0,14,27,24,24,24,126,24,24,24,24,24,216,112,0,0,0,24,48,96,0,120,12,124,204,204,204,118,0,
                  0,0,0,0,12,24,48,0,56,24,24,24,24,24,60,0,0,0,0,0,24,48,96,0,124,198,198,198,198,198,124,0,0,0,0,0,24,48,96,0,204,204,204,
                  204,204,204,118,0,0,0,0,0,0,118,220,0,220,102,102,102,102,102,102,0,0,0,0,118,220,0,198,230,246,254,222,206,198,198,198,0,
                  0,0,0,0,60,108,108,62,0,126,0,0,0,0,0,0,0,0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,0,0,0,0,48,48,0,48,48,96,192,198,198,124,
                  0,0,0,0,0,0,0,0,0,0,254,192,192,192,192,0,0,0,0,0,0,0,0,0,0,0,254,6,6,6,6,0,0,0,0,0,0,192,192,194,198,204,24,48,96,220,134,
                  12,24,62,0,0,0,192,192,194,198,204,24,48,102,206,158,62,6,6,0,0,0,0,24,24,0,24,24,24,60,60,60,24,0,0,0,0,0,0,0,0,0,54,108,
                  216,108,54,0,0,0,0,0,0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,0,17,68,17,68,17,68,17,68,17,68,17,68,17,68,17,68,85,170,85,
                  170,85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,221,119,221,119,221,119,221,119,24,24,24,24,
                  24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,24,24,24,24,24,24,248,24,248,24,24,24,24,
                  24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,54,54,54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,54,54,0,0,0,0,0,248,24,248,
                  24,24,24,24,24,24,24,24,54,54,54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
                  0,0,0,0,0,254,6,246,54,54,54,54,54,54,54,54,54,54,54,54,54,246,6,254,0,0,0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,0,0,0,0,
                  0,0,24,24,24,24,24,248,24,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,31,0,0,0,0,0,
                  0,0,0,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,24,24,
                  24,24,24,24,24,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,255,24,24,24,24,24,24,24,24,24,24,24,24,24,31,24,31,
                  24,24,24,24,24,24,24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,54,54,54,54,54,54,54,55,48,63,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  63,48,55,54,54,54,54,54,54,54,54,54,54,54,54,54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,247,54,54,54,54,54,54,54,54,54,
                  54,54,54,54,55,48,55,54,54,54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,54,
                  54,54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,0,0,54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,24,24,24,24,
                  24,24,24,24,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,63,0,0,0,0,0,0,0,0,24,24,24,24,24,31,24,31,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,31,24,31,24,24,24,24,24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,255,
                  54,54,54,54,54,54,54,54,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,31,24,24,24,24,24,24,24,24,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,255,
                  255,255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,15,15,
                  15,15,15,15,15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,220,216,216,216,220,118,0,0,0,0,0,0,120,204,
                  204,204,216,204,198,198,198,204,0,0,0,0,0,0,254,198,198,192,192,192,192,192,192,192,0,0,0,0,0,0,0,0,254,108,108,108,108,108,
                  108,108,0,0,0,0,0,0,0,254,198,96,48,24,48,96,198,254,0,0,0,0,0,0,0,0,0,126,216,216,216,216,216,112,0,0,0,0,0,0,0,0,102,102,
                  102,102,102,124,96,96,192,0,0,0,0,0,0,0,118,220,24,24,24,24,24,24,0,0,0,0,0,0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,
                  0,0,56,108,198,198,254,198,198,108,56,0,0,0,0,0,0,56,108,198,198,198,108,108,108,108,238,0,0,0,0,0,0,30,48,24,12,62,102,102,
                  102,102,60,0,0,0,0,0,0,0,0,0,126,219,219,219,126,0,0,0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,192,0,0,0,0,0,0,28,48,96,96,
                  124,96,96,96,48,28,0,0,0,0,0,0,0,124,198,198,198,198,198,198,198,198,0,0,0,0,0,0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,0,0,
                  0,24,24,126,24,24,0,0,255,0,0,0,0,0,0,0,48,24,12,6,12,24,48,0,126,0,0,0,0,0,0,0,12,24,48,96,48,24,12,0,126,0,0,0,0,0,0,14,
                  27,27,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,216,112,0,0,0,0,0,0,0,0,24,24,0,126,0,24,24,0,0,0,
                  0,0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,0,0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,24,0,0,0,0,0,0,0,0,15,12,12,12,12,12,236,108,108,60,28,0,0,0,0,0,216,108,108,108,108,108,0,0,0,0,0,0,0,0,0,0,112,
                  216,48,96,200,248,0,0,0,0,0,0,0,0,0,0,0,0,0,124,124,124,124,124,124,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,
                  0,0,0,36,102,255,102,36,0,0,0,0,0,0,48,0,0,60,102,195,195,219,219,195,195,102,60,0,0,0,0,77,0,0,195,231,255,255,219,195,195,
                  195,195,195,0,0,0,0,84,0,0,255,219,153,24,24,24,24,24,24,60,0,0,0,0,86,0,0,195,195,195,195,195,195,195,102,60,24,0,0,0,0,
                  87,0,0,195,195,195,195,195,219,219,255,102,102,0,0,0,0,88,0,0,195,195,102,60,24,24,60,102,195,195,0,0,0,0,89,0,0,195,195,
                  195,102,60,24,24,24,24,60,0,0,0,0,90,0,0,255,195,134,12,24,48,96,193,195,255,0,0,0,0,109,0,0,0,0,0,230,255,219,219,219,219,
                  219,0,0,0,0,118,0,0,0,0,0,195,195,195,195,102,60,24,0,0,0,0,119,0,0,0,0,0,195,195,195,219,219,255,102,0,0,0,0,120,0,0,0,0,
                  0,195,102,60,24,60,102,195,0,0,0,0,145,0,0,0,0,0,110,59,27,126,216,220,119,0,0,0,0,155,0,24,24,126,195,192,192,192,195,126,
                  24,24,0,0,0,0,157,0,0,195,102,60,24,255,24,255,24,24,24,0,0,0,0,158,0,252,102,102,124,98,102,111,102,102,102,243,0,0,0,0,
                  171,0,192,192,194,198,204,24,48,96,206,155,6,12,31,0,0,172,0,192,192,194,198,204,24,48,102,206,150,62,6,6,0,0,0,0,30] 
                  
                • ibm-vga.nasm
                  ;
                  ;   ROM BIOS for IBM VGA Adapter (aka IBM PS/2 Display Adapter)
                  ;   (C)COPYRIGHT IBM Corp. 1984, 1986 10/27/86
                  ;
                  ;   Listing produced by NDISASM, 2015-May-19
                  ;   Additional post-processing performed by the PCjs TextOut module
                  ;   All post-processing, comments, etc copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
                  ;
                  ;   This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
                  ;   at <http://jsmachines.net/> and <http://pcjs.org/>.
                  ;
                  ;   PCjs is free software: you can redistribute it and/or modify it under the terms of the
                  ;   GNU General Public License as published by the Free Software Foundation, either version 3
                  ;   of the License, or (at your option) any later version.
                  ;
                  ;   PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
                  ;   even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                  ;   GNU General Public License for more details.
                  ;
                  ;   You should have received a copy of the GNU General Public License along with PCjs.  If not,
                  ;   see <http://www.gnu.org/licenses/gpl.html>.
                  ;
                  
                  	db	0x55,0xAA
                  	dw	0xEB30
                  
                  	db	'674008222554 (C)COPYRIGHT IBM Corp. 1984, 1986 10/27/86'
                  
                  	push	bp			; 0000003B  55
                  	mov	ds,[cs:0x71c]		; 0000003C  2E8E1E1C07
                  	mov	ax,0x1201		; 00000041  B80112  '...'
                  	mov	bl,0x32			; 00000044  B332  '.2'
                  	int	0x10			; 00000046  CD10  '..'
                  	cli				; 00000048  FA  '.'
                  	mov	word [0x40],0x6e1	; 00000049  C7064000E106  '..@...'
                  	mov	[0x42],cs		; 0000004F  8C0E4200  '..B.'
                  	mov	word [0x1b4],0x6e4	; 00000053  C706B401E406  '......'
                  	mov	[0x1b6],cs		; 00000059  8C0EB601  '....'
                  	mov	word [0x108],0xf065	; 0000005D  C706080165F0  '....e.'
                  	mov	word [0x10a],0xf000	; 00000063  C7060A0100F0  '..',0x0A,'...'
                  	mov	word [0x4a8],0x5c6	; 00000069  C706A804C605  '......'
                  	mov	[0x4aa],cs		; 0000006F  8C0EAA04  '....'
                  	mov	word [0x7c],0x3b8d	; 00000073  C7067C008D3B  '..|..;'
                  	mov	[0x7e],cs		; 00000079  8C0E7E00  '..~.'
                  	mov	word [0x10c],font_8x8	; 0000007D  C7060C018D37  '.....7'
                  	mov	[0x10e],cs		; 00000083  8C0E0E01  '....'
                  	sti				; 00000087  FB  '.'
                  	mov	byte [0x489],0x11	; 00000088  C606890411  '.....'
                  ;
                  ;   Initialize the ROM BIOS Video Mode Options byte @40:0087 (default to color and 256Kb of RAM)
                  ;
                  	mov	byte [0x487],0x60	; 0000008D
                  ;
                  ;   The x100 subroutine alternately enables port 0x3B? and 0x3D? decoding, verifying that there is
                  ;   no response on opposing ports 0x3D? and 0x3B?, respectively; otherwise, it assumes that another
                  ;   video card must exist and attempts to select co-existing settings for the VGA.  For example, if
                  ;   there is an unexpected response on the color ports, the VGA ROM will default to mono operation.
                  ;
                  	call	x100			; 00000092
                  ;
                  ;   From the "IBM Personal System/2 Model 50 and 60 Technical Reference: I/O Controllers, Video Subsystem", p.4-29:
                  ;
                  ;   When in setup mode (I/O address hex 0094, bit 5 equals 0), the VGA responds to a single option select byte
                  ;   at I/O address hex 0102 and treats the LSB (bit 0) of that byte as the VGA sleep bit.  When the LSB equals 0,
                  ;   the VGA does not respond to commands, addresses, or data, on the data bus.  When the LSB equals 1, the VGA
                  ;   responds.  If the VGA was set up and is generating video output when the LSB is set to 0, the output is still
                  ;   generated.
                  ;
                  ;   The VGA responds only to address hex 0102 when in the setup mode.  No other addresses are valid at that time.
                  ;   Conversely, the VGA ignores address hex 0102 when in the enabled mode (I/O address hex 0094, bit 5 equals 1),
                  ;   and decodes normal I/O and memory addresses.
                  ;
                  	cli				; 00000095  FA  '.'
                  	mov	dx,0x46e8		; 00000096  BAE846  '..F'
                  	mov	ax,0x16			; 00000099  B81600  '...'
                  	out	dx,ax			; 0000009C  EF  '.'
                  	mov	dx,0x102		; 0000009D  BA0201  '...'
                  	mov	ax,0x1			; 000000A0  B80100  '...'
                  	out	dx,ax			; 000000A3  EF  '.'
                  	mov	dx,0x46e8		; 000000A4  BAE846  '..F'
                  	mov	ax,0xe			; 000000A7  B80E00  '...'
                  	out	dx,ax			; 000000AA  EF  '.'
                  	mov	dx,0x4ae8		; 000000AB  BAE84A  '..J'
                  	xor	ax,ax			; 000000AE  33C0  '3.'
                  	out	dx,ax			; 000000B0  EF  '.'
                  	sti				; 000000B1  FB  '.'
                  	push	cs			; 000000B2  0E  '.'
                  	pop	es			; 000000B3  07  '.'
                  ;
                  ;   Default to mono settings
                  ;
                  	mov	di,0x3b4		; 000000B4  BFB403  '...'
                  	mov	bx,0x1602		; 000000B7  BB0216  '...'
                  ;
                  ;   Test bit 1 of ROM BIOS Video Mode Options byte @40:0087 (set if mono, clear if color)
                  ;
                  	test	byte [0x487],0x2	; 000000BA  F606870402  '.....'
                  	jnz	xc7			; 000000BF  7506  'u.'
                  ;
                  ;   Choose color settings
                  ;
                  	mov	di,0x3d4		; 000000C1  BFD403  '...'
                  	mov	bx,0x1642		; 000000C4  BB4216  '.B.'
                  ;
                  ;   Set the CRTC base port address (0x3B4 for mono, 0x3D4 for color)
                  ;
                  xc7:	mov	[0x463],di		; 000000C7  893E6304  '.>c.'
                  ;
                  ;   Program the card for a default mode
                  ;
                  	call	x1127			; 000000CB  E85910  '.Y.'
                  
                  	xor	al,al			; 000000CE  32C0  '2.'
                  	out	dx,al			; 000000D0  EE  '.'
                  	call	x547			; 000000D1  E87304  '.s.'
                  	xor	bp,bp			; 000000D4  33ED  '3.'
                  	call	x1e5			; 000000D6  E80C01  '...'
                  	call	x2d6			; 000000D9  E8FA01  '...'
                  	call	x364			; 000000DC  E88502  '...'
                  	test	byte [0x489],0x1	; 000000DF  F606890401  '.....'
                  	jnz	xe9			; 000000E4  7503  'u.'
                  	call	x4c0			; 000000E6  E8D703  '...'
                  xe9:	call	x568			; 000000E9  E87C04  '.|.'
                  	and	al,0xf0			; 000000EC  24F0  '$.'
                  	mov	[0x488],al		; 000000EE  A28804  '...'
                  	call	x14b			; 000000F1  E85700  '.W.'
                  	call	x337			; 000000F4  E84002  '.@.'
                  	cmp	bp,byte +0x2		; 000000F7  83FD02  '...'
                  	jc	xfe			; 000000FA  7202  'r.'
                  	pop	bx			; 000000FC  5B  '['
                  	retf				; 000000FD  CB  '.'
                  
                  xfe:	pop	bp			; 000000FE  5D  ']'
                  	retf				; 000000FF  CB  '.'
                  
                  x100:	mov	bh,0x0			; 00000100  B700  '..'
                  	mov	dx,0x3cc		; 00000102  BACC03  '...'
                  	in	al,dx			; 00000105  EC  '.'
                  	and	al,0xfe			; 00000106  24FE  '$.'
                  	mov	dx,0x3c2		; 00000108  BAC203  '...'
                  	out	dx,al			; 0000010B  EE  '.'
                  	mov	dl,0xd4			; 0000010C  B2D4  '..'
                  	call	x2b6			; 0000010E  E8A501  '...'
                  	jnz	x11e			; 00000111  750B  'u.'
                  	mov	al,0x3			; 00000113  B003  '..'
                  	mov	bh,0x20			; 00000115  B720  '. '
                  	or	byte [0x487],0x2	; 00000117  800E870402  '.....'
                  	jmp	short x138		; 0000011C  EB1A  '..'
                  
                  x11e:	mov	dx,0x3cc		; 0000011E  BACC03  '...'
                  	in	al,dx			; 00000121  EC  '.'
                  	or	al,0x1			; 00000122  0C01  '..'
                  	mov	dx,0x3c2		; 00000124  BAC203  '...'
                  	out	dx,al			; 00000127  EE  '.'
                  	mov	dl,0xb4			; 00000128  B2B4  '..'
                  	call	x2b6			; 0000012A  E88901  '...'
                  	jnz	x14a			; 0000012D  751B  'u.'
                  	mov	al,0x7			; 0000012F  B007  '..'
                  	mov	bh,0x30			; 00000131  B730  '.0'
                  	and	byte [0x487],0xfd	; 00000133  80268704FD  '.&...'
                  x138:	and	byte [0x489],0xfe	; 00000138  80268904FE  '.&...'
                  	and	byte [0x410],0xcf	; 0000013D  80261004CF  '.&...'
                  	or	[0x410],bh		; 00000142  083E1004  '.>..'
                  	mov	ah,0x0			; 00000146  B400  '..'
                  	int	0x42			; 00000148  CD42  '.B'
                  x14a:	ret				; 0000014A  C3  '.'
                  
                  x14b:	test	byte [0x489],0x1	; 0000014B  F606890401  '.....'
                  	jz	x16a			; 00000150  7418  't.'
                  	or	byte [0x487],0x2	; 00000152  800E870402  '.....'
                  	test	byte [0x487],0x8	; 00000157  F606870408  '.....'
                  	jnz	x16a			; 0000015C  750C  'u.'
                  	test	byte [0x489],0x4	; 0000015E  F606890404  '.....'
                  	jnz	x16a			; 00000163  7505  'u.'
                  	and	byte [0x487],0xfd	; 00000165  80268704FD  '.&...'
                  x16a:	test	byte [0x487],0x2	; 0000016A  F606870402  '.....'
                  	jnz	x178			; 0000016F  7507  'u.'
                  	mov	bx,0x2009		; 00000171  BB0920  '.. '
                  	mov	al,0x3			; 00000174  B003  '..'
                  	jmp	short x17d		; 00000176  EB05  '..'
                  
                  x178:	mov	bx,0x300b		; 00000178  BB0B30  '..0'
                  	mov	al,0x7			; 0000017B  B007  '..'
                  x17d:	and	byte [0x410],0xcf	; 0000017D  80261004CF  '.&...'
                  	or	[0x410],bh		; 00000182  083E1004  '.>..'
                  	and	byte [0x488],0xf0	; 00000186  80268804F0  '.&...'
                  	or	[0x488],bl		; 0000018B  081E8804  '....'
                  	mov	bl,[0x487]		; 0000018F  8A1E8704  '....'
                  	and	byte [0x487],0xf7	; 00000193  80268704F7  '.&...'
                  	mov	bh,[0x489]		; 00000198  8A3E8904  '.>..'
                  	and	byte [0x489],0xfe	; 0000019C  80268904FE  '.&...'
                  	mov	ah,0x0			; 000001A1  B400  '..'
                  	int	0x10			; 000001A3  CD10  '..'
                  	and	bh,0x1			; 000001A5  80E701  '...'
                  	or	[0x489],bh		; 000001A8  083E8904  '.>..'
                  	test	bl,0x8			; 000001AC  F6C308  '...'
                  	jz	x1e4			; 000001AF  7433  't3'
                  	test	byte [0x489],0x1	; 000001B1  F606890401  '.....'
                  	jnz	x1e4			; 000001B6  752C  'u,'
                  	mov	al,0x7			; 000001B8  B007  '..'
                  	mov	bx,0x3003		; 000001BA  BB0330  '..0'
                  	test	byte [0x487],0x2	; 000001BD  F606870402  '.....'
                  	jz	x1c9			; 000001C2  7405  't.'
                  	mov	al,0x3			; 000001C4  B003  '..'
                  	mov	bx,0x2005		; 000001C6  BB0520  '.. '
                  x1c9:	and	byte [0x410],0xcf	; 000001C9  80261004CF  '.&...'
                  	or	[0x410],bh		; 000001CE  083E1004  '.>..'
                  	and	byte [0x488],0xf0	; 000001D2  80268804F0  '.&...'
                  	or	[0x488],bl		; 000001D7  081E8804  '....'
                  	or	byte [0x487],0x8	; 000001DB  800E870408  '.....'
                  	mov	ah,0x0			; 000001E0  B400  '..'
                  	int	0x10			; 000001E2  CD10  '..'
                  x1e4:	ret				; 000001E4  C3  '.'
                  
                  x1e5:	mov	dx,[0x463]		; 000001E5  8B166304  '..c.'
                  	add	dl,0x6			; 000001E9  80C206  '...'
                  	mov	bx,0x1			; 000001EC  BB0100  '...'
                  	mov	al,0x30			; 000001EF  B030  '.0'
                  	out	0x43,al			; 000001F1  E643  '.C'
                  	mov	al,0x0			; 000001F3  B000  '..'
                  	out	0x40,al			; 000001F5  E640  '.@'
                  
                  	mov	ah,0x2			; 000001F7  B402  '..'
                  ;
                  ;   Verify that VERT_RETRACE (bit 3) is clear occassionally...
                  ;
                  x1f9:	xor	cx,cx			; 000001F9  33C9  '3.'
                  x1fb:	in	al,dx			; 000001FB  EC  '.'
                  	test	al,0x8			; 000001FC  A808  '..'
                  	jz	x205			; 000001FE  7405  't.'
                  	loop	x1fb			; 00000200  E2F9  '..'
                  	jmp	x2aa			; 00000202  Error: VERT_RETRACE remained set
                  
                  ;
                  ;   Verify that VERT_RETRACE (bit 3) is also set occassionally...
                  ;
                  x205:	cli				; 00000205  FA  '.'
                  x206:	in	al,dx			; 00000206  EC  '.'
                  	test	al,0x8			; 00000207  A808  '..'
                  	jnz	x210			; 00000209  7505  'u.'
                  	loop	x206			; 0000020B  E2F9  '..'
                  	jmp	x2aa			; 0000020D  E99A00  '...'
                  ;
                  ;   And perform the two previous verifications a couple of times, just to be sure...
                  ;
                  x210:	dec	ah			; 00000210  FECC  '..'
                  	jnz	x1f9			; 00000212  75E5  'u.'
                  
                  	mov	al,0x0			; 00000214  B000  '..'
                  	out	0x40,al			; 00000216  E640  '.@'
                  	xor	cx,cx			; 00000218  33C9  '3.'
                  x21a:	in	al,dx			; 0000021A  EC  '.'
                  	test	al,0x9			; 0000021B  A809  '..'
                  	loopne	x21a			; 0000021D  E0FB  '..'
                  	jcxz	x239			; 0000021F  E318  '..'
                  
                  x221:	mov	cx,0xffff		; 00000221  B9FFFF  '...'
                  x224:	in	al,dx			; 00000224  EC  '.'
                  	test	al,0x1			; 00000225  A801  '..'
                  	loope	x224			; 00000227  E1FB  '..'
                  	jcxz	x239			; 00000229  E30E  '..'
                  x22b:	in	al,dx			; 0000022B  EC  '.'
                  	test	al,0x8			; 0000022C  A808  '..'
                  	jnz	x23b			; 0000022E  750B  'u.'
                  	test	al,0x1			; 00000230  A801  '..'
                  	loopne	x22b			; 00000232  E0F7  '..'
                  	jcxz	x239			; 00000234  E303  '..'
                  	inc	bx			; 00000236  43  'C'
                  	jnz	x221			; 00000237  75E8  'u.'
                  x239:	jmp	short x2aa		; 00000239  EB6F  '.o'
                  
                  x23b:	mov	al,0x0			; 0000023B  B000  '..'
                  	out	0x43,al			; 0000023D  E643  '.C'
                  	in	al,0x40			; 0000023F  E440  '.@'
                  	mov	ah,al			; 00000241  8AE0  '..'
                  	jmp	short x245		; 00000243  EB00  '..'
                  
                  x245:	in	al,0x40			; 00000245  E440  '.@'
                  	xchg	ah,al			; 00000247  86E0  '..'
                  	sti				; 00000249  FB  '.'
                  	cmp	bx,0x19a		; 0000024A  81FB9A01  '....'
                  	ja	x2aa			; 0000024E  775A  'wZ'
                  	cmp	bx,0x186		; 00000250  81FB8601  '....'
                  	jc	x2aa			; 00000254  7254  'rT'
                  	cmp	ax,0x6e8c		; 00000256  3D8C6E  '=.n'
                  	jc	x2aa			; 00000259  724F  'rO'
                  	cmp	ax,0x871d		; 0000025B  3D1D87  '=..'
                  	ja	x2aa			; 0000025E  774A  'wJ'
                  	cld				; 00000260  FC  '.'
                  	mov	ax,0xa000		; 00000261  B800A0  '...'
                  	mov	es,ax			; 00000264  8EC0  '..'
                  	xor	di,di			; 00000266  33FF  '3.'
                  	mov	cx,0x28			; 00000268  B92800  '.(.'
                  	mov	ax,0xffff		; 0000026B  B8FFFF  '...'
                  	rep	stosw			; 0000026E  F3AB  '..'
                  	mov	bh,0xf			; 00000270  B70F  '..'
                  	mov	bl,0xc0			; 00000272  B3C0  '..'
                  x274:	in	al,dx			; 00000274  EC  '.'
                  	xchg	bl,dl			; 00000275  86DA  '..'
                  	mov	al,0x32			; 00000277  B032  '.2'
                  	out	dx,al			; 00000279  EE  '.'
                  	mov	al,bh			; 0000027A  8AC7  '..'
                  	out	dx,al			; 0000027C  EE  '.'
                  	xchg	dl,bl			; 0000027D  86D3  '..'
                  	xor	cx,cx			; 0000027F  33C9  '3.'
                  x281:	in	al,dx			; 00000281  EC  '.'
                  	test	al,0x30			; 00000282  A830  '.0'
                  	jnz	x28a			; 00000284  7504  'u.'
                  	loop	x281			; 00000286  E2F9  '..'
                  	jmp	short x2aa		; 00000288  EB20  '. '
                  
                  x28a:	xor	cx,cx			; 0000028A  33C9  '3.'
                  x28c:	in	al,dx			; 0000028C  EC  '.'
                  	test	al,0x30			; 0000028D  A830  '.0'
                  	jz	x295			; 0000028F  7404  't.'
                  	loop	x28c			; 00000291  E2F9  '..'
                  	jmp	short x2aa		; 00000293  EB15  '..'
                  
                  x295:	add	bh,0x10			; 00000295  80C710  '...'
                  	cmp	bh,0x3f			; 00000298  80FF3F  '..?'
                  	jnz	x274			; 0000029B  75D7  'u.'
                  x29d:	mov	al,0x36			; 0000029D  B036  '.6'
                  	out	0x43,al			; 0000029F  E643  '.C'
                  	sub	al,al			; 000002A1  2AC0  '*.'
                  	out	0x40,al			; 000002A3  E640  '.@'
                  	jmp	short x2a7		; 000002A5  EB00  '..'
                  
                  x2a7:	out	0x40,al			; 000002A7  E640  '.@'
                  	ret				; 000002A9  C3  '.'
                  
                  x2aa:	sti				; 000002AA  FB  '.'
                  	mov	dx,0x103		; 000002AB  BA0301  '...'
                  	call	beeps			; 000002AE  E8DF02  '...'
                  	mov	bp,0x2			; 000002B1  BD0200  '...'
                  	jmp	short x29d		; 000002B4  EBE7  '..'
                  
                  x2b6:	mov	al,0xf			; 000002B6  B00F  '..'
                  	out	dx,al			; 000002B8  EE  '.'
                  	mov	bl,0xff			; 000002B9  B3FF  '..'
                  	inc	dx			; 000002BB  42  'B'
                  	in	al,dx			; 000002BC  EC  '.'
                  	push	ax			; 000002BD  50  'P'
                  	mov	al,0x1a			; 000002BE  B01A  '..'
                  	out	dx,al			; 000002C0  EE  '.'
                  	jmp	short x2c3		; 000002C1  EB00  '..'
                  
                  x2c3:	in	al,dx			; 000002C3  EC  '.'
                  	cmp	al,0x1a			; 000002C4  3C1A  '<.'
                  	jnz	x2d0			; 000002C6  7508  'u.'
                  	mov	al,0x25			; 000002C8  B025  '.%'
                  	out	dx,al			; 000002CA  EE  '.'
                  	jmp	short x2cd		; 000002CB  EB00  '..'
                  
                  x2cd:	in	al,dx			; 000002CD  EC  '.'
                  	mov	bl,al			; 000002CE  8AD8  '..'
                  x2d0:	pop	ax			; 000002D0  58  'X'
                  	out	dx,al			; 000002D1  EE  '.'
                  	cmp	bl,0x25			; 000002D2  80FB25  '..%'
                  	ret				; 000002D5  C3  '.'
                  
                  x2d6:	mov	ax,0xa000		; 000002D6  B800A0  '...'
                  	mov	es,ax			; 000002D9  8EC0  '..'
                  	mov	bx,0x8000		; 000002DB  BB0080  '...'
                  	mov	si,0x0			; 000002DE  BE0000  '...'
                  	call	x2f0			; 000002E1  E80C00  '...'
                  	jz	x2ef			; 000002E4  7409  't.'
                  	mov	dx,0x103		; 000002E6  BA0301  '...'
                  	call	beeps			; 000002E9  E8A402  '...'
                  	mov	bp,0x2			; 000002EC  BD0200  '...'
                  x2ef:	ret				; 000002EF  C3  '.'
                  
                  x2f0:	cld				; 000002F0  FC  '.'
                  	mov	ax,0xaaaa		; 000002F1  B8AAAA  '...'
                  	mov	cx,bx			; 000002F4  8BCB  '..'
                  	xor	di,di			; 000002F6  33FF  '3.'
                  	rep	stosw			; 000002F8  F3AB  '..'
                  	mov	cx,bx			; 000002FA  8BCB  '..'
                  	xor	di,di			; 000002FC  33FF  '3.'
                  	repe	scasw			; 000002FE  F3AF  '..'
                  	jnz	x311			; 00000300  750F  'u.'
                  	mov	ax,0x5555		; 00000302  B85555  '.UU'
                  	mov	cx,bx			; 00000305  8BCB  '..'
                  	xor	di,di			; 00000307  33FF  '3.'
                  	rep	stosw			; 00000309  F3AB  '..'
                  	mov	cx,bx			; 0000030B  8BCB  '..'
                  	xor	di,di			; 0000030D  33FF  '3.'
                  	repe	scasw			; 0000030F  F3AF  '..'
                  x311:	pushf				; 00000311  9C  '.'
                  	mov	ax,si			; 00000312  8BC6  '..'
                  	mov	cx,bx			; 00000314  8BCB  '..'
                  	xor	di,di			; 00000316  33FF  '3.'
                  	rep	stosw			; 00000318  F3AB  '..'
                  	popf				; 0000031A  9D  '.'
                  	ret				; 0000031B  C3  '.'
                  
                  x31c:	mov	ax,0xc600		; 0000031C  B800C6  '...'
                  	mov	es,ax			; 0000031F  8EC0  '..'
                  	mov	si,0x3d4		; 00000321  BED403  '...'
                  	mov	ah,[es:si]		; 00000324  268A24  '&.$'
                  	mov	byte [es:si],0x28	; 00000327  26C60428  '&..('
                  	mov	dx,0x3d4		; 0000032B  BAD403  '...'
                  	push	ds			; 0000032E  1E  '.'
                  	pop	ds			; 0000032F  1F  '.'
                  	in	al,dx			; 00000330  EC  '.'
                  	mov	[es:si],ah		; 00000331  268824  '&.$'
                  	cmp	al,0x28			; 00000334  3C28  '<('
                  	ret				; 00000336  C3  '.'
                  
                  x337:	mov	bh,0x7			; 00000337  B707  '..'
                  	test	byte [0x487],0x2	; 00000339  F606870402  '.....'
                  	jnz	x342			; 0000033E  7502  'u.'
                  	mov	bh,0x8			; 00000340  B708  '..'
                  x342:	mov	bl,0x0			; 00000342  B300  '..'
                  	test	byte [0x489],0x1	; 00000344  F606890401  '.....'
                  	jnz	x35d			; 00000349  7512  'u.'
                  	mov	bl,0x1			; 0000034B  B301  '..'
                  	test	byte [0x487],0x2	; 0000034D  F606870402  '.....'
                  	jz	x35d			; 00000352  7409  't.'
                  	mov	bl,0x2			; 00000354  B302  '..'
                  	call	x31c			; 00000356  E8C3FF  '...'
                  	jnz	x35d			; 00000359  7502  'u.'
                  	mov	bl,0x6			; 0000035B  B306  '..'
                  x35d:	call	xa5c			; 0000035D  E8FC06  '...'
                  	mov	[0x48a],al		; 00000360  A28A04  '...'
                  	ret				; 00000363  C3  '.'
                  
                  x364:	mov	ah,0x1a			; 00000364  B41A  '..'
                  	call	x3e6			; 00000366  E87D00  '.}.'
                  	call	x3fa			; 00000369  E88E00  '...'
                  	jnz	x378			; 0000036C  750A  'u',0x0A
                  	mov	ah,0x25			; 0000036E  B425  '.%'
                  	call	x3e6			; 00000370  E87300  '.s.'
                  	call	x3fa			; 00000373  E88400  '...'
                  	jz	x381			; 00000376  7409  't.'
                  x378:	mov	dx,0x103		; 00000378  BA0301  '...'
                  	call	beeps			; 0000037B  E81202  '...'
                  	mov	bp,0x2			; 0000037E  BD0200  '...'
                  x381:	mov	dx,0x3c6		; 00000381  BAC603  '...'
                  	mov	al,0x0			; 00000384  B000  '..'
                  	out	dx,al			; 00000386  EE  '.'
                  	mov	ah,0x0			; 00000387  B400  '..'
                  	call	x3e6			; 00000389  E85A00  '.Z.'
                  
                  	mov	ah,0x0			; 0000038C  B400  '..'
                  	call	x127a			; 0000038E  E8E90E  '...'
                  
                  	mov	si,x454			; 00000391  BE5404  '.T.'
                  	mov	cx,0x1			; 00000394  B90100  '...'
                  	call	x40c			; 00000397  E87200  '.r.'
                  	jz	x3bc			; 0000039A  7420  't '
                  
                  	mov	si,x450			; 0000039C  BE5004  '.P.'
                  	mov	cx,0x1			; 0000039F  B90100  '...'
                  	call	x40c			; 000003A2  E86700  '.g.'
                  	jz	x3cc			; 000003A5  7425  't%'
                  ;
                  ;   Set the "video subsystem inactive" (bit 3) in 0x40:0x87, and the
                  ;   "grayscale" (bit 1) and "monochrome monitor" (bit 2) in 0x40:0x89.
                  ;
                  	or	byte [0x487],0x8	; 000003A7  800E870408  '.....'
                  	or	byte [0x489],0x6	; 000003AC  800E890406  '.....'
                  	mov	si,0x458		; 000003B1  BE5804  '.X.'
                  	mov	cx,0x5			; 000003B4  B90500  '...'
                  	call	x40c			; 000003B7  E85200  '.R.'
                  	jmp	short x3da		; 000003BA  EB1E  '..'
                  ;
                  ;   Clear the "monochrome monitor" (bit 2) in 0x40:0x89.
                  ;
                  x3bc:	and	byte [0x489],0xfb	; 000003BC  80268904FB  '.&...'
                  
                  	mov	si,x428			; 000003C1  BE2804  '.(.'
                  	mov	cx,0x5			; 000003C4  B90500  '...'
                  	call	x40c			; 000003C7  E84200  '.B.'
                  	jmp	short x3da		; 000003CA  EB0E  '..'
                  ;
                  ;   Set the "grayscale" (bit 1) and "monochrome monitor" (bit 2) in 0x40:0x89.
                  ;
                  x3cc:	or	byte [0x489],0x6	; 000003CC  800E890406  '.....'
                  	mov	si,x43c			; 000003D1  BE3C04  '.<.'
                  	mov	cx,0x5			; 000003D4  B90500  '...'
                  	call	x40c			; 000003D7  E83200  '.2.'
                  x3da:	jz	x3e5			; 000003DA  7409  't.'
                  
                  	mov	dx,0x103		; 000003DC  BA0301  '...'
                  	call	beeps			; 000003DF  E8AE01  '...'
                  	add	bp,byte +0x1		; 000003E2  83C501  '...'
                  x3e5:	ret				; 000003E5  C3  '.'
                  
                  x3e6:	mov	dx,0x3c8		; 000003E6  BAC803  '...'
                  	mov	al,0x0			; 000003E9  B000  '..'
                  	out	dx,al			; 000003EB  EE  '.'
                  	mov	cx,0x300		; 000003EC  B90003  '...'
                  	mov	dx,0x3c9		; 000003EF  BAC903  '...'
                  	mov	al,ah			; 000003F2  8AC4  '..'
                  x3f4:	out	dx,al			; 000003F4  EE  '.'
                  	jmp	short x3f7		; 000003F5  EB00  '..'
                  
                  x3f7:	loop	x3f4			; 000003F7  E2FB  '..'
                  	ret				; 000003F9  C3  '.'
                  
                  x3fa:	mov	dx,0x3c7		; 000003FA  BAC703  '...'
                  	out	dx,al			; 000003FD  EE  '.'
                  	mov	cx,0x300		; 000003FE  B90003  '...'
                  	mov	dx,0x3c9		; 00000401  BAC903  '...'
                  x404:	in	al,dx			; 00000404  EC  '.'
                  	cmp	al,ah			; 00000405  3AC4  ':.'
                  	jnz	x40b			; 00000407  7502  'u.'
                  	loop	x404			; 00000409  E2F9  '..'
                  x40b:	ret				; 0000040B  C3  '.'
                  
                  x40c:	mov	al,[cs:si]		; 0000040C  2E8A04  '...'
                  	mov	ah,[cs:si+0x1]		; 0000040F  2E8A6401  '..d.'
                  	mov	bl,[cs:si+0x2]		; 00000413  2E8A5C02  '..\.'
                  	push	cx			; 00000417  51  'Q'
                  	call	x46c			; 00000418  E85100
                  	pop	cx			; 0000041B  59  'Y'
                  	add	si,byte +0x4		; 0000041C  83C604  '...'
                  	cmp	al,[cs:si-0x1]		; 0000041F  2E3A44FF  '.:D.'
                  	jnz	x427			; 00000423  7502  'u.'
                  	loop	x40c			; 00000425  E2E5  '..'
                  x427:	ret				; 00000427  C3  '.'
                  
                  x428:	db	0x14,0x14,0x14,0x10
                  	db	0x2D,0x14,0x14,0x00
                  	db	0x14,0x2D,0x14,0x00
                  	db	0x14,0x14,0x2D,0x00
                  	db	0x2D,0x2D,0x2D,0x00
                  
                  x43c:	db	0x04,0x12,0x04,0x10
                  	db	0x1E,0x12,0x04,0x00
                  	db	0x04,0x2D,0x04,0x00
                  	db	0x04,0x16,0x15,0x00
                  	db	0x00,0x00,0x00,0x10
                  
                  x450:	db	0x04,0x12,0x04,0x10
                  
                  x454:	db	0x12,0x12,0x12,0x10
                  
                  	db	0x04,0x04,0x04,0x10
                  	db	0x10,0x04,0x04,0x00
                  	db	0x04,0x10,0x04,0x00
                  	db	0x04,0x04,0x10,0x00
                  	db	0x10,0x10,0x10,0x00
                  
                  x46c:	push	ax			; 0000046C  50
                  
                  	mov	dx,[0x0463]		; 0000046D  8B166304
                  	add	dl,0x6			; 00000471  80C206  '...'
                  	mov	bh,dl			; 00000474  8AFA  '..'
                  	xor	cx,cx			; 00000476  33C9  '3.'
                  	cli				; 00000478  FA  '.'
                  x479:	in	al,dx			; 00000479  EC  '.'
                  	test	al,0x8			; 0000047A  A808  '..'
                  	loopne	x479			; 0000047C  E0FB  '..'
                  	xor	cx,cx			; 0000047E  33C9  '3.'
                  x480:	in	al,dx			; 00000480  EC  '.'
                  	test	al,0x8			; 00000481  A808  '..'
                  	loope	x480			; 00000483  E1FB  '..'
                  
                  	mov	al,0x0			; 00000485  B000  '..'
                  	mov	dx,0x3c8		; 00000487  BAC803  '...'
                  	out	dx,al			; 0000048A  EE  '.'
                  
                  	pop	ax			; 0000048B  58  'X'
                  
                  	mov	dx,0x3c9		; 0000048C  BAC903  '...'
                  	out	dx,al			; 0000048F  EE  '.'
                  	jmp	$+2			; 00000490  EB00  '..'
                  	mov	al,ah			; 00000492  8AC4  '..'
                  	out	dx,al			; 00000494  EE  '.'
                  	jmp	$+2			; 00000495  EB00  '..'
                  	mov	al,bl			; 00000497  8AC3  '..'
                  	out	dx,al			; 00000499  EE  '.'
                  
                  	mov	dl,bh			; 0000049A  8AD7  '..'
                  	xor	cx,cx			; 0000049C  33C9  '3.'
                  x49e:	in	al,dx			; 0000049E  EC  '.'
                  	test	al,0x1			; 0000049F  A801  '..'
                  	loopne	x49e			; 000004A1  E0FB  '..'
                  
                  	mov	dl,0xc2			; 000004A3  B2C2  '..'
                  	jmp	$+2			; 000004A5  EB00  '..'
                  	in	al,dx			; 000004A7  EC  '.'
                  	and	al,0x10			; 000004A8  2410  '$.'
                  
                  	push	ax			; 000004AA  50  'P'
                  	mov	al,0x0			; 000004AB  B000  '..'
                  	mov	dx,0x3c8		; 000004AD  BAC803  '...'
                  	out	dx,al			; 000004B0  EE  '.'
                  	jmp	$+2			; 000004B1  EB00  '..'
                  	mov	dx,0x3c9		; 000004B3  BAC903  '...'
                  	out	dx,al			; 000004B6  EE  '.'
                  	jmp	$+2			; 000004B7  EB00  '..'
                  	out	dx,al			; 000004B9  EE  '.'
                  	jmp	$+2			; 000004BA  EB00  '..'
                  	out	dx,al			; 000004BC  EE  '.'
                  	sti				; 000004BD  FB  '.'
                  	pop	ax			; 000004BE  58  'X'
                  
                  	ret				; 000004BF  C3  '.'
                  
                  x4c0:	mov	di,0xb800		; 000004C0  BF00B8  '...'
                  	mov	dx,0x3d8		; 000004C3  BAD803  '...'
                  	mov	bx,0x2000		; 000004C6  BB0020  '.. '
                  	test	byte [0x487],0x2	; 000004C9  F606870402  '.....'
                  	jnz	x4d9			; 000004CE  7509  'u.'
                  	mov	di,0xb000		; 000004D0  BF00B0  '...'
                  	mov	dx,0x3b8		; 000004D3  BAB803  '...'
                  	mov	bx,0x800		; 000004D6  BB0008  '...'
                  x4d9:	mov	es,di			; 000004D9  8EC7  '..'
                  	mov	al,[0x465]		; 000004DB  A06504  '.e.'
                  	and	al,0xf7			; 000004DE  24F7  '$.'
                  	out	dx,al			; 000004E0  EE  '.'
                  	mov	si,0x720		; 000004E1  BE2007  '. .'
                  	call	x2f0			; 000004E4  E809FE  '...'
                  	jz	x4f2			; 000004E7  7409
                  	mov	dx,0x102		; 000004E9  BA0201  '...'
                  	call	beeps			; 000004EC  E8A100  '...'
                  	mov	bp,0x2			; 000004EF  BD0200  '...'
                  x4f2:	mov	ax,0x7020		; 000004F2  B82070  '. p'
                  	xor	di,di			; 000004F5  33FF  '3.'
                  	mov	cx,0x28			; 000004F7  B92800  '.(.'
                  	rep	stosw			; 000004FA  F3AB  '..'
                  	add	dl,0x2			; 000004FC  80C202  '...'
                  	mov	ah,0x8			; 000004FF  B408  '..'
                  	cmp	dl,0xda			; 00000501  80FADA  '...'
                  	jz	x508			; 00000504  7402  't.'
                  	mov	ah,0x1			; 00000506  B401  '..'
                  x508:	xor	cx,cx			; 00000508  33C9  '3.'
                  x50a:	in	al,dx			; 0000050A  EC  '.'
                  	and	al,ah			; 0000050B  22C4  '".'
                  	jnz	x513			; 0000050D  7504  'u.'
                  	loop	x50a			; 0000050F  E2F9  '..'
                  	jmp	short x51c		; 00000511  EB09  '..'
                  
                  x513:	sub	cx,cx			; 00000513  2BC9  '+.'
                  x515:	in	al,dx			; 00000515  EC  '.'
                  	and	al,ah			; 00000516  22C4  '".'
                  	jz	x525			; 00000518  740B  't.'
                  	loop	x515			; 0000051A  E2F9  '..'
                  x51c:	mov	dx,0x102		; 0000051C  BA0201  '...'
                  	call	beeps			; 0000051F  E86E00  '.n.'
                  	mov	bp,0x2			; 00000522  BD0200  '...'
                  x525:	mov	cl,0x3			; 00000525  B103  '..'
                  	shr	ah,cl			; 00000527  D2EC  '..'
                  	jnz	x508			; 00000529  75DD  'u.'
                  	mov	dx,0x3d8		; 0000052B  BAD803  '...'
                  	mov	cx,0x28			; 0000052E  B92800  '.(.'
                  	test	byte [0x487],0x2	; 00000531  F606870402  '.....'
                  	jnz	x53b			; 00000536  7503
                  	mov	dx,0x3b8		; 00000538  BAB803  '...'
                  x53b:	mov	ax,0x720		; 0000053B  B82007  '. .'
                  	xor	di,di			; 0000053E  33FF  '3.'
                  	rep	stosw			; 00000540  F3AB  '..'
                  	mov	al,[0x465]		; 00000542  A06504  '.e.'
                  	out	dx,al			; 00000545  EE  '.'
                  	ret				; 00000546  C3  '.'
                  
                  x547:	in	al,dx			; 00000547  EC  '.'
                  	mov	cx,0x14			; 00000548  B91400  '...'
                  	mov	dl,0xc0			; 0000054B  B2C0  '..'
                  	mov	ah,0x0			; 0000054D  B400  '..'
                  	mov	bx,0x1665		; 0000054F  BB6516  '.e.'
                  x552:	mov	al,ah			; 00000552  8AC4  '..'
                  	out	dx,al			; 00000554  EE  '.'
                  	inc	ah			; 00000555  FEC4  '..'
                  	mov	al,[cs:bx]		; 00000557  2E8A07  '...'
                  	out	dx,al			; 0000055A  EE  '.'
                  	inc	bx			; 0000055B  43  'C'
                  	loop	x552			; 0000055C  E2F4  '..'
                  	mov	al,0x14			; 0000055E  B014  '..'
                  	out	dx,al			; 00000560  EE  '.'
                  	xor	al,al			; 00000561  32C0  '2.'
                  	out	dx,al			; 00000563  EE  '.'
                  	mov	al,0x20			; 00000564  B020  '. '
                  	out	dx,al			; 00000566  EE  '.'
                  	ret				; 00000567  C3  '.'
                  
                  x568:	mov	dx,[0x463]		; 00000568  8B166304  '..c.'
                  	add	dl,0x6			; 0000056C  80C206  '...'
                  	mov	bl,0xc2			; 0000056F  B3C2  '..'
                  	mov	al,0x1			; 00000571  B001  '..'
                  	out	dx,al			; 00000573  EE  '.'
                  	jmp	short x576		; 00000574  EB00  '..'
                  
                  x576:	xchg	bl,dl			; 00000576  86DA  '..'
                  	in	al,dx			; 00000578  EC  '.'
                  	and	al,0x60			; 00000579  2460  '$`'
                  	shr	al,1			; 0000057B  D0E8  '..'
                  	mov	ah,al			; 0000057D  8AE0  '..'
                  	xchg	dl,bl			; 0000057F  86D3  '..'
                  	mov	al,0x2			; 00000581  B002  '..'
                  	out	dx,al			; 00000583  EE  '.'
                  	jmp	short x586		; 00000584  EB00  '..'
                  
                  x586:	xchg	bl,dl			; 00000586  86DA  '..'
                  	in	al,dx			; 00000588  EC  '.'
                  	and	al,0x60			; 00000589  2460  '$`'
                  	shl	al,1			; 0000058B  D0E0  '..'
                  	or	al,ah			; 0000058D  0AC4  0x0A,'.'
                  	ret				; 0000058F  C3  '.'
                  
                  ;
                  ;   (DH) = number of (long?) beeps
                  ;   (DL) = number of (short?) beeps
                  ;
                  beeps:	pushf				; 00000590  9C  '.'
                  	cli				; 00000591  FA  '.'
                  	or	bp,bp			; 00000592  0BED  '..'
                  	jz	x598			; 00000594  7402  't.'
                  	xor	dx,dx			; 00000596  33D2  '3.'
                  x598:	or	dh,dh			; 00000598  0AF6  0x0A,'.'
                  	jz	x5b0			; 0000059A  7414  't.'
                  x59c:	mov	bl,0x5			; 0000059C  B305  '..'
                  	mov	cx,0x533		; 0000059E  B93305  '.3.'
                  	call	beep			; 000005A1  E8E200  '...'
                  	xor	cx,cx			; 000005A4  33C9  '3.'
                  x5a6:	loop	x5a6			; 000005A6  E2FE  '..'
                  	dec	dh			; 000005A8  FECE  '..'
                  	jnz	x59c			; 000005AA  75F0  'u.'
                  	xor	cx,cx			; 000005AC  33C9  '3.'
                  x5ae:	loop	x5ae			; 000005AE  E2FE  '..'
                  x5b0:	or	dl,dl			; 000005B0  0AD2  0x0A,'.'
                  	jz	x5c4			; 000005B2  7410  't.'
                  x5b4:	mov	bl,0x1			; 000005B4  B301  '..'
                  	mov	cx,0x533		; 000005B6  B93305  '.3.'
                  	call	beep			; 000005B9  E8CA00  '...'
                  	xor	cx,cx			; 000005BC  33C9  '3.'
                  x5be:	loop	x5be			; 000005BE  E2FE  '..'
                  	dec	dl			; 000005C0  FECA  '..'
                  	jnz	x5b4			; 000005C2  75F0  'u.'
                  x5c4:	popf				; 000005C4  9D  '.'
                  	ret				; 000005C5  C3  '.'
                  
                  	inc	dx			; 000005C6  42  'B'
                  	adc	ax,[bx+si]		; 000005C7  1300  '..'
                  	rol	byte [bx+si],0x0	; 000005C9  C00000  '...'
                  
                  	times	5 dw 0x0000		; 000005CC - 000005D4
                  	db	0xE2,0x05
                  	add	al,al			; 000005D8  00C0  '..'
                  
                  	times	4 dw 0x0000		; 000005DA - 000005E0
                  	sbb	al,[bx+si]		; 000005E2  1A00  '..'
                  	ror	word [bp+si],cl		; 000005E4  D30A  '.',0x0A
                  	add	al,al			; 000005E6  00C0  '..'
                  
                  	times	10 dw 0x0000		; 000005E8 - 000005FA
                  	sti				; 000005FC  FB  '.'
                  	push	ds			; 000005FD  1E  '.'
                  	push	ax			; 000005FE  50  'P'
                  	push	bx			; 000005FF  53  'S'
                  	push	cx			; 00000600  51  'Q'
                  	push	dx			; 00000601  52  'R'
                  	mov	ds,[cs:0x71c]		; 00000602  2E8E1E1C07  '.....'
                  	cmp	byte [0x500],0x1	; 00000607  803E000501  '.>...'
                  	jz	x671			; 0000060C  7463  'tc'
                  	mov	byte [0x500],0x1	; 0000060E  C606000501  '.....'
                  	mov	ah,0xf			; 00000613  B40F  '..'
                  	int	0x10			; 00000615  CD10  '..'
                  	mov	cl,ah			; 00000617  8ACC  '..'
                  	mov	ch,[0x484]		; 00000619  8A2E8404  '....'
                  	inc	ch			; 0000061D  FEC5  '..'
                  	call	x677			; 0000061F  E85500  '.U.'
                  	push	cx			; 00000622  51  'Q'
                  	mov	ah,0x3			; 00000623  B403  '..'
                  	int	0x10			; 00000625  CD10  '..'
                  	pop	cx			; 00000627  59  'Y'
                  	push	dx			; 00000628  52  'R'
                  	xor	dx,dx			; 00000629  33D2  '3.'
                  x62b:	mov	ah,0x2			; 0000062B  B402  '..'
                  	int	0x10			; 0000062D  CD10  '..'
                  	mov	ah,0x8			; 0000062F  B408  '..'
                  	int	0x10			; 00000631  CD10  '..'
                  	or	al,al			; 00000633  0AC0  0x0A,'.'
                  	jnz	x639			; 00000635  7502  'u.'
                  	mov	al,0x20			; 00000637  B020  '. '
                  x639:	push	dx			; 00000639  52  'R'
                  	xor	dx,dx			; 0000063A  33D2  '3.'
                  	xor	ah,ah			; 0000063C  32E4  '2.'
                  	int	0x17			; 0000063E  CD17  '..'
                  	pop	dx			; 00000640  5A  'Z'
                  	test	ah,0x29			; 00000641  F6C429  '..)'
                  	jnz	x667			; 00000644  7521  'u!'
                  	inc	dl			; 00000646  FEC2  '..'
                  	cmp	cl,dl			; 00000648  3ACA  ':.'
                  	jnz	x62b			; 0000064A  75DF  'u.'
                  	xor	dl,dl			; 0000064C  32D2  '2.'
                  	mov	ah,dl			; 0000064E  8AE2  '..'
                  	push	dx			; 00000650  52  'R'
                  	call	x677			; 00000651  E82300  '.#.'
                  	pop	dx			; 00000654  5A  'Z'
                  	inc	dh			; 00000655  FEC6  '..'
                  	cmp	ch,dh			; 00000657  3AEE  ':.'
                  	jnz	x62b			; 00000659  75D0  'u.'
                  	pop	dx			; 0000065B  5A  'Z'
                  	mov	ah,0x2			; 0000065C  B402  '..'
                  	int	0x10			; 0000065E  CD10  '..'
                  	mov	byte [0x500],0x0	; 00000660  C606000500  '.....'
                  	jmp	short x671		; 00000665  EB0A  '.',0x0A
                  
                  x667:	pop	dx			; 00000667  5A  'Z'
                  	mov	ah,0x2			; 00000668  B402  '..'
                  	int	0x10			; 0000066A  CD10  '..'
                  	mov	byte [0x500],0xff	; 0000066C  C6060005FF  '.....'
                  x671:	pop	dx			; 00000671  5A  'Z'
                  	pop	cx			; 00000672  59  'Y'
                  	pop	bx			; 00000673  5B  '['
                  	pop	ax			; 00000674  58  'X'
                  	pop	ds			; 00000675  1F  '.'
                  	iret				; 00000676  CF  '.'
                  
                  x677:	xor	dx,dx			; 00000677  33D2  '3.'
                  	xor	ah,ah			; 00000679  32E4  '2.'
                  	mov	al,0xd			; 0000067B  B00D  '.',0x0D
                  	int	0x17			; 0000067D  CD17  '..'
                  	xor	ah,ah			; 0000067F  32E4  '2.'
                  	mov	al,0xa			; 00000681  B00A  '.',0x0A
                  	int	0x17			; 00000683  CD17  '..'
                  	ret				; 00000685  C3  '.'
                  
                  beep:	mov	al,0xb6			; 00000686  B0B6  '..'
                  	out	0x43,al			; 00000688  E643  '.C'
                  	mov	al,cl			; 0000068A  8AC1  '..'
                  	out	0x42,al			; 0000068C  E642  '.B'
                  	mov	al,ch			; 0000068E  8AC5  '..'
                  	out	0x42,al			; 00000690  E642  '.B'
                  	in	al,0x61			; 00000692  E461  '.a'
                  	mov	ah,al			; 00000694  8AE0  '..'
                  	or	al,0x3			; 00000696  0C03  '..'
                  	out	0x61,al			; 00000698  E661  '.a'
                  x69a:	xor	cx,cx			; 0000069A  33C9  '3.'
                  x69c:	loop	x69c			; 0000069C  E2FE  '..'
                  	dec	bl			; 0000069E  FECB  '..'
                  	jnz	x69a			; 000006A0  75F8  'u.'
                  	mov	al,ah			; 000006A2  8AC4  '..'
                  	out	0x61,al			; 000006A4  E661  '.a'
                  	ret				; 000006A6  C3  '.'
                  
                  	db	0x82			; 000006A7  82  '.'
                  	sbb	bl,[bx+si+0x2f1e]	; 000006A8  1A981E2F  '.../'
                  	pop	ds			; 000006AC  1F  '.'
                  	db	0x78,0x1F
                  	db	0x8F			; 000006AF  8F  '.'
                  	pop	ds			; 000006B0  1F  '.'
                  	test	al,0x1f			; 000006B1  A81F  '..'
                  	rcr	word [bx],cl		; 000006B3  D31F  '..'
                  	cmpsw				; 000006B5  A7  '.'
                  	and	bh,ch			; 000006B6  22FD  '".'
                  	and	al,0x25			; 000006B8  2425  '$%'
                  	daa				; 000006BA  27  0x27
                  	mov	ch,[bx+di]		; 000006BB  8A29  '.)'
                  	cmp	bp,[bp+si]		; 000006BD  3B2A  ';*'
                  	inc	bp			; 000006BF  45  'E'
                  	xor	al,[bp+di]		; 000006C0  3203  '2.'
                  	xor	di,si			; 000006C2  33FE  '3.'
                  	xor	dx,[si]			; 000006C4  3314  '3.'
                  	or	[si+0x592b],dh		; 000006C6  08B42B59  '..+Y'
                  	xor	ax,0x82e		; 000006CA  352E08  '5..'
                  	mov	[0x1334],ax		; 000006CD  A33413  '.4.'
                  	pop	es			; 000006D0  07  '.'
                  	adc	ax,[bx]			; 000006D1  1307  '..'
                  	adc	ax,[bx]			; 000006D3  1307  '..'
                  	adc	ax,[bx]			; 000006D5  1307  '..'
                  	adc	ax,[bx]			; 000006D7  1307  '..'
                  	adc	ax,[bx]			; 000006D9  1307  '..'
                  	sub	ax,0xfc0a		; 000006DB  2D0AFC  '-',0x0A,'.'
                  	or	ah,[bx+di+0xcd0c]	; 000006DE  0AA10CCD  0x0A,'...'
                  	insw				; 000006E2  6D  'm'
                  	iret				; 000006E3  CF  '.'
                  
                  	sti				; 000006E4  FB  '.'
                  	cld				; 000006E5  FC  '.'
                  	push	bp			; 000006E6  55  'U'
                  	push	es			; 000006E7  06  '.'
                  	push	ds			; 000006E8  1E  '.'
                  	push	dx			; 000006E9  52  'R'
                  	push	cx			; 000006EA  51  'Q'
                  	push	bx			; 000006EB  53  'S'
                  	push	si			; 000006EC  56  'V'
                  	push	di			; 000006ED  57  'W'
                  	push	ax			; 000006EE  50  'P'
                  	mov	al,ah			; 000006EF  8AC4  '..'
                  	cbw				; 000006F1  98  '.'
                  	shl	ax,1			; 000006F2  D1E0  '..'
                  	mov	si,ax			; 000006F4  8BF0  '..'
                  	pop	ax			; 000006F6  58  'X'
                  	cmp	si,byte +0x3a		; 000006F7  83FE3A  '..:'
                  	jnc	x706			; 000006FA  730A  's',0x0A
                  	mov	ds,[cs:0x71c]		; 000006FC  2E8E1E1C07  '.....'
                  	jmp	near [cs:si+0x6a7]	; 00000701  2EFFA4A706  '.....'
                  
                  x706:	pop	di			; 00000706  5F  '_'
                  	pop	si			; 00000707  5E  '^'
                  	pop	bx			; 00000708  5B  '['
                  	pop	cx			; 00000709  59  'Y'
                  	pop	dx			; 0000070A  5A  'Z'
                  	pop	ds			; 0000070B  1F  '.'
                  	pop	es			; 0000070C  07  '.'
                  	pop	bp			; 0000070D  5D  ']'
                  	int	0x42			; 0000070E  CD42  '.B'
                  	iret				; 00000710  CF  '.'
                  
                  	jmp	short x713		; 00000711  EB00  '..'
                  
                  x713:	pop	di			; 00000713  5F  '_'
                  	pop	si			; 00000714  5E  '^'
                  	pop	bx			; 00000715  5B  '['
                  	pop	cx			; 00000716  59  'Y'
                  	pop	dx			; 00000717  5A  'Z'
                  	pop	ds			; 00000718  1F  '.'
                  	pop	es			; 00000719  07  '.'
                  	pop	bp			; 0000071A  5D  ']'
                  	iret				; 0000071B  CF  '.'
                  
                  	add	[bx+si],al		; 0000071C  0000  '..'
                  	add	[bx+si+0xb800],ah	; 0000071E  00A000B8  '....'
                  
                  x722:	push	ds			; 00000722  1E  '.'
                  	mov	ds,[cs:0x71c]		; 00000723  2E8E1E1C07  '.....'
                  	mov	dx,[0x463]		; 00000728  8B166304  '..c.'
                  	add	dl,0x6			; 0000072C  80C206  '...'
                  	pop	ds			; 0000072F  1F  '.'
                  	ret				; 00000730  C3  '.'
                  
                  x731:	mov	ds,[cs:0x71c]		; 00000731  2E8E1E1C07  '.....'
                  	les	bx,[0x4a8]		; 00000736  C41EA804  '....'
                  	les	bx,[es:bx]		; 0000073A  26C41F  '&..'
                  	ret				; 0000073D  C3  '.'
                  
                  x73e:	push	si			; 0000073E  56  'V'
                  	mov	si,ax			; 0000073F  8BF0  '..'
                  	shr	si,1			; 00000741  D1EE  '..'
                  	shr	si,1			; 00000743  D1EE  '..'
                  	shr	si,1			; 00000745  D1EE  '..'
                  	shr	si,1			; 00000747  D1EE  '..'
                  	shr	si,1			; 00000749  D1EE  '..'
                  	shr	si,1			; 0000074B  D1EE  '..'
                  	shr	si,1			; 0000074D  D1EE  '..'
                  	shr	si,1			; 0000074F  D1EE  '..'
                  	shl	si,1			; 00000751  D1E6  '..'
                  	cmp	si,0x28			; 00000753  81FE2800  '..(.'
                  	jnc	x786			; 00000757  732D  's-'
                  	jmp	near [cs:si+0x75e]	; 00000759  2EFFA45E07  '...^.'
                  
                  	xchg	al,[bx]			; 0000075E  8607  '..'
                  	xchg	al,[bx]			; 00000760  8607  '..'
                  	xchg	al,[bx]			; 00000762  8607  '..'
                  	xchg	al,[bx]			; 00000764  8607  '..'
                  	scasb				; 00000766  AE  '.'
                  	pop	es			; 00000767  07  '.'
                  	scasb				; 00000768  AE  '.'
                  	pop	es			; 00000769  07  '.'
                  	scasb				; 0000076A  AE  '.'
                  	pop	es			; 0000076B  07  '.'
                  	xchg	al,[bx]			; 0000076C  8607  '..'
                  	cmpsb				; 0000076E  A6  '.'
                  	pop	es			; 0000076F  07  '.'
                  	scasb				; 00000770  AE  '.'
                  	pop	es			; 00000771  07  '.'
                  	scasb				; 00000772  AE  '.'
                  	pop	es			; 00000773  07  '.'
                  	scasb				; 00000774  AE  '.'
                  	pop	es			; 00000775  07  '.'
                  	scasb				; 00000776  AE  '.'
                  	pop	es			; 00000777  07  '.'
                  	scasb				; 00000778  AE  '.'
                  	pop	es			; 00000779  07  '.'
                  	scasb				; 0000077A  AE  '.'
                  	pop	es			; 0000077B  07  '.'
                  	stosb				; 0000077C  AA  '.'
                  	pop	es			; 0000077D  07  '.'
                  	stosb				; 0000077E  AA  '.'
                  	pop	es			; 0000077F  07  '.'
                  	mov	[0xa207],al		; 00000780  A207A2  '...'
                  	pop	es			; 00000783  07  '.'
                  	scasb				; 00000784  AE  '.'
                  	pop	es			; 00000785  07  '.'
                  x786:	test	byte [0x489],0x10	; 00000786  F606890410  '.....'
                  	jnz	x7a6			; 0000078B  7519  'u.'
                  	mov	al,[0x488]		; 0000078D  A08804  '...'
                  	and	al,0xf			; 00000790  240F  '$.'
                  	cmp	al,0x3			; 00000792  3C03  '<.'
                  	jz	x7aa			; 00000794  7414  't.'
                  	cmp	al,0x9			; 00000796  3C09  '<.'
                  	jz	x7aa			; 00000798  7410  't.'
                  	cmp	ah,0x7			; 0000079A  80FC07  '...'
                  	jz	x7aa			; 0000079D  740B  't.'
                  	jmp	short x7ae		; 0000079F  EB0D  '.',0x0D
                  
                  	nop				; 000007A1  90  '.'
                  	mov	al,0x3			; 000007A2  B003  '..'
                  	jmp	short x7b0		; 000007A4  EB0A  '.',0x0A
                  
                  x7a6:	mov	al,0x2			; 000007A6  B002  '..'
                  	jmp	short x7b0		; 000007A8  EB06  '..'
                  
                  x7aa:	mov	al,0x1			; 000007AA  B001  '..'
                  	jmp	short x7b0		; 000007AC  EB02  '..'
                  
                  x7ae:	mov	al,0x0			; 000007AE  B000  '..'
                  x7b0:	pop	si			; 000007B0  5E  '^'
                  	ret				; 000007B1  C3  '.'
                  
                  x7b2:	test	byte [0x487],0x80	; 000007B2  F606870480  '.....'
                  	jnz	x7f2			; 000007B7  7539  'u9'
                  	mov	dx,0xb800		; 000007B9  BA00B8  '...'
                  	mov	al,[0x449]		; 000007BC  A04904  '.I.'
                  	cmp	al,0x6			; 000007BF  3C06  '<.'
                  	jna	x7cd			; 000007C1  760A  'v',0x0A
                  	mov	dx,0xb000		; 000007C3  BA00B0  '...'
                  	cmp	al,0x7			; 000007C6  3C07  '<.'
                  	jz	x7cd			; 000007C8  7403  't.'
                  	mov	dx,0xa000		; 000007CA  BA00A0  '...'
                  x7cd:	mov	es,dx			; 000007CD  8EC2  '..'
                  	mov	bx,0x720		; 000007CF  BB2007  '. .'
                  	cmp	al,0x4			; 000007D2  3C04  '<.'
                  	jc	x7dc			; 000007D4  7206  'r.'
                  	cmp	al,0x7			; 000007D6  3C07  '<.'
                  	jz	x7dc			; 000007D8  7402  't.'
                  	sub	bx,bx			; 000007DA  2BDB  '+.'
                  x7dc:	mov	cx,[0x44c]		; 000007DC  8B0E4C04  '..L.'
                  	jcxz	x7f2			; 000007E0  E310  '..'
                  	mov	cx,0x8000		; 000007E2  B90080  '...'
                  	cmp	dh,0xa0			; 000007E5  80FEA0  '...'
                  	jz	x7ec			; 000007E8  7402  't.'
                  	mov	ch,0x40			; 000007EA  B540  '.@'
                  x7ec:	mov	ax,bx			; 000007EC  8BC3  '..'
                  	sub	di,di			; 000007EE  2BFF  '+.'
                  	rep	stosw			; 000007F0  F3AB  '..'
                  x7f2:	ret				; 000007F2  C3  '.'
                  
                  x7f3:	mov	si,bx			; 000007F3  8BF3  '..'
                  	add	si,byte +0x23		; 000007F5  83C623  '..#'
                  	push	ds			; 000007F8  1E  '.'
                  	push	es			; 000007F9  06  '.'
                  	les	di,[0x4a8]		; 000007FA  C43EA804  '.>..'
                  	les	di,[es:di+0x4]		; 000007FE  26C47D04  '&.}.'
                  	mov	ax,es			; 00000802  8CC0  '..'
                  	or	ax,di			; 00000804  0BC7  '..'
                  	jz	x811			; 00000806  7409  't.'
                  	pop	ds			; 00000808  1F  '.'
                  	push	ds			; 00000809  1E  '.'
                  	mov	cx,0x10			; 0000080A  B91000  '...'
                  	rep	movsb			; 0000080D  F3A4  '..'
                  	inc	si			; 0000080F  46  'F'
                  	movsb				; 00000810  A4  '.'
                  x811:	pop	es			; 00000811  07  '.'
                  	pop	ds			; 00000812  1F  '.'
                  	ret				; 00000813  C3  '.'
                  
                  	mov	ah,[0x44a]		; 00000814  8A264A04  '.&J.'
                  	mov	bh,[0x462]		; 00000818  8A3E6204  '.>b.'
                  	mov	al,[0x487]		; 0000081C  A08704  '...'
                  	and	al,0x80			; 0000081F  2480  '$.'
                  	or	al,[0x449]		; 00000821  0A064904  0x0A,'.I.'
                  	pop	di			; 00000825  5F  '_'
                  	pop	si			; 00000826  5E  '^'
                  	pop	cx			; 00000827  59  'Y'
                  	pop	cx			; 00000828  59  'Y'
                  	pop	dx			; 00000829  5A  'Z'
                  	pop	ds			; 0000082A  1F  '.'
                  	pop	es			; 0000082B  07  '.'
                  	pop	bp			; 0000082C  5D  ']'
                  	iret				; 0000082D  CF  '.'
                  
                  	cmp	bl,0x10			; 0000082E  80FB10  '...'
                  	jz	x870			; 00000831  743D  't='
                  	cmp	bl,0x20			; 00000833  80FB20  '.. '
                  	jz	x8a9			; 00000836  7471  'tq'
                  	cmp	bl,0x30			; 00000838  80FB30  '..0'
                  	jnz	x840			; 0000083B  7503  'u.'
                  	jmp	short x8b8		; 0000083D  EB79  '.y'
                  
                  	nop				; 0000083F  90  '.'
                  x840:	cmp	bl,0x31			; 00000840  80FB31  '..1'
                  	jnz	x848			; 00000843  7503  'u.'
                  	jmp	x955			; 00000845  E90D01  '.',0x0D,'.'
                  
                  x848:	cmp	bl,0x32			; 00000848  80FB32  '..2'
                  	jnz	x850			; 0000084B  7503  'u.'
                  	jmp	x96b			; 0000084D  E91B01  '...'
                  
                  x850:	cmp	bl,0x33			; 00000850  80FB33  '..3'
                  	jnz	x858			; 00000853  7503  'u.'
                  	jmp	x980			; 00000855  E92801  '.(.'
                  
                  x858:	cmp	bl,0x34			; 00000858  80FB34  '..4'
                  	jnz	x860			; 0000085B  7503  'u.'
                  	jmp	x996			; 0000085D  E93601  '.6.'
                  
                  x860:	cmp	bl,0x35			; 00000860  80FB35  '..5'
                  	jnz	x868			; 00000863  7503  'u.'
                  	jmp	x9b1			; 00000865  E94901  '.I.'
                  
                  x868:	cmp	bl,0x36			; 00000868  80FB36  '..6'
                  	jnz	x8a4			; 0000086B  7537  'u7'
                  	db	0xE9,0xAB,0x01
                  
                  x870:	mov	bh,[0x487]		; 00000870  8A3E8704  '.>..'
                  	and	bh,0x2			; 00000874  80E702  '...'
                  	shr	bh,1			; 00000877  D0EF  '..'
                  	mov	al,[0x487]		; 00000879  A08704  '...'
                  	and	al,0x60			; 0000087C  2460  '$`'
                  	shr	al,1			; 0000087E  D0E8  '..'
                  	shr	al,1			; 00000880  D0E8  '..'
                  	shr	al,1			; 00000882  D0E8  '..'
                  	shr	al,1			; 00000884  D0E8  '..'
                  	shr	al,1			; 00000886  D0E8  '..'
                  	mov	bl,al			; 00000888  8AD8  '..'
                  	mov	cl,[0x488]		; 0000088A  8A0E8804  '....'
                  	mov	ch,cl			; 0000088E  8AE9  '..'
                  	and	cl,0xf			; 00000890  80E10F  '...'
                  	shr	ch,1			; 00000893  D0ED  '..'
                  	shr	ch,1			; 00000895  D0ED  '..'
                  	shr	ch,1			; 00000897  D0ED  '..'
                  	shr	ch,1			; 00000899  D0ED  '..'
                  	pop	di			; 0000089B  5F  '_'
                  	pop	si			; 0000089C  5E  '^'
                  	pop	dx			; 0000089D  5A  'Z'
                  	pop	dx			; 0000089E  5A  'Z'
                  	pop	dx			; 0000089F  5A  'Z'
                  	pop	ds			; 000008A0  1F  '.'
                  	pop	es			; 000008A1  07  '.'
                  	pop	bp			; 000008A2  5D  ']'
                  	iret				; 000008A3  CF  '.'
                  
                  x8a4:	xor	al,al			; 000008A4  32C0  '2.'
                  	jmp	x713			; 000008A6  E96AFE  '.j.'
                  
                  x8a9:	cli				; 000008A9  FA  '.'
                  	mov	word [0x14],0x5fc	; 000008AA  C7061400FC05  '......'
                  	mov	[0x16],cs		; 000008B0  8C0E1600  '....'
                  	sti				; 000008B4  FB  '.'
                  	jmp	x713			; 000008B5  E95BFE  '.[.'
                  
                  x8b8:	test	byte [0x487],0x8	; 000008B8  F606870408  '.....'
                  	jnz	x8a4			; 000008BD  75E5  'u.'
                  	test	byte [0x489],0x1	; 000008BF  F606890401  '.....'
                  	jnz	x914			; 000008C4  754E  'uN'
                  	cmp	al,0x0			; 000008C6  3C00  '<.'
                  	jnz	x8d9			; 000008C8  750F  'u.'
                  	test	byte [0x487],0x2	; 000008CA  F606870402  '.....'
                  x8cf:	jnz	x8a4			; 000008CF  75D3  'u.'
                  	mov	al,0x8			; 000008D1  B008  '..'
                  	mov	bx,0xef00		; 000008D3  BB00EF  '...'
                  	jmp	short x900		; 000008D6  EB28  '.('
                  
                  	nop				; 000008D8  90  '.'
                  x8d9:	dec	al			; 000008D9  FEC8  '..'
                  	jnz	x8ee			; 000008DB  7511  'u.'
                  	mov	al,0x9			; 000008DD  B009  '..'
                  	mov	bx,0xef00		; 000008DF  BB00EF  '...'
                  	test	byte [0x487],0x2	; 000008E2  F606870402  '.....'
                  	jz	x900			; 000008E7  7417
                  	mov	al,0xb			; 000008E9  B00B  '..'
                  	jmp	short x900		; 000008EB  EB13  '..'
                  
                  	nop				; 000008ED  90  '.'
                  x8ee:	dec	al			; 000008EE  FEC8  '..'
                  	jnz	x8a4			; 000008F0  75B2  'u.'
                  	mov	al,0x9			; 000008F2  B009  '..'
                  	mov	bx,0xef10		; 000008F4  BB10EF  '...'
                  	test	byte [0x487],0x2	; 000008F7  F606870402  '.....'
                  	jz	x900			; 000008FC  7402
                  	mov	al,0xb			; 000008FE  B00B  '..'
                  
                  x900:	and	[0x489],bh		; 00000900  203E8904  ' >..'
                  	or	[0x489],bl		; 00000904  081E8904  '....'
                  	and	byte [0x488],0xf0	; 00000908  80268804F0  '.&...'
                  	or	[0x488],al		; 0000090D  08068804  '....'
                  	jmp	short x950		; 00000911  EB3D  '.='
                  
                  	nop				; 00000913  90  '.'
                  x914:	cmp	al,0x0			; 00000914  3C00  '<.'
                  	jnz	x928			; 00000916  7510  'u.'
                  	mov	al,0x8			; 00000918  B008  '..'
                  	mov	bx,0xef80		; 0000091A  BB80EF  '...'
                  	test	byte [0x487],0x2	; 0000091D  F606870402  '.....'
                  	jz	x900			; 00000922  74DC
                  	mov	al,0xb			; 00000924  B00B  '..'
                  	jmp	short x900		; 00000926  EBD8  '..'
                  
                  x928:	dec	al			; 00000928  FEC8  '..'
                  	jnz	x93c			; 0000092A  7510  'u.'
                  	mov	al,0x9			; 0000092C  B009  '..'
                  	mov	bx,0x6f00		; 0000092E  BB006F  '..o'
                  	test	byte [0x487],0x2	; 00000931  F606870402  '.....'
                  	jz	x900			; 00000936  74C8
                  	mov	al,0xb			; 00000938  B00B  '..'
                  	jmp	short x900		; 0000093A  EBC4  '..'
                  
                  x93c:	dec	al			; 0000093C  FEC8  '..'
                  	jnz	x8cf			; 0000093E  758F  'u.'
                  	mov	al,0x9			; 00000940  B009  '..'
                  	mov	bx,0x6f10		; 00000942  BB106F  '..o'
                  	test	byte [0x487],0x2	; 00000945  F606870402  '.....'
                  	jz	x900			; 0000094A  74B4
                  	mov	al,0xb			; 0000094C  B00B  '..'
                  	jmp	short x900		; 0000094E  EBB0  '..'
                  
                  x950:	mov	al,0x12			; 00000950  B012  '..'
                  	jmp	x713			; 00000952  E9BEFD  '...'
                  
                  x955:	cmp	al,0x1			; 00000955  3C01  '<.'
                  	jnz	x960			; 00000957  7507  'u.'
                  	or	byte [0x489],0x8	; 00000959  800E890408  '.....'
                  	jmp	short x950		; 0000095E  EBF0  '..'
                  
                  x960:	cmp	al,0x0			; 00000960  3C00  '<.'
                  	jnz	x9ac			; 00000962  7548  'uH'
                  	and	byte [0x489],0xf7	; 00000964  80268904F7  '.&...'
                  	jmp	short x950		; 00000969  EBE5  '..'
                  
                  x96b:	mov	dx,0x46e8		; 0000096B  BAE846  '..F'
                  	cmp	al,0x0			; 0000096E  3C00  '<.'
                  	jnz	x977			; 00000970  7505  'u.'
                  	mov	al,0xe			; 00000972  B00E  '..'
                  	out	dx,al			; 00000974  EE  '.'
                  	jmp	short x950		; 00000975  EBD9  '..'
                  
                  x977:	cmp	al,0x1			; 00000977  3C01  '<.'
                  	jnz	x9ac			; 00000979  7531  'u1'
                  	xor	al,al			; 0000097B  32C0  '2.'
                  	out	dx,al			; 0000097D  EE  '.'
                  	jmp	short x950		; 0000097E  EBD0  '..'
                  
                  x980:	cmp	al,0x1			; 00000980  3C01  '<.'
                  	jnz	x98b			; 00000982  7507  'u.'
                  	and	byte [0x489],0xfd	; 00000984  80268904FD  '.&...'
                  	jmp	short x950		; 00000989  EBC5  '..'
                  
                  x98b:	cmp	al,0x0			; 0000098B  3C00  '<.'
                  	jnz	x9ac			; 0000098D  751D  'u.'
                  	or	byte [0x489],0x2	; 0000098F  800E890402  '.....'
                  	jmp	short x950		; 00000994  EBBA  '..'
                  
                  x996:	cmp	al,0x1			; 00000996  3C01  '<.'
                  	jnz	x9a1			; 00000998  7507  'u.'
                  	or	byte [0x487],0x1	; 0000099A  800E870401  '.....'
                  	jmp	short x950		; 0000099F  EBAF  '..'
                  
                  x9a1:	cmp	al,0x0			; 000009A1  3C00  '<.'
                  	jnz	x9ac			; 000009A3  7507  'u.'
                  	and	byte [0x487],0xfe	; 000009A5  80268704FE  '.&...'
                  	jmp	short x950		; 000009AA  EBA4  '..'
                  
                  x9ac:	xor	al,al			; 000009AC  32C0  '2.'
                  	jmp	x713			; 000009AE  E962FD  '.b.'
                  
                  x9b1:	or	al,al			; 000009B1  0AC0  0x0A,'.'
                  	jnz	x9cc			; 000009B3  7517  'u.'
                  	test	byte [0x489],0x40	; 000009B5  F606890440  '....@'
                  	jnz	x9ac			; 000009BA  75F0  'u.'
                  	or	al,0x80			; 000009BC  0C80  '..'
                  	int	0x42			; 000009BE  CD42  '.B'
                  	test	byte [0x489],0x40	; 000009C0  F606890440  '....@'
                  	jz	x9ac			; 000009C5  74E5  't.'
                  	call	x9f5			; 000009C7  E82B00  '.+.'
                  	jmp	short x950		; 000009CA  EB84  '..'
                  
                  x9cc:	cmp	al,0x1			; 000009CC  3C01  '<.'
                  	jz	x9ac			; 000009CE  74DC  't.'
                  	test	byte [0x489],0x40	; 000009D0  F606890440  '....@'
                  	jz	x9ac			; 000009D5  74D5  't.'
                  	cmp	al,0x2			; 000009D7  3C02  '<.'
                  	jnz	x9e1			; 000009D9  7506  'u.'
                  	call	x9f5			; 000009DB  E81700  '...'
                  	jmp	x950			; 000009DE  E96FFF  '.o.'
                  
                  x9e1:	cmp	al,0x3			; 000009E1  3C03  '<.'
                  	jnz	x9ac			; 000009E3  75C7  'u.'
                  	cli				; 000009E5  FA  '.'
                  	mov	bx,dx			; 000009E6  8BDA  '..'
                  	call	xde1			; 000009E8  E8F603  '...'
                  	mov	dx,0x46e8		; 000009EB  BAE846  '..F'
                  	mov	al,0xe			; 000009EE  B00E  '..'
                  	out	dx,al			; 000009F0  EE  '.'
                  	sti				; 000009F1  FB  '.'
                  	jmp	x950			; 000009F2  E95BFF  '.[.'
                  
                  x9f5:	cli				; 000009F5  FA  '.'
                  	mov	bx,dx			; 000009F6  8BDA  '..'
                  	call	xd9c			; 000009F8  E8A103  '...'
                  	cli				; 000009FB  FA  '.'
                  	les	bx,[0x108]		; 000009FC  C41E0801  '....'
                  	mov	[0x1b4],bx		; 00000A00  891EB401  '....'
                  	mov	[0x1b6],es		; 00000A04  8C06B601  '....'
                  	mov	word [0x108],0x6e4	; 00000A08  C7060801E406  '......'
                  	mov	[0x10a],cs		; 00000A0E  8C0E0A01  '..',0x0A,'.'
                  	sti				; 00000A12  FB  '.'
                  	mov	dx,0x46e8		; 00000A13  BAE846  '..F'
                  	mov	al,0x6			; 00000A16  B006  '..'
                  	out	dx,al			; 00000A18  EE  '.'
                  	sti				; 00000A19  FB  '.'
                  	ret				; 00000A1A  C3  '.'
                  	mov	ah,0x20			; 00000A1B  B420  '. '
                  
                  	cmp	al,0x1			; 00000A1D  3C01  '<.'
                  	jz	xa27			; 00000A1F  7406  't.'
                  	mov	ah,0x0			; 00000A21  B400  '..'
                  	cmp	al,0x0			; 00000A23  3C00  '<.'
                  	jnz	xa2a			; 00000A25  7503  'u.'
                  xa27:	call	x127a			; 00000A27  E85008  '.P.'
                  xa2a:	jmp	x950			; 00000A2A  E923FF  '.#.'
                  
                  	cmp	al,0x0			; 00000A2D  3C00  '<.'
                  	jz	xa37			; 00000A2F  7406  't.'
                  	cmp	al,0x1			; 00000A31  3C01  '<.'
                  	jz	xa4b			; 00000A33  7416  't.'
                  	jmp	short xa53		; 00000A35  EB1C  '..'
                  
                  xa37:	mov	al,[0x48a]		; 00000A37  A08A04  '...'
                  	call	xa96			; 00000A3A  E85900  '.Y.'
                  	call	xab6			; 00000A3D  E87600  '.v.'
                  	pop	di			; 00000A40  5F  '_'
                  	pop	si			; 00000A41  5E  '^'
                  	pop	cx			; 00000A42  59  'Y'
                  	pop	cx			; 00000A43  59  'Y'
                  	pop	dx			; 00000A44  5A  'Z'
                  	pop	ds			; 00000A45  1F  '.'
                  	pop	es			; 00000A46  07  '.'
                  	pop	bp			; 00000A47  5D  ']'
                  	mov	al,0x1a			; 00000A48  B01A  '..'
                  	iret				; 00000A4A  CF  '.'
                  
                  xa4b:	call	xa5c			; 00000A4B  E80E00  '...'
                  	mov	[0x48a],al		; 00000A4E  A28A04  '...'
                  	mov	al,0x1a			; 00000A51  B01A  '..'
                  xa53:	pop	di			; 00000A53  5F  '_'
                  	pop	si			; 00000A54  5E  '^'
                  	pop	bx			; 00000A55  5B  '['
                  	pop	cx			; 00000A56  59  'Y'
                  	pop	dx			; 00000A57  5A  'Z'
                  	pop	ds			; 00000A58  1F  '.'
                  	pop	es			; 00000A59  07  '.'
                  	pop	bp			; 00000A5A  5D  ']'
                  	iret				; 00000A5B  CF  '.'
                  
                  xa5c:	mov	dx,bx			; 00000A5C  8BD3  '..'
                  	xchg	bh,bl			; 00000A5E  86FB  '..'
                  	mov	ax,bx			; 00000A60  8BC3  '..'
                  	call	xa87			; 00000A62  E82200  '.".'
                  	mov	bx,0x0			; 00000A65  BB0000  '...'
                  	mov	cl,[es:si]		; 00000A68  268A0C  '&..'
                  	xor	ch,ch			; 00000A6B  32ED  '2.'
                  	add	si,byte +0x4		; 00000A6D  83C604  '...'
                  xa70:	cmp	ax,[es:bx+si]		; 00000A70  263B00  '&;.'
                  	jz	xa82			; 00000A73  740D  't',0x0D
                  	cmp	dx,[es:bx+si]		; 00000A75  263B10  '&;.'
                  	jz	xa82			; 00000A78  7408  't.'
                  	add	bx,byte +0x2		; 00000A7A  83C302  '...'
                  	loop	xa70			; 00000A7D  E2F1  '..'
                  	mov	al,0xff			; 00000A7F  B0FF  '..'
                  	ret				; 00000A81  C3  '.'
                  
                  xa82:	shr	bl,1			; 00000A82  D0EB  '..'
                  	mov	al,bl			; 00000A84  8AC3  '..'
                  	ret				; 00000A86  C3  '.'
                  
                  xa87:	les	si,[0x4a8]		; 00000A87  C436A804  '.6..'
                  	les	si,[es:si+0x10]		; 00000A8B  26C4B41000  '&....'
                  	les	si,[es:si+0x2]		; 00000A90  26C4B40200  '&....'
                  	ret				; 00000A95  C3  '.'
                  
                  xa96:	call	xa87			; 00000A96  E8EEFF  '...'
                  	cmp	al,[es:si]		; 00000A99  263A04  '&:.'
                  	jc	xaa2			; 00000A9C  7204  'r.'
                  	mov	bx,0xffff		; 00000A9E  BBFFFF  '...'
                  	ret				; 00000AA1  C3  '.'
                  
                  xaa2:	add	si,byte +0x4		; 00000AA2  83C604  '...'
                  	xor	ah,ah			; 00000AA5  32E4  '2.'
                  	shl	ax,1			; 00000AA7  D1E0  '..'
                  	add	si,ax			; 00000AA9  03F0  '..'
                  	mov	bx,[es:si]		; 00000AAB  268B1C  '&..'
                  	cmp	bl,0x0			; 00000AAE  80FB00  '...'
                  	jnz	xab5			; 00000AB1  7502  'u.'
                  	xchg	bl,bh			; 00000AB3  86DF  '..'
                  xab5:	ret				; 00000AB5  C3  '.'
                  
                  xab6:	cmp	bh,0x0			; 00000AB6  80FF00  '...'
                  	jz	xad2			; 00000AB9  7417  't.'
                  	mov	al,[0x410]		; 00000ABB  A01004  '...'
                  	and	al,0x30			; 00000ABE  2430  '$0'
                  	cmp	al,0x30			; 00000AC0  3C30  '<0'
                  	jz	xacb			; 00000AC2  7407  't.'
                  	test	bl,0x1			; 00000AC4  F6C301  '...'
                  	jnz	xad0			; 00000AC7  7507  'u.'
                  	jmp	short xad2		; 00000AC9  EB07  '..'
                  
                  xacb:	test	bl,0x1			; 00000ACB  F6C301  '...'
                  	jnz	xad2			; 00000ACE  7502  'u.'
                  xad0:	xchg	bl,bh			; 00000AD0  86DF  '..'
                  xad2:	ret				; 00000AD2  C3  '.'
                  
                  	adc	[bx+di],al		; 00000AD3  1001  '..'
                  	or	[bx+si],al		; 00000AD5  0800  '..'
                  	add	[bx+si],al		; 00000AD7  0000  '..'
                  	add	[bx+di],al		; 00000AD9  0001  '..'
                  	add	[bp+si],al		; 00000ADB  0002  '..'
                  	add	al,[bx+di]		; 00000ADD  0201  '..'
                  	add	[si],al			; 00000ADF  0004  '..'
                  	add	al,0x1			; 00000AE1  0401  '..'
                  	add	[di],al			; 00000AE3  0005  '..'
                  	add	al,[di]			; 00000AE5  0205  '..'
                  	add	[0x601],al		; 00000AE7  00060106  '....'
                  	add	ax,0x6			; 00000AEB  050600  '...'
                  	or	[bx+di],al		; 00000AEE  0801  '..'
                  	or	[bx+si],al		; 00000AF0  0800  '..'
                  	pop	es			; 00000AF2  07  '.'
                  	add	al,[bx]			; 00000AF3  0207  '..'
                  	push	es			; 00000AF5  06  '.'
                  	pop	es			; 00000AF6  07  '.'
                  xaf7:	xor	al,al			; 00000AF7  32C0  '2.'
                  	jmp	x713			; 00000AF9  E917FC  '...'
                  
                  	or	bx,bx			; 00000AFC  0BDB  '..'
                  	jnz	xaf7			; 00000AFE  75F7  'u.'
                  	mov	word [es:di],0xc91	; 00000B00  26C705910C  '&....'
                  	inc	di			; 00000B05  47  'G'
                  	inc	di			; 00000B06  47  'G'
                  	mov	[es:di],cs		; 00000B07  268C0D  '&.',0x0D
                  	inc	di			; 00000B0A  47  'G'
                  	inc	di			; 00000B0B  47  'G'
                  	mov	si,0x449		; 00000B0C  BE4904  '.I.'
                  	mov	cx,0x1e			; 00000B0F  B91E00  '...'
                  	rep	movsb			; 00000B12  F3A4  '..'
                  	mov	si,0x484		; 00000B14  BE8404  '...'
                  	mov	al,[si]			; 00000B17  8A04  '..'
                  	inc	al			; 00000B19  FEC0  '..'
                  	mov	[es:di],al		; 00000B1B  268805  '&..'
                  	inc	si			; 00000B1E  46  'F'
                  	inc	di			; 00000B1F  47  'G'
                  	mov	cx,0x2			; 00000B20  B90200  '...'
                  	rep	movsb			; 00000B23  F3A4  '..'
                  	mov	al,[0x48a]		; 00000B25  A08A04  '...'
                  	push	es			; 00000B28  06  '.'
                  	call	xa96			; 00000B29  E86AFF  '.j.'
                  	pop	es			; 00000B2C  07  '.'
                  	mov	[es:di],bl		; 00000B2D  26881D  '&..'
                  	inc	di			; 00000B30  47  'G'
                  	mov	[es:di],bh		; 00000B31  26883D  '&.='
                  	mov	al,[0x449]		; 00000B34  A04904  '.I.'
                  	xor	ah,ah			; 00000B37  32E4  '2.'
                  	mov	si,ax			; 00000B39  8BF0  '..'
                  	shl	si,1			; 00000B3B  D1E6  '..'
                  	add	si,0xc55		; 00000B3D  81C6550C  '..U.'
                  	mov	bx,[cs:si]		; 00000B41  2E8B1C  '...'
                  	inc	di			; 00000B44  47  'G'
                  	mov	[es:di],bx		; 00000B45  26891D  '&..'
                  	inc	di			; 00000B48  47  'G'
                  	lea	si,[0xc7d]		; 00000B49  8D367D0C  '.6}.'
                  	add	si,ax			; 00000B4D  03F0  '..'
                  	mov	bl,[cs:si]		; 00000B4F  2E8A1C  '...'
                  	inc	di			; 00000B52  47  'G'
                  	mov	[es:di],bl		; 00000B53  26881D  '&..'
                  	xchg	al,ah			; 00000B56  86C4  '..'
                  	call	x73e			; 00000B58  E8E3FB  '...'
                  	inc	di			; 00000B5B  47  'G'
                  	mov	[es:di],al		; 00000B5C  268805  '&..'
                  	mov	dx,0x3c4		; 00000B5F  BAC403  '...'
                  	mov	al,0x3			; 00000B62  B003  '..'
                  	out	dx,al			; 00000B64  EE  '.'
                  	inc	dx			; 00000B65  42  'B'
                  	in	al,dx			; 00000B66  EC  '.'
                  	mov	ah,al			; 00000B67  8AE0  '..'
                  	push	ax			; 00000B69  50  'P'
                  	and	ah,0x10			; 00000B6A  80E410  '...'
                  	shr	ah,1			; 00000B6D  D0EC  '..'
                  	shr	ah,1			; 00000B6F  D0EC  '..'
                  	and	al,0x3			; 00000B71  2403  '$.'
                  	or	al,ah			; 00000B73  0AC4  0x0A,'.'
                  	inc	di			; 00000B75  47  'G'
                  	mov	[es:di],al		; 00000B76  268805  '&..'
                  	pop	ax			; 00000B79  58  'X'
                  	and	ah,0x20			; 00000B7A  80E420  '.. '
                  	shr	ah,1			; 00000B7D  D0EC  '..'
                  	shr	ah,1			; 00000B7F  D0EC  '..'
                  	shr	ah,1			; 00000B81  D0EC  '..'
                  	and	al,0xc			; 00000B83  240C  '$.'
                  	shr	al,1			; 00000B85  D0E8  '..'
                  	shr	al,1			; 00000B87  D0E8  '..'
                  	or	al,ah			; 00000B89  0AC4  0x0A,'.'
                  	inc	di			; 00000B8B  47  'G'
                  	mov	[es:di],al		; 00000B8C  268805  '&..'
                  	mov	al,0x10			; 00000B8F  B010  '..'
                  	call	x722			; 00000B91  E88EFB  '...'
                  	call	x2b4b			; 00000B94  E8B41F  '...'
                  	call	x2b6e			; 00000B97  E8D41F  '...'
                  	and	ah,0x8			; 00000B9A  80E408  '...'
                  	shl	ah,1			; 00000B9D  D0E4  '..'
                  	shl	ah,1			; 00000B9F  D0E4  '..'
                  	mov	al,[0x487]		; 00000BA1  A08704  '...'
                  	and	al,0x1			; 00000BA4  2401  '$.'
                  	xor	al,0x1			; 00000BA6  3401  '4.'
                  	mov	cl,0x4			; 00000BA8  B104  '..'
                  	shl	al,cl			; 00000BAA  D2E0  '..'
                  	or	al,ah			; 00000BAC  0AC4  0x0A,'.'
                  	mov	ah,[0x489]		; 00000BAE  8A268904  '.&..'
                  	and	ah,0xf			; 00000BB2  80E40F  '...'
                  	or	al,ah			; 00000BB5  0AC4  0x0A,'.'
                  	inc	di			; 00000BB7  47  'G'
                  	mov	[es:di],al		; 00000BB8  268805  '&..'
                  	xor	al,al			; 00000BBB  32C0  '2.'
                  	inc	di			; 00000BBD  47  'G'
                  	mov	[es:di],al		; 00000BBE  268805  '&..'
                  	inc	di			; 00000BC1  47  'G'
                  	mov	[es:di],al		; 00000BC2  268805  '&..'
                  	inc	di			; 00000BC5  47  'G'
                  	mov	[es:di],al		; 00000BC6  268805  '&..'
                  	mov	al,[0x487]		; 00000BC9  A08704  '...'
                  	and	al,0x60			; 00000BCC  2460  '$`'
                  	mov	cl,0x5			; 00000BCE  B105  '..'
                  	shr	al,cl			; 00000BD0  D2E8  '..'
                  	inc	di			; 00000BD2  47  'G'
                  	mov	[es:di],al		; 00000BD3  268805  '&..'
                  	push	es			; 00000BD6  06  '.'
                  	xor	cl,cl			; 00000BD7  32C9  '2.'
                  	les	bx,[0x4a8]		; 00000BD9  C41EA804  '....'
                  	push	es			; 00000BDD  06  '.'
                  	les	si,[es:bx+0x4]		; 00000BDE  26C47704  '&.w.'
                  	mov	ax,es			; 00000BE2  8CC0  '..'
                  	or	ax,si			; 00000BE4  0BC6  '..'
                  	jz	xbeb			; 00000BE6  7403  't.'
                  	or	cl,0x2			; 00000BE8  80C902  '...'
                  xbeb:	pop	es			; 00000BEB  07  '.'
                  	push	es			; 00000BEC  06  '.'
                  	les	si,[es:bx+0x8]		; 00000BED  26C47708  '&.w.'
                  	mov	ax,es			; 00000BF1  8CC0  '..'
                  	or	ax,si			; 00000BF3  0BC6  '..'
                  	jz	xbfa			; 00000BF5  7403  't.'
                  	or	cl,0x4			; 00000BF7  80C904  '...'
                  xbfa:	pop	es			; 00000BFA  07  '.'
                  	push	es			; 00000BFB  06  '.'
                  	les	si,[es:bx+0xc]		; 00000BFC  26C4770C  '&.w.'
                  	mov	ax,es			; 00000C00  8CC0  '..'
                  	or	ax,si			; 00000C02  0BC6  '..'
                  	jz	xc09			; 00000C04  7403  't.'
                  	or	cl,0x8			; 00000C06  80C908  '...'
                  xc09:	pop	es			; 00000C09  07  '.'
                  	les	si,[es:bx+0x10]		; 00000C0A  26C47710  '&.w.'
                  	mov	ax,es			; 00000C0E  8CC0  '..'
                  	or	ax,si			; 00000C10  0BC6  '..'
                  	jz	xc43			; 00000C12  742F  't/'
                  	push	es			; 00000C14  06  '.'
                  	mov	bx,si			; 00000C15  8BDE  '..'
                  	les	si,[es:bx+0x6]		; 00000C17  26C47706  '&.w.'
                  	mov	ax,es			; 00000C1B  8CC0  '..'
                  	or	ax,si			; 00000C1D  0BC6  '..'
                  	jz	xc24			; 00000C1F  7403  't.'
                  	or	cl,0x1			; 00000C21  80C901  '...'
                  xc24:	pop	es			; 00000C24  07  '.'
                  	push	es			; 00000C25  06  '.'
                  	les	si,[es:bx+0xa]		; 00000C26  26C4770A  '&.w',0x0A
                  	mov	ax,es			; 00000C2A  8CC0  '..'
                  	or	ax,si			; 00000C2C  0BC6  '..'
                  	jz	xc33			; 00000C2E  7403  't.'
                  	or	cl,0x10			; 00000C30  80C910  '...'
                  xc33:	pop	es			; 00000C33  07  '.'
                  	les	si,[es:bx+0x2]		; 00000C34  26C47702  '&.w.'
                  	mov	ax,es			; 00000C38  8CC0  '..'
                  	mov	bx,cs			; 00000C3A  8CCB  '..'
                  	cmp	ax,bx			; 00000C3C  3BC3  ';.'
                  	jz	xc43			; 00000C3E  7403  't.'
                  	or	cl,0x20			; 00000C40  80C920  '.. '
                  xc43:	pop	es			; 00000C43  07  '.'
                  	inc	di			; 00000C44  47  'G'
                  	mov	[es:di],cl		; 00000C45  26880D  '&.',0x0D
                  	inc	di			; 00000C48  47  'G'
                  	mov	cx,0xd			; 00000C49  B90D00  '.',0x0D,'.'
                  	xor	al,al			; 00000C4C  32C0  '2.'
                  	rep	stosb			; 00000C4E  F3AA  '..'
                  	mov	al,0x1b			; 00000C50  B01B  '..'
                  	jmp	x713			; 00000C52  E9BEFA  '...'
                  
                  	adc	[bx+si],al		; 00000C55  1000  '..'
                  	adc	[bx+si],al		; 00000C57  1000  '..'
                  	adc	[bx+si],al		; 00000C59  1000  '..'
                  	adc	[bx+si],al		; 00000C5B  1000  '..'
                  	add	al,0x0			; 00000C5D  0400  '..'
                  	add	al,0x0			; 00000C5F  0400  '..'
                  	add	al,[bx+si]		; 00000C61  0200  '..'
                  
                  	times	6 dw 0x0000		; 00000C63 - 00000C6D
                  	adc	[bx+si],al		; 00000C6F  1000  '..'
                  	adc	[bx+si],al		; 00000C71  1000  '..'
                  	add	[bx+si],al		; 00000C73  0000  '..'
                  	adc	[bx+si],al		; 00000C75  1000  '..'
                  	add	al,[bx+si]		; 00000C77  0200  '..'
                  	adc	[bx+si],al		; 00000C79  1000  '..'
                  	add	[bx+di],al		; 00000C7B  0001  '..'
                  	or	[bx+si],cl		; 00000C7D  0808  '..'
                  	or	[bx+si],cl		; 00000C7F  0808  '..'
                  	add	[bx+di],ax		; 00000C81  0101  '..'
                  	add	[bx+si],cx		; 00000C83  0108  '..'
                  	add	[bx+si],al		; 00000C85  0000  '..'
                  	add	[bx+si],al		; 00000C87  0000  '..'
                  	add	[bx+si],cl		; 00000C89  0008  '..'
                  	add	al,0x2			; 00000C8B  0402  '..'
                  	add	al,[bx+di]		; 00000C8D  0201  '..'
                  	add	[bx+di],ax		; 00000C8F  0101  '..'
                  	jmp	ax			; 00000C91  FFE0  '..'
                  
                  	sldt	[bx+si]			; 00000C93  0F0000  '...'
                  	add	[bx+si],al		; 00000C96  0000  '..'
                  	pop	es			; 00000C98  07  '.'
                  	add	cl,[bx+si]		; 00000C99  0208  '..'
                  	dec	word [0x0]		; 00000C9B  FF0E0000  '....'
                  	aas				; 00000C9F  3F  '?'
                  	add	[si],bh			; 00000CA0  003C  '.<'
                  	add	[di+0x2],dh		; 00000CA2  007502  '.u.'
                  	jmp	short xcb9		; 00000CA5  EB12  '..'
                  
                  	cmp	al,0x1			; 00000CA7  3C01  '<.'
                  	jnz	xcad			; 00000CA9  7502  'u.'
                  	jmp	short xd05		; 00000CAB  EB58  '.X'
                  
                  xcad:	cmp	al,0x2			; 00000CAD  3C02  '<.'
                  	jnz	xd00			; 00000CAF  754F  'uO'
                  	jmp	xd5d			; 00000CB1  E9A900  '...'
                  
                  xcb4:	mov	al,0x1c			; 00000CB4  B01C  '..'
                  	jmp	x713			; 00000CB6  E95AFA  '.Z.'
                  
                  xcb9:	mov	ax,0x20			; 00000CB9  B82000  '. .'
                  
                  	xor	dx,dx			; 00000CBC  33D2  '3.'
                  	test	cx,0x7			; 00000CBE  F7C10700  '....'
                  	jz	xd00			; 00000CC2  743C  't<'
                  	test	cx,0x1			; 00000CC4  F7C10100  '....'
                  	jz	xcd0			; 00000CC8  7406  't.'
                  	add	ax,0x46			; 00000CCA  054600  '.F.'
                  	adc	dx,byte +0x0		; 00000CCD  83D200  '...'
                  xcd0:	test	cx,0x2			; 00000CD0  F7C10200  '....'
                  	jz	xcdc			; 00000CD4  7406  't.'
                  	add	ax,0x3a			; 00000CD6  053A00  '.:.'
                  	adc	dx,byte +0x0		; 00000CD9  83D200  '...'
                  xcdc:	test	cx,0x4			; 00000CDC  F7C10400  '....'
                  	jz	xce8			; 00000CE0  7406  't.'
                  	add	ax,0x303		; 00000CE2  050303  '...'
                  	adc	dx,byte +0x0		; 00000CE5  83D200  '...'
                  xce8:	mov	bx,0x40			; 00000CE8  BB4000  '.@.'
                  	div	bx			; 00000CEB  F7F3  '..'
                  	cmp	dx,byte +0x0		; 00000CED  83FA00  '...'
                  	jz	xcf3			; 00000CF0  7401  't.'
                  	inc	ax			; 00000CF2  40  '@'
                  xcf3:	mov	bx,ax			; 00000CF3  8BD8  '..'
                  	pop	di			; 00000CF5  5F  '_'
                  	pop	si			; 00000CF6  5E  '^'
                  	pop	ax			; 00000CF7  58  'X'
                  	mov	al,0x1c			; 00000CF8  B01C  '..'
                  	pop	cx			; 00000CFA  59  'Y'
                  	pop	dx			; 00000CFB  5A  'Z'
                  	pop	ds			; 00000CFC  1F  '.'
                  	pop	es			; 00000CFD  07  '.'
                  	pop	bp			; 00000CFE  5D  ']'
                  	iret				; 00000CFF  CF  '.'
                  
                  xd00:	mov	al,0x0			; 00000D00  B000  '..'
                  	jmp	x713			; 00000D02  E90EFA  '...'
                  
                  xd05:	mov	dx,bx			; 00000D05  8BD3  '..'
                  	add	dx,byte +0x20		; 00000D07  83C220  '.. '
                  	test	cx,0x1			; 00000D0A  F7C10100  '....'
                  	jz	xd2c			; 00000D0E  741C  't.'
                  	push	cx			; 00000D10  51  'Q'
                  	push	bx			; 00000D11  53  'S'
                  	mov	[es:bx],dx		; 00000D12  268917  '&..'
                  	mov	bx,dx			; 00000D15  8BDA  '..'
                  	add	dx,byte +0x46		; 00000D17  83C246  '..F'
                  	push	dx			; 00000D1A  52  'R'
                  	mov	di,[0x463]		; 00000D1B  8B3E6304  '.>c.'
                  	push	ds			; 00000D1F  1E  '.'
                  	mov	ds,[cs:0x71e]		; 00000D20  2E8E1E1E07  '.....'
                  	call	xf2c			; 00000D25  E80402  '...'
                  	pop	ds			; 00000D28  1F  '.'
                  	pop	dx			; 00000D29  5A  'Z'
                  	pop	bx			; 00000D2A  5B  '['
                  	pop	cx			; 00000D2B  59  'Y'
                  xd2c:	test	cx,0x2			; 00000D2C  F7C10200  '....'
                  	jz	xd44			; 00000D30  7412  't.'
                  	push	cx			; 00000D32  51  'Q'
                  	push	bx			; 00000D33  53  'S'
                  	mov	[es:bx+0x2],dx		; 00000D34  26895702  '&.W.'
                  	mov	bx,dx			; 00000D38  8BDA  '..'
                  	add	dx,byte +0x3a		; 00000D3A  83C23A  '..:'
                  	push	dx			; 00000D3D  52  'R'
                  	call	xd9c			; 00000D3E  E85B00  '.[.'
                  	pop	dx			; 00000D41  5A  'Z'
                  	pop	bx			; 00000D42  5B  '['
                  	pop	cx			; 00000D43  59  'Y'
                  xd44:	test	cx,0x4			; 00000D44  F7C10400  '....'
                  	jz	xd00			; 00000D48  74B6  't.'
                  	mov	[es:bx+0x4],dx		; 00000D4A  26895704  '&.W.'
                  	mov	bx,dx			; 00000D4E  8BDA  '..'
                  	mov	di,[0x463]		; 00000D50  8B3E6304  '.>c.'
                  	call	xf44			; 00000D54  E8ED01  '...'
                  	call	x2b6e			; 00000D57  E8141E  '...'
                  	jmp	xcb4			; 00000D5A  E957FF  '.W.'
                  
                  xd5d:	test	cx,0x1			; 00000D5D  F7C10100  '....'
                  	jz	xd74			; 00000D61  7411  't.'
                  	push	cx			; 00000D63  51  'Q'
                  	push	bx			; 00000D64  53  'S'
                  	mov	bx,[es:bx]		; 00000D65  268B1F  '&..'
                  	push	ds			; 00000D68  1E  '.'
                  	mov	ds,[cs:0x71e]		; 00000D69  2E8E1E1E07  '.....'
                  	call	x10bd			; 00000D6E  E84C03  '.L.'
                  	pop	ds			; 00000D71  1F  '.'
                  	pop	bx			; 00000D72  5B  '['
                  	pop	cx			; 00000D73  59  'Y'
                  xd74:	test	cx,0x2			; 00000D74  F7C10200  '....'
                  	jz	xd85			; 00000D78  740B  't.'
                  	push	cx			; 00000D7A  51  'Q'
                  	push	bx			; 00000D7B  53  'S'
                  	mov	bx,[es:bx+0x2]		; 00000D7C  268B5F02  '&._.'
                  	call	xde1			; 00000D80  E85E00  '.^.'
                  	pop	bx			; 00000D83  5B  '['
                  	pop	cx			; 00000D84  59  'Y'
                  xd85:	test	cx,0x4			; 00000D85  F7C10400  '....'
                  	jz	xd99			; 00000D89  740E  't.'
                  	mov	bx,[es:bx+0x4]		; 00000D8B  268B5F04  '&._.'
                  	mov	di,[0x463]		; 00000D8F  8B3E6304  '.>c.'
                  	call	x10e5			; 00000D93  E84F03  '.O.'
                  	jmp	xcb4			; 00000D96  E91BFF  '...'
                  
                  xd99:	jmp	xd00			; 00000D99  E964FF  '.d.'
                  
                  xd9c:	push	es			; 00000D9C  06  '.'
                  	mov	di,bx			; 00000D9D  8BFB  '..'
                  	mov	al,[0x410]		; 00000D9F  A01004  '...'
                  	and	al,0x30			; 00000DA2  2430  '$0'
                  	mov	[es:di],al		; 00000DA4  268805  '&..'
                  	inc	di			; 00000DA7  47  'G'
                  	lea	si,[0x449]		; 00000DA8  8D364904  '.6I.'
                  	mov	cx,0x1e			; 00000DAC  B91E00  '...'
                  	rep	movsb			; 00000DAF  F3A4  '..'
                  	lea	si,[0x484]		; 00000DB1  8D368404  '.6..'
                  	mov	cx,0x7			; 00000DB5  B90700  '...'
                  	rep	movsb			; 00000DB8  F3A4  '..'
                  	lea	si,[0x4a8]		; 00000DBA  8D36A804  '.6..'
                  	cli				; 00000DBE  FA  '.'
                  	call	xe30			; 00000DBF  E86E00  '.n.'
                  	lea	si,[0x14]		; 00000DC2  8D361400  '.6..'
                  	call	xe30			; 00000DC6  E86700  '.g.'
                  	lea	si,[0x74]		; 00000DC9  8D367400  '.6t.'
                  	call	xe30			; 00000DCD  E86000  '.`.'
                  	lea	si,[0x7c]		; 00000DD0  8D367C00  '.6|.'
                  	call	xe30			; 00000DD4  E85900  '.Y.'
                  	lea	si,[0x10c]		; 00000DD7  8D360C01  '.6..'
                  	call	xe30			; 00000DDB  E85200  '.R.'
                  	sti				; 00000DDE  FB  '.'
                  	pop	es			; 00000DDF  07  '.'
                  	ret				; 00000DE0  C3  '.'
                  
                  xde1:	mov	al,[es:bx]		; 00000DE1  268A07  '&..'
                  	and	byte [0x410],0xcf	; 00000DE4  80261004CF  '.&...'
                  	or	[0x410],al		; 00000DE9  08061004  '....'
                  	push	es			; 00000DED  06  '.'
                  	mov	ax,ds			; 00000DEE  8CD8  '..'
                  	push	es			; 00000DF0  06  '.'
                  	pop	ds			; 00000DF1  1F  '.'
                  	mov	si,bx			; 00000DF2  8BF3  '..'
                  	mov	es,ax			; 00000DF4  8EC0  '..'
                  	inc	si			; 00000DF6  46  'F'
                  	lea	di,[0x449]		; 00000DF7  8D3E4904  '.>I.'
                  	mov	cx,0x1e			; 00000DFB  B91E00  '...'
                  	rep	movsb			; 00000DFE  F3A4  '..'
                  	lea	di,[0x484]		; 00000E00  8D3E8404  '.>..'
                  	mov	cx,0x7			; 00000E04  B90700  '...'
                  	rep	movsb			; 00000E07  F3A4  '..'
                  	lea	di,[0x4a8]		; 00000E09  8D3EA804  '.>..'
                  	cli				; 00000E0D  FA  '.'
                  	call	xe30			; 00000E0E  E81F00  '...'
                  	lea	di,[0x14]		; 00000E11  8D3E1400  '.>..'
                  	call	xe30			; 00000E15  E81800  '...'
                  	lea	di,[0x74]		; 00000E18  8D3E7400  '.>t.'
                  	call	xe30			; 00000E1C  E81100  '...'
                  	lea	di,[0x7c]		; 00000E1F  8D3E7C00  '.>|.'
                  	call	xe30			; 00000E23  E80A00  '.',0x0A,'.'
                  	lea	di,[0x10c]		; 00000E26  8D3E0C01  '.>..'
                  	call	xe30			; 00000E2A  E80300  '...'
                  	sti				; 00000E2D  FB  '.'
                  	pop	es			; 00000E2E  07  '.'
                  	ret				; 00000E2F  C3  '.'
                  
                  xe30:	mov	cx,0x4			; 00000E30  B90400  '...'
                  	rep	movsb			; 00000E33  F3A4  '..'
                  	ret				; 00000E35  C3  '.'
                  
                  xe36:	push	bp			; 00000E36  55  'U'
                  	push	ax			; 00000E37  50  'P'
                  	push	ax			; 00000E38  50  'P'
                  	mov	bp,0x12b8		; 00000E39  BDB812  '...'
                  	and	ax,0xf			; 00000E3C  250F00  '%..'
                  	shl	ax,1			; 00000E3F  D1E0  '..'
                  	add	bp,ax			; 00000E41  03E8  '..'
                  	mov	bp,[cs:bp+0x0]		; 00000E43  2E8B6E00  '..n.'
                  	pop	ax			; 00000E47  58  'X'
                  	xchg	al,ah			; 00000E48  86C4  '..'
                  	xor	ah,ah			; 00000E4A  32E4  '2.'
                  	shl	ax,1			; 00000E4C  D1E0  '..'
                  	add	bp,ax			; 00000E4E  03E8  '..'
                  	mov	bp,[cs:bp+0x0]		; 00000E50  2E8B6E00  '..n.'
                  	sub	bp,0x1342		; 00000E54  81ED4213  '..B.'
                  	add	bx,bp			; 00000E58  03DD  '..'
                  	pop	ax			; 00000E5A  58  'X'
                  	pop	bp			; 00000E5B  5D  ']'
                  	ret				; 00000E5C  C3  '.'
                  
                  xe5d:	cmp	al,0x0			; 00000E5D  3C00  '<.'
                  	jz	xe74			; 00000E5F  7413  't.'
                  	cmp	al,0x2			; 00000E61  3C02  '<.'
                  	jz	xe7b			; 00000E63  7416  't.'
                  	mov	bp,font_8x14		; 00000E65  BD8D3F  '..?'
                  	mov	bh,0xe			; 00000E68  B70E  '..'
                  	cmp	ah,0x7			; 00000E6A  80FC07  '...'
                  	jnz	xe83			; 00000E6D  7514  'u.'
                  	or	bl,0x80			; 00000E6F  80CB80  '...'
                  	jmp	short xe83		; 00000E72  EB0F  '..'
                  
                  xe74:	mov	bp,font_8x8		; 00000E74  BD8D37  '..7'
                  	mov	bh,0x8			; 00000E77  B708  '..'
                  	jmp	short xe83		; 00000E79  EB08  '..'
                  
                  xe7b:	mov	bp,font_8x16		; 00000E7B  BDBA4E  '..N'
                  	mov	bh,0x10			; 00000E7E  B710  '..'
                  	or	bl,0x80			; 00000E80  80CB80  '...'
                  xe83:	mov	cx,0x100		; 00000E83  B90001  '...'
                  	mov	dx,0x0			; 00000E86  BA0000  '...'
                  	push	cs			; 00000E89  0E  '.'
                  	pop	ds			; 00000E8A  1F  '.'
                  	ret				; 00000E8B  C3  '.'
                  
                  	add	[bx+si-0x80],al		; 00000E8C  004080  '.@.'
                  	shl	byte [bx+si],0x60	; 00000E8F  C02060  '. `'
                  	mov	al,[0x51e0]		; 00000E92  A0E051  '..Q'
                  	mov	cl,0x5			; 00000E95  B105  '..'
                  	shl	dx,cl			; 00000E97  D3E2  '..'
                  	pop	cx			; 00000E99  59  'Y'
                  	mov	es,ax			; 00000E9A  8EC0  '..'
                  	mov	di,dx			; 00000E9C  8BFA  '..'
                  	mov	si,bx			; 00000E9E  8BF3  '..'
                  	and	si,0x7			; 00000EA0  81E60700  '....'
                  	mov	dh,[cs:si+0xe8c]	; 00000EA4  2E8AB48C0E  '.....'
                  	xor	dl,dl			; 00000EA9  32D2  '2.'
                  	add	di,dx			; 00000EAB  03FA  '..'
                  	mov	si,bp			; 00000EAD  8BF5  '..'
                  	mov	bp,dx			; 00000EAF  8BEA  '..'
                  	mov	al,bh			; 00000EB1  8AC7  '..'
                  	sub	ah,ah			; 00000EB3  2AE4  '*.'
                  	jcxz	xec4			; 00000EB5  E30D  '.',0x0D
                  xeb7:	push	cx			; 00000EB7  51  'Q'
                  	mov	cx,ax			; 00000EB8  8BC8  '..'
                  	rep	movsb			; 00000EBA  F3A4  '..'
                  	sub	di,ax			; 00000EBC  2BF8  '+.'
                  	add	di,byte +0x20		; 00000EBE  83C720  '.. '
                  	pop	cx			; 00000EC1  59  'Y'
                  	loop	xeb7			; 00000EC2  E2F3  '..'
                  xec4:	test	bl,0x80			; 00000EC4  F6C380  '...'
                  	jz	xee7			; 00000EC7  741E  't.'
                  xec9:	mov	dl,[si]			; 00000EC9  8A14  '..'
                  	or	dl,dl			; 00000ECB  0AD2  0x0A,'.'
                  	jz	xee7			; 00000ECD  7418  't.'
                  	xor	dh,dh			; 00000ECF  32F6  '2.'
                  	push	cx			; 00000ED1  51  'Q'
                  	mov	cl,0x5			; 00000ED2  B105  '..'
                  	shl	dx,cl			; 00000ED4  D3E2  '..'
                  	pop	cx			; 00000ED6  59  'Y'
                  	add	dx,bp			; 00000ED7  03D5  '..'
                  	mov	di,dx			; 00000ED9  8BFA  '..'
                  	inc	si			; 00000EDB  46  'F'
                  	mov	cx,ax			; 00000EDC  8BC8  '..'
                  	rep	movsb			; 00000EDE  F3A4  '..'
                  	sub	di,ax			; 00000EE0  2BF8  '+.'
                  	add	di,byte +0x20		; 00000EE2  83C720  '.. '
                  	jmp	short xec9		; 00000EE5  EBE2  '..'
                  
                  xee7:	ret				; 00000EE7  C3  '.'
                  
                  xee8:	push	si			; 00000EE8  56  'V'
                  	xchg	al,ah			; 00000EE9  86C4  '..'
                  	xor	ah,ah			; 00000EEB  32E4  '2.'
                  	mov	si,ax			; 00000EED  8BF0  '..'
                  	mov	al,[cs:si+0xf07]	; 00000EEF  2E8A84070F  '.....'
                  	mov	si,ax			; 00000EF4  8BF0  '..'
                  	shl	si,1			; 00000EF6  D1E6  '..'
                  	mov	ax,[cs:si+0xeff]	; 00000EF8  2E8B84FF0E  '.....'
                  	pop	si			; 00000EFD  5E  '^'
                  	ret				; 00000EFE  C3  '.'
                  
                  	db	0xFF			; 00000EFF  FF  '.'
                  	dec	word [di+0x8d37]	; 00000F00  FF8D378D  '..7.'
                  	aas				; 00000F04  3F  '?'
                  	mov	dx,0x4e			; 00000F05  BA4E00  '.N.'
                  	add	[bx+si],al		; 00000F08  0000  '..'
                  	add	[bx+di],al		; 00000F0A  0001  '..'
                  	add	[bx+di],ax		; 00000F0C  0101  '..'
                  	add	[bp+di],al		; 00000F0E  0003  '..'
                  	add	[bx+di],ax		; 00000F10  0101  '..'
                  	add	[bx+di],ax		; 00000F12  0101  '..'
                  	add	[bx+di],ax		; 00000F14  0101  '..'
                  	add	al,[bp+si]		; 00000F16  0202  '..'
                  	add	ax,[bp+di]		; 00000F18  0303  '..'
                  	add	[bx+si+0x56],dx		; 00000F1A  015056  '.PV'
                  	xchg	al,ah			; 00000F1D  86C4  '..'
                  	xor	ah,ah			; 00000F1F  32E4  '2.'
                  	mov	si,ax			; 00000F21  8BF0  '..'
                  	cmp	byte [cs:si+0xf07],0x0	; 00000F23  2E80BC070F00  '......'
                  	pop	si			; 00000F29  5E  '^'
                  	pop	ax			; 00000F2A  58  'X'
                  	ret				; 00000F2B  C3  '.'
                  
                  xf2c:	call	xff6			; 00000F2C  E8C700  '...'
                  	call	xf89			; 00000F2F  E85700  '.W.'
                  	call	x1020			; 00000F32  E8EB00  '...'
                  	mov	dx,di			; 00000F35  8BD7  '..'
                  	add	dl,0x6			; 00000F37  80C206  '...'
                  	add	bx,byte +0x23		; 00000F3A  83C323  '..#'
                  	mov	bp,0x1			; 00000F3D  BD0100  '...'
                  	call	x2f3c			; 00000F40  E8F91F  '...'
                  	ret				; 00000F43  C3  '.'
                  
                  xf44:	call	xf53			; 00000F44  E80C00  '...'
                  	mov	cx,0x100		; 00000F47  B90001  '...'
                  	xor	di,di			; 00000F4A  33FF  '3.'
                  	add	bx,byte +0x3		; 00000F4C  83C303  '...'
                  	call	x2ef8			; 00000F4F  E8A61F  '...'
                  	ret				; 00000F52  C3  '.'
                  
                  xf53:	mov	dx,di			; 00000F53  8BD7  '..'
                  	add	dl,0x6			; 00000F55  80C206  '...'
                  	in	al,dx			; 00000F58  EC  '.'
                  	mov	dl,0xc0			; 00000F59  B2C0  '..'
                  	mov	al,0x14			; 00000F5B  B014  '..'
                  	pushf				; 00000F5D  9C  '.'
                  	cli				; 00000F5E  FA  '.'
                  	out	dx,al			; 00000F5F  EE  '.'
                  	inc	dx			; 00000F60  42  'B'
                  	in	al,dx			; 00000F61  EC  '.'
                  	popf				; 00000F62  9D  '.'
                  	mov	[es:bx+0x41],al		; 00000F63  26884741  '&.GA'
                  	mov	dx,0x3c7		; 00000F67  BAC703  '...'
                  	in	al,dx			; 00000F6A  EC  '.'
                  	and	al,0x1			; 00000F6B  2401  '$.'
                  	mov	[es:bx],al		; 00000F6D  268807  '&..'
                  	xchg	al,ah			; 00000F70  86C4  '..'
                  	mov	dx,0x3c8		; 00000F72  BAC803  '...'
                  	in	al,dx			; 00000F75  EC  '.'
                  	or	ah,ah			; 00000F76  0AE4  0x0A,'.'
                  	jz	xf7c			; 00000F78  7402  't.'
                  	dec	al			; 00000F7A  FEC8  '..'
                  xf7c:	mov	[es:bx+0x1],al		; 00000F7C  26884701  '&.G.'
                  	mov	dx,0x3c6		; 00000F80  BAC603  '...'
                  	in	al,dx			; 00000F83  EC  '.'
                  	mov	[es:bx+0x2],al		; 00000F84  26884702  '&.G.'
                  	ret				; 00000F88  C3  '.'
                  
                  xf89:	push	bx			; 00000F89  53  'S'
                  	mov	dx,0x3c4		; 00000F8A  BAC403  '...'
                  	add	bx,byte +0x5		; 00000F8D  83C305  '...'
                  	mov	cx,0x4			; 00000F90  B90400  '...'
                  	mov	al,0x1			; 00000F93  B001  '..'
                  	call	x10aa			; 00000F95  E81201  '...'
                  	pop	bx			; 00000F98  5B  '['
                  	mov	dl,0xcc			; 00000F99  B2CC  '..'
                  	in	al,dx			; 00000F9B  EC  '.'
                  	mov	[es:bx+0x9],al		; 00000F9C  26884709  '&.G.'
                  	mov	dl,0xca			; 00000FA0  B2CA  '..'
                  	in	al,dx			; 00000FA2  EC  '.'
                  	mov	[es:bx+0x4],al		; 00000FA3  26884704  '&.G.'
                  	mov	dx,di			; 00000FA7  8BD7  '..'
                  	push	bx			; 00000FA9  53  'S'
                  	add	bx,byte +0xa		; 00000FAA  83C30A  '..',0x0A
                  	mov	cx,0x19			; 00000FAD  B91900  '...'
                  	xor	al,al			; 00000FB0  32C0  '2.'
                  	call	x10aa			; 00000FB2  E8F500  '...'
                  	pop	bx			; 00000FB5  5B  '['
                  	mov	dx,di			; 00000FB6  8BD7  '..'
                  	add	dl,0x6			; 00000FB8  80C206  '...'
                  	pushf				; 00000FBB  9C  '.'
                  	cli				; 00000FBC  FA  '.'
                  	in	al,dx			; 00000FBD  EC  '.'
                  	push	dx			; 00000FBE  52  'R'
                  	mov	dl,0xc0			; 00000FBF  B2C0  '..'
                  	mov	al,0x10			; 00000FC1  B010  '..'
                  	out	dx,al			; 00000FC3  EE  '.'
                  	inc	dx			; 00000FC4  42  'B'
                  	in	al,dx			; 00000FC5  EC  '.'
                  	mov	[es:bx+0x33],al		; 00000FC6  26884733  '&.G3'
                  	pop	dx			; 00000FCA  5A  'Z'
                  	in	al,dx			; 00000FCB  EC  '.'
                  	push	dx			; 00000FCC  52  'R'
                  	mov	dl,0xc0			; 00000FCD  B2C0  '..'
                  	mov	al,0x12			; 00000FCF  B012  '..'
                  	out	dx,al			; 00000FD1  EE  '.'
                  	inc	dx			; 00000FD2  42  'B'
                  	in	al,dx			; 00000FD3  EC  '.'
                  	mov	[es:bx+0x35],al		; 00000FD4  26884735  '&.G5'
                  	pop	dx			; 00000FD8  5A  'Z'
                  	in	al,dx			; 00000FD9  EC  '.'
                  	mov	dl,0xc0			; 00000FDA  B2C0  '..'
                  	mov	al,0x13			; 00000FDC  B013  '..'
                  	out	dx,al			; 00000FDE  EE  '.'
                  	inc	dx			; 00000FDF  42  'B'
                  	in	al,dx			; 00000FE0  EC  '.'
                  	popf				; 00000FE1  9D  '.'
                  	mov	[es:bx+0x36],al		; 00000FE2  26884736  '&.G6'
                  	push	bx			; 00000FE6  53  'S'
                  	mov	dl,0xce			; 00000FE7  B2CE  '..'
                  	add	bx,byte +0x37		; 00000FE9  83C337  '..7'
                  	mov	cx,0x9			; 00000FEC  B90900  '...'
                  	xor	al,al			; 00000FEF  32C0  '2.'
                  	call	x10aa			; 00000FF1  E8B600  '...'
                  	pop	bx			; 00000FF4  5B  '['
                  	ret				; 00000FF5  C3  '.'
                  
                  xff6:	mov	[es:bx+0x40],di		; 00000FF6  26897F40  '&..@'
                  	mov	dx,0x3c4		; 00000FFA  BAC403  '...'
                  	in	al,dx			; 00000FFD  EC  '.'
                  	mov	[es:bx],al		; 00000FFE  268807  '&..'
                  	mov	dx,0x3d4		; 00001001  BAD403  '...'
                  	in	al,dx			; 00001004  EC  '.'
                  	mov	[es:bx+0x1],al		; 00001005  26884701  '&.G.'
                  	mov	dx,0x3ce		; 00001009  BACE03  '...'
                  	in	al,dx			; 0000100C  EC  '.'
                  	mov	[es:bx+0x2],al		; 0000100D  26884702  '&.G.'
                  	mov	dx,di			; 00001011  8BD7  '..'
                  	add	dl,0x6			; 00001013  80C206  '...'
                  	in	al,dx			; 00001016  EC  '.'
                  	mov	dx,0x3c0		; 00001017  BAC003  '...'
                  	in	al,dx			; 0000101A  EC  '.'
                  	mov	[es:bx+0x3],al		; 0000101B  26884703  '&.G.'
                  	ret				; 0000101F  C3  '.'
                  
                  x1020:	mov	dx,0x3c4		; 00001020  BAC403  '...'
                  	mov	al,0x2			; 00001023  B002  '..'
                  	pushf				; 00001025  9C  '.'
                  	cli				; 00001026  FA  '.'
                  	out	dx,al			; 00001027  EE  '.'
                  	inc	dx			; 00001028  42  'B'
                  	in	al,dx			; 00001029  EC  '.'
                  	dec	dx			; 0000102A  4A  'J'
                  	push	ax			; 0000102B  50  'P'
                  	mov	ax,0xf02		; 0000102C  B8020F  '...'
                  	out	dx,ax			; 0000102F  EF  '.'
                  	mov	al,0x4			; 00001030  B004  '..'
                  	out	dx,al			; 00001032  EE  '.'
                  	inc	dx			; 00001033  42  'B'
                  	in	al,dx			; 00001034  EC  '.'
                  	dec	dx			; 00001035  4A  'J'
                  	push	ax			; 00001036  50  'P'
                  	mov	ax,0x704		; 00001037  B80407  '...'
                  	out	dx,ax			; 0000103A  EF  '.'
                  	mov	dl,0xce			; 0000103B  B2CE  '..'
                  	mov	al,0x6			; 0000103D  B006  '..'
                  	out	dx,al			; 0000103F  EE  '.'
                  	inc	dx			; 00001040  42  'B'
                  	in	al,dx			; 00001041  EC  '.'
                  	dec	dx			; 00001042  4A  'J'
                  	push	ax			; 00001043  50  'P'
                  	mov	ax,0x406		; 00001044  B80604  '...'
                  	out	dx,ax			; 00001047  EF  '.'
                  	mov	al,0x5			; 00001048  B005  '..'
                  	out	dx,al			; 0000104A  EE  '.'
                  	inc	dx			; 0000104B  42  'B'
                  	in	al,dx			; 0000104C  EC  '.'
                  	dec	dx			; 0000104D  4A  'J'
                  	push	ax			; 0000104E  50  'P'
                  	mov	ax,0x105		; 0000104F  B80501  '...'
                  	out	dx,ax			; 00001052  EF  '.'
                  	mov	al,0x4			; 00001053  B004  '..'
                  	out	dx,al			; 00001055  EE  '.'
                  	inc	dx			; 00001056  42  'B'
                  	in	al,dx			; 00001057  EC  '.'
                  	dec	dx			; 00001058  4A  'J'
                  	push	ax			; 00001059  50  'P'
                  	mov	si,0xffff		; 0000105A  BEFFFF  '...'
                  	mov	byte [si],0x0		; 0000105D  C60400  '...'
                  	mov	ax,0x4			; 00001060  B80400  '...'
                  	out	dx,ax			; 00001063  EF  '.'
                  	mov	al,[si]			; 00001064  8A04  '..'
                  	mov	[es:bx+0x42],al		; 00001066  26884742  '&.GB'
                  	mov	ax,0x104		; 0000106A  B80401  '...'
                  	out	dx,ax			; 0000106D  EF  '.'
                  	mov	al,[si]			; 0000106E  8A04  '..'
                  	mov	[es:bx+0x43],al		; 00001070  26884743  '&.GC'
                  	mov	ax,0x204		; 00001074  B80402  '...'
                  	out	dx,ax			; 00001077  EF  '.'
                  	mov	al,[si]			; 00001078  8A04  '..'
                  	mov	[es:bx+0x44],al		; 0000107A  26884744  '&.GD'
                  	mov	ax,0x304		; 0000107E  B80403  '...'
                  	out	dx,ax			; 00001081  EF  '.'
                  	mov	al,[si]			; 00001082  8A04  '..'
                  	mov	[es:bx+0x45],al		; 00001084  26884745  '&.GE'
                  	pop	ax			; 00001088  58  'X'
                  	xchg	al,ah			; 00001089  86C4  '..'
                  	mov	al,0x4			; 0000108B  B004  '..'
                  	out	dx,ax			; 0000108D  EF  '.'
                  	pop	ax			; 0000108E  58  'X'
                  	xchg	al,ah			; 0000108F  86C4  '..'
                  	mov	al,0x5			; 00001091  B005  '..'
                  	out	dx,ax			; 00001093  EF  '.'
                  	pop	ax			; 00001094  58  'X'
                  	xchg	al,ah			; 00001095  86C4  '..'
                  	mov	al,0x6			; 00001097  B006  '..'
                  	out	dx,ax			; 00001099  EF  '.'
                  	mov	dl,0xc4			; 0000109A  B2C4  '..'
                  	pop	ax			; 0000109C  58  'X'
                  	xchg	al,ah			; 0000109D  86C4  '..'
                  	mov	al,0x4			; 0000109F  B004  '..'
                  	out	dx,ax			; 000010A1  EF  '.'
                  	pop	ax			; 000010A2  58  'X'
                  	xchg	al,ah			; 000010A3  86C4  '..'
                  	mov	al,0x2			; 000010A5  B002  '..'
                  	out	dx,ax			; 000010A7  EF  '.'
                  	popf				; 000010A8  9D  '.'
                  	ret				; 000010A9  C3  '.'
                  
                  x10aa:	pushf				; 000010AA  9C  '.'
                  	cli				; 000010AB  FA  '.'
                  	out	dx,al			; 000010AC  EE  '.'
                  	inc	dx			; 000010AD  42  'B'
                  	push	ax			; 000010AE  50  'P'
                  	in	al,dx			; 000010AF  EC  '.'
                  	mov	[es:bx],al		; 000010B0  268807  '&..'
                  	pop	ax			; 000010B3  58  'X'
                  	popf				; 000010B4  9D  '.'
                  	dec	dx			; 000010B5  4A  'J'
                  	inc	al			; 000010B6  FEC0  '..'
                  	inc	bx			; 000010B8  43  'C'
                  	dec	cx			; 000010B9  49  'I'
                  	jnz	x10aa			; 000010BA  75EE  'u.'
                  	ret				; 000010BC  C3  '.'
                  
                  x10bd:	call	x11bc			; 000010BD  E8FC00  '...'
                  	mov	di,[es:bx+0x40]		; 000010C0  268B7F40  '&..@'
                  	call	x1127			; 000010C4  E86000  '.`.'
                  	mov	dx,di			; 000010C7  8BD7  '..'
                  	add	dl,0x6			; 000010C9  80C206  '...'
                  	mov	al,[es:bx+0x4]		; 000010CC  268A4704  '&.G.'
                  	out	dx,al			; 000010D0  EE  '.'
                  	push	bx			; 000010D1  53  'S'
                  	add	bx,byte +0x23		; 000010D2  83C323  '..#'
                  	mov	cx,0x10			; 000010D5  B91000  '...'
                  	xor	di,di			; 000010D8  33FF  '3.'
                  	mov	bp,0x1			; 000010DA  BD0100  '...'
                  	call	x2f11			; 000010DD  E8311E  '.1.'
                  	pop	bx			; 000010E0  5B  '['
                  	call	x1194			; 000010E1  E8B000  '...'
                  	ret				; 000010E4  C3  '.'
                  
                  x10e5:	mov	al,[es:bx+0x2]		; 000010E5  268A4702  '&.G.'
                  	mov	dx,0x3c6		; 000010E9  BAC603  '...'
                  	out	dx,al			; 000010EC  EE  '.'
                  	push	di			; 000010ED  57  'W'
                  	mov	cx,0x100		; 000010EE  B90001  '...'
                  	xor	di,di			; 000010F1  33FF  '3.'
                  	push	bx			; 000010F3  53  'S'
                  	add	bx,byte +0x3		; 000010F4  83C303  '...'
                  	mov	dx,0x0			; 000010F7  BA0000  '...'
                  	call	x2ed3			; 000010FA  E8D61D  '...'
                  	pop	bx			; 000010FD  5B  '['
                  	pop	di			; 000010FE  5F  '_'
                  	call	x1103			; 000010FF  E80100  '...'
                  	ret				; 00001102  C3  '.'
                  
                  x1103:	mov	dx,di			; 00001103  8BD7  '..'
                  	add	dl,0x6			; 00001105  80C206  '...'
                  	in	al,dx			; 00001108  EC  '.'
                  	mov	dl,0xc0			; 00001109  B2C0  '..'
                  	mov	ah,[es:bx]		; 0000110B  268A27  '&.',0x27
                  	mov	al,0x14			; 0000110E  B014  '..'
                  	out	dx,ax			; 00001110  EF  '.'
                  	mov	al,[es:bx+0x1]		; 00001111  268A4701  '&.G.'
                  	mov	ah,[es:bx]		; 00001115  268A27  '&.',0x27
                  	or	ah,ah			; 00001118  0AE4  0x0A,'.'
                  	jz	x1122			; 0000111A  7406  't.'
                  	mov	dx,0x3c7		; 0000111C  BAC703  '...'
                  	out	dx,al			; 0000111F  EE  '.'
                  	jmp	short x1126		; 00001120  EB04  '..'
                  
                  x1122:	mov	dx,0x3c8		; 00001122  BAC803  '...'
                  	out	dx,al			; 00001125  EE  '.'
                  x1126:	ret				; 00001126  C3  '.'
                  
                  ;
                  ; Programs the card using data from [BX]; CRTC port address is in DI (0x3B4 or 0x3D4).
                  ;
                  ; 	Writes 0x01 to SEQ register 0x00 (SEQ.RESET).
                  ;	Writes values starting at [BX+0x05] to SEQ registers 0x01-0x04.
                  ; 	Writes [BX+0x09] to Miscellaneous Output register (MISC).
                  ;	Writes 0x03 to SEQ register 0x00 (SEQ.RESET).
                  ;	Writes 0x00 to CRTC register 0x11 (CRTC.VERT_RETRACE_END).
                  ;	Writes values starting at [BX+0x0A] to CRTC registers 0x00-0x18.
                  ;	Writes values starting at [BX+0x33] to ATC registers 0x10, 0x12 and 0x13
                  ;	Writes values starting at [BX+0x37] to GRC registers 0x00-0x08.
                  ;
                  x1127:	mov	dx,0x3c4		; (DX) == SEQ port address (0x3C4)
                  	mov	ax,0x100		; 0000112A  B80001  '...'
                  	pushf				; 0000112D  9C  '.'
                  	cli				; 0000112E  FA  '.'
                  	out	dx,ax			; 0000112F  EF  '.'
                  	push	bx			; 00001130  53  'S'
                  	add	bx,byte +0x5		; 00001131  83C305  '...'
                  	mov	cx,0x4			; 00001134  B90400  '...'
                  	mov	al,0x1			; 00001137  B001  '..'
                  	call	x1201			; 00001139  E8C500  '...'
                  	pop	bx			; 0000113C  5B  '['
                  	mov	dl,0xc2			; (DX) == MISC port address (0x3C2)
                  	mov	al,[es:bx+0x9]		; 0000113F  268A4709  '&.G.'
                  	out	dx,al			; 00001143  EE  '.'
                  	mov	dl,0xc4			; (DX) == SEQ port address (0x3C4)
                  	mov	ax,0x300		; 00001146  B80003  '...'
                  	out	dx,ax			; 00001149  EF  '.'
                  	popf				; 0000114A  9D  '.'
                  	mov	dx,di			; (DX) == CRTC port address (0x3B4 or 0x3D4)
                  	mov	al,0x11			; 0000114D  B011  '..'
                  	xor	ah,ah			; 0000114F  32E4  '2.'
                  	out	dx,ax			; 00001151  EF  '.'
                  	push	bx			; 00001152  53  'S'
                  	add	bx,byte +0xa		; 00001153  83C30A  '..',0x0A
                  	mov	cx,0x19			; 00001156  B91900  '...'
                  	xor	al,al			; 00001159  32C0  '2.'
                  	call	x1201			; 0000115B  E8A300  '...'
                  	pop	bx			; 0000115E  5B  '['
                  	mov	dx,di			; 0000115F  8BD7  '..'
                  	add	dl,0x6			; (DX) == STATUS1 port address (0x3BA or 0x3DA)
                  	push	dx			; 00001164  52  'R'
                  	pushf				; 00001165  9C  '.'
                  	cli				; 00001166  FA  '.'
                  	in	al,dx			; 00001167  EC  '.'
                  	mov	dl,0xc0			; (DX) == ATC port address (0x3C0)
                  	mov	al,0x10			; 0000116A  B010  '..'
                  	out	dx,al			; 0000116C  EE  '.'
                  	mov	al,[es:bx+0x33]		; 0000116D  268A4733  '&.G3'
                  	out	dx,al			; 00001171  EE  '.'
                  	mov	al,0x12			; 00001172  B012  '..'
                  	out	dx,al			; 00001174  EE  '.'
                  	mov	al,[es:bx+0x35]		; 00001175  268A4735  '&.G5'
                  	out	dx,al			; 00001179  EE  '.'
                  	mov	al,0x13			; 0000117A  B013  '..'
                  	out	dx,al			; 0000117C  EE  '.'
                  	mov	al,[es:bx+0x36]		; 0000117D  268A4736  '&.G6'
                  	out	dx,al			; 00001181  EE  '.'
                  	popf				; 00001182  9D  '.'
                  	push	bx			; 00001183  53  'S'
                  	mov	dl,0xce			; (DX) == GRC port address (0x3CE)
                  	add	bx,byte +0x37		; 00001186  83C337  '..7'
                  	mov	cx,0x9			; 00001189  B90900  '...'
                  	xor	al,al			; 0000118C  32C0  '2.'
                  	call	x1201			; 0000118E  E87000  '.p.'
                  	pop	bx			; 00001191  5B  '['
                  	pop	dx			; 00001192  5A  'Z'
                  	ret				; 00001193  C3  '.'
                  
                  x1194:	mov	dx,0x3c4		; 00001194  BAC403  '...'
                  	mov	al,[es:bx]		; 00001197  268A07  '&..'
                  	out	dx,al			; 0000119A  EE  '.'
                  	mov	dx,0x3d4		; 0000119B  BAD403  '...'
                  	mov	al,[es:bx+0x1]		; 0000119E  268A4701  '&.G.'
                  	out	dx,al			; 000011A2  EE  '.'
                  	mov	dx,0x3ce		; 000011A3  BACE03  '...'
                  	mov	al,[es:bx+0x2]		; 000011A6  268A4702  '&.G.'
                  	out	dx,al			; 000011AA  EE  '.'
                  	mov	dx,[es:bx+0x40]		; 000011AB  268B5740  '&.W@'
                  	add	dl,0x6			; 000011AF  80C206  '...'
                  	in	al,dx			; 000011B2  EC  '.'
                  	mov	dx,0x3c0		; 000011B3  BAC003  '...'
                  	mov	al,[es:bx+0x3]		; 000011B6  268A4703  '&.G.'
                  	out	dx,al			; 000011BA  EE  '.'
                  	ret				; 000011BB  C3  '.'
                  
                  x11bc:	mov	dx,0x3c4		; 000011BC  BAC403  '...'
                  	mov	ax,0x704		; 000011BF  B80407  '...'
                  	out	dx,ax			; 000011C2  EF  '.'
                  	mov	dl,0xce			; 000011C3  B2CE  '..'
                  	mov	ax,0x406		; 000011C5  B80604  '...'
                  	out	dx,ax			; 000011C8  EF  '.'
                  	mov	ax,0x5			; 000011C9  B80500  '...'
                  	out	dx,ax			; 000011CC  EF  '.'
                  	mov	si,0xffff		; 000011CD  BEFFFF  '...'
                  	mov	dl,0xc4			; 000011D0  B2C4  '..'
                  	mov	ax,0x2			; 000011D2  B80200  '...'
                  	out	dx,ax			; 000011D5  EF  '.'
                  	mov	al,[es:bx+0x42]		; 000011D6  268A4742  '&.GB'
                  	mov	[si],al			; 000011DA  8804  '..'
                  	mov	ax,0x102		; 000011DC  B80201  '...'
                  	out	dx,ax			; 000011DF  EF  '.'
                  	mov	al,[es:bx+0x43]		; 000011E0  268A4743  '&.GC'
                  	mov	[si],al			; 000011E4  8804  '..'
                  	mov	ax,0x202		; 000011E6  B80202  '...'
                  	out	dx,ax			; 000011E9  EF  '.'
                  	mov	al,[es:bx+0x44]		; 000011EA  268A4744  '&.GD'
                  	mov	[si],al			; 000011EE  8804  '..'
                  	mov	ax,0x402		; 000011F0  B80204  '...'
                  	out	dx,ax			; 000011F3  EF  '.'
                  	mov	al,[es:bx+0x45]		; 000011F4  268A4745  '&.GE'
                  	mov	[si],al			; 000011F8  8804  '..'
                  	mov	ax,0xf02		; 000011FA  B8020F  '...'
                  	out	dx,ax			; 000011FD  EF  '.'
                  	mov	al,[si]			; 000011FE  8A04  '..'
                  	ret				; 00001200  C3  '.'
                  
                  x1201:	mov	ah,[es:bx]		; 00001201  268A27  '&.',0x27
                  	out	dx,ax			; 00001204  EF  '.'
                  	inc	al			; 00001205  FEC0  '..'
                  	inc	bx			; 00001207  43  'C'
                  	dec	cx			; 00001208  49  'I'
                  	jnz	x1201			; 00001209  75F6  'u.'
                  	ret				; 0000120B  C3  '.'
                  
                  x120c:	push	ax			; 0000120C  50  'P'
                  	push	dx			; 0000120D  52  'R'
                  	mov	dx,0x3c4		; 0000120E  BAC403  '...'
                  	mov	ax,0x402		; 00001211  B80204  '...'
                  	out	dx,ax			; 00001214  EF  '.'
                  	mov	ax,0x704		; 00001215  B80407  '...'
                  	out	dx,ax			; 00001218  EF  '.'
                  	mov	dl,0xce			; 00001219  B2CE  '..'
                  	mov	ax,0x5			; 0000121B  B80500  '...'
                  	out	dx,ax			; 0000121E  EF  '.'
                  	mov	ax,0x406		; 0000121F  B80604  '...'
                  	out	dx,ax			; 00001222  EF  '.'
                  	mov	ax,0x204		; 00001223  B80402  '...'
                  	out	dx,ax			; 00001226  EF  '.'
                  	mov	dx,cx			; 00001227  8BD1  '..'
                  	and	dl,0xf0			; 00001229  80E2F0  '...'
                  	or	dl,0xa			; 0000122C  80CA0A  '..',0x0A
                  	in	al,dx			; 0000122F  EC  '.'
                  	mov	dl,0xc0			; 00001230  B2C0  '..'
                  	mov	al,0x0			; 00001232  B000  '..'
                  	out	dx,al			; 00001234  EE  '.'
                  	pop	dx			; 00001235  5A  'Z'
                  	pop	ax			; 00001236  58  'X'
                  	ret				; 00001237  C3  '.'
                  
                  x1238:	push	ax			; 00001238  50  'P'
                  	push	dx			; 00001239  52  'R'
                  	mov	dx,0x3c4		; 0000123A  BAC403  '...'
                  	mov	ax,0x302		; 0000123D  B80203  '...'
                  	out	dx,ax			; 00001240  EF  '.'
                  	mov	ax,0x304		; 00001241  B80403  '...'
                  	out	dx,ax			; 00001244  EF  '.'
                  	mov	dl,0xce			; 00001245  B2CE  '..'
                  	mov	ax,0x1005		; 00001247  B80510  '...'
                  	out	dx,ax			; 0000124A  EF  '.'
                  	mov	al,0x6			; 0000124B  B006  '..'
                  	mov	ah,0xa			; 0000124D  B40A  '.',0x0A
                  	cmp	cx,0x3b4		; 0000124F  81F9B403  '....'
                  	jz	x1257			; 00001253  7402  't.'
                  	mov	ah,0xe			; 00001255  B40E  '..'
                  x1257:	out	dx,ax			; 00001257  EF  '.'
                  	mov	ax,0x4			; 00001258  B80400  '...'
                  	out	dx,ax			; 0000125B  EF  '.'
                  	pop	dx			; 0000125C  5A  'Z'
                  	pop	ax			; 0000125D  58  'X'
                  	ret				; 0000125E  C3  '.'
                  
                  x125f:	mov	dx,0x3c4		; 0000125F  BAC403  '...'
                  	mov	al,0x3			; 00001262  B003  '..'
                  	mov	ah,bl			; 00001264  8AE3  '..'
                  	out	dx,ax			; 00001266  EF  '.'
                  	ret				; 00001267  C3  '.'
                  
                  x1268:	mov	al,[es:bx+si]		; 00001268  268A00  '&..'
                  	cmp	al,0xff			; 0000126B  3CFF  '<.'
                  	jz	x1276			; 0000126D  7407  't.'
                  	cmp	al,ah			; 0000126F  3AC4  ':.'
                  	jz	x1278			; 00001271  7405  't.'
                  	inc	si			; 00001273  46  'F'
                  	jmp	short x1268		; 00001274  EBF2  '..'
                  
                  x1276:	stc				; 00001276  F9  '.'
                  	ret				; 00001277  C3  '.'
                  
                  x1278:	clc				; 00001278  F8  '.'
                  	ret				; 00001279  C3  '.'
                  
                  x127a:	mov	dx,0x3c4		; 0000127A  BAC403  '...'
                  	mov	al,0x1			; 0000127D  B001  '..'
                  	out	dx,al			; 0000127F  EE  '.'
                  	inc	dx			; 00001280  42  'B'
                  	in	al,dx			; 00001281  EC  '.'
                  	push	ax			; 00001282  50  'P'
                  	and	ax,0x20df		; 00001283  25DF20  '%. '
                  	or	ah,al			; 00001286  0AE0  0x0A,'.'
                  	dec	dx			; 00001288  4A  'J'
                  	mov	al,0x1			; 00001289  B001  '..'
                  	out	dx,ax			; 0000128B  EF  '.'
                  	pop	ax			; 0000128C  58  'X'
                  	xchg	al,ah			; 0000128D  86C4  '..'
                  	ret				; 0000128F  C3  '.'
                  
                  	db	0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00
                  	db	0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00
                  	db	0x03,0x00,0x03,0x00,0x03,0x00,0x04,0x00,0xC0,0x12,0xE8,0x12,0x0A,0x13,0x1C,0x13
                  	db	0x42,0x13,0x82,0x13,0xC2,0x13,0x02,0x14,0x42,0x14,0x82,0x14,0xC2,0x14,0x00,0x00
                  	db	0x00,0x00,0x82,0x15,0xC2,0x15,0x02,0x16,0x42,0x16,0x82,0x16,0xC2,0x16,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x1A,0x02,0x18,0x42,0x18,0x82,0x18,0xC2,0x18
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x17,0xC2,0x17,0x02,0x19,0x02,0x19,0x42,0x19
                  	db	0x42,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x19,0x42,0x15,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC2,0x19
                  	db	0x02,0x1A,0x28,0x18,0x08,0x00,0x08,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
                  	db	0x2B,0xA0,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x28,0x18,0x08,0x00,0x08,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
                  	db	0x2B,0xA0,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x08,0x00,0x10,0x01,0x03,0x00,0x02,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x08,0x00,0x10,0x01,0x03,0x00,0x02,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0xC7,0x06,0x07,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x28,0x18,0x08,0x00,0x40,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
                  	db	0x2B,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x00,0x96,0xB9,0xA2,0xFF,0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0F
                  	db	0x00,0xFF,0x28,0x18,0x08,0x00,0x40,0x09,0x03,0x00,0x02,0x63,0x2D,0x27,0x28,0x90
                  	db	0x2B,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x00,0x96,0xB9,0xA2,0xFF,0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0F
                  	db	0x00,0xFF,0x50,0x18,0x08,0x00,0x40,0x01,0x01,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0xBF,0x1F,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x00,0x96,0xB9,0xC2,0xFF,0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17
                  	db	0x17,0x17,0x17,0x17,0x17,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D
                  	db	0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x00,0x03,0x00,0x03,0xA6,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
                  	db	0x0D,0x63,0xBA,0xA3,0xFF,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18
                  	db	0x18,0x18,0x18,0x18,0x18,0x0E,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0A
                  	db	0x00,0xFF,0x50,0x18,0x10,0x00,0x7D,0x21,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x28,0x18,0x08,0x00,0x40,0x00,0x00,0x00,0x03,0x23,0x37,0x27,0x2D,0x37
                  	db	0x31,0x15,0x04,0x11,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x00,0xE1,0x24,0xC7,0x14
                  	db	0x08,0xE0,0xF0,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x00,0x00,0x00,0x00,0x29,0x0F,0x00,0x06,0x62,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x05
                  	db	0x0F,0xFF,0x50,0x00,0x00,0x00,0x00,0x29,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xE3,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x00,0x00,0x00,0x00,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x05
                  	db	0x0F,0xFF,0x28,0x18,0x08,0x00,0x20,0x09,0x0F,0x00,0x06,0x63,0x2D,0x27,0x28,0x90
                  	db	0x2B,0x80,0xBF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x00,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x0F,0xFF,0x50,0x18,0x08,0x00,0x40,0x01,0x0F,0x00,0x06,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0xBF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x00,0x96,0xB9,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12
                  	db	0x13,0x14,0x15,0x16,0x17,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x05,0x0F,0x00,0x00,0xA2,0x60,0x4F,0x56,0x1A
                  	db	0x50,0xE0,0x70,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x2E,0x5D,0x14
                  	db	0x00,0x5E,0x6E,0x8B,0xFF,0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00
                  	db	0x00,0x00,0x18,0x00,0x00,0x0B,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07
                  	db	0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x05,0x0F,0x00,0x00,0xA7,0x5B,0x4F,0x53,0x17
                  	db	0x50,0xBA,0x6C,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x2B,0x5D,0x14
                  	db	0x0F,0x5F,0x0A,0x8B,0xFF,0x00,0x01,0x00,0x00,0x04,0x07,0x00,0x00,0x00,0x01,0x00
                  	db	0x00,0x04,0x07,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07
                  	db	0x0F,0xFF,0x50,0x18,0x0E,0x00,0x80,0x01,0x0F,0x00,0x06,0xA2,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
                  	db	0x0F,0x63,0xBA,0xE3,0xFF,0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00
                  	db	0x00,0x00,0x18,0x00,0x00,0x0B,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x05,0xFF,0x50,0x18,0x0E,0x00,0x80,0x01,0x0F,0x00,0x06,0xA3,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0xBF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
                  	db	0x0F,0x63,0xBA,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x0F,0xFF,0x28,0x18,0x0E,0x00,0x08,0x09,0x03,0x00,0x02,0xA3,0x2D,0x27,0x28,0x90
                  	db	0x2B,0xA0,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x14
                  	db	0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x28,0x18,0x0E,0x00,0x08,0x09,0x03,0x00,0x02,0xA3,0x2D,0x27,0x28,0x90
                  	db	0x2B,0xA0,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x14
                  	db	0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x01,0x03,0x00,0x02,0xA3,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
                  	db	0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x0E,0x00,0x10,0x01,0x03,0x00,0x02,0xA3,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x4D,0x0B,0x0C,0x00,0x00,0x00,0x00,0x83,0x85,0x5D,0x28
                  	db	0x1F,0x63,0xBA,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x08,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x28,0x18,0x10,0x00,0x08,0x08,0x03,0x00,0x02,0x67,0x2D,0x27,0x28,0x90
                  	db	0x2B,0xA0,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x14
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x0C,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x10,0x00,0x10,0x00,0x03,0x00,0x02,0x67,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x1F,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x0C,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0E
                  	db	0x00,0xFF,0x50,0x18,0x10,0x00,0x10,0x00,0x03,0x00,0x02,0x66,0x5F,0x4F,0x50,0x82
                  	db	0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0D,0x0E,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x0F,0x96,0xB9,0xA3,0xFF,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18
                  	db	0x18,0x18,0x18,0x18,0x18,0x0E,0x00,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x0A
                  	db	0x00,0xFF,0x50,0x1D,0x10,0x00,0xA0,0x01,0x0F,0x00,0x06,0xE3,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xEA,0x8C,0xDF,0x28
                  	db	0x00,0xE7,0x04,0xC3,0xFF,0x00,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
                  	db	0x3F,0x3F,0x3F,0x3F,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x01,0xFF,0x50,0x1D,0x10,0x00,0xA0,0x01,0x0F,0x00,0x06,0xE3,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xEA,0x8C,0xDF,0x28
                  	db	0x00,0xE7,0x04,0xE3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A
                  	db	0x3B,0x3C,0x3D,0x3E,0x3F,0x01,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05
                  	db	0x0F,0xFF,0x28,0x18,0x08,0x00,0x20,0x01,0x0F,0x00,0x0E,0x63,0x5F,0x4F,0x50,0x82
                  	db	0x54,0x80,0xBF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x8E,0x8F,0x28
                  	db	0x40,0x96,0xB9,0xA3,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A
                  	db	0x0B,0x0C,0x0D,0x0E,0x0F,0x41,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05
                  	db	0x0F,0xFF
                  
                  	push	ax			; 00001A82  50  'P'
                  	and	al,0x7f			; 00001A83  247F  '$.'
                  	cmp	al,0x13			; 00001A85  3C13  '<.'
                  	pop	ax			; 00001A87  58  'X'
                  	ja	x1aa2			; 00001A88  7718  'w.'
                  	push	ax			; 00001A8A  50  'P'
                  	and	al,0x80			; 00001A8B  2480  '$.'
                  	and	byte [0x487],0x7f	; 00001A8D  802687047F  '.&...'
                  	or	[0x487],al		; 00001A92  08068704  '....'
                  	pop	ax			; 00001A96  58  'X'
                  	and	al,0x7f			; 00001A97  247F  '$.'
                  	cmp	al,[0x449]		; 00001A99  3A064904  ':.I.'
                  	jnz	x1aa5			; 00001A9D  7506  'u.'
                  	jmp	x1b38			; 00001A9F  E99600  '...'
                  
                  x1aa2:	jmp	x713			; 00001AA2  E96EEC  '.n.'
                  
                  x1aa5:	test	byte [0x489],0x1	; 00001AA5  F606890401  '.....'
                  	jnz	x1aaf			; 00001AAA  7503  'u.'
                  	jmp	x1b38			; 00001AAC  E98900  '...'
                  
                  x1aaf:	mov	bl,[0x488]		; 00001AAF  8A1E8804  '....'
                  	and	bx,0xf			; 00001AB3  81E30F00  '....'
                  	mov	bl,[cs:bx+0x1e88]	; 00001AB7  2E8A9F881E  '.....'
                  	mov	bh,bl			; 00001ABC  8AFB  '..'
                  	mov	dx,[0x463]		; 00001ABE  8B166304  '..c.'
                  	cmp	al,0x7			; 00001AC2  3C07  '<.'
                  	jz	x1aff			; 00001AC4  7439  't9'
                  	cmp	al,0xf			; 00001AC6  3C0F  '<.'
                  	jz	x1aff			; 00001AC8  7435  't5'
                  	cmp	dx,0x3d4		; 00001ACA  81FAD403  '....'
                  	jz	x1b38			; 00001ACE  7468  'th'
                  	mov	ah,[0x410]		; 00001AD0  8A261004  '.&..'
                  	and	ah,0x30			; 00001AD4  80E430  '..0'
                  	cmp	ah,0x30			; 00001AD7  80FC30  '..0'
                  	jz	x1afb			; 00001ADA  741F  't.'
                  	and	byte [0x487],0xfd	; 00001ADC  80268704FD  '.&...'
                  	mov	dx,0x3d4		; 00001AE1  BAD403  '...'
                  	cmp	bl,0xff			; 00001AE4  80FBFF  '...'
                  	nop				; 00001AE7  90  '.'
                  	jz	x1b38			; 00001AE8  744E  'tN'
                  	mov	bh,[0x489]		; 00001AEA  8A3E8904  '.>..'
                  	shl	bh,1			; 00001AEE  D0E7  '..'
                  	cmc				; 00001AF0  F5  '.'
                  	adc	bl,0x0			; 00001AF1  80D300  '...'
                  	and	byte [0x489],0x7f	; 00001AF4  802689047F  '.&...'
                  	jmp	short x1b2b		; 00001AF9  EB30  '.0'
                  
                  x1afb:	mov	al,0x7			; 00001AFB  B007  '..'
                  	jmp	short x1b38		; 00001AFD  EB39  '.9'
                  
                  x1aff:	cmp	dx,0x3b4		; 00001AFF  81FAB403  '....'
                  	jz	x1b38			; 00001B03  7433  't3'
                  	mov	ah,[0x410]		; 00001B05  8A261004  '.&..'
                  	and	ah,0x30			; 00001B09  80E430  '..0'
                  	cmp	ah,0x30			; 00001B0C  80FC30  '..0'
                  	jnz	x1b36			; 00001B0F  7525  'u%'
                  	or	byte [0x487],0x2	; 00001B11  800E870402  '.....'
                  	mov	dx,0x3b4		; 00001B16  BAB403  '...'
                  	cmp	bl,0xff			; 00001B19  80FBFF  '...'
                  	nop				; 00001B1C  90  '.'
                  	jz	x1b38			; 00001B1D  7419  't.'
                  	and	bh,0x80			; 00001B1F  80E780  '...'
                  	and	byte [0x489],0x7f	; 00001B22  802689047F  '.&...'
                  	or	[0x489],bh		; 00001B27  083E8904  '.>..'
                  x1b2b:	and	byte [0x488],0xf0	; 00001B2B  80268804F0  '.&...'
                  	or	[0x488],bl		; 00001B30  081E8804  '....'
                  	jmp	short x1b38		; 00001B34  EB02  '..'
                  
                  x1b36:	mov	al,0x0			; 00001B36  B000  '..'
                  x1b38:	cli				; 00001B38  FA  '.'
                  	mov	word [0x10c],font_8x8	; 00001B39  C7060C018D37  '.....7'
                  	mov	[0x10e],cs		; 00001B3F  8C0E0E01  '....'
                  	sti				; 00001B43  FB  '.'
                  	and	byte [0x487],0xf3	; 00001B44  80268704F3  '.&...'
                  	mov	[0x449],al		; 00001B49  A24904  '.I.'
                  	mov	ah,[0x410]		; 00001B4C  8A261004  '.&..'
                  	and	ah,0x30			; 00001B50  80E430  '..0'
                  	cmp	ah,0x30			; 00001B53  80FC30  '..0'
                  	jnz	x1bbd			; 00001B56  7565  'ue'
                  	test	byte [0x487],0x2	; 00001B58  F606870402  '.....'
                  	jz	x1b76			; 00001B5D  7417  't.'
                  	mov	dx,0x3b4		; 00001B5F  BAB403  '...'
                  	cmp	al,0xf			; 00001B62  3C0F  '<.'
                  	jz	x1bd9			; 00001B64  7473  'ts'
                  	cmp	al,0x7			; 00001B66  3C07  '<.'
                  	jz	x1bd9			; 00001B68  746F  'to'
                  	mov	byte [0x449],0x7	; 00001B6A  C606490407  '..I..'
                  	and	byte [0x487],0x7f	; 00001B6F  802687047F  '.&...'
                  	jmp	short x1bd9		; 00001B74  EB63  '.c'
                  
                  x1b76:	mov	byte [0x484],0x18	; 00001B76  C606840418  '.....'
                  	mov	word [0x485],0xe	; 00001B7B  C70685040E00  '......'
                  	mov	al,[0x449]		; 00001B81  A04904  '.I.'
                  	mov	ah,0x0			; 00001B84  B400  '..'
                  	int	0x42			; 00001B86  CD42  '.B'
                  	mov	word [0x460],0xb0c	; 00001B88  C70660040C0B  '..`...'
                  	or	byte [0x487],0x8	; 00001B8E  800E870408  '.....'
                  	jmp	x713			; 00001B93  E97DEB  '.}.'
                  
                  x1b96:	mov	byte [0x484],0x18	; 00001B96  C606840418  '.....'
                  	mov	word [0x485],0x8	; 00001B9B  C70685040800  '......'
                  	mov	al,[0x449]		; 00001BA1  A04904  '.I.'
                  	mov	ah,0x0			; 00001BA4  B400  '..'
                  	or	byte [0x487],0x8	; 00001BA6  800E870408  '.....'
                  	cmp	al,0x1			; 00001BAB  3C01  '<.'
                  	jna	x1bb8			; 00001BAD  7609  'v.'
                  	cmp	al,0x4			; 00001BAF  3C04  '<.'
                  	jnc	x1bb8			; 00001BB1  7305  's.'
                  	or	byte [0x487],0x4	; 00001BB3  800E870404  '.....'
                  x1bb8:	int	0x42			; 00001BB8  CD42  '.B'
                  	jmp	x713			; 00001BBA  E956EB  '.V.'
                  
                  x1bbd:	test	byte [0x487],0x2	; 00001BBD  F606870402  '.....'
                  	jnz	x1b96			; 00001BC2  75D2  'u.'
                  	mov	dx,0x3d4		; 00001BC4  BAD403  '...'
                  	cmp	al,0xf			; 00001BC7  3C0F  '<.'
                  	jz	x1bcf			; 00001BC9  7404  't.'
                  	cmp	al,0x7			; 00001BCB  3C07  '<.'
                  	jnz	x1bd9			; 00001BCD  750A  'u',0x0A
                  x1bcf:	mov	byte [0x449],0x0	; 00001BCF  C606490400  '..I..'
                  	and	byte [0x487],0x7f	; 00001BD4  802687047F  '.&...'
                  x1bd9:	mov	[0x463],dx		; 00001BD9  89166304  '..c.'
                  	mov	word [0x44e],0x0	; 00001BDD  C7064E040000  '..N...'
                  	mov	byte [0x462],0x0	; 00001BE3  C606620400  '..b..'
                  	mov	cx,0x8			; 00001BE8  B90800  '...'
                  	mov	di,0x450		; 00001BEB  BF5004  '.P.'
                  	push	ds			; 00001BEE  1E  '.'
                  	pop	es			; 00001BEF  07  '.'
                  	sub	ax,ax			; 00001BF0  2BC0  '+.'
                  	rep	stosw			; 00001BF2  F3AB  '..'
                  	mov	ah,[0x449]		; 00001BF4  8A264904  '.&I.'
                  	call	x73e			; 00001BF8  E843EB  '.C.'
                  	call	x731			; 00001BFB  E833EB  '.3.'
                  	call	xe36			; 00001BFE  E835F2  '.5.'
                  	mov	al,[es:bx]		; 00001C01  268A07  '&..'
                  	sub	ah,ah			; 00001C04  2AE4  '*.'
                  	mov	[0x44a],ax		; 00001C06  A34A04  '.J.'
                  	mov	al,[es:bx+0x1]		; 00001C09  268A4701  '&.G.'
                  	mov	[0x484],al		; 00001C0D  A28404  '...'
                  	mov	al,[es:bx+0x2]		; 00001C10  268A4702  '&.G.'
                  	mov	[0x485],ax		; 00001C14  A38504  '...'
                  	mov	ax,[es:bx+0x3]		; 00001C17  268B4703  '&.G.'
                  	mov	[0x44c],ax		; 00001C1B  A34C04  '.L.'
                  	mov	ax,[es:bx+0x14]		; 00001C1E  268B4714  '&.G.'
                  	xchg	al,ah			; 00001C22  86C4  '..'
                  	mov	[0x460],ax		; 00001C24  A36004  '.`.'
                  	mov	di,[0x463]		; 00001C27  8B3E6304  '.>c.'
                  	call	x1127			; 00001C2B  E8F9F4  '...'
                  	xor	al,al			; 00001C2E  32C0  '2.'
                  	out	dx,al			; 00001C30  EE  '.'
                  	cli				; 00001C31  FA  '.'
                  	in	al,dx			; 00001C32  EC  '.'
                  	mov	dx,0x3c0		; 00001C33  BAC003  '...'
                  	mov	al,0x14			; 00001C36  B014  '..'
                  	out	dx,al			; 00001C38  EE  '.'
                  	xor	al,al			; 00001C39  32C0  '2.'
                  	out	dx,al			; 00001C3B  EE  '.'
                  	sti				; 00001C3C  FB  '.'
                  	mov	ah,0x20			; 00001C3D  B420  '. '
                  	call	x127a			; 00001C3F  E838F6  '.8.'
                  	push	ax			; 00001C42  50  'P'
                  	test	byte [0x489],0x8	; 00001C43  F606890408  '.....'
                  	jnz	x1c73			; 00001C48  7529  'u)'
                  	mov	cx,0x16			; 00001C4A  B91600  '...'
                  	xor	di,di			; 00001C4D  33FF  '3.'
                  	mov	bp,0x1			; 00001C4F  BD0100  '...'
                  	push	bx			; 00001C52  53  'S'
                  	add	bx,byte +0x23		; 00001C53  83C323  '..#'
                  	call	x722			; 00001C56  E8C9EA  '...'
                  	call	x2f11			; 00001C59  E8B512  '...'
                  	pop	bx			; 00001C5C  5B  '['
                  	call	x7f3			; 00001C5D  E893EB  '...'
                  	mov	ah,[0x449]		; 00001C60  8A264904  '.&I.'
                  	call	x73e			; 00001C64  E8D7EA  '...'
                  	mov	bl,al			; 00001C67  8AD8  '..'
                  	mov	al,[0x489]		; 00001C69  A08904  '...'
                  	and	al,0x6			; 00001C6C  2406  '$.'
                  	shr	al,1			; 00001C6E  D0E8  '..'
                  	call	x2e52			; 00001C70  E8DF11  '...'
                  x1c73:	call	x7b2			; 00001C73  E83CEB  '.<.'
                  	pop	ax			; 00001C76  58  'X'
                  	call	x127a			; 00001C77  E800F6  '...'
                  	mov	ah,[0x449]		; 00001C7A  8A264904  '.&I.'
                  	db	0xE8,0x9A,0xF2
                  	jz	x1cd2			; 00001C81  744F  'tO'
                  	mov	word [0x460],0x0	; 00001C83  C70660040000  '..`...'
                  	call	xee8			; 00001C89  E85CF2  '.\.'
                  	mov	bx,0x10c		; 00001C8C  BB0C01  '...'
                  	cli				; 00001C8F  FA  '.'
                  	mov	[bx],ax			; 00001C90  8907  '..'
                  	mov	[bx+0x2],cs		; 00001C92  8C4F02  '.O.'
                  	sti				; 00001C95  FB  '.'
                  	les	bx,[0x4a8]		; 00001C96  C41EA804  '....'
                  	les	bx,[es:bx+0xc]		; 00001C9A  26C45F0C  '&._.'
                  	mov	ax,es			; 00001C9E  8CC0  '..'
                  	or	ax,bx			; 00001CA0  0BC3  '..'
                  	jz	x1ccf			; 00001CA2  742B  't+'
                  	mov	si,0x7			; 00001CA4  BE0700  '...'
                  	mov	ah,[0x449]		; 00001CA7  8A264904  '.&I.'
                  	call	x1268			; 00001CAB  E8BAF5  '...'
                  	jc	x1ccf			; 00001CAE  721F  'r.'
                  	mov	al,[es:bx]		; 00001CB0  268A07  '&..'
                  	dec	al			; 00001CB3  FEC8  '..'
                  	mov	[0x484],al		; 00001CB5  A28404  '...'
                  	mov	ax,[es:bx+0x1]		; 00001CB8  268B4701  '&.G.'
                  	mov	[0x485],ax		; 00001CBC  A38504  '...'
                  	cli				; 00001CBF  FA  '.'
                  	mov	ax,[es:bx+0x3]		; 00001CC0  268B4703  '&.G.'
                  	mov	[0x10c],ax		; 00001CC4  A30C01  '...'
                  	mov	ax,[es:bx+0x5]		; 00001CC7  268B4705  '&.G.'
                  	mov	[0x10e],ax		; 00001CCB  A30E01  '...'
                  	sti				; 00001CCE  FB  '.'
                  x1ccf:	jmp	x1dc4			; 00001CCF  E9F200  '...'
                  
                  x1cd2:	mov	cx,[0x463]		; 00001CD2  8B0E6304  '..c.'
                  	call	x120c			; 00001CD6  E833F5  '.3.'
                  	mov	ah,[0x449]		; 00001CD9  8A264904  '.&I.'
                  	call	x73e			; 00001CDD  E85EEA  '.^.'
                  	mov	bl,0x0			; 00001CE0  B300  '..'
                  	call	xe5d			; 00001CE2  E878F1  '.x.'
                  	mov	ax,0xa000		; 00001CE5  B800A0  '...'
                  	db	0xE8,0xA9,0xF1
                  	mov	ds,[cs:0x71c]		; 00001CEB  2E8E1E1C07  '.....'
                  	les	bx,[0x4a8]		; 00001CF0  C41EA804  '....'
                  	les	bx,[es:bx+0x8]		; 00001CF4  26C45F08  '&._.'
                  	mov	ax,es			; 00001CF8  8CC0  '..'
                  	or	ax,bx			; 00001CFA  0BC3  '..'
                  	jz	x1d42			; 00001CFC  7444  'tD'
                  	mov	si,0xb			; 00001CFE  BE0B00  '...'
                  	mov	ah,[0x449]		; 00001D01  8A264904  '.&I.'
                  	call	x1268			; 00001D05  E860F5  '.`.'
                  	jc	x1d42			; 00001D08  7238  'r8'
                  	mov	ah,[es:bx]		; 00001D0A  268A27  '&.',0x27
                  	mov	al,[es:bx+0x1]		; 00001D0D  268A4701  '&.G.'
                  	mov	cx,[es:bx+0x2]		; 00001D11  268B4F02  '&.O.'
                  	mov	dx,[es:bx+0x4]		; 00001D15  268B5704  '&.W.'
                  	mov	bp,[es:bx+0x6]		; 00001D19  268B6F06  '&.o.'
                  	mov	ds,[es:bx+0x8]		; 00001D1D  268E5F08  '&._.'
                  	push	es			; 00001D21  06  '.'
                  	push	bx			; 00001D22  53  'S'
                  	mov	bx,ax			; 00001D23  8BD8  '..'
                  	mov	ax,0xa000		; 00001D25  B800A0  '...'
                  	db	0xE8,0x69,0xF1
                  	call	x36ec			; 00001D2B  E8BE19  '...'
                  	pop	bx			; 00001D2E  5B  '['
                  	pop	es			; 00001D2F  07  '.'
                  	mov	al,[es:bx+0xa]		; 00001D30  268A470A  '&.G',0x0A
                  	cmp	al,0xff			; 00001D34  3CFF  '<.'
                  	jz	x1d42			; 00001D36  740A  't',0x0A
                  	dec	al			; 00001D38  FEC8  '..'
                  	mov	ds,[cs:0x71c]		; 00001D3A  2E8E1E1C07  '.....'
                  	mov	[0x484],al		; 00001D3F  A28404  '...'
                  x1d42:	les	bx,[0x4a8]		; 00001D42  C41EA804  '....'
                  	les	bx,[es:bx+0x10]		; 00001D46  26C45F10  '&._.'
                  	mov	ax,es			; 00001D4A  8CC0  '..'
                  	or	ax,bx			; 00001D4C  0BC3  '..'
                  	jz	x1db8			; 00001D4E  7468  'th'
                  	les	bx,[es:bx+0x6]		; 00001D50  26C45F06  '&._.'
                  	mov	ax,es			; 00001D54  8CC0  '..'
                  	or	ax,bx			; 00001D56  0BC3  '..'
                  	jz	x1db8			; 00001D58  745E  't^'
                  	mov	si,0x7			; 00001D5A  BE0700  '...'
                  	mov	ah,[0x449]		; 00001D5D  8A264904  '.&I.'
                  	call	x1268			; 00001D61  E804F5  '...'
                  	jc	x1db8			; 00001D64  7252  'rR'
                  	mov	ah,[0x485]		; 00001D66  8A268504  '.&..'
                  	cmp	ah,[es:bx]		; 00001D6A  263A27  '&:',0x27
                  	jnz	x1db8			; 00001D6D  7549  'uI'
                  	mov	ah,[es:bx]		; 00001D6F  268A27  '&.',0x27
                  	mov	al,[es:bx+0x1]		; 00001D72  268A4701  '&.G.'
                  	mov	cx,0x100		; 00001D76  B90001  '...'
                  	mov	dx,0x0			; 00001D79  BA0000  '...'
                  	mov	bp,[es:bx+0x3]		; 00001D7C  268B6F03  '&.o.'
                  	mov	ds,[es:bx+0x5]		; 00001D80  268E5F05  '&._.'
                  	push	es			; 00001D84  06  '.'
                  	push	bx			; 00001D85  53  'S'
                  	mov	bx,ax			; 00001D86  8BD8  '..'
                  	and	bl,0x7f			; 00001D88  80E37F  '...'
                  	mov	ax,0xa000		; 00001D8B  B800A0  '...'
                  	db	0xE8,0x03,0xF1
                  	pop	bx			; 00001D91  5B  '['
                  	pop	es			; 00001D92  07  '.'
                  	mov	al,0x3			; 00001D93  B003  '..'
                  	mov	dx,0x3c4		; 00001D95  BAC403  '...'
                  	out	dx,al			; 00001D98  EE  '.'
                  	inc	dx			; 00001D99  42  'B'
                  	in	al,dx			; 00001D9A  EC  '.'
                  	dec	dx			; 00001D9B  4A  'J'
                  	and	al,0x13			; 00001D9C  2413  '$.'
                  	mov	cl,al			; 00001D9E  8AC8  '..'
                  	mov	al,[es:bx+0x1]		; 00001DA0  268A4701  '&.G.'
                  	shl	al,1			; 00001DA4  D0E0  '..'
                  	shl	al,1			; 00001DA6  D0E0  '..'
                  	mov	ah,al			; 00001DA8  8AE0  '..'
                  	shl	ah,1			; 00001DAA  D0E4  '..'
                  	and	al,0xc			; 00001DAC  240C  '$.'
                  	and	ah,0x20			; 00001DAE  80E420  '.. '
                  	or	ah,al			; 00001DB1  0AE0  0x0A,'.'
                  	or	ah,cl			; 00001DB3  0AE1  0x0A,'.'
                  	mov	al,0x3			; 00001DB5  B003  '..'
                  	out	dx,ax			; 00001DB7  EF  '.'
                  x1db8:	mov	ds,[cs:0x71c]		; 00001DB8  2E8E1E1C07  '.....'
                  	mov	cx,[0x463]		; 00001DBD  8B0E6304  '..c.'
                  	call	x1238			; 00001DC1  E874F4  '.t.'
                  x1dc4:	mov	ds,[cs:0x71c]		; 00001DC4  2E8E1E1C07  '.....'
                  	les	bx,[0x4a8]		; 00001DC9  C41EA804  '....'
                  	les	bx,[es:bx+0x10]		; 00001DCD  26C45F10  '&._.'
                  	mov	ax,es			; 00001DD1  8CC0  '..'
                  	or	ax,bx			; 00001DD3  0BC3  '..'
                  	jnz	x1dda			; 00001DD5  7503  'u.'
                  	jmp	short x1e50		; 00001DD7  EB77  '.w'
                  
                  	nop				; 00001DD9  90  '.'
                  x1dda:	les	bx,[es:bx+0xa]		; 00001DDA  26C45F0A  '&._',0x0A
                  	mov	ax,es			; 00001DDE  8CC0  '..'
                  	or	ax,bx			; 00001DE0  0BC3  '..'
                  	jz	x1e50			; 00001DE2  746C  'tl'
                  	mov	si,0x14			; 00001DE4  BE1400  '...'
                  	mov	ah,[0x449]		; 00001DE7  8A264904  '.&I.'
                  	call	x1268			; 00001DEB  E87AF4  '.z.'
                  	jc	x1e50			; 00001DEE  7260  'r`'
                  	mov	cx,[es:bx+0x4]		; 00001DF0  268B4F04  '&.O.'
                  	jcxz	x1e11			; 00001DF4  E31B  '..'
                  	push	es			; 00001DF6  06  '.'
                  	push	bx			; 00001DF7  53  'S'
                  	mov	di,[es:bx+0x6]		; 00001DF8  268B7F06  '&...'
                  	les	bx,[es:bx+0x8]		; 00001DFC  26C45F08  '&._.'
                  	xor	bp,bp			; 00001E00  33ED  '3.'
                  	call	x722			; 00001E02  E81DE9  '...'
                  	test	byte [0x489],0x8	; 00001E05  F606890408  '.....'
                  	jnz	x1e0f			; 00001E0A  7503  'u.'
                  	call	x2f11			; 00001E0C  E80211  '...'
                  x1e0f:	pop	bx			; 00001E0F  5B  '['
                  	pop	es			; 00001E10  07  '.'
                  x1e11:	mov	cx,[es:bx+0xc]		; 00001E11  268B4F0C  '&.O.'
                  	jcxz	x1e36			; 00001E15  E31F  '..'
                  	push	es			; 00001E17  06  '.'
                  	push	bx			; 00001E18  53  'S'
                  	mov	di,[es:bx+0xe]		; 00001E19  268B7F0E  '&...'
                  	les	bx,[es:bx+0x10]		; 00001E1D  26C45F10  '&._.'
                  	mov	dl,[0x489]		; 00001E21  8A168904  '....'
                  	and	dl,0x6			; 00001E25  80E206  '...'
                  	shr	dl,1			; 00001E28  D0EA  '..'
                  	test	byte [0x489],0x8	; 00001E2A  F606890408  '.....'
                  	jnz	x1e34			; 00001E2F  7503  'u.'
                  	call	x2ed3			; 00001E31  E89F10  '...'
                  x1e34:	pop	bx			; 00001E34  5B  '['
                  	pop	es			; 00001E35  07  '.'
                  x1e36:	mov	al,[es:bx]		; 00001E36  268A07  '&..'
                  	or	al,al			; 00001E39  0AC0  0x0A,'.'
                  	jz	x1e50			; 00001E3B  7413  't.'
                  	js	x1e47			; 00001E3D  7808  'x.'
                  	mov	ah,[0x485]		; 00001E3F  8A268504  '.&..'
                  	dec	ah			; 00001E43  FECC  '..'
                  	jmp	short x1e49		; 00001E45  EB02  '..'
                  
                  x1e47:	mov	ah,0x1f			; 00001E47  B41F  '..'
                  x1e49:	mov	al,0x14			; 00001E49  B014  '..'
                  	mov	dx,[0x463]		; 00001E4B  8B166304  '..c.'
                  	out	dx,ax			; 00001E4F  EF  '.'
                  x1e50:	mov	ds,[cs:0x71c]		; 00001E50  2E8E1E1C07  '.....'
                  	call	x2b6e			; 00001E55  E8160D  '..',0x0D
                  	cmp	byte [0x449],0x7	; 00001E58  803E490407  '.>I..'
                  	ja	x1e7d			; 00001E5D  771E  'w.'
                  	mov	bx,0x1e80		; 00001E5F  BB801E  '...'
                  	mov	al,[0x449]		; 00001E62  A04904  '.I.'
                  	sub	ah,ah			; 00001E65  2AE4  '*.'
                  	add	bx,ax			; 00001E67  03D8  '..'
                  	mov	al,[cs:bx]		; 00001E69  2E8A07  '...'
                  	mov	[0x465],al		; 00001E6C  A26504  '.e.'
                  	mov	al,0x30			; 00001E6F  B030  '.0'
                  	cmp	byte [0x449],0x6	; 00001E71  803E490406  '.>I..'
                  	jnz	x1e7a			; 00001E76  7502  'u.'
                  	mov	al,0x3f			; 00001E78  B03F  '.?'
                  x1e7a:	mov	[0x466],al		; 00001E7A  A26604  '.f.'
                  x1e7d:	jmp	x713			; 00001E7D  E993E8  '...'
                  
                  	sub	al,0x28			; 00001E80  2C28  ',('
                  	sub	ax,0x2a29		; 00001E82  2D292A  '-)*'
                  	cs	push ds			; 00001E85  2E1E  '..'
                  	sub	di,di			; 00001E87  29FF  ').'
                  
                  	times	4 db 0xFF		; 00001E89 - 00001E8C
                  	dec	word [bp+di+0x8b8b]	; 00001E8D  FF8B8B8B  '....'
                  	or	cx,[bx+si+0x48]		; 00001E91  0B4848  '.HH'
                  
                  	times	4 db 0xFF		; 00001E94 - 00001E97
                  	call	x1e9e			; 00001E98  E80300  '...'
                  	jmp	x713			; 00001E9B  E975E8  '.u.'
                  
                  x1e9e:	mov	[0x460],cx		; 00001E9E  890E6004  '..`.'
                  	test	byte [0x487],0x8	; 00001EA2  F606870408  '.....'
                  	jnz	x1ecc			; 00001EA7  7523  'u#'
                  	mov	al,ch			; 00001EA9  8AC5  '..'
                  	and	al,0x60			; 00001EAB  2460  '$`'
                  	cmp	al,0x20			; 00001EAD  3C20  '< '
                  	jnz	x1eb6			; 00001EAF  7505  'u.'
                  	mov	cx,0x1e00		; 00001EB1  B9001E  '...'
                  	jmp	short x1ecc		; 00001EB4  EB16  '..'
                  
                  x1eb6:	test	byte [0x487],0x1	; 00001EB6  F606870401  '.....'
                  	jnz	x1ecc			; 00001EBB  750F  'u.'
                  	mov	ah,[0x449]		; 00001EBD  8A264904  '.&I.'
                  	db	0xE8,0x57,0xF0
                  	jnz	x1ecc			; 00001EC4  7506  'u.'
                  	mov	al,[0x485]		; 00001EC6  A08504  '...'
                  	call	x1ed2			; 00001EC9  E80600  '...'
                  x1ecc:	mov	al,0xa			; 00001ECC  B00A  '.',0x0A
                  	call	x1f5a			; 00001ECE  E88900  '...'
                  	ret				; 00001ED1  C3  '.'
                  
                  x1ed2:	test	cx,0xe0e0		; 00001ED2  F7C1E0E0  '....'
                  	jnz	x1f2e			; 00001ED6  7556  'uV'
                  	mov	dl,al			; 00001ED8  8AD0  '..'
                  	dec	dl			; 00001EDA  FECA  '..'
                  	mov	dh,dl			; 00001EDC  8AF2  '..'
                  	dec	dh			; 00001EDE  FECE  '..'
                  	cmp	cl,ch			; 00001EE0  3ACD  ':.'
                  	jc	x1ef6			; 00001EE2  7212  'r.'
                  	mov	ah,ch			; 00001EE4  8AE5  '..'
                  	or	ah,cl			; 00001EE6  0AE1  0x0A,'.'
                  	cmp	ah,al			; 00001EE8  3AE0  ':.'
                  	jnc	x1f01			; 00001EEA  7315  's.'
                  	cmp	cl,dl			; 00001EEC  3ACA  ':.'
                  	jz	x1f2e			; 00001EEE  743E  't>'
                  	cmp	ch,dh			; 00001EF0  3AEE  ':.'
                  	jz	x1f2e			; 00001EF2  743A  't:'
                  	jmp	short x1f01		; 00001EF4  EB0B  '..'
                  
                  x1ef6:	cmp	cl,0x0			; 00001EF6  80F900  '...'
                  	jz	x1f2e			; 00001EF9  7433  't3'
                  	mov	ch,dl			; 00001EFB  8AEA  '..'
                  	xchg	cl,ch			; 00001EFD  86CD  '..'
                  	jmp	short x1f2e		; 00001EFF  EB2D  '.-'
                  
                  x1f01:	cmp	cl,0x3			; 00001F01  80F903  '...'
                  	jna	x1f2e			; 00001F04  7628  'v('
                  	mov	ah,ch			; 00001F06  8AE5  '..'
                  	add	ah,0x2			; 00001F08  80C402  '...'
                  	cmp	ah,cl			; 00001F0B  3AE1  ':.'
                  	jc	x1f1f			; 00001F0D  7210  'r.'
                  	sub	ch,cl			; 00001F0F  2AE9  '*.'
                  	add	ch,dl			; 00001F11  02EA  '..'
                  	mov	cl,dl			; 00001F13  8ACA  '..'
                  	cmp	al,0xe			; 00001F15  3C0E  '<.'
                  	jl	x1f2e			; 00001F17  7C15  '|.'
                  	sub	cx,0x101		; 00001F19  81E90101  '....'
                  	jmp	short x1f2e		; 00001F1D  EB0F  '..'
                  
                  x1f1f:	cmp	ch,0x2			; 00001F1F  80FD02  '...'
                  	ja	x1f28			; 00001F22  7704  'w.'
                  	mov	cl,dl			; 00001F24  8ACA  '..'
                  	jmp	short x1f2e		; 00001F26  EB06  '..'
                  
                  x1f28:	mov	ch,al			; 00001F28  8AE8  '..'
                  	shr	ch,1			; 00001F2A  D0ED  '..'
                  	mov	cl,dl			; 00001F2C  8ACA  '..'
                  x1f2e:	ret				; 00001F2E  C3  '.'
                  
                  	call	x1f35			; 00001F2F  E80300  '...'
                  	jmp	x713			; 00001F32  E9DEE7  '...'
                  
                  x1f35:	mov	cl,bh			; 00001F35  8ACF  '..'
                  	xor	ch,ch			; 00001F37  32ED  '2.'
                  	shl	cx,1			; 00001F39  D1E1  '..'
                  	mov	si,cx			; 00001F3B  8BF1  '..'
                  	mov	[si+0x450],dx		; 00001F3D  89945004  '..P.'
                  	cmp	[0x462],bh		; 00001F41  383E6204  '8>b.'
                  	jnz	x1f4c			; 00001F45  7505  'u.'
                  	mov	ax,dx			; 00001F47  8BC2  '..'
                  	call	x1f4d			; 00001F49  E80100  '...'
                  x1f4c:	ret				; 00001F4C  C3  '.'
                  
                  x1f4d:	call	x1f67			; 00001F4D  E81700  '...'
                  	mov	cx,ax			; 00001F50  8BC8  '..'
                  	add	cx,[0x44e]		; 00001F52  030E4E04  '..N.'
                  	sar	cx,1			; 00001F56  D1F9  '..'
                  	mov	al,0xe			; 00001F58  B00E  '..'
                  
                  x1f5a:	mov	dx,[0x463]		; 00001F5A  8B166304  '..c.'
                  	mov	ah,ch			; 00001F5E  8AE5  '..'
                  	out	dx,ax			; 00001F60  EF  '.'
                  	inc	al			; 00001F61  FEC0  '..'
                  	mov	ah,cl			; 00001F63  8AE1  '..'
                  	out	dx,ax			; 00001F65  EF  '.'
                  	ret				; 00001F66  C3  '.'
                  
                  x1f67:	push	bx			; 00001F67  53  'S'
                  	mov	bx,ax			; 00001F68  8BD8  '..'
                  	mov	al,ah			; 00001F6A  8AC4  '..'
                  	mul	byte [0x44a]		; 00001F6C  F6264A04  '.&J.'
                  	xor	bh,bh			; 00001F70  32FF  '2.'
                  	add	ax,bx			; 00001F72  03C3  '..'
                  	shl	ax,1			; 00001F74  D1E0  '..'
                  	pop	bx			; 00001F76  5B  '['
                  	ret				; 00001F77  C3  '.'
                  
                  	mov	bl,bh			; 00001F78  8ADF  '..'
                  	xor	bh,bh			; 00001F7A  32FF  '2.'
                  	shl	bx,1			; 00001F7C  D1E3  '..'
                  	mov	dx,[bx+0x450]		; 00001F7E  8B975004  '..P.'
                  	mov	cx,[0x460]		; 00001F82  8B0E6004  '..`.'
                  	pop	di			; 00001F86  5F  '_'
                  	pop	si			; 00001F87  5E  '^'
                  	pop	bx			; 00001F88  5B  '['
                  	pop	ax			; 00001F89  58  'X'
                  	pop	ax			; 00001F8A  58  'X'
                  	pop	ds			; 00001F8B  1F  '.'
                  	pop	es			; 00001F8C  07  '.'
                  	pop	bp			; 00001F8D  5D  ']'
                  	iret				; 00001F8E  CF  '.'
                  
                  	test	byte [0x487],0x8	; 00001F8F  F606870408  '.....'
                  	jnz	x1f9b			; 00001F94  7505  'u.'
                  	sub	ax,ax			; 00001F96  2BC0  '+.'
                  	jmp	x713			; 00001F98  E978E7  '.x.'
                  
                  x1f9b:	mov	ah,0x4			; 00001F9B  B404  '..'
                  	int	0x42			; 00001F9D  CD42  '.B'
                  	pop	di			; 00001F9F  5F  '_'
                  	pop	si			; 00001FA0  5E  '^'
                  	add	sp,byte +0x6		; 00001FA1  83C406  '...'
                  	pop	ds			; 00001FA4  1F  '.'
                  	pop	es			; 00001FA5  07  '.'
                  	pop	bp			; 00001FA6  5D  ']'
                  	iret				; 00001FA7  CF  '.'
                  
                  	mov	[0x462],al		; 00001FA8  A26204  '.b.'
                  	mov	cx,[0x44c]		; 00001FAB  8B0E4C04  '..L.'
                  	cbw				; 00001FAF  98  '.'
                  	push	ax			; 00001FB0  50  'P'
                  	mul	cx			; 00001FB1  F7E1  '..'
                  	mov	[0x44e],ax		; 00001FB3  A34E04  '.N.'
                  	mov	cx,ax			; 00001FB6  8BC8  '..'
                  	cmp	byte [0x449],0x7	; 00001FB8  803E490407  '.>I..'
                  	ja	x1fc1			; 00001FBD  7702  'w.'
                  	sar	cx,1			; 00001FBF  D1F9  '..'
                  x1fc1:	mov	al,0xc			; 00001FC1  B00C  '..'
                  	call	x1f5a			; 00001FC3  E894FF  '...'
                  	pop	bx			; 00001FC6  5B  '['
                  	shl	bx,1			; 00001FC7  D1E3  '..'
                  	mov	ax,[bx+0x450]		; 00001FC9  8B875004  '..P.'
                  	call	x1f4d			; 00001FCD  E87DFF  '.}.'
                  	jmp	x713			; 00001FD0  E940E7  '.@.'
                  
                  	call	x1fd9			; 00001FD3  E80300  '...'
                  	jmp	x713			; 00001FD6  E93AE7  '.:.'
                  
                  x1fd9:	call	x24ee			; 00001FD9  E81205  '...'
                  	mov	ah,[0x449]		; 00001FDC  8A264904  '.&I.'
                  	mov	si,ax			; 00001FE0  8BF0  '..'
                  	shr	si,1			; 00001FE2  D1EE  '..'
                  	shr	si,1			; 00001FE4  D1EE  '..'
                  	shr	si,1			; 00001FE6  D1EE  '..'
                  	shr	si,1			; 00001FE8  D1EE  '..'
                  	shr	si,1			; 00001FEA  D1EE  '..'
                  	shr	si,1			; 00001FEC  D1EE  '..'
                  	shr	si,1			; 00001FEE  D1EE  '..'
                  	shr	si,1			; 00001FF0  D1EE  '..'
                  	shl	si,1			; 00001FF2  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 00001FF4  2E8BB49012  '.....'
                  	shl	si,1			; 00001FF9  D1E6  '..'
                  	cmp	si,0xa			; 00001FFB  81FE0A00  '..',0x0A,'.'
                  	jnc	x2006			; 00001FFF  7305  's.'
                  	call	near [cs:si+0x2007]	; 00002001  2EFF940720  '.... '
                  x2006:	ret				; 00002006  C3  '.'
                  
                  	push	es			; 00002007  06  '.'
                  	and	[bx+di],dl		; 00002008  2011  ' .'
                  	and	[bx+0x2f20],ah		; 0000200A  20A7202F  ' . /'
                  	and	di,si			; 0000200E  21F7  '!.'
                  	and	[bp+si+0xe8d8],cx	; 00002010  218AD8E8  '!...'
                  	or	[bp+si],cx		; 00002014  090A  '.',0x0A
                  	mov	ax,cx			; 00002016  8BC1  '..'
                  	call	x206c			; 00002018  E85100  '.Q.'
                  	call	x201f			; 0000201B  E80100  '...'
                  	ret				; 0000201E  C3  '.'
                  
                  x201f:	push	bx			; 0000201F  53  'S'
                  	xor	ch,ch			; 00002020  32ED  '2.'
                  	cmp	bl,0x0			; 00002022  80FB00  '...'
                  	jz	x2058			; 00002025  7431  't1'
                  	add	si,ax			; 00002027  03F0  '..'
                  	mov	ah,dh			; 00002029  8AE6  '..'
                  	sub	ah,bl			; 0000202B  2AE3  '*.'
                  x202d:	call	x205c			; 0000202D  E82C00  '.,.'
                  	add	si,bp			; 00002030  03F5  '..'
                  	add	di,bp			; 00002032  03FD  '..'
                  	dec	ah			; 00002034  FECC  '..'
                  	jnz	x202d			; 00002036  75F5  'u.'
                  x2038:	pop	ax			; 00002038  58  'X'
                  	mov	al,0x20			; 00002039  B020  '. '
                  x203b:	call	x2065			; 0000203B  E82700  '.',0x27,'.'
                  	add	di,bp			; 0000203E  03FD  '..'
                  	dec	bl			; 00002040  FECB  '..'
                  	jnz	x203b			; 00002042  75F7  'u.'
                  	mov	ds,[cs:0x71c]		; 00002044  2E8E1E1C07  '.....'
                  	cmp	byte [0x449],0x7	; 00002049  803E490407  '.>I..'
                  	jz	x2057			; 0000204E  7407  't.'
                  	mov	al,[0x465]		; 00002050  A06504  '.e.'
                  	mov	dx,0x3d8		; 00002053  BAD803  '...'
                  	out	dx,al			; 00002056  EE  '.'
                  x2057:	ret				; 00002057  C3  '.'
                  
                  x2058:	mov	bl,dh			; 00002058  8ADE  '..'
                  	jmp	short x2038		; 0000205A  EBDC  '..'
                  
                  x205c:	mov	cl,dl			; 0000205C  8ACA  '..'
                  	push	si			; 0000205E  56  'V'
                  	push	di			; 0000205F  57  'W'
                  	rep	movsw			; 00002060  F3A5  '..'
                  	pop	di			; 00002062  5F  '_'
                  	pop	si			; 00002063  5E  '^'
                  	ret				; 00002064  C3  '.'
                  
                  x2065:	mov	cl,dl			; 00002065  8ACA  '..'
                  	push	di			; 00002067  57  'W'
                  	rep	stosw			; 00002068  F3AB  '..'
                  	pop	di			; 0000206A  5F  '_'
                  	ret				; 0000206B  C3  '.'
                  
                  x206c:	test	byte [0x487],0x4	; 0000206C  F606870404  '.....'
                  	jz	x2085			; 00002071  7412  't.'
                  	push	dx			; 00002073  52  'R'
                  	mov	dh,0x3			; 00002074  B603  '..'
                  	mov	dl,0xda			; 00002076  B2DA  '..'
                  	push	ax			; 00002078  50  'P'
                  x2079:	in	al,dx			; 00002079  EC  '.'
                  	test	al,0x8			; 0000207A  A808  '..'
                  	jz	x2079			; 0000207C  74FB  't.'
                  	mov	al,0x25			; 0000207E  B025  '.%'
                  	mov	dl,0xd8			; 00002080  B2D8  '..'
                  	out	dx,al			; 00002082  EE  '.'
                  	pop	ax			; 00002083  58  'X'
                  	pop	dx			; 00002084  5A  'Z'
                  x2085:	call	x1f67			; 00002085  E8DFFE  '...'
                  	add	ax,[0x44e]		; 00002088  03064E04  '..N.'
                  	mov	di,ax			; 0000208C  8BF8  '..'
                  	mov	si,ax			; 0000208E  8BF0  '..'
                  	sub	dx,cx			; 00002090  2BD1  '+.'
                  	inc	dh			; 00002092  FEC6  '..'
                  	inc	dl			; 00002094  FEC2  '..'
                  	mov	bp,[0x44a]		; 00002096  8B2E4A04  '..J.'
                  	add	bp,bp			; 0000209A  03ED  '..'
                  	mov	al,bl			; 0000209C  8AC3  '..'
                  	mul	byte [0x44a]		; 0000209E  F6264A04  '.&J.'
                  	add	ax,ax			; 000020A2  03C0  '..'
                  	push	es			; 000020A4  06  '.'
                  	pop	ds			; 000020A5  1F  '.'
                  	ret				; 000020A6  C3  '.'
                  
                  	mov	bl,al			; 000020A7  8AD8  '..'
                  	call	x2a1f			; 000020A9  E87309  '.s.'
                  	mov	ax,cx			; 000020AC  8BC1  '..'
                  	call	x25c5			; 000020AE  E81405  '...'
                  	mov	di,ax			; 000020B1  8BF8  '..'
                  	sub	dx,cx			; 000020B3  2BD1  '+.'
                  	add	dx,0x101		; 000020B5  81C20101  '....'
                  	shl	dh,1			; 000020B9  D0E6  '..'
                  	shl	dh,1			; 000020BB  D0E6  '..'
                  	cmp	byte [0x449],0x6	; 000020BD  803E490406  '.>I..'
                  	jnc	x20c8			; 000020C2  7304  's.'
                  	shl	dl,1			; 000020C4  D0E2  '..'
                  	shl	di,1			; 000020C6  D1E7  '..'
                  x20c8:	call	x20cc			; 000020C8  E80100  '...'
                  	ret				; 000020CB  C3  '.'
                  
                  x20cc:	push	es			; 000020CC  06  '.'
                  	pop	ds			; 000020CD  1F  '.'
                  	xor	ch,ch			; 000020CE  32ED  '2.'
                  	shl	bl,1			; 000020D0  D0E3  '..'
                  	shl	bl,1			; 000020D2  D0E3  '..'
                  	jz	x2101			; 000020D4  742B  't+'
                  	mov	al,bl			; 000020D6  8AC3  '..'
                  	mov	ah,0x50			; 000020D8  B450  '.P'
                  	mul	ah			; 000020DA  F6E4  '..'
                  	mov	si,di			; 000020DC  8BF7  '..'
                  	add	si,ax			; 000020DE  03F0  '..'
                  	mov	ah,dh			; 000020E0  8AE6  '..'
                  	sub	ah,bl			; 000020E2  2AE3  '*.'
                  x20e4:	call	x2105			; 000020E4  E81E00  '...'
                  	sub	si,0x1fb0		; 000020E7  81EEB01F  '....'
                  	sub	di,0x1fb0		; 000020EB  81EFB01F  '....'
                  	dec	ah			; 000020EF  FECC  '..'
                  	jnz	x20e4			; 000020F1  75F1  'u.'
                  x20f3:	mov	al,bh			; 000020F3  8AC7  '..'
                  x20f5:	call	x211e			; 000020F5  E82600  '.&.'
                  	sub	di,0x1fb0		; 000020F8  81EFB01F  '....'
                  	dec	bl			; 000020FC  FECB  '..'
                  	jnz	x20f5			; 000020FE  75F5  'u.'
                  	ret				; 00002100  C3  '.'
                  
                  x2101:	mov	bl,dh			; 00002101  8ADE  '..'
                  	jmp	short x20f3		; 00002103  EBEE  '..'
                  
                  x2105:	mov	cl,dl			; 00002105  8ACA  '..'
                  	push	si			; 00002107  56  'V'
                  	push	di			; 00002108  57  'W'
                  	rep	movsb			; 00002109  F3A4  '..'
                  	pop	di			; 0000210B  5F  '_'
                  	pop	si			; 0000210C  5E  '^'
                  	add	si,0x2000		; 0000210D  81C60020  '... '
                  	add	di,0x2000		; 00002111  81C70020  '... '
                  	push	si			; 00002115  56  'V'
                  	push	di			; 00002116  57  'W'
                  	mov	cl,dl			; 00002117  8ACA  '..'
                  	rep	movsb			; 00002119  F3A4  '..'
                  	pop	di			; 0000211B  5F  '_'
                  	pop	si			; 0000211C  5E  '^'
                  	ret				; 0000211D  C3  '.'
                  
                  x211e:	mov	cl,dl			; 0000211E  8ACA  '..'
                  	push	di			; 00002120  57  'W'
                  	rep	stosb			; 00002121  F3AA  '..'
                  	pop	di			; 00002123  5F  '_'
                  	add	di,0x2000		; 00002124  81C70020  '... '
                  	push	di			; 00002128  57  'W'
                  	mov	cl,dl			; 00002129  8ACA  '..'
                  	rep	stosb			; 0000212B  F3AA  '..'
                  	pop	di			; 0000212D  5F  '_'
                  	ret				; 0000212E  C3  '.'
                  
                  	mov	bl,al			; 0000212F  8AD8  '..'
                  	mov	ax,0xa000		; 00002131  B800A0  '...'
                  	mov	es,ax			; 00002134  8EC0  '..'
                  	mov	ax,cx			; 00002136  8BC1  '..'
                  	push	bx			; 00002138  53  'S'
                  	mov	bh,[0x462]		; 00002139  8A3E6204  '.>b.'
                  	call	x2679			; 0000213D  E83905  '.9.'
                  	pop	bx			; 00002140  5B  '['
                  	mov	di,ax			; 00002141  8BF8  '..'
                  	sub	dx,cx			; 00002143  2BD1  '+.'
                  	add	dx,0x101		; 00002145  81C20101  '....'
                  	mov	bp,[0x485]		; 00002149  8B2E8504  '....'
                  	mov	cx,[0x44a]		; 0000214D  8B0E4A04  '..J.'
                  	call	x2155			; 00002151  E80100  '...'
                  	ret				; 00002154  C3  '.'
                  
                  x2155:	push	es			; 00002155  06  '.'
                  	pop	ds			; 00002156  1F  '.'
                  	mov	al,bl			; 00002157  8AC3  '..'
                  	sub	ah,ah			; 00002159  2AE4  '*.'
                  	push	dx			; 0000215B  52  'R'
                  	mul	bp			; 0000215C  F7E5  '..'
                  	mul	cx			; 0000215E  F7E1  '..'
                  	mov	si,di			; 00002160  8BF7  '..'
                  	add	si,ax			; 00002162  03F0  '..'
                  	pop	dx			; 00002164  5A  'Z'
                  	mov	ax,cx			; 00002165  8BC1  '..'
                  	or	bl,bl			; 00002167  0ADB  0x0A,'.'
                  	jz	x219a			; 00002169  742F  't/'
                  	push	ax			; 0000216B  50  'P'
                  	mov	cl,dh			; 0000216C  8ACE  '..'
                  	sub	cl,bl			; 0000216E  2ACB  '*.'
                  	xor	ch,ch			; 00002170  32ED  '2.'
                  	push	dx			; 00002172  52  'R'
                  	mov	ax,cx			; 00002173  8BC1  '..'
                  	mul	bp			; 00002175  F7E5  '..'
                  	mov	cx,ax			; 00002177  8BC8  '..'
                  	mov	dx,0x3ce		; 00002179  BACE03  '...'
                  	mov	ax,0x105		; 0000217C  B80501  '...'
                  	out	dx,ax			; 0000217F  EF  '.'
                  	mov	dl,0xc4			; 00002180  B2C4  '..'
                  	mov	ax,0xf02		; 00002182  B8020F  '...'
                  	out	dx,ax			; 00002185  EF  '.'
                  	pop	dx			; 00002186  5A  'Z'
                  	pop	ax			; 00002187  58  'X'
                  	call	x219e			; 00002188  E81300  '...'
                  	push	dx			; 0000218B  52  'R'
                  	push	ax			; 0000218C  50  'P'
                  	mov	dx,0x3ce		; 0000218D  BACE03  '...'
                  	mov	ax,0x5			; 00002190  B80500  '...'
                  	out	dx,ax			; 00002193  EF  '.'
                  	pop	ax			; 00002194  58  'X'
                  	pop	dx			; 00002195  5A  'Z'
                  x2196:	call	x21b1			; 00002196  E81800  '...'
                  	ret				; 00002199  C3  '.'
                  
                  x219a:	mov	bl,dh			; 0000219A  8ADE  '..'
                  	jmp	short x2196		; 0000219C  EBF8  '..'
                  
                  x219e:	push	cx			; 0000219E  51  'Q'
                  	mov	cl,dl			; 0000219F  8ACA  '..'
                  	xor	ch,ch			; 000021A1  32ED  '2.'
                  	push	si			; 000021A3  56  'V'
                  	push	di			; 000021A4  57  'W'
                  	rep	movsb			; 000021A5  F3A4  '..'
                  	pop	di			; 000021A7  5F  '_'
                  	pop	si			; 000021A8  5E  '^'
                  	add	si,ax			; 000021A9  03F0  '..'
                  	add	di,ax			; 000021AB  03F8  '..'
                  	pop	cx			; 000021AD  59  'Y'
                  	loop	x219e			; 000021AE  E2EE  '..'
                  	ret				; 000021B0  C3  '.'
                  
                  x21b1:	mov	dh,bh			; 000021B1  8AF7  '..'
                  	sub	bh,bh			; 000021B3  2AFF  '*.'
                  	push	ax			; 000021B5  50  'P'
                  	push	dx			; 000021B6  52  'R'
                  	mov	ax,bx			; 000021B7  8BC3  '..'
                  	mul	bp			; 000021B9  F7E5  '..'
                  	mov	bx,ax			; 000021BB  8BD8  '..'
                  	pop	dx			; 000021BD  5A  'Z'
                  	pop	ax			; 000021BE  58  'X'
                  x21bf:	push	ax			; 000021BF  50  'P'
                  	call	x21d1			; 000021C0  E80E00  '...'
                  	pop	ax			; 000021C3  58  'X'
                  	add	di,ax			; 000021C4  03F8  '..'
                  	dec	bx			; 000021C6  4B  'K'
                  	jnz	x21bf			; 000021C7  75F6  'u.'
                  	mov	dx,0x3c4		; 000021C9  BAC403  '...'
                  	mov	ax,0xf02		; 000021CC  B8020F  '...'
                  	out	dx,ax			; 000021CF  EF  '.'
                  	ret				; 000021D0  C3  '.'
                  
                  x21d1:	push	dx			; 000021D1  52  'R'
                  	mov	dx,0x3c4		; 000021D2  BAC403  '...'
                  	mov	ax,0xf02		; 000021D5  B8020F  '...'
                  	out	dx,ax			; 000021D8  EF  '.'
                  	pop	dx			; 000021D9  5A  'Z'
                  	sub	ax,ax			; 000021DA  2BC0  '+.'
                  	mov	cl,dl			; 000021DC  8ACA  '..'
                  	xor	ch,ch			; 000021DE  32ED  '2.'
                  	push	di			; 000021E0  57  'W'
                  	rep	stosb			; 000021E1  F3AA  '..'
                  	pop	di			; 000021E3  5F  '_'
                  	mov	ah,dh			; 000021E4  8AE6  '..'
                  	push	dx			; 000021E6  52  'R'
                  	mov	dx,0x3c4		; 000021E7  BAC403  '...'
                  	mov	al,0x2			; 000021EA  B002  '..'
                  	out	dx,ax			; 000021EC  EF  '.'
                  	pop	dx			; 000021ED  5A  'Z'
                  	mov	al,0xff			; 000021EE  B0FF  '..'
                  	mov	cl,dl			; 000021F0  8ACA  '..'
                  	push	di			; 000021F2  57  'W'
                  	rep	stosb			; 000021F3  F3AA  '..'
                  	pop	di			; 000021F5  5F  '_'
                  	ret				; 000021F6  C3  '.'
                  
                  	mov	bl,al			; 000021F7  8AD8  '..'
                  	mov	ax,0xa000		; 000021F9  B800A0  '...'
                  	mov	es,ax			; 000021FC  8EC0  '..'
                  	mov	ax,cx			; 000021FE  8BC1  '..'
                  	push	bx			; 00002200  53  'S'
                  	push	dx			; 00002201  52  'R'
                  	call	x26dd			; 00002202  E8D804  '...'
                  	pop	dx			; 00002205  5A  'Z'
                  	pop	bx			; 00002206  5B  '['
                  	mov	di,ax			; 00002207  8BF8  '..'
                  	sub	dx,cx			; 00002209  2BD1  '+.'
                  	add	dx,0x101		; 0000220B  81C20101  '....'
                  	mov	bp,[0x485]		; 0000220F  8B2E8504  '....'
                  	mov	cx,[0x44a]		; 00002213  8B0E4A04  '..J.'
                  	call	x221b			; 00002217  E80100  '...'
                  	ret				; 0000221A  C3  '.'
                  
                  x221b:	push	es			; 0000221B  06  '.'
                  	pop	ds			; 0000221C  1F  '.'
                  	mov	al,bl			; 0000221D  8AC3  '..'
                  	sub	ah,ah			; 0000221F  2AE4  '*.'
                  	push	dx			; 00002221  52  'R'
                  	mul	bp			; 00002222  F7E5  '..'
                  	mul	cx			; 00002224  F7E1  '..'
                  	shl	ax,1			; 00002226  D1E0  '..'
                  	shl	ax,1			; 00002228  D1E0  '..'
                  	shl	ax,1			; 0000222A  D1E0  '..'
                  	mov	si,di			; 0000222C  8BF7  '..'
                  	add	si,ax			; 0000222E  03F0  '..'
                  	pop	dx			; 00002230  5A  'Z'
                  	mov	ax,cx			; 00002231  8BC1  '..'
                  	or	bl,bl			; 00002233  0ADB  0x0A,'.'
                  	jz	x224e			; 00002235  7417  't.'
                  	push	ax			; 00002237  50  'P'
                  	mov	cl,dh			; 00002238  8ACE  '..'
                  	sub	cl,bl			; 0000223A  2ACB  '*.'
                  	xor	ch,ch			; 0000223C  32ED  '2.'
                  	push	dx			; 0000223E  52  'R'
                  	mov	ax,cx			; 0000223F  8BC1  '..'
                  	mul	bp			; 00002241  F7E5  '..'
                  	mov	cx,ax			; 00002243  8BC8  '..'
                  	pop	dx			; 00002245  5A  'Z'
                  	pop	ax			; 00002246  58  'X'
                  	call	x2252			; 00002247  E80800  '...'
                  x224a:	call	x2273			; 0000224A  E82600  '.&.'
                  	ret				; 0000224D  C3  '.'
                  
                  x224e:	mov	bl,dh			; 0000224E  8ADE  '..'
                  	jmp	short x224a		; 00002250  EBF8  '..'
                  
                  x2252:	push	ax			; 00002252  50  'P'
                  	shl	ax,1			; 00002253  D1E0  '..'
                  	shl	ax,1			; 00002255  D1E0  '..'
                  	shl	ax,1			; 00002257  D1E0  '..'
                  x2259:	push	cx			; 00002259  51  'Q'
                  	mov	cl,dl			; 0000225A  8ACA  '..'
                  	xor	ch,ch			; 0000225C  32ED  '2.'
                  	shl	cx,1			; 0000225E  D1E1  '..'
                  	shl	cx,1			; 00002260  D1E1  '..'
                  	shl	cx,1			; 00002262  D1E1  '..'
                  	push	si			; 00002264  56  'V'
                  	push	di			; 00002265  57  'W'
                  	rep	movsb			; 00002266  F3A4  '..'
                  	pop	di			; 00002268  5F  '_'
                  	pop	si			; 00002269  5E  '^'
                  	add	si,ax			; 0000226A  03F0  '..'
                  	add	di,ax			; 0000226C  03F8  '..'
                  	pop	cx			; 0000226E  59  'Y'
                  	loop	x2259			; 0000226F  E2E8  '..'
                  	pop	ax			; 00002271  58  'X'
                  	ret				; 00002272  C3  '.'
                  
                  x2273:	mov	dh,bh			; 00002273  8AF7  '..'
                  	sub	bh,bh			; 00002275  2AFF  '*.'
                  	push	ax			; 00002277  50  'P'
                  	push	dx			; 00002278  52  'R'
                  	mov	ax,bx			; 00002279  8BC3  '..'
                  	mul	bp			; 0000227B  F7E5  '..'
                  	mov	bx,ax			; 0000227D  8BD8  '..'
                  	pop	dx			; 0000227F  5A  'Z'
                  	pop	ax			; 00002280  58  'X'
                  x2281:	call	x2292			; 00002281  E80E00  '...'
                  	push	ax			; 00002284  50  'P'
                  	shl	ax,1			; 00002285  D1E0  '..'
                  	shl	ax,1			; 00002287  D1E0  '..'
                  	shl	ax,1			; 00002289  D1E0  '..'
                  	add	di,ax			; 0000228B  03F8  '..'
                  	dec	bx			; 0000228D  4B  'K'
                  	pop	ax			; 0000228E  58  'X'
                  	jnz	x2281			; 0000228F  75F0  'u.'
                  	ret				; 00002291  C3  '.'
                  
                  x2292:	push	ax			; 00002292  50  'P'
                  	sub	ax,ax			; 00002293  2BC0  '+.'
                  	mov	cl,dl			; 00002295  8ACA  '..'
                  	xor	ch,ch			; 00002297  32ED  '2.'
                  	shl	cx,1			; 00002299  D1E1  '..'
                  	shl	cx,1			; 0000229B  D1E1  '..'
                  	shl	cx,1			; 0000229D  D1E1  '..'
                  	mov	al,dh			; 0000229F  8AC6  '..'
                  	push	di			; 000022A1  57  'W'
                  	rep	stosb			; 000022A2  F3AA  '..'
                  	pop	di			; 000022A4  5F  '_'
                  	pop	ax			; 000022A5  58  'X'
                  	ret				; 000022A6  C3  '.'
                  
                  	call	x22ad			; 000022A7  E80300  '...'
                  	jmp	x713			; 000022AA  E966E4  '.f.'
                  
                  x22ad:	call	x24ee			; 000022AD  E83E02  '.>.'
                  	mov	ah,[0x449]		; 000022B0  8A264904  '.&I.'
                  	mov	si,ax			; 000022B4  8BF0  '..'
                  	shr	si,1			; 000022B6  D1EE  '..'
                  	shr	si,1			; 000022B8  D1EE  '..'
                  	shr	si,1			; 000022BA  D1EE  '..'
                  	shr	si,1			; 000022BC  D1EE  '..'
                  	shr	si,1			; 000022BE  D1EE  '..'
                  	shr	si,1			; 000022C0  D1EE  '..'
                  	shr	si,1			; 000022C2  D1EE  '..'
                  	shr	si,1			; 000022C4  D1EE  '..'
                  	shl	si,1			; 000022C6  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 000022C8  2E8BB49012  '.....'
                  	shl	si,1			; 000022CD  D1E6  '..'
                  	cmp	si,0xa			; 000022CF  81FE0A00  '..',0x0A,'.'
                  	jnc	x22da			; 000022D3  7305  's.'
                  	call	near [cs:si+0x22db]	; 000022D5  2EFF94DB22  '...."'
                  x22da:	ret				; 000022DA  C3  '.'
                  
                  	fisub	dword [bp+si]		; 000022DB  DA22  '."'
                  	in	ax,0x22			; 000022DD  E522  '."'
                  	xor	[bp+di],sp		; 000022DF  3123  '1#'
                  	xchg	ax,si			; 000022E1  96  '.'
                  	and	ax,[bx+si+0x24]		; 000022E2  234024  '#@$'
                  	std				; 000022E5  FD  '.'
                  	mov	bl,al			; 000022E6  8AD8  '..'
                  	call	x2a1f			; 000022E8  E83407  '.4.'
                  	mov	ax,dx			; 000022EB  8BC2  '..'
                  	call	x206c			; 000022ED  E87CFD  '.|.'
                  	call	x22f4			; 000022F0  E80100  '...'
                  	ret				; 000022F3  C3  '.'
                  
                  x22f4:	push	bx			; 000022F4  53  'S'
                  	xor	ch,ch			; 000022F5  32ED  '2.'
                  	cmp	bl,0x0			; 000022F7  80FB00  '...'
                  	jz	x232d			; 000022FA  7431  't1'
                  	sub	si,ax			; 000022FC  2BF0  '+.'
                  	mov	ah,dh			; 000022FE  8AE6  '..'
                  	sub	ah,bl			; 00002300  2AE3  '*.'
                  x2302:	call	x205c			; 00002302  E857FD  '.W.'
                  	sub	si,bp			; 00002305  2BF5  '+.'
                  	sub	di,bp			; 00002307  2BFD  '+.'
                  	dec	ah			; 00002309  FECC  '..'
                  	jnz	x2302			; 0000230B  75F5  'u.'
                  x230d:	pop	ax			; 0000230D  58  'X'
                  	mov	al,0x20			; 0000230E  B020  '. '
                  x2310:	call	x2065			; 00002310  E852FD  '.R.'
                  	sub	di,bp			; 00002313  2BFD  '+.'
                  	dec	bl			; 00002315  FECB  '..'
                  	jnz	x2310			; 00002317  75F7  'u.'
                  	mov	ds,[cs:0x71c]		; 00002319  2E8E1E1C07  '.....'
                  	cmp	byte [0x449],0x7	; 0000231E  803E490407  '.>I..'
                  	jz	x232c			; 00002323  7407  't.'
                  	mov	al,[0x465]		; 00002325  A06504  '.e.'
                  	mov	dx,0x3d8		; 00002328  BAD803  '...'
                  	out	dx,al			; 0000232B  EE  '.'
                  x232c:	ret				; 0000232C  C3  '.'
                  
                  x232d:	mov	bl,dh			; 0000232D  8ADE  '..'
                  	jmp	short x230d		; 0000232F  EBDC  '..'
                  
                  	std				; 00002331  FD  '.'
                  	mov	bl,al			; 00002332  8AD8  '..'
                  	call	x2a1f			; 00002334  E8E806  '...'
                  	mov	ax,dx			; 00002337  8BC2  '..'
                  	call	x25c5			; 00002339  E88902  '...'
                  	mov	di,ax			; 0000233C  8BF8  '..'
                  	sub	dx,cx			; 0000233E  2BD1  '+.'
                  	add	dx,0x101		; 00002340  81C20101  '....'
                  	shl	dh,1			; 00002344  D0E6  '..'
                  	shl	dh,1			; 00002346  D0E6  '..'
                  	cmp	byte [0x449],0x6	; 00002348  803E490406  '.>I..'
                  	jnc	x2354			; 0000234D  7305  's.'
                  	shl	dl,1			; 0000234F  D0E2  '..'
                  	shl	di,1			; 00002351  D1E7  '..'
                  	inc	di			; 00002353  47  'G'
                  x2354:	call	x2358			; 00002354  E80100  '...'
                  	ret				; 00002357  C3  '.'
                  
                  x2358:	push	es			; 00002358  06  '.'
                  	pop	ds			; 00002359  1F  '.'
                  	xor	ch,ch			; 0000235A  32ED  '2.'
                  	add	di,0xf0			; 0000235C  81C7F000  '....'
                  	shl	bl,1			; 00002360  D0E3  '..'
                  	shl	bl,1			; 00002362  D0E3  '..'
                  	jz	x2392			; 00002364  742C  't,'
                  	mov	al,bl			; 00002366  8AC3  '..'
                  	mov	ah,0x50			; 00002368  B450  '.P'
                  	mul	ah			; 0000236A  F6E4  '..'
                  	mov	si,di			; 0000236C  8BF7  '..'
                  	sub	si,ax			; 0000236E  2BF0  '+.'
                  	mov	ah,dh			; 00002370  8AE6  '..'
                  	sub	ah,bl			; 00002372  2AE3  '*.'
                  x2374:	call	x2105			; 00002374  E88EFD  '...'
                  	sub	si,0x2050		; 00002377  81EE5020  '..P '
                  	sub	di,0x2050		; 0000237B  81EF5020  '..P '
                  	dec	ah			; 0000237F  FECC  '..'
                  	jnz	x2374			; 00002381  75F1  'u.'
                  x2383:	mov	al,bh			; 00002383  8AC7  '..'
                  x2385:	call	x211e			; 00002385  E896FD  '...'
                  	sub	di,0x2050		; 00002388  81EF5020  '..P '
                  	dec	bl			; 0000238C  FECB  '..'
                  	jnz	x2385			; 0000238E  75F5  'u.'
                  	cld				; 00002390  FC  '.'
                  	ret				; 00002391  C3  '.'
                  
                  x2392:	mov	bl,dh			; 00002392  8ADE  '..'
                  	jmp	short x2383		; 00002394  EBED  '..'
                  
                  	std				; 00002396  FD  '.'
                  	mov	bl,al			; 00002397  8AD8  '..'
                  	mov	ax,0xa000		; 00002399  B800A0  '...'
                  	mov	es,ax			; 0000239C  8EC0  '..'
                  	mov	ax,dx			; 0000239E  8BC2  '..'
                  	inc	ah			; 000023A0  FEC4  '..'
                  	push	bx			; 000023A2  53  'S'
                  	mov	bh,[0x462]		; 000023A3  8A3E6204  '.>b.'
                  	call	x2679			; 000023A7  E8CF02  '...'
                  	pop	bx			; 000023AA  5B  '['
                  	sub	ax,[0x44a]		; 000023AB  2B064A04  '+.J.'
                  	mov	di,ax			; 000023AF  8BF8  '..'
                  	sub	dx,cx			; 000023B1  2BD1  '+.'
                  	add	dx,0x101		; 000023B3  81C20101  '....'
                  	mov	bp,[0x485]		; 000023B7  8B2E8504  '....'
                  	mov	cx,[0x44a]		; 000023BB  8B0E4A04  '..J.'
                  	call	x23c3			; 000023BF  E80100  '...'
                  	ret				; 000023C2  C3  '.'
                  
                  x23c3:	push	es			; 000023C3  06  '.'
                  	pop	ds			; 000023C4  1F  '.'
                  	mov	al,bl			; 000023C5  8AC3  '..'
                  	sub	ah,ah			; 000023C7  2AE4  '*.'
                  	push	dx			; 000023C9  52  'R'
                  	mul	bp			; 000023CA  F7E5  '..'
                  	mul	cx			; 000023CC  F7E1  '..'
                  	mov	si,di			; 000023CE  8BF7  '..'
                  	sub	si,ax			; 000023D0  2BF0  '+.'
                  	pop	dx			; 000023D2  5A  'Z'
                  	mov	ax,cx			; 000023D3  8BC1  '..'
                  	or	bl,bl			; 000023D5  0ADB  0x0A,'.'
                  	jz	x2409			; 000023D7  7430  't0'
                  	push	ax			; 000023D9  50  'P'
                  	mov	cl,dh			; 000023DA  8ACE  '..'
                  	sub	cl,bl			; 000023DC  2ACB  '*.'
                  	xor	ch,ch			; 000023DE  32ED  '2.'
                  	push	dx			; 000023E0  52  'R'
                  	mov	ax,cx			; 000023E1  8BC1  '..'
                  	mul	bp			; 000023E3  F7E5  '..'
                  	mov	cx,ax			; 000023E5  8BC8  '..'
                  	mov	dx,0x3ce		; 000023E7  BACE03  '...'
                  	mov	ax,0x105		; 000023EA  B80501  '...'
                  	out	dx,ax			; 000023ED  EF  '.'
                  	mov	dl,0xc4			; 000023EE  B2C4  '..'
                  	mov	ax,0xf02		; 000023F0  B8020F  '...'
                  	out	dx,ax			; 000023F3  EF  '.'
                  	pop	dx			; 000023F4  5A  'Z'
                  	pop	ax			; 000023F5  58  'X'
                  	call	x240d			; 000023F6  E81400  '...'
                  	push	dx			; 000023F9  52  'R'
                  	push	ax			; 000023FA  50  'P'
                  	mov	dx,0x3ce		; 000023FB  BACE03  '...'
                  	mov	ax,0x5			; 000023FE  B80500  '...'
                  	out	dx,ax			; 00002401  EF  '.'
                  	pop	ax			; 00002402  58  'X'
                  	pop	dx			; 00002403  5A  'Z'
                  x2404:	call	x2420			; 00002404  E81900  '...'
                  	cld				; 00002407  FC  '.'
                  	ret				; 00002408  C3  '.'
                  
                  x2409:	mov	bl,dh			; 00002409  8ADE  '..'
                  	jmp	short x2404		; 0000240B  EBF7  '..'
                  
                  x240d:	push	cx			; 0000240D  51  'Q'
                  	mov	cl,dl			; 0000240E  8ACA  '..'
                  	xor	ch,ch			; 00002410  32ED  '2.'
                  	push	si			; 00002412  56  'V'
                  	push	di			; 00002413  57  'W'
                  	rep	movsb			; 00002414  F3A4  '..'
                  	pop	di			; 00002416  5F  '_'
                  	pop	si			; 00002417  5E  '^'
                  	sub	si,ax			; 00002418  2BF0  '+.'
                  	sub	di,ax			; 0000241A  2BF8  '+.'
                  	pop	cx			; 0000241C  59  'Y'
                  	loop	x240d			; 0000241D  E2EE  '..'
                  	ret				; 0000241F  C3  '.'
                  
                  x2420:	mov	dh,bh			; 00002420  8AF7  '..'
                  	sub	bh,bh			; 00002422  2AFF  '*.'
                  	push	ax			; 00002424  50  'P'
                  	push	dx			; 00002425  52  'R'
                  	mov	ax,bx			; 00002426  8BC3  '..'
                  	mul	bp			; 00002428  F7E5  '..'
                  	mov	bx,ax			; 0000242A  8BD8  '..'
                  	pop	dx			; 0000242C  5A  'Z'
                  	pop	ax			; 0000242D  58  'X'
                  x242e:	push	ax			; 0000242E  50  'P'
                  	call	x21d1			; 0000242F  E89FFD  '...'
                  	pop	ax			; 00002432  58  'X'
                  	sub	di,ax			; 00002433  2BF8  '+.'
                  	dec	bx			; 00002435  4B  'K'
                  	jnz	x242e			; 00002436  75F6  'u.'
                  	mov	dx,0x3c4		; 00002438  BAC403  '...'
                  	mov	ax,0xf02		; 0000243B  B8020F  '...'
                  	out	dx,ax			; 0000243E  EF  '.'
                  	ret				; 0000243F  C3  '.'
                  
                  	std				; 00002440  FD  '.'
                  	mov	bl,al			; 00002441  8AD8  '..'
                  	mov	ax,0xa000		; 00002443  B800A0  '...'
                  	mov	es,ax			; 00002446  8EC0  '..'
                  	mov	ax,dx			; 00002448  8BC2  '..'
                  	inc	ah			; 0000244A  FEC4  '..'
                  	push	bx			; 0000244C  53  'S'
                  	push	dx			; 0000244D  52  'R'
                  	call	x26dd			; 0000244E  E88C02  '...'
                  	pop	dx			; 00002451  5A  'Z'
                  	mov	bx,[0x44a]		; 00002452  8B1E4A04  '..J.'
                  	shl	bx,1			; 00002456  D1E3  '..'
                  	shl	bx,1			; 00002458  D1E3  '..'
                  	shl	bx,1			; 0000245A  D1E3  '..'
                  	sub	ax,bx			; 0000245C  2BC3  '+.'
                  	add	ax,0x7			; 0000245E  050700  '...'
                  	pop	bx			; 00002461  5B  '['
                  	mov	di,ax			; 00002462  8BF8  '..'
                  	sub	dx,cx			; 00002464  2BD1  '+.'
                  	add	dx,0x101		; 00002466  81C20101  '....'
                  	mov	bp,[0x485]		; 0000246A  8B2E8504  '....'
                  	mov	cx,[0x44a]		; 0000246E  8B0E4A04  '..J.'
                  	call	x2476			; 00002472  E80100  '...'
                  	ret				; 00002475  C3  '.'
                  
                  x2476:	push	es			; 00002476  06  '.'
                  	pop	ds			; 00002477  1F  '.'
                  	mov	al,bl			; 00002478  8AC3  '..'
                  	sub	ah,ah			; 0000247A  2AE4  '*.'
                  	push	dx			; 0000247C  52  'R'
                  	mul	bp			; 0000247D  F7E5  '..'
                  	mul	cx			; 0000247F  F7E1  '..'
                  	shl	ax,1			; 00002481  D1E0  '..'
                  	shl	ax,1			; 00002483  D1E0  '..'
                  	shl	ax,1			; 00002485  D1E0  '..'
                  	mov	si,di			; 00002487  8BF7  '..'
                  	sub	si,ax			; 00002489  2BF0  '+.'
                  	pop	dx			; 0000248B  5A  'Z'
                  	mov	ax,cx			; 0000248C  8BC1  '..'
                  	or	bl,bl			; 0000248E  0ADB  0x0A,'.'
                  	jz	x24aa			; 00002490  7418  't.'
                  	push	ax			; 00002492  50  'P'
                  	mov	cl,dh			; 00002493  8ACE  '..'
                  	sub	cl,bl			; 00002495  2ACB  '*.'
                  	xor	ch,ch			; 00002497  32ED  '2.'
                  	push	dx			; 00002499  52  'R'
                  	mov	ax,cx			; 0000249A  8BC1  '..'
                  	mul	bp			; 0000249C  F7E5  '..'
                  	mov	cx,ax			; 0000249E  8BC8  '..'
                  	pop	dx			; 000024A0  5A  'Z'
                  	pop	ax			; 000024A1  58  'X'
                  	call	x24ae			; 000024A2  E80900  '...'
                  x24a5:	call	x24cf			; 000024A5  E82700  '.',0x27,'.'
                  	cld				; 000024A8  FC  '.'
                  	ret				; 000024A9  C3  '.'
                  
                  x24aa:	mov	bl,dh			; 000024AA  8ADE  '..'
                  	jmp	short x24a5		; 000024AC  EBF7  '..'
                  
                  x24ae:	push	ax			; 000024AE  50  'P'
                  	shl	ax,1			; 000024AF  D1E0  '..'
                  	shl	ax,1			; 000024B1  D1E0  '..'
                  	shl	ax,1			; 000024B3  D1E0  '..'
                  x24b5:	push	cx			; 000024B5  51  'Q'
                  	mov	cl,dl			; 000024B6  8ACA  '..'
                  	xor	ch,ch			; 000024B8  32ED  '2.'
                  	shl	cx,1			; 000024BA  D1E1  '..'
                  	shl	cx,1			; 000024BC  D1E1  '..'
                  	shl	cx,1			; 000024BE  D1E1  '..'
                  	push	si			; 000024C0  56  'V'
                  	push	di			; 000024C1  57  'W'
                  	rep	movsb			; 000024C2  F3A4  '..'
                  	pop	di			; 000024C4  5F  '_'
                  	pop	si			; 000024C5  5E  '^'
                  	sub	si,ax			; 000024C6  2BF0  '+.'
                  	sub	di,ax			; 000024C8  2BF8  '+.'
                  	pop	cx			; 000024CA  59  'Y'
                  	loop	x24b5			; 000024CB  E2E8  '..'
                  	pop	ax			; 000024CD  58  'X'
                  	ret				; 000024CE  C3  '.'
                  
                  x24cf:	mov	dh,bh			; 000024CF  8AF7  '..'
                  	sub	bh,bh			; 000024D1  2AFF  '*.'
                  	push	ax			; 000024D3  50  'P'
                  	push	dx			; 000024D4  52  'R'
                  	mov	ax,bx			; 000024D5  8BC3  '..'
                  	mul	bp			; 000024D7  F7E5  '..'
                  	mov	bx,ax			; 000024D9  8BD8  '..'
                  	pop	dx			; 000024DB  5A  'Z'
                  	pop	ax			; 000024DC  58  'X'
                  x24dd:	call	x2292			; 000024DD  E8B2FD  '...'
                  	push	ax			; 000024E0  50  'P'
                  	shl	ax,1			; 000024E1  D1E0  '..'
                  	shl	ax,1			; 000024E3  D1E0  '..'
                  	shl	ax,1			; 000024E5  D1E0  '..'
                  	sub	di,ax			; 000024E7  2BF8  '+.'
                  	dec	bx			; 000024E9  4B  'K'
                  	pop	ax			; 000024EA  58  'X'
                  	jnz	x24dd			; 000024EB  75F0  'u.'
                  	ret				; 000024ED  C3  '.'
                  
                  x24ee:	push	ax			; 000024EE  50  'P'
                  	mov	ah,dh			; 000024EF  8AE6  '..'
                  	sub	ah,ch			; 000024F1  2AE5  '*.'
                  	inc	ah			; 000024F3  FEC4  '..'
                  	cmp	ah,al			; 000024F5  3AE0  ':.'
                  	pop	ax			; 000024F7  58  'X'
                  	jnz	x24fc			; 000024F8  7502  'u.'
                  	sub	al,al			; 000024FA  2AC0  '*.'
                  x24fc:	ret				; 000024FC  C3  '.'
                  
                  	call	x2503			; 000024FD  E80300  '...'
                  	jmp	x713			; 00002500  E910E2  '...'
                  
                  x2503:	mov	al,[0x449]		; 00002503  A04904  '.I.'
                  	xor	ah,ah			; 00002506  32E4  '2.'
                  	shl	ax,1			; 00002508  D1E0  '..'
                  	mov	si,ax			; 0000250A  8BF0  '..'
                  	mov	si,[cs:si+0x1290]	; 0000250C  2E8BB49012  '.....'
                  	shl	si,1			; 00002511  D1E6  '..'
                  	cmp	si,0xa			; 00002513  81FE0A00  '..',0x0A,'.'
                  	jnc	x251e			; 00002517  7305  's.'
                  	call	near [cs:si+0x251f]	; 00002519  2EFF941F25  '....%'
                  x251e:	ret				; 0000251E  C3  '.'
                  
                  	push	ds			; 0000251F  1E  '.'
                  	and	ax,0x2529		; 00002520  252925  '%)%'
                  	db	0x79,0x25
                  	sub	ax,0xb126		; 00002525  2D26B1  '-&.'
                  	es	call 0x2a1f		; 00002528  26E8F304  '&...'
                  	xor	ch,ch			; 0000252C  32ED  '2.'
                  	mov	cl,bh			; 0000252E  8ACF  '..'
                  	mov	di,cx			; 00002530  8BF9  '..'
                  	shl	di,1			; 00002532  D1E7  '..'
                  	mov	ax,[di+0x450]		; 00002534  8B855004  '..P.'
                  	mov	bx,[0x44c]		; 00002538  8B1E4C04  '..L.'
                  	mov	dx,[0x44a]		; 0000253C  8B164A04  '..J.'
                  	call	x2562			; 00002540  E81F00  '...'
                  	mov	si,di			; 00002543  8BF7  '..'
                  	mov	dx,[0x463]		; 00002545  8B166304  '..c.'
                  	add	dx,byte +0x6		; 00002549  83C206  '...'
                  	test	byte [0x487],0x4	; 0000254C  F606870404  '.....'
                  	push	es			; 00002551  06  '.'
                  	pop	ds			; 00002552  1F  '.'
                  	jz	x2560			; 00002553  740B  't.'
                  x2555:	in	al,dx			; 00002555  EC  '.'
                  	test	al,0x1			; 00002556  A801  '..'
                  	jnz	x2555			; 00002558  75FB  'u.'
                  	cli				; 0000255A  FA  '.'
                  x255b:	in	al,dx			; 0000255B  EC  '.'
                  	test	al,0x1			; 0000255C  A801  '..'
                  	jz	x255b			; 0000255E  74FB  't.'
                  x2560:	lodsw				; 00002560  AD  '.'
                  	ret				; 00002561  C3  '.'
                  
                  x2562:	xor	di,di			; 00002562  33FF  '3.'
                  	jcxz	x256a			; 00002564  E304  '..'
                  x2566:	add	di,bx			; 00002566  03FB  '..'
                  	loop	x2566			; 00002568  E2FC  '..'
                  x256a:	mov	cx,ax			; 0000256A  8BC8  '..'
                  	mov	al,ah			; 0000256C  8AC4  '..'
                  	mul	dl			; 0000256E  F6E2  '..'
                  	xor	ch,ch			; 00002570  32ED  '2.'
                  	add	ax,cx			; 00002572  03C1  '..'
                  	shl	ax,1			; 00002574  D1E0  '..'
                  	add	di,ax			; 00002576  03F8  '..'
                  	ret				; 00002578  C3  '.'
                  
                  	call	x2a1f			; 00002579  E8A304  '...'
                  	mov	ax,[0x450]		; 0000257C  A15004  '.P.'
                  	call	x25c5			; 0000257F  E84300  '.C.'
                  	mov	si,ax			; 00002582  8BF0  '..'
                  	mov	ah,[0x449]		; 00002584  8A264904  '.&I.'
                  	push	es			; 00002588  06  '.'
                  	pop	ds			; 00002589  1F  '.'
                  	sub	sp,byte +0x8		; 0000258A  83EC08  '...'
                  	mov	bp,sp			; 0000258D  8BEC  '..'
                  	call	x25d8			; 0000258F  E84600  '.F.'
                  	mov	ds,[cs:0x71c]		; 00002592  2E8E1E1C07  '.....'
                  	push	ds			; 00002597  1E  '.'
                  	les	di,[0x10c]		; 00002598  C43E0C01  '.>..'
                  	mov	ax,0x0			; 0000259C  B80000  '...'
                  	mov	dx,0x80			; 0000259F  BA8000  '...'
                  	mov	bx,0x8			; 000025A2  BB0800  '...'
                  	call	x2a04			; 000025A5  E85C04  '.\.'
                  	pop	ds			; 000025A8  1F  '.'
                  	jc	x25c1			; 000025A9  7216  'r.'
                  	les	di,[0x7c]		; 000025AB  C43E7C00  '.>|.'
                  	mov	ax,es			; 000025AF  8CC0  '..'
                  	or	ax,di			; 000025B1  0BC7  '..'
                  	jz	x25c1			; 000025B3  740C  't.'
                  	mov	ax,0x80			; 000025B5  B88000  '...'
                  	mov	dx,0x80			; 000025B8  BA8000  '...'
                  	mov	bx,0x8			; 000025BB  BB0800  '...'
                  	call	x2a04			; 000025BE  E84304  '.C.'
                  x25c1:	add	sp,byte +0x8		; 000025C1  83C408  '...'
                  	ret				; 000025C4  C3  '.'
                  
                  x25c5:	push	bx			; 000025C5  53  'S'
                  	mov	bx,ax			; 000025C6  8BD8  '..'
                  	mov	al,ah			; 000025C8  8AC4  '..'
                  	mul	byte [0x44a]		; 000025CA  F6264A04  '.&J.'
                  	shl	ax,1			; 000025CE  D1E0  '..'
                  	shl	ax,1			; 000025D0  D1E0  '..'
                  	sub	bh,bh			; 000025D2  2AFF  '*.'
                  	add	ax,bx			; 000025D4  03C3  '..'
                  	pop	bx			; 000025D6  5B  '['
                  	ret				; 000025D7  C3  '.'
                  
                  x25d8:	cmp	ah,0x6			; 000025D8  80FC06  '...'
                  	jnz	x25f6			; 000025DB  7519  'u.'
                  	mov	dh,0x4			; 000025DD  B604  '..'
                  x25df:	mov	al,[si]			; 000025DF  8A04  '..'
                  	mov	[bp+0x0],al		; 000025E1  884600  '.F.'
                  	inc	bp			; 000025E4  45  'E'
                  	mov	al,[si+0x2000]		; 000025E5  8A840020  '... '
                  	mov	[bp+0x0],al		; 000025E9  884600  '.F.'
                  	inc	bp			; 000025EC  45  'E'
                  	add	si,byte +0x50		; 000025ED  83C650  '..P'
                  	dec	dh			; 000025F0  FECE  '..'
                  	jnz	x25df			; 000025F2  75EB  'u.'
                  	jmp	short x260c		; 000025F4  EB16  '..'
                  
                  x25f6:	shl	si,1			; 000025F6  D1E6  '..'
                  	mov	dh,0x4			; 000025F8  B604  '..'
                  x25fa:	call	x2610			; 000025FA  E81300  '...'
                  	add	si,0x2000		; 000025FD  81C60020  '... '
                  	call	x2610			; 00002601  E80C00  '...'
                  	sub	si,0x1fb0		; 00002604  81EEB01F  '....'
                  	dec	dh			; 00002608  FECE  '..'
                  	jnz	x25fa			; 0000260A  75EE  'u.'
                  x260c:	sub	bp,byte +0x8		; 0000260C  83ED08  '...'
                  	ret				; 0000260F  C3  '.'
                  
                  x2610:	mov	ah,[si]			; 00002610  8A24  '.$'
                  	mov	al,[si+0x1]		; 00002612  8A4401  '.D.'
                  	mov	cx,0xc000		; 00002615  B900C0  '...'
                  	mov	dl,0x0			; 00002618  B200  '..'
                  x261a:	test	cx,ax			; 0000261A  85C1  '..'
                  	clc				; 0000261C  F8  '.'
                  	jz	x2620			; 0000261D  7401  't.'
                  	stc				; 0000261F  F9  '.'
                  x2620:	rcl	dl,1			; 00002620  D0D2  '..'
                  	shr	cx,1			; 00002622  D1E9  '..'
                  	shr	cx,1			; 00002624  D1E9  '..'
                  	jnc	x261a			; 00002626  73F2  's.'
                  	mov	[bp+0x0],dl		; 00002628  885600  '.V.'
                  	inc	bp			; 0000262B  45  'E'
                  	ret				; 0000262C  C3  '.'
                  
                  	mov	dx,0xa000		; 0000262D  BA00A0  '...'
                  	mov	es,dx			; 00002630  8EC2  '..'
                  	mov	si,bx			; 00002632  8BF3  '..'
                  	shr	si,1			; 00002634  D1EE  '..'
                  	shr	si,1			; 00002636  D1EE  '..'
                  	shr	si,1			; 00002638  D1EE  '..'
                  	shr	si,1			; 0000263A  D1EE  '..'
                  	shr	si,1			; 0000263C  D1EE  '..'
                  	shr	si,1			; 0000263E  D1EE  '..'
                  	shr	si,1			; 00002640  D1EE  '..'
                  	shr	si,1			; 00002642  D1EE  '..'
                  	shl	si,1			; 00002644  D1E6  '..'
                  	mov	ax,[si+0x450]		; 00002646  8B845004  '..P.'
                  	call	x2679			; 0000264A  E82C00  '.,.'
                  	mov	si,ax			; 0000264D  8BF0  '..'
                  	mov	bx,[0x485]		; 0000264F  8B1E8504  '....'
                  	sub	sp,bx			; 00002653  2BE3  '+.'
                  	mov	bp,sp			; 00002655  8BEC  '..'
                  	mov	dx,0x3ce		; 00002657  BACE03  '...'
                  	mov	ax,0x805		; 0000265A  B80508  '...'
                  	out	dx,ax			; 0000265D  EF  '.'
                  	mov	cx,[0x44a]		; 0000265E  8B0E4A04  '..J.'
                  	call	x269e			; 00002662  E83900  '.9.'
                  	mov	ax,0x5			; 00002665  B80500  '...'
                  	out	dx,ax			; 00002668  EF  '.'
                  	les	di,[0x10c]		; 00002669  C43E0C01  '.>..'
                  	mov	ax,0x0			; 0000266D  B80000  '...'
                  	mov	dx,0x100		; 00002670  BA0001  '...'
                  	call	x2a04			; 00002673  E88E03  '...'
                  	add	sp,bx			; 00002676  03E3  '..'
                  	ret				; 00002678  C3  '.'
                  
                  x2679:	push	bx			; 00002679  53  'S'
                  	push	cx			; 0000267A  51  'Q'
                  	push	dx			; 0000267B  52  'R'
                  	sub	ch,ch			; 0000267C  2AED  '*.'
                  	mov	cl,bh			; 0000267E  8ACF  '..'
                  	mov	bx,ax			; 00002680  8BD8  '..'
                  	mov	al,ah			; 00002682  8AC4  '..'
                  	mul	byte [0x44a]		; 00002684  F6264A04  '.&J.'
                  	mul	word [0x485]		; 00002688  F7268504  '.&..'
                  	sub	bh,bh			; 0000268C  2AFF  '*.'
                  	add	ax,bx			; 0000268E  03C3  '..'
                  	mov	bx,[0x44c]		; 00002690  8B1E4C04  '..L.'
                  	jcxz	x269a			; 00002694  E304  '..'
                  x2696:	add	ax,bx			; 00002696  03C3  '..'
                  	loop	x2696			; 00002698  E2FC  '..'
                  x269a:	pop	dx			; 0000269A  5A  'Z'
                  	pop	cx			; 0000269B  59  'Y'
                  	pop	bx			; 0000269C  5B  '['
                  	ret				; 0000269D  C3  '.'
                  
                  x269e:	push	bx			; 0000269E  53  'S'
                  x269f:	mov	al,[es:si]		; 0000269F  268A04  '&..'
                  	not	al			; 000026A2  F6D0  '..'
                  	mov	[bp+0x0],al		; 000026A4  884600  '.F.'
                  	inc	bp			; 000026A7  45  'E'
                  	add	si,cx			; 000026A8  03F1  '..'
                  	dec	bx			; 000026AA  4B  'K'
                  	jnz	x269f			; 000026AB  75F2  'u.'
                  	pop	bx			; 000026AD  5B  '['
                  	sub	bp,bx			; 000026AE  2BEB  '+.'
                  	ret				; 000026B0  C3  '.'
                  
                  	mov	dx,0xa000		; 000026B1  BA00A0  '...'
                  	mov	es,dx			; 000026B4  8EC2  '..'
                  	mov	ax,[0x450]		; 000026B6  A15004  '.P.'
                  	call	x26dd			; 000026B9  E82100  '.!.'
                  	mov	si,ax			; 000026BC  8BF0  '..'
                  	mov	bx,[0x485]		; 000026BE  8B1E8504  '....'
                  	sub	sp,bx			; 000026C2  2BE3  '+.'
                  	mov	bp,sp			; 000026C4  8BEC  '..'
                  	mov	dx,[0x44a]		; 000026C6  8B164A04  '..J.'
                  	call	x26f5			; 000026CA  E82800  '.(.'
                  	les	di,[0x10c]		; 000026CD  C43E0C01  '.>..'
                  	mov	ax,0x0			; 000026D1  B80000  '...'
                  	mov	dx,0x100		; 000026D4  BA0001  '...'
                  	call	x2a04			; 000026D7  E82A03  '.*.'
                  	add	sp,bx			; 000026DA  03E3  '..'
                  	ret				; 000026DC  C3  '.'
                  
                  x26dd:	mov	bx,ax			; 000026DD  8BD8  '..'
                  	mov	al,ah			; 000026DF  8AC4  '..'
                  	mul	byte [0x44a]		; 000026E1  F6264A04  '.&J.'
                  	mul	word [0x485]		; 000026E5  F7268504  '.&..'
                  	add	al,bl			; 000026E9  02C3  '..'
                  	adc	ah,0x0			; 000026EB  80D400  '...'
                  	shl	ax,1			; 000026EE  D1E0  '..'
                  	shl	ax,1			; 000026F0  D1E0  '..'
                  	shl	ax,1			; 000026F2  D1E0  '..'
                  	ret				; 000026F4  C3  '.'
                  
                  x26f5:	push	bx			; 000026F5  53  'S'
                  x26f6:	push	bx			; 000026F6  53  'S'
                  	mov	bh,0x80			; 000026F7  B780  '..'
                  	sub	ah,ah			; 000026F9  2AE4  '*.'
                  	mov	cx,0x8			; 000026FB  B90800  '...'
                  x26fe:	mov	al,[es:si]		; 000026FE  268A04  '&..'
                  	cmp	al,0x0			; 00002701  3C00  '<.'
                  	jz	x2707			; 00002703  7402  't.'
                  	or	ah,bh			; 00002705  0AE7  0x0A,'.'
                  x2707:	ror	bh,1			; 00002707  D0CF  '..'
                  	inc	si			; 00002709  46  'F'
                  	loop	x26fe			; 0000270A  E2F2  '..'
                  	mov	[bp+0x0],ah		; 0000270C  886600  '.f.'
                  	inc	bp			; 0000270F  45  'E'
                  	sub	si,byte +0x8		; 00002710  83EE08  '...'
                  	mov	cx,dx			; 00002713  8BCA  '..'
                  	shl	cx,1			; 00002715  D1E1  '..'
                  	shl	cx,1			; 00002717  D1E1  '..'
                  	shl	cx,1			; 00002719  D1E1  '..'
                  	add	si,cx			; 0000271B  03F1  '..'
                  	pop	bx			; 0000271D  5B  '['
                  	dec	bx			; 0000271E  4B  'K'
                  	jnz	x26f6			; 0000271F  75D5  'u.'
                  	pop	bx			; 00002721  5B  '['
                  	sub	bp,bx			; 00002722  2BEB  '+.'
                  	ret				; 00002724  C3  '.'
                  
                  	call	x272b			; 00002725  E80300  '...'
                  	jmp	x713			; 00002728  E9E8DF  '...'
                  
                  x272b:	mov	ah,[0x449]		; 0000272B  8A264904  '.&I.'
                  	cmp	ah,0x11			; 0000272F  80FC11  '...'
                  	jnz	x273a			; 00002732  7506  'u.'
                  	and	bl,0x80			; 00002734  80E380  '...'
                  	or	bl,0x3f			; 00002737  80CB3F  '..?'
                  x273a:	mov	si,ax			; 0000273A  8BF0  '..'
                  	shr	si,1			; 0000273C  D1EE  '..'
                  	shr	si,1			; 0000273E  D1EE  '..'
                  	shr	si,1			; 00002740  D1EE  '..'
                  	shr	si,1			; 00002742  D1EE  '..'
                  	shr	si,1			; 00002744  D1EE  '..'
                  	shr	si,1			; 00002746  D1EE  '..'
                  	shr	si,1			; 00002748  D1EE  '..'
                  	shr	si,1			; 0000274A  D1EE  '..'
                  	shl	si,1			; 0000274C  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 0000274E  2E8BB49012  '.....'
                  	shl	si,1			; 00002753  D1E6  '..'
                  	cmp	si,0xa			; 00002755  81FE0A00  '..',0x0A,'.'
                  	jnc	x2760			; 00002759  7305  's.'
                  	call	near [cs:si+0x2761]	; 0000275B  2EFF946127  '...a',0x27
                  x2760:	ret				; 00002760  C3  '.'
                  
                  	pusha				; 00002761  60  '`'
                  	daa				; 00002762  27  0x27
                  	imul	sp,[bx],byte -0x55	; 00002763  6B27AB  'k',0x27,'.'
                  	daa				; 00002766  27  0x27
                  	call	0xe829:0x3228		; 00002767  9A283229E8  '.(2).'
                  	mov	cl,0x2			; 0000276C  B102  '..'
                  	mov	ah,bl			; 0000276E  8AE3  '..'
                  	push	ax			; 00002770  50  'P'
                  	push	cx			; 00002771  51  'Q'
                  	xor	ch,ch			; 00002772  32ED  '2.'
                  	mov	cl,bh			; 00002774  8ACF  '..'
                  	mov	di,cx			; 00002776  8BF9  '..'
                  	shl	di,1			; 00002778  D1E7  '..'
                  	mov	ax,[di+0x450]		; 0000277A  8B855004  '..P.'
                  	mov	bx,[0x44c]		; 0000277E  8B1E4C04  '..L.'
                  	mov	dx,[0x44a]		; 00002782  8B164A04  '..J.'
                  	call	x2562			; 00002786  E8D9FD  '...'
                  	pop	cx			; 00002789  59  'Y'
                  	pop	bx			; 0000278A  5B  '['
                  	mov	dx,[0x463]		; 0000278B  8B166304  '..c.'
                  	add	dx,byte +0x6		; 0000278F  83C206  '...'
                  x2792:	test	byte [0x487],0x4	; 00002792  F606870404  '.....'
                  	jz	x27a4			; 00002797  740B  't.'
                  x2799:	in	al,dx			; 00002799  EC  '.'
                  	test	al,0x1			; 0000279A  A801  '..'
                  	jnz	x2799			; 0000279C  75FB  'u.'
                  	cli				; 0000279E  FA  '.'
                  x279f:	in	al,dx			; 0000279F  EC  '.'
                  	test	al,0x1			; 000027A0  A801  '..'
                  	jz	x279f			; 000027A2  74FB  't.'
                  x27a4:	mov	ax,bx			; 000027A4  8BC3  '..'
                  	stosw				; 000027A6  AB  '.'
                  	sti				; 000027A7  FB  '.'
                  	loop	x2792			; 000027A8  E2E8  '..'
                  	ret				; 000027AA  C3  '.'
                  
                  	call	x2a1f			; 000027AB  E87102  '.q.'
                  	mov	dh,[0x449]		; 000027AE  8A364904  '.6I.'
                  	xor	ah,ah			; 000027B2  32E4  '2.'
                  	push	ax			; 000027B4  50  'P'
                  	mov	ax,[0x450]		; 000027B5  A15004  '.P.'
                  	call	x25c5			; 000027B8  E80AFE  '.',0x0A,'.'
                  	mov	di,ax			; 000027BB  8BF8  '..'
                  	pop	ax			; 000027BD  58  'X'
                  	cmp	al,0x80			; 000027BE  3C80  '<.'
                  	jnc	x27c8			; 000027C0  7306  's.'
                  	lds	si,[0x10c]		; 000027C2  C5360C01  '.6..'
                  	jmp	short x27ce		; 000027C6  EB06  '..'
                  
                  x27c8:	sub	al,0x80			; 000027C8  2C80  ',.'
                  	lds	si,[0x7c]		; 000027CA  C5367C00  '.6|.'
                  x27ce:	cmp	dh,0x6			; 000027CE  80FE06  '...'
                  	jc	x27d8			; 000027D1  7205  'r.'
                  	call	x27dc			; 000027D3  E80600  '...'
                  	jmp	short x27db		; 000027D6  EB03  '..'
                  
                  x27d8:	call	x280e			; 000027D8  E83300  '.3.'
                  x27db:	ret				; 000027DB  C3  '.'
                  
                  x27dc:	shl	ax,1			; 000027DC  D1E0  '..'
                  	shl	ax,1			; 000027DE  D1E0  '..'
                  	shl	ax,1			; 000027E0  D1E0  '..'
                  	add	si,ax			; 000027E2  03F0  '..'
                  x27e4:	push	di			; 000027E4  57  'W'
                  	push	si			; 000027E5  56  'V'
                  	mov	dh,0x4			; 000027E6  B604  '..'
                  x27e8:	lodsb				; 000027E8  AC  '.'
                  	test	bl,0x80			; 000027E9  F6C380  '...'
                  	jnz	x2802			; 000027EC  7514  'u.'
                  	stosb				; 000027EE  AA  '.'
                  	lodsb				; 000027EF  AC  '.'
                  x27f0:	mov	[es:di+0x1fff],al	; 000027F0  268885FF1F  '&....'
                  	add	di,byte +0x4f		; 000027F5  83C74F  '..O'
                  	dec	dh			; 000027F8  FECE  '..'
                  	jnz	x27e8			; 000027FA  75EC  'u.'
                  	pop	si			; 000027FC  5E  '^'
                  	pop	di			; 000027FD  5F  '_'
                  	inc	di			; 000027FE  47  'G'
                  	loop	x27e4			; 000027FF  E2E3  '..'
                  	ret				; 00002801  C3  '.'
                  
                  x2802:	xor	al,[es:di]		; 00002802  263205  '&2.'
                  	stosb				; 00002805  AA  '.'
                  	lodsb				; 00002806  AC  '.'
                  	xor	al,[es:di+0x1fff]	; 00002807  263285FF1F  '&2...'
                  	jmp	short x27f0		; 0000280C  EBE2  '..'
                  
                  x280e:	shl	ax,1			; 0000280E  D1E0  '..'
                  	shl	ax,1			; 00002810  D1E0  '..'
                  	shl	ax,1			; 00002812  D1E0  '..'
                  	add	si,ax			; 00002814  03F0  '..'
                  	mov	dl,bl			; 00002816  8AD3  '..'
                  	shl	di,1			; 00002818  D1E7  '..'
                  	and	bl,0x3			; 0000281A  80E303  '...'
                  	mov	al,bl			; 0000281D  8AC3  '..'
                  	push	cx			; 0000281F  51  'Q'
                  	mov	cx,0x3			; 00002820  B90300  '...'
                  x2823:	shl	al,1			; 00002823  D0E0  '..'
                  	shl	al,1			; 00002825  D0E0  '..'
                  	or	bl,al			; 00002827  0AD8  0x0A,'.'
                  	loop	x2823			; 00002829  E2F8  '..'
                  	mov	bh,bl			; 0000282B  8AFB  '..'
                  	pop	cx			; 0000282D  59  'Y'
                  x282e:	push	di			; 0000282E  57  'W'
                  	push	si			; 0000282F  56  'V'
                  	mov	dh,0x4			; 00002830  B604  '..'
                  x2832:	lodsb				; 00002832  AC  '.'
                  	call	x2878			; 00002833  E84200  '.B.'
                  	and	ax,bx			; 00002836  23C3  '#.'
                  	test	dl,0x80			; 00002838  F6C280  '...'
                  	jz	x2844			; 0000283B  7407  't.'
                  	xor	ah,[es:di]		; 0000283D  263225  '&2%'
                  	xor	al,[es:di+0x1]		; 00002840  26324501  '&2E.'
                  x2844:	mov	[es:di],ah		; 00002844  268825  '&.%'
                  	mov	[es:di+0x1],al		; 00002847  26884501  '&.E.'
                  	lodsb				; 0000284B  AC  '.'
                  	call	x2878			; 0000284C  E82900  '.).'
                  	and	ax,bx			; 0000284F  23C3  '#.'
                  	test	dl,0x80			; 00002851  F6C280  '...'
                  	jz	x2860			; 00002854  740A
                  	xor	ah,[es:di+0x2000]	; 00002856  2632A50020  '&2.. '
                  	xor	al,[es:di+0x2001]	; 0000285B  2632850120  '&2.. '
                  x2860:	mov	[es:di+0x2000],ah	; 00002860  2688A50020  '&... '
                  	mov	[es:di+0x2001],al	; 00002865  2688850120  '&... '
                  	add	di,byte +0x50		; 0000286A  83C750  '..P'
                  	dec	dh			; 0000286D  FECE  '..'
                  	jnz	x2832			; 0000286F  75C1  'u.'
                  	pop	si			; 00002871  5E  '^'
                  	pop	di			; 00002872  5F  '_'
                  	inc	di			; 00002873  47  'G'
                  	inc	di			; 00002874  47  'G'
                  	loop	x282e			; 00002875  E2B7  '..'
                  	ret				; 00002877  C3  '.'
                  
                  x2878:	push	dx			; 00002878  52  'R'
                  	push	cx			; 00002879  51  'Q'
                  	push	bx			; 0000287A  53  'S'
                  	sub	dx,dx			; 0000287B  2BD2  '+.'
                  	mov	cx,0x1			; 0000287D  B90100  '...'
                  x2880:	mov	bx,ax			; 00002880  8BD8  '..'
                  	and	bx,cx			; 00002882  23D9  '#.'
                  	or	dx,bx			; 00002884  0BD3  '..'
                  	shl	ax,1			; 00002886  D1E0  '..'
                  	shl	cx,1			; 00002888  D1E1  '..'
                  	mov	bx,ax			; 0000288A  8BD8  '..'
                  	and	bx,cx			; 0000288C  23D9  '#.'
                  	or	dx,bx			; 0000288E  0BD3  '..'
                  	shl	cx,1			; 00002890  D1E1  '..'
                  	jnc	x2880			; 00002892  73EC  's.'
                  	mov	ax,dx			; 00002894  8BC2  '..'
                  	pop	bx			; 00002896  5B  '['
                  	pop	cx			; 00002897  59  'Y'
                  	pop	dx			; 00002898  5A  'Z'
                  	ret				; 00002899  C3  '.'
                  
                  	xor	ah,ah			; 0000289A  32E4  '2.'
                  	mul	word [0x485]		; 0000289C  F7268504  '.&..'
                  	push	ax			; 000028A0  50  'P'
                  	mov	si,bx			; 000028A1  8BF3  '..'
                  	shr	si,1			; 000028A3  D1EE  '..'
                  	shr	si,1			; 000028A5  D1EE  '..'
                  	shr	si,1			; 000028A7  D1EE  '..'
                  	shr	si,1			; 000028A9  D1EE  '..'
                  	shr	si,1			; 000028AB  D1EE  '..'
                  	shr	si,1			; 000028AD  D1EE  '..'
                  	shr	si,1			; 000028AF  D1EE  '..'
                  	shr	si,1			; 000028B1  D1EE  '..'
                  	shl	si,1			; 000028B3  D1E6  '..'
                  	mov	ax,[si+0x450]		; 000028B5  8B845004  '..P.'
                  	call	x2679			; 000028B9  E8BDFD  '...'
                  	mov	di,ax			; 000028BC  8BF8  '..'
                  	mov	dx,0xa000		; 000028BE  BA00A0  '...'
                  	mov	es,dx			; 000028C1  8EC2  '..'
                  	mov	bp,[0x44a]		; 000028C3  8B2E4A04  '..J.'
                  	mov	dx,[0x485]		; 000028C7  8B168504  '....'
                  	lds	si,[0x10c]		; 000028CB  C5360C01  '.6..'
                  	pop	ax			; 000028CF  58  'X'
                  	add	si,ax			; 000028D0  03F0  '..'
                  	call	x28d6			; 000028D2  E80100  '...'
                  	ret				; 000028D5  C3  '.'
                  
                  x28d6:	test	bl,0x80			; 000028D6  F6C380  '...'
                  	jz	x28e6			; 000028D9  740B  't.'
                  	push	dx			; 000028DB  52  'R'
                  	mov	dx,0x3ce		; 000028DC  BACE03  '...'
                  	mov	ax,0x1803		; 000028DF  B80318  '...'
                  	out	dx,ax			; 000028E2  EF  '.'
                  	pop	dx			; 000028E3  5A  'Z'
                  	jmp	short x28fd		; 000028E4  EB17  '..'
                  
                  x28e6:	push	di			; 000028E6  57  'W'
                  	push	dx			; 000028E7  52  'R'
                  	mov	dx,0x3c4		; 000028E8  BAC403  '...'
                  	mov	ax,0xf02		; 000028EB  B8020F  '...'
                  	out	dx,ax			; 000028EE  EF  '.'
                  	pop	dx			; 000028EF  5A  'Z'
                  	sub	ax,ax			; 000028F0  2BC0  '+.'
                  	push	cx			; 000028F2  51  'Q'
                  	mov	cx,dx			; 000028F3  8BCA  '..'
                  x28f5:	stosb				; 000028F5  AA  '.'
                  	add	di,bp			; 000028F6  03FD  '..'
                  	dec	di			; 000028F8  4F  'O'
                  	loop	x28f5			; 000028F9  E2FA  '..'
                  	pop	cx			; 000028FB  59  'Y'
                  	pop	di			; 000028FC  5F  '_'
                  x28fd:	push	dx			; 000028FD  52  'R'
                  	mov	dx,0x3c4		; 000028FE  BAC403  '...'
                  	mov	ah,bl			; 00002901  8AE3  '..'
                  	mov	al,0x2			; 00002903  B002  '..'
                  	out	dx,ax			; 00002905  EF  '.'
                  	pop	dx			; 00002906  5A  'Z'
                  	push	di			; 00002907  57  'W'
                  	push	bx			; 00002908  53  'S'
                  	push	cx			; 00002909  51  'Q'
                  	mov	bx,dx			; 0000290A  8BDA  '..'
                  	mov	cx,bp			; 0000290C  8BCD  '..'
                  x290e:	mov	al,[si]			; 0000290E  8A04  '..'
                  	mov	ah,[es:di]		; 00002910  268A25  '&.%'
                  	mov	[es:di],al		; 00002913  268805  '&..'
                  	inc	si			; 00002916  46  'F'
                  	add	di,cx			; 00002917  03F9  '..'
                  	dec	bx			; 00002919  4B  'K'
                  	jnz	x290e			; 0000291A  75F2  'u.'
                  	pop	cx			; 0000291C  59  'Y'
                  	pop	bx			; 0000291D  5B  '['
                  	sub	si,dx			; 0000291E  2BF2  '+.'
                  	pop	di			; 00002920  5F  '_'
                  	inc	di			; 00002921  47  'G'
                  	loop	x28d6			; 00002922  E2B2  '..'
                  	mov	dx,0x3ce		; 00002924  BACE03  '...'
                  	mov	ax,0x3			; 00002927  B80300  '...'
                  	out	dx,ax			; 0000292A  EF  '.'
                  	mov	dl,0xc4			; 0000292B  B2C4  '..'
                  	mov	ax,0xf02		; 0000292D  B8020F  '...'
                  	out	dx,ax			; 00002930  EF  '.'
                  	ret				; 00002931  C3  '.'
                  
                  	mul	byte [0x485]		; 00002932  F6268504  '.&..'
                  	push	ax			; 00002936  50  'P'
                  	push	bx			; 00002937  53  'S'
                  	mov	ax,[0x450]		; 00002938  A15004  '.P.'
                  	call	x26dd			; 0000293B  E89FFD  '...'
                  	mov	di,ax			; 0000293E  8BF8  '..'
                  	mov	dx,0xa000		; 00002940  BA00A0  '...'
                  	mov	es,dx			; 00002943  8EC2  '..'
                  	pop	bx			; 00002945  5B  '['
                  	pop	ax			; 00002946  58  'X'
                  	mov	dx,[0x485]		; 00002947  8B168504  '....'
                  	mov	bp,[0x44a]		; 0000294B  8B2E4A04  '..J.'
                  	lds	si,[0x10c]		; 0000294F  C5360C01  '.6..'
                  	add	si,ax			; 00002953  03F0  '..'
                  x2955:	push	bx			; 00002955  53  'S'
                  	push	cx			; 00002956  51  'Q'
                  	push	di			; 00002957  57  'W'
                  	push	si			; 00002958  56  'V'
                  	call	x2966			; 00002959  E80A00  '.',0x0A,'.'
                  	pop	si			; 0000295C  5E  '^'
                  	pop	di			; 0000295D  5F  '_'
                  	add	di,byte +0x8		; 0000295E  83C708  '...'
                  	pop	cx			; 00002961  59  'Y'
                  	pop	bx			; 00002962  5B  '['
                  	loop	x2955			; 00002963  E2F0  '..'
                  	ret				; 00002965  C3  '.'
                  
                  x2966:	push	dx			; 00002966  52  'R'
                  	push	bp			; 00002967  55  'U'
                  	shl	bp,1			; 00002968  D1E5  '..'
                  	shl	bp,1			; 0000296A  D1E5  '..'
                  	shl	bp,1			; 0000296C  D1E5  '..'
                  	cld				; 0000296E  FC  '.'
                  x296f:	lodsb				; 0000296F  AC  '.'
                  	mov	ah,al			; 00002970  8AE0  '..'
                  	push	di			; 00002972  57  'W'
                  	mov	cx,0x8			; 00002973  B90800  '...'
                  x2976:	mov	al,bl			; 00002976  8AC3  '..'
                  	shl	ah,1			; 00002978  D0E4  '..'
                  	jc	x297e			; 0000297A  7202  'r.'
                  	mov	al,bh			; 0000297C  8AC7  '..'
                  x297e:	stosb				; 0000297E  AA  '.'
                  	loop	x2976			; 0000297F  E2F5  '..'
                  	pop	di			; 00002981  5F  '_'
                  	add	di,bp			; 00002982  03FD  '..'
                  	dec	dx			; 00002984  4A  'J'
                  	jnz	x296f			; 00002985  75E8  'u.'
                  	pop	bp			; 00002987  5D  ']'
                  	pop	dx			; 00002988  5A  'Z'
                  	ret				; 00002989  C3  '.'
                  
                  	call	x2990			; 0000298A  E80300  '...'
                  	jmp	x713			; 0000298D  E983DD  '...'
                  
                  x2990:	mov	ah,[0x449]		; 00002990  8A264904  '.&I.'
                  	mov	si,ax			; 00002994  8BF0  '..'
                  	shr	si,1			; 00002996  D1EE  '..'
                  	shr	si,1			; 00002998  D1EE  '..'
                  	shr	si,1			; 0000299A  D1EE  '..'
                  	shr	si,1			; 0000299C  D1EE  '..'
                  	shr	si,1			; 0000299E  D1EE  '..'
                  	shr	si,1			; 000029A0  D1EE  '..'
                  	shr	si,1			; 000029A2  D1EE  '..'
                  	shr	si,1			; 000029A4  D1EE  '..'
                  	shl	si,1			; 000029A6  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 000029A8  2E8BB49012  '.....'
                  	shl	si,1			; 000029AD  D1E6  '..'
                  	cmp	si,0xa			; 000029AF  81FE0A00  '..',0x0A,'.'
                  	jnc	x29ba			; 000029B3  7305  's.'
                  	call	near [cs:si+0x29bb]	; 000029B5  2EFF94BB29  '....)'
                  x29ba:	ret				; 000029BA  C3  '.'
                  
                  	mov	dx,0xc529		; 000029BB  BA29C5  '.).'
                  	sub	[bp+di+0x9a27],bp	; 000029BE  29AB279A  ').',0x27,'.'
                  	sub	[bp+si],dh		; 000029C2  2832  '(2'
                  	sub	ax,bp			; 000029C4  29E8  ').'
                  	push	di			; 000029C6  57  'W'
                  	add	[bx+si+0x51],dl		; 000029C7  005051  '.PQ'
                  	xor	ch,ch			; 000029CA  32ED  '2.'
                  	mov	cl,bh			; 000029CC  8ACF  '..'
                  	mov	di,cx			; 000029CE  8BF9  '..'
                  	shl	di,1			; 000029D0  D1E7  '..'
                  	mov	ax,[di+0x450]		; 000029D2  8B855004  '..P.'
                  	mov	bx,[0x44c]		; 000029D6  8B1E4C04  '..L.'
                  	mov	dx,[0x44a]		; 000029DA  8B164A04  '..J.'
                  	call	x2562			; 000029DE  E881FB  '...'
                  	pop	cx			; 000029E1  59  'Y'
                  	pop	bx			; 000029E2  5B  '['
                  	mov	dx,[0x463]		; 000029E3  8B166304  '..c.'
                  	add	dx,byte +0x6		; 000029E7  83C206  '...'
                  x29ea:	test	byte [0x487],0x4	; 000029EA  F606870404  '.....'
                  	jz	x29fc			; 000029EF  740B  't.'
                  x29f1:	in	al,dx			; 000029F1  EC  '.'
                  	test	al,0x1			; 000029F2  A801  '..'
                  	jnz	x29f1			; 000029F4  75FB  'u.'
                  	cli				; 000029F6  FA  '.'
                  x29f7:	in	al,dx			; 000029F7  EC  '.'
                  	test	al,0x1			; 000029F8  A801  '..'
                  	jz	x29f7			; 000029FA  74FB  't.'
                  x29fc:	mov	al,bl			; 000029FC  8AC3  '..'
                  	stosb				; 000029FE  AA  '.'
                  	sti				; 000029FF  FB  '.'
                  	inc	di			; 00002A00  47  'G'
                  	loop	x29ea			; 00002A01  E2E7  '..'
                  	ret				; 00002A03  C3  '.'
                  
                  x2a04:	cld				; 00002A04  FC  '.'
                  	push	ss			; 00002A05  16  '.'
                  	pop	ds			; 00002A06  1F  '.'
                  	mov	si,bp			; 00002A07  8BF5  '..'
                  x2a09:	push	si			; 00002A09  56  'V'
                  	push	di			; 00002A0A  57  'W'
                  	mov	cx,bx			; 00002A0B  8BCB  '..'
                  	repe	cmpsb			; 00002A0D  F3A6  '..'
                  	pop	di			; 00002A0F  5F  '_'
                  	pop	si			; 00002A10  5E  '^'
                  	jz	x2a1d			; 00002A11  740A  't',0x0A
                  	inc	ax			; 00002A13  40  '@'
                  	add	di,bx			; 00002A14  03FB  '..'
                  	dec	dx			; 00002A16  4A  'J'
                  	jnz	x2a09			; 00002A17  75F0  'u.'
                  	sub	ax,ax			; 00002A19  2BC0  '+.'
                  	clc				; 00002A1B  F8  '.'
                  	ret				; 00002A1C  C3  '.'
                  
                  x2a1d:	stc				; 00002A1D  F9  '.'
                  	ret				; 00002A1E  C3  '.'
                  
                  x2a1f:	mov	si,0xb800		; 00002A1F  BE00B8  '...'
                  	mov	di,[0x410]		; 00002A22  8B3E1004  '.>..'
                  	and	di,0x30			; 00002A26  81E73000  '..0.'
                  	cmp	di,byte +0x30		; 00002A2A  83FF30  '..0'
                  	jnz	x2a32			; 00002A2D  7503  'u.'
                  	mov	si,0xb000		; 00002A2F  BE00B0  '...'
                  x2a32:	mov	es,si			; 00002A32  8EC6  '..'
                  	ret				; 00002A34  C3  '.'
                  
                  	test	[es:bp+di+0x14],ecx	; 00002A35  6626854B14  'f&.K.'
                  	push	cs			; 00002A3A  0E  '.'
                  	cmp	byte [0x463],0xb4	; 00002A3B  803E6304B4  '.>c..'
                  	jz	x2a4b			; 00002A40  7409  't.'
                  	test	byte [0x487],0x8	; 00002A42  F606870408  '.....'
                  	jz	x2a4e			; 00002A47  7405  't.'
                  	int	0x42			; 00002A49  CD42  '.B'
                  x2a4b:	jmp	x713			; 00002A4B  E9C5DC  '...'
                  
                  x2a4e:	xor	bp,bp			; 00002A4E  33ED  '3.'
                  	les	di,[0x4a8]		; 00002A50  C43EA804  '.>..'
                  	add	di,byte +0x4		; 00002A54  83C704  '...'
                  	les	di,[es:di]		; 00002A57  26C43D  '&.='
                  	mov	ax,es			; 00002A5A  8CC0  '..'
                  	or	ax,di			; 00002A5C  0BC7  '..'
                  	jz	x2a61			; 00002A5E  7401  't.'
                  	inc	bp			; 00002A60  45  'E'
                  x2a61:	call	x2b77			; 00002A61  E81301  '...'
                  	or	bh,bh			; 00002A64  0AFF  0x0A,'.'
                  	jnz	x2abd			; 00002A66  7555  'uU'
                  	mov	bh,bl			; 00002A68  8AFB  '..'
                  	mov	al,[0x466]		; 00002A6A  A06604  '.f.'
                  	and	al,0xe0			; 00002A6D  24E0  '$.'
                  	and	bl,0x1f			; 00002A6F  80E31F  '...'
                  	or	al,bl			; 00002A72  0AC3  0x0A,'.'
                  	mov	[0x466],al		; 00002A74  A26604  '.f.'
                  	mov	bl,bh			; 00002A77  8ADF  '..'
                  	mov	ch,al			; 00002A79  8AE8  '..'
                  	and	bl,0xf			; 00002A7B  80E30F  '...'
                  	mov	bh,bl			; 00002A7E  8AFB  '..'
                  	shl	bl,1			; 00002A80  D0E3  '..'
                  	and	bl,0x10			; 00002A82  80E310  '...'
                  	and	bh,0x7			; 00002A85  80E707  '...'
                  	or	bl,bh			; 00002A88  0ADF  0x0A,'.'
                  	cmp	byte [0x449],0x3	; 00002A8A  803E490403  '.>I..'
                  	jna	x2aa2			; 00002A8F  7611  'v.'
                  	mov	ah,0x0			; 00002A91  B400  '..'
                  	mov	al,bl			; 00002A93  8AC3  '..'
                  	call	x722			; 00002A95  E88ADC  '...'
                  	call	x2b30			; 00002A98  E89500  '...'
                  	or	bp,bp			; 00002A9B  0BED  '..'
                  	jz	x2aa2			; 00002A9D  7403  't.'
                  	mov	[es:di],bl		; 00002A9F  26881D  '&..'
                  x2aa2:	mov	ah,0x11			; 00002AA2  B411  '..'
                  	mov	al,bl			; 00002AA4  8AC3  '..'
                  	call	x722			; 00002AA6  E879DC  '.y.'
                  	call	x2b30			; 00002AA9  E88400  '...'
                  	or	bp,bp			; 00002AAC  0BED  '..'
                  	jz	x2ab4			; 00002AAE  7404  't.'
                  	mov	[es:di+0x10],bl		; 00002AB0  26885D10  '&.].'
                  x2ab4:	mov	bl,ch			; 00002AB4  8ADD  '..'
                  	and	bl,0x20			; 00002AB6  80E320  '.. '
                  	mov	cl,0x5			; 00002AB9  B105  '..'
                  	shr	bl,cl			; 00002ABB  D2EB  '..'
                  x2abd:	cmp	byte [0x449],0x3	; 00002ABD  803E490403  '.>I..'
                  	jna	x2b17			; 00002AC2  7653  'vS'
                  	mov	al,[0x466]		; 00002AC4  A06604  '.f.'
                  	and	al,0xdf			; 00002AC7  24DF  '$.'
                  	and	bl,0x1			; 00002AC9  80E301  '...'
                  	jz	x2ad0			; 00002ACC  7402  't.'
                  	or	al,0x20			; 00002ACE  0C20  '. '
                  x2ad0:	mov	[0x466],al		; 00002AD0  A26604  '.f.'
                  	and	al,0x10			; 00002AD3  2410  '$.'
                  	or	al,0x2			; 00002AD5  0C02  '..'
                  	or	bl,al			; 00002AD7  0AD8  0x0A,'.'
                  	mov	ah,0x1			; 00002AD9  B401  '..'
                  	mov	al,bl			; 00002ADB  8AC3  '..'
                  	call	x722			; 00002ADD  E842DC  '.B.'
                  	call	x2b30			; 00002AE0  E84D00  '.M.'
                  	or	bp,bp			; 00002AE3  0BED  '..'
                  	jz	x2aeb			; 00002AE5  7404  't.'
                  	mov	[es:di+0x1],bl		; 00002AE7  26885D01  '&.].'
                  x2aeb:	inc	bl			; 00002AEB  FEC3  '..'
                  	inc	bl			; 00002AED  FEC3  '..'
                  	mov	ah,0x2			; 00002AEF  B402  '..'
                  	mov	al,bl			; 00002AF1  8AC3  '..'
                  	call	x722			; 00002AF3  E82CDC  '.,.'
                  	call	x2b30			; 00002AF6  E83700  '.7.'
                  	or	bp,bp			; 00002AF9  0BED  '..'
                  	jz	x2b01			; 00002AFB  7404  't.'
                  	mov	[es:di+0x2],bl		; 00002AFD  26885D02  '&.].'
                  x2b01:	inc	bl			; 00002B01  FEC3  '..'
                  	inc	bl			; 00002B03  FEC3  '..'
                  	mov	ah,0x3			; 00002B05  B403  '..'
                  	mov	al,bl			; 00002B07  8AC3  '..'
                  	call	x722			; 00002B09  E816DC  '...'
                  	call	x2b30			; 00002B0C  E82100  '.!.'
                  	or	bp,bp			; 00002B0F  0BED  '..'
                  	jz	x2b17			; 00002B11  7404  't.'
                  	mov	[es:di+0x3],bl		; 00002B13  26885D03  '&.].'
                  x2b17:	call	x2b6e			; 00002B17  E85400  '.T.'
                  	jmp	x713			; 00002B1A  E9F6DB  '...'
                  
                  x2b1d:	push	cx			; 00002B1D  51  'Q'
                  	xor	cx,cx			; 00002B1E  33C9  '3.'
                  	mov	ah,0x5			; 00002B20  B405  '..'
                  x2b22:	in	al,dx			; 00002B22  EC  '.'
                  	test	al,0x8			; 00002B23  A808  '..'
                  	jnz	x2b2e			; 00002B25  7507  'u.'
                  	loop	x2b22			; 00002B27  E2F9  '..'
                  	dec	ah			; 00002B29  FECC  '..'
                  	jnz	x2b22			; 00002B2B  75F5  'u.'
                  	stc				; 00002B2D  F9  '.'
                  x2b2e:	pop	cx			; 00002B2E  59  'Y'
                  	ret				; 00002B2F  C3  '.'
                  
                  x2b30:	push	dx			; 00002B30  52  'R'
                  	push	bx			; 00002B31  53  'S'
                  	mov	bx,ax			; 00002B32  8BD8  '..'
                  	call	x2b1d			; 00002B34  E8E6FF  '...'
                  	pushf				; 00002B37  9C  '.'
                  	cli				; 00002B38  FA  '.'
                  	in	al,dx			; 00002B39  EC  '.'
                  	mov	dl,0xc0			; 00002B3A  B2C0  '..'
                  	mov	ax,bx			; 00002B3C  8BC3  '..'
                  	xchg	al,ah			; 00002B3E  86C4  '..'
                  	out	dx,al			; 00002B40  EE  '.'
                  	xchg	al,ah			; 00002B41  86C4  '..'
                  	out	dx,al			; 00002B43  EE  '.'
                  	mov	al,0x20			; 00002B44  B020  '. '
                  	out	dx,al			; 00002B46  EE  '.'
                  	popf				; 00002B47  9D  '.'
                  	pop	bx			; 00002B48  5B  '['
                  	pop	dx			; 00002B49  5A  'Z'
                  	ret				; 00002B4A  C3  '.'
                  
                  x2b4b:	push	dx			; 00002B4B  52  'R'
                  	push	bx			; 00002B4C  53  'S'
                  	mov	bx,ax			; 00002B4D  8BD8  '..'
                  	call	x2b1d			; 00002B4F  E8CBFF  '...'
                  	pushf				; 00002B52  9C  '.'
                  	cli				; 00002B53  FA  '.'
                  	in	al,dx			; 00002B54  EC  '.'
                  	push	dx			; 00002B55  52  'R'
                  	mov	ax,bx			; 00002B56  8BC3  '..'
                  	mov	dl,0xc0			; 00002B58  B2C0  '..'
                  	out	dx,al			; 00002B5A  EE  '.'
                  	inc	dx			; 00002B5B  42  'B'
                  	jmp	short x2b5e		; 00002B5C  EB00  '..'
                  
                  x2b5e:	in	al,dx			; 00002B5E  EC  '.'
                  	mov	ah,al			; 00002B5F  8AE0  '..'
                  	pop	dx			; 00002B61  5A  'Z'
                  	in	al,dx			; 00002B62  EC  '.'
                  	jmp	short x2b65		; 00002B63  EB00  '..'
                  
                  x2b65:	mov	dl,0xc0			; 00002B65  B2C0  '..'
                  	mov	al,0x20			; 00002B67  B020  '. '
                  	out	dx,al			; 00002B69  EE  '.'
                  	popf				; 00002B6A  9D  '.'
                  	pop	bx			; 00002B6B  5B  '['
                  	pop	dx			; 00002B6C  5A  'Z'
                  	ret				; 00002B6D  C3  '.'
                  
                  x2b6e:	call	x2b77			; 00002B6E  E80600  '...'
                  	mov	dl,0xc0			; 00002B71  B2C0  '..'
                  	mov	al,0x20			; 00002B73  B020  '. '
                  	out	dx,al			; 00002B75  EE  '.'
                  	ret				; 00002B76  C3  '.'
                  
                  x2b77:	call	x722			; 00002B77  E8A8DB  '...'
                  	in	al,dx			; 00002B7A  EC  '.'
                  	ret				; 00002B7B  C3  '.'
                  
                  	ret				; 00002B7C  C3  '.'
                  
                  	sub	di,bp			; 00002B7D  2BFD  '+.'
                  	sub	bp,[di]			; 00002B7F  2B2D  '+-'
                  	sub	al,0x67			; 00002B81  2C67  ',g'
                  	sub	al,0x13			; 00002B83  2C13  ',.'
                  	pop	es			; 00002B85  07  '.'
                  	adc	ax,[bx]			; 00002B86  1307  '..'
                  	adc	ax,[bx]			; 00002B88  1307  '..'
                  	wait				; 00002B8A  9B  '.'
                  	sub	al,0xa8			; 00002B8B  2CA8  ',.'
                  	sub	al,0xb5			; 00002B8D  2CB5  ',.'
                  	sub	al,0x13			; 00002B8F  2C13  ',.'
                  	pop	es			; 00002B91  07  '.'
                  	adc	ax,[bx]			; 00002B92  1307  '..'
                  	adc	ax,[bx]			; 00002B94  1307  '..'
                  	adc	ax,[bx]			; 00002B96  1307  '..'
                  	adc	ax,[bx]			; 00002B98  1307  '..'
                  	adc	ax,[bx]			; 00002B9A  1307  '..'
                  	ret	0x132c			; 00002B9C  C22C13  '.,.'
                  
                  	pop	es			; 00002B9F  07  '.'
                  	fisubr	dword [si]		; 00002BA0  DA2C  '.,'
                  	imul	word [si]		; 00002BA2  F72C  '.,'
                  	adc	ax,[bx]			; 00002BA4  1307  '..'
                  	cmp	ch,[di]			; 00002BA6  3A2D  ':-'
                  	adc	ax,[bx]			; 00002BA8  1307  '..'
                  	dec	si			; 00002BAA  4E  'N'
                  	sub	ax,0x2d62		; 00002BAB  2D622D  '-b-'
                  	imul	bp,[di],byte +0x7c	; 00002BAE  6B2D7C  'k-|'
                  	sub	ax,0x2da9		; 00002BB1  2DA92D  '-.-'
                  	cbw				; 00002BB4  98  '.'
                  	mov	si,ax			; 00002BB5  8BF0  '..'
                  	shl	si,1			; 00002BB7  D1E6  '..'
                  	cmp	si,byte +0x38		; 00002BB9  83FE38  '..8'
                  	jnc	x2bfa			; 00002BBC  733C  's<'
                  	jmp	near [cs:si+0x2b7c]	; 00002BBE  2EFFA47C2B  '...|+'
                  
                  	cmp	byte [0x449],0x13	; 00002BC3  803E490413  '.>I..'
                  	jz	x2bfa			; 00002BC8  7430  't0'
                  	xor	bp,bp			; 00002BCA  33ED  '3.'
                  	les	di,[0x4a8]		; 00002BCC  C43EA804  '.>..'
                  	add	di,byte +0x4		; 00002BD0  83C704  '...'
                  	les	di,[es:di]		; 00002BD3  26C43D  '&.='
                  	mov	ax,es			; 00002BD6  8CC0  '..'
                  	or	ax,di			; 00002BD8  0BC7  '..'
                  	jz	x2bdd			; 00002BDA  7401  't.'
                  	inc	bp			; 00002BDC  45  'E'
                  x2bdd:	call	x2b77			; 00002BDD  E897FF  '...'
                  	mov	ah,bl			; 00002BE0  8AE3  '..'
                  	mov	al,bh			; 00002BE2  8AC7  '..'
                  	call	x722			; 00002BE4  E83BDB  '.;.'
                  	call	x2b30			; 00002BE7  E846FF  '.F.'
                  	call	x2b6e			; 00002BEA  E881FF  '...'
                  	or	bp,bp			; 00002BED  0BED  '..'
                  	jz	x2bfa			; 00002BEF  7409  't.'
                  	mov	al,bh			; 00002BF1  8AC7  '..'
                  	sub	bh,bh			; 00002BF3  2AFF  '*.'
                  	add	di,bx			; 00002BF5  03FB  '..'
                  	mov	[es:di],al		; 00002BF7  268805  '&..'
                  x2bfa:	jmp	x713			; 00002BFA  E916DB  '...'
                  
                  	xor	bp,bp			; 00002BFD  33ED  '3.'
                  	les	di,[0x4a8]		; 00002BFF  C43EA804  '.>..'
                  	add	di,byte +0x4		; 00002C03  83C704  '...'
                  	les	di,[es:di]		; 00002C06  26C43D  '&.='
                  	mov	ax,es			; 00002C09  8CC0  '..'
                  	or	ax,di			; 00002C0B  0BC7  '..'
                  	jz	x2c10			; 00002C0D  7401  't.'
                  	inc	bp			; 00002C0F  45  'E'
                  x2c10:	call	x2b77			; 00002C10  E864FF  '.d.'
                  	mov	ah,0x11			; 00002C13  B411  '..'
                  	mov	al,bh			; 00002C15  8AC7  '..'
                  	call	x722			; 00002C17  E808DB  '...'
                  	call	x2b30			; 00002C1A  E813FF  '...'
                  	call	x2b6e			; 00002C1D  E84EFF  '.N.'
                  	or	bp,bp			; 00002C20  0BED  '..'
                  	jz	x2c2a			; 00002C22  7406  't.'
                  	add	di,byte +0x11		; 00002C24  83C711  '...'
                  	mov	[es:di],bh		; 00002C27  26883D  '&.='
                  x2c2a:	jmp	x713			; 00002C2A  E9E6DA  '...'
                  
                  	cmp	byte [0x449],0x13	; 00002C2D  803E490413  '.>I..'
                  	jz	x2c64			; 00002C32  7430  't0'
                  	push	ds			; 00002C34  1E  '.'
                  	push	es			; 00002C35  06  '.'
                  	les	di,[0x4a8]		; 00002C36  C43EA804  '.>..'
                  	add	di,byte +0x4		; 00002C3A  83C704  '...'
                  	les	di,[es:di]		; 00002C3D  26C43D  '&.='
                  	mov	ax,es			; 00002C40  8CC0  '..'
                  	or	ax,di			; 00002C42  0BC7  '..'
                  	jz	x2c4f			; 00002C44  7409  't.'
                  	pop	ds			; 00002C46  1F  '.'
                  	push	ds			; 00002C47  1E  '.'
                  	mov	si,dx			; 00002C48  8BF2  '..'
                  	mov	cx,0x11			; 00002C4A  B91100  '...'
                  	rep	movsb			; 00002C4D  F3A4  '..'
                  x2c4f:	pop	es			; 00002C4F  07  '.'
                  	pop	ds			; 00002C50  1F  '.'
                  	mov	bx,dx			; 00002C51  8BDA  '..'
                  	mov	di,0x0			; 00002C53  BF0000  '...'
                  	mov	cx,0x11			; 00002C56  B91100  '...'
                  	xor	bp,bp			; 00002C59  33ED  '3.'
                  	call	x722			; 00002C5B  E8C4DA  '...'
                  	call	x2f11			; 00002C5E  E8B002  '...'
                  	call	x2b6e			; 00002C61  E80AFF  '.',0x0A,'.'
                  x2c64:	jmp	x713			; 00002C64  E9ACDA  '...'
                  
                  	cli				; 00002C67  FA  '.'
                  	call	x2b77			; 00002C68  E80CFF  '...'
                  	mov	dx,0x3c0		; 00002C6B  BAC003  '...'
                  	mov	al,0x10			; 00002C6E  B010  '..'
                  	out	dx,al			; 00002C70  EE  '.'
                  	inc	dx			; 00002C71  42  'B'
                  	in	al,dx			; 00002C72  EC  '.'
                  	sti				; 00002C73  FB  '.'
                  	or	bl,bl			; 00002C74  0ADB  0x0A,'.'
                  	jnz	x2c82			; 00002C76  750A  'u',0x0A
                  	and	byte [0x465],0xdf	; 00002C78  80266504DF  '.&e..'
                  	and	al,0xf7			; 00002C7D  24F7  '$.'
                  	jmp	short x2c8d		; 00002C7F  EB0C  '..'
                  
                  	nop				; 00002C81  90  '.'
                  x2c82:	dec	bl			; 00002C82  FECB  '..'
                  	jnz	x2c8d			; 00002C84  7507  'u.'
                  	or	byte [0x465],0x20	; 00002C86  800E650420  '..e. '
                  	or	al,0x8			; 00002C8B  0C08  '..'
                  x2c8d:	mov	ah,0x10			; 00002C8D  B410  '..'
                  	call	x722			; 00002C8F  E890DA  '...'
                  	call	x2b30			; 00002C92  E89BFE  '...'
                  	call	x2b6e			; 00002C95  E8D6FE  '...'
                  	jmp	x713			; 00002C98  E978DA  '.x.'
                  
                  	mov	al,bl			; 00002C9B  8AC3  '..'
                  	call	x722			; 00002C9D  E882DA  '...'
                  	call	x2b4b			; 00002CA0  E8A8FE  '...'
                  	mov	bh,ah			; 00002CA3  8AFC  '..'
                  	jmp	x2d73			; 00002CA5  E9CB00  '...'
                  
                  	mov	al,0x11			; 00002CA8  B011  '..'
                  	call	x722			; 00002CAA  E875DA  '.u.'
                  	call	x2b4b			; 00002CAD  E89BFE  '...'
                  	mov	bh,ah			; 00002CB0  8AFC  '..'
                  	jmp	x2d73			; 00002CB2  E9BE00  '...'
                  
                  	mov	bx,dx			; 00002CB5  8BDA  '..'
                  	call	x722			; 00002CB7  E868DA  '.h.'
                  	xor	bp,bp			; 00002CBA  33ED  '3.'
                  	call	x2f3c			; 00002CBC  E87D02  '.}.'
                  	jmp	x713			; 00002CBF  E951DA  '.Q.'
                  
                  	test	byte [0x489],0x6	; 00002CC2  F606890406  '.....'
                  	jz	x2ccc			; 00002CC7  7403  't.'
                  	call	x2df0			; 00002CC9  E82401  '.$.'
                  x2ccc:	push	dx			; 00002CCC  52  'R'
                  	call	x722			; 00002CCD  E852DA  '.R.'
                  	call	x2b1d			; 00002CD0  E84AFE  '.J.'
                  	pop	dx			; 00002CD3  5A  'Z'
                  	call	x2e34			; 00002CD4  E85D01  '.].'
                  	jmp	x713			; 00002CD7  E939DA  '.9.'
                  
                  	mov	di,bx			; 00002CDA  8BFB  '..'
                  	mov	bx,dx			; 00002CDC  8BDA  '..'
                  	mov	ah,0x20			; 00002CDE  B420  '. '
                  	call	x127a			; 00002CE0  E897E5  '...'
                  	mov	dl,[0x489]		; 00002CE3  8A168904  '....'
                  	and	dl,0x6			; 00002CE7  80E206  '...'
                  	shr	dl,1			; 00002CEA  D0EA  '..'
                  	push	ax			; 00002CEC  50  'P'
                  	call	x2ed3			; 00002CED  E8E301  '...'
                  	pop	ax			; 00002CF0  58  'X'
                  	call	x127a			; 00002CF1  E886E5  '...'
                  	jmp	x713			; 00002CF4  E91CDA  '...'
                  
                  	mov	al,0x10			; 00002CF7  B010  '..'
                  	call	x722			; 00002CF9  E826DA  '.&.'
                  	call	x2b4b			; 00002CFC  E84CFE  '.L.'
                  	or	bl,bl			; 00002CFF  0ADB  0x0A,'.'
                  	jnz	x2d1b			; 00002D01  7518  'u.'
                  	mov	al,ah			; 00002D03  8AC4  '..'
                  	or	al,0x80			; 00002D05  0C80  '..'
                  	or	bh,bh			; 00002D07  0AFF  0x0A,'.'
                  	jnz	x2d0d			; 00002D09  7502  'u.'
                  	and	al,0x7f			; 00002D0B  247F  '$.'
                  x2d0d:	mov	ah,0x10			; 00002D0D  B410  '..'
                  	call	x722			; 00002D0F  E810DA  '...'
                  	call	x2b30			; 00002D12  E81BFE  '...'
                  	call	x2b6e			; 00002D15  E856FE  '.V.'
                  	jmp	x713			; 00002D18  E9F8D9  '...'
                  
                  x2d1b:	mov	al,bh			; 00002D1B  8AC7  '..'
                  	test	ah,0x80			; 00002D1D  F6C480  '...'
                  	jnz	x2d2a			; 00002D20  7508  'u.'
                  	and	al,0x3			; 00002D22  2403  '$.'
                  	shl	al,1			; 00002D24  D0E0  '..'
                  	shl	al,1			; 00002D26  D0E0  '..'
                  	jmp	short x2d2c		; 00002D28  EB02  '..'
                  
                  x2d2a:	and	al,0xf			; 00002D2A  240F  '$.'
                  x2d2c:	mov	ah,0x14			; 00002D2C  B414  '..'
                  	call	x722			; 00002D2E  E8F1D9  '...'
                  	call	x2b30			; 00002D31  E8FCFD  '...'
                  	call	x2b6e			; 00002D34  E837FE  '.7.'
                  	jmp	x713			; 00002D37  E9D9D9  '...'
                  
                  	call	x722			; 00002D3A  E8E5D9  '...'
                  	call	x2b1d			; 00002D3D  E8DDFD  '...'
                  	call	x2dca			; 00002D40  E88700  '...'
                  	pop	di			; 00002D43  5F  '_'
                  	pop	si			; 00002D44  5E  '^'
                  	pop	bx			; 00002D45  5B  '['
                  	pop	ax			; 00002D46  58  'X'
                  	pop	ax			; 00002D47  58  'X'
                  	mov	dl,al			; 00002D48  8AD0  '..'
                  	pop	ds			; 00002D4A  1F  '.'
                  	pop	es			; 00002D4B  07  '.'
                  	pop	bp			; 00002D4C  5D  ']'
                  	iret				; 00002D4D  CF  '.'
                  
                  	mov	di,bx			; 00002D4E  8BFB  '..'
                  	mov	bx,dx			; 00002D50  8BDA  '..'
                  	mov	ah,0x20			; 00002D52  B420  '. '
                  	call	x127a			; 00002D54  E823E5  '.#.'
                  	push	ax			; 00002D57  50  'P'
                  	call	x2ef8			; 00002D58  E89D01  '...'
                  	pop	ax			; 00002D5B  58  'X'
                  	call	x127a			; 00002D5C  E81BE5  '...'
                  	jmp	x713			; 00002D5F  E9B1D9  '...'
                  
                  	mov	dx,0x3c6		; 00002D62  BAC603  '...'
                  	mov	ax,bx			; 00002D65  8BC3  '..'
                  	out	dx,al			; 00002D67  EE  '.'
                  	jmp	x713			; 00002D68  E9A8D9  '...'
                  
                  	mov	dx,0x3c6		; 00002D6B  BAC603  '...'
                  	in	al,dx			; 00002D6E  EC  '.'
                  	xor	ah,ah			; 00002D6F  32E4  '2.'
                  	mov	bx,ax			; 00002D71  8BD8  '..'
                  x2d73:	pop	di			; 00002D73  5F  '_'
                  	pop	si			; 00002D74  5E  '^'
                  	pop	ax			; 00002D75  58  'X'
                  	pop	cx			; 00002D76  59  'Y'
                  	pop	dx			; 00002D77  5A  'Z'
                  	pop	ds			; 00002D78  1F  '.'
                  	pop	es			; 00002D79  07  '.'
                  	pop	bp			; 00002D7A  5D  ']'
                  	iret				; 00002D7B  CF  '.'
                  
                  	call	x722			; 00002D7C  E8A3D9  '...'
                  	mov	al,0x10			; 00002D7F  B010  '..'
                  	call	x2b4b			; 00002D81  E8C7FD  '...'
                  	mov	bl,ah			; 00002D84  8ADC  '..'
                  	and	bl,0x80			; 00002D86  80E380  '...'
                  	mov	cl,0x7			; 00002D89  B107  '..'
                  	shr	bl,cl			; 00002D8B  D2EB  '..'
                  	mov	al,0x14			; 00002D8D  B014  '..'
                  	call	x722			; 00002D8F  E890D9  '...'
                  	call	x2b4b			; 00002D92  E8B6FD  '...'
                  	mov	bh,ah			; 00002D95  8AFC  '..'
                  	or	bl,bl			; 00002D97  0ADB  0x0A,'.'
                  	jnz	x2da4			; 00002D99  7509  'u.'
                  	and	bh,0xc			; 00002D9B  80E70C  '...'
                  	shr	bh,1			; 00002D9E  D0EF  '..'
                  	shr	bh,1			; 00002DA0  D0EF  '..'
                  	jmp	short x2d73		; 00002DA2  EBCF  '..'
                  
                  x2da4:	and	bh,0xf			; 00002DA4  80E70F  '...'
                  	jmp	short x2d73		; 00002DA7  EBCA  '..'
                  	mov	ah,0x20			; 00002DA9  B420  '. '
                  
                  	call	x127a			; 00002DAB  E8CCE4  '...'
                  	push	ax			; 00002DAE  50  'P'
                  	call	x2db9			; 00002DAF  E80700  '...'
                  	pop	ax			; 00002DB2  58  'X'
                  	call	x127a			; 00002DB3  E8C4E4  '...'
                  	jmp	x713			; 00002DB6  E95AD9  '.Z.'
                  
                  x2db9:	push	cx			; 00002DB9  51  'Q'
                  	push	bx			; 00002DBA  53  'S'
                  	call	x2dca			; 00002DBB  E80C00  '...'
                  	call	x2df0			; 00002DBE  E82F00  './.'
                  	call	x2e34			; 00002DC1  E87000  '.p.'
                  	pop	bx			; 00002DC4  5B  '['
                  	inc	bx			; 00002DC5  43  'C'
                  	pop	cx			; 00002DC6  59  'Y'
                  	loop	x2db9			; 00002DC7  E2F0  '..'
                  	ret				; 00002DC9  C3  '.'
                  
                  x2dca:	mov	dx,0x3c7		; 00002DCA  BAC703  '...'
                  	mov	al,bl			; 00002DCD  8AC3  '..'
                  	out	dx,al			; 00002DCF  EE  '.'
                  	mov	dx,0x3c9		; 00002DD0  BAC903  '...'
                  	pushf				; 00002DD3  9C  '.'
                  	jmp	short x2dd6		; 00002DD4  EB00  '..'
                  
                  x2dd6:	cli				; 00002DD6  FA  '.'
                  	in	al,dx			; 00002DD7  EC  '.'
                  	jmp	short x2dda		; 00002DD8  EB00  '..'
                  
                  x2dda:	and	al,0x3f			; 00002DDA  243F  '$?'
                  	mov	ah,al			; 00002DDC  8AE0  '..'
                  	in	al,dx			; 00002DDE  EC  '.'
                  	jmp	short x2de1		; 00002DDF  EB00  '..'
                  
                  x2de1:	and	al,0x3f			; 00002DE1  243F  '$?'
                  	mov	ch,al			; 00002DE3  8AE8  '..'
                  	in	al,dx			; 00002DE5  EC  '.'
                  	popf				; 00002DE6  9D  '.'
                  	and	al,0x3f			; 00002DE7  243F  '$?'
                  	mov	cl,al			; 00002DE9  8AC8  '..'
                  	mov	dh,ah			; 00002DEB  8AF4  '..'
                  	xor	dl,dl			; 00002DED  32D2  '2.'
                  	ret				; 00002DEF  C3  '.'
                  
                  x2df0:	push	bx			; 00002DF0  53  'S'
                  	mov	al,dh			; 00002DF1  8AC6  '..'
                  	push	ax			; 00002DF3  50  'P'
                  	mov	al,ch			; 00002DF4  8AC5  '..'
                  	push	ax			; 00002DF6  50  'P'
                  	mov	al,cl			; 00002DF7  8AC1  '..'
                  	and	ax,0x3f			; 00002DF9  253F00  '%?.'
                  	xor	bx,bx			; 00002DFC  33DB  '3.'
                  	xor	cx,cx			; 00002DFE  33C9  '3.'
                  	mul	word [cs:0x2a39]	; 00002E00  2EF726392A  '..&9*'
                  	add	bx,ax			; 00002E05  03D8  '..'
                  	adc	cx,dx			; 00002E07  13CA  '..'
                  	pop	ax			; 00002E09  58  'X'
                  	and	ax,0x3f			; 00002E0A  253F00  '%?.'
                  	mul	word [cs:0x2a37]	; 00002E0D  2EF726372A  '..&7*'
                  	add	bx,ax			; 00002E12  03D8  '..'
                  	adc	cx,dx			; 00002E14  13CA  '..'
                  	pop	ax			; 00002E16  58  'X'
                  	and	ax,0x3f			; 00002E17  253F00  '%?.'
                  	mul	word [cs:0x2a35]	; 00002E1A  2EF726352A  '..&5*'
                  	add	bx,ax			; 00002E1F  03D8  '..'
                  	adc	cx,dx			; 00002E21  13CA  '..'
                  	add	bx,bx			; 00002E23  03DB  '..'
                  	adc	cx,cx			; 00002E25  13C9  '..'
                  	add	bx,0x8000		; 00002E27  81C30080  '....'
                  	adc	cx,byte +0x0		; 00002E2B  83D100  '...'
                  	mov	dh,cl			; 00002E2E  8AF1  '..'
                  	mov	ch,cl			; 00002E30  8AE9  '..'
                  	pop	bx			; 00002E32  5B  '['
                  	ret				; 00002E33  C3  '.'
                  
                  x2e34:	push	dx			; 00002E34  52  'R'
                  	mov	al,bl			; 00002E35  8AC3  '..'
                  	mov	dx,0x3c8		; 00002E37  BAC803  '...'
                  	out	dx,al			; 00002E3A  EE  '.'
                  	mov	dx,0x3c9		; 00002E3B  BAC903  '...'
                  	pop	ax			; 00002E3E  58  'X'
                  	mov	al,ah			; 00002E3F  8AC4  '..'
                  	pushf				; 00002E41  9C  '.'
                  	cli				; 00002E42  FA  '.'
                  	out	dx,al			; 00002E43  EE  '.'
                  	jmp	short x2e46		; 00002E44  EB00  '..'
                  
                  x2e46:	mov	al,ch			; 00002E46  8AC5  '..'
                  	out	dx,al			; 00002E48  EE  '.'
                  	jmp	short x2e4b		; 00002E49  EB00  '..'
                  
                  x2e4b:	mov	al,cl			; 00002E4B  8AC1  '..'
                  	out	dx,al			; 00002E4D  EE  '.'
                  	popf				; 00002E4E  9D  '.'
                  	mov	dx,ax			; 00002E4F  8BD0  '..'
                  	ret				; 00002E51  C3  '.'
                  
                  x2e52:	push	ax			; 00002E52  50  'P'
                  	mov	dx,0x3c6		; 00002E53  BAC603  '...'
                  	in	al,dx			; 00002E56  EC  '.'
                  	cmp	al,0xff			; 00002E57  3CFF  '<.'
                  	jz	x2e5e			; 00002E59  7403  't.'
                  	mov	al,0xff			; 00002E5B  B0FF  '..'
                  	out	dx,al			; 00002E5D  EE  '.'
                  x2e5e:	cmp	bl,0x0			; 00002E5E  80FB00  '...'
                  	mov	cx,0x40			; 00002E61  B94000  '.@.'
                  	jz	x2e7e			; 00002E64  7418  't.'
                  	pop	ax			; 00002E66  58  'X'
                  	push	ax			; 00002E67  50  'P'
                  	cmp	ah,0xf			; 00002E68  80FC0F  '...'
                  	jz	x2e72			; 00002E6B  7405  't.'
                  	cmp	ah,0x7			; 00002E6D  80FC07  '...'
                  	jnz	x2e78			; 00002E70  7506  'u.'
                  x2e72:	mov	si,0x30b1		; 00002E72  BEB130  '..0'
                  	jmp	short x2ece		; 00002E75  EB57  '.W'
                  
                  	nop				; 00002E77  90  '.'
                  x2e78:	mov	si,0x2fb1		; 00002E78  BEB12F  '../'
                  	jmp	short x2eb8		; 00002E7B  EB3B  '.;'
                  
                  	nop				; 00002E7D  90  '.'
                  x2e7e:	pop	ax			; 00002E7E  58  'X'
                  	push	ax			; 00002E7F  50  'P'
                  	cmp	ah,0x13			; 00002E80  80FC13  '...'
                  	jz	x2e8b			; 00002E83  7406  't.'
                  	mov	si,0x3031		; 00002E85  BE3130  '.10'
                  	jmp	short x2eb8		; 00002E88  EB2E  '..'
                  
                  	nop				; 00002E8A  90  '.'
                  x2e8b:	pop	ax			; 00002E8B  58  'X'
                  	push	ax			; 00002E8C  50  'P'
                  	mov	bx,0x20			; 00002E8D  BB2000  '. .'
                  	call	x31f9			; 00002E90  E86603  '.f.'
                  	mov	si,0x3111		; 00002E93  BE1131  '..1'
                  	mov	cx,0x10			; 00002E96  B91000  '...'
                  	mov	bx,0x10			; 00002E99  BB1000  '...'
                  	call	x2f98			; 00002E9C  E8F900  '...'
                  	mov	si,0x30f1		; 00002E9F  BEF130  '..0'
                  	mov	cx,0x10			; 00002EA2  B91000  '...'
                  	mov	bx,0x0			; 00002EA5  BB0000  '...'
                  	pop	ax			; 00002EA8  58  'X'
                  	push	ax			; 00002EA9  50  'P'
                  	test	al,0x3			; 00002EAA  A803  '..'
                  	jz	x2ece			; 00002EAC  7420  't '
                  	add	si,byte +0x10		; 00002EAE  83C610  '...'
                  	call	x2f98			; 00002EB1  E8E400  '...'
                  	pop	ax			; 00002EB4  58  'X'
                  	jmp	short x2ed2		; 00002EB5  EB1B  '..'
                  
                  	nop				; 00002EB7  90  '.'
                  x2eb8:	pop	ax			; 00002EB8  58  'X'
                  	push	ax			; 00002EB9  50  'P'
                  	test	al,0x3			; 00002EBA  A803  '..'
                  	jz	x2ece			; 00002EBC  7410  't.'
                  	add	si,byte +0x40		; 00002EBE  83C640  '..@'
                  	mov	cx,0x40			; 00002EC1  B94000  '.@.'
                  	mov	bx,0x0			; 00002EC4  BB0000  '...'
                  	call	x2f98			; 00002EC7  E8CE00  '...'
                  	pop	ax			; 00002ECA  58  'X'
                  	jmp	short x2ed2		; 00002ECB  EB05  '..'
                  
                  	nop				; 00002ECD  90  '.'
                  x2ece:	pop	ax			; 00002ECE  58  'X'
                  	call	x2f5e			; 00002ECF  E88C00  '...'
                  x2ed2:	ret				; 00002ED2  C3  '.'
                  
                  x2ed3:	mov	ax,dx			; 00002ED3  8BC2  '..'
                  x2ed5:	push	cx			; 00002ED5  51  'Q'
                  	mov	dh,[es:bx]		; 00002ED6  268A37  '&.7'
                  	inc	bx			; 00002ED9  43  'C'
                  	mov	ch,[es:bx]		; 00002EDA  268A2F  '&./'
                  	inc	bx			; 00002EDD  43  'C'
                  	mov	cl,[es:bx]		; 00002EDE  268A0F  '&..'
                  	inc	bx			; 00002EE1  43  'C'
                  	push	bx			; 00002EE2  53  'S'
                  	mov	bx,di			; 00002EE3  8BDF  '..'
                  	push	ax			; 00002EE5  50  'P'
                  	test	ax,0x3			; 00002EE6  A90300  '...'
                  	jz	x2eee			; 00002EE9  7403  't.'
                  	call	x2df0			; 00002EEB  E802FF  '...'
                  x2eee:	call	x2e34			; 00002EEE  E843FF  '.C.'
                  	pop	ax			; 00002EF1  58  'X'
                  	pop	bx			; 00002EF2  5B  '['
                  	pop	cx			; 00002EF3  59  'Y'
                  	inc	di			; 00002EF4  47  'G'
                  	loop	x2ed5			; 00002EF5  E2DE  '..'
                  	ret				; 00002EF7  C3  '.'
                  
                  x2ef8:	push	cx			; 00002EF8  51  'Q'
                  	push	bx			; 00002EF9  53  'S'
                  	mov	bx,di			; 00002EFA  8BDF  '..'
                  	call	x2dca			; 00002EFC  E8CBFE  '...'
                  	pop	bx			; 00002EFF  5B  '['
                  	inc	di			; 00002F00  47  'G'
                  	mov	[es:bx],dh		; 00002F01  268837  '&.7'
                  	inc	bx			; 00002F04  43  'C'
                  	mov	[es:bx],ch		; 00002F05  26882F  '&./'
                  	inc	bx			; 00002F08  43  'C'
                  	mov	[es:bx],cl		; 00002F09  26880F  '&..'
                  	inc	bx			; 00002F0C  43  'C'
                  	pop	cx			; 00002F0D  59  'Y'
                  	loop	x2ef8			; 00002F0E  E2E8  '..'
                  	ret				; 00002F10  C3  '.'
                  
                  x2f11:	push	dx			; 00002F11  52  'R'
                  	in	al,dx			; 00002F12  EC  '.'
                  	mov	ax,di			; 00002F13  8BC7  '..'
                  	xchg	ah,al			; 00002F15  86E0  '..'
                  x2f17:	cmp	ah,0x10			; 00002F17  80FC10  '...'
                  	jz	x2f2b			; 00002F1A  740F  't.'
                  	jg	x2f3a			; 00002F1C  7F1C  '..'
                  	mov	al,[es:bx]		; 00002F1E  268A07  '&..'
                  	pop	dx			; 00002F21  5A  'Z'
                  	push	dx			; 00002F22  52  'R'
                  	call	x2b30			; 00002F23  E80AFC  '.',0x0A,'.'
                  	inc	ah			; 00002F26  FEC4  '..'
                  	inc	bx			; 00002F28  43  'C'
                  	loop	x2f17			; 00002F29  E2EC  '..'
                  x2f2b:	or	bp,bp			; 00002F2B  0BED  '..'
                  	jz	x2f30			; 00002F2D  7401  't.'
                  	inc	bx			; 00002F2F  43  'C'
                  x2f30:	inc	ah			; 00002F30  FEC4  '..'
                  	mov	al,[es:bx]		; 00002F32  268A07  '&..'
                  	pop	dx			; 00002F35  5A  'Z'
                  	call	x2b30			; 00002F36  E8F7FB  '...'
                  	ret				; 00002F39  C3  '.'
                  
                  x2f3a:	pop	dx			; 00002F3A  5A  'Z'
                  	ret				; 00002F3B  C3  '.'
                  
                  x2f3c:	mov	di,bx			; 00002F3C  8BFB  '..'
                  	sub	bl,bl			; 00002F3E  2ADB  '*.'
                  x2f40:	mov	al,bl			; 00002F40  8AC3  '..'
                  	call	x2b4b			; 00002F42  E806FC  '...'
                  	mov	[es:di],ah		; 00002F45  268825  '&.%'
                  	inc	bl			; 00002F48  FEC3  '..'
                  	inc	di			; 00002F4A  47  'G'
                  	cmp	bl,0x10			; 00002F4B  80FB10  '...'
                  	jc	x2f40			; 00002F4E  72F0  'r.'
                  	or	bp,bp			; 00002F50  0BED  '..'
                  	jz	x2f55			; 00002F52  7401  't.'
                  	inc	di			; 00002F54  47  'G'
                  x2f55:	mov	al,0x11			; 00002F55  B011  '..'
                  	call	x2b4b			; 00002F57  E8F1FB  '...'
                  	mov	[es:di],ah		; 00002F5A  268825  '&.%'
                  	ret				; 00002F5D  C3  '.'
                  
                  x2f5e:	mov	bl,0x0			; 00002F5E  B300  '..'
                  x2f60:	push	cx			; 00002F60  51  'Q'
                  	mov	bh,0x3			; 00002F61  B703  '..'
                  	mov	ah,[cs:si]		; 00002F63  2E8A24  '..$'
                  	inc	si			; 00002F66  46  'F'
                  x2f67:	mov	al,0x0			; 00002F67  B000  '..'
                  	test	ah,0x4			; 00002F69  F6C404  '...'
                  	jz	x2f70			; 00002F6C  7402
                  	add	al,0x2a			; 00002F6E  042A  '.*'
                  x2f70:	test	ah,0x20			; 00002F70  F6C420  '.. '
                  	jz	x2f77			; 00002F73  7402  't.'
                  	add	al,0x15			; 00002F75  0415  '..'
                  x2f77:	push	ax			; 00002F77  50  'P'
                  	shl	ah,1			; 00002F78  D0E4  '..'
                  	dec	bh			; 00002F7A  FECF  '..'
                  	jnz	x2f67			; 00002F7C  75E9  'u.'
                  	pop	ax			; 00002F7E  58  'X'
                  	mov	cl,al			; 00002F7F  8AC8  '..'
                  	pop	ax			; 00002F81  58  'X'
                  	mov	ch,al			; 00002F82  8AE8  '..'
                  	pop	ax			; 00002F84  58  'X'
                  	mov	dh,al			; 00002F85  8AF0  '..'
                  	push	si			; 00002F87  56  'V'
                  	push	bx			; 00002F88  53  'S'
                  	xor	bh,bh			; 00002F89  32FF  '2.'
                  	call	x2e34			; 00002F8B  E8A6FE  '...'
                  	pop	bx			; 00002F8E  5B  '['
                  	pop	si			; 00002F8F  5E  '^'
                  	inc	bl			; 00002F90  FEC3  '..'
                  	pop	cx			; 00002F92  59  'Y'
                  	cmp	bl,cl			; 00002F93  3AD9  ':.'
                  	jl	x2f60			; 00002F95  7CC9  '|.'
                  	ret				; 00002F97  C3  '.'
                  
                  x2f98:	add	cx,bx			; 00002F98  03CB  '..'
                  x2f9a:	push	cx			; 00002F9A  51  'Q'
                  	mov	cl,[cs:si]		; 00002F9B  2E8A0C  '...'
                  	mov	ch,cl			; 00002F9E  8AE9  '..'
                  	mov	dh,cl			; 00002FA0  8AF1  '..'
                  	push	si			; 00002FA2  56  'V'
                  	push	bx			; 00002FA3  53  'S'
                  	call	x2e34			; 00002FA4  E88DFE  '...'
                  	pop	bx			; 00002FA7  5B  '['
                  	pop	si			; 00002FA8  5E  '^'
                  	inc	si			; 00002FA9  46  'F'
                  	inc	bx			; 00002FAA  43  'C'
                  	pop	cx			; 00002FAB  59  'Y'
                  	cmp	bx,cx			; 00002FAC  3BD9  ';.'
                  	jl	x2f9a			; 00002FAE  7CEA  '|.'
                  	ret				; 00002FB0  C3  '.'
                  
                  	db	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
                  	db	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
                  	db	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F
                  	db	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
                  	db	0x00,0x05,0x11,0x1C,0x08,0x0B,0x25,0x28,0x02,0x07,0x1B,0x20,0x0F,0x14,0x28,0x2C
                  	db	0x0C,0x11,0x25,0x2A,0x14,0x1E,0x32,0x36,0x0F,0x13,0x27,0x2C,0x1B,0x20,0x34,0x39
                  	db	0x06,0x0B,0x1F,0x24,0x13,0x18,0x2C,0x30,0x09,0x0D,0x21,0x26,0x15,0x1A,0x2E,0x33
                  	db	0x13,0x17,0x2B,0x30,0x1F,0x24,0x38,0x3D,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
                  	db	0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07
                  	db	0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
                  	db	0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07
                  	db	0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
                  	db	0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28
                  	db	0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
                  	db	0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28
                  	db	0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07
                  	db	0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07
                  	db	0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
                  	db	0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F
                  	db	0x00,0x05,0x11,0x1C,0x08,0x0B,0x14,0x28,0x0E,0x18,0x2D,0x32,0x20,0x24,0x38,0x3F
                  	db	0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18,0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F
                  	db	0x00,0x10,0x1F,0x2F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x2F,0x1F,0x10
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x27,0x2F,0x37,0x3F,0x3F,0x3F,0x3F
                  	db	0x3F,0x3F,0x3F,0x3F,0x3F,0x37,0x2F,0x27,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F
                  	db	0x2D,0x31,0x36,0x3A,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3A,0x36,0x31
                  	db	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x00,0x07,0x0E,0x15,0x1C,0x1C,0x1C,0x1C
                  	db	0x1C,0x1C,0x1C,0x1C,0x1C,0x15,0x0E,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                  	db	0x0E,0x11,0x15,0x18,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x18,0x15,0x11
                  	db	0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x14,0x16,0x18,0x1A,0x1C,0x1C,0x1C,0x1C
                  	db	0x1C,0x1C,0x1C,0x1C,0x1C,0x1A,0x18,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
                  	db	0x00,0x04,0x08,0x0C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0C,0x08,0x04
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0A,0x0C,0x0E,0x10,0x10,0x10,0x10
                  	db	0x10,0x10,0x10,0x10,0x10,0x0E,0x0C,0x0A,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08
                  	db	0x0B,0x0C,0x0D,0x0F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0F,0x0D,0x0C
                  	db	0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B
                  
                  x31f9:	mov	bp,bx			; 000031F9  8BEB  '..'
                  	mov	cx,0x9			; 000031FB  B90900  '...'
                  	mov	si,0x3121		; 000031FE  BE2131  '.!1'
                  x3201:	push	cx			; 00003201  51  'Q'
                  	mov	bx,0x0			; 00003202  BB0000  '...'
                  x3205:	push	bx			; 00003205  53  'S'
                  	mov	dh,[cs:bx+si]		; 00003206  2E8A30  '..0'
                  	add	bl,0x8			; 00003209  80C308  '...'
                  	cmp	bl,0x18			; 0000320C  80FB18  '...'
                  	jl	x3214			; 0000320F  7C03  '|.'
                  	sub	bl,0x18			; 00003211  80EB18  '...'
                  x3214:	mov	cl,[cs:bx+si]		; 00003214  2E8A08  '...'
                  	add	bl,0x8			; 00003217  80C308  '...'
                  	cmp	bl,0x18			; 0000321A  80FB18  '...'
                  	jl	x3222			; 0000321D  7C03  '|.'
                  	sub	bl,0x18			; 0000321F  80EB18  '...'
                  x3222:	mov	ch,[cs:bx+si]		; 00003222  2E8A28  '..('
                  	push	si			; 00003225  56  'V'
                  	push	ax			; 00003226  50  'P'
                  	mov	bx,bp			; 00003227  8BDD  '..'
                  	test	al,0x3			; 00003229  A803  '..'
                  	jz	x3230			; 0000322B  7403  't.'
                  	call	x2df0			; 0000322D  E8C0FB  '...'
                  x3230:	call	x2e34			; 00003230  E801FC  '...'
                  	pop	ax			; 00003233  58  'X'
                  	pop	si			; 00003234  5E  '^'
                  	inc	bp			; 00003235  45  'E'
                  	pop	bx			; 00003236  5B  '['
                  	inc	bl			; 00003237  FEC3  '..'
                  	cmp	bl,0x18			; 00003239  80FB18  '...'
                  	jl	x3205			; 0000323C  7CC7  '|.'
                  	add	si,byte +0x18		; 0000323E  83C618  '...'
                  	pop	cx			; 00003241  59  'Y'
                  	loop	x3201			; 00003242  E2BD  '..'
                  	ret				; 00003244  C3  '.'
                  
                  	mov	ah,[0x449]		; 00003245  8A264904  '.&I.'
                  	mov	si,ax			; 00003249  8BF0  '..'
                  	push	cx			; 0000324B  51  'Q'
                  	mov	cl,0x8			; 0000324C  B108  '..'
                  	shr	si,cl			; 0000324E  D3EE  '..'
                  	pop	cx			; 00003250  59  'Y'
                  	shl	si,1			; 00003251  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 00003253  2E8BB49012  '.....'
                  	shl	si,1			; 00003258  D1E6  '..'
                  	cmp	si,0xa			; 0000325A  81FE0A00  '..',0x0A,'.'
                  	jnc	x3265			; 0000325E  7305  's.'
                  	jmp	near [cs:si+0x3268]	; 00003260  2EFFA46832  '...h2'
                  
                  x3265:	jmp	x713			; 00003265  E9ABD4  '...'
                  
                  	adc	ax,[bx]			; 00003268  1307  '..'
                  	adc	ax,[bx]			; 0000326A  1307  '..'
                  	jc	x32a0			; 0000326C  7232  'r2'
                  	call	0x2e32:0xeb32		; 0000326E  9A32EB322E  '.2.2.'
                  	mov	es,[0x720]		; 00003273  8E062007  '.. .'
                  	push	ax			; 00003277  50  'P'
                  	push	ax			; 00003278  50  'P'
                  	call	x3393			; 00003279  E81701  '...'
                  	shr	al,cl			; 0000327C  D2E8  '..'
                  	and	al,ah			; 0000327E  22C4  '".'
                  	mov	cl,[es:si]		; 00003280  268A0C  '&..'
                  	pop	bx			; 00003283  5B  '['
                  	test	bl,0x80			; 00003284  F6C380  '...'
                  	jnz	x3296			; 00003287  750D  'u',0x0D
                  	not	ah			; 00003289  F6D4  '..'
                  	and	cl,ah			; 0000328B  22CC  '".'
                  	or	al,cl			; 0000328D  0AC1  0x0A,'.'
                  x328f:	mov	[es:si],al		; 0000328F  268804  '&..'
                  	pop	ax			; 00003292  58  'X'
                  	jmp	x713			; 00003293  E97DD4  '.}.'
                  
                  x3296:	xor	al,cl			; 00003296  32C1  '2.'
                  	jmp	short x328f		; 00003298  EBF5  '..'
                  
                  	push	ax			; 0000329A  50  'P'
                  	mov	ax,dx			; 0000329B  8BC2  '..'
                  	call	x33d6			; 0000329D  E83601  '.6.'
                  x32a0:	mov	dx,0x3ce		; 000032A0  BACE03  '...'
                  	mov	ah,al			; 000032A3  8AE0  '..'
                  	mov	al,0x8			; 000032A5  B008  '..'
                  	out	dx,ax			; 000032A7  EF  '.'
                  	mov	es,[cs:0x71e]		; 000032A8  2E8E061E07  '.....'
                  	pop	ax			; 000032AD  58  'X'
                  	mov	ch,al			; 000032AE  8AE8  '..'
                  	test	ch,0x80			; 000032B0  F6C580  '...'
                  	jz	x32bb			; 000032B3  7406  't.'
                  	mov	ax,0x1803		; 000032B5  B80318  '...'
                  	out	dx,ax			; 000032B8  EF  '.'
                  	jmp	short x32c9		; 000032B9  EB0E  '..'
                  
                  x32bb:	mov	dl,0xc4			; 000032BB  B2C4  '..'
                  	mov	ax,0xff02		; 000032BD  B802FF  '...'
                  	out	dx,ax			; 000032C0  EF  '.'
                  	mov	al,[es:bx]		; 000032C1  268A07  '&..'
                  	sub	al,al			; 000032C4  2AC0  '*.'
                  	mov	[es:bx],al		; 000032C6  268807  '&..'
                  x32c9:	mov	dl,0xc4			; 000032C9  B2C4  '..'
                  	mov	al,0x2			; 000032CB  B002  '..'
                  	mov	ah,ch			; 000032CD  8AE5  '..'
                  	and	ah,0xf			; 000032CF  80E40F  '...'
                  	out	dx,ax			; 000032D2  EF  '.'
                  	mov	ah,[es:bx]		; 000032D3  268A27  '&.',0x27
                  	mov	ah,0xff			; 000032D6  B4FF  '..'
                  	mov	[es:bx],ah		; 000032D8  268827  '&.',0x27
                  	out	dx,ax			; 000032DB  EF  '.'
                  	mov	dl,0xce			; 000032DC  B2CE  '..'
                  	mov	ax,0x3			; 000032DE  B80300  '...'
                  	out	dx,ax			; 000032E1  EF  '.'
                  	mov	ax,0xff08		; 000032E2  B808FF  '...'
                  	out	dx,ax			; 000032E5  EF  '.'
                  	xchg	ah,al			; 000032E6  86E0  '..'
                  	jmp	x713			; 000032E8  E928D4  '.(.'
                  
                  	push	ax			; 000032EB  50  'P'
                  	mov	ax,dx			; 000032EC  8BC2  '..'
                  	mov	bx,0x140		; 000032EE  BB4001  '.@.'
                  	mul	bx			; 000032F1  F7E3  '..'
                  	add	ax,cx			; 000032F3  03C1  '..'
                  	mov	si,ax			; 000032F5  8BF0  '..'
                  	pop	ax			; 000032F7  58  'X'
                  	mov	es,[cs:0x71e]		; 000032F8  2E8E061E07  '.....'
                  	mov	[es:si],al		; 000032FD  268804  '&..'
                  	jmp	x713			; 00003300  E910D4  '...'
                  
                  	mov	ah,[0x449]		; 00003303  8A264904  '.&I.'
                  	mov	si,ax			; 00003307  8BF0  '..'
                  	push	cx			; 00003309  51  'Q'
                  	mov	cl,0x8			; 0000330A  B108  '..'
                  	shr	si,cl			; 0000330C  D3EE  '..'
                  	pop	cx			; 0000330E  59  'Y'
                  	shl	si,1			; 0000330F  D1E6  '..'
                  	mov	si,[cs:si+0x1290]	; 00003311  2E8BB49012  '.....'
                  	shl	si,1			; 00003316  D1E6  '..'
                  	cmp	si,0xa			; 00003318  81FE0A00  '..',0x0A,'.'
                  	jnc	x3323			; 0000331C  7305  's.'
                  	jmp	near [cs:si+0x3326]	; 0000331E  2EFFA42633  '...&3'
                  
                  x3323:	jmp	x713			; 00003323  E9EDD3  '...'
                  
                  	adc	ax,[bx]			; 00003326  1307  '..'
                  	adc	ax,[bx]			; 00003328  1307  '..'
                  	xor	[bp+di],dh		; 0000332A  3033  '03'
                  	inc	si			; 0000332C  46  'F'
                  	xor	di,[bp+di+0x33]		; 0000332D  337B33  '3{3'
                  	mov	es,[cs:0x720]		; 00003330  2E8E062007  '... .'
                  	call	x3393			; 00003335  E85B00  '.[.'
                  	mov	al,[es:si]		; 00003338  268A04  '&..'
                  	and	al,ah			; 0000333B  22C4  '".'
                  	shl	al,cl			; 0000333D  D2E0  '..'
                  	mov	cl,dh			; 0000333F  8ACE  '..'
                  	rol	al,cl			; 00003341  D2C0  '..'
                  	jmp	x713			; 00003343  E9CDD3  '...'
                  
                  	mov	es,[cs:0x71e]		; 00003346  2E8E061E07  '.....'
                  	mov	ax,dx			; 0000334B  8BC2  '..'
                  	call	x33d6			; 0000334D  E88600  '...'
                  	mov	ch,0x7			; 00003350  B507  '..'
                  	sub	ch,cl			; 00003352  2AE9  '*.'
                  	sub	dx,dx			; 00003354  2BD2  '+.'
                  	mov	ah,0x0			; 00003356  B400  '..'
                  x3358:	mov	cl,ch			; 00003358  8ACD  '..'
                  	mov	al,0x4			; 0000335A  B004  '..'
                  	push	dx			; 0000335C  52  'R'
                  	mov	dx,0x3ce		; 0000335D  BACE03  '...'
                  	out	dx,ax			; 00003360  EF  '.'
                  	pop	dx			; 00003361  5A  'Z'
                  	mov	al,[es:bx]		; 00003362  268A07  '&..'
                  	shr	al,cl			; 00003365  D2E8  '..'
                  	and	al,0x1			; 00003367  2401  '$.'
                  	mov	cl,ah			; 00003369  8ACC  '..'
                  	shl	al,cl			; 0000336B  D2E0  '..'
                  	or	dl,al			; 0000336D  0AD0  0x0A,'.'
                  	inc	ah			; 0000336F  FEC4  '..'
                  	cmp	ah,0x3			; 00003371  80FC03  '...'
                  	jna	x3358			; 00003374  76E2  'v.'
                  	mov	al,dl			; 00003376  8AC2  '..'
                  	jmp	x713			; 00003378  E998D3  '...'
                  
                  	push	ax			; 0000337B  50  'P'
                  	mov	ax,dx			; 0000337C  8BC2  '..'
                  	mov	bx,0x140		; 0000337E  BB4001  '.@.'
                  	mul	bx			; 00003381  F7E3  '..'
                  	add	ax,cx			; 00003383  03C1  '..'
                  	mov	di,ax			; 00003385  8BF8  '..'
                  	pop	ax			; 00003387  58  'X'
                  	mov	es,[cs:0x71e]		; 00003388  2E8E061E07  '.....'
                  	mov	al,[es:di]		; 0000338D  268A05  '&..'
                  	jmp	x713			; 00003390  E980D3  '...'
                  
                  x3393:	push	bx			; 00003393  53  'S'
                  	push	ax			; 00003394  50  'P'
                  	mov	al,0x28			; 00003395  B028  '.('
                  	push	dx			; 00003397  52  'R'
                  	and	dl,0xfe			; 00003398  80E2FE  '...'
                  	mul	dl			; 0000339B  F6E2  '..'
                  	pop	dx			; 0000339D  5A  'Z'
                  	test	dl,0x1			; 0000339E  F6C201  '...'
                  	jz	x33a6			; 000033A1  7403  't.'
                  	add	ax,0x2000		; 000033A3  050020  '.. '
                  x33a6:	mov	si,ax			; 000033A6  8BF0  '..'
                  	pop	ax			; 000033A8  58  'X'
                  	mov	dx,cx			; 000033A9  8BD1  '..'
                  	mov	bx,0x2c0		; 000033AB  BBC002  '...'
                  	mov	cx,0x302		; 000033AE  B90203  '...'
                  	cmp	byte [0x449],0x6	; 000033B1  803E490406  '.>I..'
                  	jc	x33be			; 000033B6  7206  'r.'
                  	mov	bx,0x180		; 000033B8  BB8001  '...'
                  	mov	cx,0x703		; 000033BB  B90307  '...'
                  x33be:	and	ch,dl			; 000033BE  22EA  '".'
                  	shr	dx,cl			; 000033C0  D3EA  '..'
                  	add	si,dx			; 000033C2  03F2  '..'
                  	mov	dh,bh			; 000033C4  8AF7  '..'
                  	sub	cl,cl			; 000033C6  2AC9  '*.'
                  x33c8:	ror	al,1			; 000033C8  D0C8  '..'
                  	add	cl,ch			; 000033CA  02CD  '..'
                  	dec	bh			; 000033CC  FECF  '..'
                  	jnz	x33c8			; 000033CE  75F8  'u.'
                  	mov	ah,bl			; 000033D0  8AE3  '..'
                  	shr	ah,cl			; 000033D2  D2EC  '..'
                  	pop	bx			; 000033D4  5B  '['
                  	ret				; 000033D5  C3  '.'
                  
                  x33d6:	mul	word [0x44a]		; 000033D6  F7264A04  '.&J.'
                  	push	cx			; 000033DA  51  'Q'
                  	shr	cx,1			; 000033DB  D1E9  '..'
                  	shr	cx,1			; 000033DD  D1E9  '..'
                  	shr	cx,1			; 000033DF  D1E9  '..'
                  	add	ax,cx			; 000033E1  03C1  '..'
                  	mov	bl,bh			; 000033E3  8ADF  '..'
                  	sub	bh,bh			; 000033E5  2AFF  '*.'
                  	mov	cx,bx			; 000033E7  8BCB  '..'
                  	mov	bx,[0x44c]		; 000033E9  8B1E4C04  '..L.'
                  	jcxz	x33f3			; 000033ED  E304  '..'
                  x33ef:	add	ax,bx			; 000033EF  03C3  '..'
                  	loop	x33ef			; 000033F1  E2FC  '..'
                  x33f3:	pop	cx			; 000033F3  59  'Y'
                  	mov	bx,ax			; 000033F4  8BD8  '..'
                  	and	cl,0x7			; 000033F6  80E107  '...'
                  	mov	al,0x80			; 000033F9  B080  '..'
                  	shr	al,cl			; 000033FB  D2E8  '..'
                  	ret				; 000033FD  C3  '.'
                  
                  	mov	bh,[0x462]		; 000033FE  8A3E6204  '.>b.'
                  	mov	si,bx			; 00003402  8BF3  '..'
                  	mov	cl,0x8			; 00003404  B108  '..'
                  	shr	si,cl			; 00003406  D3EE  '..'
                  	shl	si,1			; 00003408  D1E6  '..'
                  	mov	dx,[si+0x450]		; 0000340A  8B945004  '..P.'
                  	call	x3414			; 0000340E  E80300  '...'
                  	jmp	x713			; 00003411  E9FFD2  '...'
                  
                  x3414:	push	ax			; 00003414  50  'P'
                  	cmp	al,0xd			; 00003415  3C0D  '<',0x0D
                  	jna	x3478			; 00003417  765F  'v_'
                  x3419:	push	ds			; 00003419  1E  '.'
                  	push	bx			; 0000341A  53  'S'
                  	push	dx			; 0000341B  52  'R'
                  	mov	cx,0x1			; 0000341C  B90100  '...'
                  	call	x2990			; 0000341F  E86EF5  '.n.'
                  	pop	dx			; 00003422  5A  'Z'
                  	pop	bx			; 00003423  5B  '['
                  	pop	ds			; 00003424  1F  '.'
                  	inc	dl			; 00003425  FEC2  '..'
                  	cmp	dl,[0x44a]		; 00003427  3A164A04  ':.J.'
                  	jnz	x3473			; 0000342B  7546  'uF'
                  	xor	dl,dl			; 0000342D  32D2  '2.'
                  	cmp	dh,[0x484]		; 0000342F  3A368404  ':6..'
                  	jnz	x3471			; 00003433  753C  'u<'
                  x3435:	call	x1f35			; 00003435  E8FDEA  '...'
                  	mov	ah,[0x449]		; 00003438  8A264904  '.&I.'
                  	db	0xE8,0xDC,0xDA
                  	jz	x3445			; 0000343F  7404  't.'
                  	mov	ah,0x0			; 00003441  B400  '..'
                  	jmp	short x344c		; 00003443  EB07  '..'
                  
                  x3445:	push	ds			; 00003445  1E  '.'
                  	push	bx			; 00003446  53  'S'
                  	call	x2503			; 00003447  E8B9F0  '...'
                  	pop	bx			; 0000344A  5B  '['
                  	pop	ds			; 0000344B  1F  '.'
                  x344c:	mov	bl,[0x462]		; 0000344C  8A1E6204  '..b.'
                  	mov	[0x462],bh		; 00003450  883E6204  '.>b.'
                  	push	bx			; 00003454  53  'S'
                  	mov	bh,ah			; 00003455  8AFC  '..'
                  	mov	al,0x1			; 00003457  B001  '..'
                  	sub	cx,cx			; 00003459  2BC9  '+.'
                  	mov	dh,[0x484]		; 0000345B  8A368404  '.6..'
                  	mov	dl,[0x44a]		; 0000345F  8A164A04  '..J.'
                  	dec	dl			; 00003463  FECA  '..'
                  	push	ds			; 00003465  1E  '.'
                  	call	x1fd9			; 00003466  E870EB  '.p.'
                  	pop	ds			; 00003469  1F  '.'
                  	pop	bx			; 0000346A  5B  '['
                  	mov	[0x462],bl		; 0000346B  881E6204  '..b.'
                  x346f:	pop	ax			; 0000346F  58  'X'
                  	ret				; 00003470  C3  '.'
                  
                  x3471:	inc	dh			; 00003471  FEC6  '..'
                  x3473:	call	x1f35			; 00003473  E8BFEA  '...'
                  	jmp	short x346f		; 00003476  EBF7  '..'
                  
                  x3478:	jz	x348d			; 00003478  7413  't.'
                  	cmp	al,0xa			; 0000347A  3C0A  '<',0x0A
                  	jz	x3491			; 0000347C  7413  't.'
                  	cmp	al,0x7			; 0000347E  3C07  '<.'
                  	jz	x3499			; 00003480  7417  't.'
                  	cmp	al,0x8			; 00003482  3C08  '<.'
                  	jnz	x3419			; 00003484  7593  'u.'
                  	or	dl,dl			; 00003486  0AD2  0x0A,'.'
                  	jz	x3473			; 00003488  74E9  't.'
                  	dec	dx			; 0000348A  4A  'J'
                  	jmp	short x3473		; 0000348B  EBE6  '..'
                  
                  x348d:	xor	dl,dl			; 0000348D  32D2  '2.'
                  	jmp	short x3473		; 0000348F  EBE2  '..'
                  
                  x3491:	cmp	dh,[0x484]		; 00003491  3A368404  ':6..'
                  	jnz	x3471			; 00003495  75DA  'u.'
                  	jmp	short x3435		; 00003497  EB9C  '..'
                  
                  x3499:	mov	cx,0x533		; 00003499  B93305  '.3.'
                  	mov	bl,0x1			; 0000349C  B301  '..'
                  	call	beep			; 0000349E  E8E5D1  '...'
                  	jmp	short x346f		; 000034A1  EBCC  '..'
                  
                  	cmp	al,0x4			; 000034A3  3C04  '<.'
                  	jnc	x34f2			; 000034A5  734B  'sK'
                  	jcxz	x34f2			; 000034A7  E349  '.I'
                  	mov	si,bx			; 000034A9  8BF3  '..'
                  	push	cx			; 000034AB  51  'Q'
                  	mov	cl,0x8			; 000034AC  B108  '..'
                  	shr	si,cl			; 000034AE  D3EE  '..'
                  	pop	cx			; 000034B0  59  'Y'
                  	shl	si,1			; 000034B1  D1E6  '..'
                  	push	word [si+0x450]		; 000034B3  FFB45004  '..P.'
                  	push	si			; 000034B7  56  'V'
                  	push	ax			; 000034B8  50  'P'
                  	push	cx			; 000034B9  51  'Q'
                  	push	dx			; 000034BA  52  'R'
                  	call	x1f35			; 000034BB  E877EA  '.w.'
                  	pop	dx			; 000034BE  5A  'Z'
                  	pop	cx			; 000034BF  59  'Y'
                  	pop	ax			; 000034C0  58  'X'
                  	pop	si			; 000034C1  5E  '^'
                  x34c2:	push	cx			; 000034C2  51  'Q'
                  	push	bx			; 000034C3  53  'S'
                  	push	ax			; 000034C4  50  'P'
                  	xchg	ah,al			; 000034C5  86E0  '..'
                  	mov	al,[es:bp+0x0]		; 000034C7  268A4600  '&.F.'
                  	inc	bp			; 000034CB  45  'E'
                  	cmp	al,0x8			; 000034CC  3C08  '<.'
                  	jz	x34dc			; 000034CE  740C  't.'
                  	cmp	al,0xd			; 000034D0  3C0D  '<',0x0D
                  	jz	x34dc			; 000034D2  7408  't.'
                  	cmp	al,0xa			; 000034D4  3C0A  '<',0x0A
                  	jz	x34dc			; 000034D6  7404  't.'
                  	cmp	al,0x7			; 000034D8  3C07  '<.'
                  	jnz	x34f5			; 000034DA  7519  'u.'
                  x34dc:	push	si			; 000034DC  56  'V'
                  	push	dx			; 000034DD  52  'R'
                  	push	es			; 000034DE  06  '.'
                  	push	bp			; 000034DF  55  'U'
                  	push	ds			; 000034E0  1E  '.'
                  	call	x3414			; 000034E1  E830FF  '.0.'
                  	pop	ds			; 000034E4  1F  '.'
                  	pop	bp			; 000034E5  5D  ']'
                  	pop	es			; 000034E6  07  '.'
                  	pop	dx			; 000034E7  5A  'Z'
                  	pop	si			; 000034E8  5E  '^'
                  	mov	dx,[si+0x450]		; 000034E9  8B945004  '..P.'
                  	pop	ax			; 000034ED  58  'X'
                  	pop	bx			; 000034EE  5B  '['
                  	pop	cx			; 000034EF  59  'Y'
                  	jmp	short x353f		; 000034F0  EB4D  '.M'
                  
                  x34f2:	jmp	x713			; 000034F2  E91ED2  '...'
                  
                  x34f5:	mov	cx,0x1			; 000034F5  B90100  '...'
                  	cmp	ah,0x2			; 000034F8  80FC02  '...'
                  	jc	x3502			; 000034FB  7205  'r.'
                  	mov	bl,[es:bp+0x0]		; 000034FD  268A5E00  '&.^.'
                  	inc	bp			; 00003501  45  'E'
                  x3502:	push	si			; 00003502  56  'V'
                  	push	dx			; 00003503  52  'R'
                  	push	es			; 00003504  06  '.'
                  	push	bp			; 00003505  55  'U'
                  	push	ds			; 00003506  1E  '.'
                  	call	x272b			; 00003507  E821F2  '.!.'
                  	pop	ds			; 0000350A  1F  '.'
                  	pop	bp			; 0000350B  5D  ']'
                  	pop	es			; 0000350C  07  '.'
                  	pop	dx			; 0000350D  5A  'Z'
                  	pop	si			; 0000350E  5E  '^'
                  	pop	ax			; 0000350F  58  'X'
                  	pop	bx			; 00003510  5B  '['
                  	pop	cx			; 00003511  59  'Y'
                  	inc	dl			; 00003512  FEC2  '..'
                  	cmp	dl,[0x44a]		; 00003514  3A164A04  ':.J.'
                  	jc	x353f			; 00003518  7225  'r%'
                  	mov	dl,[0x484]		; 0000351A  8A168404  '....'
                  	inc	dl			; 0000351E  FEC2  '..'
                  	inc	dh			; 00003520  FEC6  '..'
                  	cmp	dh,dl			; 00003522  3AF2  ':.'
                  	mov	dl,0x0			; 00003524  B200  '..'
                  	jc	x353f			; 00003526  7217  'r.'
                  	dec	dh			; 00003528  FECE  '..'
                  	push	ax			; 0000352A  50  'P'
                  	push	bx			; 0000352B  53  'S'
                  	push	cx			; 0000352C  51  'Q'
                  	push	dx			; 0000352D  52  'R'
                  	push	si			; 0000352E  56  'V'
                  	push	es			; 0000352F  06  '.'
                  	push	bp			; 00003530  55  'U'
                  	push	ds			; 00003531  1E  '.'
                  	mov	al,0xa			; 00003532  B00A  '.',0x0A
                  	call	x3414			; 00003534  E8DDFE  '...'
                  	pop	ds			; 00003537  1F  '.'
                  	pop	bp			; 00003538  5D  ']'
                  	pop	es			; 00003539  07  '.'
                  	pop	si			; 0000353A  5E  '^'
                  	pop	dx			; 0000353B  5A  'Z'
                  	pop	cx			; 0000353C  59  'Y'
                  	pop	bx			; 0000353D  5B  '['
                  	pop	ax			; 0000353E  58  'X'
                  x353f:	push	si			; 0000353F  56  'V'
                  	push	ax			; 00003540  50  'P'
                  	push	cx			; 00003541  51  'Q'
                  	push	dx			; 00003542  52  'R'
                  	call	x1f35			; 00003543  E8EFE9  '...'
                  	pop	dx			; 00003546  5A  'Z'
                  	pop	cx			; 00003547  59  'Y'
                  	pop	ax			; 00003548  58  'X'
                  	pop	si			; 00003549  5E  '^'
                  	loop	x3556			; 0000354A  E20A  '.',0x0A
                  	pop	dx			; 0000354C  5A  'Z'
                  	test	al,0x1			; 0000354D  A801  '..'
                  	jnz	x34f2			; 0000354F  75A1  'u.'
                  	call	x1f35			; 00003551  E8E1E9  '...'
                  	jmp	short x34f2		; 00003554  EB9C  '..'
                  
                  x3556:	jmp	x34c2			; 00003556  E969FF  '.i.'
                  
                  	cmp	al,0x0			; 00003559  3C00  '<.'
                  	jnz	x3561			; 0000355B  7504  'u.'
                  	push	es			; 0000355D  06  '.'
                  	pop	ds			; 0000355E  1F  '.'
                  	jmp	short x35c8		; 0000355F  EB67  '.g'
                  
                  x3561:	cmp	al,0x1			; 00003561  3C01  '<.'
                  	jnz	x3567			; 00003563  7502  'u.'
                  	jmp	short x35c8		; 00003565  EB61  '.a'
                  
                  x3567:	cmp	al,0x2			; 00003567  3C02  '<.'
                  	jnz	x356d			; 00003569  7502  'u.'
                  	jmp	short x35c8		; 0000356B  EB5B  '.['
                  
                  x356d:	cmp	al,0x3			; 0000356D  3C03  '<.'
                  	jnz	x3574			; 0000356F  7503  'u.'
                  	jmp	short x35d0		; 00003571  EB5D  '.]'
                  
                  	nop				; 00003573  90  '.'
                  x3574:	cmp	al,0x4			; 00003574  3C04  '<.'
                  	jnz	x357c			; 00003576  7504  'u.'
                  	dec	al			; 00003578  FEC8  '..'
                  	jmp	short x35c8		; 0000357A  EB4C  '.L'
                  
                  x357c:	cmp	al,0x10			; 0000357C  3C10  '<.'
                  	jnz	x3585			; 0000357E  7505  'u.'
                  	push	es			; 00003580  06  '.'
                  	pop	ds			; 00003581  1F  '.'
                  	jmp	short x35d6		; 00003582  EB52  '.R'
                  
                  	nop				; 00003584  90  '.'
                  x3585:	cmp	al,0x11			; 00003585  3C11  '<.'
                  	jnz	x358c			; 00003587  7503  'u.'
                  	jmp	short x35d6		; 00003589  EB4B  '.K'
                  
                  	nop				; 0000358B  90  '.'
                  x358c:	cmp	al,0x12			; 0000358C  3C12  '<.'
                  	jnz	x3593			; 0000358E  7503  'u.'
                  	jmp	short x35d6		; 00003590  EB44  '.D'
                  
                  	nop				; 00003592  90  '.'
                  x3593:	cmp	al,0x14			; 00003593  3C14  '<.'
                  	jnz	x359b			; 00003595  7504
                  	dec	al			; 00003597  FEC8  '..'
                  	jmp	short x35d6		; 00003599  EB3B  '.;'
                  x359b:	cmp	al,0x20			; 0000359B  3C20  '< '
                  
                  	jnz	x35a2			; 0000359D  7503  'u.'
                  	jmp	x3639			; 0000359F  E99700
                  
                  x35a2:	cmp	al,0x21			; 000035A2  3C21  '<!'
                  	jnz	x35a9			; 000035A4  7503  'u.'
                  	jmp	x364d			; 000035A6  E9A400
                  
                  x35a9:	cmp	al,0x22			; 000035A9  3C22  '<"'
                  	jnz	x35b0			; 000035AB  7503  'u.'
                  	jmp	x364d			; 000035AD  E99D00
                  
                  x35b0:	cmp	al,0x23			; 000035B0  3C23  '<#'
                  	jnz	x35b7			; 000035B2  7503  'u.'
                  	jmp	x364d			; 000035B4  E99600
                  
                  x35b7:	cmp	al,0x24			; 000035B7  3C24  '<$'
                  	jnz	x35be			; 000035B9  7503  'u.'
                  	jmp	x364d			; 000035BB  E98F00
                  
                  x35be:	cmp	al,0x30			; 000035BE  3C30  '<0'
                  	jnz	x35c5			; 000035C0  7503  'u.'
                  	jmp	x36a8			; 000035C2  E9E300  '...'
                  
                  x35c5:	jmp	x713			; 000035C5  E94BD1  '.K.'
                  
                  x35c8:	mov	ah,al			; 000035C8  8AE0  '..'
                  	call	x35e1			; 000035CA  E81400  '...'
                  	jmp	x713			; 000035CD  E943D1  '.C.'
                  
                  x35d0:	call	x125f			; 000035D0  E88CDC  '...'
                  	jmp	x713			; 000035D3  E93DD1  '.=.'
                  
                  x35d6:	mov	ah,al			; 000035D6  8AE0  '..'
                  	sub	ah,0x10			; 000035D8  80EC10  '...'
                  	call	x35e1			; 000035DB  E80300  '...'
                  	jmp	x713			; 000035DE  E932D1  '.2.'
                  
                  x35e1:	push	ds			; 000035E1  1E  '.'
                  	push	cx			; 000035E2  51  'Q'
                  	mov	ds,[cs:0x71c]		; 000035E3  2E8E1E1C07  '.....'
                  	mov	cx,[0x463]		; 000035E8  8B0E6304  '..c.'
                  	call	x120c			; 000035EC  E81DDC  '...'
                  	pop	cx			; 000035EF  59  'Y'
                  	pop	ds			; 000035F0  1F  '.'
                  	cmp	ah,0x0			; 000035F1  80FC00  '...'
                  	jz	x3617			; 000035F4  7421  't!'
                  	mov	bh,0xe			; 000035F6  B70E  '..'
                  	mov	bp,font_8x14		; 000035F8  BD8D3F  '..?'
                  	cmp	ah,0x1			; 000035FB  80FC01  '...'
                  	jz	x360f			; 000035FE  740F  't.'
                  	mov	bh,0x8			; 00003600  B708  '..'
                  	mov	bp,font_8x8		; 00003602  BD8D37  '..7'
                  	cmp	ah,0x2			; 00003605  80FC02  '...'
                  	jz	x360f			; 00003608  7405  't.'
                  	mov	bh,0x10			; 0000360A  B710  '..'
                  	mov	bp,font_8x16		; 0000360C  BDBA4E  '..N'
                  x360f:	mov	dx,0x0			; 0000360F  BA0000  '...'
                  	mov	cx,0x100		; 00003612  B90001  '...'
                  	push	cs			; 00003615  0E  '.'
                  	pop	ds			; 00003616  1F  '.'
                  x3617:	push	ax			; 00003617  50  'P'
                  	and	bl,0x7f			; 00003618  80E37F  '...'
                  	mov	ax,0xa000		; 0000361B  B800A0  '...'
                  	db	0xE8,0x73,0xD8
                  	pop	ax			; 00003621  58  'X'
                  	test	al,0x10			; 00003622  A810  '..'
                  	jz	x3629			; 00003624  7403  't.'
                  	call	x36ec			; 00003626  E8C300  '...'
                  x3629:	mov	ds,[cs:0x71c]		; 00003629  2E8E1E1C07  '.....'
                  	mov	cx,[0x463]		; 0000362E  8B0E6304  '..c.'
                  	call	x1238			; 00003632  E803DC  '...'
                  	call	x2b6e			; 00003635  E836F5  '.6.'
                  	ret				; 00003638  C3  '.'
                  
                  x3639:	sub	al,0x20			; 00003639  2C20  ', '
                  	mov	ds,[cs:0x71c]		; 0000363B  2E8E1E1C07  '.....'
                  	cli				; 00003640  FA  '.'
                  	mov	[0x7c],bp		; 00003641  892E7C00  '..|.'
                  	mov	[0x7e],es		; 00003645  8C067E00  '..~.'
                  	sti				; 00003649  FB  '.'
                  	jmp	x713			; 0000364A  E9C6D0  '...'
                  
                  x364d:	sub	al,0x20			; 0000364D  2C20  ', '
                  	mov	ds,[cs:0x71c]		; 0000364F  2E8E1E1C07  '.....'
                  	dec	al			; 00003654  FEC8  '..'
                  	jz	x3678			; 00003656  7420  't '
                  	push	cs			; 00003658  0E  '.'
                  	pop	es			; 00003659  07  '.'
                  	dec	al			; 0000365A  FEC8  '..'
                  	jnz	x3666			; 0000365C  7508  'u.'
                  	mov	cx,0xe			; 0000365E  B90E00  '...'
                  	mov	bp,font_8x14		; 00003661  BD8D3F  '..?'
                  	jmp	short x3678		; 00003664  EB12  '..'
                  
                  x3666:	dec	al			; 00003666  FEC8  '..'
                  	jnz	x3672			; 00003668  7508  'u.'
                  	mov	cx,0x8			; 0000366A  B90800  '...'
                  	mov	bp,font_8x8		; 0000366D  BD8D37  '..7'
                  	jmp	short x3678		; 00003670  EB06  '..'
                  
                  x3672:	mov	cx,0x10			; 00003672  B91000  '...'
                  	mov	bp,font_8x16		; 00003675  BDBA4E  '..N'
                  x3678:	cli				; 00003678  FA  '.'
                  	mov	[0x10c],bp		; 00003679  892E0C01  '....'
                  	mov	[0x10e],es		; 0000367D  8C060E01  '....'
                  	sti				; 00003681  FB  '.'
                  	mov	[0x485],cx		; 00003682  890E8504  '....'
                  	mov	al,bl			; 00003686  8AC3  '..'
                  	mov	bx,0x36a4		; 00003688  BBA436  '..6'
                  	or	al,al			; 0000368B  0AC0  0x0A,'.'
                  	jnz	x3694			; 0000368D  7505  'u.'
                  	mov	al,dl			; 0000368F  8AC2  '..'
                  	jmp	short x369c		; 00003691  EB09  '..'
                  
                  	nop				; 00003693  90  '.'
                  x3694:	cmp	al,0x3			; 00003694  3C03  '<.'
                  	jna	x369a			; 00003696  7602  'v.'
                  	mov	al,0x2			; 00003698  B002  '..'
                  x369a:	cs	xlatb			; 0000369A  2ED7  '..'
                  x369c:	dec	al			; 0000369C  FEC8  '..'
                  	mov	[0x484],al		; 0000369E  A28404  '...'
                  x36a1:	jmp	x713			; 000036A1  E96FD0  '.o.'
                  
                  	add	[0x2b19],cl		; 000036A4  000E192B  '...+'
                  x36a8:	mov	cx,[0x485]		; 000036A8  8B0E8504  '....'
                  	mov	dl,[0x484]		; 000036AC  8A168404  '....'
                  	cmp	bh,0x7			; 000036B0  80FF07  '...'
                  	ja	x36a1			; 000036B3  77EC  'w.'
                  	cmp	bh,0x1			; 000036B5  80FF01  '...'
                  	ja	x36d1			; 000036B8  7717  'w.'
                  	mov	ds,[cs:0x71c]		; 000036BA  2E8E1E1C07  '.....'
                  	or	bh,bh			; 000036BF  0AFF  0x0A,'.'
                  	jnz	x36ca			; 000036C1  7507  'u.'
                  	les	bp,[0x7c]		; 000036C3  C42E7C00  '..|.'
                  	jmp	short x36e3		; 000036C7  EB1A  '..'
                  
                  	nop				; 000036C9  90  '.'
                  x36ca:	les	bp,[0x10c]		; 000036CA  C42E0C01  '....'
                  	jmp	short x36e3		; 000036CE  EB13  '..'
                  
                  	nop				; 000036D0  90  '.'
                  x36d1:	sub	bh,0x2			; 000036D1  80EF02  '...'
                  	mov	bl,bh			; 000036D4  8ADF  '..'
                  	sub	bh,bh			; 000036D6  2AFF  '*.'
                  	shl	bx,1			; 000036D8  D1E3  '..'
                  	add	bx,0x3781		; 000036DA  81C38137  '...7'
                  	mov	bp,[cs:bx]		; 000036DE  2E8B2F  '../'
                  	push	cs			; 000036E1  0E  '.'
                  	pop	es			; 000036E2  07  '.'
                  x36e3:	pop	di			; 000036E3  5F  '_'
                  	pop	si			; 000036E4  5E  '^'
                  	pop	bx			; 000036E5  5B  '['
                  	pop	ax			; 000036E6  58  'X'
                  	pop	ax			; 000036E7  58  'X'
                  	pop	ds			; 000036E8  1F  '.'
                  	pop	ax			; 000036E9  58  'X'
                  	pop	ax			; 000036EA  58  'X'
                  	iret				; 000036EB  CF  '.'
                  
                  x36ec:	mov	ds,[cs:0x71c]		; 000036EC  2E8E1E1C07  '.....'
                  	mov	al,bh			; 000036F1  8AC7  '..'
                  	xor	ah,ah			; 000036F3  32E4  '2.'
                  	mov	[0x485],ax		; 000036F5  A38504  '...'
                  	dec	al			; 000036F8  FEC8  '..'
                  	mov	dx,[0x463]		; 000036FA  8B166304  '..c.'
                  	mov	ah,al			; 000036FE  8AE0  '..'
                  	mov	al,0x14			; 00003700  B014  '..'
                  	cmp	byte [0x449],0x7	; 00003702  803E490407  '.>I..'
                  	jnz	x370a			; 00003707  7501  'u.'
                  	out	dx,ax			; 00003709  EF  '.'
                  x370a:	push	ax			; 0000370A  50  'P'
                  	mov	al,0x9			; 0000370B  B009  '..'
                  	out	dx,al			; 0000370D  EE  '.'
                  	inc	dx			; 0000370E  42  'B'
                  	in	al,dx			; 0000370F  EC  '.'
                  	and	al,0xe0			; 00003710  24E0  '$.'
                  	or	ah,al			; 00003712  0AE0  0x0A,'.'
                  	dec	dx			; 00003714  4A  'J'
                  	mov	al,0x9			; 00003715  B009  '..'
                  	out	dx,ax			; 00003717  EF  '.'
                  	pop	ax			; 00003718  58  'X'
                  	mov	cl,ah			; 00003719  8ACC  '..'
                  	dec	ah			; 0000371B  FECC  '..'
                  	mov	ch,ah			; 0000371D  8AEC  '..'
                  	cmp	cl,0xd			; 0000371F  80F90D  '..',0x0D
                  	jl	x3728			; 00003722  7C04  '|.'
                  	sub	cx,0x101		; 00003724  81E90101  '....'
                  x3728:	mov	[0x460],cx		; 00003728  890E6004  '..`.'
                  	mov	al,0xa			; 0000372C  B00A  '.',0x0A
                  	call	x1f5a			; 0000372E  E829E8  '.).'
                  	mov	ah,[0x449]		; 00003731  8A264904  '.&I.'
                  	call	x73e			; 00003735  E806D0  '...'
                  	mov	bl,al			; 00003738  8AD8  '..'
                  	mov	ax,0xc8			; 0000373A  B8C800  '...'
                  	cmp	bl,0x0			; 0000373D  80FB00  '...'
                  	jz	x374d			; 00003740  740B  't.'
                  	mov	ax,0x15e		; 00003742  B85E01  '.^.'
                  	cmp	bl,0x1			; 00003745  80FB01  '...'
                  	jz	x374d			; 00003748  7403  't.'
                  	mov	ax,0x190		; 0000374A  B89001  '...'
                  x374d:	cwd				; 0000374D  99  '.'
                  	div	word [0x485]		; 0000374E  F7368504  '.6..'
                  	dec	ax			; 00003752  48  'H'
                  	mov	[0x484],al		; 00003753  A28404  '...'
                  	inc	al			; 00003756  FEC0  '..'
                  	sub	ah,ah			; 00003758  2AE4  '*.'
                  	mul	word [0x485]		; 0000375A  F7268504  '.&..'
                  	cmp	bl,0x0			; 0000375E  80FB00  '...'
                  	jnz	x3765			; 00003761  7502  'u.'
                  	shl	ax,1			; 00003763  D1E0  '..'
                  x3765:	dec	ax			; 00003765  48  'H'
                  	mov	dx,[0x463]		; 00003766  8B166304  '..c.'
                  	mov	ah,al			; 0000376A  8AE0  '..'
                  	mov	al,0x12			; 0000376C  B012  '..'
                  	out	dx,ax			; 0000376E  EF  '.'
                  	mov	al,[0x484]		; 0000376F  A08404  '...'
                  	inc	al			; 00003772  FEC0  '..'
                  	mul	byte [0x44a]		; 00003774  F6264A04  '.&J.'
                  	shl	ax,1			; 00003778  D1E0  '..'
                  	add	ax,0x100		; 0000377A  050001  '...'
                  	mov	[0x44c],ax		; 0000377D  A34C04  '.L.'
                  	ret				; 00003780  C3  '.'
                  
                  	dw	font_8x14		; 00003781  8D3F  '.?'
                  	dw	font_8x8		; 00003783  8D37  '.7'
                  	dw	font_8x8_hi		; 00003785  8D3B  '.;'
                  	dw	font_8x14_supp		; 00003787  8D4D  '.M'
                  	dw	font_8x16		; 0000378A  BA4E  '.N'
                  	dw	font_8x16_supp		; 0000378B  BA5E  '.^'
                  ;
                  ;   8x8 font (8 bytes per row, one row per character)
                  ;
                  font_8x8:
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00						; 0x0000378D ........
                  	db	0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E						; 0x00003795 ~......~
                  	db	0x7E,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E						; 0x0000379D ~......~
                  	db	0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00						; 0x000037A5 l...|8..
                  	db	0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00						; 0x000037AD .8|.|8..
                  	db	0x38,0x7C,0x38,0xFE,0xFE,0x7C,0x38,0x7C						; 0x000037B5 8|8..|8|
                  	db	0x10,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x7C						; 0x000037BD ..8|.|8|
                  	db	0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00						; 0x000037C5 ........
                  	db	0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF						; 0x000037CD ........
                  	db	0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00						; 0x000037D5 ..fBBf..
                  	db	0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF						; 0x000037DD ........
                  	db	0x0F,0x07,0x0F,0x7D,0xCC,0xCC,0xCC,0x78						; 0x000037E5 ...}...x
                  	db	0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18						; 0x000037ED .fff..~.
                  	db	0x3F,0x33,0x3F,0x30,0x30,0x70,0xF0,0xE0						; 0x000037F5 ?3?00p..
                  	db	0x7F,0x63,0x7F,0x63,0x63,0x67,0xE6,0xC0						; 0x000037FD .c.ccg..
                  	db	0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99						; 0x00003805 .Z....Z.
                  	db	0x80,0xE0,0xF8,0xFE,0xF8,0xE0,0x80,0x00						; 0x0000380D ........
                  	db	0x02,0x0E,0x3E,0xFE,0x3E,0x0E,0x02,0x00						; 0x00003815 ........
                  	db	0x18,0x3C,0x7E,0x18,0x18,0x7E,0x3C,0x18						; 0x0000381D ..~..~..
                  	db	0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x00						; 0x00003825 fffff.f.
                  	db	0x7F,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x00						; 0x0000382D ...{....
                  	db	0x3E,0x63,0x38,0x6C,0x6C,0x38,0xCC,0x78						; 0x00003835 .c8ll8.x
                  	db	0x00,0x00,0x00,0x00,0x7E,0x7E,0x7E,0x00						; 0x0000383D ....~~~.
                  	db	0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0xFF						; 0x00003845 ..~.~...
                  	db	0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x00						; 0x0000384D ..~.....
                  	db	0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00						; 0x00003855 ....~...
                  	db	0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00						; 0x0000385D ........
                  	db	0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00						; 0x00003865 .0`.`0..
                  	db	0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00						; 0x0000386D ........
                  	db	0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00						; 0x00003875 .$f.f$..
                  	db	0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x00,0x00						; 0x0000387D ...~....
                  	db	0x00,0xFF,0xFF,0x7E,0x3C,0x18,0x00,0x00						; 0x00003885 ...~....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00						; 0x0000388D ........
                  	db	0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00						; 0x00003895 0xx00.0.
                  	db	0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00						; 0x0000389D lll.....
                  	db	0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00						; 0x000038A5 ll.l.ll.
                  	db	0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00						; 0x000038AD 0|.x..0.
                  	db	0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00						; 0x000038B5 ....0f..
                  	db	0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00						; 0x000038BD 8l8v..v.
                  	db	0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00						; 0x000038C5 ``......
                  	db	0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x00						; 0x000038CD .0```0..
                  	db	0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00						; 0x000038D5 `0...0`.
                  	db	0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00						; 0x000038DD .f...f..
                  	db	0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00						; 0x000038E5 .00.00..
                  	db	0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60						; 0x000038ED .....00`
                  	db	0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00						; 0x000038F5 ........
                  	db	0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00						; 0x000038FD .....00.
                  	db	0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00						; 0x00003905 ...0`...
                  	db	0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00						; 0x0000390D |.....|.
                  	db	0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00						; 0x00003915 0p0000..
                  	db	0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00						; 0x0000391D x..8`...
                  	db	0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00						; 0x00003925 x..8..x.
                  	db	0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00						; 0x0000392D ..l.....
                  	db	0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00						; 0x00003935 ......x.
                  	db	0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00						; 0x0000393D 8`....x.
                  	db	0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00						; 0x00003945 ....000.
                  	db	0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00						; 0x0000394D x..x..x.
                  	db	0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00						; 0x00003955 x..|..p.
                  	db	0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00						; 0x0000395D .00..00.
                  	db	0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60						; 0x00003965 .00..00`
                  	db	0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00						; 0x0000396D .0`.`0..
                  	db	0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00						; 0x00003975 ........
                  	db	0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00						; 0x0000397D `0...0`.
                  	db	0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00						; 0x00003985 x...0.0.
                  	db	0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00						; 0x0000398D |.....x.
                  	db	0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00						; 0x00003995 0x......
                  	db	0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00						; 0x0000399D .ff|ff..
                  	db	0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00						; 0x000039A5 .f...f..
                  	db	0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00						; 0x000039AD .lfffl..
                  	db	0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00						; 0x000039B5 .bhxhb..
                  	db	0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00						; 0x000039BD .bhxh`..
                  	db	0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00						; 0x000039C5 .f...f..
                  	db	0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00						; 0x000039CD ........
                  	db	0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00						; 0x000039D5 x00000x.
                  	db	0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00						; 0x000039DD ......x.
                  	db	0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00						; 0x000039E5 .flxlf..
                  	db	0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00						; 0x000039ED .```bf..
                  	db	0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00						; 0x000039F5 ........
                  	db	0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00						; 0x000039FD ........
                  	db	0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00						; 0x00003A05 8l...l8.
                  	db	0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00						; 0x00003A0D .ff|``..
                  	db	0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00						; 0x00003A15 x....x..
                  	db	0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00						; 0x00003A1D .ff|lf..
                  	db	0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00						; 0x00003A25 x..p..x.
                  	db	0xFC,0xB4,0x30,0x30,0x30,0x30,0x78,0x00						; 0x00003A2D ..0000x.
                  	db	0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00						; 0x00003A35 ........
                  	db	0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00						; 0x00003A3D .....x0.
                  	db	0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00						; 0x00003A45 ........
                  	db	0xC6,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00						; 0x00003A4D ..l88l..
                  	db	0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00						; 0x00003A55 ...x00x.
                  	db	0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00						; 0x00003A5D ....2f..
                  	db	0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00						; 0x00003A65 x`````x.
                  	db	0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00						; 0x00003A6D .`0.....
                  	db	0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00						; 0x00003A75 x.....x.
                  	db	0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00						; 0x00003A7D .8l.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF						; 0x00003A85 ........
                  	db	0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00						; 0x00003A8D 00......
                  	db	0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00						; 0x00003A95 ..x.|.v.
                  	db	0xE0,0x60,0x60,0x7C,0x66,0x66,0xDC,0x00						; 0x00003A9D .``|ff..
                  	db	0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00						; 0x00003AA5 ..x...x.
                  	db	0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00						; 0x00003AAD ...|..v.
                  	db	0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00						; 0x00003AB5 ..x...x.
                  	db	0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00						; 0x00003ABD 8l`.``..
                  	db	0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8						; 0x00003AC5 ..v..|..
                  	db	0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00						; 0x00003ACD .`lvff..
                  	db	0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00						; 0x00003AD5 0.p000x.
                  	db	0x0C,0x00,0x0C,0x0C,0x0C,0xCC,0xCC,0x78						; 0x00003ADD .......x
                  	db	0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00						; 0x00003AE5 .`flxl..
                  	db	0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00						; 0x00003AED p00000x.
                  	db	0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00						; 0x00003AF5 ........
                  	db	0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00						; 0x00003AFD ........
                  	db	0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00						; 0x00003B05 ..x...x.
                  	db	0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0						; 0x00003B0D ...ff|`.
                  	db	0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E						; 0x00003B15 ..v..|..
                  	db	0x00,0x00,0xDC,0x76,0x66,0x60,0xF0,0x00						; 0x00003B1D ...vf`..
                  	db	0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00						; 0x00003B25 ..|.x...
                  	db	0x10,0x30,0x7C,0x30,0x30,0x34,0x18,0x00						; 0x00003B2D .0|004..
                  	db	0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00						; 0x00003B35 ......v.
                  	db	0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00						; 0x00003B3D .....x0.
                  	db	0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00						; 0x00003B45 ......l.
                  	db	0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00						; 0x00003B4D ...l8l..
                  	db	0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8						; 0x00003B55 .....|..
                  	db	0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00						; 0x00003B5D ....0d..
                  	db	0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00						; 0x00003B65 .00.00..
                  	db	0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00						; 0x00003B6D ........
                  	db	0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00						; 0x00003B75 .00.00..
                  	db	0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00						; 0x00003B7D v.......
                  	db	0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00						; 0x00003B85 ..8l....
                  font_8x8_hi:
                  	db	0x78,0xCC,0xC0,0xCC,0x78,0x18,0x0C,0x78						; 0x00003B8D x...x..x
                  	db	0x00,0xCC,0x00,0xCC,0xCC,0xCC,0x7E,0x00						; 0x00003B95 ......~.
                  	db	0x1C,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00						; 0x00003B9D ..x...x.
                  	db	0x7E,0xC3,0x3C,0x06,0x3E,0x66,0x3F,0x00						; 0x00003BA5 ~....f?.
                  	db	0xCC,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00						; 0x00003BAD ..x.|.~.
                  	db	0xE0,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00						; 0x00003BB5 ..x.|.~.
                  	db	0x30,0x30,0x78,0x0C,0x7C,0xCC,0x7E,0x00						; 0x00003BBD 00x.|.~.
                  	db	0x00,0x00,0x78,0xC0,0xC0,0x78,0x0C,0x38						; 0x00003BC5 ..x..x.8
                  	db	0x7E,0xC3,0x3C,0x66,0x7E,0x60,0x3C,0x00						; 0x00003BCD ~..f~`..
                  	db	0xCC,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00						; 0x00003BD5 ..x...x.
                  	db	0xE0,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00						; 0x00003BDD ..x...x.
                  	db	0xCC,0x00,0x70,0x30,0x30,0x30,0x78,0x00						; 0x00003BE5 ..p000x.
                  	db	0x7C,0xC6,0x38,0x18,0x18,0x18,0x3C,0x00						; 0x00003BED |.8.....
                  	db	0xE0,0x00,0x70,0x30,0x30,0x30,0x78,0x00						; 0x00003BF5 ..p000x.
                  	db	0xC6,0x38,0x6C,0xC6,0xFE,0xC6,0xC6,0x00						; 0x00003BFD .8l.....
                  	db	0x30,0x30,0x00,0x78,0xCC,0xFC,0xCC,0x00						; 0x00003C05 00.x....
                  	db	0x1C,0x00,0xFC,0x60,0x78,0x60,0xFC,0x00						; 0x00003C0D ...`x`..
                  	db	0x00,0x00,0x7F,0x0C,0x7F,0xCC,0x7F,0x00						; 0x00003C15 ........
                  	db	0x3E,0x6C,0xCC,0xFE,0xCC,0xCC,0xCE,0x00						; 0x00003C1D .l......
                  	db	0x78,0xCC,0x00,0x78,0xCC,0xCC,0x78,0x00						; 0x00003C25 x..x..x.
                  	db	0x00,0xCC,0x00,0x78,0xCC,0xCC,0x78,0x00						; 0x00003C2D ...x..x.
                  	db	0x00,0xE0,0x00,0x78,0xCC,0xCC,0x78,0x00						; 0x00003C35 ...x..x.
                  	db	0x78,0xCC,0x00,0xCC,0xCC,0xCC,0x7E,0x00						; 0x00003C3D x.....~.
                  	db	0x00,0xE0,0x00,0xCC,0xCC,0xCC,0x7E,0x00						; 0x00003C45 ......~.
                  	db	0x00,0xCC,0x00,0xCC,0xCC,0x7C,0x0C,0xF8						; 0x00003C4D .....|..
                  	db	0xC3,0x18,0x3C,0x66,0x66,0x3C,0x18,0x00						; 0x00003C55 ...ff...
                  	db	0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x00						; 0x00003C5D ......x.
                  	db	0x18,0x18,0x7E,0xC0,0xC0,0x7E,0x18,0x18						; 0x00003C65 ..~..~..
                  	db	0x38,0x6C,0x64,0xF0,0x60,0xE6,0xFC,0x00						; 0x00003C6D 8ld.`...
                  	db	0xCC,0xCC,0x78,0xFC,0x30,0xFC,0x30,0x30						; 0x00003C75 ..x.0.00
                  	db	0xF8,0xCC,0xCC,0xFA,0xC6,0xCF,0xC6,0xC7						; 0x00003C7D ........
                  	db	0x0E,0x1B,0x18,0x3C,0x18,0x18,0xD8,0x70						; 0x00003C85 .......p
                  	db	0x1C,0x00,0x78,0x0C,0x7C,0xCC,0x7E,0x00						; 0x00003C8D ..x.|.~.
                  	db	0x38,0x00,0x70,0x30,0x30,0x30,0x78,0x00						; 0x00003C95 8.p000x.
                  	db	0x00,0x1C,0x00,0x78,0xCC,0xCC,0x78,0x00						; 0x00003C9D ...x..x.
                  	db	0x00,0x1C,0x00,0xCC,0xCC,0xCC,0x7E,0x00						; 0x00003CA5 ......~.
                  	db	0x00,0xF8,0x00,0xF8,0xCC,0xCC,0xCC,0x00						; 0x00003CAD ........
                  	db	0xFC,0x00,0xCC,0xEC,0xFC,0xDC,0xCC,0x00						; 0x00003CB5 ........
                  	db	0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00						; 0x00003CBD .ll..~..
                  	db	0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00						; 0x00003CC5 8ll8.|..
                  	db	0x30,0x00,0x30,0x60,0xC0,0xCC,0x78,0x00						; 0x00003CCD 0.0`..x.
                  	db	0x00,0x00,0x00,0xFC,0xC0,0xC0,0x00,0x00						; 0x00003CD5 ........
                  	db	0x00,0x00,0x00,0xFC,0x0C,0x0C,0x00,0x00						; 0x00003CDD ........
                  	db	0xC3,0xC6,0xCC,0xDE,0x33,0x66,0xCC,0x0F						; 0x00003CE5 ....3f..
                  	db	0xC3,0xC6,0xCC,0xDB,0x37,0x6F,0xCF,0x03						; 0x00003CED ....7o..
                  	db	0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00						; 0x00003CF5 ........
                  	db	0x00,0x33,0x66,0xCC,0x66,0x33,0x00,0x00						; 0x00003CFD .3f.f3..
                  	db	0x00,0xCC,0x66,0x33,0x66,0xCC,0x00,0x00						; 0x00003D05 ..f3f...
                  	db	0x22,0x88,0x22,0x88,0x22,0x88,0x22,0x88						; 0x00003D0D ".".".".
                  	db	0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA						; 0x00003D15 U.U.U.U.
                  	db	0xDB,0x77,0xDB,0xEE,0xDB,0x77,0xDB,0xEE						; 0x00003D1D .w...w..
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18						; 0x00003D25 ........
                  	db	0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18						; 0x00003D2D ........
                  	db	0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18						; 0x00003D35 ........
                  	db	0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36						; 0x00003D3D 6666.666
                  	db	0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36						; 0x00003D45 .....666
                  	db	0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18						; 0x00003D4D ........
                  	db	0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36						; 0x00003D55 66...666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36						; 0x00003D5D 66666666
                  	db	0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36						; 0x00003D65 .....666
                  	db	0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00						; 0x00003D6D 66......
                  	db	0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00						; 0x00003D75 6666....
                  	db	0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00						; 0x00003D7D ........
                  	db	0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18						; 0x00003D85 ........
                  	db	0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00						; 0x00003D8D ........
                  	db	0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00						; 0x00003D95 ........
                  	db	0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18						; 0x00003D9D ........
                  	db	0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18						; 0x00003DA5 ........
                  	db	0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00						; 0x00003DAD ........
                  	db	0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18						; 0x00003DB5 ........
                  	db	0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18						; 0x00003DBD ........
                  	db	0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36						; 0x00003DC5 66667666
                  	db	0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00						; 0x00003DCD 6670?...
                  	db	0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36						; 0x00003DD5 ..?07666
                  	db	0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00						; 0x00003DDD 66......
                  	db	0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36						; 0x00003DE5 .....666
                  	db	0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36						; 0x00003DED 66707666
                  	db	0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00						; 0x00003DF5 ........
                  	db	0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36						; 0x00003DFD 66...666
                  	db	0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00						; 0x00003E05 ........
                  	db	0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00						; 0x00003E0D 6666....
                  	db	0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18						; 0x00003E15 ........
                  	db	0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36						; 0x00003E1D .....666
                  	db	0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00						; 0x00003E25 6666?...
                  	db	0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00						; 0x00003E2D ........
                  	db	0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18						; 0x00003E35 ........
                  	db	0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36						; 0x00003E3D ....?666
                  	db	0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36						; 0x00003E45 6666.666
                  	db	0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18						; 0x00003E4D ........
                  	db	0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00						; 0x00003E55 ........
                  	db	0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18						; 0x00003E5D ........
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF						; 0x00003E65 ........
                  	db	0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF						; 0x00003E6D ........
                  	db	0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0						; 0x00003E75 ........
                  	db	0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F						; 0x00003E7D ........
                  	db	0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00						; 0x00003E85 ........
                  	db	0x00,0x00,0x76,0xDC,0xC8,0xDC,0x76,0x00						; 0x00003E8D ..v...v.
                  	db	0x00,0x78,0xCC,0xF8,0xCC,0xF8,0xC0,0xC0						; 0x00003E95 .x......
                  	db	0x00,0xFC,0xCC,0xC0,0xC0,0xC0,0xC0,0x00						; 0x00003E9D ........
                  	db	0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x00						; 0x00003EA5 ..lllll.
                  	db	0xFC,0xCC,0x60,0x30,0x60,0xCC,0xFC,0x00						; 0x00003EAD ..`0`...
                  	db	0x00,0x00,0x7E,0xD8,0xD8,0xD8,0x70,0x00						; 0x00003EB5 ..~...p.
                  	db	0x00,0x66,0x66,0x66,0x66,0x7C,0x60,0xC0						; 0x00003EBD .ffff|`.
                  	db	0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x00						; 0x00003EC5 .v......
                  	db	0xFC,0x30,0x78,0xCC,0xCC,0x78,0x30,0xFC						; 0x00003ECD .0x..x0.
                  	db	0x38,0x6C,0xC6,0xFE,0xC6,0x6C,0x38,0x00						; 0x00003ED5 8l...l8.
                  	db	0x38,0x6C,0xC6,0xC6,0x6C,0x6C,0xEE,0x00						; 0x00003EDD 8l..ll..
                  	db	0x1C,0x30,0x18,0x7C,0xCC,0xCC,0x78,0x00						; 0x00003EE5 .0.|..x.
                  	db	0x00,0x00,0x7E,0xDB,0xDB,0x7E,0x00,0x00						; 0x00003EED ..~..~..
                  	db	0x06,0x0C,0x7E,0xDB,0xDB,0x7E,0x60,0xC0						; 0x00003EF5 ..~..~`.
                  	db	0x38,0x60,0xC0,0xF8,0xC0,0x60,0x38,0x00						; 0x00003EFD 8`...`8.
                  	db	0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x00						; 0x00003F05 x.......
                  	db	0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0x00						; 0x00003F0D ........
                  	db	0x30,0x30,0xFC,0x30,0x30,0x00,0xFC,0x00						; 0x00003F15 00.00...
                  	db	0x60,0x30,0x18,0x30,0x60,0x00,0xFC,0x00						; 0x00003F1D `0.0`...
                  	db	0x18,0x30,0x60,0x30,0x18,0x00,0xFC,0x00						; 0x00003F25 .0`0....
                  	db	0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18						; 0x00003F2D ........
                  	db	0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0x70						; 0x00003F35 .......p
                  	db	0x30,0x30,0x00,0xFC,0x00,0x30,0x30,0x00						; 0x00003F3D 00...00.
                  	db	0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00						; 0x00003F45 .v..v...
                  	db	0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00						; 0x00003F4D 8ll8....
                  	db	0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00						; 0x00003F55 ........
                  	db	0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00						; 0x00003F5D ........
                  	db	0x0F,0x0C,0x0C,0x0C,0xEC,0x6C,0x3C,0x1C						; 0x00003F65 .....l..
                  	db	0x78,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00						; 0x00003F6D xllll...
                  	db	0x70,0x18,0x30,0x60,0x78,0x00,0x00,0x00						; 0x00003F75 p.0`x...
                  	db	0x00,0x00,0x3C,0x3C,0x3C,0x3C,0x00,0x00						; 0x00003F7D ........
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00						; 0x00003F85 ........
                  ;
                  ;   8x14 font (14 bytes per row, one row per character)
                  ;
                  font_8x14:
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00003F8D ..............
                  	db	0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x7E,0x00,0x00,0x00		; 0x00003F9B ..~.......~...
                  	db	0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0x7E,0x00,0x00,0x00		; 0x00003FA9 ..~.......~...
                  	db	0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00		; 0x00003FB7 ...l....|8....
                  	db	0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00		; 0x00003FC5 ....8|.|8.....
                  	db	0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00003FD3 ..............
                  	db	0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00003FE1 ....~..~......
                  	db	0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00		; 0x00003FEF ..............
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF		; 0x00003FFD ..............
                  	db	0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00		; 0x0000400B .....fBBf.....
                  	db	0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF		; 0x00004019 ..............
                  	db	0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00		; 0x00004027 .....2x...x...
                  	db	0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00		; 0x00004035 ...fff..~.....
                  	db	0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00		; 0x00004043 ..?3?000p.....
                  	db	0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00		; 0x00004051 ...c.cccg.....
                  	db	0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00		; 0x0000405F ..............
                  	db	0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFE,0xF8,0xE0,0xC0,0x80,0x00,0x00,0x00		; 0x0000406D ..............
                  	db	0x00,0x00,0x02,0x06,0x0E,0x3E,0xFE,0x3E,0x0E,0x06,0x02,0x00,0x00,0x00		; 0x0000407B ..............
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00		; 0x00004089 ....~...~.....
                  	db	0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00		; 0x00004097 ..ffffff.ff...
                  	db	0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00		; 0x000040A5 ......{.......
                  	db	0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00		; 0x000040B3 .|.`8l..l8..|.
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0x00,0x00,0x00		; 0x000040C1 ..............
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00		; 0x000040CF ....~...~..~..
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00		; 0x000040DD ....~.........
                  	db	0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00		; 0x000040EB ........~.....
                  	db	0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00		; 0x000040F9 ..............
                  	db	0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00		; 0x00004107 ....0`.`0.....
                  	db	0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00		; 0x00004115 ..............
                  	db	0x00,0x00,0x00,0x00,0x28,0x6C,0xFE,0x6C,0x28,0x00,0x00,0x00,0x00,0x00		; 0x00004123 ....(l.l(.....
                  	db	0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00		; 0x00004131 ....88||......
                  	db	0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00		; 0x0000413F .....||88.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x0000414D ..............
                  	db	0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00		; 0x0000415B ..............
                  	db	0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004169 .fff$.........
                  	db	0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00		; 0x00004177 ..ll.lll.ll...
                  	db	0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00		; 0x00004185 ..|...|...|...
                  	db	0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x66,0xC6,0x00,0x00,0x00		; 0x00004193 ........0f....
                  	db	0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000041A1 ..8ll8v...v...
                  	db	0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000041AF .000`.........
                  	db	0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00		; 0x000041BD ....00000.....
                  	db	0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00		; 0x000041CB ..0.......0...
                  	db	0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00		; 0x000041D9 ....f...f.....
                  	db	0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00		; 0x000041E7 ......~.......
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00		; 0x000041F5 ...........0..
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004203 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00		; 0x00004211 ..............
                  	db	0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00		; 0x0000421F ......0`......
                  	db	0x00,0x00,0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x0000422D ..|.......|...
                  	db	0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00		; 0x0000423B ...8x.....~...
                  	db	0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00		; 0x00004249 ..|....0`.....
                  	db	0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00		; 0x00004257 ..|.......|...
                  	db	0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x1E,0x00,0x00,0x00		; 0x00004265 .....l........
                  	db	0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00		; 0x00004273 ..........|...
                  	db	0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x00004281 ..8`......|...
                  	db	0x00,0x00,0xFE,0xC6,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00		; 0x0000428F .......0000...
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x0000429D ..|...|...|...
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x0C,0x78,0x00,0x00,0x00		; 0x000042AB ..|...~...x...
                  	db	0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00		; 0x000042B9 ..............
                  	db	0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00		; 0x000042C7 ..........0...
                  	db	0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00		; 0x000042D5 .....0`0......
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00		; 0x000042E3 .....~..~.....
                  	db	0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00		; 0x000042F1 ..`0.....0`...
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00		; 0x000042FF ..|...........
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00		; 0x0000430D ..|.......|...
                  	db	0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00		; 0x0000431B ...8l.........
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0xFC,0x00,0x00,0x00		; 0x00004329 ...fff|fff....
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00		; 0x00004337 ...f.....f....
                  	db	0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00		; 0x00004345 ...lfffffl....
                  	db	0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x62,0x66,0xFE,0x00,0x00,0x00		; 0x00004353 ...fbhxhbf....
                  	db	0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0xF0,0x00,0x00,0x00		; 0x00004361 ...fbhxh``....
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0x66,0x3A,0x00,0x00,0x00		; 0x0000436F ...f.....f:...
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00		; 0x0000437D ..............
                  	db	0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x0000438B ..............
                  	db	0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,0x00,0x00		; 0x00004399 ..........x...
                  	db	0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x6C,0x6C,0x66,0xE6,0x00,0x00,0x00		; 0x000043A7 ...fllxllf....
                  	db	0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00		; 0x000043B5 ...`````bf....
                  	db	0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00		; 0x000043C3 ..............
                  	db	0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00		; 0x000043D1 ..............
                  	db	0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00		; 0x000043DF ..8l.....l8...
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0xF0,0x00,0x00,0x00		; 0x000043ED ...fff|```....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00		; 0x000043FB ..|......|....
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00		; 0x00004409 ...fff|lff....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x00004417 ..|..`8...|...
                  	db	0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00004425 ..~~Z.........
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x00004433 ..........|...
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00		; 0x00004441 ........l8....
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x7C,0x6C,0x00,0x00,0x00		; 0x0000444F .........|l...
                  	db	0x00,0x00,0xC6,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0xC6,0x00,0x00,0x00		; 0x0000445D ....l888l.....
                  	db	0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x0000446B ..ffff........
                  	db	0x00,0x00,0xFE,0xC6,0x8C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00		; 0x00004479 ......0`......
                  	db	0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00		; 0x00004487 ...0000000....
                  	db	0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00		; 0x00004495 .....p8.......
                  	db	0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00		; 0x000044A3 ..............
                  	db	0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000044B1 .8l...........
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00		; 0x000044BF ..............
                  	db	0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000044CD 00............
                  	db	0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000044DB .....x.|..v...
                  	db	0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x7C,0x00,0x00,0x00		; 0x000044E9 ...``xlfff|...
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x000044F7 .....|....|...
                  	db	0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x00004505 ......l...v...
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x00004513 .....|....|...
                  	db	0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0xF0,0x00,0x00,0x00		; 0x00004521 ..8ld`.```....
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00		; 0x0000452F .....v...|..x.
                  	db	0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0xE6,0x00,0x00,0x00		; 0x0000453D ...``lvfff....
                  	db	0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x0000454B .....8........
                  	db	0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00		; 0x00004559 ..........ff..
                  	db	0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00		; 0x00004567 ...``flxlf....
                  	db	0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00004575 ..8...........
                  	db	0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xC6,0x00,0x00,0x00		; 0x00004583 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00		; 0x00004591 ......fffff...
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x0000459F .....|....|...
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00		; 0x000045AD ......fff|``..
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00		; 0x000045BB .....v...|....
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x66,0x60,0x60,0xF0,0x00,0x00,0x00		; 0x000045C9 ......vf``....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x70,0x1C,0xC6,0x7C,0x00,0x00,0x00		; 0x000045D7 .....|.p..|...
                  	db	0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00		; 0x000045E5 ...00.0006....
                  	db	0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000045F3 ..........v...
                  	db	0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00		; 0x00004601 .....ffff.....
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00		; 0x0000460F ..........l...
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00		; 0x0000461D ......l88l....
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00		; 0x0000462B .........~....
                  	db	0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x66,0xFE,0x00,0x00,0x00		; 0x00004639 ........0f....
                  	db	0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x0E,0x00,0x00,0x00		; 0x00004647 ......p.......
                  	db	0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x00,0x00,0x00		; 0x00004655 ..............
                  	db	0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x70,0x00,0x00,0x00		; 0x00004663 ..p.......p...
                  	db	0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004671 ..v...........
                  	db	0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00		; 0x0000467F .....8l.......
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00		; 0x0000468D ...f....f...|.
                  	db	0x00,0x00,0xCC,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x0000469B ..........v...
                  	db	0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x000046A9 ...0.|....|...
                  	db	0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000046B7 ..8l.x.|..v...
                  	db	0x00,0x00,0xCC,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000046C5 .....x.|..v...
                  	db	0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000046D3 .`0..x.|..v...
                  	db	0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000046E1 .8l8.x.|..v...
                  	db	0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00		; 0x000046EF .....f`f......
                  	db	0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x000046FD ..8l.|....|...
                  	db	0x00,0x00,0xCC,0xCC,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x0000470B .....|....|...
                  	db	0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC6,0x7C,0x00,0x00,0x00		; 0x00004719 .`0..|....|...
                  	db	0x00,0x00,0x66,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00004727 ..ff.8........
                  	db	0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00004735 ...f.8........
                  	db	0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x00004743 .`0..8........
                  	db	0x00,0xC6,0xC6,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00,0x00,0x00		; 0x00004751 ....8l........
                  	db	0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00,0x00,0x00		; 0x0000475F 8l8.8l........
                  	db	0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x66,0xFE,0x00,0x00,0x00		; 0x0000476D .0`..f`|`f....
                  	db	0x00,0x00,0x00,0x00,0xCC,0x76,0x36,0x7E,0xD8,0xD8,0x6E,0x00,0x00,0x00		; 0x0000477B .....v6~..n...
                  	db	0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00		; 0x00004789 ...l..........
                  	db	0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x00004797 ..8l.|....|...
                  	db	0x00,0x00,0xC6,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x000047A5 .....|....|...
                  	db	0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x000047B3 .`0..|....|...
                  	db	0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000047C1 .0x.......v...
                  	db	0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x000047CF .`0.......v...
                  	db	0x00,0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00		; 0x000047DD .........~..x.
                  	db	0x00,0xC6,0xC6,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00		; 0x000047EB ...8l....l8...
                  	db	0x00,0xC6,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x000047F9 ..........|...
                  	db	0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00		; 0x00004807 ....f``f......
                  	db	0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00		; 0x00004815 .8ld`.```.....
                  	db	0x00,0x00,0x66,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x00,0x00,0x00		; 0x00004823 ..ff..~.~.....
                  	db	0x00,0xF8,0xCC,0xCC,0xF8,0xC4,0xCC,0xDE,0xCC,0xCC,0xC6,0x00,0x00,0x00		; 0x00004831 ..............
                  	db	0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0xD8,0x70,0x00		; 0x0000483F ......~.....p.
                  	db	0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x0000484D ..0`.x.|..v...
                  	db	0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00		; 0x0000485B ...0.8........
                  	db	0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x00004869 ..0`.|....|...
                  	db	0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00		; 0x00004877 ..0`......v...
                  	db	0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00		; 0x00004885 ..v...fffff...
                  	db	0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0x00,0x00,0x00		; 0x00004893 v.............
                  	db	0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000048A1 ..ll..~.......
                  	db	0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000048AF .8ll8.|.......
                  	db	0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC6,0xC6,0x7C,0x00,0x00,0x00		; 0x000048BD ..00.00`..|...
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00		; 0x000048CB ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x00,0x00,0x00,0x00		; 0x000048D9 ..............
                  	db	0x00,0xC0,0xC0,0xC6,0xCC,0xD8,0x30,0x60,0xDC,0x86,0x0C,0x18,0x3E,0x00		; 0x000048E7 ......0`......
                  	db	0x00,0xC0,0xC0,0xC6,0xCC,0xD8,0x30,0x66,0xCE,0x9E,0x3E,0x06,0x06,0x00		; 0x000048F5 ......0f......
                  	db	0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00		; 0x00004903 ..............
                  	db	0x00,0x00,0x00,0x00,0x36,0x6C,0xD8,0x6C,0x36,0x00,0x00,0x00,0x00,0x00		; 0x00004911 ....6l.l6.....
                  	db	0x00,0x00,0x00,0x00,0xD8,0x6C,0x36,0x6C,0xD8,0x00,0x00,0x00,0x00,0x00		; 0x0000491F .....l6l......
                  	db	0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44		; 0x0000492D .D.D.D.D.D.D.D
                  	db	0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA		; 0x0000493B U.U.U.U.U.U.U.
                  	db	0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77		; 0x00004949 .w.w.w.w.w.w.w
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004957 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004965 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004973 ..............
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004981 6666666.666666
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36		; 0x0000498F ........666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18		; 0x0000499D ..............
                  	db	0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36		; 0x000049AB 66666...666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36		; 0x000049B9 66666666666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36		; 0x000049C7 ........666666
                  	db	0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000049D5 66666.........
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000049E3 6666666.......
                  	db	0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00		; 0x000049F1 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18		; 0x000049FF ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004A0D ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004A1B ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004A29 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004A37 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004A45 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004A53 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004A61 ..............
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004A6F 66666667666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004A7D 6666670?......
                  	db	0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004A8B .....?07666666
                  	db	0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004A99 66666.........
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004AA7 ........666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004AB5 66666707666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004AC3 ..............
                  	db	0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004AD1 66666...666666
                  	db	0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004ADF ..............
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004AED 6666666.......
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004AFB ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004B09 ........666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004B17 6666666?......
                  	db	0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004B25 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004B33 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004B41 .......?666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36		; 0x00004B4F 6666666.666666
                  	db	0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004B5D ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004B6B ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004B79 ..............
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF		; 0x00004B87 ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF		; 0x00004B95 ..............
                  	db	0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0		; 0x00004BA3 ..............
                  	db	0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F		; 0x00004BB1 ..............
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004BBF ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00		; 0x00004BCD .....v....v...
                  	db	0x00,0x00,0x00,0x00,0x7C,0xC6,0xFC,0xC6,0xC6,0xFC,0xC0,0xC0,0x40,0x00		; 0x00004BDB ....|.......@.
                  	db	0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00		; 0x00004BE9 ..............
                  	db	0x00,0x00,0x00,0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00		; 0x00004BF7 .....llllll...
                  	db	0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00		; 0x00004C05 ....`0.0`.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00		; 0x00004C13 .....~....p...
                  	db	0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00		; 0x00004C21 ....ffff|``...
                  	db	0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00		; 0x00004C2F ....v.........
                  	db	0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00		; 0x00004C3D ..~..fff..~...
                  	db	0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00		; 0x00004C4B ..8l.....l8...
                  	db	0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00		; 0x00004C59 ..8l...lll....
                  	db	0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x3C,0x00,0x00,0x00		; 0x00004C67 ...0...fff....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00		; 0x00004C75 .....~..~.....
                  	db	0x00,0x00,0x03,0x06,0x7E,0xDB,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00		; 0x00004C83 ....~...~`....
                  	db	0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x30,0x1C,0x00,0x00,0x00		; 0x00004C91 ...0``|``0....
                  	db	0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00		; 0x00004C9F ...|..........
                  	db	0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00		; 0x00004CAD ..............
                  	db	0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00		; 0x00004CBB .....~........
                  	db	0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00		; 0x00004CC9 ..0.....0.~...
                  	db	0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00		; 0x00004CD7 ....0`0...~...
                  	db	0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18		; 0x00004CE5 ..............
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0x70,0x00,0x00,0x00		; 0x00004CF3 ..........p...
                  	db	0x00,0x00,0x00,0x18,0x18,0x00,0x7E,0x00,0x18,0x18,0x00,0x00,0x00,0x00		; 0x00004D01 ......~.......
                  	db	0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00		; 0x00004D0F ....v..v......
                  	db	0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D1D .8ll8.........
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D2B ..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D39 ..............
                  	db	0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x3C,0x1C,0x00,0x00,0x00		; 0x00004D47 ........l.....
                  	db	0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D55 ..lllll.......
                  	db	0x00,0x70,0xD8,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D63 .p.0`.........
                  	db	0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00		; 0x00004D71 ....||||||....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00		; 0x00004D7F ..............
                  ;
                  ;   8x14 supplemental
                  ;
                  font_8x14_supp:
                  	db	0x1D,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00	; 0x00004D8D .....$f.f$.....
                  	db	0x22,0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00004D9C ".ccc".........
                  	db	0x2B,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00004DAB +..............
                  	db	0x2D,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00004DBA -..............
                  	db	0x4D,0x00,0x00,0xC3,0xE7,0xFF,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00	; 0x00004DC9 M..............
                  	db	0x54,0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00	; 0x00004DD8 T..............
                  	db	0x56,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00	; 0x00004DE7 V........f.....
                  	db	0x57,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00	; 0x00004DF6 W.........ff...
                  	db	0x58,0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00	; 0x00004E05 X....f...f.....
                  	db	0x59,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x3C,0x00,0x00,0x00	; 0x00004E14 Y.....f........
                  	db	0x5A,0x00,0x00,0xFF,0xC3,0x86,0x0C,0x18,0x30,0x61,0xC3,0xFF,0x00,0x00,0x00	; 0x00004E23 Z.......0a.....
                  	db	0x6D,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00	; 0x00004E32 m..............
                  	db	0x76,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00	; 0x00004E41 v........f.....
                  	db	0x77,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00	; 0x00004E50 w..........f...
                  	db	0x91,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00	; 0x00004E5F .....n;.~..w...
                  	db	0x9B,0x00,0x18,0x18,0x7E,0xC3,0xC0,0xC0,0xC3,0x7E,0x18,0x18,0x00,0x00,0x00	; 0x00004E6E ....~....~.....
                  	db	0x9D,0x00,0x00,0xC3,0x66,0x3C,0x18,0xFF,0x18,0xFF,0x18,0x18,0x00,0x00,0x00	; 0x00004E7D ....f..........
                  	db	0x9E,0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0xF3,0x00,0x00,0x00	; 0x00004E8C ...ff|bfoff....
                  	db	0xF1,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0xFF,0x00,0x00,0x00	; 0x00004E9B ...............
                  	db	0xF6,0x00,0x00,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x18,0x18,0x00,0x00,0x00	; 0x00004EAA ...............
                  	db	0x00	; end-of-supplemental terminator
                  ;
                  ;   8x16 font (16 bytes per row, one row per character)
                  ;
                  font_8x16:
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00004EBA ................
                  	db	0x00,0x00,0x7E,0x81,0xA5,0x81,0x81,0xBD,0x99,0x81,0x81,0x7E,0x00,0x00,0x00,0x00	; 0x00004ECA ..~........~....
                  	db	0x00,0x00,0x7E,0xFF,0xDB,0xFF,0xFF,0xC3,0xE7,0xFF,0xFF,0x7E,0x00,0x00,0x00,0x00	; 0x00004EDA ..~........~....
                  	db	0x00,0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00	; 0x00004EEA ....l....|8.....
                  	db	0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,0x00	; 0x00004EFA .....8|.|8......
                  	db	0x00,0x00,0x00,0x18,0x3C,0x3C,0xE7,0xE7,0xE7,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x00004F0A ................
                  	db	0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x00004F1A .....~..~.......
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00004F2A ................
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC3,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF	; 0x00004F3A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x42,0x42,0x66,0x3C,0x00,0x00,0x00,0x00,0x00	; 0x00004F4A ......fBBf......
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF	; 0x00004F5A ................
                  	db	0x00,0x00,0x1E,0x0E,0x1A,0x32,0x78,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00	; 0x00004F6A .....2x....x....
                  	db	0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00004F7A ...ffff..~......
                  	db	0x00,0x00,0x3F,0x33,0x3F,0x30,0x30,0x30,0x30,0x70,0xF0,0xE0,0x00,0x00,0x00,0x00	; 0x00004F8A ..?3?0000p......
                  	db	0x00,0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x63,0x67,0xE7,0xE6,0xC0,0x00,0x00,0x00	; 0x00004F9A ...c.ccccg......
                  	db	0x00,0x00,0x00,0x18,0x18,0xDB,0x3C,0xE7,0x3C,0xDB,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00004FAA ................
                  	db	0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFE,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00	; 0x00004FBA ................
                  	db	0x00,0x02,0x06,0x0E,0x1E,0x3E,0xFE,0x3E,0x1E,0x0E,0x06,0x02,0x00,0x00,0x00,0x00	; 0x00004FCA ................
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00	; 0x00004FDA ....~...~.......
                  	db	0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00	; 0x00004FEA ..fffffff.ff....
                  	db	0x00,0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B,0x1B,0x00,0x00,0x00,0x00	; 0x00004FFA ......{.........
                  	db	0x00,0x7C,0xC6,0x60,0x38,0x6C,0xC6,0xC6,0x6C,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00	; 0x0000500A .|.`8l..l8..|...
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00	; 0x0000501A ................
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00	; 0x0000502A ....~...~..~....
                  	db	0x00,0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x0000503A ....~...........
                  	db	0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00	; 0x0000504A .........~......
                  	db	0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000505A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000506A .....0`.`0......
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000507A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x28,0x6C,0xFE,0x6C,0x28,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000508A .....(l.l(......
                  	db	0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00	; 0x0000509A .....88||.......
                  	db	0x00,0x00,0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00	; 0x000050AA ......||88......
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x000050BA ................
                  	db	0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00	; 0x000050CA ................
                  	db	0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x000050DA .fff$...........
                  	db	0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00	; 0x000050EA ...ll.lll.ll....
                  	db	0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00	; 0x000050FA ..|...|....|....
                  	db	0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00	; 0x0000510A ........0`......
                  	db	0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000511A ..8ll8v....v....
                  	db	0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000512A .000`...........
                  	db	0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00	; 0x0000513A ....000000......
                  	db	0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00	; 0x0000514A ..0........0....
                  	db	0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000515A .....f...f......
                  	db	0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000516A .......~........
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00	; 0x0000517A ............0...
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000518A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00	; 0x0000519A ................
                  	db	0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00	; 0x000051AA ........0`......
                  	db	0x00,0x00,0x38,0x6C,0xC6,0xC6,0xD6,0xD6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00	; 0x000051BA ..8l......l8....
                  	db	0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00	; 0x000051CA ...8x......~....
                  	db	0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00	; 0x000051DA ..|....0`.......
                  	db	0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000051EA ..|........|....
                  	db	0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00	; 0x000051FA .....l..........
                  	db	0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000520A ...........|....
                  	db	0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000521A ..8`.......|....
                  	db	0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00	; 0x0000522A ........0000....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000523A ..|...|....|....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00	; 0x0000524A ..|...~....x....
                  	db	0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00	; 0x0000525A ................
                  	db	0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00	; 0x0000526A ...........0....
                  	db	0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00	; 0x0000527A ......0`0.......
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000528A .....~..~.......
                  	db	0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00	; 0x0000529A ...`0.....0`....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00	; 0x000052AA ..|.............
                  	db	0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00	; 0x000052BA ...|.......|....
                  	db	0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x000052CA ...8l...........
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00	; 0x000052DA ...fff|ffff.....
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00	; 0x000052EA ...f......f.....
                  	db	0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00	; 0x000052FA ...lffffffl.....
                  	db	0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00	; 0x0000530A ...fbhxh`bf.....
                  	db	0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00	; 0x0000531A ...fbhxh```.....
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00	; 0x0000532A ...f......f:....
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000533A ................
                  	db	0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000534A ................
                  	db	0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00	; 0x0000535A ...........x....
                  	db	0x00,0x00,0xE6,0x66,0x66,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00	; 0x0000536A ...fflxxlff.....
                  	db	0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00	; 0x0000537A ...``````bf.....
                  	db	0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000538A ................
                  	db	0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000539A ................
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000053AA ..|........|....
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00	; 0x000053BA ...fff|````.....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00	; 0x000053CA ..|........|....
                  	db	0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00	; 0x000053DA ...fff|lfff.....
                  	db	0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000053EA ..|..`8....|....
                  	db	0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x000053FA ..~~Z...........
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000540A ...........|....
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00	; 0x0000541A .........l8.....
                  	db	0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xD6,0xFE,0xEE,0x6C,0x00,0x00,0x00,0x00	; 0x0000542A ...........l....
                  	db	0x00,0x00,0xC6,0xC6,0x6C,0x7C,0x38,0x38,0x7C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000543A ....l|88|l......
                  	db	0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000544A ..ffff..........
                  	db	0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00	; 0x0000545A .......0`.......
                  	db	0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00	; 0x0000546A ...00000000.....
                  	db	0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00	; 0x0000547A ......p8........
                  	db	0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00	; 0x0000548A ................
                  	db	0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000549A .8l.............
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00	; 0x000054AA ................
                  	db	0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x000054BA 00..............
                  	db	0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000054CA .....x.|...v....
                  	db	0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x00,0x00	; 0x000054DA ...``xlffff|....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000054EA .....|.....|....
                  	db	0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000054FA ......l....v....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000550A .....|.....|....
                  	db	0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00	; 0x0000551A ..8ld`.````.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00	; 0x0000552A .....v.....|..x.
                  	db	0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00	; 0x0000553A ...``lvffff.....
                  	db	0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000554A .....8..........
                  	db	0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00	; 0x0000555A ............ff..
                  	db	0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00	; 0x0000556A ...``flxxlf.....
                  	db	0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000557A ..8.............
                  	db	0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xC6,0x00,0x00,0x00,0x00	; 0x0000558A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00	; 0x0000559A ......ffffff....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000055AA .....|.....|....
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00	; 0x000055BA ......fffff|``..
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00	; 0x000055CA .....v.....|....
                  	db	0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x66,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00	; 0x000055DA ......vf```.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000055EA .....|.`8..|....
                  	db	0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00	; 0x000055FA ...00.00006.....
                  	db	0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000560A ...........v....
                  	db	0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00	; 0x0000561A .....fffff......
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00	; 0x0000562A ...........l....
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00	; 0x0000563A ......l888l.....
                  	db	0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00	; 0x0000564A ...........~....
                  	db	0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00	; 0x0000565A ........0`......
                  	db	0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00	; 0x0000566A ......p.........
                  	db	0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x0000567A ................
                  	db	0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00	; 0x0000568A ..p........p....
                  	db	0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000569A ..v.............
                  	db	0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00	; 0x000056AA .....8l.........
                  	db	0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x0C,0x06,0x7C,0x00,0x00	; 0x000056BA ...f.....f...|..
                  	db	0x00,0x00,0xCC,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000056CA ...........v....
                  	db	0x00,0x0C,0x18,0x30,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000056DA ...0.|.....|....
                  	db	0x00,0x10,0x38,0x6C,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000056EA ..8l.x.|...v....
                  	db	0x00,0x00,0xCC,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000056FA .....x.|...v....
                  	db	0x00,0x60,0x30,0x18,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000570A .`0..x.|...v....
                  	db	0x00,0x38,0x6C,0x38,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000571A .8l8.x.|...v....
                  	db	0x00,0x00,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x0C,0x06,0x3C,0x00,0x00,0x00	; 0x0000572A .....f``f.......
                  	db	0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000573A ..8l.|.....|....
                  	db	0x00,0x00,0xC6,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000574A .....|.....|....
                  	db	0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000575A .`0..|.....|....
                  	db	0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000576A ..f..8..........
                  	db	0x00,0x18,0x3C,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000577A ...f.8..........
                  	db	0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x0000578A .`0..8..........
                  	db	0x00,0xC6,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000579A ....8l..........
                  	db	0x38,0x6C,0x38,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x000057AA 8l8.8l..........
                  	db	0x18,0x30,0x60,0x00,0xFE,0x66,0x60,0x7C,0x60,0x60,0x66,0xFE,0x00,0x00,0x00,0x00	; 0x000057BA .0`..f`|``f.....
                  	db	0x00,0x00,0x00,0x00,0x00,0xCC,0x76,0x36,0x7E,0xD8,0xD8,0x6E,0x00,0x00,0x00,0x00	; 0x000057CA ......v6~..n....
                  	db	0x00,0x00,0x3E,0x6C,0xCC,0xCC,0xFE,0xCC,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0x00,0x00	; 0x000057DA ...l............
                  	db	0x00,0x10,0x38,0x6C,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000057EA ..8l.|.....|....
                  	db	0x00,0x00,0xC6,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000057FA .....|.....|....
                  	db	0x00,0x60,0x30,0x18,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000580A .`0..|.....|....
                  	db	0x00,0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000581A .0x........v....
                  	db	0x00,0x60,0x30,0x18,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x0000582A .`0........v....
                  	db	0x00,0x00,0xC6,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00	; 0x0000583A ...........~..x.
                  	db	0x00,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000584A ...|.......|....
                  	db	0x00,0xC6,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000585A ...........|....
                  	db	0x00,0x18,0x18,0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x18,0x18,0x00,0x00,0x00,0x00	; 0x0000586A ....f```f.......
                  	db	0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xE6,0xFC,0x00,0x00,0x00,0x00	; 0x0000587A .8ld`.````......
                  	db	0x00,0x00,0x66,0x66,0x3C,0x18,0x7E,0x18,0x7E,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x0000588A ..ff..~.~.......
                  	db	0x00,0xF8,0xCC,0xCC,0xF8,0xC4,0xCC,0xDE,0xCC,0xCC,0xCC,0xC6,0x00,0x00,0x00,0x00	; 0x0000589A ................
                  	db	0x00,0x0E,0x1B,0x18,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x18,0xD8,0x70,0x00,0x00	; 0x000058AA ......~......p..
                  	db	0x00,0x18,0x30,0x60,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000058BA ..0`.x.|...v....
                  	db	0x00,0x0C,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x000058CA ...0.8..........
                  	db	0x00,0x18,0x30,0x60,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x000058DA ..0`.|.....|....
                  	db	0x00,0x18,0x30,0x60,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00	; 0x000058EA ..0`.......v....
                  	db	0x00,0x00,0x76,0xDC,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00	; 0x000058FA ..v...ffffff....
                  	db	0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x0000590A v...............
                  	db	0x00,0x3C,0x6C,0x6C,0x3E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000591A ..ll..~.........
                  	db	0x00,0x38,0x6C,0x6C,0x38,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000592A .8ll8.|.........
                  	db	0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xC0,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00	; 0x0000593A ..00.00`...|....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00	; 0x0000594A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00	; 0x0000595A ................
                  	db	0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xDC,0x86,0x0C,0x18,0x3E,0x00,0x00	; 0x0000596A .......0`.......
                  	db	0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x9E,0x3E,0x06,0x06,0x00,0x00	; 0x0000597A .......0f.......
                  	db	0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3C,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00	; 0x0000598A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x36,0x6C,0xD8,0x6C,0x36,0x00,0x00,0x00,0x00,0x00,0x00	; 0x0000599A .....6l.l6......
                  	db	0x00,0x00,0x00,0x00,0x00,0xD8,0x6C,0x36,0x6C,0xD8,0x00,0x00,0x00,0x00,0x00,0x00	; 0x000059AA ......l6l.......
                  	db	0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44	; 0x000059BA .D.D.D.D.D.D.D.D
                  	db	0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA	; 0x000059CA U.U.U.U.U.U.U.U.
                  	db	0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77,0xDD,0x77	; 0x000059DA .w.w.w.w.w.w.w.w
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x000059EA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x000059FA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005A0A ................
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005A1A 6666666.66666666
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005A2A ........66666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005A3A ................
                  	db	0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005A4A 66666...66666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005A5A 6666666666666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xFE,0x06,0xF6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005A6A ........66666666
                  	db	0x36,0x36,0x36,0x36,0x36,0xF6,0x06,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005A7A 66666...........
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005A8A 6666666.........
                  	db	0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005A9A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005AAA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005ABA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005ACA ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005ADA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005AEA ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005AFA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005B0A ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005B1A ................
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005B2A 6666666766666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005B3A 6666670?........
                  	db	0x00,0x00,0x00,0x00,0x00,0x3F,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005B4A .....?0766666666
                  	db	0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005B5A 66666...........
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005B6A ........66666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005B7A 6666670766666666
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005B8A ................
                  	db	0x36,0x36,0x36,0x36,0x36,0xF7,0x00,0xF7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005B9A 66666...66666666
                  	db	0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005BAA ................
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005BBA 6666666.........
                  	db	0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005BCA ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005BDA ........66666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005BEA 6666666?........
                  	db	0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005BFA ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005C0A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005C1A .......?66666666
                  	db	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36	; 0x00005C2A 6666666.66666666
                  	db	0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005C3A ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005C4A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005C5A ................
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF	; 0x00005C6A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF	; 0x00005C7A ................
                  	db	0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0	; 0x00005C8A ................
                  	db	0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F	; 0x00005C9A ................
                  	db	0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005CAA ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0xD8,0xD8,0xD8,0xDC,0x76,0x00,0x00,0x00,0x00	; 0x00005CBA .....v.....v....
                  	db	0x00,0x00,0x78,0xCC,0xCC,0xCC,0xD8,0xCC,0xC6,0xC6,0xC6,0xCC,0x00,0x00,0x00,0x00	; 0x00005CCA ..x.............
                  	db	0x00,0x00,0xFE,0xC6,0xC6,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00	; 0x00005CDA ................
                  	db	0x00,0x00,0x00,0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00	; 0x00005CEA .....lllllll....
                  	db	0x00,0x00,0x00,0xFE,0xC6,0x60,0x30,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00	; 0x00005CFA .....`0.0`......
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00	; 0x00005D0A .....~.....p....
                  	db	0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xC0,0x00,0x00,0x00	; 0x00005D1A ....fffff|``....
                  	db	0x00,0x00,0x00,0x00,0x76,0xDC,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00005D2A ....v...........
                  	db	0x00,0x00,0x00,0x7E,0x18,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x00,0x00,0x00,0x00	; 0x00005D3A ...~..fff..~....
                  	db	0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00	; 0x00005D4A ...8l.....l8....
                  	db	0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x6C,0x6C,0x6C,0xEE,0x00,0x00,0x00,0x00	; 0x00005D5A ..8l...llll.....
                  	db	0x00,0x00,0x1E,0x30,0x18,0x0C,0x3E,0x66,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00	; 0x00005D6A ...0...ffff.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x7E,0xDB,0xDB,0xDB,0x7E,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005D7A .....~...~......
                  	db	0x00,0x00,0x00,0x03,0x06,0x7E,0xDB,0xDB,0xF3,0x7E,0x60,0xC0,0x00,0x00,0x00,0x00	; 0x00005D8A .....~...~`.....
                  	db	0x00,0x00,0x1C,0x30,0x60,0x60,0x7C,0x60,0x60,0x60,0x30,0x1C,0x00,0x00,0x00,0x00	; 0x00005D9A ...0``|```0.....
                  	db	0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00	; 0x00005DAA ...|............
                  	db	0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00	; 0x00005DBA ................
                  	db	0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0xFF,0x00,0x00,0x00,0x00	; 0x00005DCA ......~.........
                  	db	0x00,0x00,0x00,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00,0x7E,0x00,0x00,0x00,0x00	; 0x00005DDA ...0.....0.~....
                  	db	0x00,0x00,0x00,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00,0x7E,0x00,0x00,0x00,0x00	; 0x00005DEA .....0`0...~....
                  	db	0x00,0x00,0x0E,0x1B,0x1B,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18	; 0x00005DFA ................
                  	db	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xD8,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00	; 0x00005E0A ...........p....
                  	db	0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7E,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00	; 0x00005E1A .......~........
                  	db	0x00,0x00,0x00,0x00,0x00,0x76,0xDC,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E2A .....v..v.......
                  	db	0x00,0x38,0x6C,0x6C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E3A .8ll8...........
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E4A ................
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E5A ................
                  	db	0x00,0x0F,0x0C,0x0C,0x0C,0x0C,0x0C,0xEC,0x6C,0x6C,0x3C,0x1C,0x00,0x00,0x00,0x00	; 0x00005E6A ........ll......
                  	db	0x00,0xD8,0x6C,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E7A ..lllll.........
                  	db	0x00,0x70,0xD8,0x30,0x60,0xC8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005E8A .p.0`...........
                  	db	0x00,0x00,0x00,0x00,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x00,0x00,0x00,0x00,0x00	; 0x00005E9A ....|||||||.....
                  	db	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005EAA ................
                  ;
                  ;   8x16 supplemental
                  ;
                  font_8x16_supp:
                  	db	0x1D,0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00	; 0x00005EBA ......$f.f$......
                  	db	0x30,0x00,0x00,0x3C,0x66,0xC3,0xC3,0xDB,0xDB,0xC3,0xC3,0x66,0x3C,0x00,0x00,0x00,0x00	; 0x00005ECB 0...f......f.....
                  	db	0x4D,0x00,0x00,0xC3,0xE7,0xFF,0xFF,0xDB,0xC3,0xC3,0xC3,0xC3,0xC3,0x00,0x00,0x00,0x00	; 0x00005EDC M................
                  	db	0x54,0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x00005EED T................
                  	db	0x56,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00,0x00	; 0x00005EFE V.........f......
                  	db	0x57,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x66,0x00,0x00,0x00,0x00	; 0x00005F0F W..........ff....
                  	db	0x58,0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00,0x00	; 0x00005F20 X....f....f......
                  	db	0x59,0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00	; 0x00005F31 Y.....f..........
                  	db	0x5A,0x00,0x00,0xFF,0xC3,0x86,0x0C,0x18,0x30,0x60,0xC1,0xC3,0xFF,0x00,0x00,0x00,0x00	; 0x00005F42 Z.......0`.......
                  	db	0x6D,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0x00,0x00	; 0x00005F53 m................
                  	db	0x76,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x00,0x00,0x00,0x00	; 0x00005F64 v.........f......
                  	db	0x77,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC3,0xDB,0xDB,0xFF,0x66,0x00,0x00,0x00,0x00	; 0x00005F75 w...........f....
                  	db	0x78,0x00,0x00,0x00,0x00,0x00,0xC3,0x66,0x3C,0x18,0x3C,0x66,0xC3,0x00,0x00,0x00,0x00	; 0x00005F86 x......f...f.....
                  	db	0x91,0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x1B,0x7E,0xD8,0xDC,0x77,0x00,0x00,0x00,0x00	; 0x00005F97 ......n;.~..w....
                  	db	0x9B,0x00,0x18,0x18,0x7E,0xC3,0xC0,0xC0,0xC0,0xC3,0x7E,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00005FA8 ....~.....~......
                  	db	0x9D,0x00,0x00,0xC3,0x66,0x3C,0x18,0xFF,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00	; 0x00005FB9 ....f............
                  	db	0x9E,0x00,0xFC,0x66,0x66,0x7C,0x62,0x66,0x6F,0x66,0x66,0x66,0xF3,0x00,0x00,0x00,0x00	; 0x00005FCA ...ff|bfofff.....
                  	db	0xAB,0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x60,0xCE,0x9B,0x06,0x0C,0x1F,0x00,0x00	; 0x00005FDB ........0`.......
                  	db	0xAC,0x00,0xC0,0xC0,0xC2,0xC6,0xCC,0x18,0x30,0x66,0xCE,0x96,0x3E,0x06,0x06,0x00,0x00	; 0x00005FEC ........0f.......
                  	db	0x00	; end-of-supplemental terminator
                  
                  	db	0x00
                  	db	0x1E
                  
            • paradise
              • vga
                • 1988-05-23.json
                  {"data":[
                  -349132203,808728341,792014896,942617394,942746936,976236602,-1461112784,1112080384,1329799245,1413566541,1162625601,0,0,858796032,758527280,1127559216,
                  1381584975,1414022985,1380012064,1397310529,1498619973,1296389203,1313415251,824192579,741816377,943208753,1279336492,1230118988,1398032455,1397051936,1163285061,1095194180,
                  22845,757610496,419831562,101122588,7,1515221248,419831562,101122588,7,757610496,1678147338,66160,0,1380999424,419830031,185401881,
                  12,583936,203,0,-164408034,850648718,-854457928,1074186000,-1945710592,-956284402,1694566406,168216560,-940572671,-1342065658,-1240560634,2080818945,
                  -1945366528,-956269042,268504070,235834376,1946601217,-1946123008,838891022,62896832,23390446,75957958,-1996044704,213389572,45344832,-1342136344,35645441,1342326760,
                  -402633752,-2141703836,-58718236,-2147126267,159318780,-402518088,82510446,15198352,76091008,-620012256,-578354572,248249119,63825927,841947624,38070464,-2095906631,
                  -269999161,1358593,-382786072,-1847054505,64273920,75958006,-1107069950,914949044,817824867,-3676048,971561779,-1996032511,57999620,1392611560,-167586840,17074438,
                  -16119436,1944585593,-402396338,-622309826,-411018418,28951423,-860204800,31778819,-1028456924,-1174283800,-806878252,-401902336,-1125646156,243712,-860218389,29681667,
                  -1028521716,-1174291992,-1343749196,-401574656,129499284,-1993965568,1120796164,1493209832,263766979,63879685,-1342071320,1021587977,-402230005,-461373102,26011649,255639806,
                  179628917,1392607721,1343218816,-402403654,1347944822,1342474656,2131098752,-1993965558,-1477903612,-2146899123,67406094,1481493992,1476692386,1946418304,117211141,2142767221,
                  -402540800,-1017433030,-1432106868,-1475950844,1031067652,225755136,1977614397,-1475950840,-344656892,243319552,-2144336880,33851150,272007363,914362372,-1023277945,-1568848,
                  -1555968,-1327461888,16050202,1006695912,1962979354,-400183288,-404225818,-389773824,-58720034,-1293368539,-13479168,-1187524888,1287520257,1286662264,645927028,-1174731639,
                  1757282309,1285613688,28914667,2018557440,1951176168,-1995538416,96011780,2018819584,-347306520,-2029092840,243271684,1527121033,1400950656,-1107294791,1810397308,108354380,
                  -402535552,-154974504,33851142,-1195768459,-1174148349,1704985560,1355017732,2112362160,45766656,5826561,1911033520,-1161809152,-1007727896,-1976750872,-1976635711,-28840443,
                  2127379137,263242738,-402403654,-528089038,3205186,-1018503034,851690435,63355584,63486702,50379246,-352073286,-69014016,195,0,0,0,
                  -1023349778,-1023349780,1124070888,-269958010,-997831937,-1513277,-1513406,-1168981174,-605534488,1354980095,1526701544,-433924362,1351622379,1526698472,351004170,-401624944,
                  -1202651258,-1075313393,-1161602817,-1192557618,-1447856,-1031057318,-402403654,-346488918,637095,-1191187992,-454361078,-1977171574,-7018459,985792071,-1007583539,-389969156,
                  -22347885,2127379137,1364247539,-1188281880,-1460862978,201056520,-1017620023,803754320,-83668,-536303380,-346531333,-387937571,-1014562973,-997801182,1273554698,378258431,
                  -1031797661,-13047802,619496114,645972832,-1341193080,-1644543,101247184,45089928,-788538392,-2012870432,49924,0,-1157346912,1589182465,753723393,116791157,
                  1963984009,1946631210,749004811,12256884,13154560,1947155651,1947221243,244727,1006756025,1022194705,1021932562,-1142983416,-1866924030,568902401,235369005,2139827719,
                  12305162,750249984,1375708648,-472774991,-1144845735,-2144442224,242548543,1946630702,63144709,53407979,-276758145,-1329370904,629812745,937420880,-1057077416,-243986628,
                  1958696899,752019543,-164748686,1947206471,2139827739,1086817034,736628656,-2134575362,-2144466316,1971586175,113738499,73602699,-335101309,-1341931334,-29038592,1610592488,
                  -1207712582,1072169216,113662,-1977171062,870843489,-75480066,-1292796412,1166681794,-1258389239,604140803,-32184066,27843250,-1162739083,132694066,-32970498,-1070415694,
                  -1291977240,50378948,-1946288664,1161430,-1140984344,-1014366208,174164518,1140713960,2115566464,-25892623,-402648901,314256060,716630016,-402648133,-826660176,47875,
                  -1977171062,-1075300511,-75480067,-1326350840,-42670065,1954596086,1245610109,443909124,-1207712582,-1612185344,112893,-1746402892,1293309,2011693239,-571948246,-396922069,
                  -477430162,-27828037,-1156482868,-855746710,1757088376,2026700375,1467136771,-12615634,-1027993228,126496259,62193281,-31194507,1140674024,-12615634,-695526284,-402648648,
                  -2144404154,242548543,772246062,-402561142,1128529206,-1950094101,-402365642,-695468381,839303808,1358784,2754025,0,1981611136,-817705698,1980824704,-1202708970,
                  -661721088,-29458344,1948252927,-817705726,-53514803,861282043,-2032234762,-2031055932,-1670716,786878720,116692223,1590632286,-1865474210,1027618496,1047543328,1050689168,
                  1054883552,1149256512,1183860288,1195394880,1263552816,1298156400,1358974528,116328175,116328175,116328175,1375752560,21296,853510739,-1948003841,1527009431,1228832963,
                  91488772,71908992,1235272451,1952332804,-1017168894,73602699,-2042433798,-1006899488,65241427,786681856,124688267,50011,-1431677611,636026879,-964014037,-164436942,
                  653785739,-13761462,-1794667612,-1257790457,-1291336185,-772275449,-1731753241,72099575,-1017579517,-523116335,1048639491,1946551369,1491587330,-2061043773,-1963457788,653760711,
                  -134020020,653771608,-134019963,1979677672,-1446540526,192216576,33548161,162589904,-772002328,-773336601,-1329375001,63879683,-1325439511,63224322,-771793431,-1947807258,
                  881525332,195,0,0,0,0,-2119859842,2122422717,-2359426,2130700227,-16843156,1063036,-25413616,1063036,-29852616,2084076798,
                  2084048912,2084076798,1008205824,6204,-1008205825,-6205,1113996288,3958338,-1113996289,-3958339,2098136847,2026687692,1717986876,410916924,809448255,-521113552,
                  1669292927,-1058642077,-415475047,-1722139417,-17244032,8446200,-29487614,134718,410926104,406617624,1717986918,6684774,2078006143,1776411,1815634750,2026649708,
                  0,8289918,410926104,-15188866,410926104,1579032,404232216,1588350,-32761856,6156,-27250688,12384,-1061158912,65216,-10083328,9318,
                  2117867520,65535,2130706176,6204,0,0,813201456,3145776,7105644,0,1828613228,7105790,2025880624,3209228,416073216,13002288,
                  1983409208,7785692,12607584,0,1616916504,1585248,404238432,6303768,-12818944,26172,-63950848,12336,0,1613770752,-67108864,0,
                  0,3158016,806882310,8437856,-556874116,8185590,808480816,16527408,940362872,16567392,940362872,7916556,-865321956,1969406,217628924,7916556,
                  -121610184,7916748,403492092,3158064,2026687608,7916748,2093796472,7346188,3158016,3158016,3158016,1613770752,-1067438056,1585248,16515072,64512,
                  202911840,6303768,403491960,3145776,-555825540,7913694,-859015120,13421820,2087085820,16541286,-1061132740,3958464,1717988600,16280678,2020107006,16671336,
                  2020107006,15753320,-1061132740,4089550,-53687092,13421772,808464504,7876656,202116126,7916748,2020370150,15099500,1616929008,16672354,-16847162,13027030,
                  -554244410,13027022,-960074696,3697862,2087085820,15753312,-858993544,1865948,2087085820,15099500,1893780600,7916572,808498428,7876656,-858993460,16567500,
                  -858993460,3176652,-691616058,13037310,946652870,13003832,2026687692,7876656,411879166,16672306,1616928888,7888992,405823680,132620,404232312,7870488,
                  -965986288,0,0,-16777216,1585200,0,209190912,7785596,2086691040,14444134,-864550912,7916736,2081164316,7785676,-864550912,7913724,
                  -262116296,15753312,-864681984,-133399348,1986814176,15099494,812646448,7876656,202113036,2026687500,1818648800,15101048,808464496,7876656,-20185088,13031166,
                  -856162304,13421772,-864550912,7916748,1725693952,-262112154,-864681984,504134860,1994129408,15753318,-1065615360,16256120,813445136,1586224,-859045888,7785676,
                  -859045888,3176652,-691666944,7143166,1824915456,13003832,-859045888,-133399348,-1728315392,16540720,-533712868,1847344,1579032,1579032,472920288,14692400,
                  56438,0,1815613440,16697030,-859779976,2014058616,-872363008,8309964,-864550884,7913724,104645502,4154942,209191116,8309884,209191136,8309884,
                  209203248,8309884,-1065877504,940341440,1715258238,3956862,-864550708,7913724,-864550688,7913724,812646604,7876656,406374012,3938328,812646624,7876656,
                  -965986106,13027070,2013278256,13434060,1627127836,16539768,209649664,8375423,-20157378,13552844,2013318264,7916748,2013318144,7916748,2013323264,7916748,
                  -872362888,8309964,-872357888,8309964,-872363008,-133399348,1715214531,1588326,-859045684,7916748,-1065478120,404258496,-261854152,16574048,-59192116,808516656,
                  -87241480,-943271994,1008212750,1893210136,209190940,8309884,812646456,7876656,2013273088,7916748,-872408064,8309964,-134154240,13421772,-322174724,13425916,
                  1047292988,32256,946629688,31744,1613758512,7916736,-67108864,49344,-67108864,3084,-557005117,265053747,-607336765,63926071,402659352,1579032,
                  -865717504,13158,862374912,52326,-2011002846,-2011002846,-1437226411,-1437226411,-287606821,-287606821,404232216,404232216,404232216,404232440,418912280,404232440,
                  909522486,909522678,0,909522686,418906112,404232440,116799030,909522678,909522486,909522486,117309440,909522678,116799030,254,909522486,254,
                  418912280,248,0,404232440,404232216,31,404232216,255,0,404232447,404232216,404232223,0,255,404232216,404232447,
                  404690968,404232223,909522486,909522487,808924726,63,809435136,909522487,16201270,255,16711680,909522679,808924726,909522487,16711680,255,
                  16201270,909522679,16717848,255,909522486,255,16711680,404232447,0,909522687,909522486,63,404690968,31,404684800,404232223,
                  0,909522495,909522486,909522687,419371032,404232447,404232216,248,0,404232223,-1,-1,0,-1,-252645136,-252645136,
                  252645135,252645135,-1,0,-596246528,7789768,-120817664,-1061095220,-1060307968,12632256,1819082240,7105644,811650300,16567392,-662831104,7395544,
                  1717986816,-1067418522,417101312,1579032,-864538372,-63932212,-20550600,3697862,-960074696,15625324,2081959964,7916748,-612499456,32475,-612496378,-1067417893,
                  -121610184,3694784,-858993544,13421772,-67044352,64512,821833776,16515120,806891616,16515168,811610136,16515096,404429582,404232216,404232216,1893259288,
                  -67096528,3158016,14448128,56438,946629688,0,402653184,24,0,24,202116111,473722092,1819044984,108,1613764720,120,
                  1010565120,15420,0,0,0,0,0,0,-2119859842,-2120630911,126,-8519680,-1006632997,8323047,0,-16880640,
                  947715838,16,268435456,2097052728,4152,0,-415482856,404285415,60,1008205824,2130706302,3938328,0,402653184,1588284,0,
                  -1,-1010571265,-25,65535,1715208192,1013334594,0,-1,-1111647805,-15463,65535,840568350,-858993544,120,1715208192,406611558,
                  1579134,0,809448255,-261083088,224,1669267456,1667457919,-1058609305,0,1020991512,417021159,24,-1065353216,-117507872,8437984,0,
                  1041106434,101596926,2,1008205824,404232318,1588350,0,1717986918,1711302246,102,-612433920,461102043,1776411,2080374784,1815634118,946652870,
                  8177164,0,0,16711422,0,410926104,1014896664,32280,1008205824,404232318,1579032,0,404232216,1014896664,24,0,
                  217975832,24,0,1613758464,3170558,0,0,-1061109760,254,0,1814560768,2649342,0,268435456,2088515640,65278,
                  0,2097085952,272119932,0,0,0,0,0,1010580504,402659352,24,1717986816,36,0,0,1828613228,
                  1828613228,108,-964945896,108839106,410830470,24,-960364544,1714427916,198,1815609344,-596232084,7785676,805306368,6303792,0,0,
                  403439616,808464432,792624,0,202119216,403442700,48,0,1023360102,102,0,404226048,1579134,0,0,0,
                  806885400,0,0,254,0,0,0,1579008,0,403441154,-2134876112,0,-964952064,-420028722,8177350,0,
                  410531864,404232216,126,-964952064,806882310,16696928,0,101107324,-972683716,124,470548480,-20157380,1969164,0,-1061109506,-972683524,
                  124,1614282752,-956514112,8177350,0,201770750,808464408,48,-964952064,-964901178,8177350,0,-960051588,201721470,120,402653184,
                  24,6168,0,1579008,404226048,48,201719808,811610136,396312,0,2113929216,8257536,0,811597824,201722904,6303768,
                  0,214353532,402659352,24,-964952064,-555819322,8175836,0,-965986288,-960037178,198,1727791104,1719428710,16541286,0,-1061001668,
                  1724039360,60,1828192256,1717986918,16280678,0,1751279358,1717725304,254,1727922176,1752721506,15753312,0,-1061001668,1724309184,58,
                  -960102400,-956381498,13027014,0,404232252,404232216,60,203292672,202116108,7916748,0,1819043558,1718381688,230,1626341376,1616928864,
                  16672354,0,-16847162,-960051498,198,-423231488,-824246538,13027014,0,-960074696,1824966342,56,1727791104,1618765414,15753312,0,
                  -960051588,2094978758,3596,1727791104,1820092006,15099494,0,1623639676,-960099272,124,2122186752,404232282,3938328,0,-960051514,-960051514,
                  124,-960102400,-960051514,1063020,0,-960051514,2097075926,108,-960102400,943208556,13026924,0,1717986918,404232252,60,-956432384,
                  1613764748,16697026,0,808464444,808464432,60,-1065353216,473460960,132622,0,202116156,202116108,60,-965986288,0,0,
                  0,0,0,16711680,1585200,0,0,0,2013265920,-859014132,118,1625292800,1718384736,8152678,0,2080374784,
                  -960446266,124,203161600,-865321972,7785676,0,2080374784,-960430394,124,1815609344,1626366052,15753312,0,1979711488,2093796556,7916556,
                  1625292800,1719037024,15099494,0,939530264,404232216,60,101056512,101060096,1717962246,60,1717592288,1718384748,230,406323200,404232216,
                  3938328,0,-335544320,-690563330,198,0,1718017024,6710886,0,2080374784,-960051514,124,0,1718017024,1616936038,240,
                  1979711488,2093796556,1969164,0,1719065600,15753312,0,2080374784,-971214650,124,806354944,808516656,1848880,0,-872415232,-858993460,
                  118,0,1717986816,1588326,0,-973078528,-19474746,108,0,946652672,13003832,0,-973078528,2126956230,16256006,0,
                  416087552,16672304,0,404232206,404232304,14,404226048,402659352,1579032,0,404232304,404232206,112,-596246528,0,0,
                  0,940572672,-20527508,0,1715208192,-1027555134,101465190,124,-872362804,-858993460,118,806882304,-20546560,8177344,268435456,2013293624,
                  -859014132,118,-859045888,2081191936,7785676,1610612736,2013272112,-859014132,118,946616320,2081191936,7785676,0,1715208192,205284960,15366,
                  1815613440,-20546560,8177344,0,2080427212,-960430394,124,405823488,-20546560,8177344,0,939550310,404232216,60,1715214336,404240384,
                  3938328,1610612736,939530288,404232216,60,281462272,-960074696,13027070,1815609344,1815609400,-956381498,198,6303768,2086692606,16672352,0,
                  1993080832,-656900554,110,1816002560,-855716660,13552844,268435456,2080402488,-960051514,124,-960102400,-960070656,8177350,1610612736,2080380976,-960051514,
                  124,-864538624,-858993664,7785676,1610612736,-872409040,-858993460,118,-960102400,-960051712,201752262,-973078408,-965986106,1824966342,56,13026816,
                  -960051514,8177350,402653184,1617312792,406611552,24,1684813824,1616965728,16574048,0,406611558,410916990,24,-858982400,-557005576,13028556,
                  234881024,404232219,404232318,7395352,1613764608,2081191936,7785676,201326592,939536408,404232216,60,1613764608,-960070656,8177350,402653184,-872390608,
                  -858993460,118,-596246528,1718017024,6710886,-596246528,-152648192,-959521026,198,1819032576,8257598,0,939524096,3697772,124,0,
                  808452096,1613770752,8177350,0,0,-1061109506,0,0,117309440,1542,-1073741824,-657668416,-2032377808,4069388,-960446464,1714477260,
                  104767182,6,402659352,1010580504,24,0,1826122806,54,0,1826095104,14183478,0,1141982225,1141982225,1141982225,-1437252591,
                  -1437226411,-1437226411,-1437226411,2011002845,2011002845,2011002845,404256733,404232216,404232216,404232216,404232216,-132638696,404232216,404232216,-132638696,404289560,
                  404232216,909522486,-164219338,909522486,13878,0,909573632,909522486,0,-132581376,404232216,909514776,-164219338,909571590,909522486,909522486,
                  909522486,909522486,13878,-33554432,909571590,909522486,909522486,-33098186,0,909508608,909522486,65078,0,404232216,-132581352,0,
                  0,0,404289536,404232216,404232216,521672728,0,404226048,404232216,65304,0,0,-16777216,404232216,404232216,404232216,
                  404234008,404232216,0,-16777216,0,404226048,404232216,404291352,404232216,404232216,521674520,404232216,909514776,909522486,909522742,909522486,
                  909522486,1060124470,0,0,1056964608,909522736,909522486,909522486,-16713930,0,0,-16777216,909571840,909522486,909522486,925906742,
                  909522486,13878,-16777216,65280,0,909522486,-150931658,909522486,404239926,-15198184,65280,0,909522486,-13224394,0,0,
                  -16777216,404291328,404232216,0,-16777216,909522486,909522486,909522486,16182,0,404232216,521674520,0,0,520093696,404234008,
                  404232216,0,1056964608,909522486,909522486,909522486,909573942,909522486,404232216,-15139048,404232216,404232216,404232216,63512,0,0,
                  520093696,404232216,-59368,-1,-1,-1,0,-16777216,-1,-252641281,-252645136,-252645136,-252645136,252645135,252645135,252645135,
                  -61681,-1,255,0,0,-656640512,7789784,0,-964952064,-54081796,4243648,-956432384,-1061109562,12632256,0,1828585472,
                  1819044972,108,-956432384,806891616,16696928,0,2113929216,-656877352,112,0,1717986918,-1067425668,0,-596246528,404232216,24,
                  410910720,1717986876,8263740,0,-960074696,1824966398,56,1815609344,1824966342,15625324,0,202911774,1717986878,60,0,-606372352,
                  126,0,-612497917,1618932699,192,807141376,1618763872,1847392,0,-960070656,-960051514,198,-33554432,16646144,65024,0,
                  2115508224,6168,255,405798912,403441164,8257584,0,1613764620,792624,126,453902336,404232219,404232216,404232216,404232216,-656926696,
                  112,402653184,8257560,6168,0,-596246528,14448128,0,1819031552,56,0,0,0,6168,0,0,
                  402653184,0,251658240,202116108,1013771276,28,1819072512,7105644,0,1879048192,-933220136,248,0,0,2088533116,31868,
                  0,0,0,0,29,-10083328,9318,570425344,1667457792,34,0,2818048,404226048,404291352,24,11520,
                  0,255,0,-1023410099,-1008992281,-1010580541,1409286144,-604045312,404232345,3938328,5636096,-1010580736,1724105667,6204,22272,-1010580541,
                  1728043995,102,-1023410088,406611651,-1010604484,1493172224,-1010630656,406611651,3938328,5898240,-2033975552,1630541836,65475,27904,-436207616,-606348289,
                  219,118,-1010630656,406611651,1996488704,0,-607927552,6750171,9502720,1845493760,-662824133,30684,402692864,-1060930024,410960832,24,
                  -1023410019,-15188890,404291352,-1644167168,1718025216,1868980860,15951462,15794176,404232192,404232447,65280,62976,6168,402653439,24,0,
                  0,0,0,2113929216,-2122209919,-2122212931,126,2113929216,-9217,-6205,126,0,-16880640,947715838,16,0,
                  2084048896,272137470,0,0,-415482856,404285415,60,0,-8504296,404258559,60,0,402653184,1588284,0,-256,
                  -402653185,-1588285,-1,255,1715208192,1013334594,0,-256,-1715208193,-1013334595,-1,503316735,2016549390,-858993460,120,1006632960,
                  1717986918,410916924,24,1056964608,808468275,-261083088,224,2130706432,1667465059,-412654749,49382,0,1020991512,417021159,24,-1065353216,
                  -17239840,-1059000072,128,100794368,-29483506,101588542,2,402653184,404258364,406617624,0,1711276032,1717986918,1711302246,102,2130706432,
                  2078006235,454761243,27,-964952064,-965986208,205024454,31942,0,0,-16843264,254,402653184,404258364,406617624,126,402653184,
                  404258364,404232216,24,402653184,404232216,1014896664,24,0,202899456,1576190,0,0,1613758464,3170558,0,0,
                  -1073741824,16695488,0,0,1814560768,2649342,0,0,943198208,-16876420,0,0,2097085952,272119932,0,0,
                  0,0,0,402653184,406600764,402659352,24,1717960704,9318,0,0,0,1828613228,1828613228,108,2081953792,
                  2093007558,-964295162,1579132,0,214352384,-966774760,134,939524096,1983409260,-858993444,118,808452096,24624,0,0,201326592,
                  808464408,405811248,12,805306368,202116120,403442700,48,0,1013317632,6700287,0,0,404226048,1579134,0,0,
                  0,404226048,12312,0,0,254,0,0,0,402653184,24,0,201720320,-1067438056,128,939524096,
                  -691616148,1824966358,56,402653184,404256824,404232216,126,2080374784,403441350,-960470992,254,2080374784,1007027910,-972683770,124,201326592,
                  -865321956,202116350,30,-33554432,-54476608,-972683770,124,939524096,-54476704,-960051514,124,-33554432,201721542,808464408,48,2080374784,
                  2093401798,-960051514,124,2080374784,2126956230,201721350,120,0,1579008,404226048,0,0,1579008,404226048,48,0,
                  806882310,202911840,6,0,8257536,32256,0,0,202911840,806882310,96,2080374784,403490502,402659352,24,0,
                  -557398404,-1059266850,124,268435456,-960074696,-960051458,198,-67108864,2087085670,1717986918,252,1006632960,-1061109146,1724039360,60,-134217728,
                  1717986924,1818650214,248,-33554432,2020106854,1717723240,254,-33554432,2020106854,1616928872,240,1006632960,-1061109146,1724303070,58,-973078528,
                  -20527418,-960051514,198,1006632960,404232216,404232216,60,503316480,202116108,-858993652,120,-436207616,2020370022,1717988472,230,-268435456,
                  1616928864,1717723232,254,-973078528,-687931666,-960051514,198,-973078528,-553715994,-960051506,198,2080374784,-960051514,-960051514,124,-67108864,
                  2087085670,1616928864,240,2080374784,-960051514,-556349754,920700,-67108864,2087085670,1717986924,230,2080374784,945866438,-960100852,124,2113929216,
                  404249214,404232216,60,-973078528,-960051514,-960051514,124,-973078528,-960051514,946652870,16,-973078528,-691616058,-285288746,108,-973078528,
                  947678406,-965968840,198,1711276032,1013343846,404232216,60,-33554432,403474118,-960339920,254,1006632960,808464432,808464432,60,0,
                  1893777536,101588024,2,1006632960,202116108,202116108,60,1815613440,198,0,0,0,0,0,16711680,405811200,
                  0,0,0,0,209190912,-858993540,118,-536870912,1819828320,1717986918,124,0,-964952064,-960446272,124,469762048,
                  1815874572,-858993460,118,0,-964952064,-960446210,124,939524096,-262118292,1616928864,240,0,-864681984,-858993460,2026638460,-536870912,
                  1986814048,1717986918,230,402653184,406323224,404232216,60,100663296,101580806,101058054,1013343750,-536870912,1818648672,1718384760,230,939524096,
                  404232216,404232216,60,0,-18087936,-690563370,198,0,1725693952,1717986918,102,0,-964952064,-960051514,124,0,
                  1725693952,1717986918,-262119300,0,-864681984,-858993460,504106108,0,1994129408,1616928870,240,0,-964952064,-972277664,124,268435456,
                  821833776,909127728,28,0,-859045888,-858993460,118,0,1717960704,1013343846,24,0,-960102400,-19474730,108,0,
                  1824915456,1815623736,198,0,-960102400,-960051514,-133429634,0,-855769088,-966774760,254,234881024,1880627224,404232216,14,402653184,
                  1579032,404232216,24,1879048192,236460056,404232216,112,1979711488,220,0,0,0,1815613440,-20527418,0,1006632960,
                  -1061109146,1013367488,8128012,-872415232,-859045888,-858993460,118,403439616,-964952016,-960446210,124,940572672,209191020,-858993540,118,-872415232,
                  209190912,-858993540,118,811597824,209190936,-858993540,118,1815609344,209190968,-858993540,118,0,1617312768,205284960,15366,940572672,
                  -964951956,-960446210,124,-973078528,-964952064,-960446210,124,811597824,-964952040,-960446210,124,1711276032,406323200,404232216,60,1008205824,
                  406323302,404232216,60,811597824,406323224,404232216,60,12976128,-965986288,-960037178,198,946616320,-965986304,-960037178,198,1613764608,
                  1617362432,1717592188,254,0,1993080832,-656900554,110,1040187392,-20132756,-858993460,206,940572672,-964951956,-960051514,124,-973078528,
                  -964952064,-960051514,124,811597824,-964952040,-960051514,124,2016411648,-859045684,-858993460,118,811597824,-859045864,-858993460,118,-973078528,
                  -960102400,-960051514,2014054014,12976128,-960051588,-960051514,124,12976128,-960051514,-960051514,124,404226048,1616930364,406611552,24,1815609344,
                  1626366052,-429891488,252,1711276032,2115517542,404258328,24,-856162304,-859506484,-858993442,198,453902336,2115508248,404232216,7395352,806879232,
                  209191008,-858993540,118,403439616,406323248,404232216,60,806879232,-964951968,-960051514,124,806879232,-859045792,-858993460,118,1979711488,
                  1725694172,1717986918,102,14448128,-17373498,-960049442,198,1815871488,2113945196,0,0,1815609344,2080389228,0,0,805306368,
                  808452144,-960053152,124,0,-33554432,-1061109568,0,0,-33554432,101058054,0,-1061158912,416073410,-2032377808,4069388,-1061158912,
                  416073410,-1630640592,394814,402653184,404226072,1010580504,24,0,1815478272,3566808,0,0,1826095104,14183478,0,289673472,
                  289673540,289673540,289673540,1437226308,1437226410,1437226410,1437226410,-579347030,-579347081,-579347081,-579347081,404232311,404232216,404232216,404232216,404232216,
                  404232216,404232440,404232216,404232216,418912280,404232440,404232216,909522456,909522486,909522678,909522486,54,0,909522686,909522486,54,
                  418906112,404232440,404232216,909522456,116799030,909522678,909522486,909522486,909522486,909522486,909522486,54,117309440,909522678,909522486,909522486,
                  116799030,254,0,909522432,909522486,254,0,404232192,418912280,248,0,0,0,404232440,404232216,404232216,
                  404232216,31,0,404232192,404232216,255,0,0,0,404232447,404232216,404232216,404232216,404232223,404232216,24,
                  0,255,0,404232192,404232216,404232447,404232216,404232216,404690968,404232223,404232216,909522456,909522486,909522487,909522486,909522486,
                  808924726,63,0,0,809435136,909522487,909522486,909522486,16201270,255,0,0,16711680,909522679,909522486,909522486,
                  808924726,909522487,909522486,54,16711680,255,0,909522432,16201270,909522679,909522486,404232246,16717848,255,0,909522432,
                  909522486,255,0,0,16711680,404232447,404232216,24,0,909522687,909522486,909522486,909522486,63,0,404232192,
                  404690968,31,0,0,404684800,404232223,404232216,24,0,909522495,909522486,909522486,909522486,909522687,909522486,404232246,
                  419371032,404232447,404232216,404232216,404232216,248,0,0,0,404232223,404232216,-232,-1,-1,-1,255,
                  0,-1,-1,-252645121,-252645136,-252645136,-252645136,252645360,252645135,252645135,252645135,-241,-1,0,0,0,
                  -596246528,-589768488,118,2013265920,-657666868,-960051508,204,-33554432,-1061108026,-1061109568,192,0,1819082240,1819044972,108,0,
                  811648766,-966774760,254,0,-662831104,-656877352,112,0,1717986816,1618765414,49248,0,417101312,404232216,24,0,
                  1715214462,406611558,126,0,-960074696,1824966398,56,939524096,-960051604,1819044972,238,503316480,1040980016,1717986918,60,0,
                  -612499456,8313819,0,0,-612497917,1618932699,192,469762048,2086690864,811622496,28,0,-960051588,-960051514,198,0,
                  65024,-33554178,0,0,2115508224,6168,255,0,101455920,3151884,126,0,1613764620,792624,126,234881024,
                  404232987,404232216,404232216,404232216,404232216,-656877544,112,0,1579008,404226174,0,0,-596246528,14448128,0,1815609344,
                  14444,0,0,0,0,6168,0,0,0,6144,0,202309632,202116108,1013738732,28,1826095104,
                  1819044972,0,0,-663748608,-121085904,0,0,0,2088532992,2088533116,0,0,0,0,0,7424,
                  603979776,610729830,0,3145728,-1016710144,-1009001533,3958467,1291845632,-406650880,-1008992257,-1010580541,0,-16777132,404265435,404232216,60,
                  22016,-1010580541,1724105667,6204,5701632,-1010580736,-606354493,6711039,1476395008,-1010630656,404241510,-1010604484,0,-1023410087,1013367747,404232216,
                  60,23040,210158591,-1050660840,65475,7143424,0,-606339098,14408667,1979711488,0,-1010580736,406611651,0,119,-1010630656,
                  -2368573,102,30720,-1023410176,1008221286,50022,9502720,0,2115713902,7855320,-1694498816,2115508224,-1061109565,404258499,0,-1023410019,
                  -15188890,404291352,24,-67068416,1652319846,1717989222,62310,11206656,-960315200,1613764812,201759694,-1409286113,-1027555328,806931654,1050070630,1542,
                  0,0,0,0,73602699,-2147040640,669540594,1626505427,-388816407,-1061486614,-13450493,595167782,-1962938136,-754390845,65652618,-744691501,
                  117435880,79385431,15984640,-1961659301,1021588163,1007055376,-33065711,653788104,123682184,-4462397,-739762000,-392041518,-1157967016,-1014365248,-70067480,-437520246,
                  1946198760,-1178586346,12222464,1225193120,108394500,-1179123526,-389857280,548929634,-1158580985,-269766656,75958006,-2093386368,281662,-941084044,-1906899201,367546562,
                  852527617,-771073802,1380977524,-427161168,1523760616,872173912,1504441343,-32455040,-387481654,123720379,195,0,76031626,-2146442112,57936380,-1023148928,
                  -1174124128,121373620,188488308,255596148,1397756532,1912637160,2139303429,1482358792,-726531468,71934147,309656744,242485052,1760056144,772108800,67323894,-993830821,
                  637839422,-1014220348,1405345547,-402648901,1968963565,-1009044498,75958006,1343124744,63879762,-320336720,1514186961,-617364648,1468448342,1946171950,947924491,-2096794369,
                  -253033789,411708995,1593834368,246436035,-661920778,1469760385,1235272536,1913928708,-907502584,-1709825,777044893,33769462,196086388,-154054168,410288324,1206390704,
                  -2134575407,-164753803,1948255047,-2134575611,17564395,-397163688,11599808,-1976690318,-461372569,-1341099005,33325060,145754484,1946352768,168865794,868441024,-14292746,
                  104601972,205263990,322702710,-397407628,1968766916,1174596355,-783923642,1364247526,-27465646,1499120270,-397163688,-1605316273,-1336933303,-791615477,1346306085,-402650696,
                  196661582,-783751040,-2147459144,50612542,1891107700,-1206858496,-1064394752,443942,163075328,-785848256,443942,163097088,-786634752,4096038,91531776,-343929925,
                  1074510595,-389870760,-1897344762,-466462512,-396881715,-1017392974,0,0,-154064920,100960518,-2031615116,-1157981184,-1947728952,-1966492976,-796596028,2145961866,
                  -389838128,-1013067654,-86966296,-402405446,-911028114,-1966051864,-798431008,1676212362,-69694768,-1961434173,650546163,642196874,642203018,-397992566,-498663511,350471148,
                  -1946973188,-3938106,-1968520054,-1014322489,-270383446,-1462619453,-1308462079,1946331178,365068291,-397193021,1482424185,-544808058,1354958852,-997567663,-1174388955,-487119258,
                  -628373365,-997568424,-1174388955,-487109755,-636237821,4138328,-150072134,331875298,-773729830,-2134540077,1493226371,-1964799400,-1406221317,-1406214006,-1406207862,784586890,
                  -58055542,-980755318,1191125736,-906050050,851701109,76164845,-1962968344,-790048542,-9312024,-388957558,1760094416,-1965389057,-17176379,-20578746,-1009093175,-13444302,
                  595167782,-17008152,284917955,-1977159556,296957053,-1157862936,-5241914,-389062168,427163124,71908992,-396527853,-75444158,-1101695744,1048606340,1964180553,2000993883,
                  116789425,1946551433,65876489,-9443087,2129134571,2003091199,-401600327,-1101529247,549418868,162921472,1172834481,197145343,-17700665,-385945880,-28836247,-2081720887,
                  -838987577,-1017126283,1979495912,1996799496,1055473841,1980022527,76089078,-2081328122,1085882566,-15210240,0,0,-1207712582,-806878206,117749966,-1295070744,
                  374990,-1194409496,-1142422522,33863886,-389106200,-1070400627,1355720169,-1207712582,-1545075966,50641102,-1278304792,-61806578,179503733,95997618,-829626352,112255882,
                  -1194424856,2145910788,-469083954,-1796734092,-1977170949,-12827903,104466036,-227212215,-2000421068,-33258178,-65738545,-410384523,1407718576,-1327451186,-823007223,2081292160,
                  -1966080510,-401887001,646499902,-855767968,870893822,1629915342,-820713468,-1715369134,75839223,-2069706498,-138347004,1510245670,1962998656,1222693122,313581706,-1597109784,
                  -1057094524,71968502,-989929263,-1023128413,-1123548998,1105725456,773485308,-1979627638,-2139151152,37519586,246820468,1007685821,1965388801,-826742757,1946221440,-1123109349,
                  -75493360,-2146863871,117721406,91490933,1035800758,-2134212577,118413963,855703737,1360970706,-444535926,-152711165,41157827,-184367618,-489486927,106560139,-1610565089,
                  -175390066,-402398212,-1007288220,-1407748992,309641226,-1310444969,65065733,852462328,1604645869,102689259,-768388265,146528910,-78911488,1946640219,820715267,520374688,
                  108287036,41178684,12133099,573185,520487088,533169066,817494754,369606144,-1542059841,-2095069565,-136175673,1364706079,852462167,1604645869,1495320451,-1017122334,
                  1381455110,-1974447279,-2139150880,58135356,1006683881,-385649537,-8388443,1476949535,1509896795,-2147439127,376576511,-282802294,-402403654,1599851743,1532515152,-380010569,
                  -8388462,-2133298417,158468607,-997801077,-351927064,67076325,-521655947,63748812,-1462984216,1963176961,1342616578,1474825392,1086650060,-33393320,-1173376828,-2014837810,
                  -2135430196,175440639,1476727016,2142723935,-8371477,-401312511,-1636435330,71894774,-385649416,1944649593,177203972,-385649409,1793654637,-352160262,71428225,-385909783,
                  1499070998,2130346140,-276168075,1968329117,1499158536,123559770,1048653507,1414101136,1380977268,-1337530182,1482354190,17565383,244058128,645923086,142541959,-167475418,
                  17074438,2145977205,212881408,-154420760,1968718020,263213171,-154423832,1951940804,-100931481,233310324,53798917,104506347,1081345097,68167296,-108533553,372971125,
                  125109347,68161152,-399906000,611648648,350947763,73602619,243271541,-350223344,74639379,196284021,76031616,-2011297552,73590788,73598663,512361428,-478149616,
                  821788720,954939509,68167306,-164567936,17074438,719858804,1662401529,-2145422332,158708986,1949367424,-339725811,821854326,128975989,1726508523,-402426375,1676346392,
                  113725419,135266572,17698444,75966080,821854451,116790389,1963066503,-402149324,243270270,-385350521,113704679,-167246715,33851142,243271028,-167508857,33851142,
                  113761653,64226403,1979234536,-339725802,1661388557,-402410492,125106345,645924784,-394328953,192215289,-402372190,803734536,-1565201662,-35126199,30337227,-1211262744,
                  28960800,-132061101,76089078,-402426616,-1973880022,27650296,-1157581080,-1427636214,-1150323464,703070228,-160992004,134514950,-1960425867,736298061,106793766,-1004120314,
                  -1977218947,-887822275,-386439704,-1006700649,653255239,296959370,-389348888,-2065107118,638017527,-485732981,643237391,638475659,-401572412,123730415,-1977213004,1958742533,
                  -1979286511,-33258202,-1961578292,-402365674,1357433398,-33953289,225738300,1962430440,-127277049,207093550,1468841667,772720259,-1073085302,992875124,-260766628,105659182,
                  992930421,-462092204,-1073054025,-125173131,-137238333,-1779891340,-82515968,-386141720,146537536,-136845312,196818036,-77404160,-1977209740,1569334845,1300964865,1435182594,
                  1392924420,107856934,1543247848,133911784,1166681695,1962884106,-1563886075,112919684,-139991040,129712500,-81336320,-1977206412,-2059519427,640709892,-2147394166,-1185710109,
                  -768409344,57525286,1543231464,-405734518,-940120112,-2147257328,-411033393,-1173114068,61866948,852100840,-89134876,113725163,1120,-2146430792,235177278,280496244,
                  -1207731192,-1543889091,244056332,-1141178098,719847436,-1155173129,-1243086841,639464698,-922876534,637830306,-1576974966,-1004141435,-1980103827,-1946088402,-83816954,552042691,
                  -994385997,-385765373,-1070347869,-1576776029,263914594,1351059456,-109229308,-1576695258,-1960442806,1285751621,1166681604,75801089,38111782,637830562,-2045491829,73442244,
                  71900810,1997011840,788476438,1970833290,-1341889118,117145648,1068499573,-1023121758,-956020318,-737910010,853051907,133923071,-74773388,-553393199,1754383233,113641707,
                  -1145830301,-1959892793,-402190785,378273660,-1070463901,1974794880,-2134835710,1609041090,82477256,7618244,71900810,2114059136,281510675,2114190208,281510667,2080897920,
                  281510659,-1977171918,-935532507,-1463747001,-2081197040,281662,-397276044,-1030818462,-50384038,-1031754765,73768964,-2134371864,141867258,1721811710,-939202556,112244931,
                  -2147371869,-150698202,-402649928,230162761,21227520,-1274787424,-1022309120,71908992,-1207143161,129175825,1623134413,-1207047334,129175826,-35122995,1520484096,-1207947800,
                  317210892,135182337,-1207890712,115876621,1946601217,-1946123008,-1207929330,-1264384328,-2029092863,1235224580,-17503996,1726482190,853226186,2039097087,-193664989,-75447298,
                  653292816,-1288405622,-194713583,-1946904856,-2147196138,-1070463294,851928553,-176166693,-1006763404,535301040,-1058766649,-321780559,-504828790,1976077045,-402542308,359986471,
                  1006913952,-32605169,2114993345,1019346440,-33391086,512410561,1049232520,-478149495,100368399,-75496066,839089164,645972955,-2133916656,2131003686,1997142912,-2147126251,
                  -2147186418,68161152,-2029092816,196280836,145953771,1971374070,-2146847998,537137166,75966080,-2010742531,503902212,378078344,-880802717,-1102003201,1085896324,1946631168,
                  -149952492,76089078,-1207274492,-617410533,-855621447,1405310992,-1142912432,-684828815,2008794246,-1948832169,-397387560,-417151398,173595658,-672572445,198,0,
                  243880529,-2019556256,1963501572,1086715424,-973730955,-1257868256,-339135970,-388986352,158725187,19186314,367526773,-1327134208,-908007414,-1057038202,-672603766,1524664009,
                  -2053061799,1963473924,217678093,-2130283509,1963724281,272417561,-108983691,74778375,-1022488903,108334652,51181953,-527797900,-511644464,535134239,1668598026,92137786,
                  2114189696,1978219098,2129410572,-20411822,-337016119,50167882,-851835778,-41939587,-1979548158,-20411671,-1976243255,46563573,343732538,-402462422,-930427394,238864894,
                  -906093186,401329662,2114125184,-1964209656,-339083576,48835082,-1966211352,-1010172216,-1974447278,839365057,-1964256293,1352108488,988532996,1963221534,-1965389020,-136039737,
                  839141926,-774372353,1310589923,-1964257020,-401690393,-477443842,-135786576,1515935944,195,0,0,0,145879947,-422449453,72402561,243995787,
                  12780640,0,0,0,116834355,1946682503,-855329788,49986,-1571794094,-125172638,1277622168,72262404,71894774,-788367880,-1327985944,-929765364,
                  229696394,1590201832,-1670826,-1948349696,-385593200,65379,0,0,1364546384,-1962518702,787252204,-544810190,-1963303287,-1981533476,1586101318,-1967115266,
                  -129594938,1183433354,-1983542538,-1047858106,-1947056503,1177286726,1177239796,855995900,-60913189,737691275,-1992231866,1183575622,-230282250,-263812800,117341827,1183516020,
                  -1962677256,788001862,1183384650,-230257700,-388479351,712307279,738478496,740390912,741178886,742817282,745766404,742292998,743407105,-29985723,-399346488,1366684376,
                  62552043,112896,-1593834821,1324024910,-1191181638,1048576004,1946551369,178949,29033451,-530675456,-352321352,-2062644431,113412,1654702131,1278146308,47620,
                  28974315,-2062644480,572164,-352321352,309773,75828875,-1207957317,1183383552,-698447404,-1982181751,401137238,5826560,-402617368,-1477967777,784630528,1499094791,
                  -1017619619,-2096870751,1963187838,178951,636218359,48135811,1861683829,310240,367782903,75837175,31358595,2122516084,91555038,-150992709,-330921493,117341827,
                  -654900620,-1007925623,-135510389,1183448174,-396981782,-1610565437,31358595,2122520958,326370526,621023393,809304112,-1207602176,65779712,-1984954184,1183437894,1183564754,
                  -630261796,-136821245,1174656622,-666465836,64378505,1444145734,-599356952,-1009101175,737035915,1183448134,-62485532,-2082322807,1962998910,-297366778,-1948105079,-422453642,
                  -946536658,2114644800,-247383230,994103873,-400637119,376817255,75958006,-1173392380,619447258,-84184056,-659413584,2122578926,510918908,-772780405,-732000543,-1949153650,
                  1988876414,-391842852,1325335063,-387612700,1317732866,-662795280,-1949153650,548731462,-1410080634,-16647448,-427826610,-972167137,1704986485,64535044,-1195115538,1861681160,
                  -431584784,16547459,-617400204,-150992712,-150713810,-1947169813,1183719160,-732000558,64519683,1317788790,530904038,75866435,-662715589,-402543896,1325334593,-389316636,
                  -617414254,-150992712,-150713810,519605227,-1898414589,1317786182,-96039962,1126148851,75832891,2028527228,1042433,2145537791,-1035343663,-402650696,-2084322730,1963253374,
                  -431584465,117341827,1183516021,-1962677288,2481222,-599381520,-1177008599,-1059913724,31081985,1183569478,-1327462694,-1038030839,1183522499,-529598480,-2082060663,1946221694,
                  -1193594045,-336134064,-125046645,64779779,1183766654,-732000558,-1947840885,-203977786,-1947169884,-431059974,52428984,-201849872,79184804,2094545664,15067338,2145668863,
                  13691072,1354292019,65795840,-125051834,-1949153650,1317796422,-203977754,-1946514518,12117582,-1946680544,-1426851258,309315,-763378885,-16733464,-931143090,2122564383,
                  1131675900,-402586184,45663587,-983177201,1317788467,71999984,-259265545,2114189451,-596245544,517097102,-204185970,-1591786588,-1019542395,1760091263,-464584960,95998591,
                  -987109376,-1207939608,686296834,47301,-1962926104,-527762874,417858224,-18235,-1207955480,216534786,3532997,2145537791,-796146730,1252121395,-336113148,-599391398,
                  1183774859,-263287854,-1426865525,-2061616317,-1008501756,-1947705717,1177152070,-631367204,1096643,32261771,57924678,-1948623359,1174531142,17003480,12834398,0,
                  1431458131,854066775,-1008408337,-1950079000,4439774,-1950047000,-1744883990,-661961871,1975773160,-1061558269,1594344331,1532582493,994319555,2000970308,1363374148,-1979430496,
                  2114338000,1242991374,2115124228,-773664506,-1578970654,-577895291,1465274704,-930353869,-1744884143,978928582,1174762756,-921963806,1482251871,-268237708,-1070342430,727242894,
                  199504577,1137034185,1140605904,1137001476,1963391616,59385349,12065003,193668616,-523179642,-1073692287,-506396652,-855711279,-176033675,58007552,-1018116221,-167409114,
                  -1007025200,-804781896,227157728,352305536,-855750912,-276565643,-1007025400,75958006,-401312764,259375895,-335291718,-76217944,27847930,654048116,-3996277,-1190886090,
                  113705088,525445,1979658472,2080272,-1950111512,8436202,83828968,-2063167616,95994628,-1014634488,-402587463,-1202651379,2028470277,-1178380093,-18284288,254,
                  24496395,1150009027,1401967851,1963392643,-385928702,-396639590,1364247260,-13704310,-398133612,1482288597,-661917470,1975688168,-1083316221,535544715,1153416848,-393207573,
                  -1974418764,-1795215645,-1957149450,-1032132392,1290273653,130255807,1499094367,1364443995,106386770,-1830268842,152124909,-478149003,1070301312,1161216856,1169442135,1156924930,
                  -402635842,844284661,-2061043740,1525678852,-788220477,-16985912,-1007127091,-923476,-320275318,600279807,182486722,637762011,-1993997517,116835075,1946420359,-1040324584,
                  -625339531,-322401533,-76217944,27847930,-1047790732,1405332475,1136574474,-1107068672,-1763180513,8332738,-523116335,-268181295,-1912321632,309722,376702524,868344296,
                  -6756115,-400555843,-947650670,1206968912,12392939,-620057312,841352825,590489093,637896742,-947707000,-1897209264,1089438169,-1017428223,-1946203672,2044398314,-401034233,
                  367772201,-1962920216,-1962638066,1459898902,378406,-119342589,-387741089,244040213,378209413,-577895350,92939863,92808876,-169674237,-644987041,-286727118,-384846655,
                  -68632079,1244564478,-773467900,-1947872795,-1912306418,-1263773734,1960871040,495461893,-2010774549,-321894595,-276566155,-486735096,-947691547,-1009152504,0,0,
                  1031063819,-346167216,-385649576,1381105202,-164428201,-390014488,116834588,1946420359,-1059461096,-625339531,-320828925,-76217944,27847930,-1963197580,-498619708,1516177373,
                  50009,0,0,0,212882000,-155389464,1482309828,116787061,1946682503,-1019032317,-2142088368,-1274780610,1721789044,184256004,607286747,535265504,
                  1721943818,-2132833788,-411039773,182964232,1225193211,91552772,1139333938,-401493248,1721761854,-1459670524,-33393632,1225193159,628423684,-410984668,201487361,73835040,
                  34344996,28571658,-2130700824,-402521661,-1014956018,132645377,-372643840,-1017619622,-88262168,-1964409624,-947196221,-299847442,-376444421,0,0,0,
                  1397905233,-326414251,71900810,2132016000,-2114745547,-788463642,-1526780186,1210337118,1210337316,1216235556,1216235646,1210337316,1210337316,1210337316,1201031062,1201031062,
                  1201031062,-75478950,-2147126178,58023931,-385824791,1252065422,-1948059900,1962871544,-1731753463,72099575,-779356157,-355341615,-100406575,-511585802,12058631,-86471008,
                  -805282165,1929087727,17348707,-826612526,-2042434045,-16060704,62393209,1122912792,-336666490,-16599025,1122944178,-1964056442,378397,-461314166,-1308446705,-2042433852,
                  495644384,-1191246394,-297074942,-287275454,-1174404168,1122894798,-1192304506,-297074936,-287275454,1532844283,-1017553062,-439221835,78764850,78906544,-826613462,-2042434045,
                  92991200,57984290,-804205696,1976172267,6195427,67192518,-661992725,-1207917336,-661741568,218201728,495454068,-340020504,-2012902733,1720188998,-1146755071,-1974294805,
                  -355381024,-150912840,1492683746,1048629643,1946551369,-167566312,65110481,-1090911488,-251431456,-802387410,-337587487,619172124,-2116946431,50333665,1977138938,-523046653,
                  -1976637046,-773224948,-772812305,-1023976721,74711041,536921985,-1900543813,25067739,-1978829811,-2134575587,-1020128908,-1930754680,-987626102,1183377618,-159257856,182264533,
                  -1578505277,-523172790,-523116335,-1056709897,-1962880381,197299192,-1324780352,-1329016060,-1158879223,195,0,0,106058067,73547402,-390203928,-538443768,
                  1499072500,222085979,242505855,225708604,1148454972,1198786364,-768456469,-326412861,1722103,1344566720,1178192012,-165972966,537168134,1397888116,106387025,117508072,
                  1532583519,-1993965478,1566105348,75773498,-1226243211,-1010369024,41210378,-339490050,-397373315,1968760831,1088967211,-2029586944,393479172,1975355112,64666130,-319102838,
                  -76217944,1946265836,650414843,-77986680,65736372,-17112344,1242970818,839742724,-2076820782,-352094972,-956395422,-964013885,-164436942,653783691,-268237750,-947198255,
                  1277622168,1408238340,-1581776709,807732240,3161344,12256117,1539542704,-95370408,1139193520,-290455317,15418086,1122370480,1642332395,-527826709,1642464012,-18691789,
                  -18691789,1642513546,1354979579,512381523,-2007825310,-402365890,74770251,216792882,-164428201,649924584,1594301835,856031672,-2076800311,1242991108,-842334716,512252688,
                  1532626018,116835160,1946223753,-1191778231,1947256054,-303555008,263737528,63879685,-1195825688,1048623104,1960051811,-1342130173,-356638962,-1077899702,1505304576,-1527607296,
                  239783352,12060240,13258784,-826648576,-1191909373,-1377254625,281343672,196147060,-2135382552,669516492,-826620999,-301223933,-331218709,-115080981,-1158807028,263210728,
                  -1174344722,-1192331544,-661733376,780858931,-919470078,-164372015,344703026,-498679294,-826650375,-301223933,-1220411157,-1073063930,79102580,604040172,-288945415,-1337530182,
                  13364750,0,0,0,71968394,604276640,1225132672,1648265732,49924,0,0,0,106256208,173232466,-2146077248,319047998,
                  954730100,-446830363,123361627,-1017618595,74776892,-353693261,41157180,1048607979,1947403337,855280611,-1977198629,-451680195,-2134639033,-226750213,-1977216589,-452728771,
                  -1948568993,-2147196138,871106242,-334841911,108333224,-805373470,-896797323,-1979465542,15462083,-301626842,548405483,1204915182,-75447298,869563408,-334841911,108333224,
                  -805373470,-1061489291,-300830717,-1977220885,15461893,-370270032,54329198,-477486731,-890761037,147816676,73731712,1977879072,-135823352,73737856,-462100257,1023362793,
                  1527215367,-370890520,138215231,296946549,1491377384,820631690,1963539711,855280407,-460592933,-22362230,284917955,745927548,-303361613,192221244,-427113590,-1612129909,
                  1008331750,-1961331438,548885498,-1947324696,-790078485,-1965192218,-299767557,1023338985,976516371,1946437894,-1278506166,-465573872,225822986,176213888,-2147256851,2028568551,
                  266699007,1971374070,65372167,-439294512,347340170,1023369961,-1978698475,-429332285,1515965323,-369849766,389873313,-91551627,-370766872,406650514,-1014363531,-402405702,
                  -269764930,209000764,-402405702,-1973700938,-25826856,561322556,-756542285,251705827,280227618,-790378264,181522663,-805014071,-1947348755,1357470169,1964719358,-1946209610,
                  -400508933,-343151241,-18298997,-429659931,-955531214,1206245096,954855138,255,762654780,75828875,75765386,134185043,-805433737,2092633215,-1157401344,801374476,
                  -544554149,-472776910,-223376594,-351859083,1364414703,106256210,309658428,61924234,-402406214,1560786466,1532582495,540853080,175587698,8138377,8259212,624748779,
                  -620043149,733090420,1946418048,1998172683,50036743,246547060,57942316,-1996470040,-33258226,-2078897974,204376324,235310081,-1967920383,1946625248,1946369042,1996766377,
                  2353317,12188042,1355952897,-421468078,2145615962,1491602408,1947256054,-414980093,-152567372,-1177883674,280821774,2080521232,-1123503860,91490320,1035800753,-1022947809,
                  1964047232,-2028041693,-2114221564,-805150493,-771378705,-2010215701,-771444476,-2012312851,266436612,-1022225736,1965095808,335988491,-1939326720,-1023404530,1966144384,-2029586840,
                  57935876,-154943438,17074438,37501556,645984887,-1267792759,-2029586935,41157124,-1073083468,243275637,-2139093879,41224700,645925044,149947528,-352024538,1946238119,
                  -1995538191,-353693692,242597898,75958006,-2135853822,-284915418,37541611,645965431,-336657271,905674930,-1073066891,116789877,1967129737,-1202583921,1120735872,45090650,
                  76089078,1010005056,1009742849,101545218,-91532713,1510002152,887818079,443876156,-1940760826,1391627200,-402652742,-1336277049,-1263867890,-22486549,1206453108,838566143,
                  645927285,183960713,-2147126080,134514958,-2130767383,309670651,125157386,2112360112,854453172,-1267275584,-75438357,-2146405069,-50034394,-663371766,76091008,-2133726462,
                  276116731,75966080,1958742782,-2029092669,-1125449468,1966537600,-1219341407,-1964509664,-350623496,-1460970662,1353461329,-88822296,853819368,-478811968,-1946157383,-2147196138,
                  -336853310,-536762368,63093497,1494230252,-1070339958,1424546611,-382010397,-503155623,-1010234425,12210768,118089728,1053096538,1049166088,109838772,113705398,112197896,
                  17436300,-706214224,-1017578573,68167296,151238863,-725999433,-1996032509,158662916,75958006,1965192194,-2027519981,116849924,1963459719,-1996032492,225707012,75959936,
                  185055234,-1262866249,272500739,1662421252,-2010742780,638119940,1049232520,512361609,645923975,-2131295097,-33257178,281870516,1963050998,147060268,129510516,269385731,
                  -1007276028,-1207405566,914359555,-2146434032,-268138458,76031496,75959936,-855591928,-2027519984,1049164548,113443977,572247,75958006,-1290505214,-1996032505,343212292,
                  417858231,-1223854848,-167122170,17074438,28770933,-400948808,123666582,1381191875,-973031394,-725886834,-1261204733,-400062936,663270098,1511991356,12802139,0,
                  1635122344,1567934731,1381061456,652249685,1157645962,679415100,171709300,138154868,121378420,-397337995,-346425100,-338546135,686313765,518740472,443863562,384551678,
                  1946338550,1586112005,-1269807872,-211163127,-2098704040,-1209902600,1946273014,-322902013,1532582493,50008,0,0,-1475979439,1394898190,-402648901,-1004085183,
                  -1977220491,-1964166644,-772240411,-13739033,-1336830059,-1559827686,-1336812975,119190528,-1597810337,-1053162358,-466480771,-268181295,73173798,1962998656,-1289950456,-335562753,
                  68198424,809250852,-1007286155,-351767551,-1007251448,-2046659583,861127675,1547380416,-2045545468,1547380475,-2046069756,46564347,-1192566208,-1969094401,12802820,0,
                  74767115,-1023409992,1448563283,1756953681,92874357,38636582,-1190869117,-1070399428,-276583693,2013500,-217822786,75808420,-218102855,1174283940,436254973,654258664,
                  -947708535,-1965346046,-788248290,-1799126557,126561909,-2096789210,-2135227705,1226703477,126496260,1191544870,649217512,-1337516664,63224323,-1968087320,-790048544,184060648,
                  638002372,-1975057016,183292135,640427207,-1975057016,-2147186402,1049235427,-411040633,32997377,-405666639,-1645675766,62962353,552079536,-804772687,182505696,92808903,
                  -568203193,-1325152381,576761861,-771455226,92808936,114438983,1393147479,771753657,839015562,352268031,170787956,-964492460,-1930632700,1002671304,-2147257149,123674826,
                  -1340766170,-337606117,103926552,70369025,137477890,204586756,171035400,36817680,1600018688,12802906,0,0,1448563206,-2081649835,1317604076,-62485250,
                  -50700663,142345020,1400908011,1414484904,516481,410306827,-661920718,1254024145,-13741229,-1072998384,2028471924,-94467107,481565872,-2080485749,1583155908,-1022928289,
                  1325299339,-964565295,-1959898214,-773795580,1958742752,-1966801406,5948380,10485862,57213731,61014877,-1957433922,-472777122,451457,-2127495378,771752675,-13750017,
                  -27882700,-1185683522,-1956708349,-83625378,115447,1381370228,352267857,-782345639,46564330,-171711262,341051219,1711284308,-1610589696,1065952768,47445,-402584344,
                  132645204,1388535042,41912614,-402652998,-1017511197,2139694677,-1339103228,-1341931334,-331157996,797280294,63420929,-1442765588,-927276918,-469046269,-922877324,63355562,
                  -617370900,-402587463,-1729568972,1438866908,1732741670,-391077912,-1956780681,2092891734,244052,115447,1381370228,352267857,-782345639,46564330,116124386,1418744963,
                  -389851993,887620131,112897,-1023378200,1586188886,-62484742,41388838,29016204,38922240,1438867034,-1896194421,-1960379322,-1960442753,-960888251,-617353725,1459683513,
                  -402405501,-1956651361,-1392221386,-1962932731,-321877032,-335298374,-1977163638,-386888955,-1157976216,347079616,-288977938,181308411,-1174047543,65733575,637782202,-301906549,
                  -1964190837,62962373,516120046,-108833193,-1961987072,-661717946,-1946519925,-341032868,1662946056,1569269252,63224384,-1962927128,1501395,-402403654,-745865200,-335101309,
                  -402407238,1599995908,-108805345,-335252479,-1409094742,1364444142,-2082501801,-994441785,-1258180349,-1361778684,-335295302,155682854,-335295814,71796774,73602699,-947651701,
                  -1258245878,-1363875816,-1962688326,600278011,330629297,-1364006831,-1061488039,-289306109,-1426330558,-851787266,-826611082,-2080666877,11614151,-2081945419,1532583854,1464947651,
                  -1896194421,-1960379322,1972053567,-1351489472,637782714,-301709942,-1323055229,-1961642752,-1368987431,-1157969013,-1047919680,92940014,-17043897,1993161409,1532583910,-1202315581,
                  -661741568,-1962934338,-1021354492,-1168682669,45089732,-1968324888,-1274892040,-1381439473,-1326971728,-1327986003,-402148348,-826626662,-402214909,-527782497,112259211,-2014837580,
                  -402280275,-393564785,28575152,-1330808344,-1383995388,1460062346,-1902116680,-16448,-2096668758,844186311,-1979404051,-1386682139,-1426093336,-41892354,1508800003,-1341930310,
                  -387741180,45133122,1005119370,63879853,-443939408,-1330826776,-387872252,-963924694,602408624,1532583853,1586372291,-94467076,-994429045,-1274761213,-1391663097,-1341927750,
                  -402344954,95464706,-68623310,1120306092,63224401,45089205,-337058422,-14817108,-2132422484,-294254339,45096793,-672657484,-16127828,1364414659,508974930,16417542,
                  -661776524,-1064386509,68206508,-1322939866,584185392,-339473695,68198405,-1146474460,-315467959,1946221187,1066085893,-1959918613,1334455863,-2086341886,-2094136381,-462028993,
                  1600003847,1482381658,503597507,-1475935100,1311748,67138564,201588860,-64511,284624639,-977220,117440355,379785463,-14,0,0,12583111,
                  0,5505024,39190869,72876887,106825049,141559647,39124991,8654848,1048619,841635940,268436565,1638532,1477967888,39203370,8654848,43,
                  841636092,268436567,1638532,1487929344,39334442,52433920,1049176,841636168,335544921,39322400,1502478336,73282090,41948416,16777616,841636308,369099871,
                  31457920,1511653632,74461738,41948672,480,841636378,1054852,196640,-2086768894,-1635090044,1325408191,3597,-1902379008,-1776336241,16753593,67305985,
                  939987973,1010514489,205471293,69376,0,-16773616,134217728,0,0,600708,196672,-2086768894,-1635090044,1207967679,2055,-1902379008,
                  -1994440062,16753593,67305985,939987973,1010514489,205471293,69376,0,-16773616,134217728,0,0,1054852,196640,-2086769150,-1635090044,
                  1325408191,3597,-1902379008,-1777384817,16753593,134744072,268961800,404232216,236460056,69376,0,-16774640,134217728,0,0,600708,
                  196672,-2086769150,-1635090044,1207967679,2055,-1902379008,-1996012926,16753593,134744072,268961800,404232216,236460056,69376,0,-16774640,134217728,
                  0,0,543332,983546,1669066502,308707428,1610674288,0,-2040987648,1493185111,16769897,67305985,939987973,1010514489,20921917,3840,
                  0,-15792896,0,1248067584,33161224,-301596657,-2140904581,-261090714,24576,0,844596825,-479635200,1061093631,1061109567,1061109567,1061109567,
                  251658559,0,83886080,65295,0,1054800,983424,1331651342,-2141945264,1073749951,0,-1902379008,-1774169969,16753593,67305985,134678021,
                  202050057,1091505677,3840,0,-15792832,0,491782400,25165840,-485621745,-2108666017,1040941140,16384,0,1356827882,-486217920,33620223,
                  100992003,168364039,235736075,251674895,0,88080384,65295,16777216,923728,1057161232,1331668483,-2141945264,1291853759,3083,-1518141440,1661806685,
                  16753594,150994943,285212671,419430399,251658239,2048,0,-16774640,530512,1057161488,1331651330,-2141945264,-956293185,1798,-1902379008,-1777391473,
                  16753593,67305985,268895749,336794129,1512981,3840,0,-16773616,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1845493760,
                  -1902379008,-1774180209,16753593,67305985,134678021,202050057,1091505677,3840,0,-15792832,0,0,80,993536,1331651334,-2125102512,
                  1073749951,0,-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,80,993536,1331651334,-2125102512,
                  1073749951,0,-1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,530472,985376,657285894,-2144628696,
                  -1073733697,0,-1902379008,-1778379633,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,530512,983360,1331651334,-2141945264,
                  -1073733697,0,-1902379008,-1778374513,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,923728,984448,1331732992,-531621290,
                  8048,0,777912320,1577063517,16747374,402653192,24,8,184549400,1280,0,-15792368,923728,984448,1331406592,-1169156269,
                  8044,0,727580672,1594823773,16747274,67108865,7,67108865,16777223,1280,0,-15792368,923728,983424,1331667462,-2141945264,
                  1073749951,0,-2055012352,1661937757,16769978,402653192,24,8,184549400,1280,0,-16448256,923728,983424,1331667718,-2141945264,
                  1073749951,0,-2055012352,1661937757,16769978,67305985,939987973,1010514489,20921917,3840,0,-15792896,923688,198920,657302274,-1607757784,
                  1291853759,3083,-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923688,198920,657302274,-1607757784,
                  1291853759,3083,-2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,
                  1291853759,3083,-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,
                  1291853759,3083,-2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,1054760,198664,657286914,-1607757784,
                  1325408191,3597,-1902379008,-1776348017,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652354,-2125102512,
                  1325408191,3597,-1902379008,-1776342897,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652098,-2125102512,
                  1325408191,3597,-1902379008,-1777391473,16753593,134744072,268961800,404232216,236460056,528128,0,-16774640,1056080,983456,1331684102,-2141945264,
                  1073757707,0,-1930821632,-419419937,16761604,1061109567,1061109567,1061109567,20922175,3840,0,-16710400,1056080,983456,1331684102,-2141945264,
                  1073757707,0,-1930821632,-419419937,16769796,67305985,939987973,1010514489,20921917,3840,0,-15792896,530472,983328,1331651342,-2141945264,
                  1090527167,0,-1902379008,-1774180209,16753593,67305985,134678021,202050057,1091505677,3840,0,-15792832,-1,-1,135268368,-63472,
                  135274301,135268368,135268368,269486096,524095504,135274301,-1073714968,0,0,0,-1073711856,0,0,-536844056,0,0,
                  0,-536840918,0,0,1967390746,49152,0,0,0,0,1703936,-536840892,0,0,0,0,
                  0,524560,16777216,16908800,17040384,84018432,100730368,134219269,117442561,117835522,1040639,117440512,251594754,4128768,690825260,689843754,
                  134744072,134283521,0,33818624,16843010,1048592,1048592,262148,2,0,0,1048576,16,131088,16777232,-1195853640,
                  -1330071368,0,-1600086016,-1600085856,1431633920,-21846,134480385,-2143281136,-1070593021,268963328,36880,135270416,524099389,135270416,504368144,792534845,
                  723062272,335810560,352653569,874786848,891629857,470554632,487397641,1009530920,1026373929,369496578,386339587,908472866,925315875,504240650,521083659,1043216938,
                  1060059947,470877440,673516296,538642178,740824079,707072268,909254164,740758287,959717403,606014214,808196115,639700233,858659349,808130323,1027089439,841816078,
                  1060643872,335810560,352915713,335810560,352915713,1043216938,1060059947,1043216938,1060059947,335810560,352915713,335810560,352915713,1043216938,1060059947,1043216938,
                  1060059947,470877440,672402184,470877440,672402184,841816078,1060643872,841816078,1060643872,470877440,672402184,470877440,672402184,841816078,1060643872,841816078,
                  1060643872,0,0,353703189,353703189,353703189,353703189,1061109567,1061109567,0,0,353703189,353703189,353703189,353703189,1061109567,
                  1061109567,335810560,352915713,1043216938,1060059947,470877440,672402184,841816078,1060643872,185074944,403968270,673456156,1060647469,272564224,2047744,1056976703,
                  1061093439,4140800,268451615,658448159,523190047,1059010367,1061101375,524236575,656359215,826223917,758529837,1059928639,1061104959,759118381,825048886,119275520,
                  924672,469767452,471597084,1840384,117447694,287051278,236264462,470685724,471600668,236722190,286137365,370938900,337124372,471079452,471602204,337386004,
                  370416664,68157440,528384,268438544,269484048,1051648,67112968,168822792,135008264,268963344,269486096,135269896,168300556,202377995,185405451,269160208,
                  269486864,185601803,202051597,303174160,68289552,68289552,68296192,70059008,353764352,16,336860176,336866560,338498560,756290560,757935360,67372048,
                  67375104,68158464,268698624,269488128,21577,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1124073472,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  -1207129515,-1202667520,-900726781,0,852636498,1511509476,-1020672778,-270004816,-1341819393,-1513462,-1560301373,-1269168896,521194754,1482381658,1397816271,857625169,
                  -2133160238,17104958,113699188,-1979644672,-1274781122,1376832771,1979695592,854995660,-855460654,-855067632,1975519760,-400510974,-1250558050,372949758,-445316022,1979686376,
                  986119848,2114225206,-339725610,158,23652352,1744988456,1772618601,90826756,1745250856,1797785962,191588362,-401839192,1814564203,325871630,-1472172056,1843937645,
                  1131292738,-1471713688,1831358314,-2140313520,-1467912536,1860731502,-2022774653,-393711832,1869140330,-9459502,530472,198920,657285890,-1607757784,-956293185,1798,
                  -1902379008,-1776348017,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530472,198920,657285890,-1607757784,-956293185,1798,
                  -1902379008,-1776348017,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530512,196880,1331651330,-2125102512,-956293185,1798,
                  -1902379008,-1776342897,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530512,196880,1331651330,-2125102512,-956293185,1798,
                  -1902379008,-1776342897,16753593,67305985,268895749,336794129,135730709,3840,0,-16773616,530472,198976,657285890,-2144628696,-1056956481,0,
                  -1902379008,-1778379633,16753337,35067155,268895748,336794129,18290197,768,0,-16773328,530472,198976,657285890,-2144628696,-1056956481,0,
                  -1902379008,-1778379633,16753337,35067155,268895748,336794129,18290197,768,0,-16773328,530512,65856,1331651334,-2141945264,-1056956481,0,
                  -1902379008,-1778374513,16761529,387389207,387389207,387389207,18290455,256,0,-16773888,923728,196624,1331668483,-2125102512,1291853759,3083,
                  -2055012352,1661806685,16753594,134744072,268961800,404232216,236460056,528128,0,-16774640,1054800,991613,1331651334,-2125102512,1073749951,0,
                  -1902379008,-1776342897,16769977,67305985,939987973,1010514489,20921917,3840,0,-15792896,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,530472,64,657924867,355546925,1191186692,1798,
                  618725376,-536341305,16753648,67305985,268895749,336794129,135730709,3840,0,-16773616,80,993536,1331651078,-2125102512,1073749951,0,
                  -1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,80,993536,1331651334,-2125102512,1073749951,0,
                  -1902379008,-1776342897,16769977,0,0,0,20905984,3840,3840,-15792888,530472,985376,657285894,-2144628696,-1073733697,0,
                  -1902379008,-1778379633,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,530512,983360,1331651334,-2141945264,-1073733697,0,
                  -1902379008,-1778374513,16769977,67305985,268895749,336794129,18290197,3840,0,-15792896,923728,984448,1331732992,-531621290,8048,0,
                  777912320,1577063517,16747374,402653192,24,8,184549400,1280,0,-15792368,923728,984448,1331406592,-1169156269,8044,0,
                  727580672,1594823773,16747274,67108865,7,67108865,16777223,1280,0,-15792368,923728,983424,1331667462,-2141945264,1073749951,0,
                  -2055012352,1661937757,16769978,402653192,24,8,184549400,1280,0,-16448256,923728,983424,1331667718,-2141945264,1073749951,0,
                  -2055012352,1661937757,16769978,67305985,939987973,1010514489,20921917,3840,0,-15792896,923688,198920,657302274,-1607757784,1291853759,3083,
                  -2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923688,198920,657302274,-1607757784,1291853759,3083,
                  -2055012352,1662981213,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,1291853759,3083,
                  -2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,923728,196880,1331667714,-2125102512,1291853759,3083,
                  -2055012352,1662986333,16753594,67305985,939987973,1010514489,138362429,3840,0,-16773616,1054760,198664,657286914,-1607757784,1325408191,3597,
                  -1902379008,-1776348017,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652354,-2125102512,1325408191,3597,
                  -1902379008,-1776342897,16753593,67305985,939987973,1010514489,205471293,528128,0,-16773616,1054800,196624,1331652098,-2125102512,1325408191,3597,
                  -1902379008,-1777391473,16753593,134744072,268961800,404232216,236460056,528128,0,-16774640,1056080,983456,1331684102,-2141945264,1073757707,0,
                  -1930821632,-419419937,16761604,1061109567,1061109567,1061109567,20922175,3840,0,-16710400,1056080,983456,1331684102,-2141945264,1073757707,0,
                  -1930821632,-419419937,16769796,67305985,939987973,1010514489,20921917,3840,0,-15792896,530472,983328,1331651342,-2141945264,1090527167,0]
                  }
                • 62-003084-060.hex
                  55 30 15 34 30 35 32 2F 38 31 3A 30 30 E9 00 49 
                  4D 43 4D 41 41 4C 00 00 00 00 00 30 30 36 30 35 
                  4F 59 49 48 20 41 41 49 45 53 53 45 53 49 43 20 
                  39 37 31 38 2C 41 4C 52 47 54 20 45 45 56 44 47 
                  3D 00 00 28 0A 06 1C 07 07 00 00 50 0A 06 1C 07 
                  07 00 00 28 0A 06 70 01 00 00 00 50 0F 06 19 0D 
                  0C 00 00 08 CB 00 00 00 1E 33 8E B3 B8 12 10 06 
                  00 06 0E 00 06 01 F0 06 01 F0 06 01 06 0E 01 06 
                  00 0C 0E 00 06 01 08 0E 01 06 00 00 0E 00 C0 BF 
                  EE 64 C6 87 60 06 04 B8 40 B3 E8 00 01 1F E8 02 
                  E8 00 64 58 E4 80 05 05 FC 7F B8 02 6E EB 90 E7 
                  80 89 20 0B 74 87 1F CB 07 CD E8 2F C0 44 B9 13 
                  C7 E8 01 14 E8 2F 57 E8 00 D4 F6 87 02 03 B4 89 
                  63 BF 70 C7 33 E8 01 06 04 75 E8 01 E8 02 06 04 
                  74 0A 79 E8 4E 03 3E E8 4E 80 7F B9 00 BA 03 E4 
                  24 B2 E8 01 D4 E8 00 0B B4 E8 00 03 EB BA 03 C4 
                  0C B2 E8 01 B4 E8 00 10 94 B8 00 26 04 CD E8 00 
                  C3 B8 05 CE E8 01 09 E4 0B 06 52 80 01 8C FE 3C 
                  75 B4 E9 01 80 0F BA 03 76 58 A0 04 80 05 0A 26 
                  04 E8 4D 08 0E 04 E8 4D A2 04 80 03 05 FC 75 B8 
                  00 01 3A 5B 8C A3 04 06 04 74 00 74 3D E0 08 06 
                  04 74 00 80 10 30 0E 04 C3 36 04 80 87 02 B0 E8 
                  00 E8 00 E0 1A F4 E8 00 1A 00 08 25 E6 E8 00 C4 
                  DE 80 25 E8 00 32 E8 37 01 BE 78 B0 74 80 89 FB 
                  05 BE 78 A0 EB B9 00 50 E8 4C 10 0E 04 B9 00 54 
                  E8 4C 18 0E 04 80 89 06 80 80 B9 00 7C E8 4C 75 
                  80 01 D8 C3 06 04 75 BA 03 03 D8 A0 04 C3 B0 E8 
                  00 BA 01 58 B0 E8 00 C0 E8 EF E8 2D C1 2E 05 47 
                  C1 CD F2 B0 BA 03 32 86 42 30 86 4A C3 C3 C0 C6 
                  EE C8 EE 00 BA 03 00 E2 C3 00 00 00 00 00 00 00 
                  EE 00 EC 00 E8 FF 86 E8 FF 86 C3 E8 42 E8 4A 52 
                  E8 E8 FF C3 E8 FF F6 22 EB 90 E8 FF 0A EB 90 0F 
                  86 50 0F E8 FF C3 CE EB 50 E9 5A 8B BA 03 AA 58 
                  A7 09 E8 FF 0A EB 8A 26 25 94 47 C1 CD F1 FC C1 
                  93 AA C1 CD F3 50 E8 2C FE EC 08 FB C9 58 50 E8 
                  2C FE EC 08 FB 58 DD E0 63 86 22 86 0A E8 FF 8B 
                  63 80 06 38 B2 EC 60 80 88 0F 01 E6 D0 08 88 B0 
                  E8 FF E0 06 04 00 00 00 A0 04 01 B9 01 EC 75 F6 
                  89 10 2A 07 0B A4 74 BB 00 C8 C3 0F FB 10 F7 03 
                  B9 01 11 ED 12 E9 08 DF 02 B9 01 E8 2D 07 07 8B 
                  0A BB 00 B7 E8 FF B1 D2 59 C3 90 2E 3F 74 2E 07 
                  05 C3 EB 2E 7F 81 E8 C3 09 8A 50 DF 58 FE 3C 75 
                  C3 BF 57 D2 72 2E 47 10 1B 8B 0A C7 B0 E8 FE C4 
                  74 2E 7F 84 03 C7 8B 63 83 06 BA 03 00 44 E8 FF 
                  BA 03 00 E8 FE 01 8A 26 61 E8 FE 80 04 F1 C2 8A 
                  09 FE 03 02 FE 14 B2 A8 75 B2 32 E8 FE 08 B2 32 
                  E8 FD C4 00 E8 FD D6 11 E8 FD 00 8A 26 61 E8 FD 
                  80 18 F1 74 BB 00 BC BB 00 B6 BB 00 B0 BA 03 00 
                  8A 26 61 E8 FD 80 08 F1 0F 74 F6 80 7D 3E 04 75 
                  BA 03 00 E8 FD 01 B4 E8 FD 13 B7 E8 2A E8 2B 57 
                  6E 8A BB 57 CC 11 6A FE 78 BB 57 CC 03 72 2E 3F 
                  74 BA 03 8A 81 B4 75 24 E8 FD 2E 3F 74 8B B8 00 
                  46 2E 3F 74 2E 07 8A 01 36 43 EB C3 36 04 A3 8B 
                  80 06 C0 14 E9 2A 00 00 80 1C 1E 42 80 10 16 50 
                  00 8E 58 3E FF 1F 02 42 CD CF FB 56 F6 DE C4 F0 
                  C4 E6 00 E6 FF F4 5E CF 5E CF C0 40 20 70 90 A0 
                  E0 E0 40 80 40 90 40 40 30 50 70 60 40 00 EF EF 
                  EF EF EF EF 70 00 30 00 53 DF FF E3 97 04 C3 3E 
                  04 74 80 49 03 A0 04 5E 02 5F 8B 63 FA 42 E0 FB 
                  53 E3 00 E3 8B 6E 5B 00 55 AA FF E8 2B 8A 32 32 
                  8B F7 4A 2E A4 07 07 07 07 07 07 F8 E7 C7 F7 4C 
                  03 58 D1 D1 03 80 49 06 02 E7 C3 26 04 F8 C7 F7 
                  4C 03 58 F7 85 03 E8 FF 12 C7 00 74 81 FF D0 B0 
                  E8 FC E7 E7 E7 C3 03 CE E9 FF 02 C4 E9 FF E6 E6 
                  54 8B C3 00 00 00 00 00 00 00 00 00 7E A5 BD 81 
                  7E DB C3 FF 6C FE 7C 10 10 7C 7C 10 38 38 FE 38 
                  10 38 FE 38 00 18 3C 00 FF E7 C3 FF 00 66 42 3C 
                  FF 99 BD C3 0F 0F CC CC 3C 66 3C 7E 3F 3F 30 F0 
                  7F 7F 63 E6 99 3C E7 5A 80 F8 F8 80 02 3E 3E 02 
                  18 7E 18 3C 66 66 66 66 7F DB 1B 1B 3E 38 6C CC 
                  00 00 7E 7E 18 7E 7E 18 18 7E 18 18 18 18 7E 18 
                  00 0C 0C 00 00 60 60 00 00 C0 C0 00 00 66 66 00 
                  00 3C FF 00 00 FF 3C 00 00 00 00 00 30 78 30 30 
                  6C 6C 00 00 6C FE FE 6C 30 C0 0C 30 00 CC 30 C6 
                  38 38 DC 76 60 C0 00 00 18 60 60 18 60 18 18 60 
                  00 3C 3C 00 00 30 30 00 00 00 00 30 00 00 00 00 
                  00 00 00 30 06 18 60 80 7C CE F6 7C 30 30 30 FC 
                  78 0C 60 FC 78 0C 0C 78 1C 6C FE 1E FC F8 0C 78 
                  38 C0 CC 78 FC 0C 30 30 78 CC CC 78 78 CC 0C 70 
                  00 30 00 30 00 30 00 30 18 60 60 18 00 FC 00 00 
                  60 18 18 60 78 0C 30 30 7C DE DE 78 30 CC FC CC 
                  FC 66 66 FC 3C C0 C0 3C F8 66 66 F8 FE 68 68 FE 
                  FE 68 68 F0 3C C0 CE 3E CC CC CC CC 78 30 30 78 
                  1E 0C CC 78 E6 6C 6C E6 F0 60 62 FE C6 FE D6 C6 
                  C6 F6 CE C6 38 C6 C6 38 FC 66 60 F0 78 CC DC 1C 
                  FC 66 6C E6 78 E0 1C 78 FC 30 30 78 CC CC CC FC 
                  CC CC CC 30 C6 C6 FE C6 C6 6C 38 C6 CC CC 30 78 
                  FE 8C 32 FE 78 60 60 78 C0 30 0C 02 78 18 18 78 
                  10 6C 00 00 00 00 00 00 30 18 00 00 00 78 7C 76 
                  E0 60 66 DC 00 78 C0 78 1C 0C CC 76 00 78 FC 78 
                  38 60 60 F0 00 76 CC 0C E0 6C 66 E6 30 70 30 78 
                  0C 0C 0C CC E0 66 78 E6 70 30 30 78 00 CC FE C6 
                  00 F8 CC CC 00 78 CC 78 00 DC 66 60 00 76 CC 0C 
                  00 DC 66 F0 00 7C 78 F8 10 7C 30 18 00 CC CC 76 
                  00 CC CC 30 00 C6 FE 6C 00 C6 38 C6 00 CC CC 0C 
                  00 FC 30 FC 1C 30 30 1C 18 18 18 18 E0 30 30 E0 
                  76 00 00 00 00 38 C6 FE 78 C0 78 0C 00 00 CC 7E 
                  1C 78 FC 78 7E 3C 3E 3F CC 78 7C 7E E0 78 7C 7E 
                  30 78 7C 7E 00 78 C0 0C 7E 3C 7E 3C CC 78 FC 78 
                  E0 78 FC 78 CC 70 30 78 7C 38 18 3C E0 70 30 78 
                  C6 6C FE C6 30 00 CC CC 1C FC 78 FC 00 7F 7F 7F 
                  3E CC CC CE 78 00 CC 78 00 00 CC 78 00 00 CC 78 
                  78 00 CC 7E 00 00 CC 7E 00 00 CC 0C C3 3C 66 18 
                  CC CC CC 78 18 7E C0 18 38 64 60 FC CC 78 30 30 
                  F8 CC C6 C6 0E 18 18 D8 1C 78 7C 7E 38 70 30 78 
                  00 00 CC 78 00 00 CC 7E 00 00 CC CC FC CC FC CC 
                  3C 6C 00 00 38 6C 00 00 30 30 C0 78 00 00 C0 00 
                  00 00 0C 00 C3 CC 33 CC C3 CC 37 CF 18 00 18 18 
                  00 66 66 00 00 66 66 00 22 22 22 22 55 55 55 55 
                  DB DB DB DB 18 18 18 18 18 18 F8 18 18 F8 F8 18 
                  36 36 F6 36 00 00 FE 36 00 F8 F8 18 36 F6 F6 36 
                  36 36 36 36 00 FE F6 36 36 F6 FE 00 36 36 FE 00 
                  18 F8 F8 00 00 00 F8 18 18 18 1F 00 18 18 FF 00 
                  00 00 FF 18 18 18 1F 18 00 00 FF 00 18 18 FF 18 
                  18 1F 1F 18 36 36 37 36 36 37 3F 00 00 3F 37 36 
                  36 F7 FF 00 00 FF F7 36 36 37 37 36 00 FF FF 00 
                  36 F7 F7 36 18 FF FF 00 36 36 FF 00 00 FF FF 18 
                  00 00 FF 36 36 36 3F 00 18 1F 1F 00 00 1F 1F 18 
                  00 00 3F 36 36 36 FF 36 18 FF FF 18 18 18 F8 00 
                  00 00 1F 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 
                  0F 0F 0F 0F FF FF 00 00 00 76 C8 76 00 CC CC C0 
                  00 CC C0 C0 00 6C 6C 6C FC 60 60 FC 00 7E D8 70 
                  00 66 66 60 00 DC 18 18 FC 78 CC 30 38 C6 C6 38 
                  38 C6 6C EE 1C 18 CC 78 00 7E DB 00 06 7E DB 60 
                  38 C0 C0 38 78 CC CC CC 00 00 00 00 30 FC 30 FC 
                  60 18 60 FC 18 60 18 FC 0E 1B 18 18 18 18 18 D8 
                  30 00 00 30 00 DC 76 00 38 6C 00 00 00 00 18 00 
                  00 00 18 00 0F 0C EC 3C 78 6C 6C 00 70 30 78 00 
                  00 3C 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  7E A5 81 99 7E 00 00 7E DB FF E7 7E 00 00 00 FE 
                  FE 7C 10 00 00 00 38 FE 38 00 00 00 18 3C E7 18 
                  3C 00 00 18 7E FF 18 3C 00 00 00 00 3C 18 00 00 
                  FF FF FF C3 E7 FF FF 00 00 3C 42 66 00 00 FF FF 
                  C3 BD 99 FF FF 00 1E 1A 78 CC 78 00 00 3C 66 3C 
                  7E 18 00 00 3F 3F 30 70 E0 00 00 7F 7F 63 67 E6 
                  00 00 18 DB E7 DB 18 00 00 80 E0 FE E0 80 00 00 
                  02 0E FE 0E 02 00 00 18 7E 18 7E 18 00 00 66 66 
                  66 00 66 00 00 7F DB 7B 1B 1B 00 00 C6 38 C6 6C 
                  0C 7C 00 00 00 00 FE FE 00 00 18 7E 18 7E 18 00 
                  00 18 7E 18 18 18 00 00 18 18 18 7E 18 00 00 00 
                  18 FE 18 00 00 00 00 30 FE 30 00 00 00 00 00 C0 
                  FE 00 00 00 00 28 FE 28 00 00 00 00 38 7C FE 00 
                  00 00 00 FE 7C 38 00 00 00 00 00 00 00 00 00 00 
                  18 3C 18 00 18 00 00 66 24 00 00 00 00 00 6C FE 
                  6C FE 6C 00 18 7C C2 7C 86 7C 18 00 00 C2 0C 30 
                  C6 00 00 38 6C 76 CC 76 00 00 30 60 00 00 00 00 
                  00 0C 30 30 30 0C 00 00 30 0C 0C 0C 30 00 00 00 
                  66 FF 66 00 00 00 00 18 7E 18 00 00 00 00 00 00 
                  18 18 00 00 00 00 FE 00 00 00 00 00 00 00 00 18 
                  00 00 02 0C 30 C0 00 00 00 7C CE F6 C6 7C 00 00 
                  18 78 18 18 7E 00 00 7C 06 18 60 FE 00 00 7C 06 
                  3C 06 7C 00 00 0C 3C CC 0C 1E 00 00 FE C0 FC 06 
                  7C 00 00 38 C0 FC C6 7C 00 00 FE 06 18 30 30 00 
                  00 7C C6 7C C6 7C 00 00 7C C6 7E 06 78 00 00 00 
                  18 00 18 00 00 00 00 18 00 18 30 00 00 06 18 60 
                  18 06 00 00 00 00 00 7E 00 00 00 60 18 06 18 60 
                  00 00 7C C6 18 00 18 00 00 7C C6 DE DC 7C 00 00 
                  10 6C C6 C6 C6 00 00 FC 66 7C 66 FC 00 00 3C C2 
                  C0 C2 3C 00 00 F8 66 66 66 F8 00 00 FE 62 78 62 
                  FE 00 00 FE 62 78 60 F0 00 00 3C C2 C0 C6 3A 00 
                  00 C6 C6 FE C6 C6 00 00 3C 18 18 18 3C 00 00 1E 
                  0C 0C CC 78 00 00 E6 6C 78 6C E6 00 00 F0 60 60 
                  62 FE 00 00 C6 FE D6 C6 C6 00 00 C6 F6 DE C6 C6 
                  00 00 38 C6 C6 C6 38 00 00 FC 66 7C 60 F0 00 00 
                  7C C6 C6 DE 0C 00 00 FC 66 7C 66 E6 00 00 7C C6 
                  38 C6 7C 00 00 7E 5A 18 18 3C 00 00 C6 C6 C6 C6 
                  7C 00 00 C6 C6 C6 6C 10 00 00 C6 C6 D6 FE 6C 00 
                  00 C6 6C 38 6C C6 00 00 66 66 3C 18 3C 00 00 FE 
                  8C 30 C2 FE 00 00 3C 30 30 30 3C 00 00 80 E0 38 
                  0E 02 00 00 3C 0C 0C 0C 3C 00 10 6C 00 00 00 00 
                  00 00 00 00 00 00 00 FF 30 18 00 00 00 00 00 00 
                  00 00 0C CC 76 00 00 E0 60 6C 66 7C 00 00 00 00 
                  C6 C0 7C 00 00 1C 0C 6C CC 76 00 00 00 00 C6 C0 
                  7C 00 00 38 64 F0 60 F0 00 00 00 00 CC CC 0C 78 
                  00 E0 60 76 66 E6 00 00 18 00 18 18 3C 00 00 06 
                  00 06 06 66 3C 00 E0 60 6C 6C E6 00 00 38 18 18 
                  18 3C 00 00 00 00 FE D6 C6 00 00 00 00 66 66 66 
                  00 00 00 00 C6 C6 7C 00 00 00 00 66 66 60 F0 00 
                  00 00 CC CC 0C 1E 00 00 00 76 60 F0 00 00 00 00 
                  C6 1C 7C 00 00 10 30 30 30 1C 00 00 00 00 CC CC 
                  76 00 00 00 00 66 66 18 00 00 00 00 C6 D6 6C 00 
                  00 00 00 6C 38 C6 00 00 00 00 C6 C6 06 F8 00 00 
                  00 CC 30 FE 00 00 0E 18 70 18 0E 00 00 18 18 00 
                  18 18 00 00 70 18 0E 18 70 00 00 76 00 00 00 00 
                  00 00 00 10 6C C6 00 00 00 3C C2 C0 66 0C 7C 00 
                  CC 00 CC CC 76 00 00 18 00 C6 C0 7C 00 00 38 00 
                  0C CC 76 00 00 CC 00 0C CC 76 00 00 30 00 0C CC 
                  76 00 00 6C 00 0C CC 76 00 00 00 3C 60 3C 06 00 
                  00 38 00 C6 C0 7C 00 00 CC 00 C6 C0 7C 00 00 30 
                  00 C6 C0 7C 00 00 66 00 18 18 3C 00 00 3C 00 18 
                  18 3C 00 00 30 00 18 18 3C 00 00 C6 38 C6 FE C6 
                  00 38 38 38 C6 FE C6 00 18 60 FE 60 60 FE 00 00 
                  00 CC 36 D8 6E 00 00 3E CC FE CC CE 00 00 38 00 
                  C6 C6 7C 00 00 C6 00 C6 C6 7C 00 00 30 00 C6 C6 
                  7C 00 00 78 00 CC CC 76 00 00 30 00 CC CC 76 00 
                  00 C6 00 C6 C6 06 78 00 C6 6C C6 C6 38 00 00 C6 
                  C6 C6 C6 7C 00 00 18 66 60 3C 18 00 00 6C 60 60 
                  60 FC 00 00 66 3C 7E 7E 18 00 00 CC F8 CC CC C6 
                  00 00 1B 18 7E 18 18 70 00 30 00 0C CC 76 00 00 
                  18 00 18 18 3C 00 00 30 00 C6 C6 7C 00 00 30 00 
                  CC CC 76 00 00 76 00 66 66 66 00 76 00 E6 FE CE 
                  C6 00 00 6C 3E 7E 00 00 00 00 6C 38 7C 00 00 00 
                  00 30 00 30 C6 7C 00 00 00 00 FE C0 00 00 00 00 
                  00 FE 06 00 00 00 C0 CC 30 DC 0C 3E 00 C0 CC 30 
                  CE 3E 06 00 18 00 18 3C 18 00 00 00 36 D8 36 00 
                  00 00 00 D8 36 D8 00 00 11 11 11 11 11 11 11 55 
                  55 55 55 55 55 55 DD DD DD DD DD DD DD 18 18 18 
                  18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 
                  18 18 36 36 36 36 36 36 36 00 00 00 00 36 36 36 
                  00 00 00 18 18 18 18 36 36 36 06 36 36 36 36 36 
                  36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 06 
                  00 00 00 36 36 36 36 00 00 00 18 18 18 18 00 00 
                  00 00 00 00 00 18 18 18 18 18 18 18 00 00 00 18 
                  18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 18 
                  18 18 18 18 00 00 00 00 00 00 00 18 18 18 18 18 
                  18 18 18 18 18 18 18 18 18 36 36 36 36 36 36 36 
                  36 36 36 30 00 00 00 00 00 00 30 36 36 36 36 36 
                  36 00 00 00 00 00 00 00 00 36 36 36 36 36 36 30 
                  36 36 36 00 00 00 00 00 00 00 36 36 36 00 36 36 
                  36 18 18 18 00 00 00 00 36 36 36 36 00 00 00 00 
                  00 00 00 18 18 18 00 00 00 00 36 36 36 36 36 36 
                  36 00 00 00 18 18 18 18 00 00 00 00 00 00 18 18 
                  18 18 00 00 00 00 36 36 36 36 36 36 36 36 36 36 
                  18 18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 
                  00 00 18 18 18 FF FF FF FF FF FF FF 00 00 00 00 
                  FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 
                  0F FF FF FF FF 00 00 00 00 00 00 DC D8 76 00 00 
                  00 7C FC C6 C0 40 00 FE C6 C0 C0 C0 00 00 00 FE 
                  6C 6C 6C 00 00 FE 60 18 60 FE 00 00 00 00 D8 D8 
                  70 00 00 00 66 66 7C 60 00 00 00 76 18 18 18 00 
                  00 7E 3C 66 3C 7E 00 00 38 C6 FE C6 38 00 00 38 
                  C6 C6 6C EE 00 00 1E 18 3E 66 3C 00 00 00 00 DB 
                  7E 00 00 00 03 7E DB 7E C0 00 00 1C 60 7C 60 1C 
                  00 00 00 C6 C6 C6 C6 00 00 00 00 FE 00 00 00 00 
                  00 18 18 00 FF 00 00 30 0C 0C 30 7E 00 00 0C 30 
                  30 0C 7E 00 00 0E 1B 18 18 18 18 18 18 18 18 D8 
                  70 00 00 00 18 7E 18 00 00 00 00 76 00 DC 00 00 
                  00 6C 38 00 00 00 00 00 00 00 18 00 00 00 00 00 
                  00 00 00 00 00 00 0C 0C 0C 6C 1C 00 00 6C 6C 6C 
                  00 00 00 00 D8 60 F8 00 00 00 00 00 7C 7C 7C 00 
                  00 00 00 00 00 00 00 00 1D 00 00 66 66 00 00 00 
                  00 63 22 00 00 00 00 2B 00 18 18 18 18 00 00 00 
                  00 00 FF 00 00 00 4D 00 E7 DB C3 C3 00 00 00 FF 
                  99 18 18 3C 00 56 00 C3 C3 C3 3C 00 00 00 C3 C3 
                  DB FF 66 00 58 00 C3 3C 3C C3 00 00 00 C3 C3 3C 
                  18 3C 00 5A 00 C3 0C 30 C3 00 00 00 00 00 FF DB 
                  DB 00 76 00 00 C3 C3 3C 00 00 00 00 00 C3 DB 66 
                  00 91 00 00 3B 7E DC 00 00 00 18 C3 C0 7E 18 00 
                  9D 00 66 18 18 18 00 00 00 66 7C 66 66 F3 00 F1 
                  00 18 FF 18 00 00 00 00 18 00 FF 00 18 00 00 00 
                  00 00 00 00 00 00 00 00 81 81 BD 81 7E 00 00 00 
                  FF FF C3 FF 7E 00 00 00 00 FE FE 7C 10 00 00 00 
                  00 38 FE 38 00 00 00 00 18 3C E7 18 3C 00 00 00 
                  18 7E FF 18 3C 00 00 00 00 00 3C 18 00 00 00 FF 
                  FF FF C3 E7 FF FF FF 00 00 3C 42 66 00 00 00 FF 
                  FF C3 BD 99 FF FF FF 00 0E 32 CC CC 78 00 00 00 
                  66 66 3C 7E 18 00 00 00 33 30 30 70 E0 00 00 00 
                  63 63 63 67 E6 00 00 00 18 DB E7 DB 18 00 00 80 
                  E0 F8 F8 E0 80 00 00 02 0E 3E 3E 0E 02 00 00 00 
                  3C 18 18 3C 00 00 00 00 66 66 66 00 66 00 00 00 
                  DB DB 1B 1B 1B 00 00 7C 60 6C C6 38 C6 00 00 00 
                  00 00 00 FE FE 00 00 00 3C 18 18 3C 7E 00 00 00 
                  3C 18 18 18 18 00 00 00 18 18 18 7E 18 00 00 00 
                  00 18 FE 18 00 00 00 00 00 30 FE 30 00 00 00 00 
                  00 00 C0 FE 00 00 00 00 00 28 FE 28 00 00 00 00 
                  00 38 7C FE 00 00 00 00 00 FE 7C 38 00 00 00 00 
                  00 00 00 00 00 00 00 00 3C 3C 18 00 18 00 00 66 
                  66 00 00 00 00 00 00 00 6C FE 6C FE 6C 00 00 18 
                  C6 C0 06 86 7C 18 00 00 00 C6 18 60 86 00 00 00 
                  6C 38 DC CC 76 00 00 30 30 00 00 00 00 00 00 00 
                  18 30 30 30 0C 00 00 00 18 0C 0C 0C 30 00 00 00 
                  00 66 FF 66 00 00 00 00 00 18 7E 18 00 00 00 00 
                  00 00 00 18 18 00 00 00 00 00 FE 00 00 00 00 00 
                  00 00 00 00 18 00 00 00 00 06 18 60 80 00 00 00 
                  6C C6 D6 C6 38 00 00 00 38 18 18 18 7E 00 00 00 
                  C6 0C 30 C0 FE 00 00 00 C6 06 06 06 7C 00 00 00 
                  1C 6C FE 0C 1E 00 00 00 C0 C0 06 06 7C 00 00 00 
                  60 C0 C6 C6 7C 00 00 00 C6 06 18 30 30 00 00 00 
                  C6 C6 C6 C6 7C 00 00 00 C6 C6 06 06 78 00 00 00 
                  00 18 00 18 00 00 00 00 00 18 00 18 30 00 00 00 
                  06 18 60 18 06 00 00 00 00 7E 00 00 00 00 00 00 
                  60 18 06 18 60 00 00 00 C6 0C 18 00 18 00 00 00 
                  7C C6 DE DC 7C 00 00 00 38 C6 FE C6 C6 00 00 00 
                  66 66 66 66 FC 00 00 00 66 C0 C0 C2 3C 00 00 00 
                  6C 66 66 66 F8 00 00 00 66 68 68 62 FE 00 00 00 
                  66 68 68 60 F0 00 00 00 66 C0 DE C6 3A 00 00 00 
                  C6 C6 C6 C6 C6 00 00 00 18 18 18 18 3C 00 00 00 
                  0C 0C 0C CC 78 00 00 00 66 6C 78 66 E6 00 00 00 
                  60 60 60 62 FE 00 00 00 EE FE C6 C6 C6 00 00 00 
                  E6 FE CE C6 C6 00 00 00 C6 C6 C6 C6 7C 00 00 00 
                  66 66 60 60 F0 00 00 00 C6 C6 C6 D6 7C 0E 00 00 
                  66 66 6C 66 E6 00 00 00 C6 60 0C C6 7C 00 00 00 
                  7E 18 18 18 3C 00 00 00 C6 C6 C6 C6 7C 00 00 00 
                  C6 C6 C6 6C 10 00 00 00 C6 C6 D6 FE 6C 00 00 00 
                  C6 7C 38 6C C6 00 00 00 66 66 18 18 3C 00 00 00 
                  C6 0C 30 C2 FE 00 00 00 30 30 30 30 3C 00 00 00 
                  80 E0 38 0E 02 00 00 00 0C 0C 0C 0C 3C 00 00 38 
                  C6 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 30 
                  00 00 00 00 00 00 00 00 00 78 7C CC 76 00 00 00 
                  60 78 66 66 7C 00 00 00 00 7C C0 C0 7C 00 00 00 
                  0C 3C CC CC 76 00 00 00 00 7C FE C0 7C 00 00 00 
                  6C 60 60 60 F0 00 00 00 00 76 CC CC 7C CC 00 00 
                  60 6C 66 66 E6 00 00 00 18 38 18 18 3C 00 00 00 
                  06 0E 06 06 06 66 00 00 60 66 78 6C E6 00 00 00 
                  18 18 18 18 3C 00 00 00 00 EC D6 D6 C6 00 00 00 
                  00 DC 66 66 66 00 00 00 00 7C C6 C6 7C 00 00 00 
                  00 DC 66 66 7C 60 00 00 00 76 CC CC 7C 0C 00 00 
                  00 DC 66 60 F0 00 00 00 00 7C 60 0C 7C 00 00 00 
                  30 FC 30 30 1C 00 00 00 00 CC CC CC 76 00 00 00 
                  00 66 66 66 18 00 00 00 00 C6 D6 D6 6C 00 00 00 
                  00 C6 38 38 C6 00 00 00 00 C6 C6 C6 7E 0C 00 00 
                  00 FE 18 60 FE 00 00 00 18 18 18 18 0E 00 00 00 
                  18 18 18 18 18 00 00 00 18 18 18 18 70 00 00 00 
                  DC 00 00 00 00 00 00 00 00 38 C6 C6 00 00 00 00 
                  66 C0 C0 66 0C 7C 00 00 00 CC CC CC 76 00 00 0C 
                  30 7C FE C0 7C 00 00 10 6C 78 7C CC 76 00 00 00 
                  00 78 7C CC 76 00 00 60 18 78 7C CC 76 00 00 38 
                  38 78 7C CC 76 00 00 00 00 66 60 3C 06 00 00 10 
                  6C 7C FE C0 7C 00 00 00 00 7C FE C0 7C 00 00 60 
                  18 7C FE C0 7C 00 00 00 00 38 18 18 3C 00 00 18 
                  66 38 18 18 3C 00 00 60 18 38 18 18 3C 00 00 C6 
                  10 6C C6 C6 C6 00 00 6C 00 6C C6 C6 C6 00 00 30 
                  00 66 7C 60 FE 00 00 00 00 CC 36 D8 6E 00 00 00 
                  6C CC CC CC CE 00 00 10 6C 7C C6 C6 7C 00 00 00 
                  00 7C C6 C6 7C 00 00 60 18 7C C6 C6 7C 00 00 30 
                  CC CC CC CC 76 00 00 60 18 CC CC CC 76 00 00 00 
                  00 C6 C6 C6 7E 0C 00 C6 7C C6 C6 C6 7C 00 00 C6 
                  C6 C6 C6 C6 7C 00 00 18 3C 60 60 3C 18 00 00 38 
                  64 F0 60 60 FC 00 00 00 66 18 18 18 18 00 00 F8 
                  CC C4 DE CC C6 00 00 0E 18 18 18 18 18 70 00 18 
                  60 78 7C CC 76 00 00 0C 30 38 18 18 3C 00 00 18 
                  60 7C C6 C6 7C 00 00 18 60 CC CC CC 76 00 00 00 
                  DC DC 66 66 66 00 00 DC C6 F6 DE C6 C6 00 00 3C 
                  6C 00 00 00 00 00 00 38 6C 00 00 00 00 00 00 00 
                  30 30 60 C6 7C 00 00 00 00 00 C0 C0 00 00 00 00 
                  00 00 06 06 00 00 00 C0 C2 CC 30 DC 0C 3E 00 C0 
                  C2 CC 30 CE 3E 06 00 00 18 18 18 3C 18 00 00 00 
                  00 36 D8 36 00 00 00 00 00 D8 36 D8 00 00 00 44 
                  44 44 44 44 44 44 44 AA AA AA AA AA AA AA AA 77 
                  77 77 77 77 77 77 77 18 18 18 18 18 18 18 18 18 
                  18 18 F8 18 18 18 18 18 18 F8 F8 18 18 18 18 36 
                  36 36 F6 36 36 36 36 00 00 00 FE 36 36 36 36 00 
                  00 F8 F8 18 18 18 18 36 36 F6 F6 36 36 36 36 36 
                  36 36 36 36 36 36 36 00 00 FE F6 36 36 36 36 36 
                  36 F6 FE 00 00 00 00 36 36 36 FE 00 00 00 00 18 
                  18 F8 F8 00 00 00 00 00 00 00 F8 18 18 18 18 18 
                  18 18 1F 00 00 00 00 18 18 18 FF 00 00 00 00 00 
                  00 00 FF 18 18 18 18 18 18 18 1F 18 18 18 18 00 
                  00 00 FF 00 00 00 00 18 18 18 FF 18 18 18 18 18 
                  18 1F 1F 18 18 18 18 36 36 36 37 36 36 36 36 36 
                  36 37 3F 00 00 00 00 00 00 3F 37 36 36 36 36 36 
                  36 F7 FF 00 00 00 00 00 00 FF F7 36 36 36 36 36 
                  36 37 37 36 36 36 36 00 00 FF FF 00 00 00 00 36 
                  36 F7 F7 36 36 36 36 18 18 FF FF 00 00 00 00 36 
                  36 36 FF 00 00 00 00 00 00 FF FF 18 18 18 18 00 
                  00 00 FF 36 36 36 36 36 36 36 3F 00 00 00 00 18 
                  18 1F 1F 00 00 00 00 00 00 1F 1F 18 18 18 18 00 
                  00 00 3F 36 36 36 36 36 36 36 FF 36 36 36 36 18 
                  18 FF FF 18 18 18 18 18 18 18 F8 00 00 00 00 00 
                  00 00 1F 18 18 18 18 FF FF FF FF FF FF FF FF 00 
                  00 00 FF FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 
                  0F 0F 0F 0F 0F 0F 0F FF FF FF 00 00 00 00 00 00 
                  00 76 D8 D8 76 00 00 00 CC CC CC C6 CC 00 00 00 
                  C6 C0 C0 C0 C0 00 00 00 00 6C 6C 6C 6C 00 00 00 
                  FE 60 18 60 FE 00 00 00 00 7E D8 D8 70 00 00 00 
                  00 66 66 7C 60 00 00 00 00 DC 18 18 18 00 00 00 
                  7E 3C 66 3C 7E 00 00 00 38 C6 FE C6 38 00 00 00 
                  6C C6 6C 6C EE 00 00 00 30 0C 66 66 3C 00 00 00 
                  00 7E DB 7E 00 00 00 00 03 7E DB 7E C0 00 00 00 
                  30 60 60 60 1C 00 00 00 7C C6 C6 C6 C6 00 00 00 
                  00 00 FE 00 00 00 00 00 00 18 18 00 FF 00 00 00 
                  30 0C 0C 30 7E 00 00 00 0C 30 30 0C 7E 00 00 00 
                  1B 18 18 18 18 18 18 18 18 18 18 D8 70 00 00 00 
                  00 18 7E 18 00 00 00 00 00 76 00 DC 00 00 00 38 
                  6C 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 
                  00 00 00 00 00 00 00 0F 0C 0C EC 6C 1C 00 00 D8 
                  6C 6C 00 00 00 00 00 70 30 C8 00 00 00 00 00 00 
                  00 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 66 66 00 00 00 30 00 66 C3 DB C3 3C 00 00 
                  00 C3 FF DB C3 C3 00 00 54 00 DB 18 18 18 3C 00 
                  00 00 C3 C3 C3 C3 3C 00 00 57 00 C3 C3 DB FF 66 
                  00 00 00 C3 66 18 3C C3 00 00 59 00 C3 66 18 18 
                  3C 00 00 00 FF 86 18 60 C3 00 00 6D 00 00 E6 DB 
                  DB DB 00 00 00 00 00 C3 C3 3C 00 00 77 00 00 C3 
                  C3 DB 66 00 00 00 00 00 66 18 66 00 00 91 00 00 
                  6E 1B D8 77 00 00 00 18 C3 C0 C3 18 00 00 9D 00 
                  66 18 18 18 18 00 00 00 66 7C 66 66 66 00 00 AB 
                  C0 C2 CC 30 CE 06 1F 00 00 C0 C6 18 66 96 06 00 
                  00 00 00 00 00 00 00 00 8B 63 80 06 F2 E8 D3 F2 
                  E9 D3 EA BA 03 32 26 79 E8 FF C3 08 8A E9 D3 9C 
                  E8 FF 57 BB 00 F3 5B 13 C3 E4 10 06 11 07 C8 F8 
                  88 5F C3 BB B0 E8 D2 A1 58 FA C0 8A E8 D2 8A EB 
                  E8 00 16 C0 00 BA A0 06 04 75 BA B8 00 C3 62 B8 
                  07 F1 00 EB F6 87 80 39 3E 04 74 E8 FF 57 C2 E8 
                  01 D0 F6 0A 74 50 B0 8A E8 D2 58 FC FF AB 80 10 
                  CA E7 BB 5F C3 00 00 00 8A 88 80 0F FC 74 80 03 
                  A0 04 B4 3C 74 3C 74 3C 74 50 E8 00 05 83 08 5B 
                  74 B2 C3 49 A8 74 3C 74 50 E8 00 05 F6 03 5B C3 
                  3E 04 C4 8C 0B C3 BB 00 ED 5B EE DB F6 87 08 0E 
                  52 CE B0 E8 D1 40 58 33 56 86 2E 00 0B 80 FF 05 
                  C3 EB 43 8A 80 FF C3 B0 F6 8B 81 9A 58 A0 04 14 
                  08 E8 FF E5 9D 50 F6 03 74 B0 E8 D1 C4 74 B0 E8 
                  D1 C4 75 2E 47 20 05 C4 EB 0C 58 53 C0 B0 72 2E 
                  67 80 03 10 04 FC 74 B0 80 02 02 10 C0 C3 F6 25 
                  74 3C 76 3C 76 3C 74 50 C4 58 03 02 46 46 E6 50 
                  52 5C 8E 5A 58 53 4F 50 49 50 0B D0 25 3F B8 00 
                  4E B8 80 48 B8 00 3E 04 74 B8 00 10 00 8E 26 06 
                  00 B8 40 28 26 06 00 B8 00 1C 26 3E 00 74 BB 80 
                  03 0B 58 C3 06 E8 D0 32 CD 58 B2 5B 00 00 00 00 
                  E8 D1 06 04 74 E8 00 FA C8 E8 D0 C9 C4 84 8A E8 
                  D0 C3 7A 9D E8 D0 BA 03 6E B2 E8 D0 E0 68 8A E8 
                  D0 D8 C3 16 F3 C6 8A 47 8A 47 8A 47 A9 46 EC E3 
                  FC F3 C6 C3 8A AA C7 8A AA E2 C3 D2 01 02 2A 02 
                  03 C2 C3 53 79 5B 86 86 04 C3 51 8A 25 00 66 F7 
                  8B 8B 58 8A 25 00 85 F7 03 13 58 3F BA 0E E2 C8 
                  DA E1 D3 C5 83 00 58 E3 FB 2E 8A 2E 8A 2E 8A C3 
                  8A 8A 8A 8A E8 FF FE FE 75 C3 ED 8A E8 FF E2 E8 
                  E8 71 8A D0 D0 E8 FF DA C5 F9 46 C5 C9 DA 32 32 
                  26 79 E8 FC C3 FB 7C 26 7D B3 E8 FC C6 B0 E8 CF 
                  F4 75 80 49 13 5D 42 80 00 55 84 80 49 13 5B 44 
                  B1 F6 89 06 09 ED F1 6F EB E8 FF 64 B9 10 61 57 
                  74 BF 00 B5 B1 E8 FF C0 C7 F1 E8 FE 69 47 C9 EB 
                  C7 FE 75 5F E8 FC 08 04 B1 E9 FF 04 F6 89 06 F1 
                  C6 B9 00 17 00 00 00 00 BA 03 02 E8 CE 04 E8 CE 
                  CE 05 E8 CE 06 E8 CE 04 E8 CE 8D 32 E9 CE BA 03 
                  02 E8 CE 04 E8 CE 0E 50 75 B3 B2 B8 10 8C 8A B0 
                  E8 CE 04 E8 CE 0A 74 E8 FB 26 01 3C 74 3A 49 75 
                  34 C3 3E 04 CF 14 75 8A B0 E8 CE E0 09 F1 80 0D 
                  02 CF E7 0B 3E 88 60 FE FE E8 CE 26 04 14 52 C1 
                  F7 85 FE A2 04 C0 26 04 80 00 02 E0 8A B0 E8 CE 
                  84 FE F6 4A D1 FE A3 04 BA 08 10 E8 FC 1A 8A 01 
                  D0 7F E2 3C 74 B6 BD 10 01 25 1B B8 80 00 1B 0E 
                  10 80 01 09 3E 04 75 74 B6 BD 1F CA 8B 0E B9 01 
                  D2 1E 8A 80 03 E5 C3 74 FE 02 B1 D3 8B 59 1F 00 
                  8E 8B FC 03 64 F6 80 17 0A 74 57 E4 05 E0 F8 CF 
                  ED A4 EB 1E 57 33 8E BB 00 4B 5B 07 03 EB A0 04 
                  3C 74 3C 74 EB B9 01 08 B0 06 AA C7 E2 B9 00 07 
                  BF 16 83 1F C7 E2 1F 57 57 CF ED A4 83 20 E2 5F 
                  06 57 51 50 E0 7F 3C 77 E9 00 7F 03 A5 80 1F 08 
                  5B FF E9 00 FF 72 8A 24 BA 03 DF 5B 50 58 B7 59 
                  92 80 0F D8 FF 72 8B 86 E8 06 E5 FF 75 E8 CC CC 
                  E8 CC 01 03 02 06 B0 E8 CC C4 58 02 C4 0F CE E8 
                  CC B7 FF 75 E8 05 5F B7 EB 80 01 14 7E 75 F6 49 
                  F8 03 79 E8 04 8F FF 03 6D E8 FA 02 81 41 E9 FF 
                  16 5A 9C FA 75 8A 9D 52 08 5B 5A 5D C3 81 90 49 
                  74 50 BA 46 0E 5A C7 0C 10 8C 0E 80 87 7F 26 04 
                  06 04 75 E9 00 B0 E8 CB C4 58 73 B0 E8 CB C4 58 
                  67 FB 74 E8 05 34 EB 3A 49 74 80 10 CF 87 75 3B 
                  63 75 80 10 30 29 88 75 B3 EB 3B 63 75 80 10 20 
                  13 72 75 B3 80 88 F0 1E 04 62 C7 63 D4 8A 10 80 
                  30 FB 75 EB 8A 10 80 30 06 04 74 E8 F9 16 04 1F 
                  FA 75 80 30 0D C0 76 FC 75 B0 EB E8 F9 03 18 EB 
                  EB C7 0C 10 8C 0E 80 87 F3 FC 75 F6 87 02 34 07 
                  7E 80 87 08 E7 C6 85 08 06 04 74 80 87 04 06 04 
                  75 C7 63 D4 E8 F8 16 C0 0D 06 04 03 A9 74 B0 80 
                  87 7F F9 74 A2 04 08 E8 02 B4 49 E8 CB CE E8 CD 
                  20 B9 53 20 F6 89 08 03 2A 58 F8 A5 E8 00 0A E8 
                  F8 6F 14 E8 FC 67 06 04 75 26 4D E3 26 5D 06 26 
                  7D 26 3D 14 E8 F7 97 FE 47 EF 8A B3 E8 CB 52 E8 
                  F7 07 8B 0C 0F 57 8B 0E C4 10 EF 5F B4 26 05 C0 
                  11 06 26 04 CC 14 16 04 36 E8 F7 F9 3C 74 E8 F8 
                  07 69 2E 57 C3 8C 83 0E 8A 0A 74 2E 5C 75 2E 4C 
                  75 2E 54 75 B7 0A 75 8A C3 D1 74 E9 00 14 E8 FB 
                  40 BB 00 D7 74 BB 00 62 74 26 3D 8A 01 8B 02 8B 
                  04 06 26 6D E8 FC E8 FB 5F 8A 0A FF 05 C8 84 BB 
                  00 A7 74 BB 00 26 74 26 3D 3E 04 30 8A 01 E3 53 
                  00 33 26 6D E8 FB 8A D0 D0 F6 10 03 CF 80 2C 13 
                  C4 B0 E8 CA E4 AF EB C7 60 00 B8 10 3E 04 74 B8 
                  08 03 3D FA 0C 8C 0E FB 0C E8 F7 25 07 E8 FA 1D 
                  8A FE A2 04 8A 01 85 26 6D FA 2E 01 06 01 C3 E7 
                  B3 BA 03 01 A3 33 A3 04 62 BB 00 87 04 7D 26 05 
                  4A 26 45 A3 04 8A 01 84 26 45 A2 04 8B 14 C4 60 
                  8A 49 80 07 16 FF 8A 78 A2 04 30 FB 75 B0 A2 04 
                  A2 04 06 04 03 D8 FF FB 74 8B D1 03 81 91 EB C6 
                  63 B4 C7 2E 3F 07 7C 8B 63 32 80 B4 02 C0 C2 E8 
                  C8 EA C4 74 8A 49 80 01 13 C7 80 03 0B C7 80 07 
                  03 C7 32 26 25 3C 47 C0 10 F3 3E 04 74 52 62 8E 
                  5A FF F3 80 04 65 E8 C8 FA 74 FE A0 04 04 C3 B0 
                  A3 01 26 04 B8 00 49 B8 00 43 A0 04 00 10 80 49 
                  07 0C 11 B3 CD BF 5A 0D 12 B3 CD E8 00 A0 E8 00 
                  0C E8 01 0E E8 01 0D E8 01 06 00 00 0E 00 B8 A3 
                  01 0E 04 A0 04 F4 0E E8 CA DB FF 8A 23 74 FE 80 
                  10 F0 8A 34 11 64 E8 F4 16 04 C2 32 E9 C7 DB 7F 
                  74 FE B0 E8 C7 E4 B1 D2 8A E8 F5 C8 1C 01 27 74 
                  A0 04 0F 0E C1 10 08 C1 12 02 C1 8A 88 8A 89 80 
                  0F FB 7E 80 0C 03 DB 80 10 CF 26 04 80 09 15 05 
                  0E 04 80 10 30 0E 04 B3 EB B3 F6 80 02 09 0E 04 
                  80 87 FD 26 04 08 88 89 63 80 FF 50 84 B9 00 07 
                  14 0F F6 89 04 0A 1B 33 B9 00 10 C3 50 E0 71 2E 
                  86 BB 57 D7 D8 50 5A 22 0A 58 E3 E9 C6 00 00 00 
                  51 89 60 A0 04 08 20 C5 75 F6 20 06 1E C9 10 D0 
                  43 75 8A 24 75 E8 00 E5 0A E0 86 FE 8A E8 C9 E0 
                  59 A0 04 08 0D F9 0B 06 F9 0C 19 3C 75 81 07 75 
                  B9 0E 3C 75 81 0C 74 8A D0 80 1F E5 0A 74 3A 7D 
                  80 03 5A E9 0C EC 52 C8 C9 E9 4A FD 7E 3A 7D 80 
                  02 02 E9 C8 C9 34 F5 C6 3A 7C 2A 02 FE 8A FE 3C 
                  7E FE FE EB 80 02 08 EC C8 C9 0A E9 E8 CD C8 C9 
                  52 50 C1 07 DB EB C8 97 04 EB 1E 04 24 DA C7 E4 
                  26 04 FF D8 E3 1E 04 EB E7 0E FE 8A B0 E8 C8 5B 
                  C3 00 00 00 00 00 00 00 8B B1 D3 D1 81 50 8B 8B 
                  60 C3 00 00 00 00 00 00 33 F6 87 08 04 04 42 00 
                  52 50 62 8A 98 26 04 4E F6 49 F8 02 E8 D8 0C 94 
                  8A B0 E8 C8 56 E6 00 DE 90 04 63 00 00 00 00 00 
                  50 55 52 06 EC EC 32 86 89 FA DC E4 46 89 FE C0 
                  C6 46 8A 89 F6 C5 46 8A 89 F2 46 2B F4 2B FC 05 
                  DB 5E 8B F8 46 40 46 8B F6 46 40 46 83 FE 74 8B 
                  F8 03 46 F7 4A 89 DC 46 89 D8 4F 74 A0 04 00 21 
                  06 2D 02 46 04 73 06 3E 01 4F 45 36 C8 32 D8 75 
                  EB BA 00 01 BB 00 4E EB BA 00 04 80 49 06 05 02 
                  EB BB 00 5E B8 00 31 0E 04 01 33 A0 04 2E 04 00 
                  EB BA 00 0E 04 08 B8 00 0D 04 8B 85 BB 00 00 89 
                  D4 5E 89 DA 56 E8 00 58 E8 00 5F E8 00 C4 07 5A 
                  5D 58 A1 04 7E 03 07 02 F7 EB 83 DE 75 F7 E0 04 
                  F7 EB F7 85 83 DE 74 83 DE 75 BB 00 EB 46 83 FE 
                  74 F7 89 EC 8B EC 6E 89 EA 56 C3 00 83 DE 7E 83 
                  DE 74 A1 04 30 3D 00 05 00 EB B8 B0 46 89 D2 8B 
                  DC 6E 03 D8 6E 03 D4 46 89 D6 46 13 E8 46 89 DA 
                  8B EE 46 89 E4 46 89 E2 7E 00 06 46 89 E2 76 D1 
                  2E 94 40 0A 42 41 41 40 41 1E 67 75 F6 87 04 0F 
                  DA EC 08 FB B0 B2 EE 83 FC 74 8B F0 E1 5E 8E D2 
                  7E 8B DC A4 17 FF E4 E5 02 8B F0 7E 8E D2 46 B4 
                  86 F3 E8 01 4E 7F 1F 0D 75 A0 04 D8 EE C3 08 F7 
                  F0 46 83 FC 74 33 B8 00 2E 04 EB F0 F8 8E D2 5E 
                  03 D8 76 8B E6 A4 43 85 3B 7F E8 01 41 FF E4 CB 
                  92 33 B8 00 2E 04 EB F8 03 D8 46 8B E6 46 F3 1F 
                  3B 85 7C E8 01 0F FF E2 D1 49 B8 00 56 C3 7E 04 
                  2F 46 83 FE 75 8B D8 03 46 25 F0 46 29 D8 04 D3 
                  01 DA 46 8B DA E0 09 20 C3 8B F0 6E 89 E6 7E 00 
                  43 DB 50 F7 8B 8B 03 DC 7E 8E D2 5E 8B E6 C6 D7 
                  A4 F0 FA 4E B8 20 F0 F8 A4 B8 00 D8 CA E5 FF E4 
                  C0 D0 33 B8 00 EB 46 8B 8E D2 46 8B E6 D7 AA FA 
                  4E B8 20 F8 46 F3 43 04 3B 7F E8 00 4E 7F 1F 83 
                  FC 74 B8 01 63 B8 0F 65 33 8B F0 4A F7 8B 8B 03 
                  D8 76 8E D2 8E D4 A4 1F 85 3B 7F E8 00 4E 7F B8 
                  00 29 E8 00 02 E8 C5 00 E8 00 46 8A B0 E8 C5 FF 
                  E8 00 02 E8 C5 35 FF E2 D6 8B 33 A1 04 F7 5A 46 
                  8B 8E D2 4E 8B F3 43 1E 04 E3 8B E8 46 29 DC 5E 
                  C3 10 8B EC 46 73 01 DA 46 01 D8 03 5E C3 00 00 
                  53 52 57 E8 EF E4 E8 C4 DE 43 E8 C4 EA FF 71 8B 
                  E8 C3 03 B9 8B 07 5D 59 C3 44 44 44 44 43 A0 04 
                  D0 06 0E 16 04 12 06 E2 E2 E2 85 8E 50 56 33 8B 
                  51 FF C6 59 04 05 E2 0B 5F 59 74 03 E2 33 8E 58 
                  C1 E4 C9 C5 D0 FC 04 C5 80 06 05 8A EB B8 08 8B 
                  86 D0 81 00 14 D1 D1 FE 75 81 00 75 83 50 26 05 
                  D0 FA B8 08 E0 8A 80 FF 00 FE 75 83 08 FA F6 87 
                  04 14 17 75 BA 03 A8 75 FA A8 74 FB 8B C3 36 04 
                  80 C7 85 08 E8 FF 10 1F E8 C3 EA 80 E8 FF 80 06 
                  04 B8 08 85 B9 01 0D 50 05 E8 C3 C3 00 E9 FE 00 
                  0B 75 C3 8B EB 90 83 06 02 FF 9A 5B DC 50 8A 2E 
                  94 44 D5 59 E2 8B E8 C2 03 6D 8B EB 90 BF EB 90 
                  B4 50 E3 FF F6 58 D8 7A 75 E8 BF C3 5F 5A 5B 53 
                  52 57 56 E8 ED 11 75 80 80 CB 58 36 57 B4 02 F5 
                  BE 00 F5 52 E4 26 04 F0 C3 04 C8 FC CD F8 AC F1 
                  8A E8 FF C7 C2 E0 DB 03 33 26 03 F6 87 04 18 FD 
                  75 BA 03 C8 A8 75 FA A8 74 8B FB C3 0A BE 00 03 
                  1F E8 C2 7F D1 D1 D1 03 A0 04 DA 04 3C 74 E8 C1 
                  ED 98 BD 20 92 83 50 F0 EB BD 20 0A 79 26 05 32 
                  26 05 88 83 50 EA D9 EF 01 5B E8 FF EA DB 07 18 
                  29 EB E8 00 0E 04 16 04 26 05 03 E2 5F E3 15 8B 
                  85 8B 4A 8E 57 8A AC 88 03 E2 5F 8E 32 E8 C1 0F 
                  F1 E8 FE 2E 04 E5 E5 E5 0E 04 DA AC 80 E0 05 88 
                  EB 26 3D D0 75 83 08 FD E5 83 08 D9 00 00 00 00 
                  0B 74 50 5D 58 03 32 51 57 33 E8 C0 1C F6 87 04 
                  18 D9 75 BA 03 E0 A8 75 FA A8 74 FB C4 47 DD 5F 
                  59 00 00 00 00 00 00 00 50 B0 E8 BC C4 5A 75 F6 
                  87 08 03 42 50 52 3E 04 74 A0 04 FB DB 32 E0 E7 
                  0A A2 04 DF E3 80 08 E7 FB 06 04 74 32 E8 00 11 
                  3E A0 04 FF 20 02 C7 06 04 74 24 80 01 02 20 66 
                  24 0C 0A B3 E8 00 C3 02 0E 81 01 E8 00 C9 5A 58 
                  E8 BD E8 E9 C3 8A EE 20 FB 8F 00 00 00 00 00 00 
                  51 52 55 8B 8A 49 80 13 35 F3 E6 00 E6 FF 5E 24 
                  24 24 24 7E 7E 7E 24 24 24 24 24 24 96 96 96 96 
                  96 96 5A 80 5E 05 FB 75 E9 00 8E A1 04 E2 F8 FF 
                  09 C7 F7 4C 03 8B D1 D1 D1 03 F6 81 07 B8 A0 D8 
                  8B 00 EF FB 63 08 D2 BA 03 42 E0 0A 79 B8 18 EE 
                  86 EE 0F 02 B2 EE 86 EE 1D 05 8A 80 0F 02 C4 42 
                  E0 8A C6 FF 02 4A 42 E0 B8 00 CE EE 86 EE 08 4A 
                  42 E0 FB 5D 5A 59 B5 D2 32 B1 B0 B4 2A BA 03 42 
                  E0 8A 22 74 80 10 EB C9 E3 5E C6 01 EB 8A E8 00 
                  00 8E 80 01 74 88 E8 BB B3 05 46 88 01 A5 EB 52 
                  E0 D1 B8 01 E2 F8 8B 80 49 06 18 03 D1 E1 00 FA 
                  E0 03 2E 2C E1 E0 1C E7 01 D1 E1 00 FA D8 03 D2 
                  8A 2E 0C E9 EF EF EF F7 01 74 81 00 BB B8 DB 7E 
                  0D 0D 1D C4 74 32 88 EB 8A 22 D2 88 00 81 D5 DD 
                  C3 E9 4A D1 D1 D1 F7 03 83 00 F8 C2 C0 09 04 C8 
                  09 EC C3 00 00 00 00 00 53 52 8A 62 E8 BD 08 E8 
                  F4 5A 5B 3C 7F 74 3C 74 3C 74 3C 74 EB 32 C3 8B 
                  F7 1A C0 24 8C 39 1A 1B 06 04 74 52 51 57 E8 01 
                  5F 59 5A 26 04 58 3A 84 75 E9 00 C6 0A 74 FE C3 
                  7D 50 FF 58 2B E8 00 06 04 74 E8 BD 12 DA 8A FA 
                  A8 75 EC 01 FB C4 88 5A B4 EB E8 FA C2 16 04 0D 
                  D2 36 04 03 62 FE C3 8A 32 32 8B F7 4A 03 D1 8A 
                  98 26 04 F0 BB B8 10 25 00 30 75 BB B0 C3 58 50 
                  B0 E6 EB B0 E6 EB B0 E6 EB E4 EB 8A 0C E6 33 E2 
                  33 E2 8A E6 FB C3 53 8A 62 53 3E 04 4B 74 32 EB 
                  57 33 E8 BD 8B 07 B8 06 C9 36 04 16 04 CA 10 88 
                  62 5A 58 F6 89 01 49 F6 F6 10 40 E8 B8 B8 05 CE 
                  E8 B9 00 80 63 D4 03 00 0E BE 4A C0 00 B9 00 F2 
                  B8 4A 50 B8 20 CA 00 BA 03 F4 1F E8 B8 C4 74 B0 
                  E8 B8 CC E8 B9 BA 03 0B EB 42 EB 24 0C EE E8 B0 
                  EE 00 E8 EE 00 8E 33 8A 02 32 D1 33 32 8B 02 46 
                  F9 BA 03 0B EB 42 06 0A 74 B7 EC 00 F9 C7 BA 46 
                  0E CB 00 00 00 00 00 00 8A 4A A0 04 80 06 04 3E 
                  04 00 00 00 00 00 00 00 50 55 52 53 C0 15 3E 04 
                  74 E8 E5 5D 5B 5A 5D 58 3C 75 B3 EB 3C 74 EB 80 
                  49 13 E3 FA DB 26 3D 13 47 C3 FB 7C B3 26 3D 03 
                  5F DB 16 04 C2 EC C9 0A A8 75 E2 FE 75 8B BA 03 
                  C3 EB 26 05 EB B0 EE D1 FE 80 10 D4 C9 0A A8 75 
                  E2 FE 75 BA 03 11 EB 26 05 EB B0 EE 6E 3C 75 8A 
                  B3 E8 E4 CF 80 65 20 E4 08 E7 80 65 DF 74 E9 FF 
                  07 07 E8 E4 3F 3C 75 B3 E8 E4 8A E9 FF 09 17 FA 
                  DB 8B 8A AA C3 FB 7C 75 B3 EB 3C 75 8A 8A 8B E8 
                  E6 19 12 18 FA B7 E8 EE EB E8 E6 DD FB 21 E9 FE 
                  13 34 06 04 4A CB 10 3F 0A 75 80 80 ED 03 E7 E9 
                  FF E5 F6 80 07 E5 D0 D0 8A B3 E9 FF 15 0F C3 68 
                  8B 5B 5A F4 A1 3C 75 8B E8 E6 92 3C 75 8A BA 03 
                  BE EB 3C 75 BA 03 B6 5B D8 75 3C 75 B3 E8 E3 00 
                  22 B3 E8 E3 E7 D1 C9 04 ED ED D9 E9 FE 1B B6 FF 
                  FB 20 77 8B 8B E8 E5 63 32 0B E8 E5 E2 E9 FF 00 
                  3C 75 8B 85 8A 84 53 FF 77 FE 7F BB 00 03 0C C4 
                  5B 8A 32 D1 2E AF 75 07 EF 53 52 55 3C 75 8A B0 
                  BA 03 22 07 5F 59 58 3C 72 77 89 7C 8C 7E EB 3C 
                  73 0A 74 B2 80 03 0B 19 07 FB 74 B2 2C 74 E8 00 
                  0E 04 CA 16 04 2E 01 06 01 B3 E0 07 12 03 A9 04 
                  A5 23 8A B9 01 D2 52 E0 5A E3 E8 E8 F6 10 03 43 
                  B4 E8 E6 CA 0E BD 10 02 0C 08 10 74 B1 BD 1F 07 
                  80 10 23 1E 04 FB E3 02 EF 05 EB 2E 04 04 ED 0E 
                  04 E1 B8 12 80 20 0B 06 00 68 0E 00 80 30 68 06 
                  04 74 32 C3 06 04 74 3C 77 80 89 6F 09 06 04 74 
                  B4 0A 75 80 89 80 FC 75 B4 80 88 F0 26 04 A7 01 
                  F1 0E 04 EB 0A 75 F6 87 02 B1 26 04 EB 3C 77 80 
                  89 EF B2 FB 75 0A 75 F6 89 40 8F 52 80 CD 5A B0 
                  F6 89 40 33 01 2F 02 0D 57 8B E8 00 5F EB 3C 75 
                  06 52 C0 F2 BA 00 C7 5A 0E AA EB A8 74 E9 FF FB 
                  75 80 89 F7 C0 05 0E 04 E9 FF FB 75 0A 75 B0 E8 
                  B4 ED C0 76 EB 80 33 10 26 04 0A 75 80 89 02 D1 
                  FB 75 80 87 FE C0 C3 0E 04 EB 80 36 A1 52 20 E7 
                  F8 19 5A EB 51 AC E8 B4 E8 E4 C0 75 B9 FF 16 04 
                  C2 EC 00 01 F9 C2 EC 10 8A 33 33 E8 E3 3A 59 02 
                  C7 C9 50 BA 00 09 5A C4 08 89 B4 8C B6 C7 08 B0 
                  8C 0A B0 E8 B3 58 80 10 CF 03 B7 BA 03 06 04 75 
                  F6 87 02 22 13 26 04 F6 87 08 14 06 04 74 80 87 
                  02 07 B7 BA 03 3E 04 16 04 26 04 08 88 8A 89 8A 
                  87 80 87 F7 26 04 B4 CD F6 01 2C C3 74 B8 03 0E 
                  04 F6 02 08 03 80 10 10 26 04 08 88 80 87 08 00 
                  10 26 04 88 89 C3 57 08 F6 87 02 14 07 06 04 75 
                  B7 E8 00 0D 06 09 06 04 75 B7 B8 1A 96 5F C3 53 
                  1E 00 8E BB 03 D3 28 27 D2 88 3C 1F 5B C3 00 00 
                  A8 75 0B 74 50 51 55 E0 8A 00 3C 7F 74 3C 74 3C 
                  74 3C 75 51 F4 59 29 D2 25 E8 F8 EB 0A 74 FE EB 
                  F6 02 05 8A 00 50 09 69 58 E8 F8 E2 F6 01 03 C0 
                  5D 59 58 00 00 00 00 00 51 06 0E 24 BB 00 41 26 
                  75 26 0C ED E5 F8 E7 2E 95 51 1A 06 51 51 00 1A 
                  5F C3 8A 3A 7D 32 D1 03 26 5C 80 00 08 1C FF FF 
                  18 10 24 3C 75 F6 01 08 08 F6 01 02 FB 53 C0 3B 
                  04 13 FB 3B 04 0B FB C6 40 EA FF A2 04 C3 00 00 
                  0B 74 B8 00 53 57 51 B8 75 89 26 4D 83 04 3C 33 
                  F3 83 3C 1E BE 04 A4 84 B9 00 A4 FE FD 00 E8 FF 
                  89 83 02 DB 1E 04 E3 C3 75 8B 26 05 C7 BB 75 1E 
                  04 8A 26 05 E8 B2 88 47 03 C4 E8 B1 E0 E8 E8 F8 
                  C4 07 88 47 E7 EC C7 2C 88 47 1E 04 E3 8A 87 80 
                  01 F7 B1 D2 0A E8 B1 C0 B0 E8 B1 08 E0 E0 C7 88 
                  47 21 83 03 05 60 06 04 E8 88 47 D2 57 09 B9 00 
                  8A 02 FF FF 74 2E 54 83 04 EC C8 C3 C3 03 CA 5F 
                  26 15 1B E0 18 31 01 31 02 31 04 31 08 31 10 31 
                  00 5E 5A C3 00 00 00 00 06 57 55 EC EC 89 FE 46 
                  89 FA 3C 7C EB 80 A8 4F 81 07 0B 74 32 8B D1 BE 
                  53 2E 10 0B 74 E8 DD 5E B0 B4 8B FE C4 5D 5F 07 
                  8B FE D1 81 9A 2E 04 E0 E0 C0 02 C4 DC 5A 66 A0 
                  23 69 5D A3 BE 53 5E D1 81 06 2E 30 E3 00 FF 2E 
                  34 56 BE 53 03 5F 5E 03 F7 01 74 56 51 FF 59 5E 
                  EA C6 E2 C3 53 54 54 00 00 00 00 89 55 00 E8 01 
                  54 E8 02 C3 26 7F BA 00 E3 5A 55 89 04 2E BA 03 
                  14 42 26 85 01 C7 EC 01 8A BA 03 0A 74 FE AA C6 
                  EC 33 B9 01 34 E8 DC C3 26 47 E8 B0 77 5D 56 BE 
                  54 03 F7 01 74 56 51 FF 59 5E EA C6 E2 EB 83 90 
                  A7 C3 23 E8 01 01 E8 00 56 8B FA 46 26 77 8C BA 
                  00 51 5A C3 8B FA 46 26 7F 26 45 BA 03 33 B9 01 
                  83 03 9F 5F 36 04 05 00 D8 D0 BA 03 8A 26 05 F0 
                  68 FA C0 B0 EE C6 FB CE C9 05 C7 EB BA 03 8B 01 
                  8B EC C5 C0 EE C3 57 83 00 0E 46 8E 8B FA 5C AC 
                  08 1E 04 89 40 C4 E8 00 D3 16 BA 03 10 8B 83 06 
                  BA 03 04 5E 1F 83 01 04 AA 02 EE 53 57 DF C7 BA 
                  03 01 04 D4 BA 03 26 47 BA 03 26 47 8B 63 8B 83 
                  0A 00 18 B4 BA 03 FB C7 B1 B5 51 B2 59 BA 03 C1 
                  42 FB FE 3A 76 BA 03 FB C7 B1 B5 E8 AE 59 C3 51 
                  8B FA 46 26 3F 8B 40 71 BA 03 8A 04 83 23 00 13 
                  D9 66 8B FA C0 8A EE 8A 47 FB C1 CD E6 59 C3 56 
                  00 8E BE FF 04 1F 53 57 C4 B0 E8 AD F8 02 0F A8 
                  B0 E8 AD D8 04 07 9A BA 03 06 9F 8A 8B B0 B4 E8 
                  AD 05 8F 8A B0 B4 E8 AD 04 81 8A 06 B8 A0 C0 FF 
                  AA 07 C7 51 ED 04 E5 58 E8 FF FE 80 03 EE BA 03 
                  04 E3 42 B0 8A E8 AD CE B0 8A E8 AD 04 E1 2A 8B 
                  B0 E8 AD 59 C3 8E FC 5E 8B BA 03 04 07 0C BA 03 
                  06 04 02 B0 32 E8 AC C6 51 C4 B5 B0 8A E8 AC 1D 
                  AC E5 FD 76 59 B0 B4 E8 AC 09 C3 53 52 56 06 FA 
                  74 8E 33 8E AC 10 26 25 30 D1 E1 C4 05 10 24 AA 
                  49 32 83 00 05 8B EB 2E 37 8A 02 A4 C3 2E 3F 75 
                  07 5E 5A 5B C3 04 84 07 04 14 04 00 7C 04 01 FF 
                  FF F7 BC F1 63 FF F7 A3 F2 FF 00 00 00 00 C7 C0 
                  00 00 00 54 55 56 57 58 59 5E 5F 70 FF 54 00 84 
                  2B 10 64 2A 55 00 84 19 10 18 2A 56 00 84 2B 00 
                  FC 2A 57 00 84 19 00 B0 2A 58 00 20 58 10 48 2A 
                  59 00 20 58 00 8E 2A 5E 00 80 90 00 D4 2A 5F 00 
                  80 E0 00 1A 2A 70 00 80 E0 00 1A 2A 84 10 20 03 
                  02 9E 84 8A BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 
                  05 07 39 3B 3D 3F 00 01 00 00 10 00 00 00 00 00 
                  00 00 84 09 40 03 02 9E 84 8A BF 00 07 00 00 9C 
                  82 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 01 00 00 
                  10 00 00 00 00 00 00 00 84 10 20 03 02 9E 84 8A 
                  BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 
                  18 18 00 01 00 00 10 00 00 00 00 00 00 00 84 09 
                  40 03 02 9E 84 8A BF 00 07 00 00 9C 82 07 B9 FF 
                  08 08 08 08 18 18 18 18 00 01 00 00 10 00 00 00 
                  00 00 00 00 64 08 FA 0F 06 7B 64 66 70 00 00 00 
                  00 59 57 00 69 FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 00 0F 00 00 00 64 08 FA 0F 06 7B 64 66 70 
                  00 00 00 00 59 57 00 69 FF 3F 3F 3F 3F 3F 3F 3F 
                  3F 00 00 00 00 00 0F 00 00 00 50 10 80 0F 0E 5F 
                  50 54 BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 
                  09 0B 0D 0F 00 00 00 00 40 0F 00 00 00 50 10 80 
                  0F 0E 5F 50 54 0B 00 00 00 00 EA DF 40 04 FF 01 
                  03 05 07 09 0B 0D 0F 00 00 00 00 40 0F 00 00 00 
                  50 0E 10 03 03 5F 50 54 BF 00 0B 00 00 83 5D 0D 
                  BA FF FF FF FF FF FF FF FF FF 00 00 00 00 10 00 
                  50 08 10 03 02 5F 50 54 BF 00 06 00 00 9C 8F 0F 
                  B9 FF 01 03 05 07 11 13 15 17 00 00 00 00 10 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 9C 8F 40 B9 FF 01 03 05 07 09 0B 0D 0F 00 00 
                  00 00 40 0F 00 00 00 00 50 00 00 0F 06 5F 50 55 
                  BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 
                  00 3F 00 00 00 00 08 0F 50 00 00 0F 06 5F 50 55 
                  BF 00 00 00 00 9C 8F 1F B9 FF 00 00 00 00 00 00 
                  00 3F 00 00 00 00 08 0F 28 08 20 0F 06 2D 28 2B 
                  BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 
                  15 17 00 00 00 00 00 0F 50 08 40 0F 06 5F 50 54 
                  BF 00 00 00 00 9C 8F 00 B9 FF 01 03 05 07 11 13 
                  15 17 00 00 00 00 00 0F 50 0E 80 0F 00 60 56 50 
                  70 00 00 00 00 5E 5D 00 6E FF 08 00 18 00 08 00 
                  18 00 00 00 00 00 10 0F 50 0E 80 0F 00 5B 53 50 
                  6C 00 00 00 00 5E 5D 0F 0A FF 01 00 07 00 01 00 
                  07 00 00 00 00 00 10 0F 50 0E 80 0F 06 5F 50 54 
                  BF 00 00 00 00 83 5D 0F BA FF 08 00 18 00 08 00 
                  18 00 00 00 00 00 00 05 50 0E 80 0F 06 5F 50 54 
                  BF 00 00 00 00 83 5D 0F BA FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 00 0F 28 0E 08 03 02 2D 28 2B 
                  BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 10 00 28 0E 08 03 02 2D 28 2B 
                  BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 
                  BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 10 00 50 0E 10 03 02 5F 50 55 
                  BF 00 0B 00 00 83 5D 1F BA FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 10 00 28 10 08 03 02 2D 28 2B 
                  BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 
                  3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 
                  BF 00 0D 00 00 9C 8F 1F B9 FF 01 03 05 07 39 3B 
                  3D 3F 00 08 00 00 10 00 50 10 10 03 02 5F 50 55 
                  BF 00 0D 00 00 9C 8F 0F B9 FF 08 08 08 08 18 18 
                  18 18 00 08 00 00 10 00 50 10 A0 0F 06 5F 50 54 
                  0B 00 00 00 00 EA DF 00 04 FF 3F 3F 3F 3F 3F 3F 
                  3F 3F 00 00 00 00 00 01 50 10 A0 0F 06 5F 50 54 
                  0B 00 00 00 00 EA DF 00 04 FF 01 03 05 07 39 3B 
                  3D 3F 00 00 00 00 00 0F 28 08 20 0F 0E 5F 50 54 
                  BF 00 00 00 00 9C 8F 40 B9 FF 01 03 05 07 09 0B 
                  0D 0F 00 00 00 00 40 0F FF FF FF FF 10 10 10 FF 
                  3D 10 10 10 10 10 10 10 10 3D 3D 10 E8 00 00 00 
                  00 00 00 00 10 00 00 00 00 00 E8 00 00 00 00 00 
                  00 00 2A 00 00 00 00 00 1A 44 00 00 00 00 00 00 
                  00 00 00 00 00 1A 44 00 00 00 00 00 00 00 00 00 
                  00 00 10 08 00 00 00 02 00 04 00 02 00 01 05 00 
                  01 00 02 06 FF 0F 00 00 02 FF 00 3F 2C 2D 2A 1E 
                  08 08 01 01 00 00 00 04 02 01 10 10 10 10 04 04 
                  02 00 00 00 00 00 00 10 10 00 10 02 10 00 B8 B8 
                  B8 B8 00 00 00 A0 A0 A0 00 55 AA FF 01 04 10 40 
                  03 30 00 08 10 00 10 10 3D 3D 10 10 10 10 3D 3D 
                  00 19 00 04 01 05 20 24 21 25 08 0C 09 0D 28 2C 
                  29 2D 02 06 03 07 22 26 23 27 0A 0E 0B 0F 2A 2E 
                  2B 2F 00 11 08 25 02 1B 0F 28 0C 25 14 32 0F 27 
                  1B 34 06 1F 13 2C 09 21 15 2E 13 2B 1F 38 0E 2D 
                  20 38 00 04 01 09 00 04 01 09 2A 2E 2B 2F 2A 2E 
                  2B 2F 00 04 01 09 00 04 01 09 2A 2E 2B 2F 2A 2E 
                  2B 2F 00 11 08 14 00 11 08 14 0E 2D 20 38 0E 2D 
                  20 38 00 11 08 14 00 11 08 14 0E 2D 20 38 0E 2D 
                  20 38 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 
                  3F 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 
                  3F 3F 00 04 01 09 2A 2E 2B 2F 00 11 08 14 0E 2D 
                  20 38 00 08 0E 14 1C 24 2D 38 00 3F 00 1F 3F 00 
                  3F 3F 00 3F 1F 00 1F 3F 1F 2F 3F 1F 3F 3F 1F 3F 
                  2F 1F 2D 3F 2D 36 3F 2D 3F 3F 2D 3F 36 2D 00 1C 
                  00 0E 1C 00 1C 1C 00 1C 0E 00 0E 1C 0E 15 1C 0E 
                  1C 1C 0E 1C 15 0E 14 1C 14 18 1C 14 1C 1C 14 1C 
                  18 14 00 10 00 08 10 00 10 10 00 10 08 00 08 10 
                  08 0C 10 08 10 10 08 10 0C 08 0B 10 0B 0D 10 0B 
                  10 10 0B 10 0D 0B 10 12 10 12 10 12 00 12 00 2D 
                  00 16 10 00 10 14 00 14 00 2D 00 14 00 2D 10 04 
                  00 04 00 10 00 04 00 10 49 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  55 0C 00 50 03 50 00 00 52 D2 E4 17 F6 29 B0 E8 
                  FF 05 0A E8 C3 FF 00 5A 02 10 5A 5B CF 50 51 1E 
                  D2 DA 3E 05 74 C6 00 01 3E 04 03 10 E8 FF CC F6 
                  D2 02 10 08 10 C0 02 20 9E 75 FE 3A 4A 75 E8 FF 
                  A8 C6 36 04 D6 C0 9E 00 00 68 28 02 69 A8 04 69 
                  28 06 6A 28 0A 6B A8 0C 6B 28 0E 6C E8 40 6D E8 
                  42 6E 68 47 6A 28 50 6D A8 81 6E E8 83 6E 28 88 
                  6A 68 D2 6F 28 08 08 03 02 2D 28 2B BF 00 06 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 10 00 28 08 08 03 02 2D 28 2B BF 00 06 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 10 00 50 08 10 03 02 5F 50 55 BF 00 06 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 10 00 28 08 40 03 02 2D 28 2B BF 00 00 00 
                  00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 
                  00 00 30 00 28 08 40 03 02 2D 28 2B BF 00 00 00 
                  00 9C 8F 00 B9 FF 13 17 04 07 11 13 15 17 00 00 
                  00 00 30 00 50 08 40 01 06 5F 50 54 BF 00 00 00 
                  00 9C 8F 00 B9 FF 17 17 17 17 17 17 17 17 00 00 
                  00 00 00 00 50 0E 10 03 03 5F 50 55 BF 00 0B 00 
                  00 83 5D 0D BA FF 08 08 08 08 18 18 18 18 00 08 
                  00 00 10 00 50 10 7D 0F 06 5F 50 55 BF 00 00 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 28 08 40 00 03 37 2D 31 04 00 06 00 
                  00 E1 C7 08 F0 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 10 00 50 00 00 0F 06 5F 50 55 BF 00 00 00 
                  00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 
                  00 00 08 0F 50 00 00 0F 06 5F 50 55 BF 00 00 00 
                  00 9C 8F 1F B9 FF 00 00 00 00 00 00 00 3F 00 00 
                  00 00 08 0F 28 08 20 0F 06 2D 28 2B BF 00 00 00 
                  00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 00 0F 50 08 40 0F 06 5F 50 54 BF 00 00 00 
                  00 9C 8F 00 B9 FF 01 03 05 07 11 13 15 17 00 00 
                  00 00 00 0F 50 0E 80 0F 00 60 56 50 70 00 00 00 
                  00 5E 5D 00 6E FF 08 00 18 00 08 00 18 00 00 00 
                  00 00 10 0F 50 0E 80 0F 00 5B 53 50 6C 00 00 00 
                  00 5E 5D 0F 0A FF 01 00 07 00 01 00 07 00 00 00 
                  00 00 10 0F 50 0E 80 0F 06 5F 50 54 BF 00 00 00 
                  00 83 5D 0F BA FF 08 00 18 00 08 00 18 00 00 00 
                  00 00 00 05 50 0E 80 0F 06 5F 50 54 BF 00 00 00 
                  00 83 5D 0F BA FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 00 0F 28 0E 08 03 02 2D 28 2B BF 00 0B 00 
                  00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 10 00 28 0E 08 03 02 2D 28 2B BF 00 0B 00 
                  00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 
                  00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 10 00 50 0E 10 03 02 5F 50 55 BF 00 0B 00 
                  00 83 5D 1F BA FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 10 00 28 10 08 03 02 2D 28 2B BF 00 0D 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 
                  00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 
                  00 9C 8F 1F B9 FF 01 03 05 07 39 3B 3D 3F 00 08 
                  00 00 10 00 50 10 10 03 02 5F 50 55 BF 00 0D 00 
                  00 9C 8F 0F B9 FF 08 08 08 08 18 18 18 18 00 08 
                  00 00 10 00 50 10 A0 0F 06 5F 50 54 0B 00 00 00 
                  00 EA DF 00 04 FF 3F 3F 3F 3F 3F 3F 3F 3F 00 00 
                  00 00 00 01 50 10 A0 0F 06 5F 50 54 0B 00 00 00 
                  00 EA DF 00 04 FF 01 03 05 07 39 3B 3D 3F 00 00 
                  00 00 00 0F 28 08 20 0F 0E 5F 50 54 BF 00 00 00 
                  
                • 62-003085-060.hex
                  AA EB 37 30 30 2F 33 38 2D 38 30 3A 30 A8 00 42 
                  20 4F 50 54 42 45 00 00 00 00 30 33 35 2D 30 43 
                  50 52 47 54 50 52 44 53 20 59 54 4D 20 4E 2E 31 
                  38 2C 39 38 20 4C 20 49 48 53 52 53 52 45 56 41 
                  59 00 38 2D 1F 19 02 06 00 00 71 5A 1F 19 02 06 
                  00 00 38 2D 7F 64 02 00 00 00 61 52 19 19 02 0B 
                  00 00 E9 00 00 00 00 00 55 F6 DE 32 01 CD C7 40 
                  D0 8C 42 C7 08 65 C7 0A 00 C7 B4 B0 8C B6 C7 7C 
                  10 8C 7E C7 0C 10 8C 0E C7 74 85 8C 76 32 BA 03 
                  E8 01 06 04 C6 89 11 0C E8 02 9F B0 E8 02 47 50 
                  4B E8 31 80 07 FC 74 80 02 09 0F E8 02 04 E8 00 
                  0E 04 5D DB 02 DD FB 0E E8 03 19 32 E8 02 00 83 
                  23 EF BB 00 25 E9 2F 91 BE 03 06 04 74 BE 03 36 
                  04 30 E8 FF DB 39 F6 89 01 03 90 53 D3 F6 89 01 
                  09 FF 05 73 EB E8 4E DA 5B E7 C3 01 51 CC E8 01 
                  FE C2 D9 BA 03 CF 75 E8 00 BC B8 00 1B CC E8 01 
                  01 C2 B9 BA 03 AF 75 E8 00 07 80 89 FE 42 92 59 
                  C3 0F BA 03 9D B0 32 3C 75 E8 01 E4 E8 01 C0 0F 
                  EB 0A 81 53 E4 50 CE E8 01 50 89 50 FC 7F 80 89 
                  FB A7 EB 80 89 04 CD 58 89 58 FC 74 80 06 08 7F 
                  B7 E8 34 C3 C8 AA C7 A8 D8 3D C0 0D 00 75 C7 A8 
                  F4 EB C3 0E 04 80 87 02 80 10 10 36 04 C3 0F FF 
                  42 FF 8A B0 E8 00 F5 3C B0 75 B0 E8 00 E7 86 E8 
                  00 FC C3 B2 53 FF CE B9 00 4C E8 4C 10 26 04 B9 
                  00 68 E8 4C 33 01 BE 78 95 74 80 89 06 05 BE 78 
                  85 EB 80 87 08 0E 04 5B CF 53 05 BE 78 6B 5B 06 
                  CB E8 46 F6 87 02 05 B8 EB BA 03 65 EE 50 16 7D 
                  58 02 E8 00 0E 71 33 BA 4A C3 2C 8A EE 8A EE FE 
                  3A 7E C3 0F CE E8 00 E0 E8 00 E0 C3 C3 32 BA 03 
                  BA 03 B9 03 C9 EB EE FB 00 00 00 00 00 00 00 00 
                  EB C3 EB C3 F5 42 C4 EF 4A C4 E8 FF E8 FF C3 BA 
                  46 DB 5A 50 9D 5A D6 E6 1E 50 91 5A E6 14 B0 E8 
                  FF B8 05 BF 58 BA 03 B8 E8 FF 50 C2 CE E8 FF EB 
                  B8 00 E9 B8 00 E4 C1 8A E8 FF FE 3A 7E C3 8A E8 
                  FF FE 3A 7E C3 51 41 B9 FF A8 E1 0B 59 C3 51 2F 
                  B9 FF A8 E0 59 EB 8A E8 FF C3 C3 C4 E7 4B C3 16 
                  04 C2 E8 FF C2 24 C3 26 04 B0 E8 FF E8 06 04 02 
                  DB D0 08 88 C3 00 00 00 49 BB 00 5E E8 2C 17 06 
                  04 75 3C 74 E8 2C 06 00 B9 00 3C 74 3C 74 BB 00 
                  E0 3C 74 3C 74 3C 75 BB 00 90 C3 21 72 0E 2E 7F 
                  C3 00 E8 2C A5 51 06 E3 0A BB 68 80 FF 0E 3A 74 
                  83 03 F0 03 01 EF 68 B0 2E 25 E8 37 47 C0 0F F1 
                  57 74 E8 2C 22 F6 03 74 2E 7F 83 40 0F 2B F6 80 
                  0A 80 04 75 83 06 16 04 C2 EC C0 B0 E8 FE B0 5F 
                  C4 B8 01 3F BB 00 C3 8A 04 33 43 FB 7E B2 26 45 
                  81 B4 75 24 E8 FE DA 01 02 BA C0 07 E8 FE C0 C0 
                  FD B2 B8 03 FD 8B B8 00 F5 BB 00 C3 8A 0A E9 43 
                  FB 7E E8 FE 10 E8 2A 12 E8 2A 13 E8 2A CE BB 00 
                  C3 8A 37 BF 43 FB 7E B0 E8 FD C4 74 80 4A 84 1A 
                  C4 B8 01 9F B8 00 01 97 BB 00 00 77 C3 DD 73 E8 
                  FE E3 60 FE 78 BB 57 CC 0A 68 FE 78 BB 57 80 FF 
                  11 C2 2E 07 FE 03 02 FE 4D 43 80 FF 1C D6 11 E8 
                  FD 80 FF 0E 8A 2E 67 E8 FD 43 EC 8B 63 E8 FE D6 
                  C2 32 BB 00 05 00 00 00 FC 76 CD CF FC 76 1E B8 
                  F0 D8 80 FE FA 74 CD CF 6D FC 1E 33 8E 86 8B 86 
                  81 FF D1 2E 94 06 1F 5E 1F 90 36 3D 3E 3E 3E 3E 
                  3E 3E 43 44 46 46 47 47 49 4B 4B 4D 4E 51 06 06 
                  06 06 06 06 51 52 53 00 8A 32 D1 8B 50 5B 80 49 
                  02 05 3E 04 C3 49 3C 74 3C C3 16 04 EE 86 EE C3 
                  81 03 D0 2E 97 07 C3 00 55 AA FF 25 50 C6 E4 F6 
                  FA 26 04 FF 8B 95 A4 B5 C6 B3 03 D1 8A 98 26 04 
                  F8 C3 E0 E0 F8 3E 04 74 D1 58 F7 85 03 8A 98 26 
                  04 F8 C3 26 04 F8 7B 75 8B A9 FE 0B E7 01 EC 09 
                  2D D1 D1 D1 58 B0 BA 03 65 B0 BA 03 5D D1 D1 8B 
                  02 34 00 00 00 00 00 00 00 00 00 00 81 81 99 7E 
                  FF FF E7 7E FE FE 38 00 38 FE 38 00 7C FE 7C 7C 
                  10 7C 7C 7C 00 3C 18 00 FF C3 E7 FF 3C 42 66 00 
                  C3 BD 99 FF 07 7D CC 78 66 66 18 18 33 30 70 E0 
                  63 63 67 C0 5A E7 3C 99 E0 FE E0 00 0E FE 0E 00 
                  3C 18 7E 18 66 66 00 00 DB 7B 1B 00 63 6C 38 78 
                  00 00 7E 00 3C 18 3C FF 3C 18 18 00 18 18 3C 00 
                  18 FE 18 00 30 FE 30 00 00 C0 FE 00 24 FF 24 00 
                  18 7E FF 00 FF 7E 18 00 00 00 00 00 78 30 00 00 
                  6C 00 00 00 6C 6C 6C 00 7C 78 F8 00 C6 18 66 00 
                  6C 76 CC 00 60 00 00 00 30 60 30 00 30 18 30 00 
                  66 FF 66 00 30 FC 30 00 00 00 30 60 00 FC 00 00 
                  00 00 30 00 0C 30 C0 00 C6 DE E6 00 70 30 30 00 
                  CC 38 CC 00 CC 38 CC 00 3C CC 0C 00 C0 0C CC 00 
                  60 F8 CC 00 CC 18 30 00 CC 78 CC 00 CC 7C 18 00 
                  30 00 30 00 30 00 30 60 30 C0 30 00 00 00 FC 00 
                  30 0C 30 00 CC 18 00 00 C6 DE C0 00 78 CC CC 00 
                  66 7C 66 00 66 C0 66 00 6C 66 6C 00 62 78 62 00 
                  62 78 60 00 66 C0 66 00 CC FC CC 00 30 30 30 00 
                  0C 0C CC 00 66 78 66 00 60 60 66 00 EE FE C6 00 
                  E6 DE C6 00 6C C6 6C 00 66 7C 60 00 CC CC 78 00 
                  66 7C 66 00 CC 70 CC 00 B4 30 30 00 CC CC CC 00 
                  CC CC 78 00 C6 D6 EE 00 C6 38 6C 00 CC 78 30 00 
                  C6 18 66 00 60 60 60 00 60 18 06 00 18 18 18 00 
                  38 C6 00 00 00 00 00 FF 30 00 00 00 00 0C CC 00 
                  60 7C 66 00 00 CC CC 00 0C 7C CC 00 00 CC C0 00 
                  6C F0 60 00 00 CC 7C F8 60 76 66 00 00 30 30 00 
                  00 0C CC 78 60 6C 6C 00 30 30 30 00 00 FE D6 00 
                  00 CC CC 00 00 CC CC 00 00 66 7C F0 00 CC 7C 1E 
                  00 76 60 00 00 C0 0C 00 30 30 34 00 00 CC CC 00 
                  00 CC 78 00 00 D6 FE 00 00 6C 6C 00 00 CC 7C F8 
                  00 98 64 00 30 E0 30 00 18 00 18 00 30 1C 30 00 
                  DC 00 00 00 10 6C C6 00 CC CC 18 78 CC CC CC 00 
                  00 CC C0 00 C3 06 66 00 00 0C CC 00 00 0C CC 00 
                  30 0C CC 00 00 C0 78 38 C3 66 60 00 00 CC C0 00 
                  00 CC C0 00 00 30 30 00 C6 18 18 00 00 30 30 00 
                  38 C6 C6 00 30 78 FC 00 00 60 60 00 00 0C CC 00 
                  6C FE CC 00 CC 78 CC 00 CC 78 CC 00 E0 78 CC 00 
                  CC CC CC 00 E0 CC CC 00 CC CC 7C F8 18 66 3C 00 
                  00 CC CC 00 18 C0 7E 18 6C F0 E6 00 CC FC FC 30 
                  CC FA CF C7 1B 3C 18 70 00 0C CC 00 00 30 30 00 
                  1C 78 CC 00 1C CC CC 00 F8 F8 CC 00 00 EC DC 00 
                  6C 3E 7E 00 6C 38 7C 00 00 60 CC 00 00 FC C0 00 
                  00 FC 0C 00 C6 DE 66 0F C6 DB 6F 03 18 18 18 00 
                  33 CC 33 00 CC 33 CC 00 88 88 88 88 AA AA AA AA 
                  77 EE 77 EE 18 18 18 18 18 18 18 18 18 18 18 18 
                  36 36 36 36 00 00 36 36 00 18 18 18 36 06 36 36 
                  36 36 36 36 00 06 36 36 36 06 00 00 36 36 00 00 
                  18 18 00 00 00 00 18 18 18 18 00 00 18 18 00 00 
                  00 00 18 18 18 18 18 18 00 00 00 00 18 18 18 18 
                  18 18 18 18 36 36 36 36 36 30 00 00 00 30 36 36 
                  36 00 00 00 00 00 36 36 36 30 36 36 00 00 00 00 
                  36 00 36 36 18 00 00 00 36 36 00 00 00 00 18 18 
                  00 00 36 36 36 36 00 00 18 18 00 00 00 18 18 18 
                  00 00 36 36 36 36 36 36 18 18 18 18 18 18 00 00 
                  00 00 18 18 FF FF FF FF 00 00 FF FF F0 F0 F0 F0 
                  0F 0F 0F 0F FF FF 00 00 00 DC DC 00 78 F8 F8 C0 
                  FC C0 C0 00 FE 6C 6C 00 CC 30 CC 00 00 D8 D8 00 
                  66 66 7C C0 76 18 18 00 30 CC 78 FC 6C FE 6C 00 
                  6C C6 6C 00 30 7C CC 00 00 DB 7E 00 0C DB 7E C0 
                  60 F8 60 00 CC CC CC 00 FC FC FC 00 30 30 00 00 
                  30 30 00 00 30 30 00 00 1B 18 18 18 18 18 D8 70 
                  30 FC 30 00 76 00 DC 00 6C 38 00 00 00 18 00 00 
                  00 00 00 00 0C 0C 6C 1C 6C 6C 00 00 18 60 00 00 
                  00 3C 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  81 81 BD 81 00 00 00 FF FF C3 FF 00 00 00 6C FE 
                  FE 38 00 00 00 10 7C 7C 10 00 00 00 3C E7 E7 18 
                  00 00 00 3C FF 7E 18 00 00 00 00 18 3C 00 00 00 
                  FF FF E7 C3 FF FF FF 00 00 66 42 3C 00 00 FF FF 
                  99 BD C3 FF FF 00 0E 32 CC CC 00 00 00 66 66 18 
                  18 00 00 00 33 30 30 F0 00 00 00 63 63 63 E7 C0 
                  00 00 18 3C 3C 18 00 00 00 C0 F8 F8 C0 00 00 00 
                  06 3E 3E 06 00 00 00 3C 18 18 3C 00 00 00 66 66 
                  66 66 00 00 00 DB DB 1B 1B 00 00 7C 60 6C C6 38 
                  C6 00 00 00 00 00 FE 00 00 00 3C 18 18 3C 7E 00 
                  00 3C 18 18 18 00 00 00 18 18 18 3C 00 00 00 00 
                  0C 0C 00 00 00 00 00 60 60 00 00 00 00 00 C0 C0 
                  00 00 00 00 00 6C 6C 00 00 00 00 10 38 7C FE 00 
                  00 00 FE 7C 38 10 00 00 00 00 00 00 00 00 00 00 
                  3C 3C 18 18 00 00 66 66 00 00 00 00 00 00 6C 6C 
                  6C 6C 00 00 18 C6 C0 06 C6 18 00 00 00 C6 18 66 
                  00 00 00 6C 38 DC CC 00 00 30 30 00 00 00 00 00 
                  00 18 30 30 18 00 00 00 18 0C 0C 18 00 00 00 00 
                  3C 3C 00 00 00 00 00 18 18 00 00 00 00 00 00 00 
                  18 30 00 00 00 00 00 00 00 00 00 00 00 00 18 00 
                  00 00 06 18 60 80 00 00 00 C6 DE E6 C6 00 00 00 
                  38 18 18 18 00 00 00 C6 0C 30 C6 00 00 00 C6 06 
                  06 C6 00 00 00 1C 6C FE 0C 00 00 00 C0 C0 06 C6 
                  00 00 00 60 C0 C6 C6 00 00 00 C6 0C 30 30 00 00 
                  00 C6 C6 C6 C6 00 00 00 C6 C6 06 0C 00 00 00 18 
                  00 00 18 00 00 00 18 00 00 18 00 00 00 0C 30 30 
                  0C 00 00 00 00 7E 00 00 00 00 00 30 0C 0C 30 00 
                  00 00 C6 0C 18 18 00 00 00 C6 DE DE C0 00 00 00 
                  38 C6 FE C6 00 00 00 66 66 66 66 00 00 00 66 C0 
                  C0 66 00 00 00 6C 66 66 6C 00 00 00 66 68 68 66 
                  00 00 00 66 68 68 60 00 00 00 66 C0 DE 66 00 00 
                  00 C6 C6 C6 C6 00 00 00 18 18 18 18 00 00 00 0C 
                  0C 0C CC 00 00 00 66 6C 6C 66 00 00 00 60 60 60 
                  66 00 00 00 EE FE C6 C6 00 00 00 E6 FE CE C6 00 
                  00 00 6C C6 C6 6C 00 00 00 66 66 60 60 00 00 00 
                  C6 C6 D6 7C 0E 00 00 66 66 6C 66 00 00 00 C6 60 
                  0C C6 00 00 00 7E 18 18 18 00 00 00 C6 C6 C6 C6 
                  00 00 00 C6 C6 C6 38 00 00 00 C6 C6 D6 7C 00 00 
                  00 C6 38 38 C6 00 00 00 66 66 18 18 00 00 00 C6 
                  18 60 C6 00 00 00 30 30 30 30 00 00 00 C0 70 1C 
                  06 00 00 00 0C 0C 0C 0C 00 00 38 C6 00 00 00 00 
                  00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 
                  00 78 7C CC 00 00 00 60 78 66 66 00 00 00 00 7C 
                  C0 C6 00 00 00 0C 3C CC CC 00 00 00 00 7C FE C6 
                  00 00 00 6C 60 60 60 00 00 00 00 76 CC 7C CC 00 
                  00 60 6C 66 66 00 00 00 18 38 18 18 00 00 00 06 
                  0E 06 06 66 00 00 60 66 78 66 00 00 00 18 18 18 
                  18 00 00 00 00 EC D6 D6 00 00 00 00 DC 66 66 00 
                  00 00 00 7C C6 C6 00 00 00 00 DC 66 7C 60 00 00 
                  00 76 CC 7C 0C 00 00 00 DC 66 60 00 00 00 00 7C 
                  70 C6 00 00 00 30 FC 30 36 00 00 00 00 CC CC CC 
                  00 00 00 00 66 66 3C 00 00 00 00 C6 D6 FE 00 00 
                  00 00 C6 38 6C 00 00 00 00 C6 C6 7E 0C 00 00 00 
                  FE 18 66 00 00 00 18 18 18 18 00 00 00 18 18 18 
                  18 00 00 00 18 18 18 18 00 00 00 DC 00 00 00 00 
                  00 00 00 38 C6 FE 00 00 00 66 C0 C2 3C 06 00 00 
                  CC CC CC CC 00 00 0C 30 7C FE C6 00 00 10 6C 78 
                  7C CC 00 00 00 CC 78 7C CC 00 00 60 18 78 7C CC 
                  00 00 38 38 78 7C CC 00 00 00 00 66 66 0C 3C 00 
                  10 6C 7C FE C6 00 00 00 CC 7C FE C6 00 00 60 18 
                  7C FE C6 00 00 00 66 38 18 18 00 00 18 66 38 18 
                  18 00 00 60 18 38 18 18 00 00 C6 10 6C C6 C6 00 
                  00 6C 00 6C C6 C6 00 00 30 00 66 7C 66 00 00 00 
                  00 76 7E D8 00 00 00 6C CC CC CC 00 00 10 6C 7C 
                  C6 C6 00 00 00 C6 7C C6 C6 00 00 60 18 7C C6 C6 
                  00 00 30 CC CC CC CC 00 00 60 18 CC CC CC 00 00 
                  00 C6 C6 C6 7E 0C 00 C6 38 C6 C6 6C 00 00 C6 00 
                  C6 C6 C6 00 00 18 3C 60 66 18 00 00 38 64 F0 60 
                  E6 00 00 00 66 18 18 18 00 00 F8 CC C4 DE CC 00 
                  00 0E 18 18 18 18 D8 00 18 60 78 7C CC 00 00 0C 
                  30 38 18 18 00 00 18 60 7C C6 C6 00 00 18 60 CC 
                  CC CC 00 00 00 DC DC 66 66 00 00 DC C6 F6 DE C6 
                  00 00 3C 6C 00 00 00 00 00 38 6C 00 00 00 00 00 
                  00 30 30 60 C6 00 00 00 00 00 C0 C0 00 00 00 00 
                  00 06 06 00 00 C0 C6 D8 60 86 18 00 C0 C6 D8 66 
                  9E 06 00 00 18 18 3C 3C 00 00 00 00 6C 6C 00 00 
                  00 00 00 6C 6C 00 00 00 44 44 44 44 44 44 44 AA 
                  AA AA AA AA AA AA 77 77 77 77 77 77 77 18 18 18 
                  18 18 18 18 18 18 18 F8 18 18 18 18 18 F8 F8 18 
                  18 18 36 36 36 F6 36 36 36 00 00 00 FE 36 36 36 
                  00 00 F8 F8 18 18 18 36 36 F6 F6 36 36 36 36 36 
                  36 36 36 36 36 00 00 FE F6 36 36 36 36 36 F6 FE 
                  00 00 00 36 36 36 FE 00 00 00 18 18 F8 F8 00 00 
                  00 00 00 00 F8 18 18 18 18 18 18 1F 00 00 00 18 
                  18 18 FF 00 00 00 00 00 00 FF 18 18 18 18 18 18 
                  1F 18 18 18 00 00 00 FF 00 00 00 18 18 18 FF 18 
                  18 18 18 18 1F 1F 18 18 18 36 36 36 37 36 36 36 
                  36 36 37 3F 00 00 00 00 00 3F 37 36 36 36 36 36 
                  F7 FF 00 00 00 00 00 FF F7 36 36 36 36 36 37 37 
                  36 36 36 00 00 FF FF 00 00 00 36 36 F7 F7 36 36 
                  36 18 18 FF FF 00 00 00 36 36 36 FF 00 00 00 00 
                  00 FF FF 18 18 18 00 00 00 FF 36 36 36 36 36 36 
                  3F 00 00 00 18 18 1F 1F 00 00 00 00 00 1F 1F 18 
                  18 18 00 00 00 3F 36 36 36 36 36 36 FF 36 36 36 
                  18 18 FF FF 18 18 18 18 18 18 F8 00 00 00 00 00 
                  00 1F 18 18 18 FF FF FF FF FF FF FF 00 00 00 FF 
                  FF FF FF F0 F0 F0 F0 F0 F0 F0 0F 0F 0F 0F 0F 0F 
                  0F FF FF FF 00 00 00 00 00 00 76 D8 DC 00 00 00 
                  00 C6 C6 FC C0 00 00 C6 C0 C0 C0 00 00 00 00 6C 
                  6C 6C 00 00 00 C6 30 30 C6 00 00 00 00 7E D8 D8 
                  00 00 00 00 66 66 60 C0 00 00 00 DC 18 18 00 00 
                  00 18 66 66 18 00 00 00 6C C6 C6 6C 00 00 00 6C 
                  C6 6C 6C 00 00 00 30 0C 66 66 00 00 00 00 7E DB 
                  00 00 00 00 06 DB F3 60 00 00 00 30 60 60 30 00 
                  00 00 7C C6 C6 C6 00 00 00 FE 00 00 FE 00 00 00 
                  18 7E 18 00 00 00 00 18 06 18 00 00 00 00 18 60 
                  18 00 00 00 00 1B 18 18 18 18 18 18 18 18 18 D8 
                  00 00 00 18 00 00 18 00 00 00 00 DC 76 00 00 00 
                  38 6C 00 00 00 00 00 00 00 00 18 00 00 00 00 00 
                  00 18 00 00 00 0F 0C 0C EC 3C 00 00 D8 6C 6C 00 
                  00 00 00 70 30 C8 00 00 00 00 00 00 7C 7C 7C 00 
                  00 00 00 00 00 00 00 00 00 00 24 FF 24 00 00 22 
                  63 63 00 00 00 00 00 00 00 18 FF 18 00 00 2D 00 
                  00 00 00 00 00 00 00 C3 FF C3 C3 C3 00 54 00 DB 
                  18 18 18 00 00 00 C3 C3 C3 66 18 00 57 00 C3 C3 
                  DB 66 00 00 00 C3 66 18 66 C3 00 59 00 C3 66 18 
                  18 00 00 00 FF 86 18 61 FF 00 6D 00 00 E6 DB DB 
                  00 00 00 00 00 C3 66 18 00 77 00 00 C3 DB FF 00 
                  00 00 00 6E 1B D8 77 00 9B 18 7E C0 C3 18 00 00 
                  00 C3 3C FF FF 18 00 9E FC 66 62 6F 66 00 00 00 
                  18 18 18 18 FF 00 F6 00 18 00 00 18 00 00 00 00 
                  00 00 00 00 00 00 00 7E A5 81 99 81 00 00 00 7E 
                  DB FF E7 FF 00 00 00 00 6C FE FE 38 00 00 00 00 
                  10 7C 7C 10 00 00 00 00 3C E7 E7 18 00 00 00 00 
                  3C FF 7E 18 00 00 00 00 00 18 3C 00 00 00 FF FF 
                  FF E7 C3 FF FF FF 00 00 00 66 42 3C 00 00 FF FF 
                  FF 99 BD C3 FF FF 00 1E 1A 78 CC CC 00 00 00 3C 
                  66 66 18 18 00 00 00 3F 3F 30 30 F0 00 00 00 7F 
                  7F 63 63 E7 C0 00 00 00 18 3C 3C 18 00 00 00 C0 
                  F0 FE F0 C0 00 00 00 06 1E FE 1E 06 00 00 00 18 
                  7E 18 7E 18 00 00 00 66 66 66 66 66 00 00 00 7F 
                  DB 7B 1B 1B 00 00 00 C6 38 C6 6C 0C 7C 00 00 00 
                  00 00 FE FE 00 00 00 18 7E 18 7E 18 00 00 00 18 
                  7E 18 18 18 00 00 00 18 18 18 18 3C 00 00 00 00 
                  00 0C 0C 00 00 00 00 00 00 60 60 00 00 00 00 00 
                  00 C0 C0 00 00 00 00 00 00 6C 6C 00 00 00 00 00 
                  10 38 7C FE 00 00 00 00 FE 7C 38 10 00 00 00 00 
                  00 00 00 00 00 00 00 18 3C 18 18 18 00 00 00 66 
                  24 00 00 00 00 00 00 00 6C 6C 6C 6C 00 00 18 7C 
                  C2 7C 06 C6 18 00 00 00 C2 0C 30 C6 00 00 00 38 
                  6C 76 CC CC 00 00 00 30 60 00 00 00 00 00 00 0C 
                  30 30 30 18 00 00 00 30 0C 0C 0C 18 00 00 00 00 
                  00 3C 3C 00 00 00 00 00 00 18 18 00 00 00 00 00 
                  00 00 00 18 30 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 18 00 00 00 00 02 0C 30 C0 00 00 00 38 
                  C6 D6 C6 6C 00 00 00 18 78 18 18 18 00 00 00 7C 
                  06 18 60 C6 00 00 00 7C 06 3C 06 C6 00 00 00 0C 
                  3C CC 0C 0C 00 00 00 FE C0 FC 06 C6 00 00 00 38 
                  C0 FC C6 C6 00 00 00 FE 06 0C 30 30 00 00 00 7C 
                  C6 7C C6 C6 00 00 00 7C C6 7E 06 0C 00 00 00 00 
                  18 00 00 18 00 00 00 00 18 00 00 18 00 00 00 00 
                  0C 30 30 0C 00 00 00 00 00 00 7E 00 00 00 00 00 
                  30 0C 0C 30 00 00 00 7C C6 18 18 18 00 00 00 00 
                  C6 DE DE C0 00 00 00 10 6C C6 C6 C6 00 00 00 FC 
                  66 7C 66 66 00 00 00 3C C2 C0 C0 66 00 00 00 F8 
                  66 66 66 6C 00 00 00 FE 62 78 60 66 00 00 00 FE 
                  62 78 60 60 00 00 00 3C C2 C0 C6 66 00 00 00 C6 
                  C6 FE C6 C6 00 00 00 3C 18 18 18 18 00 00 00 1E 
                  0C 0C CC CC 00 00 00 E6 66 78 6C 66 00 00 00 F0 
                  60 60 60 66 00 00 00 C6 FE D6 C6 C6 00 00 00 C6 
                  F6 DE C6 C6 00 00 00 7C C6 C6 C6 C6 00 00 00 FC 
                  66 7C 60 60 00 00 00 7C C6 C6 C6 DE 0C 00 00 FC 
                  66 7C 66 66 00 00 00 7C C6 38 06 C6 00 00 00 7E 
                  5A 18 18 18 00 00 00 C6 C6 C6 C6 C6 00 00 00 C6 
                  C6 C6 C6 38 00 00 00 C6 C6 D6 D6 EE 00 00 00 C6 
                  6C 38 7C C6 00 00 00 66 66 3C 18 18 00 00 00 FE 
                  86 18 60 C6 00 00 00 3C 30 30 30 30 00 00 00 00 
                  C0 70 1C 06 00 00 00 3C 0C 0C 0C 0C 00 00 10 6C 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 18 
                  00 00 00 00 00 00 00 00 00 0C CC CC 00 00 00 E0 
                  60 6C 66 66 00 00 00 00 00 C6 C0 C6 00 00 00 1C 
                  0C 6C CC CC 00 00 00 00 00 C6 C0 C6 00 00 00 38 
                  64 F0 60 60 00 00 00 00 00 CC CC CC 0C 78 00 E0 
                  60 76 66 66 00 00 00 18 00 18 18 18 00 00 00 06 
                  00 06 06 06 66 3C 00 E0 60 6C 78 66 00 00 00 38 
                  18 18 18 18 00 00 00 00 00 FE D6 D6 00 00 00 00 
                  00 66 66 66 00 00 00 00 00 C6 C6 C6 00 00 00 00 
                  00 66 66 66 60 F0 00 00 00 CC CC CC 0C 1E 00 00 
                  00 76 60 60 00 00 00 00 00 C6 38 C6 00 00 00 10 
                  30 30 30 36 00 00 00 00 00 CC CC CC 00 00 00 00 
                  00 66 66 3C 00 00 00 00 00 C6 D6 FE 00 00 00 00 
                  00 6C 38 6C 00 00 00 00 00 C6 C6 C6 06 F8 00 00 
                  00 CC 30 C6 00 00 00 0E 18 70 18 18 00 00 00 18 
                  18 00 18 18 00 00 00 70 18 0E 18 18 00 00 00 76 
                  00 00 00 00 00 00 00 00 10 6C C6 FE 00 00 00 3C 
                  C2 C0 C2 3C 06 00 00 CC 00 CC CC CC 00 00 00 18 
                  00 C6 C0 C6 00 00 00 38 00 0C CC CC 00 00 00 CC 
                  00 0C CC CC 00 00 00 30 00 0C CC CC 00 00 00 6C 
                  00 0C CC CC 00 00 00 00 3C 60 66 0C 3C 00 00 38 
                  00 C6 C0 C6 00 00 00 C6 00 C6 C0 C6 00 00 00 30 
                  00 C6 C0 C6 00 00 00 66 00 18 18 18 00 00 00 3C 
                  00 18 18 18 00 00 00 30 00 18 18 18 00 00 00 00 
                  38 C6 FE C6 00 00 38 38 38 C6 FE C6 00 00 18 60 
                  FE 60 60 66 00 00 00 00 00 76 7E D8 00 00 00 3E 
                  CC FE CC CC 00 00 00 38 00 C6 C6 C6 00 00 00 C6 
                  00 C6 C6 C6 00 00 00 30 00 C6 C6 C6 00 00 00 78 
                  00 CC CC CC 00 00 00 30 00 CC CC CC 00 00 00 C6 
                  00 C6 C6 C6 06 78 00 00 C6 C6 C6 C6 00 00 00 00 
                  C6 C6 C6 C6 00 00 00 18 66 60 66 18 00 00 00 6C 
                  60 60 60 E6 00 00 00 66 3C 7E 7E 18 00 00 00 CC 
                  F8 CC CC CC 00 00 00 1B 18 7E 18 18 D8 00 00 30 
                  00 0C CC CC 00 00 00 18 00 18 18 18 00 00 00 30 
                  00 C6 C6 C6 00 00 00 30 00 CC CC CC 00 00 00 76 
                  00 66 66 66 00 00 76 00 E6 FE CE C6 00 00 00 6C 
                  3E 7E 00 00 00 00 00 6C 38 7C 00 00 00 00 00 30 
                  00 30 C0 C6 00 00 00 00 00 FE C0 C0 00 00 00 00 
                  00 FE 06 06 00 00 00 C0 C6 18 60 86 18 00 00 C0 
                  C6 18 66 9E 06 00 00 18 00 18 3C 3C 00 00 00 00 
                  00 6C 6C 00 00 00 00 00 00 6C 6C 00 00 00 11 11 
                  11 11 11 11 11 11 55 55 55 55 55 55 55 55 DD DD 
                  DD DD DD DD DD DD 18 18 18 18 18 18 18 18 18 18 
                  18 18 18 18 18 18 18 18 18 18 18 18 18 18 36 36 
                  36 36 36 36 36 36 00 00 00 00 36 36 36 36 00 00 
                  00 18 18 18 18 18 36 36 36 06 36 36 36 36 36 36 
                  36 36 36 36 36 36 00 00 00 06 36 36 36 36 36 36 
                  36 06 00 00 00 00 36 36 36 36 00 00 00 00 18 18 
                  18 18 00 00 00 00 00 00 00 00 18 18 18 18 18 18 
                  18 18 00 00 00 00 18 18 18 18 00 00 00 00 00 00 
                  00 00 18 18 18 18 18 18 18 18 18 18 18 18 00 00 
                  00 00 00 00 00 00 18 18 18 18 18 18 18 18 18 18 
                  18 18 18 18 18 18 36 36 36 36 36 36 36 36 36 36 
                  36 30 00 00 00 00 00 00 00 30 36 36 36 36 36 36 
                  36 00 00 00 00 00 00 00 00 00 36 36 36 36 36 36 
                  36 30 36 36 36 36 00 00 00 00 00 00 00 00 36 36 
                  36 00 36 36 36 36 18 18 18 00 00 00 00 00 36 36 
                  36 36 00 00 00 00 00 00 00 00 18 18 18 18 00 00 
                  00 00 36 36 36 36 36 36 36 36 00 00 00 00 18 18 
                  18 18 00 00 00 00 00 00 00 18 18 18 18 18 00 00 
                  00 00 36 36 36 36 36 36 36 36 36 36 36 36 18 18 
                  18 18 18 18 18 18 18 18 18 18 00 00 00 00 00 00 
                  00 00 18 18 18 18 FF FF FF FF FF FF FF FF 00 00 
                  00 00 FF FF FF FF F0 F0 F0 F0 F0 F0 F0 F0 0F 0F 
                  0F 0F 0F 0F 0F 0F FF FF FF FF 00 00 00 00 00 00 
                  00 DC D8 DC 00 00 00 78 CC D8 C6 C6 00 00 00 FE 
                  C6 C0 C0 C0 00 00 00 00 FE 6C 6C 6C 00 00 00 00 
                  C6 30 30 C6 00 00 00 00 00 D8 D8 D8 00 00 00 00 
                  66 66 66 60 C0 00 00 00 76 18 18 18 00 00 00 00 
                  18 66 66 18 00 00 00 00 6C C6 C6 6C 00 00 00 38 
                  C6 C6 6C 6C 00 00 00 1E 18 3E 66 66 00 00 00 00 
                  00 DB DB 00 00 00 00 00 06 DB F3 60 00 00 00 1C 
                  60 7C 60 30 00 00 00 00 C6 C6 C6 C6 00 00 00 00 
                  FE 00 00 FE 00 00 00 00 18 7E 18 00 00 00 00 00 
                  18 06 18 00 00 00 00 00 18 60 18 00 00 00 00 0E 
                  1B 18 18 18 18 18 18 18 18 18 D8 D8 00 00 00 00 
                  18 00 00 18 00 00 00 00 00 DC 76 00 00 00 00 6C 
                  38 00 00 00 00 00 00 00 00 00 18 00 00 00 00 00 
                  00 00 18 00 00 00 00 0C 0C 0C 6C 3C 00 00 00 6C 
                  6C 6C 00 00 00 00 00 D8 60 F8 00 00 00 00 00 00 
                  7C 7C 7C 7C 00 00 00 00 00 00 00 00 00 00 1D 00 
                  00 24 FF 24 00 00 00 00 3C C3 DB C3 66 00 00 4D 
                  00 E7 FF C3 C3 C3 00 00 00 FF 99 18 18 18 00 00 
                  56 00 C3 C3 C3 66 18 00 00 00 C3 C3 C3 DB 66 00 
                  00 58 00 C3 3C 18 66 C3 00 00 00 C3 C3 3C 18 18 
                  00 00 5A 00 C3 0C 30 C1 FF 00 00 00 00 00 FF DB 
                  DB 00 00 76 00 00 C3 C3 66 18 00 00 00 00 00 C3 
                  DB FF 00 00 78 00 00 C3 3C 3C C3 00 00 00 00 00 
                  3B 7E DC 00 00 9B 18 7E C0 C0 7E 18 00 00 00 C3 
                  3C FF FF 18 00 00 9E FC 66 62 6F 66 F3 00 00 00 
                  C0 C6 18 60 9B 0C 00 AC C0 C2 CC 30 CE 3E 06 00 
                  00 00 00 00 00 00 00 00 16 04 C2 80 60 27 80 60 
                  21 E8 FF C0 C3 FF 8A 23 F0 8A E8 D3 C7 03 E8 D3 
                  ED 06 53 04 E8 00 74 8B 32 3C 72 3C 75 FE 03 26 
                  3D 07 E8 FF 20 D3 EB E8 D3 BA 03 C3 DA FB F8 E5 
                  A2 74 33 B9 80 00 F6 49 F8 06 00 B9 40 E8 00 20 
                  75 BA B0 EF 06 04 75 83 4C 00 32 C7 06 8E 50 15 
                  8A 32 58 D2 0B 52 09 E6 BD 5A 51 33 F3 59 C6 FE 
                  7F E8 D2 07 00 00 00 00 26 04 E4 80 09 03 FC C3 
                  49 BA 03 07 1A 0B 16 0F 12 53 86 72 2E 7F 00 58 
                  02 D4 A0 04 FC 12 07 0E 53 68 72 2E 47 04 58 C4 
                  A8 26 39 C3 DF 53 10 E8 FF 75 33 C3 06 04 75 50 
                  BA 03 0C EC A8 5A C3 DB BE 57 3A 74 2E 38 74 83 
                  02 F0 2E 18 FB 5E 50 0E E3 D8 C3 57 C3 49 3C 72 
                  9C C9 E8 FF C3 2E 47 02 0A 0B 51 F6 80 18 0F 47 
                  F6 80 0E F6 03 74 F6 80 02 01 C3 E8 FF 00 19 8A 
                  03 E4 74 B0 80 01 09 08 FC 74 B0 0A 5B 33 E8 FF 
                  19 06 14 0C 0D 13 0A E8 FF 75 EB 46 46 D1 C3 51 
                  E8 FE C2 59 C3 E8 D1 A0 04 B0 E8 D0 00 50 09 E8 
                  D1 0B E8 D1 5F 80 49 03 03 70 CD B8 A0 C0 C6 00 
                  55 09 E8 D1 C6 00 AA 09 E8 D1 80 00 AA 05 0B EB 
                  BB 40 0B E8 D1 8E 58 E4 10 E8 D0 C3 00 00 00 00 
                  27 F6 89 06 03 86 9C BA 03 8B B2 8A E8 D0 C7 7F 
                  8A E8 D0 C3 FF FA C7 E8 D0 C9 6D 8A E8 D0 F8 63 
                  8A FB E3 8B 8B 26 25 26 3D 26 1D E8 FF E2 C3 14 
                  8B 8B E8 FF C4 8A AA C3 46 EF 32 A8 74 B2 A8 74 
                  80 15 50 E8 FF 58 E3 DF 08 50 53 C4 3F BA 26 E2 
                  C8 DA 50 C4 3F BA 4B E2 C8 DA 25 00 14 F7 03 13 
                  D1 D1 80 80 D3 59 8A 8A C3 AC E0 AC F8 AC D8 2E 
                  24 FC DC C5 22 46 C5 C9 ED 32 2E 04 7A 8A D0 D0 
                  E8 FF FA E8 E8 68 8A 8A E8 FE FE FE 75 C3 DB FF 
                  8A 23 79 FE 80 10 F0 8A 34 11 69 BA 03 FF 61 E8 
                  FD 19 3E 04 77 E8 D0 FB 75 BE 76 3E 04 75 BE 77 
                  10 06 04 74 32 03 E8 FF 03 7E BE 77 10 E8 FF BE 
                  77 20 FC 09 08 45 32 0B E8 FE EE E8 FE FE 75 83 
                  10 CD E2 C3 B5 75 BE 77 40 3E BE 76 06 04 74 83 
                  40 40 E9 FF 00 00 00 00 C4 B8 04 CF B8 07 C9 B2 
                  B8 00 C1 B8 04 BB B8 02 B5 E8 FB C0 A5 50 C4 B8 
                  03 A3 B8 03 9D B3 E8 FC 02 0A CE 05 E8 CE E3 06 
                  85 B8 00 7F 58 E4 03 94 C3 8A 43 FF 06 06 04 F2 
                  FF 88 85 FE E8 FC 07 E7 14 53 B3 B0 E8 CE FF 7C 
                  FE 8A B0 E8 CE 26 04 CC C8 33 88 61 E8 CF 8B 99 
                  36 04 C8 84 FE F7 85 5A FB 75 D1 48 E0 12 09 A0 
                  04 C0 26 04 E0 C4 4C C3 00 BD 08 41 72 2E 47 8A 
                  24 80 80 02 2E 0E 10 3C 74 75 E8 CE FB 74 B6 BD 
                  10 FB 75 80 49 07 0A 05 10 3D 80 80 DA 07 00 33 
                  C3 51 EB E5 D0 F6 04 02 C5 F5 05 E2 FA 06 BA A0 
                  C2 F5 E3 E8 00 C3 74 AC C0 12 32 B1 D3 03 8A 32 
                  F3 5F E9 06 53 D2 DA 08 E8 FB 5F 74 1F 30 49 1F 
                  54 06 56 02 22 00 BF 00 00 1F 83 1F FA 30 BE 16 
                  08 A4 C6 83 1F F7 C3 51 8A 32 F3 5F C7 59 F1 C3 
                  55 52 53 8A 25 80 13 03 C6 3C 74 E9 00 FF 76 58 
                  32 59 AD 80 19 16 C7 EF CE E8 CC 5F 53 5B 7F E9 
                  00 FF 73 80 09 09 C3 C4 04 EB 80 03 29 E0 BA 03 
                  A1 A8 B4 75 B4 50 0C 57 F6 40 75 FE B0 BA 03 87 
                  EB 80 02 0A 10 58 5F 7F 42 FF 75 E8 FA 9E 06 04 
                  74 E9 FF 73 EB 0A 74 E9 FF 6A 75 EB E8 04 7B E8 
                  02 59 80 7E 02 EF 51 75 58 59 5F 07 2E 3E 78 54 
                  0A 52 E8 B0 EE 58 06 01 08 0E 01 26 04 08 87 F6 
                  89 01 03 7F 50 0C B9 F6 40 75 50 0F AD F6 40 74 
                  E8 F9 08 0D E8 03 A3 06 04 40 26 04 E8 F9 16 16 
                  04 07 0E 04 EB E8 04 24 09 14 16 04 07 0E 04 EB 
                  E8 04 0E 0B 26 04 08 88 E8 04 06 04 03 1E 04 E3 
                  80 30 38 38 26 04 E4 F6 89 01 2C 2A 3B 63 74 80 
                  B4 09 FC 74 32 EB 80 30 04 07 6D 66 75 E8 04 63 
                  4F 06 01 08 0E 01 26 04 80 30 14 06 04 75 B0 E8 
                  02 0E 04 E9 FE 06 04 F6 87 02 05 0E 04 F6 87 02 
                  DD 06 04 03 B8 75 32 EB C7 63 B4 E8 F8 07 07 26 
                  04 E8 F8 0B 49 E8 04 2F EB A2 04 FD E8 01 98 B7 
                  E8 01 E8 F8 06 04 75 E8 FB 8A E8 01 B6 BB 00 AA 
                  74 BB 00 29 74 F6 89 08 46 8B 04 2B 8B 06 57 C4 
                  08 8A E8 CB 65 E8 F7 C3 E2 26 3D 11 01 E8 F7 84 
                  5F 26 4D E3 06 26 5D 26 7D E8 F9 07 1F 8A 0A 74 
                  7C 8A 85 FE B0 8B 63 E8 CA 50 E9 FD 7E 0D 4F 74 
                  E8 F8 FF 0C BE 57 C6 2E 04 C0 12 3B 04 F0 3B 06 
                  EA 3B 08 E4 7E C0 02 F8 E8 F7 03 95 E8 FB F1 E8 
                  FC 08 E8 F7 34 0B E8 FB 2C 8A 26 5D 26 4D 26 55 
                  57 53 C4 06 17 5B 54 07 26 45 3C 74 FE A2 04 06 
                  E8 F7 41 07 E8 FB 39 8A 3A 85 75 26 5D 80 7F B9 
                  01 D2 C4 03 D7 5B FB E7 E7 C7 74 80 20 E7 B3 BA 
                  03 03 06 32 E8 FA 4E 06 04 00 10 80 85 0E 08 10 
                  7C B8 1F A3 01 0E 01 BB 00 2A 74 BB 00 B5 74 26 
                  05 C8 84 26 45 A2 04 C4 03 89 0C 8C 0E FB 80 20 
                  DF C4 B0 E9 C9 C0 4E A2 04 0F 88 50 4B F9 8A A2 
                  04 8B 03 4C 26 45 A2 04 8A 02 85 26 45 86 A3 04 
                  1E 04 FB 77 32 2E 87 75 65 B0 80 06 02 3F 66 C3 
                  49 C7 63 D4 8A 32 80 07 0C FB E3 DF C3 68 08 06 
                  04 BB 68 8B 0E E8 FF 16 04 C0 FA 75 FE 80 04 5F 
                  80 04 3E 00 1E 04 FB 7E 83 10 FB 7E 83 10 FB 7C 
                  83 10 C0 8A E8 C8 FE A8 74 83 4C 00 0C E8 F5 C2 
                  33 FC AB C2 A0 04 11 80 B8 08 C2 66 E8 C8 B8 06 
                  B4 80 87 F7 0C E8 01 0D E8 01 49 B4 CD C3 3E 04 
                  75 B8 11 07 10 60 EB B8 11 07 10 FD BF 5A 2D B8 
                  41 12 B8 08 0C B8 23 06 C7 74 85 8C 76 B8 06 B4 
                  80 87 08 49 E9 FE 07 66 32 32 26 79 E8 F4 C3 FB 
                  75 26 7D B3 E8 F4 96 8B 63 80 06 C0 65 32 E8 F5 
                  02 C3 0B 1F 80 C0 04 EC EC E1 8A 75 B1 E8 F5 15 
                  49 3C 7C FE 3C 7E FE 3C 7E FE C3 1E 04 3E 04 E3 
                  80 05 05 FB 7C 32 C3 26 04 80 89 7F FB 77 74 80 
                  89 80 0E 04 80 87 02 0B 13 08 C7 75 B3 80 10 20 
                  26 04 80 88 F0 1E 04 16 04 CB C3 BE 76 40 3C 74 
                  E8 F7 06 04 74 B8 10 DB 40 CD 58 53 8A BB 57 D7 
                  C4 77 2E 8B 58 E8 C6 E7 DC 0A 5B D7 00 00 00 00 
                  52 0E 04 87 A8 75 F6 40 0B C5 74 B5 32 EB 8A E8 
                  F4 09 C2 01 03 15 8A B0 E8 C9 E0 C0 E1 D7 86 5A 
                  C3 85 3C 75 81 0C 74 81 0D 75 C3 10 0A F9 07 04 
                  0E C3 0E 06 F9 03 71 E0 EC E1 80 1F C9 63 E9 05 
                  F9 7E 3A 75 3A 7E 8A FE 8A EB 80 02 04 CD 0D FD 
                  7E 8A 8A FE EB 8A 80 02 F1 14 E9 E8 CD C8 C9 0E 
                  1D C9 CD 17 FD 7E 8A 8A FE EB 2A 02 FE 8A FE C3 
                  53 8A B1 32 D3 8A 89 50 D1 3A 62 75 8B 8A 32 F7 
                  4A 32 03 D1 03 4E D1 8A B0 E8 C8 E3 0F F7 58 5A 
                  00 00 00 00 00 00 00 00 F3 08 EE E6 C6 04 14 0E 
                  04 00 00 00 00 00 00 00 C0 06 04 74 B4 CD C3 00 
                  53 A2 04 F8 F7 4C A3 04 06 04 75 D1 8A B0 E8 C8 
                  E3 0D 8D 5E 81 FF 8B 8B 50 E9 FF 00 00 00 00 00 
                  53 51 57 8B 83 2E DB DF 5E 8A 32 89 FC 5E 33 8A 
                  89 F8 C2 46 8A 89 F4 C1 46 8B F8 46 40 46 75 33 
                  89 FC 46 2B F4 89 EE 46 2B F2 89 F0 7E 06 05 46 
                  EB 8B F4 2E 04 46 8B F2 46 E8 F2 2A 49 2C 78 2C 
                  7E 2C 7E 2C 7E 2C 7E 2C 7E 2C 74 FE 74 E8 F2 51 
                  77 03 B9 00 02 A1 04 4E 02 B9 00 3E 04 74 BB 00 
                  03 01 89 E0 00 EB 8B 85 BB 00 C0 62 F7 4C BA 00 
                  1C 01 8B 85 BB 00 00 EB BA 00 0E 04 08 B8 00 46 
                  89 D6 4E 89 DE 17 E8 00 8B E8 00 A7 83 2E 5F 59 
                  5B C3 4A 83 DE 75 BB 00 EB 25 7E 02 0A 6E BB 00 
                  EB 15 2E 04 7E 01 06 7E 04 05 08 F7 89 EC 7E 06 
                  02 D8 46 C3 46 F7 FC 46 89 E8 B8 A0 7E 01 19 7E 
                  04 13 10 25 00 30 74 B8 B8 03 00 89 D4 46 C3 46 
                  F7 DA 46 F7 D6 46 89 D8 56 03 EA 56 89 DC 56 C3 
                  46 2B FC 46 8B FC 46 83 FC 75 8B EE 46 8B DE E6 
                  FF C7 EB 7E 3B F1 D2 3B C3 E8 C6 16 06 04 74 BA 
                  03 24 74 FA 25 D8 FB 7E 00 1E 4E D1 8E D4 46 8B 
                  D8 76 F3 E8 02 4E 7F E8 02 4E 8B D8 46 8B FA 20 
                  E0 AB FA FF E2 E6 E8 C6 07 65 BA 03 FB B8 00 6E 
                  89 E6 7E 00 38 DB 08 F7 4A F7 8B 8B 1E 46 8E D4 
                  7E 03 DC 4E F3 1F A1 04 C3 D8 AA E8 00 4E 7F E8 
                  01 DB 08 F7 4A F7 8B 1E 7E 8E D2 4E 8B FA AA 43 
                  1E 04 DE 78 E8 00 4E 7F E8 C2 09 E8 C2 83 DE 75 
                  8B E6 7E 06 05 46 EB 8B DC 00 29 DC 46 B9 00 C0 
                  46 01 D6 46 86 B0 E8 C2 1E 46 F7 E0 46 83 FC 74 
                  33 B8 00 EB F0 F8 76 03 D8 46 8E D4 4E 8B 8B F3 
                  8B 8B 8B E6 00 03 03 F3 43 04 3B 7C E8 00 4E 7F 
                  E8 00 DB 50 F7 03 DC F8 46 8B FA 4E 8B F3 8B 8B 
                  E6 00 03 8B FA AA B8 00 C3 D2 AA FF E2 C8 C3 7E 
                  00 43 05 E8 C5 02 E8 C5 DB 4E A1 04 EB F0 F8 7E 
                  03 DC 46 1E 5E F3 43 A1 04 C3 DC 68 FF E4 D2 05 
                  E8 C5 4D B8 0F 28 B8 00 1F 8B FA E0 02 18 B8 FF 
                  0F B8 0F 0C E8 00 4E 7F C3 D0 DB 4A 52 EB 03 DC 
                  F8 46 8B F0 C2 AA 3B 85 7C C3 5E 8B EA 46 19 DA 
                  BB 00 46 01 DC 03 5E 8B EC 46 73 01 D6 00 00 00 
                  51 55 06 32 E8 C3 27 8B BE 00 A4 8B 2E 97 43 D8 
                  E7 75 E8 C0 C3 5F 5A 5B 1C 3B 62 77 70 51 49 8A 
                  3C 7E 8B 4A 3C 7E D1 D1 D1 A1 04 DD 51 57 ED C8 
                  2E 97 43 3A 75 46 F2 C9 5E 58 04 F0 DE C0 D8 2B 
                  32 0B C3 43 43 43 44 43 FA 75 26 03 18 00 26 0B 
                  E9 E0 C1 C0 00 E1 E1 CC F0 F5 20 03 C7 C3 8A F6 
                  03 C3 00 D0 26 0D C1 14 47 CC F1 EF 03 C3 06 04 
                  74 E8 C3 0F DA EC 01 FB EC 01 FB 26 05 FF 85 B9 
                  00 06 04 00 30 75 BE 00 A8 8B B9 00 20 04 8F 85 
                  C3 05 E8 C3 00 E8 FF B8 00 78 58 B9 01 FE 00 00 
                  C9 01 BE 44 54 53 FE 75 32 E8 C2 E8 C2 51 E3 FF 
                  F6 E8 ED 58 F0 D8 9B 75 E8 BF C3 1F BE 44 20 E8 
                  C2 8A 2E 94 44 8B E8 C2 03 4C 8B 07 5D 59 C3 51 
                  55 06 50 92 3D 09 06 E3 80 3F C3 45 45 45 46 44 
                  43 E8 C2 32 F7 85 03 5A B5 D1 D0 FE 75 C3 E8 FF 
                  FC EC 8A 23 86 0A 79 26 03 89 C3 06 04 74 E8 C1 
                  13 DA 8B EC 01 FB EC 01 FB C1 AB 53 C0 43 79 BE 
                  00 96 25 00 E0 E0 E0 F0 49 8E B9 00 06 16 E1 33 
                  E8 FF 00 E8 FF C7 E2 47 19 00 AD DB 06 32 26 23 
                  88 26 23 C7 E2 8E 81 40 47 C3 49 8B 0A 79 B4 E8 
                  C2 15 36 8B 85 8B 4A 57 C6 00 FA F8 8A E8 C2 0E 
                  04 16 04 DD 26 05 26 05 FA F5 47 D9 E4 EE B4 E9 
                  C1 FB 8B 4A D1 D1 D1 8B 85 8E 57 B4 84 74 26 1D 
                  03 88 47 EC EF EF 03 E2 5F C7 8E C3 00 00 00 00 
                  C9 3D E8 EB 74 E9 FE 52 06 F6 D9 E8 C1 06 04 74 
                  E8 C0 13 DA 8A EC 01 FB EC 01 FB 8A AA E2 07 5A 
                  C3 00 00 00 00 00 00 00 52 0C F1 F6 40 58 07 06 
                  04 74 CD C3 53 80 64 B4 6A 66 86 0A 75 24 80 1F 
                  C7 66 8A 80 07 E7 D0 0A F6 49 FC 05 DB 43 B3 E8 
                  00 66 32 A8 74 FE F6 49 FC 25 DF E7 74 0C A2 04 
                  10 02 F8 01 15 81 01 E8 00 C3 02 07 E8 E9 5B C3 
                  39 FA 7C 8A EE C7 B0 EE E9 E9 00 00 00 00 00 00 
                  57 53 50 EC 1E 04 FB 7F 8B 81 FF D1 2E A4 47 48 
                  48 48 48 48 48 48 48 48 48 48 48 48 47 47 47 47 
                  47 47 48 FB 74 80 5F 03 C7 E9 00 4A F7 8B 0A 74 
                  8A 98 26 04 F8 D1 EA EA EA FA D1 E1 00 00 8E FA 
                  5E D0 8A 72 B8 01 E4 CE EE 86 EE FF 0B 03 4A 42 
                  E0 EB B8 FF C4 42 E0 8A C6 00 E7 E4 B0 B2 EE 86 
                  EE 1D 05 B8 FF EE 86 EE 03 BA 03 42 E0 B8 FF EE 
                  86 EE 58 5B 5F C3 01 E5 DB 04 04 04 E1 CE EE 86 
                  EE 05 C5 03 CB D0 FE 75 88 00 46 04 CA D8 A4 B8 
                  A0 D8 7E 0D 07 1D B2 EB 8A 88 00 66 E8 BB A6 8A 
                  50 EA 40 F7 8B 58 D1 3E 04 74 24 F6 81 03 03 BE 
                  75 F1 8A D0 D2 EB D1 24 F6 81 07 03 BE 75 F1 E0 
                  E9 8A 86 D1 D1 D1 5A C2 00 04 C7 20 00 8E 80 01 
                  74 8A F6 80 11 C3 05 8C 05 C5 E8 46 EB F6 22 0A 
                  EB A1 04 E0 E0 E0 E2 C1 D2 8B 8B 0B 74 B1 D3 B0 
                  E8 BA 00 00 00 00 00 00 51 06 3E 04 F5 E8 00 DF 
                  07 59 C3 0D 58 0E 0A 0D 08 44 07 47 48 D2 55 EC 
                  46 00 75 50 C8 46 74 F6 89 20 14 53 56 06 07 07 
                  5E 5B 80 89 DF 5D 36 04 03 B6 FE C3 D2 02 CA EB 
                  90 E8 E7 75 52 40 F6 87 04 17 86 75 BA 03 E0 EC 
                  01 FB A8 74 8A 26 04 FB 0E 03 E2 FE 3A 4A 75 32 
                  3A 84 75 EB 90 C6 50 C6 E4 F6 F2 26 04 F0 E6 C7 
                  F7 4C 03 53 00 A1 04 30 3D 00 03 00 8E 5B C3 FA 
                  B6 43 00 EE 42 00 03 42 00 61 00 E0 03 61 C9 FE 
                  C9 FE C4 61 58 50 52 1E 04 88 62 E8 E7 04 FF 0C 
                  06 F6 0F 26 1D 5F 01 33 8A 84 8A 4A FE CD 5B 1E 
                  04 5B C3 06 04 74 E8 B8 C4 74 1E ED 50 0F BA 03 
                  25 B8 B8 3E 04 74 B8 B0 1F EA 8E BF 20 59 90 A4 
                  CD 0E 06 00 50 00 58 CE E8 B8 C3 AD F6 10 F7 0B 
                  A5 80 02 27 C3 CE B0 EE 00 EC 00 F9 02 BA 46 0F 
                  EB BA 76 B8 C0 D8 F6 2E 00 C9 E1 F6 C0 14 C2 E2 
                  50 CE B0 EE 00 B7 58 C0 02 04 EB 24 0A EE E8 B0 
                  EE 00 00 00 00 00 00 00 26 04 87 24 0A 49 8A 62 
                  C3 00 00 00 00 00 00 00 57 06 51 0A 75 80 49 13 
                  06 38 E8 E5 59 07 5F C3 01 04 11 EA 02 02 7C 3E 
                  04 74 8B 32 57 8A E8 E5 FE 80 10 F2 11 8A E8 E5 
                  32 8B 63 80 06 33 B7 EC 08 06 F9 CF F5 CA C0 8A 
                  EE 00 8A EE 00 20 8B 47 C3 FB 7C 33 B7 EC 08 06 
                  F9 CF F5 C0 B0 EE 00 8A EE 00 20 E9 FF 03 21 E3 
                  10 CA 80 08 0E 04 0A 75 80 F7 26 04 E8 E4 46 3C 
                  75 5B A8 E9 FF 08 0B 11 9C 58 D8 30 3C 75 8B 32 
                  E8 E4 C7 FE 80 10 F3 2C 11 ED 10 0B C3 E6 D9 9F 
                  EB 3C 75 8B 53 20 2E 8B 5B D0 8B 8A E8 EE E9 3C 
                  75 3A 49 74 8B B3 E8 E4 C9 0D CF 0A 75 80 7F 78 
                  80 0F C7 75 80 03 E5 E5 FD 14 62 3C 75 8A E8 E6 
                  CB 5A 8A E9 FE 17 08 FA 8B E9 FE 18 0A C3 C6 E8 
                  B6 EF 19 0C C6 E8 B6 8A E9 FE 1A 21 14 D2 B9 0F 
                  EF 10 C8 D0 D0 0A 75 D0 D0 8B 59 50 3C 75 32 8B 
                  B7 E8 ED EB C7 FE E8 E6 C0 C7 D6 47 EE 38 00 00 
                  30 2D 0E 04 16 04 80 07 0E CF 0C 7C 75 BB 01 2F 
                  C3 DF FF E3 8B F2 0E EB 50 51 57 06 03 12 E3 03 
                  C4 E8 B6 5D 5A 5B C3 20 41 0A 2E 00 06 00 E8 25 
                  E4 DB 12 2B FB 74 B2 77 80 02 02 0E 21 03 48 89 
                  85 FE 88 84 89 0C 8C 0E EB 8A 24 74 3C 74 3C 77 
                  E8 00 F9 00 33 50 E8 E6 80 7F 0B 58 C4 74 E8 E7 
                  01 F6 EB B9 00 10 3C 7C B1 BD 08 05 10 3D 0E C3 
                  FB 75 8A 87 8A 81 60 D0 B1 D2 8A 88 B1 D2 8A 88 
                  80 0F 12 C3 FB 75 C7 14 39 8C 16 C3 FB 75 F6 87 
                  08 03 C0 F6 89 01 3A 02 F2 26 04 B4 F6 87 02 02 
                  0B C0 17 0E 04 80 09 02 08 26 04 08 88 EB 3C 74 
                  80 89 10 EA C0 0E 06 04 75 80 89 EF D6 02 A6 26 
                  04 EB 80 35 4C C0 12 06 04 75 06 B8 12 42 07 02 
                  06 04 74 3C 74 3C 75 06 52 FA CD 5A 07 34 03 1A 
                  57 8C 8B 52 01 E8 07 B0 E8 B4 E1 FE 03 47 80 31 
                  11 26 04 0A 74 80 89 08 11 80 32 12 C0 07 0E 7D 
                  EB 32 E8 B4 E6 FB 75 80 89 FD C0 D8 0E 04 EB 80 
                  34 10 26 04 0A 74 80 87 01 BC FB 75 53 B7 F6 8A 
                  E8 EB 5B A8 2E 50 AD FA 3F 32 E8 E3 FE 8B 63 80 
                  06 EB A8 E0 BA 03 24 59 E8 C0 DB 54 FB E9 74 E2 
                  0B C3 52 00 E8 07 FA 3E 01 3E 01 06 01 06 01 06 
                  0E 01 06 D5 FB C3 26 04 B8 09 20 D4 F6 89 01 09 
                  06 04 74 75 80 87 FD 06 04 75 F6 89 04 0D 0E 04 
                  B8 0B 30 B4 08 10 89 63 80 88 F0 26 04 3E 04 1E 
                  04 26 04 80 89 FE 00 10 C7 75 F6 08 2C 07 80 10 
                  30 C3 74 B8 05 36 04 80 88 F0 26 04 0E 04 B4 CD 
                  80 87 FB 3E 04 06 BB 00 06 04 74 B3 F6 89 01 14 
                  02 18 75 B7 EB F6 89 01 02 01 01 E8 00 07 50 52 
                  B8 C6 D8 D4 8B B4 86 E8 B2 27 28 5A 58 00 00 00 
                  FC 61 C9 5D 53 52 8A 26 46 45 0D 28 13 0A 13 08 
                  16 07 1A E8 F8 EB 32 EB 51 28 59 1E D2 1A CA 16 
                  C4 74 26 5E 45 B4 E8 F3 51 82 59 B7 C4 74 E8 EC 
                  5A 5B C3 00 00 00 00 00 57 A8 75 53 10 E8 E0 C4 
                  02 8A 32 8A 8B D1 5B FF 97 B0 EB A3 DA B0 B4 07 
                  59 A0 04 C1 11 E4 E0 F0 8B 04 FB 75 EB B3 B7 EB 
                  A0 04 30 30 08 C3 74 EB 90 C3 74 86 C3 33 26 5C 
                  74 86 26 5C 74 86 83 02 E2 B8 00 8A 5B 00 00 00 
                  DB 04 00 C3 52 56 FC 68 26 05 8C 02 C7 B9 00 C0 
                  AA EF B9 00 49 F3 BE 04 03 F3 26 45 B8 1A 31 26 
                  1D C7 33 8A 49 D1 81 94 2E 07 89 83 02 80 02 49 
                  2E 07 88 47 45 26 1D B0 BA 03 5E 8A D0 D0 8A 0A 
                  24 26 05 8A D0 0A 24 26 05 8A 89 80 0F 3E 04 E7 
                  80 01 04 E7 FB 9D BA 03 10 20 24 D0 D0 0A 26 05 
                  E8 DE C7 B1 B0 22 87 D2 26 05 33 06 BE 53 06 2E 
                  5C 32 2E 14 04 0A 03 C6 E2 8C 8C 3B 74 80 20 07 
                  88 B0 8A EB CB 06 BF 04 BF 08 BF 0C CB 0A CB 02 
                  59 5F 5B 00 00 00 00 00 52 56 8B 83 0A 4E 8C FC 
                  5E FC 03 08 28 53 53 54 E1 00 C9 18 E4 D8 E3 4A 
                  53 FF 58 C0 06 78 8B FA 1C 1C 4E 83 0A 5E 5A C3 
                  76 4E E6 C6 53 8B D1 D1 0A 74 FE 8A C3 00 00 00 
                  03 03 03 03 ED 8B FE E3 E3 00 FF 81 02 2E 30 FF 
                  8B FE E7 B9 00 8B FA FB C2 00 09 52 2E 14 5A D1 
                  83 02 E4 F5 07 14 20 66 5A A0 26 3F B9 00 0C E8 
                  01 07 5D 52 89 02 00 E8 02 C3 26 7F E8 B0 C0 B0 
                  EE EC 88 2F BA 03 24 AA E0 C8 EC E4 02 C8 BA 03 
                  AA DB 00 E8 DF 98 5D 55 8A 67 9F E8 E5 8B FE 7C 
                  B9 00 C2 00 09 52 2E 14 5A D1 83 02 EA 06 54 54 
                  54 E8 02 34 B9 00 7C C3 52 5E 8E FC 8B 02 C0 01 
                  E8 02 5E 55 5E 8E FC 8B 04 8B 02 C6 EE DB 00 57 
                  C7 E8 DE 8B 63 AD 06 8B 8B EC C0 EC E0 8A 8B E8 
                  AF BA 03 14 8B EE 8B 0A 74 BA 03 03 C8 26 45 EE 
                  D3 8A BA 03 5D 1E 56 F9 74 8B FC D8 76 8B 40 EB 
                  8B 63 26 5D BA 03 1B 8B E8 00 CE E8 00 D3 C2 EC 
                  C0 E8 00 5F C3 F9 74 EC EB AC C3 51 8B 83 05 C4 
                  B1 B5 E8 AE CC EC 88 09 CA EC 88 04 16 04 FB C7 
                  B1 B5 E8 AE C0 8B 83 23 00 13 E8 AE FA C0 8A EE 
                  EC AA C1 CD EA CE 8B 83 37 00 08 83 5F 5B 53 57 
                  5E 8E FC 8B 26 75 E8 AF CA 26 45 EE C7 B1 B5 8B 
                  E8 AE CB BA 03 C1 26 05 EE FE 3A 76 5F 5B 1E B8 
                  A0 D8 FF 8A 5E C3 51 BA 03 02 BE 8A B0 B4 E8 AD 
                  04 B0 8A B0 B4 E8 AD CE B0 E8 AD E0 F0 06 04 87 
                  B0 E8 AD E8 05 01 79 B0 E8 AD C8 57 00 8E BF FF 
                  5F 83 42 32 B0 8A E8 AD 8A AA C5 FD 76 59 C4 B0 
                  8A E8 AD 02 E7 3B BA 03 05 E5 31 B0 8A E8 AD C6 
                  06 23 5F 5B 1E 5E 8B FA 37 C4 B0 B4 E8 AD CE B0 
                  B4 E8 AD 05 E4 FB 83 42 BA 03 01 02 E5 EB E8 FF 
                  D0 80 08 EE 1F 02 0F D7 E8 FF 50 51 57 1E 83 00 
                  17 D8 C0 C0 BF 04 8A B1 F6 22 0A EB A0 04 30 BB 
                  57 ED FA 74 2E 3F 03 8B 2E 4F F3 83 03 83 FF E4 
                  1F 5F 59 58 49 1E 04 A8 04 00 74 04 00 0C 04 FF 
                  06 10 16 FF FF 06 10 16 FF FF 00 00 00 00 00 00 
                  00 00 00 00 01 02 03 04 05 06 07 08 FF 02 10 00 
                  00 00 58 32 04 10 00 00 00 58 32 02 10 00 00 00 
                  58 32 04 10 00 00 00 58 32 02 14 03 02 00 59 32 
                  02 14 03 02 00 59 32 04 15 02 01 01 59 32 04 16 
                  02 01 01 5A 32 04 16 02 01 00 5A 32 18 00 00 00 
                  6F 83 81 9E 1F 4F 0E 00 00 8E 42 96 A3 00 02 04 
                  14 38 3A 3C 3E 0C 0F 00 00 00 0E FF 00 08 00 00 
                  00 00 2A 00 00 00 6F 83 81 9E 1F 48 08 00 00 8E 
                  42 89 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 00 00 
                  0E FF 00 08 00 00 00 00 18 00 00 00 6E 83 81 9E 
                  1F 4F 0E 00 00 8E 42 96 A3 00 08 08 08 10 18 18 
                  18 0E 0F 00 00 00 0A FF 00 08 00 00 00 00 2A 00 
                  00 00 6E 83 81 9E 1F 48 08 00 00 8E 42 89 A3 00 
                  08 08 08 10 18 18 18 0E 0F 00 00 00 0A FF 00 08 
                  00 00 00 00 4A 00 01 00 EF 63 80 12 F0 60 00 00 
                  00 86 32 59 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 
                  00 00 05 FF 00 00 00 4A 00 01 00 EE 63 80 12 F0 
                  60 00 00 00 86 32 59 E3 00 3F 3F 3F 3F 3F 3F 3F 
                  01 0F 00 00 00 05 FF 00 00 00 18 00 01 00 63 4F 
                  82 80 1F 40 00 00 00 8E 50 96 A3 00 02 04 06 08 
                  0A 0C 0E 41 0F 00 00 00 05 FF 00 00 01 1D 00 01 
                  00 E3 4F 82 80 3E 40 00 00 00 8C 50 E7 E3 00 02 
                  04 06 08 0A 0C 0E 41 0F 00 00 00 05 FF 00 00 01 
                  18 00 00 3F A6 4F 82 80 1F 4D 0C 00 00 A5 28 63 
                  A3 00 FF 08 FF 10 FF 18 FF 0E 08 00 00 00 0A FF 
                  18 00 01 3F 63 4F 82 80 1F C7 07 00 00 8E 28 96 
                  A3 00 02 04 06 10 12 14 16 00 0F 00 00 00 0E FF 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 92 
                  00 8E 28 96 A3 00 02 04 06 08 0A 0C 0E 41 0F 00 
                  00 00 05 FF 00 00 00 00 00 00 29 00 63 4F 82 81 
                  1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 
                  00 01 0F 00 0F 00 05 FF 00 00 29 00 63 4F 82 81 
                  1F 40 00 00 00 8E 28 96 E3 00 00 00 00 00 00 00 
                  00 01 0F 00 0F 00 05 FF 18 00 09 00 63 27 90 80 
                  1F C0 00 00 00 8E 14 96 E3 00 02 04 06 10 12 14 
                  16 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 
                  1F C0 00 00 00 8E 28 96 E3 00 02 04 06 10 12 14 
                  16 01 0F 00 00 00 05 FF 18 00 05 00 A2 4F 1A E0 
                  1F 00 00 00 00 2E 14 5E 8B 00 00 18 00 00 00 00 
                  00 0B 05 00 00 00 07 FF 18 00 05 00 A7 4F 17 BA 
                  1F 00 00 00 00 2B 14 5F 8B 00 00 04 00 00 00 04 
                  00 01 05 00 00 00 07 FF 18 00 01 00 A2 4F 82 80 
                  1F 40 00 00 00 85 28 63 E3 00 00 18 00 00 00 00 
                  00 0B 05 00 00 00 05 FF 18 00 01 00 A3 4F 82 80 
                  1F 40 00 00 00 85 28 63 E3 00 02 04 14 38 3A 3C 
                  3E 01 0F 00 00 00 05 FF 18 00 09 00 A3 27 90 A0 
                  1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 
                  3E 08 0F 00 00 00 0E FF 18 00 09 00 A3 27 90 A0 
                  1F 4D 0C 00 00 85 14 63 A3 00 02 04 14 38 3A 3C 
                  3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 
                  1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 
                  3E 08 0F 00 00 00 0E FF 18 00 01 00 A3 4F 82 81 
                  1F 4D 0C 00 00 85 28 63 A3 00 02 04 14 38 3A 3C 
                  3E 08 0F 00 00 00 0E FF 18 00 08 00 67 27 90 A0 
                  1F 4F 0E 00 00 8E 14 96 A3 00 02 04 14 38 3A 3C 
                  3E 0C 0F 00 00 00 0E FF 18 00 00 00 67 4F 82 81 
                  1F 4F 0E 00 00 8E 28 96 A3 00 02 04 14 38 3A 3C 
                  3E 0C 0F 00 00 00 0E FF 18 00 00 00 66 4F 82 81 
                  1F 4F 0E 00 00 8E 28 96 A3 00 08 08 08 10 18 18 
                  18 0E 0F 00 00 00 0A FF 1D 00 01 00 E3 4F 82 80 
                  3E 40 00 00 00 8C 28 E7 C3 00 3F 3F 3F 3F 3F 3F 
                  3F 01 0F 00 00 00 05 FF 1D 00 01 00 E3 4F 82 80 
                  3E 40 00 00 00 8C 28 E7 E3 00 02 04 14 38 3A 3C 
                  3E 01 0F 00 00 00 05 FF 18 00 01 00 63 4F 82 80 
                  1F 41 00 00 00 8E 28 96 A3 00 02 04 06 08 0A 0C 
                  0E 41 0F 00 00 00 05 FF FF FF FF FF 08 08 08 FF 
                  1F 08 08 08 08 08 08 10 10 1F 1F 08 68 C0 00 00 
                  00 00 00 00 75 C0 00 00 00 00 68 E0 00 00 00 00 
                  00 00 75 E0 00 00 00 00 00 75 C0 00 00 00 00 00 
                  00 00 00 00 00 00 75 E0 00 00 00 00 00 00 00 00 
                  00 00 01 00 00 01 02 01 04 01 05 05 06 06 06 08 
                  08 07 07 07 E0 00 00 07 08 0E 00 00 28 29 2E 29 
                  08 08 01 08 00 00 08 02 01 01 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 01 B8 B8 
                  B8 B0 00 00 A0 A0 A0 A0 00 55 AA FF 02 08 20 80 
                  0C C0 0E 10 90 00 10 08 1F 1F 10 08 0C 1E 1F 2F 
                  0E 2B 10 14 11 15 30 34 31 35 18 1C 19 1D 38 3C 
                  39 3D 12 16 13 17 32 36 33 37 1A 1E 1B 1F 3A 3E 
                  3B 3F 05 1C 0B 28 07 20 14 2C 11 2A 1E 36 13 2C 
                  20 39 0B 24 18 30 0D 26 1A 33 17 30 24 3D 18 32 
                  24 3F 10 14 11 15 10 14 11 15 3A 3E 3B 3F 3A 3E 
                  3B 3F 10 14 11 15 10 14 11 15 3A 3E 3B 3F 3A 3E 
                  3B 3F 05 1C 0B 28 05 1C 0B 28 18 32 24 3F 18 32 
                  24 3F 05 1C 0B 28 05 1C 0B 28 18 32 24 3F 18 32 
                  24 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 
                  3F 3F 00 00 00 00 15 15 15 15 15 15 15 15 3F 3F 
                  3F 3F 10 14 11 15 3A 3E 3B 3F 05 1C 0B 28 18 32 
                  24 3F 05 0B 11 18 20 28 32 3F 00 10 3F 00 2F 3F 
                  00 3F 2F 00 3F 10 1F 27 3F 1F 37 3F 1F 3F 37 1F 
                  3F 27 2D 31 3F 2D 3A 3F 2D 3F 3A 2D 3F 31 00 07 
                  1C 00 15 1C 00 1C 15 00 1C 07 0E 11 1C 0E 18 1C 
                  0E 1C 18 0E 1C 11 14 16 1C 14 1A 1C 14 1C 1A 14 
                  1C 16 00 04 10 00 0C 10 00 10 0C 00 10 04 08 0A 
                  10 08 0E 10 08 10 0E 08 10 0A 0B 0C 10 0B 0F 10 
                  0B 10 0F 0B 10 0C 12 12 04 04 04 04 1E 04 04 04 
                  04 15 00 00 14 14 2D 14 14 14 14 2D 2D 2D 04 04 
                  10 04 04 04 04 10 10 10 54 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  AA B8 C0 B8 00 CA 00 00 33 32 CD 5A C4 C3 0D EF 
                  75 B0 E8 FF B0 A2 05 B4 CD 1F 59 58 FB 53 52 33 
                  8E 80 00 01 E9 06 05 8A 62 B4 CD 52 C1 75 32 32 
                  B4 CD B4 CD 0A 75 B0 E8 FF B5 C2 16 04 E5 9D 75 
                  FE 3A 84 7E 32 EB 00 00 E8 01 69 68 03 69 E8 05 
                  6A 68 09 6B 68 0B 6B E8 0D 6C 68 13 6F A8 41 6D 
                  28 43 6E A8 4F 6D 68 80 6E A8 82 6E E8 87 6F E8 
                  D1 6F A8 FF 18 00 09 00 63 27 90 A0 1F C7 07 00 
                  00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 
                  00 00 0E FF 18 00 09 00 63 27 90 A0 1F C7 07 00 
                  00 8E 14 96 A3 00 02 04 06 10 12 14 16 08 0F 00 
                  00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 
                  00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 
                  00 00 0E FF 18 00 01 00 63 4F 82 81 1F C7 07 00 
                  00 8E 28 96 A3 00 02 04 06 10 12 14 16 08 0F 00 
                  00 00 0E FF 18 00 09 00 63 27 90 80 1F C1 00 00 
                  00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 
                  00 00 0F FF 18 00 09 00 63 27 90 80 1F C1 00 00 
                  00 8E 14 96 A2 00 15 02 06 10 12 14 16 01 03 00 
                  00 00 0F FF 18 00 01 00 63 4F 82 80 1F C1 00 00 
                  00 8E 28 96 C2 00 17 17 17 17 17 17 17 01 01 00 
                  00 00 0D FF 18 00 00 00 A6 4F 82 81 1F 4D 0C 00 
                  00 85 28 63 A3 00 08 08 08 10 18 18 18 0E 0F 00 
                  00 00 0A FF 18 00 21 00 63 4F 82 81 1F 40 00 00 
                  00 8E 28 96 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 
                  00 00 05 FF 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
                  00 00 00 00 18 00 00 00 23 27 37 15 11 47 07 00 
                  00 24 14 E0 A3 00 02 04 06 10 12 14 16 08 0F 00 
                  00 00 0E FF 00 00 29 00 62 4F 82 81 1F 40 00 00 
                  00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 
                  0F 00 05 FF 00 00 29 00 63 4F 82 81 1F 40 00 00 
                  00 8E 28 96 E3 00 00 00 00 00 00 00 00 01 0F 00 
                  0F 00 05 FF 18 00 09 00 63 27 90 80 1F C0 00 00 
                  00 8E 14 96 E3 00 02 04 06 10 12 14 16 01 0F 00 
                  00 00 05 FF 18 00 01 00 63 4F 82 80 1F C0 00 00 
                  00 8E 28 96 E3 00 02 04 06 10 12 14 16 01 0F 00 
                  00 00 05 FF 18 00 05 00 A2 4F 1A E0 1F 00 00 00 
                  00 2E 14 5E 8B 00 00 18 00 00 00 00 00 0B 05 00 
                  00 00 07 FF 18 00 05 00 A7 4F 17 BA 1F 00 00 00 
                  00 2B 14 5F 8B 00 00 04 00 00 00 04 00 01 05 00 
                  00 00 07 FF 18 00 01 00 A2 4F 82 80 1F 40 00 00 
                  00 85 28 63 E3 00 00 18 00 00 00 00 00 0B 05 00 
                  00 00 05 FF 18 00 01 00 A3 4F 82 80 1F 40 00 00 
                  00 85 28 63 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 
                  00 00 05 FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 
                  00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 
                  00 00 0E FF 18 00 09 00 A3 27 90 A0 1F 4D 0C 00 
                  00 85 14 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 
                  00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 
                  00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 
                  00 00 0E FF 18 00 01 00 A3 4F 82 81 1F 4D 0C 00 
                  00 85 28 63 A3 00 02 04 14 38 3A 3C 3E 08 0F 00 
                  00 00 0E FF 18 00 08 00 67 27 90 A0 1F 4F 0E 00 
                  00 8E 14 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 
                  00 00 0E FF 18 00 00 00 67 4F 82 81 1F 4F 0E 00 
                  00 8E 28 96 A3 00 02 04 14 38 3A 3C 3E 0C 0F 00 
                  00 00 0E FF 18 00 00 00 66 4F 82 81 1F 4F 0E 00 
                  00 8E 28 96 A3 00 08 08 08 10 18 18 18 0E 0F 00 
                  00 00 0A FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 
                  00 8C 28 E7 C3 00 3F 3F 3F 3F 3F 3F 3F 01 0F 00 
                  00 00 05 FF 1D 00 01 00 E3 4F 82 80 3E 40 00 00 
                  00 8C 28 E7 E3 00 02 04 14 38 3A 3C 3E 01 0F 00 
                  00 00 05 FF 18 00 01 00 63 4F 82 80 1F 41 00 00 
                  
                • README.md
                  Paradise VGA Board: WDVGA PLUS 16
                  ---
                  This Paradise VGA board was manufactured in 1988 and sold by Western Digital Corporation as a **WDVGA PLUS 16**, Model No. 61-603023-02.
                   
                  ![Paradise VGA Board](/devices/pc/video/paradise/vga/static/Paradise_VGA_1988-640.jpg "link:/devices/pc/video/paradise/vga/static/Paradise_VGA_1988.jpg")
                  
                  A copy of the board's [ROM BIOS](1988-05-23.json) was created by [dumping](/devices/pc/bios/compaq/deskpro386/#dumping-the-roms)
                  the contents of each of the board's two M27128AZB PROMs to a *.hex* file, and then merging the *.hex* files with the following
                  [FileDump](/modules/filedump/) command:
                  
                  	filedump --file=62-003084-060.hex --merge=62-003085-060.hex --output=1988-05-23.json
                  
                  For a more human-readable dump, use the `--comments` option:
                  
                  	filedump --file=62-003084-060.hex --merge=62-003085-060.hex --output=1988-05-23.dump --comments
                  
                  And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data:
                  
                  > [http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/paradise/vga/1988-05-23.json&format=rom](http://www.pcjs.org/api/v1/dump?file=http://www.pcjs.org/devices/pc/video/paradise/vga/1988-05-23.json&format=rom)
                  
                  The first 128 bytes of the ROM BIOS contain:
                  
                  	00000000  55 aa 30 eb 15 37 34 30  30 30 35 2f 32 33 2f 38  |U.0..740005/23/8|
                  	00000010  38 2d 31 38 3a 30 30 3a  30 30 e9 a8 00 00 49 42  |8-18:00:00....IB|
                  	00000020  4d 20 43 4f 4d 50 41 54  41 42 4c 45 00 00 00 00  |M COMPATABLE....|
                  	00000030  00 00 00 00 00 30 30 33  30 35 36 2d 30 30 35 43  |.....003056-005C|
                  	00000040  4f 50 59 52 49 47 48 54  20 50 41 52 41 44 49 53  |OPYRIGHT PARADIS|
                  	00000050  45 20 53 59 53 54 45 4d  53 20 49 4e 43 2e 20 31  |E SYSTEMS INC. 1|
                  	00000060  39 38 37 2c 31 39 38 38  2c 20 41 4c 4c 20 52 49  |987,1988, ALL RI|
                  	00000070  47 48 54 53 20 52 45 53  45 52 56 45 44 56 47 41  |GHTS RESERVEDVGA|
                  
                  Although Compaq's early VGA boards also used a Paradise chipset and Inmos DAC, and have many physical similarities
                  to this WDC Paradise board, the ROMs claim different authorship.  A full disassembly and comparison of the Compaq and
                  WDC boards will be made at a later date.
                  
                  One thing we know already: the Paradise developers didn't know how to spell "compatible."
                  
          • README.md
            IBM PC Configurations
            ---
            
            This folder contains IBM PC [Machine Configurations](machine/), along with [Control Panels](/devices/pc/panel/),
            [Keyboard Layouts](/devices/pc/keyboard/) and other components.
            
            [Application Demos](/apps/pc/) and [Disk Archives](/disks/pc/) are also available.
            
    • versions
      • pcjs
        • 1.18.2
          • common.css
            @CHARSET "UTF-8";
            /**
                @author Jeff Parsons (@jeffpar)
                @website http://www.pcjs.org/
                @created 2013-05-05
                @modified 2014-02-23
                @license http://www.gnu.org/licenses/gpl.html
             */
            body {
                margin: 0;
                background: #202020;
            }
            h1, h2 {
                margin-top: 0;
                color: #cccccc;
            }
            h1, h2, h3, h4 {
                word-wrap: break-word;
            }
            
            h4 a {
                color: #cccccc !important;
            }
            p {
                line-height: 1.5em;
            }
            img {
                max-width: 100%;
            }
            a img {
                vertical-align: bottom;
            }
            pre, code {
                color: #000000;
                background-color: #cccccc;
                font-family: Monaco, Consolas, "Lucida Console", monospace;
                font-size: 12px;
            }
            pre {
                margin: 1em 2em;
                padding: 1em;
                border-radius: 5px;
                overflow: auto;
            }
            code {
                padding: 1px;
            }
            pre a, code a {
                color: #006400 !important;
            }
            .common {
                width: 100%;
                margin: 0 auto;
                color: #cccccc;
            }
            .common a {
            
                color: #7fc07f;
                text-decoration: none;
            }
            .common hr {
                border-color: #808080;
            }
            .common a:hover {
                text-decoration: underline;
            }
            .common, .machine {
                font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
                font-size: 15px;
            }
            .machine {
                margin: 15px;
                overflow: hidden;
            }
            .c1pjs {
                overflow: visible;
            }
            .machine-placeholder {
                text-align: center;
                font-weight: bold;
            }
            .common-top {
                background: #202020;
                font-size: small;
            }
            .common-top-left {
                float: left;
                width: 60%;
            }
            .common-top-left ul {
                line-height: 1.5em;
                list-style-type: none;
                margin: 0;
                padding: 1em 1em 1em 9px;
                overflow: hidden;
            }
            .common-top-left ul li {
                display: block;
                float: left;
            }
            .common-top-left ul li a {
                border-right: 1px solid #6f6f6f;
                padding: 2px 6px 2px 6px;
            }
            .common-top-left ul li:last-child a {
                border-right: none;
            }
            .common-top-right {
                float: right;
                width: 40%;
            }
            .common-top-right p {
                float: right;
                margin: 0;
                padding: 1em;
            }
            .common-middle {
                clear: both;
                padding: 1px 1em 1px 1em;
                background: #404040;
            }
            .common-sidebar {
                float: left;
                font-size: small;
                width: 140px;
                padding-bottom: 20px;
                overflow: hidden;
                white-space: nowrap;
                word-wrap: break-word;
            }
            .common-list {
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 0;
            }
            .common-list li {
            
                padding-bottom: 7px;
            }
            .common-list-data {
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 0;
            }
            .common-list-data li {
                line-height: 1.5em;
            }
            .common-list-data-items, .common-list-data-subitems {
                font-size: x-small;
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 2em;
            }
            .common-list-data-items li, .common-list-data-subitems li {
                padding-bottom: 0;
            }
            .common-main {
                margin-left: 150px;
            
            }
            .common-image-gallery {
                margin: 0 auto;
                text-align: center;
            }
            .common-image-gallery:after {
                content: '';
                display: block;
            }
            .common-image-frame {
                display: inline-block;
                margin: 8px;
                text-align: center;
            }
            .common-image-link {
                padding: 5px;
                border: 1px solid black;
                border-radius: 5px;
                background-color: #FAEBD7;
            }
            .common-image-label {
                font-size: x-small;
            }
            .common-bottom {
                clear: both;
                padding-top: 1em;
            }
            .common-bottom:after {
                content: '';
                display: block;
                clear: both;
            }
            .common-reference {
                float: left;
                font-size: x-small;
            }
            .common-reference a {
                text-decoration: none;
            }
            .common-copyright {
                float: right;
                font-size: x-small;
            }
            .common-copyright a {
                text-decoration: none;
            }
            .md-list {
            }
            .md-list li {
                line-height: 1.5em;
                margin-bottom: 1em;
            }
            .md-list li p {
                padding-left: 2em;
            }
            .md-list-compact {
            }
            .md-list-compact li {
                margin-bottom: 0;
            }
            .md-list-none {
                list-style-type: none;
                padding-left: 2em;
            }
            .md-list-none li {
                margin-bottom: 0;
            }
            @media screen and (max-width: 900px) {
            
                .common-sidebar {
                    width: 100%;
                    white-space: normal;
                }
                .common-list {
                    padding-left: 0;
                }
                .common-list-data {
                    padding-left: 0;
                }
                .common-sidebar h4, .common-list li, .common-list-data li, .common-list-data-items li {
                    width: 130px;
                    float: left;
                    overflow: hidden;
                    vertical-align: top;
                    padding-right: 1em;
                    margin-top: 0;
                }
                .common-list-data-subitems {
                    display: none;
                }
                .common-main {
                    clear: both;
                    margin-left: 0;
                    padding-left: 0;
                    padding-right: 0;
                }
                .md-list-none {
                    padding-left: 1em;
                }
            }
            
          • common.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
            	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
            	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:template name="commonStyles">
            		<meta charset="utf-8"/>
            		<link rel="shortcut icon" href="/versions/images/current/favicon.ico" type="image/x-icon"/>
            		<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.2/common.css"/>
            	</xsl:template>
            
            	<xsl:template name="commonTop">
            		<div class="common-top">
            			<div class="common-top-left">
            				<ul>
            					<li><a href="/">Home</a></li>
            					<li><a href="/apps/pc/">Apps</a></li>
            					<li><a href="/disks/pc/">Disks</a></li>
            					<li><a href="/devices/pc/machine/">Machines</a></li>
            					<li><a href="/docs/">Docs</a></li>
            					<li><a href="/pubs/">Pubs</a></li>
            					<li><a href="/blog/">Blog</a></li>
            					<li><a href="/docs/about/">About</a></li>
            				</ul>
            			</div>
            			<div class="common-top-right">
            				<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/about-aws/whats-new/2013/03/11/announcing-aws-elastic-beanstalk-for-node-js/" target="_blank">AWS</a></p>
            			</div>
            		</div>
            	</xsl:template>
            
            	<xsl:template name="commonBottom">
            		<div class="common-bottom">
            			<p class="common-reference"></p>
            			<p class="common-copyright">
            				<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
            				<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
            			</p>
            		</div>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • components.css
            @CHARSET "UTF-8";
            
            
            *:not(input,textarea) {
                -webkit-user-select: none;
            }
            .pcjs-embed {
            }
            .pcjs-embed:after {
                clear:both;
            }
            .pcjs-name, .pcjs-menu {
                clear: both;
                font-weight: bold;
                padding-bottom: 4px;
            }
            .pcjs-menu {
                float: left;
            }
            .pcjs-canvas {
                width: 100%;
                height: auto;
            }
            .pcjs-container {
                color: #000000;
                position: relative;
            }
            .pcjs-label {
                font-size: small;
                line-height: 19px;
                vertical-align: middle;
                float: left;
                font-family: "Lucida Console", monospace;
            }
            .pcjs-control textarea {
                font-family: Monaco, monospace;
                font-size: x-small;
            }
            .pcjs-fieldset {
                border: none;
                margin: 0;
                padding: 0;
            }
            .pcjs-flag {
                font-family: "Lucida Console", monospace;
                font-size: small;
                text-align: center;
                line-height: 19px;
                vertical-align: middle;
            }
            .pcjs-register {
                font-family: "Lucida Console", monospace;
                font-size: small;
                text-align: center;
                line-height: 19px;
                vertical-align: middle;
                border: 1px solid black;
            }
            .pcjs-switches {
                float: left;
            }
            .pcjs-bitBucket {
                float: left;
                width: 19px;
                height: 38px;
            }
            .pcjs-bitCell {
                float: left;
                width: 19px;
                height: 19px;
                margin-right: -1px;
                margin-bottom: -1px;
                border: 1px solid black;
                text-align: center;
                line-height: 19px;
            }
            .pcjs-bitCellLeft {
                border-left: 1px solid black;
            }
            .pcjs-bitLabel {
                font-size: xx-small;
                text-align: center;
            }
            .pcjs-description, .pcjs-status {
                font-size: x-small;
                line-height: 2em;
            }
            .pcjs-key {
                border: 1px solid black;
                font-size: x-small;
                text-align: center;
                position: absolute;
                height: 34px;
                line-height: 34px;
                background-color: #ffffff;
            }
            .pcjs-led {
                float: left;
                width: 8px;
                height: 8px;
                margin: 4px;
                border: 1px solid black;
                text-align: center;
                line-height: 19px;
                background-color: #000000;
            }
            .pcjs-video-object {
                clear: both;
                height: auto;
                position: relative;
            }
            .pcjs-video-object textarea {
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                opacity: 0;
                border: 0;
                padding: 0;
                line-height: 0;
            }
            .pcjs-reference {
                float: left;
                font-size: x-small;
            }
            .pcjs-reference a {
                text-decoration: none;
            }
            .pcjs-copyright {
                float: right;
                font-size: x-small;
            }
            .pcjs-copyright a {
                text-decoration: none;
            }
            
            @media screen and (max-width: 900px) {
                .pcjs-textarea {
                    width: 100% !important;
                }
                .pcjs-registers {
                    width: 100% !important;
                }
            }
            
          • components.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            	<xsl:param name="rootDir" select="''"/>
            	<xsl:param name="generator" select="'client'"/>
            
            	<xsl:variable name="MACHINECLASS">pc</xsl:variable>
            	<xsl:variable name="APPCLASS">pcjs</xsl:variable>
            	<xsl:variable name="APPVERSION">1.18.2</xsl:variable>
            	<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
            
            	<xsl:template name="componentStyles">
            		<link rel="stylesheet" type="text/css" href="/versions/{$APPCLASS}/{$APPVERSION}/components.css"/>
            	</xsl:template>
            
            	<xsl:template name="componentScripts">
            		<xsl:param name="component"/>
            		<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
            	</xsl:template>
            
            	<xsl:template name="componentIncludes">
            		<xsl:param name="component"/>
            		<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
            	</xsl:template>
            
            	<xsl:template name="machine">
            		<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
            		<xsl:param name="state" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/machine">
            			<xsl:with-param name="machineState" select="$state"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="machine[@ref]">
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/machine">
            			<xsl:with-param name="machine" select="@id"/>
            			<xsl:with-param name="machineState">
            				<xsl:choose>
            					<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            					<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
            				</xsl:choose>
            			</xsl:with-param>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="machine[not(@ref)]">
            		<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="machineStyle">
            			<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
            		</xsl:variable>
            		<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
            			<xsl:call-template name="component">
            				<xsl:with-param name="machine" select="$machine"/>
            				<xsl:with-param name="machineState">
            					<xsl:choose>
            						<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            						<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
            					</xsl:choose>
            				</xsl:with-param>
            				<xsl:with-param name="component" select="'machine'"/>
            				<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
            				<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            				<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
            			</xsl:call-template>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="component[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/component">
            			<xsl:with-param name="machine" select="$machine"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="component[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class" select="@class"/>
            			<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template name="component">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:param name="component" select="name(.)"/>
            		<xsl:param name="class" select="''"/>
            		<xsl:param name="parms" select="''"/>
            		<xsl:param name="url" select="''"/>
            		<xsl:variable name="id">
            			<xsl:choose>
            				<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
            				<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
            				<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
            				<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="componentURL">
            			<xsl:choose>
            				<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="name">
            			<xsl:choose>
            				<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
            				<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="comment">
            			<xsl:choose>
            				<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="border">
            			<xsl:choose>
            				<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
            				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="left">
            			<xsl:choose>
            				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="top">
            			<xsl:choose>
            				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="width">
            			<xsl:choose>
            				<xsl:when test="@width">
            					<xsl:choose>
            						<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
            						<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
            					</xsl:choose>
            				</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="height">
            			<xsl:choose>
            				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="padding">
            			<xsl:choose>
            				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
            				<xsl:otherwise>
            					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
            					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
            					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
            					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
            				</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
            				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
            				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
            				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
            				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="style">
            			<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
            			<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="componentClass">
            			<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
            		</xsl:variable>
            		<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
            			<xsl:if test="$component = 'machine'">
            				<xsl:apply-templates select="name" mode="machine"/>
            			</xsl:if>
            			<xsl:if test="$component != 'machine'">
            				<xsl:apply-templates select="name" mode="component"/>
            			</xsl:if>
            			<div class="{$APPCLASS}-container" style="{$border}{$style}">
            				<xsl:if test="$component = 'machine'">
            					<xsl:apply-templates select="menu" mode="machine"/>
            				</xsl:if>
            				<xsl:if test="$component != 'machine'">
            					<xsl:apply-templates select="menu" mode="component"/>
            				</xsl:if>
            				<xsl:if test="$class != '' and $component != 'machine'">
            					<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
            				</xsl:if>
            				<xsl:if test="control">
            					<div class="{$APPCLASS}-controls">
            						<xsl:apply-templates select="control" mode="component"/>
            					</div>
            				</xsl:if>
            				<xsl:apply-templates>
            					<xsl:with-param name="machine" select="$machine"/>
            					<xsl:with-param name="machineState" select="$machineState"/>
            				</xsl:apply-templates>
            			</div>
            			<xsl:if test="$component = 'machine'">
            				<xsl:choose>
            					<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
            					<xsl:otherwise/>
            				</xsl:choose>
            				<div class="{$APPCLASS}-copyright">
            					<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
            				</div>
            				<div style="clear:both"> </div>
            			</xsl:if>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="name" mode="machine">
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<h2 style="{$pos}"><xsl:apply-templates/></h2>
            	</xsl:template>
            
            	<xsl:template match="name" mode="component">
            		<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
            	</xsl:template>
            
            	<xsl:template match="menu" mode="component">
            		<xsl:apply-templates mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="title" mode="component">
            		<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
            	</xsl:template>
            
            	<xsl:template match="control" mode="component">
            		<xsl:variable name="type">
            			<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
            		</xsl:variable>
            		<xsl:variable name="binding">
            			<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
            		</xsl:variable>
            		<xsl:variable name="border">
            			<xsl:choose>
            				<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
            				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="width">
            			<xsl:choose>
            				<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="height">
            			<xsl:choose>
            				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="left">
            			<xsl:choose>
            				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="top">
            			<xsl:choose>
            				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="padding">
            			<xsl:choose>
            				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
            				<xsl:otherwise>
            					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
            					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
            					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
            					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
            				</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
            				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
            				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
            				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
            				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
            				<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="style">
            			<xsl:choose>
            				<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="containerClass">
            			<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="containerStyle">
            			<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
            			<xsl:choose>
            				<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
            			<xsl:variable name="fontsize">
            				<xsl:choose>
            					<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
            					<xsl:otherwise/>
            				</xsl:choose>
            			</xsl:variable>
            			<xsl:variable name="subClass">
            				<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
            			</xsl:variable>
            			<xsl:variable name="labelWidth">
            				<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
            			</xsl:variable>
            			<xsl:variable name="labelStyle">
            				<xsl:choose>
            					<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
            					<xsl:otherwise>text-align:right;</xsl:otherwise>
            				</xsl:choose>
            			</xsl:variable>
            			<xsl:if test="@label">
            				<xsl:if test="not(@labelpos) or @labelpos = 'left'">
            					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
            				</xsl:if>
            			</xsl:if>
            			<xsl:choose>
            				<xsl:when test="@type = 'canvas'">
            					<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
            				</xsl:when>
            				<xsl:when test="@type = 'button'">
            					<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
            				</xsl:when>
            				<xsl:when test="@type = 'list'">
            					<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
            						<xsl:apply-templates select="disk|app|manifest" mode="component"/>
            					</select>
            				</xsl:when>
            				<xsl:when test="@type = 'text'">
            					<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
            				</xsl:when>
            				<xsl:when test="@type = 'submit'">
            					<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
            				</xsl:when>
            				<xsl:when test="@type = 'textarea'">
            					<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
            				</xsl:when>
            				<xsl:when test="@type = 'heading'">
            					<div><xsl:value-of select="."/></div>
            				</xsl:when>
            				<xsl:when test="@type = 'file'">
            					<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
            						<fieldset class="{$APPCLASS}-fieldset">
            							<input type="file"/>
            							<input type="submit" value="Mount" disabled="true"/>
            						</fieldset>
            					</form>
            				</xsl:when>
            				<xsl:when test="@type = 'led'">
            					<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
            				</xsl:when>
            				<xsl:when test="@type = 'separator'">
            					<hr/>
            				</xsl:when>
            				<xsl:when test="@type = 'container'">
            					<xsl:apply-templates mode="component"/>
            				</xsl:when>
            				<xsl:when test="not(@type)">
            					<div style="clear:both"> </div>
            				</xsl:when>
            				<xsl:otherwise>
            					<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
            				</xsl:otherwise>
            			</xsl:choose>
            			<xsl:if test="@label">
            				<xsl:if test="@labelpos = 'right'">
            					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
            				</xsl:if>
            				<div style="clear:both"> </div>
            			</xsl:if>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="disk[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="disk[not(@ref)]" mode="component">
            		<xsl:variable name="desc">
            			<xsl:if test="@desc">
            				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
            				<xsl:if test="@href">
            					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
            				</xsl:if>
            			</xsl:if>
            		</xsl:variable>
            		<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
            	</xsl:template>
            
            	<xsl:template match="app[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="app[not(@ref)]" mode="component">
            		<xsl:variable name="desc">
            			<xsl:if test="@desc">
            				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
            				<xsl:if test="@href">
            					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
            				</xsl:if>
            			</xsl:if>
            		</xsl:variable>
            		<xsl:variable name="path">
            			<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="files">
            			<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
            		</xsl:variable>
            		<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
            	</xsl:template>
            
            	<xsl:template match="manifest[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
            			<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="manifest[not(@ref)]" mode="component">
            		<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
            		<xsl:if test="$disk != ''">
            			<xsl:variable name="prefix">
            				<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
            			</xsl:variable>
            			<xsl:for-each select="disk">
            				<xsl:if test="$disk = @id or $disk = '*'">
            					<xsl:variable name="name">
            						<xsl:choose>
            							<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
            							<xsl:when test="normalize-space(./text()) != ''">
            								<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
            							</xsl:when>
            							<xsl:otherwise>
            								<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
            							</xsl:otherwise>
            						</xsl:choose>
            					</xsl:variable>
            					<xsl:variable name="link">
            						<xsl:if test="link">
            							<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
            							<xsl:if test="link/@href">
            								<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
            							</xsl:if>
            						</xsl:if>
            					</xsl:variable>
            					<xsl:if test="@href">
            						<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
            					</xsl:if>
            					<xsl:if test="not(@href)">
            						<xsl:variable name="dir">
            							<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
            						</xsl:variable>
            						<xsl:variable name="files">
            							<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
            						</xsl:variable>
            						<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
            					</xsl:if>
            				</xsl:if>
            			</xsl:for-each>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="name">
            	</xsl:template>
            
            	<xsl:template match="title">
            	</xsl:template>
            
            	<xsl:template match="control">
            	</xsl:template>
            
            	<xsl:template match="cpu[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="cpu[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise>8088</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="cycles">
            			<xsl:choose>
            				<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="multiplier">
            			<xsl:choose>
            				<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
            				<xsl:otherwise>1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="autoStart">
            			<xsl:choose>
            				<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
            				<xsl:otherwise>null</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csStart">
            			<xsl:choose>
            				<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csInterval">
            			<xsl:choose>
            				<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csStop">
            			<xsl:choose>
            				<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class" select="'cpu'"/>
            			<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="chipset[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="chipset[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise>5150</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sw1">
            			<xsl:choose>
            				<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sw2">
            			<xsl:choose>
            				<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sound">
            			<xsl:choose>
            				<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
            				<xsl:otherwise>true</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="scaletimers">
            			<xsl:choose>
            				<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="floppies">
            			<xsl:choose>
            				<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
            				<xsl:otherwise>{}</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="monitor">
            			<xsl:choose>
            				<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="rtcdate">
            			<xsl:choose>
            				<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">chipset</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="keyboard[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="keyboard[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">keyboard</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="serial[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="serial[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="adapter">
            			<xsl:choose>
            				<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="binding">
            			<xsl:choose>
            				<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">serial</xsl:with-param>
            			<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="mouse[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="mouse[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="serial">
            			<xsl:choose>
            				<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">mouse</xsl:with-param>
            			<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="fdc[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/fdc">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="mount" select="@automount"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="fdc[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="mount" select="''"/>
            		<xsl:variable name="automount">
            			<xsl:choose>
            				<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">fdc</xsl:with-param>
            			<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="hdc[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="hdc[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="drives">
            			<xsl:choose>
            				<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="type">
            			<xsl:choose>
            				<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
            				<xsl:otherwise>xt</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">hdc</xsl:with-param>
            			<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="rom[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="rom[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="addr">
            			<xsl:choose>
            				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="size">
            			<xsl:choose>
            				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="alias">
            			<xsl:choose>
            				<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
            				<xsl:otherwise>null</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="file">
            			<xsl:choose>
            				<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="notify">
            			<xsl:choose>
            				<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">rom</xsl:with-param>
            			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="ram[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="ram[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="addr">
            			<xsl:choose>
            				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="size">
            			<xsl:choose>
            				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="test">
            			<xsl:choose>
            				<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
            				<xsl:otherwise>true</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">ram</xsl:with-param>
            			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="video[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="video[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="mode">
            			<xsl:choose>
            				<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
            				<xsl:otherwise>7</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenWidth">
            			<xsl:choose>
            				<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
            				<xsl:otherwise>256</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenHeight">
            			<xsl:choose>
            				<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
            				<xsl:otherwise>224</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="memory">
            			<xsl:choose>
            				<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="switches">
            			<xsl:choose>
            				<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="scale">
            			<xsl:choose>
            				<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="charCols">
            			<xsl:choose>
            				<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
            				<xsl:otherwise>80</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="charRows">
            			<xsl:choose>
            				<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
            				<xsl:otherwise>25</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="fontROM">
            			<xsl:choose>
            				<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
            				<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenColor">
            			<xsl:choose>
            				<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
            				<xsl:otherwise>black</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="touchScreen">
            			<xsl:choose>
            				<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="autoLock">
            			<xsl:choose>
            				<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">video</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="debugger[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="debugger[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="commands">
            			<xsl:choose>
            				<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="messages">
            			<xsl:choose>
            				<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">debugger</xsl:with-param>
            			<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="panel[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="panel[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">panel</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="computer[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/computer">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="machineState" select="$machineState"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="computer[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="busWidth">
            			<xsl:choose>
            				<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
            				<xsl:otherwise>20</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="resume">
            			<xsl:choose>
            				<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="state">
            			<xsl:choose>
            				<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            				<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">computer</xsl:with-param>
            			<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • document.css
            @CHARSET "UTF-8";
            
            .page {
                margin: 2% 2%;
                padding: 2% 2%;
                min-width: 30em;
                overflow: auto;
                font-size: large;
                font-family: Helvetica, Arial, sans-serif;
                background: #303030;
                color: #ccc;
            
            }
            .page-header {
            }
            .page-header-title {
            	text-align: center;
            
            }
            .page a {
                color: #7fc07f;
                text-decoration: none;
            }
            a.footlink, a.paralink {
            	text-decoration: none;
            }
            a.footlink:link, a.paralink:link {
            	color: blue;
            }
            a.footlink:visited, a.paralink:visited {
            	color: blue;
            }
            .galleryitem {
            	float: left;
            	width: 200px;
            }
            .item {
            	float: left;
            	width: 2em;
            	text-indent: 1em;
            }
            .list {
            	margin-left: 3em;
            	text-indent: 0;
            	text-align: justify;
            }
            ul {
            	list-style: none;
            }
            div.pnumber {
            	float: left;
            	width: 2em;
            	text-indent: 1em;
            }
            div.pitem {
            	margin-left: 10em;
            }
            p.indent, .justified p {
            	text-indent: 2em;
            	text-align: justify;
            	line-height: 1.5em;
            }
            p.noindent {
            	text-indent: 0;
            	text-align: justify;
            }
            p.center, .center {
            	text-align: center;
            }
            li.para {
            	margin-top: 1em;
            	margin-bottom: 1em;
            }
            .left {
            	text-align: left;
            }
            .right {
            	text-align: right;
            }
            blockquote.tag {
            	font-size: small;
            	font-family: Monaco, Fixed, monospace;
            	margin-top: 0;
            	margin-bottom: 0;
            }
            .blockquote {
            	padding-left: 1em;
            	text-indent: 0;
            	text-align: justify;
            }
            .italics {
            	font-style: italic;
            }
            .medium {
            	font-size: medium;
            }
            .small {
            	font-size: x-small;
            }
            .smallcaps {
            	font-variant: small-caps;
            }
            .strike {
            	text-decoration: line-through;
            }
            .summation, .bracelist {
            	display: inline-block;
            	position: relative;
            	vertical-align: middle;
            	text-align: center;
            	margin-bottom: 0.5ex;
            	text-indent: 0;
            }
            .bracelist-symbol {
            	font-size: 3em;
            	vertical-align: -40%;
            }
            .summation .summation-lower, .summation .summation-upper, .bracelist-item {
            	display: block;
            	font-size: 75%;
            	text-align: center;
            }
            .summation .summation-upper {
            	margin-bottom: 0;
            	margin-left: 0.8ex;
            	font-style: italic;
            }
            .summation .summation-lower{
            	margin-bottom: -0.6ex;
            	font-style: italic;
            }
            .summation .summation-symbol {
            	font-size: 2em;
            }
            p sup {
            	vertical-align: baseline;
            	position: relative;
            	bottom: .5em;
            	font-size: small;
            }
            p sub {
            	vertical-align: baseline;
            	position: relative;
            	bottom: -.5em;
            	font-size: small;
            }
            .footnote {
            	font-size: medium;
            	text-indent: 1em;
            	text-align: justify;
            	margin-top: .5em;
            }
            .image-right {
            	float: right;
            	margin-left: 1em;
            	margin-top: 1em;
            	margin-bottom: 1em;
            }
            .image-caption {
            	font-size: small;
            	text-align: center;
            }
          • document.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
            	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
            	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:template name="documentStyles">
            		<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.2/document.css"/>
            	</xsl:template>
            
            	<xsl:template match="title">
            		<h1><xsl:apply-templates/></h1>
            	</xsl:template>
            
            	<xsl:template name="p">
            		<xsl:if test="@id">
            			<a name="{@id}"></a>
            		</xsl:if>
            		<xsl:choose>
            			<xsl:when test="not(@class)">
            				<p><xsl:apply-templates/></p>
            			</xsl:when>
            			<xsl:otherwise>
            				<p class="{@class}"><xsl:apply-templates/></p>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="p">
            		<xsl:call-template name="p"/>
            	</xsl:template>
            
            	<xsl:template match="br">
            		<br/>
            	</xsl:template>
            
            	<xsl:template match="p[@number]">
            		<div class="pnumber">
            			<xsl:choose>
            				<xsl:when test="not(@number) or @number = ''">&nbsp;</xsl:when>
            				<xsl:otherwise><xsl:value-of select="@number"/></xsl:otherwise>
            			</xsl:choose>
            		</div>
            		<div class="pitem">
            			<xsl:call-template name="p"/>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="span">
            		<xsl:choose>
            			<xsl:when test="not(@class)">
            				<span><xsl:apply-templates/></span>
            			</xsl:when>
            			<xsl:when test="@class = 'italics'">
            				<em><xsl:apply-templates/></em>
            			</xsl:when>
            			<xsl:otherwise>
            				<span class="{@class}"><xsl:apply-templates/></span>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="h2">
            		<h2><xsl:apply-templates/></h2>
            	</xsl:template>
            
            	<xsl:template match="h3">
            		<h3><xsl:apply-templates/></h3>
            	</xsl:template>
            
            	<xsl:template match="h4">
            		<h4><xsl:apply-templates/></h4>
            	</xsl:template>
            
            	<xsl:template match="h5">
            		<h5><xsl:apply-templates/></h5>
            	</xsl:template>
            
            	<xsl:template match="h6">
            		<h6><xsl:apply-templates/></h6>
            	</xsl:template>
            
            	<xsl:template match="em">
            		<em><xsl:apply-templates/></em>
            	</xsl:template>
            
            	<xsl:template match="strong">
            		<strong><xsl:apply-templates/></strong>
            	</xsl:template>
            
            	<xsl:template match="a">
            		<a href="{@href}" target="{@target}"><xsl:apply-templates/></a>
            	</xsl:template>
            
            	<xsl:template match="ol">
            		<blockquote><ol><xsl:apply-templates/></ol></blockquote>
            	</xsl:template>
            
            	<xsl:template match="ul">
            		<blockquote><ul><xsl:apply-templates/></ul></blockquote>
            	</xsl:template>
            
            	<xsl:template match="li">
            		<li><xsl:apply-templates/></li>
            	</xsl:template>
            
            	<xsl:template match="img">
            		<div><img src="{@src}" alt="image"/></div>
            	</xsl:template>
            
            	<xsl:template match="pre">
            		<pre><xsl:apply-templates/></pre>
            	</xsl:template>
            
            	<xsl:template match="figure">
            		<xsl:choose>
            			<xsl:when test="@pos">
            				<div class="{@pos}"><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
            			</xsl:when>
            			<xsl:otherwise>
            				<div><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="sub">
            		<sub><xsl:apply-templates/></sub>
            	</xsl:template>
            
            	<xsl:template match="sup">
            		<sup><xsl:apply-templates/></sup>
            	</xsl:template>
            
            	<xsl:template match="lt">&lt;</xsl:template>
            	<xsl:template match="gt">&gt;</xsl:template>
            	<xsl:template match="ne">&ne;</xsl:template>
            	<xsl:template match="le">&le;</xsl:template>
            	<xsl:template match="ge">&ge;</xsl:template>
            	<xsl:template match="times">&times;</xsl:template>
            	<xsl:template match="dot">&sdot;</xsl:template>
            	<xsl:template match="divide">&divide;</xsl:template>
            	<xsl:template match="sigma">&sigma;</xsl:template>
            
            	<xsl:template match="summation">
            		<span class="summation">
            			<span class="summation-upper"><xsl:value-of select="@upper"/></span>
            			<span class="summation-symbol">&sum;</span>
            			<span class="summation-lower"><xsl:value-of select="@lower"/></span>
            		</span>
            		<xsl:apply-templates/>
            	</xsl:template>
            
            	<xsl:template match="bracelist">
            		<span class="bracelist-symbol">&lbrace;</span>
            		<span class="bracelist">
            			<xsl:for-each select="item">
            				<span class="bracelist-item"><xsl:apply-templates/></span>
            			</xsl:for-each>
            		</span>
            	</xsl:template>
            
            	<xsl:template match="footlink">
            		<xsl:variable name="docID" select="/document/@id"/>
            		<a class="footlink" id="fn{$docID}_ref{@n}" href="#fn{$docID}_{@n}"><sup><xsl:if test="@quoted"><xsl:text>[</xsl:text></xsl:if><xsl:value-of select="@n"/><xsl:if test="@quoted"><xsl:text>]</xsl:text></xsl:if></sup></a>
            	</xsl:template>
            
            	<xsl:template match="footnote">
            		<xsl:variable name="docID" select="/document/@id"/>
            		<div class="footnote"><a id="fn{$docID}_{@n}" href="#fn{$docID}_ref{@n}"><sup><xsl:value-of select="@n"/></sup></a><xsl:text> </xsl:text>
            			<xsl:apply-templates/>
            		</div>
            	</xsl:template>
            
            	<xsl:template name="authors">
            		<xsl:for-each select="author"><xsl:if test="position() != 1"><xsl:text>, </xsl:text></xsl:if><xsl:if test="position() != 1 and position() = last()"><xsl:text>and </xsl:text></xsl:if><xsl:value-of select="."/></xsl:for-each>
            	</xsl:template>
            
            	<xsl:template name="formatDate">
            		<xsl:param name="date"/>
            		<xsl:param name="format">MDY</xsl:param>
            		<xsl:variable name="year">
            			<xsl:value-of select="substring-before($date,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="mon-day">
            			<xsl:value-of select="substring-after($date,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="mon">
            			<xsl:value-of select="substring-before($mon-day,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="full-day">
            			<xsl:value-of select="substring-after($mon-day,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="day">
            			<xsl:choose>
            				<xsl:when test="substring($full-day,1,1) = '0'"><xsl:value-of select="substring($full-day,2)"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$full-day"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:choose>
            			<xsl:when test="$mon = '01'">January </xsl:when>
            			<xsl:when test="$mon = '02'">February </xsl:when>
            			<xsl:when test="$mon = '03'">March </xsl:when>
            			<xsl:when test="$mon = '04'">April </xsl:when>
            			<xsl:when test="$mon = '05'">May </xsl:when>
            			<xsl:when test="$mon = '06'">June </xsl:when>
            			<xsl:when test="$mon = '07'">July </xsl:when>
            			<xsl:when test="$mon = '08'">August </xsl:when>
            			<xsl:when test="$mon = '09'">September </xsl:when>
            			<xsl:when test="$mon = '10'">October </xsl:when>
            			<xsl:when test="$mon = '11'">November </xsl:when>
            			<xsl:when test="$mon = '12'">December </xsl:when>
            			<xsl:when test="$mon = '00'"/>		</xsl:choose>
            		<xsl:if test="$day != '0' and $format = 'MDY'">
            			<xsl:value-of select="$day"/><xsl:text>, </xsl:text>
            		</xsl:if>
            		<xsl:value-of select="$year"/>
            	</xsl:template>
            
            	<xsl:template match="gallery">
            		<h2><xsl:value-of select="description"/></h2>
            		<div class="gallery">
            			<xsl:apply-templates select="item" mode="gallery"/>
            		</div>
            		<div style="clear:both;"></div>
            	</xsl:template>
            
            	<xsl:template match="item" mode="gallery">
            		<div class="galleryitem">
            			<a href="{@ref}"><img src="/versions/images/current/pdf-192.jpg" alt="{.}"/></a><br/>
            			<div style="font-size:small; text-align:center;"><xsl:value-of select="."/></div>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'timeline']">
            		<xsl:if test="not(description)">
            			<h2>Timeline</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="timeline"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="timeline">
            		<xsl:if test="@ref">
            			<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            			<xsl:apply-templates select="document($documentFile)/document" mode="withDate">
            				<xsl:with-param name="itemRef" select="@ref"/>
            			</xsl:apply-templates>
            		</xsl:if>
            		<xsl:if test="not(@ref)">
            			<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="@date"/></xsl:call-template></h3>
            			<blockquote>
            				<xsl:value-of select="."/>
            			</blockquote>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'people']">
            		<xsl:if test="not(description)">
            			<h2>People</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="people"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="people">
            		<h3><xsl:value-of select="name"/></h3>
            		<xsl:apply-templates select="list"/>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'documents']">
            		<xsl:if test="description"><h2><xsl:value-of select="description"/></h2></xsl:if>
            		<ul>
            			<xsl:apply-templates select="item" mode="document"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="document">
            		<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($documentFile)/document">
            			<xsl:with-param name="itemRef" select="@ref"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="document">
            		<xsl:param name="itemRef"/>
            		<li>
            			<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/></xsl:call-template>
            		</li>
            	</xsl:template>
            
            	<xsl:template match="document" mode="withDate">
            		<xsl:param name="itemRef"/>
            		<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="date"/><xsl:with-param name="format" select="MY"/></xsl:call-template></h3>
            		<blockquote>
            			<p>
            				<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/><xsl:with-param name="multiLine" select="'true'"/></xsl:call-template>
            			</p>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template name="documentSummary">
            		<xsl:param name="itemRef"/>
            		<xsl:param name="multiLine">false</xsl:param>
            		<xsl:choose>
            			<xsl:when test="content|include">
            				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
            				<xsl:if test="@ref">
            					<span class="small">
            						<xsl:text> [</xsl:text><a href="{@ref}">Original</a><xsl:text>]</xsl:text>
            					</span>
            				</xsl:if>
            			</xsl:when>
            			<xsl:otherwise>
            				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
            			</xsl:otherwise>
            		</xsl:choose>
            		<xsl:if test="copy">
            			<span class="small">
            				<xsl:text> [</xsl:text><a href="{copy/@ref}"><xsl:value-of select="copy"/></a><xsl:text>]</xsl:text>
            			</span>
            		</xsl:if>
            		<xsl:if test="author"><xsl:if test="$multiLine = 'true'"><br/></xsl:if><span class="medium"><xsl:text> by </xsl:text><xsl:call-template name="authors"/></span></xsl:if>
            		<xsl:if test="source">
            			<span class="small">
            				<br/>
            				<xsl:text>[Source: </xsl:text>
            				<xsl:if test="site">
            					<a href="{site/@url}"><xsl:value-of select="site"/></a>
            				</xsl:if>
            				<xsl:if test="not(site)">
            					<a href="{source/@url}"><xsl:value-of select="source"/></a>
            				</xsl:if>
            				<xsl:text>]</xsl:text>
            			</span>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'resources']">
            		<xsl:if test="not(description)">
            			<h2>Resources</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="resources"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="resources">
            		<h3><xsl:value-of select="description"/></h3>
            		<xsl:apply-templates select="list"/>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'links']">
            		<xsl:if test="description">
            			<h4><xsl:value-of select="description"/></h4>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="item" mode="links"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="links">
            		<li><a href="{@ref}"><xsl:value-of select="."/></a></li>
            	</xsl:template>
            
            	<xsl:template match="list[not(@type)]">
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item|tag" mode="outer"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="outer">
            		<xsl:if test="description">
            			<h3><xsl:value-of select="description"/></h3>
            		</xsl:if>
            		<xsl:apply-templates select="list|item|tag" mode="inner"/>
            	</xsl:template>
            
            	<xsl:template match="list" mode="inner">
            		<xsl:if test="description">
            			<h4><xsl:value-of select="description"/></h4>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template name="innerlist">
            		<xsl:if test="description">
            			<xsl:value-of select="description"/>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="inner">
            		<xsl:choose>
            			<xsl:when test="@ref">
            				<li><a href="{@ref}"><xsl:apply-templates/></a></li>
            			</xsl:when>
            			<xsl:when test="description">
            				<li><xsl:call-template name="innerlist"/></li>
            			</xsl:when>
            			<xsl:otherwise>
            				<li><xsl:apply-templates/></li>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="para" mode="inner">
            		<li class="para"><xsl:apply-templates/></li>
            	</xsl:template>
            
            	<xsl:template match="tag" mode="outer">
            		<xsl:call-template name="tag"/>
            	</xsl:template>
            
            	<xsl:template match="tag" mode="inner">
            		<xsl:call-template name="tag"/>
            	</xsl:template>
            
            	<xsl:template name="tag">
            		<blockquote class="tag">
            			<xsl:text>&lt;</xsl:text><xsl:if test="@href"><a href="{@href}"><xsl:value-of select="@name"/></a></xsl:if><xsl:if test="not(@href)"><xsl:value-of select="@name"/></xsl:if><xsl:for-each select="attr"><xsl:text> </xsl:text><xsl:value-of select="@name"/><xsl:text>="</xsl:text><xsl:value-of select="@value"/><xsl:text>"</xsl:text></xsl:for-each>
            			<xsl:choose>
            				<xsl:when test="tag"><xsl:text>&gt;</xsl:text><xsl:apply-templates mode="inner"/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
            				<xsl:when test="normalize-space(.) != ''"><xsl:text>&gt;</xsl:text><xsl:value-of select="."/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
            				<xsl:otherwise><xsl:text>/&gt;</xsl:text></xsl:otherwise>
            			</xsl:choose>
            		</blockquote>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • machine.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.2/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.2/components.xsl"/>
            
            	<xsl:template match="/machine">
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<p></p>
            						<div id="{@id}" class="machine {@class}js">
            							<xsl:call-template name="component">
            								<xsl:with-param name="machine" select="@id"/>
            								<xsl:with-param name="component" select="'machine'"/>
            								<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
            								<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            							</xsl:call-template>
            						</div>
            					</div>
            					<xsl:call-template name="commonBottom"/>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="debugger"><xsl:value-of select="@class"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • manifest.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2014-04-10" modified="2014-04-10" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.2/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.2/components.xsl"/>
            
            	<xsl:template match="/manifest[@type = 'document']">
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<h4>Document Manifest</h4>
            						<div class="common-sidebar">
            							<ul class="common-list-data">
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Title'"/>
            									<xsl:with-param name="node" select="title"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Version'"/>
            									<xsl:with-param name="node" select="version"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Source'"/>
            									<xsl:with-param name="node" select="source"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Documents'"/>
            									<xsl:with-param name="node" select="document"/>
            									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
            								</xsl:call-template>
            							</ul>
            						</div>
            						<div class="common-main">
            							<p><xsl:value-of select="desc"/></p>
            							<xsl:call-template name="commonBottom"/>
            						</div>
            					</div>
            				</div>
            			</body>
            		</html>
            	</xsl:template>
            
            	<xsl:template match="/manifest[@type = 'software' or not(@type)]">
            		<xsl:variable name="machineClass">
            			<xsl:choose>
            				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<h4>Software Manifest</h4>
            						<div class="common-sidebar">
            							<ul class="common-list-data">
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Title'"/>
            									<xsl:with-param name="node" select="title"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Version'"/>
            									<xsl:with-param name="node" select="version"/>
            									<xsl:with-param name="default">Unknown</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Type'"/>
            									<xsl:with-param name="node" select="type"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Category'"/>
            									<xsl:with-param name="node" select="category"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Created'"/>
            									<xsl:with-param name="node" select="creationDate"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Creators'"/>
            									<xsl:with-param name="node" select="creator"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label"><xsl:if test="creationDate">Updated</xsl:if><xsl:if test="not(creationDate)">Released</xsl:if></xsl:with-param>
            									<xsl:with-param name="node" select="releaseDate"/>
            									<xsl:with-param name="default">Unknown</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Company'"/>
            									<xsl:with-param name="node" select="company"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Authors'"/>
            									<xsl:with-param name="node" select="author"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Contributors'"/>
            									<xsl:with-param name="node" select="contributor"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Publisher'"/>
            									<xsl:with-param name="node" select="publisher"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'License'"/>
            									<xsl:with-param name="node" select="license"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Source'"/>
            									<xsl:with-param name="node" select="source"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Disks'"/>
            									<xsl:with-param name="node" select="disk"/>
            									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
            								</xsl:call-template>
            							</ul>
            						</div>
            						<div class="common-main">
            							<xsl:for-each select="machine[not(@type) or @type = 'default']">
            								<xsl:call-template name="machine">
            									<xsl:with-param name="href" select="@href"/>
            									<xsl:with-param name="state" select="@state"/>
            								</xsl:call-template>
            							</xsl:for-each>
            							<xsl:if test="not(machine[not(@type) or @type = 'default'])">
            								<p>No default machine specified for '<xsl:value-of select="title"/>' in manifest.xml</p>
            							</xsl:if>
            							<xsl:call-template name="commonBottom"/>
            						</div>
            					</div>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="machine/@debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            	<xsl:template name="listItem">
            		<xsl:param name="label"/>
            		<xsl:param name="node"/>
            		<xsl:param name="default">Unknown</xsl:param>
            		<xsl:if test="$node != '' or $default != ''">
            			<li><xsl:value-of select="$label"/>
            				<ul class="common-list-data-items">
            					<xsl:for-each select="$node">
            						<xsl:variable name="desc">
            							<xsl:choose>
            								<xsl:when test="desc"><xsl:value-of select="desc"/></xsl:when>
            								<xsl:when test="org"><xsl:value-of select="org"/></xsl:when>
            								<xsl:otherwise/>
            							</xsl:choose>
            						</xsl:variable>
            						<li title="{$desc}">
            							<xsl:variable name="value">
            								<xsl:choose>
            									<xsl:when test="name">
            										<xsl:value-of select="name"/>
            									</xsl:when>
            									<xsl:when test="normalize-space(./text()) != ''">
            										<xsl:value-of select="normalize-space(./text())"/>
            									</xsl:when>
            									<xsl:otherwise>
            										<xsl:value-of select="$default"/>
            									</xsl:otherwise>
            								</xsl:choose>
            							</xsl:variable>
            							<xsl:variable name="href">
            								<xsl:if test="@href"><xsl:value-of select="@href"/></xsl:if>
            							</xsl:variable>
            							<xsl:choose>
            								<xsl:when test="$href != ''">
            									<a href="{$href}"><xsl:value-of select="$value"/></a>
            								</xsl:when>
            								<xsl:otherwise>
            									<xsl:value-of select="$value"/>
            								</xsl:otherwise>
            							</xsl:choose>
            							<xsl:if test="page">
            								<ul class="common-list-data-subitems">
            									<xsl:for-each select="page">
            										<li>
            											<xsl:if test="@href">
            												<a href="{$href}{@href}"><xsl:value-of select="."/></a>
            											</xsl:if>
            											<xsl:if test="not(@href)">
            												<xsl:value-of select="."/>
            											</xsl:if>
            										</li>
            									</xsl:for-each>
            								</ul>
            							</xsl:if>
            						</li>
            					</xsl:for-each>
            					<xsl:if test="not($node)">
            						<xsl:if test="@href">
            							<a href="{@href}"><xsl:value-of select="$default"/></a>
            						</xsl:if>
            						<xsl:if test="not(@href)">
            							<xsl:value-of select="$default"/>
            						</xsl:if>
            					</xsl:if>
            				</ul>
            			</li>
            		</xsl:if>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • outline.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.2/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.2/document.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.2/components.xsl"/>
            
            	<xsl:template match="/outline">
            		<xsl:variable name="machineClass">
            			<xsl:choose>
            				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="title"/><xsl:text> | </xsl:text><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="documentStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<div class="page justified">
            						<xsl:apply-templates/>
            					</div>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • pc-dbg.js
            (function(){var f,ca,ea,fa={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
            function ga(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
            function h(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function k(a){return"0x"+h(a,2)}function ha(a){return"0x"+h(a,4)}function ia(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}
            function ja(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}var ka={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function la(a){return a.replace(/[&<>"']/g,function(a){return ka[a]})}function ma(a,b){var c="",d;for(d in a)d=d.replace(/([\\[\]*{}().+?])/g,"\\$1"),c+=(c?"|":"")+d;return b.replace(new RegExp("("+c+")","g"),function(b){return a[b]})}function na(a,b){return a+"                                        ".substr(0,b-a.length)}
            function oa(a){return String.prototype.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function qa(a,b,c){var d=0,e=a.length,g=0;for(void 0===c&&(c=function(a,b){return a>b?1:a<b?-1:0});d<e;){var l=d+e>>1,p;p=c(b,a[l]);0<p?d=l+1:(e=l,g=!p)}return g?d:~d}function ra(a,b,c){c=qa(a,b,c);0>c&&a.splice(-(c+1),0,b)}var ta=Date.now||function(){return+new Date};
            function ua(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var va=[31,28,31,30,31,30,31,31,30,31,30,31];function wa(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function xa(a,b){return(b&a.Mq)>>a.shift}
            function ya(a,b){var c;if(Array.prototype.indexOf)return a.indexOf(b,c);c=c||0;0>c&&(c+=a.length);0>c&&(c=0);for(var d=a.length;c<d;c++)if(c in a&&a[c]===b)return c;return-1}
            function za(a,b,c,d,e,g){b=!!b;var l=0,p=null,w=ia(a),v=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(v.onreadystatechange=function(){4===v.readyState&&(p=v.responseText,200==v.status||!v.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(l=v.status||-1),e&&(d?e.call(d,w,p,l,g):e(w,p,l,g)))});if(c){var E="",O;for(O in c)c.hasOwnProperty(O)&&(E&&(E+="&"),E+=O+"="+encodeURIComponent(c[O]));E=E.replace(/%20/g,"+");v.open("POST",
            a,b);v.setRequestHeader("Content-type","application/x-www-form-urlencoded");v.send(E)}else v.open("GET",a,b),v.send();a=[];b||(p=v.responseText,200!=v.status&&(l=v.status||-1),e&&(d?e.call(d,w,p,l,g):e(w,p,l,g)),a=[l,p]);return a}function Aa(){return"http://"+(window?window.location.host:"www.pcjs.org")}function Ca(a){window&&window.alert(a)}function Da(a){var b=!1;window&&(b=window.confirm(a));return b}var Ea=null;
            function Fa(){if(null==Ea){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}Ea=a}return Ea}function Ha(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function Ia(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
            function Ja(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}function Ka(a,b,c){function d(){--a;0<=a&&(b()||(a=0));0<a?setTimeout(d,0):c()}d()}
            function La(a,b){function c(){b(100===d)&&(e=setTimeout(c,d),d=100)}var d=0,e=null,g=!1;a.onmousedown=function(){g||e||(d=500,c())};a.ontouchstart=function(){e||(d=500,c())};a.onmouseup=a.onmouseout=function(){e&&(clearTimeout(e),e=null)};a.ontouchend=a.ontouchcancel=function(){e&&(clearTimeout(e),e=null);g=!0}}var Ma={init:[],show:[],exit:[]},Na=!1,Oa=!0;function Pa(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Qa(a){Ma.init.push(a)}
            function Sa(a){if(Oa)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){Ca("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Ta(a){!Oa&&a?(Oa=!0,Na&&Va("init")):Oa=a}function Va(a){Ma[a]&&Sa(Ma[a])}Pa("onload",function(){Na=!0;Sa(Ma.init)});Pa("onpageshow",function(){Sa(Ma.show)});Pa(Ja("Opera")||Ja("iOS")?"onunload":"onbeforeunload",function(){Sa(Ma.exit)});
            function Wa(a,b,c,d){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Dn=b.comment;this.fs=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.ao=this.id.substr(0,b),this.Jg=this.id.substr(b+1)):this.Jg=this.id;this[a]=c;this.fa={Bg:!1,Zc:!1,dl:!1,hc:!1,Kd:!1};this.dj=null;this.fa.Kd=!1;this.va={};this.Y=null;this.Xb=d||-1;Xa[Xa.length]=this}var $a=void 0,ab={};
            if(window){$a||($a=window.location.search.substr(1));for(var bb,cb=/\+/g,db=/([^&=]+)=?([^&]*)/g;bb=db.exec($a);)ab[decodeURIComponent(bb[1].replace(cb," "))]=decodeURIComponent(bb[2].replace(cb," "))}function eb(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
            function fb(a,b){b||(b=Wa);a.prototype=eb(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Xa=[];function gb(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Xa.length;b++){var d=Xa[b];a&&d.id.indexOf(a)||c.push(d)}return c}function hb(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Xa.length;c++)if(Xa[c].id===a)return Xa[c]}return null}
            function ib(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Xa.length;d++)if(c)c==Xa[d]&&(c=null);else if(!(a!=Xa[d].type||b&&Xa[d].id.indexOf(b)))return Xa[d]}return null}function jb(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){Ca(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
            function kb(a,b){for(var c=lb(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,g=0;g<e.length;g++){var l=e[g];if(l.nodeType===window.document.ELEMENT_NODE){var p=l.getAttribute("class");if(p)for(var w=p.split(" "),v=0;v<w.length;v++)switch(p=w[v],p){case "pcjs-binding":(p=jb(l))&&p.binding&&a.Lb(p.type,p.binding,l),v=w.length}}}}
            function lb(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
            Wa.prototype={constructor:Wa,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Lb:function(a,b,c){switch(b){case "clear":return this.va[b]||(this.va[b]=c,c.onclick=function(a){return function(){a.va.print&&(a.va.print.value="")}}(this)),!0;case "print":return this.va[b]||(this.Gh=this.va[b]=c,c.value="",this.R=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
            this.Da=function(a,b,c){this.R(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},R:function(){},status:function(a){this.R(this.Jg+": "+a)},Da:function(a,b){b||Ca(a)},kc:function(){return this.fa.hc=!0},jc:function(a,b){b&&(this.fa.hc=!1);return!0},qa:function(a){if(this.Y){a=this===this.Y?a|0:a||this.Xb;var b=this.Y.Xb&a;return b===a||!!(b&this.Y.$o)}return!1},$a:function(a,b,c){return this.Y?((!0===b||this.qa(b|0))&&this.Y.message(a,c),!0):!1}};
            function m(a,b,c,d,e,g,l){a.Y&&(!0===l?l=0:null==l&&(l=a.Xb),mb(a.Y,a,b,c,d,e,g,l))}function nb(a,b){if(a.fa.dl)return a.fa.Zc&&(a.fa.Zc=!1),a.fa.dl=!1;if(a.fa.Kd)return a.R(a.toString()+" error"),!1;a.fa.Zc=b;return a.fa.Zc}function ob(a,b){a.fa.Zc&&(b?a.fa.dl=!0:void 0===b&&a.R(a.toString()+" busy"));return a.fa.Zc}function pb(a,b){if(!a.fa.Kd&&(a.fa.Bg=!1!==b,a.fa.Bg)){var c=a.dj;a.dj=null;c&&c()}}function qb(a,b){b&&(a.fa.Bg?b():a.dj=b);return a.fa.Bg}function sb(a,b){a.fa.Kd=!0;a.Da(b)}
            var tb="undefined"!==typeof ArrayBuffer;function ub(a){Wa.call(this,"Panel",a,ub);this.canvas=null;this.Me=this.Ne=this.Rh=-1}fb(ub);function vb(a,b,c,d){this.Yf=[a,b,c,d];this.uk=null;void 0===a&&(this.Yf[0]=256*Math.random()|0,this.Yf[1]=256*Math.random()|0,this.Yf[2]=256*Math.random()|0,this.Yf[3]=255,this.uk=null)}vb.prototype.toString=function(){this.uk||(this.uk="#"+h(this.Yf[0],2)+h(this.Yf[1],2)+h(this.Yf[2],2));return this.uk};function wb(a,b,c,d){this.x=a;this.y=b;this.Wc=c;this.md=d}
            wb.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Wc&&b>=this.y&&b<this.y+this.md};function xb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new wb(a.x,a.y,a.Wc,a.md*b/c|0),a.y+=b.md,a.md-=b.md):(b=new wb(a.x,a.y,a.Wc*b/c|0,a.md),a.x+=b.Wc,a.Wc-=b.Wc);return b}f=ub.prototype;f.Lb=function(a,b,c){return this.Fa&&this.Fa.Lb(a,b,c)||this.O&&this.O.Lb(a,b,c)||this.Ka&&this.Ka.Lb(a,b,c)||this.Y&&this.Y.Lb(a,b,c)?!0:this.parent.Lb.call(this,a,b,c)};
            f.Ic=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;this.Ka=yb(a,"Keyboard")};f.kc=function(a,b){b||zb();return!0};f.jc=function(){return!0};f.Xk=function(a,b){a.button||(this.Rh=b?0:-1,Ab(this,a,b))};f.ho=function(a){Ab(this,a)};
            function Ab(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,g=a.canvas.getBoundingClientRect(),d=(b.clientX-g.left)*d|0;b=(b.clientY-g.top)*e|0;null==c&&(a.Rh||(a.Rh=Math.abs(a.Me-d)>Math.abs(a.Ne-b)?1:2),1==a.Rh?b=a.Ne:2==a.Rh&&(d=a.Me));a.Me=d;a.Ne=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.kb&&a.kb.mg)for(g=0;g<a.kb.mg.length;g++)if(e=a.kb.mg[g],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.kb.qh[g],l=xa(Bb.uo,a.kb.Bk[d.Bp]),g=l*a.ma.lb,d=(l+d.pe)*a.ma.lb-1;0<b&&(g+=e.Wc*(b-
            1)*a.xo);g+=c*a.xo;g|=0;g>d&&(g=d);c=g;break a}c=n}c!==n&&(c&=-16,c!=a.mn&&(Cb(a,c,!0),a.mn=c))}}
            f.yd=function(){if(this.canvas&&this.Ti&&this.Ze&&this.If){var a=this.Ze.width,b=this.Ze.height;this.If.fillStyle="black";this.If.fillRect(0,0,a,b);Db(this,18,this.Ze,this.If,this.canvas.style.color);Gb(this,3);Hb(this,"CPU");Hb(this,"Target");Hb(this,"Current");Jb(this);Hb(this,this.O.la);Hb(this,Kb(this.O));Hb(this,Lb(this.O));Jb(this,2);Gb(this,8);this.Vq=16;this.Wq=4;Hb(this,"AX",this.O.F,2);Hb(this,"DS",this.O.ab.ia,0,1);Hb(this,"DX",this.O.H,2);Hb(this,"SI",this.O.K,0,1.5);Hb(this,"BX",this.O.D,
            2);Hb(this,"ES",this.O.Na.ia,0,1);Hb(this,"CX",this.O.G,2);Hb(this,"DI",this.O.J,0,1.5);Hb(this,"CS",Mb(this.O),2);Hb(this,"SS",this.O.ua.ia,0,1);Hb(this,"IP",q(this.O),2);Hb(this,"SP",r(this.O),0,1.5);var c;Hb(this,"PS",c=Nb(this.O),2);Hb(this,"BP",this.O.L,0,1.5);Gb(this,9);Hb(this,"V"+(c&Ob?1:0));Hb(this,"D"+(c&Pb?1:0));Hb(this,"I"+(c&Qb?1:0));Hb(this,"T"+(c&Rb?1:0));Hb(this,"S"+(c&Sb?1:0));Hb(this,"Z"+(c&Tb?1:0));Hb(this,"A"+(c&Ub?1:0));Hb(this,"P"+(c&Vb?1:0));Hb(this,"C"+(c&Wb?1:0),0,2);Cb(this,
            this.mn);this.Ti.drawImage(this.Ze,0,0,a,b,this.Du,this.Gu,this.bu,this.eu)}};function Xb(a,b,c,d){a.kb.qh[a.kb.xn++]={Bp:b,pe:c,type:d};return wa(Bb,b,c,0,d)}
            function Cb(a,b,c){if(a.Ti&&a.Ze&&a.If){var d=a.Ze.width;a.If.fillStyle="black";a.If.fillRect(0,360,d,360);Db(a,378,a.Ze,a.If,a.canvas.style.color);Gb(a,24);if(null==b)Hb(a,"Mouse over memory to dump");else{Hb(a,"0x"+h(b),null,0,1);for(var e=1;16>=e;e++){for(var g="",l=1;8>=l;l++){var p=Yb(a.ma,b++);Hb(a,h(p,2),null,1);g+=32<=p&&128>p?String.fromCharCode(p):"."}Hb(a,g,null,0,1)}}c&&a.Ti.drawImage(a.Ze,0,360,d,360,a.Bu,a.Eu,a.$t,a.cu)}}
            function Db(a,b,c,d,e){var g,l=a.$s=10;a.zd=l;a.ig=b;a.Gg=a.Yn=18;g||(g=a.Un||a.Yn+"px Monaco, Lucida Console, Courier New");a.ej=a.Un=g;c&&(a.bp=c);d&&(a.Zd=d,a.hp=e||"white")}function Gb(a,b){a.Yk=a.bp.width/b|0}function Jb(a,b){a.zd=a.$s;a.ig+=(a.Gg+2)*(b||1)}function Hb(a,b,c,d,e){a.Zd.font=a.ej;a.Zd.fillStyle=a.hp;a.Zd.fillText(b,a.zd,a.ig);a.zd+=a.Yk;null!=c&&(b=c.toString(),16==a.Vq&&(b="0x"+h(c,a.Wq)),a.Zd.fillText(b,a.zd,a.ig),a.zd+=a.Yk);d&&(a.zd+=a.Yk*d);e&&Jb(a,e)}
            function zb(){for(var a=!1,b=lb(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=jb(d),g=hb(e.id);g||(a=!0,g=new ub(e));kb(g,d);a&&pb(g)}}Qa(zb);
            function Zb(a,b,c){Wa.call(this,"Bus",a,Zb);this.O=b;this.Y=c;this.ze=a.buswidth||20;this.Hk=Math.pow(2,this.ze);this.Th=this.Cb=this.Hk-1|0;this.Ca=32==this.ze||20>=this.ze?12:24>=this.ze?14:15;this.lb=1<<this.Ca;this.ko=this.lb>>2;this.Ga=this.lb-1;this.ye=this.Hk/this.lb|0;this.sd=this.ye-1;this.je=[];this.ke=[];this.Oh=this.Ph=!1;this.sl();pb(this)}fb(Zb);var Bb,$b={uo:20,count:8,Yt:1,type:3},ac=0,bc;for(bc in $b){var cc=$b[bc];$b[bc]={Mq:(1<<cc)-1<<ac,shift:ac};ac+=cc}Bb=void 0;f=Zb.prototype;
            f.sl=function(){var a=new t;this.na=Array(this.ye);for(var b=0;b<this.ye;b++)this.na[b]=a;this.O.sl(this.na,this.Ca);a=this.O;a.Cb=a.Ce=this.Cb};f.reset=function(){dc(this,!0)};f.kc=function(a,b){b||this.reset();return!0};
            function ec(a,b,c,d,e){for(var g=b>>>a.Ca;0<c&&g<a.na.length;){var l=a.na[g],p=g*a.lb,w=c>a.lb?a.lb:c;if(l&&l.size){if(l.type==d&&l.Z==e){if(b+c<=l.Ba)return l.eg+=l.Ba-b,l.Ba=b,!0;if(b>=l.Ba+l.eg){w=l.size-(b-p);w>c&&(w=c);l.eg=b-l.Ba+w;c-=w;b=p+a.lb;continue}}return fc(1,b,c)}l=a.na[g++]=new t(b,w,a.lb,d,e);a.Y&&gc(l,a.Y,b,a.lb);c-=w;b=p+a.lb}return 0<c?fc(2,b,c):!0}
            function dc(a,b){if(32==a.ze)b?a.jg&&(hc(a,1048576,1048576,a.jg),a.jg=null):a.jg||(a.jg=ic(a,1048576,1048576),hc(a,1048576,1048576,ic(a,0,1048576)));else if(20<a.ze){var c=a.Cb&-1048577|(b?1048576:0);if(c!=a.Cb&&(a.Cb=c,a.O)){var d=a.O;d.Cb=d.Ce=c}}}f.wk=function(a,b,c){if(!(a&this.Ga||!b||b&this.Ga)){for(var d=a>>>this.Ca;0<b;){var e=this.na[d];if(!e.Z)return fc(5,a,b);e.Rd(c);b-=this.lb;d++}return!0}return fc(3,a,b)};
            function jc(a,b,c){if(!(b&a.Ga||!c||c&a.Ga)){for(var d=b>>>a.Ca;0<c;){b=d*a.lb;var e=a.na[d++]=new t(b);a.Y&&gc(e,a.Y,b,a.lb);c-=a.lb}return!0}return fc(4,b,c)}function ic(a,b,c){var d=[];for(b>>>=a.Ca;0<c&&b<a.na.length;)d.push(a.na[b++]),c-=a.lb;return d}function hc(a,b,c,d,e){for(var g=0,l=b>>>a.Ca;0<c&&l<a.na.length;){var p=d[g++];if(!p)break;if(void 0!==e){var w=new t(b);a.Y&&gc(w,a.Y,b,a.lb);w.clone(p,e);p=w}a.na[l++]=p;c-=a.lb}}
            f.Ra=function(a){return this.na[(a&this.Cb)>>>this.Ca].sc(a&this.Ga,a)};function Yb(a,b){return a.na[(b&a.Cb)>>>a.Ca].Wg(b&a.Ga,b)}f.ra=function(a){var b=a&this.Ga,c=(a&this.Cb)>>>this.Ca;return b!=this.Ga?this.na[c].gi(b,a):this.na[c++].sc(b,a)|this.na[c&this.sd].sc(0,a+1)<<8};function kc(a,b){var c=b&a.Ga,d=(b&a.Cb)>>>a.Ca;return c!=a.Ga?a.na[d].Km(c,b):a.na[d++].Wg(c,b)|a.na[d&a.sd].Wg(0,b+1)<<8}
            f.de=function(a){var b=a&this.Ga,c=(a&this.Cb)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Bc(b,a);var d=(b&3)<<3;return this.na[c].Bc(b&-4,a)>>>d|this.na[c+1&this.sd].Bc(0,a+3)<<32-d};f.cd=function(a,b){this.na[(a&this.Cb)>>>this.Ca].Ec(a&this.Ga,b&255,a)};f.Ib=function(a,b){var c=a&this.Ga,d=(a&this.Cb)>>>this.Ca;c!=this.Ga?this.na[d].ri(c,b&65535,a):(this.na[d++].Ec(c,b&255,a),this.na[d&this.sd].Ec(0,b>>8&255,a+1))};
            function lc(a,b,c){var d=b&a.Ga,e=(b&a.Cb)>>>a.Ca;d!=a.Ga?a.na[e].Ym(d,c&65535,b):(a.na[e++].qi(d,c&255,b),a.na[e&a.sd].qi(0,c>>8&255,b+1))}f.vk=function(a,b){var c=a&this.Ga,d=(a&this.Cb)>>>this.Ca;if(c<this.Ga-2)this.na[d].Le(c,b);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Bc(c,a);this.na[d].Le(c,e&~(-1<<g)|b<<g,a);d=d+1&this.sd;a+=3;e=this.na[d].Bc(0,a);this.na[d].Le(0,e&-1<<g|b>>>32-g,a)}};
            function mc(a){for(var b=0,c=[],d=0;d<a.ye;d++){var e=a.na[d];if(e.Ua||e.Ln){c[b++]=d;var g=b++;a:if(e=e.save()){for(var l=0,p=0,w=[];l<e.length;){for(var v=e[l],E=l+1;E<e.length&&e[E]===v;)E++;w[p++]=E-l;w[p++]=v;l=E}if(w.length<e.length){e=w;break a}}c[g]=e}}c[b]=!a.jg&&a.Th==a.Cb;return c}function nc(a,b){if(void 0===b)return a.Oh=!a.Oh,a.Oh;void 0===a.je[b]&&(a.je[b]=[null,null,!1]);a.je[b][2]=!a.je[b][2];return a.je[b][2]}
            function oc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,w=c[e];if(void 0!==w)for(var v=+e+d;v<=l;v++)void 0!==g.je[v]?Ca("Input port "+ha(v)+" registered by "+g.je[v][0].id+", ignoring "+p.id):g.je[v]=[p,w,!1,!1]}}function pc(a,b,c){var d=255,e=a.je[b];void 0!==e?(e[1]&&(c=e[1].call(e[0],b,c),void 0!==c&&(d=c)),a.Y&&a.Oh!=e[2]&&qc(a.Y,b,d)):a.Y&&(mb(a.Y,a,b,null,c),a.Oh&&qc(a.Y,b,d));return d}
            function rc(a,b){if(void 0===b)return a.Ph=!a.Ph,a.Ph;void 0===a.ke[b]&&(a.ke[b]=[null,null,!1]);a.ke[b][2]=!a.ke[b][2];return a.ke[b][2]}function sc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,w=c[e];if(void 0!==w)for(var v=+e+d;v<=l;v++)void 0!==g.ke[v]?Ca("Output port "+ha(v)+" registered by "+g.ke[v][0].id+", ignoring "+p.id):g.ke[v]=[p,w,!1,!1]}}
            function tc(a,b,c,d){var e=a.ke[b];void 0!==e?(e[1]&&e[1].call(e[0],b,c,d),a.Y&&a.Ph!=e[2]&&uc(a.Y,b,c)):a.Y&&(mb(a.Y,a,b,c,d),a.Ph&&uc(a.Y,b,c))}function fc(a,b,c){Ca("Memory block error ("+a+","+h(b)+","+h(c)+")");return!1}var vc;if(tb){var wc=new ArrayBuffer(2);(new DataView(wc)).setUint16(0,256,!0);vc=256===(new Uint16Array(wc))[0]}else vc=!1;var xc=vc;
            function t(a,b,c,d,e,g){this.id=yc+=2;this.ea=null;this.offset=0;this.Ba=a;this.eg=b;this.size=c||0;this.type=d||zc;this.ce=d==Ac;this.Z=null;this.O=g;this.Ua=this.Ln=!1;Bc(this);if(c)if(e)this.Z=e,a=e.Wn(a),this.ea=a[0],this.offset=a[1],this.Rd(e.pl());else if(tb)this.buffer=new ArrayBuffer(c),this.ef=new DataView(this.buffer,0,c),this.Vb=new Uint8Array(this.buffer,0,c),this.Di=new Uint16Array(this.buffer,0,c>>1),this.ea=new Int32Array(this.buffer,0,c>>2),this.Rd(xc?Cc:Dc);else{this.ea=Array(c>>
            2);for(e=0;e<this.ea.length;e++)this.ea[e]=0;this.Rd(Ec)}else this.Rd()}var zc=0,Ac=2,Fc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),Gc=["black","blue","green","cyan"],yc=0;function Hc(a){tb&&!xc&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
            t.prototype={constructor:t,parent:null,clone:function(a,b){this.id=a.id|1;this.eg=a.eg;this.size=a.size;b&&(this.type=b,this.ce=b==Ac);tb?(this.buffer=a.buffer,this.ef=a.ef,this.Vb=a.Vb,this.Di=a.Di,this.ea=a.ea,this.Rd(xc?Cc:Dc)):(this.ea=a.ea,this.Rd(Ec))},save:function(){var a,b;if(this.Z)a=null;else if(tb)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.ef.getInt32(b<<2,!0);else a=this.ea;return a},restore:function(a){if(this.Z)return null==a;if(a&&this.size==a.length<<2){var b;if(tb)for(b=
            0;b<a.length;b++)this.ef.setInt32(b<<2,a[b],!0);else this.ea=a;return this.Ua=!0}return!1},Rd:function(a){a||(a=5==this.type?Jc:6==this.type?Kc:Lc);Mc(this,a,!0);Nc(this,a,!0)},Ue:function(a,b){this.Y&&(b?0===this.zn++&&Nc(this,Oc):0===this.wn++&&Mc(this,Oc))},Ao:function(){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to read invalid block %"+h(this.Ba),!0);return 255},xf:function(a,b){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to write "+ha(b)+" to invalid block %"+h(this.Ba),!0)},Bo:function(a,
            b){return this.sc(a,b)|this.sc(a+1,b)<<8},yo:function(a,b){return this.sc(a,b)|this.sc(a+1,b)<<8|this.sc(a+2,b)<<16|this.sc(a+3,b)<<24},Uo:function(a,b){this.Ec(a,b&255);this.Ec(a+1,b>>8)},So:function(a,b){this.Ec(a,b&255);this.Ec(a+1,b>>8&255);this.Ec(a+2,b>>16&255);this.Ec(a+3,b>>>24)},ms:function(a){return this.ea[a>>2]>>>((a&3)<<3)&255},ys:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b]>>a;return 24>a?c&65535:c&255|(this.ea[b+1]&255)<<8},ss:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b];
            a&&(c=c>>>a|this.ea[b+1]<<32-a);return c},Ls:function(a,b){var c=a>>2,d=(a&3)<<3;this.ea[c]=this.ea[c]&~(255<<d)|b<<d;this.Ua=!0},Xs:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ea[c]=this.ea[c]&~(65535<<d)|b<<d:(this.ea[c]=this.ea[c]&16777215|b<<24,c++,this.ea[c]=this.ea[c]&-256|b>>8);this.Ua=!0},Rs:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ea[c]=this.ea[c]&~e|b<<d;c++;this.ea[c]=this.ea[c]&e|b>>>32-d}else this.ea[c]=b;this.Ua=!0},ks:function(a,b){this.Y&&Pc(this.Y,b);return this.Wg(a,
            b)},ws:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1));return this.Km(a,b)},qs:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1)||Pc(this.Y,b+2)||Pc(this.Y,b+3));return this.zo(a,b)},Js:function(a,b,c){this.Y&&Qc(this.Y,c);this.ce?this.xf(a,b,c):this.qi(a,b,c)},Vs:function(a,b,c){this.Y&&(Qc(this.Y,c)||Qc(this.Y,c+1));this.ce?this.xf(a,b,c):this.Ym(a,b,c)},Ps:function(a,b,c){this.Y&&(Qc(this.Y,this.Ba+a)||Qc(this.Y,this.Ba+a+1)||Qc(this.Y,this.Ba+a+2)||Qc(this.Y,this.Ba+a+3));this.ce?this.xf(a,
            b,c):this.To(a,b,c)},ns:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.sc(a,b)},zs:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.gi(a,b)},ts:function(a,b){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.oe;return this.qg.Bc(a,b)},Ms:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.Ec(a,b,c)},Ys:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.ri(a,
            b,c)},Ss:function(a,b,c){this.jd.ea[this.pd]|=this.oe;this.kd.ea[this.qd]|=this.Rk;this.qg.Le(a,b,c)},os:function(a,b){return(Rc(this.O,b,!1)||this).sc(a,b)},As:function(a,b){return(Rc(this.O,b,!1)||this).gi(a,b)},us:function(a,b){return(Rc(this.O,b,!1)||this).Bc(a,b)},Ns:function(a,b,c){(Rc(this.O,c,!0)||this).Ec(a,b,c)},Zs:function(a,b,c){(Rc(this.O,c,!0)||this).ri(a,b,c)},Ts:function(a,b,c){(Rc(this.O,c,!0)||this).Le(a,b,c)},js:function(a){return this.Vb[a]},ls:function(a){return this.Vb[a]},vs:function(a){return this.ef.getUint16(a,
            !0)},xs:function(a){return a&1?this.Vb[a]|this.Vb[a+1]<<8:this.Di[a>>1]},ps:function(a){return this.ef.getInt32(a,!0)},rs:function(a){return a&3?this.Vb[a]|this.Vb[a+1]<<8|this.Vb[a+2]<<16|this.Vb[a+3]<<24:this.ea[a>>2]},Is:function(a,b){this.Vb[a]=b;this.Ua=!0},Ks:function(a,b){this.Vb[a]=b;this.Ua=!0},Us:function(a,b){this.ef.setUint16(a,b,!0);this.Ua=!0},Ws:function(a,b){a&1?(this.Vb[a]=b,this.Vb[a+1]=b>>8):this.Di[a>>1]=b;this.Ua=!0},Os:function(a,b){this.ef.setInt32(a,b,!0);this.Ua=!0},Qs:function(a,
            b){a&3?(this.Vb[a]=b,this.Vb[a+1]=b>>8,this.Vb[a+2]=b>>16,this.Vb[a+3]=b>>24):this.ea[a>>2]=b;this.Ua=!0}};function Sc(a,b){a.Y&&(b?0===--a.zn&&(a.Ec=a.ce?a.xf:a.qi,a.ri=a.ce?a.xf:a.Ym,a.Le=a.ce?a.xf:a.To):0===--a.wn&&(a.sc=a.Wg,a.gi=a.Km,a.Bc=a.zo))}function Bc(a,b,c,d,e,g){a.qg=b;a.jd=c;a.pd=d>>2;a.kd=e;a.qd=g>>2;a.Rk=b?Hc(Tc|Uc):0;a.oe=b?Hc(Tc):0}function gc(a,b,c,d){a.Y=b;a.wn=a.zn=0;Vc(a.Y,c,d)}
            function Nc(a,b,c){a.Ec=!a.ce&&b[3]||a.xf;a.ri=!a.ce&&b[4]||a.Uo;a.Le=!a.ce&&b[5]||a.So;c&&(a.qi=b[3]||a.xf,a.Ym=b[4]||a.Uo,a.To=b[5]||a.So)}function Mc(a,b,c){a.sc=b[0]||a.Ao;a.gi=b[1]||a.Bo;a.Bc=b[2]||a.yo;c&&(a.Wg=b[0]||a.Ao,a.Km=b[1]||a.Bo,a.zo=b[2]||a.yo)}
            var Lc=[],Ec=[t.prototype.ms,t.prototype.ys,t.prototype.ss,t.prototype.Ls,t.prototype.Xs,t.prototype.Rs],Oc=[t.prototype.ks,t.prototype.ws,t.prototype.qs,t.prototype.Js,t.prototype.Vs,t.prototype.Ps],Kc=[t.prototype.ns,t.prototype.zs,t.prototype.ts,t.prototype.Ms,t.prototype.Ys,t.prototype.Ss],Jc=[t.prototype.os,t.prototype.As,t.prototype.us,t.prototype.Ns,t.prototype.Zs,t.prototype.Ts];
            if(tb)var Dc=[t.prototype.js,t.prototype.vs,t.prototype.ps,t.prototype.Is,t.prototype.Us,t.prototype.Os],Cc=[t.prototype.ls,t.prototype.xs,t.prototype.rs,t.prototype.Ks,t.prototype.Ws,t.prototype.Qs];
            function Wc(a,b){Wa.call(this,"CPU",a,Wc,1);var c=a.cycles||b,d=a.multiplier||1;this.T={};this.T.ee=c;this.T.Ae=d;this.T.gj=Math.round(this.T.ee/1E4)/100;this.T.Sh=this.T.gj*this.T.Ae;this.fa.qb=!1;this.fa.ll=!1;this.fa.cl=a.autoStart;this.fa.Mn=!1;c=ab.autostart;void 0!==c&&(this.fa.cl="true"==c?!0:"false"==c?!1:null);this.fa.yg=!1;this.T.Uh=this.T.Mg=0;this.T.Vh=a.csStart;this.T.Lg=a.csInterval;this.T.Ng=a.csStop;this.Bd=[];var e=this;this.er=function(){e.Zf()};pb(this)}fb(Wc);f=Wc.prototype;
            f.Ic=function(a,b,c,d){this.ma=b;this.Y=d;this.Fa=a;for(b=null;b=yb(a,"Video",b);)this.Bd.push(b);this.ja=yb(a,"ChipSet");pb(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.kc=function(a,b){if(!b){if(a&&this.restore){Xc(this);if(!this.restore(a))return!1;Yc(this)}else this.reset();this.Y?this.Y.Dq():this.R("No debugger detected")}Zc(this);return!0};f.jc=function(a){return a&&this.save?this.save():!0};
            function $c(a){(!0===a.fa.cl||null===a.fa.cl&&!a.Y&&void 0===a.va.run)&&a.Zf()}f.Vn=function(){return 0};function Yc(a){void 0===a.T.Vh&&(a.T.Vh=0);void 0===a.T.Lg&&(a.T.Lg=-1);void 0===a.T.Ng&&(a.T.Ng=-1);a.fa.yg=0<=a.T.Vh&&0<a.T.Lg;a.fa.yg&&(a.T.Uh=0,a.T.Mg=a.T.Vh-a.Uf)}function bd(a,b){if(a.fa.yg){var c=!1;a.T.Uh=a.T.Uh+a.Vn()|0;a.T.Mg-=b;0>=a.T.Mg&&(a.T.Mg+=a.T.Lg,c=!0);0<=a.T.Ng&&a.T.Ng<=cd(a)&&(a.T.Lg=a.T.Ng=-1,Yc(a),a.yb(),c=!0);c&&a.R(cd(a)+" cycles: checksum="+h(a.T.Uh))}}
            f.yd=function(){this.Fa&&this.Fa.Ee&&this.Fa.Ee.yd()};
            function dd(a){for(var b=0;b<a.Bd.length;b++)ed(a.Bd[b]);if(a.Fa&&a.Fa.Ee&&(a=a.Fa.Ee,a.wp)){Db(a,18,a.Bh,a.ip,a.canvas.style.color);if(a.iu){var b=a.ma,c=a.kb,d,e;null==d&&(d=0);null==e&&(e=b.Hk-d|0);null==c&&(c={Vk:0,pe:0,Bk:[]});var g=d>>>b.Ca;d=d+e-1>>>b.Ca;c.Vk=0;for(c.pe=0;g<=d;)e=b.na[g],c.Vk+=e.size,e.size&&(c.Bk.push(wa(Bb,g,0,0,e.type)),c.pe++),g++;a.kb=c;a.xo=a.kb.pe*a.ma.lb/691200;b=0;a.kb.xn=0;a.kb.qh||(a.kb.qh=[]);c=-1;d=0;var l=-1;for(e=0;e<a.kb.pe;e++){var p=a.kb.Bk[e],g=xa(Bb.type,
            p),p=xa(Bb.uo,p);if(g!=c||p!=l+1)(l=e-d)&&(b+=Xb(a,d,l,c)),c=g,d=e;l=p}b+=Xb(a,d,e-d,c);c=a.kb.gp!=b;a.kb.gp=b;if(c){c=new wb(0,0,a.Bh.width,a.Bh.height);a.kb.mg=[];d=a.kb.pe;for(b=0;b<a.kb.xn;b++)e=a.kb.qh[b].pe,a.kb.mg.push(xb(c,e,d,!b)),d-=e;for(b=0;b<a.kb.mg.length;b++)c=a.kb.qh[b],d=e=a.kb.mg[b],g=a.ip,(l=Gc[c.type])||(l=new vb),g.strokeStyle="black",g.strokeRect(d.x,d.y,d.Wc,d.md),g.fillStyle="string"==typeof l?l:l.toString(),g.fillRect(d.x,d.y,d.Wc,d.md),d=a,g=e,d.ej=d.Un,d.Gg=d.Yn,e=g.x+(g.Wc>>
            1),l=g.y+(g.md>>1),p=g.md,g.Wc<g.md&&(p=g.Wc,d.Sn=!0,d.Zd.save(),d.Zd.translate(e,l),d.Zd.rotate(-Math.PI/2),e=l=0),p<d.Gg&&(d.Gg=p,d.ej=d.Gg+"px Monaco, Lucida Console, Courier New"),g=l,d.zd=e,d.ig=g,d=a,c=Fc[c.type]+" ("+(c.pe*a.ma.lb/1024|0)+"Kb)",d.Zd.font=d.ej,d.zd-=d.Zd.measureText(c).width>>1,d.ig+=(d.Gg>>1)-2,Hb(d,c),d.Sn&&(d.Zd.restore(),d.Sn=!1)}}else Hb(a,"This space intentionally left blank");a.Ti.drawImage(a.Bh,0,0,a.Bh.width,a.Bh.height,a.Cu,a.Fu,a.au,a.du);a.wp=!1}}
            f.dd=function(){this.Bd.length&&this.Bd[0].dd()};
            f.Lb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.va[b]=c;c.onclick=function(){var a;if(a=d.Fa)if(a=d.Fa,a.fa.hc)a=!0;else{var b=null,c,p=gb(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.fa.Bg);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.fa.hc);c++);c==p.length&&(b=a);Ca("The "+b.type+" component ("+b.id+") is not "+(b.fa.Bg?"powered yet":"ready yet"+(b.dj?" (waiting for notification)":""))+".");a=!1}a&&(d.fa.qb?d.yb(!0):d.Zf(!0))};a=!0;break;case "reset":this.va[b]=c;c.onclick=
            function(){d.Fa&&fd(d.Fa)};a=!0;break;case "speed":this.va[b]=c;a=!0;break;case "setSpeed":this.va[b]=c,c.onclick=function(){gd(d,d.T.Ae<<1,!0)},c.textContent=Kb(this),a=!0}return a};function hd(a,b){if(a.fa.qb){var c=a.A-b;a.A-=c;a.td-=c}}function id(a,b,c){a.Uf+=b;c&&(a.td=a.A=0)}
            function jd(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.T.Ae&&a.T.kf&&(d=a.T.kf/a.T.gj);a.T.io=Math.round(1E3/30);a.T.Tq=Math.floor(a.T.ee/c*d);a.T.zl=Math.floor(a.T.ee/30*d);a.T.no=Math.floor(a.T.ee/60*d);a.T.mo=Math.floor(a.T.ee/2*d);b||(a.T.Og=a.T.zl,a.T.Xh=a.T.no,a.T.Wh=a.T.mo);a.T.Al=0}function cd(a,b){var c=a.Uf+a.of+a.td-a.A;b&&1<a.T.Ae&&a.T.kf>a.T.gj&&(c=Math.round(c/a.T.Ae));return c}function Xc(a){a.T.kf=0;a.Uf=a.of=a.td=a.A=0;Yc(a);gd(a,1)}
            function Lb(a){return a.fa.qb&&a.T.kf?a.T.kf.toFixed(2)+"Mhz":"Stopped"}function Kb(a){return a.T.Sh.toFixed(2)+"Mhz"}function gd(a,b,c){if(void 0!==b){.8>a.T.kf/a.T.Sh&&(b=1);a.T.Ae=b;b=a.T.gj*a.T.Ae;if(a.T.Sh!=b){a.T.Sh=b;b=Kb(a);var d=a.va.setSpeed;d&&(d.textContent=b);a.R("target speed: "+b)}c&&a.dd()}id(a,a.of);a.of=0;a.T.Kg=ta();a.T.Rf=0;jd(a)}
            f.Zf=function(a){if(nb(this,!0)){if(!this.fa.qb){gd(this);this.Fa&&this.Fa.start(this.T.Kg,cd(this));this.fa.qb=!0;this.fa.ll=!0;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Halt");this.yd(!0);a&&this.dd()}this.T.Al>=this.T.ee&&jd(this,!0);this.T.Yh=0;this.T.hj=ta();this.T.Rf&&(a=this.T.hj-this.T.Rf,a>this.T.io&&(this.T.Kg+=a,this.T.Kg>this.T.hj&&(this.T.Kg=this.T.hj)));try{do{var c=this.fa.yg?1:this.T.Tq;if(this.ja){ld(this.ja);var d=this.ja;a=c;var e=d.Nb[0];if(e.Of){var g=(cd(d.O,
            d.ff)-e.Nd)/d.dk|0,l=md(d,0)-g;6==e.mode&&(l-=g);var p=l*d.dk|0;6==e.mode&&(p>>=1);a>p&&(a=p)}var c=a,w=this.ja;a=c;if(w.ga&&w.ga[11]&64){var v=w.Vg-cd(w.O,w.ff);0<v&&a>v&&(a=v)}c=a}this.ih(c);var E=this.td-this.A;this.of+=E;this.T.Yh+=E;id(this,0,!0);bd(this,E);this.T.Xh-=E;0>=this.T.Xh&&(this.T.Xh+=this.T.no,dd(this));this.T.Wh-=E;0>=this.T.Wh&&(this.T.Wh+=this.T.mo,this.yd());this.T.Og-=E;if(0>=this.T.Og){this.T.Og+=this.T.zl;break}}while(this.fa.qb)}catch(O){this.yb();Zc(this);this.Fa&&this.Fa.stop(ta(),
            cd(this));nb(this,!1);sb(this,O.stack||O.message);return}c=setTimeout;d=this.er;this.T.Rf=ta();e=this.T.io;this.T.Yh&&(e=Math.round(e*this.T.Yh/this.T.zl));e-=this.T.Rf-this.T.hj;if(g=this.T.Rf-this.T.Kg)this.T.kf=Math.round(this.of/(10*g))/100,864E5<=g&&(this.Uf=0,this.ja&&ld(this.ja,!0),gd(this));if(0>e||this.T.kf<this.T.Sh)e=0;this.T.Al+=this.T.Yh;this.T.Rf+=e;c(d,e)}else Zc(this),this.Fa&&this.Fa.stop(ta(),cd(this))};f.ih=function(){return 0};
            f.yb=function(a){ob(this,!0);this.td-=this.A;this.A=0;id(this,this.of);this.of=0;if(this.fa.qb){this.fa.qb=!1;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Run")}this.fa.ue=a};function Zc(a){dd(a);a.yd()}var n=-1,Wb=1,Vb=4,Ub=16,Tb=64,Sb=128,Rb=256,Qb=512,Pb=1024,Ob=2048,Uc=64,Tc=32,nd=Rb|Qb|Pb,od=Wb|Vb|Ub|Tb|Sb|Ob,pd=Wb|Vb|Ub|Tb|Sb;
            function qd(a,b,c,d){this.O=a;this.Y=a.Y;this.id=b;this.ni=c||"";this.ia=0;this.fb=65535;this.qf=this.fb+1;this.Qa=this.zc=this.Jh=this.Pb=this.type=this.ya=0;this.Dd=n;this.pa=this.Gd=2;this.C=this.V=65535;this.on=this.id==rd?Array(32):[];this.el=null;this.cj=!1;sd(this,!0,d)}var rd=1;f=qd.prototype;f.Lq=function(a){this.ia=a&65535;return this.ya=this.ia<<4};
            f.Kq=function(a,b){var c,d,e=this.O;a&=65535;a&4?(c=e.xd.ya,d=c+e.xd.fb|0):(c=e.Ed,d=e.zf);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),td(this,c,a,b);b||ud.call(e,13,a)}return n};f.Jq=function(a){var b=this.O;a=b.Fd+(a<<2);var c=b.ra(a);b.aa&=~(Rb|Qb);return this.load(b.ra(a+2))+c|0};f.Iq=function(a){var b=this.O;a<<=3;var c=b.Fd+a|0;if(7<=(b.Af-c|0))return td(this,c,a)+b.Nm;ud.call(b,13,a|3,!0);return n};f.dp=function(a){return this.ya+a|0};f.fp=function(a){return this.ya+a|0};
            f.Bn=function(a,b,c){return(a>>>0)+b<=this.qf?this.ya+a|0:this.Qi(0,0,c)};f.cp=function(a,b,c){return(a>>>0)+b>this.qf?this.ya+a|0:this.Qi(0,0,c)};f.Qi=function(a,b,c){c||ud.call(this.O,13,0);return n};f.Cn=function(a,b,c){return(a>>>0)+b<=this.qf?this.ya+a|0:this.Ri(0,0,c)};f.ep=function(a,b,c){return(a>>>0)+b>this.qf?this.ya+a|0:this.Ri(0,0,c)};f.Ri=function(a,b,c){c||ud.call(this.O,13,0);return n};
            function vd(a,b,c){var d=a.O,e=d.ra(b+2),g=d.ra(b)|(e&255)<<16,d=d.ra(b+4);a.ia=c;a.ya=g;a.fb=d;a.qf=(d>>>0)+1;a.Pb=e;a.type=e&7936;a.Jh=0;a.Dd=b;sd(a,!0)}
            function td(a,b,c,d){var e=a.O,g=e.ra(b+0),l=e.ra(b+4),p=l&7936,w=e.ra(b+2)|(l&255)<<16,v=e.ra(b+6),E=c&65528;80386<=e.la&&(w|=(v&65280)<<16,g|=(v&15)<<16,v&128&&(g=g<<12|4095));for(;;){var O,J,G;if(a.id==rd){a.cj=!1;O=a.el;var S,X;G=c&3;var T=(l&24576)>>13;if(E&&!(l&32768)){d||ud.call(e,11,c);w=n;break}if(6144<=p){G=c&3;if(G>a.Qa){if(!1!==O&&!(T==a.Qa||p&1024&&T<=a.Qa)){w=n;break}E=e.La();wd(e,e.La(),!0);u(e,E);a.cj=!0}S=!1}else{if(256==p){if(!xd(a,c,O)){w=n;break}return a.ya}if(1024==p)S=!0,X=-1,
            J=c,G<a.Qa&&(G=a.Qa);else if(1536==p)S=!0,X=~(16384|Rb|Qb),J=c|1;else if(1792==p)S=!0,X=~(16384|Rb),J=c|1;else if(1280==p){if(!xd(a,w&65535,O)){w=n;break}return a.ya}}if(S){b=w&65535;if(G<=T){d=a.Qa;if(a.load(b,!0)===n){w=n;break}e.Nm=g;if(a.Qa<d){if(!0!==O){w=n;break}E=r(e);g=0;for(l&=31;l--;)a.on[g++]=yd(e,e.ua,E),E+=2;l=e.bb.ya;O=(a.Qa<<2)+2;d=O+2;G=e.ua.ia;J=r(e);wd(e,e.ra(l+d),!0);u(e,e.ra(l+O));x(e,G);for(x(e,J);g;)x(e,a.on[--g]);a.cj=!0}e.aa&=X;return a.ya}d||ud.call(e,13,J,!0);w=n;break}else if(!1!==
            S){d||ud.call(e,13,c,!0);w=n;break}}else if(2==a.id){if(E){if(!(l&32768)){d||ud.call(e,11,c);w=n;break}if(4096>p||2048==(p&2560)){d||ud.call(e,13,c,!!l);w=n;break}}}else if(3==a.id){if(!(l&32768)){d||ud.call(e,12,c);w=n;break}if(!E||4096>p||512!=(p&2560)){d||ud.call(e,13,c,!0);w=n;break}}else if(4==a.id){if(!E||256!=p&&768!=p){d||ud.call(e,10,c,!0);w=n;break}}else if(6==a.id&&!(p&4096)&&768<p){w=n;break}a.ia=c;a.ya=w;a.fb=g;a.qf=(g>>>0)+1;a.Pb=l;a.type=p;a.Jh=v;a.Dd=b;sd(a,!0);break}return w}
            function xd(a,b,c){var d=a.O,e=d.bb.ya,g=a.Qa,l=d.bb.ia;if(!c){if(768!=d.bb.type)return ud.call(d,10,b,!0),!1;d.Ib(d.bb.Dd+4,d.bb.Pb&-769|256)}if(d.bb.load(b)===n)return!1;var p=d.bb.ya;if(!1===c){if(768!=d.bb.type)return ud.call(d,13,b,!0),!1}else{if(768==d.bb.type)return ud.call(d,13,b,!0),!1;d.Ib(d.bb.Dd+4,d.bb.Pb|=768);d.bb.type=768}d.Ib(e+14,q(d));d.Ib(e+16,Nb(d));d.Ib(e+18,d.F);d.Ib(e+20,d.G);d.Ib(e+22,d.H);d.Ib(e+24,d.D);d.Ib(e+26,r(d));d.Ib(e+28,d.L);d.Ib(e+30,d.K);d.Ib(e+32,d.J);d.Ib(e+34,
            d.Na.ia);d.Ib(e+36,d.ta.ia);d.Ib(e+38,d.ua.ia);d.Ib(e+40,d.ab.ia);d.xd.load(d.ra(p+42));Ad(d,d.ra(p+16)|(c?16384:0));d.F=d.ra(p+18);d.G=d.ra(p+20);d.H=d.ra(p+22);d.D=d.ra(p+24);d.L=d.ra(p+28);d.K=d.ra(p+30);d.J=d.ra(p+32);d.Na.load(d.ra(p+34));d.ab.load(d.ra(p+40));Bd(d,d.ra(p+14),d.ra(p+36));b=38;e=26;a.Qa<g&&(e=(a.Qa<<2)+2,b=e+2);wd(d,d.ra(p+b),!0);u(d,d.ra(p+e));c&&d.Ib(p+0,l);d.ob|=8;return!0}
            f.save=function(){return[this.ia,this.ya,this.fb,this.Pb,this.id,this.ni,this.Qa,this.zc,this.Dd,this.Gd,this.V,this.pa,this.C,this.type,this.qf]};f.restore=function(a){"number"==typeof a?this.load(a):(this.ia=a[0],this.ya=a[1],this.fb=a[2],this.Pb=a[3],this.id=a[4],this.ni=a[5],this.Qa=a[6],this.zc=a[7],this.Dd=a[8],this.Gd=a[9]||2,this.V=a[10]||65535,this.pa=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Pb&7936,this.qf=a[14]||(this.fb>>>0)+1)};
            function sd(a,b,c){void 0===c&&(c=!!(a.O.ob&1));a.zg=!1;if(c){a.load=a.Kq;a.co=a.Iq;a.yc=a.Bn;a.nc=a.Cn;if(!(a.ia&-4))a.yc=a.Qi,a.nc=a.Ri;else if(a.type&4096){6144==(a.type&6656)&&(a.yc=a.Qi);if(a.type&2048||!(a.type&512))a.nc=a.Ri;1024==(a.type&3072)&&(a.yc==a.Bn&&(a.yc=a.cp),a.nc==a.Cn&&(a.nc=a.ep),a.zg=!0)}b&&(a.ia&-4&&a.Dd!==n&&(b=a.Dd+5,a.O.cd(b,a.O.Ra(b)|1)),a.Qa=a.ia&3,a.zc=(a.Pb&24576)>>13,80386>a.O.la||!(a.Jh&64)?(a.pa=2,a.C=65535):(a.pa=4,a.C=-1),a.Gd=a.pa,a.V=a.C)}else a.load=a.Lq,a.co=
            a.Jq,a.yc=a.dp,a.nc=a.fp,a.Qa=a.zc=0,a.Dd=n}
            function Cd(a){this.la=a.model||8088;var b=0;switch(this.la){default:b=4772727;break;case 80286:b=6E6;break;case 80386:b=16E6}Wc.call(this,a,b);this.cn=61442;this.ti=nd;this.si=4;this.Gb=255;this.B=80386==this.la?Dd:80286==this.la?Ed:Fd;this.Pa=Hd;this.fn=Id;this.gn=Jd;this.hn=Kd;if(80186<=this.la&&(this.Pa=Hd.slice(),this.fn=Id.slice(),this.gn=Jd.slice(),this.Gb=31,this.Pa[15]=Ld,this.Pa[96]=Md,this.Pa[97]=Nd,this.Pa[98]=Od,this.Pa[99]=Ld,this.Pa[100]=Ld,this.Pa[101]=Ld,this.Pa[102]=Ld,this.Pa[103]=
            Ld,this.Pa[104]=Pd,this.Pa[105]=Qd,this.Pa[106]=Rd,this.Pa[107]=Sd,this.Pa[108]=Td,this.Pa[109]=Ud,this.Pa[110]=Vd,this.Pa[111]=Wd,this.Pa[192]=Xd,this.Pa[193]=Yd,this.Pa[200]=Zd,this.Pa[201]=$d,this.Pa[241]=ae,this.fn[7]=be,this.gn[7]=be,80286<=this.la)){this.cn=2;this.ti|=28672;this.si=0;this.Pa[15]=ce;this.ph=de.slice();for(a=0;a<this.ph.length;a++)this.ph[a]||(this.ph[a]=ee);this.Pa[84]=fe;this.Pa[99]=ge;if(80386<=this.la){var c;this.Pa[100]=he;this.Pa[101]=ie;this.Pa[102]=je;this.Pa[103]=ke;
            for(c in y)this.ph[+c]=y[c]}}this.wi=[];this.xi=[];this.td=this.zh=0;this.fa.ue=this.fa.Kn=!1;this.vn=0;this.Pe=this.na=[];this.Ca=this.lb=this.Ga=this.ye=this.sd=this.Cb=this.Ce=0;le(this)}fb(Cd,Wc);
            var Fd={di:4,N:5,da:6,ba:7,ca:8,I:9,P:11,Q:12,mf:4,El:60,Fl:83,$b:3,Fb:9,qc:16,bi:1,Ml:19,Ol:28,Ql:16,Pl:21,Nl:37,Kl:2,tj:9,Ll:5,Jl:33,vj:10,uj:8,Rg:3,Qg:15,dm:51,em:1,fm:2,gm:4,cm:32,wj:15,im:15,Ia:16,Ja:4,km:11,jm:18,hm:24,Mb:4,lm:2,Sf:16,mm:17,Bj:18,nm:19,Aj:5,Cj:6,sm:2,rm:8,pm:9,qm:10,om:10,Dj:10,Ej:10,Sl:80,Ul:144,Rl:86,Tl:154,Wl:101,Yl:165,Vl:107,Xl:171,um:70,wm:113,tm:76,vm:124,$l:80,bm:128,Zl:86,am:134,Tg:3,Sg:16,Lj:10,Kj:8,xm:51,ac:8,ym:17,zm:36,Ac:11,Am:16,nf:10,ad:2,qj:18,rj:7,sj:15,xj:12,
            yj:7,zj:11,Fj:18,Gj:7,Hj:15,Mj:15,Nj:7,Oj:13,Uj:11,Vj:7,Wj:8,Bm:8,Em:12,Cm:18,Dm:17,Fm:15,Qj:8,Pj:20,Rj:2,Zj:3,Ug:9,Yj:5,Xj:11,ak:4,$j:17,Gm:11},Ed={di:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,mf:3,El:14,Fl:16,$b:2,Fb:7,qc:7,bi:0,Ml:7,Ol:13,Ql:7,Pl:11,Nl:16,Kl:3,tj:6,Ll:2,Jl:13,vj:5,uj:5,Rg:2,Qg:7,dm:23,em:0,fm:1,gm:3,cm:17,wj:7,im:11,Ia:7,Ja:3,km:7,jm:11,hm:15,Mb:2,lm:3,Sf:7,mm:8,Bj:8,nm:8,Aj:4,Cj:4,sm:2,rm:3,pm:5,qm:2,om:3,Dj:5,Ej:3,Sl:14,Ul:22,Rl:17,Tl:25,Wl:17,Yl:25,Vl:20,Xl:28,um:13,wm:21,tm:16,vm:24,
            $l:13,bm:21,Zl:16,am:24,Tg:2,Sg:7,Lj:5,Kj:5,xm:19,ac:5,ym:5,zm:17,Ac:3,Am:5,nf:3,ad:0,qj:8,rj:5,sj:9,xj:5,yj:5,zj:4,Fj:5,Gj:5,Hj:4,Mj:7,Nj:5,Oj:8,Uj:3,Vj:4,Wj:3,Bm:11,Em:11,Cm:15,Dm:15,Fm:7,Qj:5,Pj:8,Rj:0,Zj:2,Ug:6,Yj:3,Xj:6,ak:3,$j:5,Gm:5},Dd={di:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,mf:3,El:14,Fl:16,$b:2,Fb:7,qc:7,bi:0,Ml:7,Ol:13,Ql:7,Pl:11,Nl:16,Kl:3,tj:6,Ll:2,Jl:13,vj:5,uj:5,Rg:2,Qg:7,dm:23,em:0,fm:1,gm:3,cm:17,wj:7,im:11,Ia:7,Ja:3,km:7,jm:11,hm:15,Mb:2,lm:3,Sf:7,mm:8,Bj:8,nm:8,Aj:4,Cj:4,sm:2,rm:3,
            pm:5,qm:2,om:3,Dj:5,Ej:3,Sl:14,Ul:22,Rl:17,Tl:25,Wl:17,Yl:25,Vl:20,Xl:28,um:13,wm:21,tm:16,vm:24,$l:13,bm:21,Zl:16,am:24,Tg:2,Sg:7,Lj:5,Kj:5,xm:19,ac:5,ym:5,zm:17,Ac:3,Am:5,nf:3,ad:0,qj:8,rj:5,sj:9,xj:5,yj:5,zj:4,Fj:5,Gj:5,Hj:4,Mj:7,Nj:5,Oj:8,Uj:3,Vj:4,Wj:3,Bm:11,Em:11,Cm:15,Dm:15,Fm:7,Qj:5,Pj:8,Rj:0,Zj:2,Ug:6,Yj:3,Xj:6,ak:3,$j:5,Gm:5,po:11,Il:6,Gl:8,Hl:5,Zq:3,Xq:6,Yq:6,ro:9,qo:12,Jj:3,Ij:6,ar:4,$q:5,Tj:3,Sj:7};f=Cd.prototype;
            f.sl=function(a,b){this.na=this.Pe=a;this.Ca=b;this.lb=1<<this.Ca;this.Ga=this.lb-1;this.ye=a.length;this.sd=this.ye-1};function me(a){if(a.na===a.Pe){a.na=Array(a.ye);a.Sk=new t(null,0,0,5,null,a);for(var b=0;b<a.ye;b++)a.na[b]=a.Sk}else for(b=0;b<a.ui.length;b++)a.na[a.ui[b]]=a.Sk;a.ui=[]}
            function Rc(a,b,c,d){var e=(b&-4194304)>>>20,g=a.Pe[(a.Wf+e&a.Cb)>>>a.Ca],l=g.Bc(e);if(!(l&1))return d||ne.call(a,b,!1,c),null;if(!(l&4)&&3==a.ta.Qa)return d||ne.call(a,b,!0,c),null;var p=(b&4190208)>>>10,l=a.Pe[((l&-4096)+p&a.Cb)>>>a.Ca],w=l.Bc(p);if(!(w&1||d))return d||ne.call(a,b,!1,c),null;if(!(w&4)&&3==a.ta.Qa)return d||ne.call(a,b,!0,c),null;c=a.Pe[((w&-4096)+(b&4095)&a.Cb)>>>a.Ca];if(d)return c;d=new t(b&-4096,0,0,6);Bc(d,c,g,e,l,p);b>>>=a.Ca;a.na[b]=d;a.ui.push(b);return d}
            f.reset=function(){this.fa.qb&&this.yb();le(this);Xc(this);this.fa.Kd=!1};
            function le(a){a.F=0;a.D=0;a.G=0;a.H=0;a.he=0;a.L=0;a.K=0;a.J=0;a.Yb=!1;a.tb=a.lc=0;a.Qd=0;a.Ii=0;a.ob=65520;a.Fd=0;a.Af=1023;a.aa=a.pj=0;a.fh=a.li=a.eh=a.gh=0;a.mj=-1;a.ta=new qd(a,rd,"CS");a.ab=new qd(a,2,"DS");a.Na=new qd(a,2,"ES");a.ua=new qd(a,3,"SS");u(a,0);wd(a,0);80386<=a.la&&(a.H=772,a.ob=16,a.hi=0,a.Vf=0,a.Wf=0,a.kn=Array(8),a.ln=Array(8),a.Cc=new qd(a,2,"FS"),a.Dc=new qd(a,2,"GS"));a.No=new qd(a,0,"NULL");a.ha=a.ab;a.ka=a.ua;a.S=a.Aa=0;a.X=a.Ma=n;a.Ab=0;Bd(a,0,65535);if(80286<=a.la){a.Ed=
            0;a.zf=65535;a.xd=new qd(a,5,"LDT",!0);a.bb=new qd(a,4,"TSS",!0);a.Sb=new qd(a,6,"VER",!0);Bd(a,65520,61440);var b,c=q(a);b=a.ta;var d=-65536;80386>b.O.la&&(d&=16777215);b=b.ya=d;a.sa=b+c|0;a.ki=b+a.ta.fb|0}Ad(a,0);oe(a)}function pe(a){2==a.Gd?(a.Zb=a.ra,a.Qc=z,a.ed=qe,a.Se=re,a.Oa=A,a.Jb=se,a.Pc=te):(a.Zb=a.de,a.Qc=B,a.ed=ue,a.Se=ve,a.Oa=C,a.Jb=we,a.Pc=xe)}function ye(a,b){a.pa!=b&&(a.Aa|=4096,a.pa=b,a.C=2==b?65535:-1,ze(a))}
            function ze(a){2==a.pa?(a.dataType=32768,a.pc=a.ra,a.bg=a.Ib):(a.dataType=-2147483648,a.pc=a.de,a.bg=a.vk)}function Ae(a){a.Gd=a.ta.Gd;a.V=a.ta.V;pe(a);a.pa=a.ta.pa;a.C=a.ta.C;ze(a);a.Aa&=-12289}f.Vn=function(){var a=this.F+this.D+this.G+this.H+r(this)+this.L+this.K+this.J|0;return a=a+q(this)+Mb(this)+this.ab.ia+this.ua.ia+this.Na.ia+Nb(this)|0};function Be(a,b,c,d){void 0!==d&&(void 0===a.wi[b]&&(a.wi[b]=[]),a.wi[b].push([c,d]))}
            function Ce(a,b){var c=a.wi[b];if(void 0!==c)for(var d=0;d<c.length;d++)if(!c[d][1].call(c[d][0],a.sa))return!1;a.fa.Kn&&a.qa(16)&&De(a.Y,b,a.sa)&&Ee(a,a.sa,function(a,c){return function(d){Fe(a.Y,b,d,cd(a)-c)}}(a,cd(a)));return!0}function Ee(a,b,c){void 0!==c&&(null==a.xi[b]&&a.zh++,a.xi[b]=c)}function Ge(a,b){var c=a.xi[b];null!=c&&(c(--a.zh),delete a.xi[b])}
            function oe(a,b){void 0===b&&(b=!!(a.ob&1));!b!=!(a.ob&1)&&a.qa()&&a.$a("CPU switching to "+(b?"protected":"real")+"-mode",a.Xb,!0);a.hn=b?He:Kd;sd(a.ta);sd(a.ab);sd(a.ua);sd(a.Na);80386<=a.la&&(sd(a.Cc),sd(a.Dc),Ae(a))}
            f.save=function(){var a=new Ie(this);a.set(0,[this.F,this.D,this.G,this.H,r(this),this.L,this.K,this.J]);var b=q(this),c=this.ta.save(),d=this.ab.save(),e=this.ua.save(),g=this.Na.save(),l;null!=this.Ed?(l=[this.ob,this.Ed,this.zf,this.Fd,this.Af,this.xd.save(),this.bb.save(),this.pj],l.push(this.hi),l.push(this.Vf),l.push(this.Wf),l.push(this.kn),l.push(this.ln)):l=null;b=[b,c,d,e,g,l,Nb(this)];80386<=this.la&&(b.push(this.Cc.save()),b.push(this.Dc.save()));a.set(1,b);a.set(2,[this.ha.ni,this.ka.ni,
            this.S,this.Aa,this.Ab,this.X,this.Ma]);a.set(3,[0,this.Uf,this.T.Ae]);a.set(4,mc(this.ma));return a.data()};
            f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.ta.restore(b[1]);this.ab.restore(b[2]);this.ua.restore(b[3]);this.Na.restore(b[4]);var d=b[5];d&&d.length&&(this.ob=d[0],this.Ed=d[1],this.zf=d[2],this.Fd=d[3],this.Af=d[4],this.xd.restore(d[5]),this.bb.restore(d[6]),this.pj=d[7],80386<=this.la&&(this.hi=d[8],this.Vf=d[9],this.Wf=d[10],this.kn=d[11],this.ln=d[12]),oe(this));Ad(this,b[6]);Bd(this,b[0],this.ta.ia);
            u(this,c);wd(this,this.ua.ia);80386<=this.la&&(this.Cc.restore(b[7]),this.Dc.restore(b[8]));b=a[2];this.ha=null!=b[0]&&Je(this,b[0])||this.ab;this.ka=null!=b[1]&&Je(this,b[1])||this.ua;this.S=b[2];this.Aa=b[3];this.Ab=b[4];this.X=b[5];this.Ma=b[6];b=a[3];this.Uf=b[1];gd(this,b[2]);a:{b=this.ma;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.ko){for(var g=0,l=Array(b.ko),p=0;p<e.length-1;)for(var w=e[p++],v=e[p++];w--;)l[g++]=v;e=l}g=b.na[d];if(!g||!g.restore(e)){Ca("Unable to restore memory block "+
            d);b=!1;break a}}void 0!==a[c]&&dc(b,a[c]);b=!0}return b};function Je(a,b){switch(b){case "CS":return a.ta;case "DS":return a.ab;case "SS":return a.ua;case "ES":return a.Na;case "NULL":return a.No;default:return[0,b,0,0,""]}}function Mb(a){return a.ta.ia}function Ke(a,b){var c=q(a);a.sa=a.ta.load(b)+c|0;a.ki=a.ta.ya+a.ta.fb|0;Ae(a);a.S|=a.si}function Le(a,b){a.ab.load(b);a.S|=a.si}
            function wd(a,b,c){var d=r(a);a.Lc=a.ua.load(b)+d|0;a.ua.zg?(a.ok=a.ua.ya+a.ua.V|0,a.Om=a.ua.ya+a.ua.fb|0):(a.ok=a.ua.ya+a.ua.fb|0,a.Om=a.ua.ya);c||(a.S|=4)}function Me(a,b){a.Na.load(b);a.S|=a.si}function q(a){return a.sa-a.ta.ya|0}function D(a,b){a.sa=a.ta.ya+(b&a.C)|0}function Bd(a,b,c,d){a.ta.el=d;a.Nm=b;b=a.ta.load(c);return b!==n?(a.sa=b+(a.Nm&a.C)|0,a.ki=b+a.ta.fb|0,Ae(a),a.ta.cj):null}
            function Oe(a,b){a.sa=a.sa+b|0;var c=a.ki-a.sa|0;0>c&&0<=(a.ki^a.sa)&&(8088>=a.la||a.ta.fb==a.ta.V?D(a,a.sa-a.ta.ya):-1>c&&ud.call(a,13,0))}function r(a){return a.he&~a.ua.V|a.Lc-a.ua.ya}function u(a,b){a.he=b;a.Lc=a.ua.ya+(b&a.ua.V)|0}function Pe(a,b,c,d,e,g){if(63!=(e&63)&&e!=a.resultType){var l=(e^a.resultType)&a.resultType;l&&(l&1&&Qe(a),l&2&&Re(a),l&4&&Se(a),l&8&&Te(a),l&16&&Ue(a),l&32&&Ve(a))}g?(a.fh=d,a.eh=b):(a.fh=b,a.eh=d);a.li=c;a.gh=d;a.resultType=e}
            function We(a,b,c,d,e){a.resultType=c|26;a.gh=b;d?Xe(a):Ye(a);e?Ze(a):$e(a);return b}function af(a,b,c,d){c&d?Xe(a):Ye(a);(b^c)&d?Ze(a):$e(a)}function bf(a){return Qe(a)?1:0}function Qe(a){a.resultType&1&&(a.aa&=~Wb,(a.fh^(a.fh^a.li)&(a.li^a.eh))&a.resultType&-2147450752&&(a.aa|=Wb),a.resultType&=-2);return a.aa&Wb}function Re(a){a.resultType&2&&(a.aa&=~Vb,38505>>((a.gh^a.gh>>4)&15)&1&&(a.aa|=Vb),a.resultType&=-3);return a.aa&Vb}
            function Se(a){a.resultType&4&&(a.aa&=~Ub,(a.eh^a.fh^a.li)&16&&(a.aa|=Ub),a.resultType&=-5);return a.aa&Ub}function Te(a){a.resultType&8&&(a.aa&=~Tb,a.gh&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.aa|=Tb),a.resultType&=-9);return a.aa&Tb}function Ue(a){a.resultType&16&&(a.aa&=~Sb,a.gh&a.resultType&-2147450752&&(a.aa|=Sb),a.resultType&=-17);return a.aa&Sb}
            function Ve(a){a.resultType&32&&(a.aa&=~Ob,(a.fh^a.eh)&(a.li^a.eh)&a.resultType&-2147450752&&(a.aa|=Ob),a.resultType&=-33);return a.aa&Ob}function Ye(a){a.resultType&=-2;a.aa&=~Wb}function cf(a){a.resultType&=-5;a.aa&=~Ub}function df(a){a.resultType&=-9;a.aa&=~Tb}function $e(a){a.resultType&=-33;a.aa&=~Ob}function Xe(a){a.resultType&=-2;a.aa|=Wb}function ef(a){a.resultType&=-5;a.aa|=Ub}function ff(a){a.resultType&=-9;a.aa|=Tb}function Ze(a){a.resultType&=-33;a.aa|=Ob}
            function Nb(a){return a.aa&~od|Qe(a)|Re(a)|Se(a)|Te(a)|Ue(a)|Ve(a)}function gf(a,b){b=b|a.ob&1|65520;a.ob=a.ob&-65536|b&65535;a.ob&1&&oe(a,!0)}function Ad(a,b,c){a.ob&1||(b&=-61441);void 0===c&&(c=a.ta.Qa);c?b=b&-12289|a.aa&12288:a.pj=(b&12288)>>12;c>a.pj&&(b=b&~Qb|a.aa&Qb);a.resultType=128;a.aa=a.aa&~(a.ti|od)|b&(a.ti|od)|a.cn;a.aa&Rb&&(a.Ab|=2,a.S|=4)}
            f.Lb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.va[b]=c;this.vn++;d=!0;break;default:d=this.parent.Lb.call(this,a,b,c)}return d};
            function hf(a,b){var c=a.na[(b&a.Ce)>>>a.Ca];return 5!=c.type||(c=Rc(a,b,!1,!0),c)?c.Wg(b&a.Ga,b):null}f.Ra=function(a){return this.na[(a&this.Ce)>>>this.Ca].sc(a&this.Ga,a)};f.ra=function(a){var b=a&this.Ga,c=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;return b<this.Ga?this.na[c].gi(b,a):this.na[c].sc(b,a)|this.na[c+1&this.sd].sc(0,a+1)<<8};
            f.de=function(a){var b=a&this.Ga,c=(a&this.Ce)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Bc(b,a);var d=(b&3)<<3;return this.na[c].Bc(b&-4,a)>>>d|this.na[c+1&this.sd].Bc(0,a+3)<<32-d};f.cd=function(a,b){this.na[(a&this.Ce)>>>this.Ca].Ec(a&this.Ga,b&255,a)};f.Ib=function(a,b){var c=a&this.Ga,d=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;c<this.Ga?this.na[d].ri(c,b&65535,a):(this.na[d++].Ec(c,b&255,a),this.na[d&this.sd].Ec(0,b>>8&255,a+1))};
            f.vk=function(a,b){var c=a&this.Ga,d=(a&this.Ce)>>>this.Ca;this.A-=this.B.di;if(c<this.Ga-2)this.na[d].Le(c,b,a);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Bc(c,a);this.na[d].Le(c,e&~(-1<<g)|b<<g,a);d=d+1&this.sd;a+=3;e=this.na[d].Bc(0,a);this.na[d].Le(0,e&-1<<g|b>>>32-g,a)}};function jf(a,b,c){a.pi=b;a.X=b.yc(a.fi=c,1);return a.S&1?0:a.Ra(a.X)}function F(a,b){return jf(a,a.ha,b&a.V)}function H(a,b){return jf(a,a.ka,b&a.V)}function kf(a,b,c){a.pi=b;a.X=b.yc(a.fi=c,a.pa);return a.S&1?0:a.pc(a.X)}
            function I(a,b){return kf(a,a.ha,b&a.V)}function K(a,b){return kf(a,a.ka,b&a.V)}function lf(a,b,c){a.pi=b;a.Ma=a.X=b.yc(a.fi=c,1);return a.S&1?0:a.Ra(a.X)}function L(a,b){return lf(a,a.ha,b&a.V)}function M(a,b){return lf(a,a.ka,b&a.V)}function mf(a,b,c){a.pi=b;a.Ma=a.X=b.yc(a.fi=c,a.pa);return a.S&1?0:a.pc(a.X)}function N(a,b){return mf(a,a.ha,b&a.V)}function P(a,b){return mf(a,a.ka,b&a.V)}function Q(a,b){a.S&2||a.cd(a.pi.nc(a.fi,1),b)}function R(a,b){a.S&2||a.bg(a.pi.nc(a.fi,a.pa),b)}
            function yd(a,b,c){return a.pc(b.yc(c,a.pa))}f.U=function(){var a=this.Ra(this.sa);Oe(this,1);return a};function nf(a){var b=a.ra(a.sa);Oe(a,2);return b}function U(a){var b=a.Zb(a.sa);Oe(a,a.Gd);return b}f.oa=function(){var a=this.pc(this.sa);Oe(this,this.pa);return a};f.M=function(){var a=this.Ra(this.sa)<<24>>24;Oe(this,1);return a};function V(a,b){var c=a.Ra(a.sa);Oe(a,1);return of[c].call(a,b)}
            f.La=function(){var a=this.pc(this.Lc);this.Lc=this.Lc+this.pa|0;var b=this.ok-this.Lc|0;0>b&&0<=(this.ok^this.Lc)&&(8088>=this.la||!this.ua.zg&&this.ua.fb==this.ua.V||this.ua.zg&&!this.ua.fb?u(this,this.Lc-this.ua.ya&this.ua.V):-1>b&&ud.call(this,12,0));return a};function x(a,b){a.Lc=a.Lc-a.pa|0;0>(a.Lc-a.Om|0)&&0<=(a.Om^a.Lc)&&(8088>=a.la||!a.ua.zg&&a.ua.fb==a.ua.V||a.ua.zg&&!a.ua.fb?u(a,a.Lc-a.ua.ya&a.ua.V):ud.call(a,12,0));a.bg(a.Lc,b)}
            function pf(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.la)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.va[b]&&(void 0===c&&(sb(a,"Value for "+b+" is invalid"),a.yb()),d=!a.fa.qb||a.fa.Mn?h(c,d):"--------".substr(0,d),a.va[b].textContent!=d&&(a.va[b].textContent=d))}
            f.yd=function(a){if(this.vn&&(a||!this.fa.qb||this.fa.Mn)){pf(this,"EAX",this.F);pf(this,"EBX",this.D);pf(this,"ECX",this.G);pf(this,"EDX",this.H);pf(this,"ESP",r(this));pf(this,"EBP",this.L);pf(this,"ESI",this.K);pf(this,"EDI",this.J);pf(this,"CS",Mb(this));pf(this,"DS",this.ab.ia);pf(this,"SS",this.ua.ia);pf(this,"ES",this.Na.ia);pf(this,"EIP",q(this));var b=Nb(this);pf(this,"PS",b);pf(this,"V",b&Ob);pf(this,"D",b&Pb);pf(this,"I",b&Qb);pf(this,"T",b&Rb);pf(this,"S",b&Sb);pf(this,"Z",b&Tb);pf(this,
            "A",b&Ub);pf(this,"P",b&Vb);pf(this,"C",b&Wb)}if(b=this.va.speed)b.textContent=Lb(this);this.parent.yd.call(this,a)};
            f.ih=function(a){this.fa.ue=!0;var b=this.fa.Kn=this.Y&&qf(this.Y),c=a?this.fa.ll?0:1:-1;this.fa.ll=!1;this.td=this.A=a;this.ja&&!a&&ld(this.ja);a||this.qa(1024)||(this.S|=4);do{var d=this.S&12528;if(d)this.Aa|=d;else if(this.Rb=this.sa,this.ha=this.ab,this.ka=this.ua,this.X=this.Ma=n,this.Aa&12288&&Ae(this),this.Aa=this.S&256,this.Ab){a:{if(!(this.S&4))for(var d=80286>this.la?0:1,e=0;2>e;e++){switch(d){case 0:if(this.Ab&1&&this.aa&Qb){var g=rf(this.ja);if(-1<=g&&(this.Ab&=-2,0<=g)){this.Ab&=-5;sf.call(this,
            g,null,11);d=!0;break a}}break;case 1:if(this.Ab&2){this.Ab&=-3;sf.call(this,1,null,11);d=!0;break a}}d=1-d}if(d=this.Ab&8){d=this.ja;e=!1;for(g=0;g<d.ub;g++)for(var l=d.ub[g],p=0;p<l.Tb.length;p++){var w=l.Tb[p];w.xe||(tf(d,w),w.xe||(e=!0))}d=!e}d&&(this.Ab&=-9);d=!1}if(d&&!a){this.R("interrupt dispatched");this.S=0;break}if(this.Ab&4){this.S=this.A=0;break}}if(b){if(uf(this.Y,this.sa,c)){this.yb();break}c=1}this.S=0;this.Pa[this.U()].call(this)}while(0<this.A);return this.fa.ue?this.td-this.A:void 0===
            this.fa.ue?0:-1};Qa(function(){for(var a=lb(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Cd(d);kb(d,c)}});function vf(a,b){var c=a+b+bf(this)|0;Pe(this,a,b,c,191);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function wf(a,b){var c=a+b+bf(this)|0;Pe(this,a,b,c,this.dataType|63);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}
            function xf(a,b){var c=a+b|0;Pe(this,a,b,c,191);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function yf(a,b){var c=a+b|0;Pe(this,a,b,c,this.dataType|63);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function zf(a,b){var c=a&b;We(this,c,128);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c}function Af(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a&b,this.dataType)}
            function Bf(a,b){this.A-=10+(this.X===n?0:1);if((a&3)<(b&3))return a=a&-4|b&3,ff(this),a;df(this);return a}function Cf(a){if(this.X===n)return Ld.call(this),a;var b=a,c=this.pc(this.X),d=this.pc(this.X+this.pa);2==this.pa&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Jl;if(b<c||b>d)D(this,this.Rb-this.ta.ya),sf.call(this,5,null,0);this.S|=2;return a}function Df(a,b){var c=0;if(b){df(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else ff(this);this.A-=this.B.po+3*c;return a}
            function Ef(a,b){var c=0;if(b){df(this);for(var d=2==this.pa?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else ff(this);this.A-=this.B.po+3*c;return a}function Ff(a,b){a&1<<(b&31)?Xe(this):Ye(this);this.A-=this.X===n?this.B.Zq:this.B.Xq;this.S|=2;return a}function Gf(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a^c}function Hf(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a&~c}
            function If(a,b){var c=1<<(b&31);a&c?Xe(this):Ye(this);this.A-=this.X===n?this.B.Il:this.B.Gl;return a|c}function Jf(a,b){var c=Mb(this),d=q(this);null!=Bd(this,a,b,!0)&&(x(this,c),x(this,d))}function Kf(a,b){Pe(this,a,b,a-b|0,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.tj:this.B.Fb;this.S|=2;return a}function Lf(a,b){Pe(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.tj:this.B.Fb;this.S|=2;return a}
            function Mf(a){var b=(a&this.C)-1|0;Pe(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function Nf(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
            function Of(a,b,c){this.Yb=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<Nf(a,c);){var g=b=c;b[0]+=g[0];b[1]+=g[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=Nf(a,c)&&(b=a,g=c,b[0]-=g[0],b[1]-=g[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.tb=d;this.lc=a[0];this.Yb=!0}}function Pf(a){return a}
            function Qf(a,b){a=this.U();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?21:24;return c&65535}function Rf(a,b){var c,d;a=this.oa();2==this.pa?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(Xe(this),Ze(this)):(Ye(this),$e(this));d&=this.C;this.A-=this.X===n?21:24;return d}
            function Sf(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.ro:this.B.qo;return c&65535}function Tf(a,b){var c=a*b;2147483647<c||-2147483648>c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.ro:this.B.qo;return c|0}function Uf(a){var b=(a&this.C)+1|0;Pe(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
            function sf(a,b,c){this.A-=this.B.dm+c;this.ta.el=!0;c=Nb(this);var d=Mb(this),e=q(this);a=this.ta.co(a);a!==n&&(x(this,c),x(this,d),x(this,e),null!=b&&x(this,b),this.mj=-1,this.sa=a,this.ki=this.ta.ya+this.ta.fb|0,Ae(this))}function Vf(a,b){this.A-=14+(this.X===n?0:2);df(this);this.Sb.load(b,!0)!==n&&this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(b&3)&&(ff(this),a=this.Sb.Pb&-256,2<this.pa&&(a|=(this.Sb.Jh&-65281)<<16));return a}
            function Wf(a,b){if(this.X===n)return ee.call(this),a;Le(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}function Xf(a){if(this.X===n)return ee.call(this),a;this.A-=this.B.lm;return this.X}function Yf(a,b){if(this.X===n)return ee.call(this),a;Me(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}function Zf(a,b){if(this.X===n)return ee.call(this),a;var c=this.ra(this.X+this.pa);this.Cc.load(c);this.A-=this.B.Sf;return b}
            function $f(a,b){if(this.X===n)return ee.call(this),a;var c=this.ra(this.X+this.pa);this.Dc.load(c);this.A-=this.B.Sf;return b}function ag(a,b){this.A-=14+(this.X===n?0:2);if(b&65528&&this.Sb.load(b,!0)!==n&&(7168==(this.Sb.Pb&7168)||this.Sb.zc>=this.ta.Qa)&&this.Sb.zc>=(b&3))return ff(this),this.Sb.fb;df(this);return a}function bg(a,b){if(this.X===n)return ee.call(this),a;wd(this,this.ra(this.X+this.pa));this.A-=this.B.Sf;return b}
            function cg(a,b){this.A-=this.Ma===n?this.X===n?this.B.sm:this.B.rm:this.B.pm;return b}function dg(a,b){return b}function eg(){this.Ma!==n&&ye(this,2);return cg.call(this,0,this.Qd)}function fg(a,b){var c=b&65535,d=b>>>16,e=a&65535,g=a>>>16,l=c*e,e=(l>>>16)+d*e,p=e>>>16,e=(e&65535)+c*g;this.Yb=!0;this.tb=e<<16|l&65535;this.lc=p+((e>>>16)+d*g)|0}function gg(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a|b,128)}
            function ng(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a|b,this.dataType)}function og(a){var b=this.La(),c=this.La();(a<<=this.pa>>2)&&u(this,r(this)+a);Bd(this,b,c,!1)&&(a&&u(this,r(this)+a),this.ab.ia&65528&&this.ab.zc<this.ta.Qa&&7168!=(this.ab.Pb&7168)&&this.ab.load(0),this.Na.ia&65528&&this.Na.zc<this.ta.Qa&&7168!=(this.Na.Pb&7168)&&this.Na.load(0));2==a&&this.zh&&Ge(this,this.sa)}
            function pg(a,b){var c=a-b-bf(this)|0;Pe(this,a,b,c,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function qg(a,b){var c=a-b-bf(this)|0;Pe(this,a,b,c,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function rg(a){this.S|=1;this.ed[this.U()].call(this,a);this.A-=this.X===n?this.B.ar:this.B.$q}function sg(){return Ve(this)?1:0}function tg(){return Qe(this)?1:0}function ug(){return Qe(this)?0:1}
            function vg(){return Te(this)?1:0}function wg(){return Te(this)?0:1}function xg(){return Qe(this)||Te(this)?1:0}function yg(){return Qe(this)||Te(this)?0:1}function zg(){return Ue(this)?1:0}function Ag(){return Ue(this)?0:1}function Bg(){return Re(this)?1:0}function Cg(){return Re(this)?0:1}function Dg(){return!Ue(this)!=!Ve(this)?1:0}function Eg(){return!Ue(this)!=!Ve(this)?0:1}function Fg(){return Te(this)||!Ue(this)!=!Ve(this)?1:0}function Gg(){return Te(this)||!Ue(this)!=!Ve(this)?0:1}
            function Hg(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;We(this,a,32768,d&32768)}return a}function Ig(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;We(this,a,-2147483648,d&-2147483648)}return a}function Jg(a,b){return Hg.call(this,a,b,this.U())}function Kg(a,b){return Ig.call(this,a,b,this.U())}function Lg(a,b){return Hg.call(this,a,b,this.G&31)}function Mg(a,b){return Ig.call(this,a,b,this.G&31)}
            function Ng(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;We(this,a,32768,d&1)}return a}function Og(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;We(this,a,-2147483648,d&1)}return a}function Pg(a,b){return Ng.call(this,a,b,this.U())}function Qg(a,b){return Og.call(this,a,b,this.U())}function Rg(a,b){return Ng.call(this,a,b,this.G&31)}function Sg(a,b){return Og.call(this,a,b,this.G&31)}
            function Tg(a,b){var c=a-b|0;Pe(this,a,b,c,191,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&255}function Ug(a,b){var c=a-b|0;Pe(this,a,b,c,this.dataType|63,!0);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c&this.C}function Vg(a,b){We(this,a&b,128);this.A-=this.Ma===n?this.X===n?this.B.Zj:this.B.Ug:this.B.Ug;this.S|=2;return a}function Wg(a,b){We(this,a&b,32768);this.A-=this.Ma===n?this.X===n?this.B.Zj:this.B.Ug:this.B.Ug;this.S|=2;return a}
            function Xg(a,b){if(this.X===n){switch(this.Ii&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.ak}else this.Ma=this.X,Q(this,a),this.A-=this.B.$j;return b}
            function Yg(a,b){if(this.X===n){switch(this.Ii&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:u(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.ak}else this.Ma=this.X,R(this,a),this.A-=this.B.$j;return b}function Zg(a,b){var c=a^b;We(this,c,128);this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return c}
            function $g(a,b){this.A-=this.Ma===n?this.X===n?this.B.$b:this.B.Fb:this.B.qc;return We(this,a^b,this.dataType)}function ah(a){ud.call(this,13,0);return a}function be(a){Ld.call(this);return a}function bh(a){ee.call(this);return a}function ch(){D(this,this.Rb-this.ta.ya);sf.call(this,0,null,2)}function dh(){this.A-=this.X===n?2:this.B.Fm;return 1}function eh(){var a=this.G&255;this.A-=(this.X===n?this.B.Qj:this.B.Pj)+(a<<this.B.Rj);return a}
            function fh(){var a=this.U();this.A-=(this.X===n?this.B.Qj:this.B.Pj)+(a<<this.B.Rj);return a}function gh(){return null}function ud(a,b,c){if(this.fa.ue){var d=!1;if(80186<=this.la)if(0>this.mj)D(this,this.Rb-this.ta.ya),d=!0;else if(8!=this.mj)b=0,a=8,d=!0;else{hh.call(this,-1,0,c);le(this);return}hh.call(this,a,b,c)&&(d=!1);d&&sf.call(this,this.mj=a,b,0);this.S|=3}else this.$a("Fault "+k(a)+" blocked by Debugger",1073741824),D(this,this.Rb-this.ta.ya)}
            function ne(a,b,c){this.Vf=a;a=0;b&&(a|=1);c&&(a|=2);3==this.ta.Qa&&(a|=4);ud.call(this,14,a)}function hh(a,b,c){var d=32,e=hf(this,this.sa);204==e&&(c=!1,d|=1);983040<=this.sa&&1048575>=this.sa&&(c=!1);this.qa(d|-2147483648)&&(c=!0);if(this.qa(d)||c)a=(c?"\n":"")+"Fault "+k(a)+(null!=b?" ("+ha(b)+")":"")+" on opcode "+k(e)+" at "+ih(q(this),Mb(this))+" (%"+h(this.sa,6)+")",b=this.fa.qb,this.$a(a,d)?c&&(c=b,this.Y.yb()):(this.Da(a),this.yb());return c}function ce(){this.ph[this.U()].call(this)}
            function fe(){x(this,r(this)&this.C);this.A-=this.B.Ac}function Md(){var a=r(this)&this.C;x(this,this.F&this.C);x(this,this.G&this.C);x(this,this.H&this.C);x(this,this.D&this.C);x(this,a);x(this,this.L&this.C);x(this,this.K&this.C);x(this,this.J&this.C);this.A-=this.B.zm}
            function Nd(){this.J=this.J&~this.C|this.La();this.K=this.K&~this.C|this.La();this.L=this.L&~this.C|this.La();u(this,r(this)+this.pa);this.D=this.D&~this.C|this.La();this.H=this.H&~this.C|this.La();this.G=this.G&~this.C|this.La();this.F=this.F&~this.C|this.La();this.A-=this.B.xm}function Od(){this.Oa[this.U()].call(this,Cf)}function ge(){this.Jb[this.U()].call(this,Bf)}function he(){this.S|=20;this.ha=this.ka=this.Cc;this.A-=this.B.ad;this.yb()}
            function ie(){this.S|=20;this.ha=this.ka=this.Dc;this.A-=this.B.ad;this.yb()}function je(){this.S|=4096;this.pa^=6;this.C^=-65536;ze(this);this.A-=this.B.ad}function ke(){this.S|=8192;this.Gd^=6;this.V^=-65536;pe(this);this.A-=this.B.ad}function Pd(){x(this,this.oa());this.A-=this.B.Ac}function Qd(){this.Oa[this.U()].call(this,Rf)}function Rd(){x(this,this.U());this.A-=this.B.Ac}function Sd(){this.Oa[this.U()].call(this,Qf)}
            function Td(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=pc(this.ma,this.H,this.sa-b-1);this.cd(this.Na.nc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
            function Ud(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){for(var d=this.sa-b-1,e=0,g=0,l=0;l<this.pa;l++)e|=pc(this.ma,this.H,d)<<g,g+=8;d=e;this.bg(this.Na.nc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
            function Vd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=this.Ra(this.ab.yc(this.K&this.V,1));this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V;this.A-=c;tc(this.ma,this.H,d,this.sa-b-1);this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}
            function Wd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=yd(this,this.ab,this.K&this.V);this.K=this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;for(var c=this.sa-b-1,e=0,g=0;g<this.pa;g++)tc(this.ma,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}}function jh(){var a=this.M();Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
            function kh(){var a=this.M();Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function lh(){var a=this.M();Qe(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function mh(){var a=this.M();Qe(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function nh(){var a=this.M();Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function oh(){var a=this.M();Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}
            function ph(){var a=this.M();Qe(this)||Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function qh(){var a=this.M();Qe(this)||Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function rh(){var a=this.M();Ue(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function sh(){var a=this.M();Ue(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function th(){var a=this.M();Re(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
            function uh(){var a=this.M();Re(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function vh(){var a=this.M();!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function wh(){var a=this.M();!Ue(this)==!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}function xh(){var a=this.M();Te(this)||!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja}
            function yh(){var a=this.M();Te(this)||!Ue(this)!=!Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)}function zh(){this.Se[this.U()].call(this,Ah,this.U);this.A-=this.Ma===n?1:this.B.bi}function Xd(){this.Se[this.U()].call(this,Bh,fh)}function Yd(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,fh)}function Eh(){var a=nf(this)<<(this.pa>>2),b=this.La();D(this,b);a&&u(this,r(this)+a);this.A-=this.B.Em}function Fh(){var a=this.La();D(this,a);this.A-=this.B.Bm}
            function Zd(){var a=nf(this),b=this.U()&31;this.A-=11;x(this,this.L);var c=r(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.pa&this.C,x(this,yd(this,this.ua,this.L&this.C));x(this,c)}this.L=this.L&~this.C|c;u(this,r(this)&~this.ua.V|r(this)-a&this.ua.V)}function $d(){u(this,r(this)&~this.ua.V|this.L&this.ua.V);this.L=this.L&~this.C|this.La()&this.C;this.A-=5}function Gh(){og.call(this,nf(this));this.A-=this.B.Dm}
            function Hh(){og.call(this,0);this.A-=this.B.Cm}function Ih(){this.Oa[this.U()].call(this,Pf);this.A-=8}function Jh(){this.S|=36;this.A-=this.B.ad}function ae(){ee.call(this)}function Ld(){ud.call(this,6);this.yb()}function ee(){D(this,this.Rb-this.ta.ya);sb(this,"Undefined opcode "+k(Yb(this.ma,this.sa))+" at "+("0x"+h(this.sa)));this.yb()}
            var Hd=[function(){var a=this.U();this.ed[a].call(this,xf)},function(){this.Jb[this.U()].call(this,yf)},function(){this.Qc[this.U()].call(this,xf)},function(){this.Oa[this.U()].call(this,yf)},function(){this.F=this.F&-256|xf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|yf.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.Na.ia);this.A-=this.B.nf},function(){Me(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,gg)},function(){this.Jb[this.U()].call(this,
            ng)},function(){this.Qc[this.U()].call(this,gg)},function(){this.Oa[this.U()].call(this,ng)},function(){this.F=this.F&-256|gg.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|ng.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ta.ia);this.A-=this.B.nf},function(){Ke(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,vf)},function(){this.Jb[this.U()].call(this,wf)},function(){this.Qc[this.U()].call(this,vf)},function(){this.Oa[this.U()].call(this,
            wf)},function(){this.F=this.F&-256|vf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|wf.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ua.ia);this.A-=this.B.nf},function(){wd(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,pg)},function(){this.Jb[this.U()].call(this,qg)},function(){this.Qc[this.U()].call(this,pg)},function(){this.Oa[this.U()].call(this,qg)},function(){this.F=this.F&-256|pg.call(this,this.F&255,this.U());this.A--},
            function(){this.F=this.F&~this.C|qg.call(this,this.F&this.C,this.oa());this.A--},function(){x(this,this.ab.ia);this.A-=this.B.nf},function(){Le(this,this.La());this.A-=this.B.ac},function(){this.ed[this.U()].call(this,zf)},function(){this.Jb[this.U()].call(this,Af)},function(){this.Qc[this.U()].call(this,zf)},function(){this.Oa[this.U()].call(this,Af)},function(){this.F=this.F&-256|zf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|Af.call(this,this.F&this.C,this.oa());this.A--},
            function(){this.S|=20;this.ha=this.ka=this.Na;this.A-=this.B.ad},function(){var a=this.F&255,b=Se(this),c=Qe(this);if(9<(a&15)||b)a+=6,b=Ub;if(159<a||c)a+=96,c=Wb;a&=255;this.F=this.F&-256|a;We(this,a,128);c?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Tg)},function(){this.Jb[this.U()].call(this,Ug)},function(){this.Qc[this.U()].call(this,Tg)},function(){this.Oa[this.U()].call(this,Ug)},function(){this.F=this.F&-256|Tg.call(this,this.F&255,this.U());
            this.A--},function(){this.F=this.F&~this.C|Ug.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ta;this.A-=this.B.ad},function(){var a=this.F&255,b=Se(this),c=Qe(this);if(9<(a&15)||b)a-=6,b=Ub;if(159<a||c)a-=96,c=Wb;a&=255;this.F=this.F&-256|a;We(this,a,128);c?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Zg)},function(){this.Jb[this.U()].call(this,$g)},function(){this.Qc[this.U()].call(this,Zg)},function(){this.Oa[this.U()].call(this,
            $g)},function(){this.F=this.F&-256|Zg.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|$g.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ua;this.A-=this.B.ad},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Se(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.ed[this.U()].call(this,Kf)},function(){this.Jb[this.U()].call(this,Lf)},function(){this.Qc[this.U()].call(this,
            Kf)},function(){this.Oa[this.U()].call(this,Lf)},function(){Kf.call(this,this.F&255,this.U());this.A--},function(){Lf.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.ka=this.ab;this.A-=this.B.ad},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Se(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Xe(this):Ye(this);b?ef(this):cf(this);this.A-=this.B.mf},function(){this.F=Uf.call(this,this.F)},function(){this.G=Uf.call(this,this.G)},function(){this.H=
            Uf.call(this,this.H)},function(){this.D=Uf.call(this,this.D)},function(){u(this,Uf.call(this,r(this)))},function(){this.L=Uf.call(this,this.L)},function(){this.K=Uf.call(this,this.K)},function(){this.J=Uf.call(this,this.J)},function(){this.F=Mf.call(this,this.F)},function(){this.G=Mf.call(this,this.G)},function(){this.H=Mf.call(this,this.H)},function(){this.D=Mf.call(this,this.D)},function(){u(this,Mf.call(this,r(this)))},function(){this.L=Mf.call(this,this.L)},function(){this.K=Mf.call(this,this.K)},
            function(){this.J=Mf.call(this,this.J)},function(){x(this,this.F&this.C);this.A-=this.B.Ac},function(){x(this,this.G&this.C);this.A-=this.B.Ac},function(){x(this,this.H&this.C);this.A-=this.B.Ac},function(){x(this,this.D&this.C);this.A-=this.B.Ac},function(){x(this,r(this)-2&65535);this.A-=this.B.Ac},function(){x(this,this.L&this.C);this.A-=this.B.Ac},function(){x(this,this.K&this.C);this.A-=this.B.Ac},function(){x(this,this.J&this.C);this.A-=this.B.Ac},function(){this.F=this.F&~this.C|this.La();
            this.A-=this.B.ac},function(){this.G=this.G&~this.C|this.La();this.A-=this.B.ac},function(){this.H=this.H&~this.C|this.La();this.A-=this.B.ac},function(){this.D=this.D&~this.C|this.La();this.A-=this.B.ac},function(){u(this,r(this)&~this.C|this.La());this.A-=this.B.ac},function(){this.L=this.L&~this.C|this.La();this.A-=this.B.ac},function(){this.K=this.K&~this.C|this.La();this.A-=this.B.ac},function(){this.J=this.J&~this.C|this.La();this.A-=this.B.ac},jh,kh,lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,
            jh,kh,lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,zh,function(){this.Pc[this.U()].call(this,Kh,this.oa);this.A-=this.Ma===n?1:this.B.bi},zh,function(){this.Pc[this.U()].call(this,Kh,this.M);this.A-=this.Ma===n?1:this.B.bi},function(){this.ed[this.U()].call(this,Vg)},function(){this.Jb[this.U()].call(this,Wg)},function(){this.Qc[this.Ii=this.U()].call(this,Xg)},function(){this.Oa[this.Ii=this.U()].call(this,Yg)},function(){this.S|=1;this.ed[this.U()].call(this,cg)},function(){this.S|=1;this.Jb[this.U()].call(this,
            cg)},function(){this.Qc[this.U()].call(this,cg)},function(){this.Oa[this.U()].call(this,cg)},function(){var a=this.U();switch((a&56)>>3){case 0:this.Qd=this.Na.ia;break;case 1:this.Qd=this.ta.ia;break;case 2:this.Qd=this.ua.ia;break;case 3:this.Qd=this.ab.ia;break;case 4:if(80386<=this.la){this.Qd=this.Cc.ia;break}Ld.call(this);break;case 5:if(80386<=this.la){this.Qd=this.Dc.ia;break}default:Ld.call(this)}this.S|=1;this.Jb[a].call(this,eg)},function(){this.S|=1;this.ha=this.ka=this.No;this.Oa[this.U()].call(this,
            Xf)},function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.la||80386==this.la&&4!=c&&5!=c){Ld.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=r(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Oa[b].call(this,cg);switch(c){case 0:Me(this,this.F);this.F=a;break;case 1:Ke(this,this.G);this.G=a;break;case 2:wd(this,this.H);this.H=a;break;case 3:Le(this,this.D);this.D=a;break;case 4:80386<=
            this.la?this.Cc.load(r(this)):Me(this,r(this));u(this,a);break;case 5:80386<=this.la?this.Dc.load(this.L):Ke(this,this.L);this.L=a;break;case 6:wd(this,this.K);this.K=a;break;case 7:Le(this,this.J),this.J=a}},function(){this.S|=1;this.Pc[this.U()].call(this,Lh,this.La)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=
            this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=r(this);this.F=this.F&~this.C|b&this.C;u(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=
            2==this.pa?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.pa?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Ll},function(){Jf.call(this,this.oa(),nf(this));this.A-=this.B.Ol},function(){this.$a("WAIT not implemented");this.A--},function(){x(this,Nb(this));this.A-=this.B.Ac},function(){Ad(this,this.La());this.A-=this.B.ac},function(){var a=this.F>>8&255;a&Wb?Xe(this):Ye(this);a&Vb?(this.resultType&=-3,this.aa|=Vb):(this.resultType&=
            -3,this.aa&=~Vb);a&Ub?ef(this):cf(this);a&Tb?ff(this):df(this);a&Sb?(this.resultType&=-17,this.aa|=Sb):(this.resultType&=-17,this.aa&=~Sb);this.A-=this.B.Mb},function(){this.F=this.F&-65281|(Nb(this)&pd)<<8;this.A-=this.B.Mb},function(){var a=this.F&-256,b;b=U(this);b=this.Ra(this.ha.yc(b,1));this.F=a|b;this.A-=this.B.Dj},function(){this.F=this.F&~this.C|yd(this,this.ha,U(this));this.A-=this.B.Dj},function(){var a=U(this),b=this.F;this.cd(this.ha.nc(a,1),b);this.A-=this.B.Ej},function(){var a=U(this),
            b=this.F;this.bg(this.ha.nc(a,this.pa),b);this.A-=this.B.Ej},function(){var a=1,b=0,c=this.B.Fj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Hj,this.Aa&256||(this.A-=this.B.Gj));if(a--){var d=this.aa&Pb?-1:1,e=this.Ra(this.ha.yc(this.K,1));this.cd(this.Na.nc(this.J&this.V,1),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.Fj;this.Aa&192&&(a=this.G&this.V,
            b=1,c=this.B.Hj,this.Aa&256||(this.A-=this.B.Gj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=yd(this,this.ha,this.K);this.bg(this.Na.nc(this.J&this.V,this.pa),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.qj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.sj,this.Aa&256||(this.A-=this.B.rj));if(a--){var d=this.aa&Pb?-1:1,e=jf(this,this.ha,this.K&this.V),g=
            lf(this,this.Na,this.J&this.V);Kf.call(this,e,g);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Fb;this.G=this.G&~this.V|this.G-b&this.V;a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.qj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.sj,this.Aa&256||(this.A-=this.B.rj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=kf(this,this.ha,this.K&this.V),g=mf(this,this.Na,this.J&this.V);Lf.call(this,e,g);this.K=this.K&~this.V|
            this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Fb;this.G=this.G&~this.V|this.G-b&this.V;a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256)}},function(){We(this,this.F&this.U(),128);this.A-=this.B.mf},function(){We(this,this.F&this.oa(),this.dataType);this.A-=this.B.mf},function(){var a=1,b=0,c=this.B.Uj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Wj,this.Aa&256||(this.A-=this.B.Vj));if(a--){var d=this.F;this.cd(this.Na.nc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+
            (this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.Uj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Wj,this.Aa&256||(this.A-=this.B.Vj));if(a--){var d=this.F;this.bg(this.Na.nc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Rb,this.S|=256)}},function(){var a=1,b=0,c=this.B.xj;this.Aa&192&&(a=this.G&this.V,
            b=1,c=this.B.zj,this.Aa&256||(this.A-=this.B.yj));a--&&(this.F=this.F&-256|this.Ra(this.ha.yc(this.K&this.V,1)),this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V,this.A-=c,this.G=this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.xj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.zj,this.Aa&256||(this.A-=this.B.yj));a--&&(this.F=this.F&~this.C|yd(this,this.ha,this.K&this.V),this.K=this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c,this.G=
            this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.Mj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Oj,this.Aa&256||(this.A-=this.B.Nj));a--&&(Kf.call(this,this.F&255,lf(this,this.Na,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V,this.A-=c-this.B.Fb,this.G=this.G&~this.V|this.G-b&this.V,a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256))},function(){var a=1,b=0,c=this.B.Mj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Oj,this.Aa&
            256||(this.A-=this.B.Nj));a--&&(Lf.call(this,this.F&this.C,mf(this,this.Na,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c-this.B.Fb,this.G=this.G&~this.V|this.G-b&this.V,a&&Te(this)==(this.Aa&64)&&(this.sa=this.Rb,this.S|=256))},function(){this.F=this.F&-256|this.U();this.A-=this.B.Mb},function(){this.G=this.G&-256|this.U();this.A-=this.B.Mb},function(){this.H=this.H&-256|this.U();this.A-=this.B.Mb},function(){this.D=this.D&-256|this.U();this.A-=this.B.Mb},
            function(){this.F=this.F&255|this.U()<<8;this.A-=this.B.Mb},function(){this.G=this.G&255|this.U()<<8;this.A-=this.B.Mb},function(){this.H=this.H&255|this.U()<<8;this.A-=this.B.Mb},function(){this.D=this.D&255|this.U()<<8;this.A-=this.B.Mb},function(){this.F=this.F&~this.C|this.oa();this.A-=this.B.Mb},function(){this.G=this.G&~this.C|this.oa();this.A-=this.B.Mb},function(){this.H=this.H&~this.C|this.oa();this.A-=this.B.Mb},function(){this.D=this.D&~this.C|this.oa();this.A-=this.B.Mb},function(){u(this,
            r(this)&~this.C|this.oa());this.A-=this.B.Mb},function(){this.L=this.L&~this.C|this.oa();this.A-=this.B.Mb},function(){this.K=this.K&~this.C|this.oa();this.A-=this.B.Mb},function(){this.J=this.J&~this.C|this.oa();this.A-=this.B.Mb},Eh,Fh,Eh,Fh,function(){this.Oa[this.U()].call(this,Yf)},function(){this.Oa[this.U()].call(this,Wf)},function(){this.S|=1;this.Se[this.U()].call(this,Mh,this.U)},function(){this.S|=1;this.Pc[this.U()].call(this,Mh,this.oa)},Gh,Hh,Gh,Hh,function(){sf.call(this,3,null,this.B.em)},
            function(){var a=this.U();Ce(this,a)?sf.call(this,a,null,0):this.A--},function(){Ve(this)?sf.call(this,4,null,this.B.fm):this.A-=this.B.gm},function(){this.A-=this.B.cm;if(this.ob&1&&this.aa&16384){var a=this.ra(this.bb.ya+0);xd(this.ta,a,!1)}else{var a=this.ta.Qa,b=this.La(),c=this.La(),d=this.La();null!=Bd(this,b,c,!1)&&(Ad(this,d,a),this.zh&&Ge(this,this.sa))}},function(){this.Se[this.U()].call(this,Bh,dh)},function(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,dh)},function(){this.Se[this.U()].call(this,
            Bh,eh)},function(){this.Pc[this.U()].call(this,2==this.pa?Ch:Dh,eh)},function(){var a=this.U();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;We(this,this.F,128);this.A-=this.B.Fl}},function(){var a=this.U();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;We(this,this.F,128);this.A-=this.B.El},function(){this.F=this.F&-256|(Qe(this)?255:0);this.A-=2},function(){this.F=this.F&-256|jf(this,this.ha,this.D+(this.F&255)&65535);this.A-=this.B.Gm},Ih,Ih,Ih,Ih,Ih,Ih,Ih,Ih,function(){var a=this.M();
            (this.G=this.G-1&this.V)&&!Te(this)?(D(this,q(this)+a),this.A-=this.B.nm):this.A-=this.B.Aj},function(){var a=this.M();(this.G=this.G-1&this.V)&&Te(this)?(D(this,q(this)+a),this.A-=this.B.Bj):this.A-=this.B.Cj},function(){var a=this.M();(this.G=this.G-1&this.V)?(D(this,q(this)+a),this.A-=this.B.mm):this.A-=this.B.Aj},function(){var a=this.M();this.G&this.V?this.A-=this.B.Cj:(D(this,q(this)+a),this.A-=this.B.Bj)},function(){var a=this.U();this.F=this.F&-256|pc(this.ma,a,this.sa-2);this.A-=this.B.vj},
            function(){var a=this.U();this.F=pc(this.ma,a,this.sa-2);this.F|=pc(this.ma,a+1&65535,this.sa-2)<<8;this.A-=this.B.vj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);this.A-=this.B.Lj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);tc(this.ma,a+1&65535,this.F>>8,this.sa-2);this.A-=this.B.Lj},function(){var a=this.oa(),b=q(this),a=b+a;x(this,b);D(this,a);this.A-=this.B.Ml},function(){var a=this.oa();D(this,q(this)+a);this.A-=this.B.wj},function(){Bd(this,this.oa(),nf(this));
            this.A-=this.B.im},function(){var a=this.M();D(this,q(this)+a);this.A-=this.B.wj},function(){this.F=this.F&-256|pc(this.ma,this.H,this.sa-1);this.A-=this.B.uj},function(){this.F=pc(this.ma,this.H,this.sa-1);this.F|=pc(this.ma,this.H+1&65535,this.sa-1)<<8;this.A-=this.B.uj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);this.A-=this.B.Kj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);tc(this.ma,this.H+1&65535,this.F>>8,this.sa-1);this.A-=this.B.Kj},Jh,Jh,function(){this.S|=132;this.A-=this.B.ad},
            function(){this.S|=68;this.A-=this.B.ad},function(){this.Ab|=4;this.A-=2;this.Y&&this.qa(-2147483648)?(this.sa=this.sa+-1|0,this.yb()):this.aa&Qb||(this.Y&&(this.sa=this.sa+-1|0),this.yb())},function(){Qe(this)?Ye(this):Xe(this);this.A-=2},function(){this.Yb=!1;this.Se[this.U()].call(this,Nh,gh);this.Yb&&(this.F=this.F&~this.C|this.tb&this.C)},function(){this.Yb=!1;this.Pc[this.U()].call(this,Oh,gh);this.Yb&&(this.F=this.F&~this.C|this.tb&this.C,this.H=this.H&~this.C|this.lc&this.C)},function(){Ye(this);
            this.A-=2},function(){Xe(this);this.A-=2},function(){this.aa&=~Qb;this.A-=this.B.Kl},function(){this.aa|=Qb;this.S|=4;this.A-=2},function(){this.aa&=~Pb;this.A-=2},function(){this.aa|=Pb;this.A-=2},function(){this.Se[this.U()].call(this,Id,gh)},function(){this.Pc[this.U()].call(this,Jd,gh)}],Ah=[xf,gg,vf,pg,zf,Tg,Zg,Kf],Kh=[yf,ng,wf,qg,Af,Ug,$g,Lf],Lh=[function(a,b){this.A-=this.Ma===n?this.B.ac:this.B.ym;return b},ah,ah,ah,ah,ah,ah,ah],Mh=[function(a,b){this.A-=this.Ma===n?this.B.qm:this.B.om;return b},
            bh,bh,bh,bh,bh,bh,bh],Bh=[function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;af(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;af(this,
            c,e,128)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);We(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.Gb;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,We(this,a,128,c&1,a&128));return a},bh,function(a,b){var c=b&this.Gb;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,We(this,a,128,c&1));return a}],Ch=[function(a,b){var c=a,d=b&this.Gb;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>16-d)&65535):e=a<<15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;
            if(d){var e;(d&=15)?(e=a<<16-d,c=(a>>>d|e)&65535):e=a;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=bf(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;af(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=0;16<d?c=0:(e=a<<d-1,c=e<<1&65535);We(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,
            b){var c=b&this.Gb;c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,We(this,a,32768,c&1,a&32768));return a},bh,function(a,b){var c=b&this.Gb;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,We(this,a,32768,c&1));return a}],Dh=[function(a,b){var c=a,d=b&this.Gb;d&&(c=a<<d|a>>>32-d,af(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.Gb;if(d){var e=a<<32-d,c=a>>>d|e;af(this,c,e,-2147483648)}return c},function(a,b){var c=a,d=b&this.Gb;d&&(c=bf(this),c=a<<d|c<<d-1|a>>>32-d>>>1,af(this,c,a<<d-1,-2147483648));
            return c},function(a,b){var c=a,d=b&this.Gb;d&&(c=bf(this),c=a>>>d|c<<32-d|a<<32-d<<1,af(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.Gb;d&&(d=a<<d-1,c=d<<1,We(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.Gb;c&&(c=a>>>c-1,a=c>>>1,We(this,a,-2147483648,c&1,a&-2147483648));return a},bh,function(a,b){var c=b&this.Gb;c&&(c=a>>c-1,a=c>>1,We(this,a,-2147483648,c&1));return a}],Nh=[function(a,b){b=this.U();We(this,a&b,128);this.A-=this.X===
            n?this.B.Yj:this.B.Xj;this.S|=2;return a},bh,function(a){this.A-=this.X===n?this.B.Tg:this.B.Sg;return a^255},function(a){var b=-a|0;Pe(this,0,a,b,191,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&255},function(a){this.Yb=!0;this.tb=(this.F&255)*a&65535;this.tb&65280?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.um:this.B.tm;this.S|=2;return a},function(a){var b=(this.F<<24>>24)*(a<<24>>24)|0;this.Yb=!0;this.tb=b&65535;127<b||-128>b?(Xe(this),Ze(this)):(Ye(this),$e(this));
            this.A-=this.X===n?this.B.$l:this.B.Zl;this.S|=2;return a},function(a,b){if(!a)return ch.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return ch.call(this),a;this.Yb=!0;this.tb=c&255|(b%a&255)<<8;this.A-=this.X===n?this.B.Sl:this.B.Rl;this.S|=2;return a},function(a,b){if(!a)return ch.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.la&&-128==d)return ch.call(this),a;this.Yb=!0;this.tb=d&255|(b%c&255)<<8;this.A-=this.X===n?this.B.Wl:this.B.Vl;this.S|=2;return a}],
            Oh=[function(a,b){b=this.oa();We(this,a&b,32768);this.A-=this.X===n?this.B.Yj:this.B.Xj;this.S|=2;return a},bh,function(a){this.A-=this.X===n?this.B.Tg:this.B.Sg;return a^65535},function(a){var b=-a|0;Pe(this,0,a,b,32831,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&65535},function(a,b){if(2==this.pa){b=this.F&65535;var c=b*a|0;this.Yb=!0;this.tb=c&65535;this.lc=c>>16&65535}else fg.call(this,a,this.F);this.lc?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.wm:this.B.vm;this.S|=
            2;return a},function(a,b){var c;if(2==this.pa)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Yb=!0,this.tb=c&65535,this.lc=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);fg.call(this,c,d);e&&(this.tb=~this.tb+1|0,this.lc=~this.lc+(this.tb?0:1)|0);c=this.lc!=this.tb>>31}c?(Xe(this),Ze(this)):(Ye(this),$e(this));this.A-=this.X===n?this.B.bm:this.B.am;this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return ch.call(this),a;b=65536*(this.H&65535)+
            (this.F&65535);var c=b/a|0;if(65536<=c)return ch.call(this),a;this.Yb=!0;this.tb=c&65535;this.lc=b%a&65535}else{Of.call(this,this.F,this.H,a);if(!this.Yb)return ch.call(this),a;this.tb|=0;this.lc|=0}this.A-=this.X===n?this.B.Ul:this.B.Tl;this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return ch.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.la&&-32768==d)return ch.call(this),a;this.Yb=!0;this.tb=d&65535;this.lc=b%c&65535}else{var c=this.F,d=this.H,
            e=a,g=!1,l=!1;0>e&&(e=-e|0,g=!g);0>d&&(c=-c|0,d=~d+(c?0:1)|0,l=!0,g=!g);Of.call(this,c,d,e);2147483647<this.tb&&(this.Yb=!1);g&&(this.tb=-this.tb);l&&(this.lc=-this.lc);if(!this.Yb)return ch.call(this),a;this.tb|=0;this.lc|=0}this.A-=this.X===n?this.B.Yl:this.B.Xl;this.S|=2;return a}],Id=[function(a){var b=a+1|0;Pe(this,a,1,b,190);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&255},function(a){var b=a-1|0;Pe(this,a,1,b,190,!0);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&255},bh,bh,bh,bh,bh,bh],
            Jd=[function(a){var b=a+1|0;Pe(this,a,1,b,32830);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&65535},function(a){var b=a-1|0;Pe(this,a,1,b,32830,!0);this.A-=this.X===n?this.B.Rg:this.B.Qg;return b&65535},function(a){x(this,q(this));D(this,a);this.A-=this.X===n?this.B.Ql:this.B.Pl;this.S|=2;return a},function(a){if(this.X===n)return bh.call(this,a);Jf.call(this,a,this.ra(this.X+this.pa));this.A-=this.B.Nl;this.S|=2;return a},function(a){D(this,a);this.A-=this.X===n?this.B.km:this.B.jm;this.S|=2;
            return a},function(a){if(this.X===n)return bh.call(this,a);Bd(this,a,this.ra(this.X+this.pa));this.zh&&Ge(this,this.sa);this.A-=this.B.hm;this.S|=2;return a},function(a){var b=a;this.S&512&&(a=a-2&65535,80286>this.la&&(b=a));x(this,b);this.A-=this.X===n?this.B.Ac:this.B.Am;this.S|=2;return a},ah],de=Array(256);de[0]=function(){var a=this.U();16>(a&56)&&(this.S|=1);this.Pc[a].call(this,this.hn,gh)};de[1]=function(){var a=this.U();a&16||(this.S|=1);this.Pc[a].call(this,Ph,gh)};
            de[2]=function(){this.Oa[this.U()].call(this,Vf)};de[3]=function(){this.Oa[this.U()].call(this,ag)};
            de[5]=function(){this.ta.Qa?ud.call(this,13,0,!0):(gf(this,this.ra(2054)),this.J=this.ra(2086),this.K=this.ra(2088),this.L=this.ra(2090),this.D=this.ra(2094),this.H=this.ra(2096),this.G=this.ra(2098),this.F=this.ra(2100),vd(this.Na,2102,this.ra(2084)),vd(this.ta,2108,this.ra(2082)),vd(this.ua,2114,this.ra(2080)),vd(this.ab,2120,this.ra(2078)),Ad(this,this.ra(2072)),D(this,this.ra(2074)),u(this,this.ra(2092)),this.Ed=this.ra(2126)|this.Ra(2128)<<16,this.zf=this.Ed+this.ra(2130),vd(this.xd,2132,this.ra(2076)),
            this.Fd=this.ra(2138)|this.Ra(2140)<<16,this.Af=this.Fd+this.ra(2142),vd(this.bb,2144,this.ra(2070)),this.A-=195)};de[6]=function(){this.ta.Qa?ud.call(this,13,0):(this.ob&=-9,this.A-=2)};de[11]=Ld;var y=[];y[32]=function(){var a=this.U()|192;if(this.ta.Qa)ud.call(this,13,0);else{switch((a&56)>>3){case 0:this.Qd=this.ob;break;case 1:this.Qd=this.hi;break;case 2:this.Qd=this.Vf;break;case 3:this.Qd=this.Wf;break;default:ee.call(this);return}ye(this,4);this.Oa[a].call(this,eg)}};
            y[34]=function(){var a,b=this.U()|192;if(this.ta.Qa)ud.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:Ld.call(this);return}ye(this,4);this.Oa[b].call(this,cg);switch(c){case 0:c=this.F;this.F=a;this.ob=c;oe(this);this.ob&-2147483648?me(this):this.na!=this.Pe&&(this.na=this.Pe,this.ui=this.Sk=null);break;case 1:this.hi=this.G;this.G=a;break;case 2:this.Vf=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.Wf=
            c,this.ob&-2147483648&&me(this)}}};y[128]=function(){var a=this.oa();Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[129]=function(){var a=this.oa();Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[130]=function(){var a=this.oa();Qe(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[131]=function(){var a=this.oa();Qe(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
            y[132]=function(){var a=this.oa();Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[133]=function(){var a=this.oa();Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[134]=function(){var a=this.oa();Qe(this)||Te(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[135]=function(){var a=this.oa();Qe(this)||Te(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
            y[136]=function(){var a=this.oa();Ue(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[137]=function(){var a=this.oa();Ue(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[138]=function(){var a=this.oa();Re(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[139]=function(){var a=this.oa();Re(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};
            y[140]=function(){var a=this.oa();!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[141]=function(){var a=this.oa();!Ue(this)==!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[142]=function(){var a=this.oa();Te(this)||!Ue(this)!=!Ve(this)?(D(this,q(this)+a),this.A-=this.B.Ia):this.A-=this.B.Ja};y[143]=function(){var a=this.oa();Te(this)||!Ue(this)!=!Ve(this)?this.A-=this.B.Ja:(D(this,q(this)+a),this.A-=this.B.Ia)};y[144]=function(){rg.call(this,sg)};
            y[145]=function(){rg.call(this,sg)};y[146]=function(){rg.call(this,tg)};y[147]=function(){rg.call(this,ug)};y[148]=function(){rg.call(this,vg)};y[149]=function(){rg.call(this,wg)};y[150]=function(){rg.call(this,xg)};y[151]=function(){rg.call(this,yg)};y[152]=function(){rg.call(this,zg)};y[153]=function(){rg.call(this,Ag)};y[154]=function(){rg.call(this,Bg)};y[155]=function(){rg.call(this,Cg)};y[156]=function(){rg.call(this,Dg)};y[157]=function(){rg.call(this,Eg)};y[158]=function(){rg.call(this,Fg)};
            y[159]=function(){rg.call(this,Gg)};y[160]=function(){x(this,this.Cc.ia);this.A-=this.B.nf};y[161]=function(){var a=this.La();this.Cc.load(a);this.A-=this.B.ac};y[163]=function(){this.Jb[this.U()].call(this,Ff);this.X!==n&&(this.A-=this.B.Yq)};y[164]=function(){this.Jb[this.U()].call(this,2==this.pa?Jg:Kg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[165]=function(){this.Jb[this.U()].call(this,2==this.pa?Lg:Mg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[168]=function(){x(this,this.Dc.ia);this.A-=this.B.nf};
            y[169]=function(){var a=this.La();this.Dc.load(a);this.A-=this.B.ac};y[171]=function(){this.Jb[this.U()].call(this,If);this.X!==n&&(this.A-=this.B.Hl)};y[172]=function(){this.Jb[this.U()].call(this,2==this.pa?Pg:Qg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[173]=function(){this.Jb[this.U()].call(this,2==this.pa?Rg:Sg);this.A-=this.X===n?this.B.Tj:this.B.Sj};y[175]=function(){this.Oa[this.U()].call(this,2==this.pa?Sf:Tf)};y[178]=function(){this.Oa[this.U()].call(this,bg)};
            y[179]=function(){this.Jb[this.U()].call(this,Hf);this.X!==n&&(this.A-=this.B.Hl)};y[180]=function(){this.Oa[this.U()].call(this,Zf)};y[181]=function(){this.Oa[this.U()].call(this,$f)};
            y[182]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Qc[b].call(this,dg);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.he=this.he&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
            this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.X===n?this.B.Jj:this.B.Ij};y[183]=function(){var a=this.U();ye(this,2);this.Oa[a].call(this,dg);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.he&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.X===n?this.B.Jj:this.B.Ij};
            y[186]=function(){this.Pc[this.U()].call(this,Qh,this.U)};y[187]=function(){this.Jb[this.U()].call(this,Gf);this.X!==n&&(this.A-=this.B.Hl)};y[188]=function(){this.Oa[this.U()].call(this,Df)};y[189]=function(){this.Oa[this.U()].call(this,Ef)};
            y[190]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Qc[b].call(this,dg);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.he=this.he&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
            this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.X===n?this.B.Jj:this.B.Ij};
            y[191]=function(){var a=this.U();ye(this,2);this.Oa[a].call(this,dg);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.he=this.he<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.X===n?this.B.Jj:this.B.Ij};
            var He=[function(){this.A-=2+(this.X===n?0:1);return this.xd.ia},function(){this.A-=2+(this.X===n?0:1);return this.bb.ia},function(a){this.S|=2;this.xd.load(a);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.bb.load(a)!==n&&(this.Ib(this.bb.Dd+4,this.bb.Pb|=512),this.bb.type=768);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Sb.load(a,!0)!==n&&2048!=(this.Sb.Pb&2560)&&(this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(a&3)||7168==(this.Sb.Pb&7168)))return ff(this),
            a;df(this);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Sb.load(a,!0)!==n&&512==(this.Sb.Pb&2560)&&this.Sb.zc>=this.ta.Qa&&this.Sb.zc>=(a&3))return ff(this),a;df(this);return a},bh,bh],Kd=[be,be,be,be,be,be,bh,bh],Ph=[function(a){if(this.X===n)Ld.call(this);else{a=this.zf-this.Ed;var b=this.Ed;80286==this.la?b|=-16777216:80386<=this.la&&(2==this.pa?b&=16777215:a|=b<<16);this.vk(this.X+2,b);this.A-=11}return a},function(a){if(this.X===n)Ld.call(this);else{a=this.Af-this.Fd;var b=
            this.Fd;80286==this.la?b|=-16777216:80386<=this.la&&(2==this.pa?b&=16777215:a|=b<<16);this.vk(this.X+2,b);this.A-=12}return a},function(a){this.X===n?Ld.call(this):(this.Ed=this.de(this.X+2)&(this.C|this.C<<8),a&=65535,this.zf=this.Ed+a,this.S|=2,this.A-=11);return a},function(a){this.X===n?Ld.call(this):(this.Fd=this.de(this.X+2)&(this.C|this.C<<8),a&=65535,this.Af=this.Fd+a,this.S|=2,this.A-=12);return a},function(){this.A-=2+(this.X===n?0:1);return this.ob},bh,function(a){gf(this,a);this.A-=this.X===
            n?3:6;this.S|=2;return a},bh],Qh=[bh,bh,bh,bh,Ff,If,Hf,Gf],z=[function(a){a=a.call(this,this.F&255,F(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,F(this,
            this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,U(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,F(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J));this.G=this.G&-256|
            a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,H(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,H(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,F(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,U(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=
            a.call(this,this.G&255,F(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,
            this.H&255,F(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,U(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,F(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J));
            this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,H(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,F(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,U(this)));this.D=this.D&-256|a;this.A-=
            this.B.da},function(a){a=a.call(this,this.D&255,F(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J));this.F=this.F&
            -65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,F(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,F(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.K));this.G=
            this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,F(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,
            F(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,F(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,
            this.H>>8&255,H(this,this.L+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,F(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=
            a.call(this,this.H>>8&255,F(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=
            this.B.ba},function(a){a=a.call(this,this.D>>8&255,F(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,F(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.D+this.K+this.M()));this.F=this.F&-256|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+this.M()));
            this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,
            this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.G&255,F(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},
            function(a){a=a.call(this,this.H&255,F(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=
            this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+this.M()));this.D=
            this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&
            255,H(this,this.L+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.M()));this.F=this.F&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
            this.G>>8&255,H(this,this.L+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.M()));this.G=this.G&-65281|
            a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=
            a.call(this,this.H>>8&255,F(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K+this.M()));this.D=
            this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=
            a.call(this,this.D>>8&255,F(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.D+this.J+U(this)));this.F=this.F&
            -256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,H(this,this.L+this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+U(this)));this.F=
            this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.D+this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,H(this,this.L+
            this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+
            this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.D+this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,H(this,this.L+this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.H&255,F(this,this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.D+this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=
            a.call(this,this.D&255,H(this,this.L+this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,H(this,this.L+this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,F(this,this.D+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.J+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.J+U(this)));
            this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.G>>8&255,F(this,this.D+this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+U(this)));this.G=
            this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,
            this.H>>8&255,F(this,this.D+this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+U(this)));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
            this.D>>8&255,H(this,this.L+this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+U(this)));this.D=this.D&-65281|
            a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=
            a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=
            a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=
            a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=
            a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},
            function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,
            this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>
            8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&
            -65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
            a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],qe=[function(a){a=a.call(this,
            L(this,this.D+this.K),this.F&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,U(this)),this.F&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.G&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G&255);Q(this,a);this.A-=this.B.ba},
            function(a){a=a.call(this,L(this,this.K),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H&255);Q(this,a);this.A-=this.B.ca},
            function(a){a=a.call(this,M(this,this.L+this.K),this.H&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H&255);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.D+this.K),this.D&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.D&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D&255);Q(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.F>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F>>
            8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+
            this.J),this.G>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,L(this,this.D),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.H>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);Q(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.D>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),
            this.D>>8&255);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D>>8&255);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,
            this.D+this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&
            255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+
            this.M()),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,M(this,this.L+this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.F>>
            8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.D+this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
            this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D>>8&255);
            Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.D+this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),
            this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),
            this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.L+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
            this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.L+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
            this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.H>>8&255);Q(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.L+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,
            M(this,this.L+this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],
            z[201],z[209],z[217],z[225],z[233],z[241],z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],re=[function(a,b){var c=a[0].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,
            b){var c=a[0].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
            L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.J),
            b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=
            this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[2].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,
            M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D+this.K),b.call(this));
            Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=
            this.B.N},function(a,b){var c=a[4].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,
            b){var c=a[5].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,
            this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));
            Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.K),b.call(this));Q(this,c);this.A-=
            this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=
            a[0].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,
            M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[4].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.J+this.M()),
            b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+
            this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=
            a[7].call(this,M(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=
            this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=
            this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+U(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+U(this)),
            b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+U(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,
            L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
            L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=
            a[4].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[5].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+U(this)),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+U(this)),b.call(this));
            Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+U(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&
            255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,
            this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
            a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
            a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
            a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|
            c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=
            this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));
            this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));
            this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&
            255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,
            this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],A=[function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,
            this.F&this.C,I(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,U(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,I(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&
            this.C,I(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&this.C,I(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.G&this.C,I(this,U(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,I(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=
            a.call(this,this.H&this.C,K(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,I(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,U(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&this.C,I(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,I(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,I(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.D&this.C,I(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,U(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,I(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=
            a.call(this,r(this)&this.C,K(this,this.L+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,I(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},
            function(a){a=a.call(this,r(this)&this.C,I(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J));this.L=this.L&~this.C|
            a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,I(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,U(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,I(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K));this.K=this.K&~this.C|a;
            this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,I(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.J));this.K=this.K&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,U(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,I(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K));
            this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,I(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,U(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,I(this,this.D));
            this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.F&this.C,I(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
            this.C,I(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+
            this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},
            function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.M()));this.D=
            this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},
            function(a){a=a.call(this,r(this)&this.C,I(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K+
            this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,I(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J+this.M()));
            this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.K&this.C,K(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K+this.M()));this.J=this.J&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,
            I(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.J+U(this)));this.F=this.F&~this.C|a;
            this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.K+
            U(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.K+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.K+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&this.C,I(this,this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.J+U(this)));this.H=this.H&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,
            K(this,this.L+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.D+this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.K+U(this)));this.D=this.D&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+U(this)));
            this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},
            function(a){a=a.call(this,r(this)&this.C,I(this,this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.K+U(this)));
            this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.L&this.C,I(this,this.J+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.J+U(this)));this.K=this.K&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
            K(this,this.L+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.K+U(this)));this.J=this.J&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+U(this)));
            this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=
            this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=
            a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,
            this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=
            this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=
            a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,
            r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,
            this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=
            this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=
            a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
            this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],se=[function(a){a=a.call(this,N(this,this.D+this.K),this.F&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.F&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.F&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.F&this.C);R(this,a);this.A-=this.B.ba},function(a){a=
            a.call(this,N(this,this.K),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.F&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.G&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.G&this.C);R(this,a);this.A-=this.B.ca},
            function(a){a=a.call(this,P(this,this.L+this.K),this.G&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.G&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.G&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.G&this.C);R(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.H&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.H&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.H&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.H&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,
            this.J),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.H&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.D&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.D&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.D&this.C);R(this,a);this.A-=this.B.ca},function(a){a=
            a.call(this,P(this,this.L+this.J),this.D&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.D&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),r(this)&this.C);R(this,a);this.A-=this.B.ba},
            function(a){a=a.call(this,N(this,this.D+this.J),r(this)&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),r(this)&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),r(this)&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),r(this)&this.C);
            R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.L&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.L&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.L&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.L&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,
            N(this,this.K),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.L&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.K&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.K&this.C);R(this,a);this.A-=this.B.ca},function(a){a=
            a.call(this,P(this,this.L+this.K),this.K&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.K&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.K&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.K&this.C);R(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,N(this,this.D+this.K),this.J&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.J&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.K),this.J&this.C);R(this,a);this.A-=this.B.ca},function(a){a=a.call(this,P(this,this.L+this.J),this.J&this.C);R(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);
            R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.J&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,P(this,this.L+this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+
            this.M()),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&
            this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.H&this.C);R(this,
            a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.D+this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+
            this.M()),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);
            R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);R(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,P(this,this.L+this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+
            this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),
            this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.F&this.C);R(this,a);
            this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.D+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,
            this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.H&this.C);
            R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,this.D+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,N(this,this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+
            U(this)),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),r(this)&this.C);
            R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.L&this.C);R(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,
            N(this,this.D+this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),
            this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.Q},function(a){a=a.call(this,P(this,this.L+this.J+U(this)),this.J&this.C);
            R(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],
            A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],te=[function(a,b){var c=a[0].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.D+this.J),
            b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,U(this)),b.call(this));R(this,c);
            this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},
            function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,
            N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,U(this)),b.call(this));
            R(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,P(this,this.L+this.J),b.call(this));R(this,c);
            this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=
            a[4].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
            U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,P(this,this.L+this.J),
            b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=
            this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,
            b){var c=a[6].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D+this.K),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.D+this.J),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,P(this,this.L+this.K),b.call(this));R(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,
            P(this,this.L+this.J),b.call(this));R(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+this.M()),
            b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=
            a[1].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,
            b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,
            c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+this.M()),b.call(this));
            R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+
            this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,
            P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=
            a[4].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=
            this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,
            c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),
            b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,
            this.L+this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,this.L+this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,
            b){var c=a[0].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,
            b){var c=a[1].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},
            function(a,b){var c=a[1].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);
            this.A-=this.B.Q},function(a,b){var c=a[2].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+U(this)),b.call(this));R(this,
            c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+U(this)),
            b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+
            U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,
            this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,
            P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,
            b){var c=a[6].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[7].call(this,P(this,this.L+this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,P(this,this.L+this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=
            this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&
            this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=
            a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|
            c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));
            this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&
            this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=
            a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|
            c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));
            u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,
            this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,
            b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=
            this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],B=[function(a){a=a.call(this,this.F&255,F(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&
            255,F(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,V(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,U(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,F(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.F));this.G=this.G&-256|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,V(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,U(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=a.call(this,
            this.G&255,F(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,F(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.F));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.D));this.H=this.H&
            -256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,V(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,U(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,F(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,F(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.D&255,F(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,V(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,U(this)));this.D=this.D&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&255,F(this,this.K));
            this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,F(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.D));this.F=this.F&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,V(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,F(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,F(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.F));this.G=this.G&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,V(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,U(this)));this.G=this.G&
            -65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,F(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,F(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.H));this.H=this.H&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.H>>8&255,F(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,F(this,this.J));this.H=this.H&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,0)));this.D=this.D&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,F(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,F(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,F(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.G+this.M()));this.F=
            this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,V(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.K+this.M()));
            this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+this.M()));
            this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,V(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.F+this.M()));
            this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,V(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+this.M()));
            this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.H+this.M()));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,V(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+this.M()));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.F>>8&255,F(this,V(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.F+this.M()));this.G=this.G&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,V(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,
            this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=
            a.call(this,this.H>>8&255,F(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+this.M()));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&
            255,F(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.F+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.G+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.H+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.D+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,V(this,2)+U(this)));this.F=this.F&-256|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.F&255,H(this,this.L+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.K+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.J+U(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.F+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.G+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&255,F(this,this.H+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.D+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,V(this,2)+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,H(this,this.L+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.K+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&255,F(this,this.J+U(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.F+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.G+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.H+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.D+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.H&255,F(this,V(this,2)+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,H(this,this.L+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.K+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.J+U(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.F+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,F(this,this.G+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.H+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.D+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,V(this,2)+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,H(this,this.L+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,F(this,this.K+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.J+U(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.F+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.G+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.H+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.F>>8&255,F(this,this.D+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,V(this,2)+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,H(this,this.L+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.K+U(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.J+U(this)));this.F=
            this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.F+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.G+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.H+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.D+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
            8&255,F(this,V(this,2)+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,H(this,this.L+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.K+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.J+U(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.F+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.H>>8&255,F(this,this.G+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.H+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.D+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,V(this,2)+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,H(this,this.L+U(this)));this.H=
            this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.K+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.J+U(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.F+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.G+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>
            8&255,F(this,this.H+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.D+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,V(this,2)+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,H(this,this.L+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.K+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.D>>8&255,F(this,this.J+U(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,
            this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&
            255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,
            this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,
            this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>
            8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);
            this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|
            a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
            a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],ue=[function(a){a=a.call(this,
            L(this,this.F),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.F&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),
            this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.G&255);
            Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H&255);Q(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,L(this,this.D),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D&255);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.G),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.D&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.J),this.D&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.D),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.G),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.J),this.H>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,V(this,0)),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),
            this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.K+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.G+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,
            1)+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G>>8&255);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,this.J+this.M()),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.H>>8&
            255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.H+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,1)+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
            this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.L+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.G&255);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+
            U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.K+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.H&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D&255);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.G+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.F>>8&255);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.F>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,V(this,2)+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.G>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.H>>8&255);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.J+U(this)),this.H>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,V(this,2)+U(this)),this.D>>
            8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+U(this)),this.D>>8&255);Q(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],
            B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],ve=[function(a,b){var c=a[0].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.H),b.call(this));
            Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[1].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,U(this)),
            b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},
            function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,
            this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=
            this.B.da},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,
            L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.F),b.call(this));Q(this,
            c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=
            a[5].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));
            Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[7].call(this,L(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,V(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,U(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.K),
            b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,V(this,1)+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,V(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,V(this,2)+U(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+U(this)),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+U(this)),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);
            this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[7].call(this,L(this,V(this,2)+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+U(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,
            this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=
            a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=
            a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,
            b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&
            -256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=
            this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));
            this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&
            255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
            a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
            a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
            a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],C=[function(a){a=a.call(this,this.F&this.C,I(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.G));this.F=
            this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,V(this,0)));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,U(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,I(this,this.K));this.F=this.F&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.G));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.D));this.G=this.G&~this.C|a;this.A-=
            this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,V(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,U(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,I(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,I(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},
            function(a){a=a.call(this,this.H&this.C,I(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,V(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,U(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=
            a.call(this,this.H&this.C,I(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,I(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,I(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,V(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,U(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,I(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,I(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&
            this.C,I(this,this.F));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.G));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.H));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,V(this,0)));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&
            this.C,I(this,U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},function(a){a=a.call(this,r(this)&this.C,I(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,I(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
            I(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,V(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,U(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,I(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,I(this,
            this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.H));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,V(this,0)));
            this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,U(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,I(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,I(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.G));this.J=this.J&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,V(this,0)));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,U(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,I(this,this.K));this.J=this.J&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,I(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,I(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.G+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+this.M()));
            this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,V(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,K(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
            this.C,I(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,V(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,K(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.G+this.M()));this.H=this.H&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,V(this,1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,
            this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&this.C,I(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,V(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,K(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+this.M()));this.D=this.D&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.F+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.G+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.H+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,
            I(this,V(this,1)+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,I(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,V(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+this.M()));this.L=
            this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.F+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
            I(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,V(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,K(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.K&this.C,I(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+this.M()));this.J=this.J&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,V(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.F+
            U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.G+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.H+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.D+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,V(this,2)+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.F&this.C,K(this,this.L+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.K+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.J+U(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.F+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.G+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,I(this,this.H+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.D+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,V(this,2)+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,K(this,this.L+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.K+U(this)));this.G=this.G&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.J+U(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.F+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.G+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.H+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.D+
            U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,V(this,2)+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,K(this,this.L+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.K+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.J+U(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,I(this,this.F+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.G+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.H+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.D+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,V(this,2)+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,K(this,this.L+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.K+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.J+U(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.F+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.G+U(this)));u(this,r(this)&
            ~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.H+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.D+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,V(this,2)+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,K(this,this.L+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&
            this.C,I(this,this.K+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,I(this,this.J+U(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.F+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.G+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.H+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,I(this,this.D+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,V(this,2)+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,K(this,this.L+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.K+U(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.J+U(this)));this.L=this.L&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.F+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.G+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.H+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.D+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,V(this,
            2)+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,K(this,this.L+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.K+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.J+U(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.F+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.J&this.C,I(this,this.G+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.H+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.D+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,V(this,2)+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,K(this,this.L+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.J&this.C,I(this,this.K+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.J+U(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);
            this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|
            a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,
            this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&
            this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&
            ~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=
            a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,
            this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&
            this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&
            ~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=
            a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],we=[function(a){a=a.call(this,N(this,this.F),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.H),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.F&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.F),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.G&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,
            N(this,this.K),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,V(this,0)),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.H&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.H&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.H),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.D&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.F),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),r(this)&this.C);R(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,N(this,this.K),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,V(this,0)),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.L&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,this.H),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.K&this.C);R(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);R(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,this.F),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,V(this,0)),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this)),this.J&this.C);R(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,N(this,this.K),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);R(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);R(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.G+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),
            this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
            this.G+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);R(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,V(this,1)+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),
            this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);R(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,V(this,1)+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.J&this.C);
            R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,1)+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.J+this.M()),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.F&
            this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.F&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.H+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.G&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.G&
            this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,P(this,this.L+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.H&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.D&
            this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.D&this.C);R(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.F+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),
            r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),r(this)&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,this.D+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.L&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+
            U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.K&this.C);R(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.K&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
            this.D+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,V(this,2)+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,P(this,this.L+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+U(this)),this.J&this.C);R(this,a);this.A-=this.B.I},C[192],C[200],C[208],C[216],C[224],C[232],C[240],C[248],C[193],C[201],C[209],
            C[217],C[225],C[233],C[241],C[249],C[194],C[202],C[210],C[218],C[226],C[234],C[242],C[250],C[195],C[203],C[211],C[219],C[227],C[235],C[243],C[251],C[196],C[204],C[212],C[220],C[228],C[236],C[244],C[252],C[197],C[205],C[213],C[221],C[229],C[237],C[245],C[253],C[198],C[206],C[214],C[222],C[230],C[238],C[246],C[254],C[199],C[207],C[215],C[223],C[231],C[239],C[247],C[255]],xe=[function(a,b){var c=a[0].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
            N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));R(this,
            c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=
            a[1].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.G),b.call(this));
            R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,
            b){var c=a[2].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,V(this,0)),
            b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},
            function(a,b){var c=a[4].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
            this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=
            this.B.N},function(a,b){var c=a[5].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,
            N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));R(this,
            c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.F),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.G),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.H),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,V(this,0)),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=
            a[7].call(this,N(this,U(this)),b.call(this));R(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));R(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,
            this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.G+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,V(this,1)+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.K+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
            this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
            this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,V(this,
            2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+
            U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+
            U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+U(this)),
            b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+U(this)),
            b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,P(this,this.L+U(this)),
            b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.G+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+U(this)),b.call(this));
            R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,V(this,2)+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,P(this,this.L+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.K+U(this)),b.call(this));R(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+U(this)),b.call(this));
            R(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
            c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));
            this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],of=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.ha=this.ka;return r(this)+this.F},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+
            this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.ha=this.ka;return r(this)+this.G},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.ha=this.ka;return r(this)+this.H},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.H},
            function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.ha=this.ka;return r(this)+this.D},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.D},function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=
            this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.ha=this.ka;return r(this)+this.L},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+
            this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.ha=this.ka;return r(this)+this.K},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.ha=this.ka;return r(this)+this.J},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+this.J},
            function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.ha=this.ka;return r(this)+(this.F<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+
            (this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.ha=this.ka;return r(this)+(this.G<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+(this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.ha=this.ka;return r(this)+(this.H<<1)},function(a){return(a?(this.ha=this.ka,this.L):
            this.oa())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.ha=this.ka;return r(this)+(this.D<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},
            function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+(this.L<<1)},function(){this.ha=this.ka;return r(this)+(this.L<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<1)},function(){return this.K+
            (this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.ha=this.ka;return r(this)+(this.K<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<1)},function(){return this.K+(this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+
            (this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.ha=this.ka;return r(this)+(this.J<<1)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+(this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.ha=this.ka;return r(this)+(this.F<<2)},function(a){return(a?(this.ha=this.ka,this.L):
            this.oa())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.ha=this.ka;return r(this)+(this.G<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+
            (this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.ha=this.ka;return r(this)+(this.H<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+(this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.ha=this.ka;return r(this)+(this.D<<2)},function(a){return(a?
            (this.ha=this.ka,this.L):this.oa())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+
            (this.L<<2)},function(){this.ha=this.ka;return r(this)+(this.L<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+(this.K<<2)},function(){this.ha=this.ka;return r(this)+(this.K<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<2)},function(){return this.K+
            (this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.ha=this.ka;return r(this)+(this.J<<2)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<2)},function(){return this.K+(this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+
            (this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.ha=this.ka;return r(this)+(this.F<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+(this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.ha=this.ka;return r(this)+(this.G<<3)},function(a){return(a?(this.ha=this.ka,this.L):
            this.oa())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.ha=this.ka;return r(this)+(this.H<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+
            (this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.ha=this.ka;return r(this)+(this.D<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.ka;return r(this)},function(a){return a?(this.ha=this.ka,this.L):this.oa()},function(){return this.K},
            function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.ha=this.ka;return r(this)+(this.L<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.L<<3)},function(){return this.K+(this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+
            (this.K<<3)},function(){this.ha=this.ka;return r(this)+(this.K<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+(this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.ha=this.ka;return r(this)+(this.J<<3)},function(a){return(a?(this.ha=this.ka,this.L):this.oa())+(this.J<<3)},function(){return this.K+
            (this.J<<3)},function(){return this.J+(this.J<<3)}];
            function Rh(a){Wa.call(this,"ChipSet",a,Rh,32768);this.la=(this.la=a.model)&&Sh[this.la]||Th;this.mc=0;var b=a.sw1;if(b)this.mc=Uh(b,Vh|Wh.Yo);else{this.Qe=[360,360];(b=a.floppies)&&b.length&&(this.Qe=b);if(b=this.Qe.length)this.mc|=Xh.zk,b--,this.mc|=(b&3)<<Xh.mh;if(b=a.monitor||(this.la<Yh?"mono":"ega"),void 0!==Zh[b])this.mc|=Zh[b]<<Wh.mh}this.wf=Uh(a.sw2||"11110000",0);this.Hq=this.la==Th?16:64;this.Ni=this.Ah=1;this.la>=Yh&&(this.Ni=this.Ah=2);this.ff=a.scaleTimers||!1;this.Gs=a.rtcDate;this.Rn=
            !1;a.sound&&(this.Wk=this.Eh=null,window&&(this.Wk=window.AudioContext||window.webkitAudioContext),this.Wk&&(this.Eh=new this.Wk));this.reset(!0);pb(this)}fb(Rh);var Th=5150,Yh=5170,Sh={5150:Th,5160:5160,5170:Yh,deskpro386:5180},Zh={none:0,tv:1,color:2,mono:3,ega:0,vga:0},Xh={zk:1,ONE:0,Nt:64,Lt:128,kt:192,lh:192,mh:6},Vh=12,Wh={Mt:16,ct:32,Yo:48,lh:48,mh:4};f=Rh.prototype;
            f.Lb=function(a,b,c){switch(b){case "sw1":return this.va[b]=c,$h(this,b,c,this.mc,{0:this.la==Th?"Bootable Floppy Drive":"Loop on POST",1:this.la==Th?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.la==Th)return this.va[b]=c,$h(this,b,c,this.wf,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.va[b]=c,!0}return!1};
            f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.Ka=yb(a,"Keyboard");this.dk=c.T.ee/1193181;oc(b,this,ai);sc(b,this,bi);this.la<Yh?(oc(b,this,ci),sc(b,this,di)):(oc(b,this,ei),sc(b,this,fi));if(d){var e=this;gi(d,1024,function(){for(var a=0;a<e.cc.length;a++){for(var b=e.cc[a],c="PIC"+a+":",d=0;d<b.Oc.length;d++)c+=" IC"+(d+1)+"="+k(b.Oc[d]);c+=" IMR="+k(b.Vd)+" IRR="+k(b.Wb)+" ISR="+k(b.Sc)+" DELAY="+b.Pg;e.Y.R(c)}});gi(d,2048,function(){for(var a=0;a<e.Nb.length;a++){hi(e,a);var b=
            e.Nb[a],c="TIMER"+a+":",d=0;if(null!=b.$d)for(var v=0;v<=b.$d;v++)d|=b.eb[v]<<8*v;c+=" mode="+b.mode+" bytes="+b.$d+" count="+ha(d);e.Y.R(c)}});gi(d,4096,function(){for(var a="",b=0;64>b;b++){var c=13>=b?ii(e,b):e.ga[b];a&&(a+="\n");a+="CMOS["+k(b)+"]: "+k(c)}e.Y.R(a)})}Be(c,26,this,this.Gq)};f.kc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(a){var b;this.Sd=this.mc;this.dg=this.wf;ji(this);this.ub=Array(this.Ni);for(b=0;b<this.Ni;b++)ki(this,b);this.cc=Array(this.Ah);li(this,0,32);1<this.Ah&&li(this,1,160);this.rn=this.Ok=null;this.Nb=Array(5180==this.la?6:3);for(b=0;b<this.Nb.length;b++)mi(this,b);this.xh=this.Pk=this.Tc=this.Ki=null;this.Ji=0;if(this.la>=Yh){this.jb=16;this.me=0;this.Ud=16;this.Ei=0;this.ne=160;512<=ni(this)&&(this.ne|=16);3==oi(this)&&(this.ne|=64);5180==this.la&&(this.ne|=12);this.Fi=3;this.ng=Array(8);
            this.Bf=0;a&&(this.ga=Array(64));pi(this,this.Gs);for(a=21;24>=a;a++)this.ga[a]=0;for(a=14;46>a;a++)void 0===this.ga[a]&&(this.ga[a]=0);this.ga[20]=this.Sd&(Wh.lh|2|Xh.zk|Xh.lh);this.ga[16]=qi(this,0)<<4|qi(this,1);ri(this)}};
            function pi(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.R("CMOS date invalid ("+b+"), using "+c)):b&&a.R("CMOS date: "+c);a.ga[0]=c.getSeconds();a.ga[1]=0;a.ga[2]=c.getMinutes();a.ga[3]=0;a.ga[4]=c.getHours();a.ga[5]=0;a.ga[6]=c.getDay()+1;a.ga[7]=c.getDate();a.ga[8]=c.getMonth()+1;c=c.getFullYear();a.ga[9]=c%100;c/=100;a.ga[50]=c%10|c/10<<4;a.ga[10]=38;a.ga[11]=2;a.ga[12]=0;a.ga[13]=128;a.ci=a.Vg=0;a.so=a.bk=null}
            function ii(a,b){var c=a.ga[b];if(10>b){var d=!1;4!=b&&5!=b||a.ga[11]&2||(c=12>c?c?c:12:(c-=12)?c+128:140,d=!0);a.ga[11]&4||(d&&128<c&&(c-=48),c=c%10|c/10<<4)}else 10==b&&(a.ga[b]^=128);return c}function si(a){var b;void 0===b&&(b=a.bk);a.Vg=cd(a.O,a.ff)+b;a.ga[11]&64&&hd(a.O,b)}function ri(a){for(var b=0,c=16;46>c;c++)b+=a.ga[c];a.ga[47]=b&255;a.ga[46]=b>>8}
            f.save=function(){var a=new Ie(this);a.set(0,[this.mc,this.wf,this.Sd,this.dg]);for(var b=[],c=0;c<this.ub;c++){for(var d=this.ub[c],e=d,g=[],l=0;l<e.Tb.length;l++){var p=e.Tb[l];g[l]=[p.xe,p.zi,p.oc,p.ib,p.eb,p.mode,p.Li,p.Bs,p.Ds]}b[c]=[d.Ye,d.Mk,d.sn,d.vb,g]}a.set(1,[b]);b=[];for(c=0;c<this.cc.length;c++)d=this.cc[c],b[c]=[d.Pg,d.Oc,d.Be,d.Vd,d.Wb,d.Sc,d.Cf,d.wh];a.set(2,[b]);b=[];for(c=0;c<this.Nb.length;c++)d=this.Nb[c],b[c]=[d.oc,d.Vc,d.eb,d.Jf,d.un,d.mode,d.rk,d.bf,d.$d,d.be,d.Nh,d.Of,d.Nd];
            a.set(3,[this.Ok,b,this.rn]);a.set(4,[this.Ki,this.Tc,this.Pk,this.xh,this.Ji]);this.la>=Yh&&(a.set(5,[this.jb,this.me,this.Ud,this.Ei,this.ne,this.Fi]),a.set(6,[this.ng[7],this.ng,this.Bf,this.ga,this.ci,this.Vg]));return a.data()};
            f.restore=function(a){var b,c;b=a[0];this.mc=b[0];this.wf=b[1];this.Sd=b[2];this.dg=b[3];b=a[1];for(c=0;c<this.Ni;c++)ki(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Ah;c++)li(this,c,0===c?32:160,b[0][c]);b=a[3];this.Ok=b[0];this.rn=b[2];for(c=0;c<this.Nb.length;c++)mi(this,c,b[1][c]);b=a[4];this.Ki=b[0];this.Tc=b[1];this.Pk=b[2];this.xh=b[3];this.Ji=b[4];if(b=a[5])this.jb=b[0],this.me=b[1],this.Ud=b[2],this.Ei=b[3],this.ne=b[4],this.Fi=b[5];if(b=a[6])this.ng=b[1],this.ng[7]=b[0],this.Bf=b[2],
            this.ga=b[3],this.ci=b[4],this.Vg=b[5],pi(this);return!0};var ti=[0,null,null,0,Array(4)];function ki(a,b,c){var d=a.ub[b];d||(d={Tb:Array(4)});c=c&&5==c.length?c:ti;d.Ye=c[0];d.Mk=c[1];d.sn=c[2];d.vb=c[3];d.Rq=b<<2;for(var e=0;e<d.Tb.length;e++)ui(d,e,c[4][e]);a.ub[b]=d}var vi=[!0,[0,0],[0,0],[0,0],[0,0]];
            function ui(a,b,c){var d=a.Tb[b];d||(d={zi:[0,0],oc:[0,0],ib:[0,0],eb:[0,0]});c=c&&8==c.length?c:vi;d.xe=c[0];d.zi[0]=c[1][0];d.zi[1]=c[1][1];d.oc[0]=c[2][0];d.oc[1]=c[2][1];d.ib[0]=c[3][0];d.ib[1]=c[3][1];d.eb[0]=c[4][0];d.eb[1]=c[4][1];d.mode=c[5];d.Li=c[6];d.Z=a;d.$n=b;wi(d,c[8],c[9]);a.Tb[b]=d}function wi(a,b,c,d){"string"==typeof b&&(b=hb(b));b&&(a.Ui=null,a.Bs=b.id,a.Ds=c,a.Si=b,a.ol=b[c],a.ek=d)}var xi=[0,Array(4)];
            function li(a,b,c,d){var e=a.cc[b];e||(e={Oc:[null,null,null,null]});d=d&&8==d.length?d:xi;e.port=c;e.ru=b<<3;e.Pg=d[0];e.Oc[0]=d[1][0];e.Oc[1]=d[1][1];e.Oc[2]=d[1][2];e.Oc[3]=d[1][3];e.Be=d[2];e.Vd=d[3];e.Wb=d[4];e.Sc=d[5];e.Cf=d[6];e.wh=d[7];a.cc[b]=e}var yi=[[0,0],[0,0],[0,0],[0,0]];
            function mi(a,b,c){var d=a.Nb[b];d||(d={oc:[0,0],Vc:[0,0],eb:[0,0],Jf:[0,0]});c=c&&13==c.length?c:yi;d.oc[0]=c[0][0];d.oc[1]=c[0][1];d.Vc[0]=c[1][0];d.Vc[1]=c[1][1];d.eb[0]=c[2][0];d.eb[1]=c[2][1];d.Jf[0]=c[3][0];d.Jf[1]=c[3][1];d.un=c[4];d.mode=c[5];d.rk=c[6];d.bf=c[7];d.$d=c[8];d.be=c[9];d.Nh=c[10];d.Of=c[11];d.Nd=c[12];a.Nb[b]=d}function ni(a,b){return((((b?a.mc:a.Sd)&12)>>2)+1)*a.Hq+32*((b?a.wf:a.dg)&15)}function zi(a,b){var c=b?a.mc:a.Sd;return a.la!=Th||c&Xh.zk?((c&Xh.lh)>>Xh.mh)+1:0}
            function qi(a,b){if(b<zi(a)){if(!a.Qe)return 1;if(b<a.Qe.length)switch(a.Qe[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function oi(a,b){return((b?a.mc:a.Sd)&Wh.lh)>>Wh.mh}
            function $h(a,b,c,d,e){for(var g="",l=1;8>=l;l++){var p="pcjs-bitCell";l||(p+=" pcjs-bitCellLeft");g+='<div id="'+(b+"-"+l)+'" class="'+p+'" data-value="0">'+l+"</div>\n"}c.innerHTML=g;b=lb(c,"pcjs-bitCell");c=null;for(l=0;l<b.length;l++)null!=e&&null!=e[l]&&(c=e[l]),c&&b[l].setAttribute("title",c),Ai(b[l],d&1<<l?!1:!0),b[l].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Ai(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.mc=a.mc&~e|
            (c?0:e);break;case "sw2":a.wf=a.wf&~e|(c?0:e)}ji(a)}}(a,b[l])}function Ai(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function ji(a){var b=a.va.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(ni(a,!0)+"Kb");d+=", "+c[oi(a,!0)]+" Monitor";d+=", "+zi(a,!0)+" Floppy Drives";if(null!=a.Sd&&a.Sd!=a.mc||null!=a.dg&&a.dg!=a.wf)d+=" (Reset required)";b.textContent=d}}
            function Bi(a,b,c,d,e){var g=a.ub[b],l=g.Tb[c],p=l.ib[g.vb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".ADDR["+g.vb+"]",p,!0);g.vb^=1;b||0!=c||g.vb||(l.ib[0]++,255<l.ib[0]&&(l.ib[0]=0,l.ib[1]++,255<l.ib[1]&&(l.ib[1]=0)));return p}function Ci(a,b,c,d,e,g){var l=a.ub[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".ADDR["+l.vb+"]",null,!0);a=l.Tb[c];a.ib[l.vb]=a.zi[l.vb]=e;l.vb^=1}
            function Di(a,b,c,d,e){var g=a.ub[b],l=g.Tb[c],p=l.eb[g.vb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".COUNT["+g.vb+"]",p,!0);g.vb^=1;b||0!=c||g.vb||(l.eb[0]--,0>l.eb[0]&&(l.eb[0]=255,l.eb[1]--,0>l.eb[1]&&(l.eb[1]=255)));return p}function Ei(a,b,c,d,e,g){var l=a.ub[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".COUNT["+l.vb+"]",null,!0);a=l.Tb[c];a.eb[l.vb]=a.oc[l.vb]=e;l.vb^=1}function Fi(a,b,c,d){var e=a.ub[b],g=e.Ye|1;e.Ye&=-16;a.qa(768)&&m(a,c,null,d,"DMA"+b+".STATUS",g,!0);return g}
            function Gi(a,b,c,d,e){var g=a.ub[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".REQ",null,!0);a=d&3;g.Ye=g.Ye&~(16<<a)|(d&4)<<a+2;g.sn=d}function Hi(a,b,c,d,e){var g=a.ub[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASK",null,!0);b=d&3;c=g.Tb[b];c.xe=!!(d&4);c.xe||Ii(a,g.Rq+b)}function Ji(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MODE",null,!0);a.ub[b].Tb[d&3].mode=d}function Ki(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASTER_CLEAR",null,!0);a=a.ub[b];for(b=0;b<a.Tb.length;b++)ui(a,b)}
            function Li(a,b,c,d,e){var g=a.ub[b].Tb[c].Li;a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".PAGE",g,!0);return g}function Mi(a,b,c,d,e,g){a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".PAGE",null,!0);a.ub[b].Tb[c].Li=e}function Ni(a,b,c,d){var e=a.ng[b];a.qa(768)&&m(a,c,null,d,"DMA.SPARE"+b+".PAGE",e,!0);return e}function Oi(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA.SPARE"+b+".PAGE",null,!0);a.ng[b]=d}function Pi(a,b,c,d,e){wi(a.ub[b>>2].Tb[b&3],c,d,e)}
            function Ii(a,b,c){b=a.ub[b>>2].Tb[b&3];b.Si&&b.ol&&b.ek?(c&&(b.Ui=c),b.xe||tf(a,b,!0)):c&&c(!0)}function tf(a,b,c){c&&(b.count=b.eb[1]<<8|b.eb[0],b.type=b.mode&12,b.Tn=b.Kd=!1);for(var d=!1;0<=b.count&&(c=b.Li<<16|b.ib[1]<<8|b.ib[0],4==b.type?(d=!0,function(c){b.ol.call(b.Si,b.ek,-1,function(g,l){0>g&&(b.Tn||(b.Tn=!0),g=255);b.xe||a.ma.cd(c,g);(d=l)&&setTimeout(function(){Qi(b)||tf(a,b)},0)})}(c)):8==b.type?(c=a.ma.Ra(c),0>b.ol.call(b.Si,b.ek,c)&&(b.Kd=!0)):0!=b.type&&(b.Kd=!0)),!d&&!Qi(b););}
            function Qi(a){if(!a.Kd&&0<=--a.count&&(a.mode&32?(a.ib[0]--,0>a.ib[0]&&(a.ib[0]=255,a.ib[1]--,0>a.ib[1]&&(a.ib[1]=255))):(a.ib[0]++,255<a.ib[0]&&(a.ib[0]=0,a.ib[1]++,255<a.ib[1]&&(a.ib[1]=0))),!a.xe))return!1;var b=a.Z;b.Ye=b.Ye&~(16<<a.$n)|1<<a.$n;a.mode&16||(a.xe=!0,a.Si=a.ek=null);a.Ui&&(a.Ui(!a.Kd),a.Ui=null);return!0}function Ri(a,b,c){var d=0,e=a.cc[b];if(null!=e.wh)switch(e.wh&3){case 2:d=e.Wb;break;case 3:d=e.Sc}a.qa(34048)&&m(a,e.port,null,c,"PIC"+b,d,!0);return d}
            function Si(a,b,c,d){var e=a.cc[b];a.qa(34048)&&m(a,e.port,c,d,"PIC"+b,null,!0);if(c&16)e.Be=0,e.Oc[e.Be++]=c,e.Vd=0,e.Cf=7,e.Wb=e.Sc=0,e.wh=10;else if(c&8)c&100&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW3 command: "+k(c)),e.wh=c;else if(d=c&224,d&32){var g,l=0;if(96==(d&96))l=1<<(c&7);else for(g=e.Cf+1;;){g&=7;var p=1<<g;if(e.Sc&p){l=p;break}if(g++==e.Cf)break}e.Sc&l&&(e.Sc&=~l,Ti(a));d&128&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW2 rotate command: "+k(c))}else 192==d?e.Cf=c&7:a.Da("PIC"+
            b+"("+k(e.port)+"): unsupported OCW2 automatic EOI command: "+k(c))}function Ui(a,b,c){var d=a.cc[b],e=d.Vd;a.qa(34048)&&m(a,d.port+1,null,c,"PIC"+b,e,!0);return e}function Vi(a,b,c,d){var e=a.cc[b];a.qa(34048)&&m(a,e.port+1,c,d,"PIC"+b,null,!0);e.Be<e.Oc.length?(e.Oc[e.Be++]=c,2==e.Be&&e.Oc[0]&2&&e.Be++,3!=e.Be||e.Oc[0]&1||e.Be++):(e.Vd=c,d=a.O,d.S|=4,Ti(a,b||253!=c?0:6))}function Wi(a,b,c){var d=a.cc[b>>3];b=1<<(b&7);d.Wb&b||(d.Wb|=b,d.Pg=c||0,Ti(a))}
            function Xi(a,b){var c=a.cc[b>>3],d=1<<(b&7);c.Wb&d&&(c.Wb&=~d,Ti(a))}function Ti(a,b){var c,d=-1;1<a.Ah&&(c=a.cc[1],d=~(c.Sc|c.Vd)&c.Wb);c=a.cc[0];0<=d&&(c.Wb=d?c.Wb|4:c.Wb&-5);var d=~(c.Sc|c.Vd)&c.Wb,e=a.O;e.ja&&(e.Ab=d?e.Ab|1:e.Ab&-2);d&&b&&(c.Pg=b)}function rf(a,b){void 0===b&&(b=0);var c=-1,d=a.cc[b];if(d.Pg)c=-2,d.Pg--;else for(var e=d.Wb&((d.Sc|d.Vd)^255),g=d.Cf+1;;){var g=g&7,l=1<<g;if(e&l){c=b||2!=g?d.Oc[1]+g:rf(a,1);0<=c&&(d.Sc|=l,d.Wb&=~l);break}if(g++==d.Cf)break}return c}
            function Yi(a,b,c,d){var e;e=a.Nb[b];e.bf==e.$d&&Zi(a,b);if(e.Nh)return e.Jf[e.bf++];hi(a,b);e=e.eb[e.bf++];a.qa(2304)&&m(a,c,null,d,"TIMER"+b,e,!0);return e}function $i(a,b,c,d,e){a.qa(2304)&&m(a,c,d,e,"TIMER"+b,null,!0);c=a.Nb[b];c.bf==c.$d&&Zi(a,b);c.oc[c.bf++]=d;c.bf==c.$d&&(c.Of&&0!=c.mode&&8!=c.mode||(c.Nh=!1,c.eb[0]=c.Vc[0]=c.oc[0],c.eb[1]=c.Vc[1]=c.oc[1],c.Nd=cd(a.O,a.ff),c.Of=!0,c.be=0!=c.mode,0==b&&(Xi(a,0),d=aj(a,0)*a.dk|0,6==c.mode&&(d>>=1),hd(a.O,d))),2==b&&kd(a))}f=Rh.prototype;
            f.oq=function(a,b){m(this,a,null,b,"PIT1_CTRL",null,2048);return null};f.Sr=function(a,b,c){this.Ok=b;m(this,a,b,c,"PIT1_CTRL",null,2048);a=(b&192)>>6;if(3!=a){c=b&1;var d=b&14;if(b&=48){var e=this.Nb[a];e.rk=b;e.mode=d;e.un=c;e.oc=[0,0];e.eb=[0,0];e.Jf=[0,0];e.be=!1;e.Nh=!1;e.Of=!1;Zi(this,a);0==a&&Xi(this,0);2==a&&255==this.cc[0].Vd&&77==this.Tc&&(a=this.Nb[0],a.Vc[0]=a.oc[0],a.Vc[1]=a.oc[1],a.Nd=cd(this.O,this.ff))}else hi(this,a),b=this.Nb[a],b.Jf[0]=b.eb[0],b.Jf[1]=b.eb[1],b.Nh=!0,Zi(this,a)}};
            function aj(a,b){var c=a.Nb[b],d=c.oc[1]<<8|c.oc[0];d||(d=1==c.$d?256:65536);return d}function md(a,b){var c=a.Nb[b],d=c.Vc[1]<<8|c.Vc[0];d||(d=1==c.$d?256:65536);return d}function Zi(a,b){var c=a.Nb[b];c.bf=32==c.rk?1:0;c.$d=48==c.rk?2:1}
            function hi(a,b,c){var d=a.Nb[b];if(d.Of&&(2!=b||a.Tc&1)){var e=cd(a.O,a.ff),g=(e-d.Nd)/a.dk|0;0>g&&(d.Nd=e,g=0);var l=aj(a,b),p=md(a,b)-g;0==d.mode?(0>=p&&(p=0),p||(d.be=!0,d.Of=!1,b||Wi(a,0))):4==d.mode?(d.be=1!=p,0>=p&&(p=l+p,0>=p&&(p=l),d.Vc[0]=p&255,d.Vc[1]=p>>8,d.Nd=e,!b&&d.be&&Wi(a,0))):6==d.mode&&(p-=g,0>=p&&(d.be=!d.be,p=l+p,0>=p&&(p=l),d.Vc[0]=p&255,d.Vc[1]=p>>8,d.Nd=e,!b&&d.be&&Wi(a,0)));d.eb[0]=p&255;d.eb[1]=p>>8;c&&(a.Nd=0)}return d}
            function ld(a,b){for(var c=0;c<a.Nb.length;c++)hi(a,c,b);if(a.la>=Yh){var c=a.O.T.ee,d=cd(a.O,a.ff);null==a.bk&&(a.ci=cd(a.O,a.ff),a.so=1024,a.bk=Math.floor(a.O.T.ee/a.so),si(a));d>=a.Vg&&(a.ga[12]|=64,a.ga[11]&64&&(a.ga[12]|=128,Wi(a,8)),a.Vg=d+a.bk);a.ga[0]==a.ga[1]&&a.ga[2]==a.ga[3]&&a.ga[4]==a.ga[5]&&(a.ga[12]|=32,a.ga[11]&32&&(a.ga[12]|=128,Wi(a,8)));var e=d-a.ci,g=Math.floor(e/c);if(g&&!(a.ga[11]&128)){for(;g--;)if(60<=++a.ga[0]&&(a.ga[0]=0,60<=++a.ga[2]&&(a.ga[2]=0,24<=++a.ga[4]))){a.ga[4]=
            0;a.ga[6]=a.ga[6]%7+1;var l;l=a.ga[9];var p=va[a.ga[8]-1];28==p&&0===l%4&&(l%100||0===l%400)&&p++;l=p;++a.ga[7]>l&&(a.ga[7]=1,12<++a.ga[8]&&(a.ga[8]=1,a.ga[9]=(a.ga[9]+1)%100))}a.ga[12]|=16;a.ga[11]&16&&(a.ga[12]|=128,Wi(a,8))}a.ci=d-e%c}}f.pq=function(a,b){var c=this.Ki;if(this.xh&16)if(this.Tc&128)c=this.Sd;else if(this.Ka){var c=this.Ka,d=0;c.dc.length&&(d=c.dc[0]);c.qa()&&c.$a("scan code "+k(d)+" delivered");c=d}m(this,a,null,b,"PPI_A",c);return c};
            f.Tr=function(a,b,c){m(this,a,b,c,"PPI_A");this.Ki=b};f.qq=function(a,b){var c=this.Tc;m(this,a,null,b,"PPI_B",c);return c};f.Ur=function(a,b,c){m(this,a,b,c,"PPI_B");bj(this,b);this.Ka&&cj(this.Ka,b&128?!1:!0,b&64?!0:!1)};function bj(a,b){var c=!!(b&2),d=!!(a.Tc&2);a.Tc=b;c!=d&&kd(a,c)}f.rq=function(a,b){var c=0,c=this.la==Th?this.Tc&4?c|this.dg&15:c|this.dg>>4&1:this.Tc&8?c|this.Sd>>4:c|this.Sd&15;this.Tc&1&&hi(this,2).be&&(c=this.Tc&2?c|32:c|16);m(this,a,null,b,"PPI_C",c,32896);return c};
            f.Vr=function(a,b,c){m(this,a,b,c,"PPI_C");this.Pk=b};f.sq=function(a,b){var c=this.xh;m(this,a,null,b,"PPI_CTRL",c);return c};f.Wr=function(a,b,c){m(this,a,b,c,"PPI_CTRL");this.xh=b};f.Fp=function(a,b){var c=this.Ei;m(this,a,null,b,"8042_OUTBUFF",c,16384);this.jb&=-258;this.Ka&&dj(this.Ka);return c};
            f.gr=function(a,b,c){m(this,a,b,c,"8042_INBUF.DATA",null,16384);if(this.jb&8)switch(this.me){case 96:ej(this,b);break;case 209:fj(this,b);break;default:if(ej(this,this.Ud&-17),this.Ka){a=-1;switch(b){case 255:a=250,gj(this.Ka)}hj(this,a)}}this.me=b;this.jb&=-9};f.Gp=function(a,b){var c=this.Tc&-209|(cd(this.O)&64?16:0);m(this,a,null,b,"8042_RWREG",c,16384);return c};f.hr=function(a,b,c){m(this,a,b,c,"8042_RWREG",null,16384);bj(this,b)};
            f.Hp=function(a,b){m(this,a,null,b,"8042_STATUS",this.jb,16384);var c=this.jb&255;this.jb&256&&(this.jb|=1,this.jb&=-257);return c};
            f.fr=function(a,b,c){m(this,a,b,c,"8042_INBUFF.CMD",null,16384);this.me=b;this.jb|=8;a=0;240<=this.me&&(a=this.me^15,this.me=240);switch(this.me){case 32:hj(this,this.Ud);break;case 173:ej(this,this.Ud|16);break;case 174:ej(this,this.Ud&-17);this.Ka&&dj(this.Ka);break;case 170:this.Ka&&(a=this.Ka,a.dc=[],a.qa()&&a.$a("scan codes flushed"));ej(this,this.Ud|16);hj(this,85);fj(this,3);break;case 171:hj(this,0);break;case 192:hj(this,this.ne);break;case 208:hj(this,this.Fi);break;case 224:hj(this,this.Ud&
            16?0:1);break;case 240:a&1&&le(this.O)}};function ej(a,b){a.Ud=b;a.jb=a.jb&-5|b&4;a.Ka&&cj(a.Ka,!!(b&8),!(b&16))}function hj(a,b,c){0<=b&&(a.Ei=b,c?a.jb|=1:(a.jb&=-2,a.jb|=256))}function fj(a,b){a.Fi=b;dc(a.ma,!!(b&2));b&1||le(a.O)}function ij(a,b){a.la<Yh?Wi(a,1,4):a.Ud&16||a.jb&257||(hj(a,b,!0),jj(a.Ka),Wi(a,1,120))}f.Vp=function(a,b){m(this,a,null,b,"CMOS.ADDR",this.Bf,4096);return this.Bf};f.vr=function(a,b,c){m(this,a,b,c,"CMOS.ADDR",null,4096);this.Bf=b;this.Ji=b&128?0:128};
            f.Wp=function(a,b){var c=this.Bf&63,d=13>=c?ii(this,c):this.ga[c];this.qa(4352)&&m(this,a,null,b,"CMOS.DATA["+k(c)+"]",d,!0);null!=b&&12==c&&(this.ga[c]&=15,d&128&&Xi(this,8),d&64&&this.ga[11]&64&&si(this));return d};
            f.wr=function(a,b,c){var d=this.Bf&63;this.qa(4352)&&m(this,a,b,c,"CMOS.DATA["+k(d)+"]",null,!0);a=b^this.ga[d];if(13>=d){if(c=b,10>d){var e=!1;this.ga[11]&4||(c=10*(c>>4)+(c&15),e=!0);if(4==d||5==d)e&&23<c&&(c+=48),this.ga[11]&2||(12>=c?c=12==c?0:c:(c-=116,c=24==c?12:c))}}else c=b;this.ga[d]=c;11==d&&a&64&&b&64&&si(this)};f.Rr=function(a,b,c){m(this,a,b,c,"NMI");this.Ji=b};f.xr=function(a,b,c){m(this,a,b,c,"COPROC.CLEAR")};f.yr=function(a,b,c){m(this,a,b,c,"COPROC.RESET")};
            f.Gq=function(a){if(this.qa(8192)&&De(this.Y,26,a)){var b=this.O.F>>8;Ee(this.O,a,function(a,d){return function(e){d=cd(a.O)-d;var g,l=a.O.H&255,p=a.O.H>>8,w=a.O.H&255,v=a.O.H>>8;if(2==b||3==b)g=" CH(hour)="+ha(p)+" CL(min)="+k(l)+" DH(sec)="+k(v);else if(4==b||5==b)g=" CX(year)="+ha(a.O.G)+" DH(month)="+k(v)+" DL(day)="+k(w);Fe(a.Y,26,e,d,g)}}(this,cd(this.O)))}return!0};function Uh(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
            function kd(a,b){if(a.Eh)try{void 0!==b?a.Rn=b:b=a.Rn&&a.O&&a.O.fa.qb;var c=Math.round(1193181/aj(a,2));if(20>c||2E4<c)b=!1;b?a.wc?(a.wc.frequency.value=c,a.qa(8388608)&&a.$a("speaker set to "+c+"hz",!0)):(a.wc=a.Eh.createOscillator(),a.wc&&(a.wc.type="number"==typeof a.wc.type?1:"square",a.wc.connect(a.Eh.destination),a.wc.frequency.value=c,"start"in a.wc?a.wc.start(0):a.wc.noteOn(0),a.qa(8388608)&&a.$a("speaker on at  "+c+"hz",!0))):a.wc&&("stop"in a.wc?a.wc.stop(0):a.wc.noteOff(0),a.wc.disconnect(),
            delete a.wc,a.qa(8388608)&&a.$a("speaker off at "+c+"hz",!0))}catch(d){a.Da("AudioContext exception: "+d.message),a.Eh=null}else b&&a.$a("BEEP",8388608)}
            var ai={0:function(a,b){return Bi(this,0,0,a,b)},1:function(a,b){return Di(this,0,0,a,b)},2:function(a,b){return Bi(this,0,1,a,b)},3:function(a,b){return Di(this,0,1,a,b)},4:function(a,b){return Bi(this,0,2,a,b)},5:function(a,b){return Di(this,0,2,a,b)},6:function(a,b){return Bi(this,0,3,a,b)},7:function(a,b){return Di(this,0,3,a,b)},8:function(a,b){return Fi(this,0,a,b)},32:function(a,b){return Ri(this,0,b)},33:function(a,b){return Ui(this,0,b)},64:function(a,b){return Yi(this,0,a,b)},65:function(a,
            b){return Yi(this,1,a,b)},66:function(a,b){return Yi(this,2,a,b)},67:Rh.prototype.oq,129:function(a,b){return Li(this,0,2,a,b)},130:function(a,b){return Li(this,0,3,a,b)},131:function(a,b){return Li(this,0,1,a,b)},135:function(a,b){return Li(this,0,0,a,b)}},ci={96:Rh.prototype.pq,97:Rh.prototype.qq,98:Rh.prototype.rq,99:Rh.prototype.sq},ei={96:Rh.prototype.Fp,97:Rh.prototype.Gp,100:Rh.prototype.Hp,112:Rh.prototype.Vp,113:Rh.prototype.Wp,128:function(a,b){return Ni(this,7,a,b)},132:function(a,b){return Ni(this,
            0,a,b)},133:function(a,b){return Ni(this,1,a,b)},134:function(a,b){return Ni(this,2,a,b)},136:function(a,b){return Ni(this,3,a,b)},137:function(a,b){return Li(this,1,2,a,b)},138:function(a,b){return Li(this,1,3,a,b)},139:function(a,b){return Li(this,1,1,a,b)},140:function(a,b){return Ni(this,4,a,b)},141:function(a,b){return Ni(this,5,a,b)},142:function(a,b){return Ni(this,6,a,b)},143:function(a,b){return Li(this,1,0,a,b)},160:function(a,b){return Ri(this,1,b)},161:function(a,b){return Ui(this,1,b)},
            192:function(a,b){return Bi(this,1,0,a,b)},194:function(a,b){return Di(this,1,0,a,b)},196:function(a,b){return Bi(this,1,1,a,b)},198:function(a,b){return Di(this,1,1,a,b)},200:function(a,b){return Bi(this,1,2,a,b)},202:function(a,b){return Di(this,1,2,a,b)},204:function(a,b){return Bi(this,1,3,a,b)},206:function(a,b){return Di(this,1,3,a,b)},208:function(a,b){return Fi(this,1,a,b)}},bi={0:function(a,b,c){Ci(this,0,0,a,b,c)},1:function(a,b,c){Ei(this,0,0,a,b,c)},2:function(a,b,c){Ci(this,0,1,a,b,c)},
            3:function(a,b,c){Ei(this,0,1,a,b,c)},4:function(a,b,c){Ci(this,0,2,a,b,c)},5:function(a,b,c){Ei(this,0,2,a,b,c)},6:function(a,b,c){Ci(this,0,3,a,b,c)},7:function(a,b,c){Ei(this,0,3,a,b,c)},8:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.CMD",null,!0);this.ub[0].Mk=b},9:function(a,b,c){Gi(this,0,a,b,c)},10:function(a,b,c){Hi(this,0,a,b,c)},11:function(a,b,c){Ji(this,0,a,b,c)},12:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.RESET_FF",null,!0);this.ub[0].vb=0},13:function(a,b,c){Ki(this,0,a,
            b,c)},32:function(a,b,c){Si(this,0,b,c)},33:function(a,b,c){Vi(this,0,b,c)},64:function(a,b,c){$i(this,0,a,b,c)},65:function(a,b,c){$i(this,1,a,b,c)},66:function(a,b,c){$i(this,2,a,b,c)},67:Rh.prototype.Sr,129:function(a,b,c){Mi(this,0,2,a,b,c)},130:function(a,b,c){Mi(this,0,3,a,b,c)},131:function(a,b,c){Mi(this,0,1,a,b,c)},135:function(a,b,c){Mi(this,0,0,a,b,c)}},di={96:Rh.prototype.Tr,97:Rh.prototype.Ur,98:Rh.prototype.Vr,99:Rh.prototype.Wr,160:Rh.prototype.Rr},fi={96:Rh.prototype.gr,97:Rh.prototype.hr,
            100:Rh.prototype.fr,112:Rh.prototype.vr,113:Rh.prototype.wr,128:function(a,b,c){Oi(this,7,a,b,c)},132:function(a,b,c){Oi(this,0,a,b,c)},133:function(a,b,c){Oi(this,1,a,b,c)},134:function(a,b,c){Oi(this,2,a,b,c)},136:function(a,b,c){Oi(this,3,a,b,c)},137:function(a,b,c){Mi(this,1,2,a,b,c)},138:function(a,b,c){Mi(this,1,3,a,b,c)},139:function(a,b,c){Mi(this,1,1,a,b,c)},140:function(a,b,c){Oi(this,4,a,b,c)},141:function(a,b,c){Oi(this,5,a,b,c)},142:function(a,b,c){Oi(this,6,a,b,c)},143:function(a,b,
            c){Mi(this,1,0,a,b,c)},160:function(a,b,c){Si(this,1,b,c)},161:function(a,b,c){Vi(this,1,b,c)},192:function(a,b,c){Ci(this,1,0,a,b,c)},194:function(a,b,c){Ei(this,1,0,a,b,c)},196:function(a,b,c){Ci(this,1,1,a,b,c)},198:function(a,b,c){Ei(this,1,1,a,b,c)},200:function(a,b,c){Ci(this,1,2,a,b,c)},202:function(a,b,c){Ei(this,1,2,a,b,c)},204:function(a,b,c){Ci(this,1,3,a,b,c)},206:function(a,b,c){Ei(this,1,3,a,b,c)},208:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.CMD",null,!0);this.ub[1].Mk=b},210:function(a,
            b,c){Gi(this,1,a,b,c)},212:function(a,b,c){Hi(this,1,a,b,c)},214:function(a,b,c){Ji(this,1,a,b,c)},216:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.RESET_FF",null,!0);this.ub[1].vb=0},218:function(a,b,c){Ki(this,1,a,b,c)},240:Rh.prototype.xr,241:Rh.prototype.yr};Qa(function(){for(var a=lb(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Rh(d);kb(d,c);ji(d)}});
            function kj(a){Wa.call(this,"ROM",a,kj);this.Ob=null;this.Gk=a.addr;this.hh=a.size;this.th=a.alias;this.mi=a.file;this.Cs=ia(this.mi);this.hf=a.notify;this.en=null;if(this.hf&&(a=this.hf.indexOf("["),0<a)){try{this.en=eval(this.hf.substr(a))}catch(b){}this.hf=this.hf.substr(0,a)}if(this.mi){a=this.mi;var c=ja(this.Cs);"json"!=c&&"hex"!=c&&(a=Aa()+"/api/v1/dump?file="+this.mi+"&format=bytes&decimal=true");za(a,!0,null,this,kj.prototype.br)}}fb(kj);
            kj.prototype.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;lj(this)};kj.prototype.kc=function(){this.Fk&&(this.Y&&mj(this.Y,this.Gk,this.hh,this.Fk),delete this.Fk);return!0};kj.prototype.jc=function(){return!0};
            kj.prototype.br=function(a,b,c){if(c)this.Da("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,g=d.data;if(e)this.Ob=e;else if(g)for(this.Ob=Array(4*g.length),c=b=0;b<g.length;b++)this.Ob[c++]=g[b]&255,this.Ob[c++]=g[b]>>8&255,this.Ob[c++]=g[b]>>16&255,this.Ob[c++]=g[b]>>24&255;else this.Ob=d;this.Fk=d.symbols;if(!this.Ob.length){Ca("Empty ROM: "+a);return}if(1==this.Ob.length){Ca(this.Ob[0]);return}}catch(l){this.Da("ROM data error: "+
            l.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Ob=Array(a.length),d=0;d<a.length;d++)this.Ob[d]=ga(a[d],16);lj(this)}};
            function lj(a){if(!qb(a))if(!a.mi)pb(a);else if(a.Ob&&a.ma){if(a.Ob.length!=a.hh)sb(a,"ROM size (0x"+h(a.Ob.length)+") does not match specified size ("+("0x"+h(a.hh))+")");else{var b;b=a.Gk;if(ec(a.ma,b,a.hh,Ac)){for(var c=0;c<a.Ob.length;c++){var d=a.ma,e=b+c;d.na[(e&d.Cb)>>>d.Ca].qi(e&d.Ga,a.Ob[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.th?b.push(a.th):null!=a.th&&a.th.length&&(b=a.th);for(c=0;c<b.length;c++){var d=a,e=b[c],g=ic(d.ma,d.Gk,d.hh);hc(d.ma,e,d.hh,g)}a.hf&&((b=hb(a.hf,a.id))?
            (c=a.Ob,d=a.en,5==b.nb?nj(b,c,d||[12640,8752],8):7==b.nb&&nj(b,c,d||[14221,16269],8),pb(b)):a.Da("Unable to find component: "+a.hf));delete a.Ob}}pb(a)}}Qa(function(){for(var a=lb(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new kj(d);kb(d,c)}});function oj(a){Wa.call(this,"RAM",a,oj);this.Ai=a.addr;this.Ie=a.size;this.yp=a.test;this.up=!!this.Ie;this.Vi=!1}fb(oj);oj.prototype.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet");pb(this)};
            oj.prototype.kc=function(a,b){b||this.reset();return!0};oj.prototype.jc=function(){return!0};
            oj.prototype.reset=function(){if(!this.Ai&&!this.up&&this.ja){var a=1024*ni(this.ja);this.Ie&&a!=this.Ie&&(jc(this.ma,this.Ai,this.Ie),this.Vi=!1);this.Ie=a}!this.Vi&&this.Ie&&ec(this.ma,this.Ai,this.Ie,1)&&(this.Vi=!0,this.status(Math.floor(this.Ie/1024)+"Kb allocated"),"ramCPQ"==this.Jg&&(this.Z=new pj(this),ec(this.ma,qj,1,4,this.Z)));if(this.Vi){if(this.yp||lc(this.ma,1138,4660),"ramCPQ"!=this.Jg&&this.ja&&(a=this.ja,a.ga)){var b=1048576>this.Ai?21:23,c=a.ga[b]|a.ga[b+1]<<8,c=c+(this.Ie>>10);
            a.ga[b]=c&255;a.ga[b+1]=c>>8;ri(a)}}else Ca("No RAM allocated")};function pj(a){this.hs=a;this.Wm=rj;this.Ro=sj;this.yk=tj;this.nh=null}
            var qj=-2134900736,rj=65535,sj=2575,tj=2,uj=[null,0],vj=[function(a){var b=255;2>a?b=a&1?this.Z.Ro>>8:this.Z.Ro&255:4>a&&(b=a&1?this.Z.yk>>8:this.Z.yk&255);return b},null,null,function(a,b){var c=this.Z;if(a)2==a&&(c.yk=c.yk&-256|b);else if(b!=(c.Wm&255)){var d=c.hs.ma;if(b&1)c.nh&&(hc(d,917504,131072,c.nh),c.nh=null);else{c.nh||(c.nh=ic(d,917504,131072));var e=ic(d,16646144,131072);hc(d,917504,131072,e,b&2?1:Ac)}c.Wm=c.Wm&-256|b}},null,null];pj.prototype.Wn=function(){return uj};
            pj.prototype.pl=function(){return vj};Qa(function(){for(var a=lb(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new oj(d);kb(d,c)}});function wj(a){Wa.call(this,"Keyboard",a,wj,65536);this.Pn=Ja("Mobi");this.vp=Ja("MSIE");this.$a("mobile keyboard support: "+(this.Pn?"true":"false"));this.yn=0;this.Zi=!0;this.ml=this.gl=!1;this.Ub=[];this.Oq=500;this.Pq=100;this.Nq=50;this.Jn=!1;pb(this)}fb(wj);
            var W={dt:1,et:3,ft:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,at:65,bt:66,an:67,Wo:68,E:69,it:70,lt:71,bn:72,nt:73,ot:74,pt:75,qt:76,rt:77,Ak:78,tt:79,ut:80,wt:81,dn:82,At:83,Kt:84,Ot:85,Pt:86,Qt:87,St:88,Tt:89,Ut:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,Vt:97,Wt:98,Zt:99,fu:100,gu:101,hu:102,ju:103,ku:104,lu:105,mu:106,nu:107,
            ou:108,pu:109,qu:110,su:111,tu:112,uu:113,vu:114,wu:115,xu:116,yu:117,zu:118,Au:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},xj={};xj[186]=W[";"];xj[187]=W["="];xj[188]=W[","];xj[189]=W["-"];xj[190]=W["."];xj[191]=W["/"];xj[192]=W["`"];xj[219]=W["["];xj[220]=W["\\"];xj[221]=W["]"];xj[222]=W["'"];xj[173]=W["-"];var yj={};yj[W["1"]]=W["!"];yj[W["2"]]=W["@"];yj[W["3"]]=W["#"];yj[W["4"]]=W.$;yj[W["5"]]=W["%"];yj[W["6"]]=W["^"];yj[W["7"]]=W["&"];yj[W["8"]]=W["*"];yj[W["9"]]=W["("];
            yj[W["0"]]=W[")"];yj[186]=W[":"];yj[187]=W["+"];yj[188]=W["<"];yj[189]=W._;yj[190]=W[">"];yj[191]=W["?"];yj[192]=W["~"];yj[219]=W["{"];yj[220]=W["|"];yj[221]=W["}"];yj[222]=W['"'];yj[173]=W._;yj[61]=W["+"];yj[59]=W[":"];
            var zj={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Aj={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Bj={esc:1027,1:W["1"],2:W["2"],3:W["3"],4:W["4"],5:W["5"],6:W["6"],7:W["7"],8:W["8"],9:W["9"],0:W["0"],"-":W["-"],"=":W["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":W["["],"]":W["]"],enter:13,
            ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":W[";"],quote:W["'"],"`":W["`"],shift:1016,"\\":W["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":W[","],".":W["."],"/":W["/"],"right-shift":3016,prtsc:1044,alt:1018,space:W[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
            "num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Ij={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},Y={1027:1};Y[W["1"]]=2;Y[W["!"]]=10754;Y[W["2"]]=3;Y[W["@"]]=10755;Y[W["3"]]=4;Y[W["#"]]=10756;Y[W["4"]]=5;Y[W.$]=10757;Y[W["5"]]=6;Y[W["%"]]=10758;Y[W["6"]]=7;Y[W["^"]]=10759;Y[W["7"]]=8;Y[W["&"]]=10760;Y[W["8"]]=9;Y[W["*"]]=10761;Y[W["9"]]=10;Y[W["("]]=10762;Y[W["0"]]=11;Y[W[")"]]=10763;Y[W["-"]]=12;Y[W._]=10764;Y[W["="]]=13;Y[W["+"]]=10765;Y[1008]=14;Y[1009]=15;Y[113]=16;
            Y[81]=10768;Y[119]=17;Y[87]=10769;Y[101]=18;Y[69]=10770;Y[114]=19;Y[82]=10771;Y[116]=20;Y[84]=10772;Y[121]=21;Y[89]=10773;Y[117]=22;Y[85]=10774;Y[105]=23;Y[73]=10775;Y[111]=24;Y[79]=10776;Y[112]=25;Y[80]=10777;Y[W["["]]=26;Y[W["{"]]=10778;Y[W["]"]]=27;Y[W["}"]]=10779;Y[13]=28;Y[1017]=29;Y[97]=30;Y[65]=10782;Y[115]=31;Y[83]=10783;Y[100]=32;Y[68]=10784;Y[102]=33;Y[70]=10785;Y[103]=34;Y[71]=10786;Y[104]=35;Y[72]=10787;Y[106]=36;Y[74]=10788;Y[107]=37;Y[75]=10789;Y[108]=38;Y[76]=10790;Y[W[";"]]=39;
            Y[W[":"]]=10791;Y[W["'"]]=40;Y[W['"']]=10792;Y[W["`"]]=41;Y[W["~"]]=10793;Y[1016]=42;Y[W["\\"]]=43;Y[W["|"]]=10795;Y[122]=44;Y[90]=10796;Y[120]=45;Y[88]=10797;Y[99]=46;Y[67]=10798;Y[118]=47;Y[86]=10799;Y[98]=48;Y[66]=10800;Y[110]=49;Y[78]=10801;Y[109]=50;Y[77]=10802;Y[W[","]]=51;Y[W["<"]]=10803;Y[W["."]]=52;Y[W[">"]]=10804;Y[W["/"]]=53;Y[W["?"]]=10805;Y[3016]=54;Y[1044]=55;Y[1018]=56;Y[W[" "]]=57;Y[1020]=58;Y[1112]=59;Y[1113]=60;Y[1114]=61;Y[1115]=62;Y[1116]=63;Y[1117]=64;Y[1118]=65;Y[1119]=66;
            Y[1120]=67;Y[1121]=68;Y[1144]=69;Y[1145]=70;Y[1036]=71;Y[1038]=72;Y[1033]=73;Y[1109]=74;Y[1037]=75;Y[1101]=76;Y[1039]=77;Y[1107]=78;Y[1035]=79;Y[1040]=80;Y[1034]=81;Y[1045]=82;Y[1046]=83;Y[1122]=87;Y[1123]=88;Y[1091]=91;Y[1093]=93;Y[1224]=91;Y[4003]=7470;Y[4008]=7494;Y[4046]=3677523;f=wj.prototype;
            f.Lb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.va[e])switch(b){case "kbd":return c.onkeydown=function(a){return Jj(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Jn){var b=d.Ub.length?d.Ub[0].vf:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.ml=!0,a=b)}(b=!Y[a]||!!(d.fc&128))||Kj(d,a,!0);return b},c.onkeyup=function(a){return Jj(d,a,!1)},!0;case "caps-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1020,!0)},
            !0;case "num-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1144,!0)},!0;case "scroll-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.dd();Kj(d,1145,!0)},!0;default:var g=b.toUpperCase().replace(/-/g,"_");if(void 0!==Aj[g]&&"button"==a)return this.va[e]=c,c.onclick=function(a,b,c){return function(){a.O&&a.O.dd();Lj(a,c,!0);Kj(a,c,!0)}}(this,g,Aj[g]),!0;if(void 0!==Bj[b])return this.yn++,this.va[e]=c,a=function(a,b,c){return function(){Kj(a,c)}}(this,b,Bj[b]),b=function(a,
            b,c){return function(){Mj(a,c)}}(this,b,Bj[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Nj(a,b,c){if(a.yn){for(var d in yj)if(b==yj[d]){b=+d;(d=xj[d])&&(b=d);break}for(var e in Bj)if((d=Bj[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Bj[e]==d),d){(a=a.va["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
            f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet")};function gj(a,b){a.$a("keyboard reset",65792);a.dc=[170];a.Kh=!0;b&&a.ja&&ij(a.ja,a.dc[0])}function cj(a,b,c){a.fl!==c&&(a.fl=a.kl=c)&&(a.Kh=!0);a.Yi!==b&&(a.Yi=b)&&!a.kl&&jj(a,!0);a.Yi&&a.kl&&(gj(a,!0),a.kl=!1)}function dj(a){var b=0;a.dc.length&&a.Kh&&(b=a.dc[0],a.ja&&ij(a.ja,b));a.qa()&&a.$a("scan code "+k(b)+" available")}
            function jj(a,b){0<a.dc.length&&(a.dc.shift(),(a.Kh=b)&&(a.dc.length&&a.ja?ij(a.ja,a.dc[0]):b=!1),a.qa()&&a.$a("scan codes shifted, notify "+(b?"true":"false")))}f.kc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf();this.fc=this.Xd=0;this.dc=[];this.Kh=!0};f.save=function(){var a=new Ie(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.jf(a[0])};
            f.jf=function(a){var b=0;void 0===a&&(a=[]);this.fl=this.Kh=a[b++];this.Yi=a[b];return!0};f.Vm=function(){var a=0,b=[];b[a++]=this.fl;b[a]=this.Yi;return b};
            function Lj(a,b,c,d){if(Y[b]){var e=Math.floor(b/1E3)&2;if(b=zj[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.Xd:a.fc)&b):d||b&255&&(b=255);if(c){a.Xd&=~b;d&&(a.Xd|=b);c=b;var g,l;for(l in Ij)d="led-"+l,e=Ij[l],c&&c!=e||!(g=a.va[d])||(g.style.backgroundColor=a.Xd&e?"#00ff00":"#000000")}else a.fc&=~b,d&&(a.fc|=b);return!0}}return!1}
            function Kj(a,b,c){if(Y[b]&&a.O&&a.O.fa.qb){zj[b]&&a.Ub.length&&0<a.Ub[0].ge&&(a.Ub[0].ge=0);for(var d,e=0;e<a.Ub.length;e++)if(d=a.Ub[e],d.vf==b){if(!c||0<=d.ge){e=-1;break}0<e&&(0<a.Ub[0].ge&&(a.Ub[0].ge=0),a.Ub.splice(e,1));break}0>e||(e==a.Ub.length&&(d={},d.vf=b,d.fc=a.fc,Nj(a,b,!0),e++),0<e&&a.Ub.splice(0,0,d),d.Mh=!0,d.ge=c?-1:zj[b]?0:1,Oj(a,d))}}
            function Mj(a,b,c){if(!Y[b]||!(c||a.O&&a.O.fa.qb))return!1;for(var d=!1,e=0;e<a.Ub.length;e++){var g=a.Ub[e];if(g.vf==b||g.vf==yj[b]){a.Ub.splice(e,1);g.Po&&clearTimeout(g.Po);g.Mh&&!c&&Pj(a,g.vf,!1);Nj(a,b,!1);d=!0;break}}!a.Ub.length&&a.ml&&(Lj(a,1020),a.ml=!1);return d}
            function Oj(a,b){if(a.O&&a.O.fa.qb){if(Pj(a,b.vf,b.Mh),b.ge){var c;if(0>b.ge){if(!b.Mh){Mj(a,b.vf);return}b.Mh=!1;c=a.Nq}else c=1==b.ge++?a.Oq:a.Pq;b.Po=setTimeout(function(a){return function(){Oj(a,b)}}(a),c)}}else Mj(a,b.vf,!0)}function Qj(a,b,c){var d=b;if(65<=b&&90>=b)!(a.fc&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.fc&515)==c&&(d=b-32);else if(!!(a.fc&3)==c){if(a=yj[b])d=a}else if(a=xj[b])d=a;return d}f.fk=function(a){this.Zi=a;a||(this.fc&=-256)};
            function Jj(a,b,c){var d=!0,e=!1,g=!1,l=b.keyCode,p=Qj(a,l,!0);a.gl&&p==W["`"]&&(l=p=27);if(Y[l+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Lj(a,p,!1,c)){if(20==l||144==l||145==l)a.vp||(c=e=!0);if(!(c||91!=l&&93!=l))for(var w=0;w<a.Ub.length;w++){var v=a.Ub[w];v.Mh=!1;0<v.ge&&(v.ge=0)}}else 8==l&&8==(a.fc&40)&&(p=4008),d=!1;else if(Y[p]&&a.fc&60&&(d=!1),!a.Jn&&d&&c||a.fc&192)g=!0;d||b.preventDefault();g||a.Pn&&d||(c?Kj(a,p,e):Mj(a,p)||(b=Qj(a,l,!1),b!=p&&Mj(a,b)));return d}
            function Pj(a,b,c){Lj(a,b,!0,c);var d=Y[b]||Y[b+1E3];if(void 0!==d){14==d&&40==(a.fc&40)&&(d=83);var e=[],g=d&255;e.push(g|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var l=0,p=d&255;224==g||225==g?e.push(g|(c?0:128)):(42==p?a.Xd&3||a.Xd&512&&b||(l=p):29==p?a.Xd&12||(l=p):56==p?a.Xd&48||(l=p):e.push(g|(c?0:128)),l&&(c?e.unshift(l):e.push(l|128)))}for(c=0;c<e.length;c++)d=a,g=e[c],d.dc&&(20>d.dc.length?(d.qa()&&d.$a("scan code "+k(g)+" buffered"),d.dc.push(g),1==d.dc.length&&d.ja&&ij(d.ja,
            g)):(20==d.dc.length&&d.dc.push(255),d.$a("scan code buffer overflow")))}}Qa(function(){for(var a=lb(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new wj(d);kb(d,c)}});
            function Z(a,b,c,d,e){Wa.call(this,"Video",a,Z,262144);this.la=a.model;this.nb=Rj[this.la]||Sj;this.Yd=a.memory||0;this.Lo=a.switches;this.Od=a.mode;if(void 0===this.Od||void 0===Tj[this.Od])this.Od=Uj;this.kj=a.charCols;this.Bl=a.charRows;if(void 0===this.kj||void 0===this.Bl)this.kj=Tj[this.Od][0],this.Bl=Tj[this.Od][1];this.re=a.screenWidth;this.df=a.screenHeight;this.xp=a.scale;this.tp=12<=Math.round(this.re/this.kj);this.zp=a.touchScreen;this.Ch=b;this.ld=c;this.Za=(this.Hs=d)||b||null;this.lf=
            null;this.sp=a.autoLock;this.Ya=this.bc=0;this.Re=[];this.le=Array(16);this.Zi=!1;var g=this;if(this.Jd=e)this.Jd.vg=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.Jd.vg&&(b=function(){var a=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?!0:!1;g.$a("notifyFullScreen("+a+")",!0);g.Ka&&(g.Ka.gl=a)},"onfullscreenchange"in document?document.addEventListener("fullscreenchange",
            b,!1):"onmozfullscreenchange"in document?document.addEventListener("mozfullscreenchange",b,!1):"onwebkitfullscreenchange"in document?document.addEventListener("webkitfullscreenchange",b,!1):"onmsfullscreenchange"in document&&document.addEventListener("msfullscreenchange",b,!1));this.Za&&(this.Za.onfocus=function(){return g.fk(!0)},this.Za.onblur=function(){return g.fk(!1)},this.Za.Qf=this.Za.requestPointerLock||this.Za.mozRequestPointerLock||this.Za.webkitRequestPointerLock,this.Za.Qo=this.Za.exitPointerLock||
            this.Za.mozExitPointerLock||this.Za.webkitExitPointerLock,this.Za.Qf&&(b=function(){g.ei(document.pointerLockElement===g.Za||document.mozPointerLockElement===g.Za||document.webkitPointerLockElement===g.Za)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",b,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",b,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",b,!1)));if(a=a.fontROM)"json"!=
            ja(a)&&(a=Aa()+"/api/v1/dump?file="+a+"&format=bytes"),za(a,!0,null,this,this.cr)}fb(Z);var Sj=1,Rj={mda:1,cga:3,ega:5,vga:7},Uj=7,Vj={2:{oj:15700,nj:208,gk:85,hk:96},3:{oj:18432,nj:364,gk:85,hk:96},4:{oj:21850,nj:364,gk:85,hk:96},7:{oj:16700,nj:480,gk:85,hk:83}},Wj={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Tj=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Tj[Uj]=[80,25,1,0,1];
            Tj[13]=[320,200,16];Tj[14]=[640,200,16];Tj[15]=[640,350,16];Tj[16]=[640,350,16];Tj[17]=[640,480,16];Tj[18]=[640,480,16];Tj[19]=[320,200,16];Tj[0]=Tj[1];Tj[2]=Tj[3];Tj[5]=Tj[4];var Xj=Array(5);Xj[0]=[0,0,0,255];Xj[1]=[127,192,127,255];Xj[2]=[127,192,127,255];Xj[3]=[127,255,127,255];Xj[4]=[127,255,127,255];var Yj=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],Zj=Array(16);Zj[0]=[0,0,0,255];Zj[1]=[0,0,170,255];Zj[2]=[0,170,0,255];Zj[3]=[0,170,170,255];Zj[4]=[170,0,0,255];Zj[5]=[170,0,170,255];Zj[6]=[170,85,0,255];
            Zj[7]=[170,170,170,255];Zj[8]=[85,85,85,255];Zj[9]=[85,85,255,255];Zj[10]=[85,255,85,255];Zj[11]=[85,255,255,255];Zj[12]=[255,85,85,255];Zj[13]=[255,85,255,255];Zj[14]=[255,255,85,255];Zj[15]=[255,255,255,255];var ak=[2,4,6],bk=[3,5,7],ck=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],dk=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],ek=[0];ek[128]=1;ek[32768]=2;ek[32896]=3;ek[8388608]=4;ek[8388736]=5;ek[8421376]=6;ek[8421504]=7;
            ek[-2147483648]=8;ek[-2147483520]=9;ek[-2147450880]=10;ek[-2147450752]=11;ek[-2139095040]=12;ek[-2139094912]=13;ek[-2139062272]=14;ek[-2139062144]=15;
            function fk(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=gk[b],g=a.Pd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(hk)];this.Y=a.Y;this.type=e[0];this.port=e[1];this.nb=b;this.Ya=e[2];this.bc=e[3];this.Yd=d||e[4];65536<=this.Yd&&720896<=this.Ya&&(this.bc=Math.min(this.Yd>>2,32768));this.Xc=c[0];this.bd=c[1];this.Yg=c[2];this.wa=c[3];this.Kc=c[4]&255;this.jk=c[4]>>8&255;this.tc=c[5];this.ul=hk;this.Ci=ik;if(5<=b){this.ul=jk;this.Ci=kk;b=c[6];void 0===b&&(b=[!1,0,Array(20),0,3==g?
            0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Ya,this.bc,this.Yd],Array(this.Yd>>2),5144,0,-1,0,-1,0,-1,0,0,0,1,255,0,0,0,Array(256)]);this.ae=b[0];this.Fe=b[1];this.rf=b[2];this.Jk=lk;this.qk=b[3];this.ah=b[4];this.ji=b[5];this.He=b[6];this.dh=b[7];this.Lk=mk;this.Do=b[8];this.Eo=b[9];this.Ge=b[10];this.Xf=b[11];this.Kk=nk;this.xb=b[12];d=b[13];"number"==typeof d&&(d=[this.Ya,this.bc,d]);this.Ya=d[0];this.bc=d[1];d=this.Yd>>2;if((this.Td=b[14])&&this.Td.length<d){for(var e=this.Td,l=0,p=Array(d),w=0;w<
            e.length-1;){for(var v=e[w++],E=e[w++];v--;)p[l]=E,l+=2;l==d&&(l=1)}this.Td=p}(d=b[15])&&(d=d&8?d&-9:ok[d&65280]|ok[d&255]);this.wk(d);this.Hm=b[16];this.sb=b[17];this.fe=b[18];this.Bb=b[19];this.ck=b[20];this.pf=b[21];this.Tf=b[22];this.wl=b[23];this.xl=b[24];7==this.nb&&(this.Pm=b[25],this.Mm=b[26],this.ud=b[27],this.uc=b[28],this.mk=b[29],this.ii=b[30])}g=Vj[g]||Vj[3];this.yl=a.O.T.ee/g.oj|0;this.Sq=this.yl*g.gk/100|0;this.oo=this.yl*g.nj;this.Uq=this.oo*g.hk/100|0;this.Dl=null==c[7]?0:c[7]}}
            var hk=18,jk=25,ik="HORZ_TOTAL HORZ_DISP HORZ_SYNC_POS HORZ_SYNC_WIDTH VERT_TOTAL VERT_TOTAL_ADJ VERT_DISP VERT_SYNC_POS INTERLACE_POS MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO LIGHT_PEN_HI LIGHT_PEN_LO".split(" "),kk="HORZ_TOTAL HORZ_DISP_END HORZ_BLANK_START HORZ_BLANK_END HORZ_RETRACE_START HORZ_RETRACE_END VERT_TOTAL OVERFLOW PRESET_ROW_SCAN MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO VERT_RETRACE_START VERT_RETRACE_END VERT_DISP_END OFFSET UNDERLINE VERT_BLANK_START VERT_BLANK_END MODE_CTRL LINE_COMPARE".split(" "),
            lk="PAL00 PAL01 PAL02 PAL03 PAL04 PAL05 PAL06 PAL07 PAL08 PAL09 PAL0A PAL0B PAL0C PAL0D PAL0E PAL0F MODE OVERSCAN PLANES HORZPAN".split(" "),mk=["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"],nk="SRESET ESRESET COLORCMP DATAROT READMAP MODE MISC COLORDC BITMASK".split(" "),ok=[,,1024,5120];ok[16]=1280;ok[512]=0;ok[1024]=32;ok[1536]=96;ok[2560]=160;ok[3584]=224;ok[768]=16;ok[4096]=1;ok[8192]=2;ok[24576]=98;ok[40960]=162;ok[57344]=226;var pk=[];
            pk[1024]=function(a){a+=this.offset;return(this.Z.xb=this.ea[a])>>this.Z.Hm&255};pk[5120]=function(a){a+=this.offset;var b=this.Z.xb=this.ea[a&-2];return(a&1?b>>8:b)&255};pk[1280]=function(a){a+=this.offset;a=this.Z.xb=this.ea[a];for(var b=this.Z.xl,c=this.Z.wl&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};pk[0]=function(a,b){var c=a+this.offset,d;d=this.ea[c]&~this.Z.sb|(b|b<<8|b<<16|b<<24)&this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
            pk[32]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[96]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d&=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
            pk[160]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d|=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[224]=function(a,b){var c=a+this.offset;b=b>>this.Z.fe|b<<8-this.Z.fe&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.pf|this.Z.Tf;d^=this.Z.xb;d=d&this.Z.sb|this.ea[c]&~this.Z.sb;d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
            pk[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.Z.sb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ea[d]&~c;c=c&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[d]!=c&&(this.ea[d]=c,this.Ua=!0)};pk[1]=function(a){a+=this.offset;var b=this.ea[a]&~this.Z.sb|this.Z.xb&this.Z.sb;this.ea[a]!=b&&(this.ea[a]=b,this.Ua=!0)};pk[17]=function(a){a+=this.offset;var b=a&-2;a=this.Z.sb&(b==a?16711935:-16711936);a=this.ea[b]&~a|this.Z.xb&a;this.ea[b]!=a&&(this.ea[b]=a,this.Ua=!0)};
            pk[2]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[98]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d&this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
            pk[162]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d|this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};pk[226]=function(a,b){var c=a+this.offset,d=dk[b&15],d=d^this.Z.xb,d=d&this.Z.sb|this.ea[c]&~this.Z.sb,d=d&this.Z.Bb|this.Z.xb&~this.Z.Bb;this.ea[c]!=d&&(this.ea[c]=d,this.Ua=!0)};
            function qk(a){var b=[];if(void 0!==a.nb){b[0]=a.Xc;b[1]=a.bd;b[2]=a.Yg;b[3]=a.wa;b[4]=a.Kc|a.jk<<8;b[5]=a.tc;if(5<=a.nb){var c=[];c[0]=a.ae;c[1]=a.Fe;c[2]=a.rf;c[3]=a.qk;c[4]=a.ah;c[5]=a.ji;c[6]=a.He;c[7]=a.dh;c[8]=a.Do;c[9]=a.Eo;c[10]=a.Ge;c[11]=a.Xf;c[12]=a.xb;c[13]=[a.Ya,a.bc,a.Yd];var d;a:if(d=a.Td){var e=0,g=[];if(void 0!==d[0])for(var l=0;2>l;l++)for(var p=l;p<d.length;){for(var w=d[p],v=p+2;v<d.length&&d[v]===w;)v+=2;g[e++]=v-p>>1;g[e++]=w;p=v}if(g.length<d.length){d=g;break a}}c[14]=d;c[15]=
            a.ij|8;c[16]=a.Hm;c[17]=a.sb;c[18]=a.fe;c[19]=a.Bb;c[20]=a.ck;c[21]=a.pf;c[22]=a.Tf;c[23]=a.wl;c[24]=a.xl;7==a.nb&&(c[25]=a.Pm,c[26]=a.Mm,c[27]=a.ud,c[28]=a.uc,c[29]=a.mk,c[30]=a.ii);b[6]=c}b[7]=a.Dl}return b}function rk(a,b,c,d,e){if(d){var g="",l,p=0;for(l=0;l<e.length;l++)p<e[l].length&&(p=e[l].length);p++;for(l=0;l<e.length;l++)g&&(g+="\n"),g+=b+"["+k(l)+"]: "+na(e[l],p)+k(d[l])+(l===c?"*":"");a.Y.R(g)}else a.Y.R(b+": "+k(c))}fk.prototype.Wn=function(a){return[this.Td,a-this.Ya]};
            fk.prototype.pl=function(){return this.Bi};fk.prototype.wk=function(a){if(null!=a&&a!=this.ij){var b=a&65280,c=pk[b];c||b&4096&&(c=pk[4096]);var b=a&247,d=pk[b];d||b&16&&(d=pk[16]);this.Bi||(this.Bi=Array(6));this.Bi[0]=c;this.Bi[3]=d;this.ij=a}};var gk=[];gk[Sj]=["MDA",948,720896,4096,0,3];gk[3]=["CGA",980,753664,16384,0,2];gk[5]=["EGA",980,753664,16384,65536,4];gk[7]=["VGA",980,753664,16384,262144,7];f=Z.prototype;
            f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;3!=Rj[this.la]&&(oc(b,this,sk),sc(b,this,tk));Rj[this.la]!=Sj&&(oc(b,this,uk),sc(b,this,vk));5<=this.nb&&(oc(b,this,wk),sc(b,this,xk));7==this.nb&&(oc(b,this,yk),sc(b,this,zk));if(d){var e=this;gi(d,262144,function(a){if(e.Ha)if(a){var b=e.Ha;if(b.Td){a=ga(a);a=void 0!==a?a-b.Ya:b.gs||0;0>a&&(a=0);for(var c="",d=0;8>d;d++){for(var g=h(b.Ya+a)+":",O=0;8>O&&a<b.Td.length;O++)var J=b.Td[a++],g=g+(" "+h(J));c&&(c+="\n");c+=g}c&&b.Y.R(c);b.gs=a}else b.Y.R("no buffer")}else e.Y.R("BIOSMODE: "+
            k(e.De)),b=e.Ha,rk(b,"CRTC",b.Kc,b.tc,b.Ci),b.nb!=Sj&&3!=b.nb||rk(b,"   MODEREG",b.bd),rk(b,"   STATUS1",b.wa),3==b.nb&&rk(b,"     COLOR",b.Yg),5<=b.nb&&(b.Y.R("   ATCDATA: "+b.ae),rk(b," ATC",b.Fe,b.rf,b.Jk),rk(b," GRC",b.Ge,b.Xf,b.Kk),rk(b," SEQ",b.He,b.dh,b.Lk),rk(b,"      FEAT",b.ji),rk(b,"      MISC",b.ah),rk(b,"   STATUS0",b.qk),b.Y.R("   LATCHES: 0x"+h(b.xb)),b.Y.R("    ACCESS: "+ha(b.ij)),b.Y.R("Use 'dump video [addr]' to dump video memory"));else e.Y.R("no active video card")})}if((this.Ka=
            yb(a,"Keyboard"))&&this.Ch){for(var g in this.va)0<g.indexOf("lock")&&this.Ka.Lb("led",g,this.va[g]);this.Ka.Lb(this.Hs?"textarea":"canvas","kbd",this.Za)}this.Gi=9;(this.ja=yb(a,"ChipSet"))&&this.Lo&&5==this.nb&&(this.Gi=Uh(this.Lo,this.Gi));this.Ka&&this.zp&&Ak(this)};
            f.Lb=function(a,b,c){var d=this;if(!this.va[b])switch(this.va[b]=c,b){case "fullScreen":return this.Jd&&this.Jd.vg?c.onclick=function(){d.vg()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.Es=c.textContent,this.Za&&this.Za.Qf?c.onclick=function(){d.Qf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){ed(d,!0)},!0}return!1};f.dd=function(){this.Za&&this.Za.focus()};
            f.vg=function(){var a=!1;this.Jd&&(this.Jd.vg&&(this.Jd.style.width=this.Jd.style.height="100%",this.Jd.style.backgroundColor="black",this.Jd.vg(),a=!0),this.dd());return a};f.Qf=function(a){var b=!1;this.Za&&(a?this.Za.Qf&&(this.Za.Qf(),this.lf.ei(!0),b=!0):this.Za.Qo&&(this.Za.Qo(),this.lf.ei(!1),b=!0),this.dd());return b};f.ei=function(a){this.lf&&(this.lf.ei(a),this.Ka&&(this.Ka.gl=a));var b=this.va.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.Es)};
            function Ak(a){var b=a.Za;b&&!a.Lh&&(b.addEventListener("touchstart",function(b){Bk(a,b)},!1),b.addEventListener("touchmove",function(b){Bk(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Lh=!0)}f.fk=function(a){this.Zi=a;this.Ka&&this.Ka.fk(a)};
            function Bk(a,b){a.Zi&&b.preventDefault();var c=0,d=0,e=a.Ch;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var g=a.re/a.Ch.offsetWidth,e=a.df/a.Ch.offsetHeight,l,p;b.targetTouches?(l=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(l=b.pageX,p=b.pageY);c=(l-c)*g/(a.re/3)|0;d=(p-d)*e/(a.df/3)|0;1!=d?d?Kj(a.Ka,1040,!0):Kj(a.Ka,1038,!0):1!=c&&(c?Kj(a.Ka,1039,!0):Kj(a.Ka,1037,!0))}
            f.kc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(){var a=!0,b=0;this.ja&&(b=oi(this.ja));this.la||(this.nb=3==b?Sj:3);this.Od=3;switch(this.nb){case 7:b=7;break;case 5:var c=Wj[this.Gi];c&&(b=c[0]);b||(b=4);break;case Sj:b=3;this.Od=Uj;break;default:b=2}this.Pd!==b&&(this.Pd=b,a=!0);this.Ha=null;this.Id=this.Tk=new fk(this,Sj);this.gc=this.Pi=new fk(this,3);5>this.nb?this.W=new fk:(this.W=new fk(this,this.nb,null,this.Yd),Ck(this));Dk(this);this.De=null;this.Ff=this.od=-1;this.Ef=0;Ek(this,this.Od);if(this.Ha.Ya&&a){a=this.Ha.Ya+
            this.Uk;for(b=this.Ha.Ya;b<a;b+=2){var d=Math.floor(65536*Math.random());4==this.Pd||7==this.Pd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);lc(this.ma,b,c|d<<8)}ed(this,!0)}};function Ck(a){a.W.ah&1?(a.Id=a.Tk,a.gc=a.W):(a.Id=a.W,a.gc=a.Pi)}f.save=function(){var a=new Ie(this);a.set(0,qk(this.Tk));a.set(1,qk(this.Pi));a.set(2,[this.Pd,this.Od,this.De]);a.set(3,qk(this.W));return a.data()};
            f.restore=function(a){var b=a[2];this.Pd=b[0];this.Od=b[1];this.De=b[2];this.Ha=null;this.Id=this.Tk=new fk(this,Sj,a[0]);this.gc=this.Pi=new fk(this,3,a[1]);this.W=new fk(this,this.nb,a[3],this.Yd);this.W.Xc&&Ck(this);Dk(this);if(!Fk(this))return!1;Gk(this);return!0};
            f.cr=function(a,b,c){if(c)this.Da("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){Ca("Empty font ROM image: "+a);return}if(1==d.length){Ca(d[0]);return}if(8192==d.length)nj(this,d,[6144,0]);else{this.Da("Unrecognized font data length ("+d.length+")");return}}catch(e){this.Da("Font ROM data error: "+e.message);return}(this.ld||this.Y)&&pb(this)}};
            function Hk(a,b){if(1==b)return a.le[0]=Zj[0],a.le[1]=Zj[7],a.le;if(2==b){var c=a.Ha.Yg;if(a.Ha===a.W){var d=a.W.rf[0],c=d&7;d&16&&(c|=8);18!=a.W.rf[1]&&(c|=32)}a.le[0]=Zj[c&15];c=c&32?bk:ak;for(d=0;d<c.length;d++)a.le[d+1]=Zj[c[d]];return a.le}if(a.gc===a.Pi)return Zj;c=null!=a.W.rf[15]?a.W.rf:ck;for(d=0;d<a.le.length;d++){var e=c[d]||0;a.le[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.le}function nj(a,b,c,d){a.yi=b;a.Ek=c;a.Kf=d}
            function Dk(a){var b=!1;if(window&&a.yi){var c=Hk(a),d,e=a.Kf?a.Kf:8;Ik(a,3,a.Ek[0],0,e,8,a.yi,c)&&(b=!0);d=a.Kf?0:2048;e=a.Kf?a.Kf:9;Ik(a,1,a.Ek[1],d,e,14,a.yi,Xj,Yj)&&(b=!0);a.Kf&&Ik(a,a.nb,a.Ek[1],0,a.Kf,14,a.yi,c)&&(b=!0)}return b}function Ik(a,b,c,d,e,g,l,p,w){var v=!1;null!=c&&(Jk(a,b,c,d,e,g,l,p,w)&&(v=!0),a.tp&&Jk(a,b<<1,c,d,e,g,l,p,w)&&(v=!0));return v}
            function Jk(a,b,c,d,e,g,l,p,w){var v=!1,E=b&1?0:1,O=a.Re[b];O||(O={Fc:e<<E,Gc:g<<E,kg:Array(p.length),jn:p.slice(),oh:w,Ck:Array(p.length)});for(w=0;w<p.length;w++){var J=p[w],G=O.kg[w]?O.jn[w]:[];if(J[0]!==G[0]||J[1]!==G[1]||J[2]!==G[2]){var v=O,G=w,S=E,X=c,T=d,aa=e,Ba=g,pa=l,Ra=[0,0,0,0],Eb=window.document.createElement("canvas");Eb.width=v.Fc<<4;Eb.height=v.Gc<<4;for(var Ua=Eb.getContext("2d"),ba=void 0,sa=void 0,da=void 0,rb=8>Ba||!T?Ba:8,Fb=Ua.createImageData(v.Fc,v.Gc),ba=0;256>ba;ba++){for(da=
            0;da<Ba;da++)for(var Ya=v.oh&&G&1&&da>=Ba-2,Za=pa[da<rb?X+ba*rb+da:T+ba*rb+da-rb],Ga=0;Ga<=S;Ga++)for(sa=0;sa<aa;sa++){var zd=sa<<S,ad=(da<<S)+Ga,Ic=Ya||Za&128>>(8<=sa&&192<=ba&&223>=ba?7:sa)?J:Ra;Kk(Fb,zd,ad,Ic);S&&Kk(Fb,zd+1,ad,Ic)}Ua.putImageData(Fb,(ba&15)*v.Fc,(ba>>4)*v.Gc)}v.kg[G]="#"+h(J[0],2)+h(J[1],2)+h(J[2],2);v.jn[G]=J;v.Ck[G]=Eb;v=!0}}a.Re[b]=O;return v}function Lk(a){0<a.Ef||0<=a.od?0>a.Ff&&(a.Ff=0):a.Ff=-1}
            function Gk(a){if(a.ic){for(var b=10;15>=b;b++)if(null==a.Ha.tc[b])return;var c=a.Ha.tc[10],b=c&31,d=a.Ha.tc[11]&31,e=a.Ha.tc[9]&31,g=!1;a.Ha===a.W&&(g=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!g||b>e)Mk(a);else{c=a.Ha.tc[15]+((a.Ha.tc[14]&63)<<8);a.od!=c&&(Mk(a),a.od=c);d=d-b+1;if(a.Vo!=b||a.Fn!=d)a.Vo=b,a.Fn=d;a.cf=e+1;Lk(a)}}}
            function Mk(a){if(0<=a.od){if(void 0!==a.xc){var b=a.xc[a.od];if(b&131072){var b=b&-131073,c=a.od%a.Qb,d=Math.floor(a.od/a.Qb);a.ic&&a.Re[a.ic]&&(a.ug&&Nk(a,c,d,b,a.ug),Nk(a,c,d,b));a.xc[a.od]=b}}a.od=-1}}
            function Ok(a){var b;a=a.Ha;var c=a.Xf[5];if(null!=c){b=1024;var d=0,e=a.Xf[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.fe=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.dh[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.Rd=function(a){var b=this.Ha;b&&null!=a&&a!=b.ij&&(b.wk(a),this.ma.wk(b.Ya,b.bc,b.pl()))};
            function Fk(a,b){var c,d=a.De,e=a.Ha;if(e)if(e.nb==Sj)d=Uj;else if(5<=e.nb){var d=null,g=e.Yd>>2,l=32768<g?32768:g,p=e.Xf[6];if(null!=p){switch(p&12){case 0:e.Ya=655360;e.bc=g;d=255;break;case 4:e.Ya=655360;e.bc=g;d=3==a.Pd?15:16;break;case 8:e.Ya=720896;e.bc=l;d=Uj;break;case 12:e.Ya=753664,e.bc=l,d=3==a.Pd?2:3}c=e.dh[1]&8;g=e.tc[6];g|=e.tc[7]&1?256:0;7==e.nb&&(g|=e.tc[7]&32?512:0);255!=d&&(p&1?753664==e.Ya?d=c?7-d:6:400>g?350>g&&(d=c?13:14):d=3==a.Pd?17:18:c&&(d-=2));c=Ok(a)}}else e.bd&8&&(e.bd&
            2?(d=e.bd&16?6:5,e.bd&4||--d):(d=e.bd&1?3:1,e.bd&4&&--d));else a.De=null,null==d&&(d=a.Od);if(!Ek(a,d,b))return!1;a.Rd(c);return!0}
            function Ek(a,b,c){if(null!=b&&(b!=a.De||c)){a.ap=0;a.De=b;b=a.Ha||(b==Uj?a.Id:a.gc);if(b!=a.Ha||b.Ya!=a.Ya||b.bc!=a.bc){Mk(a);if(a.Ya){if(!jc(a.ma,a.Ya,a.bc))return!1;a.Ha&&(a.Ha.Xc=!1)}a.Ha=b;b.Xc=!0;a.Ya=b.Ya;a.bc=b.bc;if(!ec(a.ma,b.Ya,b.bc,3,b===a.W?b:null))return!1}a.ic=0;a.Qb=a.kj;a.Jc=a.Bl;a.vl=Tj[Uj][2];b=0;var d=Tj[a.De];d&&(a.Qb=d[0],a.Jc=d[1],a.vl=d[2],b=d[3]||0,a.ic=d[4],4!=a.Pd&&7!=a.Pd||a.Ha!==a.W||3!=a.ic||(7==a.W.tc[9]?a.Jc=43:a.ic=a.nb));a.lo=a.Qb*a.Jc;a.jj=a.lo/a.vl;a.Uk=(a.jj<<
            1)+b;a.An=b?a.Uk+b>>1:0;13<=a.De&&(a.jj<<=1);a.Re.length&&(a.se=Math.floor(a.re/a.Qb),a.te=Math.floor(a.df/a.Jc),a.ic?(b=a.Re[a.ic],d=a.Re[a.ic<<1],a.xp&&80==a.Qb?d&&a.se>=3*d.Fc>>2&&(a.ic<<=1,b=d):(d&&a.se>=d.Fc&&(a.ic<<=1,b=d),b&&(a.se=b.Fc,a.te=b.Gc)),a.Hh=a.Ih=0,b&&(a.Hh=a.Qb*b.Fc,a.Ih=a.Jc*b.Gc)):(a.se=a.te=1,a.Hh=a.Qb,a.Ih=a.Jc),a.fj=a.ld.createImageData(a.Hh,a.Ih),a.rg=window.document.createElement("canvas"),a.rg.width=a.Hh,a.rg.height=a.Ih,a.ug=a.rg.getContext("2d"),a.Zm=a.$m=0,a.Zk=a.re,
            a.$k=a.df,b=a.re-a.Qb*a.se,d=a.df-a.Jc*a.te,0<b&&(a.Zm=b>>1,a.Zk-=b),0<d&&(a.$m=d>>1,a.$k-=d),b||d)&&(a.ld.fillStyle=a.Ch.style.backgroundColor,a.ld.fillRect(0,0,a.re,a.df));!1!==c?ed(a,!0):Pk(a,!0)}return!0}function Kk(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Pk(a,b){var c;if(b){if(c=a.jj,void 0===a.xc||a.xc.length!=c)a.xc=Array(c)}else{if(void 0===a.xc)return;c=a.xc.length}for(var d=0;d<c;d++)a.xc[d]=-1;a.Ef=-1}
            function Nk(a,b,c,d,e){var g=d&255,l=d>>8;d=l&15;var p=a.Re[a.ic];p.oh&&(d=p.oh[d]);var w=l>>4&15;p.oh&&(w=p.oh[w]);e?(b*=p.Fc,c*=p.Gc,e.fillStyle=p.kg[w],e.fillRect(b,c,p.Fc,p.Gc)):(b=b*a.se+a.Zm,c=c*a.te+a.$m,a.ld.fillStyle=p.kg[w],a.ld.fillRect(b,c,a.se,a.te));l&256&&(w=(g&15)*p.Fc,g=(g>>4)*p.Gc,e?e.drawImage(p.Ck[d],w,g,p.Fc,p.Gc,b,c,p.Fc,p.Gc):a.ld.drawImage(p.Ck[d],w,g,p.Fc,p.Gc,b,c,a.se,a.te));l&512&&(g=a.Vo,l=a.Fn,e?(a.cf&&a.cf!==p.Gc&&(g=Math.floor(g*p.Gc/a.cf),l=Math.floor(l*p.Gc/a.cf)),
            e.fillStyle=p.kg[d],e.fillRect(b,c+g,p.Fc,l)):(a.cf&&a.cf!==a.te&&(g=Math.floor(g*a.te/a.cf),l=Math.floor(l*a.te/a.cf)),a.ld.fillStyle=p.kg[d],a.ld.fillRect(b,c+g,a.se,l)))}
            function ed(a,b){if(a.fa.hc){var c=!1;a.Ha&&(a.Ha===a.W?a.W.Fe&32&&(c=!0):a.Ha.bd&8&&(c=!0));if(c||b){if(b)Pk(a,!0);else if(void 0===a.xc)return;var d=!1;!(b||++a.ap&15)&&0<=a.Ff&&(a.Ff++,d=!0);var e=0,g=a.lo,c=a.Ha.Ya,l=c+a.Ha.bc,p=(a.Ha.tc[12]<<8)+a.Ha.tc[13];a.ic&&(p<<=1);var c=c+p,w=a.Uk;c+w>l&&(w=l-c,0>w&&(w=0));l=c+w;if(p=!b){for(var p=a.ma,v=!0,E=c>>>p.Ca;0<w&&E<p.na.length;)p.na[E].Ua&&(p.na[E].Ua=v=!1,p.na[E].Ln=!0),w-=p.lb,E++;p=v}if(p){if(!d)return;if(!a.Ef){if(0>a.od)return;e=a.od;g=e+
            1}}if(a.ic){if(a.Re[a.ic]){d=0;p=a.Ef=0;w=1048575;a.Ha.bd&32&&(p=32768,w&=~p,a.Ff&2||(w&=-65537));for(c+=e<<1;c<l&&e<g;)v=kc(a.ma,c),v|=65536,v&p&&(a.Ef++,v&=w),e==a.od&&(v|=a.Ff&1?131072:0),E=a.xc[e],E!=v&&(Nk(a,e%a.Qb,Math.floor(e/a.Qb),v,a.ug),a.xc[e]=v,d++),c+=2,e++;d&&a.ug&&a.ld.drawImage(a.rg,0,0,a.Hh,a.Ih,a.Zm,a.$m,a.Zk,a.$k);Lk(a)}}else if(a.An){for(var g=l,O,J,e=c,l=a.Ef=0,d=a.vl,p=16==d?65536:196608,w=16==d?1:2,v=Hk(a,w),G=E=0,S=a.Qb,X=0,T=a.Jc,aa=0;e<g;){O=kc(a.ma,e);J=a.xc[l];if(J===O)E+=
            d;else{a.xc[l]=O;O=O>>8|(O&255)<<8;J=p;var Ba=16;E<S&&(S=E);for(var pa=0;pa<d;pa++){var Ra=(O&(J>>=w))>>(Ba-=w);Kk(a.fj,E++,G,v[Ra])}E>X&&(X=E);G<T&&(T=G);G>=aa&&(aa=G+1)}e+=2;l++;if(E>=a.Qb){E=0;G+=2;if(G>a.Jc)break;G==a.Jc&&(G=1,e=c+a.An)}}S<a.Qb&&(a.ug.putImageData(a.fj,0,0,S,T,X-S,aa-T),a.ld.drawImage(a.rg,0,0,a.Qb,a.Jc,0,0,a.re,a.df))}else{g=l;e=a.Ef=0;l=Hk(a);d=a.Ha.Td;w=p=0;v=a.Qb;E=0;G=a.Jc;for(S=0;c<g;){X=c++-a.Ya;X=d[X];T=a.xc[e];if(T===X)p+=8;else{a.xc[e]=X;p<v&&(v=p);for(T=0;8>T;T++)aa=
            ek[X&-2139062144]||0,Kk(a.fj,p++,w,l[aa]),X<<=1;p>E&&(E=p);w<G&&(G=w);w>=S&&(S=w+1)}e++;if(p>=a.Qb&&(p=0,++w>a.Jc))break}v<a.Qb&&(a.ug.putImageData(a.fj,0,0,v,G,E-v,S-G),a.ld.drawImage(a.rg,0,0,a.Qb,a.Jc,0,0,a.re,a.df))}}}}f.kq=function(a,b){return Qk(this,this.Id,a,b)};f.Or=function(a,b,c){var d=this.Id;d.jk=d.Kc;d.Kc=b&31;m(this,a,b,c,"CRTC.INDX")};f.jq=function(a,b){return Rk(this,this.Id,a,b)};f.Nr=function(a,b,c){Sk(this,this.Id,a,b,c)};f.lq=function(a,b){return Tk(this,this.Id,b)};
            f.Pr=function(a,b,c){a=this.Id;m(this,a.port+4,b,c,"MODE");a.bd=b;Fk(this,!1)};f.mq=function(a,b){return Uk(this,this.Id,b)};f.wo=function(a,b,c){this.W.ji=this.W.ji&-4|b&3;m(this,a,b,c,"FEAT")};f.bo=function(a,b){var c=this.W.ae?this.W.rf[this.W.Fe&31]:this.W.Fe;b&&!this.qa()||m(this,960,null,b,"ATC."+(this.W.ae?this.W.Jk[this.W.Fe&31]:"INDX"),c);this.W.ae=!this.W.ae;return c};
            f.vo=function(a,b,c){var d=this.W.Fe&32;if(this.W.ae){var e=this.W.Fe&31;if(16<=e||!d)c&&!this.qa()||m(this,a,b,c,"ATC."+this.W.Jk[e]),this.W.rf[e]=b;this.W.ae=!1}else this.W.Fe=b,m(this,a,b,c,"ATC.INDX"),this.W.ae=!0,b&32&&!d&&Dk(this)&&ed(this,!0)};f.wq=function(a,b){var c=0;if(5==this.nb)c=3-((this.W.ah&12)>>2),c=(this.Gi&1<<c)<<4-c;else{var d=this.W.ii[0];45!=(d&63)&&2880!=(d&4032)&&184320!=(d&258048)&&(c|=16)}c|=this.W.qk&-17;this.W.qk=c;m(this,962,null,b,"STATUS0",c);return c};
            f.Qr=function(a,b,c){this.W.ah=b;Ck(this);m(this,962,b,c,"MISC")};f.xq=function(a,b){var c=this.W.Pm;m(this,963,null,b,"VGA_ENABLE",c);return c};f.$r=function(a,b,c){this.W.Pm=b;m(this,963,b,c,"VGA_ENABLE")};f.vq=function(a,b){var c=this.W.He;m(this,964,null,b,"SEQ.INDX",c);return c};f.Yr=function(a,b,c){this.W.He=b;m(this,964,b,c,"SEQ.INDX")};f.uq=function(a,b){var c=this.W.dh[this.W.He];b&&!this.qa()||m(this,965,null,b,"SEQ"+this.W.Lk[this.W.He],c);return c};
            f.Xr=function(a,b,c){c&&!this.qa()||m(this,965,b,c,"SEQ."+this.W.Lk[this.W.He]);this.W.dh[this.W.He]=b;switch(this.W.He){case 2:this.W.sb=dk[b&15];break;case 4:this.Rd(Ok(this))}};f.Yp=function(a,b){var c=this.W.Mm;b&&!this.qa()||m(this,966,null,b,"DAC.MASK",c);return c};f.Ar=function(a,b,c){c&&!this.qa()||m(this,966,b,c,"DAC.MASK");this.W.Mm=b};f.Zp=function(a,b){var c=this.W.mk;b&&!this.qa()||m(this,967,null,b,"DAC.STATE",c);return c};
            f.Br=function(a,b,c){c&&!this.qa()||m(this,967,b,c,"DAC.READ");this.W.ud=b;this.W.mk=3;this.W.uc=0};f.Cr=function(a,b,c){c&&!this.qa()||m(this,968,b,c,"DAC.WRITE");this.W.ud=b;this.W.mk=0;this.W.uc=0};f.Xp=function(a,b){var c=this.W.ii[this.W.ud]>>this.W.uc&63;b&&!this.qa()||m(this,969,null,b,"DAC.DATA["+k(this.W.ud)+"]["+k(this.W.uc)+"]",c);this.W.uc+=6;12<this.W.uc&&(this.W.uc=0,this.W.ud=this.W.ud+1&255);return c};
            f.zr=function(a,b,c){a=this.W.ii[this.W.ud];c&&!this.qa()||m(this,969,b,c,"DAC.DATA["+k(this.W.ud)+"]["+k(this.W.uc)+"]");this.W.ii[this.W.ud]=a&~(63<<this.W.uc)|(b&63)<<this.W.uc;this.W.uc+=6;12<this.W.uc&&(this.W.uc=0,this.W.ud=this.W.ud+1&255)};f.yq=function(a,b){var c=this.W.ji;m(this,970,null,b,"FEAT",c);return c};f.Jr=function(a,b,c){this.W.Eo=b;m(this,970,b,c,"GRC2")};f.zq=function(a,b){var c=this.W.ah;m(this,972,null,b,"MISC",c);return c};f.Ir=function(a,b,c){this.W.Do=b;m(this,972,b,c,"GRC1")};
            f.dq=function(a,b){var c=this.W.Ge;m(this,974,null,b,"GRC.INDX",c);return c};f.Hr=function(a,b,c){this.W.Ge=b;m(this,974,b,c,"GRC.INDX")};f.cq=function(a,b){var c=this.W.Xf[this.W.Ge];b&&!this.qa()||m(this,975,null,b,"GRC."+this.W.Kk[this.W.Ge],c);return c};
            f.Gr=function(a,b,c){c&&!this.qa()||m(this,975,b,c,"GRC."+this.W.Kk[this.W.Ge]);this.W.Xf[this.W.Ge]=b;switch(this.W.Ge){case 0:this.W.ck=dk[b&15];this.W.Tf=this.W.ck&~this.W.pf;break;case 1:this.W.pf=~dk[b&15];this.W.Tf=this.W.ck&~this.W.pf;break;case 2:this.W.wl=dk[b&15]&-2139062144;break;case 3:case 5:this.Rd(Ok(this));break;case 4:this.W.Hm=(b&3)<<3;break;case 6:Fk(this,!1);break;case 7:this.W.xl=dk[b&15]&-2139062144;break;case 8:this.W.Bb=b|b<<8|b<<16|b<<24}};
            f.Sp=function(a,b){return Qk(this,this.gc,a,b)};f.tr=function(a,b,c){var d=this.gc;d.jk=d.Kc;d.Kc=b&31;m(this,a,b,c,"CRTC.INDX")};f.Rp=function(a,b){return Rk(this,this.gc,a,b)};f.sr=function(a,b,c){Sk(this,this.gc,a,b,c)};f.Tp=function(a,b){return Tk(this,this.gc,b)};f.ur=function(a,b,c){a=this.gc;m(this,a.port+4,b,c,"MODE");a.bd=b;Fk(this,!1)};f.Qp=function(a,b){var c=this.gc.Yg;b&&!this.qa()||m(this,a,null,b,this.gc.type+".COLOR",c);return c};
            f.rr=function(a,b,c){c&&!this.qa()||m(this,a,b,c,this.gc.type+".COLOR");this.gc.Yg!==b&&(this.gc.Yg=b,Pk(this,!1))};f.Up=function(a,b){return Uk(this,this.gc,b)};function Qk(a,b,c,d){var e;b.Xc&&(e=b.Kc);m(a,c,null,d,"CRTC.INDX",e);return e}function Rk(a,b,c,d){var e;b.Xc&&b.Kc<b.ul&&(e=b.tc[b.Kc]);d&&!a.qa()||m(a,c,null,d,"CRTC."+b.Ci[b.Kc],e);return e}function Sk(a,b,c,d,e){b.Kc<b.ul&&(e&&!a.qa()||m(a,c,d,e,"CRTC."+b.Ci[b.Kc]),b.tc[b.Kc]=d,9==b.Kc&&8!=b.jk&&Fk(a,!0),Gk(a))}
            function Tk(a,b,c){var d=b.bd;m(a,b.port+4,null,c,"MODE",d);return d}function Uk(a,b,c){var d=0,e=cd(a.O),g=e-b.Dl;0>g&&(g=0);g%b.yl>b.Sq&&(d|=1);g%=b.oo;g>b.Uq&&(d|=8);b.Dl=e-g;b===a.W?(d|=b.wa&48^48,b.ae=!1):d=(b.wa^=9)|240;b.wa=d;m(a,b.port+6,null,c,b===a.W?"STATUS1":"STATUS",d);return d}
            var sk={948:Z.prototype.kq,949:Z.prototype.jq,952:Z.prototype.lq,954:Z.prototype.mq},tk={948:Z.prototype.Or,949:Z.prototype.Nr,952:Z.prototype.Pr},uk={980:Z.prototype.Sp,981:Z.prototype.Rp,984:Z.prototype.Tp,985:Z.prototype.Qp,986:Z.prototype.Up},vk={980:Z.prototype.tr,981:Z.prototype.sr,984:Z.prototype.ur,985:Z.prototype.rr},wk={960:Z.prototype.bo,961:Z.prototype.bo,962:Z.prototype.wq,964:Z.prototype.vq,965:Z.prototype.uq,974:Z.prototype.dq,975:Z.prototype.cq},xk={954:Z.prototype.wo,960:Z.prototype.vo,
            961:Z.prototype.vo,962:Z.prototype.Qr,964:Z.prototype.Yr,965:Z.prototype.Xr,970:Z.prototype.Jr,972:Z.prototype.Ir,974:Z.prototype.Hr,975:Z.prototype.Gr,986:Z.prototype.wo},yk={963:Z.prototype.xq,966:Z.prototype.Yp,967:Z.prototype.Zp,969:Z.prototype.Xp,970:Z.prototype.yq,972:Z.prototype.zq},zk={963:Z.prototype.$r,966:Z.prototype.Ar,967:Z.prototype.Br,968:Z.prototype.Cr,969:Z.prototype.zr};
            Qa(function(){for(var a=lb(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=jb(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
            function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var g=window.document.createElement("textarea");Ja("iOS")&&(g.setAttribute("autocapitalize","off"),g.setAttribute("autocorrect","off"));c.appendChild(g);var l=e.getContext("2d"),d=new Z(d,e,l,g,c);kb(d,c)}});
            function Vk(a){this.Zn=a.adapter;switch(this.Zn){case 1:this.Jm=1016;this.ai=4;break;case 2:this.Jm=760;this.ai=3;break;default:Ca("Unrecognized serial adapter #"+this.Zn);return}this.af=null;Wa.call(this,"SerialPort",a,Vk,4194304);var b=a.binding,c;a=Wk;b&&(void 0===c&&(c="Panel"),(c=ib(c,this.id))&&(b=c.va[b])&&this.Lb(null,a,b))}fb(Vk);var Wk="buffer";f=Vk.prototype;f.nn=function(a,b){return a==this.Jg?(this.lf=b,this):null};
            f.Lb=function(a,b,c){var d=this;switch(b){case Wk:return this.va[b]=this.af=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),Xk(d,[b]))},c.onkeypress=function(a){a=a||window.event;Xk(d,[a.which||a.keyCode])},!0}return!1};f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=yb(a,"ChipSet");oc(b,this,Yk,this.Jm);sc(b,this,Zk,this.Jm);pb(this)};f.kc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
            f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf()};f.save=function(){var a=new Ie(this),b=0,c=[];c[b++]=this.Qk;c[b++]=this.tn;c[b++]=this.fg;c[b++]=this.Hi;c[b++]=this.We;c[b++]=this.Hd;c[b++]=this.Wd;c[b++]=this.hd;c[b++]=this.qn;c[b]=this.sh;a.set(0,c);return a.data()};f.restore=function(a){return this.jf(a[0])};
            f.jf=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.Qk=a[b++];this.tn=a[b++];this.fg=a[b++];this.Hi=a[b++];this.We=a[b++];this.Hd=a[b++];this.Wd=a[b++];this.hd=a[b++];this.qn=a[b++];this.sh=a[b];return!0};function Xk(a,b){a.sh=a.sh.concat(b);$k(a)}function $k(a){0<a.sh.length&&!(a.hd&1)&&(a.Qk=a.sh.shift(),a.hd|=1);var b=-1;a.hd&1&&a.Hi&1&&(b=4);0<=b?(a.We&=-8,a.We|=b,a.ja&&a.ai&&Wi(a.ja,a.ai,100)):(a.We|=1,a.ja&&a.ai&&Xi(a.ja,a.ai))}
            f.tq=function(a,b){var c=this.Hd&128?this.fg&255:this.Qk;m(this,a,null,b,this.Hd&128?"DLL":"RBR",c);this.hd&=-2;$k(this);return c};f.eq=function(a,b){var c=this.Hd&128?this.fg>>8:this.Hi;m(this,a,null,b,this.Hd&128?"DLM":"IER",c);return c};f.fq=function(a,b){var c=this.We;m(this,a,null,b,"IIR",c);return c};f.gq=function(a,b){var c=this.Hd;m(this,a,null,b,"LCR",c);return c};f.iq=function(a,b){var c=this.Wd;m(this,a,null,b,"MCR",c);return c};
            f.hq=function(a,b){var c=this.hd;m(this,a,null,b,"LSR",c);return c};f.nq=function(a,b){var c=this.qn;m(this,a,null,b,"MSR",c);return c};f.Zr=function(a,b,c){m(this,a,b,c,this.Hd&128?"DLL":"THR");this.Hd&128?this.fg=this.fg&-256|b:(this.tn=b,this.hd&=-97,this.af?(13!=b&&(8==b?this.af.value=this.af.value.slice(0,-1):(this.af.value+=String.fromCharCode(b),this.af.scrollTop=this.af.scrollHeight)),a=!0):a=!1,a&&(this.hd|=96))};
            f.Kr=function(a,b,c){m(this,a,b,c,this.Hd&128?"DLM":"IER");this.Hd&128?this.fg=this.fg&255|b<<8:this.Hi=b};f.Lr=function(a,b,c){m(this,a,b,c,"LCR");this.Hd=b};
            f.Mr=function(a,b,c){var d=this.Wd;m(this,a,b,c,"MCR");this.Wd=b;this.lf&&(d^b)&3&&(a=this.lf,b=this.Wd,(c=3==(b&3))?a.Xc||(d=!1,a.Wd&2||(a.reset(),a.$a("serial mouse reset"),d=!0),a.Wd&1||(a.$a("serial mouse ID requested"),d=!0),d&&(Xk(a.Dh,[77,77]),a.$a("serial mouse ID sent")),al(a),a.setActive(c)):a.Xc&&(a.$a("serial mouse inactive"),bl(a),a.setActive(c)),a.Wd=b)};
            var Yk={0:Vk.prototype.tq,1:Vk.prototype.eq,2:Vk.prototype.fq,3:Vk.prototype.gq,4:Vk.prototype.iq,5:Vk.prototype.hq,6:Vk.prototype.nq},Zk={0:Vk.prototype.Zr,1:Vk.prototype.Kr,3:Vk.prototype.Lr,4:Vk.prototype.Mr};Qa(function(){for(var a=lb(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Vk(d);kb(d,c)}});function cl(a){Wa.call(this,"Mouse",a,cl,33554432);if(this.ql=a.serial)this.Qm="SerialPort";this.setActive(!1);this.Lh=this.$i=!1;this.Bd=[];this.lg=[];pb(this)}fb(cl);
            f=cl.prototype;f.Ic=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;for(b=null;b=yb(a,"Video",b);)this.Bd.push(b)};f.setActive=function(a){this.Xc=a};
            f.kc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.Qm&&!this.Dh){for(var c=null;(c=yb(this.Fa,this.Qm,c))&&(!c.nn||!(this.Dh=c.nn(this.ql,this))););if(this.Dh)for(this.lg=[],c=0;c<this.Bd.length;c++){var d;d=this.Bd[c];d.lf=this;(d=d.Za)&&this.lg.push(d)}else Ca(this.id+": "+this.Qm+" "+this.ql+" unavailable")}this.Xc?al(this):bl(this)}return!0};f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.jf()};
            f.save=function(){var a=new Ie(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.jf(a[0])};f.jf=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.Me=a[b++];this.Ne=a[b++];this.gg=a[b++];this.hg=a[b++];this.Wi=a[b++];this.Xi=a[b++];this.Wd=a[b];return!0};f.Vm=function(){var a=0,b=[];b[a++]=this.Xc;b[a++]=this.Me;b[a++]=this.Ne;b[a++]=this.gg;b[a++]=this.hg;b[a++]=this.Wi;b[a++]=this.Xi;b[a]=this.Wd;return b};f.ei=function(a){this.$i=a};
            function al(a){if(!a.Lh)for(var b=0;b<a.lg.length;b++)dl(a,a.lg[b])&&(a.Lh=!0)}function bl(a){if(a.Lh)for(var b=0;b<a.lg.length;b++){var c=a.lg[b];c&&(c.style.cursor="auto")}}function dl(a,b){return b?(b.addEventListener("mousemove",function(b){a.ho(b)},!1),b.addEventListener("mousedown",function(b){a.Xk(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.Xk(b.button,!1)},!1),b.style.cursor="none",!0):!1}
            f.ho=function(a){if(this.Xc&&this.O&&this.O.fa.qb){if(0>this.Me||0>this.Ne)this.Me=a.clientX,this.Ne=a.clientY;this.$i?(this.gg=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.hg=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.gg=a.clientX-this.Me,this.hg=a.clientY-this.Ne);(this.gg||this.hg)&&el(this,null,a.clientX,a.clientY);this.Me=a.clientX;this.Ne=a.clientY}};
            f.Xk=function(a,b){if(this.Xc&&this.O&&this.O.fa.qb){var c;!(c=!1!==this.$i)&&(c=this.Bd.length)&&(c=this.Bd[0],c=c.sp?c.Qf(!0):!1);c||(this.$i=null);c="mouse button"+a+" "+(b?"dn":"up");switch(a){case 0:this.Wi!=b&&(this.Wi=b,el(this,c));break;case 2:this.Xi!=b&&(this.Xi=b,el(this,c))}}};
            function el(a,b,c,d){var e=64|(a.Wi?32:0)|(a.Xi?16:0)|(a.hg&192)>>4|(a.gg&192)>>6,g=a.gg&63,l=a.hg&63;a.qa(4194304)&&a.$a((b?b+": ":"")+(void 0!==d?"mouse ("+c+","+d+"): ":"")+"serial packet ["+k(e)+","+k(g)+","+k(l)+"]",0,!0);Xk(a.Dh,[e,g,l]);a.gg=a.hg=0}Qa(function(){for(var a=lb(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new cl(d);kb(d,c)}});
            function fl(a,b,c){Wa.call(this,"Disk",{id:a.ao+".disk"+ ++gl},fl,2097152);this.Z=a;this.Fa=a.Fa;this.Y=a.Y;this.Ta=b;this.ie=b.name;this.Cg=b.Cg;this.aj=this.ve=!1;this.create(c,b.Db,b.Eb,b.Kb,b.wb);this.yf=[];this.vi=[];this.Je=null;this.jo=0;this.nl=!1;pb(this)}var gl=0;fb(fl);f=fl.prototype;f.Ic=function(a,b,c,d){this.Y=d};f.kc=function(a,b){b||!this.aj||this.ve||(pb(this,!1),this.load(this.ie,this.$f,null,this.pp,this));return!0};f.pp=function(){pb(this,!0)};
            f.jc=function(a,b){if(this.ve){var c,d=0;if(this.nl&&!Da("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=hl(this,!1);)if(d=c[0]){this.Z.Da('Unable to save "'+this.ie+'" (error '+d+")");break}b&&this.ve&&(c="action=close&volume="+this.$f,c+="&machine="+this.Z.Fg(),c+="&user="+this.Z.gf(),za(Aa()+"/api/v1/disk?"+c,!0),this.ve=!1);!d&&a&&this.Z.Da(this.ie+" saved")}return!0};
            f.create=function(a,b,c,d,e){this.mode=a;this.Db=b;this.Eb=c;this.Kb=d;this.wb=e;this.hb=[];if("preload"!=this.mode){a=Array(this.Db);for(b=0;b<a.length;b++){c=Array(this.Eb);for(d=0;d<c.length;d++){e=Array(this.Kb);for(var g=1;g<=e.length;g++)e[g-1]=il(null,b,d,g,this.wb,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.hb=a}this.wg=null};
            f.load=function(a,b,c,d,e){var g=b;if(!this.Pf)if(this.ie=a,this.$f=b,this.Pf=d,this.jp=e||this.Z,c){var l=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=fa[c];if(d){l.Db=d[0];l.Eb=d[1];l.Kb=d[2];l.wb=512;b=l.wb>>2;var e=d=0,a=new DataView(a,0,c);l.hb=Array(l.Db);for(c=0;c<l.hb.length;c++)for(var g=l.hb[c]=Array(l.Eb),S=0;S<g.length;S++)for(var X=g[S]=Array(l.Kb),T=0;T<X.length;T++){for(var aa=il(null,c,S,T+1,l.wb,0),Ba=aa.data,pa=0;pa<b;pa++,e+=4)var Ra=Ba[pa]=a.getInt32(e,
            !0),d=d+Ra&-1;aa.Uc=b;X[T]=aa}l.wg=d;b=l}else l.Da("Unrecognized diskette format ("+c+" bytes)");l.Pf&&(l.Pf.call(l.Z,l.Ta,b,l.ie,l.$f),l.Pf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ja(b),"json"==a?g=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(g=jl(this,b),this.aj=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c="dir"),g=Aa()+"/api/v1/dump?"+
            c+"="+encodeURIComponent(b)+(this.Cg?"":d)+"&format=json")),za(g,!0,null,this,this.np,b)};
            f.np=function(a,b,c,d){var e=null;this.Eg=!1;var g=0>c&&this.Fa&&!this.Fa.fa.hc;if(this.aj)c?this.Z.Da('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",g):(this.ve=!0,e=this);else if(c)this.Z.Da('Unable to load disk "'+this.ie+'" (error '+c+")",g);else try{if(0<ia(a,!0).toLowerCase().indexOf("-readonly"))this.Eg=!0;else{var l=b.indexOf("\n");0<l&&1024>l&&0<b.substring(0,l).indexOf("write-protected")&&(this.Eg=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.ie]:0>b.indexOf("0x")&&
            '["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)Ca(p[0]);else{this.Db=p.length;this.Eb=p[0].length;this.Kb=p[0][0].length;var w=p[0][0][0];this.wb=w&&w.length||512;for(b=a=0;b<this.Db;b++)for(c=0;c<this.Eb;c++)for(d=0;d<this.Kb;d++)if(w=p[b][c][d]){var v=w.length;void 0===v&&(v=w.length=512);var v=v>>2,E=w.pattern;void 0===E&&(E=w.pattern=0);var O=w.data;if(void 0===O){var J=w.bytes;if(void 0!==J&&J.length){for(var g=
            v<<2,G=J.length;G<g;G++)J[G]=E;this.fill(w,J,0)}else O=[],E=w.pattern=E|E<<8|E<<16|E<<24,w.data=O;delete w.bytes}il(w,b,c);for(g=0;g<O.length;g++)a=a+O[g]&-1}this.hb=p;this.wg=a;e=this}else Ca("Empty disk image: "+this.ie)}catch(S){Ca("Disk image error: "+S.message)}this.Pf&&(this.Pf.call(this.jp,this.Ta,e,this.ie,this.$f),this.Pf=null)};function il(a,b,c,d,e,g){a||(a={sector:d,length:e,data:[],pattern:g});a.Cp=b;a.Ep=c;a.Ld=a.Uc=0;a.Ua=!1;return a}
            function jl(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb;c+="&machine="+a.Z.Fg();c+="&user="+a.Z.gf();return Aa()+"/api/v1/disk?"+c}function kl(a,b,c,d,e,g,l){if(a.ve){var p;p="action=read&volume="+a.$f;p+="&chs="+a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.Z.Fg());p+="&user="+a.Z.gf();za(Aa()+"/api/v1/disk?"+p,g,null,a,a.qp,[b,c,d,e,g,l])}else l&&l(-1,!1)}
            f.qp=function(a,b,c,d){var e=!1;a=d[0];var g=d[1],l=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var w=this.seek(a,g,l,!0);if(!w)break;this.fill(w,b,e);e+=w.length;l++}e=d[4]}(d=d[5])&&d(c,e)};f.rp=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],g=d[3];d=d[4];this.nl=!1;if(0<=a&&a<this.hb.length&&0<=b&&b<this.hb[a].length)for(--e;0<g--&&0<=e&&e<this.hb[a][b].length;e++){var l=this.hb[a][b][e];c?ll(this,l,!1):l.Ua||(l.Ld=l.Uc=0)}d&&ml(this)};
            function ll(a,b,c){b.Ua=!0;var d=a.yf.indexOf(b);0<=d&&(a.yf.splice(d,1),a.vi.splice(d,1));a.yf.push(b);a.vi.push(ta());c&&ml(a)}function ml(a){if(a.yf.length){var b=a.vi[0]+2E3;a.Je&&a.jo<b&&(clearTimeout(a.Je),a.Je=null);if(!a.Je){var c=ta(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.Je=setTimeout(function(){hl(a,!0)},b);a.jo=c+b}}else a.Je&&(clearTimeout(a.Je),a.Je=null)}
            function hl(a,b){b&&(a.Je=null);var c=a.yf[0];if(c){for(var d=c.Cp,e=c.Ep,c=c.sector,g=0,l=[],p=c-1;p<a.hb[d][e].length;p++){var w=a.hb[d][e][p];if(!w.Ua)break;var v=a.yf.indexOf(w);a.yf.splice(v,1);a.vi.splice(v,1);l=l.concat(nl(w));w.Ua=!1;g++}a.ve?(p={},a.nl=!0,p.action="write",p.volume=a.$f,p.chs=a.Db+":"+a.Eb+":"+a.Kb+":"+a.wb,p.addr=d+":"+e+":"+c+":"+g,p.machine=a.Z.Fg(),p.user=a.Z.gf(),p.data=JSON.stringify(l),d=za(Aa()+"/api/v1/disk",b,p,a,a.rp,[d,e,c,g,b])):d=!1;return b||d}return!1}
            f.info=function(){return this.hb.length?[this.hb.length,this.hb[0].length,this.hb[0][0].length,this.hb[0][0][0].length]:[0,0,0,0]};
            f.seek=function(a,b,c,d,e){var g=null,l=this.Ta,p=this.hb[a];if(p){var w=p[b];if(!w&&l.Nk&&b<l.Eb)for(w=p[b]=Array(l.Xe),p=0;p<w.length;p++)w[p]=il(null,a,b,p+1,l.mb,0);if(w){for(p=0;p<w.length;p++)if(w[p]&&w[p].sector==c){g=w[p];if(null===g.pattern)if(d)g.pattern=0;else{for(d=1;++p<w.length;)null===w[p].pattern&&d++;kl(this,a,b,c,d,null!=e,function(a,b){a&&(g=null);e&&e(g,b)});return e?null:g}break}!g&&l.Nk&&9==l.cb&&(g=w[p]=il(null,a,b,l.cb,l.mb,0))}}e&&e(g,!1);return g};
            f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),g=0;g<d;g++)e[g]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function nl(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var g=0;g<b;g++){var l=g<e.length?e[g]:a;c[d++]=l&255;c[d++]=l>>8&255;c[d++]=l>>16&255;c[d++]=l>>24&255}return c}function ol(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
            f.write=function(a,b,c){if(this.Eg)return!1;if(b<a.length){if(c!=ol(a,b)){var d=a.data,e=a.pattern,g=b>>2;b=(b&3)<<3;for(var l=d.length;l<=g;l++)d[l]=e;a.Uc?g<a.Ld?(a.Uc+=a.Ld-g,a.Ld=g):g>=a.Ld+a.Uc&&(a.Uc+=g-(a.Ld+a.Uc)+1):(a.Ld=g,a.Uc=1);d[g]=d[g]&~(255<<b)|c<<b;this.ve&&ll(this,a,!0)}return!0}return null};
            f.save=function(){var a=0,b=[];b[a++]=[this.$f,this.wg,this.Db,this.Eb,this.Kb,this.wb];if(!this.ve&&!this.Eg)for(var c=this.hb,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var g=0;g<c[d][e].length;g++){var l=c[d][e][g];if(l&&l.Uc){for(var p=[],w=0,v=l.Ld,E=l.Ld+l.Uc;v<E;)p[w++]=l.data[v++];b[a++]=[d,e,g,l.Ld,p]}}return b};
            f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.hb.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.wg&&e[1]!=this.wg&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.wg+")",b=-2));for(this.hb.length||(b=-1);d<a.length&&0<=b;){var g=0,l=a[d++],p=l[g++],w=l[g++],v=l[g++];if(p>=this.hb.length||w>=this.hb[p].length||v>=this.hb[p][w].length){c="sector (CHS="+p+":"+w+":"+v+") out of range ("+
            b+" changes applied)";b=-1;break}if(this.Eg){c="unable to modify write-protected disk";b=-1;break}e=l[g++];g=l[g++];l=e+g.length;if(p=this.hb[p][w][v]){for(w=p.data.length;w<e;)p.data[w++]=p.pattern;w=0;p.Ld=e;for(p.Uc=g.length;e<l;)p.data[e++]=g[w++];b++}}}0>b&&-2!=b&&this.Z.Da("Unable to restore disk '"+this.ie+": "+c);return b};
            f.toJSON=function(){var a=JSON.stringify(this.hb),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
            function pl(a){Wa.call(this,"FDC",a,pl,524288);this.dmaRead=this.al;this.dmaWrite=this.bl;this.dmaFormat=this.kp;this.Hf=null;if(a.autoMount&&(this.Hf=a.autoMount,"string"==typeof this.Hf))try{this.Hf=eval("("+a.autoMount+")")}catch(b){Ca("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.Hf=null}this.Nc=[];this.On=!Ja("Mobi")&&window&&"FileReader"in window}fb(pl);ea={};ca={};
            var ql={3:{qe:3,$e:0,name:ca.Ft},4:{qe:2,$e:1,name:ca.Dt},5:{qe:9,$e:7,name:ca.Rt},6:{qe:9,$e:7,name:ca.xt},7:{qe:2,$e:0,name:ca.zt},8:{qe:1,$e:2,name:ca.Et},10:{qe:2,$e:7,name:ca.yt},13:{qe:6,$e:7,name:ca.jt},15:{qe:3,$e:0,name:ca.Ct}};f=pl.prototype;
            f.Lb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.va[b]=c,c.onchange=function(){var a=d.va.descDisk,b=c.options[c.selectedIndex];if(a&&b){var l={};if(b=b.getAttribute("data-value"))try{l=eval("({"+b+"})")}catch(p){Ca("FDC option error: "+p.message)}b=l.desc;void 0===b&&(b="");l=l.href;void 0!==l&&(b='<a href="'+l+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.va[b]=c,c.onchange=function(){var a=ga(c.value,10);null!=a&&rl(d,a)},
            !0;case "loadDrive":return this.va[b]=c,c.onclick=function(){var a=d.va.listDisks;a&&sl(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.On?(this.va[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;sl(d,ia(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
            f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=yb(a,"ChipSet");this.we();oc(b,this,tl);sc(b,this,ul);this.On&&vl(this,"Local Disk","?");vl(this,"Remote Disk","??");this.vh()||pb(this)};
            f.kc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.Fa.jl){this.Nc=[];for(var c=0;c<this.Ea.length;c++)wl(this,c,!0);this.vh(!0)}}else if(!this.restore(a))return!1;if(c=this.va.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Cl;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Cl&&(c.value="0",rl(this,0))}}return!0};
            f.jc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.we()};f.save=function(){var a=new Ie(this);a.set(0,this.Sm());return a.data()};f.restore=function(a){return this.we(a[0])};
            f.we=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.rb=a[b++];b++;this.wa=a[b++];this.vc=a[b++];this.Hb=a[b++];this.pb=a[b++];this.bh=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Nc=c);void 0===this.Ea&&(this.Cl=4,this.ja&&(this.Cl=zi(this.ja)),this.Ea=Array(4));for(c=0;c<this.Ea.length;c++){var g=this.Ea[c];if(void 0===g){var g=this.Ea[c]={},l;if(this.ja)a:{l=this.ja;if(c<zi(l)){if(!l.Qe){l=360;break a}if(c<l.Qe.length){l=l.Qe[c];break a}}l=0}else l=0;switch(l){case 160:case 180:g.Eb=
            1;default:g.Db=40;g.Kb=9;break;case 720:g.Db=80;g.Kb=9;break;case 1200:g.Db=80;g.Kb=15;break;case 1440:g.Db=80,g.Kb=18}}this.rl(g,c,e[c])||(d=!1)}this.tf=a[b++]||0;this.Co=a[b]||0;return d};f.Sm=function(){var a=0,b=[];b[a++]=this.rb;b[a++]=0;b[a++]=this.wa;b[a++]=this.vc;b[a++]=this.Hb;b[a++]=this.pb;b[a++]=this.bh;b[a++]=this.Um();for(var c=a++,d=0;d<this.Ea.length;d++){var e=this.Ea[d];e.xa&&xl(this,e.ag,e.xa)}b[c]=this.Nc;b[a++]=this.tf;b[a]=this.Co;return b};
            f.rl=function(a,b,c){var d=0,e=!0;a.rb=b;a.Zc=a.Ag=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.Db||40,a.Eb||c[3],a.Kb||9,a.wb||512,c[1],a.lj,a.Zh,a.$h]);a.gb=c[d++];var g=c[d++];a.name=g[0];a.Db=g[1];a.Eb=g[2];a.Kb=g[3];a.wb=g[4];a.Cg=g[5];(a.lj=g[6])?(a.Zh=g[7],a.$h=g[8]):(a.lj=a.Db,a.Zh=a.Eb,a.$h=a.Kb);a.Sa=c[d++];a.Ve=c[d++];a.zb=c[d++];a.Ve=100<=a.Ve?a.Ve-100:a.Ve-a.zb;a.cb=c[d++];a.Xe=c[d++];a.mb=c[d++];a.Va=c[d++];a.Xa=null;a.xa||(a.ag="");var l=c[d++];
            102==l&&(l=!1);"boolean"==typeof l?(g=c[d++],c=c[d],l?(d=this.Ea[b],wl(this,b,!0,!0),d.Ag=!0,b=new fl(this,d,"preload"),this.Hn(d,b,g,c,!0)):yl(this,b,g,c,!0)?a.xa&&c&&zl(this,g,c,a.xa):pb(this,!1)):void 0!==l&&a.xa&&0>a.xa.restore(l)&&(e=!1);e&&a.xa&&void 0!==a.Va&&(a.Xa=a.xa.seek(a.zb,a.Sa,a.cb));return e};f.Um=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Tm(this.Ea[c]);return b};
            f.Tm=function(a){var b=0,c=[];c[b++]=a.gb;c[b++]=[a.name,a.Db,a.Eb,a.Kb,a.wb,a.Cg,a.lj,a.Zh,a.$h];c[b++]=a.Sa;c[b++]=a.Ve+100;c[b++]=a.zb;c[b++]=a.cb;c[b++]=a.Xe;c[b++]=a.mb;c[b++]=a.Va;c[b++]=a.Ag;c[b++]=a.Jo;c[b]=a.ag;return c};f.En=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};f.Mo=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[2],g=d[1]*e;if(b+c<=d[0]*g)return a.zb=Math.floor(b/g),b%=g,a.Sa=Math.floor(b/e),a.cb=b%e+1,a.mb=c*d[3],a.gb=0,!0}return!1};
            f.vh=function(a){a||(this.Df=0);if(this.Hf)for(var b in this.Hf){var c=this.Hf[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.Ea.length){!yl(this,d,c.name,c.path,!0)&&a&&pb(this,!1);continue}}this.Da("Unrecognized auto-mount specification for drive "+b)}return!!this.Df};
            function sl(a,b,c,d){var e,g=a.va.listDrives;if(g&&!isNaN(e=ga(g.value,10))&&0<=e&&e<a.Ea.length)if(c)if("?"==c)a.Da('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ia(c);a.R("Attempting to load "+c+' as "'+b+'"')}for(a.R("loading disk "+c+"...");yl(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var g=a,l=c,p=
            void 0,p=0;p<g.Nc.length;p++)if(g.Nc[p][1]==l){g.Nc.splice(p,1);break}wl(a,e,!1,!0)}}else wl(a,e);else a.Da("Nothing to load")}function yl(a,b,c,d,e,g){var l=a.Ea[b];if(d&&l.ag!=d){wl(a,b,e,!0);if(l.Zc)return a.Da("Drive "+b+" busy"),!0;l.Zc=!0;e&&(l.Nf=!0,a.Df++,a.qa()&&a.$a("loading diskette '"+c+"'"));l.Ag=!!g;(new fl(a,l,"preload")).load(c,d,g,a.Hn);return!1}return!0}
            f.Hn=function(a,b,c,d,e){var g;a.Zc=!1;b&&(g=b.info(),b&&g[0]>a.Db||g[1]>a.Eb)&&(this.Da('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.rb)),b=null);b?(a.xa=b,a.Jo=c,a.ag=d,zl(this,c,d,b),g=b.info(),this.tf|=128,this.Da('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.rb),a.Nf||e),a.lj=g[0],a.Zh=g[1],a.$h=g[2]):a.Ag=!1;a.Nf&&(a.Nf=!1,--this.Df||pb(this));rl(this,a.rb)};
            function vl(a,b,c){if(a=a.va.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function rl(a,b){if(0<=b&&b<a.Ea.length){var c=a.Ea[b],d=a.va.listDisks,e=a.va.listDrives;if(d&&e&&(e=ga(e.value,10),c=c.Ag?"?":c.ag,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
            function wl(a,b,c,d){var e=a.Ea[b];e.xa&&(xl(a,e.ag,e.xa),e.Jo="",e.ag="",e.xa=null,e.Ag=!1,a.tf|=128,d||a.Da("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||rl(a,b))}function zl(a,b,c,d){var e;for(e=0;e<a.Nc.length;e++)if(a.Nc[e][1]==c){d.restore(a.Nc[e][2]);return}a.Nc[e]=[b,c,[]]}function xl(a,b,c){var d;for(d=0;d<a.Nc.length;d++)if(a.Nc[d][1]==b){a.Nc[d][2]=c.save();break}}f.Fr=function(a,b,c){m(this,a,b,c,"OUTPUT");b&4?this.bh&4||this.bh&8&&this.ja&&Wi(this.ja,6):this.we();this.bh=b};
            f.bq=function(a,b){m(this,a,null,b,"STATUS",this.wa);return this.wa};f.$p=function(a,b){var c=0;this.Hb<this.pb&&(c=this.vc[this.Hb]);this.bh&8&&this.ja&&Xi(this.ja,6);this.qa()&&m(this,a,null,b,"DATA["+this.Hb+"]",c);++this.Hb>=this.pb&&(this.wa&=-81,this.Hb=this.pb=0);return c};
            f.Er=function(a,b,c){this.qa()&&m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.vc.length&&(this.vc[this.pb++]=b);a=this.vc[0]&31;if(void 0!==ql[a]&&this.pb>=ql[a].qe){b=!1;this.Hb=0;a=this.Wa();var d,e,g,l,p=a&31;switch(p){case 3:this.Wa(ea.Gt);this.Wa(ea.mt);this.ec();break;case 4:c=this.Wa(ea.kh);this.rb=c&3;d=this.Ea[this.rb];this.ec();this.rc((d.gb&-16777216)>>>24,ea.Jt);break;case 5:case 6:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];d.Sa=b;c=d.zb=this.Wa(ea.an);e=this.Wa(ea.bn);
            g=d.cb=this.Wa(ea.dn);l=this.Wa(ea.Ak);d.mb=128<<l;d.Xe=this.Wa(ea.ht);this.Wa(ea.Xo);this.Wa(ea.gt);6==p?(p=d,p.gb=72,p.xa&&(p.Xa=null,p.gb=0,this.ja&&(Pi(this.ja,2,this,"dmaRead",p),Ii(this.ja,2)))):(p=d,p.gb=72,p.xa&&(p.xa.Eg?p.gb=576:(p.Xa=null,p.gb=0,this.ja&&(Pi(this.ja,2,this,"dmaWrite",p),Ii(this.ja,2)))));Al(this,d,a,b,c,e,g,l);b=!0;break;case 7:c=this.Wa(ea.kh);this.rb=c&3;d=this.Ea[this.rb];d.zb=d.Ve=0;d.gb=268435488;this.ec();b=!0;break;case 8:d=this.Ea[this.rb];d.Sa=0;this.ec();this.rc(d.rb|
            d.Sa<<2|d.gb&255,ea.Zo);this.rc(d.zb,ea.vt);this.rb=this.rb+1&3;break;case 10:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.zb;e=d.Sa=b;g=d.cb=1;l=0;d.gb=0;d.xa&&(d.Xa=d.xa.seek(d.zb,d.Sa,d.cb))?l=d.Xa.length:d.gb=72;Al(this,d,a,b,c,e,g,l);b=!0;break;case 13:c=this.Wa(ea.kh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.zb;e=d.Sa=b;g=1;l=this.Wa(ea.Ak);d.mb=128<<l;d.Xe=this.Wa(ea.Bt);this.Wa(ea.Xo);d.pn=this.Wa(ea.Wo);p=d;p.gb=72;p.xa&&(p.Xa=null,p.gb=0,this.ja&&(p.sg=0,p.gd=Array(4),
            p.Nk=!0,p.Oi=0,Pi(this.ja,2,this,"dmaFormat",p),Ii(this.ja,2),p.Nk=!1));Al(this,d,a,b,c,e,g,l);b=!0;break;case 15:c=this.Wa(ea.kh),this.rb=c&3,d=this.Ea[this.rb],d.Sa=c>>2&1,c=this.Wa(ea.st),d.zb+=c-d.Ve,0>d.zb&&(d.zb=0),d.zb>=d.Db&&(d.zb=d.Db-1),d.Ve=c,d.gb=32,d.zb||(d.gb|=268435456),this.ec(),b=!0}0<this.pb&&(this.wa|=80);this.bh&8&&(!d||d.gb&8||!b||this.ja&&Wi(this.ja,6))}};f.aq=function(a,b){var c=this.tf;this.tf&=-129;m(this,a,null,b,"INPUT",c);return c};
            f.Dr=function(a,b,c){m(this,a,b,c,"CONTROL");this.Co=b};function Al(a,b,c,d,e,g,l,p){a.ec();a.rc(b.rb|b.Sa<<2|b.gb&255,ea.Zo);a.rc((b.gb&65280)>>>8,ea.Ht);a.rc((b.gb&16711680)>>>16,ea.It);var w=0;if(e!=b.zb||g!=b.Sa)w=l=1;c&128&&(g^=w,d||(w=0));a.rc(e+w,ea.an);a.rc(g,ea.bn);a.rc(l,ea.dn);a.rc(p,ea.Ak)}f.Wa=function(){var a=this.vc[this.Hb];this.Hb++;return a};f.ec=function(){this.Hb=this.pb=0};f.rc=function(a){this.vc[this.pb++]=a};f.al=function(a,b,c){void 0===b||0>b?this.Xg(a,c):c(-1,!1)};
            f.bl=function(a,b){return void 0!==b&&0<=b?this.jh(a,b):-1};f.kp=function(a,b){return void 0!==b&&0<=b?this.Xm(a,b):-1};f.Xg=function(a,b){var c=-1,d=null,e=0;if(!a.gb&&a.xa){do{if(a.Xa&&(e=a.Va,0<=(c=ol(a.Xa,a.Va++)))){d=a.Xa;break}a.Xa=a.xa.seek(a.zb,a.Sa,a.cb);if(!a.Xa){a.gb=1088;break}a.Va=0;this.uh(a)}while(1)}b(c,!1,d,e)};
            f.jh=function(a,b){if(a.gb||!a.xa)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Va++,b))break;a.Xa=a.xa.seek(a.zb,a.Sa,a.cb);if(!a.Xa){a.gb=8256;b=-1;break}a.Va=0;this.uh(a)}while(1);return b};f.uh=function(a){a.cb++;a.cb>=a.$h+1&&(a.cb=1,a.Sa++,a.Sa>=a.Zh&&(a.Sa=0,a.zb++))};f.Xm=function(a,b){if(a.gb)return-1;a.gd[a.sg++]=b;if(a.sg==a.gd.length){a.zb=a.gd[0];a.Sa=a.gd[1];a.cb=a.gd[2];a.mb=128<<a.gd[3];for(var c=a.sg=0;c<a.mb;c++)if(0>this.jh(a,a.pn))return-1;a.Oi++}a.Oi>=a.Xe&&(b=-1);return b};
            var tl={1012:pl.prototype.bq,1013:pl.prototype.$p,1015:pl.prototype.aq},ul={1010:pl.prototype.Fr,1013:pl.prototype.Er,1015:pl.prototype.Dr};Qa(function(){for(var a=lb(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new pl(d);kb(d,c)}});
            function Bl(a){Wa.call(this,"HDC",a,Bl,1048576);this.dmaRead=this.al;this.dmaWrite=this.bl;this.dmaWriteBuffer=this.lp;this.dmaWriteFormat=this.mp;this.Dk=[];if(a.drives)try{this.Dk=eval("("+a.drives+")")}catch(b){Ca("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Qh=(this.Mf="at"==a.type)?1:0;this.Dp=this.Mf?2:3}fb(Bl);
            var Cl=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=Bl.prototype;f.Lb=function(){return!1};f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=yb(a,"ChipSet");oc(b,this,this.Mf?Dl:El);sc(b,this,this.Mf?Fl:Gl);Be(c,19,this,this.Eq);Be(c,64,this,this.Fq);this.reset();this.vh()||pb(this)};
            f.kc=function(a,b){if(!b)if(!a||!this.restore)this.we(),this.Fa.jl&&this.vh(!0);else if(!this.restore(a))return!1;return!0};f.jc=function(a){return a&&this.save?this.save():!0};f.Fg=function(){return this.Fa?this.Fa.Fg():""};f.gf=function(){return this.Fa?this.Fa.gf():""};f.reset=function(){this.we(null,!0)};f.save=function(){var a=new Ie(this);a.set(0,this.Sm());return a.data()};f.restore=function(a){return this.we(a[0])};
            f.we=function(a,b){var c=0,d=!0;if(this.Mf)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.sf=a[c++],this.Io=a[c++],this.uf=a[c++],this.pk=a[c++],this.lk=a[c++],this.kk=a[c++],this.$g=a[c++],this.wa=a[c++],this.Lm=a[c++],this.nk=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.Zg=a[c++];this.wa=a[c++];this.vc=a[c++];this.Hb=a[c++];this.pb=a[c++];this.Ho=a[c++];this.Go=a[c++];this.Fo=a[c++];var e=a[c++];void 0!==e?this.Hg=e:void 0===this.Hg&&(this.Hg=-1)}void 0===this.Ea&&(this.Ea=Array(this.Dk.length));
            c=a[c];void 0===c&&(c=[]);for(e=0;e<this.Ea.length;e++){void 0===this.Ea[e]&&(this.Ea[e]={});var g=this.Ea[e];this.rl(e,g,this.Dk[e],c[e],b)||(d=!1);null!=this.Zg&&1>=e&&(this.Zg|=(g.type&3)<<(1-e<<1))}return d};
            f.Sm=function(){var a=0,b=[];this.Mf?(b[a++]=this.sf,b[a++]=this.Io,b[a++]=this.uf,b[a++]=this.pk,b[a++]=this.lk,b[a++]=this.kk,b[a++]=this.$g,b[a++]=this.wa,b[a++]=this.Lm,b[a++]=this.nk):(b[a++]=this.Zg,b[a++]=this.wa,b[a++]=this.vc,b[a++]=this.Hb,b[a++]=this.pb,b[a++]=this.Ho,b[a++]=this.Go,b[a++]=this.Fo,b[a++]=this.Hg);b[a]=this.Um();return b};
            f.rl=function(a,b,c,d,e){var g=0,l=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.rb=a;b.errorCode=d[g++];b.Oo=d[g++];b.Cg=d[g++];b.og=d[g++];b.pg=d[g++];b.Sa=d[g++];b.Eb=d[g++];b.Ke=d[g++];b.cb=d[g++];b.Xe=d[g++];b.mb=d[g++];b.Mi=this.Mf?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.gf()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===Cl[this.Qh][b.type])b.type=this.Dp;c=Cl[this.Qh][b.type];
            b.Kb=c[2]||17;b.wb=c[3]||512;if(e&&this.ja&&(e=this.ja,c=b.type,e.ga)){var p=e.ga[18],p=a?p&240|c:p&15|c<<4;e.ga&&(e.ga[18]=p,ri(e))}void 0===b.xa&&(b.xa=null,this.Da("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));Hl(this,b);b.Va=d[g++];b.Xa=null;b.xa&&(a=d[g],void 0!==a&&0>b.xa.restore(a)&&(l=!1),l&&void 0!==b.Va&&(b.Xa=b.xa.seek(b.Ke,b.Sa,b.cb+b.Mi)));return l};f.Um=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Tm(this.Ea[c]);return b};
            f.Tm=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Oo;c[b++]=a.Cg;c[b++]=a.og;c[b++]=a.pg;c[b++]=a.Sa;c[b++]=a.Eb;c[b++]=a.Ke;c[b++]=a.cb;c[b++]=a.Xe;c[b++]=a.mb;c[b++]=a.Va;c[b]=a.xa?a.xa.save():null;return c};f.En=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};
            function Hl(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.og[2])?e=b.og[0]<<8|b.og[1]:c=b.type);null==c||d||(d=Cl[a.Qh][c][1],e=Cl[a.Qh][c][0]);d&&((c=Cl[a.Qh][b.type])&&e!=c[0]&&d!=c[1]&&a.Da("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.Db=e,b.Eb=d,null==b.xa&&(b.xa=new fl(a,b,b.mode)))}}
            f.Mo=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[0];if(e){var g=d[2],l=d[1]*g;if(b+c<=e*l)return a.Ke=Math.floor(b/l),b%=l,a.Sa=Math.floor(b/g),a.cb=b%g,a.mb=c*d[3],a.errorCode=0,!0}}return!1};
            f.vh=function(a){a||(this.Df=0);for(var b=0;b<this.Ea.length;b++){var c=this.Ea[b];if(c.name&&c.path){if(!(a&&c.xa&&c.xa.aj)){var d;d=c.name;var c=c.path,e=this.Ea[b];e.Zc?(this.Da("Drive "+b+" busy"),d=!0):(e.Zc=!0,e.Nf=!0,this.Df++,this.qa()&&this.$a("loading "+d),(e.xa||new fl(this,e,e.mode)).load(d,c,null,this.op),d=!1);!d&&a&&pb(this,!1)}}else a&&void 0!==c.type&&(c.xa=null,Hl(this,c,c.type))}return!!this.Df};
            f.op=function(a,b,c){a.Zc=!1;(a.xa=b)&&this.Da('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.rb),a.Nf);a.Nf&&(a.Nf=!1,--this.Df||pb(this))};f.Bq=function(a,b){var c=0;this.Hb<this.pb&&(c=this.vc[this.Hb]);this.ja&&Xi(this.ja,5);this.wa&=-33;m(this,a,null,b,"DATA["+this.Hb+"]",c);++this.Hb>=this.pb&&(this.Hb=this.pb=0,this.wa&=-15);return c};
            f.as=function(a,b,c){m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.vc.length&&(this.vc[this.pb++]=b);a=12!=this.vc[0]?6:this.vc.length;6==this.pb&&(this.wa&=-2);this.pb>=a&&(this.wa|=2,this.wa&=-2,Il(this))};f.Cq=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);this.Hb<this.pb&&(this.wa|=1);return c};f.es=function(a,b,c){m(this,a,b,c,"RESET");this.Ho=b;this.ja&&Xi(this.ja,5);this.we()};f.Aq=function(a,b){m(this,a,null,b,"CONFIG",this.Zg);return this.Zg};
            f.ds=function(a,b,c){m(this,a,b,c,"PULSE");this.Go=b;this.wa=13};f.cs=function(a,b,c){m(this,a,b,c,"PATTERN");this.Fo=b};f.Im=function(a,b,c){m(this,a,b,c,"NOISE")};
            f.Kp=function(a,b){var c=-1;if(this.Ta){var d=this,c=this.Xg(this.Ta,function(){});1==this.Ta.Va?this.qa(1048832)&&m(this,a,null,b,"DATA["+this.Ta.Va+"]",c):this.Ta.Va==this.Ta.wb&&(this.Ta.mb-=this.Ta.wb,this.uf=this.uf-1&255,this.Ta.mb>=this.Ta.wb?(d.wa=136,this.Xg(this.Ta,function(a){0<=a?(Jl(d),d.wa=80):(d.wa=1,d.sf=16)},!1)):this.wa=80)}return c};
            f.lr=function(a,b,c){this.Ta&&this.Ta.mb>=this.Ta.wb&&(0>this.jh(this.Ta,b)?(this.wa=1,this.sf=16):1==this.Ta.Va?this.qa(1048832)&&m(this,a,b,c,"DATA["+this.Ta.Va+"]"):this.Ta.Va==this.Ta.wb&&(this.Ta.mb-=this.Ta.wb,this.uf=this.uf-1&255,Jl(this),this.wa=80,this.Ta.mb>=this.Ta.wb&&(this.wa|=8)))};f.Mp=function(a,b){var c=this.sf;m(this,a,null,b,"ERROR",c);return c};f.qr=function(a,b,c){m(this,a,b,c,"WPREC");this.Io=b};f.Np=function(a,b){var c=this.uf;m(this,a,null,b,"SECCNT",c);return c};
            f.or=function(a,b,c){m(this,a,b,c,"SECCNT");this.uf=b};f.Op=function(a,b){var c=this.pk;m(this,a,null,b,"SECNUM",c);return c};f.pr=function(a,b,c){m(this,a,b,c,"SECNUM");this.pk=b};f.Jp=function(a,b){var c=this.lk;m(this,a,null,b,"CYLLO",c);return c};f.kr=function(a,b,c){m(this,a,b,c,"CYLLO");this.lk=b};f.Ip=function(a,b){var c=this.kk;m(this,a,null,b,"CYLHI",c);return c};f.jr=function(a,b,c){m(this,a,b,c,"CYLHI");this.kk=b};f.Lp=function(a,b){var c=this.$g;m(this,a,null,b,"DRVHD",c);return c};
            f.mr=function(a,b,c){m(this,a,b,c,"DRVHD");this.$g=b;this.wa=this.Ea[this.$g&16?1:0]?this.wa|64:this.wa&-65};f.Pp=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);return c};f.ir=function(a,b,c){m(this,a,b,c,"COMMAND");this.Lm=b;this.ja&&Xi(this.ja,14);Kl(this)};f.nr=function(a,b,c){m(this,a,b,c,"FDR");this.nk&4&&!(b&4)&&(this.sf=1);this.nk=b};
            function Kl(a){var b=!1,c=a.Lm,d=a.$g&16?1:0,e=a.$g&15,g=a.lk|(a.kk&3)<<8,l=a.pk,p=a.uf||256;a.Ta=null;a.sf=0;a.wa=80;(d=a.Ea[d])?(d.Ke=g,d.Sa=e,d.cb=l,d.mb=p*d.wb,c=144<=c?c:c&240,d.Xa=null,d.Va=0,d.errorCode=0,a.Ta=d):c=-1;switch(c&240){case 32:a.wa=136;a.Xg(d,function(b){0<=b&&a.ja?(Jl(a),a.wa=80):(a.wa=1,a.sf=16)},!1);break;case 48:a.wa=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.sf=1;b=!0;break;case 145:d.Eb=e+1,d.Kb=p,b=!0}b&&Jl(a)}
            function Jl(a){!a.ja||a.nk&2||Wi(a.ja,14,120)}
            function Il(a){a.Hb=0;var b=a.Wa(),c=a.Wa(),d=c&32,e=d>>5,g=c&31,l=a.Wa(),p=a.Wa(),w=l<<2&768|p,v=l&63,E=a.Wa(),O=a.Wa(),J=a.Ea[e];J&&(J.Ke=w,J.Sa=g,J.cb=v,J.mb=E*J.wb);switch(b){case 3:a.ec(J?J.errorCode:4);a.rc(c);a.rc(l);a.rc(p);a.rc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.Wa());)J&&c<J.og.length&&(J.og[c++]=b);J&&Hl(a,J);b=0;J||a.Hg!=e||(a.Hg=-1,b=2);a.ec(b|d);b=-1;break;case 224:case 228:a.ec(0|d),b=-1}if(0<=b)switch(void 0===J?b=-1:(J.errorCode=0,J.Oo=0),b){case 0:a.ec(0|d);break;case 1:J.Xt=
            O;a.ec(0|d);break;case 5:a.ec(0|d);break;case 8:Ll(a,J,function(b){a.ec(b|d)});break;case 10:Ml(a,J,function(b){a.ec(b|d)});break;case 15:Nl(a,J,function(b){a.ec(b|d)});break;default:a.ec(2|d)}}f.Wa=function(){var a=-1;this.Hb<this.pb&&(a=this.vc[this.Hb++]);return a};f.ec=function(a){this.Hb=this.pb=0;void 0!==a&&this.rc(a);this.ja&&Wi(this.ja,5);this.wa|=32};f.rc=function(a){this.vc[this.pb++]=a};f.al=function(a,b,c){void 0===b||0>b?this.Xg(a,c):c(-1,!1)};
            f.bl=function(a,b){return void 0!==b&&0<=b?this.jh(a,b):-1};f.lp=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Va<a.pg.length?a.pg[a.Va++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.mp=function(a,b){return void 0!==b&&0<=b?this.Xm(a,b):-1};function Ll(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Pi(a.ja,3,a,"dmaRead",b);Ii(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
            function Ml(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Pi(a.ja,3,a,"dmaWrite",b);Ii(a.ja,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Nl(a,b,c){b.errorCode=4;b.pg&&b.pg.length==b.mb||(b.pg=Array(b.mb));b.Va=0;a.ja?(b.errorCode=0,Pi(a.ja,3,a,"dmaWriteBuffer",b),Ii(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
            f.Xg=function(a,b,c){var d=-1,e=null,g=0;if(a.errorCode)return b&&b(d,!1,e,g),d;var l=!1!==c?1:0;if(a.Xa&&(g=a.Va,d=ol(a.Xa,a.Va),a.Va+=l,0<=d))return e=a.Xa,b&&b(d,!1,e,g),d;if(b){var p=this;if(a.xa)return a.xa.seek(a.Ke,a.Sa,a.cb+a.Mi,!1,function(c,v){(a.Xa=c)?(e=c,g=a.Va=0,p.uh(a),d=ol(a.Xa,a.Va),a.Va+=l):a.errorCode=20;b(d,v,e,g)}),d;a.errorCode=20;b(d,!1,e,g)}return d};
            f.jh=function(a,b){if(a.errorCode)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Va++,b))break;a.xa&&a.xa.seek(a.Ke,a.Sa,a.cb+a.Mi,!0,function(b){a.Xa=b});if(!a.Xa){a.errorCode=20;b=-1;break}a.Va=0;this.uh(a)}while(1);return b};f.uh=function(a){a.cb++;var b=1-a.Mi;a.cb>=a.Kb+b&&(a.cb=b,a.Sa++,a.Sa>=a.Eb&&(a.Sa=0,a.Ke++))};
            f.Xm=function(a,b){if(a.errorCode)return-1;a.gd[a.sg++]=b;if(a.sg==a.gd.length){a.Ke=a.gd[0];a.Sa=a.gd[1];a.cb=a.gd[2];a.mb=128<<a.gd[3];for(var c=a.sg=0;c<a.mb;c++)if(0>this.jh(a,a.pn))return-1;a.Oi++}a.Oi>=a.Xe&&(b=-1);return b};f.Eq=function(){var a=this.O.H&255;!(this.O.F>>8)&&128<a&&(this.Hg=a-128);return!0};f.Fq=function(){var a;(a=this.O.F>>8||!this.ja)||(a=!(this.ja.cc[0].Vd&64));return a?!0:!1};
            var El={800:Bl.prototype.Bq,801:Bl.prototype.Cq,802:Bl.prototype.Aq},Dl={496:Bl.prototype.Kp,497:Bl.prototype.Mp,498:Bl.prototype.Np,499:Bl.prototype.Op,500:Bl.prototype.Jp,501:Bl.prototype.Ip,502:Bl.prototype.Lp,503:Bl.prototype.Pp},Gl={800:Bl.prototype.as,801:Bl.prototype.es,802:Bl.prototype.ds,803:Bl.prototype.cs,807:Bl.prototype.Im,811:Bl.prototype.Im,815:Bl.prototype.Im},Fl={496:Bl.prototype.lr,497:Bl.prototype.qr,498:Bl.prototype.or,499:Bl.prototype.pr,500:Bl.prototype.kr,501:Bl.prototype.jr,
            502:Bl.prototype.mr,503:Bl.prototype.ir,1014:Bl.prototype.nr};Qa(function(){for(var a=lb(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Bl(d);kb(d,c)}});
            function Ol(a){Wa.call(this,"Debugger",a,Ol);this.yh=this.Md=-1;this.tg=4;this.fo=65535;this.Gf=5;this.eo=1048575;this.nd=Pl(this);this.Gn=Pl(this);this.rd=-1;this.fd=[];this.xg=!1;this.Lf=Pl(this);this.Rc=[];Ql(this);Rl(this);Sl(this,a.messages);this.Rm=a.commands;var b=this;window?void 0===window.$&&(window.$=function(a){return Tl(b,a)}):void 0===global.$&&(global.$=function(a){return Tl(b,a)})}fb(Ol);
            var Ul={16:262144,19:524288,21:32768,22:65536,28:2048,33:134217728,51:33554432},Vl={"?":"help","a [#]":"assemble","b [#]":"breakpoint",c:"clear output","d [#]":"dump memory","e [#]":"edit memory",f:"frequencies","g [#]":"go [to #]","h [#]":"halt/history","i [#]":"input port #",k:"stack trace",l:"load sector(s)",m:"messages","o [#]":"output port #",p:"step over",r:"dump/edit registers","t [#]":"step instruction(s)","u [#]":"unassemble",x:"execution options",reset:"reset computer",ver:"display version"},
            Wl="INVALID AAA AAD AAM AAS ADC ADD AND ARPL AS: BOUND BSF BSR BT BTC BTR BTS CALL CBW CLC CLD CLI CLTS CMC CMP CMPSB CMPSW CS: CWD DAA DAS DEC DIV DS: ENTER ES: ESC FADD FBLD FBSTP FCOM FCOMP FDIV FDIVR FIADD FICOM FICOMP FIDIV FIDIVR FILD FIMUL FIST FISTP FISUB FISUBR FLD FLDCW FLDENV FMUL FNSAVE FNSTCW FNSTENV FNSTSW FRSTOR FS: FST FSTP FSUB FSUBR GS: HLT IDIV IMUL IN INC INS INT INT3 INTO IRET JBE JC JCXZ JG JGE JL JLE JMP JA JNC JNO JNP JNS JNZ JO JP JS JZ LAHF LAR LDS LEA LEAVE LES LFS LGDT LGS LIDT LLDT LMSW LOADALL LOCK LODSB LODSW LOOP LOOPNZ LOOPZ LSL LSS LTR MOV MOVSB MOVSW MOVSX MOVZX MUL NEG NOP NOT OR OS: OUT OUTS POP POPA POPF PUSH PUSHA PUSHF RCL RCR REPNZ REPZ RET RETF ROL ROR SAHF SALC SAR SBB SCASB SCASW SETBE SETC SETG SETGE SETL SETLE SETNBE SETNC SETNO SETNP SETNS SETNZ SETO SETP SETS SETZ SGDT SHL SHLD SHR SHRD SIDT SLDT SMSW SS: STC STD STI STOSB STOSW STR SUB TEST VERR VERW WAIT XCHG XLAT XOR".split(" "),
            Xl=[8086,80186,80286,80386],Yl="AL CL DL BL AH CH DH BH AX CX DX BX SP BP SI DI ES CS SS DS FS GS IP PS EAX ECX EDX EBX ESP EBP ESI EDI CR0 CR1 CR2 CR3".split(" "),Zl="BX+SI BX+DI BP+SI BP+DI SI DI BP BX EAX ECX EDX EBX ESP EBP ESI EDI".split(" "),$l={cpu:1,seg:2,desc:4,tss:8,"int":16,fault:32,bus:64,mem:128,port:256,dma:512,pic:1024,timer:2048,cmos:4096,rtc:8192,8042:16384,chipset:32768,keyboard:65536,key:131072,video:262144,fdc:524288,hdc:1048576,disk:2097152,serial:4194304,speaker:8388608,state:16777216,
            mouse:33554432,computer:67108864,dos:134217728,data:268435456,log:536870912,warn:1073741824,halt:-2147483648},am=[0,0],bm=[205,12291],cm=[[6,12417,4257],[6,12420,4260],[6,12449,4225],[6,12452,4228],[6,12385,4097],[6,14436,4100],[136,4211],[133,8307],[129,12417,4257],[129,12420,4260],[129,12449,4225],[129,12452,4228],[129,12385,4097],[129,14436,4100],[136,4467],[133,8563],[5,12417,4257],[5,12420,4260],[5,12449,4225],[5,12452,4228],[5,12385,4097],[5,14436,4100],[136,4723],[133,8819],[150,12417,4257],
            [150,12420,4260],[150,12449,4225],[150,12452,4228],[150,12385,4097],[150,14436,4100],[136,4979],[133,9075],[7,12417,4257],[7,12420,4260],[7,12449,4225],[7,12452,4228],[7,12385,4097],[7,14436,4100],[35,15],[29],[184,12417,4257],[184,12420,4260],[184,12449,4225],[184,12452,4228],[184,12385,4097],[184,14436,4100],[27,15],[30],[191,12417,4257],[191,12420,4260],[191,12449,4225],[191,12452,4228],[191,12385,4097],[191,14436,4100],[177,15],[1],[24,4225,4257],[24,4228,4260],[24,4257,4225],[24,4260,4228],[24,
            4193,4097],[24,6244,4100],[33,15],[4],[74,14436],[74,14692],[74,14948],[74,15204],[74,15460],[74,15716],[74,15972],[74,16228],[31,14436],[31,14692],[31,14948],[31,15204],[31,15460],[31,15716],[31,15972],[31,16228],[136,6244],[136,6500],[136,6756],[136,7012],[136,7268],[136,7524],[136,7780],[136,8036],[133,10340],[133,10596],[133,10852],[133,11108],[133,11364],[133,11620],[133,11876],[133,12132],[137,32768],[134,32768],[10,37028,4232],[8,8323,4259],[64,49167],[69,49167],[130,49167],[9,49167],[136,
            36868],[72,45219,4235],[136,36866],[72,45219,4234],[75,41041,6756],[75,41044,6756],[132,39524,4161],[132,39524,4164],[94,4145],[90,4145],[81,4145],[89,4145],[97,4145],[93,4145],[80,4145],[88,4145],[96,4145],[92,4145],[95,4145],[91,4145],[85,4145],[84,4145],[86,4145],[83,4145],[192,12417,4097],[193,12420,4100],[192,12417,4097],[194,12420,4097],[185,4225,4257],[185,4228,4260],[189,12449,12417],[189,12452,12420],[120,8321,4257],[120,8324,4260],[120,8353,4225],[120,8356,4228],[120,8324,4275],[101,8356,
            148],[120,8371,4228],[133,8324],[127],[189,14436,14692],[189,14436,14948],[189,14436,15204],[189,14436,15460],[189,14436,15716],[189,14436,15972],[189,14436,16228],[18],[28],[17,4103],[188],[138],[135],[147],[98],[120,8289,4129],[120,10340,4132],[120,8225,4193],[120,8228,6244],[121,8273,4161],[122,8276,4164],[25,4177,4161],[26,4180,4164],[185,4193,4097],[185,6244,4100],[181,8273,4193],[182,8276,6244],[112,8289,4161],[113,10340,4164],[151,4193,4177],[152,6244,4180],[120,8289,4097],[120,8545,4097],
            [120,8801,4097],[120,9057,4097],[120,9313,4097],[120,9569,4097],[120,9825,4097],[120,10081,4097],[120,10340,4100],[120,10596,4100],[120,10852,4100],[120,11108,4100],[120,11364,4100],[120,11620,4100],[120,11876,4100],[120,12132,4100],[195,28801,4097],[196,28804,4097],[143,4099],[143],[103,8356,4246],[100,8356,4246],[120,8321,4097],[120,8324,4100],[34,36867,4097],[102,32768],[144,4099],[144],[77],[76,4097],[78],[79],[197,12417,4113],[198,12420,4113],[199,12417,4449],[200,12420,4449],[3,1],[2,1],[148],
            [190],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[115,4145],[116,4145],[114,4145],[82,4145],[73,8289,4097],[73,10340,4097],[131,4097,4193],[131,4097,6244],[17,4148],[87,4148],[87,4103],[87,4145],[73,8289,6756],[73,10340,6756],[131,6756,4193],[131,6756,6244],[111,15],[0],[141,15],[142,15],[70],[23],[201,12417],[202,12420],[19],[178],[21],[180],[20],[179],[203,12417],[204,12420]],dm={0:[206,12419],1:[207,12419],2:[99,41123,4243],3:[117,41123,4243],5:[110,32768],
            6:[22,32768],32:[120,57509,4309],34:[120,57557,4261],128:[94,53300],129:[90,53300],130:[81,53300],131:[89,53300],132:[97,53300],133:[93,53300],134:[80,53300],135:[88,53300],136:[96,53300],137:[92,53300],138:[95,53300],139:[91,53300],140:[85,53300],141:[84,53300],142:[86,53300],143:[83,53300],144:[165,57473],145:[161,57473],146:[154,57473],147:[160,57473],148:[168,57473],149:[164,57473],150:[153,57473],151:[159,57473],152:[167,57473],153:[163,57473],154:[166,57473],155:[162,57473],156:[157,57473],
            157:[156,57473],158:[158,57473],159:[155,57473],160:[136,54387],161:[133,58483],163:[13,53380,4260],164:[171,57476,4260,4097],165:[171,57476,4260,4449],168:[136,54643],169:[133,58739],171:[16,57476,4260],172:[173,57476,4260,4097],173:[173,57476,4260,4449],175:[72,61572,4260],178:[118,8356,4246],179:[15,57476,4260],180:[104,8356,4246],181:[106,8356,4246],182:[124,57508,4225],183:[124,57509,4227],186:[208,61572,4097],187:[14,57476,4260],188:[11,57508,4228],189:[12,57508,4228],190:[123,57508,4225],191:[123,
            57509,4227]},em=[[[6,12417,4097],[129,12417,4097],[5,12417,4097],[150,12417,4097],[7,12417,4097],[184,12417,4097],[191,12417,4097],[24,4225,4097]],[[6,12420,4100],[129,12420,4100],[5,12420,4100],[150,12420,4100],[7,12420,4100],[184,12420,4100],[191,12420,4100],[24,4228,4100]],[[6,12420,4098],[129,12420,4098],[5,12420,4098],[150,12420,4098],[7,12420,4098],[184,12420,4098],[191,12420,4098],[24,4228,4098]],[[145,45185,4097],[146,45185,4097],[139,45185,4097],[140,45185,4097],[170,45185,4097],[172,45185,
            4097],am,[149,45185,4097]],[[145,45188,4097],[146,45188,4097],[139,45188,4097],[140,45188,4097],[170,45188,4097],[172,45188,4097],am,[149,45188,4097]],[[145,12417,4113],[146,12417,4113],[139,12417,4113],[140,12417,4113],[170,12417,4113],[172,12417,4113],am,[149,12417,4113]],[[145,12420,4113],[146,12420,4113],[139,12420,4113],[140,12420,4113],[170,12420,4113],[172,12420,4113],am,[149,12420,4113]],[[145,12417,4449],[146,12417,4449],[139,12417,4449],[140,12417,4449],[170,12417,4449],[172,12417,4449],
            am,[149,12417,4449]],[[145,12420,4449],[146,12420,4449],[139,12420,4449],[140,12420,4449],[170,12420,4449],[172,12420,4449],am,[149,12420,4449]],[[185,4225,4097],am,[128,12417],[126,12417],[125,4225],[72,12417],[32,4225],[71,12417]],[[185,4228,4100],am,[128,12420],[126,12420],[125,4228],[72,12420],[32,4228],[71,12420]],[[74,12417],[31,12417],am,am,am,am,am,am],[[74,12420],[31,12420],[17,4228],[17,4231],[87,4228],[87,4231],[136,4228],am],[],[[175,41091],[183,41091],[108,36995],[119,36995],[186,36995],
            [187,36995],am,am],[[169,41091],[174,41091],[105,36995],[107,36995],[176,41091],am,[109,36995],am],[am,am,am,am,[13,53380,4097],[16,57476,4097],[15,57476,4097],[14,57476,4097]]],fm={19:{0:"disk reset",1:"get status",2:"read drive DL (CH:DH:CL,AL) into ES:BX",3:"write drive DL (CH:DH:CL,AL) from ES:BX",4:"verify drive DL (CH:DH:CL,AL)",5:"format drive DL using ES:BX",8:"read drive DL parameters into ES:DI",21:"get drive DL DASD type",22:"get drive DL change line status",23:"set drive DL DASD type",
            24:"set drive DL media type"},21:{128:"open device",129:"close device",130:"program termination",131:"wait CX:DXus for event",132:"joystick support",133:"SYSREQ pressed",134:"wait CX:DXus",135:"move block (CX words)",136:"get extended memory size",137:"processor to virtual mode",144:"device busy loop",145:"interrupt complete flag set"},33:{0:"terminate program",1:"read character (al) from stdin with echo",2:"write character DL to stdout",3:"read character (al) from stdaux",4:"write character DL to stdaux",
            5:"write character DL to stdprn",6:"direct console output (input if DL=FF)",7:"direct console input without echo",8:"read character (al) from stdin without echo",9:"write $-terminated string DS:DX to stdout",10:"buffered input (ds:dx)",11:"get stdin status",12:"flush buffer and read stdin",13:"disk reset",14:"select default drive DL",15:"open file using fcb DS:DX",16:"close file using fcb DS:DX",17:"find first matching file using fcb DS:DX",18:"find next matching file using fcb DS:DX",19:"delete file using fcb DS:DX",
            20:"sequential read from file using fcb DS:DX",21:"sequential write to file using fcb DS:DX",22:"create or truncate file using fcb DS:DX",23:"rename file using fcb DS:DX",25:"get current default drive (al)",26:"set disk transfer area (dta) DS:DX",27:"get allocation information for default drive",28:"get allocation information for specific drive DL",31:"get drive parameter block for default drive",33:"read random record from file using fcb DS:DX",34:"write random record to file using fcb DS:DX",35:"get file size using fcb DS:DX",
            36:"set random record number for fcb DS:DX",37:"set address DS:DX of interrupt vector AL",38:"create new program segment prefix (psp) at segment DX",39:"random block read from file using fcb DS:DX",40:"random block write to file using fcb DS:DX",41:"parse filename DS:SI into fcb ES:DI using AL",42:"get system date (year=cx, mon=dh, day=dl)",43:"set system date (year=CX, mon=DH, day=DL)",44:"get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",45:"set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
            46:"set verify flag AL",47:"get disk transfer area address (es:bx)",48:"get DOS version (al=major, ah=minor)",49:"terminate and stay resident",50:"get drive parameter block (dpb=ds:bx) for drive DL",51:"extended break check",52:"get address (es:bx) of InDOS flag",53:"get address (es:bx) of interrupt vector AL",54:"get free disk space of drive DL",55:"get(0)/set(1) switch character DL (AL)",56:"get country-specific information",57:"create subdirectory DS:DX",58:"remove subdirectory DS:DX",59:"set current directory DS:DX",
            60:"create or truncate file DS:DX with attributes CX",61:"open existing file DS:DX with mode AL",62:"close file BX",63:"read CX bytes from file BX into buffer DS:DX",64:"write CX bytes to file BX from buffer DS:DX",65:"delete file DS:DX",66:"set position CX:DX of file BX relative to AL",67:"get(0)/set(1) attributes CX of file DS:DX (AL)",68:"get device information (IOCTL)",69:"duplicate file handle BX",70:"force file handle CX to duplicate file handle BX",71:"get current directory (ds:si) for drive DL",
            72:"allocate memory segment with BX paragraphs",73:"free memory segment ES",74:"resize memory segment ES to BX paragraphs",75:"load program DS:DX using parameter block ES:BX",76:"terminate with return code AL",77:"get return code (al)",78:"find first matching file DS:DX with attributes CX",79:"find next matching file",80:"set current psp BX",81:"get current psp (bx)",82:"get system variables (es:bx)",83:"translate bpb DS:SI to dpb (es:bp)",84:"get verify flag (al)",85:"create child psp at segment DX",
            86:"rename file DS:DX to name ES:DI",87:"get(0)/set(1) file date DX and time CX (AL)",88:"get(0)/set(1) memory allocation strategy (AL)",89:"get extended error information",90:"create temporary file DS:DX with attributes CX",91:"create file DS:DX with attributes CX",92:"lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)"}};f=Ol.prototype;
            f.Ic=function(a,b,c,d){this.ma=b;this.O=c;this.Fa=a;this.Ap=yb(a,"FDC");this.Xn=yb(a,"HDC");this.Gf=b.ze>>2;this.eo=b.Th;this.rh=cm;80186<=this.O.la&&(this.rh=cm.slice(),this.rh[15]=am,80286<=this.O.la&&(this.rh[15]=bm,80386<=this.O.la&&(this.tg=8,this.fo=-1)));gi(this,64,function(){d.R("id       physaddr   blkaddr   used    size    type");d.R("-------- ---------  --------  ------  ------  ----");for(var a=0;a<d.O.na.length;a++){var b=d.O.Pe[a];b.type!==zc&&d.R(h(b.id)+" %"+h(a<<d.O.Ca)+": "+h(b.Ba)+
            "  "+ha(b.eg)+"  "+ha(b.size)+"  "+Fc[b.type])}});gi(this,4,function(a){if(a){var b=gm(d,a);if(void 0===b)d.R("invalid selector: "+a);else if(a=hm(d,b),d.R("dumpDesc("+ha(a?a.ia:b)+"): %"+h(a?a.Dd:null,d.Gf)),a){var c,b=!1;if(a.type&4096)a.type&2048?(c="code"+(a.type&512?",readable":",execonly"),a.type&1024&&(c+=",conforming")):(c="data"+(a.type&512?",writable":",readonly"),a.type&1024&&(c+=",expdown")),a.type&256&&(c+=",accessed");else switch(a.type){case 256:c="tss";break;case 512:c="ldt";break;
            case 768:c="busy tss";break;case 1024:c="call gate";b=!0;break;case 1280:c="task gate";b=!0;break;case 1536:c="int gate";b=!0;break;case 1792:c="trap gate",b=!0}!c||a.Pb&32768||(c+=",not present");d.R((b?"seg="+ha(a.ya&65535)+" off="+ha(a.fb):"base="+h(a.ya,d.Gf)+" limit="+h(a.fb,a.fb&-65536?8:4))+" type="+k(a.type>>8)+" ("+c+") ext="+ha(a.Jh&-65296)+" dpl="+k(a.zc))}}else d.R("no selector")});gi(this,8,function(a){a:{if(a){var b=gm(d,a);if(void 0===b){d.R("invalid task selector: "+a);break a}a=hm(d,
            b)}else a=d.O.bb;d.R("dumpTSS("+ha(a?a.ia:b)+"): %"+h(a?a.ya:null,d.Gf));if(a){var b="",c;for(c in im){var p=im[c],w=8>c.length?" ":"",v=a.ya+p,v=hf(d.O,v)|hf(d.O,v+1)<<8;b&&(b+="\n");b+=ha(p)+" "+c+": "+w+ha(v)}d.R(b)}}});gi(this,134217728,function(a){if(a)for(d.R("dumpDOS("+a+")"),a=gm(d,a);a;){var b=Pl(d,0,a),c=d.Ra(b,1),p=d.ra(b,2),w=d.ra(b,5);if(77!=c&&90!=c)break;d.R(ih(0,a)+": '"+String.fromCharCode(c)+"' PID="+ha(p)+" LEN="+ha(w)+' "'+jm(d,b)+'"');a+=1+w}else d.R("no MCB")});pb(this)};
            f.Lb=function(a,b,c){var d=this;switch(b){case "debugInput":return this.Fh=this.va[b]=c,c.onkeydown=function(a){var b;if(13==a.keyCode){b=c.value;c.value="";var l=km(d,b,!0),p;for(p in l)Tl(d,l[p])}else 27==a.keyCode?c.value=b="":(38==a.keyCode?d.rd<d.fd.length-1&&(b=d.fd[++d.rd]):40==a.keyCode&&(0<d.rd?b=d.fd[--d.rd]:(b="",d.rd=-1)),null!=b&&(l=b.length,c.value=b,c.setSelectionRange(l,l)));null!=b&&a.preventDefault&&a.preventDefault()},!0;case "debugEnter":return this.va[b]=c,La(c,function(){if(d.Fh){var a=
            d.Fh.value;d.Fh.value="";var a=km(d,a,!0),b;for(b in a)Tl(d,a[b]);return!0}return!1}),!0;case "step":return this.va[b]=c,La(c,function(a){var b=!1;ob(d,!0)||(nb(d,!0),b=d.ih(a?1:0),nb(d,!1));return b}),!0}return!1};f.dd=function(){this.Fh&&this.Fh.focus()};
            function hm(a,b){if(b===Mb(a.O))return a.O.ta;if(b===a.O.ab.ia)return a.O.ab;if(b===a.O.Na.ia)return a.O.Na;if(b===a.O.ua.ia)return a.O.ua;if(80386<=a.O.la){if(b===a.O.Cc.ia)return a.O.Cc;if(b===a.O.Dc.ia)return a.O.Dc}if(a.tl)return null;var c=new qd(a.O,7,"DBG");c.load(b,!0);return c}f.Zb=function(a,b,c){var d=a.Ba;if(null==d){var d=n,e=hm(this,a.ia);e&&(d=b?e.nc(a.za,c||1,!0):e.yc(a.za,c||1,!0),a.Ba=d)}return d};
            f.Ra=function(a,b){var c=255,d=this.Zb(a,!1,1);d!==n&&(c=hf(this.O,d)|0,b&&lm(this,a,b));return c};f.pc=function(a,b){return a.$c?this.de(a,b?4:0):this.ra(a,b?2:0)};f.ra=function(a,b){var c=65535,d=this.Zb(a,!1,2);d!==n&&(c=hf(this.O,d)|hf(this.O,d+1)<<8,b&&lm(this,a,b));return c};f.de=function(a,b){var c=-1,d=this.Zb(a,!1,4);d!==n&&(c=hf(this.O,d)|hf(this.O,d+1)<<8|hf(this.O,d+2)<<16|hf(this.O,d+3)<<24,b&&lm(this,a,b));return c};
            f.cd=function(a,b,c){var d=this.Zb(a,!0,1);d!==n&&(this.O.cd(d,b),c&&lm(this,a,c),Zc(this.O))};f.Ib=function(a,b,c){var d=this.Zb(a,!0,2);d!==n&&(this.O.Ib(d,b),c&&lm(this,a,c),Zc(this.O))};function Pl(a,b,c,d,e,g){void 0===e&&(e=a.O&&4==a.O.ta.pa);void 0===g&&(g=a.O&&4==a.O.ta.Gd);return{za:b||0,ia:c,Ba:d,Dg:!1,$c:e||!1,Yc:g||!1}}function mm(a){return[a.za,a.ia,a.Ba,a.Dg,a.$c,a.Yc,a.il,a.ue]}function nm(a){return{za:a[0],ia:a[1],Ba:a[2],Dg:a[3],$c:a[4],Yc:a[5],il:a[6],ue:a[7]}}
            function om(a,b){if(null!=b.ia){var c=hm(a,b.ia);if(!c||b.za>c.fb)b.za=0,b.Ba=null}}function lm(a,b,c){c=c||1;null!=b.Ba&&(b.Ba+=c);null!=b.ia&&(b.za+=c,om(a,b))}function ih(a,b,c){return null!=b?h(b,4)+":"+h(a,a&-65536||c?8:4):h(a)}function pm(a){return null==a.ia?"%"+h(a.Ba):ih(a.za,a.ia,a.Yc)}function jm(a,b){var c,d="";for(c=8;d.length<c;){var e=a.Ra(b,1);if(!e)break;d+=32<=e&&128>e?String.fromCharCode(e):"."}return d}
            var im={PREV_TSS:0,CPL0_SP:2,CPL0_SS:4,CPL1_SP:6,CPL1_SS:8,CPL2_SP:10,CPL2_SS:12,TASK_IP:14,TASK_PS:16,TASK_AX:18,TASK_CX:20,TASK_DX:22,TASK_BX:24,TASK_SP:26,TASK_BP:28,TASK_SI:30,TASK_DI:32,TASK_ES:34,TASK_CS:36,TASK_SS:38,TASK_DS:40,TASK_LDT:42};
            function qm(a,b){var c="",d=10,e=a.Ig,g=a.Te;if(g.length){var l=void 0===b?a.to:+b;isNaN(l)?l=d:c="more ";l>g.length&&(a.R("note: only "+g.length+" available"),l=g.length);e-=l;0>e&&(null!=g[g.length-1][1]?e+=g.length:(l=e+l,e=0));for(void 0!==b&&a.R(l+" instructions earlier:");d&&e!=a.Ig;){var p=g[e++];if(null==p.ia)break;p=Pl(a,p.za,p.ia,p.Ba);a.R(rm(a,p,"history",l--));p.il&&(e++,l--);e>=g.length&&(e=0);a.to=l;d--}}10==d&&(a.R("no "+c+"history available"),a.to=void 0)}
            function Sl(a,b){a.Y=a;a.Xb=a.$o=1073741824;a.sk=null;a.Ik=[];var c=km(a,b.replace("keys","key").replace("kbd","keyboard"));if(c.length)for(var d in $l)0<=ya(c,d)&&(a.Xb|=$l[d],a.R(d+" messages enabled"))}function gi(a,b,c){for(var d in $l)if(b==$l[d]){a.Ik[d]=c;break}}
            function sm(a,b){var c="??";if(0<=b){var d,e,g=a.O;switch(b){case 0:d=g.F;e=2;break;case 1:d=g.G;e=2;break;case 2:d=g.H;e=2;break;case 3:d=g.D;e=2;break;case 4:d=g.F>>8;e=2;break;case 5:d=g.G>>8;e=2;break;case 6:d=g.H>>8;e=2;break;case 7:d=g.D>>8;e=2;break;case 8:d=g.F;e=4;break;case 9:d=g.G;e=4;break;case 10:d=g.H;e=4;break;case 11:d=g.D;e=4;break;case 12:d=r(g);e=4;break;case 13:d=g.L;e=4;break;case 14:d=g.K;e=4;break;case 15:d=g.J;e=4;break;case 22:d=q(g);e=a.tg;break;case 23:d=Nb(g);e=a.tg;break;
            case 16:d=g.Na.ia;e=4;break;case 17:d=Mb(g);e=4;break;case 18:d=g.ua.ia;e=4;break;case 19:d=g.ab.ia,e=4}if(!e)if(80286==a.O.la)32==b&&(d=g.ob,e=4);else if(80386<=a.O.la)switch(b){case 24:d=g.F;e=8;break;case 25:d=g.G;e=8;break;case 26:d=g.H;e=8;break;case 27:d=g.D;e=8;break;case 28:d=r(g);e=8;break;case 29:d=g.L;e=8;break;case 30:d=g.K;e=8;break;case 31:d=g.J;e=8;break;case 32:d=g.ob;e=8;break;case 33:d=g.hi;e=8;break;case 34:d=g.Vf;e=8;break;case 35:d=g.Wf;e=8;break;case 20:d=g.Cc.ia;e=4;break;case 21:d=
            g.Dc.ia,e=4}e&&(c=h(d,e))}return c}f=Ol.prototype;f.message=function(a,b){b&&(a+=" @"+ih(q(this.O),Mb(this.O)));if(!this.sk||a!=this.sk)if(this.R(a),this.sk=a,this.O){this.Xb&-2147483648&&this.yb();var c=this.O;c.T.Og=0;c.td-=c.A;c.A=0;Zc(c)}};
            function De(a,b,c){var d,e=!1,g=Ul[b];g&&(d=a.O.F>>8,e=a.qa(g)?!0:524288==g&&a.qa(g=1048576));if(e){var l=a.O.H&255;if(33==b&&11==d||524288==g&&128<=l||1048576==g&&128>l)e=!1}if(e){if(g=(g=fm[b])&&g[d]||""){for(var p=g,g=0;g<Yl.length;g++)if(l=Yl[g],0<=p.indexOf(l)){var w=sm(a,g),v={};v[l]=w;p=ma(v,p)}g=" "+p}a.message("INT "+k(b)+": AH="+k(d)+" @"+ih(c-2-a.O.ta.ya,Mb(a.O))+g)}return e}
            function Fe(a,b,c,d,e){a.message("INT "+k(b)+": C="+(Qe(a.O)?1:0)+(e||"")+" (cycles="+d+(c?",level="+(c+1):"")+")")}function mb(a,b,c,d,e,g,l,p){p|=256;if(null==e||(a.Xb&p)==p)p=null,null!=e&&(p=Mb(a.O),e-=a.O.ta.ya),a.message(b.Jg+"."+(null!=d?"outPort":"inPort")+"("+ha(c)+","+(g?g:"unknown")+(null!=d?","+k(d):"")+")"+(null!=l?": "+k(l):"")+(null!=e?" @"+ih(e,p):""))}
            f.Dq=function(){this.R("Type ? for list of debugger commands");this.yd();if(this.Rm){var a=km(this,this.Rm);delete this.Rm;for(var b in a)Tl(this,a[b])}};function Rl(a){var b;if(qf(a)){if(!a.Te||!a.Te.length){a.Te=Array(1E4);for(b=0;b<a.Te.length;b++)a.Te[b]=Pl(a);a.Ig=0}if(!a.Cd||!a.Cd.length)for(a.Cd=Array(256),b=0;b<a.Cd.length;b++)a.Cd[b]=[b,0]}else a.Ig=0,a.Te=[],a.Cd=[]}f.Zf=function(a){if(!tm(this))return!1;this.O.Zf(a);return!0};
            f.ih=function(a,b,c){if(!tm(this))return!1;this.Md=0;do{a||qf(this)&&uf(this,this.O.sa,0);try{var d=this.O.ih(a);0<d&&(this.Md+=d,id(this.O,d,!0),bd(this.O,d),this.yh++)}catch(e){this.Md=0,sb(this.O,e.stack||e.message)}}while(this.O.S&12528);!1!==c&&Zc(this.O);this.yd(b||!1,!1);return 0<this.Md};f.yb=function(a){this.O&&this.O.yb(a)};f.yd=function(a,b){void 0===a&&(a=!0);void 0===b&&(b=!0);this.nd=Pl(this,q(this.O),Mb(this.O));a&&1!=this.Hc?um(this,null,b):vm(this)};
            function tm(a){var b;if(b=a.O&&qb(a.O))b=a.O,b.fa.hc?b=!0:(b.R(b.toString()+" not powered"),b=!1);b&&!ob(a.O)?(a=a.O,a.fa.Kd?(a.R(a.toString()+" error"),a=!0):a=!1,a=!a):a=!1;return a}f.kc=function(a,b){return!b&&(this.reset(!0),a&&this.restore&&!this.restore(a))?!1:!0};f.jc=function(a,b){b&&this.R(a?"suspending":"shutting down");return a&&this.save?this.save():!0};
            f.reset=function(a){Rl(this);this.yh=0;this.sk=null;this.Md=0;this.nd=Pl(this,q(this.O),Mb(this.O));void 0===this.fa.qb||a||this.R("reset");this.fa.qb=!1;wm(this);a||this.yd()};f.save=function(){var a=new Ie(this);a.set(0,mm(this.nd));a.set(1,mm(this.Lf));a.set(2,[this.fd,this.xg,this.Xb]);return a.data()};f.restore=function(a){var b=0;void 0!==a[2]&&(this.nd=nm(a[b++]),this.Lf=nm(a[b++]),this.fd=a[b][0],"string"==typeof this.fd&&(this.fd=[this.fd]),this.xg=a[b][1],this.Xb||(this.Xb=a[b][2]));return!0};
            f.start=function(a,b){this.Hc||this.R("running");this.fa.qb=!0;this.Qq=a;this.Nd=b};f.stop=function(a,b){if(this.fa.qb){this.fa.qb=!1;this.Md=b-this.Nd;if(!this.Hc){var c="stopped";if(this.Md){var d=a-this.Qq,e=0<d?Math.round(1E3*this.Md/d):0,c=c+" (";qf(this)&&(c+=this.yh+" ops, ",this.yh=0);c+=this.Md+" cycles, "+d+" ms, "+e+" hz)"}this.R(c)}this.yd(!0,2!=this.Hc);this.dd();wm(this,this.O.sa)}};function qf(a){return 1<a.Mc.length||a.qa(16)}
            function uf(a,b,c){if(0<c&&(xm(a,b,a.Mc)||3==a.O.ta.Qa&&!(a.O.aa&Qb)))return!0;0<=c&&a.Cd.length&&(a.yh++,c=hf(a.O,b),null!=c&&(a.Cd[c][1]++,c=a.Te[a.Ig],c.za=q(a.O),c.ia=Mb(a.O),c.Ba=b,++a.Ig==a.Te.length&&(a.Ig=0)));return!1}function Pc(a,b){return xm(a,b,a.Oe)?(a.yb(!0),!0):!1}function Qc(a,b){return xm(a,b,a.Ad)?(a.yb(!0),!0):!1}function qc(a,b,c){a.R("break on input from port "+ha(b)+": "+k(c));a.yb(!0)}function uc(a,b,c){a.R("break on output to port "+ha(b)+": "+k(c));a.yb(!0)}
            function Ql(a){var b;a.Mc=["exec"];if(void 0!==a.Oe)for(b=1;b<a.Oe.length;b++){var c=a.ma,d=a.Zb(a.Oe[b]);Sc(c.na[d>>>c.Ca],!1)}a.Oe=["read"];if(void 0!==a.Ad)for(b=1;b<a.Ad.length;b++)c=a.ma,d=a.Zb(a.Ad[b]),Sc(c.na[d>>>c.Ca],!0);a.Ad=["write"];a.tl=0}f.Ue=function(a,b,c){if(!ym(this,a,b)){b.Dg=c;a.push(b);if(a!=this.Mc){var d=this.ma,e=this.Zb(b);d.na[e>>>d.Ca].Ue(e&d.Ga,a==this.Ad)}c?b.ia=null:this.R("breakpoint enabled: "+pm(b)+" ("+a[0]+")");Rl(this);return!0}return!1};
            function ym(a,b,c,d){var e=!1;c=zm(a,a.Zb(c));for(var g=1;g<b.length;g++){var l=b[g];if(c==zm(a,a.Zb(l))){e=!0;if(d){b.splice(g,1);b!=a.Mc&&(d=a.ma,Sc(d.na[c>>>d.Ca],b==a.Ad));l.Dg||a.R("breakpoint cleared: "+pm(l)+" ("+b[0]+")");Rl(a);break}a.R("breakpoint exists: "+pm(l)+" ("+b[0]+")");break}}return e}function Am(a,b){for(var c=1;c<b.length;c++)a.R("breakpoint enabled: "+pm(b[c])+" ("+b[0]+")");return b.length-1}
            function Vc(a,b,c,d){if(void 0===d)Vc(a,b,c,a.Oe),Vc(a,b,c,a.Ad);else for(var e=1;e<d.length;e++){var g=a.Zb(d[e]);if(g>=b&&g<b+c){var l=a.ma;l.na[g>>>l.Ca].Ue(g&l.Ga,d==a.Ad)}}}function wm(a,b){if(void 0!==b)xm(a,b,a.Mc,!0),a.Hc=0;else for(var c=1;c<a.Mc.length;c++){var d=a.Mc[c];if(d.Dg){if(!ym(a,a.Mc,d,!0))break;c=0}}}function zm(a,b){var c=a.eo&-65536;(b&c)==c&&(b&=1048575);return b}
            function xm(a,b,c,d){var e=!1;if(!a.tl++){b=zm(a,b);for(var g=1;g<c.length;g++){var l=c[g];null!=l.ia&&(l.Ba=null);if(b==zm(a,a.Zb(l))){l.Dg?ym(a,c,l,!0):d||a.R("breakpoint hit: "+pm(l)+" ("+c[0]+")");e=!0;break}}}a.tl--;return e}
            function rm(a,b,c,d){for(var e=Pl(a,b.za,b.ia,b.Ba),g=a.Ra(b,1),l=2;(102==g||103==g)&&l--;)102==g?b.$c=!b.$c:b.Yc=!b.Yc,g=a.Ra(b,1);var l=a.rh[g],p=l[0],w=-1;205==p&&(p=a.Ra(b,1),l=dm[p]||am,g|=p<<8,p=l[0]);p>=Wl.length&&(w=a.Ra(b,1),l=em[p-Wl.length][w>>3&7]);var p=Wl[l[0]],v=l.length-1,E="";if(164<=g&&167>=g||170<=g&&175>=g)v=0,b.$c&&"W"==p.slice(-1)&&(p=p.slice(0,-1)+"D");for(var g=null,O=!0,J=1;J<=v;J++){var G,S;G="";S=l[J];if(void 0!==S){null==g&&(g=S>>14);var X=S&15;if(0!=X)if(15==X)O=!1;else{var T=
            S&240;if(128<=T)if(0>w&&(w=a.Ra(b,1)),160<=T)G=Bm(a,w>>3&7,S,b);else{G=a;var X=b,aa="",T=w>>6,Ba=w&7;if(3>T){var pa=void 0;if(!T&&(!X.Yc&&6==Ba||X.Yc&&5==Ba))T=2;else{if(X.Yc)if(4!=Ba)Ba+=8;else{var aa=T,Ra=G.Ra(X,1),pa=Ra>>6,Eb=Ra>>3&7,Ra=Ra&7,Ua="";if(aa||5!=Ra)Ua=Zl[Ra+8];4!=Eb&&(Ua&&(Ua+="+"),Ua+=Zl[Eb+8],pa&&(Ua+="*"+(1<<pa)));aa=Ua}aa||(aa=Zl[Ba])}1==T?(pa=G.Ra(X,1),pa&128?(pa=pa<<24>>24,aa+="-"+h(-pa,2)):aa+="+"+h(pa,2)):2==T&&(aa&&(aa+="+"),X.Yc?(pa=G.de(X,4),aa+=h(pa)):(pa=G.ra(X,2),aa+=
            h(pa,4)));aa="["+aa+"]";7==(S&15)&&(aa="FAR "+aa)}else aa=Bm(G,Ba,S,X);G=aa}else if(16==T)G="1";else if(0==T){G=a;X=b;T=" ";switch(S&15){case 1:S&12288&&(T=h(G.Ra(X,1),2));break;case 2:T=h(G.Ra(X,1)<<24>>24,4);break;case 4:case 8:if(X.$c){T=h(G.de(X,4));break}case 3:T=h(G.ra(X,2),4);break;case 7:T=pm(Pl(G,G.pc(X,!0),G.ra(X,2),null,X.$c,X.Yc));break;default:T="imm("+ha(S)+")"}G=T}else 32==T?(b.Yc?(S=8,G=a.de(b,4)):(S=4,G=a.ra(b,2)),G="["+h(G,S)+"]"):48==T?(G=1==X?a.Ra(b,1)<<24>>24:a.pc(b,!0),G=b.za+
            G&(b.$c?-1:65535),G=Cm(a,Pl(a,G,b.ia))[0]||h(G,b.$c?8:4)):96==T?G=Bm(a,(S&3840)>>8,S,b):112==T?G=Bm(a,(S&3840)>>8,176,b):64==T?G="DS:[SI]":80==T&&(G="ES:[DI]");if(!G||!G.length){E="INVALID";break}0<E.length&&(E+=",");E+=G}}}l=pm(e)+" ";w="";do w+=h(a.Ra(e,1),2);while(e.Ba!=b.Ba);l+=na(w,16);l+=na(p,8);E&&(l+=" "+E);a.O.la<Xl[g]&&(c=Xl[g]+" CPU only");c&&O&&(l=na(l,56)+";"+c,l=a.O.fa.yg?l+("cycles="+cd(a.O).toString()+" cs="+h(a.O.T.Uh)):l+(null!=d?"="+d.toString():""));Dm(a,b,O);return l}
            function Bm(a,b,c,d){var e=c&240;if(176==e){if(5<b||4<=b&&80386>a.O.la)return"??";b+=16}else if(208==e)b+=32;else if(a=c&15,3<=a&&(8>b&&(b+=8),5==a||4==a&&d.$c))b+=16;return Yl[b]}function Em(a,b){var c;switch(b){case "V":c=Ve(a.O);break;case "D":c=a.O.aa&Pb;break;case "I":c=a.O.aa&Qb;break;case "T":c=a.O.aa&Rb;break;case "S":c=Ue(a.O);break;case "Z":c=Te(a.O);break;case "A":c=Se(a.O);break;case "P":c=Re(a.O);break;case "C":c=Qe(a.O);break;default:c=0}return b+(c?"1":"0")+" "}
            function Fm(a,b){8<=b&&15>=b&&4<a.tg&&(b+=16);var c=Yl[b];32==b&&80286==a.O.la&&(c="MS");return c+"="+sm(a,b)+" "}function Gm(a,b,c){return b.ni+"="+h(b.ia,4)+(c?"["+h(b.ya,a.Gf)+","+h(b.fb,b.fb&-65536?8:4)+"]":"")}function Hm(a,b,c,d,e){return b+"="+(null!=c?h(c,4):"")+"["+h(d,a.Gf)+","+h(e-d,4)+"]"}
            function Im(a,b){var c;void 0===b&&(b=!!(a.O.ob&1));c=Fm(a,8)+Fm(a,11)+Fm(a,9)+Fm(a,10)+(4<a.tg?"\n":"")+Fm(a,12)+Fm(a,13)+Fm(a,14)+Fm(a,15)+"\n"+Gm(a,a.O.ua,b)+" "+Gm(a,a.O.ab,b)+" "+Gm(a,a.O.Na,b)+" ";if(b){var d="TR="+h(a.O.bb.ia,4),e=a.ma,e="A20="+(e.jg||e.Th!=e.Cb?"OFF ":"ON ");80386>a.O.la&&(d="\n"+d,c+=e,e="");c+="\n"+Gm(a,a.O.ta,b)+" ";80386<=a.O.la&&(e+="\n",c+=Gm(a,a.O.Cc,b)+" "+Gm(a,a.O.Dc,b)+"\n");c+=Hm(a,"LD",a.O.xd.ia,a.O.xd.ya,a.O.xd.ya+a.O.xd.fb)+" "+Hm(a,"GD",null,a.O.Ed,a.O.zf)+
            " "+Hm(a,"ID",null,a.O.Fd,a.O.Af)+" ";c=c+(d+" "+e)+Fm(a,32);80386<=a.O.la&&(c+=Fm(a,34)+Fm(a,35))}else 80386<=a.O.la&&(c+=Gm(a,a.O.Cc,b)+" "+Gm(a,a.O.Dc,b)+" ");return c+=Fm(a,23)+Em(a,"V")+Em(a,"D")+Em(a,"I")+Em(a,"T")+Em(a,"S")+Em(a,"Z")+Em(a,"A")+Em(a,"P")+Em(a,"C")}
            function Jm(a,b,c){var d;d=2==c?a.Gn:a.nd;c=d.za;var e=d.ia;d=d.Ba;if(void 0!==b){"%"==b.charAt(0)&&(b=b.substr(1),c=0,e=null);var g=b;d=null;if(g.match(/^[a-z_][a-z0-9_]*$/i)){d={};for(var l=g.toUpperCase(),p=0;p<a.Rc.length;p++){var g=a.Rc[p][0],w=a.Rc[p][2][l];if(void 0!==w){l=w.o;void 0!==l&&(p=w.s,void 0===p&&(p=g>>>4),d.za=l,d.ia=p,void 0!==w.p&&(d.Ba=w.p));break}}}if(d&&null!=d.za)return d;d=b.indexOf(":");0>d?null!=e?(c=gm(a,b),d=null):d=gm(a,b):(e=gm(a,b.substring(0,d)),c=gm(a,b.substring(d+
            1)),d=null)}d=Pl(a,c,e,d);om(a,d);return d}function gm(a,b,c){var d;void 0!==b?(d=ya(Yl,b.toUpperCase()),0<=d&&(b=sm(a,d)),d=ga(b),void 0===d&&a.R("invalid "+(c?c:"value")+": "+b)):a.R("missing "+(c||"value"));return d}
            function mj(a,b,c,d){function e(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0}var g={},l=[],p;for(p in d){var w=d[p];"number"==typeof w&&(d[p]=w={o:w});var v=w.o,E=w.s,O=w.a;void 0!==v&&(void 0!==E&&(g.za=v,g.ia=E,g.Ba=null,a.Zb(g),(g.Ba&-65536)==(a.ma.Th&-65536)&&(g.Ba&=1048575),w.p=g.Ba),ra(l,[v,p],e));O&&(w.a=O.replace(/''/g,'"'))}a.Rc.push([b,c,d,l])}
            function Cm(a,b,c){for(var d=[],e=a.Zb(b),g=0;g<a.Rc.length;g++){var l=a.Rc[g][0],p=a.Rc[g][1];if(e>=l&&e<l+p){b=qa(a.Rc[g][3],[b.za],function(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0});0<=b?Km(a,g,b,d):c&&(b=~b,Km(a,g,b-1,d),Km(a,g,b,d));break}}return d}function Km(a,b,c,d){var e={},g=a.Rc[b][3],l=0,p=null;0<=c&&c<g.length&&(l=g[c][0],p=g[c][1]);p&&(e=a.Rc[b][2][p],p="."==p.charAt(0)?null:e.l||p);d.push(p);d.push(l);d.push(e.a);d.push(e.c)}
            function Lm(a,b){if("?"==b)a.R("\nfrequency commands:"),a.R("\tclear\tclear all frequency counts");else{var c,d=0;if(a.Cd)if("clear"==b){for(c=0;c<a.Cd.length;c++)a.Cd[c]=[c,0];a.R("frequency data cleared");d++}else if(void 0!==b)a.R("unknown frequency command: "+b),d++;else{var e=a.Cd.slice();e.sort(function(a,b){return b[1]-a[1]});for(c=0;c<e.length;c++){var g=e[c][0],l=e[c][1];l&&(a.R((Wl[a.rh[g][0]]+"  ").substr(0,5)+" ("+k(g)+"): "+l+" times"),d++)}}d||a.R("no frequency data available")}}
            function Mm(a,b){var c=Jm(a,b,1);if(null!=c.za||null!=c.Ba){var d=a.Zb(c);a.R((b?b+": ":"")+pm(c)+" (%"+h(d,a.Gf)+")");d=Cm(a,c,!0);if(d.length){var e,g;d[0]&&(g="",(e=c.za-d[1])&&(g=" + "+ha(e)),a.R(d[0]+" ("+ih(d[1],c.ia)+")"+g));4<d.length&&d[4]&&(g="",(e=d[5]-c.za)&&(g=" - "+ha(e)),a.R(d[4]+" ("+ih(d[5],c.ia)+")"+g))}else a.R("no symbols")}}
            function Nm(a,b){if("l"==b[0]&&void 0===b[1]||"?"==b[1])a.R("\nlist/load commands:"),a.R("\tl [address] [drive #] [sector #] [# sectors]"),a.R("\tln [address] lists symbol(s) nearest to address");else if("ln"==b[0])Mm(a,b[1]);else{var c="json"==b[1],d,e=0,g=0,l=c?{}:Jm(a,b[1],2);d=gm(a,b[2],"drive #");if(void 0!==d){if(!c){e=gm(a,b[3],"sector #");if(void 0===e)return;g=gm(a,b[4],"# of sectors");void 0===g&&(g=1)}var p=a.Ap;2<=d&&a.Xn&&(d-=2,p=a.Xn);if(p){var w=p.En(d);if(w)if(w.xa)if(c)a.R(w.xa.toJSON());
            else if(p.Mo(w,e,g)){for(var v=0,E=!1,c=pm(l);!E&&0<w.mb--;)(function(a,b){p.sc(w,function(c){0>c?(a.R("out of data at address "+pm(b)),E=!0):(a.cd(b,c,1),v++)})})(a,l);a.R(v+" bytes read at "+c)}else a.R("sector "+e+" request out of range");else a.R("drive "+d+" not loaded");else a.R("invalid drive: "+d)}else a.R("disk controller not present")}}}
            function um(a,b,c){if(b&&"?"==b[1])a.R("\nregister commands:"),a.R("\tr\t\tdisplay all registers"),a.R("\tr [target=#]\tmodify target register"),a.R("supported targets:"),a.R("\tall registers and flags V,D,I,S,Z,A,P,C");else{var d;if(null!=b&&1<b.length){var e=b[1];if("p"==e)d=80286<=a.O.la;else{c=null;var g=e.indexOf("=");if(0<g)c=e.substr(g+1),e=e.substr(0,g);else if(2<b.length)c=b[2];else{a.R("missing value for "+b[1]);return}b=!1;g=ga(c,16);if(!isNaN(g)){b=!0;var l=e.toUpperCase();"E"==l.charAt(0)&&
            4>=a.tg&&(l=null);switch(l){case "AL":a.O.F=a.O.F&-256|g&255;break;case "AH":a.O.F=a.O.F&-65281|g<<8&255;break;case "AX":a.O.F=a.O.F&-65536|g&65535;break;case "BL":a.O.D=a.O.D&-256|g&255;break;case "BH":a.O.D=a.O.D&-65281|g<<8&255;break;case "BX":a.O.D=a.O.D&-65536|g&65535;break;case "CL":a.O.G=a.O.G&-256|g&255;break;case "CH":a.O.G=a.O.G&-65281|g<<8&255;break;case "CX":a.O.G=a.O.G&-65536|g&65535;break;case "DL":a.O.H=a.O.H&-256|g&255;break;case "DH":a.O.H=a.O.H&-65281|g<<8&255;break;case "DX":a.O.H=
            a.O.H&-65536|g&65535;break;case "SP":u(a.O,r(a.O)&-65536|g&65535);break;case "BP":a.O.L=a.O.L&-65536|g&65535;break;case "SI":a.O.K=a.O.K&-65536|g&65535;break;case "DI":a.O.J=a.O.J&-65536|g&65535;break;case "DS":Le(a.O,g);break;case "ES":Me(a.O,g);break;case "SS":wd(a.O,g);break;case "CS":Ke(a.O,g);a.nd=Pl(a,q(a.O),Mb(a.O));break;case "IP":D(a.O,g);a.nd=Pl(a,q(a.O),Mb(a.O));break;case "PC":case "PS":Ad(a.O,g);break;case "C":g?Xe(a.O):Ye(a.O);break;case "P":g?(e=a.O,e.resultType&=-3,e.aa|=Vb):(e=a.O,
            e.resultType&=-3,e.aa&=~Vb);break;case "A":g?ef(a.O):cf(a.O);break;case "Z":g?ff(a.O):df(a.O);break;case "S":g?(e=a.O,e.resultType&=-17,e.aa|=Sb):(e=a.O,e.resultType&=-17,e.aa&=~Sb);break;case "I":g?(e=a.O,e.aa|=Qb):(e=a.O,e.aa&=~Qb);break;case "D":g?(e=a.O,e.aa|=Pb):(e=a.O,e.aa&=~Pb);break;case "V":g?Ze(a.O):$e(a.O);break;default:var p=!0;if(80286<=a.O.la)switch(p=!1,l){case "MS":gf(a.O,g);break;case "TR":a.O.bb.load(g,!0)===n&&(b=!1);break;default:if(p=!0,80386<=a.O.la)switch(p=!1,l){case "EAX":a.O.F=
            g;break;case "EBX":a.O.D=g;break;case "ECX":a.O.G=g;break;case "EDX":a.O.H=g;break;case "ESP":u(a.O,g);break;case "EBP":a.O.L=g;break;case "ESI":a.O.K=g;break;case "EDI":a.O.J=g;break;case "FS":a.O.Cc.load(g);break;case "GS":a.O.Dc.load(g);break;case "CR0":a.O.ob=g;break;case "CR2":a.O.Vf=g;break;case "CR3":a.O.Wf=g;break;default:p=!0}}if(p){a.R("unknown register: "+e);return}}}if(!b){a.R("invalid value: "+c);return}Zc(a.O);a.R("\nupdated registers:");c=!0}}a.R((c?"":"\n")+Im(a,d));a.nd=Pl(a,q(a.O),
            Mb(a.O));vm(a,pm(a.nd))}}function Om(a,b,c){for(var d=null,e=b.za,g=e,l=1;6>=l;l++){if(2<l){b.za=e;b.Ba=null;var p=rm(a,b);if(0<p.indexOf("CALL")||c&&0<p.indexOf("INT")){d=p;break}}if(!--e)break}b.za=g;return d}function Pm(a,b,c){var d="tr"==b;b=null!=c?+c:1;var e=1==b?0:1;Ka(b,function(){return nb(a,!0)&&a.ih(e,d,!1)},function(){Zc(a.O);nb(a,!1)})}function Dm(a,b,c){b.il=b.$c||b.Yc;c&&(b.$c=4==a.O.ta.pa,b.Yc=4==a.O.ta.Gd);b.ue=c}
            function vm(a,b,c,d){b=Jm(a,b,1);if(null!=b.za){void 0===d&&(d=1);var e=Pl(a,a.fo,b.ia,a.ma.Th),e=256;if(void 0!==c){e=Jm(a,c,1);if(null==e.za||e.za<b.za)return;e=e.za-b.za;if(256<e){a.R("range too large");return}d=-1}var g=b.za!=a.nd.za;c=0;for(Dm(a,b,!0);0<e&&d--;){a.Ra(b);var l=b.Ba,p=ob(a,!1)||a.Hc?a.Md:null,w=null!=p?"cycles":null,v=Cm(a,b);if(v[0]){var E=v[0]+":",g=!1;v[2]&&(E+=" "+v[2]);a.R(E)}g&&a.R();v[3]&&(w=v[3],p=null);g=rm(a,b,w,p);b.ue||d||d++;a.R(g);a.nd=b;e-=b.Ba-l;g=!1;c++}}}
            function km(a,b,c){if(c)if(b){0>a.rd&&a.fd.length&&(a.rd=0);if(0>a.rd||b!=a.fd[a.rd])a.fd.splice(0,0,b),a.rd=0;a.rd--}else b=a.fd[a.rd+1];a=b?b.split(0<=b.indexOf("|")?"|":";"):[""];for(var d in a)a[d]=oa(a[d]);return a}
            function Tl(a,b){var c=!0;try{if(b.length||(a.xg?(a.R("ended assemble @"+pm(a.Lf)),a.nd=a.Lf,a.xg=!1):b="?"),b=b.toLowerCase(),qb(a)&&0<b.length){if(a.xg)b="a "+pm(a.Lf)+" "+b;else{var d,e,g;switch(b){case "reset":return a.Fa&&a.Fa.reset(),!0;case "ver":return a.R("PCjs version 1.18.2 ("+a.O.la+",RELEASE,NOPREFETCH"+(tb?",TYPEDARRAYS":",LONGARRAYS")+",NOBACKTRACK)"),!0;default:for(e=b.charAt(0),g=1;g<b.length;g++){d=b.charAt(g);if(" "==d)break;if("r"==e||"a">d||"z"<d){b=b.substring(0,g)+" "+b.substring(g);
            break}}}}var l=b.split(" ");switch(l[0].charAt(0)){case "a":var p=Jm(a,l[1],1);if(null!=p.za)if(a.Lf=p,void 0===l[2])a.R("begin assemble @"+pm(p)),a.xg=!0,Zc(a.O);else{var w;a.R("not supported yet");w=[];if(w.length){for(var v=0;v<w.length;v++)a.cd(p,w[v],1);a.R(rm(a,a.Lf))}}break;case "b":a:{var E=l[1],O=l[0].charAt(1);if(O&&"?"!=O)if("l"==O)v=0,v+=Am(a,a.Mc),v+=Am(a,a.Oe),(v+=Am(a,a.Ad))||a.R("no breakpoints");else if(void 0===E)a.R("missing breakpoint address");else{v={};if("*"!=E&&(v=Jm(a,E,1),
            null==v.za))break a;E=null==v.za?E:ha(v.za);"c"==O?null==v.za?(Ql(a),a.R("all breakpoints cleared")):ym(a,a.Mc,v,!0)||ym(a,a.Oe,v,!0)||ym(a,a.Ad,v,!0)||a.R("breakpoint missing: "+pm(v)):"i"==O?a.R("breakpoint "+(nc(a.ma,v.za)?"enabled":"cleared")+": port "+E+" (input)"):"o"==O?a.R("breakpoint "+(rc(a.ma,v.za)?"enabled":"cleared")+": port "+E+" (output)"):null!=v.za&&("p"==O?a.Ue(a.Mc,v):"r"==O?a.Ue(a.Oe,v):"w"==O?a.Ue(a.Ad,v):a.R("unknown breakpoint command: "+O))}else a.R("\nbreakpoint commands:"),
            a.R("\tbi [p]\ttoggle break on input port [p]"),a.R("\tbo [p]\ttoggle break on output port [p]"),a.R("\tbp [a]\tset exec breakpoint at addr [a]"),a.R("\tbr [a]\tset read breakpoint at addr [a]"),a.R("\tbw [a]\tset write breakpoint at addr [a]"),a.R("\tbc [a]\tclear breakpoint at addr [a]"),a.R("\tbl\tlist all breakpoints")}break;case "c":a.Gh&&(a.Gh.value="");break;case "d":a:{var J=l[0],v=l[1],G=l[2],S;if("?"==v){v="";for(S in $l)a.Ik[S]&&(v&&(v+=","),v+=S);v+=",state,symbols";a.R("\ndump commands:");
            a.R("\tdb [a] [#]    dump # bytes at address a");a.R("\tdw [a] [#]    dump # words at address a");a.R("\tdd [a] [#]    dump # dwords at address a");a.R("\tdh [#]        dump # instructions prior");v.length&&a.R("dump extensions:\n\t"+v)}else if("state"==v)a.R(Qm(a.Fa,!0));else if("symbols"==v)for(v=0;v<a.Rc.length;v++){var X=a.Rc[v][0],T=a.Rc[v][2],aa;for(aa in T)if("."!=aa.charAt(0)){var Ba=T[aa],pa=Ba.o;if(void 0!==pa){var Ra=Ba.s;void 0===Ra&&(Ra=X>>>4);var Eb=T[aa].l;Eb&&(aa=Eb);a.R(ih(pa,Ra)+
            " "+aa)}}}else if("dh"==J)qm(a,v);else{"ds"==J&&(J="d",G=v,v="desc");for(S in $l)if(v==S){var Ua=a.Ik[S];Ua?Ua(G):a.R("no dump registered for "+v);break a}var ba=Jm(a,v,2);if(null!=ba.za&&(null!=ba.ia||null!=ba.Ba)){var sa="",da=0,rb="dd"==J?4:"dw"==J?2:1,l=16/rb|0;G&&("l"==G.charAt(0)&&(G=G.substr(1)),(da=+G)&&(da=(da+l-1)/l|0));da||(da=8);for(G=0;G<da;G++){for(var Fb=l=0,Ya="",Za="",v=pm(ba),J=0;16>J;J++){var Ga=a.Ra(ba,1),l=l|Ga<<(Fb++<<3);Fb==rb&&(Ya+=h(l,2*rb),Ya+=1==rb?7==J?"-":" ":"  ",l=Fb=
            0);Za+=32<=Ga&&128>Ga?String.fromCharCode(Ga):"."}sa&&(sa+="\n");sa+=v+"  "+Ya+" "+Za}sa&&a.R(sa);a.Gn=ba}}}break;case "e":var zd=l[1];if(void 0===zd)a.R("missing address");else{var ad=Jm(a,zd,2);if(null!=ad.za)for(v=2;v<l.length;v++){var Ic=ga(l[v],16);if(void 0===Ic){a.R("unrecognized value: "+k(Ic));break}a.R("setting "+pm(ad)+" to "+k(Ic));a.cd(ad,Ic,1)}}break;case "f":Lm(a,l[1]);break;case "g":a:{var Cj=l[1];if(void 0!==Cj){var Dj=Jm(a,Cj,1);if(null==Dj.za)break a;a.Ue(a.Mc,Dj,!0)}a.Zf(!0)||
            a.R('cpu not available, "g" command ignored')}break;case "h":var Ej=l[1];a.fa.qb&&void 0===Ej?(a.R("halting"),a.yb()):qm(a,Ej);break;case "i":var hg=l[1];if(hg&&"?"!=hg){var ig=gm(a,hg);if(void 0!==ig){var fn=pc(a.ma,ig);a.R(ha(ig)+": "+k(fn))}}else a.R("\ninput commands:"),a.R("\ti [p]\tread port [p]"),a.R("warning: port accesses can affect hardware state");break;case "k":v=0;Fb=a.O.ta.ia;Ya=Pl(a);Za=Pl(a,r(a.O),a.O.ua.ia);for(a.R("stack trace for "+pm(Za));10>v;){ba=null;for(Ga=256;Za.za>>>0<a.O.ok>>>
            0;){Ya.za=a.pc(Za,!0);if(null==Za.Ba||!Ga--)break;Ya.ia=Fb;if(ba=Om(a,Ya))break;Ya.ia=a.pc(Za);if(ba=Om(a,Ya,!0)){Fb=a.pc(Za,!0);0<ba.indexOf("INT")&&a.pc(Za,!0);break}}if(!ba)break;ba=na(ba,50)+";stack="+pm(Za)+" return="+pm(Ya);a.R(ba);v++}v||a.R("no return addresses found");break;case "l":Nm(a,l);break;case "m":a:{v=null;da=l[1];"?"==da&&(da=void 0);if(void 0!==da){ba=0;if("all"==da)ba=1610481663,da=null;else if("on"==da)v=!0,da=null;else if("off"==da)v=!1,da=null;else{"keys"==da&&(da="key");"kbd"==
            da&&(da="keyboard");for(sa in $l)if(da==sa){ba=$l[sa];v=!!(a.Xb&ba);break}if(!ba){a.R("unknown message category: "+da);break a}}ba&&("on"==l[2]?(a.Xb|=ba,v=!0):"off"==l[2]&&(a.Xb&=~ba,v=!1))}ba=0;Ga="";for(sa in $l)if(!da||da==sa)if(rb=!!(a.Xb&$l[sa]),null===v||v==rb)Ga&&(Ga+=","),++ba%10||(Ga+="\n\t"),"key"==sa&&(sa="keys"),Ga+=sa;void 0===da&&a.R("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");a.R((null!==v?v?"messages on:  ":"messages off: ":"message categories:\n\t")+(Ga||
            "none"))}break;case "o":var jg=l[1],gn=l[2];if(jg&&"?"!=jg){var kg=gm(a,jg,"port #"),lg=gm(a,gn);void 0!==kg&&void 0!==lg&&(tc(a.ma,kg,lg),a.R(ha(kg)+": "+k(lg)))}else a.R("\noutput commands:"),a.R("\to [p] [b]\twrite byte [b] to port [p]"),a.R("warning: port accesses can affect hardware state");break;case "p":case "pr":var Fj="pr"==l[0]?1:0,v=1+Fj;if(a.Hc)a.R("step in progress");else{var Ne,ba=!1,Ib=Pl(a,q(a.O),Mb(a.O));do switch(Ne=!1,a.Ra(Ib)){case 38:case 46:case 54:case 62:case 100:case 101:case 102:case 103:case 240:lm(a,
            Ib,1);Ne=!0;break;case 204:case 206:a.Hc=v;lm(a,Ib,1);break;case 205:case 224:case 225:case 226:a.Hc=v;lm(a,Ib,2);break;case 232:a.Hc=v;lm(a,Ib,3);break;case 154:a.Hc=v;lm(a,Ib,5);break;case 255:var Gj=a.pc(Ib)&14591;a.Hc=4351==Gj||6399==Gj?v:0;break;case 243:case 242:lm(a,Ib,1);ba=Ne=!0;break;case 108:case 109:case 110:case 111:case 164:case 165:case 166:case 167:case 170:case 171:case 172:case 173:case 174:case 175:ba&&(a.Hc=v,lm(a,Ib,1))}while(Ne);a.Hc?(a.Ue(a.Mc,Ib,!0),a.Zf()||(a.O.dd(),a.Hc=
            0)):Pm(a,Fj?"tr":"t")}break;case "r":um(a,l);break;case "t":case "tr":Pm(a,l[0],l[1]);break;case "u":vm(a,l[1],l[2],8);break;case "x":a:if(void 0===l[1]||"?"==l[1])a.R("\nexecution options:"),a.R("\tcs int #\tset checksum cycle interval to #"),a.R("\tcs start #\tset checksum cycle start count to #"),a.R("\tcs stop #\tset checksum cycle stop count to #"),a.R("\tsp #\t\tset speed multiplier to #");else switch(l[1]){case "cs":var Gd;void 0!==l[3]&&(Gd=+l[3]);switch(l[2]){case "int":a.O.T.Lg=Gd;break;
            case "start":a.O.T.Vh=Gd;break;case "stop":a.O.T.Ng=Gd;break;default:a.R("unknown cs option");break a}void 0!==Gd&&Yc(a.O);a.R("checksums "+(a.O.fa.yg?"enabled":"disabled"));break;case "sp":void 0!==l[2]&&gd(a.O,+l[2]);a.R("target speed: "+Kb(a.O)+" ("+a.O.T.Ae+"x)");break;default:a.R("unknown option: "+l[1])}break;case "?":var v="commands:",mg;for(mg in Vl)v+="\n"+na(mg,7)+Vl[mg];qf(a)||(v+="\nnote: frequency/history disabled if no exec breakpoints");a.R(v);break;default:a.R("unknown command: "+
            b),c=!1}}}catch(Hj){a.R("debugger error: "+(Hj.stack||Hj.message)),c=!1}return c}Qa(function(){for(var a=lb(window.document,"pcjs","debugger"),b=0;b<a.length;b++){var c=a[b],d=jb(c),d=new Ol(d);kb(d,c)}});function Ie(a,b,c){this.id=a.id;this.key=Rm(a,b,c);this.Y=a.Y;Sm(this,a.fs)}function Rm(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
            Ie.prototype={constructor:Ie,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.hl=!0):this.hl?!0:Fa()&&(a=Ha(this.key))?(this[this.id]=a,this.hl=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){Ca(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
            a:JSON.stringify(a)},clear:function(a){Sm(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(g){}b.splice(c,1);c=0}},qa:function(a){return this.Y?this.Y.qa(null==a?16777216:a|16777216):!1},$a:function(a){this.Y&&this.Y.message(a)}};function Sm(a,b){a[a.id]={};b&&a.set("parms",b);a.hl=!1}
            function Tm(a){var b=!0;if(Fa()){var c=JSON.stringify(a[a.id]);Ia(a.key,c)||(Ca("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
            function Um(a,b,c){Wa.call(this,"Computer",a,Um,67108864);this.fa.hc=!1;this.ze=a.busWidth||a.buswidth;this.vd=Vm;this.oi=null;this.bj=!1;this.url=b?b.url:null;this.Fs=(Math.random()+.1).toString(36).substr(2,12);this.wd=Wm(this);if(this.O=ib("CPU",this.id)){this.Y=ib("Debugger",this.id);this.ma=new Zb({id:this.ao+".bus",buswidth:this.ze},this.O,this.Y);var d,e=gb(this.id);if((this.Ee=ib("Panel",this.id))&&this.Ee.Gh)for(b=0;b<e.length;b++)d=e[b],d.Da=this.Ee.Da,d.R=this.Ee.R,d.Gh=this.Ee.Gh;for(b=
            0;b<e.length;b++)d=e[b],d.Ic&&d.Ic(this,this.ma,this.O,this.Y);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.tk=d:this.vd=parseInt(d,10));var g;if(a=ab&&ab.state||(g=!0,a.state))b=this.Ko=a,g||(this.bj=!0,this.vd=Vm),this.vd&&(this.xk=new Ie(this,"1.18.2"),this.xk.load()?b=null:delete this.xk);!b&&this.vd&&(g=null,this.wd&&(g=Aa()+"/api/v1/user?req=load&user="+this.wd+"&state="+Rm(this,"1.18.2")),b=g)&&(this.bj=!0);b?za(b,!0,null,this,this.dr):pb(this);c||Xm(this,this.ik)}else Ca("Unable to find CPU component")}
            fb(Um);var Vm=0;f=Um.prototype;f.Fg=function(){return this.Fs};f.gf=function(){return this.wd?this.wd:""};f.dr=function(a,b,c){c?(this.tk=null,this.bj=!1,this.Da("Unable to load machine state from server (error "+c+(b?": "+oa(b):"")+")")):this.oi=b;pb(this)};function Xm(a,b,c){for(var d=gb(a.id),e=0;e<=d.length;e++){var g=e<d.length?d[e]:a;if(!qb(g)){qb(g,function(){Xm(a,b,c)});return}}b.call(a,c)}
            function Ym(a,b){var c=new Ie(a,"1.18.2","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.Da("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
            f.ik=function(a){void 0===a&&(a=this.vd||(this.oi?1:Vm));var b=!1,c=!1;this.Qn=!1;var d=this.xk||new Ie(this,"1.18.2");if(-1==a)b=!0;else if(a>Vm){if(d.load(this.oi)){this.cg=new Ie(this,"1.18.2","failsafe");this.cg.load()&&(Zm(this,d),a=2,Sm(this.cg));this.cg.set("timestamp",ua());Tm(this.cg);var e=this.vd&&!this.bj;if(1==a||Da("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var g=d.get("code"),l=d.get("data");g&&("ok"==g?d.load(l):("error"==
            g&&"no machine state"!=l?(this.Da("Error: "+l),"unable to verify user"==l&&(Ia("user",""),this.wd=null)):this.R(g+": "+l),Sm(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&Ym(this,c?d:null)}else 2==a&&d.clear()}else Ym(this);delete this.oi;delete this.xk}e=gb(this.id);for(g=0;g<e.length;g++)l=e[g],l!==this&&l!=this.O&&(c=$m(this,l,d,b,c));b=[d,a,c];-1!=a?Xm(this,this.In,b):this.In(b)};
            function $m(a,b,c,d,e){if(!b.fa.hc){b.fa.hc=!0;if(b.kc){var g=null;e&&((g=c.get(b.id))||(g=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof g&&(g=null);!b.kc(g,d)&&g&&(Ca("Unable to restore state for "+b.type),a.Ko&&!a.oi?(c.clear(),a.vd=Vm,window&&window.location.reload()):a.Qn=!0,b.kc(null),e=!1)}if(!d&&b.Dn)for(a=b.Dn.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
            f.In=function(a){var b=a[0],c=0>a[1];a=a[2];this.fa.hc=!0;this.Nn||(this.R("PCjs v1.18.2\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Nn=!0);this.O&&($m(this,this.O,b,c,a),$c(this.O));this.Qn&&(Zm(this,b),b.clear());!c&&this.cg&&(this.cg.clear(),delete this.cg)};
            function Zm(a,b){if(Da("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.gf(),d=b.toString(),e={app:"PCjs",ver:"1.18.2"};e.url=a.url;e.user=c;e.type="bug";e.data=d;za("http://www.pcjs.org/api/v1/report",!0,e)}}
            function Qm(a,b,c){var d,e="none",g=new Ie(a,"1.18.2"),l=new Ie(a,"1.18.2","validate"),p=ua();l.set("timestamp",p);g.set("timestamp",p);g.set("version","1.18.2");g.set("url",window?window.location.href:null);g.set("browser",window?window.navigator.userAgent:"");a.O&&a.O.jc&&(c&&a.O.yb(),d=a.O.jc(b,c),"object"===typeof d&&g.set(a.O.id,d),c&&(a.O.fa.hc=!1,!1===d&&(e=null)));for(var p=gb(a.id),w=0;w<p.length;w++){var v=p[w];v.fa.hc&&(v.jc&&(d=v.jc(b,c),"object"===typeof d&&g.set(v.id,d)),c&&(v.fa.hc=
            !1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.wd&&an(a,a.wd,g.toString()),Tm(l)&&Tm(g)||(e=null,d=p=!0)):a.vd&&(d=!0,p=3==a.vd),d&&g.clear(p)):e=g.toString());c&&(a.fa.hc=!1);return e}f.reset=function(){this.ma&&this.ma.reset&&(this.$a("Resetting "+this.ma.type),this.ma.reset());for(var a=gb(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.ma&&c.reset&&(this.$a("Resetting "+c.type),c.reset())}};
            f.start=function(a,b){for(var c=gb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=gb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
            f.Lb=function(a,b,c){var d=this;switch(b){case "save":return this.va[b]=c,c.onclick=function(){var a=Wm(d,!0);if(a){var b=!(!d.vd||d.tk),c=Qm(d,b);b?an(d,a,c):d.Da("Resume disabled, machine state not saved")}},!0;case "reset":return this.va[b]=c,c.onclick=function(){fd(d)},!0}return!1};
            function Wm(a,b){var c=a.wd;c||(c=Ha("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=bn(a,c))||a.Da("Your user ID has not been approved."))):b&&a.Da("Browser local storage is not available"));return c}
            function bn(a,b){a.wd=null;var c=za(Aa()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(Ia("user",c.data),a.wd=c.data)}catch(e){Ca(e.message+" ("+d+")")}return a.wd}
            function an(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Rm(a,"1.18.2");d.data=c;b=za(Aa()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.Da("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.Da(c),Ia("user",""),a.wd=null)}}
            function fd(a){if(a.vd&&!a.tk){var b=Da("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Qm(a,b,!0);!b&&a.Ko?window&&window.location.reload():(b||(a.jl=!0),a.ik(Vm),a.jl=!1)}else a.reset(),a.O&&$c(a.O)}function yb(a,b,c){a=gb(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
            Qa(function(){for(var a=lb(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=jb(c),c=lb(c,"pcjs","computer"),e=0;e<c.length;e++){var g=c[e],l=jb(g),l=new Um(l,d,!0);kb(l,g);Xm(l,l.ik)}});Ma.show.push(function(){for(var a=lb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=jb(a[b]);(c=ib("Computer",c.id))&&c.Nn&&!c.fa.hc&&c.ik(-1)}});
            Ma.exit.push(function(){for(var a=lb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=jb(a[b]);(c=ib("Computer",c.id))&&c.fa.hc&&Qm(c,!(!c.vd||c.tk),!0)}});var cn=0;function dn(a,b,c,d,e,g){e("Loading "+a+"...");za(a,!0,null,null,function(l,p,w){w?(p||(p="unable to load "+a+" ("+w+")"),g(p,null)):en(p,a,b,c,d,e,g)})}
            function en(a,b,c,d,e,g,l){function p(a,g){if(g)l(g,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(O){p=
            null,a=O.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);l(a,p)}}a?e?hn(a,g,p):p(a,null):l("no data"+(b?" for file: "+b:""),null)}
            function hn(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");za(e,!0,null,null,function(g,l,p){if(p||!l)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(g=d[3])if(p=l.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var w=p[0],v,E=/( [a-z]+=)(['"])(.*?)\2/g;v=E.exec(g);)w=0>w.indexOf(v[1])?w.replace(">",v[0]+">"):w.replace(new RegExp(v[1]+"(['\"])(.*?)\\1"),v[0]);p[0]!=w&&(l=l.replace(p[0],w))}else{c(a,"missing <"+d[1]+"> in "+e);return}l=l.replace(/<\?xml[^>]*>[\r\n]*/,
            "");a=a.replace(d[0],l);hn(a,b,c)}})}else c(a,null)}
            function jn(a,b,c,d){function e(a){if(void 0===p){var b=l&&lb(l,"machine-warning");p=b&&b[0]||l}p&&(p.innerHTML=la(a))}function g(a){e("Error: "+a);w&&(--cn||Ta(!0));w=!1}var l,p,w=!0;cn++;try{if(l=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.2/components.xsl");var v=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(l.outerHTML=w,--cn||Ta(!0)):g("transformNodeToObject failed")}else window.document.implementation&&
            window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?l.parentNode?(l.parentNode.replaceChild(w,l),--cn||Ta(!0)):g("invalid machine element: "+a):g("transformToFragment failed")):g("unable to transform XML: unsupported browser");else g("failed to load XSL file: "+c);else g(d)};p?dn(c,null,null,!1,e,v):g("failed to load XML file: "+b)}else g(d)};"<"!=b.charAt(0)?dn(b,a,d,!0,e,v):en(b,null,a,d,!1,e,v)}else g("missing machine element: "+
            a)}catch(E){g(E.message)}return w}window.embedPC=function(a,b,c,d){Ta(!1);return jn(a,b,c,d)};window.enableEvents=Ta;window.sendEvent=Va;})();
            
          • pc.js
            (function(){var f,aa,g,ba={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
            function ca(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
            function da(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function ea(a){return"0x"+da(a,2)}function fa(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}function ga(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}
            var ha={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function ka(a){return a.replace(/[&<>"']/g,function(a){return ha[a]})}var la=Date.now||function(){return+new Date};function ma(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var na=[31,28,31,30,31,30,31,31,30,31,30,31];
            function oa(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function pa(a,b){return(b&a.Gp)>>a.shift}
            function qa(a,b,c,d,e,m){b=!!b;var n=0,p=null,v=fa(a),w=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(w.onreadystatechange=function(){4===w.readyState&&(p=w.responseText,200==w.status||!w.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)))});if(c){var G="",Q;for(Q in c)c.hasOwnProperty(Q)&&(G&&(G+="&"),G+=Q+"="+encodeURIComponent(c[Q]));G=G.replace(/%20/g,"+");w.open("POST",
            a,b);w.setRequestHeader("Content-type","application/x-www-form-urlencoded");w.send(G)}else w.open("GET",a,b),w.send();a=[];b||(p=w.responseText,200!=w.status&&(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)),a=[n,p]);return a}function ra(){return"http://"+(window?window.location.host:"www.pcjs.org")}function sa(a){window&&window.alert(a)}function ta(a){var b=!1;window&&(b=window.confirm(a));return b}var ua=null;
            function va(){if(null==ua){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}ua=a}return ua}function wa(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function xa(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
            function ya(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}var za={init:[],show:[],exit:[]},Aa=!1,Ba=!0;function Ca(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Da(a){za.init.push(a)}
            function Ea(a){if(Ba)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){sa("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Fa(a){!Ba&&a?(Ba=!0,Aa&&Ga("init")):Ba=a}function Ga(a){za[a]&&Ea(za[a])}Ca("onload",function(){Aa=!0;Ea(za.init)});Ca("onpageshow",function(){Ea(za.show)});Ca(ya("Opera")||ya("iOS")?"onunload":"onbeforeunload",function(){Ea(za.exit)});
            function Ha(a,b,c){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Hm=b.comment;this.Zq=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.cn=this.id.substr(0,b),this.Sg=this.id.substr(b+1)):this.Sg=this.id;this[a]=c;this.ha={Qf:!1,Uc:!1,lk:!1,cc:!1,wd:!1};this.ki=null;this.ha.wd=!1;this.qa={};this.Sa=null;Ia[Ia.length]=this}var Ja=void 0,Ka={};
            if(window){Ja||(Ja=window.location.search.substr(1));for(var La,Ma=/\+/g,Na=/([^&=]+)=?([^&]*)/g;La=Na.exec(Ja);)Ka[decodeURIComponent(La[1].replace(Ma," "))]=decodeURIComponent(La[2].replace(Ma," "))}function Oa(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
            function Pa(a,b){b||(b=Ha);a.prototype=Oa(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Ia=[];function Qa(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Ia.length;b++){var d=Ia[b];a&&d.id.indexOf(a)||c.push(d)}return c}function Ra(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Ia.length;c++)if(Ia[c].id===a)return Ia[c]}return null}
            function Sa(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Ia.length;d++)if(c)c==Ia[d]&&(c=null);else if(!(a!=Ia[d].type||b&&Ia[d].id.indexOf(b)))return Ia[d]}return null}function Ua(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){sa(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
            function Va(a,b){for(var c=Wa(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,m=0;m<e.length;m++){var n=e[m];if(n.nodeType===window.document.ELEMENT_NODE){var p=n.getAttribute("class");if(p)for(var v=p.split(" "),w=0;w<v.length;w++)switch(p=v[w],p){case "pcjs-binding":(p=Ua(n))&&p.binding&&a.Kb(p.type,p.binding,n),w=v.length}}}}
            function Wa(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
            Ha.prototype={constructor:Ha,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Kb:function(a,b,c){switch(b){case "clear":return this.qa[b]||(this.qa[b]=c,c.onclick=function(a){return function(){a.qa.print&&(a.qa.print.value="")}}(this)),!0;case "print":return this.qa[b]||(this.ek=this.qa[b]=c,c.value="",this.oc=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
            this.wa=function(a,b,c){this.oc(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},oc:function(){},status:function(a){this.oc(this.Sg+": "+a)},wa:function(a,b){b||sa(a)},fc:function(){return this.ha.cc=!0},ec:function(a,b){b&&(this.ha.cc=!1);return!0},nc:function(){return!1}};function Xa(a,b){if(a.ha.lk)return a.ha.Uc&&(a.ha.Uc=!1),a.ha.lk=!1;if(a.ha.wd)return a.oc(a.toString()+" error"),!1;a.ha.Uc=b;return a.ha.Uc}
            function Ya(a,b){if(!a.ha.wd&&(a.ha.Qf=!1!==b,a.ha.Qf)){var c=a.ki;a.ki=null;c&&c()}}function Za(a,b){b&&(a.ha.Qf?b():a.ki=b);return a.ha.Qf}function $a(a,b){a.ha.wd=!0;a.wa(b)}var ab="undefined"!==typeof ArrayBuffer;function bb(a){Ha.call(this,"Panel",a,bb);this.canvas=null;this.ce=this.de=this.Tg=-1}Pa(bb);function cb(a,b,c,d){this.qf=[a,b,c,d];this.Ej=null;void 0===a&&(this.qf[0]=256*Math.random()|0,this.qf[1]=256*Math.random()|0,this.qf[2]=256*Math.random()|0,this.qf[3]=255,this.Ej=null)}
            cb.prototype.toString=function(){this.Ej||(this.Ej="#"+da(this.qf[0],2)+da(this.qf[1],2)+da(this.qf[2],2));return this.Ej};function db(a,b,c,d){this.x=a;this.y=b;this.Ic=c;this.Tc=d}db.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Ic&&b>=this.y&&b<this.y+this.Tc};function eb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new db(a.x,a.y,a.Ic,a.Tc*b/c|0),a.y+=b.Tc,a.Tc-=b.Tc):(b=new db(a.x,a.y,a.Ic*b/c|0,a.Tc),a.x+=b.Ic,a.Ic-=b.Ic);return b}f=bb.prototype;
            f.Kb=function(a,b,c){return this.za&&this.za.Kb(a,b,c)||this.W&&this.W.Kb(a,b,c)||this.Da&&this.Da.Kb(a,b,c)?!0:this.parent.Kb.call(this,a,b,c)};f.Jc=function(a,b,c,d){this.za=a;this.la=b;this.W=c;this.Sa=d;this.Da=fb(a,"Keyboard")};f.fc=function(a,b){b||gb();return!0};f.ec=function(){return!0};f.dk=function(a,b){a.button||(this.Tg=b?0:-1,hb(this,a,b))};f.fn=function(a){hb(this,a)};
            function hb(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,m=a.canvas.getBoundingClientRect(),d=(b.clientX-m.left)*d|0;b=(b.clientY-m.top)*e|0;null==c&&(a.Tg||(a.Tg=Math.abs(a.ce-d)>Math.abs(a.de-b)?1:2),1==a.Tg?b=a.de:2==a.Tg&&(d=a.ce));a.ce=d;a.de=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.Xa&&a.Xa.Cf)for(m=0;m<a.Xa.Cf.length;m++)if(e=a.Xa.Cf[m],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.Xa.wg[m],n=pa(ib.sn,a.Xa.Mj[d.xo]),m=n*a.la.nb,d=(n+d.Ld)*a.la.nb-1;0<b&&(m+=e.Ic*(b-
            1)*a.vn);m+=c*a.vn;m|=0;m>d&&(m=d);c=m;break a}c=h}c!==h&&(c&=-16,c!=a.sm&&(jb(a,c,!0),a.sm=c))}}
            f.be=function(){if(this.canvas&&this.Xh&&this.le&&this.$e){var a=this.le.width,b=this.le.height;this.$e.fillStyle="black";this.$e.fillRect(0,0,a,b);kb(this,18,this.le,this.$e,this.canvas.style.color);lb(this,3);k(this,"CPU");k(this,"Target");k(this,"Current");mb(this);k(this,this.W.na);k(this,this.W.R.jf.toFixed(2)+"Mhz");k(this,pb(this.W));mb(this,2);lb(this,8);this.Pp=16;this.Qp=4;k(this,"AX",this.W.F,2);k(this,"DS",this.W.jb.ta,0,1);k(this,"DX",this.W.H,2);k(this,"SI",this.W.K,0,1.5);k(this,"BX",
            this.W.D,2);k(this,"ES",this.W.Ra.ta,0,1);k(this,"CX",this.W.G,2);k(this,"DI",this.W.J,0,1.5);k(this,"CS",this.W.oa.ta,2);k(this,"SS",this.W.ra.ta,0,1);k(this,"IP",l(this.W),2);k(this,"SP",q(this.W),0,1.5);var c;k(this,"PS",c=qb(this.W),2);k(this,"BP",this.W.L,0,1.5);lb(this,9);k(this,"V"+(c&rb?1:0));k(this,"D"+(c&sb?1:0));k(this,"I"+(c&tb?1:0));k(this,"T"+(c&ub?1:0));k(this,"S"+(c&vb?1:0));k(this,"Z"+(c&wb?1:0));k(this,"A"+(c&xb?1:0));k(this,"P"+(c&yb?1:0));k(this,"C"+(c&zb?1:0),0,2);jb(this,this.sm);
            this.Xh.drawImage(this.le,0,0,a,b,this.wt,this.zt,this.Us,this.Xs)}};function Ab(a,b,c,d){a.Xa.wg[a.Xa.Cm++]={xo:b,Ld:c,type:d};return oa(ib,b,c,0,d)}
            function jb(a,b,c){if(a.Xh&&a.le&&a.$e){var d=a.le.width;a.$e.fillStyle="black";a.$e.fillRect(0,360,d,360);kb(a,378,a.le,a.$e,a.canvas.style.color);lb(a,24);if(null==b)k(a,"Mouse over memory to dump");else{k(a,"0x"+da(b),null,0,1);for(var e=1;16>=e;e++){for(var m="",n=1;8>=n;n++){var p=Bb(a.la,b++);k(a,da(p,2),null,1);m+=32<=p&&128>p?String.fromCharCode(p):"."}k(a,m,null,0,1)}}c&&a.Xh.drawImage(a.le,0,360,d,360,a.ut,a.xt,a.Ss,a.Vs)}}
            function kb(a,b,c,d,e){var m,n=a.Pr=10;a.bd=n;a.zf=b;a.Uf=a.$m=18;m||(m=a.Wm||a.$m+"px Monaco, Lucida Console, Courier New");a.li=a.Wm=m;c&&(a.Wn=c);d&&(a.vd=d,a.bo=e||"white")}function lb(a,b){a.fk=a.Wn.width/b|0}function mb(a,b){a.bd=a.Pr;a.zf+=(a.Uf+2)*(b||1)}function k(a,b,c,d,e){a.vd.font=a.li;a.vd.fillStyle=a.bo;a.vd.fillText(b,a.bd,a.zf);a.bd+=a.fk;null!=c&&(b=c.toString(),16==a.Pp&&(b="0x"+da(c,a.Qp)),a.vd.fillText(b,a.bd,a.zf),a.bd+=a.fk);d&&(a.bd+=a.fk*d);e&&mb(a,e)}
            function gb(){for(var a=!1,b=Wa(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=Ua(d),m=Ra(e.id);m||(a=!0,m=new bb(e));Va(m,d);a&&Ya(m)}}Da(gb);function Cb(a,b,c){Ha.call(this,"Bus",a,Cb);this.W=b;this.Sa=c;this.Ae=a.buswidth||20;this.Sj=Math.pow(2,this.Ae);this.Kp=this.vb=this.Sj-1|0;this.Aa=32==this.Ae||20>=this.Ae?12:24>=this.Ae?14:15;this.nb=1<<this.Aa;this.jn=this.nb>>2;this.Ea=this.nb-1;this.Td=this.Sj/this.nb|0;this.Yc=this.Td-1;this.Ah=[];this.Bh=[];this.yk();Ya(this)}Pa(Cb);
            var ib,Db={sn:20,count:8,Qs:1,type:3},Eb=0,Fb;for(Fb in Db){var Gb=Db[Fb];Db[Fb]={Gp:(1<<Gb)-1<<Eb,shift:Eb};Eb+=Gb}ib=void 0;f=Cb.prototype;f.yk=function(){var a=new r;this.ka=Array(this.Td);for(var b=0;b<this.Td;b++)this.ka[b]=a;this.W.yk(this.ka,this.Aa);a=this.W;a.vb=a.Wd=this.vb};f.reset=function(){Hb(this,!0)};f.fc=function(a,b){b||this.reset();return!0};
            function Ib(a,b,c,d,e){for(var m=b>>>a.Aa;0<c&&m<a.ka.length;){var n=a.ka[m],p=m*a.nb,v=c>a.nb?a.nb:c;if(n&&n.size){if(n.type==d&&n.V==e){if(b+c<=n.yg)return n.ng+=n.yg-b,n.yg=b,!0;if(b>=n.yg+n.ng){v=n.size-(b-p);v>c&&(v=c);n.ng=b-n.yg+v;c-=v;b=p+a.nb;continue}}return Jb(1,b,c)}a.ka[m++]=new r(b,v,a.nb,d,e);c-=v;b=p+a.nb}return 0<c?Jb(2,b,c):!0}
            function Hb(a,b){if(32==a.Ae)b?a.sg&&(Kb(a,1048576,1048576,a.sg),a.sg=null):a.sg||(a.sg=Lb(a,1048576,1048576),Kb(a,1048576,1048576,Lb(a,0,1048576)));else if(20<a.Ae){var c=a.vb&-1048577|(b?1048576:0);if(c!=a.vb&&(a.vb=c,a.W)){var d=a.W;d.vb=d.Wd=c}}}f.Gj=function(a,b,c){if(!(a&this.Ea||!b||b&this.Ea)){for(var d=a>>>this.Aa;0<b;){var e=this.ka[d];if(!e.V)return Jb(5,a,b);e.ld(c);b-=this.nb;d++}return!0}return Jb(3,a,b)};
            function Mb(a,b,c){if(!(b&a.Ea||!c||c&a.Ea)){for(var d=b>>>a.Aa;0<c;)b=d*a.nb,a.ka[d++]=new r(b),c-=a.nb;return!0}return Jb(4,b,c)}function Lb(a,b,c){var d=[];for(b>>>=a.Aa;0<c&&b<a.ka.length;)d.push(a.ka[b++]),c-=a.nb;return d}function Kb(a,b,c,d,e){for(var m=0,n=b>>>a.Aa;0<c&&n<a.ka.length;){var p=d[m++];if(!p)break;if(void 0!==e){var v=new r(b);v.clone(p,e);p=v}a.ka[n++]=p;c-=a.nb}}f.vc=function(a){return this.ka[(a&this.vb)>>>this.Aa].xc(a&this.Ea,a)};
            function Bb(a,b){return a.ka[(b&a.vb)>>>a.Aa].rj(b&a.Ea,b)}f.ma=function(a){var b=a&this.Ea,c=(a&this.vb)>>>this.Aa;return b!=this.Ea?this.ka[c].sj(b,a):this.ka[c++].xc(b,a)|this.ka[c&this.Yc].xc(0,a+1)<<8};function Nb(a,b){var c=b&a.Ea,d=(b&a.vb)>>>a.Aa;return c!=a.Ea?a.ka[d].mr(c,b):a.ka[d++].rj(c,b)|a.ka[d&a.Yc].rj(0,b+1)<<8}
            f.Qg=function(a){var b=a&this.Ea,c=(a&this.vb)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.Yc].yc(0,a+3)<<32-d};f.Me=function(a,b){this.ka[(a&this.vb)>>>this.Aa].Bc(a&this.Ea,b&255,a)};f.Cb=function(a,b){var c=a&this.Ea,d=(a&this.vb)>>>this.Aa;c!=this.Ea?this.ka[d].Jj(c,b&65535,a):(this.ka[d++].Bc(c,b&255,a),this.ka[d&this.Yc].Bc(0,b>>8&255,a+1))};
            function Ob(a,b,c){var d=b&a.Ea,e=(b&a.vb)>>>a.Aa;d!=a.Ea?a.ka[e].Kr(d,c&65535,b):(a.ka[e++].cm(d,c&255,b),a.ka[e&a.Yc].cm(0,c>>8&255,b+1))}f.Fj=function(a,b){var c=a&this.Ea,d=(a&this.vb)>>>this.Aa;if(c<this.Ea-2)this.ka[d].Qe(c,b);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Qe(c,e&~(-1<<m)|b<<m,a);d=d+1&this.Yc;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Qe(0,e&-1<<m|b>>>32-m,a)}};
            function Pb(a){for(var b=0,c=[],d=0;d<a.Td;d++){var e=a.ka[d];if(e.La||e.Mm){c[b++]=d;var m=b++;a:if(e=e.save()){for(var n=0,p=0,v=[];n<e.length;){for(var w=e[n],G=n+1;G<e.length&&e[G]===w;)G++;v[p++]=G-n;v[p++]=w;n=G}if(v.length<e.length){e=v;break a}}c[m]=e}}c[b]=!a.sg&&a.Kp==a.vb;return c}
            function Sb(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Ah[w]?sa("Input port 0x"+da(w,4)+" registered by "+m.Ah[w][0].id+", ignoring "+p.id):m.Ah[w]=[p,v,!1,!1]}}function Tb(a,b,c){var d=255;a=a.Ah[b];void 0!==a&&a[1]&&(b=a[1].call(a[0],b,c),void 0!==b&&(d=b));return d}
            function Ub(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Bh[w]?sa("Output port 0x"+da(w,4)+" registered by "+m.Bh[w][0].id+", ignoring "+p.id):m.Bh[w]=[p,v,!1,!1]}}function Vb(a,b,c,d){a=a.Bh[b];void 0!==a&&a[1]&&a[1].call(a[0],b,c,d)}function Jb(a,b,c){sa("Memory block error ("+a+","+da(b)+","+da(c)+")");return!1}var Wb;
            if(ab){var Xb=new ArrayBuffer(2);(new DataView(Xb)).setUint16(0,256,!0);Wb=256===(new Uint16Array(Xb))[0]}else Wb=!1;var Yb=Wb;
            function r(a,b,c,d,e,m){this.id=Zb+=2;this.ba=null;this.offset=0;this.yg=a;this.ng=b;this.size=c||0;this.type=d||$b;this.hi=d==ac;this.V=null;this.W=m;this.La=this.Mm=!1;bc(this);if(c)if(e)this.V=e,a=e.Zm(a),this.ba=a[0],this.offset=a[1],this.ld(e.vk());else if(ab)this.buffer=new ArrayBuffer(c),this.re=new DataView(this.buffer,0,c),this.Mb=new Uint8Array(this.buffer,0,c),this.Gh=new Uint16Array(this.buffer,0,c>>1),this.ba=new Int32Array(this.buffer,0,c>>2),this.ld(Yb?cc:dc);else{this.ba=Array(c>>
            2);for(e=0;e<this.ba.length;e++)this.ba[e]=0;this.ld(ec)}else this.ld()}var $b=0,ac=2,fc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),gc=["black","blue","green","cyan"],Zb=0;function hc(a){ab&&!Yb&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
            r.prototype={constructor:r,parent:null,clone:function(a,b){this.id=a.id|1;this.ng=a.ng;this.size=a.size;b&&(this.type=b,this.hi=b==ac);ab?(this.buffer=a.buffer,this.re=a.re,this.Mb=a.Mb,this.Gh=a.Gh,this.ba=a.ba,this.ld(Yb?cc:dc)):(this.ba=a.ba,this.ld(ec))},save:function(){var a,b;if(this.V)a=null;else if(ab)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.re.getInt32(b<<2,!0);else a=this.ba;return a},restore:function(a){if(this.V)return null==a;if(a&&this.size==a.length<<2){var b;if(ab)for(b=
            0;b<a.length;b++)this.re.setInt32(b<<2,a[b],!0);else this.ba=a;return this.La=!0}return!1},ld:function(a){a||(a=5==this.type?ic:6==this.type?jc:kc);var b=a;this.xc=b[0]||this.wn;this.sj=b[1]||this.xn;this.yc=b[2]||this.gr;this.rj=b[0]||this.wn;this.mr=b[1]||this.xn;this.Bc=!this.hi&&a[3]||this.On;this.Jj=!this.hi&&a[4]||this.Pn;this.Qe=!this.hi&&a[5]||this.Er;this.cm=a[3]||this.On;this.Kr=a[4]||this.Pn},wn:function(){return 255},On:function(){},xn:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<
            8},gr:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<8|this.xc(a+2,b)<<16|this.xc(a+3,b)<<24},Pn:function(a,b){this.Bc(a,b&255);this.Bc(a+1,b>>8)},Er:function(a,b){this.Bc(a,b&255);this.Bc(a+1,b>>8&255);this.Bc(a+2,b>>16&255);this.Bc(a+3,b>>>24)},cr:function(a){return this.ba[a>>2]>>>((a&3)<<3)&255},or:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b]>>a;return 24>a?c&65535:c&255|(this.ba[b+1]&255)<<8},ir:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b];a&&(c=c>>>a|this.ba[b+1]<<32-a);return c},
            Ar:function(a,b){var c=a>>2,d=(a&3)<<3;this.ba[c]=this.ba[c]&~(255<<d)|b<<d;this.La=!0},Mr:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ba[c]=this.ba[c]&~(65535<<d)|b<<d:(this.ba[c]=this.ba[c]&16777215|b<<24,c++,this.ba[c]=this.ba[c]&-256|b>>8);this.La=!0},Gr:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ba[c]=this.ba[c]&~e|b<<d;c++;this.ba[c]=this.ba[c]&e|b>>>32-d}else this.ba[c]=b;this.La=!0},dr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.xc(a,
            b)},pr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.sj(a,b)},jr:function(a,b){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Kd;return this.If.yc(a,b)},Br:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Bc(a,b,c)},Nr:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Jj(a,b,c)},Hr:function(a,b,c){this.Qc.ba[this.Wc]|=this.Kd;this.Rc.ba[this.Xc]|=this.Yj;this.If.Qe(a,b,c)},er:function(a,
            b){return(lc(this.W,b,!1)||this).xc(a,b)},qr:function(a,b){return(lc(this.W,b,!1)||this).sj(a,b)},kr:function(a,b){return(lc(this.W,b,!1)||this).yc(a,b)},Cr:function(a,b,c){(lc(this.W,c,!0)||this).Bc(a,b,c)},Or:function(a,b,c){(lc(this.W,c,!0)||this).Jj(a,b,c)},Ir:function(a,b,c){(lc(this.W,c,!0)||this).Qe(a,b,c)},ar:function(a){return this.Mb[a]},br:function(a){return this.Mb[a]},lr:function(a){return this.re.getUint16(a,!0)},nr:function(a){return a&1?this.Mb[a]|this.Mb[a+1]<<8:this.Gh[a>>1]},fr:function(a){return this.re.getInt32(a,
            !0)},hr:function(a){return a&3?this.Mb[a]|this.Mb[a+1]<<8|this.Mb[a+2]<<16|this.Mb[a+3]<<24:this.ba[a>>2]},yr:function(a,b){this.Mb[a]=b;this.La=!0},zr:function(a,b){this.Mb[a]=b;this.La=!0},Jr:function(a,b){this.re.setUint16(a,b,!0);this.La=!0},Lr:function(a,b){a&1?(this.Mb[a]=b,this.Mb[a+1]=b>>8):this.Gh[a>>1]=b;this.La=!0},Dr:function(a,b){this.re.setInt32(a,b,!0);this.La=!0},Fr:function(a,b){a&3?(this.Mb[a]=b,this.Mb[a+1]=b>>8,this.Mb[a+2]=b>>16,this.Mb[a+3]=b>>24):this.ba[a>>2]=b;this.La=!0}};
            function bc(a,b,c,d,e,m){a.If=b;a.Qc=c;a.Wc=d>>2;a.Rc=e;a.Xc=m>>2;a.Yj=b?hc(mc|nc):0;a.Kd=b?hc(mc):0}var kc=[],ec=[r.prototype.cr,r.prototype.or,r.prototype.ir,r.prototype.Ar,r.prototype.Mr,r.prototype.Gr],jc=[r.prototype.dr,r.prototype.pr,r.prototype.jr,r.prototype.Br,r.prototype.Nr,r.prototype.Hr],ic=[r.prototype.er,r.prototype.qr,r.prototype.kr,r.prototype.Cr,r.prototype.Or,r.prototype.Ir];
            if(ab)var dc=[r.prototype.ar,r.prototype.lr,r.prototype.fr,r.prototype.yr,r.prototype.Jr,r.prototype.Dr],cc=[r.prototype.br,r.prototype.nr,r.prototype.hr,r.prototype.zr,r.prototype.Lr,r.prototype.Fr];
            function oc(a,b){Ha.call(this,"CPU",a,oc);var c=a.cycles||b,d=a.multiplier||1;this.R={};this.R.zd=c;this.R.Be=d;this.R.ni=Math.round(this.R.zd/1E4)/100;this.R.jf=this.R.ni*this.R.Be;this.ha.Pb=!1;this.ha.Tm=!1;this.ha.kk=a.autoStart;this.ha.Nm=!1;c=Ka.autostart;void 0!==c&&(this.ha.kk="true"==c?!0:"false"==c?!1:null);this.ha.ci=!1;this.R.qi=this.R.Xf=0;this.R.ri=a.csStart;this.R.Ug=a.csInterval;this.R.Vg=a.csStop;this.dd=[];var e=this;this.Zp=function(){qc(e)};Ya(this)}Pa(oc);f=oc.prototype;
            f.Jc=function(a,b,c,d){this.la=b;this.Sa=d;this.za=a;for(b=null;b=fb(a,"Video",b);)this.dd.push(b);this.fa=fb(a,"ChipSet");Ya(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.fc=function(a,b){if(!b){if(a&&this.restore){rc(this);if(!this.restore(a))return!1;sc(this)}else this.reset();this.oc("No debugger detected")}tc(this);this.be();return!0};f.ec=function(a){return a&&this.save?this.save():!0};
            function uc(a){(!0===a.ha.kk||null===a.ha.kk&&void 0===a.qa.run)&&qc(a)}f.Ym=function(){return 0};function sc(a){void 0===a.R.ri&&(a.R.ri=0);void 0===a.R.Ug&&(a.R.Ug=-1);void 0===a.R.Vg&&(a.R.Vg=-1);a.ha.ci=0<=a.R.ri&&0<a.R.Ug;a.ha.ci&&(a.R.qi=0,a.R.Xf=a.R.ri-a.nf)}f.be=function(){this.za&&this.za.Xd&&this.za.Xd.be()};
            function tc(a){for(var b=0;b<a.dd.length;b++)vc(a.dd[b]);if(a.za&&a.za.Xd&&(a=a.za.Xd,a.to)){kb(a,18,a.Fg,a.co,a.canvas.style.color);if(a.at){var b=a.la,c=a.Xa,d,e;null==d&&(d=0);null==e&&(e=b.Sj-d|0);null==c&&(c={bk:0,Ld:0,Mj:[]});var m=d>>>b.Aa;d=d+e-1>>>b.Aa;c.bk=0;for(c.Ld=0;m<=d;)e=b.ka[m],c.bk+=e.size,e.size&&(c.Mj.push(oa(ib,m,0,0,e.type)),c.Ld++),m++;a.Xa=c;a.vn=a.Xa.Ld*a.la.nb/691200;b=0;a.Xa.Cm=0;a.Xa.wg||(a.Xa.wg=[]);c=-1;d=0;var n=-1;for(e=0;e<a.Xa.Ld;e++){var p=a.Xa.Mj[e],m=pa(ib.type,
            p),p=pa(ib.sn,p);if(m!=c||p!=n+1)(n=e-d)&&(b+=Ab(a,d,n,c)),c=m,d=e;n=p}b+=Ab(a,d,e-d,c);c=a.Xa.ao!=b;a.Xa.ao=b;if(c){c=new db(0,0,a.Fg.width,a.Fg.height);a.Xa.Cf=[];d=a.Xa.Ld;for(b=0;b<a.Xa.Cm;b++)e=a.Xa.wg[b].Ld,a.Xa.Cf.push(eb(c,e,d,!b)),d-=e;for(b=0;b<a.Xa.Cf.length;b++)c=a.Xa.wg[b],d=e=a.Xa.Cf[b],m=a.co,(n=gc[c.type])||(n=new cb),m.strokeStyle="black",m.strokeRect(d.x,d.y,d.Ic,d.Tc),m.fillStyle="string"==typeof n?n:n.toString(),m.fillRect(d.x,d.y,d.Ic,d.Tc),d=a,m=e,d.li=d.Wm,d.Uf=d.$m,e=m.x+(m.Ic>>
            1),n=m.y+(m.Tc>>1),p=m.Tc,m.Ic<m.Tc&&(p=m.Ic,d.Um=!0,d.vd.save(),d.vd.translate(e,n),d.vd.rotate(-Math.PI/2),e=n=0),p<d.Uf&&(d.Uf=p,d.li=d.Uf+"px Monaco, Lucida Console, Courier New"),m=n,d.bd=e,d.zf=m,d=a,c=fc[c.type]+" ("+(c.Ld*a.la.nb/1024|0)+"Kb)",d.vd.font=d.li,d.bd-=d.vd.measureText(c).width>>1,d.zf+=(d.Uf>>1)-2,k(d,c),d.Um&&(d.vd.restore(),d.Um=!1)}}else k(a,"This space intentionally left blank");a.Xh.drawImage(a.Fg,0,0,a.Fg.width,a.Fg.height,a.vt,a.yt,a.Ts,a.Ws);a.to=!1}}
            f.Fd=function(){this.dd.length&&this.dd[0].Fd()};
            f.Kb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.qa[b]=c;c.onclick=function(){var a;if(a=d.za)if(a=d.za,a.ha.cc)a=!0;else{var b=null,c,p=Qa(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.ha.Qf);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.ha.cc);c++);c==p.length&&(b=a);sa("The "+b.type+" component ("+b.id+") is not "+(b.ha.Qf?"powered yet":"ready yet"+(b.ki?" (waiting for notification)":""))+".");a=!1}a&&(d.ha.Pb?wc(d,!0):qc(d,!0))};a=!0;break;case "reset":this.qa[b]=c;c.onclick=
            function(){d.za&&xc(d.za)};a=!0;break;case "speed":this.qa[b]=c;a=!0;break;case "setSpeed":this.qa[b]=c,c.onclick=function(){yc(d,d.R.Be<<1,!0)},c.textContent=this.R.jf.toFixed(2)+"Mhz",a=!0}return a};function zc(a,b){if(a.ha.Pb){var c=a.A-b;a.A-=c;a.yd-=c}}function Ac(a,b,c){a.nf+=b;c&&(a.yd=a.A=0)}
            function Bc(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.R.Be&&a.R.ye&&(d=a.R.ye/a.R.ni);a.R.gn=Math.round(1E3/30);a.R.Np=Math.floor(a.R.zd/c*d);a.R.Fk=Math.floor(a.R.zd/30*d);a.R.mn=Math.floor(a.R.zd/60*d);a.R.ln=Math.floor(a.R.zd/2*d);b||(a.R.Yg=a.R.Fk,a.R.Xg=a.R.mn,a.R.Wg=a.R.ln);a.R.Gk=0}function Cc(a,b){var c=a.nf+a.Fe+a.yd-a.A;b&&1<a.R.Be&&a.R.ye>a.R.ni&&(c=Math.round(c/a.R.Be));return c}function rc(a){a.R.ye=0;a.nf=a.Fe=a.yd=a.A=0;sc(a);yc(a,1)}
            function pb(a){return a.ha.Pb&&a.R.ye?a.R.ye.toFixed(2)+"Mhz":"Stopped"}function yc(a,b,c){if(void 0!==b){.8>a.R.ye/a.R.jf&&(b=1);a.R.Be=b;b=a.R.ni*a.R.Be;if(a.R.jf!=b){a.R.jf=b;b=a.R.jf.toFixed(2)+"Mhz";var d=a.qa.setSpeed;d&&(d.textContent=b);a.oc("target speed: "+b)}c&&a.Fd()}Ac(a,a.Fe);a.Fe=0;a.R.Wf=la();a.R.kf=0;Bc(a)}
            function qc(a,b){if(Xa(a,!0)){if(!a.ha.Pb){yc(a);a.za&&a.za.start(a.R.Wf,Cc(a));a.ha.Pb=!0;a.ha.Tm=!0;a.fa&&Dc(a.fa);var c=a.qa.run;c&&(c.textContent="Halt");a.be(!0);b&&a.Fd()}a.R.Gk>=a.R.zd&&Bc(a,!0);a.R.Zg=0;a.R.oi=la();a.R.kf&&(c=a.R.oi-a.R.kf,c>a.R.gn&&(a.R.Wf+=c,a.R.Wf>a.R.oi&&(a.R.Wf=a.R.oi)));try{do{var d=a.ha.ci?1:a.R.Np;if(a.fa){Ec(a.fa);var e=a.fa,c=d,m=e.Tb[0];if(m.ff){var n=(Cc(e.W,e.te)-m.Ud)/e.lj|0,p=Fc(e,0)-n;6==m.mode&&(p-=n);var v=p*e.lj|0;6==m.mode&&(v>>=1);c>v&&(c=v)}var d=c,w=
            a.fa,c=d;if(w.ea&&w.ea[11]&64){var G=w.cg-Cc(w.W,w.te);0<G&&c>G&&(c=G)}d=c}a.Kn(d);var Q=a.yd-a.A;a.Fe+=Q;a.R.Zg+=Q;Ac(a,0,!0);var c=a,M=Q;if(c.ha.ci){var R=!1;c.R.qi=c.R.qi+c.Ym()|0;c.R.Xf-=M;0>=c.R.Xf&&(c.R.Xf+=c.R.Ug,R=!0);0<=c.R.Vg&&c.R.Vg<=Cc(c)&&(c.R.Ug=c.R.Vg=-1,sc(c),wc(c),R=!0);R&&c.oc(Cc(c)+" cycles: checksum="+da(c.R.qi))}a.R.Xg-=Q;0>=a.R.Xg&&(a.R.Xg+=a.R.mn,tc(a));a.R.Wg-=Q;0>=a.R.Wg&&(a.R.Wg+=a.R.ln,a.be());a.R.Yg-=Q;if(0>=a.R.Yg){a.R.Yg+=a.R.Fk;break}}while(a.ha.Pb)}catch(W){wc(a);tc(a);
            a.be();a.za&&a.za.stop(la(),Cc(a));Xa(a,!1);$a(a,W.stack||W.message);return}d=setTimeout;e=a.Zp;a.R.kf=la();m=a.R.gn;a.R.Zg&&(m=Math.round(m*a.R.Zg/a.R.Fk));m-=a.R.kf-a.R.oi;if(n=a.R.kf-a.R.Wf)a.R.ye=Math.round(a.Fe/(10*n))/100,864E5<=n&&(a.nf=0,a.fa&&Ec(a.fa,!0),yc(a));if(0>m||a.R.ye<a.R.jf)m=0;a.R.Gk+=a.R.Zg;a.R.kf+=m;d(e,m)}else tc(a),a.be(),a.za&&a.za.stop(la(),Cc(a))}f.Kn=function(){return 0};
            function wc(a,b){a.ha.Uc&&(a.ha.lk=!0);a.yd-=a.A;a.A=0;Ac(a,a.Fe);a.Fe=0;if(a.ha.Pb){a.ha.Pb=!1;a.fa&&Dc(a.fa);var c=a.qa.run;c&&(c.textContent="Run")}a.ha.Ng=b}var h=-1,zb=1,yb=4,xb=16,wb=64,vb=128,ub=256,tb=512,sb=1024,rb=2048,nc=64,mc=32,Gc=ub|tb|sb,Hc=zb|yb|xb|wb|vb|rb,Ic=zb|yb|xb|wb|vb;
            function Jc(a,b,c,d){this.W=a;this.Sa=a.Sa;this.id=b;this.Cj=c||"";this.ta=0;this.Gb=65535;this.He=this.Gb+1;this.Ka=this.tc=this.Zh=this.Nb=this.type=this.xa=0;this.nd=h;this.ja=this.Hd=2;this.C=this.T=65535;this.um=this.id==Lc?Array(32):[];this.mk=null;this.ji=!1;Mc(this,!0,d)}var Lc=1;f=Jc.prototype;f.Fp=function(a){this.ta=a&65535;return this.xa=this.ta<<4};
            f.Ep=function(a,b){var c,d,e=this.W;a&=65535;a&4?(c=e.Le.xa,d=c+e.Le.Gb|0):(c=e.od,d=e.Ff);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),Nc(this,c,a,b);b||Oc.call(e,13,a)}return h};f.Dp=function(a){var b=this.W;a=b.pd+(a<<2);var c=b.ma(a);b.ca&=~(ub|tb);return this.load(b.ma(a+2))+c|0};f.Cp=function(a){var b=this.W;a<<=3;var c=b.pd+a|0;if(7<=(b.Gf-c|0))return Nc(this,c,a)+b.Sl;Oc.call(b,13,a|3,!0);return h};f.Yn=function(a){return this.xa+a|0};f.$n=function(a){return this.xa+a|0};
            f.Fm=function(a,b,c){return(a>>>0)+b<=this.He?this.xa+a|0:this.Uh(0,0,c)};f.Xn=function(a,b,c){return(a>>>0)+b>this.He?this.xa+a|0:this.Uh(0,0,c)};f.Uh=function(a,b,c){c||Oc.call(this.W,13,0);return h};f.Gm=function(a,b,c){return(a>>>0)+b<=this.He?this.xa+a|0:this.Vh(0,0,c)};f.Zn=function(a,b,c){return(a>>>0)+b>this.He?this.xa+a|0:this.Vh(0,0,c)};f.Vh=function(a,b,c){c||Oc.call(this.W,13,0);return h};
            function Pc(a,b,c){var d=a.W,e=d.ma(b+2),m=d.ma(b)|(e&255)<<16,d=d.ma(b+4);a.ta=c;a.xa=m;a.Gb=d;a.He=(d>>>0)+1;a.Nb=e;a.type=e&7936;a.Zh=0;a.nd=b;Mc(a,!0)}
            function Nc(a,b,c,d){var e=a.W,m=e.ma(b+0),n=e.ma(b+4),p=n&7936,v=e.ma(b+2)|(n&255)<<16,w=e.ma(b+6),G=c&65528;80386<=e.na&&(v|=(w&65280)<<16,m|=(w&15)<<16,w&128&&(m=m<<12|4095));for(;;){var Q,M,R;if(a.id==Lc){a.ji=!1;Q=a.mk;var W,ia;R=c&3;var ja=(n&24576)>>13;if(G&&!(n&32768)){d||Oc.call(e,11,c);v=h;break}if(6144<=p){R=c&3;if(R>a.Ka){if(!1!==Q&&!(ja==a.Ka||p&1024&&ja<=a.Ka)){v=h;break}G=e.Fa();Qc(e,e.Fa(),!0);t(e,G);a.ji=!0}W=!1}else{if(256==p){if(!Rc(a,c,Q)){v=h;break}return a.xa}if(1024==p)W=!0,
            ia=-1,M=c,R<a.Ka&&(R=a.Ka);else if(1536==p)W=!0,ia=~(16384|ub|tb),M=c|1;else if(1792==p)W=!0,ia=~(16384|ub),M=c|1;else if(1280==p){if(!Rc(a,v&65535,Q)){v=h;break}return a.xa}}if(W){b=v&65535;if(R<=ja){d=a.Ka;if(a.load(b,!0)===h){v=h;break}e.Sl=m;if(a.Ka<d){if(!0!==Q){v=h;break}G=q(e);m=0;for(n&=31;n--;)a.um[m++]=Sc(e,e.ra,G),G+=2;n=e.gb.xa;Q=(a.Ka<<2)+2;d=Q+2;R=e.ra.ta;M=q(e);Qc(e,e.ma(n+d),!0);t(e,e.ma(n+Q));u(e,R);for(u(e,M);m;)u(e,a.um[--m]);a.ji=!0}e.ca&=ia;return a.xa}d||Oc.call(e,13,M,!0);v=
            h;break}else if(!1!==W){d||Oc.call(e,13,c,!0);v=h;break}}else if(2==a.id){if(G){if(!(n&32768)){d||Oc.call(e,11,c);v=h;break}if(4096>p||2048==(p&2560)){d||Oc.call(e,13,c,!!n);v=h;break}}}else if(3==a.id){if(!(n&32768)){d||Oc.call(e,12,c);v=h;break}if(!G||4096>p||512!=(p&2560)){d||Oc.call(e,13,c,!0);v=h;break}}else if(4==a.id){if(!G||256!=p&&768!=p){d||Oc.call(e,10,c,!0);v=h;break}}else if(6==a.id&&!(p&4096)&&768<p){v=h;break}a.ta=c;a.xa=v;a.Gb=m;a.He=(m>>>0)+1;a.Nb=n;a.type=p;a.Zh=w;a.nd=b;Mc(a,!0);
            break}return v}
            function Rc(a,b,c){var d=a.W,e=d.gb.xa,m=a.Ka,n=d.gb.ta;if(!c){if(768!=d.gb.type)return Oc.call(d,10,b,!0),!1;d.Cb(d.gb.nd+4,d.gb.Nb&-769|256)}if(d.gb.load(b)===h)return!1;var p=d.gb.xa;if(!1===c){if(768!=d.gb.type)return Oc.call(d,13,b,!0),!1}else{if(768==d.gb.type)return Oc.call(d,13,b,!0),!1;d.Cb(d.gb.nd+4,d.gb.Nb|=768);d.gb.type=768}d.Cb(e+14,l(d));d.Cb(e+16,qb(d));d.Cb(e+18,d.F);d.Cb(e+20,d.G);d.Cb(e+22,d.H);d.Cb(e+24,d.D);d.Cb(e+26,q(d));d.Cb(e+28,d.L);d.Cb(e+30,d.K);d.Cb(e+32,d.J);d.Cb(e+34,
            d.Ra.ta);d.Cb(e+36,d.oa.ta);d.Cb(e+38,d.ra.ta);d.Cb(e+40,d.jb.ta);d.Le.load(d.ma(p+42));Tc(d,d.ma(p+16)|(c?16384:0));d.F=d.ma(p+18);d.G=d.ma(p+20);d.H=d.ma(p+22);d.D=d.ma(p+24);d.L=d.ma(p+28);d.K=d.ma(p+30);d.J=d.ma(p+32);d.Ra.load(d.ma(p+34));d.jb.load(d.ma(p+40));Uc(d,d.ma(p+14),d.ma(p+36));b=38;e=26;a.Ka<m&&(e=(a.Ka<<2)+2,b=e+2);Qc(d,d.ma(p+b),!0);t(d,d.ma(p+e));c&&d.Cb(p+0,n);d.Ab|=8;return!0}
            f.save=function(){return[this.ta,this.xa,this.Gb,this.Nb,this.id,this.Cj,this.Ka,this.tc,this.nd,this.Hd,this.T,this.ja,this.C,this.type,this.He]};f.restore=function(a){"number"==typeof a?this.load(a):(this.ta=a[0],this.xa=a[1],this.Gb=a[2],this.Nb=a[3],this.id=a[4],this.Cj=a[5],this.Ka=a[6],this.tc=a[7],this.nd=a[8],this.Hd=a[9]||2,this.T=a[10]||65535,this.ja=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Nb&7936,this.He=a[14]||(this.Gb>>>0)+1)};
            function Mc(a,b,c){void 0===c&&(c=!!(a.W.Ab&1));a.Of=!1;if(c){a.load=a.Ep;a.en=a.Cp;a.qc=a.Fm;a.lc=a.Gm;if(!(a.ta&-4))a.qc=a.Uh,a.lc=a.Vh;else if(a.type&4096){6144==(a.type&6656)&&(a.qc=a.Uh);if(a.type&2048||!(a.type&512))a.lc=a.Vh;1024==(a.type&3072)&&(a.qc==a.Fm&&(a.qc=a.Xn),a.lc==a.Gm&&(a.lc=a.Zn),a.Of=!0)}b&&(a.ta&-4&&a.nd!==h&&(b=a.nd+5,a.W.Me(b,a.W.vc(b)|1)),a.Ka=a.ta&3,a.tc=(a.Nb&24576)>>13,80386>a.W.na||!(a.Zh&64)?(a.ja=2,a.C=65535):(a.ja=4,a.C=-1),a.Hd=a.ja,a.T=a.C)}else a.load=a.Fp,a.en=
            a.Dp,a.qc=a.Yn,a.lc=a.$n,a.Ka=a.tc=0,a.nd=h}
            function Vc(a){this.na=a.model||8088;var b=0;switch(this.na){default:b=4772727;break;case 80286:b=6E6;break;case 80386:b=16E6}oc.call(this,a,b);this.im=61442;this.wh=Gc;this.vh=4;this.sb=255;this.B=80386==this.na?Wc:80286==this.na?Xc:Yc;this.Ia=Zc;this.mm=$c;this.nm=ad;this.om=bd;if(80186<=this.na&&(this.Ia=Zc.slice(),this.mm=$c.slice(),this.nm=ad.slice(),this.sb=31,this.Ia[15]=cd,this.Ia[96]=dd,this.Ia[97]=ed,this.Ia[98]=fd,this.Ia[99]=cd,this.Ia[100]=cd,this.Ia[101]=cd,this.Ia[102]=cd,this.Ia[103]=
            cd,this.Ia[104]=gd,this.Ia[105]=hd,this.Ia[106]=id,this.Ia[107]=jd,this.Ia[108]=kd,this.Ia[109]=ld,this.Ia[110]=md,this.Ia[111]=nd,this.Ia[192]=od,this.Ia[193]=pd,this.Ia[200]=qd,this.Ia[201]=rd,this.Ia[241]=sd,this.mm[7]=td,this.nm[7]=td,80286<=this.na)){this.im=2;this.wh|=28672;this.vh=0;this.Ia[15]=ud;this.vg=vd.slice();for(a=0;a<this.vg.length;a++)this.vg[a]||(this.vg[a]=wd);this.Ia[84]=xd;this.Ia[99]=yd;if(80386<=this.na){var c;this.Ia[100]=zd;this.Ia[101]=Ad;this.Ia[102]=Bd;this.Ia[103]=Cd;
            for(c in x)this.vg[+c]=x[c]}}this.zh=[];this.km=[];this.yd=this.Rh=0;this.ha.Ng=this.ha.po=!1;this.Bm=0;this.Re=this.ka=[];this.Aa=this.nb=this.Ea=this.Td=this.Yc=this.vb=this.Wd=0;Dd(this)}Pa(Vc,oc);
            var Yc={gh:4,N:5,aa:6,Y:7,Z:8,I:9,O:11,P:12,De:4,Kk:60,Lk:83,Qb:3,rb:9,dc:16,eh:1,Sk:19,Uk:28,Wk:16,Vk:21,Tk:37,Qk:2,Bi:9,Rk:5,Pk:33,Di:10,Ci:8,Zf:3,Yf:15,jl:51,kl:1,ll:2,ml:4,il:32,Ei:15,ol:15,Ba:16,Ca:4,ql:11,pl:18,nl:24,zb:4,rl:2,lf:16,sl:17,Ji:18,tl:19,Ii:5,Ki:6,yl:2,xl:8,vl:9,wl:10,ul:10,Li:10,Mi:10,Yk:80,$k:144,Xk:86,Zk:154,bl:101,dl:165,al:107,cl:171,Al:70,Cl:113,zl:76,Bl:124,fl:80,hl:128,el:86,gl:134,ag:3,$f:16,Ti:10,Si:8,Dl:51,Rb:8,El:17,Fl:36,mc:11,Gl:16,Ee:10,Kc:2,yi:18,zi:7,Ai:15,Fi:12,
            Gi:7,Hi:11,Ni:18,Oi:7,Pi:15,Ui:15,Vi:7,Wi:13,bj:11,cj:7,dj:8,Hl:8,Kl:12,Il:18,Jl:17,Ll:15,Yi:8,Xi:20,Zi:2,gj:3,bg:9,fj:5,ej:11,ij:4,hj:17,Ml:11},Xc={gh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,De:3,Kk:14,Lk:16,Qb:2,rb:7,dc:7,eh:0,Sk:7,Uk:13,Wk:7,Vk:11,Tk:16,Qk:3,Bi:6,Rk:2,Pk:13,Di:5,Ci:5,Zf:2,Yf:7,jl:23,kl:0,ll:1,ml:3,il:17,Ei:7,ol:11,Ba:7,Ca:3,ql:7,pl:11,nl:15,zb:2,rl:3,lf:7,sl:8,Ji:8,tl:8,Ii:4,Ki:4,yl:2,xl:3,vl:5,wl:2,ul:3,Li:5,Mi:3,Yk:14,$k:22,Xk:17,Zk:25,bl:17,dl:25,al:20,cl:28,Al:13,Cl:21,zl:16,Bl:24,
            fl:13,hl:21,el:16,gl:24,ag:2,$f:7,Ti:5,Si:5,Dl:19,Rb:5,El:5,Fl:17,mc:3,Gl:5,Ee:3,Kc:0,yi:8,zi:5,Ai:9,Fi:5,Gi:5,Hi:4,Ni:5,Oi:5,Pi:4,Ui:7,Vi:5,Wi:8,bj:3,cj:4,dj:3,Hl:11,Kl:11,Il:15,Jl:15,Ll:7,Yi:5,Xi:8,Zi:0,gj:2,bg:6,fj:3,ej:6,ij:3,hj:5,Ml:5},Wc={gh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,De:3,Kk:14,Lk:16,Qb:2,rb:7,dc:7,eh:0,Sk:7,Uk:13,Wk:7,Vk:11,Tk:16,Qk:3,Bi:6,Rk:2,Pk:13,Di:5,Ci:5,Zf:2,Yf:7,jl:23,kl:0,ll:1,ml:3,il:17,Ei:7,ol:11,Ba:7,Ca:3,ql:7,pl:11,nl:15,zb:2,rl:3,lf:7,sl:8,Ji:8,tl:8,Ii:4,Ki:4,yl:2,xl:3,vl:5,
            wl:2,ul:3,Li:5,Mi:3,Yk:14,$k:22,Xk:17,Zk:25,bl:17,dl:25,al:20,cl:28,Al:13,Cl:21,zl:16,Bl:24,fl:13,hl:21,el:16,gl:24,ag:2,$f:7,Ti:5,Si:5,Dl:19,Rb:5,El:5,Fl:17,mc:3,Gl:5,Ee:3,Kc:0,yi:8,zi:5,Ai:9,Fi:5,Gi:5,Hi:4,Ni:5,Oi:5,Pi:4,Ui:7,Vi:5,Wi:8,bj:3,cj:4,dj:3,Hl:11,Kl:11,Il:15,Jl:15,Ll:7,Yi:5,Xi:8,Zi:0,gj:2,bg:6,fj:3,ej:6,ij:3,hj:5,Ml:5,on:11,Ok:6,Mk:8,Nk:5,Tp:3,Rp:6,Sp:6,qn:9,pn:12,Ri:3,Qi:6,Vp:4,Up:5,aj:3,$i:7};f=Vc.prototype;
            f.yk=function(a,b){this.ka=this.Re=a;this.Aa=b;this.nb=1<<this.Aa;this.Ea=this.nb-1;this.Td=a.length;this.Yc=this.Td-1};function Ed(a){if(a.ka===a.Re){a.ka=Array(a.Td);a.Zj=new r(null,0,0,5,null,a);for(var b=0;b<a.Td;b++)a.ka[b]=a.Zj}else for(b=0;b<a.xh.length;b++)a.ka[a.xh[b]]=a.Zj;a.xh=[]}
            function lc(a,b,c,d){var e=(b&-4194304)>>>20,m=a.Re[(a.kh+e&a.vb)>>>a.Aa],n=m.yc(e);if(!(n&1))return d||Fd.call(a,b,!1,c),null;if(!(n&4)&&3==a.oa.Ka)return d||Fd.call(a,b,!0,c),null;var p=(b&4190208)>>>10,n=a.Re[((n&-4096)+p&a.vb)>>>a.Aa],v=n.yc(p);if(!(v&1||d))return d||Fd.call(a,b,!1,c),null;if(!(v&4)&&3==a.oa.Ka)return d||Fd.call(a,b,!0,c),null;c=a.Re[((v&-4096)+(b&4095)&a.vb)>>>a.Aa];if(d)return c;d=new r(b&-4096,0,0,6);bc(d,c,m,e,n,p);b>>>=a.Aa;a.ka[b]=d;a.xh.push(b);return d}
            f.reset=function(){this.ha.Pb&&wc(this);Dd(this);rc(this);this.ha.wd=!1};
            function Dd(a){a.F=0;a.D=0;a.G=0;a.H=0;a.Dd=0;a.L=0;a.K=0;a.J=0;a.Ob=!1;a.fb=a.Zb=0;a.kd=0;a.Lh=0;a.Ab=65520;a.pd=0;a.Gf=1023;a.ca=a.xi=0;a.kg=a.rh=a.jg=a.lg=0;a.ui=-1;a.oa=new Jc(a,Lc,"CS");a.jb=new Jc(a,2,"DS");a.Ra=new Jc(a,2,"ES");a.ra=new Jc(a,3,"SS");t(a,0);Qc(a,0);80386<=a.na&&(a.H=772,a.Ab=16,a.tj=0,a.jh=0,a.kh=0,a.qm=Array(8),a.rm=Array(8),a.Yd=new Jc(a,2,"FS"),a.Zd=new Jc(a,2,"GS"));a.In=new Jc(a,0,"NULL");a.da=a.jb;a.ga=a.ra;a.Q=a.va=0;a.U=a.Ga=h;a.kb=0;Uc(a,0,65535);if(80286<=a.na){a.od=
            0;a.Ff=65535;a.Le=new Jc(a,5,"LDT",!0);a.gb=new Jc(a,4,"TSS",!0);a.Jb=new Jc(a,6,"VER",!0);Uc(a,65520,61440);var b,c=l(a);b=a.oa;var d=-65536;80386>b.W.na&&(d&=16777215);b=b.xa=d;a.pa=b+c|0;a.oh=b+a.oa.Gb|0}Tc(a,0);Id(a)}function Jd(a){2==a.Hd?(a.Xm=a.ma,a.Ec=y,a.Mc=Kd,a.ge=Ld,a.Ha=z,a.tb=Md,a.Dc=Nd):(a.Xm=a.Qg,a.Ec=A,a.Mc=Od,a.ge=Pd,a.Ha=B,a.tb=Qd,a.Dc=Rd)}function Sd(a,b){a.ja!=b&&(a.va|=4096,a.ja=b,a.C=2==b?65535:-1,Td(a))}
            function Td(a){2==a.ja?(a.dataType=32768,a.ve=a.ma,a.tf=a.Cb):(a.dataType=-2147483648,a.ve=a.Qg,a.tf=a.Fj)}function Ud(a){a.Hd=a.oa.Hd;a.T=a.oa.T;Jd(a);a.ja=a.oa.ja;a.C=a.oa.C;Td(a);a.va&=-12289}f.Ym=function(){var a=this.F+this.D+this.G+this.H+q(this)+this.L+this.K+this.J|0;return a=a+l(this)+this.oa.ta+this.jb.ta+this.ra.ta+this.Ra.ta+qb(this)|0};function Vd(a,b,c,d){void 0!==d&&(void 0===a.zh[b]&&(a.zh[b]=[]),a.zh[b].push([c,d]))}
            function Wd(a,b){var c=a.km[b];null!=c&&(c(--a.Rh),delete a.km[b])}function Id(a,b){void 0===b&&(b=!!(a.Ab&1));a.om=b?Xd:bd;Mc(a.oa);Mc(a.jb);Mc(a.ra);Mc(a.Ra);80386<=a.na&&(Mc(a.Yd),Mc(a.Zd),Ud(a))}
            f.save=function(){var a=new Yd(this);a.set(0,[this.F,this.D,this.G,this.H,q(this),this.L,this.K,this.J]);var b=l(this),c=this.oa.save(),d=this.jb.save(),e=this.ra.save(),m=this.Ra.save(),n;null!=this.od?(n=[this.Ab,this.od,this.Ff,this.pd,this.Gf,this.Le.save(),this.gb.save(),this.xi],n.push(this.tj),n.push(this.jh),n.push(this.kh),n.push(this.qm),n.push(this.rm)):n=null;b=[b,c,d,e,m,n,qb(this)];80386<=this.na&&(b.push(this.Yd.save()),b.push(this.Zd.save()));a.set(1,b);a.set(2,[this.da.Cj,this.ga.Cj,
            this.Q,this.va,this.kb,this.U,this.Ga]);a.set(3,[0,this.nf,this.R.Be]);a.set(4,Pb(this.la));return a.data()};
            f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.oa.restore(b[1]);this.jb.restore(b[2]);this.ra.restore(b[3]);this.Ra.restore(b[4]);var d=b[5];d&&d.length&&(this.Ab=d[0],this.od=d[1],this.Ff=d[2],this.pd=d[3],this.Gf=d[4],this.Le.restore(d[5]),this.gb.restore(d[6]),this.xi=d[7],80386<=this.na&&(this.tj=d[8],this.jh=d[9],this.kh=d[10],this.qm=d[11],this.rm=d[12]),Id(this));Tc(this,b[6]);Uc(this,b[0],this.oa.ta);
            t(this,c);Qc(this,this.ra.ta);80386<=this.na&&(this.Yd.restore(b[7]),this.Zd.restore(b[8]));b=a[2];this.da=null!=b[0]&&Zd(this,b[0])||this.jb;this.ga=null!=b[1]&&Zd(this,b[1])||this.ra;this.Q=b[2];this.va=b[3];this.kb=b[4];this.U=b[5];this.Ga=b[6];b=a[3];this.nf=b[1];yc(this,b[2]);a:{b=this.la;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.jn){for(var m=0,n=Array(b.jn),p=0;p<e.length-1;)for(var v=e[p++],w=e[p++];v--;)n[m++]=w;e=n}m=b.ka[d];if(!m||!m.restore(e)){sa("Unable to restore memory block "+
            d);b=!1;break a}}void 0!==a[c]&&Hb(b,a[c]);b=!0}return b};function Zd(a,b){switch(b){case "CS":return a.oa;case "DS":return a.jb;case "SS":return a.ra;case "ES":return a.Ra;case "NULL":return a.In;default:return[0,b,0,0,""]}}function $d(a,b){var c=l(a);a.pa=a.oa.load(b)+c|0;a.oh=a.oa.xa+a.oa.Gb|0;Ud(a);a.Q|=a.vh}function ae(a,b){a.jb.load(b);a.Q|=a.vh}
            function Qc(a,b,c){var d=q(a);a.Ac=a.ra.load(b)+d|0;a.ra.Of?(a.Tl=a.ra.xa+a.ra.T|0,a.Ul=a.ra.xa+a.ra.Gb|0):(a.Tl=a.ra.xa+a.ra.Gb|0,a.Ul=a.ra.xa);c||(a.Q|=4)}function be(a,b){a.Ra.load(b);a.Q|=a.vh}function l(a){return a.pa-a.oa.xa|0}function C(a,b){a.pa=a.oa.xa+(b&a.C)|0}function Uc(a,b,c,d){a.oa.mk=d;a.Sl=b;b=a.oa.load(c);return b!==h?(a.pa=b+(a.Sl&a.C)|0,a.oh=b+a.oa.Gb|0,Ud(a),a.oa.ji):null}
            function ce(a,b){a.pa=a.pa+b|0;var c=a.oh-a.pa|0;0>c&&0<=(a.oh^a.pa)&&(8088>=a.na||a.oa.Gb==a.oa.T?C(a,a.pa-a.oa.xa):-1>c&&Oc.call(a,13,0))}function q(a){return a.Dd&~a.ra.T|a.Ac-a.ra.xa}function t(a,b){a.Dd=b;a.Ac=a.ra.xa+(b&a.ra.T)|0}function de(a,b,c,d,e,m){if(63!=(e&63)&&e!=a.resultType){var n=(e^a.resultType)&a.resultType;n&&(n&1&&ee(a),n&2&&fe(a),n&4&&ge(a),n&8&&he(a),n&16&&ie(a),n&32&&je(a))}m?(a.kg=d,a.jg=b):(a.kg=b,a.jg=d);a.rh=c;a.lg=d;a.resultType=e}
            function D(a,b,c,d,e){a.resultType=c|26;a.lg=b;d?ke(a):le(a);e?me(a):ne(a);return b}function oe(a,b,c,d){c&d?ke(a):le(a);(b^c)&d?me(a):ne(a)}function pe(a){return ee(a)?1:0}function ee(a){a.resultType&1&&(a.ca&=~zb,(a.kg^(a.kg^a.rh)&(a.rh^a.jg))&a.resultType&-2147450752&&(a.ca|=zb),a.resultType&=-2);return a.ca&zb}function fe(a){a.resultType&2&&(a.ca&=~yb,38505>>((a.lg^a.lg>>4)&15)&1&&(a.ca|=yb),a.resultType&=-3);return a.ca&yb}
            function ge(a){a.resultType&4&&(a.ca&=~xb,(a.jg^a.kg^a.rh)&16&&(a.ca|=xb),a.resultType&=-5);return a.ca&xb}function he(a){a.resultType&8&&(a.ca&=~wb,a.lg&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.ca|=wb),a.resultType&=-9);return a.ca&wb}function ie(a){a.resultType&16&&(a.ca&=~vb,a.lg&a.resultType&-2147450752&&(a.ca|=vb),a.resultType&=-17);return a.ca&vb}
            function je(a){a.resultType&32&&(a.ca&=~rb,(a.kg^a.jg)&(a.rh^a.jg)&a.resultType&-2147450752&&(a.ca|=rb),a.resultType&=-33);return a.ca&rb}function le(a){a.resultType&=-2;a.ca&=~zb}function qe(a){a.resultType&=-5;a.ca&=~xb}function re(a){a.resultType&=-9;a.ca&=~wb}function ne(a){a.resultType&=-33;a.ca&=~rb}function ke(a){a.resultType&=-2;a.ca|=zb}function se(a){a.resultType&=-5;a.ca|=xb}function te(a){a.resultType&=-9;a.ca|=wb}function me(a){a.resultType&=-33;a.ca|=rb}
            function qb(a){return a.ca&~Hc|ee(a)|fe(a)|ge(a)|he(a)|ie(a)|je(a)}function ue(a,b){b=b|a.Ab&1|65520;a.Ab=a.Ab&-65536|b&65535;a.Ab&1&&Id(a,!0)}function Tc(a,b,c){a.Ab&1||(b&=-61441);void 0===c&&(c=a.oa.Ka);c?b=b&-12289|a.ca&12288:a.xi=(b&12288)>>12;c>a.xi&&(b=b&~tb|a.ca&tb);a.resultType=128;a.ca=a.ca&~(a.wh|Hc)|b&(a.wh|Hc)|a.im;a.ca&ub&&(a.kb|=2,a.Q|=4)}
            f.Kb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.qa[b]=c;this.Bm++;d=!0;break;default:d=this.parent.Kb.call(this,a,b,c)}return d};
            f.vc=function(a){return this.ka[(a&this.Wd)>>>this.Aa].xc(a&this.Ea,a)};f.ma=function(a){var b=a&this.Ea,c=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;return b<this.Ea?this.ka[c].sj(b,a):this.ka[c].xc(b,a)|this.ka[c+1&this.Yc].xc(0,a+1)<<8};f.Qg=function(a){var b=a&this.Ea,c=(a&this.Wd)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.Yc].yc(0,a+3)<<32-d};f.Me=function(a,b){this.ka[(a&this.Wd)>>>this.Aa].Bc(a&this.Ea,b&255,a)};
            f.Cb=function(a,b){var c=a&this.Ea,d=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;c<this.Ea?this.ka[d].Jj(c,b&65535,a):(this.ka[d++].Bc(c,b&255,a),this.ka[d&this.Yc].Bc(0,b>>8&255,a+1))};f.Fj=function(a,b){var c=a&this.Ea,d=(a&this.Wd)>>>this.Aa;this.A-=this.B.gh;if(c<this.Ea-2)this.ka[d].Qe(c,b,a);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Qe(c,e&~(-1<<m)|b<<m,a);d=d+1&this.Yc;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Qe(0,e&-1<<m|b>>>32-m,a)}};
            function ve(a,b,c){a.uh=b;a.U=b.qc(a.ih=c,1);return a.Q&1?0:a.vc(a.U)}function E(a,b){return ve(a,a.da,b&a.T)}function F(a,b){return ve(a,a.ga,b&a.T)}function we(a,b,c){a.uh=b;a.U=b.qc(a.ih=c,a.ja);return a.Q&1?0:a.ve(a.U)}function H(a,b){return we(a,a.da,b&a.T)}function I(a,b){return we(a,a.ga,b&a.T)}function xe(a,b,c){a.uh=b;a.Ga=a.U=b.qc(a.ih=c,1);return a.Q&1?0:a.vc(a.U)}function J(a,b){return xe(a,a.da,b&a.T)}function K(a,b){return xe(a,a.ga,b&a.T)}
            function ye(a,b,c){a.uh=b;a.Ga=a.U=b.qc(a.ih=c,a.ja);return a.Q&1?0:a.ve(a.U)}function L(a,b){return ye(a,a.da,b&a.T)}function N(a,b){return ye(a,a.ga,b&a.T)}function O(a,b){a.Q&2||a.Me(a.uh.lc(a.ih,1),b)}function P(a,b){a.Q&2||a.tf(a.uh.lc(a.ih,a.ja),b)}function Sc(a,b,c){return a.ve(b.qc(c,a.ja))}f.S=function(){var a=this.vc(this.pa);ce(this,1);return a};function ze(a){var b=a.ma(a.pa);ce(a,2);return b}function S(a){var b=a.Xm(a.pa);ce(a,a.Hd);return b}
            f.ia=function(){var a=this.ve(this.pa);ce(this,this.ja);return a};f.M=function(){var a=this.vc(this.pa)<<24>>24;ce(this,1);return a};function T(a,b){var c=a.vc(a.pa);ce(a,1);return Ae[c].call(a,b)}f.Fa=function(){var a=this.ve(this.Ac);this.Ac=this.Ac+this.ja|0;var b=this.Tl-this.Ac|0;0>b&&0<=(this.Tl^this.Ac)&&(8088>=this.na||!this.ra.Of&&this.ra.Gb==this.ra.T||this.ra.Of&&!this.ra.Gb?t(this,this.Ac-this.ra.xa&this.ra.T):-1>b&&Oc.call(this,12,0));return a};
            function u(a,b){a.Ac=a.Ac-a.ja|0;0>(a.Ac-a.Ul|0)&&0<=(a.Ul^a.Ac)&&(8088>=a.na||!a.ra.Of&&a.ra.Gb==a.ra.T||a.ra.Of&&!a.ra.Gb?t(a,a.Ac-a.ra.xa&a.ra.T):Oc.call(a,12,0));a.tf(a.Ac,b)}function Be(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.na)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.qa[b]&&(void 0===c&&($a(a,"Value for "+b+" is invalid"),wc(a)),d=!a.ha.Pb||a.ha.Nm?da(c,d):"--------".substr(0,d),a.qa[b].textContent!=d&&(a.qa[b].textContent=d))}
            f.be=function(a){if(this.Bm&&(a||!this.ha.Pb||this.ha.Nm)){Be(this,"EAX",this.F);Be(this,"EBX",this.D);Be(this,"ECX",this.G);Be(this,"EDX",this.H);Be(this,"ESP",q(this));Be(this,"EBP",this.L);Be(this,"ESI",this.K);Be(this,"EDI",this.J);Be(this,"CS",this.oa.ta);Be(this,"DS",this.jb.ta);Be(this,"SS",this.ra.ta);Be(this,"ES",this.Ra.ta);Be(this,"EIP",l(this));var b=qb(this);Be(this,"PS",b);Be(this,"V",b&rb);Be(this,"D",b&sb);Be(this,"I",b&tb);Be(this,"T",b&ub);Be(this,"S",b&vb);Be(this,"Z",b&wb);Be(this,
            "A",b&xb);Be(this,"P",b&yb);Be(this,"C",b&zb)}if(b=this.qa.speed)b.textContent=pb(this);this.parent.be.call(this,a)};
            f.Kn=function(a){this.ha.Ng=!0;this.ha.po=!1;this.ha.Tm=!1;this.yd=this.A=a;this.fa&&!a&&Ec(this.fa);a||(this.Q|=4);do{if(a=this.Q&12528)this.va|=a;else if(this.Ib=this.pa,this.da=this.jb,this.ga=this.ra,this.U=this.Ga=h,this.va&12288&&Ud(this),this.va=this.Q&256,this.kb){a:{if(!(this.Q&4)){a=80286>this.na?0:1;for(var b=0;2>b;b++){switch(a){case 0:if(this.kb&1&&this.ca&tb){var c=Ce(this.fa);if(-1<=c&&(this.kb&=-2,0<=c)){this.kb&=-5;De.call(this,c,null,11);break a}}break;case 1:if(this.kb&2){this.kb&=
            -3;De.call(this,1,null,11);break a}}a=1-a}}if(a=this.kb&8){a=this.fa;b=!1;for(c=0;c<a.$a;c++)for(var d=a.$a[c],e=0;e<d.Db.length;e++){var m=d.Db[e];m.Sd||(Ee(a,m),m.Sd||(b=!0))}a=!b}a&&(this.kb&=-9)}if(this.kb&4){this.Q=this.A=0;break}}this.Q=0;this.Ia[this.S()].call(this)}while(0<this.A);return this.ha.Ng?this.yd-this.A:void 0===this.ha.Ng?0:-1};Da(function(){for(var a=Wa(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Vc(d);Va(d,c)}});
            function Fe(a,b){var c=a+b+pe(this)|0;de(this,a,b,c,191);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function Ge(a,b){var c=a+b+pe(this)|0;de(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function He(a,b){var c=a+b|0;de(this,a,b,c,191);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}
            function Ie(a,b){var c=a+b|0;de(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function Je(a,b){var c=a&b;D(this,c,128);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c}function Ke(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a&b,this.dataType)}function Le(a,b){this.A-=10+(this.U===h?0:1);if((a&3)<(b&3))return a=a&-4|b&3,te(this),a;re(this);return a}
            function Me(a){if(this.U===h)return cd.call(this),a;var b=a,c=this.ve(this.U),d=this.ve(this.U+this.ja);2==this.ja&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Pk;if(b<c||b>d)C(this,this.Ib-this.oa.xa),De.call(this,5,null,0);this.Q|=2;return a}function Ne(a,b){var c=0;if(b){re(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else te(this);this.A-=this.B.on+3*c;return a}
            function Oe(a,b){var c=0;if(b){re(this);for(var d=2==this.ja?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else te(this);this.A-=this.B.on+3*c;return a}function Pe(a,b){a&1<<(b&31)?ke(this):le(this);this.A-=this.U===h?this.B.Tp:this.B.Rp;this.Q|=2;return a}function Qe(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a^c}function Te(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a&~c}
            function Ue(a,b){var c=1<<(b&31);a&c?ke(this):le(this);this.A-=this.U===h?this.B.Ok:this.B.Mk;return a|c}function Ve(a,b){var c=this.oa.ta,d=l(this);null!=Uc(this,a,b,!0)&&(u(this,c),u(this,d))}function We(a,b){de(this,a,b,a-b|0,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.Bi:this.B.rb;this.Q|=2;return a}function Xe(a,b){de(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.Bi:this.B.rb;this.Q|=2;return a}
            function Ye(a){var b=(a&this.C)-1|0;de(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function Ze(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
            function $e(a,b,c){this.Ob=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<Ze(a,c);){var m=b=c;b[0]+=m[0];b[1]+=m[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=Ze(a,c)&&(b=a,m=c,b[0]-=m[0],b[1]-=m[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.fb=d;this.Zb=a[0];this.Ob=!0}}function af(a){return a}
            function bf(a,b){a=this.S();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?21:24;return c&65535}function cf(a,b){var c,d;a=this.ia();2==this.ja?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(ke(this),me(this)):(le(this),ne(this));d&=this.C;this.A-=this.U===h?21:24;return d}
            function df(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.qn:this.B.pn;return c&65535}function ef(a,b){var c=a*b;2147483647<c||-2147483648>c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.qn:this.B.pn;return c|0}function ff(a){var b=(a&this.C)+1|0;de(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
            function De(a,b,c){this.A-=this.B.jl+c;this.oa.mk=!0;c=qb(this);var d=this.oa.ta,e=l(this);a=this.oa.en(a);a!==h&&(u(this,c),u(this,d),u(this,e),null!=b&&u(this,b),this.ui=-1,this.pa=a,this.oh=this.oa.xa+this.oa.Gb|0,Ud(this))}function gf(a,b){this.A-=14+(this.U===h?0:2);re(this);this.Jb.load(b,!0)!==h&&this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(b&3)&&(te(this),a=this.Jb.Nb&-256,2<this.ja&&(a|=(this.Jb.Zh&-65281)<<16));return a}
            function hf(a,b){if(this.U===h)return wd.call(this),a;ae(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}function jf(a){if(this.U===h)return wd.call(this),a;this.A-=this.B.rl;return this.U}function kf(a,b){if(this.U===h)return wd.call(this),a;be(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}function lf(a,b){if(this.U===h)return wd.call(this),a;var c=this.ma(this.U+this.ja);this.Yd.load(c);this.A-=this.B.lf;return b}
            function mf(a,b){if(this.U===h)return wd.call(this),a;var c=this.ma(this.U+this.ja);this.Zd.load(c);this.A-=this.B.lf;return b}function nf(a,b){this.A-=14+(this.U===h?0:2);if(b&65528&&this.Jb.load(b,!0)!==h&&(7168==(this.Jb.Nb&7168)||this.Jb.tc>=this.oa.Ka)&&this.Jb.tc>=(b&3))return te(this),this.Jb.Gb;re(this);return a}function of(a,b){if(this.U===h)return wd.call(this),a;Qc(this,this.ma(this.U+this.ja));this.A-=this.B.lf;return b}
            function pf(a,b){this.A-=this.Ga===h?this.U===h?this.B.yl:this.B.xl:this.B.vl;return b}function qf(a,b){return b}function rf(){this.Ga!==h&&Sd(this,2);return pf.call(this,0,this.kd)}function sf(a,b){var c=b&65535,d=b>>>16,e=a&65535,m=a>>>16,n=c*e,e=(n>>>16)+d*e,p=e>>>16,e=(e&65535)+c*m;this.Ob=!0;this.fb=e<<16|n&65535;this.Zb=p+((e>>>16)+d*m)|0}function tf(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a|b,128)}
            function uf(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a|b,this.dataType)}function vf(a){var b=this.Fa(),c=this.Fa();(a<<=this.ja>>2)&&t(this,q(this)+a);Uc(this,b,c,!1)&&(a&&t(this,q(this)+a),this.jb.ta&65528&&this.jb.tc<this.oa.Ka&&7168!=(this.jb.Nb&7168)&&this.jb.load(0),this.Ra.ta&65528&&this.Ra.tc<this.oa.Ka&&7168!=(this.Ra.Nb&7168)&&this.Ra.load(0));2==a&&this.Rh&&Wd(this,this.pa)}
            function wf(a,b){var c=a-b-pe(this)|0;de(this,a,b,c,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function xf(a,b){var c=a-b-pe(this)|0;de(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function yf(a){this.Q|=1;this.Mc[this.S()].call(this,a);this.A-=this.U===h?this.B.Vp:this.B.Up}function zf(){return je(this)?1:0}function Af(){return ee(this)?1:0}function Bf(){return ee(this)?0:1}
            function Cf(){return he(this)?1:0}function Df(){return he(this)?0:1}function Ef(){return ee(this)||he(this)?1:0}function Ff(){return ee(this)||he(this)?0:1}function Gf(){return ie(this)?1:0}function Hf(){return ie(this)?0:1}function If(){return fe(this)?1:0}function Jf(){return fe(this)?0:1}function Kf(){return!ie(this)!=!je(this)?1:0}function Lf(){return!ie(this)!=!je(this)?0:1}function Mf(){return he(this)||!ie(this)!=!je(this)?1:0}function Nf(){return he(this)||!ie(this)!=!je(this)?0:1}
            function Of(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;D(this,a,32768,d&32768)}return a}function Pf(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;D(this,a,-2147483648,d&-2147483648)}return a}function Qf(a,b){return Of.call(this,a,b,this.S())}function Rf(a,b){return Pf.call(this,a,b,this.S())}function Sf(a,b){return Of.call(this,a,b,this.G&31)}function Tf(a,b){return Pf.call(this,a,b,this.G&31)}
            function Uf(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;D(this,a,32768,d&1)}return a}function Vf(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;D(this,a,-2147483648,d&1)}return a}function Wf(a,b){return Uf.call(this,a,b,this.S())}function Xf(a,b){return Vf.call(this,a,b,this.S())}function Yf(a,b){return Uf.call(this,a,b,this.G&31)}function Zf(a,b){return Vf.call(this,a,b,this.G&31)}
            function $f(a,b){var c=a-b|0;de(this,a,b,c,191,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&255}function ag(a,b){var c=a-b|0;de(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c&this.C}function bg(a,b){D(this,a&b,128);this.A-=this.Ga===h?this.U===h?this.B.gj:this.B.bg:this.B.bg;this.Q|=2;return a}function cg(a,b){D(this,a&b,32768);this.A-=this.Ga===h?this.U===h?this.B.gj:this.B.bg:this.B.bg;this.Q|=2;return a}
            function dg(a,b){if(this.U===h){switch(this.Lh&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.ij}else this.Ga=this.U,O(this,a),this.A-=this.B.hj;return b}
            function eg(a,b){if(this.U===h){switch(this.Lh&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:t(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.ij}else this.Ga=this.U,P(this,a),this.A-=this.B.hj;return b}function fg(a,b){var c=a^b;D(this,c,128);this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return c}
            function gg(a,b){this.A-=this.Ga===h?this.U===h?this.B.Qb:this.B.rb:this.B.dc;return D(this,a^b,this.dataType)}function hg(a){Oc.call(this,13,0);return a}function td(a){cd.call(this);return a}function U(a){wd.call(this);return a}function ig(){C(this,this.Ib-this.oa.xa);De.call(this,0,null,2)}function jg(){this.A-=this.U===h?2:this.B.Ll;return 1}function kg(){var a=this.G&255;this.A-=(this.U===h?this.B.Yi:this.B.Xi)+(a<<this.B.Zi);return a}
            function lg(){var a=this.S();this.A-=(this.U===h?this.B.Yi:this.B.Xi)+(a<<this.B.Zi);return a}function mg(){return null}function Oc(a,b,c){if(this.ha.Ng){var d=!1;if(80186<=this.na)if(0>this.ui)C(this,this.Ib-this.oa.xa),d=!0;else if(8!=this.ui)b=0,a=8,d=!0;else{ng.call(this,-1,0,c);Dd(this);return}ng.call(this,a,b,c)&&(d=!1);d&&De.call(this,this.ui=a,b,0);this.Q|=3}else this.nc("Fault "+ea(a)+" blocked by Debugger",1073741824),C(this,this.Ib-this.oa.xa)}
            function Fd(a,b,c){this.jh=a;a=0;b&&(a|=1);c&&(a|=2);3==this.oa.Ka&&(a|=4);Oc.call(this,14,a)}
            function ng(a,b,c){var d=32,e;a:{e=this.pa;var m=this.ka[(e&this.Wd)>>>this.Aa];if(5==m.type&&(m=lc(this,e,!1,!0),!m)){e=null;break a}e=m.rj(e&this.Ea,e)}204==e&&(c=!1,d|=1);983040<=this.pa&&1048575>=this.pa&&(c=!1);c&&(a=(c?"\n":"")+"Fault "+ea(a)+(null!=b?" (0x"+da(b,4)+")":"")+" on opcode "+ea(e)+" at "+this.Sa.dt(l(this),this.oa.ta)+" (%"+da(this.pa,6)+")",b=this.ha.Pb,this.nc(a,d)?c&&(c=b,wc(this.Sa)):(this.wa(a),wc(this)));return c}function ud(){this.vg[this.S()].call(this)}
            function xd(){u(this,q(this)&this.C);this.A-=this.B.mc}function dd(){var a=q(this)&this.C;u(this,this.F&this.C);u(this,this.G&this.C);u(this,this.H&this.C);u(this,this.D&this.C);u(this,a);u(this,this.L&this.C);u(this,this.K&this.C);u(this,this.J&this.C);this.A-=this.B.Fl}
            function ed(){this.J=this.J&~this.C|this.Fa();this.K=this.K&~this.C|this.Fa();this.L=this.L&~this.C|this.Fa();t(this,q(this)+this.ja);this.D=this.D&~this.C|this.Fa();this.H=this.H&~this.C|this.Fa();this.G=this.G&~this.C|this.Fa();this.F=this.F&~this.C|this.Fa();this.A-=this.B.Dl}function fd(){this.Ha[this.S()].call(this,Me)}function yd(){this.tb[this.S()].call(this,Le)}function zd(){this.Q|=20;this.da=this.ga=this.Yd;this.A-=this.B.Kc;wc(this)}
            function Ad(){this.Q|=20;this.da=this.ga=this.Zd;this.A-=this.B.Kc;wc(this)}function Bd(){this.Q|=4096;this.ja^=6;this.C^=-65536;Td(this);this.A-=this.B.Kc}function Cd(){this.Q|=8192;this.Hd^=6;this.T^=-65536;Jd(this);this.A-=this.B.Kc}function gd(){u(this,this.ia());this.A-=this.B.mc}function hd(){this.Ha[this.S()].call(this,cf)}function id(){u(this,this.S());this.A-=this.B.mc}function jd(){this.Ha[this.S()].call(this,bf)}
            function kd(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Tb(this.la,this.H,this.pa-b-1);this.Me(this.Ra.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
            function ld(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){for(var d=this.pa-b-1,e=0,m=0,n=0;n<this.ja;n++)e|=Tb(this.la,this.H,d)<<m,m+=8;d=e;this.tf(this.Ra.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
            function md(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=this.vc(this.jb.qc(this.K&this.T,1));this.K=this.K&~this.T|this.K+(this.ca&sb?-1:1)&this.T;this.A-=c;Vb(this.la,this.H,d,this.pa-b-1);this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}
            function nd(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Sc(this,this.jb,this.K&this.T);this.K=this.K&~this.T|this.K+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;for(var c=this.pa-b-1,e=0,m=0;m<this.ja;m++)Vb(this.la,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}}function og(){var a=this.M();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function pg(){var a=this.M();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function qg(){var a=this.M();ee(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function rg(){var a=this.M();ee(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function sg(){var a=this.M();he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function tg(){var a=this.M();he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}
            function ug(){var a=this.M();ee(this)||he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function vg(){var a=this.M();ee(this)||he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function wg(){var a=this.M();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function xg(){var a=this.M();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function yg(){var a=this.M();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function zg(){var a=this.M();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Ag(){var a=this.M();!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Bg(){var a=this.M();!ie(this)==!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Cg(){var a=this.M();he(this)||!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function Dg(){var a=this.M();he(this)||!ie(this)!=!je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Eg(){this.ge[this.S()].call(this,Fg,this.S);this.A-=this.Ga===h?1:this.B.eh}function od(){this.ge[this.S()].call(this,Gg,lg)}function pd(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,lg)}function Jg(){var a=ze(this)<<(this.ja>>2),b=this.Fa();C(this,b);a&&t(this,q(this)+a);this.A-=this.B.Kl}function Kg(){var a=this.Fa();C(this,a);this.A-=this.B.Hl}
            function qd(){var a=ze(this),b=this.S()&31;this.A-=11;u(this,this.L);var c=q(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.ja&this.C,u(this,Sc(this,this.ra,this.L&this.C));u(this,c)}this.L=this.L&~this.C|c;t(this,q(this)&~this.ra.T|q(this)-a&this.ra.T)}function rd(){t(this,q(this)&~this.ra.T|this.L&this.ra.T);this.L=this.L&~this.C|this.Fa()&this.C;this.A-=5}function Lg(){vf.call(this,ze(this));this.A-=this.B.Jl}
            function Mg(){vf.call(this,0);this.A-=this.B.Il}function Ng(){this.Ha[this.S()].call(this,af);this.A-=8}function Og(){this.Q|=36;this.A-=this.B.Kc}function sd(){wd.call(this)}function cd(){Oc.call(this,6);wc(this)}function wd(){C(this,this.Ib-this.oa.xa);$a(this,"Undefined opcode "+ea(Bb(this.la,this.pa))+" at "+("0x"+da(this.pa)));wc(this)}
            var Zc=[function(){var a=this.S();this.Mc[a].call(this,He)},function(){this.tb[this.S()].call(this,Ie)},function(){this.Ec[this.S()].call(this,He)},function(){this.Ha[this.S()].call(this,Ie)},function(){this.F=this.F&-256|He.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ie.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.Ra.ta);this.A-=this.B.Ee},function(){be(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,tf)},function(){this.tb[this.S()].call(this,
            uf)},function(){this.Ec[this.S()].call(this,tf)},function(){this.Ha[this.S()].call(this,uf)},function(){this.F=this.F&-256|tf.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|uf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.oa.ta);this.A-=this.B.Ee},function(){$d(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,Fe)},function(){this.tb[this.S()].call(this,Ge)},function(){this.Ec[this.S()].call(this,Fe)},function(){this.Ha[this.S()].call(this,
            Ge)},function(){this.F=this.F&-256|Fe.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ge.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.ra.ta);this.A-=this.B.Ee},function(){Qc(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,wf)},function(){this.tb[this.S()].call(this,xf)},function(){this.Ec[this.S()].call(this,wf)},function(){this.Ha[this.S()].call(this,xf)},function(){this.F=this.F&-256|wf.call(this,this.F&255,this.S());this.A--},
            function(){this.F=this.F&~this.C|xf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.jb.ta);this.A-=this.B.Ee},function(){ae(this,this.Fa());this.A-=this.B.Rb},function(){this.Mc[this.S()].call(this,Je)},function(){this.tb[this.S()].call(this,Ke)},function(){this.Ec[this.S()].call(this,Je)},function(){this.Ha[this.S()].call(this,Ke)},function(){this.F=this.F&-256|Je.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Ke.call(this,this.F&this.C,this.ia());this.A--},
            function(){this.Q|=20;this.da=this.ga=this.Ra;this.A-=this.B.Kc},function(){var a=this.F&255,b=ge(this),c=ee(this);if(9<(a&15)||b)a+=6,b=xb;if(159<a||c)a+=96,c=zb;a&=255;this.F=this.F&-256|a;D(this,a,128);c?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,$f)},function(){this.tb[this.S()].call(this,ag)},function(){this.Ec[this.S()].call(this,$f)},function(){this.Ha[this.S()].call(this,ag)},function(){this.F=this.F&-256|$f.call(this,this.F&255,this.S());
            this.A--},function(){this.F=this.F&~this.C|ag.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.oa;this.A-=this.B.Kc},function(){var a=this.F&255,b=ge(this),c=ee(this);if(9<(a&15)||b)a-=6,b=xb;if(159<a||c)a-=96,c=zb;a&=255;this.F=this.F&-256|a;D(this,a,128);c?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,fg)},function(){this.tb[this.S()].call(this,gg)},function(){this.Ec[this.S()].call(this,fg)},function(){this.Ha[this.S()].call(this,
            gg)},function(){this.F=this.F&-256|fg.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|gg.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.ra;this.A-=this.B.Kc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||ge(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.Mc[this.S()].call(this,We)},function(){this.tb[this.S()].call(this,Xe)},function(){this.Ec[this.S()].call(this,
            We)},function(){this.Ha[this.S()].call(this,Xe)},function(){We.call(this,this.F&255,this.S());this.A--},function(){Xe.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.jb;this.A-=this.B.Kc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||ge(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?ke(this):le(this);b?se(this):qe(this);this.A-=this.B.De},function(){this.F=ff.call(this,this.F)},function(){this.G=ff.call(this,this.G)},function(){this.H=
            ff.call(this,this.H)},function(){this.D=ff.call(this,this.D)},function(){t(this,ff.call(this,q(this)))},function(){this.L=ff.call(this,this.L)},function(){this.K=ff.call(this,this.K)},function(){this.J=ff.call(this,this.J)},function(){this.F=Ye.call(this,this.F)},function(){this.G=Ye.call(this,this.G)},function(){this.H=Ye.call(this,this.H)},function(){this.D=Ye.call(this,this.D)},function(){t(this,Ye.call(this,q(this)))},function(){this.L=Ye.call(this,this.L)},function(){this.K=Ye.call(this,this.K)},
            function(){this.J=Ye.call(this,this.J)},function(){u(this,this.F&this.C);this.A-=this.B.mc},function(){u(this,this.G&this.C);this.A-=this.B.mc},function(){u(this,this.H&this.C);this.A-=this.B.mc},function(){u(this,this.D&this.C);this.A-=this.B.mc},function(){u(this,q(this)-2&65535);this.A-=this.B.mc},function(){u(this,this.L&this.C);this.A-=this.B.mc},function(){u(this,this.K&this.C);this.A-=this.B.mc},function(){u(this,this.J&this.C);this.A-=this.B.mc},function(){this.F=this.F&~this.C|this.Fa();
            this.A-=this.B.Rb},function(){this.G=this.G&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.H=this.H&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.D=this.D&~this.C|this.Fa();this.A-=this.B.Rb},function(){t(this,q(this)&~this.C|this.Fa());this.A-=this.B.Rb},function(){this.L=this.L&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.K=this.K&~this.C|this.Fa();this.A-=this.B.Rb},function(){this.J=this.J&~this.C|this.Fa();this.A-=this.B.Rb},og,pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,
            og,pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,Eg,function(){this.Dc[this.S()].call(this,Pg,this.ia);this.A-=this.Ga===h?1:this.B.eh},Eg,function(){this.Dc[this.S()].call(this,Pg,this.M);this.A-=this.Ga===h?1:this.B.eh},function(){this.Mc[this.S()].call(this,bg)},function(){this.tb[this.S()].call(this,cg)},function(){this.Ec[this.Lh=this.S()].call(this,dg)},function(){this.Ha[this.Lh=this.S()].call(this,eg)},function(){this.Q|=1;this.Mc[this.S()].call(this,pf)},function(){this.Q|=1;this.tb[this.S()].call(this,
            pf)},function(){this.Ec[this.S()].call(this,pf)},function(){this.Ha[this.S()].call(this,pf)},function(){var a=this.S();switch((a&56)>>3){case 0:this.kd=this.Ra.ta;break;case 1:this.kd=this.oa.ta;break;case 2:this.kd=this.ra.ta;break;case 3:this.kd=this.jb.ta;break;case 4:if(80386<=this.na){this.kd=this.Yd.ta;break}cd.call(this);break;case 5:if(80386<=this.na){this.kd=this.Zd.ta;break}default:cd.call(this)}this.Q|=1;this.tb[a].call(this,rf)},function(){this.Q|=1;this.da=this.ga=this.In;this.Ha[this.S()].call(this,
            jf)},function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.na||80386==this.na&&4!=c&&5!=c){cd.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=q(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Ha[b].call(this,pf);switch(c){case 0:be(this,this.F);this.F=a;break;case 1:$d(this,this.G);this.G=a;break;case 2:Qc(this,this.H);this.H=a;break;case 3:ae(this,this.D);this.D=a;break;case 4:80386<=
            this.na?this.Yd.load(q(this)):be(this,q(this));t(this,a);break;case 5:80386<=this.na?this.Zd.load(this.L):$d(this,this.L);this.L=a;break;case 6:Qc(this,this.K);this.K=a;break;case 7:ae(this,this.J),this.J=a}},function(){this.Q|=1;this.Dc[this.S()].call(this,Qg,this.Fa)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=
            this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=q(this);this.F=this.F&~this.C|b&this.C;t(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=
            2==this.ja?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.ja?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Rk},function(){Ve.call(this,this.ia(),ze(this));this.A-=this.B.Uk},function(){this.nc("WAIT not implemented");this.A--},function(){u(this,qb(this));this.A-=this.B.mc},function(){Tc(this,this.Fa());this.A-=this.B.Rb},function(){var a=this.F>>8&255;a&zb?ke(this):le(this);a&yb?(this.resultType&=-3,this.ca|=yb):(this.resultType&=
            -3,this.ca&=~yb);a&xb?se(this):qe(this);a&wb?te(this):re(this);a&vb?(this.resultType&=-17,this.ca|=vb):(this.resultType&=-17,this.ca&=~vb);this.A-=this.B.zb},function(){this.F=this.F&-65281|(qb(this)&Ic)<<8;this.A-=this.B.zb},function(){var a=this.F&-256,b;b=S(this);b=this.vc(this.da.qc(b,1));this.F=a|b;this.A-=this.B.Li},function(){this.F=this.F&~this.C|Sc(this,this.da,S(this));this.A-=this.B.Li},function(){var a=S(this),b=this.F;this.Me(this.da.lc(a,1),b);this.A-=this.B.Mi},function(){var a=S(this),
            b=this.F;this.tf(this.da.lc(a,this.ja),b);this.A-=this.B.Mi},function(){var a=1,b=0,c=this.B.Ni;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Pi,this.va&256||(this.A-=this.B.Oi));if(a--){var d=this.ca&sb?-1:1,e=this.vc(this.da.qc(this.K,1));this.Me(this.Ra.lc(this.J&this.T,1),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Ni;this.va&192&&(a=this.G&this.T,
            b=1,c=this.B.Pi,this.va&256||(this.A-=this.B.Oi));if(a--){var d=this.ca&sb?-this.ja:this.ja,e=Sc(this,this.da,this.K);this.tf(this.Ra.lc(this.J&this.T,this.ja),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.yi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Ai,this.va&256||(this.A-=this.B.zi));if(a--){var d=this.ca&sb?-1:1,e=ve(this,this.da,this.K&this.T),m=
            xe(this,this.Ra,this.J&this.T);We.call(this,e,m);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.rb;this.G=this.G&~this.T|this.G-b&this.T;a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.yi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Ai,this.va&256||(this.A-=this.B.zi));if(a--){var d=this.ca&sb?-this.ja:this.ja,e=we(this,this.da,this.K&this.T),m=ye(this,this.Ra,this.J&this.T);Xe.call(this,e,m);this.K=this.K&~this.T|
            this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.rb;this.G=this.G&~this.T|this.G-b&this.T;a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256)}},function(){D(this,this.F&this.S(),128);this.A-=this.B.De},function(){D(this,this.F&this.ia(),this.dataType);this.A-=this.B.De},function(){var a=1,b=0,c=this.B.bj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.dj,this.va&256||(this.A-=this.B.cj));if(a--){var d=this.F;this.Me(this.Ra.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+
            (this.ca&sb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.bj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.dj,this.va&256||(this.A-=this.B.cj));if(a--){var d=this.F;this.tf(this.Ra.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Ib,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Fi;this.va&192&&(a=this.G&this.T,
            b=1,c=this.B.Hi,this.va&256||(this.A-=this.B.Gi));a--&&(this.F=this.F&-256|this.vc(this.da.qc(this.K&this.T,1)),this.K=this.K&~this.T|this.K+(this.ca&sb?-1:1)&this.T,this.A-=c,this.G=this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Fi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Hi,this.va&256||(this.A-=this.B.Gi));a--&&(this.F=this.F&~this.C|Sc(this,this.da,this.K&this.T),this.K=this.K&~this.T|this.K+(this.ca&sb?-this.ja:this.ja)&this.T,this.A-=c,this.G=
            this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Ui;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Wi,this.va&256||(this.A-=this.B.Vi));a--&&(We.call(this,this.F&255,xe(this,this.Ra,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&sb?-1:1)&this.T,this.A-=c-this.B.rb,this.G=this.G&~this.T|this.G-b&this.T,a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256))},function(){var a=1,b=0,c=this.B.Ui;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Wi,this.va&
            256||(this.A-=this.B.Vi));a--&&(Xe.call(this,this.F&this.C,ye(this,this.Ra,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&sb?-this.ja:this.ja)&this.T,this.A-=c-this.B.rb,this.G=this.G&~this.T|this.G-b&this.T,a&&he(this)==(this.va&64)&&(this.pa=this.Ib,this.Q|=256))},function(){this.F=this.F&-256|this.S();this.A-=this.B.zb},function(){this.G=this.G&-256|this.S();this.A-=this.B.zb},function(){this.H=this.H&-256|this.S();this.A-=this.B.zb},function(){this.D=this.D&-256|this.S();this.A-=this.B.zb},
            function(){this.F=this.F&255|this.S()<<8;this.A-=this.B.zb},function(){this.G=this.G&255|this.S()<<8;this.A-=this.B.zb},function(){this.H=this.H&255|this.S()<<8;this.A-=this.B.zb},function(){this.D=this.D&255|this.S()<<8;this.A-=this.B.zb},function(){this.F=this.F&~this.C|this.ia();this.A-=this.B.zb},function(){this.G=this.G&~this.C|this.ia();this.A-=this.B.zb},function(){this.H=this.H&~this.C|this.ia();this.A-=this.B.zb},function(){this.D=this.D&~this.C|this.ia();this.A-=this.B.zb},function(){t(this,
            q(this)&~this.C|this.ia());this.A-=this.B.zb},function(){this.L=this.L&~this.C|this.ia();this.A-=this.B.zb},function(){this.K=this.K&~this.C|this.ia();this.A-=this.B.zb},function(){this.J=this.J&~this.C|this.ia();this.A-=this.B.zb},Jg,Kg,Jg,Kg,function(){this.Ha[this.S()].call(this,kf)},function(){this.Ha[this.S()].call(this,hf)},function(){this.Q|=1;this.ge[this.S()].call(this,Rg,this.S)},function(){this.Q|=1;this.Dc[this.S()].call(this,Rg,this.ia)},Lg,Mg,Lg,Mg,function(){De.call(this,3,null,this.B.kl)},
            function(){var a=this.S(),b;a:{b=this.zh[a];if(void 0!==b)for(var c=0;c<b.length;c++)if(!b[c][1].call(b[c][0],this.pa)){b=!1;break a}b=!0}b?De.call(this,a,null,0):this.A--},function(){je(this)?De.call(this,4,null,this.B.ll):this.A-=this.B.ml},function(){this.A-=this.B.il;if(this.Ab&1&&this.ca&16384){var a=this.ma(this.gb.xa+0);Rc(this.oa,a,!1)}else{var a=this.oa.Ka,b=this.Fa(),c=this.Fa(),d=this.Fa();null!=Uc(this,b,c,!1)&&(Tc(this,d,a),this.Rh&&Wd(this,this.pa))}},function(){this.ge[this.S()].call(this,
            Gg,jg)},function(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,jg)},function(){this.ge[this.S()].call(this,Gg,kg)},function(){this.Dc[this.S()].call(this,2==this.ja?Hg:Ig,kg)},function(){var a=this.S();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;D(this,this.F,128);this.A-=this.B.Lk}},function(){var a=this.S();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;D(this,this.F,128);this.A-=this.B.Kk},function(){this.F=this.F&-256|(ee(this)?255:0);this.A-=2},function(){this.F=this.F&-256|ve(this,
            this.da,this.D+(this.F&255)&65535);this.A-=this.B.Ml},Ng,Ng,Ng,Ng,Ng,Ng,Ng,Ng,function(){var a=this.M();(this.G=this.G-1&this.T)&&!he(this)?(C(this,l(this)+a),this.A-=this.B.tl):this.A-=this.B.Ii},function(){var a=this.M();(this.G=this.G-1&this.T)&&he(this)?(C(this,l(this)+a),this.A-=this.B.Ji):this.A-=this.B.Ki},function(){var a=this.M();(this.G=this.G-1&this.T)?(C(this,l(this)+a),this.A-=this.B.sl):this.A-=this.B.Ii},function(){var a=this.M();this.G&this.T?this.A-=this.B.Ki:(C(this,l(this)+a),this.A-=
            this.B.Ji)},function(){var a=this.S();this.F=this.F&-256|Tb(this.la,a,this.pa-2);this.A-=this.B.Di},function(){var a=this.S();this.F=Tb(this.la,a,this.pa-2);this.F|=Tb(this.la,a+1&65535,this.pa-2)<<8;this.A-=this.B.Di},function(){var a=this.S();Vb(this.la,a,this.F&255,this.pa-2);this.A-=this.B.Ti},function(){var a=this.S();Vb(this.la,a,this.F&255,this.pa-2);Vb(this.la,a+1&65535,this.F>>8,this.pa-2);this.A-=this.B.Ti},function(){var a=this.ia(),b=l(this),a=b+a;u(this,b);C(this,a);this.A-=this.B.Sk},
            function(){var a=this.ia();C(this,l(this)+a);this.A-=this.B.Ei},function(){Uc(this,this.ia(),ze(this));this.A-=this.B.ol},function(){var a=this.M();C(this,l(this)+a);this.A-=this.B.Ei},function(){this.F=this.F&-256|Tb(this.la,this.H,this.pa-1);this.A-=this.B.Ci},function(){this.F=Tb(this.la,this.H,this.pa-1);this.F|=Tb(this.la,this.H+1&65535,this.pa-1)<<8;this.A-=this.B.Ci},function(){Vb(this.la,this.H,this.F&255,this.pa-1);this.A-=this.B.Si},function(){Vb(this.la,this.H,this.F&255,this.pa-1);Vb(this.la,
            this.H+1&65535,this.F>>8,this.pa-1);this.A-=this.B.Si},Og,Og,function(){this.Q|=132;this.A-=this.B.Kc},function(){this.Q|=68;this.A-=this.B.Kc},function(){this.kb|=4;this.A-=2;this.ca&tb||wc(this)},function(){ee(this)?le(this):ke(this);this.A-=2},function(){this.Ob=!1;this.ge[this.S()].call(this,Sg,mg);this.Ob&&(this.F=this.F&~this.C|this.fb&this.C)},function(){this.Ob=!1;this.Dc[this.S()].call(this,Tg,mg);this.Ob&&(this.F=this.F&~this.C|this.fb&this.C,this.H=this.H&~this.C|this.Zb&this.C)},function(){le(this);
            this.A-=2},function(){ke(this);this.A-=2},function(){this.ca&=~tb;this.A-=this.B.Qk},function(){this.ca|=tb;this.Q|=4;this.A-=2},function(){this.ca&=~sb;this.A-=2},function(){this.ca|=sb;this.A-=2},function(){this.ge[this.S()].call(this,$c,mg)},function(){this.Dc[this.S()].call(this,ad,mg)}],Fg=[He,tf,Fe,wf,Je,$f,fg,We],Pg=[Ie,uf,Ge,xf,Ke,ag,gg,Xe],Qg=[function(a,b){this.A-=this.Ga===h?this.B.Rb:this.B.El;return b},hg,hg,hg,hg,hg,hg,hg],Rg=[function(a,b){this.A-=this.Ga===h?this.B.wl:this.B.ul;return b},
            U,U,U,U,U,U,U],Gg=[function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;oe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;oe(this,c,e,128)}return c},
            function(a,b){var c=a,d=b&this.sb;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);D(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.sb;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,D(this,a,128,c&1,a&128));return a},U,function(a,b){var c=b&this.sb;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,D(this,a,128,c&1));return a}],Hg=[function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>16-d)&65535):e=a<<15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e;(d&=15)?
            (e=a<<16-d,c=(a>>>d|e)&65535):e=a;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=pe(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;oe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=0;16<d?c=0:(e=a<<d-1,c=e<<1&65535);D(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,b){var c=b&this.sb;
            c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,D(this,a,32768,c&1,a&32768));return a},U,function(a,b){var c=b&this.sb;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,D(this,a,32768,c&1));return a}],Ig=[function(a,b){var c=a,d=b&this.sb;d&&(c=a<<d|a>>>32-d,oe(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.sb;if(d){var e=a<<32-d,c=a>>>d|e;oe(this,c,e,-2147483648)}return c},function(a,b){var c=a,d=b&this.sb;d&&(c=pe(this),c=a<<d|c<<d-1|a>>>32-d>>>1,oe(this,c,a<<d-1,-2147483648));return c},function(a,
            b){var c=a,d=b&this.sb;d&&(c=pe(this),c=a>>>d|c<<32-d|a<<32-d<<1,oe(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.sb;d&&(d=a<<d-1,c=d<<1,D(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.sb;c&&(c=a>>>c-1,a=c>>>1,D(this,a,-2147483648,c&1,a&-2147483648));return a},U,function(a,b){var c=b&this.sb;c&&(c=a>>c-1,a=c>>1,D(this,a,-2147483648,c&1));return a}],Sg=[function(a,b){b=this.S();D(this,a&b,128);this.A-=this.U===h?this.B.fj:this.B.ej;
            this.Q|=2;return a},U,function(a){this.A-=this.U===h?this.B.ag:this.B.$f;return a^255},function(a){var b=-a|0;de(this,0,a,b,191,!0);this.A-=this.U===h?this.B.ag:this.B.$f;return b&255},function(a){this.Ob=!0;this.fb=(this.F&255)*a&65535;this.fb&65280?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.Al:this.B.zl;this.Q|=2;return a},function(a){var b=(this.F<<24>>24)*(a<<24>>24)|0;this.Ob=!0;this.fb=b&65535;127<b||-128>b?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.fl:
            this.B.el;this.Q|=2;return a},function(a,b){if(!a)return ig.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return ig.call(this),a;this.Ob=!0;this.fb=c&255|(b%a&255)<<8;this.A-=this.U===h?this.B.Yk:this.B.Xk;this.Q|=2;return a},function(a,b){if(!a)return ig.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.na&&-128==d)return ig.call(this),a;this.Ob=!0;this.fb=d&255|(b%c&255)<<8;this.A-=this.U===h?this.B.bl:this.B.al;this.Q|=2;return a}],Tg=[function(a,b){b=this.ia();
            D(this,a&b,32768);this.A-=this.U===h?this.B.fj:this.B.ej;this.Q|=2;return a},U,function(a){this.A-=this.U===h?this.B.ag:this.B.$f;return a^65535},function(a){var b=-a|0;de(this,0,a,b,32831,!0);this.A-=this.U===h?this.B.ag:this.B.$f;return b&65535},function(a,b){if(2==this.ja){b=this.F&65535;var c=b*a|0;this.Ob=!0;this.fb=c&65535;this.Zb=c>>16&65535}else sf.call(this,a,this.F);this.Zb?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.Cl:this.B.Bl;this.Q|=2;return a},function(a,b){var c;
            if(2==this.ja)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Ob=!0,this.fb=c&65535,this.Zb=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);sf.call(this,c,d);e&&(this.fb=~this.fb+1|0,this.Zb=~this.Zb+(this.fb?0:1)|0);c=this.Zb!=this.fb>>31}c?(ke(this),me(this)):(le(this),ne(this));this.A-=this.U===h?this.B.hl:this.B.gl;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return ig.call(this),a;b=65536*(this.H&65535)+(this.F&65535);var c=b/a|0;if(65536<=
            c)return ig.call(this),a;this.Ob=!0;this.fb=c&65535;this.Zb=b%a&65535}else{$e.call(this,this.F,this.H,a);if(!this.Ob)return ig.call(this),a;this.fb|=0;this.Zb|=0}this.A-=this.U===h?this.B.$k:this.B.Zk;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return ig.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.na&&-32768==d)return ig.call(this),a;this.Ob=!0;this.fb=d&65535;this.Zb=b%c&65535}else{var c=this.F,d=this.H,e=a,m=!1,n=!1;0>e&&(e=-e|0,m=!m);0>
            d&&(c=-c|0,d=~d+(c?0:1)|0,n=!0,m=!m);$e.call(this,c,d,e);2147483647<this.fb&&(this.Ob=!1);m&&(this.fb=-this.fb);n&&(this.Zb=-this.Zb);if(!this.Ob)return ig.call(this),a;this.fb|=0;this.Zb|=0}this.A-=this.U===h?this.B.dl:this.B.cl;this.Q|=2;return a}],$c=[function(a){var b=a+1|0;de(this,a,1,b,190);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&255},function(a){var b=a-1|0;de(this,a,1,b,190,!0);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&255},U,U,U,U,U,U],ad=[function(a){var b=a+1|0;de(this,a,
            1,b,32830);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&65535},function(a){var b=a-1|0;de(this,a,1,b,32830,!0);this.A-=this.U===h?this.B.Zf:this.B.Yf;return b&65535},function(a){u(this,l(this));C(this,a);this.A-=this.U===h?this.B.Wk:this.B.Vk;this.Q|=2;return a},function(a){if(this.U===h)return U.call(this,a);Ve.call(this,a,this.ma(this.U+this.ja));this.A-=this.B.Tk;this.Q|=2;return a},function(a){C(this,a);this.A-=this.U===h?this.B.ql:this.B.pl;this.Q|=2;return a},function(a){if(this.U===h)return U.call(this,
            a);Uc(this,a,this.ma(this.U+this.ja));this.Rh&&Wd(this,this.pa);this.A-=this.B.nl;this.Q|=2;return a},function(a){var b=a;this.Q&512&&(a=a-2&65535,80286>this.na&&(b=a));u(this,b);this.A-=this.U===h?this.B.mc:this.B.Gl;this.Q|=2;return a},hg],vd=Array(256);vd[0]=function(){var a=this.S();16>(a&56)&&(this.Q|=1);this.Dc[a].call(this,this.om,mg)};vd[1]=function(){var a=this.S();a&16||(this.Q|=1);this.Dc[a].call(this,Ug,mg)};vd[2]=function(){this.Ha[this.S()].call(this,gf)};
            vd[3]=function(){this.Ha[this.S()].call(this,nf)};
            vd[5]=function(){this.oa.Ka?Oc.call(this,13,0,!0):(ue(this,this.ma(2054)),this.J=this.ma(2086),this.K=this.ma(2088),this.L=this.ma(2090),this.D=this.ma(2094),this.H=this.ma(2096),this.G=this.ma(2098),this.F=this.ma(2100),Pc(this.Ra,2102,this.ma(2084)),Pc(this.oa,2108,this.ma(2082)),Pc(this.ra,2114,this.ma(2080)),Pc(this.jb,2120,this.ma(2078)),Tc(this,this.ma(2072)),C(this,this.ma(2074)),t(this,this.ma(2092)),this.od=this.ma(2126)|this.vc(2128)<<16,this.Ff=this.od+this.ma(2130),Pc(this.Le,2132,this.ma(2076)),
            this.pd=this.ma(2138)|this.vc(2140)<<16,this.Gf=this.pd+this.ma(2142),Pc(this.gb,2144,this.ma(2070)),this.A-=195)};vd[6]=function(){this.oa.Ka?Oc.call(this,13,0):(this.Ab&=-9,this.A-=2)};vd[11]=cd;var x=[];x[32]=function(){var a=this.S()|192;if(this.oa.Ka)Oc.call(this,13,0);else{switch((a&56)>>3){case 0:this.kd=this.Ab;break;case 1:this.kd=this.tj;break;case 2:this.kd=this.jh;break;case 3:this.kd=this.kh;break;default:wd.call(this);return}Sd(this,4);this.Ha[a].call(this,rf)}};
            x[34]=function(){var a,b=this.S()|192;if(this.oa.Ka)Oc.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:cd.call(this);return}Sd(this,4);this.Ha[b].call(this,pf);switch(c){case 0:c=this.F;this.F=a;this.Ab=c;Id(this);this.Ab&-2147483648?Ed(this):this.ka!=this.Re&&(this.ka=this.Re,this.xh=this.Zj=null);break;case 1:this.tj=this.G;this.G=a;break;case 2:this.jh=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.kh=
            c,this.Ab&-2147483648&&Ed(this)}}};x[128]=function(){var a=this.ia();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[129]=function(){var a=this.ia();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[130]=function(){var a=this.ia();ee(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[131]=function(){var a=this.ia();ee(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[132]=function(){var a=this.ia();he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[133]=function(){var a=this.ia();he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[134]=function(){var a=this.ia();ee(this)||he(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[135]=function(){var a=this.ia();ee(this)||he(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[136]=function(){var a=this.ia();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[137]=function(){var a=this.ia();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[138]=function(){var a=this.ia();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[139]=function(){var a=this.ia();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[140]=function(){var a=this.ia();!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[141]=function(){var a=this.ia();!ie(this)==!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[142]=function(){var a=this.ia();he(this)||!ie(this)!=!je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[143]=function(){var a=this.ia();he(this)||!ie(this)!=!je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[144]=function(){yf.call(this,zf)};
            x[145]=function(){yf.call(this,zf)};x[146]=function(){yf.call(this,Af)};x[147]=function(){yf.call(this,Bf)};x[148]=function(){yf.call(this,Cf)};x[149]=function(){yf.call(this,Df)};x[150]=function(){yf.call(this,Ef)};x[151]=function(){yf.call(this,Ff)};x[152]=function(){yf.call(this,Gf)};x[153]=function(){yf.call(this,Hf)};x[154]=function(){yf.call(this,If)};x[155]=function(){yf.call(this,Jf)};x[156]=function(){yf.call(this,Kf)};x[157]=function(){yf.call(this,Lf)};x[158]=function(){yf.call(this,Mf)};
            x[159]=function(){yf.call(this,Nf)};x[160]=function(){u(this,this.Yd.ta);this.A-=this.B.Ee};x[161]=function(){var a=this.Fa();this.Yd.load(a);this.A-=this.B.Rb};x[163]=function(){this.tb[this.S()].call(this,Pe);this.U!==h&&(this.A-=this.B.Sp)};x[164]=function(){this.tb[this.S()].call(this,2==this.ja?Qf:Rf);this.A-=this.U===h?this.B.aj:this.B.$i};x[165]=function(){this.tb[this.S()].call(this,2==this.ja?Sf:Tf);this.A-=this.U===h?this.B.aj:this.B.$i};x[168]=function(){u(this,this.Zd.ta);this.A-=this.B.Ee};
            x[169]=function(){var a=this.Fa();this.Zd.load(a);this.A-=this.B.Rb};x[171]=function(){this.tb[this.S()].call(this,Ue);this.U!==h&&(this.A-=this.B.Nk)};x[172]=function(){this.tb[this.S()].call(this,2==this.ja?Wf:Xf);this.A-=this.U===h?this.B.aj:this.B.$i};x[173]=function(){this.tb[this.S()].call(this,2==this.ja?Yf:Zf);this.A-=this.U===h?this.B.aj:this.B.$i};x[175]=function(){this.Ha[this.S()].call(this,2==this.ja?df:ef)};x[178]=function(){this.Ha[this.S()].call(this,of)};
            x[179]=function(){this.tb[this.S()].call(this,Te);this.U!==h&&(this.A-=this.B.Nk)};x[180]=function(){this.Ha[this.S()].call(this,lf)};x[181]=function(){this.Ha[this.S()].call(this,mf)};
            x[182]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Ec[b].call(this,qf);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.Dd=this.Dd&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
            this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.U===h?this.B.Ri:this.B.Qi};x[183]=function(){var a=this.S();Sd(this,2);this.Ha[a].call(this,qf);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.Dd&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.U===h?this.B.Ri:this.B.Qi};
            x[186]=function(){this.Dc[this.S()].call(this,Vg,this.S)};x[187]=function(){this.tb[this.S()].call(this,Qe);this.U!==h&&(this.A-=this.B.Nk)};x[188]=function(){this.Ha[this.S()].call(this,Ne)};x[189]=function(){this.Ha[this.S()].call(this,Oe)};
            x[190]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Ec[b].call(this,qf);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.Dd=this.Dd&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
            this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.U===h?this.B.Ri:this.B.Qi};
            x[191]=function(){var a=this.S();Sd(this,2);this.Ha[a].call(this,qf);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.Dd=this.Dd<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.U===h?this.B.Ri:this.B.Qi};
            var Xd=[function(){this.A-=2+(this.U===h?0:1);return this.Le.ta},function(){this.A-=2+(this.U===h?0:1);return this.gb.ta},function(a){this.Q|=2;this.Le.load(a);this.A-=17+(this.U===h?0:2);return a},function(a){this.Q|=2;this.gb.load(a)!==h&&(this.Cb(this.gb.nd+4,this.gb.Nb|=512),this.gb.type=768);this.A-=17+(this.U===h?0:2);return a},function(a){this.Q|=2;this.A-=14+(this.U===h?0:2);if(this.Jb.load(a,!0)!==h&&2048!=(this.Jb.Nb&2560)&&(this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(a&3)||7168==(this.Jb.Nb&7168)))return te(this),
            a;re(this);return a},function(a){this.Q|=2;this.A-=14+(this.U===h?0:2);if(this.Jb.load(a,!0)!==h&&512==(this.Jb.Nb&2560)&&this.Jb.tc>=this.oa.Ka&&this.Jb.tc>=(a&3))return te(this),a;re(this);return a},U,U],bd=[td,td,td,td,td,td,U,U],Ug=[function(a){if(this.U===h)cd.call(this);else{a=this.Ff-this.od;var b=this.od;80286==this.na?b|=-16777216:80386<=this.na&&(2==this.ja?b&=16777215:a|=b<<16);this.Fj(this.U+2,b);this.A-=11}return a},function(a){if(this.U===h)cd.call(this);else{a=this.Gf-this.pd;var b=
            this.pd;80286==this.na?b|=-16777216:80386<=this.na&&(2==this.ja?b&=16777215:a|=b<<16);this.Fj(this.U+2,b);this.A-=12}return a},function(a){this.U===h?cd.call(this):(this.od=this.Qg(this.U+2)&(this.C|this.C<<8),a&=65535,this.Ff=this.od+a,this.Q|=2,this.A-=11);return a},function(a){this.U===h?cd.call(this):(this.pd=this.Qg(this.U+2)&(this.C|this.C<<8),a&=65535,this.Gf=this.pd+a,this.Q|=2,this.A-=12);return a},function(){this.A-=2+(this.U===h?0:1);return this.Ab},U,function(a){ue(this,a);this.A-=this.U===
            h?3:6;this.Q|=2;return a},U],Vg=[U,U,U,U,Pe,Ue,Te,Qe],y=[function(a){a=a.call(this,this.F&255,E(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.K));
            this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,S(this)));this.F=this.F&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J));this.G=this.G&-256|a;this.A-=
            this.B.Z},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,S(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,
            this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,
            this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,S(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J));this.D=this.D&-256|
            a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,S(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=
            a.call(this,this.D&255,E(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},
            function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<
            8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K));this.H=
            this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));
            this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>
            8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,
            this.F&255,E(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=
            this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+
            this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,
            this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+this.M()));this.F=this.F&-65281|
            a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&
            255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+this.M()));this.G=this.G&
            -65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&
            255,E(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>
            8&255,E(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,
            this.L+this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&
            255,E(this,this.D+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.G&255,E(this,this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.H&255,E(this,this.D+this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.H&255,F(this,this.L+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+S(this)));this.D=this.D&-256|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+S(this)));this.D=this.D&
            -256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,
            this.F>>8&255,E(this,this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+S(this)));this.G=this.G&-65281|a<<
            8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
            8&255,E(this,this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+S(this)));this.H=this.H&-65281|a<<8;
            this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,
            F(this,this.L+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+S(this)));this.D=this.D&-65281|a<<
            8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,
            this.D+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=
            a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=
            a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=
            a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=
            a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|
            a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&
            255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=
            this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},
            function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Kd=[function(a){a=a.call(this,J(this,this.D+this.K),this.F&255);O(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,J(this,this.D+this.J),this.F&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F&255);O(this,a);this.A-=this.B.aa},function(a){a=
            a.call(this,J(this,this.D),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,this.J),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.H&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H&255);O(this,a);this.A-=this.B.Z},function(a){a=
            a.call(this,K(this,this.L+this.J),this.H&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D&255);O(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,J(this,this.D+this.J),this.D&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D&255);O(this,a);this.A-=this.B.aa},function(a){a=
            a.call(this,J(this,this.D),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.F>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.F>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);O(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G>>
            8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+
            this.K),this.H>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.H>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,S(this)),this.H>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D>>8&255);O(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.D>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D>>8&255);O(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D>>8&255);O(this,a);
            this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),
            this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);O(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            J(this,this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H&255);O(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),
            this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.P},
            function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+
            this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H>>8&255);
            O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=
            a.call(this,J(this,this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+
            S(this)),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.F&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F&255);O(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,
            this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.H&255);O(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.D+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.D&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.D&255);
            O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,K(this,this.L+this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),
            this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.G>>8&255);
            O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.P},
            function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.D+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+S(this)),
            this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},y[192],y[200],y[208],y[216],y[224],y[232],y[240],y[248],y[193],y[201],y[209],y[217],y[225],y[233],y[241],y[249],y[194],y[202],y[210],y[218],y[226],y[234],y[242],y[250],y[195],y[203],
            y[211],y[219],y[227],y[235],y[243],y[251],y[196],y[204],y[212],y[220],y[228],y[236],y[244],y[252],y[197],y[205],y[213],y[221],y[229],y[237],y[245],y[253],y[198],y[206],y[214],y[222],y[230],y[238],y[246],y[254],y[199],y[207],y[215],y[223],y[231],y[239],y[247],y[255]],Ld=[function(a,b){var c=a[0].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,
            K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));
            O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=
            this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=
            a[2].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,J(this,this.D),
            b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));
            O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},
            function(a,b){var c=a[4].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,
            J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.K),
            b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=
            this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=
            a[6].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D+this.K),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,J(this,this.D+this.J),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.K),b.call(this));O(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.J),b.call(this));O(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,
            J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+this.M()),
            b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,
            this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=
            a[1].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,
            b){var c=a[2].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));O(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.D+this.J+this.M()),b.call(this));
            O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),
            b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
            K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,
            b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},
            function(a,b){var c=a[6].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);
            this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.J+this.M()),
            b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+
            S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,
            K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,
            b){var c=a[2].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,
            b){var c=a[3].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
            function(a,b){var c=a[3].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);
            this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+S(this)),b.call(this));O(this,
            c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+S(this)),
            b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+
            S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,
            this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,
            K(this,this.L+this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,
            this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,
            this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
            a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
            8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
            c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&
            -256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));
            this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&
            255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>
            8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,
            this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],z=[function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=
            this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,S(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.K));this.G=this.G&
            ~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,S(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=
            this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,S(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J));this.D=
            this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,S(this)));this.D=
            this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,
            this.L+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
            H(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,S(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,
            this.K&this.C,I(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,S(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,
            this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=
            a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,S(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.F&this.C,H(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=
            this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
            this.G&this.C,I(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
            this.C,I(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,
            this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=
            a.call(this,q(this)&this.C,H(this,this.D+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+
            this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},
            function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));
            this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.K&this.C,I(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,
            this.J&this.C,H(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+S(this)));this.F=this.F&~this.C|a;this.A-=
            this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.G&this.C,I(this,this.L+this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+S(this)));this.G=this.G&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
            this.C,I(this,this.L+this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.K+
            S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,
            q(this)&this.C,H(this,this.D+this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+S(this)));t(this,
            q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
            this.L&this.C,I(this,this.L+this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+S(this)));this.L=this.L&~this.C|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,
            this.L+this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.J&this.C,H(this,this.D+this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.K+S(this)));
            this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=
            this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=
            a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,
            this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,q(this)&this.C);this.H=
            this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=
            a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&
            this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,
            this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=
            this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=
            a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
            this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Md=[function(a){a=a.call(this,L(this,this.D+this.K),this.F&
            this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.F&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.F&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.F&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            L(this,S(this)),this.F&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.G&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.G&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.G&this.C);P(this,a);this.A-=this.B.Y},
            function(a){a=a.call(this,L(this,this.K),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.G&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.H&this.C);P(this,a);
            this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.H&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.H&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.H&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.H&
            this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.D&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.D&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.D&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.D&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            L(this,this.J),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.D&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),q(this)&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),q(this)&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),q(this)&this.C);P(this,a);this.A-=this.B.Z},
            function(a){a=a.call(this,N(this,this.L+this.J),q(this)&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),q(this)&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.L&this.C);P(this,
            a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.L&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.L&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.L&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),
            this.L&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.K&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.K&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.K),this.K&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.K&this.C);P(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,L(this,this.K),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.K&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.J&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.D+this.J),this.J&this.C);P(this,a);this.A-=this.B.Z},
            function(a){a=a.call(this,N(this,this.L+this.K),this.J&this.C);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,N(this,this.L+this.J),this.J&this.C);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,L(this,this.K),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.J&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.D),this.J&this.C);P(this,a);
            this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&this.C);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,N(this,this.L+this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+
            this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),
            this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D&this.C);P(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.D+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            L(this,this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),
            this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.L&this.C);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.K&this.C);P(this,a);this.A-=
            this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            L(this,this.D+this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),
            this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.F&this.C);
            P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=
            a.call(this,L(this,this.D+this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+
            S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.H&
            this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.O},
            function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,this.L+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+
            S(this)),q(this)&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.L&this.C);P(this,
            a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,this.L+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,
            N(this,this.L+this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+S(this)),this.J&
            this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.D+this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.K+S(this)),this.J&this.C);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.L+this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,L(this,this.K+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.J&this.C);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],z[201],z[209],z[217],z[225],z[233],z[241],z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],
            z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],Nd=[function(a,b){var c=a[0].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,N(this,this.L+this.J),b.call(this));
            P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,
            b){var c=a[1].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
            L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,N(this,this.L+this.J),
            b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=
            this.B.Y},function(a,b){var c=a[3].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[3].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,
            N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D+this.K),b.call(this));
            P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},
            function(a,b){var c=a[5].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=
            a[6].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D+this.K),
            b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,N(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,N(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,
            c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.K+this.M()),b.call(this));
            P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,
            this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,
            L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[2].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=
            this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.K+
            this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,
            this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=
            a[5].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},
            function(a,b){var c=a[6].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.D+
            this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=
            a[1].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=
            a[2].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[2].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=
            this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+S(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.L+this.J+S(this)),
            b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+S(this)),
            b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,
            this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,
            N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.L+this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,
            b){var c=a[7].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,
            this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
            b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
            ~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,
            b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=
            a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|
            c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));
            this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,
            this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
            b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
            ~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,
            b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],A=[function(a){a=a.call(this,
            this.F&255,E(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,T(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,S(this)));this.F=this.F&
            -256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.F));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,T(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,S(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.F));this.H=this.H&
            -256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,T(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,S(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=
            a.call(this,this.H&255,E(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D));this.D=
            this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,T(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,S(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.F));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.H>>8&255,E(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.H));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,T(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.H>>8&255,E(this,S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.D>>8&255,E(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,0)));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.F&255,E(this,T(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&255,E(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,T(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,T(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,E(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,T(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));
            this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,
            T(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.D>>8&255,E(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));
            this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.F+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
            this.H+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,T(this,2)+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
            this.J+S(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.G+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,T(this,
            2)+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.K+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+S(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+
            S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,T(this,2)+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+
            S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+S(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.F+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+S(this)));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,T(this,2)+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+S(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+S(this)));
            this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.H+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,T(this,2)+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.F>>8&255,F(this,this.L+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+S(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+S(this)));this.G=this.G&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,T(this,2)+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+S(this)));
            this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+S(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.H>>8&255,E(this,this.D+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,T(this,2)+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+S(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+S(this)));this.H=this.H&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.G+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,T(this,2)+S(this)));
            this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+S(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&
            -256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=
            this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);
            this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&
            255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>
            8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>
            8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);
            this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|
            a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,
            this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Od=[function(a){a=a.call(this,J(this,this.F),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,
            this.D),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G&
            255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.G&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G&255);O(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H&255);O(this,a);this.A-=
            this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,T(this,0)),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.H),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.F>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.F),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.G>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,
            J(this,this.K),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,T(this,0)),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.H>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.H),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,T(this,0)),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this)),this.D>>8&255);O(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);O(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.F+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);O(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),
            this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.G+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);
            O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,T(this,1)+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F>>8&255);O(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.J+this.M()),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),
            this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.H+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.J+this.M()),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,1)+this.M()),this.D>>8&255);O(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.H+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.F&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F&255);O(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),
            this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.G&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.D&255);O(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),
            this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,T(this,2)+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.F>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.G>>
            8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.J+S(this)),this.G>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.H>>
            8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.H>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.H+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,T(this,2)+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+S(this)),this.D>>8&255);O(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+S(this)),this.D>>
            8&255);O(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],Pd=[function(a,b){var c=
            a[0].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,S(this)),b.call(this));
            O(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=
            a[1].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.F),b.call(this));
            O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,
            b){var c=a[2].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));
            O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,
            b){var c=a[4].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,J(this,this.K),
            b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},
            function(a,b){var c=a[5].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,
            this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=
            this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.F),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.G),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.H),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,
            J(this,T(this,0)),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,S(this)),b.call(this));O(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.K),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));O(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,T(this,1)+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.H+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,T(this,1)+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+S(this)),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+S(this)),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,T(this,2)+S(this)),b.call(this));
            O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+S(this)),b.call(this));O(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+S(this)),b.call(this));O(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=
            this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=
            this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
            function(a,b){var c=a[7].call(this,J(this,this.H+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,T(this,2)+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+S(this)),b.call(this));O(this,c);this.A-=this.B.I},
            function(a,b){var c=a[7].call(this,J(this,this.J+S(this)),b.call(this));O(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&
            -65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));
            this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&
            255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,
            this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,
            this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
            a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
            8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
            c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&
            -256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));
            this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&
            255,b.call(this));this.D=this.D&-65281|c<<8}],B=[function(a){a=a.call(this,this.F&this.C,H(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.G));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,T(this,0)));this.F=
            this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,S(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.G));this.G=this.G&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,T(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,S(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=
            this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.H&this.C,H(this,T(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,S(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,H(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,T(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,S(this)));this.D=this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&
            this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.F));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.G));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.H));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,
            H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,0)));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&
            this.C,H(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,T(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,
            S(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.H));
            this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,T(this,0)));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,S(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=
            this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.G));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,T(this,0)));this.J=this.J&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,S(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+this.M()));this.F=this.F&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,T(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,T(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,T(this,
            1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,H(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,T(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.F+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+this.M()));
            t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,1)+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=
            a.call(this,q(this)&this.C,H(this,this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,T(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+
            this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,T(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.J&this.C,H(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,T(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+this.M()));this.J=
            this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.F+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.D+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,T(this,2)+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.K+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+S(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.G&this.C,H(this,this.F+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,T(this,2)+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,I(this,this.L+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+S(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+S(this)));this.H=this.H&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,T(this,2)+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,
            this.K+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+S(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.G+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,H(this,this.D+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,T(this,2)+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+S(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,q(this)&this.C,H(this,this.F+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,T(this,2)+S(this)));
            t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+S(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.L&this.C,H(this,this.G+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,T(this,2)+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,H(this,this.K+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+S(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+S(this)));this.K=this.K&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,T(this,2)+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,
            this.J+S(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.H+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.J&this.C,H(this,T(this,2)+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+S(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,
            this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&
            this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&
            ~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=
            a.call(this,this.H&this.C,q(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,
            this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,
            q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&
            ~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=
            a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,
            this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=
            this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Qd=
            [function(a){a=a.call(this,L(this,this.F),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.F&this.C);P(this,a);this.A-=this.B.aa},
            function(a){a=a.call(this,L(this,this.K),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.G&this.C);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,T(this,0)),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.G&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.H&this.C);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.H),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.H&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.H&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&this.C);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.F),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.D&this.C);P(this,a);this.A-=this.B.aa},
            function(a){a=a.call(this,L(this,this.K),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),q(this)&this.C);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,T(this,0)),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),q(this)&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),q(this)&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.L&this.C);P(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,L(this,this.H),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.L&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.L&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.L&this.C);P(this,a);
            this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.K&this.C);P(this,
            a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.K&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.J&this.C);P(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,L(this,T(this,0)),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,S(this)),this.J&this.C);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,L(this,this.K),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.J&this.C);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),
            this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&this.C);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,T(this,1)+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H&this.C);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.J+this.M()),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),
            this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.H+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.J+this.M()),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.L&this.C);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.H+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
            this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,1)+this.M()),this.J&this.C);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.L+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.H+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.F&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.F&this.C);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,this.L+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.G&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.H&this.C);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.H&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,this.F+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.D&this.C);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.D&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.D+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),q(this)&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),
            this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.K+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.L&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),
            this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.K&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.G+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,T(this,2)+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.L+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+
            S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+S(this)),this.J&this.C);P(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],
            B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],Rd=[function(a,b){var c=a[0].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,
            T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=
            this.B.N},function(a,b){var c=a[1].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
            L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,T(this,0)),b.call(this));P(this,c);
            this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,
            L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,
            c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=
            a[4].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.H),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[6].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,S(this)),
            b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},
            function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,T(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,S(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,
            this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            L(this,T(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,
            this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,
            this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
            this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+
            S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+
            S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,T(this,2)+
            S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+S(this)),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+S(this)),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+S(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.L+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+S(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,T(this,2)+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.L+S(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+S(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
            c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));
            this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],Ae=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.da=this.ga;return q(this)+
            this.F},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.da=this.ga;return q(this)+this.G},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+
            this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.da=this.ga;return q(this)+this.H},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.H},function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.da=this.ga;return q(this)+this.D},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.D},
            function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.da=this.ga;return q(this)+this.L},
            function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.da=this.ga;return q(this)+this.K},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+
            this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.da=this.ga;return q(this)+this.J},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.J},function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.da=this.ga;return q(this)+(this.F<<1)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+(this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.da=this.ga;return q(this)+(this.G<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+
            (this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.da=this.ga;return q(this)+(this.H<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.da=this.ga;return q(this)+(this.D<<1)},function(a){return(a?
            (this.da=this.ga,this.L):this.ia())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+
            (this.L<<1)},function(){this.da=this.ga;return q(this)+(this.L<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<1)},function(){return this.K+(this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.da=this.ga;return q(this)+(this.K<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<1)},function(){return this.K+
            (this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+(this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.da=this.ga;return q(this)+(this.J<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+
            (this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.da=this.ga;return q(this)+(this.F<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.da=this.ga;return q(this)+(this.G<<2)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+(this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.da=this.ga;return q(this)+(this.H<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+
            (this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.da=this.ga;return q(this)+(this.D<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},
            function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+(this.L<<2)},function(){this.da=this.ga;return q(this)+(this.L<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+
            (this.K<<2)},function(){this.da=this.ga;return q(this)+(this.K<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<2)},function(){return this.K+(this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.da=this.ga;return q(this)+(this.J<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<2)},function(){return this.K+
            (this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+(this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.da=this.ga;return q(this)+(this.F<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+
            (this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.da=this.ga;return q(this)+(this.G<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.da=this.ga;return q(this)+(this.H<<3)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+(this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.da=this.ga;return q(this)+(this.D<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},
            function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.da=this.ga;return q(this)+(this.L<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<3)},function(){return this.K+
            (this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+(this.K<<3)},function(){this.da=this.ga;return q(this)+(this.K<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+
            (this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.da=this.ga;return q(this)+(this.J<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<3)},function(){return this.K+(this.J<<3)},function(){return this.J+(this.J<<3)}];
            function Wg(a){Ha.call(this,"ChipSet",a,Wg);this.na=(this.na=a.model)&&Xg[this.na]||Yg;this.$b=0;var b=a.sw1;if(b)this.$b=Zg(b,$g|ah.Tn);else{this.ee=[360,360];(b=a.floppies)&&b.length&&(this.ee=b);if(b=this.ee.length)this.$b|=bh.Kj,b--,this.$b|=(b&3)<<bh.rg;if(b=a.monitor||(this.na<ch?"mono":"ega"),void 0!==dh[b])this.$b|=dh[b]<<ah.rg}this.Oe=Zg(a.sw2||"11110000",0);this.Bp=this.na==Yg?16:64;this.Qh=this.Eg=1;this.na>=ch&&(this.Qh=this.Eg=2);this.te=a.scaleTimers||!1;this.wr=a.rtcDate;this.Sm=!1;
            a.sound&&(this.ck=this.Ig=null,window&&(this.ck=window.AudioContext||window.webkitAudioContext),this.ck&&(this.Ig=new this.ck));this.reset(!0);Ya(this)}Pa(Wg);var Yg=5150,ch=5170,Xg={5150:Yg,5160:5160,5170:ch,deskpro386:5180},dh={none:0,tv:1,color:2,mono:3,ega:0,vga:0},bh={Kj:1,ONE:0,Es:64,Cs:128,$r:192,qg:192,rg:6},$g=12,ah={Ds:16,Sr:32,Tn:48,qg:48,rg:4};f=Wg.prototype;
            f.Kb=function(a,b,c){switch(b){case "sw1":return this.qa[b]=c,eh(this,b,c,this.$b,{0:this.na==Yg?"Bootable Floppy Drive":"Loop on POST",1:this.na==Yg?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.na==Yg)return this.qa[b]=c,eh(this,b,c,this.Oe,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.qa[b]=c,!0}return!1};
            f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.Da=fb(a,"Keyboard");this.lj=c.R.zd/1193181;Sb(b,this,fh);Ub(b,this,gh);this.na<ch?(Sb(b,this,hh),Ub(b,this,ih)):(Sb(b,this,jh),Ub(b,this,kh))};f.fc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};
            f.reset=function(a){var b;this.md=this.$b;this.vf=this.Oe;lh(this);this.$a=Array(this.Qh);for(b=0;b<this.Qh;b++)mh(this,b);this.ac=Array(this.Eg);nh(this,0,32);1<this.Eg&&nh(this,1,160);this.xm=this.Vj=null;this.Tb=Array(5180==this.na?6:3);for(b=0;b<this.Tb.length;b++)oh(this,b);this.Dg=this.Wj=this.Fc=this.Nh=null;this.Mh=0;if(this.na>=ch){this.ab=16;this.Id=0;this.qd=16;this.Hh=0;this.Jd=160;512<=ph(this)&&(this.Jd|=16);3==qh(this)&&(this.Jd|=64);5180==this.na&&(this.Jd|=12);this.Ih=3;this.yb=Array(8);
            this.Hf=0;a&&(this.ea=Array(64));rh(this,this.wr);for(a=21;24>=a;a++)this.ea[a]=0;for(a=14;46>a;a++)void 0===this.ea[a]&&(this.ea[a]=0);this.ea[20]=this.md&(ah.qg|2|bh.Kj|bh.qg);this.ea[16]=sh(this,0)<<4|sh(this,1);th(this)}};
            function rh(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.oc("CMOS date invalid ("+b+"), using "+c)):b&&a.oc("CMOS date: "+c);a.ea[0]=c.getSeconds();a.ea[1]=0;a.ea[2]=c.getMinutes();a.ea[3]=0;a.ea[4]=c.getHours();a.ea[5]=0;a.ea[6]=c.getDay()+1;a.ea[7]=c.getDate();a.ea[8]=c.getMonth()+1;c=c.getFullYear();a.ea[9]=c%100;c/=100;a.ea[50]=c%10|c/10<<4;a.ea[10]=38;a.ea[11]=2;a.ea[12]=0;a.ea[13]=128;a.fh=a.cg=0;a.rn=a.jj=null}
            function yh(a){var b;void 0===b&&(b=a.jj);a.cg=Cc(a.W,a.te)+b;a.ea[11]&64&&zc(a.W,b)}function th(a){for(var b=0,c=16;46>c;c++)b+=a.ea[c];a.ea[47]=b&255;a.ea[46]=b>>8}
            f.save=function(){var a=new Yd(this);a.set(0,[this.$b,this.Oe,this.md,this.vf]);for(var b=[],c=0;c<this.$a;c++){for(var d=this.$a[c],e=d,m=[],n=0;n<e.Db.length;n++){var p=e.Db[n];m[n]=[p.Sd,p.Dh,p.bc,p.Wa,p.Ya,p.mode,p.Oh,p.rr,p.tr]}b[c]=[d.ke,d.Tj,d.ym,d.Fb,m]}a.set(1,[b]);b=[];for(c=0;c<this.ac.length;c++)d=this.ac[c],b[c]=[d.$g,d.cd,d.Vd,d.rd,d.Vb,d.Oc,d.Ue,d.Cg];a.set(2,[b]);b=[];for(c=0;c<this.Tb.length;c++)d=this.Tb[c],b[c]=[d.bc,d.Hc,d.Ya,d.bf,d.Am,d.mode,d.Bj,d.oe,d.af,d.xd,d.Pg,d.ff,d.Ud];
            a.set(3,[this.Vj,b,this.xm]);a.set(4,[this.Nh,this.Fc,this.Wj,this.Dg,this.Mh]);this.na>=ch&&(a.set(5,[this.ab,this.Id,this.qd,this.Hh,this.Jd,this.Ih]),a.set(6,[this.yb[7],this.yb,this.Hf,this.ea,this.fh,this.cg]));return a.data()};
            f.restore=function(a){var b,c;b=a[0];this.$b=b[0];this.Oe=b[1];this.md=b[2];this.vf=b[3];b=a[1];for(c=0;c<this.Qh;c++)mh(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Eg;c++)nh(this,c,0===c?32:160,b[0][c]);b=a[3];this.Vj=b[0];this.xm=b[2];for(c=0;c<this.Tb.length;c++)oh(this,c,b[1][c]);b=a[4];this.Nh=b[0];this.Fc=b[1];this.Wj=b[2];this.Dg=b[3];this.Mh=b[4];if(b=a[5])this.ab=b[0],this.Id=b[1],this.qd=b[2],this.Hh=b[3],this.Jd=b[4],this.Ih=b[5];if(b=a[6])this.yb=b[1],this.yb[7]=b[0],this.Hf=b[2],
            this.ea=b[3],this.fh=b[4],this.cg=b[5],rh(this);return!0};var zh=[0,null,null,0,Array(4)];function mh(a,b,c){var d=a.$a[b];d||(d={Db:Array(4)});c=c&&5==c.length?c:zh;d.ke=c[0];d.Tj=c[1];d.ym=c[2];d.Fb=c[3];d.Lp=b<<2;for(var e=0;e<d.Db.length;e++)Ah(d,e,c[4][e]);a.$a[b]=d}var Bh=[!0,[0,0],[0,0],[0,0],[0,0]];
            function Ah(a,b,c){var d=a.Db[b];d||(d={Dh:[0,0],bc:[0,0],Wa:[0,0],Ya:[0,0]});c=c&&8==c.length?c:Bh;d.Sd=c[0];d.Dh[0]=c[1][0];d.Dh[1]=c[1][1];d.bc[0]=c[2][0];d.bc[1]=c[2][1];d.Wa[0]=c[3][0];d.Wa[1]=c[3][1];d.Ya[0]=c[4][0];d.Ya[1]=c[4][1];d.mode=c[5];d.Oh=c[6];d.V=a;d.bn=b;Ch(d,c[8],c[9]);a.Db[b]=d}function Ch(a,b,c,d){"string"==typeof b&&(b=Ra(b));b&&(a.Yh=null,a.rr=b.id,a.tr=c,a.Wh=b,a.uk=b[c],a.mj=d)}var Dh=[0,Array(4)];
            function nh(a,b,c,d){var e=a.ac[b];e||(e={cd:[null,null,null,null]});d=d&&8==d.length?d:Dh;e.port=c;e.kt=b<<3;e.$g=d[0];e.cd[0]=d[1][0];e.cd[1]=d[1][1];e.cd[2]=d[1][2];e.cd[3]=d[1][3];e.Vd=d[2];e.rd=d[3];e.Vb=d[4];e.Oc=d[5];e.Ue=d[6];e.Cg=d[7];a.ac[b]=e}var Eh=[[0,0],[0,0],[0,0],[0,0]];
            function oh(a,b,c){var d=a.Tb[b];d||(d={bc:[0,0],Hc:[0,0],Ya:[0,0],bf:[0,0]});c=c&&13==c.length?c:Eh;d.bc[0]=c[0][0];d.bc[1]=c[0][1];d.Hc[0]=c[1][0];d.Hc[1]=c[1][1];d.Ya[0]=c[2][0];d.Ya[1]=c[2][1];d.bf[0]=c[3][0];d.bf[1]=c[3][1];d.Am=c[4];d.mode=c[5];d.Bj=c[6];d.oe=c[7];d.af=c[8];d.xd=c[9];d.Pg=c[10];d.ff=c[11];d.Ud=c[12];a.Tb[b]=d}function ph(a,b){return((((b?a.$b:a.md)&12)>>2)+1)*a.Bp+32*((b?a.Oe:a.vf)&15)}function Fh(a,b){var c=b?a.$b:a.md;return a.na!=Yg||c&bh.Kj?((c&bh.qg)>>bh.rg)+1:0}
            function sh(a,b){if(b<Fh(a)){if(!a.ee)return 1;if(b<a.ee.length)switch(a.ee[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function qh(a,b){return((b?a.$b:a.md)&ah.qg)>>ah.rg}
            function eh(a,b,c,d,e){for(var m="",n=1;8>=n;n++){var p="pcjs-bitCell";n||(p+=" pcjs-bitCellLeft");m+='<div id="'+(b+"-"+n)+'" class="'+p+'" data-value="0">'+n+"</div>\n"}c.innerHTML=m;b=Wa(c,"pcjs-bitCell");c=null;for(n=0;n<b.length;n++)null!=e&&null!=e[n]&&(c=e[n]),c&&b[n].setAttribute("title",c),Gh(b[n],d&1<<n?!1:!0),b[n].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Gh(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.$b=a.$b&~e|
            (c?0:e);break;case "sw2":a.Oe=a.Oe&~e|(c?0:e)}lh(a)}}(a,b[n])}function Gh(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function lh(a){var b=a.qa.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(ph(a,!0)+"Kb");d+=", "+c[qh(a,!0)]+" Monitor";d+=", "+Fh(a,!0)+" Floppy Drives";if(null!=a.md&&a.md!=a.$b||null!=a.vf&&a.vf!=a.Oe)d+=" (Reset required)";b.textContent=d}}
            function Hh(a,b,c){a=a.$a[b];var d=a.Db[c],e=d.Wa[a.Fb];a.Fb^=1;b||0!=c||a.Fb||(d.Wa[0]++,255<d.Wa[0]&&(d.Wa[0]=0,d.Wa[1]++,255<d.Wa[1]&&(d.Wa[1]=0)));return e}function Ih(a,b,c,d){a=a.$a[b];c=a.Db[c];c.Wa[a.Fb]=c.Dh[a.Fb]=d;a.Fb^=1}function Jh(a,b,c){a=a.$a[b];var d=a.Db[c],e=d.Ya[a.Fb];a.Fb^=1;b||0!=c||a.Fb||(d.Ya[0]--,0>d.Ya[0]&&(d.Ya[0]=255,d.Ya[1]--,0>d.Ya[1]&&(d.Ya[1]=255)));return e}function Kh(a,b,c,d){a=a.$a[b];c=a.Db[c];c.Ya[a.Fb]=c.bc[a.Fb]=d;a.Fb^=1}
            function Lh(a,b){var c=a.$a[b],d=c.ke|1;c.ke&=-16;return d}function Mh(a,b,c){a=a.$a[b];b=c&3;a.ke=a.ke&~(16<<b)|(c&4)<<b+2;a.ym=c}function Nh(a,b,c){b=a.$a[b];var d=c&3,e=b.Db[d];e.Sd=!!(c&4);e.Sd||Oh(a,b.Lp+d)}function Ph(a,b){for(var c=a.$a[b],d=0;d<c.Db.length;d++)Ah(c,d)}function Qh(a,b,c){return a.$a[b].Db[c].Oh}function Rh(a,b,c,d){a.$a[b].Db[c].Oh=d}function Sh(a,b,c,d,e){Ch(a.$a[b>>2].Db[b&3],c,d,e)}
            function Oh(a,b,c){b=a.$a[b>>2].Db[b&3];b.Wh&&b.uk&&b.mj?(c&&(b.Yh=c),b.Sd||Ee(a,b,!0)):c&&c(!0)}function Ee(a,b,c){c&&(b.count=b.Ya[1]<<8|b.Ya[0],b.type=b.mode&12,b.Vm=b.wd=!1);for(var d=!1;0<=b.count&&(c=b.Oh<<16|b.Wa[1]<<8|b.Wa[0],4==b.type?(d=!0,function(c){b.uk.call(b.Wh,b.mj,-1,function(m,n){0>m&&(b.Vm||(b.Vm=!0),m=255);b.Sd||a.la.Me(c,m);(d=n)&&setTimeout(function(){Th(b)||Ee(a,b)},0)})}(c)):8==b.type?(c=a.la.vc(c),0>b.uk.call(b.Wh,b.mj,c)&&(b.wd=!0)):0!=b.type&&(b.wd=!0)),!d&&!Th(b););}
            function Th(a){if(!a.wd&&0<=--a.count&&(a.mode&32?(a.Wa[0]--,0>a.Wa[0]&&(a.Wa[0]=255,a.Wa[1]--,0>a.Wa[1]&&(a.Wa[1]=255))):(a.Wa[0]++,255<a.Wa[0]&&(a.Wa[0]=0,a.Wa[1]++,255<a.Wa[1]&&(a.Wa[1]=0))),!a.Sd))return!1;var b=a.V;b.ke=b.ke&~(16<<a.bn)|1<<a.bn;a.mode&16||(a.Sd=!0,a.Wh=a.mj=null);a.Yh&&(a.Yh(!a.wd),a.Yh=null);return!0}function Uh(a,b){var c=0,d=a.ac[b];if(null!=d.Cg)switch(d.Cg&3){case 2:c=d.Vb;break;case 3:c=d.Oc}return c}
            function Vh(a,b,c){var d=a.ac[b];if(c&16)d.Vd=0,d.cd[d.Vd++]=c,d.rd=0,d.Ue=7,d.Vb=d.Oc=0,d.Cg=10;else if(c&8)c&100&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW3 command: "+ea(c)),d.Cg=c;else{var e=c&224;if(e&32){var m,n=0;if(96==(e&96))n=1<<(c&7);else for(m=d.Ue+1;;){m&=7;var p=1<<m;if(d.Oc&p){n=p;break}if(m++==d.Ue)break}d.Oc&n&&(d.Oc&=~n,Wh(a));e&128&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 rotate command: "+ea(c))}else 192==e?d.Ue=c&7:a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 automatic EOI command: "+
            ea(c))}}function Xh(a,b,c){var d=a.ac[b];d.Vd<d.cd.length?(d.cd[d.Vd++]=c,2==d.Vd&&d.cd[0]&2&&d.Vd++,3!=d.Vd||d.cd[0]&1||d.Vd++):(d.rd=c,d=a.W,d.Q|=4,Wh(a,b||253!=c?0:6))}function Yh(a,b,c){var d=a.ac[b>>3];b=1<<(b&7);d.Vb&b||(d.Vb|=b,d.$g=c||0,Wh(a))}function Zh(a,b){var c=a.ac[b>>3],d=1<<(b&7);c.Vb&d&&(c.Vb&=~d,Wh(a))}
            function Wh(a,b){var c,d=-1;1<a.Eg&&(c=a.ac[1],d=~(c.Oc|c.rd)&c.Vb);c=a.ac[0];0<=d&&(c.Vb=d?c.Vb|4:c.Vb&-5);var d=~(c.Oc|c.rd)&c.Vb,e=a.W;e.fa&&(e.kb=d?e.kb|1:e.kb&-2);d&&b&&(c.$g=b)}function Ce(a,b){void 0===b&&(b=0);var c=-1,d=a.ac[b];if(d.$g)c=-2,d.$g--;else for(var e=d.Vb&((d.Oc|d.rd)^255),m=d.Ue+1;;){var m=m&7,n=1<<m;if(e&n){c=b||2!=m?d.cd[1]+m:Ce(a,1);0<=c&&(d.Oc|=n,d.Vb&=~n);break}if(m++==d.Ue)break}return c}
            function $h(a,b){var c=a.Tb[b];c.oe==c.af&&ai(a,b);if(c.Pg)return c.bf[c.oe++];bi(a,b);return c.Ya[c.oe++]}function ci(a,b,c){var d=a.Tb[b];d.oe==d.af&&ai(a,b);d.bc[d.oe++]=c;d.oe==d.af&&(d.ff&&0!=d.mode&&8!=d.mode||(d.Pg=!1,d.Ya[0]=d.Hc[0]=d.bc[0],d.Ya[1]=d.Hc[1]=d.bc[1],d.Ud=Cc(a.W,a.te),d.ff=!0,d.xd=0!=d.mode,0==b&&(Zh(a,0),c=di(a,0)*a.lj|0,6==d.mode&&(c>>=1),zc(a.W,c))),2==b&&Dc(a))}f=Wg.prototype;f.kp=function(){return null};
            f.Mq=function(a,b){this.Vj=b;var c=(b&192)>>6;if(3!=c){var d=b&1,e=b&14,m=b&48;if(m){var n=this.Tb[c];n.Bj=m;n.mode=e;n.Am=d;n.bc=[0,0];n.Ya=[0,0];n.bf=[0,0];n.xd=!1;n.Pg=!1;n.ff=!1;ai(this,c);0==c&&Zh(this,0);2==c&&255==this.ac[0].rd&&77==this.Fc&&(c=this.Tb[0],c.Hc[0]=c.bc[0],c.Hc[1]=c.bc[1],c.Ud=Cc(this.W,this.te))}else bi(this,c),d=this.Tb[c],d.bf[0]=d.Ya[0],d.bf[1]=d.Ya[1],d.Pg=!0,ai(this,c)}};function di(a,b){var c=a.Tb[b],d=c.bc[1]<<8|c.bc[0];d||(d=1==c.af?256:65536);return d}
            function Fc(a,b){var c=a.Tb[b],d=c.Hc[1]<<8|c.Hc[0];d||(d=1==c.af?256:65536);return d}function ai(a,b){var c=a.Tb[b];c.oe=32==c.Bj?1:0;c.af=48==c.Bj?2:1}
            function bi(a,b,c){var d=a.Tb[b];if(d.ff&&(2!=b||a.Fc&1)){var e=Cc(a.W,a.te),m=(e-d.Ud)/a.lj|0;0>m&&(d.Ud=e,m=0);var n=di(a,b),p=Fc(a,b)-m;0==d.mode?(0>=p&&(p=0),p||(d.xd=!0,d.ff=!1,b||Yh(a,0))):4==d.mode?(d.xd=1!=p,0>=p&&(p=n+p,0>=p&&(p=n),d.Hc[0]=p&255,d.Hc[1]=p>>8,d.Ud=e,!b&&d.xd&&Yh(a,0))):6==d.mode&&(p-=m,0>=p&&(d.xd=!d.xd,p=n+p,0>=p&&(p=n),d.Hc[0]=p&255,d.Hc[1]=p>>8,d.Ud=e,!b&&d.xd&&Yh(a,0)));d.Ya[0]=p&255;d.Ya[1]=p>>8;c&&(a.Ud=0)}return d}
            function Ec(a,b){for(var c=0;c<a.Tb.length;c++)bi(a,c,b);if(a.na>=ch){var c=a.W.R.zd,d=Cc(a.W,a.te);null==a.jj&&(a.fh=Cc(a.W,a.te),a.rn=1024,a.jj=Math.floor(a.W.R.zd/a.rn),yh(a));d>=a.cg&&(a.ea[12]|=64,a.ea[11]&64&&(a.ea[12]|=128,Yh(a,8)),a.cg=d+a.jj);a.ea[0]==a.ea[1]&&a.ea[2]==a.ea[3]&&a.ea[4]==a.ea[5]&&(a.ea[12]|=32,a.ea[11]&32&&(a.ea[12]|=128,Yh(a,8)));var e=d-a.fh,m=Math.floor(e/c);if(m&&!(a.ea[11]&128)){for(;m--;)if(60<=++a.ea[0]&&(a.ea[0]=0,60<=++a.ea[2]&&(a.ea[2]=0,24<=++a.ea[4]))){a.ea[4]=
            0;a.ea[6]=a.ea[6]%7+1;var n;n=a.ea[9];var p=na[a.ea[8]-1];28==p&&0===n%4&&(n%100||0===n%400)&&p++;n=p;++a.ea[7]>n&&(a.ea[7]=1,12<++a.ea[8]&&(a.ea[8]=1,a.ea[9]=(a.ea[9]+1)%100))}a.ea[12]|=16;a.ea[11]&16&&(a.ea[12]|=128,Yh(a,8))}a.fh=d-e%c}}f.lp=function(){var a=this.Nh;if(this.Dg&16)if(this.Fc&128)a=this.md;else if(this.Da){var a=this.Da,b=0;a.Ub.length&&(b=a.Ub[0]);a=b}return a};f.Nq=function(a,b){this.Nh=b};f.mp=function(){return this.Fc};
            f.Oq=function(a,b){ei(this,b);this.Da&&fi(this.Da,b&128?!1:!0,b&64?!0:!1)};function ei(a,b){var c=!!(b&2),d=!!(a.Fc&2);a.Fc=b;c!=d&&Dc(a,c)}f.np=function(){var a=0,a=this.na==Yg?this.Fc&4?a|this.vf&15:a|this.vf>>4&1:this.Fc&8?a|this.md>>4:a|this.md&15;this.Fc&1&&bi(this,2).xd&&(a=this.Fc&2?a|32:a|16);return a};f.Pq=function(a,b){this.Wj=b};f.op=function(){return this.Dg};f.Qq=function(a,b){this.Dg=b};f.Bo=function(){var a=this.Hh;this.ab&=-258;this.Da&&gi(this.Da);return a};
            f.aq=function(a,b){if(this.ab&8)switch(this.Id){case 96:hi(this,b);break;case 209:ii(this,b);break;default:if(hi(this,this.qd&-17),this.Da){var c=-1;switch(b){case 255:c=250,ji(this.Da)}ki(this,c)}}this.Id=b;this.ab&=-9};f.Co=function(){return this.Fc&-209|(Cc(this.W)&64?16:0)};f.bq=function(a,b){ei(this,b)};f.Do=function(){var a=this.ab&255;this.ab&256&&(this.ab|=1,this.ab&=-257);return a};
            f.$p=function(a,b){this.Id=b;this.ab|=8;var c=0;240<=this.Id&&(c=this.Id^15,this.Id=240);switch(this.Id){case 32:ki(this,this.qd);break;case 173:hi(this,this.qd|16);break;case 174:hi(this,this.qd&-17);this.Da&&gi(this.Da);break;case 170:this.Da&&(this.Da.Ub=[]);hi(this,this.qd|16);ki(this,85);ii(this,3);break;case 171:ki(this,0);break;case 192:ki(this,this.Jd);break;case 208:ki(this,this.Ih);break;case 224:ki(this,this.qd&16?0:1);break;case 240:c&1&&Dd(this.W)}};
            function hi(a,b){a.qd=b;a.ab=a.ab&-5|b&4;a.Da&&fi(a.Da,!!(b&8),!(b&16))}function ki(a,b,c){0<=b&&(a.Hh=b,c?a.ab|=1:(a.ab&=-2,a.ab|=256))}function ii(a,b){a.Ih=b;Hb(a.la,!!(b&2));b&1||Dd(a.W)}function li(a,b){a.na<ch?Yh(a,1,4):a.qd&16||a.ab&257||(ki(a,b,!0),mi(a.Da),Yh(a,1,120))}f.Ro=function(){return this.Hf};f.pq=function(a,b){this.Hf=b;this.Mh=b&128?0:128};
            f.So=function(a,b){var c=this.Hf&63,d;if(13>=c)if(d=this.ea[c],10>c){var e=!1;4!=c&&5!=c||this.ea[11]&2||(d=12>d?d?d:12:(d-=12)?d+128:140,e=!0);this.ea[11]&4||(e&&128<d&&(d-=48),d=d%10|d/10<<4)}else 10==c&&(this.ea[c]^=128);else d=this.ea[c];null!=b&&12==c&&(this.ea[c]&=15,d&128&&Zh(this,8),d&64&&this.ea[11]&64&&yh(this));return d};
            f.qq=function(a,b){var c=this.Hf&63,d=b^this.ea[c],e;if(13>=c){if(e=b,10>c){var m=!1;this.ea[11]&4||(e=10*(e>>4)+(e&15),m=!0);if(4==c||5==c)m&&23<e&&(e+=48),this.ea[11]&2||(12>=e?e=12==e?0:e:(e-=116,e=24==e?12:e))}}else e=b;this.ea[c]=e;11==c&&d&64&&b&64&&yh(this)};f.Lq=function(a,b){this.Mh=b};f.rq=function(){};f.sq=function(){};function Zg(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
            function Dc(a,b){if(a.Ig)try{void 0!==b?a.Sm=b:b=a.Sm&&a.W&&a.W.ha.Pb;var c=Math.round(1193181/di(a,2));if(20>c||2E4<c)b=!1;b?a.ic?a.ic.frequency.value=c:(a.ic=a.Ig.createOscillator(),a.ic&&(a.ic.type="number"==typeof a.ic.type?1:"square",a.ic.connect(a.Ig.destination),a.ic.frequency.value=c,"start"in a.ic?a.ic.start(0):a.ic.noteOn(0))):a.ic&&("stop"in a.ic?a.ic.stop(0):a.ic.noteOff(0),a.ic.disconnect(),delete a.ic)}catch(d){a.wa("AudioContext exception: "+d.message),a.Ig=null}else b&&a.nc("BEEP",
            8388608)}
            var fh={0:function(){return Hh(this,0,0)},1:function(){return Jh(this,0,0)},2:function(){return Hh(this,0,1)},3:function(){return Jh(this,0,1)},4:function(){return Hh(this,0,2)},5:function(){return Jh(this,0,2)},6:function(){return Hh(this,0,3)},7:function(){return Jh(this,0,3)},8:function(){return Lh(this,0)},32:function(){return Uh(this,0)},33:function(){return this.ac[0].rd},64:function(){return $h(this,0)},65:function(){return $h(this,1)},66:function(){return $h(this,2)},67:Wg.prototype.kp,129:function(){return Qh(this,
            0,2)},130:function(){return Qh(this,0,3)},131:function(){return Qh(this,0,1)},135:function(){return Qh(this,0,0)}},hh={96:Wg.prototype.lp,97:Wg.prototype.mp,98:Wg.prototype.np,99:Wg.prototype.op},jh={96:Wg.prototype.Bo,97:Wg.prototype.Co,100:Wg.prototype.Do,112:Wg.prototype.Ro,113:Wg.prototype.So,128:function(){return this.yb[7]},132:function(){return this.yb[0]},133:function(){return this.yb[1]},134:function(){return this.yb[2]},136:function(){return this.yb[3]},137:function(){return Qh(this,1,2)},
            138:function(){return Qh(this,1,3)},139:function(){return Qh(this,1,1)},140:function(){return this.yb[4]},141:function(){return this.yb[5]},142:function(){return this.yb[6]},143:function(){return Qh(this,1,0)},160:function(){return Uh(this,1)},161:function(){return this.ac[1].rd},192:function(){return Hh(this,1,0)},194:function(){return Jh(this,1,0)},196:function(){return Hh(this,1,1)},198:function(){return Jh(this,1,1)},200:function(){return Hh(this,1,2)},202:function(){return Jh(this,1,2)},204:function(){return Hh(this,
            1,3)},206:function(){return Jh(this,1,3)},208:function(){return Lh(this,1)}},gh={0:function(a,b){Ih(this,0,0,b)},1:function(a,b){Kh(this,0,0,b)},2:function(a,b){Ih(this,0,1,b)},3:function(a,b){Kh(this,0,1,b)},4:function(a,b){Ih(this,0,2,b)},5:function(a,b){Kh(this,0,2,b)},6:function(a,b){Ih(this,0,3,b)},7:function(a,b){Kh(this,0,3,b)},8:function(a,b){this.$a[0].Tj=b},9:function(a,b){Mh(this,0,b)},10:function(a,b){Nh(this,0,b)},11:function(a,b){this.$a[0].Db[b&3].mode=b},12:function(){this.$a[0].Fb=
            0},13:function(){Ph(this,0)},32:function(a,b){Vh(this,0,b)},33:function(a,b){Xh(this,0,b)},64:function(a,b){ci(this,0,b)},65:function(a,b){ci(this,1,b)},66:function(a,b){ci(this,2,b)},67:Wg.prototype.Mq,129:function(a,b){Rh(this,0,2,b)},130:function(a,b){Rh(this,0,3,b)},131:function(a,b){Rh(this,0,1,b)},135:function(a,b){Rh(this,0,0,b)}},ih={96:Wg.prototype.Nq,97:Wg.prototype.Oq,98:Wg.prototype.Pq,99:Wg.prototype.Qq,160:Wg.prototype.Lq},kh={96:Wg.prototype.aq,97:Wg.prototype.bq,100:Wg.prototype.$p,
            112:Wg.prototype.pq,113:Wg.prototype.qq,128:function(a,b){this.yb[7]=b},132:function(a,b){this.yb[0]=b},133:function(a,b){this.yb[1]=b},134:function(a,b){this.yb[2]=b},136:function(a,b){this.yb[3]=b},137:function(a,b){Rh(this,1,2,b)},138:function(a,b){Rh(this,1,3,b)},139:function(a,b){Rh(this,1,1,b)},140:function(a,b){this.yb[4]=b},141:function(a,b){this.yb[5]=b},142:function(a,b){this.yb[6]=b},143:function(a,b){Rh(this,1,0,b)},160:function(a,b){Vh(this,1,b)},161:function(a,b){Xh(this,1,b)},192:function(a,
            b){Ih(this,1,0,b)},194:function(a,b){Kh(this,1,0,b)},196:function(a,b){Ih(this,1,1,b)},198:function(a,b){Kh(this,1,1,b)},200:function(a,b){Ih(this,1,2,b)},202:function(a,b){Kh(this,1,2,b)},204:function(a,b){Ih(this,1,3,b)},206:function(a,b){Kh(this,1,3,b)},208:function(a,b){this.$a[1].Tj=b},210:function(a,b){Mh(this,1,b)},212:function(a,b){Nh(this,1,b)},214:function(a,b){this.$a[1].Db[b&3].mode=b},216:function(){this.$a[1].Fb=0},218:function(){Ph(this,1)},240:Wg.prototype.rq,241:Wg.prototype.sq};
            Da(function(){for(var a=Wa(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Wg(d);Va(d,c);lh(d)}});
            function ni(a){Ha.call(this,"ROM",a,ni);this.Eb=null;this.Rj=a.addr;this.mg=a.size;this.zg=a.alias;this.sh=a.file;this.sr=fa(this.sh);this.we=a.notify;this.lm=null;if(this.we&&(a=this.we.indexOf("["),0<a)){try{this.lm=eval(this.we.substr(a))}catch(b){}this.we=this.we.substr(0,a)}if(this.sh){a=this.sh;var c=ga(this.sr);"json"!=c&&"hex"!=c&&(a=ra()+"/api/v1/dump?file="+this.sh+"&format=bytes&decimal=true");qa(a,!0,null,this,ni.prototype.Wp)}}Pa(ni);
            ni.prototype.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;oi(this)};ni.prototype.fc=function(){this.Qj&&(this.Sa&&this.Sa.Ns(this.Rj,this.mg,this.Qj),delete this.Qj);return!0};ni.prototype.ec=function(){return!0};
            ni.prototype.Wp=function(a,b,c){if(c)this.wa("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,m=d.data;if(e)this.Eb=e;else if(m)for(this.Eb=Array(4*m.length),c=b=0;b<m.length;b++)this.Eb[c++]=m[b]&255,this.Eb[c++]=m[b]>>8&255,this.Eb[c++]=m[b]>>16&255,this.Eb[c++]=m[b]>>24&255;else this.Eb=d;this.Qj=d.symbols;if(!this.Eb.length){sa("Empty ROM: "+a);return}if(1==this.Eb.length){sa(this.Eb[0]);return}}catch(n){this.wa("ROM data error: "+
            n.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Eb=Array(a.length),d=0;d<a.length;d++)this.Eb[d]=ca(a[d],16);oi(this)}};
            function oi(a){if(!Za(a))if(!a.sh)Ya(a);else if(a.Eb&&a.la){if(a.Eb.length!=a.mg)$a(a,"ROM size (0x"+da(a.Eb.length)+") does not match specified size ("+("0x"+da(a.mg))+")");else{var b;b=a.Rj;if(Ib(a.la,b,a.mg,ac)){for(var c=0;c<a.Eb.length;c++){var d=a.la,e=b+c;d.ka[(e&d.vb)>>>d.Aa].cm(e&d.Ea,a.Eb[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.zg?b.push(a.zg):null!=a.zg&&a.zg.length&&(b=a.zg);for(c=0;c<b.length;c++){var d=a,e=b[c],m=Lb(d.la,d.Rj,d.mg);Kb(d.la,e,d.mg,m)}a.we&&((b=Ra(a.we,
            a.id))?(c=a.Eb,d=a.lm,5==b.wb?pi(b,c,d||[12640,8752],8):7==b.wb&&pi(b,c,d||[14221,16269],8),Ya(b)):a.wa("Unable to find component: "+a.we));delete a.Eb}}Ya(a)}}Da(function(){for(var a=Wa(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new ni(d);Va(d,c)}});function qi(a){Ha.call(this,"RAM",a,qi);this.Eh=a.addr;this.$d=a.size;this.vo=a.test;this.ro=!!this.$d;this.$h=!1}Pa(qi);qi.prototype.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet");Ya(this)};
            qi.prototype.fc=function(a,b){b||this.reset();return!0};qi.prototype.ec=function(){return!0};
            qi.prototype.reset=function(){if(!this.Eh&&!this.ro&&this.fa){var a=1024*ph(this.fa);this.$d&&a!=this.$d&&(Mb(this.la,this.Eh,this.$d),this.$h=!1);this.$d=a}!this.$h&&this.$d&&Ib(this.la,this.Eh,this.$d,1)&&(this.$h=!0,this.status(Math.floor(this.$d/1024)+"Kb allocated"),"ramCPQ"==this.Sg&&(this.V=new ri(this),Ib(this.la,si,1,4,this.V)));if(this.$h){if(this.vo||Ob(this.la,1138,4660),"ramCPQ"!=this.Sg&&this.fa&&(a=this.fa,a.ea)){var b=1048576>this.Eh?21:23,c=a.ea[b]|a.ea[b+1]<<8,c=c+(this.$d>>10);
            a.ea[b]=c&255;a.ea[b+1]=c>>8;th(a)}}else sa("No RAM allocated")};function ri(a){this.$q=a;this.bm=ti;this.Nn=ui;this.Ij=vi;this.tg=null}
            var si=-2134900736,ti=65535,ui=2575,vi=2,wi=[null,0],xi=[function(a){var b=255;2>a?b=a&1?this.V.Nn>>8:this.V.Nn&255:4>a&&(b=a&1?this.V.Ij>>8:this.V.Ij&255);return b},null,null,function(a,b){var c=this.V;if(a)2==a&&(c.Ij=c.Ij&-256|b);else if(b!=(c.bm&255)){var d=c.$q.la;if(b&1)c.tg&&(Kb(d,917504,131072,c.tg),c.tg=null);else{c.tg||(c.tg=Lb(d,917504,131072));var e=Lb(d,16646144,131072);Kb(d,917504,131072,e,b&2?1:ac)}c.bm=c.bm&-256|b}},null,null];ri.prototype.Zm=function(){return wi};
            ri.prototype.vk=function(){return xi};Da(function(){for(var a=Wa(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new qi(d);Va(d,c)}});function yi(a){Ha.call(this,"Keyboard",a,yi);this.Qm=ya("Mobi");this.so=ya("MSIE");this.nc("mobile keyboard support: "+(this.Qm?"true":"false"));this.Dm=0;this.ei=!0;this.sk=this.ok=!1;this.Lb=[];this.Ip=500;this.Jp=100;this.Hp=50;this.Lm=!1;Ya(this)}Pa(yi);
            var V={Tr:1,Ur:3,Vr:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,Qr:65,Rr:66,gm:67,Rn:68,E:69,Yr:70,as:71,hm:72,ds:73,es:74,fs:75,gs:76,hs:77,Lj:78,ks:79,ls:80,ns:81,jm:82,rs:83,Bs:84,Fs:85,Gs:86,Hs:87,Js:88,Ks:89,Ls:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,Ms:97,Os:98,Rs:99,Ys:100,Zs:101,$s:102,bt:103,ct:104,et:105,ft:106,gt:107,
            ht:108,it:109,jt:110,lt:111,mt:112,nt:113,ot:114,pt:115,qt:116,rt:117,st:118,tt:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},zi={};zi[186]=V[";"];zi[187]=V["="];zi[188]=V[","];zi[189]=V["-"];zi[190]=V["."];zi[191]=V["/"];zi[192]=V["`"];zi[219]=V["["];zi[220]=V["\\"];zi[221]=V["]"];zi[222]=V["'"];zi[173]=V["-"];var Ai={};Ai[V["1"]]=V["!"];Ai[V["2"]]=V["@"];Ai[V["3"]]=V["#"];Ai[V["4"]]=V.$;Ai[V["5"]]=V["%"];Ai[V["6"]]=V["^"];Ai[V["7"]]=V["&"];Ai[V["8"]]=V["*"];Ai[V["9"]]=V["("];
            Ai[V["0"]]=V[")"];Ai[186]=V[":"];Ai[187]=V["+"];Ai[188]=V["<"];Ai[189]=V._;Ai[190]=V[">"];Ai[191]=V["?"];Ai[192]=V["~"];Ai[219]=V["{"];Ai[220]=V["|"];Ai[221]=V["}"];Ai[222]=V['"'];Ai[173]=V._;Ai[61]=V["+"];Ai[59]=V[":"];
            var Bi={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Ci={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Di={esc:1027,1:V["1"],2:V["2"],3:V["3"],4:V["4"],5:V["5"],6:V["6"],7:V["7"],8:V["8"],9:V["9"],0:V["0"],"-":V["-"],"=":V["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":V["["],"]":V["]"],enter:13,
            ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":V[";"],quote:V["'"],"`":V["`"],shift:1016,"\\":V["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":V[","],".":V["."],"/":V["/"],"right-shift":3016,prtsc:1044,alt:1018,space:V[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
            "num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Ei={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},X={1027:1};X[V["1"]]=2;X[V["!"]]=10754;X[V["2"]]=3;X[V["@"]]=10755;X[V["3"]]=4;X[V["#"]]=10756;X[V["4"]]=5;X[V.$]=10757;X[V["5"]]=6;X[V["%"]]=10758;X[V["6"]]=7;X[V["^"]]=10759;X[V["7"]]=8;X[V["&"]]=10760;X[V["8"]]=9;X[V["*"]]=10761;X[V["9"]]=10;X[V["("]]=10762;X[V["0"]]=11;X[V[")"]]=10763;X[V["-"]]=12;X[V._]=10764;X[V["="]]=13;X[V["+"]]=10765;X[1008]=14;X[1009]=15;X[113]=16;
            X[81]=10768;X[119]=17;X[87]=10769;X[101]=18;X[69]=10770;X[114]=19;X[82]=10771;X[116]=20;X[84]=10772;X[121]=21;X[89]=10773;X[117]=22;X[85]=10774;X[105]=23;X[73]=10775;X[111]=24;X[79]=10776;X[112]=25;X[80]=10777;X[V["["]]=26;X[V["{"]]=10778;X[V["]"]]=27;X[V["}"]]=10779;X[13]=28;X[1017]=29;X[97]=30;X[65]=10782;X[115]=31;X[83]=10783;X[100]=32;X[68]=10784;X[102]=33;X[70]=10785;X[103]=34;X[71]=10786;X[104]=35;X[72]=10787;X[106]=36;X[74]=10788;X[107]=37;X[75]=10789;X[108]=38;X[76]=10790;X[V[";"]]=39;
            X[V[":"]]=10791;X[V["'"]]=40;X[V['"']]=10792;X[V["`"]]=41;X[V["~"]]=10793;X[1016]=42;X[V["\\"]]=43;X[V["|"]]=10795;X[122]=44;X[90]=10796;X[120]=45;X[88]=10797;X[99]=46;X[67]=10798;X[118]=47;X[86]=10799;X[98]=48;X[66]=10800;X[110]=49;X[78]=10801;X[109]=50;X[77]=10802;X[V[","]]=51;X[V["<"]]=10803;X[V["."]]=52;X[V[">"]]=10804;X[V["/"]]=53;X[V["?"]]=10805;X[3016]=54;X[1044]=55;X[1018]=56;X[V[" "]]=57;X[1020]=58;X[1112]=59;X[1113]=60;X[1114]=61;X[1115]=62;X[1116]=63;X[1117]=64;X[1118]=65;X[1119]=66;
            X[1120]=67;X[1121]=68;X[1144]=69;X[1145]=70;X[1036]=71;X[1038]=72;X[1033]=73;X[1109]=74;X[1037]=75;X[1101]=76;X[1039]=77;X[1107]=78;X[1035]=79;X[1040]=80;X[1034]=81;X[1045]=82;X[1046]=83;X[1122]=87;X[1123]=88;X[1091]=91;X[1093]=93;X[1224]=91;X[4003]=7470;X[4008]=7494;X[4046]=3677523;f=yi.prototype;
            f.Kb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.qa[e])switch(b){case "kbd":return c.onkeydown=function(a){return Fi(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Lm){var b=d.Lb.length?d.Lb[0].Ne:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.sk=!0,a=b)}(b=!X[a]||!!(d.Xb&128))||Gi(d,a,!0);return b},c.onkeyup=function(a){return Fi(d,a,!1)},!0;case "caps-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1020,!0)},
            !0;case "num-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1144,!0)},!0;case "scroll-lock":return this.qa[e]=c,c.onclick=function(){d.W&&d.W.Fd();Gi(d,1145,!0)},!0;default:var m=b.toUpperCase().replace(/-/g,"_");if(void 0!==Ci[m]&&"button"==a)return this.qa[e]=c,c.onclick=function(a,b,c){return function(){a.W&&a.W.Fd();Hi(a,c,!0);Gi(a,c,!0)}}(this,m,Ci[m]),!0;if(void 0!==Di[b])return this.Dm++,this.qa[e]=c,a=function(a,b,c){return function(){Gi(a,c)}}(this,b,Di[b]),b=function(a,
            b,c){return function(){Ii(a,c)}}(this,b,Di[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Ji(a,b,c){if(a.Dm){for(var d in Ai)if(b==Ai[d]){b=+d;(d=zi[d])&&(b=d);break}for(var e in Di)if((d=Di[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Di[e]==d),d){(a=a.qa["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
            f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet")};function ji(a,b){a.nc("keyboard reset",65792);a.Ub=[170];a.Lg=!0;b&&a.fa&&li(a.fa,a.Ub[0])}function fi(a,b,c){a.nk!==c&&(a.nk=a.rk=c)&&(a.Lg=!0);a.di!==b&&(a.di=b)&&!a.rk&&mi(a,!0);a.di&&a.rk&&(ji(a,!0),a.rk=!1)}function gi(a){var b=0;a.Ub.length&&a.Lg&&(b=a.Ub[0],a.fa&&li(a.fa,b))}function mi(a,b){0<a.Ub.length&&(a.Ub.shift(),(a.Lg=b)&&a.Ub.length&&a.fa&&li(a.fa,a.Ub[0]))}
            f.fc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe();this.Xb=this.td=0;this.Ub=[];this.Lg=!0};f.save=function(){var a=new Yd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.xe(a[0])};f.xe=function(a){var b=0;void 0===a&&(a=[]);this.nk=this.Lg=a[b++];this.di=a[b];return!0};f.am=function(){var a=0,b=[];b[a++]=this.nk;b[a]=this.di;return b};
            function Hi(a,b,c,d){if(X[b]){var e=Math.floor(b/1E3)&2;if(b=Bi[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.td:a.Xb)&b):d||b&255&&(b=255);if(c){a.td&=~b;d&&(a.td|=b);c=b;var m,n;for(n in Ei)d="led-"+n,e=Ei[n],c&&c!=e||!(m=a.qa[d])||(m.style.backgroundColor=a.td&e?"#00ff00":"#000000")}else a.Xb&=~b,d&&(a.Xb|=b);return!0}}return!1}
            function Gi(a,b,c){if(X[b]&&a.W&&a.W.ha.Pb){Bi[b]&&a.Lb.length&&0<a.Lb[0].Bd&&(a.Lb[0].Bd=0);for(var d,e=0;e<a.Lb.length;e++)if(d=a.Lb[e],d.Ne==b){if(!c||0<=d.Bd){e=-1;break}0<e&&(0<a.Lb[0].Bd&&(a.Lb[0].Bd=0),a.Lb.splice(e,1));break}0>e||(e==a.Lb.length&&(d={},d.Ne=b,d.Xb=a.Xb,Ji(a,b,!0),e++),0<e&&a.Lb.splice(0,0,d),d.Og=!0,d.Bd=c?-1:Bi[b]?0:1,Ki(a,d))}}
            function Ii(a,b,c){if(!X[b]||!(c||a.W&&a.W.ha.Pb))return!1;for(var d=!1,e=0;e<a.Lb.length;e++){var m=a.Lb[e];if(m.Ne==b||m.Ne==Ai[b]){a.Lb.splice(e,1);m.Ln&&clearTimeout(m.Ln);m.Og&&!c&&Li(a,m.Ne,!1);Ji(a,b,!1);d=!0;break}}!a.Lb.length&&a.sk&&(Hi(a,1020),a.sk=!1);return d}
            function Ki(a,b){if(a.W&&a.W.ha.Pb){if(Li(a,b.Ne,b.Og),b.Bd){var c;if(0>b.Bd){if(!b.Og){Ii(a,b.Ne);return}b.Og=!1;c=a.Hp}else c=1==b.Bd++?a.Ip:a.Jp;b.Ln=setTimeout(function(a){return function(){Ki(a,b)}}(a),c)}}else Ii(a,b.Ne,!0)}function Mi(a,b,c){var d=b;if(65<=b&&90>=b)!(a.Xb&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.Xb&515)==c&&(d=b-32);else if(!!(a.Xb&3)==c){if(a=Ai[b])d=a}else if(a=zi[b])d=a;return d}f.nj=function(a){this.ei=a;a||(this.Xb&=-256)};
            function Fi(a,b,c){var d=!0,e=!1,m=!1,n=b.keyCode,p=Mi(a,n,!0);a.ok&&p==V["`"]&&(n=p=27);if(X[n+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Hi(a,p,!1,c)){if(20==n||144==n||145==n)a.so||(c=e=!0);if(!(c||91!=n&&93!=n))for(var v=0;v<a.Lb.length;v++){var w=a.Lb[v];w.Og=!1;0<w.Bd&&(w.Bd=0)}}else 8==n&&8==(a.Xb&40)&&(p=4008),d=!1;else if(X[p]&&a.Xb&60&&(d=!1),!a.Lm&&d&&c||a.Xb&192)m=!0;d||b.preventDefault();m||a.Qm&&d||(c?Gi(a,p,e):Ii(a,p)||(b=Mi(a,n,!1),b!=p&&Ii(a,b)));return d}
            function Li(a,b,c){Hi(a,b,!0,c);var d=X[b]||X[b+1E3];if(void 0!==d){14==d&&40==(a.Xb&40)&&(d=83);var e=[],m=d&255;e.push(m|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var n=0,p=d&255;224==m||225==m?e.push(m|(c?0:128)):(42==p?a.td&3||a.td&512&&b||(n=p):29==p?a.td&12||(n=p):56==p?a.td&48||(n=p):e.push(m|(c?0:128)),n&&(c?e.unshift(n):e.push(n|128)))}for(c=0;c<e.length;c++)d=a,m=e[c],d.Ub&&(20>d.Ub.length?(d.Ub.push(m),1==d.Ub.length&&d.fa&&li(d.fa,m)):(20==d.Ub.length&&d.Ub.push(255),d.nc("scan code buffer overflow")))}}
            Da(function(){for(var a=Wa(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new yi(d);Va(d,c)}});
            function Y(a,b,c,d,e){Ha.call(this,"Video",a,Y);this.na=a.model;this.wb=Ni[this.na]||Oi;this.ud=a.memory||0;this.Hn=a.switches;this.hd=a.mode;if(void 0===this.hd||void 0===Pi[this.hd])this.hd=Qi;this.si=a.charCols;this.Hk=a.charRows;if(void 0===this.si||void 0===this.Hk)this.si=Pi[this.hd][0],this.Hk=Pi[this.hd][1];this.Nd=a.screenWidth;this.qe=a.screenHeight;this.uo=a.scale;this.qo=12<=Math.round(this.Nd/this.si);this.wo=a.touchScreen;this.Gg=b;this.Sc=c;this.Ta=(this.xr=d)||b||null;this.ze=null;
            this.oo=a.autoLock;this.Va=this.Sb=0;this.fe=[];this.Gd=Array(16);this.ei=!1;var m=this;if(this.fd=e)this.fd.Mf=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.fd.Mf&&(b=function(){var a=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?!0:!1;m.nc("notifyFullScreen("+a+")",!0);m.Da&&(m.Da.ok=a)},"onfullscreenchange"in document?document.addEventListener("fullscreenchange",b,!1):
            "onmozfullscreenchange"in document?document.addEventListener("mozfullscreenchange",b,!1):"onwebkitfullscreenchange"in document?document.addEventListener("webkitfullscreenchange",b,!1):"onmsfullscreenchange"in document&&document.addEventListener("msfullscreenchange",b,!1));this.Ta&&(this.Ta.onfocus=function(){return m.nj(!0)},this.Ta.onblur=function(){return m.nj(!1)},this.Ta.hf=this.Ta.requestPointerLock||this.Ta.mozRequestPointerLock||this.Ta.webkitRequestPointerLock,this.Ta.Mn=this.Ta.exitPointerLock||
            this.Ta.mozExitPointerLock||this.Ta.webkitExitPointerLock,this.Ta.hf&&(b=function(){m.hh(document.pointerLockElement===m.Ta||document.mozPointerLockElement===m.Ta||document.webkitPointerLockElement===m.Ta)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",b,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",b,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",b,!1)));if(a=a.fontROM)"json"!=
            ga(a)&&(a=ra()+"/api/v1/dump?file="+a+"&format=bytes"),qa(a,!0,null,this,this.Xp)}Pa(Y);var Oi=1,Ni={mda:1,cga:3,ega:5,vga:7},Qi=7,Ri={2:{wi:15700,vi:208,oj:85,pj:96},3:{wi:18432,vi:364,oj:85,pj:96},4:{wi:21850,vi:364,oj:85,pj:96},7:{wi:16700,vi:480,oj:85,pj:83}},Si={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Pi=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Pi[Qi]=[80,25,1,0,1];
            Pi[13]=[320,200,16];Pi[14]=[640,200,16];Pi[15]=[640,350,16];Pi[16]=[640,350,16];Pi[17]=[640,480,16];Pi[18]=[640,480,16];Pi[19]=[320,200,16];Pi[0]=Pi[1];Pi[2]=Pi[3];Pi[5]=Pi[4];var Ti=Array(5);Ti[0]=[0,0,0,255];Ti[1]=[127,192,127,255];Ti[2]=[127,192,127,255];Ti[3]=[127,255,127,255];Ti[4]=[127,255,127,255];var Ui=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],Vi=Array(16);Vi[0]=[0,0,0,255];Vi[1]=[0,0,170,255];Vi[2]=[0,170,0,255];Vi[3]=[0,170,170,255];Vi[4]=[170,0,0,255];Vi[5]=[170,0,170,255];Vi[6]=[170,85,0,255];
            Vi[7]=[170,170,170,255];Vi[8]=[85,85,85,255];Vi[9]=[85,85,255,255];Vi[10]=[85,255,85,255];Vi[11]=[85,255,255,255];Vi[12]=[255,85,85,255];Vi[13]=[255,85,255,255];Vi[14]=[255,255,85,255];Vi[15]=[255,255,255,255];var Wi=[2,4,6],Xi=[3,5,7],Yi=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],Zi=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],$i=[0];$i[128]=1;$i[32768]=2;$i[32896]=3;$i[8388608]=4;$i[8388736]=5;$i[8421376]=6;$i[8421504]=7;
            $i[-2147483648]=8;$i[-2147483520]=9;$i[-2147450880]=10;$i[-2147450752]=11;$i[-2139095040]=12;$i[-2139094912]=13;$i[-2139062272]=14;$i[-2139062144]=15;
            function aj(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=bj[b],m=a.jd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(cj)];this.wb=b;this.Va=e[2];this.Sb=e[3];this.ud=d||e[4];65536<=this.ud&&720896<=this.Va&&(this.Sb=Math.min(this.ud>>2,32768));this.uc=c[0];this.Lc=c[1];this.lh=c[2];this.sa=c[3];this.Zc=c[4]&255;this.uj=c[4]>>8&255;this.pc=c[5];this.Ak=cj;if(5<=b){this.Ak=dj;b=c[6];void 0===b&&(b=[!1,0,Array(20),0,3==m?0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Va,this.Sb,this.ud],Array(this.ud>>
            2),5144,0,-1,0,-1,0,-1,0,0,0,1,255,0,0,0,Array(256)]);this.se=b[0];this.pf=b[1];this.of=b[2];this.Vl=b[3];this.ph=b[4];this.zj=b[5];this.ig=b[6];this.qh=b[7];this.zn=b[8];this.An=b[9];this.gg=b[10];this.fg=b[11];this.lb=b[12];d=b[13];"number"==typeof d&&(d=[this.Va,this.Sb,d]);this.Va=d[0];this.Sb=d[1];d=this.ud>>2;if((this.Te=b[14])&&this.Te.length<d){for(var e=this.Te,n=0,p=Array(d),v=0;v<e.length-1;){for(var w=e[v++],G=e[v++];w--;)p[n]=G,n+=2;n==d&&(n=1)}this.Te=p}(d=b[15])&&(d=d&8?d&-9:ej[d&65280]|
            ej[d&255]);this.Gj(d);this.Nl=b[16];this.eb=b[17];this.Ad=b[18];this.mb=b[19];this.kj=b[20];this.Ge=b[21];this.mf=b[22];this.Ck=b[23];this.Dk=b[24];7==this.wb&&(this.Wl=b[25],this.Rl=b[26],this.Cd=b[27],this.zc=b[28],this.xj=b[29],this.nh=b[30])}m=Ri[m]||Ri[3];this.Ek=a.W.R.zd/m.wi|0;this.Mp=this.Ek*m.oj/100|0;this.nn=this.Ek*m.vi;this.Op=this.nn*m.pj/100|0;this.Jk=null==c[7]?0:c[7]}}var cj=18,dj=25,ej=[,,1024,5120];ej[16]=1280;ej[512]=0;ej[1024]=32;ej[1536]=96;ej[2560]=160;ej[3584]=224;ej[768]=16;
            ej[4096]=1;ej[8192]=2;ej[24576]=98;ej[40960]=162;ej[57344]=226;var fj=[];fj[1024]=function(a){a+=this.offset;return(this.V.lb=this.ba[a])>>this.V.Nl&255};fj[5120]=function(a){a+=this.offset;var b=this.V.lb=this.ba[a&-2];return(a&1?b>>8:b)&255};fj[1280]=function(a){a+=this.offset;a=this.V.lb=this.ba[a];for(var b=this.V.Dk,c=this.V.Ck&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};
            fj[0]=function(a,b){var c=a+this.offset,d;d=this.ba[c]&~this.V.eb|(b|b<<8|b<<16|b<<24)&this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[32]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
            fj[96]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d&=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[160]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d|=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
            fj[224]=function(a,b){var c=a+this.offset;b=b>>this.V.Ad|b<<8-this.V.Ad&255;var d;d=(b|b<<8|b<<16|b<<24)&this.V.Ge|this.V.mf;d^=this.V.lb;d=d&this.V.eb|this.ba[c]&~this.V.eb;d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.V.eb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ba[d]&~c;c=c&this.V.mb|this.V.lb&~this.V.mb;this.ba[d]!=c&&(this.ba[d]=c,this.La=!0)};
            fj[1]=function(a){a+=this.offset;var b=this.ba[a]&~this.V.eb|this.V.lb&this.V.eb;this.ba[a]!=b&&(this.ba[a]=b,this.La=!0)};fj[17]=function(a){a+=this.offset;var b=a&-2;a=this.V.eb&(b==a?16711935:-16711936);a=this.ba[b]&~a|this.V.lb&a;this.ba[b]!=a&&(this.ba[b]=a,this.La=!0)};fj[2]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
            fj[98]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d&this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};fj[162]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d|this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
            fj[226]=function(a,b){var c=a+this.offset,d=Zi[b&15],d=d^this.V.lb,d=d&this.V.eb|this.ba[c]&~this.V.eb,d=d&this.V.mb|this.V.lb&~this.V.mb;this.ba[c]!=d&&(this.ba[c]=d,this.La=!0)};
            function gj(a){var b=[];if(void 0!==a.wb){b[0]=a.uc;b[1]=a.Lc;b[2]=a.lh;b[3]=a.sa;b[4]=a.Zc|a.uj<<8;b[5]=a.pc;if(5<=a.wb){var c=[];c[0]=a.se;c[1]=a.pf;c[2]=a.of;c[3]=a.Vl;c[4]=a.ph;c[5]=a.zj;c[6]=a.ig;c[7]=a.qh;c[8]=a.zn;c[9]=a.An;c[10]=a.gg;c[11]=a.fg;c[12]=a.lb;c[13]=[a.Va,a.Sb,a.ud];var d;a:if(d=a.Te){var e=0,m=[];if(void 0!==d[0])for(var n=0;2>n;n++)for(var p=n;p<d.length;){for(var v=d[p],w=p+2;w<d.length&&d[w]===v;)w+=2;m[e++]=w-p>>1;m[e++]=v;p=w}if(m.length<d.length){d=m;break a}}c[14]=d;c[15]=
            a.zk|8;c[16]=a.Nl;c[17]=a.eb;c[18]=a.Ad;c[19]=a.mb;c[20]=a.kj;c[21]=a.Ge;c[22]=a.mf;c[23]=a.Ck;c[24]=a.Dk;7==a.wb&&(c[25]=a.Wl,c[26]=a.Rl,c[27]=a.Cd,c[28]=a.zc,c[29]=a.xj,c[30]=a.nh);b[6]=c}b[7]=a.Jk}return b}aj.prototype.Zm=function(a){return[this.Te,a-this.Va]};aj.prototype.vk=function(){return this.Fh};
            aj.prototype.Gj=function(a){if(null!=a&&a!=this.zk){var b=a&65280,c=fj[b];c||b&4096&&(c=fj[4096]);var b=a&247,d=fj[b];d||b&16&&(d=fj[16]);this.Fh||(this.Fh=Array(6));this.Fh[0]=c;this.Fh[3]=d;this.zk=a}};var bj=[];bj[Oi]=["MDA",948,720896,4096,0,3];bj[3]=["CGA",980,753664,16384,0,2];bj[5]=["EGA",980,753664,16384,65536,4];bj[7]=["VGA",980,753664,16384,262144,7];f=Y.prototype;
            f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;3!=Ni[this.na]&&(Sb(b,this,hj),Ub(b,this,ij));Ni[this.na]!=Oi&&(Sb(b,this,jj),Ub(b,this,kj));5<=this.wb&&(Sb(b,this,lj),Ub(b,this,mj));7==this.wb&&(Sb(b,this,nj),Ub(b,this,oj));if((this.Da=fb(a,"Keyboard"))&&this.Gg){for(var e in this.qa)0<e.indexOf("lock")&&this.Da.Kb("led",e,this.qa[e]);this.Da.Kb(this.xr?"textarea":"canvas","kbd",this.Ta)}this.Jh=9;(this.fa=fb(a,"ChipSet"))&&this.Hn&&5==this.wb&&(this.Jh=Zg(this.Hn,this.Jh));this.Da&&this.wo&&
            pj(this)};f.Kb=function(a,b,c){var d=this;if(!this.qa[b])switch(this.qa[b]=c,b){case "fullScreen":return this.fd&&this.fd.Mf?c.onclick=function(){d.Mf()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.ur=c.textContent,this.Ta&&this.Ta.hf?c.onclick=function(){d.hf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){vc(d,!0)},!0}return!1};f.Fd=function(){this.Ta&&this.Ta.focus()};
            f.Mf=function(){var a=!1;this.fd&&(this.fd.Mf&&(this.fd.style.width=this.fd.style.height="100%",this.fd.style.backgroundColor="black",this.fd.Mf(),a=!0),this.Fd());return a};f.hf=function(a){var b=!1;this.Ta&&(a?this.Ta.hf&&(this.Ta.hf(),this.ze.hh(!0),b=!0):this.Ta.Mn&&(this.Ta.Mn(),this.ze.hh(!1),b=!0),this.Fd());return b};f.hh=function(a){this.ze&&(this.ze.hh(a),this.Da&&(this.Da.ok=a));var b=this.qa.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.ur)};
            function pj(a){var b=a.Ta;b&&!a.Mg&&(b.addEventListener("touchstart",function(b){qj(a,b)},!1),b.addEventListener("touchmove",function(b){qj(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Mg=!0)}f.nj=function(a){this.ei=a;this.Da&&this.Da.nj(a)};
            function qj(a,b){a.ei&&b.preventDefault();var c=0,d=0,e=a.Gg;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var m=a.Nd/a.Gg.offsetWidth,e=a.qe/a.Gg.offsetHeight,n,p;b.targetTouches?(n=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(n=b.pageX,p=b.pageY);c=(n-c)*m/(a.Nd/3)|0;d=(p-d)*e/(a.qe/3)|0;1!=d?d?Gi(a.Da,1040,!0):Gi(a.Da,1038,!0):1!=c&&(c?Gi(a.Da,1039,!0):Gi(a.Da,1037,!0))}
            f.fc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};
            f.reset=function(){var a=!0,b=0;this.fa&&(b=qh(this.fa));this.na||(this.wb=3==b?Oi:3);this.hd=3;switch(this.wb){case 7:b=7;break;case 5:var c=Si[this.Jh];c&&(b=c[0]);b||(b=4);break;case Oi:b=3;this.hd=Qi;break;default:b=2}this.jd!==b&&(this.jd=b,a=!0);this.Ja=null;this.ed=this.$j=new aj(this,Oi);this.kc=this.Th=new aj(this,3);5>this.wb?this.X=new aj:(this.X=new aj(this,this.wb,null,this.ud),rj(this));sj(this);this.Ce=null;this.Ye=this.Vc=-1;this.Xe=0;tj(this,this.hd);if(this.Ja.Va&&a){a=this.Ja.Va+
            this.ak;for(b=this.Ja.Va;b<a;b+=2){var d=Math.floor(65536*Math.random());4==this.jd||7==this.jd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);Ob(this.la,b,c|d<<8)}vc(this,!0)}};function rj(a){a.X.ph&1?(a.ed=a.$j,a.kc=a.X):(a.ed=a.X,a.kc=a.Th)}f.save=function(){var a=new Yd(this);a.set(0,gj(this.$j));a.set(1,gj(this.Th));a.set(2,[this.jd,this.hd,this.Ce]);a.set(3,gj(this.X));return a.data()};
            f.restore=function(a){var b=a[2];this.jd=b[0];this.hd=b[1];this.Ce=b[2];this.Ja=null;this.ed=this.$j=new aj(this,Oi,a[0]);this.kc=this.Th=new aj(this,3,a[1]);this.X=new aj(this,this.wb,a[3],this.ud);this.X.uc&&rj(this);sj(this);if(!uj(this))return!1;vj(this);return!0};
            f.Xp=function(a,b,c){if(c)this.wa("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){sa("Empty font ROM image: "+a);return}if(1==d.length){sa(d[0]);return}if(8192==d.length)pi(this,d,[6144,0]);else{this.wa("Unrecognized font data length ("+d.length+")");return}}catch(e){this.wa("Font ROM data error: "+e.message);return}(this.Sc||this.Sa)&&Ya(this)}};
            function wj(a,b){if(1==b)return a.Gd[0]=Vi[0],a.Gd[1]=Vi[7],a.Gd;if(2==b){var c=a.Ja.lh;if(a.Ja===a.X){var d=a.X.of[0],c=d&7;d&16&&(c|=8);18!=a.X.of[1]&&(c|=32)}a.Gd[0]=Vi[c&15];c=c&32?Xi:Wi;for(d=0;d<c.length;d++)a.Gd[d+1]=Vi[c[d]];return a.Gd}if(a.kc===a.Th)return Vi;c=null!=a.X.of[15]?a.X.of:Yi;for(d=0;d<a.Gd.length;d++){var e=c[d]||0;a.Gd[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.Gd}function pi(a,b,c,d){a.Ch=b;a.Pj=c;a.cf=d}
            function sj(a){var b=!1;if(window&&a.Ch){var c=wj(a),d,e=a.cf?a.cf:8;xj(a,3,a.Pj[0],0,e,8,a.Ch,c)&&(b=!0);d=a.cf?0:2048;e=a.cf?a.cf:9;xj(a,1,a.Pj[1],d,e,14,a.Ch,Ti,Ui)&&(b=!0);a.cf&&xj(a,a.wb,a.Pj[1],0,a.cf,14,a.Ch,c)&&(b=!0)}return b}function xj(a,b,c,d,e,m,n,p,v){var w=!1;null!=c&&(yj(a,b,c,d,e,m,n,p,v)&&(w=!0),a.qo&&yj(a,b<<1,c,d,e,m,n,p,v)&&(w=!0));return w}
            function yj(a,b,c,d,e,m,n,p,v){var w=!1,G=b&1?0:1,Q=a.fe[b];Q||(Q={rc:e<<G,sc:m<<G,Af:Array(p.length),pm:p.slice(),ug:v,Nj:Array(p.length)});for(v=0;v<p.length;v++){var M=p[v],R=Q.Af[v]?Q.pm[v]:[];if(M[0]!==R[0]||M[1]!==R[1]||M[2]!==R[2]){var w=Q,R=v,W=G,ia=c,ja=d,Ta=e,nb=m,Qb=n,Kc=[0,0,0,0],Gd=window.document.createElement("canvas");Gd.width=w.rc<<4;Gd.height=w.sc<<4;for(var uh=Gd.getContext("2d"),ob=void 0,pc=void 0,Rb=void 0,Hd=8>nb||!ja?nb:8,Re=uh.createImageData(w.rc,w.sc),ob=0;256>ob;ob++){for(Rb=
            0;Rb<nb;Rb++)for(var zk=w.ug&&R&1&&Rb>=nb-2,Ak=Qb[Rb<Hd?ia+ob*Hd+Rb:ja+ob*Hd+Rb-Hd],Se=0;Se<=W;Se++)for(pc=0;pc<Ta;pc++){var vh=pc<<W,wh=(Rb<<W)+Se,xh=zk||Ak&128>>(8<=pc&&192<=ob&&223>=ob?7:pc)?M:Kc;zj(Re,vh,wh,xh);W&&zj(Re,vh+1,wh,xh)}uh.putImageData(Re,(ob&15)*w.rc,(ob>>4)*w.sc)}w.Af[R]="#"+da(M[0],2)+da(M[1],2)+da(M[2],2);w.pm[R]=M;w.Nj[R]=Gd;w=!0}}a.fe[b]=Q;return w}function Aj(a){0<a.Xe||0<=a.Vc?0>a.Ye&&(a.Ye=0):a.Ye=-1}
            function vj(a){if(a.Yb){for(var b=10;15>=b;b++)if(null==a.Ja.pc[b])return;var c=a.Ja.pc[10],b=c&31,d=a.Ja.pc[11]&31,e=a.Ja.pc[9]&31,m=!1;a.Ja===a.X&&(m=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!m||b>e)Bj(a);else{c=a.Ja.pc[15]+((a.Ja.pc[14]&63)<<8);a.Vc!=c&&(Bj(a),a.Vc=c);d=d-b+1;if(a.Qn!=b||a.Im!=d)a.Qn=b,a.Im=d;a.pe=e+1;Aj(a)}}}
            function Bj(a){if(0<=a.Vc){if(void 0!==a.jc){var b=a.jc[a.Vc];if(b&131072){var b=b&-131073,c=a.Vc%a.Hb,d=Math.floor(a.Vc/a.Hb);a.Yb&&a.fe[a.Yb]&&(a.Lf&&Cj(a,c,d,b,a.Lf),Cj(a,c,d,b));a.jc[a.Vc]=b}}a.Vc=-1}}
            function Dj(a){var b;a=a.Ja;var c=a.fg[5];if(null!=c){b=1024;var d=0,e=a.fg[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.Ad=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.qh[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.ld=function(a){var b=this.Ja;b&&null!=a&&a!=b.zk&&(b.Gj(a),this.la.Gj(b.Va,b.Sb,b.vk()))};
            function uj(a,b){var c,d=a.Ce,e=a.Ja;if(e)if(e.wb==Oi)d=Qi;else if(5<=e.wb){var d=null,m=e.ud>>2,n=32768<m?32768:m,p=e.fg[6];if(null!=p){switch(p&12){case 0:e.Va=655360;e.Sb=m;d=255;break;case 4:e.Va=655360;e.Sb=m;d=3==a.jd?15:16;break;case 8:e.Va=720896;e.Sb=n;d=Qi;break;case 12:e.Va=753664,e.Sb=n,d=3==a.jd?2:3}c=e.qh[1]&8;m=e.pc[6];m|=e.pc[7]&1?256:0;7==e.wb&&(m|=e.pc[7]&32?512:0);255!=d&&(p&1?753664==e.Va?d=c?7-d:6:400>m?350>m&&(d=c?13:14):d=3==a.jd?17:18:c&&(d-=2));c=Dj(a)}}else e.Lc&8&&(e.Lc&
            2?(d=e.Lc&16?6:5,e.Lc&4||--d):(d=e.Lc&1?3:1,e.Lc&4&&--d));else a.Ce=null,null==d&&(d=a.hd);if(!tj(a,d,b))return!1;a.ld(c);return!0}
            function tj(a,b,c){if(null!=b&&(b!=a.Ce||c)){a.Vn=0;a.Ce=b;b=a.Ja||(b==Qi?a.ed:a.kc);if(b!=a.Ja||b.Va!=a.Va||b.Sb!=a.Sb){Bj(a);if(a.Va){if(!Mb(a.la,a.Va,a.Sb))return!1;a.Ja&&(a.Ja.uc=!1)}a.Ja=b;b.uc=!0;a.Va=b.Va;a.Sb=b.Sb;if(!Ib(a.la,b.Va,b.Sb,3,b===a.X?b:null))return!1}a.Yb=0;a.Hb=a.si;a.wc=a.Hk;a.Bk=Pi[Qi][2];b=0;var d=Pi[a.Ce];d&&(a.Hb=d[0],a.wc=d[1],a.Bk=d[2],b=d[3]||0,a.Yb=d[4],4!=a.jd&&7!=a.jd||a.Ja!==a.X||3!=a.Yb||(7==a.X.pc[9]?a.wc=43:a.Yb=a.wb));a.kn=a.Hb*a.wc;a.pi=a.kn/a.Bk;a.ak=(a.pi<<
            1)+b;a.Em=b?a.ak+b>>1:0;13<=a.Ce&&(a.pi<<=1);a.fe.length&&(a.Od=Math.floor(a.Nd/a.Hb),a.Pd=Math.floor(a.qe/a.wc),a.Yb?(b=a.fe[a.Yb],d=a.fe[a.Yb<<1],a.uo&&80==a.Hb?d&&a.Od>=3*d.rc>>2&&(a.Yb<<=1,b=d):(d&&a.Od>=d.rc&&(a.Yb<<=1,b=d),b&&(a.Od=b.rc,a.Pd=b.sc)),a.Jg=a.Kg=0,b&&(a.Jg=a.Hb*b.rc,a.Kg=a.wc*b.sc)):(a.Od=a.Pd=1,a.Jg=a.Hb,a.Kg=a.wc),a.mi=a.Sc.createImageData(a.Jg,a.Kg),a.Jf=window.document.createElement("canvas"),a.Jf.width=a.Jg,a.Jf.height=a.Kg,a.Lf=a.Jf.getContext("2d"),a.em=a.fm=0,a.gk=a.Nd,
            a.hk=a.qe,b=a.Nd-a.Hb*a.Od,d=a.qe-a.wc*a.Pd,0<b&&(a.em=b>>1,a.gk-=b),0<d&&(a.fm=d>>1,a.hk-=d),b||d)&&(a.Sc.fillStyle=a.Gg.style.backgroundColor,a.Sc.fillRect(0,0,a.Nd,a.qe));!1!==c?vc(a,!0):Ej(a,!0)}return!0}function zj(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Ej(a,b){var c;if(b){if(c=a.pi,void 0===a.jc||a.jc.length!=c)a.jc=Array(c)}else{if(void 0===a.jc)return;c=a.jc.length}for(var d=0;d<c;d++)a.jc[d]=-1;a.Xe=-1}
            function Cj(a,b,c,d,e){var m=d&255,n=d>>8;d=n&15;var p=a.fe[a.Yb];p.ug&&(d=p.ug[d]);var v=n>>4&15;p.ug&&(v=p.ug[v]);e?(b*=p.rc,c*=p.sc,e.fillStyle=p.Af[v],e.fillRect(b,c,p.rc,p.sc)):(b=b*a.Od+a.em,c=c*a.Pd+a.fm,a.Sc.fillStyle=p.Af[v],a.Sc.fillRect(b,c,a.Od,a.Pd));n&256&&(v=(m&15)*p.rc,m=(m>>4)*p.sc,e?e.drawImage(p.Nj[d],v,m,p.rc,p.sc,b,c,p.rc,p.sc):a.Sc.drawImage(p.Nj[d],v,m,p.rc,p.sc,b,c,a.Od,a.Pd));n&512&&(m=a.Qn,n=a.Im,e?(a.pe&&a.pe!==p.sc&&(m=Math.floor(m*p.sc/a.pe),n=Math.floor(n*p.sc/a.pe)),
            e.fillStyle=p.Af[d],e.fillRect(b,c+m,p.rc,n)):(a.pe&&a.pe!==a.Pd&&(m=Math.floor(m*a.Pd/a.pe),n=Math.floor(n*a.Pd/a.pe)),a.Sc.fillStyle=p.Af[d],a.Sc.fillRect(b,c+m,a.Od,n)))}
            function vc(a,b){if(a.ha.cc){var c=!1;a.Ja&&(a.Ja===a.X?a.X.pf&32&&(c=!0):a.Ja.Lc&8&&(c=!0));if(c||b){if(b)Ej(a,!0);else if(void 0===a.jc)return;var d=!1;!(b||++a.Vn&15)&&0<=a.Ye&&(a.Ye++,d=!0);var e=0,m=a.kn,c=a.Ja.Va,n=c+a.Ja.Sb,p=(a.Ja.pc[12]<<8)+a.Ja.pc[13];a.Yb&&(p<<=1);var c=c+p,v=a.ak;c+v>n&&(v=n-c,0>v&&(v=0));n=c+v;if(p=!b){for(var p=a.la,w=!0,G=c>>>p.Aa;0<v&&G<p.ka.length;)p.ka[G].La&&(p.ka[G].La=w=!1,p.ka[G].Mm=!0),v-=p.nb,G++;p=w}if(p){if(!d)return;if(!a.Xe){if(0>a.Vc)return;e=a.Vc;m=e+
            1}}if(a.Yb){if(a.fe[a.Yb]){d=0;p=a.Xe=0;v=1048575;a.Ja.Lc&32&&(p=32768,v&=~p,a.Ye&2||(v&=-65537));for(c+=e<<1;c<n&&e<m;)w=Nb(a.la,c),w|=65536,w&p&&(a.Xe++,w&=v),e==a.Vc&&(w|=a.Ye&1?131072:0),G=a.jc[e],G!=w&&(Cj(a,e%a.Hb,Math.floor(e/a.Hb),w,a.Lf),a.jc[e]=w,d++),c+=2,e++;d&&a.Lf&&a.Sc.drawImage(a.Jf,0,0,a.Jg,a.Kg,a.em,a.fm,a.gk,a.hk);Aj(a)}}else if(a.Em){for(var m=n,Q,M,e=c,n=a.Xe=0,d=a.Bk,p=16==d?65536:196608,v=16==d?1:2,w=wj(a,v),R=G=0,W=a.Hb,ia=0,ja=a.wc,Ta=0;e<m;){Q=Nb(a.la,e);M=a.jc[n];if(M===
            Q)G+=d;else{a.jc[n]=Q;Q=Q>>8|(Q&255)<<8;M=p;var nb=16;G<W&&(W=G);for(var Qb=0;Qb<d;Qb++){var Kc=(Q&(M>>=v))>>(nb-=v);zj(a.mi,G++,R,w[Kc])}G>ia&&(ia=G);R<ja&&(ja=R);R>=Ta&&(Ta=R+1)}e+=2;n++;if(G>=a.Hb){G=0;R+=2;if(R>a.wc)break;R==a.wc&&(R=1,e=c+a.Em)}}W<a.Hb&&(a.Lf.putImageData(a.mi,0,0,W,ja,ia-W,Ta-ja),a.Sc.drawImage(a.Jf,0,0,a.Hb,a.wc,0,0,a.Nd,a.qe))}else{m=n;e=a.Xe=0;n=wj(a);d=a.Ja.Te;v=p=0;w=a.Hb;G=0;R=a.wc;for(W=0;c<m;){ia=c++-a.Va;ia=d[ia];ja=a.jc[e];if(ja===ia)p+=8;else{a.jc[e]=ia;p<w&&(w=p);
            for(ja=0;8>ja;ja++)Ta=$i[ia&-2139062144]||0,zj(a.mi,p++,v,n[Ta]),ia<<=1;p>G&&(G=p);v<R&&(R=v);v>=W&&(W=v+1)}e++;if(p>=a.Hb&&(p=0,++v>a.wc))break}w<a.Hb&&(a.Lf.putImageData(a.mi,0,0,w,R,G-w,W-R),a.Sc.drawImage(a.Jf,0,0,a.Hb,a.wc,0,0,a.Nd,a.qe))}}}}f.gp=function(){var a=this.ed,b;a.uc&&(b=a.Zc);return b};f.Iq=function(a,b){var c=this.ed;c.uj=c.Zc;c.Zc=b&31};f.fp=function(){return Fj(this.ed)};f.Hq=function(a,b){Gj(this,this.ed,b)};f.hp=function(){return this.ed.Lc};
            f.Jq=function(a,b){this.ed.Lc=b;uj(this,!1)};f.ip=function(){return Hj(this,this.ed)};f.un=function(a,b){this.X.zj=this.X.zj&-4|b&3};f.dn=function(){var a=this.X.se?this.X.of[this.X.pf&31]:this.X.pf;this.X.se=!this.X.se;return a};f.tn=function(a,b){var c=this.X.pf&32;if(this.X.se){var d=this.X.pf&31;if(16<=d||!c)this.X.of[d]=b;this.X.se=!1}else this.X.pf=b,this.X.se=!0,b&32&&!c&&sj(this)&&vc(this,!0)};
            f.sp=function(){var a=0;if(5==this.wb)a=3-((this.X.ph&12)>>2),a=(this.Jh&1<<a)<<4-a;else{var b=this.X.nh[0];45!=(b&63)&&2880!=(b&4032)&&184320!=(b&258048)&&(a|=16)}a|=this.X.Vl&-17;return this.X.Vl=a};f.Kq=function(a,b){this.X.ph=b;rj(this)};f.tp=function(){return this.X.Wl};f.Uq=function(a,b){this.X.Wl=b};f.rp=function(){return this.X.ig};f.Sq=function(a,b){this.X.ig=b};f.qp=function(){return this.X.qh[this.X.ig]};
            f.Rq=function(a,b){this.X.qh[this.X.ig]=b;switch(this.X.ig){case 2:this.X.eb=Zi[b&15];break;case 4:this.ld(Dj(this))}};f.Uo=function(){return this.X.Rl};f.uq=function(a,b){this.X.Rl=b};f.Vo=function(){return this.X.xj};f.vq=function(a,b){this.X.Cd=b;this.X.xj=3;this.X.zc=0};f.wq=function(a,b){this.X.Cd=b;this.X.xj=0;this.X.zc=0};f.To=function(){var a=this.X.nh[this.X.Cd]>>this.X.zc&63;this.X.zc+=6;12<this.X.zc&&(this.X.zc=0,this.X.Cd=this.X.Cd+1&255);return a};
            f.tq=function(a,b){this.X.nh[this.X.Cd]=this.X.nh[this.X.Cd]&~(63<<this.X.zc)|(b&63)<<this.X.zc;this.X.zc+=6;12<this.X.zc&&(this.X.zc=0,this.X.Cd=this.X.Cd+1&255)};f.up=function(){return this.X.zj};f.Dq=function(a,b){this.X.An=b};f.vp=function(){return this.X.ph};f.Cq=function(a,b){this.X.zn=b};f.$o=function(){return this.X.gg};f.Bq=function(a,b){this.X.gg=b};f.Zo=function(){return this.X.fg[this.X.gg]};
            f.Aq=function(a,b){this.X.fg[this.X.gg]=b;switch(this.X.gg){case 0:this.X.kj=Zi[b&15];this.X.mf=this.X.kj&~this.X.Ge;break;case 1:this.X.Ge=~Zi[b&15];this.X.mf=this.X.kj&~this.X.Ge;break;case 2:this.X.Ck=Zi[b&15]&-2139062144;break;case 3:case 5:this.ld(Dj(this));break;case 4:this.X.Nl=(b&3)<<3;break;case 6:uj(this,!1);break;case 7:this.X.Dk=Zi[b&15]&-2139062144;break;case 8:this.X.mb=b|b<<8|b<<16|b<<24}};f.Oo=function(){var a=this.kc,b;a.uc&&(b=a.Zc);return b};
            f.nq=function(a,b){var c=this.kc;c.uj=c.Zc;c.Zc=b&31};f.No=function(){return Fj(this.kc)};f.mq=function(a,b){Gj(this,this.kc,b)};f.Po=function(){return this.kc.Lc};f.oq=function(a,b){this.kc.Lc=b;uj(this,!1)};f.Mo=function(){return this.kc.lh};f.lq=function(a,b){this.kc.lh!==b&&(this.kc.lh=b,Ej(this,!1))};f.Qo=function(){return Hj(this,this.kc)};function Fj(a){var b;a.uc&&a.Zc<a.Ak&&(b=a.pc[a.Zc]);return b}function Gj(a,b,c){b.Zc<b.Ak&&(b.pc[b.Zc]=c,9==b.Zc&&8!=b.uj&&uj(a,!0),vj(a))}
            function Hj(a,b){var c=0,d=Cc(a.W),e=d-b.Jk;0>e&&(e=0);e%b.Ek>b.Mp&&(c|=1);e%=b.nn;e>b.Op&&(c|=8);b.Jk=d-e;b===a.X?(c|=b.sa&48^48,b.se=!1):c=(b.sa^=9)|240;return b.sa=c}
            var hj={948:Y.prototype.gp,949:Y.prototype.fp,952:Y.prototype.hp,954:Y.prototype.ip},ij={948:Y.prototype.Iq,949:Y.prototype.Hq,952:Y.prototype.Jq},jj={980:Y.prototype.Oo,981:Y.prototype.No,984:Y.prototype.Po,985:Y.prototype.Mo,986:Y.prototype.Qo},kj={980:Y.prototype.nq,981:Y.prototype.mq,984:Y.prototype.oq,985:Y.prototype.lq},lj={960:Y.prototype.dn,961:Y.prototype.dn,962:Y.prototype.sp,964:Y.prototype.rp,965:Y.prototype.qp,974:Y.prototype.$o,975:Y.prototype.Zo},mj={954:Y.prototype.un,960:Y.prototype.tn,
            961:Y.prototype.tn,962:Y.prototype.Kq,964:Y.prototype.Sq,965:Y.prototype.Rq,970:Y.prototype.Dq,972:Y.prototype.Cq,974:Y.prototype.Bq,975:Y.prototype.Aq,986:Y.prototype.un},nj={963:Y.prototype.tp,966:Y.prototype.Uo,967:Y.prototype.Vo,969:Y.prototype.To,970:Y.prototype.up,972:Y.prototype.vp},oj={963:Y.prototype.Uq,966:Y.prototype.uq,967:Y.prototype.vq,968:Y.prototype.wq,969:Y.prototype.tq};
            Da(function(){for(var a=Wa(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
            function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var m=window.document.createElement("textarea");ya("iOS")&&(m.setAttribute("autocapitalize","off"),m.setAttribute("autocorrect","off"));c.appendChild(m);var n=e.getContext("2d"),d=new Y(d,e,n,m,c);Va(d,c)}});
            function Ij(a){this.an=a.adapter;switch(this.an){case 1:this.Pl=1016;this.dh=4;break;case 2:this.Pl=760;this.dh=3;break;default:sa("Unrecognized serial adapter #"+this.an);return}this.ne=null;Ha.call(this,"SerialPort",a,Ij);var b=a.binding,c;a=Jj;b&&(void 0===c&&(c="Panel"),(c=Sa(c,this.id))&&(b=c.qa[b])&&this.Kb(null,a,b))}Pa(Ij);var Jj="buffer";f=Ij.prototype;f.tm=function(a,b){return a==this.Sg?(this.ze=b,this):null};
            f.Kb=function(a,b,c){var d=this;switch(b){case Jj:return this.qa[b]=this.ne=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),Kj(d,[b]))},c.onkeypress=function(a){a=a||window.event;Kj(d,[a.which||a.keyCode])},!0}return!1};f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.fa=fb(a,"ChipSet");Sb(b,this,Lj,this.Pl);Ub(b,this,Mj,this.Pl);Ya(this)};f.fc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
            f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe()};f.save=function(){var a=new Yd(this),b=0,c=[];c[b++]=this.Xj;c[b++]=this.zm;c[b++]=this.wf;c[b++]=this.Kh;c[b++]=this.ie;c[b++]=this.Ve;c[b++]=this.sd;c[b++]=this.Pc;c[b++]=this.wm;c[b]=this.xg;a.set(0,c);return a.data()};f.restore=function(a){return this.xe(a[0])};
            f.xe=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.Xj=a[b++];this.zm=a[b++];this.wf=a[b++];this.Kh=a[b++];this.ie=a[b++];this.Ve=a[b++];this.sd=a[b++];this.Pc=a[b++];this.wm=a[b++];this.xg=a[b];return!0};function Kj(a,b){a.xg=a.xg.concat(b);Nj(a)}function Nj(a){0<a.xg.length&&!(a.Pc&1)&&(a.Xj=a.xg.shift(),a.Pc|=1);var b=-1;a.Pc&1&&a.Kh&1&&(b=4);0<=b?(a.ie&=-8,a.ie|=b,a.fa&&a.dh&&Yh(a.fa,a.dh,100)):(a.ie|=1,a.fa&&a.dh&&Zh(a.fa,a.dh))}
            f.pp=function(){var a=this.Ve&128?this.wf&255:this.Xj;this.Pc&=-2;Nj(this);return a};f.ap=function(){return this.Ve&128?this.wf>>8:this.Kh};f.bp=function(){return this.ie};f.cp=function(){return this.Ve};f.ep=function(){return this.sd};f.dp=function(){return this.Pc};f.jp=function(){return this.wm};
            f.Tq=function(a,b){if(this.Ve&128)this.wf=this.wf&-256|b;else{this.zm=b;this.Pc&=-97;var c;this.ne?(13!=b&&(8==b?this.ne.value=this.ne.value.slice(0,-1):(this.ne.value+=String.fromCharCode(b),this.ne.scrollTop=this.ne.scrollHeight)),c=!0):c=!1;c&&(this.Pc|=96)}};f.Eq=function(a,b){this.Ve&128?this.wf=this.wf&255|b<<8:this.Kh=b};f.Fq=function(a,b){this.Ve=b};
            f.Gq=function(a,b){var c=this.sd;this.sd=b;if(this.ze&&(c^b)&3){var c=this.ze,d=this.sd,e=3==(d&3);if(e){if(!c.uc){var m=!1;c.sd&2||(c.reset(),c.nc("serial mouse reset"),m=!0);c.sd&1||(c.nc("serial mouse ID requested"),m=!0);m&&(Kj(c.Hg,[77,77]),c.nc("serial mouse ID sent"));Oj(c);c.setActive(e)}}else c.uc&&(c.nc("serial mouse inactive"),Pj(c),c.setActive(e));c.sd=d}};
            var Lj={0:Ij.prototype.pp,1:Ij.prototype.ap,2:Ij.prototype.bp,3:Ij.prototype.cp,4:Ij.prototype.ep,5:Ij.prototype.dp,6:Ij.prototype.jp},Mj={0:Ij.prototype.Tq,1:Ij.prototype.Eq,3:Ij.prototype.Fq,4:Ij.prototype.Gq};Da(function(){for(var a=Wa(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Ij(d);Va(d,c)}});function Qj(a){Ha.call(this,"Mouse",a,Qj);if(this.wk=a.serial)this.Xl="SerialPort";this.setActive(!1);this.Mg=this.fi=!1;this.dd=[];this.Bf=[];Ya(this)}Pa(Qj);f=Qj.prototype;
            f.Jc=function(a,b,c,d){this.za=a;this.la=b;this.W=c;this.Sa=d;for(b=null;b=fb(a,"Video",b);)this.dd.push(b)};f.setActive=function(a){this.uc=a};
            f.fc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.Xl&&!this.Hg){for(var c=null;(c=fb(this.za,this.Xl,c))&&(!c.tm||!(this.Hg=c.tm(this.wk,this))););if(this.Hg)for(this.Bf=[],c=0;c<this.dd.length;c++){var d;d=this.dd[c];d.ze=this;(d=d.Ta)&&this.Bf.push(d)}else sa(this.id+": "+this.Xl+" "+this.wk+" unavailable")}this.uc?Oj(this):Pj(this)}return!0};f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.xe()};
            f.save=function(){var a=new Yd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.xe(a[0])};f.xe=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.ce=a[b++];this.de=a[b++];this.xf=a[b++];this.yf=a[b++];this.ai=a[b++];this.bi=a[b++];this.sd=a[b];return!0};f.am=function(){var a=0,b=[];b[a++]=this.uc;b[a++]=this.ce;b[a++]=this.de;b[a++]=this.xf;b[a++]=this.yf;b[a++]=this.ai;b[a++]=this.bi;b[a]=this.sd;return b};f.hh=function(a){this.fi=a};
            function Oj(a){if(!a.Mg)for(var b=0;b<a.Bf.length;b++)Rj(a,a.Bf[b])&&(a.Mg=!0)}function Pj(a){if(a.Mg)for(var b=0;b<a.Bf.length;b++){var c=a.Bf[b];c&&(c.style.cursor="auto")}}function Rj(a,b){return b?(b.addEventListener("mousemove",function(b){a.fn(b)},!1),b.addEventListener("mousedown",function(b){a.dk(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.dk(b.button,!1)},!1),b.style.cursor="none",!0):!1}
            f.fn=function(a){if(this.uc&&this.W&&this.W.ha.Pb){if(0>this.ce||0>this.de)this.ce=a.clientX,this.de=a.clientY;this.fi?(this.xf=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.yf=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.xf=a.clientX-this.ce,this.yf=a.clientY-this.de);(this.xf||this.yf)&&Sj(this);this.ce=a.clientX;this.de=a.clientY}};
            f.dk=function(a,b){if(this.uc&&this.W&&this.W.ha.Pb){var c;!(c=!1!==this.fi)&&(c=this.dd.length)&&(c=this.dd[0],c=c.oo?c.hf(!0):!1);c||(this.fi=null);switch(a){case 0:this.ai!=b&&(this.ai=b,Sj(this));break;case 2:this.bi!=b&&(this.bi=b,Sj(this))}}};function Sj(a){Kj(a.Hg,[64|(a.ai?32:0)|(a.bi?16:0)|(a.yf&192)>>4|(a.xf&192)>>6,a.xf&63,a.yf&63]);a.xf=a.yf=0}Da(function(){for(var a=Wa(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Qj(d);Va(d,c)}});
            function Tj(a,b,c){Ha.call(this,"Disk",{id:a.cn+".disk"+ ++Uj},Tj);this.V=a;this.za=a.za;this.Sa=a.Sa;this.Pa=b;this.Ed=b.name;this.Rf=b.Rf;this.gi=this.Qd=!1;this.create(c,b.pb,b.qb,b.xb,b.hb);this.Se=[];this.yh=[];this.ae=null;this.hn=0;this.tk=!1;Ya(this)}var Uj=0;Pa(Tj);f=Tj.prototype;f.Jc=function(a,b,c,d){this.Sa=d};f.fc=function(a,b){b||!this.gi||this.Qd||(Ya(this,!1),this.load(this.Ed,this.rf,null,this.lo,this));return!0};f.lo=function(){Ya(this,!0)};
            f.ec=function(a,b){if(this.Qd){var c,d=0;if(this.tk&&!ta("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=Vj(this,!1);)if(d=c[0]){this.V.wa('Unable to save "'+this.Ed+'" (error '+d+")");break}b&&this.Qd&&(c="action=close&volume="+this.rf,c+="&machine="+this.V.Tf(),c+="&user="+this.V.ue(),qa(ra()+"/api/v1/disk?"+c,!0),this.Qd=!1);!d&&a&&this.V.wa(this.Ed+" saved")}return!0};
            f.create=function(a,b,c,d,e){this.mode=a;this.pb=b;this.qb=c;this.xb=d;this.hb=e;this.Ua=[];if("preload"!=this.mode){a=Array(this.pb);for(b=0;b<a.length;b++){c=Array(this.qb);for(d=0;d<c.length;d++){e=Array(this.xb);for(var m=1;m<=e.length;m++)e[m-1]=Wj(null,b,d,m,this.hb,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.Ua=a}this.Nf=null};
            f.load=function(a,b,c,d,e){var m=b;if(!this.gf)if(this.Ed=a,this.rf=b,this.gf=d,this.eo=e||this.V,c){var n=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=ba[c];if(d){n.pb=d[0];n.qb=d[1];n.xb=d[2];n.hb=512;b=n.hb>>2;var e=d=0,a=new DataView(a,0,c);n.Ua=Array(n.pb);for(c=0;c<n.Ua.length;c++)for(var m=n.Ua[c]=Array(n.qb),W=0;W<m.length;W++)for(var ia=m[W]=Array(n.xb),ja=0;ja<ia.length;ja++){for(var Ta=Wj(null,c,W,ja+1,n.hb,0),nb=Ta.data,Qb=0;Qb<b;Qb++,e+=4)var Kc=nb[Qb]=
            a.getInt32(e,!0),d=d+Kc&-1;Ta.Gc=b;ia[ja]=Ta}n.Nf=d;b=n}else n.wa("Unrecognized diskette format ("+c+" bytes)");n.gf&&(n.gf.call(n.V,n.Pa,b,n.Ed,n.rf),n.gf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ga(b),"json"==a?m=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(m=Xj(this,b),this.gi=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c=
            "dir"),m=ra()+"/api/v1/dump?"+c+"="+encodeURIComponent(b)+(this.Rf?"":d)+"&format=json")),qa(m,!0,null,this,this.jo,b)};
            f.jo=function(a,b,c,d){var e=null;this.Sf=!1;var m=0>c&&this.za&&!this.za.ha.cc;if(this.gi)c?this.V.wa('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",m):(this.Qd=!0,e=this);else if(c)this.V.wa('Unable to load disk "'+this.Ed+'" (error '+c+")",m);else try{if(0<fa(a,!0).toLowerCase().indexOf("-readonly"))this.Sf=!0;else{var n=b.indexOf("\n");0<n&&1024>n&&0<b.substring(0,n).indexOf("write-protected")&&(this.Sf=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.Ed]:0>b.indexOf("0x")&&
            '["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)sa(p[0]);else{this.pb=p.length;this.qb=p[0].length;this.xb=p[0][0].length;var v=p[0][0][0];this.hb=v&&v.length||512;for(b=a=0;b<this.pb;b++)for(c=0;c<this.qb;c++)for(d=0;d<this.xb;d++)if(v=p[b][c][d]){var w=v.length;void 0===w&&(w=v.length=512);var w=w>>2,G=v.pattern;void 0===G&&(G=v.pattern=0);var Q=v.data;if(void 0===Q){var M=v.bytes;if(void 0!==M&&M.length){for(var m=
            w<<2,R=M.length;R<m;R++)M[R]=G;this.fill(v,M,0)}else Q=[],G=v.pattern=G|G<<8|G<<16|G<<24,v.data=Q;delete v.bytes}Wj(v,b,c);for(m=0;m<Q.length;m++)a=a+Q[m]&-1}this.Ua=p;this.Nf=a;e=this}else sa("Empty disk image: "+this.Ed)}catch(W){sa("Disk image error: "+W.message)}this.gf&&(this.gf.call(this.eo,this.Pa,e,this.Ed,this.rf),this.gf=null)};function Wj(a,b,c,d,e,m){a||(a={sector:d,length:e,data:[],pattern:m});a.yo=b;a.Ao=c;a.gd=a.Gc=0;a.La=!1;return a}
            function Xj(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.pb+":"+a.qb+":"+a.xb+":"+a.hb;c+="&machine="+a.V.Tf();c+="&user="+a.V.ue();return ra()+"/api/v1/disk?"+c}function Yj(a,b,c,d,e,m,n){if(a.Qd){var p;p="action=read&volume="+a.rf;p+="&chs="+a.pb+":"+a.qb+":"+a.xb+":"+a.hb;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.V.Tf());p+="&user="+a.V.ue();qa(ra()+"/api/v1/disk?"+p,m,null,a,a.mo,[b,c,d,e,m,n])}else n&&n(-1,!1)}
            f.mo=function(a,b,c,d){var e=!1;a=d[0];var m=d[1],n=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var v=this.seek(a,m,n,!0);if(!v)break;this.fill(v,b,e);e+=v.length;n++}e=d[4]}(d=d[5])&&d(c,e)};f.no=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],m=d[3];d=d[4];this.tk=!1;if(0<=a&&a<this.Ua.length&&0<=b&&b<this.Ua[a].length)for(--e;0<m--&&0<=e&&e<this.Ua[a][b].length;e++){var n=this.Ua[a][b][e];c?Zj(this,n,!1):n.La||(n.gd=n.Gc=0)}d&&ak(this)};
            function Zj(a,b,c){b.La=!0;var d=a.Se.indexOf(b);0<=d&&(a.Se.splice(d,1),a.yh.splice(d,1));a.Se.push(b);a.yh.push(la());c&&ak(a)}function ak(a){if(a.Se.length){var b=a.yh[0]+2E3;a.ae&&a.hn<b&&(clearTimeout(a.ae),a.ae=null);if(!a.ae){var c=la(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.ae=setTimeout(function(){Vj(a,!0)},b);a.hn=c+b}}else a.ae&&(clearTimeout(a.ae),a.ae=null)}
            function Vj(a,b){b&&(a.ae=null);var c=a.Se[0];if(c){for(var d=c.yo,e=c.Ao,c=c.sector,m=0,n=[],p=c-1;p<a.Ua[d][e].length;p++){var v=a.Ua[d][e][p];if(!v.La)break;var w=a.Se.indexOf(v);a.Se.splice(w,1);a.yh.splice(w,1);n=n.concat(bk(v));v.La=!1;m++}a.Qd?(p={},a.tk=!0,p.action="write",p.volume=a.rf,p.chs=a.pb+":"+a.qb+":"+a.xb+":"+a.hb,p.addr=d+":"+e+":"+c+":"+m,p.machine=a.V.Tf(),p.user=a.V.ue(),p.data=JSON.stringify(n),d=qa(ra()+"/api/v1/disk",b,p,a,a.no,[d,e,c,m,b])):d=!1;return b||d}return!1}
            f.info=function(){return this.Ua.length?[this.Ua.length,this.Ua[0].length,this.Ua[0][0].length,this.Ua[0][0][0].length]:[0,0,0,0]};
            f.seek=function(a,b,c,d,e){var m=null,n=this.Pa,p=this.Ua[a];if(p){var v=p[b];if(!v&&n.Uj&&b<n.qb)for(v=p[b]=Array(n.je),p=0;p<v.length;p++)v[p]=Wj(null,a,b,p+1,n.ob,0);if(v){for(p=0;p<v.length;p++)if(v[p]&&v[p].sector==c){m=v[p];if(null===m.pattern)if(d)m.pattern=0;else{for(d=1;++p<v.length;)null===v[p].pattern&&d++;Yj(this,a,b,c,d,null!=e,function(a,b){a&&(m=null);e&&e(m,b)});return e?null:m}break}!m&&n.Uj&&9==n.bb&&(m=v[p]=Wj(null,a,b,n.bb,n.ob,0))}}e&&e(m,!1);return m};
            f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),m=0;m<d;m++)e[m]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function bk(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var m=0;m<b;m++){var n=m<e.length?e[m]:a;c[d++]=n&255;c[d++]=n>>8&255;c[d++]=n>>16&255;c[d++]=n>>24&255}return c}function ck(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
            f.write=function(a,b,c){if(this.Sf)return!1;if(b<a.length){if(c!=ck(a,b)){var d=a.data,e=a.pattern,m=b>>2;b=(b&3)<<3;for(var n=d.length;n<=m;n++)d[n]=e;a.Gc?m<a.gd?(a.Gc+=a.gd-m,a.gd=m):m>=a.gd+a.Gc&&(a.Gc+=m-(a.gd+a.Gc)+1):(a.gd=m,a.Gc=1);d[m]=d[m]&~(255<<b)|c<<b;this.Qd&&Zj(this,a,!0)}return!0}return null};
            f.save=function(){var a=0,b=[];b[a++]=[this.rf,this.Nf,this.pb,this.qb,this.xb,this.hb];if(!this.Qd&&!this.Sf)for(var c=this.Ua,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var m=0;m<c[d][e].length;m++){var n=c[d][e][m];if(n&&n.Gc){for(var p=[],v=0,w=n.gd,G=n.gd+n.Gc;w<G;)p[v++]=n.data[w++];b[a++]=[d,e,m,n.gd,p]}}return b};
            f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.Ua.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.Nf&&e[1]!=this.Nf&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.Nf+")",b=-2));for(this.Ua.length||(b=-1);d<a.length&&0<=b;){var m=0,n=a[d++],p=n[m++],v=n[m++],w=n[m++];if(p>=this.Ua.length||v>=this.Ua[p].length||w>=this.Ua[p][v].length){c="sector (CHS="+p+":"+v+":"+w+") out of range ("+
            b+" changes applied)";b=-1;break}if(this.Sf){c="unable to modify write-protected disk";b=-1;break}e=n[m++];m=n[m++];n=e+m.length;if(p=this.Ua[p][v][w]){for(v=p.data.length;v<e;)p.data[v++]=p.pattern;v=0;p.gd=e;for(p.Gc=m.length;e<n;)p.data[e++]=m[v++];b++}}}0>b&&-2!=b&&this.V.wa("Unable to restore disk '"+this.Ed+": "+c);return b};
            f.toJSON=function(){var a=JSON.stringify(this.Ua),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
            function dk(a){Ha.call(this,"FDC",a,dk);this.dmaRead=this.ik;this.dmaWrite=this.jk;this.dmaFormat=this.fo;this.Ze=null;if(a.autoMount&&(this.Ze=a.autoMount,"string"==typeof this.Ze))try{this.Ze=eval("("+a.autoMount+")")}catch(b){sa("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.Ze=null}this.Cc=[];this.Pm=!ya("Mobi")&&window&&"FileReader"in window}Pa(dk);g={};aa={};
            var ek={3:{Md:3,me:0,name:aa.ws},4:{Md:2,me:1,name:aa.us},5:{Md:9,me:7,name:aa.Is},6:{Md:9,me:7,name:aa.os},7:{Md:2,me:0,name:aa.qs},8:{Md:1,me:2,name:aa.vs},10:{Md:2,me:7,name:aa.ps},13:{Md:6,me:7,name:aa.Zr},15:{Md:3,me:0,name:aa.ts}};f=dk.prototype;
            f.Kb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.qa[b]=c,c.onchange=function(){var a=d.qa.descDisk,b=c.options[c.selectedIndex];if(a&&b){var n={};if(b=b.getAttribute("data-value"))try{n=eval("({"+b+"})")}catch(p){sa("FDC option error: "+p.message)}b=n.desc;void 0===b&&(b="");n=n.href;void 0!==n&&(b='<a href="'+n+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.qa[b]=c,c.onchange=function(){var a=ca(c.value,10);null!=a&&fk(d,a)},
            !0;case "loadDrive":return this.qa[b]=c,c.onclick=function(){var a=d.qa.listDisks;a&&gk(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.Pm?(this.qa[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;gk(d,fa(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
            f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.fa=fb(a,"ChipSet");this.Rd();Sb(b,this,hk);Ub(b,this,ik);this.Pm&&jk(this,"Local Disk","?");jk(this,"Remote Disk","??");this.Bg()||Ya(this)};
            f.fc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.za.qk){this.Cc=[];for(var c=0;c<this.ya.length;c++)kk(this,c,!0);this.Bg(!0)}}else if(!this.restore(a))return!1;if(c=this.qa.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Ik;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Ik&&(c.value="0",fk(this,0))}}return!0};
            f.ec=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.Rd()};f.save=function(){var a=new Yd(this);a.set(0,this.Yl());return a.data()};f.restore=function(a){return this.Rd(a[0])};
            f.Rd=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.cb=a[b++];b++;this.sa=a[b++];this.hc=a[b++];this.Bb=a[b++];this.ib=a[b++];this.hg=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Cc=c);void 0===this.ya&&(this.Ik=4,this.fa&&(this.Ik=Fh(this.fa)),this.ya=Array(4));for(c=0;c<this.ya.length;c++){var m=this.ya[c];if(void 0===m){var m=this.ya[c]={},n;if(this.fa)a:{n=this.fa;if(c<Fh(n)){if(!n.ee){n=360;break a}if(c<n.ee.length){n=n.ee[c];break a}}n=0}else n=0;switch(n){case 160:case 180:m.qb=
            1;default:m.pb=40;m.xb=9;break;case 720:m.pb=80;m.xb=9;break;case 1200:m.pb=80;m.xb=15;break;case 1440:m.pb=80,m.xb=18}}this.xk(m,c,e[c])||(d=!1)}this.Je=a[b++]||0;this.yn=a[b]||0;return d};f.Yl=function(){var a=0,b=[];b[a++]=this.cb;b[a++]=0;b[a++]=this.sa;b[a++]=this.hc;b[a++]=this.Bb;b[a++]=this.ib;b[a++]=this.hg;b[a++]=this.$l();for(var c=a++,d=0;d<this.ya.length;d++){var e=this.ya[d];e.ua&&lk(this,e.sf,e.ua)}b[c]=this.Cc;b[a++]=this.Je;b[a]=this.yn;return b};
            f.xk=function(a,b,c){var d=0,e=!0;a.cb=b;a.Uc=a.Pf=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.pb||40,a.qb||c[3],a.xb||9,a.hb||512,c[1],a.ti,a.ah,a.bh]);a.Za=c[d++];var m=c[d++];a.name=m[0];a.pb=m[1];a.qb=m[2];a.xb=m[3];a.hb=m[4];a.Rf=m[5];(a.ti=m[6])?(a.ah=m[7],a.bh=m[8]):(a.ti=a.pb,a.ah=a.qb,a.bh=a.xb);a.Oa=c[d++];a.he=c[d++];a.ub=c[d++];a.he=100<=a.he?a.he-100:a.he-a.ub;a.bb=c[d++];a.je=c[d++];a.ob=c[d++];a.Qa=c[d++];a.Na=null;a.ua||(a.sf="");var n=c[d++];
            102==n&&(n=!1);"boolean"==typeof n?(m=c[d++],c=c[d],n?(d=this.ya[b],kk(this,b,!0,!0),d.Pf=!0,b=new Tj(this,d,"preload"),this.Jm(d,b,m,c,!0)):mk(this,b,m,c,!0)?a.ua&&c&&nk(this,m,c,a.ua):Ya(this,!1)):void 0!==n&&a.ua&&0>a.ua.restore(n)&&(e=!1);e&&a.ua&&void 0!==a.Qa&&(a.Na=a.ua.seek(a.ub,a.Oa,a.bb));return e};f.$l=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.Zl(this.ya[c]);return b};
            f.Zl=function(a){var b=0,c=[];c[b++]=a.Za;c[b++]=[a.name,a.pb,a.qb,a.xb,a.hb,a.Rf,a.ti,a.ah,a.bh];c[b++]=a.Oa;c[b++]=a.he+100;c[b++]=a.ub;c[b++]=a.bb;c[b++]=a.je;c[b++]=a.ob;c[b++]=a.Qa;c[b++]=a.Pf;c[b++]=a.Fn;c[b]=a.sf;return c};f.Bg=function(a){a||(this.We=0);if(this.Ze)for(var b in this.Ze){var c=this.Ze[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.ya.length){!mk(this,d,c.name,c.path,!0)&&a&&Ya(this,!1);continue}}this.wa("Unrecognized auto-mount specification for drive "+b)}return!!this.We};
            function gk(a,b,c,d){var e,m=a.qa.listDrives;if(m&&!isNaN(e=ca(m.value,10))&&0<=e&&e<a.ya.length)if(c)if("?"==c)a.wa('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=fa(c);a.oc("Attempting to load "+c+' as "'+b+'"')}for(a.oc("loading disk "+c+"...");mk(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var m=a,n=c,
            p=void 0,p=0;p<m.Cc.length;p++)if(m.Cc[p][1]==n){m.Cc.splice(p,1);break}kk(a,e,!1,!0)}}else kk(a,e);else a.wa("Nothing to load")}function mk(a,b,c,d,e,m){var n=a.ya[b];if(d&&n.sf!=d){kk(a,b,e,!0);if(n.Uc)return a.wa("Drive "+b+" busy"),!0;n.Uc=!0;e&&(n.ef=!0,a.We++);n.Pf=!!m;(new Tj(a,n,"preload")).load(c,d,m,a.Jm);return!1}return!0}
            f.Jm=function(a,b,c,d,e){var m;a.Uc=!1;b&&(m=b.info(),b&&m[0]>a.pb||m[1]>a.qb)&&(this.wa('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.cb)),b=null);b?(a.ua=b,a.Fn=c,a.sf=d,nk(this,c,d,b),m=b.info(),this.Je|=128,this.wa('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.cb),a.ef||e),a.ti=m[0],a.ah=m[1],a.bh=m[2]):a.Pf=!1;a.ef&&(a.ef=!1,--this.We||Ya(this));fk(this,a.cb)};
            function jk(a,b,c){if(a=a.qa.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function fk(a,b){if(0<=b&&b<a.ya.length){var c=a.ya[b],d=a.qa.listDisks,e=a.qa.listDrives;if(d&&e&&(e=ca(e.value,10),c=c.Pf?"?":c.sf,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
            function kk(a,b,c,d){var e=a.ya[b];e.ua&&(lk(a,e.sf,e.ua),e.Fn="",e.sf="",e.ua=null,e.Pf=!1,a.Je|=128,d||a.wa("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||fk(a,b))}function nk(a,b,c,d){var e;for(e=0;e<a.Cc.length;e++)if(a.Cc[e][1]==c){d.restore(a.Cc[e][2]);return}a.Cc[e]=[b,c,[]]}function lk(a,b,c){var d;for(d=0;d<a.Cc.length;d++)if(a.Cc[d][1]==b){a.Cc[d][2]=c.save();break}}f.zq=function(a,b){b&4?this.hg&4||this.hg&8&&this.fa&&Yh(this.fa,6):this.Rd();this.hg=b};f.Yo=function(){return this.sa};
            f.Wo=function(){var a=0;this.Bb<this.ib&&(a=this.hc[this.Bb]);this.hg&8&&this.fa&&Zh(this.fa,6);++this.Bb>=this.ib&&(this.sa&=-81,this.Bb=this.ib=0);return a};
            f.yq=function(a,b){this.ib<this.hc.length&&(this.hc[this.ib++]=b);var c=this.hc[0]&31;if(void 0!==ek[c]&&this.ib>=ek[c].Md){var d=!1;this.Bb=0;var c=this.Ma(),e,m,n,p,v,w=c&31;switch(w){case 3:this.Ma(g.xs);this.Ma(g.cs);this.Wb();break;case 4:m=this.Ma(g.pg);this.cb=m&3;e=this.ya[this.cb];this.Wb();this.gc((e.Za&-16777216)>>>24,g.As);break;case 5:case 6:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];e.Oa=d;m=e.ub=this.Ma(g.gm);n=this.Ma(g.hm);p=e.bb=this.Ma(g.jm);v=this.Ma(g.Lj);e.ob=128<<
            v;e.je=this.Ma(g.Xr);this.Ma(g.Sn);this.Ma(g.Wr);6==w?(w=e,w.Za=72,w.ua&&(w.Na=null,w.Za=0,this.fa&&(Sh(this.fa,2,this,"dmaRead",w),Oh(this.fa,2)))):(w=e,w.Za=72,w.ua&&(w.ua.Sf?w.Za=576:(w.Na=null,w.Za=0,this.fa&&(Sh(this.fa,2,this,"dmaWrite",w),Oh(this.fa,2)))));ok(this,e,c,d,m,n,p,v);d=!0;break;case 7:m=this.Ma(g.pg);this.cb=m&3;e=this.ya[this.cb];e.ub=e.he=0;e.Za=268435488;this.Wb();d=!0;break;case 8:e=this.ya[this.cb];e.Oa=0;this.Wb();this.gc(e.cb|e.Oa<<2|e.Za&255,g.Un);this.gc(e.ub,g.ms);this.cb=
            this.cb+1&3;break;case 10:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.ub;n=e.Oa=d;p=e.bb=1;v=0;e.Za=0;e.ua&&(e.Na=e.ua.seek(e.ub,e.Oa,e.bb))?v=e.Na.length:e.Za=72;ok(this,e,c,d,m,n,p,v);d=!0;break;case 13:m=this.Ma(g.pg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.ub;n=e.Oa=d;p=1;v=this.Ma(g.Lj);e.ob=128<<v;e.je=this.Ma(g.ss);this.Ma(g.Sn);e.vm=this.Ma(g.Rn);w=e;w.Za=72;w.ua&&(w.Na=null,w.Za=0,this.fa&&(w.Kf=0,w.Nc=Array(4),w.Uj=!0,w.Sh=0,Sh(this.fa,2,this,"dmaFormat",w),Oh(this.fa,
            2),w.Uj=!1));ok(this,e,c,d,m,n,p,v);d=!0;break;case 15:m=this.Ma(g.pg),this.cb=m&3,e=this.ya[this.cb],e.Oa=m>>2&1,m=this.Ma(g.js),e.ub+=m-e.he,0>e.ub&&(e.ub=0),e.ub>=e.pb&&(e.ub=e.pb-1),e.he=m,e.Za=32,e.ub||(e.Za|=268435456),this.Wb(),d=!0}0<this.ib&&(this.sa|=80);this.hg&8&&(!e||e.Za&8||!d||this.fa&&Yh(this.fa,6))}};f.Xo=function(){var a=this.Je;this.Je&=-129;return a};f.xq=function(a,b){this.yn=b};
            function ok(a,b,c,d,e,m,n,p){a.Wb();a.gc(b.cb|b.Oa<<2|b.Za&255,g.Un);a.gc((b.Za&65280)>>>8,g.ys);a.gc((b.Za&16711680)>>>16,g.zs);var v=0;if(e!=b.ub||m!=b.Oa)v=n=1;c&128&&(m^=v,d||(v=0));a.gc(e+v,g.gm);a.gc(m,g.hm);a.gc(n,g.jm);a.gc(p,g.Lj)}f.Ma=function(){var a=this.hc[this.Bb];this.Bb++;return a};f.Wb=function(){this.Bb=this.ib=0};f.gc=function(a){this.hc[this.ib++]=a};f.ik=function(a,b,c){void 0===b||0>b?this.dg(a,c):c(-1,!1)};f.jk=function(a,b){return void 0!==b&&0<=b?this.og(a,b):-1};
            f.fo=function(a,b){return void 0!==b&&0<=b?this.dm(a,b):-1};f.dg=function(a,b){var c=-1,d=null,e=0;if(!a.Za&&a.ua){do{if(a.Na&&(e=a.Qa,0<=(c=ck(a.Na,a.Qa++)))){d=a.Na;break}a.Na=a.ua.seek(a.ub,a.Oa,a.bb);if(!a.Na){a.Za=1088;break}a.Qa=0;this.Ag(a)}while(1)}b(c,!1,d,e)};f.og=function(a,b){if(a.Za||!a.ua)return-1;do{if(a.Na&&a.ua.write(a.Na,a.Qa++,b))break;a.Na=a.ua.seek(a.ub,a.Oa,a.bb);if(!a.Na){a.Za=8256;b=-1;break}a.Qa=0;this.Ag(a)}while(1);return b};
            f.Ag=function(a){a.bb++;a.bb>=a.bh+1&&(a.bb=1,a.Oa++,a.Oa>=a.ah&&(a.Oa=0,a.ub++))};f.dm=function(a,b){if(a.Za)return-1;a.Nc[a.Kf++]=b;if(a.Kf==a.Nc.length){a.ub=a.Nc[0];a.Oa=a.Nc[1];a.bb=a.Nc[2];a.ob=128<<a.Nc[3];for(var c=a.Kf=0;c<a.ob;c++)if(0>this.og(a,a.vm))return-1;a.Sh++}a.Sh>=a.je&&(b=-1);return b};var hk={1012:dk.prototype.Yo,1013:dk.prototype.Wo,1015:dk.prototype.Xo},ik={1010:dk.prototype.zq,1013:dk.prototype.yq,1015:dk.prototype.xq};
            Da(function(){for(var a=Wa(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new dk(d);Va(d,c)}});function Z(a){Ha.call(this,"HDC",a,Z);this.dmaRead=this.ik;this.dmaWrite=this.jk;this.dmaWriteBuffer=this.ho;this.dmaWriteFormat=this.io;this.Oj=[];if(a.drives)try{this.Oj=eval("("+a.drives+")")}catch(b){sa("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Rg=(this.df="at"==a.type)?1:0;this.zo=this.df?2:3}Pa(Z);
            var pk=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=Z.prototype;f.Kb=function(){return!1};f.Jc=function(a,b,c,d){this.la=b;this.W=c;this.Sa=d;this.za=a;this.fa=fb(a,"ChipSet");Sb(b,this,this.df?qk:rk);Ub(b,this,this.df?sk:tk);Vd(c,19,this,this.zp);Vd(c,64,this,this.Ap);this.reset();this.Bg()||Ya(this)};
            f.fc=function(a,b){if(!b)if(!a||!this.restore)this.Rd(),this.za.qk&&this.Bg(!0);else if(!this.restore(a))return!1;return!0};f.ec=function(a){return a&&this.save?this.save():!0};f.Tf=function(){return this.za?this.za.Tf():""};f.ue=function(){return this.za?this.za.ue():""};f.reset=function(){this.Rd(null,!0)};f.save=function(){var a=new Yd(this);a.set(0,this.Yl());return a.data()};f.restore=function(a){return this.Rd(a[0])};
            f.Rd=function(a,b){var c=0,d=!0;if(this.df)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.Ie=a[c++],this.En=a[c++],this.Ke=a[c++],this.Aj=a[c++],this.wj=a[c++],this.vj=a[c++],this.eg=a[c++],this.sa=a[c++],this.Ql=a[c++],this.yj=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.mh=a[c++];this.sa=a[c++];this.hc=a[c++];this.Bb=a[c++];this.ib=a[c++];this.Dn=a[c++];this.Cn=a[c++];this.Bn=a[c++];var e=a[c++];void 0!==e?this.Vf=e:void 0===this.Vf&&(this.Vf=-1)}void 0===this.ya&&(this.ya=Array(this.Oj.length));
            c=a[c];void 0===c&&(c=[]);for(e=0;e<this.ya.length;e++){void 0===this.ya[e]&&(this.ya[e]={});var m=this.ya[e];this.xk(e,m,this.Oj[e],c[e],b)||(d=!1);null!=this.mh&&1>=e&&(this.mh|=(m.type&3)<<(1-e<<1))}return d};
            f.Yl=function(){var a=0,b=[];this.df?(b[a++]=this.Ie,b[a++]=this.En,b[a++]=this.Ke,b[a++]=this.Aj,b[a++]=this.wj,b[a++]=this.vj,b[a++]=this.eg,b[a++]=this.sa,b[a++]=this.Ql,b[a++]=this.yj):(b[a++]=this.mh,b[a++]=this.sa,b[a++]=this.hc,b[a++]=this.Bb,b[a++]=this.ib,b[a++]=this.Dn,b[a++]=this.Cn,b[a++]=this.Bn,b[a++]=this.Vf);b[a]=this.$l();return b};
            f.xk=function(a,b,c,d,e){var m=0,n=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.cb=a;b.errorCode=d[m++];b.Jn=d[m++];b.Rf=d[m++];b.Df=d[m++];b.Ef=d[m++];b.Oa=d[m++];b.qb=d[m++];b.Pe=d[m++];b.bb=d[m++];b.je=d[m++];b.ob=d[m++];b.Ph=this.df?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.ue()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===pk[this.Rg][b.type])b.type=this.zo;c=pk[this.Rg][b.type];
            b.xb=c[2]||17;b.hb=c[3]||512;if(e&&this.fa&&(e=this.fa,c=b.type,e.ea)){var p=e.ea[18],p=a?p&240|c:p&15|c<<4;e.ea&&(e.ea[18]=p,th(e))}void 0===b.ua&&(b.ua=null,this.wa("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));uk(this,b);b.Qa=d[m++];b.Na=null;b.ua&&(a=d[m],void 0!==a&&0>b.ua.restore(a)&&(n=!1),n&&void 0!==b.Qa&&(b.Na=b.ua.seek(b.Pe,b.Oa,b.bb+b.Ph)));return n};f.$l=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.Zl(this.ya[c]);return b};
            f.Zl=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Jn;c[b++]=a.Rf;c[b++]=a.Df;c[b++]=a.Ef;c[b++]=a.Oa;c[b++]=a.qb;c[b++]=a.Pe;c[b++]=a.bb;c[b++]=a.je;c[b++]=a.ob;c[b++]=a.Qa;c[b]=a.ua?a.ua.save():null;return c};
            function uk(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.Df[2])?e=b.Df[0]<<8|b.Df[1]:c=b.type);null==c||d||(d=pk[a.Rg][c][1],e=pk[a.Rg][c][0]);d&&((c=pk[a.Rg][b.type])&&e!=c[0]&&d!=c[1]&&a.wa("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.pb=e,b.qb=d,null==b.ua&&(b.ua=new Tj(a,b,b.mode)))}}
            f.Bg=function(a){a||(this.We=0);for(var b=0;b<this.ya.length;b++){var c=this.ya[b];if(c.name&&c.path){if(!(a&&c.ua&&c.ua.gi)){var d;d=c.name;var c=c.path,e=this.ya[b];e.Uc?(this.wa("Drive "+b+" busy"),d=!0):(e.Uc=!0,e.ef=!0,this.We++,(e.ua||new Tj(this,e,e.mode)).load(d,c,null,this.ko),d=!1);!d&&a&&Ya(this,!1)}}else a&&void 0!==c.type&&(c.ua=null,uk(this,c,c.type))}return!!this.We};
            f.ko=function(a,b,c){a.Uc=!1;(a.ua=b)&&this.wa('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.cb),a.ef);a.ef&&(a.ef=!1,--this.We||Ya(this))};f.xp=function(){var a=0;this.Bb<this.ib&&(a=this.hc[this.Bb]);this.fa&&Zh(this.fa,5);this.sa&=-33;++this.Bb>=this.ib&&(this.Bb=this.ib=0,this.sa&=-15);return a};f.Vq=function(a,b){this.ib<this.hc.length&&(this.hc[this.ib++]=b);var c=12!=this.hc[0]?6:this.hc.length;6==this.ib&&(this.sa&=-2);this.ib>=c&&(this.sa|=2,this.sa&=-2,vk(this))};
            f.yp=function(){var a=this.sa;this.Bb<this.ib&&(this.sa|=1);return a};f.Yq=function(a,b){this.Dn=b;this.fa&&Zh(this.fa,5);this.Rd()};f.wp=function(){return this.mh};f.Xq=function(a,b){this.Cn=b;this.sa=13};f.Wq=function(a,b){this.Bn=b};f.Ol=function(){};
            f.Go=function(){var a=-1;if(this.Pa){var b=this,a=this.dg(this.Pa,function(){});1!=this.Pa.Qa&&this.Pa.Qa==this.Pa.hb&&(this.Pa.ob-=this.Pa.hb,this.Ke=this.Ke-1&255,this.Pa.ob>=this.Pa.hb?(b.sa=136,this.dg(this.Pa,function(a){0<=a?(wk(b),b.sa=80):(b.sa=1,b.Ie=16)},!1)):this.sa=80)}return a};
            f.fq=function(a,b){this.Pa&&this.Pa.ob>=this.Pa.hb&&(0>this.og(this.Pa,b)?(this.sa=1,this.Ie=16):1!=this.Pa.Qa&&this.Pa.Qa==this.Pa.hb&&(this.Pa.ob-=this.Pa.hb,this.Ke=this.Ke-1&255,wk(this),this.sa=80,this.Pa.ob>=this.Pa.hb&&(this.sa|=8)))};f.Io=function(){return this.Ie};f.kq=function(a,b){this.En=b};f.Jo=function(){return this.Ke};f.iq=function(a,b){this.Ke=b};f.Ko=function(){return this.Aj};f.jq=function(a,b){this.Aj=b};f.Fo=function(){return this.wj};f.eq=function(a,b){this.wj=b};f.Eo=function(){return this.vj};
            f.dq=function(a,b){this.vj=b};f.Ho=function(){return this.eg};f.gq=function(a,b){this.eg=b;this.sa=this.ya[this.eg&16?1:0]?this.sa|64:this.sa&-65};f.Lo=function(){return this.sa};f.cq=function(a,b){this.Ql=b;this.fa&&Zh(this.fa,14);xk(this)};f.hq=function(a,b){this.yj&4&&!(b&4)&&(this.Ie=1);this.yj=b};
            function xk(a){var b=!1,c=a.Ql,d=a.eg&16?1:0,e=a.eg&15,m=a.wj|(a.vj&3)<<8,n=a.Aj,p=a.Ke||256;a.Pa=null;a.Ie=0;a.sa=80;(d=a.ya[d])?(d.Pe=m,d.Oa=e,d.bb=n,d.ob=p*d.hb,c=144<=c?c:c&240,d.Na=null,d.Qa=0,d.errorCode=0,a.Pa=d):c=-1;switch(c&240){case 32:a.sa=136;a.dg(d,function(b){0<=b&&a.fa?(wk(a),a.sa=80):(a.sa=1,a.Ie=16)},!1);break;case 48:a.sa=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.Ie=1;b=!0;break;case 145:d.qb=e+1,d.xb=p,b=!0}b&&wk(a)}
            function wk(a){!a.fa||a.yj&2||Yh(a.fa,14,120)}
            function vk(a){a.Bb=0;var b=a.Ma(),c=a.Ma(),d=c&32,e=d>>5,m=c&31,n=a.Ma(),p=a.Ma(),v=n<<2&768|p,w=n&63,G=a.Ma(),Q=a.Ma(),M=a.ya[e];M&&(M.Pe=v,M.Oa=m,M.bb=w,M.ob=G*M.hb);switch(b){case 3:a.Wb(M?M.errorCode:4);a.gc(c);a.gc(n);a.gc(p);a.gc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.Ma());)M&&c<M.Df.length&&(M.Df[c++]=b);M&&uk(a,M);b=0;M||a.Vf!=e||(a.Vf=-1,b=2);a.Wb(b|d);b=-1;break;case 224:case 228:a.Wb(0|d),b=-1}if(0<=b)switch(void 0===M?b=-1:(M.errorCode=0,M.Jn=0),b){case 0:a.Wb(0|d);break;case 1:M.Ps=
            Q;a.Wb(0|d);break;case 5:a.Wb(0|d);break;case 8:yk(a,M,function(b){a.Wb(b|d)});break;case 10:Bk(a,M,function(b){a.Wb(b|d)});break;case 15:Ck(a,M,function(b){a.Wb(b|d)});break;default:a.Wb(2|d)}}f.Ma=function(){var a=-1;this.Bb<this.ib&&(a=this.hc[this.Bb++]);return a};f.Wb=function(a){this.Bb=this.ib=0;void 0!==a&&this.gc(a);this.fa&&Yh(this.fa,5);this.sa|=32};f.gc=function(a){this.hc[this.ib++]=a};f.ik=function(a,b,c){void 0===b||0>b?this.dg(a,c):c(-1,!1)};
            f.jk=function(a,b){return void 0!==b&&0<=b?this.og(a,b):-1};f.ho=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Qa<a.Ef.length?a.Ef[a.Qa++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.io=function(a,b){return void 0!==b&&0<=b?this.dm(a,b):-1};function yk(a,b,c){b.errorCode=4;if(b.ua&&(b.Na=null,a.fa)){b.errorCode=0;Sh(a.fa,3,a,"dmaRead",b);Oh(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
            function Bk(a,b,c){b.errorCode=4;if(b.ua&&(b.Na=null,a.fa)){b.errorCode=0;Sh(a.fa,3,a,"dmaWrite",b);Oh(a.fa,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Ck(a,b,c){b.errorCode=4;b.Ef&&b.Ef.length==b.ob||(b.Ef=Array(b.ob));b.Qa=0;a.fa?(b.errorCode=0,Sh(a.fa,3,a,"dmaWriteBuffer",b),Oh(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
            f.dg=function(a,b,c){var d=-1,e=null,m=0;if(a.errorCode)return b&&b(d,!1,e,m),d;var n=!1!==c?1:0;if(a.Na&&(m=a.Qa,d=ck(a.Na,a.Qa),a.Qa+=n,0<=d))return e=a.Na,b&&b(d,!1,e,m),d;if(b){var p=this;if(a.ua)return a.ua.seek(a.Pe,a.Oa,a.bb+a.Ph,!1,function(c,w){(a.Na=c)?(e=c,m=a.Qa=0,p.Ag(a),d=ck(a.Na,a.Qa),a.Qa+=n):a.errorCode=20;b(d,w,e,m)}),d;a.errorCode=20;b(d,!1,e,m)}return d};
            f.og=function(a,b){if(a.errorCode)return-1;do{if(a.Na&&a.ua.write(a.Na,a.Qa++,b))break;a.ua&&a.ua.seek(a.Pe,a.Oa,a.bb+a.Ph,!0,function(b){a.Na=b});if(!a.Na){a.errorCode=20;b=-1;break}a.Qa=0;this.Ag(a)}while(1);return b};f.Ag=function(a){a.bb++;var b=1-a.Ph;a.bb>=a.xb+b&&(a.bb=b,a.Oa++,a.Oa>=a.qb&&(a.Oa=0,a.Pe++))};
            f.dm=function(a,b){if(a.errorCode)return-1;a.Nc[a.Kf++]=b;if(a.Kf==a.Nc.length){a.Pe=a.Nc[0];a.Oa=a.Nc[1];a.bb=a.Nc[2];a.ob=128<<a.Nc[3];for(var c=a.Kf=0;c<a.ob;c++)if(0>this.og(a,a.vm))return-1;a.Sh++}a.Sh>=a.je&&(b=-1);return b};f.zp=function(){var a=this.W.H&255;!(this.W.F>>8)&&128<a&&(this.Vf=a-128);return!0};f.Ap=function(){var a;(a=this.W.F>>8||!this.fa)||(a=!(this.fa.ac[0].rd&64));return a?!0:!1};
            var rk={800:Z.prototype.xp,801:Z.prototype.yp,802:Z.prototype.wp},qk={496:Z.prototype.Go,497:Z.prototype.Io,498:Z.prototype.Jo,499:Z.prototype.Ko,500:Z.prototype.Fo,501:Z.prototype.Eo,502:Z.prototype.Ho,503:Z.prototype.Lo},tk={800:Z.prototype.Vq,801:Z.prototype.Yq,802:Z.prototype.Xq,803:Z.prototype.Wq,807:Z.prototype.Ol,811:Z.prototype.Ol,815:Z.prototype.Ol},sk={496:Z.prototype.fq,497:Z.prototype.kq,498:Z.prototype.iq,499:Z.prototype.jq,500:Z.prototype.eq,501:Z.prototype.dq,502:Z.prototype.gq,503:Z.prototype.cq,
            1014:Z.prototype.hq};Da(function(){for(var a=Wa(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Z(d);Va(d,c)}});function Yd(a,b,c){this.id=a.id;this.key=Dk(a,b,c);this.Sa=a.Sa;Ek(this,a.Zq)}function Dk(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
            Yd.prototype={constructor:Yd,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.pk=!0):this.pk?!0:va()&&(a=wa(this.key))?(this[this.id]=a,this.pk=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){sa(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
            a:JSON.stringify(a)},clear:function(a){Ek(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(m){}b.splice(c,1);c=0}},nc:function(){}};function Ek(a,b){a[a.id]={};b&&a.set("parms",b);a.pk=!1}
            function Fk(a){var b=!0;if(va()){var c=JSON.stringify(a[a.id]);xa(a.key,c)||(sa("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
            function Gk(a,b,c){Ha.call(this,"Computer",a,Gk);this.ha.cc=!1;this.Ae=a.busWidth||a.buswidth;this.$c=Hk;this.th=null;this.ii=!1;this.url=b?b.url:null;this.vr=(Math.random()+.1).toString(36).substr(2,12);this.ad=Ik(this);if(this.W=Sa("CPU",this.id)){this.Sa=Sa("Debugger",this.id);this.la=new Cb({id:this.cn+".bus",buswidth:this.Ae},this.W,this.Sa);var d,e=Qa(this.id);if((this.Xd=Sa("Panel",this.id))&&this.Xd.ek)for(b=0;b<e.length;b++)d=e[b],d.wa=this.Xd.wa,d.oc=this.Xd.oc,d.ek=this.Xd.ek;for(b=0;b<
            e.length;b++)d=e[b],d.Jc&&d.Jc(this,this.la,this.W,this.Sa);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.Dj=d:this.$c=parseInt(d,10));var m;if(a=Ka&&Ka.state||(m=!0,a.state))b=this.Gn=a,m||(this.ii=!0,this.$c=Hk),this.$c&&(this.Hj=new Yd(this,"1.18.2"),this.Hj.load()?b=null:delete this.Hj);!b&&this.$c&&(m=null,this.ad&&(m=ra()+"/api/v1/user?req=load&user="+this.ad+"&state="+Dk(this,"1.18.2")),b=m)&&(this.ii=!0);b?qa(b,!0,null,this,this.Yp):Ya(this);c||Jk(this,this.qj)}else sa("Unable to find CPU component")}
            Pa(Gk);var Hk=0;f=Gk.prototype;f.Tf=function(){return this.vr};f.ue=function(){return this.ad?this.ad:""};f.Yp=function(a,b,c){c?(this.Dj=null,this.ii=!1,this.wa("Unable to load machine state from server (error "+c+(b?": "+(String.prototype.trim?b.trim():b.replace(/^\s+|\s+$/g,"")):"")+")")):this.th=b;Ya(this)};function Jk(a,b,c){for(var d=Qa(a.id),e=0;e<=d.length;e++){var m=e<d.length?d[e]:a;if(!Za(m)){Za(m,function(){Jk(a,b,c)});return}}b.call(a,c)}
            function Kk(a,b){var c=new Yd(a,"1.18.2","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.wa("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
            f.qj=function(a){void 0===a&&(a=this.$c||(this.th?1:Hk));var b=!1,c=!1;this.Rm=!1;var d=this.Hj||new Yd(this,"1.18.2");if(-1==a)b=!0;else if(a>Hk){if(d.load(this.th)){this.uf=new Yd(this,"1.18.2","failsafe");this.uf.load()&&(Lk(this,d),a=2,Ek(this.uf));this.uf.set("timestamp",ma());Fk(this.uf);var e=this.$c&&!this.ii;if(1==a||ta("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var m=d.get("code"),n=d.get("data");m&&("ok"==m?d.load(n):("error"==
            m&&"no machine state"!=n?(this.wa("Error: "+n),"unable to verify user"==n&&(xa("user",""),this.ad=null)):this.oc(m+": "+n),Ek(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&Kk(this,c?d:null)}else 2==a&&d.clear()}else Kk(this);delete this.th;delete this.Hj}e=Qa(this.id);for(m=0;m<e.length;m++)n=e[m],n!==this&&n!=this.W&&(c=Mk(this,n,d,b,c));b=[d,a,c];-1!=a?Jk(this,this.Km,b):this.Km(b)};
            function Mk(a,b,c,d,e){if(!b.ha.cc){b.ha.cc=!0;if(b.fc){var m=null;e&&((m=c.get(b.id))||(m=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof m&&(m=null);!b.fc(m,d)&&m&&(sa("Unable to restore state for "+b.type),a.Gn&&!a.th?(c.clear(),a.$c=Hk,window&&window.location.reload()):a.Rm=!0,b.fc(null),e=!1)}if(!d&&b.Hm)for(a=b.Hm.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
            f.Km=function(a){var b=a[0],c=0>a[1];a=a[2];this.ha.cc=!0;this.Om||(this.oc("PCjs v1.18.2\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Om=!0);this.W&&(Mk(this,this.W,b,c,a),uc(this.W));this.Rm&&(Lk(this,b),b.clear());!c&&this.uf&&(this.uf.clear(),delete this.uf)};
            function Lk(a,b){if(ta("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.ue(),d=b.toString(),e={app:"PCjs",ver:"1.18.2"};e.url=a.url;e.user=c;e.type="bug";e.data=d;qa("http://www.pcjs.org/api/v1/report",!0,e)}}
            function Nk(a,b,c){var d,e="none",m=new Yd(a,"1.18.2"),n=new Yd(a,"1.18.2","validate"),p=ma();n.set("timestamp",p);m.set("timestamp",p);m.set("version","1.18.2");m.set("url",window?window.location.href:null);m.set("browser",window?window.navigator.userAgent:"");a.W&&a.W.ec&&(c&&wc(a.W),d=a.W.ec(b,c),"object"===typeof d&&m.set(a.W.id,d),c&&(a.W.ha.cc=!1,!1===d&&(e=null)));for(var p=Qa(a.id),v=0;v<p.length;v++){var w=p[v];w.ha.cc&&(w.ec&&(d=w.ec(b,c),"object"===typeof d&&m.set(w.id,d)),c&&(w.ha.cc=
            !1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.ad&&Ok(a,a.ad,m.toString()),Fk(n)&&Fk(m)||(e=null,d=p=!0)):a.$c&&(d=!0,p=3==a.$c),d&&m.clear(p)):e=m.toString());c&&(a.ha.cc=!1);return e}f.reset=function(){this.la&&this.la.reset&&(this.nc("Resetting "+this.la.type),this.la.reset());for(var a=Qa(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.la&&c.reset&&(this.nc("Resetting "+c.type),c.reset())}};
            f.start=function(a,b){for(var c=Qa(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=Qa(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
            f.Kb=function(a,b,c){var d=this;switch(b){case "save":return this.qa[b]=c,c.onclick=function(){var a=Ik(d,!0);if(a){var b=!(!d.$c||d.Dj),c=Nk(d,b);b?Ok(d,a,c):d.wa("Resume disabled, machine state not saved")}},!0;case "reset":return this.qa[b]=c,c.onclick=function(){xc(d)},!0}return!1};
            function Ik(a,b){var c=a.ad;c||(c=wa("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=Pk(a,c))||a.wa("Your user ID has not been approved."))):b&&a.wa("Browser local storage is not available"));return c}
            function Pk(a,b){a.ad=null;var c=qa(ra()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(xa("user",c.data),a.ad=c.data)}catch(e){sa(e.message+" ("+d+")")}return a.ad}
            function Ok(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Dk(a,"1.18.2");d.data=c;b=qa(ra()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.wa("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.wa(c),xa("user",""),a.ad=null)}}
            function xc(a){if(a.$c&&!a.Dj){var b=ta("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Nk(a,b,!0);!b&&a.Gn?window&&window.location.reload():(b||(a.qk=!0),a.qj(Hk),a.qk=!1)}else a.reset(),a.W&&uc(a.W)}function fb(a,b,c){a=Qa(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
            Da(function(){for(var a=Wa(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=Ua(c),c=Wa(c,"pcjs","computer"),e=0;e<c.length;e++){var m=c[e],n=Ua(m),n=new Gk(n,d,!0);Va(n,m);Jk(n,n.qj)}});za.show.push(function(){for(var a=Wa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Sa("Computer",c.id))&&c.Om&&!c.ha.cc&&c.qj(-1)}});
            za.exit.push(function(){for(var a=Wa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Sa("Computer",c.id))&&c.ha.cc&&Nk(c,!(!c.$c||c.Dj),!0)}});var Qk=0;function Rk(a,b,c,d,e,m){e("Loading "+a+"...");qa(a,!0,null,null,function(n,p,v){v?(p||(p="unable to load "+a+" ("+v+")"),m(p,null)):Sk(p,a,b,c,d,e,m)})}
            function Sk(a,b,c,d,e,m,n){function p(a,m){if(m)n(m,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(Q){p=
            null,a=Q.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);n(a,p)}}a?e?Tk(a,m,p):p(a,null):n("no data"+(b?" for file: "+b:""),null)}
            function Tk(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");qa(e,!0,null,null,function(m,n,p){if(p||!n)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(m=d[3])if(p=n.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var v=p[0],w,G=/( [a-z]+=)(['"])(.*?)\2/g;w=G.exec(m);)v=0>v.indexOf(w[1])?v.replace(">",w[0]+">"):v.replace(new RegExp(w[1]+"(['\"])(.*?)\\1"),w[0]);p[0]!=v&&(n=n.replace(p[0],v))}else{c(a,"missing <"+d[1]+"> in "+e);return}n=n.replace(/<\?xml[^>]*>[\r\n]*/,
            "");a=a.replace(d[0],n);Tk(a,b,c)}})}else c(a,null)}
            function Uk(a,b,c,d){function e(a){if(void 0===p){var b=n&&Wa(n,"machine-warning");p=b&&b[0]||n}p&&(p.innerHTML=ka(a))}function m(a){e("Error: "+a);v&&(--Qk||Fa(!0));v=!1}var n,p,v=!0;Qk++;try{if(n=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.2/components.xsl");var w=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(n.outerHTML=w,--Qk||Fa(!0)):m("transformNodeToObject failed")}else window.document.implementation&&
            window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?n.parentNode?(n.parentNode.replaceChild(w,n),--Qk||Fa(!0)):m("invalid machine element: "+a):m("transformToFragment failed")):m("unable to transform XML: unsupported browser");else m("failed to load XSL file: "+c);else m(d)};p?Rk(c,null,null,!1,e,v):m("failed to load XML file: "+b)}else m(d)};"<"!=b.charAt(0)?Rk(b,a,d,!0,e,w):Sk(b,null,a,d,!1,e,w)}else m("missing machine element: "+
            a)}catch(G){m(G.message)}return v}window.embedPC=function(a,b,c,d){Fa(!1);return Uk(a,b,c,d)};window.enableEvents=Fa;window.sendEvent=Ga;})();
            
  • pcjs-embed
    • embed.ts
      module pcjsEmbed {
      
        export function embed(global?: any) {
          if (!global)
            global = (function() {
              return this.parent;
            })();
      
          var drive = <persistence.Drive>global.require('drive');
          var embed_pcjs = drive.read('/pcjs/versions/pcjs/1.18.2/pc.js');
          var wrapped = embed_pcjs;
      
          var frame = createFrame(global.window);
          var embedPC = frame.evalFN(wrapped);
          startWith(frame.global, embedPC);
        }
      
      
        function startWith(window, embedPC) {
      
          // do rawgit instead
          var embedPCURL = 'https://api.github.com/repos/jeffpar/pcjs/contents';
      
          var machineXML = '/devices/pc/machine/5170/ega/1152kb/rev3/machine.xml';
      
          // //devices/pc/machine/5160/cga/640kb
          // devices/pc/machine/5150/mda/64kb/machine.xml
          //docs/pcjs/demos/sample3a.xml
          // /devices/pc/machine/5160/ega/640kb/win101/machine.xml
      
      
          window.addEventListener('load', function(load_event) {
      
            var root = document.getElementById('root');
            if (!root) {
              root = document.createElement('div');
              root.id = 'root';
              document.body.appendChild(root);
            }
            else {
              root.innerHTML = '';
            }
      
            var rootInner = document.createElement('div');
            rootInner.id = Math.random() + '-' + new Date().getTime();
            root.appendChild(rootInner);
      
          }
      
        function createFrame(document: Document) {
      
              var ifr = <HTMLIFrameElement>elem(
                'iframe',
                {
                  position: 'absolute',
                  left: 0, top: 0,
                  width: '100%', height: '100%',
                  border: 'none',
                  src: 'about:blank'
                },
                window.document.body);
      
              var ifrwin = ifr.contentWindow || (<any>ifr).window;
              var ifrdoc = ifrwin.document;
      
              if (ifrdoc.open) ifrdoc.open();
              ifrdoc.write(
                '<!' + 'doctype html' + '>' +
                '<' + 'html' + '>' +
                '<' + 'head' + '><' + 'style' + '>' +
                'body,html{margin:0;padding:0;border:none;height:100%;border:none;}' +
                '*,*:before,*:after{box-sizing:inherit;}' +
                'html{box-sizing:border-box;}' +
                '</' + 'style' + '>\n' +
      
                '<' + 'body' + '>' +
      
                '<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
      
                // it's important to have body before any long scripts (especialy external),
                // so IFRAME is immediately ready
                '<' + 'body' + '>' +
      
                '</' + 'html' + '>');
              if (ifrdoc.close) ifrdoc.close();
      
              var ifrwin_eval = ifrwin.__eval_export_;
              try {
                delete (<any>ifrwin).__eval_export_;
              }
              catch (weirdIEFailure) {
                // no big deal if it fails
              }
      
              ifrdoc.body.innerHTML = '';
      
              if (window.onerror) {
                ifrwin.onerror = delegate_onerror;
              }
      
              return {
                document: ifrdoc,
                global: ifrwin,
                iframe: ifr,
                evalFN: ifrwin_eval
              };
      
              function delegate_onerror() {
                window.onerror.apply(window, arguments);
      ments);
          }
      
        }
      
      }
    • overrideLocalStorage.ts
      module pcjsEmbed {
      
        export function overideLocalStorage(drive: persistence.Drive, cachePath: string) {
      
          class LocalStorageOverride {
      
            keys = [];
            length = 0;
      
            constructor() {
              this._updateKeys();
            }
      
            getItem(key: string) {
              //console.log('getItem_proxy(' + JSON.stringify(key) + ')');
      
              var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
      
              return drive.read(cached);
            }
      
            setItem(key: string, value) {
              // console.log('setItem_proxy(' + JSON.stringify(key) + ', ' + JSON.stringify(value) + ')');
              var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
              document.write(cached, value);
              this._updateKeys();
            };
      
            removeItem(key: string) {
              // console.log('removeItem_proxy(' + JSON.stringify(key) + ')');
              var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (key.charAt(0) === '/' ? key.slice(1) : key);
              this._updateKeys();
            }
      
            key(index: number) {
              return this.keys[index];
            }
      
            _updateKeys() {
              this.keys = [];
              var allFiles = drive.files();
              var prefix = cachePath + (cachePath.slice(-1) === '/' ? '' : '/');
              for (var i = 0; i < allFiles.length; i++) {
                if (allFiles[i].length > prefix.length && allFiles[i].slice(0, prefix.length) === prefix) {
                  this.keys.push(allFiles[i].slice(prefix.length));
                }
              }
              this.length = this.keys.length;
            }
      
          }
        }
      }
    • overrideXMLHttpRequest.ts
      module pcjsEmbed {
      
        var embedPCURL = 'https://api.github.com/repos/jeffpar/pcjs/contents';
      
      
        export function overrideXMLHttpRequest(window: Window, drive: persistence.Drive, currentPath: string, existingPath: string, cachePath: string) {
      
      
          return XMLHttpRequestOverride;
      
          class XMLHttpRequestOverride {
      
            private _url = '';
            private _original_url = '';
      
            private static _callbackCounter = 0;
      
            status = 0;
            readyState = 0;
            responseText = null;
            onreadystatechange: () => void = null;
      
            constructor() {
            }
      
            open(method: string, url: string) {
              if (url.charAt(0) !== '/') {
                var lastMachineSlash = currentPath.lastIndexOf('/');
                this._original_url = url;
                url = currentPath.slice(0, lastMachineSlash + 1) + url;
              }
      
              this._url = url;
            }
      
            send() {
              var existing = existingPath + (existingPath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
              var result = drive.read(existing);
              if (!result) {
               	var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
                result = drive.read(cached);
              }
              if (result) {
                this.status = 200;
                this.readyState = 4;
                this.responseText = result;
                if (typeof this.responseText != 'string')
                  this.responseText = JSON.stringify(this.responseText);
                setTimeout(function() { this.onreadystatechange(); }, 1);
                return;
              }
      
              try {
                var xhr = new XMLHttpRequest();
                xhr.open('GET', 'https://rawgit.com/jeffpar/pcjs/master' + this._url);
                xhr.onreadystatechange = function() {
                  if (xhr.readyState !== 4) return;
                  if (xhr.status !== 200) {
                    this._send_jsonp({ data: { content: btoa(xhr.responseText) } });
                    return;
                  }
                  this._processResultContent(xhr.response);
                };
                xhr.send();
              }
              catch (xhrError) {
                this._send_jsonp();
              }
      
            }
      
            _send_jsonp() {
              var callbackName = 'jsonpCallback' + (XMLHttpRequestOverride._callbackCounter++);
              window[callbackName] = function(result) {
                document.body.removeChild(reqScript);
                this.processResult(result);
              };
              var reqScript = document.createElement('script');
              reqScript.src = embedPCURL + this._url + '?callback=' + callbackName;
              document.body.appendChild(reqScript);
            }
      
            _processResult(result) {
              if (!result.data.content) {
                alert(result.data.message + '\n' + this._url + '\n\n' + JSON.stringify(result));
                return;
              }
              this._processResultContent(atob(result.data.content));
            }
      
            _processResultContent(resultContent) {
              this.responseText = resultContent;
      
              var cached = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (this._url.charAt(0) === '/' ? this._url.slice(1) : this._url);
              drive.write(cached, this.responseText);
      
              /*
              if (this.responseText.charAt(0) !== '<') {
                try {
                  contentsByPath[this._url] = JSON.parse(this.responseText);
                }
                catch (error) { }
              }
              var contentsByPathScript = document.getElementById('contentsByPathScript');
              if (!contentsByPathScript) {
                contentsByPathScript = document.createElement('script');
                contentsByPathScript.id = 'contentsByPathScript';
                document.body.appendChild(contentsByPathScript);
              }
              contentsByPathScript.text = 'var contentsByPath = ' + JSON.stringify(contentsByPath).replace(new RegExp('<' + '/' + 'script', 'g'), '<"+"/"+"script') + ';';
              */
      
              this.status = 200;
              this.readyState = 4;
              this.onreadystatechange();
            }
            setRequestHeader() { }
          }
        }
      
      }
    • wrapGlobal.ts
      module pcjsEmbed {
      
        export function wrapGlobal(global: any, window: Window, drive: persistence.Drive) {
          global.XMLHttpRequest = overrideXMLHttpRequest(window, drive);
      
      
        }
      }
    • attached
      • indexedDB.ts
        module persistence {
        
          function getIndexedDB() {
            try {
              return typeof indexedDB === 'undefined' || typeof indexedDB.open !== 'function' ? null : indexedDB;
            }
            catch (error) {
              return null;
            }
          }
        
          export module attached.indexedDB {
        
            export var name = 'indexedDB';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
              try {
                detectCore(uniqueKey, callback);
              }
              catch (error) {
                callback(null);
              }
            }
        
            function detectCore(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
        
              var indexedDBInstance = getIndexedDB();
              if (!indexedDBInstance) {
                callback(null);
                return;
              }
        
              var dbName = uniqueKey || 'portabled';
        
              var openRequest = indexedDBInstance.open(dbName, 1);
              openRequest.onerror = (errorEvent) => callback(null);
        
              openRequest.onupgradeneeded = createDBAndTables;
        
              openRequest.onsuccess = (event) => {
                var db: IDBDatabase = openRequest.result;
        
                try {
                  var transaction = db.transaction(['files', 'metadata']);
                  // files mentioned here, but not really used to detect
                  // broken multi-store transaction implementation in Safari
        
                  transaction.onerror = (errorEvent) => callback(null);
        
                  var metadataStore = transaction.objectStore('metadata');
                  var filesStore = transaction.objectStore('files');
                  var editedUTCRequest = metadataStore.get('editedUTC');
                }
                catch (getStoreError) {
                  callback(null);
                  return;
                }
        
                if (!editedUTCRequest) {
                  callback(null);
                  return;
                }
        
                editedUTCRequest.onerror = (errorEvent) => {
                  var detached = new IndexedDBDetached(db, null);
                  callback(detached);
                };
        
                editedUTCRequest.onsuccess = (event) => {
                  var result: MetadataData = editedUTCRequest.result;
                  var detached = new IndexedDBDetached(db, result && typeof result.value === 'number' ? result.value : null);
                  callback(detached);
                };
              }
        
        
              function createDBAndTables() {
                var db: IDBDatabase = openRequest.result;
                var filesStore = db.createObjectStore('files', { keyPath: 'path' });
                var metadataStore = db.createObjectStore('metadata', { keyPath: 'property' })
              }
            }
        
        
        
            class IndexedDBDetached implements Drive.Detached {
        
              constructor(
                private _db: IDBDatabase,
                public timestamp: number) {
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
                var metadataStore = transaction.objectStore('metadata');
                var filesStore = transaction.objectStore('files');
        
                var countRequest = filesStore.count();
                countRequest.onerror = (errorEvent) => {
                  console.error('Could not count files store.');
                  callback(null);
                };
        
                countRequest.onsuccess = (event) => {
        
                  var storeCount: number = countRequest.result;
        
                  var cursorRequest = filesStore.openCursor();
                  cursorRequest.onerror = (errorEvent) => callback(null);
        
                  // to cleanup any files which content is the same on the main drive
                  var deleteList: string[] = [];
                  var anyLeft = false;
        
                  var processedCount = 0;
        
                  cursorRequest.onsuccess = (event) => {
                    var cursor: IDBCursor = cursorRequest.result;
        
                    if (!cursor) {
        
                      // cleaning up files whose content is duplicating the main drive
                      if (anyLeft) {
                        for (var i = 0; i < deleteList.length; i++) {
                          filesStore['delete'](deleteList[i]);
                        }
                      }
                      else {
                        filesStore.clear();
                        metadataStore.clear();
                      }
        
                      callback(new IndexedDBShadow(this._db, this.timestamp));
                      return;
                    }
        
                    if (callback.progress)
                      callback.progress(processedCount, storeCount);
                    processedCount++;
        
                    var result: FileData = (<any>cursor).value;
                    if (result && result.path) {
        
                      var existingContent = mainDrive.read(result.path);
                      if (existingContent === result.content) {
                        deleteList.push(result.path);
                      }
                      else {
                        mainDrive.timestamp = this.timestamp;
                        mainDrive.write(result.path, result.content);
                        anyLeft = true;
                      }
                    }
        
                    cursor['continue']();
                  }; // cursorRequest.onsuccess
        
                }; // countRequest.onsuccess
        
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
        
                var filesStore = transaction.objectStore('files');
                filesStore.clear();
        
                var metadataStore = transaction.objectStore('metadata');
                metadataStore.clear();
        
                callback(new IndexedDBShadow(this._db, -1));
              }
        
            }
        
            class IndexedDBShadow implements Drive.Shadow {
        
              constructor(private _db: IDBDatabase, public timestamp: number) {
              }
        
              write(file: string, content: string) {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
                var filesStore = transaction.objectStore('files');
                var metadataStore = transaction.objectStore('metadata');
        
                // no file deletion here: we need to keep account of deletions too!
                var fileData: FileData = {
                  path: file,
                  content: content,
                  state: null
                };
        
                var putFile = filesStore.put(fileData);
        
                var md: MetadataData = {
                  property: 'editedUTC',
                  value: Date.now()
                };
        
                metadataStore.put(md);
        
              }
            }
        
            interface FileData {
              path: string;
              content: string;
              state: string;
            }
        
            interface MetadataData {
              property: string;
              value: any;
            }
        
        
          }
        
        }
      • localStorage.ts
        module persistence {
        
          function getLocalStorage() {
            return typeof localStorage === 'undefined' || typeof localStorage.length !== 'number' ? null : localStorage;
          }
        
          // is it OK&
          export module attached.localStorage {
        
            export var name = 'localStorage';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
              var localStorageInstance = getLocalStorage();
              if (!localStorageInstance) {
                callback(null);
                return;
              }
        
              var access = new LocalStorageAccess(localStorageInstance, uniqueKey);
              var dt = new LocalStorageDetached(access);
              callback(dt);
            }
        
            class LocalStorageAccess {
              private _cache: { [key: string]: string; } = {};
        
              constructor(private _localStorage: Storage, private _prefix: string) {
              }
        
              get (key: string): string {
                var k = this._expandKey(key);
                var r = this._localStorage.getItem(k);
                return r;
              }
            
            	set(key: string, value: string): void {
                var k = this._expandKey(key);
                return this._localStorage.setItem(k, value);
              }
        
              remove(key: string): void {
                var k = this._expandKey(key);
                return this._localStorage.removeItem(k);
              }
        
              keys(): string[] {
                var result: string[] = [];
                var len = this._localStorage.length;
                for (var i = 0; i < len; i++) {
                  var str = this._localStorage.key(i);
                  if (str.length > this._prefix.length && str.slice(0, this._prefix.length) === this._prefix)
                    result.push(str.slice(this._prefix.length));
                }
                return result;
              }
        
              private _expandKey(key: string): string {
                var k: string;
        
                if (!key) {
                  k = this._prefix;
                }
                else {
                  k = this._cache[key];
                  if (!k)
                    this._cache[key] = k = this._prefix + key;
                }
                
                return k;
              }
          	}
        
        
            class LocalStorageDetached implements Drive.Detached {
        
              timestamp: number = 0;
        
              constructor(private _access: LocalStorageAccess) {
                var timestampStr = this._access.get('*timestamp');
                if (timestampStr && timestampStr.charAt(0)>='0' && timestampStr.charAt(0)<='9') {
                  try {
                    this.timestamp = parseInt(timestampStr);
                  }
                  catch (parseError) {
                  }
                }
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                var keys = this._access.keys();
                for (var i = 0; i < keys.length; i++) {
                  var k = keys[i];
                  if (k.charAt(0)==='/') {
                    var value = this._access.get(k);
                    mainDrive.write(k, value);
                  }
                }
                
                var shadow = new LocalStorageShadow(this._access, mainDrive.timestamp);
                callback(shadow);
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                var keys = this._access.keys();
                for (var i = 0; i < keys.length; i++) {
                  var k = keys[i];
                  if (k.charAt(0)==='/') {
                    var value = this._access.remove(k);
                  }
                }
        
                var shadow = new LocalStorageShadow(this._access, this.timestamp);
                callback(shadow);
              }
        
            }
            
            class LocalStorageShadow implements Drive.Shadow {
        
              constructor(private _access: LocalStorageAccess, public timestamp: number) {
              }
        
              write(file: string, content: string) {
                this._access.set(file, content);
                this._access.set('*timestamp', <any>this.timestamp);
              }
        
            }
        
          }
          
        } 
      • webSQL.ts
        module persistence {
        
          function getOpenDatabase() {
            return typeof openDatabase !== 'function' ? null : openDatabase;
          }
        
          export module attached.webSQL {
        
            export var name = 'webSQL';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
        
              var openDatabaseInstance = getOpenDatabase();
              if (!openDatabaseInstance) {
                callback(null);
                return;
              }
        
              var dbName = uniqueKey || 'portabled';
        
              var db = openDatabase(
                dbName, // name
                1, // version
                'Portabled virtual filesystem data', // displayName
                1024 * 1024); // size
              // upgradeCallback?
        
        
              db.readTransaction(
                transaction => {
                  transaction.executeSql(
                    'SELECT value from "*metadata" WHERE name=\'editedUTC\'',
                    [],
                    (transaction, result) => {
                      var editedValue: number = null;
                      if (result.rows && result.rows.length === 1) {
                        var editedValueStr = result.rows.item(0).value;
                        if (typeof editedValueStr === 'string') {
                          try {
                            editedValue = parseInt(editedValueStr);
                          }
                          catch (error) {
                            // unexpected value for the timestamp, continue as if no value found
                          }
                        }
                        else if (typeof editedValueStr === 'number') {
                          editedValue = editedValueStr;
                        }
                      }
        
                      callback(new WebSQLDetached(db, editedValue || 0, true));
                    },
                    (transaction, sqlError) => {
                      // no data
                      callback(new WebSQLDetached(db, 0, false));
                    });
                },
                sqlError=> {
                  // failed to load
                  callback(null);
                });
        
            }
        
            class WebSQLDetached implements Drive.Detached {
        
              constructor(
                private _db: Database,
                public timestamp: number,
                private _metadataTableIsValid: boolean) {
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                this._db.readTransaction(
                  transaction => listAllTables(
                    transaction,
                    tables => {
        
                      var ftab = getFilenamesFromTables(tables);
        
                      this._applyToWithFiles(transaction, ftab, mainDrive, callback);
                    },
                    sqlError => {
                      reportSQLError('Failed to list tables for the webSQL database.', sqlError);
                      callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                    }),
                  sqlError => {
                    reportSQLError('Failed to open read transaction for the webSQL database.', sqlError);
                    callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  });
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                this._db.transaction(
                  transaction => listAllTables(
                    transaction,
                    tables => {
                      this._purgeWithTables(transaction, tables, callback);
                    },
                    sqlError => {
                      reportSQLError('Failed to list tables for the webSQL database.', sqlError);
                      callback(new WebSQLShadow(this._db, 0, false));
                    }),
                  sqlError => {
                    reportSQLError('Failed to open read-write transaction for the webSQL database.', sqlError);
                    callback(new WebSQLShadow(this._db, 0, false));
                  });
              }
        
              private _applyToWithFiles(transaction: SQLTransaction, ftab: { file: string; table: string; }[], mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
        
                if (!ftab.length) {
                  callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  return;
                }
        
                var reportedFileCount = 0;
        
                var completeOne = () => {
                  reportedFileCount++;
                  if (reportedFileCount === ftab.length) {
                    callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  }
                };
        
                var applyFile = (file: string, table: string) => {
                  transaction.executeSql(
                    'SELECT * FROM "' + table + '"',
                    [],
                    (transaction, result) => {
                      if (result.rows.length) {
                        var row = result.rows.item(0);
                        if (row.value === null)
                          mainDrive.write(file, null);
                        else if (typeof row.value === 'string')
                          mainDrive.write(file, fromSqlText(row.value));
                      }
                      completeOne();
                    },
                    sqlError => {
                      completeOne();
                    });
                };
        
                for (var i = 0; i < ftab.length; i++) {
                  applyFile(ftab[i].file, ftab[i].table);
                }
        
              }
        
              private _purgeWithTables(transaction: SQLTransaction, tables: string[], callback: Drive.Detached.CallbackWithShadow) {
                if (!tables.length) {
                  callback(new WebSQLShadow(this._db, 0, false));
                  return;
                }
        
                var droppedCount = 0;
        
                var completeOne = () => {
                  droppedCount++;
                  if (droppedCount === tables.length) {
                    callback(new WebSQLShadow(this._db, 0, false));
                  }
                };
        
                for (var i = 0; i < tables.length; i++) {
                  transaction.executeSql(
                    'DROP TABLE "' + tables[i] + '"',
                    [],
                    (transaction, result) => {
                      completeOne();
                    },
                    (transaction, sqlError) => {
                      reportSQLError('Failed to drop table for the webSQL database.', sqlError);
                      completeOne();
                    });
                }
              }
        
            }
        
            class WebSQLShadow implements Drive.Shadow {
        
              private _cachedUpdateStatementsByFile: { [name: string]: string; } = {};
              private _closures = {
                updateMetadata: (transaction: SQLTransaction) => this._updateMetadata(transaction)
              };
        
              constructor(private _db: Database, public timestamp: number, private _metadataTableIsValid: boolean) {
              }
        
              write(file: string, content: string) {
        
                if (content || typeof content === 'string') {
                  this._updateCore(file, content);
                }
                else {
                  this._dropFileTable(file);
                }
              }
        
              private _updateCore(file: string, content: string) {
                var updateSQL = this._cachedUpdateStatementsByFile[file];
                if (!updateSQL) {
                  var tableName = mangleDatabaseObjectName(file);
                  updateSQL = this._createUpdateStatement(file, tableName);
                }
                this._db.transaction(
                  transaction => {
                    transaction.executeSql(
                      updateSQL,
                      ['content', content],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => this._createTableAndUpdate(transaction, file, tableName, updateSQL, content));
                  },
                  sqlError => {
                    reportSQLError('Transaction failure updating file "' + file + '".', sqlError);
                  });
              }
        
              private _createTableAndUpdate(transaction: SQLTransaction, file: string, tableName: string, updateSQL: string, content: string) {
                if (!tableName)
                  tableName = mangleDatabaseObjectName(file);
        
                transaction.executeSql(
                  'CREATE TABLE "' + tableName + '" (name PRIMARY KEY, value)',
                  [],
                  (transaction, result) => {
                    transaction.executeSql(
                      updateSQL,
                      ['content', content],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => {
                        reportSQLError('Failed to update table "' + tableName + '" for file "' + file + '" after creation.', sqlError);
                      });
                  },
                  (transaction, sqlError) => {
                    reportSQLError('Failed to create a table "' + tableName + '" for file "' + file + '".', sqlError);
                  });
              }
        
              private _dropFileTable(file: string) {
                var tableName = mangleDatabaseObjectName(file);
                this._db.transaction(
                  transaction => {
                    transaction.executeSql(
                      'DROP TABLE "' + tableName + '"',
                      [],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => {
                        reportSQLError('Failed to drop table "' + tableName + '" for file "' + file + '".', sqlError);
                      });
                  },
                  sqlError => {
                    reportSQLError('Transaction failure dropping table "' + tableName + '" for file "' + file + '".', sqlError);
                  });
              }
        
              private _updateMetadata(transaction: SQLTransaction) {
                var updateMetadataSQL = 'INSERT OR REPLACE INTO "*metadata" VALUES (?,?)';
                transaction.executeSql(
                  updateMetadataSQL,
                  ['editedUTC', this.timestamp],
                  (transaction, result) => { }, // TODO: generate closure statically
                  (transaction, error) => {
                    transaction.executeSql(
                      'CREATE TABLE "*metadata" (name PRIMARY KEY, value)',
                      [],
                      (transaction, result) => {
                        transaction.executeSql(updateMetadataSQL, [], () => { }, () => { });
                      },
                      (transaction, sqlError) => {
                        reportSQLError('Failed to update metadata table after creation.', sqlError);
                      });
                  });
        
              }
        
              private _createUpdateStatement(file: string, tableName: string): string {
                return this._cachedUpdateStatementsByFile[file] =
                  'INSERT OR REPLACE INTO "' + tableName + '" VALUES (?,?)';
              }
            }
        
        
            function mangleDatabaseObjectName(name: string): string {
              // no need to polyfill btoa, if webSQL exists
              if (name.toLowerCase() === name)
                return name;
              else
                return '=' + btoa(name);
            }
        
            function unmangleDatabaseObjectName(name: string): string {
              if (!name || name.charAt(0) === '*') return null;
        
              if (name.charAt(0) !== '=') return name;
        
              try {
                return atob(name.slice(1));
              }
              catch (error) {
                return name;
              }
            }
        
            export function listAllTables(
              transaction: SQLTransaction,
              callback: (tables: string[]) => void,
              errorCallback: (sqlError: SQLError) => void) {
              transaction.executeSql(
                'SELECT tbl_name  from sqlite_master WHERE type=\'table\'',
                [],
                (transaction, result) => {
                  var tables: string[] = [];
                  for (var i = 0; i < result.rows.length; i++) {
                    var row = result.rows.item(i);
                    var table = row.tbl_name;
                    if (!table || (table[0] !== '*' && table.charAt(0) !== '=' && table.charAt(0) !== '/')) continue;
                    tables.push(row.tbl_name);
                  }
                  callback(tables);
                },
                (transaction, sqlError) => errorCallback(sqlError));
            }
        
            function getFilenamesFromTables(tables: string[]) {
              var filenames: { table: string; file: string; }[] = [];
              for (var i = 0; i < tables.length; i++) {
                var file = unmangleDatabaseObjectName(tables[i]);
                if (file)
                  filenames.push({ table: tables[i], file: file });
              }
              return filenames;
            }
        
            function toSqlText(text: string) {
              if (text.indexOf('\u00FF') < 0 && text.indexOf('\u0000') < 0) return text;
        
              return text.replace(/\u00FF/g, '\u00FFf').replace(/\u0000/g, '\u00FF0');
            }
        
            function fromSqlText(sqlText: string) {
              if (sqlText.indexOf('\u00FF') < 0 && sqlText.indexOf('\u0000') < 0) return sqlText;
        
              return sqlText.replace(/\u00FFf/g, '\u00FF').replace(/\u00FF0/g, '\u0000');
            }
        
            function reportSQLError(message: string, sqlError: SQLError);
            function reportSQLError(sqlError: SQLError);
            function reportSQLError(message, sqlError?) {
              if (typeof console !== 'undefined' && typeof console.error === 'function') {
                if (sqlError)
                  console.error(message, sqlError);
                else
                  console.error(sqlError);
              }
            }
        
        
          }
        
        }
    • dom
      • CommentHeader.ts
        module persistence.dom {
        
          export class CommentHeader {
        
            header: string;
            contentOffset: number;
            contentLength: number;
        
            constructor(public node: Comment) {
              var headerLine: string;
              var content: string;
              if (typeof node.substringData === 'function'
                && typeof node.length === 'number') {
                var chunkSize = 128;
        
                if (node.length >= chunkSize) {
                  // TODO: cut chunks off the start and look for newlines
                  var headerChunks: string[] = [];
                  while (headerChunks.length * chunkSize < node.length) {
                    var nextChunk = node.substringData(headerChunks.length * chunkSize, chunkSize);
                    var posEOL = nextChunk.search(/\r|\n/);
                    if (posEOL < 0) {
                      headerChunks.push(nextChunk);
                      continue;
                    }
        
                    this.header = headerChunks.join('') + nextChunk.slice(0, posEOL);
                    this.contentOffset = this.header.length + 1; // if header is separated by a single CR or LF
        
                    if (posEOL === nextChunk.length - 1) { // we may have LF part of CRLF in the next chunk!
                      if (nextChunk.charAt(nextChunk.length - 1) === '\r'
                        && node.substringData((headerChunks.length + 1) * chunkSize, 1) === '\n')
                        this.contentOffset++;
                    }
                    else if (nextChunk.slice(posEOL, posEOL + 2) === '\r\n') {
                      this.contentOffset++;
                    }
        
                    this.contentLength = node.length - this.contentOffset;
                    return;
                  }
        
                  this.header = headerChunks.join('');
                  this.contentOffset = this.header.length;
                  this.contentLength = node.length - content.length;
                  return;
                }
              }
        
              var wholeCommentText = node.nodeValue;
              var posEOL = wholeCommentText.search(/\r|\n/);
              if (posEOL < 0) {
                this.header = wholeCommentText;
                this.contentOffset = wholeCommentText.length;
                this.contentLength = wholeCommentText.length - this.contentOffset;
                return;
              }
        
              this.contentOffset = wholeCommentText.slice(posEOL, posEOL + 2) === '\r\n' ?
                posEOL + 2 : // ends with CRLF
                posEOL + 1; // ends with singular CR or LF
        
              this.header = wholeCommentText.slice(0, posEOL),
              this.contentLength = wholeCommentText.length - this.contentOffset
            }
        
          }
        
        }
      • DOMDrive.ts
        module persistence.dom {
        
          export class DOMDrive implements Drive {
        
            private _byPath: { [path: string]: DOMFile; } = {};
        
            public timestamp: number;
        
            constructor(
              private _totals: DOMTotals,
              files: DOMFile[],
              private _document: DOMDrive.DocumentSubset) {
        
              this.timestamp = this._totals ? this._totals.timestamp : 0;
        
              for (var i = 0; i < files.length; i++) {
                this._byPath[files[i].path] = files[i];
              }
            }
        
            files(): string[] {
        
              if (typeof Object.keys === 'string') {
                var result = Object.keys(this._byPath);
              }
              else {
                var result: string[] = [];
                for (var k in this._byPath) if (this._byPath.hasOwnProperty(k)) {
                  result.push(k);
                }
              }
        
              result.sort();
        
              return result;
            }
        
            read(file: string): string {
              var file = normalizePath(file);
              var f = this._byPath[file];
              if (!f)
                return null;
              else
                return f.read();
            }
        
            write(file: string, content: string) {
        
              var totalDelta = 0;
        
              var file = normalizePath(file);
              var f = this._byPath[file];
        
              if (content === null) {
                // removal
                if (f) {
                  totalDelta -= f.contentLength;
                  f.node.parentElement.removeChild(f.node);
                  delete this._byPath[file];
                }
              }
              else {
                // addition
                if (f) {
                  var lengthBefore = f.contentLength;
                  f.write(content);
                  totalDelta += f.contentLength - lengthBefore;
                }
                else {
                  var comment = document.createComment('');
                  var f = new DOMFile(comment, file, null, 0, 0);
                  f.write(content);
                  this._document.body.appendChild(f.node);
                  this._byPath[file] = f;
                  totalDelta += f.contentLength;
                }
              }
        
              this._totals.timestamp = this.timestamp;
              this._totals.updateNode();
            }
        
          }
        
          export module DOMDrive {
        
            export interface DocumentSubset {
              body: HTMLBodyElementSubset;
        
              createComment(data: string): Comment;
            }
        
            export interface HTMLBodyElementSubset {
              appendChild(node: Node);
              insertBefore(newChild: Node, refNode?: Node);
              firstChild: Node;
            }
          }
        }
      • DOMFile.ts
        module persistence.dom {
        
          export class DOMFile {
        
            private _encodedPath: string = null;
        
            constructor(
              public node: Comment,
              public path: string,
              private _encoding: (text: string) => any,
              private _contentOffset: number,
              public contentLength: number) {
            }
        
            static tryParse(cmheader: CommentHeader): DOMFile {
        
              //    /file/path/continue
              //    "/file/path/continue"
              //    /file/path/continue   [encoding]
        
              var parseFmt = /^\s*((\/|\"\/)(\s|\S)*[^\]])\s*(\[((\s|\S)*)\])?\s*$/;
              var parsed = parseFmt.exec(cmheader.header);
              if (!parsed) return null; // does not match the format
        
              var filePath = parsed[1];
              var encodingName = parsed[5];
        
              if (filePath.charAt(0) === '"') {
                if (filePath.charAt(filePath.length - 1) !== '"') return null; // unpaired leading quote
                try {
                  if (typeof JSON !== 'undefined' && typeof JSON.parse === 'function')
                    filePath = JSON.parse(filePath);
                  else
                    filePath = eval(filePath); // security doesn't seem to be compromised, input is coming from the same file
                }
                catch (parseError) {
                  return null; // quoted path but wrong format (JSON expected)
                }
              }
              else { // filePath NOT started with quote
                if (encodingName) {
                  // regex above won't strip trailing whitespace from filePath if encoding is specified
                  // (because whitespace matches 'non-bracket' class too)
                  filePath = filePath.slice(0, filePath.search(/\S(\s*)$/) + 1);
                }
              }
        
              var encoding = encodings[encodingName || 'LF'];
              // invalid encoding considered a bogus comment, skipped
              if (encoding)
                return new DOMFile(cmheader.node, filePath, encoding, cmheader.contentOffset, cmheader.contentLength);
        
              return null;
            }
        
        
            read() {
        
              // proper HTML5 has substringData to read only a chunk
              // (that saves on string memory allocations
              // comparing to fetching the whole text including the file name)
              var contentText = typeof this.node.substringData === 'function' ?
                this.node.substringData(this._contentOffset, 1000000000) :
                this.node.nodeValue.slice(this._contentOffset);
        
              // XML end-comment is escaped when stored in DOM,
              // unescape it back
              var restoredText = contentText.
              	replace(/\-\-\*(\**)\>/g, '--$1>').
                replace(/\<\*(\**)\!/g, '<$1!');
        
              // decode
              var decodedText = this._encoding(restoredText);
        
              // update just in case it's been off
              this.contentLength = decodedText.length;
        
              return decodedText;
            }
        
            write(content: any) {
        
              var encoded = bestEncode(content);
              var protectedText = encoded.content.
              	replace(/\-\-(\**)\>/g, '--*$1>').
              	replace(/\<(\**)\!/g, '<*$1!');
        
              if (!this._encodedPath) {
                // most cases path is path,
                // but if anything is weird, it's going to be quoted
                // (actually encoded with JSON format)
                var encp = bestEncode(this.path, true /*escapePath*/);
                this._encodedPath = encp.content;
              }
        
              var leadText = ' ' + this._encodedPath + (encoded.encoding === 'LF' ? '' : ' [' + encoded.encoding + ']') + '\n';
              this.node.nodeValue = leadText + encoded.content;
        
              this._encoding = encodings[encoded.encoding || 'LF'];
              this._contentOffset = leadText.length;
        
              this.contentLength = content.length;
            }
        
          }
        
        }
      • DOMTotals.ts
        module persistence.dom {
        
          var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
          var monthsUpperCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').toUpperCase().split('|');
        
          export class DOMTotals {
        
            constructor(
            	public timestamp: number,
            	public totalSize: number,
              private _node: Comment) {
            }
        
            static tryParse(cmheader: CommentHeader): DOMTotals {
        
              // TODO: preserve unknowns when parsing
        
              var parts = cmheader.header.split(',');
              var anythingParsed = false;
              var totalSize = 0;
              var timestamp = 0;
        
              for (var i = 0; i < parts.length; i++) {
        
                // total 234Kb
                // total 23
                // total 6Mb
        
                var totalFmt = /^\s*total\s+(\d*)\s*([KkMm])?b?\s*$/;
                var totalMatch = totalFmt.exec(parts[i]);
                if (totalMatch) {
                  try {
                    var total = parseInt(totalMatch[1]);
                    if ((totalMatch[2] + '').toUpperCase() === 'K')
                      total *= 1024;
                    else if ((totalMatch[2] + '').toUpperCase() === 'M')
                      total *= 1024 * 1024;
                    totalSize = total;
                    anythingParsed = true;
                  }
                  catch (totalParseError) { }
                  continue;
                }
        
                var savedFmt = /^\s*saved\s+(\d+)\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)\s+(\d+)\:(\d+)(\:(\d+(\.(\d+))?))\s*(GMT\s*[\-\+]?\d+\:?\d*)?\s*$/i;
                var savedMatch = savedFmt.exec(parts[i]);
                if (savedMatch) {
                  // 25 Apr 2015 22:52:01.231
                  try {
                    var savedDay = parseInt(savedMatch[1]);
                    var savedMonth = monthsUpperCase.indexOf(savedMatch[2].toUpperCase());
                    var savedYear = parseInt(savedMatch[3]);
                    if (savedYear < 100)
                      savedYear += 2000; // no 19xx notation anymore :-(
                    var savedHour = parseInt(savedMatch[4]);
                    var savedMinute = parseInt(savedMatch[5]);
                    var savedSecond = savedMatch[7] ? parseFloat(savedMatch[7]) : 0;
        
                    timestamp = new Date(savedYear, savedMonth, savedDay, savedHour, savedMinute, savedSecond | 0).valueOf();
                    timestamp += (savedSecond - (savedSecond | 0))*1000; // milliseconds
        
                    var savedGMTStr = savedMatch[10];
                    if (savedGMTStr) {
                      var gmtColonPos = savedGMTStr.indexOf(':');
                      if (gmtColonPos>0) {
                        var gmtH = parseInt(savedGMTStr.slice(0, gmtColonPos));
                        timestamp += gmtH * 60 /*min*/ * 60 /*sec*/ * 1000 /*msec*/;
                        var gmtM = parseInt(savedGMTStr.slice(gmtColonPos + 1));
                        timestamp += gmtM * 60 /*sec*/ * 1000 /*msec*/;
                      }
                    }
        
                    anythingParsed = true;
                  }
                  catch (savedParseError) { }
                }
        
              }
        
              if (anythingParsed)
                return new DOMTotals(timestamp, totalSize, cmheader.node);
              else
                return null;
            }
        
          	updateNode() {
              // TODO: update the node content
        
              // total 4Kb, saved 25 Apr 2015 22:52:01.231
              var newTotals =
                'total ' + (
                  this.totalSize < 1024 * 9 ? this.totalSize + '' :
                    this.totalSize < 1024 * 1024 * 9 ? ((this.totalSize / 1024) | 0) + 'Kb' :
                      ((this.totalSize / (1024 * 1024)) | 0) + 'Mb') + ', ' +
                'saved ';
        
              var saveDate = new Date(this.timestamp);
              newTotals +=
                saveDate.getDate() + ' ' +
                monthsPrettyCase[saveDate.getMonth()] + ' ' +
              	saveDate.getFullYear() + ' ' +
              	num2(saveDate.getHours()) + ':' +
                num2(saveDate.getMinutes()) + ':' +
                num2(saveDate.getSeconds()) + '.' +
                this.timestamp.toString().slice(-3);
        
              var saveDateLocalStr = saveDate.toString();
              var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
              if (gmtMatch)
                newTotals += ' ' + gmtMatch[1];
        
              this._node.nodeValue = newTotals;
        
              function num2(n: number) {
                return n <= 9 ? '0' + n : '' + n;
              }
        
            }
        
          }
        
        
        }
      • parseDOMStorage.ts
        module persistence.dom {
        
          export function parseDOMStorage(document: parseDOMStorage.DocumentSubset): parseDOMStorage.ContinueParsing {
        
            var loadedFiles: DOMFile[] = [];
            var loadedTotals: DOMTotals;
            var lastNode: Node;
            var loadedSize = 0;
        
            return continueParsing();
        
            function continueParsing(): parseDOMStorage.ContinueParsing {
        
              continueParsingDOM(false);
        
              return {
                continueParsing,
                finishParsing,
                loadedSize,
                totalSize: loadedTotals ? loadedTotals.totalSize : 0,
                loadedFileCount: loadedFiles.length
              };
        
            }
        
            function finishParsing(): DOMDrive {
        
              continueParsingDOM(true);
        
              if (loadedTotals) {
                loadedTotals.totalSize = loadedSize;
                loadedTotals.updateNode();
              }
        
              var drive = new DOMDrive(loadedTotals, loadedFiles, document);
        
              return drive;
            }
        
            function continueParsingDOM(finish: boolean) {
              if (document.body) {
                if (!lastNode)
                  lastNode = document.body.firstChild;
        
                while (true) {
                  if (!lastNode) return;
                  else if (!finish && lastNode == document.body.lastChild) return;
        
        
                  if (lastNode.nodeType === 8) {
                    processNode(<Comment>lastNode);
                  }
        
                  lastNode = lastNode.nextSibling;
                }
              }
            }
        
            function processNode(node: Comment): boolean {
              var cmheader = new CommentHeader(node);
        
              var file = DOMFile.tryParse(cmheader);
              if (file) {
                loadedFiles.push(file);
                loadedSize += file.contentLength;
                return true;
              }
        
              var totals = DOMTotals.tryParse(cmheader);
              if (totals)
                loadedTotals = totals;
            }
          }
        
          export module parseDOMStorage {
        
            export interface ContinueParsing {
        
              continueParsing(): ContinueParsing;
        
              finishParsing(): DOMDrive;
        
              loadedFileCount: number;
              loadedSize: number;
              totalSize: number;
        
            }
        
            export interface DocumentSubset extends DOMDrive.DocumentSubset {
              body: HTMLBodyElementSubset;
            }
        
            export interface HTMLBodyElementSubset extends DOMDrive.HTMLBodyElementSubset {
              lastChild: Node;
            }
        
          }
        
        }
    • encodings
      • CR.ts
        module persistence.encodings {
        
          export function CR(text: string): string {
            return text.
              replace(/\r\n|\n/g, '\r');
          }
        
        }
      • CRLF.ts
        module persistence.encodings {
        
          export function CRLF(text: string): string {
            return text.
              replace(/\r|\n/g, '\r\n');
          }
        
        }
      • LF.ts
        module persistence.encodings {
        
          export function LF(text: string): string {
            return text.
              replace(/\r\n|\r/g, '\n');
          }
        
        }
      • base64.ts
        module persistence.encodings {
        
          export function base64(text: string): any {
            // TODO: convert from base64 to text
            // TODO: invent a prefix to signify binary data
            throw new Error('Base64 encoding is not implemented yet.');
          }
        
        }
      • eval.ts
        module persistence.encodings {
        
          export function eval(text: string): any {
            return (0, window['eval'])(text);
          }
        
        }
      • json.ts
        module persistence.encodings {
        
          export function json(text: string): any {
            var result = typeof JSON ==='undefined' ? eval(text) : JSON.parse(text);
        
            if (result && typeof result !== 'string' && result.type) {
              var ctor: any = window[result.type];
              result = new ctor(result);
            }
        
            return result;
          }
        
        }
    • Drive.ts
      module persistence {
      
        export interface Drive {
      
          timestamp: number;
      
          files(): string[];
      
          read(file: string): string;
      
          write(file: string, content: string);
      
        }
      
        export module Drive {
      
          export interface Shadow {
      
            timestamp: number;
      
            write(file: string, content: string): void;
      
          }
      
          export interface Optional {
      
            name: string;
      
            detect(uniqueKey: string, callback: (detached: Detached) => void): void;
      
          }
      
          export interface Detached {
      
            timestamp: number;
            totalSize?: number;
      
            applyTo(mainDrive: Drive, callback: Detached.CallbackWithShadow): void;
      
            purge(callback: Detached.CallbackWithShadow): void;
      
          }
      
          export module Detached {
            export interface CallbackWithShadow {
      
              (loaded: Shadow): void;
              progress?: (current: number, total: number) => void;
            }
          }
      
        }
      }
    • bestEncode.ts
      module persistence {
      
        export function bestEncode(content: any, escapePath?: boolean): { content: string; encoding: string; } {
      
          if (content.length>1024*16) {
            // TODO: consider packing tightly and using eval encoding to unpack
          }
      
          if (typeof content!=='string')
            return { content: encodeArrayOrSimilarAsJSON(content), encoding: 'json' };
      
          var needsEscaping: boolean;
          if (escapePath) {
            // zero-char, newlines, leading/trailing spaces, quote and apostrophe
            needsEscaping = /\u0000|\r|\n|^\s|\s$|\"|\'/.test(content);
          }
          else {
            needsEscaping = /\u0000|\r/.test(content);
          }
      
          if (needsEscaping) {
            // ZERO character is officially unsafe in HTML,
            // CR is contentious in IE (which converts any CR or LF into CRLF)
      
            return { content: encodeUnusualStringAsJSON(content), encoding: 'json' };
          }
          else {
            return { content: content, encoding: 'LF' };
          }
        }
      
        function encodeUnusualStringAsJSON(content: string): string {
          if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
            var simpleJSON = JSON.stringify(content);
            var sanitizedJSON = simpleJSON.
              replace(/\u0000/g, '\\u0000').
              replace(/\r/g, '\\r').
              replace(/\n/g, '\\n');
            return sanitizedJSON;
          }
          else {
            var result = content.replace(
              /\"\u0000|\u0001|\u0002|\u0003|\u0004|\u0005|\u0006|\u0007|\u0008|\u0009|\u00010|\u00011|\u00012|\u00013|\u00014|\u00015|\u0016|\u0017|\u0018|\u0019|\u0020|\u0021|\u0022|\u0023|\u0024|\u0025|\u0026|\u0027|\u0028|\u0029|\u0030|\u0031/g,
              (chr) =>
                chr === '\t' ? '\\t' :
                  chr === '\r' ? '\\r' :
                    chr === '\n' ? '\\n' :
                      chr === '\"' ? '\\"' :
                        chr < '\u0010' ? '\\u000' + chr.charCodeAt(0).toString(16) :
                          '\\u00' + chr.charCodeAt(0).toString(16));
            return result;
          }
        }
      
        function encodeArrayOrSimilarAsJSON(content: any): string {
            var type = content instanceof Array ? null : content.constructor.name || content.type;
            if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
              if (type) {
                var wrapped = { type, content };
                var wrappedJSON = JSON.stringify(wrapped);
                return wrappedJSON;
              }
              else {
                var contentJSON = JSON.stringify(content);
                return contentJSON;
              }
            }
            else {
              var jsonArr: string[] = [];
              if (type) {
                jsonArr.push('{"type": "');
                jsonArr.push(content.type || content.prototype.constructor.name);
                jsonArr.push('", "content": [');
              }
              else {
                jsonArr.push('[');
              }
      
              for (var i = 0; i < content.length; i++) {
                if (i) jsonArr.push(',');
                jsonArr.push(content[i]);
              }
      
              if (type)
                jsonArr.push(']}');
              else
                jsonArr.push(']');
      
              return jsonArr.join('');
            }
        }
      }
    • bootMount.ts
      module persistence {
      
        // TODO: pass in progress callback
        export function bootMount(uniqueKey: string, document: Document): bootMount.ContinueLoading {
      
          var continueParse: persistence.dom.parseDOMStorage.ContinueParsing;
      
          var ondomdriveloaded;
          var domDriveLoaded: Drive;
          var storedFinishCallback;
      
          mountDrive(
            callback => {
              if (domDriveLoaded)
                callback(domDriveLoaded);
              else
                ondomdriveloaded = callback;
            },
            uniqueKey,
            [attached.indexedDB, attached.webSQL, attached.localStorage],
            mountedDrive => {
      
              storedFinishCallback(mountedDrive);
      
            });
      
          return continueLoading();
      
          function continueLoading(): bootMount.ContinueLoading {
      
            continueDOMLoading();
      
            // TODO: record progress
      
            return {
              continueLoading,
              finishLoading,
      
              loadedFileCount: continueParse.loadedFileCount,
              loadedSize: continueParse.loadedSize,
              totalSize: continueParse.totalSize
      
            };
          }
      
          function finishLoading(finishCallback: (monutedDrive: Drive) => void) {
      
            storedFinishCallback = finishCallback;
      
            continueDOMLoading();
      
            domDriveLoaded = continueParse.finishParsing();
      
            if (ondomdriveloaded) {
              ondomdriveloaded(domDriveLoaded);
            }
      
          }
      
      
          function continueDOMLoading() {
            continueParse = continueParse ? continueParse.continueParsing() : dom.parseDOMStorage(document);
          }
      
        }
      
        module bootMount {
      
          export interface ContinueLoading {
      
            continueLoading(): ContinueLoading;
      
            finishLoading(finishCallback: (mountedDrive: Drive) => void);
      
            loadedFileCount: number;
            loadedSize: number;
            totalSize: number;
      
          }
      
        }
      }
    • mountDrive.ts
      module persistence {
      
        export function mountDrive(
          loadDOMDrive: (callback: (dom: Drive) => void)=> void,
          uniqueKey: string,
          optionalModules: Drive.Optional[],
          callback: mountDrive.Callback): void {
      
          var driveIndex = 0;
      
          loadNextOptional();
      
          function loadNextOptional() {
      
            while (driveIndex < optionalModules.length &&
              (!optionalModules[driveIndex] || typeof optionalModules[driveIndex].detect !== 'function')) {
              driveIndex++;
            }
      
            if (driveIndex >= optionalModules.length) {
              loadDOMDrive(dom => callback(new MountedDrive(dom, null)));
              return;
            }
      
            var op = optionalModules[driveIndex];
            op.detect(
              uniqueKey,
              detached => {
                if (!detached) {
                  driveIndex++;
                  loadNextOptional();
                  return;
                }
      
                loadDOMDrive(dom => {
                  if (detached.timestamp > dom.timestamp) {
                    var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
                      dom.timestamp = detached.timestamp;
                      callback(new MountedDrive(dom, loadedDrive));
                    };
                    if (callback.progress)
                      callbackWithShadow.progress = callback.progress;
                    loadDOMDrive(dom => detached.applyTo(dom, callbackWithShadow));
                  }
                  else {
                    var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
                      callback(new MountedDrive(dom, loadedDrive));
                    };
                    if (callback.progress)
                      callbackWithShadow.progress = callback.progress;
                    detached.purge(callbackWithShadow);
                  }
                });
      
              });
          }
      
        }
      
        export module mountDrive {
      
          export interface Callback {
      
            (drive: Drive): void;
      
            progress?: (current: number, total: number) => void;
      
          }
      
        }
      
        class MountedDrive implements Drive {
      
          updateTime = true;
          timestamp: number = 0;
      
          constructor (private _dom: Drive, private _shadow: Drive.Shadow) {
            this.timestamp = this._dom.timestamp;
          }
      
          files(): string[] {
            return this._dom.files();
          }
      
          read(file: string): string {
            return this._dom.read(file);
          }
      
          write(file: string, content: string) {
            if (this.updateTime) {
              this.timestamp = +new Date();
            }
      
            this._dom.timestamp = this.timestamp;
            this._dom.write(file, content);
            if (this._shadow) {
              this._shadow.timestamp = this.timestamp;
              this._shadow.write(file, content);
            }
          }
        }
      
      }
    • normalizePath.ts
      module persistence {
      
        export function normalizePath(path: string) : string {
      
          if (!path) return '/'; // empty paths converted to root
      
          if (path.charAt(0) !== '/') // ensuring leading slash
            path = '/' + path;
      
          path = path.replace(/\/\/*/g, '/'); // replacing duplicate slashes with single
      
          return path;
        }
      
      }
    persistence
  • shell
    • build
      • processTemplate.ts
        module build {
        
          export function processTemplate(
            template: string, scopes: any[],
            log: (logText: string) => void,
            callback: (error: Error, result?: string) => void): void {
            // <%= expr %>
            // <% statement %>
            // <%-- comment --%>
        
            log('Generating build script...');
            setTimeout(() => {
              var fnText = generateBuildScript(template, scopes);
        
              log('Preprocessing build script...');
              setTimeout(() => {
                try {
                  var fn = Function('scopes', fnText);
        
                  log('Executing build script...');
        
                  var output: any[] = fn(scopes);
                  var outputIndex = 0;
                }
                catch (error) {
                  log('Build failure ' + error);
                  callback(error);
                  return;
                }
        
                processNextOutputChunk();
        
                function processNextOutputChunk() {
                  var startTime = +new Date();
        
                  // all heavy chunks will bail out and queue the next one on setTimeout,
                  // simple literal insertions keep going for a slice of time
                  while (true) {
                    if (outputIndex >= output.length) {
                      var result = output.join('');
                      callback(null, result);
                      return;
                    }
        
                    var outputChunk = output[outputIndex];
                    if (typeof outputChunk === 'function') {
                      log('Processing ' + outputChunk + '...');
                      setTimeout(() => {
                        try {
                          var chunkResult = outputChunk();
                          var chunkResultText = String(chunkResult);
                          output[outputIndex] = chunkResultText;
                        }
                        catch (error) {
                          callback(error);
                          return;
                        }
        
                        log('...OK [' + chunkResultText.length + ']');
                        outputIndex++;
                        processNextOutputChunk();
                        //setTimeout(processNextOutputChunk, 1);
                      }, 1);
                      break;
                    }
                    else {
                      var literal = String(outputChunk);
                      output[outputIndex] = literal;
                      var literalLines = (literal.length > 100 ? literal.slice(0, 50) + '\n...\n' + literal.slice(literal.length - 5) : literal).split('\n');
                      while (literalLines.length && !literalLines[0]) literalLines.shift();
                      while (literalLines.length && !literalLines[literalLines.length - 1]) literalLines.pop();
                      log(literalLines.length <= 2 ? literalLines.join('\n') : literalLines[0] + '\n...\n' + literalLines[literalLines.length - 1]);
                      outputIndex++;
        
                      if (+new Date() - startTime > 300) {
                        setTimeout(processNextOutputChunk, 1);
                        break;
                      }
                      // keep going if haven't been processing for long yet
        
                    }
                  }
                }
        
              }, 1);
        
            }, 1);
        
          }
        
          function generateBuildScript(template: string, scopes: any[]): string {
            var generated: string[] = [];
            for (var i = 0; i < scopes.length; i++) {
              generated.push('with(scopes[' + i + ']) {');
            }
        
            generated.push('var output =[];');
        
            var index = 0;
            while (index < template.length) {
        
              var nextOpenASP = template.indexOf('<%', index);
              if (nextOpenASP < 0) {
                generateWrite(generated, template.slice(index));
                break;
              }
        
              var ch = template.charAt(nextOpenASP + 2);
              if (ch === '=') {
                var closeASP = template.indexOf('%>', nextOpenASP);
                if (closeASP < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                generateRedirect(generated, template.slice(nextOpenASP + 3, closeASP));
                index = closeASP + 2;
              }
              else if (ch === '-') {
                var closeCommentMatch = template.charAt(nextOpenASP + 3) === '-' ? '--%>' : '-%>';
                var closeComment = template.indexOf(closeCommentMatch, nextOpenASP);
                if (closeComment < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                index = closeComment + closeCommentMatch.length;
              }
              else {
                var closeASP = template.indexOf('%>', nextOpenASP);
                if (closeASP < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                generateStatement(generated, template.slice(nextOpenASP + 2, closeASP));
                index = closeASP + 2;
              }
        
            }
        
            for (var i = 0; i < scopes.length; i++) {
              generated.push('}');
            }
        
            generated.push('return output;');
        
            var fnText = generated.join('\n');
            return fnText;
        
          }
        
        
          function generateWrite(generated: string[], chunk: string) {
            if (chunk)
              generated.push('output.push(\'' + stringLiteral(chunk) + '\');');
          }
        
          function generateRedirect(generated: string[], redirect: string) {
            generated.push('output.push(' + redirect + ');');
          }
        
          function generateStatement(generated: string[], statement: string) {
            generated.push(statement);
          }
        
          function stringLiteral(text: string) {
            return text.
              replace(/\\/g, '\\\\').
              replace(/\n/g, '\\n').
              replace(/\r/g, '\\r').
              replace(/\t/g, '\\t').
              replace(/\'/g, '\\\'').
              replace(/\"/g, '\\"');
          }
        
        }
    • editor
      • Editor.ts
        module editor {
        
          export class Editor {
        
            private _textarea: HTMLTextAreaElement;
            private _title: HTMLDivElement;
        
            constructor(private _host: HTMLElement, private _file: string, text?: string) {
              this._textarea = <any>elem('textarea', {
                background: 'navy',
                color: 'silver',
                top: '0', left: '0',
                width: '100%', height: '100%', position: 'absolute',
                borderTop: 'solid 1em black'
              }, this._host);
              this._title = <any>elem('div', {
                position: 'absolute',
                top: '0', left: '0',
                width: '100%', height: '1em',
                background: 'silver', color: 'navy',
                text: this._file
              }, this._host);
              if (typeof text === 'string')
                this._textarea.value = text;
            }
        
          focus() {
            this._textarea.focus();
          }
        
            setText(text: string) {
              this._textarea.value = text;
            }
        
            getText(): string {
              return this._textarea.value;
            }
        
            close() {
              this._host.removeChild(this._textarea);
              this._host.removeChild(this._title);
            }
          }
        
        }
    • panels
      • Panel.ts
        module panels {
        
          var panelClass = 'panels-panel-page';
        
          export class Panel {
        
            private _cursorPath: string;
            private _cursorEntryIndex = -1;
            private _entries: Panel.PageEntry[] = null;
            private _redrawRequested = 0;
        
            private _metrics: Panel.Metrics = null;
        
            private _scrollContent: HTMLElementWithFlags;
        
            private _pages: Panel.PageData[] = [];
        
        		private _entriesInColumn = 0;
            private _pageHeight = 0;
            private _pageInterval = 0;
            private _columnsOnPage = 0;
            private _columnWidth = 0;
        
            private _scrollTop = 0;
            private _scrollTopHeight = 0;
            private _isActive = false;
            private _nextRedrawScrollToCurrent = false;
        
            constructor(
              private _host: HTMLElement,
              private _path: string,
              private _directoryService: (path: string) => Panel.DirectoryEntry[]) {
        
              this._scrollContent = <HTMLElementWithFlags>elem('div', this._host);
              this._scrollContent.isScrollContent = true;
        
              on(this._host, 'scroll', () => this._onscroll());
        
              this._queueRedraw();
            }
        
            set(paths: {currentPath?: string; cursorPath?: string}) {
              if (paths.currentPath)
                this._path = paths.currentPath;
              if (paths.cursorPath) {
                this._cursorPath = paths.cursorPath;
                this._nextRedrawScrollToCurrent = true;
              }
              this._queueRedraw();
            }
        
          	onclick(e: MouseEvent) {
              if (!this._entries) return;
        
              var clickElem = <HTMLElementWithFlags>(e.srcElement || e.target || e.currentTarget);
              var entryDIV: HTMLElementWithFlags;
              var columnDIV: HTMLElementWithFlags;
              var pageDIV: HTMLElementWithFlags;
              var leadPaddingDIV: HTMLElementWithFlags;
        
              while (clickElem) {
        
                if (clickElem.isScrollContent) {
                  if (clickElem !== this._scrollContent) return false;
                  break;
                }
        
                if (clickElem.isPageDIV)
                  pageDIV = clickElem;
        
                if (clickElem.isColumnDIV)
                  columnDIV = clickElem;
        
                if (clickElem.isEntryDIV)
                  entryDIV = clickElem;
        
                clickElem = <any>clickElem.parentElement;
              }
        
              if (entryDIV) {
                for (var i = 0; i < this._entries.length; i++) {
                  if (this._entries[i].entryDIV === entryDIV) {
                    if (this._cursorPath ===this._entries[i].path && (this._entries[i].flags & Panel.EntryFlags.Directory)) {
                      this._cursorPath = this._path;
                      this._path = this._entries[i].path; // double click (or second click) opens directory
                    }
                    else {
                      this._cursorPath = this._entries[i].path;
                    }
                    this._nextRedrawScrollToCurrent = true;
                    this._queueRedraw();
                    break;
                  }
                }
                this._redrawNow();
              }
        
              return true;
            }
        
            currentPath() {
              return this._path;
            }
        
            cursorPath() {
              return this._cursorPath;
            }
        
            arrange(metrics: Panel.Metrics) {
              this._metrics = metrics;
              this._redrawNow();
            }
        
          	isActive() {
              return this._isActive;
            }
        
            activate() {
              this._isActive = true;
              this._scrollContent.className = 'panels-panel-active';
            }
        
            deactivate() {
              this._isActive = false;
              this._scrollContent.className = 'panels-panel-inactive';
            }
        
            cursorGo(direction: number) {
              if (!this._entries || !this._entries.length) return;
        
              var moveStep = 0;
        
              switch (direction) {
        
                case -1: // up
                  moveStep = -1;
                  break;
        
                case +1: // down
                  moveStep = +1;
                  break;
        
                case -10: // left
                  var entryIndex = this._calcEntryIndex(this._cursorEntryIndex);
                  if (this._columnsOnPage === 1) {
                    moveStep = -entryIndex || -1;
                  }
                  else {
                    var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
                    if (columnIndex > 0) {
                      moveStep = -this._entriesInColumn;
                    }
                    else {
                      moveStep = this._entriesInColumn * (this._columnsOnPage - 1) - 1;
        
                      // overflow cases
                      if (this._cursorEntryIndex === 0) {
                        moveStep = this._entriesInColumn * (this._columnsOnPage - 1);
                      }
                      else if (this._cursorEntryIndex + moveStep >= this._entries.length) { // there is no rightmost column
        
                        var endEntryIndex = this._calcEntryIndex(this._entries.length - 1);
                        var endColumnIndex = this._calcColumnIndex(this._entries.length - 1);
        
                        // if the last entry is higher vertically, stop at the previous column
                        var targetColumnIndex = endEntryIndex >= entryIndex ? endColumnIndex : endColumnIndex - 1;
        
                        if (targetColumnIndex <= columnIndex) {
                          moveStep = -entryIndex; // if nowhere to go right, go all the way up
                        }
                        else {
                          // there are columns on the right, so go there (and one up after)
                          moveStep = (targetColumnIndex - columnIndex) * this._entriesInColumn - 1;
                        }
                      }
                    }
                  }
                  break;
        
                case +10: // right
                  var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
                  if (columnIndex < this._columnsOnPage - 1) {
                    moveStep = +this._entriesInColumn;
                  }
                  else {
                    moveStep = -this._entriesInColumn * 2 + 1;
                  }
                  break;
        
                case -100: // page up
                  moveStep = -this._entriesInColumn * this._columnsOnPage;
                  break;
        
                case +100: // page down
                  moveStep = +this._entriesInColumn * this._columnsOnPage;
                  break;
              }
        
              if (moveStep) {
                var newCursorEntryIndex = Math.max(0, Math.min(this._entries.length-1, this._cursorEntryIndex + moveStep));
                var e = this._entries[newCursorEntryIndex];
                if (e) {
                  this._cursorPath = this._entries[newCursorEntryIndex].path;
                  this._nextRedrawScrollToCurrent = true;
                  this._queueRedraw();
                }
              }
            }
        
            navigateCursor() {
              if (this._cursorEntryIndex >= 0) {
                var entry = this._entries[this._cursorEntryIndex];
                if (entry) {
                  if (entry.flags & Panel.EntryFlags.Directory) {
                    this._cursorPath = this._path;
                    this._path = entry.path;
                    this._nextRedrawScrollToCurrent = true;
                    this._queueRedraw();
                    return true;
                  }
                }
              }
            }
        
            private _queueRedraw() {
              if (this._redrawRequested) return;
              this._redrawRequested = setTimeout(() => this._redrawNow(), 100);
            }
        
            private _redrawNow() {
        
              var prevOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
        
              var entries = this._directoryService(this._path);
              this._entries = [];
        
              entries.sort((e1, e2) => {
                var flagCompare = (e1.flags & Panel.EntryFlags.Directory) ?
                  ((e2.flags & Panel.EntryFlags.Directory) ? 0 : -1) :
                  ((e2.flags & Panel.EntryFlags.Directory) ? +1 : 0);
                if (flagCompare) return flagCompare;
        
                var nameCompare = e1.name > e2.name ? 1 : e1.name < e2.name ? -1 : 0;
                return nameCompare;
              });
        
              if (this._path !== '/') {
                var parentPath = this._path.slice(0, this._path.lastIndexOf('/')) || '/';
                entries.unshift({
                  name: '..',
                  path: parentPath,
                  flags: Panel.EntryFlags.Directory
                });
              }
        
              if (!entries || !entries.length) {
                this._scrollContent.innerHTML = '';
                this._pages = [];
                return;
              }
        
              this._cursorEntryIndex = -1;
              for (var i = 0; i < entries.length; i++) {
                if (entries[i].path === this._cursorPath) {
                  this._cursorEntryIndex = i;
                  break;
                }
              }
        
              if (this._cursorEntryIndex < 0) {
                this._cursorEntryIndex = 0;
                this._cursorPath = entries.length > 0 ? entries[0].path : null;
              }
        
              this._entriesInColumn = Math.max(3, ((this._metrics.hostHeight / this._metrics.windowMetrics.emHeight) | 0) - 2);
              this._pageHeight = this._entriesInColumn * this._metrics.windowMetrics.emHeight;
              this._pageInterval = this._metrics.hostHeight - this._pageHeight - this._metrics.windowMetrics.emHeight;
        
              var desiredColumnWidth = 17 * this._metrics.windowMetrics.emWidth;
              this._columnsOnPage = Math.max(1, Math.round(this._metrics.hostWidth / desiredColumnWidth) | 0);
              this._columnWidth = ((this._metrics.hostWidth / this._columnsOnPage) | 0) - 1;
        
              if (!this._pages)
                this._pages = [];
        
              for (var i = 0; i < entries.length; i++) {
                var pageIndex = this._calcPageIndex(i);
                var page = this._pages[pageIndex];
        
                if (page) {
                  if (page.height !== this._pageHeight) {
                    page.height = this._pageHeight;
                    page.pageDIV.style.height = this._pageHeight + 'px';
                  }
                  if (page.leadInterval !== this._pageInterval) {
                    page.leadInterval = this._pageInterval;
                    if (page.leadPaddingDIV)
                      page.leadPaddingDIV.style.height = this._pageInterval + 'px';
                  }
                }
                else {
                  if (pageIndex) {
                    var leadPaddingDIV = <HTMLElementWithFlags>elem('div', {
                      className: 'panels-page-separator',
                      height: this._pageInterval + 'px'
                    }, this._scrollContent);
                    leadPaddingDIV.isLeadPaddingDIV = true;
                  }
        
                  page = {
                    leadPaddingDIV,
                    leadInterval: this._pageInterval,
                    height: this._pageHeight,
                    pageDIV: <HTMLElementWithFlags>elem('div', {
                      className: panelClass,
                      height: this._pageHeight + 'px'
                    }, this._scrollContent),
                    columns: []
                  };
        
                  page.pageDIV.isPageDIV = true;
                  this._pages.push(page);
                }
        
                var columnIndex = this._calcColumnIndex(i);
                var column = page.columns[columnIndex];
                if (column) {
                  if (columnIndex === this._columnsOnPage - 1 && page.columns.length > this._columnsOnPage) {
                    this._removeExcessColumns(page, this._columnsOnPage);
                  }
                  if (column.height !== this._pageHeight) {
                    column.height = this._pageHeight;
                    column.columnDIV.style.height = this._pageHeight + 'px';
                  }
                  if (column.width !== this._columnWidth) {
                    column.width = this._columnWidth;
                    column.columnDIV.style.width = this._columnWidth + 'px';
                  }
                }
                else {
                  column = {
                    height: this._pageHeight,
                    width: this._columnWidth,
                    columnDIV: <HTMLElementWithFlags>elem('div', {
                      className: 'panels-panel-column',
                      height: this._pageHeight + 'px',
                      width: this._columnWidth + 'px'
                    }, page.pageDIV),
                    entries: []
                  };
                  column.columnDIV.isColumnDIV = true;
                  page.columns.push(column);
                }
        
                var dentry = entries[i];
        
                var entryIndex = this._calcEntryIndex(i);
                var entry = column.entries[entryIndex];
                if (!entry) {
        
                  var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
        
                  var entryClassName =
                    'panels-entry' +
                    dirfileClassName +
                    (this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
        
                  entry = {
                    name: dentry.name,
                    path: dentry.path,
                    flags: dentry.flags,
                    selectionFlags: this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0,
                    entryDIV: <HTMLElementWithFlags>elem('div', {
                      className: entryClassName,
                      text: dentry.name,
                      height: this._metrics.windowMetrics.emHeight + 'px'
                    }, column.columnDIV)
                  };
        
                  entry.entryDIV.isEntryDIV = true;
        
                  column.entries.push(entry);
                }
                else {
                  var expectedSelectionFlags = this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0;
        
                  if (entry.name !== dentry.name) {
                    entry.name = dentry.name;
                    setText(entry.entryDIV, dentry.name);
                  }
                  if (entry.path !== dentry.path) {
                    entry.path = dentry.path;
                  }
                  if (entry.flags !== dentry.flags || entry.selectionFlags !== expectedSelectionFlags) {
                    var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
        
                    var entryClassName =
                      'panels-entry' +
                      dirfileClassName +
                      (this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
        
                    entry.entryDIV.className = entryClassName;
        
                    entry.flags = dentry.flags;
                    entry.selectionFlags = expectedSelectionFlags;
                  }
        
        
                  if (entryIndex === this._entriesInColumn - 1 && column.entries.length > this._entriesInColumn) {
                    this._removeExcessEntries(column, this._entriesInColumn);
                  }
        
                }
        
                this._entries.push(entry);
        
              }
        
              this._removeExcessPages(pageIndex + 1);
        
              var p = this._pages[pageIndex];
              this._removeExcessColumns(p, columnIndex + 1);
        
              var c = p.columns[columnIndex];
              this._removeExcessEntries(c, entryIndex + 1);
        
        
        
              var newOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
              if (this._nextRedrawScrollToCurrent) {
                this._nextRedrawScrollToCurrent = false;
                var maxScroll = newOffset - this._metrics.windowMetrics.emHeight*2;
                var minScroll = newOffset - this._metrics.hostHeight + this._metrics.windowMetrics.emHeight*3;
        
                var newScrollTop =
                    this._scrollTop < minScroll ? minScroll :
                		this._scrollTop > maxScroll ? maxScroll :
                		-1;
        
                if (newScrollTop >=0) {
                  //console.log('redraw: scroll to current [' + newScrollTop + ']');
                  this._host.scrollTop = newScrollTop
                }
              }
              else {
                var prevDistanceFromCenter = prevOffset - (this._scrollTop + this._scrollTopHeight / 2);
        
                var newScrollTop = newOffset - prevDistanceFromCenter - this._metrics.hostHeight / 2;
                //console.log({
                //  prevDistanceFromCenter, prevOffset, this_scrollTop: this._scrollTop, this_scrollTopHeight: this._scrollTopHeight,
                //  newOffset, this_metrics_hostHeight: this._metrics.hostHeight, newScrollTop
                //});
                //console.log('redraw: scroll to approximate prev. [' + newScrollTop + ']');
                this._host.scrollTop = newScrollTop;
              }
        
        
              this._redrawRequested = 0;
        
              // end of _redrawNow()
            }
        
        
        
          	private _removeExcessPages(expectedCount: number) {
              for (var i = this._pages.length - 1; i >= expectedCount; i--) {
                var p = this._pages[i];
                p.pageDIV.parentElement.removeChild(p.pageDIV);
                if (p.leadPaddingDIV)
                  p.leadPaddingDIV.parentElement.removeChild(p.leadPaddingDIV);
              }
        
              if (this._pages.length > expectedCount)
                this._pages = this._pages.slice(0, expectedCount);
            }
        
        
            private _removeExcessColumns(p: { columns: Panel.ColumnData[]; }, expectedCount: number) {
              for (var i = p.columns.length - 1; i >= expectedCount; i--) {
                var c = p.columns[i];
                c.columnDIV.parentElement.removeChild(c.columnDIV);
              }
        
              if (p.columns.length > expectedCount)
                p.columns = p.columns.slice(0, expectedCount);
            }
        
        
            private _removeExcessEntries(c: { entries: Panel.PageEntry[]; }, expectedCount: number) {
              for (var i = c.entries.length - 1; i >= expectedCount; i--) {
                var e = c.entries[i];
                e.entryDIV.parentElement.removeChild(e.entryDIV);
              }
        
              if (c.entries.length > expectedCount)
                c.entries = c.entries.slice(0, expectedCount);
            }
        
        
          	private _onscroll() {
              if (this._redrawRequested) return;
              this._scrollTop = this._host.scrollTop;
              this._scrollTopHeight = this._metrics.hostHeight;
              //console.log('onscroll ' + this._scrollTop);
            }
        
        
            private _calcPageIndex(indexOfEntry: number): number {
              return (indexOfEntry / (this._columnsOnPage * this._entriesInColumn)) | 0;
            }
        
          	private _calcColumnIndex(indexOfEntry: number) {
              return ((indexOfEntry / this._entriesInColumn) | 0) % this._columnsOnPage;
            }
        
          	private _calcEntryIndex(indexOfEntry: number) {
              return indexOfEntry % this._entriesInColumn;
            }
        
          	private _calcEntryTopOffset(indexOfEntry: number) {
              if (!this._metrics || !this._metrics.windowMetrics) return 0;
        
              var pageIndex = this._calcPageIndex(indexOfEntry);
              var entryIndex = this._calcEntryIndex(indexOfEntry);
              var offset =
                pageIndex * this._entriesInColumn * this._metrics.windowMetrics.emHeight + // whole pages
                Math.max(0, pageIndex - 1) * this._pageInterval + // inter-page spaces
                entryIndex * this._metrics.windowMetrics.emHeight; // distance from the top of the page
        
              return offset;
            }
          }
        
        	interface HTMLElementWithFlags extends HTMLElement {
            isScrollContent: boolean;
            isLeadPaddingDIV?: boolean;
            isPageDIV: boolean;
            isColumnDIV: boolean;
            isEntryDIV: boolean;
          }
        
          export module Panel {
        
            export interface Metrics {
              windowMetrics: CommanderShell.Metrics;
              hostWidth: number;
              hostHeight: number;
            }
        
            export interface DirectoryEntry {
              name: string;
              path: string;
              flags: EntryFlags;
            }
        
            export enum EntryFlags {
              Directory = 1
            }
        
            export interface PageData {
              leadPaddingDIV: HTMLElementWithFlags;
              pageDIV: HTMLElementWithFlags;
              columns: ColumnData[];
              height: number;
              leadInterval: number;
            }
        
            export interface ColumnData {
              columnDIV: HTMLElementWithFlags;
              entries: PageEntry[];
              height: number;
              width: number;
            }
        
            export interface PageEntry extends DirectoryEntry {
              entryDIV: HTMLElementWithFlags;
              selectionFlags: SelectionFlags;
            }
        
            export enum SelectionFlags {
              None = 0,
              Current = 1,
              Selected = 2
            }
        
          }
        
        }
      • TwoPanels.ts
        module panels {
        
          var panelHMargin = 10;
          var panelVMargin = 5;
        
          export class TwoPanels {
        
            private _scrollHost: HTMLDivElement;
            private _scrollContent: HTMLDivElement;
        
            private _leftPanelHost: HTMLDivElement;
            private _rightPanelHost: HTMLDivElement;
        
            private _leftPanel: Panel;
            private _rightPanel: Panel;
        
            constructor(
              private _host: HTMLElement,
              leftPath: string,
              rightPath: string,
              private _drive: persistence.Drive) {
        
              this._scrollHost = <any>elem('div', { className: 'panels-scroll-host' }, this._host);
              this._scrollContent = <any>elem('div', { className: 'panels-scroll-content' }, this._scrollHost);
        
              this._leftPanelHost = <any>elem('div', { className: 'panels-panel panels-left-panel' }, this._scrollContent);
              this._rightPanelHost = <any>elem('div', { className: 'panels-panel panels-right-panel' }, this._scrollContent);
        
              var directoryService = driveDirectoryService(this._drive);
        
              this._leftPanel = new Panel(
                this._leftPanelHost,
                leftPath,
                directoryService);
        
              this._rightPanel = new Panel(
                this._rightPanelHost,
                rightPath,
                directoryService);
        
              this._leftPanel.activate();
              /*
              TODO: ensure focus stays with the text input at the bottom
              elem.on(this._leftPanel, 'mousedown', e=> {
                if (e.preventDefault)
                  e.preventDefault();
                return false;
              }); */
        
              on(this._leftPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
              on(this._rightPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
        
            }
        
            measure() {
            }
        
            arrange(metrics: CommanderShell.Metrics) {
        
              var contentWidth = 0;
        
              if (metrics.hostWidth < metrics.emWidth * 80 && metrics.hostWidth < metrics.hostHeight * 1) { 
                // flippable layout
                contentWidth = Math.max(metrics.hostWidth / 2, metrics.hostWidth * 2 - metrics.emWidth * 3);
              }
              else {
                // full layout
                contentWidth = metrics.hostWidth;
              }
        
              var bottomGap = Math.min(metrics.hostHeight / 3, metrics.emHeight * 3);
        
              this._scrollHost.style.width = metrics.hostWidth + 'px';
              var panelsHeight = metrics.hostHeight - bottomGap;
              this._scrollHost.style.height = panelsHeight + 'px';
        
              this._scrollContent.style.width = contentWidth + 'px';
              this._scrollContent.style.height = panelsHeight + 'px';
        
              var panelWidth = (contentWidth / 2 - 0.5) | 0;
        
              this._leftPanelHost.style.height = panelsHeight + 'px';
              this._leftPanelHost.style.width = panelWidth + 'px';
        
              this._rightPanelHost.style.height = panelsHeight + 'px';
              this._rightPanelHost.style.width = panelWidth + 'px';
        
              if (this._leftPanelHost.style.display !== 'none') {
                this._leftPanel.arrange({
                  windowMetrics: metrics,
                  hostWidth: panelWidth - panelHMargin * 2,
                  hostHeight: panelsHeight - panelVMargin * 2
                });
              }
        
              if (this._rightPanelHost.style.display !== 'none') {
                this._rightPanel.arrange({
                  windowMetrics: metrics,
                  hostWidth: panelWidth - panelHMargin * 2,
                  hostHeight: panelsHeight - panelVMargin * 2
                });
              }
            }
        
            isVisible() {
              return this._scrollHost.style.display !== 'none';
            }
        
            toggleVisibility() {
              this._scrollHost.style.display = this.isVisible() ? 'none' : 'block';
            }
        
            isLeftActive() {
              return this._leftPanel.isActive();
            }
        
            toggleActivePanel() {
              if (!this.isVisible()) return;
        
              var isLeftActive = this._leftPanel.isActive();
              this._getPanel(isLeftActive).deactivate();
              this._getPanel(!isLeftActive).activate();
            }
        
          	temporarilyHidePanels(): () => void {
        
              var start = +new Date();
              var fadeTime = 500;
              var opacity = 0.5;
              this._scrollHost.style.opacity = <any>opacity;
              this._scrollHost.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
              var ani = setInterval(() => {
                var passed = (Date.now ? Date.now() : +new Date()) - start;
                if (passed > fadeTime) {
                  clearInterval(ani);
                  this._scrollHost.style.opacity = '0';
                  this._scrollHost.style.filter = 'alpha(opacity=0)';
                  return;
                }
        
                opacity = (1 - (passed / fadeTime))/2;
                this._scrollHost.style.opacity = <any>opacity;
                this._scrollHost.style.filter = 'alpha(opacity=' + (opacity*100) + ')';
              }, 1);
        
              var stop = () => {
                clearInterval(ani);
        
                var passed = (Date.now ? Date.now() : +new Date()) - start;
                opacity = Math.max(0, 1 - (passed / fadeTime));
        
                start = +new Date();
                fadeTime = 300 * (1-opacity);
                ani = setInterval(() => {
                  var passed = (Date.now ? Date.now() : +new Date()) - start;
                  if (passed > fadeTime) {
                    clearInterval(ani);
                    this._scrollHost.style.opacity = null;
                    this._scrollHost.style.filter = null;
                    return;
                  }
        
                  opacity = passed / fadeTime;
                  this._scrollHost.style.opacity = <any>opacity;
                  this._scrollHost.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
        
                }, 1);
              };
              return stop;
            }
        
            keydown(e: KeyboardEvent): boolean {
              switch (e.keyCode) {
                case 38:
                  return this._selectionGo(-1);
                case 40:
                  return this._selectionGo(+1);
                case 33:
                  return this._selectionGo(-100);
                case 34:
                  return this._selectionGo(+100);
                case 37:
                  return this._selectionGo(-10);
                case 39:
                  return this._selectionGo(+10);
                case 9:
                  this.toggleActivePanel();
                  return true;
                case 86: // U
                  if (e.ctrlKey || e.metaKey)
                    return this.togglePanelPaths();
                  break;
        
                case 112: // F1
                  if (e.ctrlKey || e.metaKey) {
                    return this.togglePartHidden(true);
                  }
                  break;
        
                case 113: // F2
                  if (e.ctrlKey || e.metaKey) {
                    return this.togglePartHidden(false);
                  }
                  break;
        
                case 13: // Enter
                  var activePa = this._getPanel(this.isLeftActive());
                  return activePa.navigateCursor();
        
                default:
                  if (e.ctrlKey) {
                    //console.log('ctrl ' + e.keyCode);
                  }
                  break;
              }
        
              return false;
            }
        
            togglePartHidden(leftPanel: boolean) {
              var togglePanelHost = this._getPanelHost(leftPanel);
              var oppositePanelHost = this._getPanelHost(!leftPanel);
        
              if (!this.isVisible()) {
                togglePanelHost.style.display = 'block';
                oppositePanelHost.style.display = 'none';
                if (this.isLeftActive() !== leftPanel)
                  this.toggleActivePanel();
                this.toggleVisibility();
              }
              else {
                if (togglePanelHost.style.display !== 'none') {
                  if (oppositePanelHost.style.display === 'none') {
                    togglePanelHost.style.display = 'block';
                    this.toggleVisibility();
                  }
                  else {
                  	togglePanelHost.style.display = 'none';
                		if (this.isLeftActive() === leftPanel)
                      this.toggleActivePanel();
                  }
                }
                else {
                  togglePanelHost.style.display = 'block';
                }
              }
              return true;
            }
        
            togglePanelPaths() {
              console.log('Ctrl+U toggle is not implemented.');
              return false;
            }
        
          	cursorPath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(this.isLeftActive());
              return pan.cursorPath();
            }
        
            currentPath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(this.isLeftActive());
              return pan.currentPath();
            }
        
          	cursorOppositePath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(!this.isLeftActive());
              return pan.cursorPath();
            }
        
          	currentOppositePath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(!this.isLeftActive());
              return pan.currentPath();
            }
        
            private _selectionGo(direction: number) {
              var panel = this._getPanel(this.isLeftActive()).cursorGo(direction);
              return true;
            }
        
            private _getPanel(left: boolean) {
              return left ? this._leftPanel : this._rightPanel;
            }
        
            private _getPanelHost(left: boolean) {
              return left ? this._leftPanelHost : this._rightPanelHost;
            }
        
            private _onclick(e: MouseEvent) {
              var isLeft = this._leftPanel.onclick(e);
              if (!isLeft && !this._rightPanel.onclick(e))
                return;
        
              if (isLeft === this.isLeftActive()) return;
        
              this.toggleActivePanel();
            }
        
          }
        
        }
      • driveDirectoryService.ts
        module panels {
        
          export function driveDirectoryService(drive: persistence.Drive) {
        
            return path => {
              var pathPrefix = path === '/' ? path : path + '/';
              var result: Panel.DirectoryEntry[] = [];
              var resByName: { [name: string]: Panel.DirectoryEntry; } = {};
              var files = drive.files();
              for (var i = 0; i < files.length; i++) {
                var fi = files[i];
                if (fi.length < pathPrefix.length + 1) continue;
        
                if (fi.slice(0, pathPrefix.length) !== pathPrefix) continue;
        
                var name: string;
                var entryPath = fi;
                var isDirectory = false;
                var nextSlashPos = fi.indexOf('/', pathPrefix.length);
                if (nextSlashPos < 0) {
                  name = fi.slice(pathPrefix.length);
                }
                else {
                  name = fi.slice(pathPrefix.length, nextSlashPos);
                  entryPath = fi.slice(0, nextSlashPos);
                  isDirectory = true;
                }
        
                if (resByName.hasOwnProperty(name)) continue;
                var entry = { path: entryPath, name, flags: isDirectory ? Panel.EntryFlags.Directory : 0 };
                result.push(entry);
                resByName[name] = entry;
              }
              return result;
            };
        
          }
        
        }
      • panels.css
        .panels-scroll-host {
          position: absolute;
          left: 0; top: 0; width: 0; height: 0;
          overflow: auto;
          overflow-y: hidden;
          background: black;
          background: transparent;
        }
        
        .panels-scroll-content {
          width: 0; height: 0;   overflow: hidden;
        }
        
        .panels-panel {
          width: 0; height: 0;
          overflow: auto;
          overflow-x: hidden;
          background: rgba(4, 12, 64, 0.95) !important;
          background: navy;
          color: darkcyan;
          padding-top: 10px;
          padding-bottom: 10px;
          cursor: default;
        }
        
        .panels-panel * {
          cursor: default;
        }
        
        .panels-left-panel {
          float: left;
        }
        
        .panels-right-panel {
          float: right;
        }
        
        .panels-panel-page {
          clear: both;
        }
        
        .panels-page-separator {
          clear: both;
        }
        
        .panels-panel-column {
          float: left;
        }
        
        .panels-entry {
          padding-left: 10px;
          padding-right: 10px;
        }
        
        .panels-entry-dir {
          color: white;
        }
        
        .panels-panel-active .panels-entry-current {
          background: darkcyan;
        }
        
        .panels-panel-active .panels-entry-file-current {
          color: navy;
        }
        
        ::-webkit-scrollbar {
            width: 0.5em;
            height: 0.5em
        }
    • terminal
      • Terminal.ts
        module terminal {
        
          export class Terminal {
        
            private _history: HTMLDivElement;
            private _historyContent: HTMLDivElement;
            private _prompt: HTMLDivElement;
            private _input: HTMLTextAreaElement;
        
            private _promptWidth = 0;
            private _historyContentHeight = 0;
            private _hostMetrics: CommanderShell.Metrics = null;
        
            constructor(private _host: HTMLElement, private _node: NodeHost) {
              this._history = <any>elem('div', { className: 'terminal-history' }, this._host);
              this._historyContent = <any>elem('pre', {
                className: 'terminal-history-content',
                text: 'Hello world from mini-shell\n\nVersion 0.7s\nJune 2015\nOleg Mihailik\n\nPlease be careful.'
              }, this._history);
        
              this._prompt = <any>elem('div', { className: 'terminal-prompt', text: '>' }, this._host);
        
              this._input = <any>elem('textarea', { className: 'terminal-input', autofocus: true }, this._host);
        
              setTimeout(() => this._input.focus(), 1);
        
            }
        
            log(args: any[]) {
              log(args, this._historyContent);
        
              if (this._hostMetrics) {
                this.measure();
                this.arrange(this._hostMetrics);
              }
            }
        
            hasInput() {
              return !!this._getInput();
            }
        
          	private _getInput() {
              return (this._input.value || '').replace(/[\r\n]/g, '');
            }
        
        
            focus() {
              this._input.focus();
            }
        
          	temporarilyHidePrompt(replacementText: string): () => void {
              // TODO: hide prompt, display replacement text instead
              return () => { };
            }
        
            measure() {
              this._promptWidth = this._prompt.offsetWidth;
              this._historyContentHeight = this._historyContent.offsetHeight;
            }
        
            arrange(metrics: CommanderShell.Metrics) {
        
              this._hostMetrics = metrics;
        
              this._history.style.width = metrics.hostWidth + 'px';
        
              this._history.style.bottom = (metrics.emHeight * 2) + 'px';
              if (metrics.hostHeight - metrics.emHeight * 2 > this._historyContentHeight) {
                this._history.style.height = this._historyContentHeight + 'px';
              }
              else {
                this._history.style.height = (metrics.hostHeight - metrics.emHeight * 2) + 'px';
                this._history.scrollTop = this._historyContentHeight - (metrics.hostHeight - metrics.emHeight * 2);
              }
              this._input.style.left = this._promptWidth + 'px';
              this._input.style.width = (metrics.hostWidth - this._promptWidth) + 'px';
            }
        
          	clearInput() {
              setTimeout(() => {
                var cleanInput = this._getInput();
                if (this._input.value !== cleanInput) {
                  this._input.value = cleanInput;
                }
              }, 10);
            }
        
            keydown(e: KeyboardEvent, cursorPath: string) {
              if (e.keyCode === 38) {
                // TODO history
              }
              else if (e.keyCode === 13) {
                var code = this._getInput();
        
                if (code) {
                  if (code.slice(-2) === '\r\n')
                    code = code.slice(0, code.length - 2);
                  this._input.value = '';
                  elem('div', {
                    text: code,
                    color: 'gray'
                  }, this._historyContent);
        
                  this._evalAndLogResults(code);
                  return true;
                }
                else {
                  return false;
                }
              }
            }
        
            private _evalAndLogResults(code: string) {
        
              var result;
              try {
                result = this._node.run(code, null);
              }
              catch (error) {
                elem('div', {
                  text: error && error.stack ? error.stack : error,
                  color: 'red'
                }, this._historyContent);
                if (this._hostMetrics) {
                  this.measure();
                  this.arrange(this._hostMetrics);
                }
                return;
              }
        
              this.log([result]);
            }
        
        
          }
        
        }
      • log.ts
        module terminal {
        
          export function log(args: any[], historyContent: HTMLElement) {
            var output = elem('div', historyContent);
            for (var i = 0; i < args.length; i++) {
              if (i > 0)
                elem('span', { text: ' ' }, output);
              if (args[i] === null) {
                elem('span', { text: 'null', color: 'green' }, output);
              }
              else {
                logAppendObj(args[i], <any>output, 0);
              }
            }
          }
        }
      • logAppendObj.ts
        module terminal {
        
          export function logAppendObj(obj: any, output: HTMLDivElement, level: number) {
            switch (typeof obj) {
              case 'number':
              case 'boolean':
                elem('span', { text: obj, color: 'green' }, output);
                break;
        
              case 'undefined':
                elem('span', { text: 'undefined', color: 'green', opacity: 0.5 }, output);
                break;
        
              case 'function':
                var funContainer = elem('span', output);
                var funFunction = elem('span', { text: 'function ', color: 'silver', opacity: 0.5 }, funContainer);
                var funName = elem('span', { text: obj.name, color: 'cornflowerblue', fontWeight: 'bold' }, funContainer);
                funContainer.title = obj;
                break;
        
              case 'string':
                var strContainer = elem('span', output);
                elem('span', { text: '"', color: 'tomato' }, strContainer);
                elem('span', { text: obj, color: 'tomato', opacity: 0.5 }, strContainer);
                elem('span', { text: '"', color: 'tomato' }, strContainer);
                break;
        
              default:
                if (obj === null) {
                  elem('span', { text: 'null', color: 'green', opacity: 0.5 }, output);
                  break;
                }
        
                if (obj.constructor && obj.construct && obj.constructor.name !== 'Object' && obj.constructor.name !== 'Array') {
                  elem('span', { text: obj.constructor.name, color: 'cornflowerblue' }, output);
                  if (obj.constructor.prototype && obj.constructor.prototype.constructor
                    && obj.constructor.prototype.constructor.name
                    && obj.constructor.prototype.constructor.name !== 'Object' && obj.constructor.prototype.constructor.name !== 'Array')
                    elem('span', { text: ':' + obj.contructor.prototype.constructor.name, color: 'cornflowerblue', opacity: 0.5 }, output);
                  elem('span', output);
                }
        
                if (typeof obj.length === 'number' && obj.length >= 0) {
                  elem('span', { text: '[', color: 'white' }, output);
                  if (level > 1) {
                    elem('span', { text: '...', color: 'silver' }, output);
                    // TODO: handle click
                  }
                  else {
                    for (var i = 0; i < obj.length; i++) {
                      if (i > 0) elem('span', { text: ', ', color: 'gray' }, output);
                      if (typeof obj[i] !== 'undefined')
                        logAppendObj(obj[i], output, level + 1);
                    }
                  }
                  elem('span', { text: ']', color: 'white' }, output);
                }
                else if (obj.createElement + '' === document.createElement + '' && obj.getElementById + '' === document.getElementById + '' && 'title' in obj) {
                  elem('span', { text: '#document ' + obj.title, color: 'green' }, output);
                }
                else if (obj.setInterval + '' === window.setInterval + '' && obj.setTimeout + '' === window.setTimeout + '' && 'location' in obj) {
                  elem('span', { text: '#window ' + obj.location, color: 'green' }, output);
                }
                else if (typeof obj.tagName === 'string' && obj.getElementsByTagName + '' === document.body.getElementsByTagName + '') {
                  elem('span', { text: '<' + obj.tagName + '>', color: 'green' }, output);
                }
                else if (obj + '' !== '[Object]') {
                  elem('span', { text: '{', color: 'cornflowerblue' }, output);
                  if (level > 1) {
                    elem('span', { text: '...', color: 'cornflowerblue', opacity: 0.5 }, output);
                    // TODO: handle click
                  }
                  else {
                    var first = true;
                    for (var k in obj) {
                      if (obj.hasOwnProperty && !obj.hasOwnProperty(k)) continue;
                      if (first) {
                        first = false;
                      }
                      else {
                        elem('span', { text: ', ', color: 'cornflowerblue', opacity: 0.3 }, output);
                        first = false;
                      }
                      elem('span', { text: k, color: 'cornflowerblue', fontWeight: 'bold' }, output);
                      elem('span', { text: ': ', color: 'cornflowerblue', opacity: 0.5 }, output);
                      logAppendObj(obj[k], output, level + 1);
                    }
                  }
                  elem('span', { text: '}', color: 'cornflowerblue' }, output);
                }
                else {
                  elem('span', { text: obj, color: 'cornflowerblue' }, output);
                }
                break;
            }
          }
        
        }
      • terminal.css
        .terminal-history {
          position: absolute;
          left: 0; bottom: 1em;
          width: 100%; height: 0;
          overflow-y: auto;
          overflow-x: hidden;
        }
        
        .terminal-history-content {
          margin: 0; padding: 0;
        }
        
        .terminal-prompt {
          position: absolute;
          left: 0; bottom: 1em;
          height: 1em;
        }
        
        .terminal-input {
          position: absolute;
          left: 0; bottom: 1em;
          width: 0; height: 1em;
          font: inherit;
          border: none;
          background: transparent;
          color: silver;
          outline: none;
          resize: none;
          overflow: hidden;
        }
    • CommanderShell.ts
      class CommanderShell {
      
        private _metricElem: HTMLDivElement;
        private _twoPanels: panels.TwoPanels;
        private _terminal: terminal.Terminal;
      
        private _metrics: CommanderShell.Metrics = {
          hostWidth: 0,
          hostHeight: 0,
          emWidth: 0,
          emHeight: 0
        };
      
        private _onsizechangedTimeout: number = 0;
        private _node: NodeHost;
      
        private _editor: editor.Editor = null;
      
        private _fnKeys: HTMLElement[] = [];
      
        constructor(private _host: HTMLElement, private _drive: persistence.Drive) {
      
          this._node = new NodeHost(this._drive);
          this._node.log = args => this._terminal.log(args);
      
          elem(this._host, {
            background: 'black',
            color: 'silver'
          });
      
          this._metricElem = <any>elem('div', {
            position: 'absolute',
            opacity: 0,
            left: '-200px', top: '-200px',
            wdith: 'auto', height: 'auto',
            text: 'M'
          }, document.body);
      
          this._terminal = new terminal.Terminal(this._host, this._node);
          this._twoPanels = new panels.TwoPanels(this._host, '/', '/src', this._drive);
      
          var fnKeyActions = [null, 'Help', '<None>', 'View', 'Edit', 'Copy', 'Move', 'MkDir', 'Delete', 'Options', 'Save'];
          for (var i = 1; i <= 10; i++) {
            var fnKeyText = elem('div', {
              position: 'absolute', bottom: '0',
              whiteSpace: 'nowrap',
              cursor: 'pointer'
            }, this._host);
            var keyName = (i === 1 ? 'F1' : '' + i);
            elem('span', { background: 'black', color: 'gray', text: keyName + ' ' }, fnKeyText);
            elem('span', { background: 'gray', color: 'black', text: fnKeyActions[i] }, fnKeyText);
            this._fnKeys.push(fnKeyText);
          }
      
          on(this._fnKeys[4 - 1], 'click', () => {
            var cursorPath = this._twoPanels.cursorPath();
            this._openEditor(cursorPath);
          });
          on(this._fnKeys[5 - 1], 'click', () => {
            this._copyCommand();
            return true;
          });
          on(this._fnKeys[6 - 1], 'click', () => {
            this._moveCommand();
            return true;
          });
          on(this._fnKeys[7 - 1], 'click', () => {
            this._mkdirCommand();
            return true;
          });
          on(this._fnKeys[8 - 1], 'click', () => {
            this._removeCommand();
            return true;
          });
      
          on(this._fnKeys[10 - 1], 'click', () => {
            this._exportAllHTML();
          });
      
          var resizeMod = require('resize');
          resizeMod.on(winMetrics => {
            this._metrics.hostWidth = winMetrics.windowWidth;
            this._metrics.hostHeight = winMetrics.windowHeight;
            this.measure();
            this.arrange();
          });
      
          this._metrics.hostWidth = document.body.offsetWidth;
          this._metrics.hostHeight = document.body.offsetHeight;
      
          this.measure();
          this.arrange();
      
          on(this._host, 'keydown', e => this._keydown(<any>e));
      
          var _glob = (function() { return this; })();
          var applyConsole = (glob) => {
            if (glob.console) {
              var _oldLog: Function = glob.console.log;
              var term = this._terminal;
              console.log = function() {
                var args = [];
                for (var i = 0; i < arguments.length; i++) {
                  args.push(arguments[i]);
                }
                term.log(args);
                if (typeof _oldLog === 'function')
                  _oldLog.apply(glob.console, args);
              };
            }
            else {
              var term = this._terminal;
              glob.console = {
                log: function() {
                  var args = [];
                  for (var i = 0; i < arguments.length; i++) {
                    args.push(arguments[i]);
                  }
                  term.log(args);
                }
              };
            }
          };
      
          applyConsole(_glob);
          applyConsole(window);
        }
      
        measure() {
          this._metrics.emWidth = this._metricElem.offsetWidth;
          this._metrics.emHeight = this._metricElem.offsetHeight;
          this._twoPanels.measure();
          this._terminal.measure();
          //this._editor.measure();
        }
      
        arrange() {
          this._host.style.width = this._metrics.hostWidth + 'px';
          this._host.style.height = this._metrics.hostHeight + 'px';
          this._twoPanels.arrange(this._metrics);
          this._terminal.arrange(this._metrics);
          //this._editor.arrange();
      
          var keySize = ((this._metrics.hostWidth / 10) | 0);
          for (var i = 0; i < this._fnKeys.length; i++) {
            this._fnKeys[i].style.left = (i * keySize) + 'px';
            this._fnKeys[i].style.width = keySize + 'px';
          }
        }
      
        private _keydown(e: KeyboardEvent) {
          var res = this._keydownCore(e);
          if (res) {
            if (e.preventDefault)
              e.preventDefault();
          }
          return res;
        }
      
        private _keydownCore(e: KeyboardEvent) {
          if (this._editor) {
            if (e.keyCode === 27) {
              this._closeEditor();
              return true;
            }
            return;
          }
      
          if (e.keyCode === 27 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
            this._twoPanels.toggleVisibility();
            return true;
          }
      
          if (e.keyCode === 13)
            this._terminal.clearInput();
      
          if ((e.keyCode === 13 && this._twoPanels.isVisible() && !this._terminal.hasInput())
            || (e.keyCode !== 13)) {
            if (this._twoPanels.keydown(e)) return true;
          }
      
          var cursorPath = this._twoPanels.cursorPath();
      
          this._terminal.focus();
          if (this._terminal.keydown(e, cursorPath)) return true;
      
          if (e.keyCode === 13)
            return this._execute(cursorPath);
      
          //if (e.keyCode < 32 || e.keyCode > 126) {
          //	this._terminal.log('CommanderShell::keydown ' + e.yCode);
          //}
      
          if (e.keyCode === 115) { // F4
            var editorPath = cursorPath;
            if (e.shiftKey) {
              editorPath = prompt('Edit file:', editorPath);
              if (!editorPath) return;
            }
            this._openEditor(editorPath);
            return true;
          }
      
          if (e.keyCode === 116) { // F5
            this._copyCommand();
            return true;
          }
      
          if (e.keyCode === 117) { // F6
            this._moveCommand();
            return true;
          }
      
          if (e.keyCode === 118) { // F7
            this._mkdirCommand();
            return true;
          }
      
          if (e.keyCode === 119) { // F8
            this._removeCommand();
            return true;
          }
      
          if (e.keyCode === 121) { // F10
            this._exportAllHTML();
            return true;
          }
      
          if (e.ctrlKey || e.altKey || e.metaKey) {
            this._terminal.log(['CommanderShell::keydown ', e.keyCode]);
          }
        }
      
        private _getFilesFor(path: string): string[] {
          var fileResult: string[] = [];
          var allFiles = this._drive.files();
          for (var i = 0; i < allFiles.length; i++) {
            var f = allFiles[i];
            if (f.slice(0, path.length) !== path) continue;
            if (f===path || f.slice(path.length, path.length+1)==='/')
            	fileResult.push(f);
          }
          return fileResult;
        }
      
        private _copyCommand() {
          var cursorPath = this._twoPanels.cursorPath();
          var currentOppositePath = this._twoPanels.currentOppositePath();
          if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
      
          var filesToCopy: string[] = this._getFilesFor(cursorPath);
      
          var targetDir = prompt('Copy ' + filesToCopy.length + ' files from\n   "' + cursorPath + '"\n  to', currentOppositePath);
          if (!targetDir) return;
      
          var normTargetDir = targetDir;
      
          if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
            var content = this._drive.read(filesToCopy[0]);
            this._drive.write(normTargetDir, content);
          }
          else {
            if (normTargetDir.slice(-1)!= '/') normTargetDir += '/';
            var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
      
            for (var i = 0; i < filesToCopy.length; i++) {
              var content = this._drive.read(filesToCopy[i]);
              var newPath =
                normTargetDir +
                filesToCopy[i].slice(baseDir.length);
              this._drive.write(newPath, content);
            }
          }
          this.measure();
          this.arrange();
        }
      
        private _moveCommand() {
          var cursorPath = this._twoPanels.cursorPath();
          var currentOppositePath = this._twoPanels.currentOppositePath();
          if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
      
          var filesToCopy: string[] = this._getFilesFor(cursorPath);
      
          var targetDir = prompt('Move/rename ' + filesToCopy.length + ' files from\n   "' + cursorPath + '"\n  to', currentOppositePath);
          if (!targetDir) return;
      
          var normTargetDir = targetDir;
      
          if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
            var content = this._drive.read(filesToCopy[0]);
            this._drive.write(normTargetDir, content);
            this._drive.write(filesToCopy[0], null);
          }
          else {
            if (normTargetDir.slice(-1) !== '/') normTargetDir += '/';
            var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
      
            for (var i = 0; i < filesToCopy.length; i++) {
              var content = this._drive.read(filesToCopy[i]);
              var newPath =
                normTargetDir +
                filesToCopy[i].slice(baseDir.length);
              this._drive.write(newPath, content);
              this._drive.write(filesToCopy[i], null);
            }
          }
            this.measure();
            this.arrange();
      
        }
      
        private _mkdirCommand() {
          var dir = prompt('Make directory: ');
          if (!dir || dir === '/') return;
      
          var dirPath = dir;
          if (dir.slice(0, 1) !== '/') {
            dirPath = this._twoPanels.currentPath() + '/' + dirPath;
            if (dirPath.slice(0, 2) === '//') dirPath = dirPath.slice(1);
          }
      
          if (dirPath.slice(-1) === '/')
            dirPath = dirPath.slice(0, dirPath.length - 1);
      
          var matchFiles = this._getFilesFor(dirPath);
          if (matchFiles.length) return;
      
          this._drive.write(dirPath + '/', '');
          this.measure();
          this.arrange();
        }
      
        private _removeCommand() {
          var cursorPath = this._twoPanels.cursorPath();
          if (!cursorPath || cursorPath === '/') return;
      
          var filesToRemove: string[] = this._getFilesFor(cursorPath);
      
          if (!confirm('Remove ' + filesToRemove.length + ' files from\n   "' + cursorPath + '"?')) return;
      
          for (var i = 0; i < filesToRemove.length; i++) {
            this._drive.write(filesToRemove[i], null);
          }
          this.measure();
          this.arrange();
        }
      
        private _closeEditor() {
          var newText = this._editor.getText();
          var cursorPath = this._twoPanels.cursorPath();
          var oldText = this._drive.read(cursorPath);
          if (newText !== oldText) {
            if (confirm('File was changed: ' + cursorPath + ', save before exit?'))
              this._drive.write(cursorPath, newText);
          }
          this._editor.close();
          this._editor = null;
          this.measure();
          this.arrange();
        }
      
        private _openEditor(cursorPath: string) {
          if (cursorPath) {
            var text = this._drive.read(cursorPath);
            if (typeof text === 'string') {
              this._terminal.log(['@edit ', cursorPath]);
              this._editor = new editor.Editor(this._host, cursorPath, text);
              setTimeout(() => {
                if (this._editor) this._editor.focus();
              }, 1);
            }
            else {
              this._terminal.log(['text at ', cursorPath, ' is ', text]);
            }
          }
          else {
            this._terminal.log(['cursorPath = ', cursorPath]);
          }
        }
      
        private _exportAllHTML() {
          var window = require('window');
          var document = require('document');
      
          this._terminal.log(['@save']);
          var filename = saveFileName();
          exportBlob(filename, ['<!doctype html>\n', document.documentElement.outerHTML]);
      
          function exportBlob(filename: string, textChunks: string[]) {
            try {
              var blob: Blob = new (<any>Blob)(textChunks, { type: 'application/octet-stream' });
            }
            catch (blobError) {
              exportDocumentWrite(filename, textChunks.join(''));
              return;
            }
      
            exportBlobHTML5(filename, blob);
          }
      
          function exportBlobHTML5(filename, blob: Blob) {
            var url = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.setAttribute('download', filename);
            try {
              // safer save method, supposed to work with FireFox
              var evt = document.createEvent("MouseEvents");
              (<any>evt).initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
              a.dispatchEvent(evt);
            }
            catch (e) {
              a.click();
            }
          }
      
          function exportDocumentWrite(filename: string, content: string) {
            var win = document.createElement('iframe');
            win.style.width = '100px';
            win.style.height = '100px';
            win.style.display = 'none';
            document.body.appendChild(win);
      
            setTimeout(() => {
              var doc = win.contentDocument || (<any>win).document;
              doc.open();
              doc.write(content);
              doc.close();
      
              doc.execCommand('SaveAs', null, filename);
            }, 200);
      
          }
      
          function saveFileName() {
      
            if (window.location.protocol.toLowerCase() === 'blob:')
              return 'mi-save.html';
      
            var urlParts = window.location.pathname.split('/');
            var currentFileName = decodeURI(urlParts[urlParts.length - 1]);
            var lastDot = currentFileName.indexOf('.');
            if (lastDot > 0) {
              currentFileName = currentFileName.slice(0, lastDot) + '.html';
            }
            else {
              currentFileName += '.html';
            }
            return currentFileName;
          }
        }
      
        private _execute(cursorPath: string) {
      
          if (/\.js$/.test(cursorPath)) {
            var text = this._drive.read(cursorPath);
            if (typeof text !== 'undefined' && text !== null) {
              this._terminal.log(['@node ' + cursorPath]);
              var ani = this._twoPanels.temporarilyHidePanels();
      
              setTimeout(() => {
                try {
                  var result = this._node.run(text, cursorPath);
                }
                catch (error) {
                  result = error;
                }
                ani();
                this._terminal.log([result]);
              },
                1);
      
              return true;
            }
          }
          else if (/\.ts$/.test(cursorPath)) {
            var text = this._drive.read('/src/typescript/tsc.js');
            if (typeof text !== 'undefined' && text !== null) {
              this._terminal.log(['@tsc ' + cursorPath]);
              var ani = this._twoPanels.temporarilyHidePanels();
              setTimeout(() => {
                try {
                  var result = this._node.run(text, '/src/typescript/tsc.js', [cursorPath]);
                }
                catch (error) {
                  this._terminal.log(error);
                }
                ani();
              }, 1);
              return true;
            }
          }
          else if (/.html$/.test(cursorPath)) {
            this._terminal.log(['@build ' + cursorPath]);
            var ani = this._twoPanels.temporarilyHidePanels();
            setTimeout(() => {
      
              var htmlTemplate = this._drive.read(cursorPath);
      
              var blankWindow = window.open('', '_blank' + (+new Date()));
      
              var pollUntil = (+new Date()) + 1000;
      
              while (+new Date() < pollUntil) {
                try {
                  var blankWindowDoc = blankWindow.document;
                }
                catch (error) { }
              }
      
              if (!blankWindowDoc) {
                alert('Cannot open a window to host the built document');
                ani();
                return;
              }
      
              blankWindow.document.open();
              blankWindow.document.write([
                '<html><title>Building ' + cursorPath + '...</title>',
                '<style>',
                'html, body { background: black; color: greenyellow; }',
                'h2 { font-weight: 100; width: 40%; position: fixed; font-size: 200%; }',
                'pre { width: 50%; padding-left: 50%; opacity: 1; transition: opacity 1s; }',
                '</style>',
                '<h2>Building ' + cursorPath + '</h2>',
                '<' + 's' + 'cript>',
                'var textContentProp = "textContent" in document.createElement("pre") ? "textContent" : "innerText";',
                'var lastLogElem;',
                'function log(text) {',
                '  var logElem = document.createElement("pre");',
                '  logElem[textContentProp]=text;',
                '  document.body.appendChild(logElem);',
                '  logElem.scrollIntoView();',
                '  if (lastLogElem) {',
                '    lastLogElem.style.opacity = 0.5;',
                '  }',
                '  lastLogElem = logElem;',
                '}',
                '<' + '/' + 's' + 'cript>'].join('\n'));
              blankWindow.document.close();
      
              try {
                build.processTemplate(
                  htmlTemplate,
                  [],
                  txt => {
                    this._terminal.log([txt]);
                    (<any>blankWindow).log(txt);
                  },
                  (error, result) => {
                    if (error) {
                      this._terminal.log([error]);
                      ani();
                      return;
                    }
      
                    try {
                      var blob = new Blob([result], { type: 'text/html' });
                      var url = URL.createObjectURL(blob);
                      blankWindow.location.replace(url);
                    }
                    catch (blobError) {
                      blankWindow.document.open();
                      blankWindow.document.write(result);
                      blankWindow.document.close();
                    }
      
                    ani();
      
                  });
              }
              catch (errorProcessTemplate) {
                ani();
                this._terminal.log([errorProcessTemplate]);
              }
            }, 1);
          }
          else {
            var ani = this._twoPanels.temporarilyHidePanels();
            this._terminal.log(['@type ' + cursorPath]);
            this._terminal.log([this._drive.read(cursorPath)]);
            ani();
          }
        }
      
      }
      
      module CommanderShell {
      
        export interface Metrics {
          hostWidth: number;
          hostHeight: number;
          emWidth: number;
          emHeight: number;
        }
      
      }
    • NodeHost.ts
      class NodeHost {
      
        private _replGlobal: any;
        private _replContext: isolation.Context;
      
        constructor(private _drive: persistence.Drive) {
          this._replGlobal = this._enrichGlobal({});
          this._replContext = new isolation.Context(window);
        }
      
      
        log: (args: any[]) => void = null;
      
        run(code: string, path: string, argv?: string[]) {
      
          var isInteractive = !path;
      
          if (isInteractive) {
            return this._replContext.run(code, path, this._replGlobal);
          }
          else {
      
            var procGlobal = this._enrichGlobal({});
      
            procGlobal.process.argv.push(path);
            if (argv) {
              for (var i = 0; i < argv.length; i++) {
                procGlobal.process.argv.push(argv[i]);
              }
            }
      
            procGlobal.exports = procGlobal.module.exports;
            procGlobal.__filename = path;
            procGlobal.__dirname = path;
            if (procGlobal.__dirname.indexOf('/') > 0)
              procGlobal.__dirname = procGlobal.__dirname.slice(0, procGlobal.__dirname.indexOf('/'));
      
            var procContext = new isolation.Context(window);
            procContext.run(code, path, procGlobal);
      
            return procGlobal.module.exports;
          }
      
        }
      
        private _enrichGlobal(global: any): noapi.Global {
          noapi.apply(global, this._drive);
          var that = this;
          global.console = {
            log: function() {
              var args = [];
              for (var i = 0; i < arguments.length; i++) {
                args.push(arguments[i]);
              }
              if (that.log)
                that.log(args);
              else if (typeof console !== 'undefined')
                console.log(args);
            }
          };
          return <any>global;
        }
      
      }
    • start.ts
      declare var require;
      
      function showCommander(drive: persistence.Drive) {
        document.body.style.overflow = 'hidden';
        document.body.parentElement.style.overflow = 'hidden';
      
        var styleText = drive.read('/shell/style.css');
        elem('style', { text: styleText }, document.body);
        var commander = new CommanderShell(document.body, drive);
      }
  • typescript
    • lib.d.ts
      /*! *****************************************************************************
      Copyright (c) Microsoft Corporation. All rights reserved. 
      Licensed under the Apache License, Version 2.0 (the "License"); you may not use
      this file except in compliance with the License. You may obtain a copy of the
      License at http://www.apache.org/licenses/LICENSE-2.0  
       
      THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
      WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
      MERCHANTABLITY OR NON-INFRINGEMENT. 
       
      See the Apache Version 2.0 License for specific language governing permissions
      and limitations under the License.
      ***************************************************************************** */
      
      /// <reference no-default-lib="true"/>
      
      /////////////////////////////
      /// ECMAScript APIs
      /////////////////////////////
      
      declare var NaN: number;
      declare var Infinity: number;
      
      /**
        * Evaluates JavaScript code and executes it. 
        * @param x A String value that contains valid JavaScript code.
        */
      declare function eval(x: string): any;
      
      /**
        * Converts A string to an integer.
        * @param s A string to convert into a number.
        * @param radix A value between 2 and 36 that specifies the base of the number in numString. 
        * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
        * All other strings are considered decimal.
        */
      declare function parseInt(s: string, radix?: number): number;
      
      /**
        * Converts a string to a floating-point number. 
        * @param string A string that contains a floating-point number. 
        */
      declare function parseFloat(string: string): number;
      
      /**
        * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number). 
        * @param number A numeric value.
        */
      declare function isNaN(number: number): boolean;
      
      /** 
        * Determines whether a supplied number is finite.
        * @param number Any numeric value.
        */
      declare function isFinite(number: number): boolean;
      
      /**
        * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).
        * @param encodedURI A value representing an encoded URI.
        */
      declare function decodeURI(encodedURI: string): string;
      
      /**
        * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
        * @param encodedURIComponent A value representing an encoded URI component.
        */
      declare function decodeURIComponent(encodedURIComponent: string): string;
      
      /** 
        * Encodes a text string as a valid Uniform Resource Identifier (URI)
        * @param uri A value representing an encoded URI.
        */
      declare function encodeURI(uri: string): string;
      
      /**
        * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).
        * @param uriComponent A value representing an encoded URI component.
        */
      declare function encodeURIComponent(uriComponent: string): string;
      
      interface PropertyDescriptor {
          configurable?: boolean;
          enumerable?: boolean;
          value?: any;
          writable?: boolean;
          get? (): any;
          set? (v: any): void;
      }
      
      interface PropertyDescriptorMap {
          [s: string]: PropertyDescriptor;
      }
      
      interface Object {
          /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
          constructor: Function;
      
          /** Returns a string representation of an object. */
          toString(): string;
      
          /** Returns a date converted to a string using the current locale. */
          toLocaleString(): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): Object;
      
          /**
            * Determines whether an object has a property with the specified name. 
            * @param v A property name.
            */
          hasOwnProperty(v: string): boolean;
      
          /**
            * Determines whether an object exists in another object's prototype chain. 
            * @param v Another object whose prototype chain is to be checked.
            */
          isPrototypeOf(v: Object): boolean;
      
          /** 
            * Determines whether a specified property is enumerable.
            * @param v A property name.
            */
          propertyIsEnumerable(v: string): boolean;
      }
      
      interface ObjectConstructor {
          new (value?: any): Object;
          (): any;
          (value: any): any;
      
          /** A reference to the prototype for a class of objects. */
          prototype: Object;
      
          /** 
            * Returns the prototype of an object. 
            * @param o The object that references the prototype.
            */
          getPrototypeOf(o: any): any;
      
          /**
            * Gets the own property descriptor of the specified object. 
            * An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype. 
            * @param o Object that contains the property.
            * @param p Name of the property.
          */
          getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
      
          /** 
            * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly 
            * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.
            * @param o Object that contains the own properties.
            */
          getOwnPropertyNames(o: any): string[];
      
          /** 
            * Creates an object that has the specified prototype, and that optionally contains specified properties.
            * @param o Object to use as a prototype. May be null
            * @param properties JavaScript object that contains one or more property descriptors. 
            */
          create(o: any, properties?: PropertyDescriptorMap): any;
      
          /**
            * Adds a property to an object, or modifies attributes of an existing property. 
            * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.
            * @param p The property name.
            * @param attributes Descriptor for the property. It can be for a data property or an accessor property.
            */
          defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
      
          /**
            * Adds one or more properties to an object, and/or modifies attributes of existing properties. 
            * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.
            * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.
            */
          defineProperties(o: any, properties: PropertyDescriptorMap): any;
      
          /**
            * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.
            * @param o Object on which to lock the attributes. 
            */
          seal<T>(o: T): T;
      
          /**
            * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
            * @param o Object on which to lock the attributes.
            */
          freeze<T>(o: T): T;
      
          /**
            * Prevents the addition of new properties to an object.
            * @param o Object to make non-extensible. 
            */
          preventExtensions<T>(o: T): T;
      
          /**
            * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.
            * @param o Object to test. 
            */
          isSealed(o: any): boolean;
      
          /**
            * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.
            * @param o Object to test.  
            */
          isFrozen(o: any): boolean;
      
          /**
            * Returns a value that indicates whether new properties can be added to an object.
            * @param o Object to test. 
            */
          isExtensible(o: any): boolean;
      
          /**
            * Returns the names of the enumerable properties and methods of an object.
            * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
            */
          keys(o: any): string[];
      }
      
      /**
        * Provides functionality common to all JavaScript objects.
        */
      declare var Object: ObjectConstructor;
      
      /**
        * Creates a new function.
        */
      interface Function {
          /**
            * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.
            * @param thisArg The object to be used as the this object.
            * @param argArray A set of arguments to be passed to the function.
            */
          apply(thisArg: any, argArray?: any): any;
      
          /**
            * Calls a method of an object, substituting another object for the current object.
            * @param thisArg The object to be used as the current object.
            * @param argArray A list of arguments to be passed to the method.
            */
          call(thisArg: any, ...argArray: any[]): any;
      
          /**
            * For a given function, creates a bound function that has the same body as the original function. 
            * The this object of the bound function is associated with the specified object, and has the specified initial parameters.
            * @param thisArg An object to which the this keyword can refer inside the new function.
            * @param argArray A list of arguments to be passed to the new function.
            */
          bind(thisArg: any, ...argArray: any[]): any;
      
          prototype: any;
          length: number;
      
          // Non-standard extensions
          arguments: any;
          caller: Function;
      }
      
      interface FunctionConstructor {
          /**
            * Creates a new function.
            * @param args A list of arguments the function accepts.
            */
          new (...args: string[]): Function;
          (...args: string[]): Function;
          prototype: Function;
      }
      
      declare var Function: FunctionConstructor;
      
      interface IArguments {
          [index: number]: any;
          length: number;
          callee: Function;
      }
      
      interface String {
          /** Returns a string representation of a string. */
          toString(): string;
      
          /**
            * Returns the character at the specified index.
            * @param pos The zero-based index of the desired character.
            */
          charAt(pos: number): string;
      
          /** 
            * Returns the Unicode value of the character at the specified location.
            * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
            */
          charCodeAt(index: number): number;
      
          /**
            * Returns a string that contains the concatenation of two or more strings.
            * @param strings The strings to append to the end of the string.  
            */
          concat(...strings: string[]): string;
      
          /**
            * Returns the position of the first occurrence of a substring. 
            * @param searchString The substring to search for in the string
            * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.
            */
          indexOf(searchString: string, position?: number): number;
      
          /**
            * Returns the last occurrence of a substring in the string.
            * @param searchString The substring to search for.
            * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.
            */
          lastIndexOf(searchString: string, position?: number): number;
      
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            */
          localeCompare(that: string): number;
      
          /** 
            * Matches a string with a regular expression, and returns an array containing the results of that search.
            * @param regexp A variable name or string literal containing the regular expression pattern and flags.
            */
          match(regexp: string): RegExpMatchArray;
      
          /** 
            * Matches a string with a regular expression, and returns an array containing the results of that search.
            * @param regexp A regular expression object that contains the regular expression pattern and applicable flags. 
            */
          match(regexp: RegExp): RegExpMatchArray;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A String object or string literal that represents the regular expression
            * @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
            */
          replace(searchValue: string, replaceValue: string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A String object or string literal that represents the regular expression
            * @param replaceValue A function that returns the replacement text.
            */
          replace(searchValue: string, replaceValue: (substring: string, ...args: any[]) => string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
            * @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
            */
          replace(searchValue: RegExp, replaceValue: string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
            * @param replaceValue A function that returns the replacement text.
            */
          replace(searchValue: RegExp, replaceValue: (substring: string, ...args: any[]) => string): string;
      
          /**
            * Finds the first substring match in a regular expression search.
            * @param regexp The regular expression pattern and applicable flags. 
            */
          search(regexp: string): number;
      
          /**
            * Finds the first substring match in a regular expression search.
            * @param regexp The regular expression pattern and applicable flags. 
            */
          search(regexp: RegExp): number;
      
          /**
            * Returns a section of a string.
            * @param start The index to the beginning of the specified portion of stringObj. 
            * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end. 
            * If this value is not specified, the substring continues to the end of stringObj.
            */
          slice(start?: number, end?: number): string;
      
          /**
            * Split a string into substrings using the specified separator and return them as an array.
            * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned. 
            * @param limit A value used to limit the number of elements returned in the array.
            */
          split(separator: string, limit?: number): string[];
      
          /**
            * Split a string into substrings using the specified separator and return them as an array.
            * @param separator A Regular Express that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned. 
            * @param limit A value used to limit the number of elements returned in the array.
            */
          split(separator: RegExp, limit?: number): string[];
      
          /**
            * Returns the substring at the specified location within a String object. 
            * @param start The zero-based index number indicating the beginning of the substring.
            * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.
            * If end is omitted, the characters from start through the end of the original string are returned.
            */
          substring(start: number, end?: number): string;
      
          /** Converts all the alphabetic characters in a string to lowercase. */
          toLowerCase(): string;
      
          /** Converts all alphabetic characters to lowercase, taking into account the host environment's current locale. */
          toLocaleLowerCase(): string;
      
          /** Converts all the alphabetic characters in a string to uppercase. */
          toUpperCase(): string;
      
          /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment's current locale. */
          toLocaleUpperCase(): string;
      
          /** Removes the leading and trailing white space and line terminator characters from a string. */
          trim(): string;
      
          /** Returns the length of a String object. */
          length: number;
      
          // IE extensions
          /**
            * Gets a substring beginning at the specified location and having the specified length.
            * @param from The starting position of the desired substring. The index of the first character in the string is zero.
            * @param length The number of characters to include in the returned substring.
            */
          substr(from: number, length?: number): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): string;
      
          [index: number]: string;
      }
      
      interface StringConstructor {
          new (value?: any): String;
          (value?: any): string;
          prototype: String;
          fromCharCode(...codes: number[]): string;
      }
      
      /** 
        * Allows manipulation and formatting of text strings and determination and location of substrings within strings. 
        */
      declare var String: StringConstructor;
      
      interface Boolean {
          /** Returns the primitive value of the specified object. */
          valueOf(): boolean;
      }
      
      interface BooleanConstructor {
          new (value?: any): Boolean;
          (value?: any): boolean;
          prototype: Boolean;
      }
      
      declare var Boolean: BooleanConstructor;
      
      interface Number {
          /**
            * Returns a string representation of an object.
            * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.
            */
          toString(radix?: number): string;
      
          /** 
            * Returns a string representing a number in fixed-point notation.
            * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
            */
          toFixed(fractionDigits?: number): string;
      
          /**
            * Returns a string containing a number represented in exponential notation.
            * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
            */
          toExponential(fractionDigits?: number): string;
      
          /**
            * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.
            * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.
            */
          toPrecision(precision?: number): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): number;
      }
      
      interface NumberConstructor {
          new (value?: any): Number;
          (value?: any): number;
          prototype: Number;
      
          /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */
          MAX_VALUE: number;
      
          /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */
          MIN_VALUE: number;
      
          /** 
            * A value that is not a number.
            * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.
            */
          NaN: number;
      
          /** 
            * A value that is less than the largest negative number that can be represented in JavaScript.
            * JavaScript displays NEGATIVE_INFINITY values as -infinity. 
            */
          NEGATIVE_INFINITY: number;
      
          /**
            * A value greater than the largest number that can be represented in JavaScript. 
            * JavaScript displays POSITIVE_INFINITY values as infinity. 
            */
          POSITIVE_INFINITY: number;
      }
      
      /** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
      declare var Number: NumberConstructor;
      
      interface TemplateStringsArray extends Array<string> {
          raw: string[];
      }
      
      interface Math {
          /** The mathematical constant e. This is Euler's number, the base of natural logarithms. */
          E: number;
          /** The natural logarithm of 10. */
          LN10: number;
          /** The natural logarithm of 2. */
          LN2: number;
          /** The base-2 logarithm of e. */
          LOG2E: number;
          /** The base-10 logarithm of e. */
          LOG10E: number;
          /** Pi. This is the ratio of the circumference of a circle to its diameter. */
          PI: number;
          /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */
          SQRT1_2: number;
          /** The square root of 2. */
          SQRT2: number;
          /**
            * Returns the absolute value of a number (the value without regard to whether it is positive or negative). 
            * For example, the absolute value of -5 is the same as the absolute value of 5.
            * @param x A numeric expression for which the absolute value is needed.
            */
          abs(x: number): number;
          /**
            * Returns the arc cosine (or inverse cosine) of a number. 
            * @param x A numeric expression.
            */
          acos(x: number): number;
          /** 
            * Returns the arcsine of a number. 
            * @param x A numeric expression.
            */
          asin(x: number): number;
          /**
            * Returns the arctangent of a number. 
            * @param x A numeric expression for which the arctangent is needed.
            */
          atan(x: number): number;
          /**
            * Returns the angle (in radians) from the X axis to a point.
            * @param y A numeric expression representing the cartesian y-coordinate.
            * @param x A numeric expression representing the cartesian x-coordinate.
            */
          atan2(y: number, x: number): number;
          /**
            * Returns the smallest number greater than or equal to its numeric argument. 
            * @param x A numeric expression.
            */
          ceil(x: number): number;
          /**
            * Returns the cosine of a number. 
            * @param x A numeric expression that contains an angle measured in radians.
            */
          cos(x: number): number;
          /**
            * Returns e (the base of natural logarithms) raised to a power. 
            * @param x A numeric expression representing the power of e.
            */
          exp(x: number): number;
          /**
            * Returns the greatest number less than or equal to its numeric argument. 
            * @param x A numeric expression.
            */
          floor(x: number): number;
          /**
            * Returns the natural logarithm (base e) of a number. 
            * @param x A numeric expression.
            */
          log(x: number): number;
          /**
            * Returns the larger of a set of supplied numeric expressions. 
            * @param values Numeric expressions to be evaluated.
            */
          max(...values: number[]): number;
          /**
            * Returns the smaller of a set of supplied numeric expressions. 
            * @param values Numeric expressions to be evaluated.
            */
          min(...values: number[]): number;
          /**
            * Returns the value of a base expression taken to a specified power. 
            * @param x The base value of the expression.
            * @param y The exponent value of the expression.
            */
          pow(x: number, y: number): number;
          /** Returns a pseudorandom number between 0 and 1. */
          random(): number;
          /** 
            * Returns a supplied numeric expression rounded to the nearest number.
            * @param x The value to be rounded to the nearest number.
            */
          round(x: number): number;
          /**
            * Returns the sine of a number.
            * @param x A numeric expression that contains an angle measured in radians.
            */
          sin(x: number): number;
          /**
            * Returns the square root of a number.
            * @param x A numeric expression.
            */
          sqrt(x: number): number;
          /**
            * Returns the tangent of a number.
            * @param x A numeric expression that contains an angle measured in radians.
            */
          tan(x: number): number;
      }
      /** An intrinsic object that provides basic mathematics functionality and constants. */
      declare var Math: Math;
      
      /** Enables basic storage and retrieval of dates and times. */
      interface Date {
          /** Returns a string representation of a date. The format of the string depends on the locale. */
          toString(): string;
          /** Returns a date as a string value. */
          toDateString(): string;
          /** Returns a time as a string value. */
          toTimeString(): string;
          /** Returns a value as a string value appropriate to the host environment's current locale. */
          toLocaleString(): string;
          /** Returns a date as a string value appropriate to the host environment's current locale. */
          toLocaleDateString(): string;
          /** Returns a time as a string value appropriate to the host environment's current locale. */
          toLocaleTimeString(): string;
          /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */
          valueOf(): number;
          /** Gets the time value in milliseconds. */
          getTime(): number;
          /** Gets the year, using local time. */
          getFullYear(): number;
          /** Gets the year using Universal Coordinated Time (UTC). */
          getUTCFullYear(): number;
          /** Gets the month, using local time. */
          getMonth(): number;
          /** Gets the month of a Date object using Universal Coordinated Time (UTC). */
          getUTCMonth(): number;
          /** Gets the day-of-the-month, using local time. */
          getDate(): number;
          /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */
          getUTCDate(): number;
          /** Gets the day of the week, using local time. */
          getDay(): number;
          /** Gets the day of the week using Universal Coordinated Time (UTC). */
          getUTCDay(): number;
          /** Gets the hours in a date, using local time. */
          getHours(): number;
          /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */
          getUTCHours(): number;
          /** Gets the minutes of a Date object, using local time. */
          getMinutes(): number;
          /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */
          getUTCMinutes(): number;
          /** Gets the seconds of a Date object, using local time. */
          getSeconds(): number;
          /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */
          getUTCSeconds(): number;
          /** Gets the milliseconds of a Date, using local time. */
          getMilliseconds(): number;
          /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */
          getUTCMilliseconds(): number;
          /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */
          getTimezoneOffset(): number;
          /** 
            * Sets the date and time value in the Date object.
            * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT. 
            */
          setTime(time: number): number;
          /**
            * Sets the milliseconds value in the Date object using local time. 
            * @param ms A numeric value equal to the millisecond value.
            */
          setMilliseconds(ms: number): number;
          /** 
            * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).
            * @param ms A numeric value equal to the millisecond value. 
            */
          setUTCMilliseconds(ms: number): number;
      
          /**
            * Sets the seconds value in the Date object using local time. 
            * @param sec A numeric value equal to the seconds value.
            * @param ms A numeric value equal to the milliseconds value.
            */
          setSeconds(sec: number, ms?: number): number;
          /**
            * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).
            * @param sec A numeric value equal to the seconds value.
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCSeconds(sec: number, ms?: number): number;
          /**
            * Sets the minutes value in the Date object using local time. 
            * @param min A numeric value equal to the minutes value. 
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setMinutes(min: number, sec?: number, ms?: number): number;
          /**
            * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).
            * @param min A numeric value equal to the minutes value. 
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCMinutes(min: number, sec?: number, ms?: number): number;
          /**
            * Sets the hour value in the Date object using local time.
            * @param hours A numeric value equal to the hours value.
            * @param min A numeric value equal to the minutes value.
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setHours(hours: number, min?: number, sec?: number, ms?: number): number;
          /**
            * Sets the hours value in the Date object using Universal Coordinated Time (UTC).
            * @param hours A numeric value equal to the hours value.
            * @param min A numeric value equal to the minutes value.
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;
          /**
            * Sets the numeric day-of-the-month value of the Date object using local time. 
            * @param date A numeric value equal to the day of the month.
            */
          setDate(date: number): number;
          /** 
            * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).
            * @param date A numeric value equal to the day of the month. 
            */
          setUTCDate(date: number): number;
          /** 
            * Sets the month value in the Date object using local time. 
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. 
            * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
            */
          setMonth(month: number, date?: number): number;
          /**
            * Sets the month value in the Date object using Universal Coordinated Time (UTC).
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
            * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
            */
          setUTCMonth(month: number, date?: number): number;
          /**
            * Sets the year of the Date object using local time.
            * @param year A numeric value for the year.
            * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
            * @param date A numeric value equal for the day of the month.
            */
          setFullYear(year: number, month?: number, date?: number): number;
          /**
            * Sets the year value in the Date object using Universal Coordinated Time (UTC).
            * @param year A numeric value equal to the year.
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
            * @param date A numeric value equal to the day of the month.
            */
          setUTCFullYear(year: number, month?: number, date?: number): number;
          /** Returns a date converted to a string using Universal Coordinated Time (UTC). */
          toUTCString(): string;
          /** Returns a date as a string value in ISO format. */
          toISOString(): string;
          /** Used by the JSON.stringify method to enable the transformation of an object's data for JavaScript Object Notation (JSON) serialization. */
          toJSON(key?: any): string;
      }
      
      interface DateConstructor {
          new (): Date;
          new (value: number): Date;
          new (value: string): Date;
          new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
          (): string;
          prototype: Date;
          /**
            * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.
            * @param s A date string
            */
          parse(s: string): number;
          /**
            * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date. 
            * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.
            * @param month The month as an number between 0 and 11 (January to December).
            * @param date The date as an number between 1 and 31.
            * @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour.
            * @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes.
            * @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds.
            * @param ms An number from 0 to 999 that specifies the milliseconds.
            */
          UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
          now(): number;
      }
      
      declare var Date: DateConstructor;
      
      interface RegExpMatchArray extends Array<string> {
          index?: number;
          input?: string;
      }
      
      interface RegExpExecArray extends Array<string> {
          index: number;
          input: string;
      }
      
      interface RegExp {
          /** 
            * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.
            * @param string The String object or string literal on which to perform the search.
            */
          exec(string: string): RegExpExecArray;
      
          /** 
            * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
            * @param string String on which to perform the search.
            */
          test(string: string): boolean;
      
          /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */
          source: string;
      
          /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */
          global: boolean;
      
          /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */
          ignoreCase: boolean;
      
          /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */
          multiline: boolean;
      
          lastIndex: number;
      
          // Non-standard extensions
          compile(): RegExp;
      }
      
      interface RegExpConstructor {
          new (pattern: string, flags?: string): RegExp;
          (pattern: string, flags?: string): RegExp;
          prototype: RegExp;
      
          // Non-standard extensions
          $1: string;
          $2: string;
          $3: string;
          $4: string;
          $5: string;
          $6: string;
          $7: string;
          $8: string;
          $9: string;
          lastMatch: string;
      }
      
      declare var RegExp: RegExpConstructor;
      
      interface Error {
          name: string;
          message: string;
      }
      
      interface ErrorConstructor {
          new (message?: string): Error;
          (message?: string): Error;
          prototype: Error;
      }
      
      declare var Error: ErrorConstructor;
      
      interface EvalError extends Error {
      }
      
      interface EvalErrorConstructor {
          new (message?: string): EvalError;
          (message?: string): EvalError;
          prototype: EvalError;
      }
      
      declare var EvalError: EvalErrorConstructor;
      
      interface RangeError extends Error {
      }
      
      interface RangeErrorConstructor {
          new (message?: string): RangeError;
          (message?: string): RangeError;
          prototype: RangeError;
      }
      
      declare var RangeError: RangeErrorConstructor;
      
      interface ReferenceError extends Error {
      }
      
      interface ReferenceErrorConstructor {
          new (message?: string): ReferenceError;
          (message?: string): ReferenceError;
          prototype: ReferenceError;
      }
      
      declare var ReferenceError: ReferenceErrorConstructor;
      
      interface SyntaxError extends Error {
      }
      
      interface SyntaxErrorConstructor {
          new (message?: string): SyntaxError;
          (message?: string): SyntaxError;
          prototype: SyntaxError;
      }
      
      declare var SyntaxError: SyntaxErrorConstructor;
      
      interface TypeError extends Error {
      }
      
      interface TypeErrorConstructor {
          new (message?: string): TypeError;
          (message?: string): TypeError;
          prototype: TypeError;
      }
      
      declare var TypeError: TypeErrorConstructor;
      
      interface URIError extends Error {
      }
      
      interface URIErrorConstructor {
          new (message?: string): URIError;
          (message?: string): URIError;
          prototype: URIError;
      }
      
      declare var URIError: URIErrorConstructor;
      
      interface JSON {
          /**
            * Converts a JavaScript Object Notation (JSON) string into an object.
            * @param text A valid JSON string.
            * @param reviver A function that transforms the results. This function is called for each member of the object. 
            * If a member contains nested objects, the nested objects are transformed before the parent object is. 
            */
          parse(text: string, reviver?: (key: any, value: any) => any): any;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            */
          stringify(value: any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer A function that transforms the results.
            */
          stringify(value: any, replacer: (key: string, value: any) => any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer Array that transforms the results.
            */
          stringify(value: any, replacer: any[]): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer A function that transforms the results.
            * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
            */
          stringify(value: any, replacer: (key: string, value: any) => any, space: any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer Array that transforms the results.
            * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
            */
          stringify(value: any, replacer: any[], space: any): string;
      }
      /**
        * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
        */
      declare var JSON: JSON;
      
      
      /////////////////////////////
      /// ECMAScript Array API (specially handled by compiler)
      /////////////////////////////
      
      interface Array<T> {
          /**
            * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
            */
          length: number;
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
          toLocaleString(): string;
          /**
            * Appends new elements to an array, and returns the new length of the array.
            * @param items New elements of the Array.
            */
          push(...items: T[]): number;
          /**
            * Removes the last element from an array and returns it.
            */
          pop(): T;
          /**
            * Combines two or more arrays.
            * @param items Additional items to add to the end of array1.
            */
          concat<U extends T[]>(...items: U[]): T[];
          /**
            * Combines two or more arrays.
            * @param items Additional items to add to the end of array1.
            */
          concat(...items: T[]): T[];
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): T[];
          /**
            * Removes the first element from an array and returns it.
            */
          shift(): T;
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): T[];
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: T, b: T) => number): T[];
      
          /**
            * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
            * @param start The zero-based location in the array from which to start removing elements.
            */
          splice(start: number): T[];
      
          /**
            * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
            * @param start The zero-based location in the array from which to start removing elements.
            * @param deleteCount The number of elements to remove.
            * @param items Elements to insert into the array in place of the deleted elements.
            */
          splice(start: number, deleteCount: number, ...items: T[]): T[];
      
          /**
            * Inserts new elements at the start of an array.
            * @param items  Elements to insert at the start of the Array.
            */
          unshift(...items: T[]): number;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
            */
          indexOf(searchElement: T, fromIndex?: number): number;
      
          /**
            * Returns the index of the last occurrence of a specified value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.
            */
          lastIndexOf(searchElement: T, fromIndex?: number): number;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[];
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
          /**
            * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
      
          [n: number]: T;
      }
      
      interface ArrayConstructor {
          new (arrayLength?: number): any[];
          new <T>(arrayLength: number): T[];
          new <T>(...items: T[]): T[];
          (arrayLength?: number): any[];
          <T>(arrayLength: number): T[];
          <T>(...items: T[]): T[];
          isArray(arg: any): boolean;
          prototype: Array<any>;
      }
      
      declare var Array: ArrayConstructor;
      
      interface TypedPropertyDescriptor<T> {
          enumerable?: boolean;
          configurable?: boolean;
          writable?: boolean;
          value?: T;
          get?: () => T;
          set?: (value: T) => void;
      }
      
      declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
      declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
      declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
      declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
      
      /////////////////////////////
      /// IE10 ECMAScript Extensions
      /////////////////////////////
      
      /**
        * Represents a raw buffer of binary data, which is used to store data for the 
        * different typed arrays. ArrayBuffers cannot be read from or written to directly, 
        * but can be passed to a typed array or DataView Object to interpret the raw 
        * buffer as needed. 
        */
      interface ArrayBuffer {
          /**
            * Read-only. The length of the ArrayBuffer (in bytes).
            */
          byteLength: number;
      
          /**
            * Returns a section of an ArrayBuffer.
            */
          slice(begin:number, end?:number): ArrayBuffer;
      }
      
      interface ArrayBufferConstructor {
          prototype: ArrayBuffer;
          new (byteLength: number): ArrayBuffer;
          isView(arg: any): boolean;
      }
      declare var ArrayBuffer: ArrayBufferConstructor;
      
      interface ArrayBufferView {
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      }
      
      interface DataView {
          buffer: ArrayBuffer;
          byteLength: number;
          byteOffset: number;
          /**
            * Gets the Float32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getFloat32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Float64 value at the specified byte offset from the start of the view. There is
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getFloat64(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Int8 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt8(byteOffset: number): number;
      
          /**
            * Gets the Int16 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt16(byteOffset: number, littleEndian: boolean): number;
          /**
            * Gets the Int32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Uint8 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint8(byteOffset: number): number;
      
          /**
            * Gets the Uint16 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint16(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Uint32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Stores an Float32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setFloat32(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Float64 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setFloat64(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Int8 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            */
          setInt8(byteOffset: number, value: number): void;
      
          /**
            * Stores an Int16 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setInt16(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Int32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setInt32(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Uint8 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            */
          setUint8(byteOffset: number, value: number): void;
      
          /**
            * Stores an Uint16 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setUint16(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Uint32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setUint32(byteOffset: number, value: number, littleEndian: boolean): void;
      }
      
      interface DataViewConstructor {
          new (buffer: ArrayBuffer, byteOffset?: number, byteLength?: number): DataView;
      }
      declare var DataView: DataViewConstructor;
      
      /**
        * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested 
        * number of bytes could not be allocated an exception is raised.
        */
      interface Int8Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int8Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int8Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): Int8Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int8Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int8Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int8Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int8Array;
      
          /**
            * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int8Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      interface Int8ArrayConstructor {
          prototype: Int8Array;
          new (length: number): Int8Array;
          new (array: Int8Array): Int8Array;
          new (array: number[]): Int8Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int8Array;
      }
      declare var Int8Array: Int8ArrayConstructor;
      
      /**
        * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint8Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint8Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint8Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): Uint8Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint8Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint8Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint8Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint8Array;
      
          /**
            * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint8Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint8ArrayConstructor {
          prototype: Uint8Array;
          new (length: number): Uint8Array;
          new (array: Uint8Array): Uint8Array;
          new (array: number[]): Uint8Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint8Array;
      }
      declare var Uint8Array: Uint8ArrayConstructor;
      
      /**
        * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Int16Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int16Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int16Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): Int16Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int16Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int16Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int16Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int16Array;
      
          /**
            * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int16Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Int16ArrayConstructor {
          prototype: Int16Array;
          new (length: number): Int16Array;
          new (array: Int16Array): Int16Array;
          new (array: number[]): Int16Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int16Array;
      }
      declare var Int16Array: Int16ArrayConstructor;
      
      /**
        * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint16Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint16Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint16Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): Uint16Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint16Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint16Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint16Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint16Array;
      
          /**
            * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint16Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint16ArrayConstructor {
          prototype: Uint16Array;
          new (length: number): Uint16Array;
          new (array: Uint16Array): Uint16Array;
          new (array: number[]): Uint16Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint16Array;
      }
      declare var Uint16Array: Uint16ArrayConstructor;
      /**
        * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Int32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): Int32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int32Array;
      
          /**
            * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Int32ArrayConstructor {
          prototype: Int32Array;
          new (length: number): Int32Array;
          new (array: Int32Array): Int32Array;
          new (array: number[]): Int32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int32Array;
      }
      declare var Int32Array: Int32ArrayConstructor;
      
      /**
        * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): Uint32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint32Array;
      
          /**
            * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint32ArrayConstructor {
          prototype: Uint32Array;
          new (length: number): Uint32Array;
          new (array: Uint32Array): Uint32Array;
          new (array: number[]): Uint32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint32Array;
      }
      declare var Uint32Array: Uint32ArrayConstructor;
      
      /**
        * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number
        * of bytes could not be allocated an exception is raised.
        */
      interface Float32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Float32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Float32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): Float32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Float32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Float32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Float32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Float32Array;
      
          /**
            * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Float32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Float32ArrayConstructor {
          prototype: Float32Array;
          new (length: number): Float32Array;
          new (array: Float32Array): Float32Array;
          new (array: number[]): Float32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Float32Array;
      }
      declare var Float32Array: Float32ArrayConstructor;
      
      /**
        * A typed array of 64-bit float values. The contents are initialized to 0. If the requested 
        * number of bytes could not be allocated an exception is raised.
        */
      interface Float64Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Float64Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Float64Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): Float64Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Float64Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Float64Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Float64Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Float64Array;
      
          /**
            * Gets a new Float64Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Float64Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Float64ArrayConstructor {
          prototype: Float64Array;
          new (length: number): Float64Array;
          new (array: Float64Array): Float64Array;
          new (array: number[]): Float64Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Float64Array;
      }
      declare var Float64Array: Float64ArrayConstructor;/////////////////////////////
      /// ECMAScript Internationalization API 
      /////////////////////////////
      
      declare module Intl {
          interface CollatorOptions {
              usage?: string;
              localeMatcher?: string;
              numeric?: boolean;
              caseFirst?: string;
              sensitivity?: string;
              ignorePunctuation?: boolean;
          }
      
          interface ResolvedCollatorOptions {
              locale: string;
              usage: string;
              sensitivity: string;
              ignorePunctuation: boolean;
              collation: string;
              caseFirst: string;
              numeric: boolean;
          }
      
          interface Collator {
              compare(x: string, y: string): number;
              resolvedOptions(): ResolvedCollatorOptions;
          }
          var Collator: {
              new (locales?: string[], options?: CollatorOptions): Collator;
              new (locale?: string, options?: CollatorOptions): Collator;
              (locales?: string[], options?: CollatorOptions): Collator;
              (locale?: string, options?: CollatorOptions): Collator;
              supportedLocalesOf(locales: string[], options?: CollatorOptions): string[];
              supportedLocalesOf(locale: string, options?: CollatorOptions): string[];
          }
      
          interface NumberFormatOptions {
              localeMatcher?: string;
              style?: string;
              currency?: string;
              currencyDisplay?: string;
              useGrouping?: boolean;
          }
      
          interface ResolvedNumberFormatOptions {
              locale: string;
              numberingSystem: string;
              style: string;
              currency?: string;
              currencyDisplay?: string;
              minimumintegerDigits: number;
              minimumFractionDigits: number;
              maximumFractionDigits: number;
              minimumSignificantDigits?: number;
              maximumSignificantDigits?: number;
              useGrouping: boolean;
          }
      
          interface NumberFormat {
              format(value: number): string;
              resolvedOptions(): ResolvedNumberFormatOptions;
          }
          var NumberFormat: {
              new (locales?: string[], options?: NumberFormatOptions): Collator;
              new (locale?: string, options?: NumberFormatOptions): Collator;
              (locales?: string[], options?: NumberFormatOptions): Collator;
              (locale?: string, options?: NumberFormatOptions): Collator;
              supportedLocalesOf(locales: string[], options?: NumberFormatOptions): string[];
              supportedLocalesOf(locale: string, options?: NumberFormatOptions): string[];
          }
      
          interface DateTimeFormatOptions {
              localeMatcher?: string;
              weekday?: string;
              era?: string;
              year?: string;
              month?: string;
              day?: string;
              hour?: string;
              minute?: string;
              second?: string;
              timeZoneName?: string;
              formatMatcher?: string;
              hour12?: boolean;
          }
      
          interface ResolvedDateTimeFormatOptions {
              locale: string;
              calendar: string;
              numberingSystem: string;
              timeZone: string;
              hour12?: boolean;
              weekday?: string;
              era?: string;
              year?: string;
              month?: string;
              day?: string;
              hour?: string;
              minute?: string;
              second?: string;
              timeZoneName?: string;
          }
      
          interface DateTimeFormat {
              format(date: number): string;
              resolvedOptions(): ResolvedDateTimeFormatOptions;
          }
          var DateTimeFormat: {
              new (locales?: string[], options?: DateTimeFormatOptions): Collator;
              new (locale?: string, options?: DateTimeFormatOptions): Collator;
              (locales?: string[], options?: DateTimeFormatOptions): Collator;
              (locale?: string, options?: DateTimeFormatOptions): Collator;
              supportedLocalesOf(locales: string[], options?: DateTimeFormatOptions): string[];
              supportedLocalesOf(locale: string, options?: DateTimeFormatOptions): string[];
          }
      }
      
      interface String {
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
            * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
            */
          localeCompare(that: string, locales: string[], options?: Intl.CollatorOptions): number;
      
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
            * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
            */
          localeCompare(that: string, locale: string, options?: Intl.CollatorOptions): number;
      }
      
      interface Number {
          /**
            * Converts a number to a string by using the current or specified locale. 
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locales?: string[], options?: Intl.NumberFormatOptions): string;
      
          /**
            * Converts a number to a string by using the current or specified locale. 
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locale?: string, options?: Intl.NumberFormatOptions): string;
      }
      
      interface Date {
          /**
            * Converts a date to a string by using the current or specified locale.  
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locales?: string[], options?: Intl.DateTimeFormatOptions): string;
      
          /**
            * Converts a date to a string by using the current or specified locale.  
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locale?: string, options?: Intl.DateTimeFormatOptions): string;
      }
      
      
      /////////////////////////////
      /// IE DOM APIs
      /////////////////////////////
      
      interface Algorithm {
          name?: string;
      }
      
      interface AriaRequestEventInit extends EventInit {
          attributeName?: string;
          attributeValue?: string;
      }
      
      interface ClipboardEventInit extends EventInit {
          data?: string;
          dataType?: string;
      }
      
      interface CommandEventInit extends EventInit {
          commandName?: string;
          detail?: string;
      }
      
      interface CompositionEventInit extends UIEventInit {
          data?: string;
      }
      
      interface ConfirmSiteSpecificExceptionsInformation extends ExceptionInformation {
          arrayOfDomainStrings?: string[];
      }
      
      interface CustomEventInit extends EventInit {
          detail?: any;
      }
      
      interface DeviceAccelerationDict {
          x?: number;
          y?: number;
          z?: number;
      }
      
      interface DeviceRotationRateDict {
          alpha?: number;
          beta?: number;
          gamma?: number;
      }
      
      interface EventInit {
          bubbles?: boolean;
          cancelable?: boolean;
      }
      
      interface ExceptionInformation {
          domain?: string;
      }
      
      interface FocusEventInit extends UIEventInit {
          relatedTarget?: EventTarget;
      }
      
      interface HashChangeEventInit extends EventInit {
          newURL?: string;
          oldURL?: string;
      }
      
      interface KeyAlgorithm {
          name?: string;
      }
      
      interface KeyboardEventInit extends SharedKeyboardAndMouseEventInit {
          key?: string;
          location?: number;
          repeat?: boolean;
      }
      
      interface MouseEventInit extends SharedKeyboardAndMouseEventInit {
          screenX?: number;
          screenY?: number;
          clientX?: number;
          clientY?: number;
          button?: number;
          buttons?: number;
          relatedTarget?: EventTarget;
      }
      
      interface MsZoomToOptions {
          contentX?: number;
          contentY?: number;
          viewportX?: string;
          viewportY?: string;
          scaleFactor?: number;
          animate?: string;
      }
      
      interface MutationObserverInit {
          childList?: boolean;
          attributes?: boolean;
          characterData?: boolean;
          subtree?: boolean;
          attributeOldValue?: boolean;
          characterDataOldValue?: boolean;
          attributeFilter?: string[];
      }
      
      interface ObjectURLOptions {
          oneTimeOnly?: boolean;
      }
      
      interface PointerEventInit extends MouseEventInit {
          pointerId?: number;
          width?: number;
          height?: number;
          pressure?: number;
          tiltX?: number;
          tiltY?: number;
          pointerType?: string;
          isPrimary?: boolean;
      }
      
      interface PositionOptions {
          enableHighAccuracy?: boolean;
          timeout?: number;
          maximumAge?: number;
      }
      
      interface SharedKeyboardAndMouseEventInit extends UIEventInit {
          ctrlKey?: boolean;
          shiftKey?: boolean;
          altKey?: boolean;
          metaKey?: boolean;
          keyModifierStateAltGraph?: boolean;
          keyModifierStateCapsLock?: boolean;
          keyModifierStateFn?: boolean;
          keyModifierStateFnLock?: boolean;
          keyModifierStateHyper?: boolean;
          keyModifierStateNumLock?: boolean;
          keyModifierStateOS?: boolean;
          keyModifierStateScrollLock?: boolean;
          keyModifierStateSuper?: boolean;
          keyModifierStateSymbol?: boolean;
          keyModifierStateSymbolLock?: boolean;
      }
      
      interface StoreExceptionsInformation extends ExceptionInformation {
          siteName?: string;
          explanationString?: string;
          detailURI?: string;
      }
      
      interface StoreSiteSpecificExceptionsInformation extends StoreExceptionsInformation {
          arrayOfDomainStrings?: string[];
      }
      
      interface UIEventInit extends EventInit {
          view?: Window;
          detail?: number;
      }
      
      interface WebGLContextAttributes {
          alpha?: boolean;
          depth?: boolean;
          stencil?: boolean;
          antialias?: boolean;
          premultipliedAlpha?: boolean;
          preserveDrawingBuffer?: boolean;
      }
      
      interface WebGLContextEventInit extends EventInit {
          statusMessage?: string;
      }
      
      interface WheelEventInit extends MouseEventInit {
          deltaX?: number;
          deltaY?: number;
          deltaZ?: number;
          deltaMode?: number;
      }
      
      interface EventListener {
          (evt: Event): void;
      }
      
      interface ANGLE_instanced_arrays {
          drawArraysInstancedANGLE(mode: number, first: number, count: number, primcount: number): void;
          drawElementsInstancedANGLE(mode: number, count: number, type: number, offset: number, primcount: number): void;
          vertexAttribDivisorANGLE(index: number, divisor: number): void;
          VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
      }
      
      declare var ANGLE_instanced_arrays: {
          prototype: ANGLE_instanced_arrays;
          new(): ANGLE_instanced_arrays;
          VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
      }
      
      interface AnalyserNode extends AudioNode {
          fftSize: number;
          frequencyBinCount: number;
          maxDecibels: number;
          minDecibels: number;
          smoothingTimeConstant: number;
          getByteFrequencyData(array: Uint8Array): void;
          getByteTimeDomainData(array: Uint8Array): void;
          getFloatFrequencyData(array: any): void;
          getFloatTimeDomainData(array: any): void;
      }
      
      declare var AnalyserNode: {
          prototype: AnalyserNode;
          new(): AnalyserNode;
      }
      
      interface AnimationEvent extends Event {
          animationName: string;
          elapsedTime: number;
          initAnimationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, animationNameArg: string, elapsedTimeArg: number): void;
      }
      
      declare var AnimationEvent: {
          prototype: AnimationEvent;
          new(): AnimationEvent;
      }
      
      interface ApplicationCache extends EventTarget {
          oncached: (ev: Event) => any;
          onchecking: (ev: Event) => any;
          ondownloading: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onnoupdate: (ev: Event) => any;
          onobsolete: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          onupdateready: (ev: Event) => any;
          status: number;
          abort(): void;
          swapCache(): void;
          update(): void;
          CHECKING: number;
          DOWNLOADING: number;
          IDLE: number;
          OBSOLETE: number;
          UNCACHED: number;
          UPDATEREADY: number;
          addEventListener(type: "cached", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "checking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "downloading", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "noupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "obsolete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "updateready", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var ApplicationCache: {
          prototype: ApplicationCache;
          new(): ApplicationCache;
          CHECKING: number;
          DOWNLOADING: number;
          IDLE: number;
          OBSOLETE: number;
          UNCACHED: number;
          UPDATEREADY: number;
      }
      
      interface AriaRequestEvent extends Event {
          attributeName: string;
          attributeValue: string;
      }
      
      declare var AriaRequestEvent: {
          prototype: AriaRequestEvent;
          new(type: string, eventInitDict?: AriaRequestEventInit): AriaRequestEvent;
      }
      
      interface Attr extends Node {
          name: string;
          ownerElement: Element;
          specified: boolean;
          value: string;
      }
      
      declare var Attr: {
          prototype: Attr;
          new(): Attr;
      }
      
      interface AudioBuffer {
          duration: number;
          length: number;
          numberOfChannels: number;
          sampleRate: number;
          getChannelData(channel: number): any;
      }
      
      declare var AudioBuffer: {
          prototype: AudioBuffer;
          new(): AudioBuffer;
      }
      
      interface AudioBufferSourceNode extends AudioNode {
          buffer: AudioBuffer;
          loop: boolean;
          loopEnd: number;
          loopStart: number;
          onended: (ev: Event) => any;
          playbackRate: AudioParam;
          start(when?: number, offset?: number, duration?: number): void;
          stop(when?: number): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var AudioBufferSourceNode: {
          prototype: AudioBufferSourceNode;
          new(): AudioBufferSourceNode;
      }
      
      interface AudioContext extends EventTarget {
          currentTime: number;
          destination: AudioDestinationNode;
          listener: AudioListener;
          sampleRate: number;
          createAnalyser(): AnalyserNode;
          createBiquadFilter(): BiquadFilterNode;
          createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
          createBufferSource(): AudioBufferSourceNode;
          createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
          createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;
          createConvolver(): ConvolverNode;
          createDelay(maxDelayTime?: number): DelayNode;
          createDynamicsCompressor(): DynamicsCompressorNode;
          createGain(): GainNode;
          createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
          createOscillator(): OscillatorNode;
          createPanner(): PannerNode;
          createPeriodicWave(real: any, imag: any): PeriodicWave;
          createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
          createStereoPanner(): StereoPannerNode;
          createWaveShaper(): WaveShaperNode;
          decodeAudioData(audioData: ArrayBuffer, successCallback: DecodeSuccessCallback, errorCallback?: DecodeErrorCallback): void;
      }
      
      declare var AudioContext: {
          prototype: AudioContext;
          new(): AudioContext;
      }
      
      interface AudioDestinationNode extends AudioNode {
          maxChannelCount: number;
      }
      
      declare var AudioDestinationNode: {
          prototype: AudioDestinationNode;
          new(): AudioDestinationNode;
      }
      
      interface AudioListener {
          dopplerFactor: number;
          speedOfSound: number;
          setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
          setPosition(x: number, y: number, z: number): void;
          setVelocity(x: number, y: number, z: number): void;
      }
      
      declare var AudioListener: {
          prototype: AudioListener;
          new(): AudioListener;
      }
      
      interface AudioNode extends EventTarget {
          channelCount: number;
          channelCountMode: string;
          channelInterpretation: string;
          context: AudioContext;
          numberOfInputs: number;
          numberOfOutputs: number;
          connect(destination: AudioNode, output?: number, input?: number): void;
          disconnect(output?: number): void;
      }
      
      declare var AudioNode: {
          prototype: AudioNode;
          new(): AudioNode;
      }
      
      interface AudioParam {
          defaultValue: number;
          value: number;
          cancelScheduledValues(startTime: number): void;
          exponentialRampToValueAtTime(value: number, endTime: number): void;
          linearRampToValueAtTime(value: number, endTime: number): void;
          setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
          setValueAtTime(value: number, startTime: number): void;
          setValueCurveAtTime(values: any, startTime: number, duration: number): void;
      }
      
      declare var AudioParam: {
          prototype: AudioParam;
          new(): AudioParam;
      }
      
      interface AudioProcessingEvent extends Event {
          inputBuffer: AudioBuffer;
          outputBuffer: AudioBuffer;
          playbackTime: number;
      }
      
      declare var AudioProcessingEvent: {
          prototype: AudioProcessingEvent;
          new(): AudioProcessingEvent;
      }
      
      interface AudioTrack {
          enabled: boolean;
          id: string;
          kind: string;
          label: string;
          language: string;
          sourceBuffer: SourceBuffer;
      }
      
      declare var AudioTrack: {
          prototype: AudioTrack;
          new(): AudioTrack;
      }
      
      interface AudioTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          onchange: (ev: Event) => any;
          onremovetrack: (ev: TrackEvent) => any;
          getTrackById(id: string): AudioTrack;
          item(index: number): AudioTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: AudioTrack;
      }
      
      declare var AudioTrackList: {
          prototype: AudioTrackList;
          new(): AudioTrackList;
      }
      
      interface BarProp {
          visible: boolean;
      }
      
      declare var BarProp: {
          prototype: BarProp;
          new(): BarProp;
      }
      
      interface BeforeUnloadEvent extends Event {
          returnValue: any;
      }
      
      declare var BeforeUnloadEvent: {
          prototype: BeforeUnloadEvent;
          new(): BeforeUnloadEvent;
      }
      
      interface BiquadFilterNode extends AudioNode {
          Q: AudioParam;
          detune: AudioParam;
          frequency: AudioParam;
          gain: AudioParam;
          type: string;
          getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
      }
      
      declare var BiquadFilterNode: {
          prototype: BiquadFilterNode;
          new(): BiquadFilterNode;
      }
      
      interface Blob {
          size: number;
          type: string;
          msClose(): void;
          msDetachStream(): any;
          slice(start?: number, end?: number, contentType?: string): Blob;
      }
      
      declare var Blob: {
          prototype: Blob;
          new (blobParts?: any[], options?: BlobPropertyBag): Blob;
      }
      
      interface CDATASection extends Text {
      }
      
      declare var CDATASection: {
          prototype: CDATASection;
          new(): CDATASection;
      }
      
      interface CSS {
          supports(property: string, value?: string): boolean;
      }
      declare var CSS: CSS;
      
      interface CSSConditionRule extends CSSGroupingRule {
          conditionText: string;
      }
      
      declare var CSSConditionRule: {
          prototype: CSSConditionRule;
          new(): CSSConditionRule;
      }
      
      interface CSSFontFaceRule extends CSSRule {
          style: CSSStyleDeclaration;
      }
      
      declare var CSSFontFaceRule: {
          prototype: CSSFontFaceRule;
          new(): CSSFontFaceRule;
      }
      
      interface CSSGroupingRule extends CSSRule {
          cssRules: CSSRuleList;
          deleteRule(index?: number): void;
          insertRule(rule: string, index?: number): number;
      }
      
      declare var CSSGroupingRule: {
          prototype: CSSGroupingRule;
          new(): CSSGroupingRule;
      }
      
      interface CSSImportRule extends CSSRule {
          href: string;
          media: MediaList;
          styleSheet: CSSStyleSheet;
      }
      
      declare var CSSImportRule: {
          prototype: CSSImportRule;
          new(): CSSImportRule;
      }
      
      interface CSSKeyframeRule extends CSSRule {
          keyText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSKeyframeRule: {
          prototype: CSSKeyframeRule;
          new(): CSSKeyframeRule;
      }
      
      interface CSSKeyframesRule extends CSSRule {
          cssRules: CSSRuleList;
          name: string;
          appendRule(rule: string): void;
          deleteRule(rule: string): void;
          findRule(rule: string): CSSKeyframeRule;
      }
      
      declare var CSSKeyframesRule: {
          prototype: CSSKeyframesRule;
          new(): CSSKeyframesRule;
      }
      
      interface CSSMediaRule extends CSSConditionRule {
          media: MediaList;
      }
      
      declare var CSSMediaRule: {
          prototype: CSSMediaRule;
          new(): CSSMediaRule;
      }
      
      interface CSSNamespaceRule extends CSSRule {
          namespaceURI: string;
          prefix: string;
      }
      
      declare var CSSNamespaceRule: {
          prototype: CSSNamespaceRule;
          new(): CSSNamespaceRule;
      }
      
      interface CSSPageRule extends CSSRule {
          pseudoClass: string;
          selector: string;
          selectorText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSPageRule: {
          prototype: CSSPageRule;
          new(): CSSPageRule;
      }
      
      interface CSSRule {
          cssText: string;
          parentRule: CSSRule;
          parentStyleSheet: CSSStyleSheet;
          type: number;
          CHARSET_RULE: number;
          FONT_FACE_RULE: number;
          IMPORT_RULE: number;
          KEYFRAMES_RULE: number;
          KEYFRAME_RULE: number;
          MEDIA_RULE: number;
          NAMESPACE_RULE: number;
          PAGE_RULE: number;
          STYLE_RULE: number;
          SUPPORTS_RULE: number;
          UNKNOWN_RULE: number;
          VIEWPORT_RULE: number;
      }
      
      declare var CSSRule: {
          prototype: CSSRule;
          new(): CSSRule;
          CHARSET_RULE: number;
          FONT_FACE_RULE: number;
          IMPORT_RULE: number;
          KEYFRAMES_RULE: number;
          KEYFRAME_RULE: number;
          MEDIA_RULE: number;
          NAMESPACE_RULE: number;
          PAGE_RULE: number;
          STYLE_RULE: number;
          SUPPORTS_RULE: number;
          UNKNOWN_RULE: number;
          VIEWPORT_RULE: number;
      }
      
      interface CSSRuleList {
          length: number;
          item(index: number): CSSRule;
          [index: number]: CSSRule;
      }
      
      declare var CSSRuleList: {
          prototype: CSSRuleList;
          new(): CSSRuleList;
      }
      
      interface CSSStyleDeclaration {
          alignContent: string;
          alignItems: string;
          alignSelf: string;
          alignmentBaseline: string;
          animation: string;
          animationDelay: string;
          animationDirection: string;
          animationDuration: string;
          animationFillMode: string;
          animationIterationCount: string;
          animationName: string;
          animationPlayState: string;
          animationTimingFunction: string;
          backfaceVisibility: string;
          background: string;
          backgroundAttachment: string;
          backgroundClip: string;
          backgroundColor: string;
          backgroundImage: string;
          backgroundOrigin: string;
          backgroundPosition: string;
          backgroundPositionX: string;
          backgroundPositionY: string;
          backgroundRepeat: string;
          backgroundSize: string;
          baselineShift: string;
          border: string;
          borderBottom: string;
          borderBottomColor: string;
          borderBottomLeftRadius: string;
          borderBottomRightRadius: string;
          borderBottomStyle: string;
          borderBottomWidth: string;
          borderCollapse: string;
          borderColor: string;
          borderImage: string;
          borderImageOutset: string;
          borderImageRepeat: string;
          borderImageSlice: string;
          borderImageSource: string;
          borderImageWidth: string;
          borderLeft: string;
          borderLeftColor: string;
          borderLeftStyle: string;
          borderLeftWidth: string;
          borderRadius: string;
          borderRight: string;
          borderRightColor: string;
          borderRightStyle: string;
          borderRightWidth: string;
          borderSpacing: string;
          borderStyle: string;
          borderTop: string;
          borderTopColor: string;
          borderTopLeftRadius: string;
          borderTopRightRadius: string;
          borderTopStyle: string;
          borderTopWidth: string;
          borderWidth: string;
          bottom: string;
          boxShadow: string;
          boxSizing: string;
          breakAfter: string;
          breakBefore: string;
          breakInside: string;
          captionSide: string;
          clear: string;
          clip: string;
          clipPath: string;
          clipRule: string;
          color: string;
          colorInterpolationFilters: string;
          columnCount: any;
          columnFill: string;
          columnGap: any;
          columnRule: string;
          columnRuleColor: any;
          columnRuleStyle: string;
          columnRuleWidth: any;
          columnSpan: string;
          columnWidth: any;
          columns: string;
          content: string;
          counterIncrement: string;
          counterReset: string;
          cssFloat: string;
          cssText: string;
          cursor: string;
          direction: string;
          display: string;
          dominantBaseline: string;
          emptyCells: string;
          enableBackground: string;
          fill: string;
          fillOpacity: string;
          fillRule: string;
          filter: string;
          flex: string;
          flexBasis: string;
          flexDirection: string;
          flexFlow: string;
          flexGrow: string;
          flexShrink: string;
          flexWrap: string;
          floodColor: string;
          floodOpacity: string;
          font: string;
          fontFamily: string;
          fontFeatureSettings: string;
          fontSize: string;
          fontSizeAdjust: string;
          fontStretch: string;
          fontStyle: string;
          fontVariant: string;
          fontWeight: string;
          glyphOrientationHorizontal: string;
          glyphOrientationVertical: string;
          height: string;
          imeMode: string;
          justifyContent: string;
          kerning: string;
          left: string;
          length: number;
          letterSpacing: string;
          lightingColor: string;
          lineHeight: string;
          listStyle: string;
          listStyleImage: string;
          listStylePosition: string;
          listStyleType: string;
          margin: string;
          marginBottom: string;
          marginLeft: string;
          marginRight: string;
          marginTop: string;
          marker: string;
          markerEnd: string;
          markerMid: string;
          markerStart: string;
          mask: string;
          maxHeight: string;
          maxWidth: string;
          minHeight: string;
          minWidth: string;
          msContentZoomChaining: string;
          msContentZoomLimit: string;
          msContentZoomLimitMax: any;
          msContentZoomLimitMin: any;
          msContentZoomSnap: string;
          msContentZoomSnapPoints: string;
          msContentZoomSnapType: string;
          msContentZooming: string;
          msFlowFrom: string;
          msFlowInto: string;
          msFontFeatureSettings: string;
          msGridColumn: any;
          msGridColumnAlign: string;
          msGridColumnSpan: any;
          msGridColumns: string;
          msGridRow: any;
          msGridRowAlign: string;
          msGridRowSpan: any;
          msGridRows: string;
          msHighContrastAdjust: string;
          msHyphenateLimitChars: string;
          msHyphenateLimitLines: any;
          msHyphenateLimitZone: any;
          msHyphens: string;
          msImeAlign: string;
          msOverflowStyle: string;
          msScrollChaining: string;
          msScrollLimit: string;
          msScrollLimitXMax: any;
          msScrollLimitXMin: any;
          msScrollLimitYMax: any;
          msScrollLimitYMin: any;
          msScrollRails: string;
          msScrollSnapPointsX: string;
          msScrollSnapPointsY: string;
          msScrollSnapType: string;
          msScrollSnapX: string;
          msScrollSnapY: string;
          msScrollTranslation: string;
          msTextCombineHorizontal: string;
          msTextSizeAdjust: any;
          msTouchAction: string;
          msTouchSelect: string;
          msUserSelect: string;
          msWrapFlow: string;
          msWrapMargin: any;
          msWrapThrough: string;
          opacity: string;
          order: string;
          orphans: string;
          outline: string;
          outlineColor: string;
          outlineStyle: string;
          outlineWidth: string;
          overflow: string;
          overflowX: string;
          overflowY: string;
          padding: string;
          paddingBottom: string;
          paddingLeft: string;
          paddingRight: string;
          paddingTop: string;
          pageBreakAfter: string;
          pageBreakBefore: string;
          pageBreakInside: string;
          parentRule: CSSRule;
          perspective: string;
          perspectiveOrigin: string;
          pointerEvents: string;
          position: string;
          quotes: string;
          right: string;
          rubyAlign: string;
          rubyOverhang: string;
          rubyPosition: string;
          stopColor: string;
          stopOpacity: string;
          stroke: string;
          strokeDasharray: string;
          strokeDashoffset: string;
          strokeLinecap: string;
          strokeLinejoin: string;
          strokeMiterlimit: string;
          strokeOpacity: string;
          strokeWidth: string;
          tableLayout: string;
          textAlign: string;
          textAlignLast: string;
          textAnchor: string;
          textDecoration: string;
          textFillColor: string;
          textIndent: string;
          textJustify: string;
          textKashida: string;
          textKashidaSpace: string;
          textOverflow: string;
          textShadow: string;
          textTransform: string;
          textUnderlinePosition: string;
          top: string;
          touchAction: string;
          transform: string;
          transformOrigin: string;
          transformStyle: string;
          transition: string;
          transitionDelay: string;
          transitionDuration: string;
          transitionProperty: string;
          transitionTimingFunction: string;
          unicodeBidi: string;
          verticalAlign: string;
          visibility: string;
          webkitAlignContent: string;
          webkitAlignItems: string;
          webkitAlignSelf: string;
          webkitAnimation: string;
          webkitAnimationDelay: string;
          webkitAnimationDirection: string;
          webkitAnimationDuration: string;
          webkitAnimationFillMode: string;
          webkitAnimationIterationCount: string;
          webkitAnimationName: string;
          webkitAnimationPlayState: string;
          webkitAnimationTimingFunction: string;
          webkitAppearance: string;
          webkitBackfaceVisibility: string;
          webkitBackground: string;
          webkitBackgroundAttachment: string;
          webkitBackgroundClip: string;
          webkitBackgroundColor: string;
          webkitBackgroundImage: string;
          webkitBackgroundOrigin: string;
          webkitBackgroundPosition: string;
          webkitBackgroundPositionX: string;
          webkitBackgroundPositionY: string;
          webkitBackgroundRepeat: string;
          webkitBackgroundSize: string;
          webkitBorderBottomLeftRadius: string;
          webkitBorderBottomRightRadius: string;
          webkitBorderImage: string;
          webkitBorderImageOutset: string;
          webkitBorderImageRepeat: string;
          webkitBorderImageSlice: string;
          webkitBorderImageSource: string;
          webkitBorderImageWidth: string;
          webkitBorderRadius: string;
          webkitBorderTopLeftRadius: string;
          webkitBorderTopRightRadius: string;
          webkitBoxAlign: string;
          webkitBoxDirection: string;
          webkitBoxFlex: string;
          webkitBoxOrdinalGroup: string;
          webkitBoxOrient: string;
          webkitBoxPack: string;
          webkitBoxSizing: string;
          webkitColumnBreakAfter: string;
          webkitColumnBreakBefore: string;
          webkitColumnBreakInside: string;
          webkitColumnCount: any;
          webkitColumnGap: any;
          webkitColumnRule: string;
          webkitColumnRuleColor: any;
          webkitColumnRuleStyle: string;
          webkitColumnRuleWidth: any;
          webkitColumnSpan: string;
          webkitColumnWidth: any;
          webkitColumns: string;
          webkitFilter: string;
          webkitFlex: string;
          webkitFlexBasis: string;
          webkitFlexDirection: string;
          webkitFlexFlow: string;
          webkitFlexGrow: string;
          webkitFlexShrink: string;
          webkitFlexWrap: string;
          webkitJustifyContent: string;
          webkitOrder: string;
          webkitPerspective: string;
          webkitPerspectiveOrigin: string;
          webkitTapHighlightColor: string;
          webkitTextFillColor: string;
          webkitTextSizeAdjust: any;
          webkitTransform: string;
          webkitTransformOrigin: string;
          webkitTransformStyle: string;
          webkitTransition: string;
          webkitTransitionDelay: string;
          webkitTransitionDuration: string;
          webkitTransitionProperty: string;
          webkitTransitionTimingFunction: string;
          webkitUserSelect: string;
          webkitWritingMode: string;
          whiteSpace: string;
          widows: string;
          width: string;
          wordBreak: string;
          wordSpacing: string;
          wordWrap: string;
          writingMode: string;
          zIndex: string;
          zoom: string;
          getPropertyPriority(propertyName: string): string;
          getPropertyValue(propertyName: string): string;
          item(index: number): string;
          removeProperty(propertyName: string): string;
          setProperty(propertyName: string, value: string, priority?: string): void;
          [index: number]: string;
      }
      
      declare var CSSStyleDeclaration: {
          prototype: CSSStyleDeclaration;
          new(): CSSStyleDeclaration;
      }
      
      interface CSSStyleRule extends CSSRule {
          readOnly: boolean;
          selectorText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSStyleRule: {
          prototype: CSSStyleRule;
          new(): CSSStyleRule;
      }
      
      interface CSSStyleSheet extends StyleSheet {
          cssRules: CSSRuleList;
          cssText: string;
          href: string;
          id: string;
          imports: StyleSheetList;
          isAlternate: boolean;
          isPrefAlternate: boolean;
          ownerRule: CSSRule;
          owningElement: Element;
          pages: StyleSheetPageList;
          readOnly: boolean;
          rules: CSSRuleList;
          addImport(bstrURL: string, lIndex?: number): number;
          addPageRule(bstrSelector: string, bstrStyle: string, lIndex?: number): number;
          addRule(bstrSelector: string, bstrStyle?: string, lIndex?: number): number;
          deleteRule(index?: number): void;
          insertRule(rule: string, index?: number): number;
          removeImport(lIndex: number): void;
          removeRule(lIndex: number): void;
      }
      
      declare var CSSStyleSheet: {
          prototype: CSSStyleSheet;
          new(): CSSStyleSheet;
      }
      
      interface CSSSupportsRule extends CSSConditionRule {
      }
      
      declare var CSSSupportsRule: {
          prototype: CSSSupportsRule;
          new(): CSSSupportsRule;
      }
      
      interface CanvasGradient {
          addColorStop(offset: number, color: string): void;
      }
      
      declare var CanvasGradient: {
          prototype: CanvasGradient;
          new(): CanvasGradient;
      }
      
      interface CanvasPattern {
      }
      
      declare var CanvasPattern: {
          prototype: CanvasPattern;
          new(): CanvasPattern;
      }
      
      interface CanvasRenderingContext2D {
          canvas: HTMLCanvasElement;
          fillStyle: any;
          font: string;
          globalAlpha: number;
          globalCompositeOperation: string;
          lineCap: string;
          lineDashOffset: number;
          lineJoin: string;
          lineWidth: number;
          miterLimit: number;
          msFillRule: string;
          msImageSmoothingEnabled: boolean;
          shadowBlur: number;
          shadowColor: string;
          shadowOffsetX: number;
          shadowOffsetY: number;
          strokeStyle: any;
          textAlign: string;
          textBaseline: string;
          arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
          arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
          beginPath(): void;
          bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
          clearRect(x: number, y: number, w: number, h: number): void;
          clip(fillRule?: string): void;
          closePath(): void;
          createImageData(imageDataOrSw: number, sh?: number): ImageData;
          createImageData(imageDataOrSw: ImageData, sh?: number): ImageData;
          createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
          createPattern(image: HTMLImageElement, repetition: string): CanvasPattern;
          createPattern(image: HTMLCanvasElement, repetition: string): CanvasPattern;
          createPattern(image: HTMLVideoElement, repetition: string): CanvasPattern;
          createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
          drawImage(image: HTMLImageElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          drawImage(image: HTMLCanvasElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          drawImage(image: HTMLVideoElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          fill(fillRule?: string): void;
          fillRect(x: number, y: number, w: number, h: number): void;
          fillText(text: string, x: number, y: number, maxWidth?: number): void;
          getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;
          getLineDash(): number[];
          isPointInPath(x: number, y: number, fillRule?: string): boolean;
          lineTo(x: number, y: number): void;
          measureText(text: string): TextMetrics;
          moveTo(x: number, y: number): void;
          putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): void;
          quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
          rect(x: number, y: number, w: number, h: number): void;
          restore(): void;
          rotate(angle: number): void;
          save(): void;
          scale(x: number, y: number): void;
          setLineDash(segments: number[]): void;
          setTransform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
          stroke(): void;
          strokeRect(x: number, y: number, w: number, h: number): void;
          strokeText(text: string, x: number, y: number, maxWidth?: number): void;
          transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
          translate(x: number, y: number): void;
      }
      
      declare var CanvasRenderingContext2D: {
          prototype: CanvasRenderingContext2D;
          new(): CanvasRenderingContext2D;
      }
      
      interface ChannelMergerNode extends AudioNode {
      }
      
      declare var ChannelMergerNode: {
          prototype: ChannelMergerNode;
          new(): ChannelMergerNode;
      }
      
      interface ChannelSplitterNode extends AudioNode {
      }
      
      declare var ChannelSplitterNode: {
          prototype: ChannelSplitterNode;
          new(): ChannelSplitterNode;
      }
      
      interface CharacterData extends Node, ChildNode {
          data: string;
          length: number;
          appendData(arg: string): void;
          deleteData(offset: number, count: number): void;
          insertData(offset: number, arg: string): void;
          replaceData(offset: number, count: number, arg: string): void;
          substringData(offset: number, count: number): string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var CharacterData: {
          prototype: CharacterData;
          new(): CharacterData;
      }
      
      interface ClientRect {
          bottom: number;
          height: number;
          left: number;
          right: number;
          top: number;
          width: number;
      }
      
      declare var ClientRect: {
          prototype: ClientRect;
          new(): ClientRect;
      }
      
      interface ClientRectList {
          length: number;
          item(index: number): ClientRect;
          [index: number]: ClientRect;
      }
      
      declare var ClientRectList: {
          prototype: ClientRectList;
          new(): ClientRectList;
      }
      
      interface ClipboardEvent extends Event {
          clipboardData: DataTransfer;
      }
      
      declare var ClipboardEvent: {
          prototype: ClipboardEvent;
          new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;
      }
      
      interface CloseEvent extends Event {
          code: number;
          reason: string;
          wasClean: boolean;
          initCloseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, wasCleanArg: boolean, codeArg: number, reasonArg: string): void;
      }
      
      declare var CloseEvent: {
          prototype: CloseEvent;
          new(): CloseEvent;
      }
      
      interface CommandEvent extends Event {
          commandName: string;
          detail: string;
      }
      
      declare var CommandEvent: {
          prototype: CommandEvent;
          new(type: string, eventInitDict?: CommandEventInit): CommandEvent;
      }
      
      interface Comment extends CharacterData {
          text: string;
      }
      
      declare var Comment: {
          prototype: Comment;
          new(): Comment;
      }
      
      interface CompositionEvent extends UIEvent {
          data: string;
          locale: string;
          initCompositionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, locale: string): void;
      }
      
      declare var CompositionEvent: {
          prototype: CompositionEvent;
          new(typeArg: string, eventInitDict?: CompositionEventInit): CompositionEvent;
      }
      
      interface Console {
          assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
          clear(): void;
          count(countTitle?: string): void;
          debug(message?: string, ...optionalParams: any[]): void;
          dir(value?: any, ...optionalParams: any[]): void;
          dirxml(value: any): void;
          error(message?: any, ...optionalParams: any[]): void;
          group(groupTitle?: string): void;
          groupCollapsed(groupTitle?: string): void;
          groupEnd(): void;
          info(message?: any, ...optionalParams: any[]): void;
          log(message?: any, ...optionalParams: any[]): void;
          msIsIndependentlyComposed(element: Element): boolean;
          profile(reportName?: string): void;
          profileEnd(): void;
          select(element: Element): void;
          time(timerName?: string): void;
          timeEnd(timerName?: string): void;
          trace(): void;
          warn(message?: any, ...optionalParams: any[]): void;
      }
      
      declare var Console: {
          prototype: Console;
          new(): Console;
      }
      
      interface ConvolverNode extends AudioNode {
          buffer: AudioBuffer;
          normalize: boolean;
      }
      
      declare var ConvolverNode: {
          prototype: ConvolverNode;
          new(): ConvolverNode;
      }
      
      interface Coordinates {
          accuracy: number;
          altitude: number;
          altitudeAccuracy: number;
          heading: number;
          latitude: number;
          longitude: number;
          speed: number;
      }
      
      declare var Coordinates: {
          prototype: Coordinates;
          new(): Coordinates;
      }
      
      interface Crypto extends Object, RandomSource {
          subtle: SubtleCrypto;
      }
      
      declare var Crypto: {
          prototype: Crypto;
          new(): Crypto;
      }
      
      interface CryptoKey {
          algorithm: KeyAlgorithm;
          extractable: boolean;
          type: string;
          usages: string[];
      }
      
      declare var CryptoKey: {
          prototype: CryptoKey;
          new(): CryptoKey;
      }
      
      interface CryptoKeyPair {
          privateKey: CryptoKey;
          publicKey: CryptoKey;
      }
      
      declare var CryptoKeyPair: {
          prototype: CryptoKeyPair;
          new(): CryptoKeyPair;
      }
      
      interface CustomEvent extends Event {
          detail: any;
          initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: any): void;
      }
      
      declare var CustomEvent: {
          prototype: CustomEvent;
          new(typeArg: string, eventInitDict?: CustomEventInit): CustomEvent;
      }
      
      interface DOMError {
          name: string;
          toString(): string;
      }
      
      declare var DOMError: {
          prototype: DOMError;
          new(): DOMError;
      }
      
      interface DOMException {
          code: number;
          message: string;
          name: string;
          toString(): string;
          ABORT_ERR: number;
          DATA_CLONE_ERR: number;
          DOMSTRING_SIZE_ERR: number;
          HIERARCHY_REQUEST_ERR: number;
          INDEX_SIZE_ERR: number;
          INUSE_ATTRIBUTE_ERR: number;
          INVALID_ACCESS_ERR: number;
          INVALID_CHARACTER_ERR: number;
          INVALID_MODIFICATION_ERR: number;
          INVALID_NODE_TYPE_ERR: number;
          INVALID_STATE_ERR: number;
          NAMESPACE_ERR: number;
          NETWORK_ERR: number;
          NOT_FOUND_ERR: number;
          NOT_SUPPORTED_ERR: number;
          NO_DATA_ALLOWED_ERR: number;
          NO_MODIFICATION_ALLOWED_ERR: number;
          PARSE_ERR: number;
          QUOTA_EXCEEDED_ERR: number;
          SECURITY_ERR: number;
          SERIALIZE_ERR: number;
          SYNTAX_ERR: number;
          TIMEOUT_ERR: number;
          TYPE_MISMATCH_ERR: number;
          URL_MISMATCH_ERR: number;
          VALIDATION_ERR: number;
          WRONG_DOCUMENT_ERR: number;
      }
      
      declare var DOMException: {
          prototype: DOMException;
          new(): DOMException;
          ABORT_ERR: number;
          DATA_CLONE_ERR: number;
          DOMSTRING_SIZE_ERR: number;
          HIERARCHY_REQUEST_ERR: number;
          INDEX_SIZE_ERR: number;
          INUSE_ATTRIBUTE_ERR: number;
          INVALID_ACCESS_ERR: number;
          INVALID_CHARACTER_ERR: number;
          INVALID_MODIFICATION_ERR: number;
          INVALID_NODE_TYPE_ERR: number;
          INVALID_STATE_ERR: number;
          NAMESPACE_ERR: number;
          NETWORK_ERR: number;
          NOT_FOUND_ERR: number;
          NOT_SUPPORTED_ERR: number;
          NO_DATA_ALLOWED_ERR: number;
          NO_MODIFICATION_ALLOWED_ERR: number;
          PARSE_ERR: number;
          QUOTA_EXCEEDED_ERR: number;
          SECURITY_ERR: number;
          SERIALIZE_ERR: number;
          SYNTAX_ERR: number;
          TIMEOUT_ERR: number;
          TYPE_MISMATCH_ERR: number;
          URL_MISMATCH_ERR: number;
          VALIDATION_ERR: number;
          WRONG_DOCUMENT_ERR: number;
      }
      
      interface DOMImplementation {
          createDocument(namespaceURI: string, qualifiedName: string, doctype: DocumentType): Document;
          createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;
          createHTMLDocument(title: string): Document;
          hasFeature(feature: string, version: string): boolean;
      }
      
      declare var DOMImplementation: {
          prototype: DOMImplementation;
          new(): DOMImplementation;
      }
      
      interface DOMParser {
          parseFromString(source: string, mimeType: string): Document;
      }
      
      declare var DOMParser: {
          prototype: DOMParser;
          new(): DOMParser;
      }
      
      interface DOMSettableTokenList extends DOMTokenList {
          value: string;
      }
      
      declare var DOMSettableTokenList: {
          prototype: DOMSettableTokenList;
          new(): DOMSettableTokenList;
      }
      
      interface DOMStringList {
          length: number;
          contains(str: string): boolean;
          item(index: number): string;
          [index: number]: string;
      }
      
      declare var DOMStringList: {
          prototype: DOMStringList;
          new(): DOMStringList;
      }
      
      interface DOMStringMap {
          [name: string]: string;
      }
      
      declare var DOMStringMap: {
          prototype: DOMStringMap;
          new(): DOMStringMap;
      }
      
      interface DOMTokenList {
          length: number;
          add(...token: string[]): void;
          contains(token: string): boolean;
          item(index: number): string;
          remove(...token: string[]): void;
          toString(): string;
          toggle(token: string, force?: boolean): boolean;
          [index: number]: string;
      }
      
      declare var DOMTokenList: {
          prototype: DOMTokenList;
          new(): DOMTokenList;
      }
      
      interface DataCue extends TextTrackCue {
          data: ArrayBuffer;
      }
      
      declare var DataCue: {
          prototype: DataCue;
          new(): DataCue;
      }
      
      interface DataTransfer {
          dropEffect: string;
          effectAllowed: string;
          files: FileList;
          items: DataTransferItemList;
          types: DOMStringList;
          clearData(format?: string): boolean;
          getData(format: string): string;
          setData(format: string, data: string): boolean;
      }
      
      declare var DataTransfer: {
          prototype: DataTransfer;
          new(): DataTransfer;
      }
      
      interface DataTransferItem {
          kind: string;
          type: string;
          getAsFile(): File;
          getAsString(_callback: FunctionStringCallback): void;
      }
      
      declare var DataTransferItem: {
          prototype: DataTransferItem;
          new(): DataTransferItem;
      }
      
      interface DataTransferItemList {
          length: number;
          add(data: File): DataTransferItem;
          clear(): void;
          item(index: number): File;
          remove(index: number): void;
          [index: number]: File;
      }
      
      declare var DataTransferItemList: {
          prototype: DataTransferItemList;
          new(): DataTransferItemList;
      }
      
      interface DeferredPermissionRequest {
          id: number;
          type: string;
          uri: string;
          allow(): void;
          deny(): void;
      }
      
      declare var DeferredPermissionRequest: {
          prototype: DeferredPermissionRequest;
          new(): DeferredPermissionRequest;
      }
      
      interface DelayNode extends AudioNode {
          delayTime: AudioParam;
      }
      
      declare var DelayNode: {
          prototype: DelayNode;
          new(): DelayNode;
      }
      
      interface DeviceAcceleration {
          x: number;
          y: number;
          z: number;
      }
      
      declare var DeviceAcceleration: {
          prototype: DeviceAcceleration;
          new(): DeviceAcceleration;
      }
      
      interface DeviceMotionEvent extends Event {
          acceleration: DeviceAcceleration;
          accelerationIncludingGravity: DeviceAcceleration;
          interval: number;
          rotationRate: DeviceRotationRate;
          initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict, accelerationIncludingGravity: DeviceAccelerationDict, rotationRate: DeviceRotationRateDict, interval: number): void;
      }
      
      declare var DeviceMotionEvent: {
          prototype: DeviceMotionEvent;
          new(): DeviceMotionEvent;
      }
      
      interface DeviceOrientationEvent extends Event {
          absolute: boolean;
          alpha: number;
          beta: number;
          gamma: number;
          initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean): void;
      }
      
      declare var DeviceOrientationEvent: {
          prototype: DeviceOrientationEvent;
          new(): DeviceOrientationEvent;
      }
      
      interface DeviceRotationRate {
          alpha: number;
          beta: number;
          gamma: number;
      }
      
      declare var DeviceRotationRate: {
          prototype: DeviceRotationRate;
          new(): DeviceRotationRate;
      }
      
      interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent {
          /**
            * Sets or gets the URL for the current document. 
            */
          URL: string;
          /**
            * Gets the URL for the document, stripped of any character encoding.
            */
          URLUnencoded: string;
          /**
            * Gets the object that has the focus when the parent document has focus.
            */
          activeElement: Element;
          /**
            * Sets or gets the color of all active links in the document.
            */
          alinkColor: string;
          /**
            * Returns a reference to the collection of elements contained by the object.
            */
          all: HTMLCollection;
          /**
            * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
            */
          anchors: HTMLCollection;
          /**
            * Retrieves a collection of all applet objects in the document.
            */
          applets: HTMLCollection;
          /**
            * Deprecated. Sets or retrieves a value that indicates the background color behind the object. 
            */
          bgColor: string;
          /**
            * Specifies the beginning and end of the document body.
            */
          body: HTMLElement;
          characterSet: string;
          /**
            * Gets or sets the character set used to encode the object.
            */
          charset: string;
          /**
            * Gets a value that indicates whether standards-compliant mode is switched on for the object.
            */
          compatMode: string;
          cookie: string;
          /**
            * Gets the default character set from the current regional language settings.
            */
          defaultCharset: string;
          defaultView: Window;
          /**
            * Sets or gets a value that indicates whether the document can be edited.
            */
          designMode: string;
          /**
            * Sets or retrieves a value that indicates the reading order of the object. 
            */
          dir: string;
          /**
            * Gets an object representing the document type declaration associated with the current document. 
            */
          doctype: DocumentType;
          /**
            * Gets a reference to the root node of the document. 
            */
          documentElement: HTMLElement;
          /**
            * Sets or gets the security domain of the document. 
            */
          domain: string;
          /**
            * Retrieves a collection of all embed objects in the document.
            */
          embeds: HTMLCollection;
          /**
            * Sets or gets the foreground (text) color of the document.
            */
          fgColor: string;
          /**
            * Retrieves a collection, in source order, of all form objects in the document.
            */
          forms: HTMLCollection;
          fullscreenElement: Element;
          fullscreenEnabled: boolean;
          head: HTMLHeadElement;
          hidden: boolean;
          /**
            * Retrieves a collection, in source order, of img objects in the document.
            */
          images: HTMLCollection;
          /**
            * Gets the implementation object of the current document. 
            */
          implementation: DOMImplementation;
          /**
            * Returns the character encoding used to create the webpage that is loaded into the document object.
            */
          inputEncoding: string;
          /**
            * Gets the date that the page was last modified, if the page supplies one. 
            */
          lastModified: string;
          /**
            * Sets or gets the color of the document links. 
            */
          linkColor: string;
          /**
            * Retrieves a collection of all a objects that specify the href property and all area objects in the document.
            */
          links: HTMLCollection;
          /**
            * Contains information about the current URL. 
            */
          location: Location;
          media: string;
          msCSSOMElementFloatMetrics: boolean;
          msCapsLockWarningOff: boolean;
          msHidden: boolean;
          msVisibilityState: string;
          /**
            * Fires when the user aborts the download.
            * @param ev The event.
            */
          onabort: (ev: Event) => any;
          /**
            * Fires when the object is set as the active element.
            * @param ev The event.
            */
          onactivate: (ev: UIEvent) => any;
          /**
            * Fires immediately before the object is set as the active element.
            * @param ev The event.
            */
          onbeforeactivate: (ev: UIEvent) => any;
          /**
            * Fires immediately before the activeElement is changed from the current object to another object in the parent document.
            * @param ev The event.
            */
          onbeforedeactivate: (ev: UIEvent) => any;
          /** 
            * Fires when the object loses the input focus. 
            * @param ev The focus event.
            */
          onblur: (ev: FocusEvent) => any;
          /**
            * Occurs when playback is possible, but would require further buffering. 
            * @param ev The event.
            */
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          /**
            * Fires when the contents of the object or selection have changed. 
            * @param ev The event.
            */
          onchange: (ev: Event) => any;
          /**
            * Fires when the user clicks the left mouse button on the object
            * @param ev The mouse event.
            */
          onclick: (ev: MouseEvent) => any;
          /**
            * Fires when the user clicks the right mouse button in the client area, opening the context menu. 
            * @param ev The mouse event.
            */
          oncontextmenu: (ev: PointerEvent) => any;
          /**
            * Fires when the user double-clicks the object.
            * @param ev The mouse event.
            */
          ondblclick: (ev: MouseEvent) => any;
          /**
            * Fires when the activeElement is changed from the current object to another object in the parent document.
            * @param ev The UI Event
            */
          ondeactivate: (ev: UIEvent) => any;
          /**
            * Fires on the source object continuously during a drag operation.
            * @param ev The event.
            */
          ondrag: (ev: DragEvent) => any;
          /**
            * Fires on the source object when the user releases the mouse at the close of a drag operation.
            * @param ev The event.
            */
          ondragend: (ev: DragEvent) => any;
          /** 
            * Fires on the target element when the user drags the object to a valid drop target.
            * @param ev The drag event.
            */
          ondragenter: (ev: DragEvent) => any;
          /** 
            * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
            * @param ev The drag event.
            */
          ondragleave: (ev: DragEvent) => any;
          /**
            * Fires on the target element continuously while the user drags the object over a valid drop target.
            * @param ev The event.
            */
          ondragover: (ev: DragEvent) => any;
          /**
            * Fires on the source object when the user starts to drag a text selection or selected object. 
            * @param ev The event.
            */
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          /**
            * Occurs when the duration attribute is updated. 
            * @param ev The event.
            */
          ondurationchange: (ev: Event) => any;
          /**
            * Occurs when the media element is reset to its initial state. 
            * @param ev The event.
            */
          onemptied: (ev: Event) => any;
          /**
            * Occurs when the end of playback is reached. 
            * @param ev The event
            */
          onended: (ev: Event) => any;
          /**
            * Fires when an error occurs during object loading.
            * @param ev The event.
            */
          onerror: (ev: Event) => any;
          /**
            * Fires when the object receives focus. 
            * @param ev The event.
            */
          onfocus: (ev: FocusEvent) => any;
          onfullscreenchange: (ev: Event) => any;
          onfullscreenerror: (ev: Event) => any;
          oninput: (ev: Event) => any;
          /**
            * Fires when the user presses a key.
            * @param ev The keyboard event
            */
          onkeydown: (ev: KeyboardEvent) => any;
          /**
            * Fires when the user presses an alphanumeric key.
            * @param ev The event.
            */
          onkeypress: (ev: KeyboardEvent) => any;
          /**
            * Fires when the user releases a key.
            * @param ev The keyboard event
            */
          onkeyup: (ev: KeyboardEvent) => any;
          /**
            * Fires immediately after the browser loads the object. 
            * @param ev The event.
            */
          onload: (ev: Event) => any;
          /**
            * Occurs when media data is loaded at the current playback position. 
            * @param ev The event.
            */
          onloadeddata: (ev: Event) => any;
          /**
            * Occurs when the duration and dimensions of the media have been determined.
            * @param ev The event.
            */
          onloadedmetadata: (ev: Event) => any;
          /**
            * Occurs when Internet Explorer begins looking for media data. 
            * @param ev The event.
            */
          onloadstart: (ev: Event) => any;
          /**
            * Fires when the user clicks the object with either mouse button. 
            * @param ev The mouse event.
            */
          onmousedown: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse over the object. 
            * @param ev The mouse event.
            */
          onmousemove: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse pointer outside the boundaries of the object. 
            * @param ev The mouse event.
            */
          onmouseout: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse pointer into the object.
            * @param ev The mouse event.
            */
          onmouseover: (ev: MouseEvent) => any;
          /**
            * Fires when the user releases a mouse button while the mouse is over the object. 
            * @param ev The mouse event.
            */
          onmouseup: (ev: MouseEvent) => any;
          /**
            * Fires when the wheel button is rotated. 
            * @param ev The mouse event
            */
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmscontentzoom: (ev: UIEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          /**
            * Occurs when an item is removed from a Jump List of a webpage running in Site Mode. 
            * @param ev The event.
            */
          onmssitemodejumplistitemremoved: (ev: MSSiteModeEvent) => any;
          /**
            * Occurs when a user clicks a button in a Thumbnail Toolbar of a webpage running in Site Mode.
            * @param ev The event.
            */
          onmsthumbnailclick: (ev: MSSiteModeEvent) => any;
          /**
            * Occurs when playback is paused.
            * @param ev The event.
            */
          onpause: (ev: Event) => any;
          /**
            * Occurs when the play method is requested. 
            * @param ev The event.
            */
          onplay: (ev: Event) => any;
          /**
            * Occurs when the audio or video has started playing. 
            * @param ev The event.
            */
          onplaying: (ev: Event) => any;
          onpointerlockchange: (ev: Event) => any;
          onpointerlockerror: (ev: Event) => any;
          /**
            * Occurs to indicate progress while downloading media data. 
            * @param ev The event.
            */
          onprogress: (ev: ProgressEvent) => any;
          /**
            * Occurs when the playback rate is increased or decreased. 
            * @param ev The event.
            */
          onratechange: (ev: Event) => any;
          /**
            * Fires when the state of the object has changed.
            * @param ev The event
            */
          onreadystatechange: (ev: ProgressEvent) => any;
          /**
            * Fires when the user resets a form. 
            * @param ev The event.
            */
          onreset: (ev: Event) => any;
          /**
            * Fires when the user repositions the scroll box in the scroll bar on the object. 
            * @param ev The event.
            */
          onscroll: (ev: UIEvent) => any;
          /**
            * Occurs when the seek operation ends. 
            * @param ev The event.
            */
          onseeked: (ev: Event) => any;
          /**
            * Occurs when the current playback position is moved. 
            * @param ev The event.
            */
          onseeking: (ev: Event) => any;
          /**
            * Fires when the current selection changes.
            * @param ev The event.
            */
          onselect: (ev: UIEvent) => any;
          onselectstart: (ev: Event) => any;
          /**
            * Occurs when the download has stopped. 
            * @param ev The event.
            */
          onstalled: (ev: Event) => any;
          /**
            * Fires when the user clicks the Stop button or leaves the Web page.
            * @param ev The event.
            */
          onstop: (ev: Event) => any;
          onsubmit: (ev: Event) => any;
          /**
            * Occurs if the load operation has been intentionally halted. 
            * @param ev The event.
            */
          onsuspend: (ev: Event) => any;
          /**
            * Occurs to indicate the current playback position.
            * @param ev The event.
            */
          ontimeupdate: (ev: Event) => any;
          ontouchcancel: (ev: TouchEvent) => any;
          ontouchend: (ev: TouchEvent) => any;
          ontouchmove: (ev: TouchEvent) => any;
          ontouchstart: (ev: TouchEvent) => any;
          /**
            * Occurs when the volume is changed, or playback is muted or unmuted.
            * @param ev The event.
            */
          onvolumechange: (ev: Event) => any;
          /**
            * Occurs when playback stops because the next frame of a video resource is not available. 
            * @param ev The event.
            */
          onwaiting: (ev: Event) => any;
          onwebkitfullscreenchange: (ev: Event) => any;
          onwebkitfullscreenerror: (ev: Event) => any;
          plugins: HTMLCollection;
          pointerLockElement: Element;
          /**
            * Retrieves a value that indicates the current state of the object.
            */
          readyState: string;
          /**
            * Gets the URL of the location that referred the user to the current page.
            */
          referrer: string;
          /**
            * Gets the root svg element in the document hierarchy.
            */
          rootElement: SVGSVGElement;
          /**
            * Retrieves a collection of all script objects in the document.
            */
          scripts: HTMLCollection;
          security: string;
          /**
            * Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.
            */
          styleSheets: StyleSheetList;
          /**
            * Contains the title of the document.
            */
          title: string;
          visibilityState: string;
          /** 
            * Sets or gets the color of the links that the user has visited.
            */
          vlinkColor: string;
          webkitCurrentFullScreenElement: Element;
          webkitFullscreenElement: Element;
          webkitFullscreenEnabled: boolean;
          webkitIsFullScreen: boolean;
          xmlEncoding: string;
          xmlStandalone: boolean;
          /**
            * Gets or sets the version attribute specified in the declaration of an XML document.
            */
          xmlVersion: string;
          adoptNode(source: Node): Node;
          captureEvents(): void;
          clear(): void;
          /**
            * Closes an output stream and forces the sent data to display.
            */
          close(): void;
          /**
            * Creates an attribute object with a specified name.
            * @param name String that sets the attribute object's name.
            */
          createAttribute(name: string): Attr;
          createAttributeNS(namespaceURI: string, qualifiedName: string): Attr;
          createCDATASection(data: string): CDATASection;
          /**
            * Creates a comment object with the specified data.
            * @param data Sets the comment object's data.
            */
          createComment(data: string): Comment;
          /**
            * Creates a new document.
            */
          createDocumentFragment(): DocumentFragment;
          /**
            * Creates an instance of the element for the specified tag.
            * @param tagName The name of an element.
            */
          createElement(tagName: "a"): HTMLAnchorElement;
          createElement(tagName: "abbr"): HTMLPhraseElement;
          createElement(tagName: "acronym"): HTMLPhraseElement;
          createElement(tagName: "address"): HTMLBlockElement;
          createElement(tagName: "applet"): HTMLAppletElement;
          createElement(tagName: "area"): HTMLAreaElement;
          createElement(tagName: "audio"): HTMLAudioElement;
          createElement(tagName: "b"): HTMLPhraseElement;
          createElement(tagName: "base"): HTMLBaseElement;
          createElement(tagName: "basefont"): HTMLBaseFontElement;
          createElement(tagName: "bdo"): HTMLPhraseElement;
          createElement(tagName: "big"): HTMLPhraseElement;
          createElement(tagName: "blockquote"): HTMLBlockElement;
          createElement(tagName: "body"): HTMLBodyElement;
          createElement(tagName: "br"): HTMLBRElement;
          createElement(tagName: "button"): HTMLButtonElement;
          createElement(tagName: "canvas"): HTMLCanvasElement;
          createElement(tagName: "caption"): HTMLTableCaptionElement;
          createElement(tagName: "center"): HTMLBlockElement;
          createElement(tagName: "cite"): HTMLPhraseElement;
          createElement(tagName: "code"): HTMLPhraseElement;
          createElement(tagName: "col"): HTMLTableColElement;
          createElement(tagName: "colgroup"): HTMLTableColElement;
          createElement(tagName: "datalist"): HTMLDataListElement;
          createElement(tagName: "dd"): HTMLDDElement;
          createElement(tagName: "del"): HTMLModElement;
          createElement(tagName: "dfn"): HTMLPhraseElement;
          createElement(tagName: "dir"): HTMLDirectoryElement;
          createElement(tagName: "div"): HTMLDivElement;
          createElement(tagName: "dl"): HTMLDListElement;
          createElement(tagName: "dt"): HTMLDTElement;
          createElement(tagName: "em"): HTMLPhraseElement;
          createElement(tagName: "embed"): HTMLEmbedElement;
          createElement(tagName: "fieldset"): HTMLFieldSetElement;
          createElement(tagName: "font"): HTMLFontElement;
          createElement(tagName: "form"): HTMLFormElement;
          createElement(tagName: "frame"): HTMLFrameElement;
          createElement(tagName: "frameset"): HTMLFrameSetElement;
          createElement(tagName: "h1"): HTMLHeadingElement;
          createElement(tagName: "h2"): HTMLHeadingElement;
          createElement(tagName: "h3"): HTMLHeadingElement;
          createElement(tagName: "h4"): HTMLHeadingElement;
          createElement(tagName: "h5"): HTMLHeadingElement;
          createElement(tagName: "h6"): HTMLHeadingElement;
          createElement(tagName: "head"): HTMLHeadElement;
          createElement(tagName: "hr"): HTMLHRElement;
          createElement(tagName: "html"): HTMLHtmlElement;
          createElement(tagName: "i"): HTMLPhraseElement;
          createElement(tagName: "iframe"): HTMLIFrameElement;
          createElement(tagName: "img"): HTMLImageElement;
          createElement(tagName: "input"): HTMLInputElement;
          createElement(tagName: "ins"): HTMLModElement;
          createElement(tagName: "isindex"): HTMLIsIndexElement;
          createElement(tagName: "kbd"): HTMLPhraseElement;
          createElement(tagName: "keygen"): HTMLBlockElement;
          createElement(tagName: "label"): HTMLLabelElement;
          createElement(tagName: "legend"): HTMLLegendElement;
          createElement(tagName: "li"): HTMLLIElement;
          createElement(tagName: "link"): HTMLLinkElement;
          createElement(tagName: "listing"): HTMLBlockElement;
          createElement(tagName: "map"): HTMLMapElement;
          createElement(tagName: "marquee"): HTMLMarqueeElement;
          createElement(tagName: "menu"): HTMLMenuElement;
          createElement(tagName: "meta"): HTMLMetaElement;
          createElement(tagName: "nextid"): HTMLNextIdElement;
          createElement(tagName: "nobr"): HTMLPhraseElement;
          createElement(tagName: "object"): HTMLObjectElement;
          createElement(tagName: "ol"): HTMLOListElement;
          createElement(tagName: "optgroup"): HTMLOptGroupElement;
          createElement(tagName: "option"): HTMLOptionElement;
          createElement(tagName: "p"): HTMLParagraphElement;
          createElement(tagName: "param"): HTMLParamElement;
          createElement(tagName: "plaintext"): HTMLBlockElement;
          createElement(tagName: "pre"): HTMLPreElement;
          createElement(tagName: "progress"): HTMLProgressElement;
          createElement(tagName: "q"): HTMLQuoteElement;
          createElement(tagName: "rt"): HTMLPhraseElement;
          createElement(tagName: "ruby"): HTMLPhraseElement;
          createElement(tagName: "s"): HTMLPhraseElement;
          createElement(tagName: "samp"): HTMLPhraseElement;
          createElement(tagName: "script"): HTMLScriptElement;
          createElement(tagName: "select"): HTMLSelectElement;
          createElement(tagName: "small"): HTMLPhraseElement;
          createElement(tagName: "source"): HTMLSourceElement;
          createElement(tagName: "span"): HTMLSpanElement;
          createElement(tagName: "strike"): HTMLPhraseElement;
          createElement(tagName: "strong"): HTMLPhraseElement;
          createElement(tagName: "style"): HTMLStyleElement;
          createElement(tagName: "sub"): HTMLPhraseElement;
          createElement(tagName: "sup"): HTMLPhraseElement;
          createElement(tagName: "table"): HTMLTableElement;
          createElement(tagName: "tbody"): HTMLTableSectionElement;
          createElement(tagName: "td"): HTMLTableDataCellElement;
          createElement(tagName: "textarea"): HTMLTextAreaElement;
          createElement(tagName: "tfoot"): HTMLTableSectionElement;
          createElement(tagName: "th"): HTMLTableHeaderCellElement;
          createElement(tagName: "thead"): HTMLTableSectionElement;
          createElement(tagName: "title"): HTMLTitleElement;
          createElement(tagName: "tr"): HTMLTableRowElement;
          createElement(tagName: "track"): HTMLTrackElement;
          createElement(tagName: "tt"): HTMLPhraseElement;
          createElement(tagName: "u"): HTMLPhraseElement;
          createElement(tagName: "ul"): HTMLUListElement;
          createElement(tagName: "var"): HTMLPhraseElement;
          createElement(tagName: "video"): HTMLVideoElement;
          createElement(tagName: "x-ms-webview"): MSHTMLWebViewElement;
          createElement(tagName: "xmp"): HTMLBlockElement;
          createElement(tagName: string): HTMLElement;
          createElementNS(namespaceURI: string, qualifiedName: string): Element;
          createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
          createNSResolver(nodeResolver: Node): XPathNSResolver;
          /**
            * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. 
            * @param root The root element or node to start traversing on.
            * @param whatToShow The type of nodes or elements to appear in the node list
            * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.
            * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
            */
          createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): NodeIterator;
          createProcessingInstruction(target: string, data: string): ProcessingInstruction;
          /**
            *  Returns an empty range object that has both of its boundary points positioned at the beginning of the document. 
            */
          createRange(): Range;
          /**
            * Creates a text string from the specified value. 
            * @param data String that specifies the nodeValue property of the text node.
            */
          createTextNode(data: string): Text;
          createTouch(view: any, target: EventTarget, identifier: number, pageX: number, pageY: number, screenX: number, screenY: number): Touch;
          createTouchList(...touches: Touch[]): TouchList;
          /**
            * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.
            * @param root The root element or node to start traversing on.
            * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.
            * @param filter A custom NodeFilter function to use.
            * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
            */
          createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): TreeWalker;
          /**
            * Returns the element for the specified x coordinate and the specified y coordinate. 
            * @param x The x-offset
            * @param y The y-offset
            */
          elementFromPoint(x: number, y: number): Element;
          evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
          /**
            * Executes a command on the current document, current selection, or the given range.
            * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.
            * @param showUI Display the user interface, defaults to false.
            * @param value Value to assign.
            */
          execCommand(commandId: string, showUI?: boolean, value?: any): boolean;
          /**
            * Displays help information for the given command identifier.
            * @param commandId Displays help information for the given command identifier.
            */
          execCommandShowHelp(commandId: string): boolean;
          exitFullscreen(): void;
          exitPointerLock(): void;
          /**
            * Causes the element to receive the focus and executes the code specified by the onfocus event.
            */
          focus(): void;
          /**
            * Returns a reference to the first object with the specified value of the ID or NAME attribute.
            * @param elementId String that specifies the ID value. Case-insensitive.
            */
          getElementById(elementId: string): HTMLElement;
          getElementsByClassName(classNames: string): NodeList;
          /**
            * Gets a collection of objects based on the value of the NAME or ID attribute.
            * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
            */
          getElementsByName(elementName: string): NodeList;
          /**
            * Retrieves a collection of objects based on the specified element name.
            * @param name Specifies the name of an element.
            */
          getElementsByTagName(tagname: "a"): NodeListOf<HTMLAnchorElement>;
          getElementsByTagName(tagname: "abbr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "acronym"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "address"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "applet"): NodeListOf<HTMLAppletElement>;
          getElementsByTagName(tagname: "area"): NodeListOf<HTMLAreaElement>;
          getElementsByTagName(tagname: "article"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "aside"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "audio"): NodeListOf<HTMLAudioElement>;
          getElementsByTagName(tagname: "b"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "base"): NodeListOf<HTMLBaseElement>;
          getElementsByTagName(tagname: "basefont"): NodeListOf<HTMLBaseFontElement>;
          getElementsByTagName(tagname: "bdo"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "big"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "blockquote"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "body"): NodeListOf<HTMLBodyElement>;
          getElementsByTagName(tagname: "br"): NodeListOf<HTMLBRElement>;
          getElementsByTagName(tagname: "button"): NodeListOf<HTMLButtonElement>;
          getElementsByTagName(tagname: "canvas"): NodeListOf<HTMLCanvasElement>;
          getElementsByTagName(tagname: "caption"): NodeListOf<HTMLTableCaptionElement>;
          getElementsByTagName(tagname: "center"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "circle"): NodeListOf<SVGCircleElement>;
          getElementsByTagName(tagname: "cite"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "clippath"): NodeListOf<SVGClipPathElement>;
          getElementsByTagName(tagname: "code"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "col"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(tagname: "colgroup"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(tagname: "datalist"): NodeListOf<HTMLDataListElement>;
          getElementsByTagName(tagname: "dd"): NodeListOf<HTMLDDElement>;
          getElementsByTagName(tagname: "defs"): NodeListOf<SVGDefsElement>;
          getElementsByTagName(tagname: "del"): NodeListOf<HTMLModElement>;
          getElementsByTagName(tagname: "desc"): NodeListOf<SVGDescElement>;
          getElementsByTagName(tagname: "dfn"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "dir"): NodeListOf<HTMLDirectoryElement>;
          getElementsByTagName(tagname: "div"): NodeListOf<HTMLDivElement>;
          getElementsByTagName(tagname: "dl"): NodeListOf<HTMLDListElement>;
          getElementsByTagName(tagname: "dt"): NodeListOf<HTMLDTElement>;
          getElementsByTagName(tagname: "ellipse"): NodeListOf<SVGEllipseElement>;
          getElementsByTagName(tagname: "em"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "embed"): NodeListOf<HTMLEmbedElement>;
          getElementsByTagName(tagname: "feblend"): NodeListOf<SVGFEBlendElement>;
          getElementsByTagName(tagname: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
          getElementsByTagName(tagname: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
          getElementsByTagName(tagname: "fecomposite"): NodeListOf<SVGFECompositeElement>;
          getElementsByTagName(tagname: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
          getElementsByTagName(tagname: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
          getElementsByTagName(tagname: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
          getElementsByTagName(tagname: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
          getElementsByTagName(tagname: "feflood"): NodeListOf<SVGFEFloodElement>;
          getElementsByTagName(tagname: "fefunca"): NodeListOf<SVGFEFuncAElement>;
          getElementsByTagName(tagname: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
          getElementsByTagName(tagname: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
          getElementsByTagName(tagname: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
          getElementsByTagName(tagname: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
          getElementsByTagName(tagname: "feimage"): NodeListOf<SVGFEImageElement>;
          getElementsByTagName(tagname: "femerge"): NodeListOf<SVGFEMergeElement>;
          getElementsByTagName(tagname: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
          getElementsByTagName(tagname: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
          getElementsByTagName(tagname: "feoffset"): NodeListOf<SVGFEOffsetElement>;
          getElementsByTagName(tagname: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
          getElementsByTagName(tagname: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
          getElementsByTagName(tagname: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
          getElementsByTagName(tagname: "fetile"): NodeListOf<SVGFETileElement>;
          getElementsByTagName(tagname: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
          getElementsByTagName(tagname: "fieldset"): NodeListOf<HTMLFieldSetElement>;
          getElementsByTagName(tagname: "figcaption"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "figure"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "filter"): NodeListOf<SVGFilterElement>;
          getElementsByTagName(tagname: "font"): NodeListOf<HTMLFontElement>;
          getElementsByTagName(tagname: "footer"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
          getElementsByTagName(tagname: "form"): NodeListOf<HTMLFormElement>;
          getElementsByTagName(tagname: "frame"): NodeListOf<HTMLFrameElement>;
          getElementsByTagName(tagname: "frameset"): NodeListOf<HTMLFrameSetElement>;
          getElementsByTagName(tagname: "g"): NodeListOf<SVGGElement>;
          getElementsByTagName(tagname: "h1"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h2"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h3"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h4"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h5"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h6"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "head"): NodeListOf<HTMLHeadElement>;
          getElementsByTagName(tagname: "header"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "hgroup"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "hr"): NodeListOf<HTMLHRElement>;
          getElementsByTagName(tagname: "html"): NodeListOf<HTMLHtmlElement>;
          getElementsByTagName(tagname: "i"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "iframe"): NodeListOf<HTMLIFrameElement>;
          getElementsByTagName(tagname: "image"): NodeListOf<SVGImageElement>;
          getElementsByTagName(tagname: "img"): NodeListOf<HTMLImageElement>;
          getElementsByTagName(tagname: "input"): NodeListOf<HTMLInputElement>;
          getElementsByTagName(tagname: "ins"): NodeListOf<HTMLModElement>;
          getElementsByTagName(tagname: "isindex"): NodeListOf<HTMLIsIndexElement>;
          getElementsByTagName(tagname: "kbd"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "keygen"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "label"): NodeListOf<HTMLLabelElement>;
          getElementsByTagName(tagname: "legend"): NodeListOf<HTMLLegendElement>;
          getElementsByTagName(tagname: "li"): NodeListOf<HTMLLIElement>;
          getElementsByTagName(tagname: "line"): NodeListOf<SVGLineElement>;
          getElementsByTagName(tagname: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
          getElementsByTagName(tagname: "link"): NodeListOf<HTMLLinkElement>;
          getElementsByTagName(tagname: "listing"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "map"): NodeListOf<HTMLMapElement>;
          getElementsByTagName(tagname: "mark"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "marker"): NodeListOf<SVGMarkerElement>;
          getElementsByTagName(tagname: "marquee"): NodeListOf<HTMLMarqueeElement>;
          getElementsByTagName(tagname: "mask"): NodeListOf<SVGMaskElement>;
          getElementsByTagName(tagname: "menu"): NodeListOf<HTMLMenuElement>;
          getElementsByTagName(tagname: "meta"): NodeListOf<HTMLMetaElement>;
          getElementsByTagName(tagname: "metadata"): NodeListOf<SVGMetadataElement>;
          getElementsByTagName(tagname: "nav"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "nextid"): NodeListOf<HTMLNextIdElement>;
          getElementsByTagName(tagname: "nobr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "noframes"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "noscript"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "object"): NodeListOf<HTMLObjectElement>;
          getElementsByTagName(tagname: "ol"): NodeListOf<HTMLOListElement>;
          getElementsByTagName(tagname: "optgroup"): NodeListOf<HTMLOptGroupElement>;
          getElementsByTagName(tagname: "option"): NodeListOf<HTMLOptionElement>;
          getElementsByTagName(tagname: "p"): NodeListOf<HTMLParagraphElement>;
          getElementsByTagName(tagname: "param"): NodeListOf<HTMLParamElement>;
          getElementsByTagName(tagname: "path"): NodeListOf<SVGPathElement>;
          getElementsByTagName(tagname: "pattern"): NodeListOf<SVGPatternElement>;
          getElementsByTagName(tagname: "plaintext"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "polygon"): NodeListOf<SVGPolygonElement>;
          getElementsByTagName(tagname: "polyline"): NodeListOf<SVGPolylineElement>;
          getElementsByTagName(tagname: "pre"): NodeListOf<HTMLPreElement>;
          getElementsByTagName(tagname: "progress"): NodeListOf<HTMLProgressElement>;
          getElementsByTagName(tagname: "q"): NodeListOf<HTMLQuoteElement>;
          getElementsByTagName(tagname: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
          getElementsByTagName(tagname: "rect"): NodeListOf<SVGRectElement>;
          getElementsByTagName(tagname: "rt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "ruby"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "s"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "samp"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "script"): NodeListOf<HTMLScriptElement>;
          getElementsByTagName(tagname: "section"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "select"): NodeListOf<HTMLSelectElement>;
          getElementsByTagName(tagname: "small"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "source"): NodeListOf<HTMLSourceElement>;
          getElementsByTagName(tagname: "span"): NodeListOf<HTMLSpanElement>;
          getElementsByTagName(tagname: "stop"): NodeListOf<SVGStopElement>;
          getElementsByTagName(tagname: "strike"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "strong"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "style"): NodeListOf<HTMLStyleElement>;
          getElementsByTagName(tagname: "sub"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "sup"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "svg"): NodeListOf<SVGSVGElement>;
          getElementsByTagName(tagname: "switch"): NodeListOf<SVGSwitchElement>;
          getElementsByTagName(tagname: "symbol"): NodeListOf<SVGSymbolElement>;
          getElementsByTagName(tagname: "table"): NodeListOf<HTMLTableElement>;
          getElementsByTagName(tagname: "tbody"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "td"): NodeListOf<HTMLTableDataCellElement>;
          getElementsByTagName(tagname: "text"): NodeListOf<SVGTextElement>;
          getElementsByTagName(tagname: "textpath"): NodeListOf<SVGTextPathElement>;
          getElementsByTagName(tagname: "textarea"): NodeListOf<HTMLTextAreaElement>;
          getElementsByTagName(tagname: "tfoot"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "th"): NodeListOf<HTMLTableHeaderCellElement>;
          getElementsByTagName(tagname: "thead"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "title"): NodeListOf<HTMLTitleElement>;
          getElementsByTagName(tagname: "tr"): NodeListOf<HTMLTableRowElement>;
          getElementsByTagName(tagname: "track"): NodeListOf<HTMLTrackElement>;
          getElementsByTagName(tagname: "tspan"): NodeListOf<SVGTSpanElement>;
          getElementsByTagName(tagname: "tt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "u"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "ul"): NodeListOf<HTMLUListElement>;
          getElementsByTagName(tagname: "use"): NodeListOf<SVGUseElement>;
          getElementsByTagName(tagname: "var"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "video"): NodeListOf<HTMLVideoElement>;
          getElementsByTagName(tagname: "view"): NodeListOf<SVGViewElement>;
          getElementsByTagName(tagname: "wbr"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
          getElementsByTagName(tagname: "xmp"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: string): NodeList;
          getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
          /**
            * Returns an object representing the current selection of the document that is loaded into the object displaying a webpage.
            */
          getSelection(): Selection;
          /**
            * Gets a value indicating whether the object currently has focus.
            */
          hasFocus(): boolean;
          importNode(importedNode: Node, deep: boolean): Node;
          msElementsFromPoint(x: number, y: number): NodeList;
          msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
          msGetPrintDocumentForNamedFlow(flowName: string): Document;
          msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
          /**
            * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
            * @param url Specifies a MIME type for the document.
            * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.
            * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.
            * @param replace Specifies whether the existing entry for the document is replaced in the history list.
            */
          open(url?: string, name?: string, features?: string, replace?: boolean): Document | Window;
          /** 
            * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.
            * @param commandId Specifies a command identifier.
            */
          queryCommandEnabled(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandIndeterm(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates the current state of the command.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandState(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates whether the current command is supported on the current range.
            * @param commandId Specifies a command identifier.
            */
          queryCommandSupported(commandId: string): boolean;
          /**
            * Retrieves the string associated with a command.
            * @param commandId String that contains the identifier of a command. This can be any command identifier given in the list of Command Identifiers. 
            */
          queryCommandText(commandId: string): string;
          /**
            * Returns the current value of the document, range, or current selection for the given command.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandValue(commandId: string): string;
          releaseEvents(): void;
          /**
            * Allows updating the print settings for the page.
            */
          updateSettings(): void;
          webkitCancelFullScreen(): void;
          webkitExitFullscreen(): void;
          /**
            * Writes one or more HTML expressions to a document in the specified window. 
            * @param content Specifies the text and HTML tags to write.
            */
          write(...content: string[]): void;
          /**
            * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window. 
            * @param content The text and HTML tags to write.
            */
          writeln(...content: string[]): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "fullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "fullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mssitemodejumplistitemremoved", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msthumbnailclick", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerlockchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerlockerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stop", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Document: {
          prototype: Document;
          new(): Document;
      }
      
      interface DocumentFragment extends Node, NodeSelector {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var DocumentFragment: {
          prototype: DocumentFragment;
          new(): DocumentFragment;
      }
      
      interface DocumentType extends Node, ChildNode {
          entities: NamedNodeMap;
          internalSubset: string;
          name: string;
          notations: NamedNodeMap;
          publicId: string;
          systemId: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var DocumentType: {
          prototype: DocumentType;
          new(): DocumentType;
      }
      
      interface DragEvent extends MouseEvent {
          dataTransfer: DataTransfer;
          initDragEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, dataTransferArg: DataTransfer): void;
          msConvertURL(file: File, targetType: string, targetURL?: string): void;
      }
      
      declare var DragEvent: {
          prototype: DragEvent;
          new(): DragEvent;
      }
      
      interface DynamicsCompressorNode extends AudioNode {
          attack: AudioParam;
          knee: AudioParam;
          ratio: AudioParam;
          reduction: AudioParam;
          release: AudioParam;
          threshold: AudioParam;
      }
      
      declare var DynamicsCompressorNode: {
          prototype: DynamicsCompressorNode;
          new(): DynamicsCompressorNode;
      }
      
      interface EXT_texture_filter_anisotropic {
          MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
          TEXTURE_MAX_ANISOTROPY_EXT: number;
      }
      
      declare var EXT_texture_filter_anisotropic: {
          prototype: EXT_texture_filter_anisotropic;
          new(): EXT_texture_filter_anisotropic;
          MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
          TEXTURE_MAX_ANISOTROPY_EXT: number;
      }
      
      interface Element extends Node, GlobalEventHandlers, ElementTraversal, NodeSelector, ChildNode {
          classList: DOMTokenList;
          clientHeight: number;
          clientLeft: number;
          clientTop: number;
          clientWidth: number;
          msContentZoomFactor: number;
          msRegionOverflow: string;
          onariarequest: (ev: AriaRequestEvent) => any;
          oncommand: (ev: CommandEvent) => any;
          ongotpointercapture: (ev: PointerEvent) => any;
          onlostpointercapture: (ev: PointerEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsgotpointercapture: (ev: MSPointerEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmslostpointercapture: (ev: MSPointerEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          ontouchcancel: (ev: TouchEvent) => any;
          ontouchend: (ev: TouchEvent) => any;
          ontouchmove: (ev: TouchEvent) => any;
          ontouchstart: (ev: TouchEvent) => any;
          onwebkitfullscreenchange: (ev: Event) => any;
          onwebkitfullscreenerror: (ev: Event) => any;
          scrollHeight: number;
          scrollLeft: number;
          scrollTop: number;
          scrollWidth: number;
          tagName: string;
          getAttribute(name?: string): string;
          getAttributeNS(namespaceURI: string, localName: string): string;
          getAttributeNode(name: string): Attr;
          getAttributeNodeNS(namespaceURI: string, localName: string): Attr;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          getElementsByTagName(name: "a"): NodeListOf<HTMLAnchorElement>;
          getElementsByTagName(name: "abbr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "acronym"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "address"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "applet"): NodeListOf<HTMLAppletElement>;
          getElementsByTagName(name: "area"): NodeListOf<HTMLAreaElement>;
          getElementsByTagName(name: "article"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "aside"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "audio"): NodeListOf<HTMLAudioElement>;
          getElementsByTagName(name: "b"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "base"): NodeListOf<HTMLBaseElement>;
          getElementsByTagName(name: "basefont"): NodeListOf<HTMLBaseFontElement>;
          getElementsByTagName(name: "bdo"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "big"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "blockquote"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "body"): NodeListOf<HTMLBodyElement>;
          getElementsByTagName(name: "br"): NodeListOf<HTMLBRElement>;
          getElementsByTagName(name: "button"): NodeListOf<HTMLButtonElement>;
          getElementsByTagName(name: "canvas"): NodeListOf<HTMLCanvasElement>;
          getElementsByTagName(name: "caption"): NodeListOf<HTMLTableCaptionElement>;
          getElementsByTagName(name: "center"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "circle"): NodeListOf<SVGCircleElement>;
          getElementsByTagName(name: "cite"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "clippath"): NodeListOf<SVGClipPathElement>;
          getElementsByTagName(name: "code"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "col"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(name: "colgroup"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(name: "datalist"): NodeListOf<HTMLDataListElement>;
          getElementsByTagName(name: "dd"): NodeListOf<HTMLDDElement>;
          getElementsByTagName(name: "defs"): NodeListOf<SVGDefsElement>;
          getElementsByTagName(name: "del"): NodeListOf<HTMLModElement>;
          getElementsByTagName(name: "desc"): NodeListOf<SVGDescElement>;
          getElementsByTagName(name: "dfn"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "dir"): NodeListOf<HTMLDirectoryElement>;
          getElementsByTagName(name: "div"): NodeListOf<HTMLDivElement>;
          getElementsByTagName(name: "dl"): NodeListOf<HTMLDListElement>;
          getElementsByTagName(name: "dt"): NodeListOf<HTMLDTElement>;
          getElementsByTagName(name: "ellipse"): NodeListOf<SVGEllipseElement>;
          getElementsByTagName(name: "em"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "embed"): NodeListOf<HTMLEmbedElement>;
          getElementsByTagName(name: "feblend"): NodeListOf<SVGFEBlendElement>;
          getElementsByTagName(name: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
          getElementsByTagName(name: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
          getElementsByTagName(name: "fecomposite"): NodeListOf<SVGFECompositeElement>;
          getElementsByTagName(name: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
          getElementsByTagName(name: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
          getElementsByTagName(name: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
          getElementsByTagName(name: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
          getElementsByTagName(name: "feflood"): NodeListOf<SVGFEFloodElement>;
          getElementsByTagName(name: "fefunca"): NodeListOf<SVGFEFuncAElement>;
          getElementsByTagName(name: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
          getElementsByTagName(name: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
          getElementsByTagName(name: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
          getElementsByTagName(name: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
          getElementsByTagName(name: "feimage"): NodeListOf<SVGFEImageElement>;
          getElementsByTagName(name: "femerge"): NodeListOf<SVGFEMergeElement>;
          getElementsByTagName(name: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
          getElementsByTagName(name: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
          getElementsByTagName(name: "feoffset"): NodeListOf<SVGFEOffsetElement>;
          getElementsByTagName(name: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
          getElementsByTagName(name: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
          getElementsByTagName(name: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
          getElementsByTagName(name: "fetile"): NodeListOf<SVGFETileElement>;
          getElementsByTagName(name: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
          getElementsByTagName(name: "fieldset"): NodeListOf<HTMLFieldSetElement>;
          getElementsByTagName(name: "figcaption"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "figure"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "filter"): NodeListOf<SVGFilterElement>;
          getElementsByTagName(name: "font"): NodeListOf<HTMLFontElement>;
          getElementsByTagName(name: "footer"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
          getElementsByTagName(name: "form"): NodeListOf<HTMLFormElement>;
          getElementsByTagName(name: "frame"): NodeListOf<HTMLFrameElement>;
          getElementsByTagName(name: "frameset"): NodeListOf<HTMLFrameSetElement>;
          getElementsByTagName(name: "g"): NodeListOf<SVGGElement>;
          getElementsByTagName(name: "h1"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h2"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h3"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h4"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h5"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h6"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "head"): NodeListOf<HTMLHeadElement>;
          getElementsByTagName(name: "header"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "hgroup"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "hr"): NodeListOf<HTMLHRElement>;
          getElementsByTagName(name: "html"): NodeListOf<HTMLHtmlElement>;
          getElementsByTagName(name: "i"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "iframe"): NodeListOf<HTMLIFrameElement>;
          getElementsByTagName(name: "image"): NodeListOf<SVGImageElement>;
          getElementsByTagName(name: "img"): NodeListOf<HTMLImageElement>;
          getElementsByTagName(name: "input"): NodeListOf<HTMLInputElement>;
          getElementsByTagName(name: "ins"): NodeListOf<HTMLModElement>;
          getElementsByTagName(name: "isindex"): NodeListOf<HTMLIsIndexElement>;
          getElementsByTagName(name: "kbd"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "keygen"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "label"): NodeListOf<HTMLLabelElement>;
          getElementsByTagName(name: "legend"): NodeListOf<HTMLLegendElement>;
          getElementsByTagName(name: "li"): NodeListOf<HTMLLIElement>;
          getElementsByTagName(name: "line"): NodeListOf<SVGLineElement>;
          getElementsByTagName(name: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
          getElementsByTagName(name: "link"): NodeListOf<HTMLLinkElement>;
          getElementsByTagName(name: "listing"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "map"): NodeListOf<HTMLMapElement>;
          getElementsByTagName(name: "mark"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "marker"): NodeListOf<SVGMarkerElement>;
          getElementsByTagName(name: "marquee"): NodeListOf<HTMLMarqueeElement>;
          getElementsByTagName(name: "mask"): NodeListOf<SVGMaskElement>;
          getElementsByTagName(name: "menu"): NodeListOf<HTMLMenuElement>;
          getElementsByTagName(name: "meta"): NodeListOf<HTMLMetaElement>;
          getElementsByTagName(name: "metadata"): NodeListOf<SVGMetadataElement>;
          getElementsByTagName(name: "nav"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "nextid"): NodeListOf<HTMLNextIdElement>;
          getElementsByTagName(name: "nobr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "noframes"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "noscript"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "object"): NodeListOf<HTMLObjectElement>;
          getElementsByTagName(name: "ol"): NodeListOf<HTMLOListElement>;
          getElementsByTagName(name: "optgroup"): NodeListOf<HTMLOptGroupElement>;
          getElementsByTagName(name: "option"): NodeListOf<HTMLOptionElement>;
          getElementsByTagName(name: "p"): NodeListOf<HTMLParagraphElement>;
          getElementsByTagName(name: "param"): NodeListOf<HTMLParamElement>;
          getElementsByTagName(name: "path"): NodeListOf<SVGPathElement>;
          getElementsByTagName(name: "pattern"): NodeListOf<SVGPatternElement>;
          getElementsByTagName(name: "plaintext"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "polygon"): NodeListOf<SVGPolygonElement>;
          getElementsByTagName(name: "polyline"): NodeListOf<SVGPolylineElement>;
          getElementsByTagName(name: "pre"): NodeListOf<HTMLPreElement>;
          getElementsByTagName(name: "progress"): NodeListOf<HTMLProgressElement>;
          getElementsByTagName(name: "q"): NodeListOf<HTMLQuoteElement>;
          getElementsByTagName(name: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
          getElementsByTagName(name: "rect"): NodeListOf<SVGRectElement>;
          getElementsByTagName(name: "rt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "ruby"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "s"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "samp"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "script"): NodeListOf<HTMLScriptElement>;
          getElementsByTagName(name: "section"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "select"): NodeListOf<HTMLSelectElement>;
          getElementsByTagName(name: "small"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "source"): NodeListOf<HTMLSourceElement>;
          getElementsByTagName(name: "span"): NodeListOf<HTMLSpanElement>;
          getElementsByTagName(name: "stop"): NodeListOf<SVGStopElement>;
          getElementsByTagName(name: "strike"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "strong"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "style"): NodeListOf<HTMLStyleElement>;
          getElementsByTagName(name: "sub"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "sup"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "svg"): NodeListOf<SVGSVGElement>;
          getElementsByTagName(name: "switch"): NodeListOf<SVGSwitchElement>;
          getElementsByTagName(name: "symbol"): NodeListOf<SVGSymbolElement>;
          getElementsByTagName(name: "table"): NodeListOf<HTMLTableElement>;
          getElementsByTagName(name: "tbody"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "td"): NodeListOf<HTMLTableDataCellElement>;
          getElementsByTagName(name: "text"): NodeListOf<SVGTextElement>;
          getElementsByTagName(name: "textpath"): NodeListOf<SVGTextPathElement>;
          getElementsByTagName(name: "textarea"): NodeListOf<HTMLTextAreaElement>;
          getElementsByTagName(name: "tfoot"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "th"): NodeListOf<HTMLTableHeaderCellElement>;
          getElementsByTagName(name: "thead"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "title"): NodeListOf<HTMLTitleElement>;
          getElementsByTagName(name: "tr"): NodeListOf<HTMLTableRowElement>;
          getElementsByTagName(name: "track"): NodeListOf<HTMLTrackElement>;
          getElementsByTagName(name: "tspan"): NodeListOf<SVGTSpanElement>;
          getElementsByTagName(name: "tt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "u"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "ul"): NodeListOf<HTMLUListElement>;
          getElementsByTagName(name: "use"): NodeListOf<SVGUseElement>;
          getElementsByTagName(name: "var"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "video"): NodeListOf<HTMLVideoElement>;
          getElementsByTagName(name: "view"): NodeListOf<SVGViewElement>;
          getElementsByTagName(name: "wbr"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
          getElementsByTagName(name: "xmp"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: string): NodeList;
          getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
          hasAttribute(name: string): boolean;
          hasAttributeNS(namespaceURI: string, localName: string): boolean;
          msGetRegionContent(): MSRangeCollection;
          msGetUntransformedBounds(): ClientRect;
          msMatchesSelector(selectors: string): boolean;
          msReleasePointerCapture(pointerId: number): void;
          msSetPointerCapture(pointerId: number): void;
          msZoomTo(args: MsZoomToOptions): void;
          releasePointerCapture(pointerId: number): void;
          removeAttribute(name?: string): void;
          removeAttributeNS(namespaceURI: string, localName: string): void;
          removeAttributeNode(oldAttr: Attr): Attr;
          requestFullscreen(): void;
          requestPointerLock(): void;
          setAttribute(name?: string, value?: string): void;
          setAttributeNS(namespaceURI: string, qualifiedName: string, value: string): void;
          setAttributeNode(newAttr: Attr): Attr;
          setAttributeNodeNS(newAttr: Attr): Attr;
          setPointerCapture(pointerId: number): void;
          webkitMatchesSelector(selectors: string): boolean;
          webkitRequestFullScreen(): void;
          webkitRequestFullscreen(): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Element: {
          prototype: Element;
          new(): Element;
      }
      
      interface ErrorEvent extends Event {
          colno: number;
          error: any;
          filename: string;
          lineno: number;
          message: string;
          initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void;
      }
      
      declare var ErrorEvent: {
          prototype: ErrorEvent;
          new(): ErrorEvent;
      }
      
      interface Event {
          bubbles: boolean;
          cancelBubble: boolean;
          cancelable: boolean;
          currentTarget: EventTarget;
          defaultPrevented: boolean;
          eventPhase: number;
          isTrusted: boolean;
          returnValue: boolean;
          srcElement: Element;
          target: EventTarget;
          timeStamp: number;
          type: string;
          initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void;
          preventDefault(): void;
          stopImmediatePropagation(): void;
          stopPropagation(): void;
          AT_TARGET: number;
          BUBBLING_PHASE: number;
          CAPTURING_PHASE: number;
      }
      
      declare var Event: {
          prototype: Event;
          new(type: string, eventInitDict?: EventInit): Event;
          AT_TARGET: number;
          BUBBLING_PHASE: number;
          CAPTURING_PHASE: number;
      }
      
      interface EventTarget {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          dispatchEvent(evt: Event): boolean;
          removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var EventTarget: {
          prototype: EventTarget;
          new(): EventTarget;
      }
      
      interface External {
      }
      
      declare var External: {
          prototype: External;
          new(): External;
      }
      
      interface File extends Blob {
          lastModifiedDate: any;
          name: string;
      }
      
      declare var File: {
          prototype: File;
          new(): File;
      }
      
      interface FileList {
          length: number;
          item(index: number): File;
          [index: number]: File;
      }
      
      declare var FileList: {
          prototype: FileList;
          new(): FileList;
      }
      
      interface FileReader extends EventTarget, MSBaseReader {
          error: DOMError;
          readAsArrayBuffer(blob: Blob): void;
          readAsBinaryString(blob: Blob): void;
          readAsDataURL(blob: Blob): void;
          readAsText(blob: Blob, encoding?: string): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var FileReader: {
          prototype: FileReader;
          new(): FileReader;
      }
      
      interface FocusEvent extends UIEvent {
          relatedTarget: EventTarget;
          initFocusEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, relatedTargetArg: EventTarget): void;
      }
      
      declare var FocusEvent: {
          prototype: FocusEvent;
          new(typeArg: string, eventInitDict?: FocusEventInit): FocusEvent;
      }
      
      interface FormData {
          append(name: any, value: any, blobName?: string): void;
      }
      
      declare var FormData: {
          prototype: FormData;
          new(): FormData;
      }
      
      interface GainNode extends AudioNode {
          gain: AudioParam;
      }
      
      declare var GainNode: {
          prototype: GainNode;
          new(): GainNode;
      }
      
      interface Gamepad {
          axes: number[];
          buttons: GamepadButton[];
          connected: boolean;
          id: string;
          index: number;
          mapping: string;
          timestamp: number;
      }
      
      declare var Gamepad: {
          prototype: Gamepad;
          new(): Gamepad;
      }
      
      interface GamepadButton {
          pressed: boolean;
          value: number;
      }
      
      declare var GamepadButton: {
          prototype: GamepadButton;
          new(): GamepadButton;
      }
      
      interface GamepadEvent extends Event {
          gamepad: Gamepad;
      }
      
      declare var GamepadEvent: {
          prototype: GamepadEvent;
          new(): GamepadEvent;
      }
      
      interface Geolocation {
          clearWatch(watchId: number): void;
          getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): void;
          watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): number;
      }
      
      declare var Geolocation: {
          prototype: Geolocation;
          new(): Geolocation;
      }
      
      interface HTMLAllCollection extends HTMLCollection {
          namedItem(name: string): Element;
      }
      
      declare var HTMLAllCollection: {
          prototype: HTMLAllCollection;
          new(): HTMLAllCollection;
      }
      
      interface HTMLAnchorElement extends HTMLElement {
          Methods: string;
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Sets or retrieves the coordinates of the object.
            */
          coords: string;
          /**
            * Contains the anchor portion of the URL including the hash sign (#).
            */
          hash: string;
          /**
            * Contains the hostname and port values of the URL.
            */
          host: string;
          /**
            * Contains the hostname of a URL.
            */
          hostname: string;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or retrieves the language code of the object.
            */
          hreflang: string;
          mimeType: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          name: string;
          nameProp: string;
          /**
            * Contains the pathname of the URL.
            */
          pathname: string;
          /**
            * Sets or retrieves the port number associated with a URL.
            */
          port: string;
          /**
            * Contains the protocol of the URL.
            */
          protocol: string;
          protocolLong: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rel: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rev: string;
          /**
            * Sets or retrieves the substring of the href property that follows the question mark.
            */
          search: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          shape: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
          type: string;
          urn: string;
          /** 
            * Returns a string representation of an object.
            */
          toString(): string;
      }
      
      declare var HTMLAnchorElement: {
          prototype: HTMLAnchorElement;
          new(): HTMLAnchorElement;
      }
      
      interface HTMLAppletElement extends HTMLElement {
          /**
            * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
            */
          BaseHref: string;
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Gets or sets the optional alternative HTML script to execute if the object fails to load.
            */
          altHtml: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
            */
          archive: string;
          border: string;
          code: string;
          /**
            * Sets or retrieves the URL of the component.
            */
          codeBase: string;
          /**
            * Sets or retrieves the Internet media type for the code associated with the object.
            */
          codeType: string;
          /**
            * Address of a pointer to the document this page or frame contains. If there is no document, then null will be returned.
            */
          contentDocument: Document;
          /**
            * Sets or retrieves the URL that references the data of the object.
            */
          data: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own declare functionality for the object.
            */
          declare: boolean;
          form: HTMLFormElement;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hspace: number;
          /**
            * Sets or retrieves the shape of the object.
            */
          name: string;
          object: string;
          /**
            * Sets or retrieves a message to be displayed while an object is loading.
            */
          standby: string;
          /**
            * Returns the content type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          vspace: number;
          width: number;
      }
      
      declare var HTMLAppletElement: {
          prototype: HTMLAppletElement;
          new(): HTMLAppletElement;
      }
      
      interface HTMLAreaElement extends HTMLElement {
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Sets or retrieves the coordinates of the object.
            */
          coords: string;
          /**
            * Sets or retrieves the subsection of the href property that follows the number sign (#).
            */
          hash: string;
          /**
            * Sets or retrieves the hostname and port number of the location or URL.
            */
          host: string;
          /**
            * Sets or retrieves the host name part of the location or URL. 
            */
          hostname: string;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or gets whether clicks in this region cause action.
            */
          noHref: boolean;
          /**
            * Sets or retrieves the file name or path specified by the object.
            */
          pathname: string;
          /**
            * Sets or retrieves the port number associated with a URL.
            */
          port: string;
          /**
            * Sets or retrieves the protocol portion of a URL.
            */
          protocol: string;
          rel: string;
          /**
            * Sets or retrieves the substring of the href property that follows the question mark.
            */
          search: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          shape: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /** 
            * Returns a string representation of an object.
            */
          toString(): string;
      }
      
      declare var HTMLAreaElement: {
          prototype: HTMLAreaElement;
          new(): HTMLAreaElement;
      }
      
      interface HTMLAreasCollection extends HTMLCollection {
          /**
            * Adds an element to the areas, controlRange, or options collection.
            */
          add(element: HTMLElement, before?: HTMLElement): void;
          add(element: HTMLElement, before?: number): void;
          /**
            * Removes an element from the collection.
            */
          remove(index?: number): void;
      }
      
      declare var HTMLAreasCollection: {
          prototype: HTMLAreasCollection;
          new(): HTMLAreasCollection;
      }
      
      interface HTMLAudioElement extends HTMLMediaElement {
      }
      
      declare var HTMLAudioElement: {
          prototype: HTMLAudioElement;
          new(): HTMLAudioElement;
      }
      
      interface HTMLBRElement extends HTMLElement {
          /**
            * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.
            */
          clear: string;
      }
      
      declare var HTMLBRElement: {
          prototype: HTMLBRElement;
          new(): HTMLBRElement;
      }
      
      interface HTMLBaseElement extends HTMLElement {
          /**
            * Gets or sets the baseline URL on which relative links are based.
            */
          href: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
      }
      
      declare var HTMLBaseElement: {
          prototype: HTMLBaseElement;
          new(): HTMLBaseElement;
      }
      
      interface HTMLBaseFontElement extends HTMLElement, DOML2DeprecatedColorProperty {
          /**
            * Sets or retrieves the current typeface family.
            */
          face: string;
          /**
            * Sets or retrieves the font size of the object.
            */
          size: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLBaseFontElement: {
          prototype: HTMLBaseFontElement;
          new(): HTMLBaseFontElement;
      }
      
      interface HTMLBlockElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          clear: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
      }
      
      declare var HTMLBlockElement: {
          prototype: HTMLBlockElement;
          new(): HTMLBlockElement;
      }
      
      interface HTMLBodyElement extends HTMLElement {
          aLink: any;
          background: string;
          bgColor: any;
          bgProperties: string;
          link: any;
          noWrap: boolean;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          onblur: (ev: FocusEvent) => any;
          onerror: (ev: Event) => any;
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          onload: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onpopstate: (ev: PopStateEvent) => any;
          onresize: (ev: UIEvent) => any;
          onstorage: (ev: StorageEvent) => any;
          onunload: (ev: Event) => any;
          text: any;
          vLink: any;
          createTextRange(): TextRange;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLBodyElement: {
          prototype: HTMLBodyElement;
          new(): HTMLBodyElement;
      }
      
      interface HTMLButtonElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Overrides the action attribute (where the data on a form is sent) on the parent form element.
            */
          formAction: string;
          /**
            * Used to override the encoding (formEnctype attribute) specified on the form element.
            */
          formEnctype: string;
          /**
            * Overrides the submit method attribute previously specified on a form element.
            */
          formMethod: string;
          /**
            * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
            */
          formNoValidate: string;
          /**
            * Overrides the target attribute on a form element.
            */
          formTarget: string;
          /** 
            * Sets or retrieves the name of the object.
            */
          name: string;
          status: any;
          /**
            * Gets the classification and default behavior of the button.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /** 
            * Sets or retrieves the default or selected value of the control.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
      }
      
      declare var HTMLButtonElement: {
          prototype: HTMLButtonElement;
          new(): HTMLButtonElement;
      }
      
      interface HTMLCanvasElement extends HTMLElement {
          /**
            * Gets or sets the height of a canvas element on a document.
            */
          height: number;
          /**
            * Gets or sets the width of a canvas element on a document.
            */
          width: number;
          /**
            * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
            * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");
            */
          getContext(contextId: "2d"): CanvasRenderingContext2D;
          getContext(contextId: "experimental-webgl"): WebGLRenderingContext;
          getContext(contextId: string, ...args: any[]): CanvasRenderingContext2D | WebGLRenderingContext;
          /**
            * Returns a blob object encoded as a Portable Network Graphics (PNG) format from a canvas image or drawing.
            */
          msToBlob(): Blob;
          /**
            * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.
            * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.
            */
          toDataURL(type?: string, ...args: any[]): string;
      }
      
      declare var HTMLCanvasElement: {
          prototype: HTMLCanvasElement;
          new(): HTMLCanvasElement;
      }
      
      interface HTMLCollection {
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Retrieves an object from various collections.
            */
          item(nameOrIndex?: any, optionalIndex?: any): Element;
          /**
            * Retrieves a select object or an object from an options collection.
            */
          namedItem(name: string): Element;
          [index: number]: Element;
      }
      
      declare var HTMLCollection: {
          prototype: HTMLCollection;
          new(): HTMLCollection;
      }
      
      interface HTMLDDElement extends HTMLElement {
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDDElement: {
          prototype: HTMLDDElement;
          new(): HTMLDDElement;
      }
      
      interface HTMLDListElement extends HTMLElement {
          compact: boolean;
      }
      
      declare var HTMLDListElement: {
          prototype: HTMLDListElement;
          new(): HTMLDListElement;
      }
      
      interface HTMLDTElement extends HTMLElement {
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDTElement: {
          prototype: HTMLDTElement;
          new(): HTMLDTElement;
      }
      
      interface HTMLDataListElement extends HTMLElement {
          options: HTMLCollection;
      }
      
      declare var HTMLDataListElement: {
          prototype: HTMLDataListElement;
          new(): HTMLDataListElement;
      }
      
      interface HTMLDirectoryElement extends HTMLElement {
          compact: boolean;
      }
      
      declare var HTMLDirectoryElement: {
          prototype: HTMLDirectoryElement;
          new(): HTMLDirectoryElement;
      }
      
      interface HTMLDivElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text. 
            */
          align: string;
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDivElement: {
          prototype: HTMLDivElement;
          new(): HTMLDivElement;
      }
      
      interface HTMLDocument extends Document {
      }
      
      declare var HTMLDocument: {
          prototype: HTMLDocument;
          new(): HTMLDocument;
      }
      
      interface HTMLElement extends Element {
          accessKey: string;
          children: HTMLCollection;
          className: string;
          contentEditable: string;
          dataset: DOMStringMap;
          dir: string;
          draggable: boolean;
          hidden: boolean;
          hideFocus: boolean;
          id: string;
          innerHTML: string;
          innerText: string;
          isContentEditable: boolean;
          lang: string;
          offsetHeight: number;
          offsetLeft: number;
          offsetParent: Element;
          offsetTop: number;
          offsetWidth: number;
          onabort: (ev: Event) => any;
          onactivate: (ev: UIEvent) => any;
          onbeforeactivate: (ev: UIEvent) => any;
          onbeforecopy: (ev: DragEvent) => any;
          onbeforecut: (ev: DragEvent) => any;
          onbeforedeactivate: (ev: UIEvent) => any;
          onbeforepaste: (ev: DragEvent) => any;
          onblur: (ev: FocusEvent) => any;
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          onchange: (ev: Event) => any;
          onclick: (ev: MouseEvent) => any;
          oncontextmenu: (ev: PointerEvent) => any;
          oncopy: (ev: DragEvent) => any;
          oncuechange: (ev: Event) => any;
          oncut: (ev: DragEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          ondeactivate: (ev: UIEvent) => any;
          ondrag: (ev: DragEvent) => any;
          ondragend: (ev: DragEvent) => any;
          ondragenter: (ev: DragEvent) => any;
          ondragleave: (ev: DragEvent) => any;
          ondragover: (ev: DragEvent) => any;
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          ondurationchange: (ev: Event) => any;
          onemptied: (ev: Event) => any;
          onended: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onfocus: (ev: FocusEvent) => any;
          oninput: (ev: Event) => any;
          onkeydown: (ev: KeyboardEvent) => any;
          onkeypress: (ev: KeyboardEvent) => any;
          onkeyup: (ev: KeyboardEvent) => any;
          onload: (ev: Event) => any;
          onloadeddata: (ev: Event) => any;
          onloadedmetadata: (ev: Event) => any;
          onloadstart: (ev: Event) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmouseenter: (ev: MouseEvent) => any;
          onmouseleave: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmscontentzoom: (ev: UIEvent) => any;
          onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
          onpaste: (ev: DragEvent) => any;
          onpause: (ev: Event) => any;
          onplay: (ev: Event) => any;
          onplaying: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          onratechange: (ev: Event) => any;
          onreset: (ev: Event) => any;
          onscroll: (ev: UIEvent) => any;
          onseeked: (ev: Event) => any;
          onseeking: (ev: Event) => any;
          onselect: (ev: UIEvent) => any;
          onselectstart: (ev: Event) => any;
          onstalled: (ev: Event) => any;
          onsubmit: (ev: Event) => any;
          onsuspend: (ev: Event) => any;
          ontimeupdate: (ev: Event) => any;
          onvolumechange: (ev: Event) => any;
          onwaiting: (ev: Event) => any;
          outerHTML: string;
          outerText: string;
          spellcheck: boolean;
          style: CSSStyleDeclaration;
          tabIndex: number;
          title: string;
          blur(): void;
          click(): void;
          contains(child: HTMLElement): boolean;
          dragDrop(): boolean;
          focus(): void;
          getElementsByClassName(classNames: string): NodeList;
          insertAdjacentElement(position: string, insertedElement: Element): Element;
          insertAdjacentHTML(where: string, html: string): void;
          insertAdjacentText(where: string, text: string): void;
          msGetInputContext(): MSInputMethodContext;
          scrollIntoView(top?: boolean): void;
          setActive(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLElement: {
          prototype: HTMLElement;
          new(): HTMLElement;
      }
      
      interface HTMLEmbedElement extends HTMLElement, GetSVGDocument {
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hidden: any;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Retrieves the palette used for the embedded document.
            */
          palette: string;
          /**
            * Retrieves the URL of the plug-in used to view an embedded document.
            */
          pluginspage: string;
          readyState: string;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the height and width units of the embed object.
            */
          units: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLEmbedElement: {
          prototype: HTMLEmbedElement;
          new(): HTMLEmbedElement;
      }
      
      interface HTMLFieldSetElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
      }
      
      declare var HTMLFieldSetElement: {
          prototype: HTMLFieldSetElement;
          new(): HTMLFieldSetElement;
      }
      
      interface HTMLFontElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
          /**
            * Sets or retrieves the current typeface family.
            */
          face: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFontElement: {
          prototype: HTMLFontElement;
          new(): HTMLFontElement;
      }
      
      interface HTMLFormElement extends HTMLElement {
          /**
            * Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form.
            */
          acceptCharset: string;
          /**
            * Sets or retrieves the URL to which the form content is sent for processing.
            */
          action: string;
          /**
            * Specifies whether autocomplete is applied to an editable text field.
            */
          autocomplete: string;
          /**
            * Retrieves a collection, in source order, of all controls in a given form.
            */
          elements: HTMLCollection;
          /**
            * Sets or retrieves the MIME encoding for the form.
            */
          encoding: string;
          /**
            * Sets or retrieves the encoding type for the form.
            */
          enctype: string;
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Sets or retrieves how to send the form data to the server.
            */
          method: string;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Designates a form that is not validated when submitted.
            */
          noValidate: boolean;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Retrieves a form object or an object from an elements collection.
            * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is a Number, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
            * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
            */
          item(name?: any, index?: any): any;
          /**
            * Retrieves a form object or an object from an elements collection.
            */
          namedItem(name: string): any;
          /**
            * Fires when the user resets a form.
            */
          reset(): void;
          /**
            * Fires when a FORM is about to be submitted.
            */
          submit(): void;
          [name: string]: any;
      }
      
      declare var HTMLFormElement: {
          prototype: HTMLFormElement;
          new(): HTMLFormElement;
      }
      
      interface HTMLFrameElement extends HTMLElement, GetSVGDocument {
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Sets or retrieves the border color of the object.
            */
          borderColor: any;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Retrieves the object of the specified.
            */
          contentWindow: Window;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string | number;
          /**
            * Sets or retrieves a URI to a long description of the object.
            */
          longDesc: string;
          /**
            * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
            */
          marginHeight: string;
          /**
            * Sets or retrieves the left and right margin widths before displaying the text in a frame.
            */
          marginWidth: string;
          /**
            * Sets or retrieves the frame name.
            */
          name: string;
          /**
            * Sets or retrieves whether the user can resize the frame.
            */
          noResize: boolean;
          /**
            * Raised when the object has been completely received from the server.
            */
          onload: (ev: Event) => any;
          /**
            * Sets or retrieves whether the frame can be scrolled.
            */
          scrolling: string;
          /**
            * Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
            */
          security: any;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string | number;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFrameElement: {
          prototype: HTMLFrameElement;
          new(): HTMLFrameElement;
      }
      
      interface HTMLFrameSetElement extends HTMLElement {
          border: string;
          /**
            * Sets or retrieves the border color of the object.
            */
          borderColor: any;
          /**
            * Sets or retrieves the frame widths of the object.
            */
          cols: string;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          name: string;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          /**
            * Fires when the object loses the input focus.
            */
          onblur: (ev: FocusEvent) => any;
          onerror: (ev: Event) => any;
          /**
            * Fires when the object receives focus.
            */
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          onload: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onresize: (ev: UIEvent) => any;
          onstorage: (ev: StorageEvent) => any;
          onunload: (ev: Event) => any;
          /**
            * Sets or retrieves the frame heights of the object.
            */
          rows: string;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFrameSetElement: {
          prototype: HTMLFrameSetElement;
          new(): HTMLFrameSetElement;
      }
      
      interface HTMLHRElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.
            */
          noShade: boolean;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLHRElement: {
          prototype: HTMLHRElement;
          new(): HTMLHRElement;
      }
      
      interface HTMLHeadElement extends HTMLElement {
          profile: string;
      }
      
      declare var HTMLHeadElement: {
          prototype: HTMLHeadElement;
          new(): HTMLHeadElement;
      }
      
      interface HTMLHeadingElement extends HTMLElement {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          clear: string;
      }
      
      declare var HTMLHeadingElement: {
          prototype: HTMLHeadingElement;
          new(): HTMLHeadingElement;
      }
      
      interface HTMLHtmlElement extends HTMLElement {
          /**
            * Sets or retrieves the DTD version that governs the current document.
            */
          version: string;
      }
      
      declare var HTMLHtmlElement: {
          prototype: HTMLHtmlElement;
          new(): HTMLHtmlElement;
      }
      
      interface HTMLIFrameElement extends HTMLElement, GetSVGDocument {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          allowFullscreen: boolean;
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Retrieves the object of the specified.
            */
          contentWindow: Window;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          /**
            * Sets or retrieves the horizontal margin for the object.
            */
          hspace: number;
          /**
            * Sets or retrieves a URI to a long description of the object.
            */
          longDesc: string;
          /**
            * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
            */
          marginHeight: string;
          /**
            * Sets or retrieves the left and right margin widths before displaying the text in a frame.
            */
          marginWidth: string;
          /**
            * Sets or retrieves the frame name.
            */
          name: string;
          /**
            * Sets or retrieves whether the user can resize the frame.
            */
          noResize: boolean;
          /**
            * Raised when the object has been completely received from the server.
            */
          onload: (ev: Event) => any;
          sandbox: DOMSettableTokenList;
          /**
            * Sets or retrieves whether the frame can be scrolled.
            */
          scrolling: string;
          /**
            * Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
            */
          security: any;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLIFrameElement: {
          prototype: HTMLIFrameElement;
          new(): HTMLIFrameElement;
      }
      
      interface HTMLImageElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Retrieves whether the object is fully loaded.
            */
          complete: boolean;
          crossOrigin: string;
          currentSrc: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: number;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          hspace: number;
          /**
            * Sets or retrieves whether the image is a server-side image map.
            */
          isMap: boolean;
          /**
            * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.
            */
          longDesc: string;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * The original height of the image resource before sizing.
            */
          naturalHeight: number;
          /**
            * The original width of the image resource before sizing.
            */
          naturalWidth: number;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          srcset: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
          x: number;
          y: number;
          msGetAsCastingSource(): any;
      }
      
      declare var HTMLImageElement: {
          prototype: HTMLImageElement;
          new(): HTMLImageElement;
          create(): HTMLImageElement;
      }
      
      interface HTMLInputElement extends HTMLElement {
          /**
            * Sets or retrieves a comma-separated list of content types.
            */
          accept: string;
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Specifies whether autocomplete is applied to an editable text field.
            */
          autocomplete: string;
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          border: string;
          /**
            * Sets or retrieves the state of the check box or radio button.
            */
          checked: boolean;
          /**
            * Retrieves whether the object is fully loaded.
            */
          complete: boolean;
          /**
            * Sets or retrieves the state of the check box or radio button.
            */
          defaultChecked: boolean;
          /**
            * Sets or retrieves the initial contents of the object.
            */
          defaultValue: string;
          disabled: boolean;
          /**
            * Returns a FileList object on a file type input object.
            */
          files: FileList;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          /**
            * Overrides the action attribute (where the data on a form is sent) on the parent form element.
            */
          formAction: string;
          /**
            * Used to override the encoding (formEnctype attribute) specified on the form element.
            */
          formEnctype: string;
          /**
            * Overrides the submit method attribute previously specified on a form element.
            */
          formMethod: string;
          /**
            * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
            */
          formNoValidate: string;
          /**
            * Overrides the target attribute on a form element.
            */
          formTarget: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          hspace: number;
          indeterminate: boolean;
          /**
            * Specifies the ID of a pre-defined datalist of options for an input element.
            */
          list: HTMLElement;
          /**
            * Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field.
            */
          max: string;
          /**
            * Sets or retrieves the maximum number of characters that the user can enter in a text control.
            */
          maxLength: number;
          /**
            * Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field.
            */
          min: string;
          /**
            * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
            */
          multiple: boolean;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Gets or sets a string containing a regular expression that the user's input must match.
            */
          pattern: string;
          /**
            * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
            */
          placeholder: string;
          readOnly: boolean;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Gets or sets the end position or offset of a text selection.
            */
          selectionEnd: number;
          /**
            * Gets or sets the starting position or offset of a text selection.
            */
          selectionStart: number;
          size: number;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          status: boolean;
          /**
            * Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field.
            */
          step: string;
          /**
            * Returns the content type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Returns the value of the data at the cursor's current position.
            */
          value: string;
          valueAsDate: Date;
          /**
            * Returns the input field value as a number.
            */
          valueAsNumber: number;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Makes the selection equal to the current object.
            */
          select(): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          /**
            * Sets the start and end positions of a selection in a text field.
            * @param start The offset into the text field for the start of the selection.
            * @param end The offset into the text field for the end of the selection.
            */
          setSelectionRange(start: number, end: number): void;
          /**
            * Decrements a range input control's value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control's step value multiplied by the parameter's value.
            * @param n Value to decrement the value by.
            */
          stepDown(n?: number): void;
          /**
            * Increments a range input control's value by the value given by the Step attribute. If the optional parameter is used, will increment the input control's value by that value.
            * @param n Value to increment the value by.
            */
          stepUp(n?: number): void;
      }
      
      declare var HTMLInputElement: {
          prototype: HTMLInputElement;
          new(): HTMLInputElement;
      }
      
      interface HTMLIsIndexElement extends HTMLElement {
          /**
            * Sets or retrieves the URL to which the form content is sent for processing.
            */
          action: string;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          prompt: string;
      }
      
      declare var HTMLIsIndexElement: {
          prototype: HTMLIsIndexElement;
          new(): HTMLIsIndexElement;
      }
      
      interface HTMLLIElement extends HTMLElement {
          type: string;
          /**
            * Sets or retrieves the value of a list item.
            */
          value: number;
      }
      
      declare var HTMLLIElement: {
          prototype: HTMLLIElement;
          new(): HTMLLIElement;
      }
      
      interface HTMLLabelElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the object to which the given label object is assigned.
            */
          htmlFor: string;
      }
      
      declare var HTMLLabelElement: {
          prototype: HTMLLabelElement;
          new(): HTMLLabelElement;
      }
      
      interface HTMLLegendElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          align: string;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
      }
      
      declare var HTMLLegendElement: {
          prototype: HTMLLegendElement;
          new(): HTMLLegendElement;
      }
      
      interface HTMLLinkElement extends HTMLElement, LinkStyle {
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          disabled: boolean;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or retrieves the language code of the object.
            */
          hreflang: string;
          /**
            * Sets or retrieves the media type.
            */
          media: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rel: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rev: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Sets or retrieves the MIME type of the object.
            */
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLLinkElement: {
          prototype: HTMLLinkElement;
          new(): HTMLLinkElement;
      }
      
      interface HTMLMapElement extends HTMLElement {
          /**
            * Retrieves a collection of the area objects defined for the given map object.
            */
          areas: HTMLAreasCollection;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
      }
      
      declare var HTMLMapElement: {
          prototype: HTMLMapElement;
          new(): HTMLMapElement;
      }
      
      interface HTMLMarqueeElement extends HTMLElement {
          behavior: string;
          bgColor: any;
          direction: string;
          height: string;
          hspace: number;
          loop: number;
          onbounce: (ev: Event) => any;
          onfinish: (ev: Event) => any;
          onstart: (ev: Event) => any;
          scrollAmount: number;
          scrollDelay: number;
          trueSpeed: boolean;
          vspace: number;
          width: string;
          start(): void;
          stop(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "bounce", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "finish", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "start", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLMarqueeElement: {
          prototype: HTMLMarqueeElement;
          new(): HTMLMarqueeElement;
      }
      
      interface HTMLMediaElement extends HTMLElement {
          /**
            * Returns an AudioTrackList object with the audio tracks for a given video element.
            */
          audioTracks: AudioTrackList;
          /**
            * Gets or sets a value that indicates whether to start playing the media automatically.
            */
          autoplay: boolean;
          /**
            * Gets a collection of buffered time ranges.
            */
          buffered: TimeRanges;
          /**
            * Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player).
            */
          controls: boolean;
          /**
            * Gets the address or URL of the current media resource that is selected by IHTMLMediaElement.
            */
          currentSrc: string;
          /**
            * Gets or sets the current playback position, in seconds.
            */
          currentTime: number;
          defaultMuted: boolean;
          /**
            * Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource.
            */
          defaultPlaybackRate: number;
          /**
            * Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming.
            */
          duration: number;
          /**
            * Gets information about whether the playback has ended or not.
            */
          ended: boolean;
          /**
            * Returns an object representing the current error state of the audio or video element.
            */
          error: MediaError;
          /**
            * Gets or sets a flag to specify whether playback should restart after it completes.
            */
          loop: boolean;
          /**
            * Specifies the purpose of the audio or video media, such as background audio or alerts.
            */
          msAudioCategory: string;
          /**
            * Specifies the output device id that the audio will be sent to.
            */
          msAudioDeviceType: string;
          msGraphicsTrustStatus: MSGraphicsTrust;
          /**
            * Gets the MSMediaKeys object, which is used for decrypting media data, that is associated with this media element.
            */
          msKeys: MSMediaKeys;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Specifies whether or not to enable low-latency playback on the media element.
            */
          msRealTime: boolean;
          /**
            * Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted.
            */
          muted: boolean;
          /**
            * Gets the current network activity for the element.
            */
          networkState: number;
          onmsneedkey: (ev: MSMediaKeyNeededEvent) => any;
          /**
            * Gets a flag that specifies whether playback is paused.
            */
          paused: boolean;
          /**
            * Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource.
            */
          playbackRate: number;
          /**
            * Gets TimeRanges for the current media resource that has been played.
            */
          played: TimeRanges;
          /**
            * Gets or sets the current playback position, in seconds.
            */
          preload: string;
          readyState: any;
          /**
            * Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked.
            */
          seekable: TimeRanges;
          /**
            * Gets a flag that indicates whether the the client is currently moving to a new playback position in the media resource.
            */
          seeking: boolean;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          textTracks: TextTrackList;
          videoTracks: VideoTrackList;
          /**
            * Gets or sets the volume level for audio portions of the media element.
            */
          volume: number;
          addTextTrack(kind: string, label?: string, language?: string): TextTrack;
          /**
            * Returns a string that specifies whether the client can play a given media resource type.
            */
          canPlayType(type: string): string;
          /**
            * Fires immediately after the client loads the object.
            */
          load(): void;
          /**
            * Clears all effects from the media pipeline.
            */
          msClearEffects(): void;
          msGetAsCastingSource(): any;
          /**
            * Inserts the specified audio effect into media pipeline.
            */
          msInsertAudioEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
          msSetMediaKeys(mediaKeys: MSMediaKeys): void;
          /**
            * Specifies the media protection manager for a given media pipeline.
            */
          msSetMediaProtectionManager(mediaProtectionManager?: any): void;
          /**
            * Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not.
            */
          pause(): void;
          /**
            * Loads and starts playback of a media resource.
            */
          play(): void;
          HAVE_CURRENT_DATA: number;
          HAVE_ENOUGH_DATA: number;
          HAVE_FUTURE_DATA: number;
          HAVE_METADATA: number;
          HAVE_NOTHING: number;
          NETWORK_EMPTY: number;
          NETWORK_IDLE: number;
          NETWORK_LOADING: number;
          NETWORK_NO_SOURCE: number;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLMediaElement: {
          prototype: HTMLMediaElement;
          new(): HTMLMediaElement;
          HAVE_CURRENT_DATA: number;
          HAVE_ENOUGH_DATA: number;
          HAVE_FUTURE_DATA: number;
          HAVE_METADATA: number;
          HAVE_NOTHING: number;
          NETWORK_EMPTY: number;
          NETWORK_IDLE: number;
          NETWORK_LOADING: number;
          NETWORK_NO_SOURCE: number;
      }
      
      interface HTMLMenuElement extends HTMLElement {
          compact: boolean;
          type: string;
      }
      
      declare var HTMLMenuElement: {
          prototype: HTMLMenuElement;
          new(): HTMLMenuElement;
      }
      
      interface HTMLMetaElement extends HTMLElement {
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Gets or sets meta-information to associate with httpEquiv or name.
            */
          content: string;
          /**
            * Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header.
            */
          httpEquiv: string;
          /**
            * Sets or retrieves the value specified in the content attribute of the meta object.
            */
          name: string;
          /**
            * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.
            */
          scheme: string;
          /**
            * Sets or retrieves the URL property that will be loaded after the specified time has elapsed. 
            */
          url: string;
      }
      
      declare var HTMLMetaElement: {
          prototype: HTMLMetaElement;
          new(): HTMLMetaElement;
      }
      
      interface HTMLModElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLModElement: {
          prototype: HTMLModElement;
          new(): HTMLModElement;
      }
      
      interface HTMLNextIdElement extends HTMLElement {
          n: string;
      }
      
      declare var HTMLNextIdElement: {
          prototype: HTMLNextIdElement;
          new(): HTMLNextIdElement;
      }
      
      interface HTMLOListElement extends HTMLElement {
          compact: boolean;
          /**
            * The starting number.
            */
          start: number;
          type: string;
      }
      
      declare var HTMLOListElement: {
          prototype: HTMLOListElement;
          new(): HTMLOListElement;
      }
      
      interface HTMLObjectElement extends HTMLElement, GetSVGDocument {
          /**
            * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
            */
          BaseHref: string;
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Gets or sets the optional alternative HTML script to execute if the object fails to load.
            */
          altHtml: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
            */
          archive: string;
          border: string;
          /**
            * Sets or retrieves the URL of the file containing the compiled Java class.
            */
          code: string;
          /**
            * Sets or retrieves the URL of the component.
            */
          codeBase: string;
          /**
            * Sets or retrieves the Internet media type for the code associated with the object.
            */
          codeType: string;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Sets or retrieves the URL that references the data of the object.
            */
          data: string;
          declare: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hspace: number;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Retrieves the contained object.
            */
          object: any;
          readyState: number;
          /**
            * Sets or retrieves a message to be displayed while an object is loading.
            */
          standby: string;
          /**
            * Sets or retrieves the MIME type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLObjectElement: {
          prototype: HTMLObjectElement;
          new(): HTMLObjectElement;
      }
      
      interface HTMLOptGroupElement extends HTMLElement {
          /**
            * Sets or retrieves the status of an option.
            */
          defaultSelected: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the ordinal position of an option in a list box.
            */
          index: number;
          /**
            * Sets or retrieves a value that you can use to implement your own label functionality for the object.
            */
          label: string;
          /**
            * Sets or retrieves whether the option in the list box is the default item.
            */
          selected: boolean;
          /**
            * Sets or retrieves the text string specified by the option tag.
            */
          text: string;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
      }
      
      declare var HTMLOptGroupElement: {
          prototype: HTMLOptGroupElement;
          new(): HTMLOptGroupElement;
      }
      
      interface HTMLOptionElement extends HTMLElement {
          /**
            * Sets or retrieves the status of an option.
            */
          defaultSelected: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the ordinal position of an option in a list box.
            */
          index: number;
          /**
            * Sets or retrieves a value that you can use to implement your own label functionality for the object.
            */
          label: string;
          /**
            * Sets or retrieves whether the option in the list box is the default item.
            */
          selected: boolean;
          /**
            * Sets or retrieves the text string specified by the option tag.
            */
          text: string;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
      }
      
      declare var HTMLOptionElement: {
          prototype: HTMLOptionElement;
          new(): HTMLOptionElement;
          create(): HTMLOptionElement;
      }
      
      interface HTMLParagraphElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text. 
            */
          align: string;
          clear: string;
      }
      
      declare var HTMLParagraphElement: {
          prototype: HTMLParagraphElement;
          new(): HTMLParagraphElement;
      }
      
      interface HTMLParamElement extends HTMLElement {
          /**
            * Sets or retrieves the name of an input parameter for an element.
            */
          name: string;
          /**
            * Sets or retrieves the content type of the resource designated by the value attribute.
            */
          type: string;
          /**
            * Sets or retrieves the value of an input parameter for an element.
            */
          value: string;
          /**
            * Sets or retrieves the data type of the value attribute.
            */
          valueType: string;
      }
      
      declare var HTMLParamElement: {
          prototype: HTMLParamElement;
          new(): HTMLParamElement;
      }
      
      interface HTMLPhraseElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLPhraseElement: {
          prototype: HTMLPhraseElement;
          new(): HTMLPhraseElement;
      }
      
      interface HTMLPreElement extends HTMLElement {
          /**
            * Indicates a citation by rendering text in italic type.
            */
          cite: string;
          clear: string;
          /**
            * Sets or gets a value that you can use to implement your own width functionality for the object.
            */
          width: number;
      }
      
      declare var HTMLPreElement: {
          prototype: HTMLPreElement;
          new(): HTMLPreElement;
      }
      
      interface HTMLProgressElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Defines the maximum, or "done" value for a progress element.
            */
          max: number;
          /**
            * Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar).
            */
          position: number;
          /**
            * Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value.
            */
          value: number;
      }
      
      declare var HTMLProgressElement: {
          prototype: HTMLProgressElement;
          new(): HTMLProgressElement;
      }
      
      interface HTMLQuoteElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLQuoteElement: {
          prototype: HTMLQuoteElement;
          new(): HTMLQuoteElement;
      }
      
      interface HTMLScriptElement extends HTMLElement {
          async: boolean;
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Sets or retrieves the status of the script.
            */
          defer: boolean;
          /**
            * Sets or retrieves the event for which the script is written. 
            */
          event: string;
          /** 
            * Sets or retrieves the object that is bound to the event script.
            */
          htmlFor: string;
          /**
            * Retrieves the URL to an external file that contains the source code or data.
            */
          src: string;
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
          /**
            * Sets or retrieves the MIME type for the associated scripting engine.
            */
          type: string;
      }
      
      declare var HTMLScriptElement: {
          prototype: HTMLScriptElement;
          new(): HTMLScriptElement;
      }
      
      interface HTMLSelectElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
            */
          multiple: boolean;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          options: HTMLSelectElement;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Sets or retrieves the index of the selected option in a select object.
            */
          selectedIndex: number;
          /**
            * Sets or retrieves the number of rows in the list box. 
            */
          size: number;
          /**
            * Retrieves the type of select control based on the value of the MULTIPLE attribute.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Adds an element to the areas, controlRange, or options collection.
            * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.
            * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection. 
            */
          add(element: HTMLElement, before?: HTMLElement): void;
          add(element: HTMLElement, before?: number): void;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Retrieves a select object or an object from an options collection.
            * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
            * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
            */
          item(name?: any, index?: any): any;
          /**
            * Retrieves a select object or an object from an options collection.
            * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.
            */
          namedItem(name: string): any;
          /**
            * Removes an element from the collection.
            * @param index Number that specifies the zero-based index of the element to remove from the collection.
            */
          remove(index?: number): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          [name: string]: any;
      }
      
      declare var HTMLSelectElement: {
          prototype: HTMLSelectElement;
          new(): HTMLSelectElement;
      }
      
      interface HTMLSourceElement extends HTMLElement {
          /**
            * Gets or sets the intended media type of the media source.
           */
          media: string;
          msKeySystem: string;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          /**
           * Gets or sets the MIME type of a media resource.
           */
          type: string;
      }
      
      declare var HTMLSourceElement: {
          prototype: HTMLSourceElement;
          new(): HTMLSourceElement;
      }
      
      interface HTMLSpanElement extends HTMLElement {
      }
      
      declare var HTMLSpanElement: {
          prototype: HTMLSpanElement;
          new(): HTMLSpanElement;
      }
      
      interface HTMLStyleElement extends HTMLElement, LinkStyle {
          /**
            * Sets or retrieves the media type.
            */
          media: string;
          /**
            * Retrieves the CSS language in which the style sheet is written.
            */
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLStyleElement: {
          prototype: HTMLStyleElement;
          new(): HTMLStyleElement;
      }
      
      interface HTMLTableCaptionElement extends HTMLElement {
          /**
            * Sets or retrieves the alignment of the caption or legend.
            */
          align: string;
          /**
            * Sets or retrieves whether the caption appears at the top or bottom of the table.
            */
          vAlign: string;
      }
      
      declare var HTMLTableCaptionElement: {
          prototype: HTMLTableCaptionElement;
          new(): HTMLTableCaptionElement;
      }
      
      interface HTMLTableCellElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves abbreviated text for the object.
            */
          abbr: string;
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.
            */
          axis: string;
          bgColor: any;
          /**
            * Retrieves the position of the object in the cells collection of a row.
            */
          cellIndex: number;
          /**
            * Sets or retrieves the number columns in the table that the object should span.
            */
          colSpan: number;
          /**
            * Sets or retrieves a list of header cells that provide information for the object.
            */
          headers: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
          /**
            * Sets or retrieves how many rows in a table the cell should span.
            */
          rowSpan: number;
          /**
            * Sets or retrieves the group of cells in a table to which the object's information applies.
            */
          scope: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableCellElement: {
          prototype: HTMLTableCellElement;
          new(): HTMLTableCellElement;
      }
      
      interface HTMLTableColElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves the alignment of the object relative to the display or table.
            */
          align: string;
          /**
            * Sets or retrieves the number of columns in the group.
            */
          span: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: any;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableColElement: {
          prototype: HTMLTableColElement;
          new(): HTMLTableColElement;
      }
      
      interface HTMLTableDataCellElement extends HTMLTableCellElement {
      }
      
      declare var HTMLTableDataCellElement: {
          prototype: HTMLTableDataCellElement;
          new(): HTMLTableDataCellElement;
      }
      
      interface HTMLTableElement extends HTMLElement {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          bgColor: any;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          border: string;
          /**
            * Sets or retrieves the border color of the object. 
            */
          borderColor: any;
          /**
            * Retrieves the caption object of a table.
            */
          caption: HTMLTableCaptionElement;
          /**
            * Sets or retrieves the amount of space between the border of the cell and the content of the cell.
            */
          cellPadding: string;
          /**
            * Sets or retrieves the amount of space between cells in a table.
            */
          cellSpacing: string;
          /**
            * Sets or retrieves the number of columns in the table.
            */
          cols: number;
          /**
            * Sets or retrieves the way the border frame around the table is displayed.
            */
          frame: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: HTMLCollection;
          /**
            * Sets or retrieves which dividing lines (inner borders) are displayed.
            */
          rules: string;
          /**
            * Sets or retrieves a description and/or structure of the object.
            */
          summary: string;
          /**
            * Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order.
            */
          tBodies: HTMLCollection;
          /**
            * Retrieves the tFoot object of the table.
            */
          tFoot: HTMLTableSectionElement;
          /**
            * Retrieves the tHead object of the table.
            */
          tHead: HTMLTableSectionElement;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Creates an empty caption element in the table.
            */
          createCaption(): HTMLElement;
          /**
            * Creates an empty tBody element in the table.
            */
          createTBody(): HTMLElement;
          /**
            * Creates an empty tFoot element in the table.
            */
          createTFoot(): HTMLElement;
          /**
            * Returns the tHead element object if successful, or null otherwise.
            */
          createTHead(): HTMLElement;
          /**
            * Deletes the caption element and its contents from the table.
            */
          deleteCaption(): void;
          /**
            * Removes the specified row (tr) from the element and from the rows collection.
            * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
            */
          deleteRow(index?: number): void;
          /**
            * Deletes the tFoot element and its contents from the table.
            */
          deleteTFoot(): void;
          /**
            * Deletes the tHead element and its contents from the table.
            */
          deleteTHead(): void;
          /**
            * Creates a new row (tr) in the table, and adds the row to the rows collection.
            * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
            */
          insertRow(index?: number): HTMLElement;
      }
      
      declare var HTMLTableElement: {
          prototype: HTMLTableElement;
          new(): HTMLTableElement;
      }
      
      interface HTMLTableHeaderCellElement extends HTMLTableCellElement {
          /**
            * Sets or retrieves the group of cells in a table to which the object's information applies.
            */
          scope: string;
      }
      
      declare var HTMLTableHeaderCellElement: {
          prototype: HTMLTableHeaderCellElement;
          new(): HTMLTableHeaderCellElement;
      }
      
      interface HTMLTableRowElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          bgColor: any;
          /**
            * Retrieves a collection of all cells in the table row.
            */
          cells: HTMLCollection;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Retrieves the position of the object in the rows collection for the table.
            */
          rowIndex: number;
          /**
            * Retrieves the position of the object in the collection.
            */
          sectionRowIndex: number;
          /**
            * Removes the specified cell from the table row, as well as from the cells collection.
            * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.
            */
          deleteCell(index?: number): void;
          /**
            * Creates a new cell in the table row, and adds the cell to the cells collection.
            * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.
            */
          insertCell(index?: number): HTMLElement;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableRowElement: {
          prototype: HTMLTableRowElement;
          new(): HTMLTableRowElement;
      }
      
      interface HTMLTableSectionElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: HTMLCollection;
          /**
            * Removes the specified row (tr) from the element and from the rows collection.
            * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
            */
          deleteRow(index?: number): void;
          /**
            * Creates a new row (tr) in the table, and adds the row to the rows collection.
            * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
            */
          insertRow(index?: number): HTMLElement;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableSectionElement: {
          prototype: HTMLTableSectionElement;
          new(): HTMLTableSectionElement;
      }
      
      interface HTMLTextAreaElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          /**
            * Sets or retrieves the width of the object.
            */
          cols: number;
          /**
            * Sets or retrieves the initial contents of the object.
            */
          defaultValue: string;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the maximum number of characters that the user can enter in a text control.
            */
          maxLength: number;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
            */
          placeholder: string;
          /**
            * Sets or retrieves the value indicated whether the content of the object is read-only.
            */
          readOnly: boolean;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: number;
          /**
            * Gets or sets the end position or offset of a text selection.
            */
          selectionEnd: number;
          /**
            * Gets or sets the starting position or offset of a text selection.
            */
          selectionStart: number;
          /**
            * Sets or retrieves the value indicating whether the control is selected.
            */
          status: any;
          /**
            * Retrieves the type of control.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Retrieves or sets the text in the entry field of the textArea element.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Sets or retrieves how to handle wordwrapping in the object.
            */
          wrap: string;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Highlights the input area of a form element.
            */
          select(): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          /**
            * Sets the start and end positions of a selection in a text field.
            * @param start The offset into the text field for the start of the selection.
            * @param end The offset into the text field for the end of the selection.
            */
          setSelectionRange(start: number, end: number): void;
      }
      
      declare var HTMLTextAreaElement: {
          prototype: HTMLTextAreaElement;
          new(): HTMLTextAreaElement;
      }
      
      interface HTMLTitleElement extends HTMLElement {
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
      }
      
      declare var HTMLTitleElement: {
          prototype: HTMLTitleElement;
          new(): HTMLTitleElement;
      }
      
      interface HTMLTrackElement extends HTMLElement {
          default: boolean;
          kind: string;
          label: string;
          readyState: number;
          src: string;
          srclang: string;
          track: TextTrack;
          ERROR: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
      }
      
      declare var HTMLTrackElement: {
          prototype: HTMLTrackElement;
          new(): HTMLTrackElement;
          ERROR: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
      }
      
      interface HTMLUListElement extends HTMLElement {
          compact: boolean;
          type: string;
      }
      
      declare var HTMLUListElement: {
          prototype: HTMLUListElement;
          new(): HTMLUListElement;
      }
      
      interface HTMLUnknownElement extends HTMLElement {
      }
      
      declare var HTMLUnknownElement: {
          prototype: HTMLUnknownElement;
          new(): HTMLUnknownElement;
      }
      
      interface HTMLVideoElement extends HTMLMediaElement {
          /**
            * Gets or sets the height of the video element.
            */
          height: number;
          msHorizontalMirror: boolean;
          msIsLayoutOptimalForPlayback: boolean;
          msIsStereo3D: boolean;
          msStereo3DPackingMode: string;
          msStereo3DRenderMode: string;
          msZoom: boolean;
          onMSVideoFormatChanged: (ev: Event) => any;
          onMSVideoFrameStepCompleted: (ev: Event) => any;
          onMSVideoOptimalLayoutChanged: (ev: Event) => any;
          /**
            * Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available.
            */
          poster: string;
          /**
            * Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known.
            */
          videoHeight: number;
          /**
            * Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known.
            */
          videoWidth: number;
          webkitDisplayingFullscreen: boolean;
          webkitSupportsFullscreen: boolean;
          /**
            * Gets or sets the width of the video element.
            */
          width: number;
          getVideoPlaybackQuality(): VideoPlaybackQuality;
          msFrameStep(forward: boolean): void;
          msInsertVideoEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
          msSetVideoRectangle(left: number, top: number, right: number, bottom: number): void;
          webkitEnterFullScreen(): void;
          webkitEnterFullscreen(): void;
          webkitExitFullScreen(): void;
          webkitExitFullscreen(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoFormatChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoFrameStepCompleted", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoOptimalLayoutChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLVideoElement: {
          prototype: HTMLVideoElement;
          new(): HTMLVideoElement;
      }
      
      interface HashChangeEvent extends Event {
          newURL: string;
          oldURL: string;
      }
      
      declare var HashChangeEvent: {
          prototype: HashChangeEvent;
          new(type: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;
      }
      
      interface History {
          length: number;
          state: any;
          back(distance?: any): void;
          forward(distance?: any): void;
          go(delta?: any): void;
          pushState(statedata: any, title?: string, url?: string): void;
          replaceState(statedata: any, title?: string, url?: string): void;
      }
      
      declare var History: {
          prototype: History;
          new(): History;
      }
      
      interface IDBCursor {
          direction: string;
          key: any;
          primaryKey: any;
          source: any;
          advance(count: number): void;
          continue(key?: any): void;
          delete(): IDBRequest;
          update(value: any): IDBRequest;
          NEXT: string;
          NEXT_NO_DUPLICATE: string;
          PREV: string;
          PREV_NO_DUPLICATE: string;
      }
      
      declare var IDBCursor: {
          prototype: IDBCursor;
          new(): IDBCursor;
          NEXT: string;
          NEXT_NO_DUPLICATE: string;
          PREV: string;
          PREV_NO_DUPLICATE: string;
      }
      
      interface IDBCursorWithValue extends IDBCursor {
          value: any;
      }
      
      declare var IDBCursorWithValue: {
          prototype: IDBCursorWithValue;
          new(): IDBCursorWithValue;
      }
      
      interface IDBDatabase extends EventTarget {
          name: string;
          objectStoreNames: DOMStringList;
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          version: string;
          close(): void;
          createObjectStore(name: string, optionalParameters?: any): IDBObjectStore;
          deleteObjectStore(name: string): void;
          transaction(storeNames: any, mode?: string): IDBTransaction;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBDatabase: {
          prototype: IDBDatabase;
          new(): IDBDatabase;
      }
      
      interface IDBFactory {
          cmp(first: any, second: any): number;
          deleteDatabase(name: string): IDBOpenDBRequest;
          open(name: string, version?: number): IDBOpenDBRequest;
      }
      
      declare var IDBFactory: {
          prototype: IDBFactory;
          new(): IDBFactory;
      }
      
      interface IDBIndex {
          keyPath: string;
          name: string;
          objectStore: IDBObjectStore;
          unique: boolean;
          count(key?: any): IDBRequest;
          get(key: any): IDBRequest;
          getKey(key: any): IDBRequest;
          openCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
          openKeyCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
      }
      
      declare var IDBIndex: {
          prototype: IDBIndex;
          new(): IDBIndex;
      }
      
      interface IDBKeyRange {
          lower: any;
          lowerOpen: boolean;
          upper: any;
          upperOpen: boolean;
      }
      
      declare var IDBKeyRange: {
          prototype: IDBKeyRange;
          new(): IDBKeyRange;
          bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
          lowerBound(bound: any, open?: boolean): IDBKeyRange;
          only(value: any): IDBKeyRange;
          upperBound(bound: any, open?: boolean): IDBKeyRange;
      }
      
      interface IDBObjectStore {
          indexNames: DOMStringList;
          keyPath: string;
          name: string;
          transaction: IDBTransaction;
          add(value: any, key?: any): IDBRequest;
          clear(): IDBRequest;
          count(key?: any): IDBRequest;
          createIndex(name: string, keyPath: string, optionalParameters?: any): IDBIndex;
          delete(key: any): IDBRequest;
          deleteIndex(indexName: string): void;
          get(key: any): IDBRequest;
          index(name: string): IDBIndex;
          openCursor(range?: any, direction?: string): IDBRequest;
          put(value: any, key?: any): IDBRequest;
      }
      
      declare var IDBObjectStore: {
          prototype: IDBObjectStore;
          new(): IDBObjectStore;
      }
      
      interface IDBOpenDBRequest extends IDBRequest {
          onblocked: (ev: Event) => any;
          onupgradeneeded: (ev: IDBVersionChangeEvent) => any;
          addEventListener(type: "blocked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "upgradeneeded", listener: (ev: IDBVersionChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBOpenDBRequest: {
          prototype: IDBOpenDBRequest;
          new(): IDBOpenDBRequest;
      }
      
      interface IDBRequest extends EventTarget {
          error: DOMError;
          onerror: (ev: Event) => any;
          onsuccess: (ev: Event) => any;
          readyState: string;
          result: any;
          source: any;
          transaction: IDBTransaction;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBRequest: {
          prototype: IDBRequest;
          new(): IDBRequest;
      }
      
      interface IDBTransaction extends EventTarget {
          db: IDBDatabase;
          error: DOMError;
          mode: string;
          onabort: (ev: Event) => any;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          abort(): void;
          objectStore(name: string): IDBObjectStore;
          READ_ONLY: string;
          READ_WRITE: string;
          VERSION_CHANGE: string;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBTransaction: {
          prototype: IDBTransaction;
          new(): IDBTransaction;
          READ_ONLY: string;
          READ_WRITE: string;
          VERSION_CHANGE: string;
      }
      
      interface IDBVersionChangeEvent extends Event {
          newVersion: number;
          oldVersion: number;
      }
      
      declare var IDBVersionChangeEvent: {
          prototype: IDBVersionChangeEvent;
          new(): IDBVersionChangeEvent;
      }
      
      interface ImageData {
          data: number[];
          height: number;
          width: number;
      }
      
      declare var ImageData: {
          prototype: ImageData;
          new(): ImageData;
      }
      
      interface KeyboardEvent extends UIEvent {
          altKey: boolean;
          char: string;
          charCode: number;
          ctrlKey: boolean;
          key: string;
          keyCode: number;
          locale: string;
          location: number;
          metaKey: boolean;
          repeat: boolean;
          shiftKey: boolean;
          which: number;
          getModifierState(keyArg: string): boolean;
          initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void;
          DOM_KEY_LOCATION_JOYSTICK: number;
          DOM_KEY_LOCATION_LEFT: number;
          DOM_KEY_LOCATION_MOBILE: number;
          DOM_KEY_LOCATION_NUMPAD: number;
          DOM_KEY_LOCATION_RIGHT: number;
          DOM_KEY_LOCATION_STANDARD: number;
      }
      
      declare var KeyboardEvent: {
          prototype: KeyboardEvent;
          new(typeArg: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;
          DOM_KEY_LOCATION_JOYSTICK: number;
          DOM_KEY_LOCATION_LEFT: number;
          DOM_KEY_LOCATION_MOBILE: number;
          DOM_KEY_LOCATION_NUMPAD: number;
          DOM_KEY_LOCATION_RIGHT: number;
          DOM_KEY_LOCATION_STANDARD: number;
      }
      
      interface Location {
          hash: string;
          host: string;
          hostname: string;
          href: string;
          origin: string;
          pathname: string;
          port: string;
          protocol: string;
          search: string;
          assign(url: string): void;
          reload(forcedReload?: boolean): void;
          replace(url: string): void;
          toString(): string;
      }
      
      declare var Location: {
          prototype: Location;
          new(): Location;
      }
      
      interface LongRunningScriptDetectedEvent extends Event {
          executionTime: number;
          stopPageScriptExecution: boolean;
      }
      
      declare var LongRunningScriptDetectedEvent: {
          prototype: LongRunningScriptDetectedEvent;
          new(): LongRunningScriptDetectedEvent;
      }
      
      interface MSApp {
          clearTemporaryWebDataAsync(): MSAppAsyncOperation;
          createBlobFromRandomAccessStream(type: string, seeker: any): Blob;
          createDataPackage(object: any): any;
          createDataPackageFromSelection(): any;
          createFileFromStorageFile(storageFile: any): File;
          createStreamFromInputStream(type: string, inputStream: any): MSStream;
          execAsyncAtPriority(asynchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): void;
          execAtPriority(synchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): any;
          getCurrentPriority(): string;
          getHtmlPrintDocumentSourceAsync(htmlDoc: any): any;
          getViewId(view: any): any;
          isTaskScheduledAtPriorityOrHigher(priority: string): boolean;
          pageHandlesAllApplicationActivations(enabled: boolean): void;
          suppressSubdownloadCredentialPrompts(suppress: boolean): void;
          terminateApp(exceptionObject: any): void;
          CURRENT: string;
          HIGH: string;
          IDLE: string;
          NORMAL: string;
      }
      declare var MSApp: MSApp;
      
      interface MSAppAsyncOperation extends EventTarget {
          error: DOMError;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          readyState: number;
          result: any;
          start(): void;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSAppAsyncOperation: {
          prototype: MSAppAsyncOperation;
          new(): MSAppAsyncOperation;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
      }
      
      interface MSBlobBuilder {
          append(data: any, endings?: string): void;
          getBlob(contentType?: string): Blob;
      }
      
      declare var MSBlobBuilder: {
          prototype: MSBlobBuilder;
          new(): MSBlobBuilder;
      }
      
      interface MSCSSMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          m11: number;
          m12: number;
          m13: number;
          m14: number;
          m21: number;
          m22: number;
          m23: number;
          m24: number;
          m31: number;
          m32: number;
          m33: number;
          m34: number;
          m41: number;
          m42: number;
          m43: number;
          m44: number;
          inverse(): MSCSSMatrix;
          multiply(secondMatrix: MSCSSMatrix): MSCSSMatrix;
          rotate(angleX: number, angleY?: number, angleZ?: number): MSCSSMatrix;
          rotateAxisAngle(x: number, y: number, z: number, angle: number): MSCSSMatrix;
          scale(scaleX: number, scaleY?: number, scaleZ?: number): MSCSSMatrix;
          setMatrixValue(value: string): void;
          skewX(angle: number): MSCSSMatrix;
          skewY(angle: number): MSCSSMatrix;
          toString(): string;
          translate(x: number, y: number, z?: number): MSCSSMatrix;
      }
      
      declare var MSCSSMatrix: {
          prototype: MSCSSMatrix;
          new(text?: string): MSCSSMatrix;
      }
      
      interface MSGesture {
          target: Element;
          addPointer(pointerId: number): void;
          stop(): void;
      }
      
      declare var MSGesture: {
          prototype: MSGesture;
          new(): MSGesture;
      }
      
      interface MSGestureEvent extends UIEvent {
          clientX: number;
          clientY: number;
          expansion: number;
          gestureObject: any;
          hwTimestamp: number;
          offsetX: number;
          offsetY: number;
          rotation: number;
          scale: number;
          screenX: number;
          screenY: number;
          translationX: number;
          translationY: number;
          velocityAngular: number;
          velocityExpansion: number;
          velocityX: number;
          velocityY: number;
          initGestureEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, offsetXArg: number, offsetYArg: number, translationXArg: number, translationYArg: number, scaleArg: number, expansionArg: number, rotationArg: number, velocityXArg: number, velocityYArg: number, velocityExpansionArg: number, velocityAngularArg: number, hwTimestampArg: number): void;
          MSGESTURE_FLAG_BEGIN: number;
          MSGESTURE_FLAG_CANCEL: number;
          MSGESTURE_FLAG_END: number;
          MSGESTURE_FLAG_INERTIA: number;
          MSGESTURE_FLAG_NONE: number;
      }
      
      declare var MSGestureEvent: {
          prototype: MSGestureEvent;
          new(): MSGestureEvent;
          MSGESTURE_FLAG_BEGIN: number;
          MSGESTURE_FLAG_CANCEL: number;
          MSGESTURE_FLAG_END: number;
          MSGESTURE_FLAG_INERTIA: number;
          MSGESTURE_FLAG_NONE: number;
      }
      
      interface MSGraphicsTrust {
          constrictionActive: boolean;
          status: string;
      }
      
      declare var MSGraphicsTrust: {
          prototype: MSGraphicsTrust;
          new(): MSGraphicsTrust;
      }
      
      interface MSHTMLWebViewElement extends HTMLElement {
          canGoBack: boolean;
          canGoForward: boolean;
          containsFullScreenElement: boolean;
          documentTitle: string;
          height: number;
          settings: MSWebViewSettings;
          src: string;
          width: number;
          addWebAllowedObject(name: string, applicationObject: any): void;
          buildLocalStreamUri(contentIdentifier: string, relativePath: string): string;
          capturePreviewToBlobAsync(): MSWebViewAsyncOperation;
          captureSelectedContentToDataPackageAsync(): MSWebViewAsyncOperation;
          getDeferredPermissionRequestById(id: number): DeferredPermissionRequest;
          getDeferredPermissionRequests(): DeferredPermissionRequest[];
          goBack(): void;
          goForward(): void;
          invokeScriptAsync(scriptName: string, ...args: any[]): MSWebViewAsyncOperation;
          navigate(uri: string): void;
          navigateToLocalStreamUri(source: string, streamResolver: any): void;
          navigateToString(contents: string): void;
          navigateWithHttpRequestMessage(requestMessage: any): void;
          refresh(): void;
          stop(): void;
      }
      
      declare var MSHTMLWebViewElement: {
          prototype: MSHTMLWebViewElement;
          new(): MSHTMLWebViewElement;
      }
      
      interface MSHeaderFooter {
          URL: string;
          dateLong: string;
          dateShort: string;
          font: string;
          htmlFoot: string;
          htmlHead: string;
          page: number;
          pageTotal: number;
          textFoot: string;
          textHead: string;
          timeLong: string;
          timeShort: string;
          title: string;
      }
      
      declare var MSHeaderFooter: {
          prototype: MSHeaderFooter;
          new(): MSHeaderFooter;
      }
      
      interface MSInputMethodContext extends EventTarget {
          compositionEndOffset: number;
          compositionStartOffset: number;
          oncandidatewindowhide: (ev: Event) => any;
          oncandidatewindowshow: (ev: Event) => any;
          oncandidatewindowupdate: (ev: Event) => any;
          target: HTMLElement;
          getCandidateWindowClientRect(): ClientRect;
          getCompositionAlternatives(): string[];
          hasComposition(): boolean;
          isCandidateWindowVisible(): boolean;
          addEventListener(type: "MSCandidateWindowHide", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSCandidateWindowShow", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSCandidateWindowUpdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSInputMethodContext: {
          prototype: MSInputMethodContext;
          new(): MSInputMethodContext;
      }
      
      interface MSManipulationEvent extends UIEvent {
          currentState: number;
          inertiaDestinationX: number;
          inertiaDestinationY: number;
          lastState: number;
          initMSManipulationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, lastState: number, currentState: number): void;
          MS_MANIPULATION_STATE_ACTIVE: number;
          MS_MANIPULATION_STATE_CANCELLED: number;
          MS_MANIPULATION_STATE_COMMITTED: number;
          MS_MANIPULATION_STATE_DRAGGING: number;
          MS_MANIPULATION_STATE_INERTIA: number;
          MS_MANIPULATION_STATE_PRESELECT: number;
          MS_MANIPULATION_STATE_SELECTING: number;
          MS_MANIPULATION_STATE_STOPPED: number;
      }
      
      declare var MSManipulationEvent: {
          prototype: MSManipulationEvent;
          new(): MSManipulationEvent;
          MS_MANIPULATION_STATE_ACTIVE: number;
          MS_MANIPULATION_STATE_CANCELLED: number;
          MS_MANIPULATION_STATE_COMMITTED: number;
          MS_MANIPULATION_STATE_DRAGGING: number;
          MS_MANIPULATION_STATE_INERTIA: number;
          MS_MANIPULATION_STATE_PRESELECT: number;
          MS_MANIPULATION_STATE_SELECTING: number;
          MS_MANIPULATION_STATE_STOPPED: number;
      }
      
      interface MSMediaKeyError {
          code: number;
          systemCode: number;
          MS_MEDIA_KEYERR_CLIENT: number;
          MS_MEDIA_KEYERR_DOMAIN: number;
          MS_MEDIA_KEYERR_HARDWARECHANGE: number;
          MS_MEDIA_KEYERR_OUTPUT: number;
          MS_MEDIA_KEYERR_SERVICE: number;
          MS_MEDIA_KEYERR_UNKNOWN: number;
      }
      
      declare var MSMediaKeyError: {
          prototype: MSMediaKeyError;
          new(): MSMediaKeyError;
          MS_MEDIA_KEYERR_CLIENT: number;
          MS_MEDIA_KEYERR_DOMAIN: number;
          MS_MEDIA_KEYERR_HARDWARECHANGE: number;
          MS_MEDIA_KEYERR_OUTPUT: number;
          MS_MEDIA_KEYERR_SERVICE: number;
          MS_MEDIA_KEYERR_UNKNOWN: number;
      }
      
      interface MSMediaKeyMessageEvent extends Event {
          destinationURL: string;
          message: Uint8Array;
      }
      
      declare var MSMediaKeyMessageEvent: {
          prototype: MSMediaKeyMessageEvent;
          new(): MSMediaKeyMessageEvent;
      }
      
      interface MSMediaKeyNeededEvent extends Event {
          initData: Uint8Array;
      }
      
      declare var MSMediaKeyNeededEvent: {
          prototype: MSMediaKeyNeededEvent;
          new(): MSMediaKeyNeededEvent;
      }
      
      interface MSMediaKeySession extends EventTarget {
          error: MSMediaKeyError;
          keySystem: string;
          sessionId: string;
          close(): void;
          update(key: Uint8Array): void;
      }
      
      declare var MSMediaKeySession: {
          prototype: MSMediaKeySession;
          new(): MSMediaKeySession;
      }
      
      interface MSMediaKeys {
          keySystem: string;
          createSession(type: string, initData: Uint8Array, cdmData?: Uint8Array): MSMediaKeySession;
      }
      
      declare var MSMediaKeys: {
          prototype: MSMediaKeys;
          new(keySystem: string): MSMediaKeys;
          isTypeSupported(keySystem: string, type?: string): boolean;
      }
      
      interface MSMimeTypesCollection {
          length: number;
      }
      
      declare var MSMimeTypesCollection: {
          prototype: MSMimeTypesCollection;
          new(): MSMimeTypesCollection;
      }
      
      interface MSPluginsCollection {
          length: number;
          refresh(reload?: boolean): void;
      }
      
      declare var MSPluginsCollection: {
          prototype: MSPluginsCollection;
          new(): MSPluginsCollection;
      }
      
      interface MSPointerEvent extends MouseEvent {
          currentPoint: any;
          height: number;
          hwTimestamp: number;
          intermediatePoints: any;
          isPrimary: boolean;
          pointerId: number;
          pointerType: any;
          pressure: number;
          rotation: number;
          tiltX: number;
          tiltY: number;
          width: number;
          getCurrentPoint(element: Element): void;
          getIntermediatePoints(element: Element): void;
          initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
      }
      
      declare var MSPointerEvent: {
          prototype: MSPointerEvent;
          new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
      }
      
      interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
          percentScale: number;
          showHeaderFooter: boolean;
          shrinkToFit: boolean;
          drawPreviewPage(element: HTMLElement, pageNumber: number): void;
          endPrint(): void;
          getPrintTaskOptionValue(key: string): any;
          invalidatePreview(): void;
          setPageCount(pageCount: number): void;
          startPrint(): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSPrintManagerTemplatePrinter: {
          prototype: MSPrintManagerTemplatePrinter;
          new(): MSPrintManagerTemplatePrinter;
      }
      
      interface MSRangeCollection {
          length: number;
          item(index: number): Range;
          [index: number]: Range;
      }
      
      declare var MSRangeCollection: {
          prototype: MSRangeCollection;
          new(): MSRangeCollection;
      }
      
      interface MSSiteModeEvent extends Event {
          actionURL: string;
          buttonID: number;
      }
      
      declare var MSSiteModeEvent: {
          prototype: MSSiteModeEvent;
          new(): MSSiteModeEvent;
      }
      
      interface MSStream {
          type: string;
          msClose(): void;
          msDetachStream(): any;
      }
      
      declare var MSStream: {
          prototype: MSStream;
          new(): MSStream;
      }
      
      interface MSStreamReader extends EventTarget, MSBaseReader {
          error: DOMError;
          readAsArrayBuffer(stream: MSStream, size?: number): void;
          readAsBinaryString(stream: MSStream, size?: number): void;
          readAsBlob(stream: MSStream, size?: number): void;
          readAsDataURL(stream: MSStream, size?: number): void;
          readAsText(stream: MSStream, encoding?: string, size?: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSStreamReader: {
          prototype: MSStreamReader;
          new(): MSStreamReader;
      }
      
      interface MSTemplatePrinter {
          collate: boolean;
          copies: number;
          currentPage: boolean;
          currentPageAvail: boolean;
          duplex: boolean;
          footer: string;
          frameActive: boolean;
          frameActiveEnabled: boolean;
          frameAsShown: boolean;
          framesetDocument: boolean;
          header: string;
          headerFooterFont: string;
          marginBottom: number;
          marginLeft: number;
          marginRight: number;
          marginTop: number;
          orientation: string;
          pageFrom: number;
          pageHeight: number;
          pageTo: number;
          pageWidth: number;
          selectedPages: boolean;
          selection: boolean;
          selectionEnabled: boolean;
          unprintableBottom: number;
          unprintableLeft: number;
          unprintableRight: number;
          unprintableTop: number;
          usePrinterCopyCollate: boolean;
          createHeaderFooter(): MSHeaderFooter;
          deviceSupports(property: string): any;
          ensurePrintDialogDefaults(): boolean;
          getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
          getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
          getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
          getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
          printBlankPage(): void;
          printNonNative(document: any): boolean;
          printNonNativeFrames(document: any, activeFrame: boolean): void;
          printPage(element: HTMLElement): void;
          showPageSetupDialog(): boolean;
          showPrintDialog(): boolean;
          startDoc(title: string): boolean;
          stopDoc(): void;
          updatePageStatus(status: number): void;
      }
      
      declare var MSTemplatePrinter: {
          prototype: MSTemplatePrinter;
          new(): MSTemplatePrinter;
      }
      
      interface MSWebViewAsyncOperation extends EventTarget {
          error: DOMError;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          readyState: number;
          result: any;
          target: MSHTMLWebViewElement;
          type: number;
          start(): void;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
          TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
          TYPE_INVOKE_SCRIPT: number;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSWebViewAsyncOperation: {
          prototype: MSWebViewAsyncOperation;
          new(): MSWebViewAsyncOperation;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
          TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
          TYPE_INVOKE_SCRIPT: number;
      }
      
      interface MSWebViewSettings {
          isIndexedDBEnabled: boolean;
          isJavaScriptEnabled: boolean;
      }
      
      declare var MSWebViewSettings: {
          prototype: MSWebViewSettings;
          new(): MSWebViewSettings;
      }
      
      interface MediaElementAudioSourceNode extends AudioNode {
      }
      
      declare var MediaElementAudioSourceNode: {
          prototype: MediaElementAudioSourceNode;
          new(): MediaElementAudioSourceNode;
      }
      
      interface MediaError {
          code: number;
          msExtendedCode: number;
          MEDIA_ERR_ABORTED: number;
          MEDIA_ERR_DECODE: number;
          MEDIA_ERR_NETWORK: number;
          MEDIA_ERR_SRC_NOT_SUPPORTED: number;
          MS_MEDIA_ERR_ENCRYPTED: number;
      }
      
      declare var MediaError: {
          prototype: MediaError;
          new(): MediaError;
          MEDIA_ERR_ABORTED: number;
          MEDIA_ERR_DECODE: number;
          MEDIA_ERR_NETWORK: number;
          MEDIA_ERR_SRC_NOT_SUPPORTED: number;
          MS_MEDIA_ERR_ENCRYPTED: number;
      }
      
      interface MediaList {
          length: number;
          mediaText: string;
          appendMedium(newMedium: string): void;
          deleteMedium(oldMedium: string): void;
          item(index: number): string;
          toString(): string;
          [index: number]: string;
      }
      
      declare var MediaList: {
          prototype: MediaList;
          new(): MediaList;
      }
      
      interface MediaQueryList {
          matches: boolean;
          media: string;
          addListener(listener: MediaQueryListListener): void;
          removeListener(listener: MediaQueryListListener): void;
      }
      
      declare var MediaQueryList: {
          prototype: MediaQueryList;
          new(): MediaQueryList;
      }
      
      interface MediaSource extends EventTarget {
          activeSourceBuffers: SourceBufferList;
          duration: number;
          readyState: string;
          sourceBuffers: SourceBufferList;
          addSourceBuffer(type: string): SourceBuffer;
          endOfStream(error?: string): void;
          removeSourceBuffer(sourceBuffer: SourceBuffer): void;
      }
      
      declare var MediaSource: {
          prototype: MediaSource;
          new(): MediaSource;
          isTypeSupported(type: string): boolean;
      }
      
      interface MessageChannel {
          port1: MessagePort;
          port2: MessagePort;
      }
      
      declare var MessageChannel: {
          prototype: MessageChannel;
          new(): MessageChannel;
      }
      
      interface MessageEvent extends Event {
          data: any;
          origin: string;
          ports: any;
          source: Window;
          initMessageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, dataArg: any, originArg: string, lastEventIdArg: string, sourceArg: Window): void;
      }
      
      declare var MessageEvent: {
          prototype: MessageEvent;
          new(): MessageEvent;
      }
      
      interface MessagePort extends EventTarget {
          onmessage: (ev: MessageEvent) => any;
          close(): void;
          postMessage(message?: any, ports?: any): void;
          start(): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MessagePort: {
          prototype: MessagePort;
          new(): MessagePort;
      }
      
      interface MimeType {
          description: string;
          enabledPlugin: Plugin;
          suffixes: string;
          type: string;
      }
      
      declare var MimeType: {
          prototype: MimeType;
          new(): MimeType;
      }
      
      interface MimeTypeArray {
          length: number;
          item(index: number): Plugin;
          namedItem(type: string): Plugin;
          [index: number]: Plugin;
      }
      
      declare var MimeTypeArray: {
          prototype: MimeTypeArray;
          new(): MimeTypeArray;
      }
      
      interface MouseEvent extends UIEvent {
          altKey: boolean;
          button: number;
          buttons: number;
          clientX: number;
          clientY: number;
          ctrlKey: boolean;
          fromElement: Element;
          layerX: number;
          layerY: number;
          metaKey: boolean;
          movementX: number;
          movementY: number;
          offsetX: number;
          offsetY: number;
          pageX: number;
          pageY: number;
          relatedTarget: EventTarget;
          screenX: number;
          screenY: number;
          shiftKey: boolean;
          toElement: Element;
          which: number;
          x: number;
          y: number;
          getModifierState(keyArg: string): boolean;
          initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget): void;
      }
      
      declare var MouseEvent: {
          prototype: MouseEvent;
          new(typeArg: string, eventInitDict?: MouseEventInit): MouseEvent;
      }
      
      interface MouseWheelEvent extends MouseEvent {
          wheelDelta: number;
          wheelDeltaX: number;
          wheelDeltaY: number;
          initMouseWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, wheelDeltaArg: number): void;
      }
      
      declare var MouseWheelEvent: {
          prototype: MouseWheelEvent;
          new(): MouseWheelEvent;
      }
      
      interface MutationEvent extends Event {
          attrChange: number;
          attrName: string;
          newValue: string;
          prevValue: string;
          relatedNode: Node;
          initMutationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, relatedNodeArg: Node, prevValueArg: string, newValueArg: string, attrNameArg: string, attrChangeArg: number): void;
          ADDITION: number;
          MODIFICATION: number;
          REMOVAL: number;
      }
      
      declare var MutationEvent: {
          prototype: MutationEvent;
          new(): MutationEvent;
          ADDITION: number;
          MODIFICATION: number;
          REMOVAL: number;
      }
      
      interface MutationObserver {
          disconnect(): void;
          observe(target: Node, options: MutationObserverInit): void;
          takeRecords(): MutationRecord[];
      }
      
      declare var MutationObserver: {
          prototype: MutationObserver;
          new(callback: MutationCallback): MutationObserver;
      }
      
      interface MutationRecord {
          addedNodes: NodeList;
          attributeName: string;
          attributeNamespace: string;
          nextSibling: Node;
          oldValue: string;
          previousSibling: Node;
          removedNodes: NodeList;
          target: Node;
          type: string;
      }
      
      declare var MutationRecord: {
          prototype: MutationRecord;
          new(): MutationRecord;
      }
      
      interface NamedNodeMap {
          length: number;
          getNamedItem(name: string): Attr;
          getNamedItemNS(namespaceURI: string, localName: string): Attr;
          item(index: number): Attr;
          removeNamedItem(name: string): Attr;
          removeNamedItemNS(namespaceURI: string, localName: string): Attr;
          setNamedItem(arg: Attr): Attr;
          setNamedItemNS(arg: Attr): Attr;
          [index: number]: Attr;
      }
      
      declare var NamedNodeMap: {
          prototype: NamedNodeMap;
          new(): NamedNodeMap;
      }
      
      interface NavigationCompletedEvent extends NavigationEvent {
          isSuccess: boolean;
          webErrorStatus: number;
      }
      
      declare var NavigationCompletedEvent: {
          prototype: NavigationCompletedEvent;
          new(): NavigationCompletedEvent;
      }
      
      interface NavigationEvent extends Event {
          uri: string;
      }
      
      declare var NavigationEvent: {
          prototype: NavigationEvent;
          new(): NavigationEvent;
      }
      
      interface NavigationEventWithReferrer extends NavigationEvent {
          referer: string;
      }
      
      declare var NavigationEventWithReferrer: {
          prototype: NavigationEventWithReferrer;
          new(): NavigationEventWithReferrer;
      }
      
      interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver {
          appCodeName: string;
          appMinorVersion: string;
          browserLanguage: string;
          connectionSpeed: number;
          cookieEnabled: boolean;
          cpuClass: string;
          language: string;
          maxTouchPoints: number;
          mimeTypes: MSMimeTypesCollection;
          msManipulationViewsEnabled: boolean;
          msMaxTouchPoints: number;
          msPointerEnabled: boolean;
          plugins: MSPluginsCollection;
          pointerEnabled: boolean;
          systemLanguage: string;
          userLanguage: string;
          webdriver: boolean;
          getGamepads(): Gamepad[];
          javaEnabled(): boolean;
          msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Navigator: {
          prototype: Navigator;
          new(): Navigator;
      }
      
      interface Node extends EventTarget {
          attributes: NamedNodeMap;
          baseURI: string;
          childNodes: NodeList;
          firstChild: Node;
          lastChild: Node;
          localName: string;
          namespaceURI: string;
          nextSibling: Node;
          nodeName: string;
          nodeType: number;
          nodeValue: string;
          ownerDocument: Document;
          parentElement: HTMLElement;
          parentNode: Node;
          prefix: string;
          previousSibling: Node;
          textContent: string;
          appendChild(newChild: Node): Node;
          cloneNode(deep?: boolean): Node;
          compareDocumentPosition(other: Node): number;
          hasAttributes(): boolean;
          hasChildNodes(): boolean;
          insertBefore(newChild: Node, refChild?: Node): Node;
          isDefaultNamespace(namespaceURI: string): boolean;
          isEqualNode(arg: Node): boolean;
          isSameNode(other: Node): boolean;
          lookupNamespaceURI(prefix: string): string;
          lookupPrefix(namespaceURI: string): string;
          normalize(): void;
          removeChild(oldChild: Node): Node;
          replaceChild(newChild: Node, oldChild: Node): Node;
          ATTRIBUTE_NODE: number;
          CDATA_SECTION_NODE: number;
          COMMENT_NODE: number;
          DOCUMENT_FRAGMENT_NODE: number;
          DOCUMENT_NODE: number;
          DOCUMENT_POSITION_CONTAINED_BY: number;
          DOCUMENT_POSITION_CONTAINS: number;
          DOCUMENT_POSITION_DISCONNECTED: number;
          DOCUMENT_POSITION_FOLLOWING: number;
          DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
          DOCUMENT_POSITION_PRECEDING: number;
          DOCUMENT_TYPE_NODE: number;
          ELEMENT_NODE: number;
          ENTITY_NODE: number;
          ENTITY_REFERENCE_NODE: number;
          NOTATION_NODE: number;
          PROCESSING_INSTRUCTION_NODE: number;
          TEXT_NODE: number;
      }
      
      declare var Node: {
          prototype: Node;
          new(): Node;
          ATTRIBUTE_NODE: number;
          CDATA_SECTION_NODE: number;
          COMMENT_NODE: number;
          DOCUMENT_FRAGMENT_NODE: number;
          DOCUMENT_NODE: number;
          DOCUMENT_POSITION_CONTAINED_BY: number;
          DOCUMENT_POSITION_CONTAINS: number;
          DOCUMENT_POSITION_DISCONNECTED: number;
          DOCUMENT_POSITION_FOLLOWING: number;
          DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
          DOCUMENT_POSITION_PRECEDING: number;
          DOCUMENT_TYPE_NODE: number;
          ELEMENT_NODE: number;
          ENTITY_NODE: number;
          ENTITY_REFERENCE_NODE: number;
          NOTATION_NODE: number;
          PROCESSING_INSTRUCTION_NODE: number;
          TEXT_NODE: number;
      }
      
      interface NodeFilter {
          FILTER_ACCEPT: number;
          FILTER_REJECT: number;
          FILTER_SKIP: number;
          SHOW_ALL: number;
          SHOW_ATTRIBUTE: number;
          SHOW_CDATA_SECTION: number;
          SHOW_COMMENT: number;
          SHOW_DOCUMENT: number;
          SHOW_DOCUMENT_FRAGMENT: number;
          SHOW_DOCUMENT_TYPE: number;
          SHOW_ELEMENT: number;
          SHOW_ENTITY: number;
          SHOW_ENTITY_REFERENCE: number;
          SHOW_NOTATION: number;
          SHOW_PROCESSING_INSTRUCTION: number;
          SHOW_TEXT: number;
      }
      declare var NodeFilter: NodeFilter;
      
      interface NodeIterator {
          expandEntityReferences: boolean;
          filter: NodeFilter;
          root: Node;
          whatToShow: number;
          detach(): void;
          nextNode(): Node;
          previousNode(): Node;
      }
      
      declare var NodeIterator: {
          prototype: NodeIterator;
          new(): NodeIterator;
      }
      
      interface NodeList {
          length: number;
          item(index: number): Node;
          [index: number]: Node;
      }
      
      declare var NodeList: {
          prototype: NodeList;
          new(): NodeList;
      }
      
      interface OES_element_index_uint {
      }
      
      declare var OES_element_index_uint: {
          prototype: OES_element_index_uint;
          new(): OES_element_index_uint;
      }
      
      interface OES_standard_derivatives {
          FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
      }
      
      declare var OES_standard_derivatives: {
          prototype: OES_standard_derivatives;
          new(): OES_standard_derivatives;
          FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
      }
      
      interface OES_texture_float {
      }
      
      declare var OES_texture_float: {
          prototype: OES_texture_float;
          new(): OES_texture_float;
      }
      
      interface OES_texture_float_linear {
      }
      
      declare var OES_texture_float_linear: {
          prototype: OES_texture_float_linear;
          new(): OES_texture_float_linear;
      }
      
      interface OfflineAudioCompletionEvent extends Event {
          renderedBuffer: AudioBuffer;
      }
      
      declare var OfflineAudioCompletionEvent: {
          prototype: OfflineAudioCompletionEvent;
          new(): OfflineAudioCompletionEvent;
      }
      
      interface OfflineAudioContext extends AudioContext {
          oncomplete: (ev: Event) => any;
          startRendering(): void;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var OfflineAudioContext: {
          prototype: OfflineAudioContext;
          new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;
      }
      
      interface OscillatorNode extends AudioNode {
          detune: AudioParam;
          frequency: AudioParam;
          onended: (ev: Event) => any;
          type: string;
          setPeriodicWave(periodicWave: PeriodicWave): void;
          start(when?: number): void;
          stop(when?: number): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var OscillatorNode: {
          prototype: OscillatorNode;
          new(): OscillatorNode;
      }
      
      interface PageTransitionEvent extends Event {
          persisted: boolean;
      }
      
      declare var PageTransitionEvent: {
          prototype: PageTransitionEvent;
          new(): PageTransitionEvent;
      }
      
      interface PannerNode extends AudioNode {
          coneInnerAngle: number;
          coneOuterAngle: number;
          coneOuterGain: number;
          distanceModel: string;
          maxDistance: number;
          panningModel: string;
          refDistance: number;
          rolloffFactor: number;
          setOrientation(x: number, y: number, z: number): void;
          setPosition(x: number, y: number, z: number): void;
          setVelocity(x: number, y: number, z: number): void;
      }
      
      declare var PannerNode: {
          prototype: PannerNode;
          new(): PannerNode;
      }
      
      interface PerfWidgetExternal {
          activeNetworkRequestCount: number;
          averageFrameTime: number;
          averagePaintTime: number;
          extraInformationEnabled: boolean;
          independentRenderingEnabled: boolean;
          irDisablingContentString: string;
          irStatusAvailable: boolean;
          maxCpuSpeed: number;
          paintRequestsPerSecond: number;
          performanceCounter: number;
          performanceCounterFrequency: number;
          addEventListener(eventType: string, callback: Function): void;
          getMemoryUsage(): number;
          getProcessCpuUsage(): number;
          getRecentCpuUsage(last: number): any;
          getRecentFrames(last: number): any;
          getRecentMemoryUsage(last: number): any;
          getRecentPaintRequests(last: number): any;
          removeEventListener(eventType: string, callback: Function): void;
          repositionWindow(x: number, y: number): void;
          resizeWindow(width: number, height: number): void;
      }
      
      declare var PerfWidgetExternal: {
          prototype: PerfWidgetExternal;
          new(): PerfWidgetExternal;
      }
      
      interface Performance {
          navigation: PerformanceNavigation;
          timing: PerformanceTiming;
          clearMarks(markName?: string): void;
          clearMeasures(measureName?: string): void;
          clearResourceTimings(): void;
          getEntries(): any;
          getEntriesByName(name: string, entryType?: string): any;
          getEntriesByType(entryType: string): any;
          getMarks(markName?: string): any;
          getMeasures(measureName?: string): any;
          mark(markName: string): void;
          measure(measureName: string, startMarkName?: string, endMarkName?: string): void;
          now(): number;
          setResourceTimingBufferSize(maxSize: number): void;
          toJSON(): any;
      }
      
      declare var Performance: {
          prototype: Performance;
          new(): Performance;
      }
      
      interface PerformanceEntry {
          duration: number;
          entryType: string;
          name: string;
          startTime: number;
      }
      
      declare var PerformanceEntry: {
          prototype: PerformanceEntry;
          new(): PerformanceEntry;
      }
      
      interface PerformanceMark extends PerformanceEntry {
      }
      
      declare var PerformanceMark: {
          prototype: PerformanceMark;
          new(): PerformanceMark;
      }
      
      interface PerformanceMeasure extends PerformanceEntry {
      }
      
      declare var PerformanceMeasure: {
          prototype: PerformanceMeasure;
          new(): PerformanceMeasure;
      }
      
      interface PerformanceNavigation {
          redirectCount: number;
          type: number;
          toJSON(): any;
          TYPE_BACK_FORWARD: number;
          TYPE_NAVIGATE: number;
          TYPE_RELOAD: number;
          TYPE_RESERVED: number;
      }
      
      declare var PerformanceNavigation: {
          prototype: PerformanceNavigation;
          new(): PerformanceNavigation;
          TYPE_BACK_FORWARD: number;
          TYPE_NAVIGATE: number;
          TYPE_RELOAD: number;
          TYPE_RESERVED: number;
      }
      
      interface PerformanceNavigationTiming extends PerformanceEntry {
          connectEnd: number;
          connectStart: number;
          domComplete: number;
          domContentLoadedEventEnd: number;
          domContentLoadedEventStart: number;
          domInteractive: number;
          domLoading: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          loadEventEnd: number;
          loadEventStart: number;
          navigationStart: number;
          redirectCount: number;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
          type: string;
          unloadEventEnd: number;
          unloadEventStart: number;
      }
      
      declare var PerformanceNavigationTiming: {
          prototype: PerformanceNavigationTiming;
          new(): PerformanceNavigationTiming;
      }
      
      interface PerformanceResourceTiming extends PerformanceEntry {
          connectEnd: number;
          connectStart: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          initiatorType: string;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
      }
      
      declare var PerformanceResourceTiming: {
          prototype: PerformanceResourceTiming;
          new(): PerformanceResourceTiming;
      }
      
      interface PerformanceTiming {
          connectEnd: number;
          connectStart: number;
          domComplete: number;
          domContentLoadedEventEnd: number;
          domContentLoadedEventStart: number;
          domInteractive: number;
          domLoading: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          loadEventEnd: number;
          loadEventStart: number;
          msFirstPaint: number;
          navigationStart: number;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
          unloadEventEnd: number;
          unloadEventStart: number;
          toJSON(): any;
      }
      
      declare var PerformanceTiming: {
          prototype: PerformanceTiming;
          new(): PerformanceTiming;
      }
      
      interface PeriodicWave {
      }
      
      declare var PeriodicWave: {
          prototype: PeriodicWave;
          new(): PeriodicWave;
      }
      
      interface PermissionRequest extends DeferredPermissionRequest {
          state: string;
          defer(): void;
      }
      
      declare var PermissionRequest: {
          prototype: PermissionRequest;
          new(): PermissionRequest;
      }
      
      interface PermissionRequestedEvent extends Event {
          permissionRequest: PermissionRequest;
      }
      
      declare var PermissionRequestedEvent: {
          prototype: PermissionRequestedEvent;
          new(): PermissionRequestedEvent;
      }
      
      interface Plugin {
          description: string;
          filename: string;
          length: number;
          name: string;
          version: string;
          item(index: number): MimeType;
          namedItem(type: string): MimeType;
          [index: number]: MimeType;
      }
      
      declare var Plugin: {
          prototype: Plugin;
          new(): Plugin;
      }
      
      interface PluginArray {
          length: number;
          item(index: number): Plugin;
          namedItem(name: string): Plugin;
          refresh(reload?: boolean): void;
          [index: number]: Plugin;
      }
      
      declare var PluginArray: {
          prototype: PluginArray;
          new(): PluginArray;
      }
      
      interface PointerEvent extends MouseEvent {
          currentPoint: any;
          height: number;
          hwTimestamp: number;
          intermediatePoints: any;
          isPrimary: boolean;
          pointerId: number;
          pointerType: any;
          pressure: number;
          rotation: number;
          tiltX: number;
          tiltY: number;
          width: number;
          getCurrentPoint(element: Element): void;
          getIntermediatePoints(element: Element): void;
          initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
      }
      
      declare var PointerEvent: {
          prototype: PointerEvent;
          new(typeArg: string, eventInitDict?: PointerEventInit): PointerEvent;
      }
      
      interface PopStateEvent extends Event {
          state: any;
          initPopStateEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, stateArg: any): void;
      }
      
      declare var PopStateEvent: {
          prototype: PopStateEvent;
          new(): PopStateEvent;
      }
      
      interface Position {
          coords: Coordinates;
          timestamp: Date;
      }
      
      declare var Position: {
          prototype: Position;
          new(): Position;
      }
      
      interface PositionError {
          code: number;
          message: string;
          toString(): string;
          PERMISSION_DENIED: number;
          POSITION_UNAVAILABLE: number;
          TIMEOUT: number;
      }
      
      declare var PositionError: {
          prototype: PositionError;
          new(): PositionError;
          PERMISSION_DENIED: number;
          POSITION_UNAVAILABLE: number;
          TIMEOUT: number;
      }
      
      interface ProcessingInstruction extends CharacterData {
          target: string;
      }
      
      declare var ProcessingInstruction: {
          prototype: ProcessingInstruction;
          new(): ProcessingInstruction;
      }
      
      interface ProgressEvent extends Event {
          lengthComputable: boolean;
          loaded: number;
          total: number;
          initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void;
      }
      
      declare var ProgressEvent: {
          prototype: ProgressEvent;
          new(): ProgressEvent;
      }
      
      interface Range {
          collapsed: boolean;
          commonAncestorContainer: Node;
          endContainer: Node;
          endOffset: number;
          startContainer: Node;
          startOffset: number;
          cloneContents(): DocumentFragment;
          cloneRange(): Range;
          collapse(toStart: boolean): void;
          compareBoundaryPoints(how: number, sourceRange: Range): number;
          createContextualFragment(fragment: string): DocumentFragment;
          deleteContents(): void;
          detach(): void;
          expand(Unit: string): boolean;
          extractContents(): DocumentFragment;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          insertNode(newNode: Node): void;
          selectNode(refNode: Node): void;
          selectNodeContents(refNode: Node): void;
          setEnd(refNode: Node, offset: number): void;
          setEndAfter(refNode: Node): void;
          setEndBefore(refNode: Node): void;
          setStart(refNode: Node, offset: number): void;
          setStartAfter(refNode: Node): void;
          setStartBefore(refNode: Node): void;
          surroundContents(newParent: Node): void;
          toString(): string;
          END_TO_END: number;
          END_TO_START: number;
          START_TO_END: number;
          START_TO_START: number;
      }
      
      declare var Range: {
          prototype: Range;
          new(): Range;
          END_TO_END: number;
          END_TO_START: number;
          START_TO_END: number;
          START_TO_START: number;
      }
      
      interface SVGAElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          target: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGAElement: {
          prototype: SVGAElement;
          new(): SVGAElement;
      }
      
      interface SVGAngle {
          unitType: number;
          value: number;
          valueAsString: string;
          valueInSpecifiedUnits: number;
          convertToSpecifiedUnits(unitType: number): void;
          newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
          SVG_ANGLETYPE_DEG: number;
          SVG_ANGLETYPE_GRAD: number;
          SVG_ANGLETYPE_RAD: number;
          SVG_ANGLETYPE_UNKNOWN: number;
          SVG_ANGLETYPE_UNSPECIFIED: number;
      }
      
      declare var SVGAngle: {
          prototype: SVGAngle;
          new(): SVGAngle;
          SVG_ANGLETYPE_DEG: number;
          SVG_ANGLETYPE_GRAD: number;
          SVG_ANGLETYPE_RAD: number;
          SVG_ANGLETYPE_UNKNOWN: number;
          SVG_ANGLETYPE_UNSPECIFIED: number;
      }
      
      interface SVGAnimatedAngle {
          animVal: SVGAngle;
          baseVal: SVGAngle;
      }
      
      declare var SVGAnimatedAngle: {
          prototype: SVGAnimatedAngle;
          new(): SVGAnimatedAngle;
      }
      
      interface SVGAnimatedBoolean {
          animVal: boolean;
          baseVal: boolean;
      }
      
      declare var SVGAnimatedBoolean: {
          prototype: SVGAnimatedBoolean;
          new(): SVGAnimatedBoolean;
      }
      
      interface SVGAnimatedEnumeration {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedEnumeration: {
          prototype: SVGAnimatedEnumeration;
          new(): SVGAnimatedEnumeration;
      }
      
      interface SVGAnimatedInteger {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedInteger: {
          prototype: SVGAnimatedInteger;
          new(): SVGAnimatedInteger;
      }
      
      interface SVGAnimatedLength {
          animVal: SVGLength;
          baseVal: SVGLength;
      }
      
      declare var SVGAnimatedLength: {
          prototype: SVGAnimatedLength;
          new(): SVGAnimatedLength;
      }
      
      interface SVGAnimatedLengthList {
          animVal: SVGLengthList;
          baseVal: SVGLengthList;
      }
      
      declare var SVGAnimatedLengthList: {
          prototype: SVGAnimatedLengthList;
          new(): SVGAnimatedLengthList;
      }
      
      interface SVGAnimatedNumber {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedNumber: {
          prototype: SVGAnimatedNumber;
          new(): SVGAnimatedNumber;
      }
      
      interface SVGAnimatedNumberList {
          animVal: SVGNumberList;
          baseVal: SVGNumberList;
      }
      
      declare var SVGAnimatedNumberList: {
          prototype: SVGAnimatedNumberList;
          new(): SVGAnimatedNumberList;
      }
      
      interface SVGAnimatedPreserveAspectRatio {
          animVal: SVGPreserveAspectRatio;
          baseVal: SVGPreserveAspectRatio;
      }
      
      declare var SVGAnimatedPreserveAspectRatio: {
          prototype: SVGAnimatedPreserveAspectRatio;
          new(): SVGAnimatedPreserveAspectRatio;
      }
      
      interface SVGAnimatedRect {
          animVal: SVGRect;
          baseVal: SVGRect;
      }
      
      declare var SVGAnimatedRect: {
          prototype: SVGAnimatedRect;
          new(): SVGAnimatedRect;
      }
      
      interface SVGAnimatedString {
          animVal: string;
          baseVal: string;
      }
      
      declare var SVGAnimatedString: {
          prototype: SVGAnimatedString;
          new(): SVGAnimatedString;
      }
      
      interface SVGAnimatedTransformList {
          animVal: SVGTransformList;
          baseVal: SVGTransformList;
      }
      
      declare var SVGAnimatedTransformList: {
          prototype: SVGAnimatedTransformList;
          new(): SVGAnimatedTransformList;
      }
      
      interface SVGCircleElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          r: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGCircleElement: {
          prototype: SVGCircleElement;
          new(): SVGCircleElement;
      }
      
      interface SVGClipPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
          clipPathUnits: SVGAnimatedEnumeration;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGClipPathElement: {
          prototype: SVGClipPathElement;
          new(): SVGClipPathElement;
      }
      
      interface SVGComponentTransferFunctionElement extends SVGElement {
          amplitude: SVGAnimatedNumber;
          exponent: SVGAnimatedNumber;
          intercept: SVGAnimatedNumber;
          offset: SVGAnimatedNumber;
          slope: SVGAnimatedNumber;
          tableValues: SVGAnimatedNumberList;
          type: SVGAnimatedEnumeration;
          SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
          SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
          SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
          SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
      }
      
      declare var SVGComponentTransferFunctionElement: {
          prototype: SVGComponentTransferFunctionElement;
          new(): SVGComponentTransferFunctionElement;
          SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
          SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
          SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
          SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
      }
      
      interface SVGDefsElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGDefsElement: {
          prototype: SVGDefsElement;
          new(): SVGDefsElement;
      }
      
      interface SVGDescElement extends SVGElement, SVGStylable, SVGLangSpace {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGDescElement: {
          prototype: SVGDescElement;
          new(): SVGDescElement;
      }
      
      interface SVGElement extends Element {
          id: string;
          onclick: (ev: MouseEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          onfocusin: (ev: FocusEvent) => any;
          onfocusout: (ev: FocusEvent) => any;
          onload: (ev: Event) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          ownerSVGElement: SVGSVGElement;
          viewportElement: SVGElement;
          xmlbase: string;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGElement: {
          prototype: SVGElement;
          new(): SVGElement;
      }
      
      interface SVGElementInstance extends EventTarget {
          childNodes: SVGElementInstanceList;
          correspondingElement: SVGElement;
          correspondingUseElement: SVGUseElement;
          firstChild: SVGElementInstance;
          lastChild: SVGElementInstance;
          nextSibling: SVGElementInstance;
          parentNode: SVGElementInstance;
          previousSibling: SVGElementInstance;
      }
      
      declare var SVGElementInstance: {
          prototype: SVGElementInstance;
          new(): SVGElementInstance;
      }
      
      interface SVGElementInstanceList {
          length: number;
          item(index: number): SVGElementInstance;
      }
      
      declare var SVGElementInstanceList: {
          prototype: SVGElementInstanceList;
          new(): SVGElementInstanceList;
      }
      
      interface SVGEllipseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          rx: SVGAnimatedLength;
          ry: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGEllipseElement: {
          prototype: SVGEllipseElement;
          new(): SVGEllipseElement;
      }
      
      interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          mode: SVGAnimatedEnumeration;
          SVG_FEBLEND_MODE_COLOR: number;
          SVG_FEBLEND_MODE_COLOR_BURN: number;
          SVG_FEBLEND_MODE_COLOR_DODGE: number;
          SVG_FEBLEND_MODE_DARKEN: number;
          SVG_FEBLEND_MODE_DIFFERENCE: number;
          SVG_FEBLEND_MODE_EXCLUSION: number;
          SVG_FEBLEND_MODE_HARD_LIGHT: number;
          SVG_FEBLEND_MODE_HUE: number;
          SVG_FEBLEND_MODE_LIGHTEN: number;
          SVG_FEBLEND_MODE_LUMINOSITY: number;
          SVG_FEBLEND_MODE_MULTIPLY: number;
          SVG_FEBLEND_MODE_NORMAL: number;
          SVG_FEBLEND_MODE_OVERLAY: number;
          SVG_FEBLEND_MODE_SATURATION: number;
          SVG_FEBLEND_MODE_SCREEN: number;
          SVG_FEBLEND_MODE_SOFT_LIGHT: number;
          SVG_FEBLEND_MODE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEBlendElement: {
          prototype: SVGFEBlendElement;
          new(): SVGFEBlendElement;
          SVG_FEBLEND_MODE_COLOR: number;
          SVG_FEBLEND_MODE_COLOR_BURN: number;
          SVG_FEBLEND_MODE_COLOR_DODGE: number;
          SVG_FEBLEND_MODE_DARKEN: number;
          SVG_FEBLEND_MODE_DIFFERENCE: number;
          SVG_FEBLEND_MODE_EXCLUSION: number;
          SVG_FEBLEND_MODE_HARD_LIGHT: number;
          SVG_FEBLEND_MODE_HUE: number;
          SVG_FEBLEND_MODE_LIGHTEN: number;
          SVG_FEBLEND_MODE_LUMINOSITY: number;
          SVG_FEBLEND_MODE_MULTIPLY: number;
          SVG_FEBLEND_MODE_NORMAL: number;
          SVG_FEBLEND_MODE_OVERLAY: number;
          SVG_FEBLEND_MODE_SATURATION: number;
          SVG_FEBLEND_MODE_SCREEN: number;
          SVG_FEBLEND_MODE_SOFT_LIGHT: number;
          SVG_FEBLEND_MODE_UNKNOWN: number;
      }
      
      interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          type: SVGAnimatedEnumeration;
          values: SVGAnimatedNumberList;
          SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
          SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
          SVG_FECOLORMATRIX_TYPE_MATRIX: number;
          SVG_FECOLORMATRIX_TYPE_SATURATE: number;
          SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEColorMatrixElement: {
          prototype: SVGFEColorMatrixElement;
          new(): SVGFEColorMatrixElement;
          SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
          SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
          SVG_FECOLORMATRIX_TYPE_MATRIX: number;
          SVG_FECOLORMATRIX_TYPE_SATURATE: number;
          SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
      }
      
      interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEComponentTransferElement: {
          prototype: SVGFEComponentTransferElement;
          new(): SVGFEComponentTransferElement;
      }
      
      interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          k1: SVGAnimatedNumber;
          k2: SVGAnimatedNumber;
          k3: SVGAnimatedNumber;
          k4: SVGAnimatedNumber;
          operator: SVGAnimatedEnumeration;
          SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
          SVG_FECOMPOSITE_OPERATOR_ATOP: number;
          SVG_FECOMPOSITE_OPERATOR_IN: number;
          SVG_FECOMPOSITE_OPERATOR_OUT: number;
          SVG_FECOMPOSITE_OPERATOR_OVER: number;
          SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
          SVG_FECOMPOSITE_OPERATOR_XOR: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFECompositeElement: {
          prototype: SVGFECompositeElement;
          new(): SVGFECompositeElement;
          SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
          SVG_FECOMPOSITE_OPERATOR_ATOP: number;
          SVG_FECOMPOSITE_OPERATOR_IN: number;
          SVG_FECOMPOSITE_OPERATOR_OUT: number;
          SVG_FECOMPOSITE_OPERATOR_OVER: number;
          SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
          SVG_FECOMPOSITE_OPERATOR_XOR: number;
      }
      
      interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          bias: SVGAnimatedNumber;
          divisor: SVGAnimatedNumber;
          edgeMode: SVGAnimatedEnumeration;
          in1: SVGAnimatedString;
          kernelMatrix: SVGAnimatedNumberList;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          orderX: SVGAnimatedInteger;
          orderY: SVGAnimatedInteger;
          preserveAlpha: SVGAnimatedBoolean;
          targetX: SVGAnimatedInteger;
          targetY: SVGAnimatedInteger;
          SVG_EDGEMODE_DUPLICATE: number;
          SVG_EDGEMODE_NONE: number;
          SVG_EDGEMODE_UNKNOWN: number;
          SVG_EDGEMODE_WRAP: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEConvolveMatrixElement: {
          prototype: SVGFEConvolveMatrixElement;
          new(): SVGFEConvolveMatrixElement;
          SVG_EDGEMODE_DUPLICATE: number;
          SVG_EDGEMODE_NONE: number;
          SVG_EDGEMODE_UNKNOWN: number;
          SVG_EDGEMODE_WRAP: number;
      }
      
      interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          diffuseConstant: SVGAnimatedNumber;
          in1: SVGAnimatedString;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          surfaceScale: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEDiffuseLightingElement: {
          prototype: SVGFEDiffuseLightingElement;
          new(): SVGFEDiffuseLightingElement;
      }
      
      interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          scale: SVGAnimatedNumber;
          xChannelSelector: SVGAnimatedEnumeration;
          yChannelSelector: SVGAnimatedEnumeration;
          SVG_CHANNEL_A: number;
          SVG_CHANNEL_B: number;
          SVG_CHANNEL_G: number;
          SVG_CHANNEL_R: number;
          SVG_CHANNEL_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEDisplacementMapElement: {
          prototype: SVGFEDisplacementMapElement;
          new(): SVGFEDisplacementMapElement;
          SVG_CHANNEL_A: number;
          SVG_CHANNEL_B: number;
          SVG_CHANNEL_G: number;
          SVG_CHANNEL_R: number;
          SVG_CHANNEL_UNKNOWN: number;
      }
      
      interface SVGFEDistantLightElement extends SVGElement {
          azimuth: SVGAnimatedNumber;
          elevation: SVGAnimatedNumber;
      }
      
      declare var SVGFEDistantLightElement: {
          prototype: SVGFEDistantLightElement;
          new(): SVGFEDistantLightElement;
      }
      
      interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEFloodElement: {
          prototype: SVGFEFloodElement;
          new(): SVGFEFloodElement;
      }
      
      interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncAElement: {
          prototype: SVGFEFuncAElement;
          new(): SVGFEFuncAElement;
      }
      
      interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncBElement: {
          prototype: SVGFEFuncBElement;
          new(): SVGFEFuncBElement;
      }
      
      interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncGElement: {
          prototype: SVGFEFuncGElement;
          new(): SVGFEFuncGElement;
      }
      
      interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncRElement: {
          prototype: SVGFEFuncRElement;
          new(): SVGFEFuncRElement;
      }
      
      interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          stdDeviationX: SVGAnimatedNumber;
          stdDeviationY: SVGAnimatedNumber;
          setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEGaussianBlurElement: {
          prototype: SVGFEGaussianBlurElement;
          new(): SVGFEGaussianBlurElement;
      }
      
      interface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEImageElement: {
          prototype: SVGFEImageElement;
          new(): SVGFEImageElement;
      }
      
      interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEMergeElement: {
          prototype: SVGFEMergeElement;
          new(): SVGFEMergeElement;
      }
      
      interface SVGFEMergeNodeElement extends SVGElement {
          in1: SVGAnimatedString;
      }
      
      declare var SVGFEMergeNodeElement: {
          prototype: SVGFEMergeNodeElement;
          new(): SVGFEMergeNodeElement;
      }
      
      interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          operator: SVGAnimatedEnumeration;
          radiusX: SVGAnimatedNumber;
          radiusY: SVGAnimatedNumber;
          SVG_MORPHOLOGY_OPERATOR_DILATE: number;
          SVG_MORPHOLOGY_OPERATOR_ERODE: number;
          SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEMorphologyElement: {
          prototype: SVGFEMorphologyElement;
          new(): SVGFEMorphologyElement;
          SVG_MORPHOLOGY_OPERATOR_DILATE: number;
          SVG_MORPHOLOGY_OPERATOR_ERODE: number;
          SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
      }
      
      interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          dx: SVGAnimatedNumber;
          dy: SVGAnimatedNumber;
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEOffsetElement: {
          prototype: SVGFEOffsetElement;
          new(): SVGFEOffsetElement;
      }
      
      interface SVGFEPointLightElement extends SVGElement {
          x: SVGAnimatedNumber;
          y: SVGAnimatedNumber;
          z: SVGAnimatedNumber;
      }
      
      declare var SVGFEPointLightElement: {
          prototype: SVGFEPointLightElement;
          new(): SVGFEPointLightElement;
      }
      
      interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          specularConstant: SVGAnimatedNumber;
          specularExponent: SVGAnimatedNumber;
          surfaceScale: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFESpecularLightingElement: {
          prototype: SVGFESpecularLightingElement;
          new(): SVGFESpecularLightingElement;
      }
      
      interface SVGFESpotLightElement extends SVGElement {
          limitingConeAngle: SVGAnimatedNumber;
          pointsAtX: SVGAnimatedNumber;
          pointsAtY: SVGAnimatedNumber;
          pointsAtZ: SVGAnimatedNumber;
          specularExponent: SVGAnimatedNumber;
          x: SVGAnimatedNumber;
          y: SVGAnimatedNumber;
          z: SVGAnimatedNumber;
      }
      
      declare var SVGFESpotLightElement: {
          prototype: SVGFESpotLightElement;
          new(): SVGFESpotLightElement;
      }
      
      interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFETileElement: {
          prototype: SVGFETileElement;
          new(): SVGFETileElement;
      }
      
      interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          baseFrequencyX: SVGAnimatedNumber;
          baseFrequencyY: SVGAnimatedNumber;
          numOctaves: SVGAnimatedInteger;
          seed: SVGAnimatedNumber;
          stitchTiles: SVGAnimatedEnumeration;
          type: SVGAnimatedEnumeration;
          SVG_STITCHTYPE_NOSTITCH: number;
          SVG_STITCHTYPE_STITCH: number;
          SVG_STITCHTYPE_UNKNOWN: number;
          SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
          SVG_TURBULENCE_TYPE_TURBULENCE: number;
          SVG_TURBULENCE_TYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFETurbulenceElement: {
          prototype: SVGFETurbulenceElement;
          new(): SVGFETurbulenceElement;
          SVG_STITCHTYPE_NOSTITCH: number;
          SVG_STITCHTYPE_STITCH: number;
          SVG_STITCHTYPE_UNKNOWN: number;
          SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
          SVG_TURBULENCE_TYPE_TURBULENCE: number;
          SVG_TURBULENCE_TYPE_UNKNOWN: number;
      }
      
      interface SVGFilterElement extends SVGElement, SVGUnitTypes, SVGStylable, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
          filterResX: SVGAnimatedInteger;
          filterResY: SVGAnimatedInteger;
          filterUnits: SVGAnimatedEnumeration;
          height: SVGAnimatedLength;
          primitiveUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          setFilterRes(filterResX: number, filterResY: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFilterElement: {
          prototype: SVGFilterElement;
          new(): SVGFilterElement;
      }
      
      interface SVGForeignObjectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          height: SVGAnimatedLength;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGForeignObjectElement: {
          prototype: SVGForeignObjectElement;
          new(): SVGForeignObjectElement;
      }
      
      interface SVGGElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGGElement: {
          prototype: SVGGElement;
          new(): SVGGElement;
      }
      
      interface SVGGradientElement extends SVGElement, SVGStylable, SVGExternalResourcesRequired, SVGURIReference, SVGUnitTypes {
          gradientTransform: SVGAnimatedTransformList;
          gradientUnits: SVGAnimatedEnumeration;
          spreadMethod: SVGAnimatedEnumeration;
          SVG_SPREADMETHOD_PAD: number;
          SVG_SPREADMETHOD_REFLECT: number;
          SVG_SPREADMETHOD_REPEAT: number;
          SVG_SPREADMETHOD_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGGradientElement: {
          prototype: SVGGradientElement;
          new(): SVGGradientElement;
          SVG_SPREADMETHOD_PAD: number;
          SVG_SPREADMETHOD_REFLECT: number;
          SVG_SPREADMETHOD_REPEAT: number;
          SVG_SPREADMETHOD_UNKNOWN: number;
      }
      
      interface SVGImageElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          height: SVGAnimatedLength;
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGImageElement: {
          prototype: SVGImageElement;
          new(): SVGImageElement;
      }
      
      interface SVGLength {
          unitType: number;
          value: number;
          valueAsString: string;
          valueInSpecifiedUnits: number;
          convertToSpecifiedUnits(unitType: number): void;
          newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
          SVG_LENGTHTYPE_CM: number;
          SVG_LENGTHTYPE_EMS: number;
          SVG_LENGTHTYPE_EXS: number;
          SVG_LENGTHTYPE_IN: number;
          SVG_LENGTHTYPE_MM: number;
          SVG_LENGTHTYPE_NUMBER: number;
          SVG_LENGTHTYPE_PC: number;
          SVG_LENGTHTYPE_PERCENTAGE: number;
          SVG_LENGTHTYPE_PT: number;
          SVG_LENGTHTYPE_PX: number;
          SVG_LENGTHTYPE_UNKNOWN: number;
      }
      
      declare var SVGLength: {
          prototype: SVGLength;
          new(): SVGLength;
          SVG_LENGTHTYPE_CM: number;
          SVG_LENGTHTYPE_EMS: number;
          SVG_LENGTHTYPE_EXS: number;
          SVG_LENGTHTYPE_IN: number;
          SVG_LENGTHTYPE_MM: number;
          SVG_LENGTHTYPE_NUMBER: number;
          SVG_LENGTHTYPE_PC: number;
          SVG_LENGTHTYPE_PERCENTAGE: number;
          SVG_LENGTHTYPE_PT: number;
          SVG_LENGTHTYPE_PX: number;
          SVG_LENGTHTYPE_UNKNOWN: number;
      }
      
      interface SVGLengthList {
          numberOfItems: number;
          appendItem(newItem: SVGLength): SVGLength;
          clear(): void;
          getItem(index: number): SVGLength;
          initialize(newItem: SVGLength): SVGLength;
          insertItemBefore(newItem: SVGLength, index: number): SVGLength;
          removeItem(index: number): SVGLength;
          replaceItem(newItem: SVGLength, index: number): SVGLength;
      }
      
      declare var SVGLengthList: {
          prototype: SVGLengthList;
          new(): SVGLengthList;
      }
      
      interface SVGLineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          x1: SVGAnimatedLength;
          x2: SVGAnimatedLength;
          y1: SVGAnimatedLength;
          y2: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGLineElement: {
          prototype: SVGLineElement;
          new(): SVGLineElement;
      }
      
      interface SVGLinearGradientElement extends SVGGradientElement {
          x1: SVGAnimatedLength;
          x2: SVGAnimatedLength;
          y1: SVGAnimatedLength;
          y2: SVGAnimatedLength;
      }
      
      declare var SVGLinearGradientElement: {
          prototype: SVGLinearGradientElement;
          new(): SVGLinearGradientElement;
      }
      
      interface SVGMarkerElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
          markerHeight: SVGAnimatedLength;
          markerUnits: SVGAnimatedEnumeration;
          markerWidth: SVGAnimatedLength;
          orientAngle: SVGAnimatedAngle;
          orientType: SVGAnimatedEnumeration;
          refX: SVGAnimatedLength;
          refY: SVGAnimatedLength;
          setOrientToAngle(angle: SVGAngle): void;
          setOrientToAuto(): void;
          SVG_MARKERUNITS_STROKEWIDTH: number;
          SVG_MARKERUNITS_UNKNOWN: number;
          SVG_MARKERUNITS_USERSPACEONUSE: number;
          SVG_MARKER_ORIENT_ANGLE: number;
          SVG_MARKER_ORIENT_AUTO: number;
          SVG_MARKER_ORIENT_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGMarkerElement: {
          prototype: SVGMarkerElement;
          new(): SVGMarkerElement;
          SVG_MARKERUNITS_STROKEWIDTH: number;
          SVG_MARKERUNITS_UNKNOWN: number;
          SVG_MARKERUNITS_USERSPACEONUSE: number;
          SVG_MARKER_ORIENT_ANGLE: number;
          SVG_MARKER_ORIENT_AUTO: number;
          SVG_MARKER_ORIENT_UNKNOWN: number;
      }
      
      interface SVGMaskElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
          height: SVGAnimatedLength;
          maskContentUnits: SVGAnimatedEnumeration;
          maskUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGMaskElement: {
          prototype: SVGMaskElement;
          new(): SVGMaskElement;
      }
      
      interface SVGMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          flipX(): SVGMatrix;
          flipY(): SVGMatrix;
          inverse(): SVGMatrix;
          multiply(secondMatrix: SVGMatrix): SVGMatrix;
          rotate(angle: number): SVGMatrix;
          rotateFromVector(x: number, y: number): SVGMatrix;
          scale(scaleFactor: number): SVGMatrix;
          scaleNonUniform(scaleFactorX: number, scaleFactorY: number): SVGMatrix;
          skewX(angle: number): SVGMatrix;
          skewY(angle: number): SVGMatrix;
          translate(x: number, y: number): SVGMatrix;
      }
      
      declare var SVGMatrix: {
          prototype: SVGMatrix;
          new(): SVGMatrix;
      }
      
      interface SVGMetadataElement extends SVGElement {
      }
      
      declare var SVGMetadataElement: {
          prototype: SVGMetadataElement;
          new(): SVGMetadataElement;
      }
      
      interface SVGNumber {
          value: number;
      }
      
      declare var SVGNumber: {
          prototype: SVGNumber;
          new(): SVGNumber;
      }
      
      interface SVGNumberList {
          numberOfItems: number;
          appendItem(newItem: SVGNumber): SVGNumber;
          clear(): void;
          getItem(index: number): SVGNumber;
          initialize(newItem: SVGNumber): SVGNumber;
          insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;
          removeItem(index: number): SVGNumber;
          replaceItem(newItem: SVGNumber, index: number): SVGNumber;
      }
      
      declare var SVGNumberList: {
          prototype: SVGNumberList;
          new(): SVGNumberList;
      }
      
      interface SVGPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPathData {
          createSVGPathSegArcAbs(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcAbs;
          createSVGPathSegArcRel(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcRel;
          createSVGPathSegClosePath(): SVGPathSegClosePath;
          createSVGPathSegCurvetoCubicAbs(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicAbs;
          createSVGPathSegCurvetoCubicRel(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicRel;
          createSVGPathSegCurvetoCubicSmoothAbs(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothAbs;
          createSVGPathSegCurvetoCubicSmoothRel(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothRel;
          createSVGPathSegCurvetoQuadraticAbs(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticAbs;
          createSVGPathSegCurvetoQuadraticRel(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticRel;
          createSVGPathSegCurvetoQuadraticSmoothAbs(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothAbs;
          createSVGPathSegCurvetoQuadraticSmoothRel(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothRel;
          createSVGPathSegLinetoAbs(x: number, y: number): SVGPathSegLinetoAbs;
          createSVGPathSegLinetoHorizontalAbs(x: number): SVGPathSegLinetoHorizontalAbs;
          createSVGPathSegLinetoHorizontalRel(x: number): SVGPathSegLinetoHorizontalRel;
          createSVGPathSegLinetoRel(x: number, y: number): SVGPathSegLinetoRel;
          createSVGPathSegLinetoVerticalAbs(y: number): SVGPathSegLinetoVerticalAbs;
          createSVGPathSegLinetoVerticalRel(y: number): SVGPathSegLinetoVerticalRel;
          createSVGPathSegMovetoAbs(x: number, y: number): SVGPathSegMovetoAbs;
          createSVGPathSegMovetoRel(x: number, y: number): SVGPathSegMovetoRel;
          getPathSegAtLength(distance: number): number;
          getPointAtLength(distance: number): SVGPoint;
          getTotalLength(): number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPathElement: {
          prototype: SVGPathElement;
          new(): SVGPathElement;
      }
      
      interface SVGPathSeg {
          pathSegType: number;
          pathSegTypeAsLetter: string;
          PATHSEG_ARC_ABS: number;
          PATHSEG_ARC_REL: number;
          PATHSEG_CLOSEPATH: number;
          PATHSEG_CURVETO_CUBIC_ABS: number;
          PATHSEG_CURVETO_CUBIC_REL: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
          PATHSEG_CURVETO_QUADRATIC_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_REL: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
          PATHSEG_LINETO_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_REL: number;
          PATHSEG_LINETO_REL: number;
          PATHSEG_LINETO_VERTICAL_ABS: number;
          PATHSEG_LINETO_VERTICAL_REL: number;
          PATHSEG_MOVETO_ABS: number;
          PATHSEG_MOVETO_REL: number;
          PATHSEG_UNKNOWN: number;
      }
      
      declare var SVGPathSeg: {
          prototype: SVGPathSeg;
          new(): SVGPathSeg;
          PATHSEG_ARC_ABS: number;
          PATHSEG_ARC_REL: number;
          PATHSEG_CLOSEPATH: number;
          PATHSEG_CURVETO_CUBIC_ABS: number;
          PATHSEG_CURVETO_CUBIC_REL: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
          PATHSEG_CURVETO_QUADRATIC_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_REL: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
          PATHSEG_LINETO_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_REL: number;
          PATHSEG_LINETO_REL: number;
          PATHSEG_LINETO_VERTICAL_ABS: number;
          PATHSEG_LINETO_VERTICAL_REL: number;
          PATHSEG_MOVETO_ABS: number;
          PATHSEG_MOVETO_REL: number;
          PATHSEG_UNKNOWN: number;
      }
      
      interface SVGPathSegArcAbs extends SVGPathSeg {
          angle: number;
          largeArcFlag: boolean;
          r1: number;
          r2: number;
          sweepFlag: boolean;
          x: number;
          y: number;
      }
      
      declare var SVGPathSegArcAbs: {
          prototype: SVGPathSegArcAbs;
          new(): SVGPathSegArcAbs;
      }
      
      interface SVGPathSegArcRel extends SVGPathSeg {
          angle: number;
          largeArcFlag: boolean;
          r1: number;
          r2: number;
          sweepFlag: boolean;
          x: number;
          y: number;
      }
      
      declare var SVGPathSegArcRel: {
          prototype: SVGPathSegArcRel;
          new(): SVGPathSegArcRel;
      }
      
      interface SVGPathSegClosePath extends SVGPathSeg {
      }
      
      declare var SVGPathSegClosePath: {
          prototype: SVGPathSegClosePath;
          new(): SVGPathSegClosePath;
      }
      
      interface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
          x: number;
          x1: number;
          x2: number;
          y: number;
          y1: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicAbs: {
          prototype: SVGPathSegCurvetoCubicAbs;
          new(): SVGPathSegCurvetoCubicAbs;
      }
      
      interface SVGPathSegCurvetoCubicRel extends SVGPathSeg {
          x: number;
          x1: number;
          x2: number;
          y: number;
          y1: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicRel: {
          prototype: SVGPathSegCurvetoCubicRel;
          new(): SVGPathSegCurvetoCubicRel;
      }
      
      interface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
          x: number;
          x2: number;
          y: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicSmoothAbs: {
          prototype: SVGPathSegCurvetoCubicSmoothAbs;
          new(): SVGPathSegCurvetoCubicSmoothAbs;
      }
      
      interface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
          x: number;
          x2: number;
          y: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicSmoothRel: {
          prototype: SVGPathSegCurvetoCubicSmoothRel;
          new(): SVGPathSegCurvetoCubicSmoothRel;
      }
      
      interface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
          x: number;
          x1: number;
          y: number;
          y1: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticAbs: {
          prototype: SVGPathSegCurvetoQuadraticAbs;
          new(): SVGPathSegCurvetoQuadraticAbs;
      }
      
      interface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
          x: number;
          x1: number;
          y: number;
          y1: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticRel: {
          prototype: SVGPathSegCurvetoQuadraticRel;
          new(): SVGPathSegCurvetoQuadraticRel;
      }
      
      interface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticSmoothAbs: {
          prototype: SVGPathSegCurvetoQuadraticSmoothAbs;
          new(): SVGPathSegCurvetoQuadraticSmoothAbs;
      }
      
      interface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticSmoothRel: {
          prototype: SVGPathSegCurvetoQuadraticSmoothRel;
          new(): SVGPathSegCurvetoQuadraticSmoothRel;
      }
      
      interface SVGPathSegLinetoAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegLinetoAbs: {
          prototype: SVGPathSegLinetoAbs;
          new(): SVGPathSegLinetoAbs;
      }
      
      interface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
          x: number;
      }
      
      declare var SVGPathSegLinetoHorizontalAbs: {
          prototype: SVGPathSegLinetoHorizontalAbs;
          new(): SVGPathSegLinetoHorizontalAbs;
      }
      
      interface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
          x: number;
      }
      
      declare var SVGPathSegLinetoHorizontalRel: {
          prototype: SVGPathSegLinetoHorizontalRel;
          new(): SVGPathSegLinetoHorizontalRel;
      }
      
      interface SVGPathSegLinetoRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegLinetoRel: {
          prototype: SVGPathSegLinetoRel;
          new(): SVGPathSegLinetoRel;
      }
      
      interface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
          y: number;
      }
      
      declare var SVGPathSegLinetoVerticalAbs: {
          prototype: SVGPathSegLinetoVerticalAbs;
          new(): SVGPathSegLinetoVerticalAbs;
      }
      
      interface SVGPathSegLinetoVerticalRel extends SVGPathSeg {
          y: number;
      }
      
      declare var SVGPathSegLinetoVerticalRel: {
          prototype: SVGPathSegLinetoVerticalRel;
          new(): SVGPathSegLinetoVerticalRel;
      }
      
      interface SVGPathSegList {
          numberOfItems: number;
          appendItem(newItem: SVGPathSeg): SVGPathSeg;
          clear(): void;
          getItem(index: number): SVGPathSeg;
          initialize(newItem: SVGPathSeg): SVGPathSeg;
          insertItemBefore(newItem: SVGPathSeg, index: number): SVGPathSeg;
          removeItem(index: number): SVGPathSeg;
          replaceItem(newItem: SVGPathSeg, index: number): SVGPathSeg;
      }
      
      declare var SVGPathSegList: {
          prototype: SVGPathSegList;
          new(): SVGPathSegList;
      }
      
      interface SVGPathSegMovetoAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegMovetoAbs: {
          prototype: SVGPathSegMovetoAbs;
          new(): SVGPathSegMovetoAbs;
      }
      
      interface SVGPathSegMovetoRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegMovetoRel: {
          prototype: SVGPathSegMovetoRel;
          new(): SVGPathSegMovetoRel;
      }
      
      interface SVGPatternElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGURIReference, SVGUnitTypes {
          height: SVGAnimatedLength;
          patternContentUnits: SVGAnimatedEnumeration;
          patternTransform: SVGAnimatedTransformList;
          patternUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPatternElement: {
          prototype: SVGPatternElement;
          new(): SVGPatternElement;
      }
      
      interface SVGPoint {
          x: number;
          y: number;
          matrixTransform(matrix: SVGMatrix): SVGPoint;
      }
      
      declare var SVGPoint: {
          prototype: SVGPoint;
          new(): SVGPoint;
      }
      
      interface SVGPointList {
          numberOfItems: number;
          appendItem(newItem: SVGPoint): SVGPoint;
          clear(): void;
          getItem(index: number): SVGPoint;
          initialize(newItem: SVGPoint): SVGPoint;
          insertItemBefore(newItem: SVGPoint, index: number): SVGPoint;
          removeItem(index: number): SVGPoint;
          replaceItem(newItem: SVGPoint, index: number): SVGPoint;
      }
      
      declare var SVGPointList: {
          prototype: SVGPointList;
          new(): SVGPointList;
      }
      
      interface SVGPolygonElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPolygonElement: {
          prototype: SVGPolygonElement;
          new(): SVGPolygonElement;
      }
      
      interface SVGPolylineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPolylineElement: {
          prototype: SVGPolylineElement;
          new(): SVGPolylineElement;
      }
      
      interface SVGPreserveAspectRatio {
          align: number;
          meetOrSlice: number;
          SVG_MEETORSLICE_MEET: number;
          SVG_MEETORSLICE_SLICE: number;
          SVG_MEETORSLICE_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_NONE: number;
          SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMINYMID: number;
          SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
      }
      
      declare var SVGPreserveAspectRatio: {
          prototype: SVGPreserveAspectRatio;
          new(): SVGPreserveAspectRatio;
          SVG_MEETORSLICE_MEET: number;
          SVG_MEETORSLICE_SLICE: number;
          SVG_MEETORSLICE_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_NONE: number;
          SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMINYMID: number;
          SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
      }
      
      interface SVGRadialGradientElement extends SVGGradientElement {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          fx: SVGAnimatedLength;
          fy: SVGAnimatedLength;
          r: SVGAnimatedLength;
      }
      
      declare var SVGRadialGradientElement: {
          prototype: SVGRadialGradientElement;
          new(): SVGRadialGradientElement;
      }
      
      interface SVGRect {
          height: number;
          width: number;
          x: number;
          y: number;
      }
      
      declare var SVGRect: {
          prototype: SVGRect;
          new(): SVGRect;
      }
      
      interface SVGRectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          height: SVGAnimatedLength;
          rx: SVGAnimatedLength;
          ry: SVGAnimatedLength;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGRectElement: {
          prototype: SVGRectElement;
          new(): SVGRectElement;
      }
      
      interface SVGSVGElement extends SVGElement, DocumentEvent, SVGLocatable, SVGTests, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
          contentScriptType: string;
          contentStyleType: string;
          currentScale: number;
          currentTranslate: SVGPoint;
          height: SVGAnimatedLength;
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onresize: (ev: UIEvent) => any;
          onscroll: (ev: UIEvent) => any;
          onunload: (ev: Event) => any;
          onzoom: (ev: SVGZoomEvent) => any;
          pixelUnitToMillimeterX: number;
          pixelUnitToMillimeterY: number;
          screenPixelToMillimeterX: number;
          screenPixelToMillimeterY: number;
          viewport: SVGRect;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          checkEnclosure(element: SVGElement, rect: SVGRect): boolean;
          checkIntersection(element: SVGElement, rect: SVGRect): boolean;
          createSVGAngle(): SVGAngle;
          createSVGLength(): SVGLength;
          createSVGMatrix(): SVGMatrix;
          createSVGNumber(): SVGNumber;
          createSVGPoint(): SVGPoint;
          createSVGRect(): SVGRect;
          createSVGTransform(): SVGTransform;
          createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
          deselectAll(): void;
          forceRedraw(): void;
          getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
          getCurrentTime(): number;
          getElementById(elementId: string): Element;
          getEnclosureList(rect: SVGRect, referenceElement: SVGElement): NodeList;
          getIntersectionList(rect: SVGRect, referenceElement: SVGElement): NodeList;
          pauseAnimations(): void;
          setCurrentTime(seconds: number): void;
          suspendRedraw(maxWaitMilliseconds: number): number;
          unpauseAnimations(): void;
          unsuspendRedraw(suspendHandleID: number): void;
          unsuspendRedrawAll(): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGAbort", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGError", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGUnload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGZoom", listener: (ev: SVGZoomEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSVGElement: {
          prototype: SVGSVGElement;
          new(): SVGSVGElement;
      }
      
      interface SVGScriptElement extends SVGElement, SVGExternalResourcesRequired, SVGURIReference {
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGScriptElement: {
          prototype: SVGScriptElement;
          new(): SVGScriptElement;
      }
      
      interface SVGStopElement extends SVGElement, SVGStylable {
          offset: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGStopElement: {
          prototype: SVGStopElement;
          new(): SVGStopElement;
      }
      
      interface SVGStringList {
          numberOfItems: number;
          appendItem(newItem: string): string;
          clear(): void;
          getItem(index: number): string;
          initialize(newItem: string): string;
          insertItemBefore(newItem: string, index: number): string;
          removeItem(index: number): string;
          replaceItem(newItem: string, index: number): string;
      }
      
      declare var SVGStringList: {
          prototype: SVGStringList;
          new(): SVGStringList;
      }
      
      interface SVGStyleElement extends SVGElement, SVGLangSpace {
          media: string;
          title: string;
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGStyleElement: {
          prototype: SVGStyleElement;
          new(): SVGStyleElement;
      }
      
      interface SVGSwitchElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSwitchElement: {
          prototype: SVGSwitchElement;
          new(): SVGSwitchElement;
      }
      
      interface SVGSymbolElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSymbolElement: {
          prototype: SVGSymbolElement;
          new(): SVGSymbolElement;
      }
      
      interface SVGTSpanElement extends SVGTextPositioningElement {
      }
      
      declare var SVGTSpanElement: {
          prototype: SVGTSpanElement;
          new(): SVGTSpanElement;
      }
      
      interface SVGTextContentElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          lengthAdjust: SVGAnimatedEnumeration;
          textLength: SVGAnimatedLength;
          getCharNumAtPosition(point: SVGPoint): number;
          getComputedTextLength(): number;
          getEndPositionOfChar(charnum: number): SVGPoint;
          getExtentOfChar(charnum: number): SVGRect;
          getNumberOfChars(): number;
          getRotationOfChar(charnum: number): number;
          getStartPositionOfChar(charnum: number): SVGPoint;
          getSubStringLength(charnum: number, nchars: number): number;
          selectSubString(charnum: number, nchars: number): void;
          LENGTHADJUST_SPACING: number;
          LENGTHADJUST_SPACINGANDGLYPHS: number;
          LENGTHADJUST_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextContentElement: {
          prototype: SVGTextContentElement;
          new(): SVGTextContentElement;
          LENGTHADJUST_SPACING: number;
          LENGTHADJUST_SPACINGANDGLYPHS: number;
          LENGTHADJUST_UNKNOWN: number;
      }
      
      interface SVGTextElement extends SVGTextPositioningElement, SVGTransformable {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextElement: {
          prototype: SVGTextElement;
          new(): SVGTextElement;
      }
      
      interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
          method: SVGAnimatedEnumeration;
          spacing: SVGAnimatedEnumeration;
          startOffset: SVGAnimatedLength;
          TEXTPATH_METHODTYPE_ALIGN: number;
          TEXTPATH_METHODTYPE_STRETCH: number;
          TEXTPATH_METHODTYPE_UNKNOWN: number;
          TEXTPATH_SPACINGTYPE_AUTO: number;
          TEXTPATH_SPACINGTYPE_EXACT: number;
          TEXTPATH_SPACINGTYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextPathElement: {
          prototype: SVGTextPathElement;
          new(): SVGTextPathElement;
          TEXTPATH_METHODTYPE_ALIGN: number;
          TEXTPATH_METHODTYPE_STRETCH: number;
          TEXTPATH_METHODTYPE_UNKNOWN: number;
          TEXTPATH_SPACINGTYPE_AUTO: number;
          TEXTPATH_SPACINGTYPE_EXACT: number;
          TEXTPATH_SPACINGTYPE_UNKNOWN: number;
      }
      
      interface SVGTextPositioningElement extends SVGTextContentElement {
          dx: SVGAnimatedLengthList;
          dy: SVGAnimatedLengthList;
          rotate: SVGAnimatedNumberList;
          x: SVGAnimatedLengthList;
          y: SVGAnimatedLengthList;
      }
      
      declare var SVGTextPositioningElement: {
          prototype: SVGTextPositioningElement;
          new(): SVGTextPositioningElement;
      }
      
      interface SVGTitleElement extends SVGElement, SVGStylable, SVGLangSpace {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTitleElement: {
          prototype: SVGTitleElement;
          new(): SVGTitleElement;
      }
      
      interface SVGTransform {
          angle: number;
          matrix: SVGMatrix;
          type: number;
          setMatrix(matrix: SVGMatrix): void;
          setRotate(angle: number, cx: number, cy: number): void;
          setScale(sx: number, sy: number): void;
          setSkewX(angle: number): void;
          setSkewY(angle: number): void;
          setTranslate(tx: number, ty: number): void;
          SVG_TRANSFORM_MATRIX: number;
          SVG_TRANSFORM_ROTATE: number;
          SVG_TRANSFORM_SCALE: number;
          SVG_TRANSFORM_SKEWX: number;
          SVG_TRANSFORM_SKEWY: number;
          SVG_TRANSFORM_TRANSLATE: number;
          SVG_TRANSFORM_UNKNOWN: number;
      }
      
      declare var SVGTransform: {
          prototype: SVGTransform;
          new(): SVGTransform;
          SVG_TRANSFORM_MATRIX: number;
          SVG_TRANSFORM_ROTATE: number;
          SVG_TRANSFORM_SCALE: number;
          SVG_TRANSFORM_SKEWX: number;
          SVG_TRANSFORM_SKEWY: number;
          SVG_TRANSFORM_TRANSLATE: number;
          SVG_TRANSFORM_UNKNOWN: number;
      }
      
      interface SVGTransformList {
          numberOfItems: number;
          appendItem(newItem: SVGTransform): SVGTransform;
          clear(): void;
          consolidate(): SVGTransform;
          createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
          getItem(index: number): SVGTransform;
          initialize(newItem: SVGTransform): SVGTransform;
          insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;
          removeItem(index: number): SVGTransform;
          replaceItem(newItem: SVGTransform, index: number): SVGTransform;
      }
      
      declare var SVGTransformList: {
          prototype: SVGTransformList;
          new(): SVGTransformList;
      }
      
      interface SVGUnitTypes {
          SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;
          SVG_UNIT_TYPE_UNKNOWN: number;
          SVG_UNIT_TYPE_USERSPACEONUSE: number;
      }
      declare var SVGUnitTypes: SVGUnitTypes;
      
      interface SVGUseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          animatedInstanceRoot: SVGElementInstance;
          height: SVGAnimatedLength;
          instanceRoot: SVGElementInstance;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGUseElement: {
          prototype: SVGUseElement;
          new(): SVGUseElement;
      }
      
      interface SVGViewElement extends SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
          viewTarget: SVGStringList;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGViewElement: {
          prototype: SVGViewElement;
          new(): SVGViewElement;
      }
      
      interface SVGZoomAndPan {
          SVG_ZOOMANDPAN_DISABLE: number;
          SVG_ZOOMANDPAN_MAGNIFY: number;
          SVG_ZOOMANDPAN_UNKNOWN: number;
      }
      declare var SVGZoomAndPan: SVGZoomAndPan;
      
      interface SVGZoomEvent extends UIEvent {
          newScale: number;
          newTranslate: SVGPoint;
          previousScale: number;
          previousTranslate: SVGPoint;
          zoomRectScreen: SVGRect;
      }
      
      declare var SVGZoomEvent: {
          prototype: SVGZoomEvent;
          new(): SVGZoomEvent;
      }
      
      interface Screen extends EventTarget {
          availHeight: number;
          availWidth: number;
          bufferDepth: number;
          colorDepth: number;
          deviceXDPI: number;
          deviceYDPI: number;
          fontSmoothingEnabled: boolean;
          height: number;
          logicalXDPI: number;
          logicalYDPI: number;
          msOrientation: string;
          onmsorientationchange: (ev: Event) => any;
          pixelDepth: number;
          systemXDPI: number;
          systemYDPI: number;
          width: number;
          msLockOrientation(orientations: string): boolean;
          msLockOrientation(orientations: string[]): boolean;
          msUnlockOrientation(): void;
          addEventListener(type: "MSOrientationChange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Screen: {
          prototype: Screen;
          new(): Screen;
      }
      
      interface ScriptNotifyEvent extends Event {
          callingUri: string;
          value: string;
      }
      
      declare var ScriptNotifyEvent: {
          prototype: ScriptNotifyEvent;
          new(): ScriptNotifyEvent;
      }
      
      interface ScriptProcessorNode extends AudioNode {
          bufferSize: number;
          onaudioprocess: (ev: AudioProcessingEvent) => any;
          addEventListener(type: "audioprocess", listener: (ev: AudioProcessingEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var ScriptProcessorNode: {
          prototype: ScriptProcessorNode;
          new(): ScriptProcessorNode;
      }
      
      interface Selection {
          anchorNode: Node;
          anchorOffset: number;
          focusNode: Node;
          focusOffset: number;
          isCollapsed: boolean;
          rangeCount: number;
          type: string;
          addRange(range: Range): void;
          collapse(parentNode: Node, offset: number): void;
          collapseToEnd(): void;
          collapseToStart(): void;
          containsNode(node: Node, partlyContained: boolean): boolean;
          deleteFromDocument(): void;
          empty(): void;
          extend(newNode: Node, offset: number): void;
          getRangeAt(index: number): Range;
          removeAllRanges(): void;
          removeRange(range: Range): void;
          selectAllChildren(parentNode: Node): void;
          setBaseAndExtent(baseNode: Node, baseOffset: number, extentNode: Node, extentOffset: number): void;
          toString(): string;
      }
      
      declare var Selection: {
          prototype: Selection;
          new(): Selection;
      }
      
      interface SourceBuffer extends EventTarget {
          appendWindowEnd: number;
          appendWindowStart: number;
          audioTracks: AudioTrackList;
          buffered: TimeRanges;
          mode: string;
          timestampOffset: number;
          updating: boolean;
          videoTracks: VideoTrackList;
          abort(): void;
          appendBuffer(data: ArrayBuffer): void;
          appendBuffer(data: ArrayBufferView): void;
          appendStream(stream: MSStream, maxSize?: number): void;
          remove(start: number, end: number): void;
      }
      
      declare var SourceBuffer: {
          prototype: SourceBuffer;
          new(): SourceBuffer;
      }
      
      interface SourceBufferList extends EventTarget {
          length: number;
          item(index: number): SourceBuffer;
          [index: number]: SourceBuffer;
      }
      
      declare var SourceBufferList: {
          prototype: SourceBufferList;
          new(): SourceBufferList;
      }
      
      interface StereoPannerNode extends AudioNode {
          pan: AudioParam;
      }
      
      declare var StereoPannerNode: {
          prototype: StereoPannerNode;
          new(): StereoPannerNode;
      }
      
      interface Storage {
          length: number;
          clear(): void;
          getItem(key: string): any;
          key(index: number): string;
          removeItem(key: string): void;
          setItem(key: string, data: string): void;
          [key: string]: any;
          [index: number]: string;
      }
      
      declare var Storage: {
          prototype: Storage;
          new(): Storage;
      }
      
      interface StorageEvent extends Event {
          key: string;
          newValue: any;
          oldValue: any;
          storageArea: Storage;
          url: string;
          initStorageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, keyArg: string, oldValueArg: any, newValueArg: any, urlArg: string, storageAreaArg: Storage): void;
      }
      
      declare var StorageEvent: {
          prototype: StorageEvent;
          new(): StorageEvent;
      }
      
      interface StyleMedia {
          type: string;
          matchMedium(mediaquery: string): boolean;
      }
      
      declare var StyleMedia: {
          prototype: StyleMedia;
          new(): StyleMedia;
      }
      
      interface StyleSheet {
          disabled: boolean;
          href: string;
          media: MediaList;
          ownerNode: Node;
          parentStyleSheet: StyleSheet;
          title: string;
          type: string;
      }
      
      declare var StyleSheet: {
          prototype: StyleSheet;
          new(): StyleSheet;
      }
      
      interface StyleSheetList {
          length: number;
          item(index?: number): StyleSheet;
          [index: number]: StyleSheet;
      }
      
      declare var StyleSheetList: {
          prototype: StyleSheetList;
          new(): StyleSheetList;
      }
      
      interface StyleSheetPageList {
          length: number;
          item(index: number): CSSPageRule;
          [index: number]: CSSPageRule;
      }
      
      declare var StyleSheetPageList: {
          prototype: StyleSheetPageList;
          new(): StyleSheetPageList;
      }
      
      interface SubtleCrypto {
          decrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          decrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          deriveBits(algorithm: string, baseKey: CryptoKey, length: number): any;
          deriveBits(algorithm: Algorithm, baseKey: CryptoKey, length: number): any;
          deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
          digest(algorithm: string, data: ArrayBufferView): any;
          digest(algorithm: Algorithm, data: ArrayBufferView): any;
          encrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          encrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          exportKey(format: string, key: CryptoKey): any;
          generateKey(algorithm: string, extractable: boolean, keyUsages: string[]): any;
          generateKey(algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          importKey(format: string, keyData: ArrayBufferView, algorithm: string, extractable: boolean, keyUsages: string[]): any;
          importKey(format: string, keyData: ArrayBufferView, algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          sign(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          sign(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          verify(algorithm: string, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
          verify(algorithm: Algorithm, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
          wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: string): any;
          wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: Algorithm): any;
      }
      
      declare var SubtleCrypto: {
          prototype: SubtleCrypto;
          new(): SubtleCrypto;
      }
      
      interface Text extends CharacterData {
          wholeText: string;
          replaceWholeText(content: string): Text;
          splitText(offset: number): Text;
      }
      
      declare var Text: {
          prototype: Text;
          new(): Text;
      }
      
      interface TextEvent extends UIEvent {
          data: string;
          inputMethod: number;
          locale: string;
          initTextEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, inputMethod: number, locale: string): void;
          DOM_INPUT_METHOD_DROP: number;
          DOM_INPUT_METHOD_HANDWRITING: number;
          DOM_INPUT_METHOD_IME: number;
          DOM_INPUT_METHOD_KEYBOARD: number;
          DOM_INPUT_METHOD_MULTIMODAL: number;
          DOM_INPUT_METHOD_OPTION: number;
          DOM_INPUT_METHOD_PASTE: number;
          DOM_INPUT_METHOD_SCRIPT: number;
          DOM_INPUT_METHOD_UNKNOWN: number;
          DOM_INPUT_METHOD_VOICE: number;
      }
      
      declare var TextEvent: {
          prototype: TextEvent;
          new(): TextEvent;
          DOM_INPUT_METHOD_DROP: number;
          DOM_INPUT_METHOD_HANDWRITING: number;
          DOM_INPUT_METHOD_IME: number;
          DOM_INPUT_METHOD_KEYBOARD: number;
          DOM_INPUT_METHOD_MULTIMODAL: number;
          DOM_INPUT_METHOD_OPTION: number;
          DOM_INPUT_METHOD_PASTE: number;
          DOM_INPUT_METHOD_SCRIPT: number;
          DOM_INPUT_METHOD_UNKNOWN: number;
          DOM_INPUT_METHOD_VOICE: number;
      }
      
      interface TextMetrics {
          width: number;
      }
      
      declare var TextMetrics: {
          prototype: TextMetrics;
          new(): TextMetrics;
      }
      
      interface TextRange {
          boundingHeight: number;
          boundingLeft: number;
          boundingTop: number;
          boundingWidth: number;
          htmlText: string;
          offsetLeft: number;
          offsetTop: number;
          text: string;
          collapse(start?: boolean): void;
          compareEndPoints(how: string, sourceRange: TextRange): number;
          duplicate(): TextRange;
          execCommand(cmdID: string, showUI?: boolean, value?: any): boolean;
          execCommandShowHelp(cmdID: string): boolean;
          expand(Unit: string): boolean;
          findText(string: string, count?: number, flags?: number): boolean;
          getBookmark(): string;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          inRange(range: TextRange): boolean;
          isEqual(range: TextRange): boolean;
          move(unit: string, count?: number): number;
          moveEnd(unit: string, count?: number): number;
          moveStart(unit: string, count?: number): number;
          moveToBookmark(bookmark: string): boolean;
          moveToElementText(element: Element): void;
          moveToPoint(x: number, y: number): void;
          parentElement(): Element;
          pasteHTML(html: string): void;
          queryCommandEnabled(cmdID: string): boolean;
          queryCommandIndeterm(cmdID: string): boolean;
          queryCommandState(cmdID: string): boolean;
          queryCommandSupported(cmdID: string): boolean;
          queryCommandText(cmdID: string): string;
          queryCommandValue(cmdID: string): any;
          scrollIntoView(fStart?: boolean): void;
          select(): void;
          setEndPoint(how: string, SourceRange: TextRange): void;
      }
      
      declare var TextRange: {
          prototype: TextRange;
          new(): TextRange;
      }
      
      interface TextRangeCollection {
          length: number;
          item(index: number): TextRange;
          [index: number]: TextRange;
      }
      
      declare var TextRangeCollection: {
          prototype: TextRangeCollection;
          new(): TextRangeCollection;
      }
      
      interface TextTrack extends EventTarget {
          activeCues: TextTrackCueList;
          cues: TextTrackCueList;
          inBandMetadataTrackDispatchType: string;
          kind: string;
          label: string;
          language: string;
          mode: any;
          oncuechange: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          readyState: number;
          addCue(cue: TextTrackCue): void;
          removeCue(cue: TextTrackCue): void;
          DISABLED: number;
          ERROR: number;
          HIDDEN: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
          SHOWING: number;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var TextTrack: {
          prototype: TextTrack;
          new(): TextTrack;
          DISABLED: number;
          ERROR: number;
          HIDDEN: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
          SHOWING: number;
      }
      
      interface TextTrackCue extends EventTarget {
          endTime: number;
          id: string;
          onenter: (ev: Event) => any;
          onexit: (ev: Event) => any;
          pauseOnExit: boolean;
          startTime: number;
          text: string;
          track: TextTrack;
          getCueAsHTML(): DocumentFragment;
          addEventListener(type: "enter", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "exit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var TextTrackCue: {
          prototype: TextTrackCue;
          new(startTime: number, endTime: number, text: string): TextTrackCue;
      }
      
      interface TextTrackCueList {
          length: number;
          getCueById(id: string): TextTrackCue;
          item(index: number): TextTrackCue;
          [index: number]: TextTrackCue;
      }
      
      declare var TextTrackCueList: {
          prototype: TextTrackCueList;
          new(): TextTrackCueList;
      }
      
      interface TextTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          item(index: number): TextTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: TextTrack;
      }
      
      declare var TextTrackList: {
          prototype: TextTrackList;
          new(): TextTrackList;
      }
      
      interface TimeRanges {
          length: number;
          end(index: number): number;
          start(index: number): number;
      }
      
      declare var TimeRanges: {
          prototype: TimeRanges;
          new(): TimeRanges;
      }
      
      interface Touch {
          clientX: number;
          clientY: number;
          identifier: number;
          pageX: number;
          pageY: number;
          screenX: number;
          screenY: number;
          target: EventTarget;
      }
      
      declare var Touch: {
          prototype: Touch;
          new(): Touch;
      }
      
      interface TouchEvent extends UIEvent {
          altKey: boolean;
          changedTouches: TouchList;
          ctrlKey: boolean;
          metaKey: boolean;
          shiftKey: boolean;
          targetTouches: TouchList;
          touches: TouchList;
      }
      
      declare var TouchEvent: {
          prototype: TouchEvent;
          new(): TouchEvent;
      }
      
      interface TouchList {
          length: number;
          item(index: number): Touch;
          [index: number]: Touch;
      }
      
      declare var TouchList: {
          prototype: TouchList;
          new(): TouchList;
      }
      
      interface TrackEvent extends Event {
          track: any;
      }
      
      declare var TrackEvent: {
          prototype: TrackEvent;
          new(): TrackEvent;
      }
      
      interface TransitionEvent extends Event {
          elapsedTime: number;
          propertyName: string;
          initTransitionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, propertyNameArg: string, elapsedTimeArg: number): void;
      }
      
      declare var TransitionEvent: {
          prototype: TransitionEvent;
          new(): TransitionEvent;
      }
      
      interface TreeWalker {
          currentNode: Node;
          expandEntityReferences: boolean;
          filter: NodeFilter;
          root: Node;
          whatToShow: number;
          firstChild(): Node;
          lastChild(): Node;
          nextNode(): Node;
          nextSibling(): Node;
          parentNode(): Node;
          previousNode(): Node;
          previousSibling(): Node;
      }
      
      declare var TreeWalker: {
          prototype: TreeWalker;
          new(): TreeWalker;
      }
      
      interface UIEvent extends Event {
          detail: number;
          view: Window;
          initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void;
      }
      
      declare var UIEvent: {
          prototype: UIEvent;
          new(type: string, eventInitDict?: UIEventInit): UIEvent;
      }
      
      interface URL {
          createObjectURL(object: any, options?: ObjectURLOptions): string;
          revokeObjectURL(url: string): void;
      }
      declare var URL: URL;
      
      interface UnviewableContentIdentifiedEvent extends NavigationEventWithReferrer {
          mediaType: string;
      }
      
      declare var UnviewableContentIdentifiedEvent: {
          prototype: UnviewableContentIdentifiedEvent;
          new(): UnviewableContentIdentifiedEvent;
      }
      
      interface ValidityState {
          badInput: boolean;
          customError: boolean;
          patternMismatch: boolean;
          rangeOverflow: boolean;
          rangeUnderflow: boolean;
          stepMismatch: boolean;
          tooLong: boolean;
          typeMismatch: boolean;
          valid: boolean;
          valueMissing: boolean;
      }
      
      declare var ValidityState: {
          prototype: ValidityState;
          new(): ValidityState;
      }
      
      interface VideoPlaybackQuality {
          corruptedVideoFrames: number;
          creationTime: number;
          droppedVideoFrames: number;
          totalFrameDelay: number;
          totalVideoFrames: number;
      }
      
      declare var VideoPlaybackQuality: {
          prototype: VideoPlaybackQuality;
          new(): VideoPlaybackQuality;
      }
      
      interface VideoTrack {
          id: string;
          kind: string;
          label: string;
          language: string;
          selected: boolean;
          sourceBuffer: SourceBuffer;
      }
      
      declare var VideoTrack: {
          prototype: VideoTrack;
          new(): VideoTrack;
      }
      
      interface VideoTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          onchange: (ev: Event) => any;
          onremovetrack: (ev: TrackEvent) => any;
          selectedIndex: number;
          getTrackById(id: string): VideoTrack;
          item(index: number): VideoTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: VideoTrack;
      }
      
      declare var VideoTrackList: {
          prototype: VideoTrackList;
          new(): VideoTrackList;
      }
      
      interface WEBGL_compressed_texture_s3tc {
          COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
          COMPRESSED_RGB_S3TC_DXT1_EXT: number;
      }
      
      declare var WEBGL_compressed_texture_s3tc: {
          prototype: WEBGL_compressed_texture_s3tc;
          new(): WEBGL_compressed_texture_s3tc;
          COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
          COMPRESSED_RGB_S3TC_DXT1_EXT: number;
      }
      
      interface WEBGL_debug_renderer_info {
          UNMASKED_RENDERER_WEBGL: number;
          UNMASKED_VENDOR_WEBGL: number;
      }
      
      declare var WEBGL_debug_renderer_info: {
          prototype: WEBGL_debug_renderer_info;
          new(): WEBGL_debug_renderer_info;
          UNMASKED_RENDERER_WEBGL: number;
          UNMASKED_VENDOR_WEBGL: number;
      }
      
      interface WEBGL_depth_texture {
          UNSIGNED_INT_24_8_WEBGL: number;
      }
      
      declare var WEBGL_depth_texture: {
          prototype: WEBGL_depth_texture;
          new(): WEBGL_depth_texture;
          UNSIGNED_INT_24_8_WEBGL: number;
      }
      
      interface WaveShaperNode extends AudioNode {
          curve: any;
          oversample: string;
      }
      
      declare var WaveShaperNode: {
          prototype: WaveShaperNode;
          new(): WaveShaperNode;
      }
      
      interface WebGLActiveInfo {
          name: string;
          size: number;
          type: number;
      }
      
      declare var WebGLActiveInfo: {
          prototype: WebGLActiveInfo;
          new(): WebGLActiveInfo;
      }
      
      interface WebGLBuffer extends WebGLObject {
      }
      
      declare var WebGLBuffer: {
          prototype: WebGLBuffer;
          new(): WebGLBuffer;
      }
      
      interface WebGLContextEvent extends Event {
          statusMessage: string;
      }
      
      declare var WebGLContextEvent: {
          prototype: WebGLContextEvent;
          new(): WebGLContextEvent;
      }
      
      interface WebGLFramebuffer extends WebGLObject {
      }
      
      declare var WebGLFramebuffer: {
          prototype: WebGLFramebuffer;
          new(): WebGLFramebuffer;
      }
      
      interface WebGLObject {
      }
      
      declare var WebGLObject: {
          prototype: WebGLObject;
          new(): WebGLObject;
      }
      
      interface WebGLProgram extends WebGLObject {
      }
      
      declare var WebGLProgram: {
          prototype: WebGLProgram;
          new(): WebGLProgram;
      }
      
      interface WebGLRenderbuffer extends WebGLObject {
      }
      
      declare var WebGLRenderbuffer: {
          prototype: WebGLRenderbuffer;
          new(): WebGLRenderbuffer;
      }
      
      interface WebGLRenderingContext {
          canvas: HTMLCanvasElement;
          drawingBufferHeight: number;
          drawingBufferWidth: number;
          activeTexture(texture: number): void;
          attachShader(program: WebGLProgram, shader: WebGLShader): void;
          bindAttribLocation(program: WebGLProgram, index: number, name: string): void;
          bindBuffer(target: number, buffer: WebGLBuffer): void;
          bindFramebuffer(target: number, framebuffer: WebGLFramebuffer): void;
          bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer): void;
          bindTexture(target: number, texture: WebGLTexture): void;
          blendColor(red: number, green: number, blue: number, alpha: number): void;
          blendEquation(mode: number): void;
          blendEquationSeparate(modeRGB: number, modeAlpha: number): void;
          blendFunc(sfactor: number, dfactor: number): void;
          blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;
          bufferData(target: number, size: number, usage: number): void;
          bufferData(target: number, size: ArrayBufferView, usage: number): void;
          bufferData(target: number, size: any, usage: number): void;
          bufferSubData(target: number, offset: number, data: ArrayBufferView): void;
          bufferSubData(target: number, offset: number, data: any): void;
          checkFramebufferStatus(target: number): number;
          clear(mask: number): void;
          clearColor(red: number, green: number, blue: number, alpha: number): void;
          clearDepth(depth: number): void;
          clearStencil(s: number): void;
          colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;
          compileShader(shader: WebGLShader): void;
          compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;
          compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;
          copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;
          copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;
          createBuffer(): WebGLBuffer;
          createFramebuffer(): WebGLFramebuffer;
          createProgram(): WebGLProgram;
          createRenderbuffer(): WebGLRenderbuffer;
          createShader(type: number): WebGLShader;
          createTexture(): WebGLTexture;
          cullFace(mode: number): void;
          deleteBuffer(buffer: WebGLBuffer): void;
          deleteFramebuffer(framebuffer: WebGLFramebuffer): void;
          deleteProgram(program: WebGLProgram): void;
          deleteRenderbuffer(renderbuffer: WebGLRenderbuffer): void;
          deleteShader(shader: WebGLShader): void;
          deleteTexture(texture: WebGLTexture): void;
          depthFunc(func: number): void;
          depthMask(flag: boolean): void;
          depthRange(zNear: number, zFar: number): void;
          detachShader(program: WebGLProgram, shader: WebGLShader): void;
          disable(cap: number): void;
          disableVertexAttribArray(index: number): void;
          drawArrays(mode: number, first: number, count: number): void;
          drawElements(mode: number, count: number, type: number, offset: number): void;
          enable(cap: number): void;
          enableVertexAttribArray(index: number): void;
          finish(): void;
          flush(): void;
          framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer): void;
          framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture, level: number): void;
          frontFace(mode: number): void;
          generateMipmap(target: number): void;
          getActiveAttrib(program: WebGLProgram, index: number): WebGLActiveInfo;
          getActiveUniform(program: WebGLProgram, index: number): WebGLActiveInfo;
          getAttachedShaders(program: WebGLProgram): WebGLShader[];
          getAttribLocation(program: WebGLProgram, name: string): number;
          getBufferParameter(target: number, pname: number): any;
          getContextAttributes(): WebGLContextAttributes;
          getError(): number;
          getExtension(name: string): any;
          getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;
          getParameter(pname: number): any;
          getProgramInfoLog(program: WebGLProgram): string;
          getProgramParameter(program: WebGLProgram, pname: number): any;
          getRenderbufferParameter(target: number, pname: number): any;
          getShaderInfoLog(shader: WebGLShader): string;
          getShaderParameter(shader: WebGLShader, pname: number): any;
          getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat;
          getShaderSource(shader: WebGLShader): string;
          getSupportedExtensions(): string[];
          getTexParameter(target: number, pname: number): any;
          getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
          getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation;
          getVertexAttrib(index: number, pname: number): any;
          getVertexAttribOffset(index: number, pname: number): number;
          hint(target: number, mode: number): void;
          isBuffer(buffer: WebGLBuffer): boolean;
          isContextLost(): boolean;
          isEnabled(cap: number): boolean;
          isFramebuffer(framebuffer: WebGLFramebuffer): boolean;
          isProgram(program: WebGLProgram): boolean;
          isRenderbuffer(renderbuffer: WebGLRenderbuffer): boolean;
          isShader(shader: WebGLShader): boolean;
          isTexture(texture: WebGLTexture): boolean;
          lineWidth(width: number): void;
          linkProgram(program: WebGLProgram): void;
          pixelStorei(pname: number, param: number): void;
          polygonOffset(factor: number, units: number): void;
          readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView): void;
          renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;
          sampleCoverage(value: number, invert: boolean): void;
          scissor(x: number, y: number, width: number, height: number): void;
          shaderSource(shader: WebGLShader, source: string): void;
          stencilFunc(func: number, ref: number, mask: number): void;
          stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;
          stencilMask(mask: number): void;
          stencilMaskSeparate(face: number, mask: number): void;
          stencilOp(fail: number, zfail: number, zpass: number): void;
          stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;
          texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageData): void;
          texParameterf(target: number, pname: number, param: number): void;
          texParameteri(target: number, pname: number, param: number): void;
          texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
          uniform1f(location: WebGLUniformLocation, x: number): void;
          uniform1fv(location: WebGLUniformLocation, v: any): void;
          uniform1i(location: WebGLUniformLocation, x: number): void;
          uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
          uniform2fv(location: WebGLUniformLocation, v: any): void;
          uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
          uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
          uniform3fv(location: WebGLUniformLocation, v: any): void;
          uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
          uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
          uniform4fv(location: WebGLUniformLocation, v: any): void;
          uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
          uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          useProgram(program: WebGLProgram): void;
          validateProgram(program: WebGLProgram): void;
          vertexAttrib1f(indx: number, x: number): void;
          vertexAttrib1fv(indx: number, values: any): void;
          vertexAttrib2f(indx: number, x: number, y: number): void;
          vertexAttrib2fv(indx: number, values: any): void;
          vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
          vertexAttrib3fv(indx: number, values: any): void;
          vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
          vertexAttrib4fv(indx: number, values: any): void;
          vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
          viewport(x: number, y: number, width: number, height: number): void;
          ACTIVE_ATTRIBUTES: number;
          ACTIVE_TEXTURE: number;
          ACTIVE_UNIFORMS: number;
          ALIASED_LINE_WIDTH_RANGE: number;
          ALIASED_POINT_SIZE_RANGE: number;
          ALPHA: number;
          ALPHA_BITS: number;
          ALWAYS: number;
          ARRAY_BUFFER: number;
          ARRAY_BUFFER_BINDING: number;
          ATTACHED_SHADERS: number;
          BACK: number;
          BLEND: number;
          BLEND_COLOR: number;
          BLEND_DST_ALPHA: number;
          BLEND_DST_RGB: number;
          BLEND_EQUATION: number;
          BLEND_EQUATION_ALPHA: number;
          BLEND_EQUATION_RGB: number;
          BLEND_SRC_ALPHA: number;
          BLEND_SRC_RGB: number;
          BLUE_BITS: number;
          BOOL: number;
          BOOL_VEC2: number;
          BOOL_VEC3: number;
          BOOL_VEC4: number;
          BROWSER_DEFAULT_WEBGL: number;
          BUFFER_SIZE: number;
          BUFFER_USAGE: number;
          BYTE: number;
          CCW: number;
          CLAMP_TO_EDGE: number;
          COLOR_ATTACHMENT0: number;
          COLOR_BUFFER_BIT: number;
          COLOR_CLEAR_VALUE: number;
          COLOR_WRITEMASK: number;
          COMPILE_STATUS: number;
          COMPRESSED_TEXTURE_FORMATS: number;
          CONSTANT_ALPHA: number;
          CONSTANT_COLOR: number;
          CONTEXT_LOST_WEBGL: number;
          CULL_FACE: number;
          CULL_FACE_MODE: number;
          CURRENT_PROGRAM: number;
          CURRENT_VERTEX_ATTRIB: number;
          CW: number;
          DECR: number;
          DECR_WRAP: number;
          DELETE_STATUS: number;
          DEPTH_ATTACHMENT: number;
          DEPTH_BITS: number;
          DEPTH_BUFFER_BIT: number;
          DEPTH_CLEAR_VALUE: number;
          DEPTH_COMPONENT: number;
          DEPTH_COMPONENT16: number;
          DEPTH_FUNC: number;
          DEPTH_RANGE: number;
          DEPTH_STENCIL: number;
          DEPTH_STENCIL_ATTACHMENT: number;
          DEPTH_TEST: number;
          DEPTH_WRITEMASK: number;
          DITHER: number;
          DONT_CARE: number;
          DST_ALPHA: number;
          DST_COLOR: number;
          DYNAMIC_DRAW: number;
          ELEMENT_ARRAY_BUFFER: number;
          ELEMENT_ARRAY_BUFFER_BINDING: number;
          EQUAL: number;
          FASTEST: number;
          FLOAT: number;
          FLOAT_MAT2: number;
          FLOAT_MAT3: number;
          FLOAT_MAT4: number;
          FLOAT_VEC2: number;
          FLOAT_VEC3: number;
          FLOAT_VEC4: number;
          FRAGMENT_SHADER: number;
          FRAMEBUFFER: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
          FRAMEBUFFER_BINDING: number;
          FRAMEBUFFER_COMPLETE: number;
          FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
          FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
          FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
          FRAMEBUFFER_UNSUPPORTED: number;
          FRONT: number;
          FRONT_AND_BACK: number;
          FRONT_FACE: number;
          FUNC_ADD: number;
          FUNC_REVERSE_SUBTRACT: number;
          FUNC_SUBTRACT: number;
          GENERATE_MIPMAP_HINT: number;
          GEQUAL: number;
          GREATER: number;
          GREEN_BITS: number;
          HIGH_FLOAT: number;
          HIGH_INT: number;
          IMPLEMENTATION_COLOR_READ_FORMAT: number;
          IMPLEMENTATION_COLOR_READ_TYPE: number;
          INCR: number;
          INCR_WRAP: number;
          INT: number;
          INT_VEC2: number;
          INT_VEC3: number;
          INT_VEC4: number;
          INVALID_ENUM: number;
          INVALID_FRAMEBUFFER_OPERATION: number;
          INVALID_OPERATION: number;
          INVALID_VALUE: number;
          INVERT: number;
          KEEP: number;
          LEQUAL: number;
          LESS: number;
          LINEAR: number;
          LINEAR_MIPMAP_LINEAR: number;
          LINEAR_MIPMAP_NEAREST: number;
          LINES: number;
          LINE_LOOP: number;
          LINE_STRIP: number;
          LINE_WIDTH: number;
          LINK_STATUS: number;
          LOW_FLOAT: number;
          LOW_INT: number;
          LUMINANCE: number;
          LUMINANCE_ALPHA: number;
          MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
          MAX_CUBE_MAP_TEXTURE_SIZE: number;
          MAX_FRAGMENT_UNIFORM_VECTORS: number;
          MAX_RENDERBUFFER_SIZE: number;
          MAX_TEXTURE_IMAGE_UNITS: number;
          MAX_TEXTURE_SIZE: number;
          MAX_VARYING_VECTORS: number;
          MAX_VERTEX_ATTRIBS: number;
          MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
          MAX_VERTEX_UNIFORM_VECTORS: number;
          MAX_VIEWPORT_DIMS: number;
          MEDIUM_FLOAT: number;
          MEDIUM_INT: number;
          MIRRORED_REPEAT: number;
          NEAREST: number;
          NEAREST_MIPMAP_LINEAR: number;
          NEAREST_MIPMAP_NEAREST: number;
          NEVER: number;
          NICEST: number;
          NONE: number;
          NOTEQUAL: number;
          NO_ERROR: number;
          ONE: number;
          ONE_MINUS_CONSTANT_ALPHA: number;
          ONE_MINUS_CONSTANT_COLOR: number;
          ONE_MINUS_DST_ALPHA: number;
          ONE_MINUS_DST_COLOR: number;
          ONE_MINUS_SRC_ALPHA: number;
          ONE_MINUS_SRC_COLOR: number;
          OUT_OF_MEMORY: number;
          PACK_ALIGNMENT: number;
          POINTS: number;
          POLYGON_OFFSET_FACTOR: number;
          POLYGON_OFFSET_FILL: number;
          POLYGON_OFFSET_UNITS: number;
          RED_BITS: number;
          RENDERBUFFER: number;
          RENDERBUFFER_ALPHA_SIZE: number;
          RENDERBUFFER_BINDING: number;
          RENDERBUFFER_BLUE_SIZE: number;
          RENDERBUFFER_DEPTH_SIZE: number;
          RENDERBUFFER_GREEN_SIZE: number;
          RENDERBUFFER_HEIGHT: number;
          RENDERBUFFER_INTERNAL_FORMAT: number;
          RENDERBUFFER_RED_SIZE: number;
          RENDERBUFFER_STENCIL_SIZE: number;
          RENDERBUFFER_WIDTH: number;
          RENDERER: number;
          REPEAT: number;
          REPLACE: number;
          RGB: number;
          RGB565: number;
          RGB5_A1: number;
          RGBA: number;
          RGBA4: number;
          SAMPLER_2D: number;
          SAMPLER_CUBE: number;
          SAMPLES: number;
          SAMPLE_ALPHA_TO_COVERAGE: number;
          SAMPLE_BUFFERS: number;
          SAMPLE_COVERAGE: number;
          SAMPLE_COVERAGE_INVERT: number;
          SAMPLE_COVERAGE_VALUE: number;
          SCISSOR_BOX: number;
          SCISSOR_TEST: number;
          SHADER_TYPE: number;
          SHADING_LANGUAGE_VERSION: number;
          SHORT: number;
          SRC_ALPHA: number;
          SRC_ALPHA_SATURATE: number;
          SRC_COLOR: number;
          STATIC_DRAW: number;
          STENCIL_ATTACHMENT: number;
          STENCIL_BACK_FAIL: number;
          STENCIL_BACK_FUNC: number;
          STENCIL_BACK_PASS_DEPTH_FAIL: number;
          STENCIL_BACK_PASS_DEPTH_PASS: number;
          STENCIL_BACK_REF: number;
          STENCIL_BACK_VALUE_MASK: number;
          STENCIL_BACK_WRITEMASK: number;
          STENCIL_BITS: number;
          STENCIL_BUFFER_BIT: number;
          STENCIL_CLEAR_VALUE: number;
          STENCIL_FAIL: number;
          STENCIL_FUNC: number;
          STENCIL_INDEX: number;
          STENCIL_INDEX8: number;
          STENCIL_PASS_DEPTH_FAIL: number;
          STENCIL_PASS_DEPTH_PASS: number;
          STENCIL_REF: number;
          STENCIL_TEST: number;
          STENCIL_VALUE_MASK: number;
          STENCIL_WRITEMASK: number;
          STREAM_DRAW: number;
          SUBPIXEL_BITS: number;
          TEXTURE: number;
          TEXTURE0: number;
          TEXTURE1: number;
          TEXTURE10: number;
          TEXTURE11: number;
          TEXTURE12: number;
          TEXTURE13: number;
          TEXTURE14: number;
          TEXTURE15: number;
          TEXTURE16: number;
          TEXTURE17: number;
          TEXTURE18: number;
          TEXTURE19: number;
          TEXTURE2: number;
          TEXTURE20: number;
          TEXTURE21: number;
          TEXTURE22: number;
          TEXTURE23: number;
          TEXTURE24: number;
          TEXTURE25: number;
          TEXTURE26: number;
          TEXTURE27: number;
          TEXTURE28: number;
          TEXTURE29: number;
          TEXTURE3: number;
          TEXTURE30: number;
          TEXTURE31: number;
          TEXTURE4: number;
          TEXTURE5: number;
          TEXTURE6: number;
          TEXTURE7: number;
          TEXTURE8: number;
          TEXTURE9: number;
          TEXTURE_2D: number;
          TEXTURE_BINDING_2D: number;
          TEXTURE_BINDING_CUBE_MAP: number;
          TEXTURE_CUBE_MAP: number;
          TEXTURE_CUBE_MAP_NEGATIVE_X: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
          TEXTURE_CUBE_MAP_POSITIVE_X: number;
          TEXTURE_CUBE_MAP_POSITIVE_Y: number;
          TEXTURE_CUBE_MAP_POSITIVE_Z: number;
          TEXTURE_MAG_FILTER: number;
          TEXTURE_MIN_FILTER: number;
          TEXTURE_WRAP_S: number;
          TEXTURE_WRAP_T: number;
          TRIANGLES: number;
          TRIANGLE_FAN: number;
          TRIANGLE_STRIP: number;
          UNPACK_ALIGNMENT: number;
          UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
          UNPACK_FLIP_Y_WEBGL: number;
          UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
          UNSIGNED_BYTE: number;
          UNSIGNED_INT: number;
          UNSIGNED_SHORT: number;
          UNSIGNED_SHORT_4_4_4_4: number;
          UNSIGNED_SHORT_5_5_5_1: number;
          UNSIGNED_SHORT_5_6_5: number;
          VALIDATE_STATUS: number;
          VENDOR: number;
          VERSION: number;
          VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
          VERTEX_ATTRIB_ARRAY_ENABLED: number;
          VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
          VERTEX_ATTRIB_ARRAY_POINTER: number;
          VERTEX_ATTRIB_ARRAY_SIZE: number;
          VERTEX_ATTRIB_ARRAY_STRIDE: number;
          VERTEX_ATTRIB_ARRAY_TYPE: number;
          VERTEX_SHADER: number;
          VIEWPORT: number;
          ZERO: number;
      }
      
      declare var WebGLRenderingContext: {
          prototype: WebGLRenderingContext;
          new(): WebGLRenderingContext;
          ACTIVE_ATTRIBUTES: number;
          ACTIVE_TEXTURE: number;
          ACTIVE_UNIFORMS: number;
          ALIASED_LINE_WIDTH_RANGE: number;
          ALIASED_POINT_SIZE_RANGE: number;
          ALPHA: number;
          ALPHA_BITS: number;
          ALWAYS: number;
          ARRAY_BUFFER: number;
          ARRAY_BUFFER_BINDING: number;
          ATTACHED_SHADERS: number;
          BACK: number;
          BLEND: number;
          BLEND_COLOR: number;
          BLEND_DST_ALPHA: number;
          BLEND_DST_RGB: number;
          BLEND_EQUATION: number;
          BLEND_EQUATION_ALPHA: number;
          BLEND_EQUATION_RGB: number;
          BLEND_SRC_ALPHA: number;
          BLEND_SRC_RGB: number;
          BLUE_BITS: number;
          BOOL: number;
          BOOL_VEC2: number;
          BOOL_VEC3: number;
          BOOL_VEC4: number;
          BROWSER_DEFAULT_WEBGL: number;
          BUFFER_SIZE: number;
          BUFFER_USAGE: number;
          BYTE: number;
          CCW: number;
          CLAMP_TO_EDGE: number;
          COLOR_ATTACHMENT0: number;
          COLOR_BUFFER_BIT: number;
          COLOR_CLEAR_VALUE: number;
          COLOR_WRITEMASK: number;
          COMPILE_STATUS: number;
          COMPRESSED_TEXTURE_FORMATS: number;
          CONSTANT_ALPHA: number;
          CONSTANT_COLOR: number;
          CONTEXT_LOST_WEBGL: number;
          CULL_FACE: number;
          CULL_FACE_MODE: number;
          CURRENT_PROGRAM: number;
          CURRENT_VERTEX_ATTRIB: number;
          CW: number;
          DECR: number;
          DECR_WRAP: number;
          DELETE_STATUS: number;
          DEPTH_ATTACHMENT: number;
          DEPTH_BITS: number;
          DEPTH_BUFFER_BIT: number;
          DEPTH_CLEAR_VALUE: number;
          DEPTH_COMPONENT: number;
          DEPTH_COMPONENT16: number;
          DEPTH_FUNC: number;
          DEPTH_RANGE: number;
          DEPTH_STENCIL: number;
          DEPTH_STENCIL_ATTACHMENT: number;
          DEPTH_TEST: number;
          DEPTH_WRITEMASK: number;
          DITHER: number;
          DONT_CARE: number;
          DST_ALPHA: number;
          DST_COLOR: number;
          DYNAMIC_DRAW: number;
          ELEMENT_ARRAY_BUFFER: number;
          ELEMENT_ARRAY_BUFFER_BINDING: number;
          EQUAL: number;
          FASTEST: number;
          FLOAT: number;
          FLOAT_MAT2: number;
          FLOAT_MAT3: number;
          FLOAT_MAT4: number;
          FLOAT_VEC2: number;
          FLOAT_VEC3: number;
          FLOAT_VEC4: number;
          FRAGMENT_SHADER: number;
          FRAMEBUFFER: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
          FRAMEBUFFER_BINDING: number;
          FRAMEBUFFER_COMPLETE: number;
          FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
          FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
          FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
          FRAMEBUFFER_UNSUPPORTED: number;
          FRONT: number;
          FRONT_AND_BACK: number;
          FRONT_FACE: number;
          FUNC_ADD: number;
          FUNC_REVERSE_SUBTRACT: number;
          FUNC_SUBTRACT: number;
          GENERATE_MIPMAP_HINT: number;
          GEQUAL: number;
          GREATER: number;
          GREEN_BITS: number;
          HIGH_FLOAT: number;
          HIGH_INT: number;
          IMPLEMENTATION_COLOR_READ_FORMAT: number;
          IMPLEMENTATION_COLOR_READ_TYPE: number;
          INCR: number;
          INCR_WRAP: number;
          INT: number;
          INT_VEC2: number;
          INT_VEC3: number;
          INT_VEC4: number;
          INVALID_ENUM: number;
          INVALID_FRAMEBUFFER_OPERATION: number;
          INVALID_OPERATION: number;
          INVALID_VALUE: number;
          INVERT: number;
          KEEP: number;
          LEQUAL: number;
          LESS: number;
          LINEAR: number;
          LINEAR_MIPMAP_LINEAR: number;
          LINEAR_MIPMAP_NEAREST: number;
          LINES: number;
          LINE_LOOP: number;
          LINE_STRIP: number;
          LINE_WIDTH: number;
          LINK_STATUS: number;
          LOW_FLOAT: number;
          LOW_INT: number;
          LUMINANCE: number;
          LUMINANCE_ALPHA: number;
          MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
          MAX_CUBE_MAP_TEXTURE_SIZE: number;
          MAX_FRAGMENT_UNIFORM_VECTORS: number;
          MAX_RENDERBUFFER_SIZE: number;
          MAX_TEXTURE_IMAGE_UNITS: number;
          MAX_TEXTURE_SIZE: number;
          MAX_VARYING_VECTORS: number;
          MAX_VERTEX_ATTRIBS: number;
          MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
          MAX_VERTEX_UNIFORM_VECTORS: number;
          MAX_VIEWPORT_DIMS: number;
          MEDIUM_FLOAT: number;
          MEDIUM_INT: number;
          MIRRORED_REPEAT: number;
          NEAREST: number;
          NEAREST_MIPMAP_LINEAR: number;
          NEAREST_MIPMAP_NEAREST: number;
          NEVER: number;
          NICEST: number;
          NONE: number;
          NOTEQUAL: number;
          NO_ERROR: number;
          ONE: number;
          ONE_MINUS_CONSTANT_ALPHA: number;
          ONE_MINUS_CONSTANT_COLOR: number;
          ONE_MINUS_DST_ALPHA: number;
          ONE_MINUS_DST_COLOR: number;
          ONE_MINUS_SRC_ALPHA: number;
          ONE_MINUS_SRC_COLOR: number;
          OUT_OF_MEMORY: number;
          PACK_ALIGNMENT: number;
          POINTS: number;
          POLYGON_OFFSET_FACTOR: number;
          POLYGON_OFFSET_FILL: number;
          POLYGON_OFFSET_UNITS: number;
          RED_BITS: number;
          RENDERBUFFER: number;
          RENDERBUFFER_ALPHA_SIZE: number;
          RENDERBUFFER_BINDING: number;
          RENDERBUFFER_BLUE_SIZE: number;
          RENDERBUFFER_DEPTH_SIZE: number;
          RENDERBUFFER_GREEN_SIZE: number;
          RENDERBUFFER_HEIGHT: number;
          RENDERBUFFER_INTERNAL_FORMAT: number;
          RENDERBUFFER_RED_SIZE: number;
          RENDERBUFFER_STENCIL_SIZE: number;
          RENDERBUFFER_WIDTH: number;
          RENDERER: number;
          REPEAT: number;
          REPLACE: number;
          RGB: number;
          RGB565: number;
          RGB5_A1: number;
          RGBA: number;
          RGBA4: number;
          SAMPLER_2D: number;
          SAMPLER_CUBE: number;
          SAMPLES: number;
          SAMPLE_ALPHA_TO_COVERAGE: number;
          SAMPLE_BUFFERS: number;
          SAMPLE_COVERAGE: number;
          SAMPLE_COVERAGE_INVERT: number;
          SAMPLE_COVERAGE_VALUE: number;
          SCISSOR_BOX: number;
          SCISSOR_TEST: number;
          SHADER_TYPE: number;
          SHADING_LANGUAGE_VERSION: number;
          SHORT: number;
          SRC_ALPHA: number;
          SRC_ALPHA_SATURATE: number;
          SRC_COLOR: number;
          STATIC_DRAW: number;
          STENCIL_ATTACHMENT: number;
          STENCIL_BACK_FAIL: number;
          STENCIL_BACK_FUNC: number;
          STENCIL_BACK_PASS_DEPTH_FAIL: number;
          STENCIL_BACK_PASS_DEPTH_PASS: number;
          STENCIL_BACK_REF: number;
          STENCIL_BACK_VALUE_MASK: number;
          STENCIL_BACK_WRITEMASK: number;
          STENCIL_BITS: number;
          STENCIL_BUFFER_BIT: number;
          STENCIL_CLEAR_VALUE: number;
          STENCIL_FAIL: number;
          STENCIL_FUNC: number;
          STENCIL_INDEX: number;
          STENCIL_INDEX8: number;
          STENCIL_PASS_DEPTH_FAIL: number;
          STENCIL_PASS_DEPTH_PASS: number;
          STENCIL_REF: number;
          STENCIL_TEST: number;
          STENCIL_VALUE_MASK: number;
          STENCIL_WRITEMASK: number;
          STREAM_DRAW: number;
          SUBPIXEL_BITS: number;
          TEXTURE: number;
          TEXTURE0: number;
          TEXTURE1: number;
          TEXTURE10: number;
          TEXTURE11: number;
          TEXTURE12: number;
          TEXTURE13: number;
          TEXTURE14: number;
          TEXTURE15: number;
          TEXTURE16: number;
          TEXTURE17: number;
          TEXTURE18: number;
          TEXTURE19: number;
          TEXTURE2: number;
          TEXTURE20: number;
          TEXTURE21: number;
          TEXTURE22: number;
          TEXTURE23: number;
          TEXTURE24: number;
          TEXTURE25: number;
          TEXTURE26: number;
          TEXTURE27: number;
          TEXTURE28: number;
          TEXTURE29: number;
          TEXTURE3: number;
          TEXTURE30: number;
          TEXTURE31: number;
          TEXTURE4: number;
          TEXTURE5: number;
          TEXTURE6: number;
          TEXTURE7: number;
          TEXTURE8: number;
          TEXTURE9: number;
          TEXTURE_2D: number;
          TEXTURE_BINDING_2D: number;
          TEXTURE_BINDING_CUBE_MAP: number;
          TEXTURE_CUBE_MAP: number;
          TEXTURE_CUBE_MAP_NEGATIVE_X: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
          TEXTURE_CUBE_MAP_POSITIVE_X: number;
          TEXTURE_CUBE_MAP_POSITIVE_Y: number;
          TEXTURE_CUBE_MAP_POSITIVE_Z: number;
          TEXTURE_MAG_FILTER: number;
          TEXTURE_MIN_FILTER: number;
          TEXTURE_WRAP_S: number;
          TEXTURE_WRAP_T: number;
          TRIANGLES: number;
          TRIANGLE_FAN: number;
          TRIANGLE_STRIP: number;
          UNPACK_ALIGNMENT: number;
          UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
          UNPACK_FLIP_Y_WEBGL: number;
          UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
          UNSIGNED_BYTE: number;
          UNSIGNED_INT: number;
          UNSIGNED_SHORT: number;
          UNSIGNED_SHORT_4_4_4_4: number;
          UNSIGNED_SHORT_5_5_5_1: number;
          UNSIGNED_SHORT_5_6_5: number;
          VALIDATE_STATUS: number;
          VENDOR: number;
          VERSION: number;
          VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
          VERTEX_ATTRIB_ARRAY_ENABLED: number;
          VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
          VERTEX_ATTRIB_ARRAY_POINTER: number;
          VERTEX_ATTRIB_ARRAY_SIZE: number;
          VERTEX_ATTRIB_ARRAY_STRIDE: number;
          VERTEX_ATTRIB_ARRAY_TYPE: number;
          VERTEX_SHADER: number;
          VIEWPORT: number;
          ZERO: number;
      }
      
      interface WebGLShader extends WebGLObject {
      }
      
      declare var WebGLShader: {
          prototype: WebGLShader;
          new(): WebGLShader;
      }
      
      interface WebGLShaderPrecisionFormat {
          precision: number;
          rangeMax: number;
          rangeMin: number;
      }
      
      declare var WebGLShaderPrecisionFormat: {
          prototype: WebGLShaderPrecisionFormat;
          new(): WebGLShaderPrecisionFormat;
      }
      
      interface WebGLTexture extends WebGLObject {
      }
      
      declare var WebGLTexture: {
          prototype: WebGLTexture;
          new(): WebGLTexture;
      }
      
      interface WebGLUniformLocation {
      }
      
      declare var WebGLUniformLocation: {
          prototype: WebGLUniformLocation;
          new(): WebGLUniformLocation;
      }
      
      interface WebKitCSSMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          m11: number;
          m12: number;
          m13: number;
          m14: number;
          m21: number;
          m22: number;
          m23: number;
          m24: number;
          m31: number;
          m32: number;
          m33: number;
          m34: number;
          m41: number;
          m42: number;
          m43: number;
          m44: number;
          inverse(): WebKitCSSMatrix;
          multiply(secondMatrix: WebKitCSSMatrix): WebKitCSSMatrix;
          rotate(angleX: number, angleY?: number, angleZ?: number): WebKitCSSMatrix;
          rotateAxisAngle(x: number, y: number, z: number, angle: number): WebKitCSSMatrix;
          scale(scaleX: number, scaleY?: number, scaleZ?: number): WebKitCSSMatrix;
          setMatrixValue(value: string): void;
          skewX(angle: number): WebKitCSSMatrix;
          skewY(angle: number): WebKitCSSMatrix;
          toString(): string;
          translate(x: number, y: number, z?: number): WebKitCSSMatrix;
      }
      
      declare var WebKitCSSMatrix: {
          prototype: WebKitCSSMatrix;
          new(text?: string): WebKitCSSMatrix;
      }
      
      interface WebKitPoint {
          x: number;
          y: number;
      }
      
      declare var WebKitPoint: {
          prototype: WebKitPoint;
          new(x?: number, y?: number): WebKitPoint;
      }
      
      interface WebSocket extends EventTarget {
          binaryType: string;
          bufferedAmount: number;
          extensions: string;
          onclose: (ev: CloseEvent) => any;
          onerror: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onopen: (ev: Event) => any;
          protocol: string;
          readyState: number;
          url: string;
          close(code?: number, reason?: string): void;
          send(data: any): void;
          CLOSED: number;
          CLOSING: number;
          CONNECTING: number;
          OPEN: number;
          addEventListener(type: "close", listener: (ev: CloseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "open", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var WebSocket: {
          prototype: WebSocket;
          new(url: string, protocols?: string): WebSocket;
          new(url: string, protocols?: any): WebSocket;
          CLOSED: number;
          CLOSING: number;
          CONNECTING: number;
          OPEN: number;
      }
      
      interface WheelEvent extends MouseEvent {
          deltaMode: number;
          deltaX: number;
          deltaY: number;
          deltaZ: number;
          getCurrentPoint(element: Element): void;
          initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void;
          DOM_DELTA_LINE: number;
          DOM_DELTA_PAGE: number;
          DOM_DELTA_PIXEL: number;
      }
      
      declare var WheelEvent: {
          prototype: WheelEvent;
          new(typeArg: string, eventInitDict?: WheelEventInit): WheelEvent;
          DOM_DELTA_LINE: number;
          DOM_DELTA_PAGE: number;
          DOM_DELTA_PIXEL: number;
      }
      
      interface Window extends EventTarget, WindowTimers, WindowSessionStorage, WindowLocalStorage, WindowConsole, GlobalEventHandlers, IDBEnvironment, WindowBase64 {
          animationStartTime: number;
          applicationCache: ApplicationCache;
          clientInformation: Navigator;
          closed: boolean;
          crypto: Crypto;
          defaultStatus: string;
          devicePixelRatio: number;
          doNotTrack: string;
          document: Document;
          event: Event;
          external: External;
          frameElement: Element;
          frames: Window;
          history: History;
          innerHeight: number;
          innerWidth: number;
          length: number;
          location: Location;
          locationbar: BarProp;
          menubar: BarProp;
          msAnimationStartTime: number;
          msTemplatePrinter: MSTemplatePrinter;
          name: string;
          navigator: Navigator;
          offscreenBuffering: string | boolean;
          onabort: (ev: Event) => any;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          onblur: (ev: FocusEvent) => any;
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          onchange: (ev: Event) => any;
          onclick: (ev: MouseEvent) => any;
          oncompassneedscalibration: (ev: Event) => any;
          oncontextmenu: (ev: PointerEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          ondevicemotion: (ev: DeviceMotionEvent) => any;
          ondeviceorientation: (ev: DeviceOrientationEvent) => any;
          ondrag: (ev: DragEvent) => any;
          ondragend: (ev: DragEvent) => any;
          ondragenter: (ev: DragEvent) => any;
          ondragleave: (ev: DragEvent) => any;
          ondragover: (ev: DragEvent) => any;
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          ondurationchange: (ev: Event) => any;
          onemptied: (ev: Event) => any;
          onended: (ev: Event) => any;
          onerror: ErrorEventHandler;
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          oninput: (ev: Event) => any;
          onkeydown: (ev: KeyboardEvent) => any;
          onkeypress: (ev: KeyboardEvent) => any;
          onkeyup: (ev: KeyboardEvent) => any;
          onload: (ev: Event) => any;
          onloadeddata: (ev: Event) => any;
          onloadedmetadata: (ev: Event) => any;
          onloadstart: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmouseenter: (ev: MouseEvent) => any;
          onmouseleave: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onpause: (ev: Event) => any;
          onplay: (ev: Event) => any;
          onplaying: (ev: Event) => any;
          onpopstate: (ev: PopStateEvent) => any;
          onprogress: (ev: ProgressEvent) => any;
          onratechange: (ev: Event) => any;
          onreadystatechange: (ev: ProgressEvent) => any;
          onreset: (ev: Event) => any;
          onresize: (ev: UIEvent) => any;
          onscroll: (ev: UIEvent) => any;
          onseeked: (ev: Event) => any;
          onseeking: (ev: Event) => any;
          onselect: (ev: UIEvent) => any;
          onstalled: (ev: Event) => any;
          onstorage: (ev: StorageEvent) => any;
          onsubmit: (ev: Event) => any;
          onsuspend: (ev: Event) => any;
          ontimeupdate: (ev: Event) => any;
          ontouchcancel: any;
          ontouchend: any;
          ontouchmove: any;
          ontouchstart: any;
          onunload: (ev: Event) => any;
          onvolumechange: (ev: Event) => any;
          onwaiting: (ev: Event) => any;
          opener: Window;
          orientation: string;
          outerHeight: number;
          outerWidth: number;
          pageXOffset: number;
          pageYOffset: number;
          parent: Window;
          performance: Performance;
          personalbar: BarProp;
          screen: Screen;
          screenLeft: number;
          screenTop: number;
          screenX: number;
          screenY: number;
          scrollX: number;
          scrollY: number;
          scrollbars: BarProp;
          self: Window;
          status: string;
          statusbar: BarProp;
          styleMedia: StyleMedia;
          toolbar: BarProp;
          top: Window;
          window: Window;
          alert(message?: any): void;
          blur(): void;
          cancelAnimationFrame(handle: number): void;
          captureEvents(): void;
          close(): void;
          confirm(message?: string): boolean;
          focus(): void;
          getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
          getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
          getSelection(): Selection;
          matchMedia(mediaQuery: string): MediaQueryList;
          moveBy(x?: number, y?: number): void;
          moveTo(x?: number, y?: number): void;
          msCancelRequestAnimationFrame(handle: number): void;
          msMatchMedia(mediaQuery: string): MediaQueryList;
          msRequestAnimationFrame(callback: FrameRequestCallback): number;
          msWriteProfilerMark(profilerMarkName: string): void;
          open(url?: string, target?: string, features?: string, replace?: boolean): any;
          postMessage(message: any, targetOrigin: string, ports?: any): void;
          print(): void;
          prompt(message?: string, _default?: string): string;
          releaseEvents(): void;
          requestAnimationFrame(callback: FrameRequestCallback): number;
          resizeBy(x?: number, y?: number): void;
          resizeTo(x?: number, y?: number): void;
          scroll(x?: number, y?: number): void;
          scrollBy(x?: number, y?: number): void;
          scrollTo(x?: number, y?: number): void;
          webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
          webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: Window;
      }
      
      declare var Window: {
          prototype: Window;
          new(): Window;
      }
      
      interface Worker extends EventTarget, AbstractWorker {
          onmessage: (ev: MessageEvent) => any;
          postMessage(message: any, ports?: any): void;
          terminate(): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Worker: {
          prototype: Worker;
          new(stringUrl: string): Worker;
      }
      
      interface XMLDocument extends Document {
      }
      
      declare var XMLDocument: {
          prototype: XMLDocument;
          new(): XMLDocument;
      }
      
      interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget {
          msCaching: string;
          onreadystatechange: (ev: ProgressEvent) => any;
          readyState: number;
          response: any;
          responseBody: any;
          responseText: string;
          responseType: string;
          responseXML: any;
          status: number;
          statusText: string;
          timeout: number;
          upload: XMLHttpRequestUpload;
          withCredentials: boolean;
          abort(): void;
          getAllResponseHeaders(): string;
          getResponseHeader(header: string): string;
          msCachingEnabled(): boolean;
          open(method: string, url: string, async?: boolean, user?: string, password?: string): void;
          overrideMimeType(mime: string): void;
          send(data?: Document): void;
          send(data?: string): void;
          send(data?: any): void;
          setRequestHeader(header: string, value: string): void;
          DONE: number;
          HEADERS_RECEIVED: number;
          LOADING: number;
          OPENED: number;
          UNSENT: number;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var XMLHttpRequest: {
          prototype: XMLHttpRequest;
          new(): XMLHttpRequest;
          DONE: number;
          HEADERS_RECEIVED: number;
          LOADING: number;
          OPENED: number;
          UNSENT: number;
          create(): XMLHttpRequest;
      }
      
      interface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var XMLHttpRequestUpload: {
          prototype: XMLHttpRequestUpload;
          new(): XMLHttpRequestUpload;
      }
      
      interface XMLSerializer {
          serializeToString(target: Node): string;
      }
      
      declare var XMLSerializer: {
          prototype: XMLSerializer;
          new(): XMLSerializer;
      }
      
      interface XPathEvaluator {
          createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
          createNSResolver(nodeResolver?: Node): XPathNSResolver;
          evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
      }
      
      declare var XPathEvaluator: {
          prototype: XPathEvaluator;
          new(): XPathEvaluator;
      }
      
      interface XPathExpression {
          evaluate(contextNode: Node, type: number, result: XPathResult): XPathExpression;
      }
      
      declare var XPathExpression: {
          prototype: XPathExpression;
          new(): XPathExpression;
      }
      
      interface XPathNSResolver {
          lookupNamespaceURI(prefix: string): string;
      }
      
      declare var XPathNSResolver: {
          prototype: XPathNSResolver;
          new(): XPathNSResolver;
      }
      
      interface XPathResult {
          booleanValue: boolean;
          invalidIteratorState: boolean;
          numberValue: number;
          resultType: number;
          singleNodeValue: Node;
          snapshotLength: number;
          stringValue: string;
          iterateNext(): Node;
          snapshotItem(index: number): Node;
          ANY_TYPE: number;
          ANY_UNORDERED_NODE_TYPE: number;
          BOOLEAN_TYPE: number;
          FIRST_ORDERED_NODE_TYPE: number;
          NUMBER_TYPE: number;
          ORDERED_NODE_ITERATOR_TYPE: number;
          ORDERED_NODE_SNAPSHOT_TYPE: number;
          STRING_TYPE: number;
          UNORDERED_NODE_ITERATOR_TYPE: number;
          UNORDERED_NODE_SNAPSHOT_TYPE: number;
      }
      
      declare var XPathResult: {
          prototype: XPathResult;
          new(): XPathResult;
          ANY_TYPE: number;
          ANY_UNORDERED_NODE_TYPE: number;
          BOOLEAN_TYPE: number;
          FIRST_ORDERED_NODE_TYPE: number;
          NUMBER_TYPE: number;
          ORDERED_NODE_ITERATOR_TYPE: number;
          ORDERED_NODE_SNAPSHOT_TYPE: number;
          STRING_TYPE: number;
          UNORDERED_NODE_ITERATOR_TYPE: number;
          UNORDERED_NODE_SNAPSHOT_TYPE: number;
      }
      
      interface XSLTProcessor {
          clearParameters(): void;
          getParameter(namespaceURI: string, localName: string): any;
          importStylesheet(style: Node): void;
          removeParameter(namespaceURI: string, localName: string): void;
          reset(): void;
          setParameter(namespaceURI: string, localName: string, value: any): void;
          transformToDocument(source: Node): Document;
          transformToFragment(source: Node, document: Document): DocumentFragment;
      }
      
      declare var XSLTProcessor: {
          prototype: XSLTProcessor;
          new(): XSLTProcessor;
      }
      
      interface AbstractWorker {
          onerror: (ev: Event) => any;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface ChildNode {
          remove(): void;
      }
      
      interface DOML2DeprecatedColorProperty {
          color: string;
      }
      
      interface DOML2DeprecatedSizeProperty {
          size: number;
      }
      
      interface DocumentEvent {
          createEvent(eventInterface:"AnimationEvent"): AnimationEvent;
          createEvent(eventInterface:"AriaRequestEvent"): AriaRequestEvent;
          createEvent(eventInterface:"AudioProcessingEvent"): AudioProcessingEvent;
          createEvent(eventInterface:"BeforeUnloadEvent"): BeforeUnloadEvent;
          createEvent(eventInterface:"CloseEvent"): CloseEvent;
          createEvent(eventInterface:"CommandEvent"): CommandEvent;
          createEvent(eventInterface:"CompositionEvent"): CompositionEvent;
          createEvent(eventInterface: "CustomEvent"): CustomEvent;
          createEvent(eventInterface:"DeviceMotionEvent"): DeviceMotionEvent;
          createEvent(eventInterface:"DeviceOrientationEvent"): DeviceOrientationEvent;
          createEvent(eventInterface:"DragEvent"): DragEvent;
          createEvent(eventInterface:"ErrorEvent"): ErrorEvent;
          createEvent(eventInterface:"Event"): Event;
          createEvent(eventInterface:"Events"): Event;
          createEvent(eventInterface:"FocusEvent"): FocusEvent;
          createEvent(eventInterface:"GamepadEvent"): GamepadEvent;
          createEvent(eventInterface:"HashChangeEvent"): HashChangeEvent;
          createEvent(eventInterface:"IDBVersionChangeEvent"): IDBVersionChangeEvent;
          createEvent(eventInterface:"KeyboardEvent"): KeyboardEvent;
          createEvent(eventInterface:"LongRunningScriptDetectedEvent"): LongRunningScriptDetectedEvent;
          createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
          createEvent(eventInterface:"MSManipulationEvent"): MSManipulationEvent;
          createEvent(eventInterface:"MSMediaKeyMessageEvent"): MSMediaKeyMessageEvent;
          createEvent(eventInterface:"MSMediaKeyNeededEvent"): MSMediaKeyNeededEvent;
          createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
          createEvent(eventInterface:"MSSiteModeEvent"): MSSiteModeEvent;
          createEvent(eventInterface:"MessageEvent"): MessageEvent;
          createEvent(eventInterface:"MouseEvent"): MouseEvent;
          createEvent(eventInterface:"MouseEvents"): MouseEvent;
          createEvent(eventInterface:"MouseWheelEvent"): MouseWheelEvent;
          createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
          createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
          createEvent(eventInterface:"MutationEvent"): MutationEvent;
          createEvent(eventInterface:"MutationEvents"): MutationEvent;
          createEvent(eventInterface:"NavigationCompletedEvent"): NavigationCompletedEvent;
          createEvent(eventInterface:"NavigationEvent"): NavigationEvent;
          createEvent(eventInterface:"NavigationEventWithReferrer"): NavigationEventWithReferrer;
          createEvent(eventInterface:"OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;
          createEvent(eventInterface:"PageTransitionEvent"): PageTransitionEvent;
          createEvent(eventInterface:"PermissionRequestedEvent"): PermissionRequestedEvent;
          createEvent(eventInterface:"PointerEvent"): PointerEvent;
          createEvent(eventInterface:"PopStateEvent"): PopStateEvent;
          createEvent(eventInterface:"ProgressEvent"): ProgressEvent;
          createEvent(eventInterface:"SVGZoomEvent"): SVGZoomEvent;
          createEvent(eventInterface:"SVGZoomEvents"): SVGZoomEvent;
          createEvent(eventInterface:"ScriptNotifyEvent"): ScriptNotifyEvent;
          createEvent(eventInterface:"StorageEvent"): StorageEvent;
          createEvent(eventInterface:"TextEvent"): TextEvent;
          createEvent(eventInterface:"TouchEvent"): TouchEvent;
          createEvent(eventInterface:"TrackEvent"): TrackEvent;
          createEvent(eventInterface:"TransitionEvent"): TransitionEvent;
          createEvent(eventInterface:"UIEvent"): UIEvent;
          createEvent(eventInterface:"UIEvents"): UIEvent;
          createEvent(eventInterface:"UnviewableContentIdentifiedEvent"): UnviewableContentIdentifiedEvent;
          createEvent(eventInterface:"WebGLContextEvent"): WebGLContextEvent;
          createEvent(eventInterface:"WheelEvent"): WheelEvent;
          createEvent(eventInterface: string): Event;
      }
      
      interface ElementTraversal {
          childElementCount: number;
          firstElementChild: Element;
          lastElementChild: Element;
          nextElementSibling: Element;
          previousElementSibling: Element;
      }
      
      interface GetSVGDocument {
          getSVGDocument(): Document;
      }
      
      interface GlobalEventHandlers {
          onpointercancel: (ev: PointerEvent) => any;
          onpointerdown: (ev: PointerEvent) => any;
          onpointerenter: (ev: PointerEvent) => any;
          onpointerleave: (ev: PointerEvent) => any;
          onpointermove: (ev: PointerEvent) => any;
          onpointerout: (ev: PointerEvent) => any;
          onpointerover: (ev: PointerEvent) => any;
          onpointerup: (ev: PointerEvent) => any;
          onwheel: (ev: WheelEvent) => any;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface HTMLTableAlignment {
          /**
            * Sets or retrieves a value that you can use to implement your own ch functionality for the object.
            */
          ch: string;
          /**
            * Sets or retrieves a value that you can use to implement your own chOff functionality for the object.
            */
          chOff: string;
          /**
            * Sets or retrieves how text and other content are vertically aligned within the object that contains them.
            */
          vAlign: string;
      }
      
      interface IDBEnvironment {
          indexedDB: IDBFactory;
          msIndexedDB: IDBFactory;
      }
      
      interface LinkStyle {
          sheet: StyleSheet;
      }
      
      interface MSBaseReader {
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          onloadend: (ev: ProgressEvent) => any;
          onloadstart: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          readyState: number;
          result: any;
          abort(): void;
          DONE: number;
          EMPTY: number;
          LOADING: number;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface MSFileSaver {
          msSaveBlob(blob: any, defaultName?: string): boolean;
          msSaveOrOpenBlob(blob: any, defaultName?: string): boolean;
      }
      
      interface MSNavigatorDoNotTrack {
          confirmSiteSpecificTrackingException(args: ConfirmSiteSpecificExceptionsInformation): boolean;
          confirmWebWideTrackingException(args: ExceptionInformation): boolean;
          removeSiteSpecificTrackingException(args: ExceptionInformation): void;
          removeWebWideTrackingException(args: ExceptionInformation): void;
          storeSiteSpecificTrackingException(args: StoreSiteSpecificExceptionsInformation): void;
          storeWebWideTrackingException(args: StoreExceptionsInformation): void;
      }
      
      interface NavigatorContentUtils {
      }
      
      interface NavigatorGeolocation {
          geolocation: Geolocation;
      }
      
      interface NavigatorID {
          appName: string;
          appVersion: string;
          platform: string;
          product: string;
          productSub: string;
          userAgent: string;
          vendor: string;
          vendorSub: string;
      }
      
      interface NavigatorOnLine {
          onLine: boolean;
      }
      
      interface NavigatorStorageUtils {
      }
      
      interface NodeSelector {
          querySelector(selectors: string): Element;
          querySelectorAll(selectors: string): NodeList;
      }
      
      interface RandomSource {
          getRandomValues(array: ArrayBufferView): ArrayBufferView;
      }
      
      interface SVGAnimatedPathData {
          pathSegList: SVGPathSegList;
      }
      
      interface SVGAnimatedPoints {
          animatedPoints: SVGPointList;
          points: SVGPointList;
      }
      
      interface SVGExternalResourcesRequired {
          externalResourcesRequired: SVGAnimatedBoolean;
      }
      
      interface SVGFilterPrimitiveStandardAttributes extends SVGStylable {
          height: SVGAnimatedLength;
          result: SVGAnimatedString;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
      }
      
      interface SVGFitToViewBox {
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          viewBox: SVGAnimatedRect;
      }
      
      interface SVGLangSpace {
          xmllang: string;
          xmlspace: string;
      }
      
      interface SVGLocatable {
          farthestViewportElement: SVGElement;
          nearestViewportElement: SVGElement;
          getBBox(): SVGRect;
          getCTM(): SVGMatrix;
          getScreenCTM(): SVGMatrix;
          getTransformToElement(element: SVGElement): SVGMatrix;
      }
      
      interface SVGStylable {
          className: SVGAnimatedString;
          style: CSSStyleDeclaration;
      }
      
      interface SVGTests {
          requiredExtensions: SVGStringList;
          requiredFeatures: SVGStringList;
          systemLanguage: SVGStringList;
          hasExtension(extension: string): boolean;
      }
      
      interface SVGTransformable extends SVGLocatable {
          transform: SVGAnimatedTransformList;
      }
      
      interface SVGURIReference {
          href: SVGAnimatedString;
      }
      
      interface WindowBase64 {
          atob(encodedString: string): string;
          btoa(rawString: string): string;
      }
      
      interface WindowConsole {
          console: Console;
      }
      
      interface WindowLocalStorage {
          localStorage: Storage;
      }
      
      interface WindowSessionStorage {
          sessionStorage: Storage;
      }
      
      interface WindowTimers extends Object, WindowTimersExtension {
          clearInterval(handle: number): void;
          clearTimeout(handle: number): void;
          setInterval(handler: any, timeout?: any, ...args: any[]): number;
          setTimeout(handler: any, timeout?: any, ...args: any[]): number;
      }
      
      interface WindowTimersExtension {
          clearImmediate(handle: number): void;
          msClearImmediate(handle: number): void;
          msSetImmediate(expression: any, ...args: any[]): number;
          setImmediate(expression: any, ...args: any[]): number;
      }
      
      interface XMLHttpRequestEventTarget {
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          onloadend: (ev: ProgressEvent) => any;
          onloadstart: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          ontimeout: (ev: ProgressEvent) => any;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      
      interface NodeListOf<TNode extends Node> extends NodeList {
          length: number;
          item(index: number): TNode;
          [index: number]: TNode;
      }
      
      interface BlobPropertyBag {
          type?: string;
          endings?: string;
      }
      
      interface EventListenerObject {
          handleEvent(evt: Event): void;
      }
      
      declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
      
      interface ErrorEventHandler {
          (event: Event, source?: string, fileno?: number, columnNumber?: number): void;
          (event: string, source?: string, fileno?: number, columnNumber?: number): void;
      }
      interface PositionCallback {
          (position: Position): void;
      }
      interface PositionErrorCallback {
          (error: PositionError): void;
      }
      interface MediaQueryListListener {
          (mql: MediaQueryList): void;
      }
      interface MSLaunchUriCallback {
          (): void;
      }
      interface FrameRequestCallback {
          (time: number): void;
      }
      interface MSUnsafeFunctionCallback {
          (): any;
      }
      interface MSExecAtPriorityFunctionCallback {
          (...args: any[]): any;
      }
      interface MutationCallback {
          (mutations: MutationRecord[], observer: MutationObserver): void;
      }
      interface DecodeSuccessCallback {
          (decodedData: AudioBuffer): void;
      }
      interface DecodeErrorCallback {
          (): void;
      }
      interface FunctionStringCallback {
          (data: string): void;
      }
      declare var Audio: {new(src?: string): HTMLAudioElement; };
      declare var Image: {new(width?: number, height?: number): HTMLImageElement; };
      declare var Option: {new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement; };
      declare var animationStartTime: number;
      declare var applicationCache: ApplicationCache;
      declare var clientInformation: Navigator;
      declare var closed: boolean;
      declare var crypto: Crypto;
      declare var defaultStatus: string;
      declare var devicePixelRatio: number;
      declare var doNotTrack: string;
      declare var document: Document;
      declare var event: Event;
      declare var external: External;
      declare var frameElement: Element;
      declare var frames: Window;
      declare var history: History;
      declare var innerHeight: number;
      declare var innerWidth: number;
      declare var length: number;
      declare var location: Location;
      declare var locationbar: BarProp;
      declare var menubar: BarProp;
      declare var msAnimationStartTime: number;
      declare var msTemplatePrinter: MSTemplatePrinter;
      declare var name: string;
      declare var navigator: Navigator;
      declare var offscreenBuffering: string | boolean;
      declare var onabort: (ev: Event) => any;
      declare var onafterprint: (ev: Event) => any;
      declare var onbeforeprint: (ev: Event) => any;
      declare var onbeforeunload: (ev: BeforeUnloadEvent) => any;
      declare var onblur: (ev: FocusEvent) => any;
      declare var oncanplay: (ev: Event) => any;
      declare var oncanplaythrough: (ev: Event) => any;
      declare var onchange: (ev: Event) => any;
      declare var onclick: (ev: MouseEvent) => any;
      declare var oncompassneedscalibration: (ev: Event) => any;
      declare var oncontextmenu: (ev: PointerEvent) => any;
      declare var ondblclick: (ev: MouseEvent) => any;
      declare var ondevicemotion: (ev: DeviceMotionEvent) => any;
      declare var ondeviceorientation: (ev: DeviceOrientationEvent) => any;
      declare var ondrag: (ev: DragEvent) => any;
      declare var ondragend: (ev: DragEvent) => any;
      declare var ondragenter: (ev: DragEvent) => any;
      declare var ondragleave: (ev: DragEvent) => any;
      declare var ondragover: (ev: DragEvent) => any;
      declare var ondragstart: (ev: DragEvent) => any;
      declare var ondrop: (ev: DragEvent) => any;
      declare var ondurationchange: (ev: Event) => any;
      declare var onemptied: (ev: Event) => any;
      declare var onended: (ev: Event) => any;
      declare var onerror: ErrorEventHandler;
      declare var onfocus: (ev: FocusEvent) => any;
      declare var onhashchange: (ev: HashChangeEvent) => any;
      declare var oninput: (ev: Event) => any;
      declare var onkeydown: (ev: KeyboardEvent) => any;
      declare var onkeypress: (ev: KeyboardEvent) => any;
      declare var onkeyup: (ev: KeyboardEvent) => any;
      declare var onload: (ev: Event) => any;
      declare var onloadeddata: (ev: Event) => any;
      declare var onloadedmetadata: (ev: Event) => any;
      declare var onloadstart: (ev: Event) => any;
      declare var onmessage: (ev: MessageEvent) => any;
      declare var onmousedown: (ev: MouseEvent) => any;
      declare var onmouseenter: (ev: MouseEvent) => any;
      declare var onmouseleave: (ev: MouseEvent) => any;
      declare var onmousemove: (ev: MouseEvent) => any;
      declare var onmouseout: (ev: MouseEvent) => any;
      declare var onmouseover: (ev: MouseEvent) => any;
      declare var onmouseup: (ev: MouseEvent) => any;
      declare var onmousewheel: (ev: MouseWheelEvent) => any;
      declare var onmsgesturechange: (ev: MSGestureEvent) => any;
      declare var onmsgesturedoubletap: (ev: MSGestureEvent) => any;
      declare var onmsgestureend: (ev: MSGestureEvent) => any;
      declare var onmsgesturehold: (ev: MSGestureEvent) => any;
      declare var onmsgesturestart: (ev: MSGestureEvent) => any;
      declare var onmsgesturetap: (ev: MSGestureEvent) => any;
      declare var onmsinertiastart: (ev: MSGestureEvent) => any;
      declare var onmspointercancel: (ev: MSPointerEvent) => any;
      declare var onmspointerdown: (ev: MSPointerEvent) => any;
      declare var onmspointerenter: (ev: MSPointerEvent) => any;
      declare var onmspointerleave: (ev: MSPointerEvent) => any;
      declare var onmspointermove: (ev: MSPointerEvent) => any;
      declare var onmspointerout: (ev: MSPointerEvent) => any;
      declare var onmspointerover: (ev: MSPointerEvent) => any;
      declare var onmspointerup: (ev: MSPointerEvent) => any;
      declare var onoffline: (ev: Event) => any;
      declare var ononline: (ev: Event) => any;
      declare var onorientationchange: (ev: Event) => any;
      declare var onpagehide: (ev: PageTransitionEvent) => any;
      declare var onpageshow: (ev: PageTransitionEvent) => any;
      declare var onpause: (ev: Event) => any;
      declare var onplay: (ev: Event) => any;
      declare var onplaying: (ev: Event) => any;
      declare var onpopstate: (ev: PopStateEvent) => any;
      declare var onprogress: (ev: ProgressEvent) => any;
      declare var onratechange: (ev: Event) => any;
      declare var onreadystatechange: (ev: ProgressEvent) => any;
      declare var onreset: (ev: Event) => any;
      declare var onresize: (ev: UIEvent) => any;
      declare var onscroll: (ev: UIEvent) => any;
      declare var onseeked: (ev: Event) => any;
      declare var onseeking: (ev: Event) => any;
      declare var onselect: (ev: UIEvent) => any;
      declare var onstalled: (ev: Event) => any;
      declare var onstorage: (ev: StorageEvent) => any;
      declare var onsubmit: (ev: Event) => any;
      declare var onsuspend: (ev: Event) => any;
      declare var ontimeupdate: (ev: Event) => any;
      declare var ontouchcancel: any;
      declare var ontouchend: any;
      declare var ontouchmove: any;
      declare var ontouchstart: any;
      declare var onunload: (ev: Event) => any;
      declare var onvolumechange: (ev: Event) => any;
      declare var onwaiting: (ev: Event) => any;
      declare var opener: Window;
      declare var orientation: string;
      declare var outerHeight: number;
      declare var outerWidth: number;
      declare var pageXOffset: number;
      declare var pageYOffset: number;
      declare var parent: Window;
      declare var performance: Performance;
      declare var personalbar: BarProp;
      declare var screen: Screen;
      declare var screenLeft: number;
      declare var screenTop: number;
      declare var screenX: number;
      declare var screenY: number;
      declare var scrollX: number;
      declare var scrollY: number;
      declare var scrollbars: BarProp;
      declare var self: Window;
      declare var status: string;
      declare var statusbar: BarProp;
      declare var styleMedia: StyleMedia;
      declare var toolbar: BarProp;
      declare var top: Window;
      declare var window: Window;
      declare function alert(message?: any): void;
      declare function blur(): void;
      declare function cancelAnimationFrame(handle: number): void;
      declare function captureEvents(): void;
      declare function close(): void;
      declare function confirm(message?: string): boolean;
      declare function focus(): void;
      declare function getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
      declare function getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
      declare function getSelection(): Selection;
      declare function matchMedia(mediaQuery: string): MediaQueryList;
      declare function moveBy(x?: number, y?: number): void;
      declare function moveTo(x?: number, y?: number): void;
      declare function msCancelRequestAnimationFrame(handle: number): void;
      declare function msMatchMedia(mediaQuery: string): MediaQueryList;
      declare function msRequestAnimationFrame(callback: FrameRequestCallback): number;
      declare function msWriteProfilerMark(profilerMarkName: string): void;
      declare function open(url?: string, target?: string, features?: string, replace?: boolean): any;
      declare function postMessage(message: any, targetOrigin: string, ports?: any): void;
      declare function print(): void;
      declare function prompt(message?: string, _default?: string): string;
      declare function releaseEvents(): void;
      declare function requestAnimationFrame(callback: FrameRequestCallback): number;
      declare function resizeBy(x?: number, y?: number): void;
      declare function resizeTo(x?: number, y?: number): void;
      declare function scroll(x?: number, y?: number): void;
      declare function scrollBy(x?: number, y?: number): void;
      declare function scrollTo(x?: number, y?: number): void;
      declare function webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
      declare function webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
      declare function toString(): string;
      declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      declare function dispatchEvent(evt: Event): boolean;
      declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      declare function clearInterval(handle: number): void;
      declare function clearTimeout(handle: number): void;
      declare function setInterval(handler: any, timeout?: any, ...args: any[]): number;
      declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
      declare function clearImmediate(handle: number): void;
      declare function msClearImmediate(handle: number): void;
      declare function msSetImmediate(expression: any, ...args: any[]): number;
      declare function setImmediate(expression: any, ...args: any[]): number;
      declare var sessionStorage: Storage;
      declare var localStorage: Storage;
      declare var console: Console;
      declare var onpointercancel: (ev: PointerEvent) => any;
      declare var onpointerdown: (ev: PointerEvent) => any;
      declare var onpointerenter: (ev: PointerEvent) => any;
      declare var onpointerleave: (ev: PointerEvent) => any;
      declare var onpointermove: (ev: PointerEvent) => any;
      declare var onpointerout: (ev: PointerEvent) => any;
      declare var onpointerover: (ev: PointerEvent) => any;
      declare var onpointerup: (ev: PointerEvent) => any;
      declare var onwheel: (ev: WheelEvent) => any;
      declare var indexedDB: IDBFactory;
      declare var msIndexedDB: IDBFactory;
      declare function atob(encodedString: string): string;
      declare function btoa(rawString: string): string;
      declare function addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      /////////////////////////////
      /// WorkerGlobalScope APIs 
      /////////////////////////////
      // These are only available in a Web Worker 
      declare function importScripts(...urls: string[]): void;
      
      
      /////////////////////////////
      /// Windows Script Host APIS
      /////////////////////////////
      
      
      interface ActiveXObject {
          new (s: string): any;
      }
      declare var ActiveXObject: ActiveXObject;
      
      interface ITextWriter {
          Write(s: string): void;
          WriteLine(s: string): void;
          Close(): void;
      }
      
      interface TextStreamBase {
          /**
           * The column number of the current character position in an input stream.
           */
          Column: number;
      
          /**
           * The current line number in an input stream.
           */
          Line: number;
      
          /**
           * Closes a text stream.
           * It is not necessary to close standard streams; they close automatically when the process ends. If 
           * you close a standard stream, be aware that any other pointers to that standard stream become invalid.
           */
          Close(): void;
      }
      
      interface TextStreamWriter extends TextStreamBase {
          /**
           * Sends a string to an output stream.
           */
          Write(s: string): void;
      
          /**
           * Sends a specified number of blank lines (newline characters) to an output stream.
           */
          WriteBlankLines(intLines: number): void;
      
          /**
           * Sends a string followed by a newline character to an output stream.
           */
          WriteLine(s: string): void;
      }
      
      interface TextStreamReader extends TextStreamBase {
          /**
           * Returns a specified number of characters from an input stream, starting at the current pointer position.
           * Does not return until the ENTER key is pressed.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          Read(characters: number): string;
      
          /**
           * Returns all characters from an input stream.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          ReadAll(): string;
      
          /**
           * Returns an entire line from an input stream.
           * Although this method extracts the newline character, it does not add it to the returned string.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          ReadLine(): string;
      
          /**
           * Skips a specified number of characters when reading from an input text stream.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)
           */
          Skip(characters: number): void;
      
          /**
           * Skips the next line when reading from an input text stream.
           * Can only be used on a stream in reading mode, not writing or appending mode.
           */
          SkipLine(): void;
      
          /**
           * Indicates whether the stream pointer position is at the end of a line.
           */
          AtEndOfLine: boolean;
      
          /**
           * Indicates whether the stream pointer position is at the end of a stream.
           */
          AtEndOfStream: boolean;
      }
      
      declare var WScript: {
          /**
          * Outputs text to either a message box (under WScript.exe) or the command console window followed by
          * a newline (under CScript.exe).
          */
          Echo(s: any): void;
      
          /**
           * Exposes the write-only error output stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdErr: TextStreamWriter;
      
          /**
           * Exposes the write-only output stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdOut: TextStreamWriter;
          Arguments: { length: number; Item(n: number): string; };
      
          /**
           *  The full path of the currently running script.
           */
          ScriptFullName: string;
      
          /**
           * Forces the script to stop immediately, with an optional exit code.
           */
          Quit(exitCode?: number): number;
      
          /**
           * The Windows Script Host build version number.
           */
          BuildVersion: number;
      
          /**
           * Fully qualified path of the host executable.
           */
          FullName: string;
      
          /**
           * Gets/sets the script mode - interactive(true) or batch(false).
           */
          Interactive: boolean;
      
          /**
           * The name of the host executable (WScript.exe or CScript.exe).
           */
          Name: string;
      
          /**
           * Path of the directory containing the host executable.
           */
          Path: string;
      
          /**
           * The filename of the currently running script.
           */
          ScriptName: string;
      
          /**
           * Exposes the read-only input stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdIn: TextStreamReader;
      
          /**
           * Windows Script Host version
           */
          Version: string;
      
          /**
           * Connects a COM object's event sources to functions named with a given prefix, in the form prefix_event.
           */
          ConnectObject(objEventSource: any, strPrefix: string): void;
      
          /**
           * Creates a COM object.
           * @param strProgiID
           * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
           */
          CreateObject(strProgID: string, strPrefix?: string): any;
      
          /**
           * Disconnects a COM object from its event sources.
           */
          DisconnectObject(obj: any): void;
      
          /**
           * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.
           * @param strPathname Fully qualified path to the file containing the object persisted to disk.
           *                       For objects in memory, pass a zero-length string.
           * @param strProgID
           * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
           */
          GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;
      
          /**
           * Suspends script execution for a specified length of time, then continues execution.
           * @param intTime Interval (in milliseconds) to suspend script execution.
           */
          Sleep(intTime: number): void;
      };
      
      /**
       * Allows enumerating over a COM collection, which may not have indexed item access.
       */
      interface Enumerator<T> {
          /**
           * Returns true if the current item is the last one in the collection, or the collection is empty,
           * or the current item is undefined.
           */
          atEnd(): boolean;
      
          /**
           * Returns the current item in the collection
           */
          item(): T;
      
          /**
           * Resets the current item in the collection to the first item. If there are no items in the collection,
           * the current item is set to undefined.
           */
          moveFirst(): void;
      
          /**
           * Moves the current item to the next item in the collection. If the enumerator is at the end of
           * the collection or the collection is empty, the current item is set to undefined.
           */
          moveNext(): void;
      }
      
      interface EnumeratorConstructor {
          new <T>(collection: any): Enumerator<T>;
          new (collection: any): Enumerator<any>;
      }
      
      declare var Enumerator: EnumeratorConstructor;
      
      /**
       * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.
       */
      interface VBArray<T> {
          /**
           * Returns the number of dimensions (1-based).
           */
          dimensions(): number;
      
          /**
           * Takes an index for each dimension in the array, and returns the item at the corresponding location.
           */
          getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;
      
          /**
           * Returns the smallest available index for a given dimension.
           * @param dimension 1-based dimension (defaults to 1)
           */
          lbound(dimension?: number): number;
      
          /**
           * Returns the largest available index for a given dimension.
           * @param dimension 1-based dimension (defaults to 1)
           */
          ubound(dimension?: number): number;
      
          /**
           * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,
           * each successive dimension is appended to the end of the array.
           * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]
           */
          toArray(): T[];
      }
      
      interface VBArrayConstructor {
          new <T>(safeArray: any): VBArray<T>;
          new (safeArray: any): VBArray<any>;
      }
      
      declare var VBArray: VBArrayConstructor;
      
    • tsc.js
      /*! *****************************************************************************
      Copyright (c) Microsoft Corporation. All rights reserved. 
      Licensed under the Apache License, Version 2.0 (the "License"); you may not use
      this file except in compliance with the License. You may obtain a copy of the
      License at http://www.apache.org/licenses/LICENSE-2.0  
       
      THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
      WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
      MERCHANTABLITY OR NON-INFRINGEMENT. 
       
      See the Apache Version 2.0 License for specific language governing permissions
      and limitations under the License.
      ***************************************************************************** */
      
      var ts;
      (function (ts) {
          (function (ExitStatus) {
              ExitStatus[ExitStatus["Success"] = 0] = "Success";
              ExitStatus[ExitStatus["DiagnosticsPresent_OutputsSkipped"] = 1] = "DiagnosticsPresent_OutputsSkipped";
              ExitStatus[ExitStatus["DiagnosticsPresent_OutputsGenerated"] = 2] = "DiagnosticsPresent_OutputsGenerated";
          })(ts.ExitStatus || (ts.ExitStatus = {}));
          var ExitStatus = ts.ExitStatus;
          (function (DiagnosticCategory) {
              DiagnosticCategory[DiagnosticCategory["Warning"] = 0] = "Warning";
              DiagnosticCategory[DiagnosticCategory["Error"] = 1] = "Error";
              DiagnosticCategory[DiagnosticCategory["Message"] = 2] = "Message";
          })(ts.DiagnosticCategory || (ts.DiagnosticCategory = {}));
          var DiagnosticCategory = ts.DiagnosticCategory;
      })(ts || (ts = {}));
      /// <reference path="types.ts"/>
      var ts;
      (function (ts) {
          function forEach(array, callback) {
              if (array) {
                  for (var i = 0, len = array.length; i < len; i++) {
                      var result = callback(array[i], i);
                      if (result) {
                          return result;
                      }
                  }
              }
              return undefined;
          }
          ts.forEach = forEach;
          function contains(array, value) {
              if (array) {
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      if (v === value) {
                          return true;
                      }
                  }
              }
              return false;
          }
          ts.contains = contains;
          function indexOf(array, value) {
              if (array) {
                  for (var i = 0, len = array.length; i < len; i++) {
                      if (array[i] === value) {
                          return i;
                      }
                  }
              }
              return -1;
          }
          ts.indexOf = indexOf;
          function countWhere(array, predicate) {
              var count = 0;
              if (array) {
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      if (predicate(v)) {
                          count++;
                      }
                  }
              }
              return count;
          }
          ts.countWhere = countWhere;
          function filter(array, f) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var item = array[_i];
                      if (f(item)) {
                          result.push(item);
                      }
                  }
              }
              return result;
          }
          ts.filter = filter;
          function map(array, f) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      result.push(f(v));
                  }
              }
              return result;
          }
          ts.map = map;
          function concatenate(array1, array2) {
              if (!array2 || !array2.length)
                  return array1;
              if (!array1 || !array1.length)
                  return array2;
              return array1.concat(array2);
          }
          ts.concatenate = concatenate;
          function deduplicate(array) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var item = array[_i];
                      if (!contains(result, item)) {
                          result.push(item);
                      }
                  }
              }
              return result;
          }
          ts.deduplicate = deduplicate;
          function sum(array, prop) {
              var result = 0;
              for (var _i = 0; _i < array.length; _i++) {
                  var v = array[_i];
                  result += v[prop];
              }
              return result;
          }
          ts.sum = sum;
          function addRange(to, from) {
              if (to && from) {
                  for (var _i = 0; _i < from.length; _i++) {
                      var v = from[_i];
                      to.push(v);
                  }
              }
          }
          ts.addRange = addRange;
          function lastOrUndefined(array) {
              if (array.length === 0) {
                  return undefined;
              }
              return array[array.length - 1];
          }
          ts.lastOrUndefined = lastOrUndefined;
          function binarySearch(array, value) {
              var low = 0;
              var high = array.length - 1;
              while (low <= high) {
                  var middle = low + ((high - low) >> 1);
                  var midValue = array[middle];
                  if (midValue === value) {
                      return middle;
                  }
                  else if (midValue > value) {
                      high = middle - 1;
                  }
                  else {
                      low = middle + 1;
                  }
              }
              return ~low;
          }
          ts.binarySearch = binarySearch;
          function reduceLeft(array, f, initial) {
              if (array) {
                  var count = array.length;
                  if (count > 0) {
                      var pos = 0;
                      var result = arguments.length <= 2 ? array[pos++] : initial;
                      while (pos < count) {
                          result = f(result, array[pos++]);
                      }
                      return result;
                  }
              }
              return initial;
          }
          ts.reduceLeft = reduceLeft;
          function reduceRight(array, f, initial) {
              if (array) {
                  var pos = array.length - 1;
                  if (pos >= 0) {
                      var result = arguments.length <= 2 ? array[pos--] : initial;
                      while (pos >= 0) {
                          result = f(result, array[pos--]);
                      }
                      return result;
                  }
              }
              return initial;
          }
          ts.reduceRight = reduceRight;
          var hasOwnProperty = Object.prototype.hasOwnProperty;
          function hasProperty(map, key) {
              return hasOwnProperty.call(map, key);
          }
          ts.hasProperty = hasProperty;
          function getProperty(map, key) {
              return hasOwnProperty.call(map, key) ? map[key] : undefined;
          }
          ts.getProperty = getProperty;
          function isEmpty(map) {
              for (var id in map) {
                  if (hasProperty(map, id)) {
                      return false;
                  }
              }
              return true;
          }
          ts.isEmpty = isEmpty;
          function clone(object) {
              var result = {};
              for (var id in object) {
                  result[id] = object[id];
              }
              return result;
          }
          ts.clone = clone;
          function extend(first, second) {
              var result = {};
              for (var id in first) {
                  result[id] = first[id];
              }
              for (var id in second) {
                  if (!hasProperty(result, id)) {
                      result[id] = second[id];
                  }
              }
              return result;
          }
          ts.extend = extend;
          function forEachValue(map, callback) {
              var result;
              for (var id in map) {
                  if (result = callback(map[id]))
                      break;
              }
              return result;
          }
          ts.forEachValue = forEachValue;
          function forEachKey(map, callback) {
              var result;
              for (var id in map) {
                  if (result = callback(id))
                      break;
              }
              return result;
          }
          ts.forEachKey = forEachKey;
          function lookUp(map, key) {
              return hasProperty(map, key) ? map[key] : undefined;
          }
          ts.lookUp = lookUp;
          function copyMap(source, target) {
              for (var p in source) {
                  target[p] = source[p];
              }
          }
          ts.copyMap = copyMap;
          function arrayToMap(array, makeKey) {
              var result = {};
              forEach(array, function (value) {
                  result[makeKey(value)] = value;
              });
              return result;
          }
          ts.arrayToMap = arrayToMap;
          function memoize(callback) {
              var value;
              return function () {
                  if (callback) {
                      value = callback();
                      callback = undefined;
                  }
                  return value;
              };
          }
          ts.memoize = memoize;
          function formatStringFromArgs(text, args, baseIndex) {
              baseIndex = baseIndex || 0;
              return text.replace(/{(\d+)}/g, function (match, index) { return args[+index + baseIndex]; });
          }
          ts.localizedDiagnosticMessages = undefined;
          function getLocaleSpecificMessage(message) {
              return ts.localizedDiagnosticMessages && ts.localizedDiagnosticMessages[message]
                  ? ts.localizedDiagnosticMessages[message]
                  : message;
          }
          ts.getLocaleSpecificMessage = getLocaleSpecificMessage;
          function createFileDiagnostic(file, start, length, message) {
              var end = start + length;
              Debug.assert(start >= 0, "start must be non-negative, is " + start);
              Debug.assert(length >= 0, "length must be non-negative, is " + length);
              Debug.assert(start <= file.text.length, "start must be within the bounds of the file. " + start + " > " + file.text.length);
              Debug.assert(end <= file.text.length, "end must be the bounds of the file. " + end + " > " + file.text.length);
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 4) {
                  text = formatStringFromArgs(text, arguments, 4);
              }
              return {
                  file: file,
                  start: start,
                  length: length,
                  messageText: text,
                  category: message.category,
                  code: message.code
              };
          }
          ts.createFileDiagnostic = createFileDiagnostic;
          function createCompilerDiagnostic(message) {
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 1) {
                  text = formatStringFromArgs(text, arguments, 1);
              }
              return {
                  file: undefined,
                  start: undefined,
                  length: undefined,
                  messageText: text,
                  category: message.category,
                  code: message.code
              };
          }
          ts.createCompilerDiagnostic = createCompilerDiagnostic;
          function chainDiagnosticMessages(details, message) {
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 2) {
                  text = formatStringFromArgs(text, arguments, 2);
              }
              return {
                  messageText: text,
                  category: message.category,
                  code: message.code,
                  next: details
              };
          }
          ts.chainDiagnosticMessages = chainDiagnosticMessages;
          function concatenateDiagnosticMessageChains(headChain, tailChain) {
              Debug.assert(!headChain.next);
              headChain.next = tailChain;
              return headChain;
          }
          ts.concatenateDiagnosticMessageChains = concatenateDiagnosticMessageChains;
          function compareValues(a, b) {
              if (a === b)
                  return 0;
              if (a === undefined)
                  return -1;
              if (b === undefined)
                  return 1;
              return a < b ? -1 : 1;
          }
          ts.compareValues = compareValues;
          function getDiagnosticFileName(diagnostic) {
              return diagnostic.file ? diagnostic.file.fileName : undefined;
          }
          function compareDiagnostics(d1, d2) {
              return compareValues(getDiagnosticFileName(d1), getDiagnosticFileName(d2)) ||
                  compareValues(d1.start, d2.start) ||
                  compareValues(d1.length, d2.length) ||
                  compareValues(d1.code, d2.code) ||
                  compareMessageText(d1.messageText, d2.messageText) ||
                  0;
          }
          ts.compareDiagnostics = compareDiagnostics;
          function compareMessageText(text1, text2) {
              while (text1 && text2) {
                  var string1 = typeof text1 === "string" ? text1 : text1.messageText;
                  var string2 = typeof text2 === "string" ? text2 : text2.messageText;
                  var res = compareValues(string1, string2);
                  if (res) {
                      return res;
                  }
                  text1 = typeof text1 === "string" ? undefined : text1.next;
                  text2 = typeof text2 === "string" ? undefined : text2.next;
              }
              if (!text1 && !text2) {
                  return 0;
              }
              return text1 ? 1 : -1;
          }
          function sortAndDeduplicateDiagnostics(diagnostics) {
              return deduplicateSortedDiagnostics(diagnostics.sort(compareDiagnostics));
          }
          ts.sortAndDeduplicateDiagnostics = sortAndDeduplicateDiagnostics;
          function deduplicateSortedDiagnostics(diagnostics) {
              if (diagnostics.length < 2) {
                  return diagnostics;
              }
              var newDiagnostics = [diagnostics[0]];
              var previousDiagnostic = diagnostics[0];
              for (var i = 1; i < diagnostics.length; i++) {
                  var currentDiagnostic = diagnostics[i];
                  var isDupe = compareDiagnostics(currentDiagnostic, previousDiagnostic) === 0;
                  if (!isDupe) {
                      newDiagnostics.push(currentDiagnostic);
                      previousDiagnostic = currentDiagnostic;
                  }
              }
              return newDiagnostics;
          }
          ts.deduplicateSortedDiagnostics = deduplicateSortedDiagnostics;
          function normalizeSlashes(path) {
              return path.replace(/\\/g, "/");
          }
          ts.normalizeSlashes = normalizeSlashes;
          function getRootLength(path) {
              if (path.charCodeAt(0) === 47) {
                  if (path.charCodeAt(1) !== 47)
                      return 1;
                  var p1 = path.indexOf("/", 2);
                  if (p1 < 0)
                      return 2;
                  var p2 = path.indexOf("/", p1 + 1);
                  if (p2 < 0)
                      return p1 + 1;
                  return p2 + 1;
              }
              if (path.charCodeAt(1) === 58) {
                  if (path.charCodeAt(2) === 47)
                      return 3;
                  return 2;
              }
              if (path.lastIndexOf("file:///", 0) === 0) {
                  return "file:///".length;
              }
              var idx = path.indexOf('://');
              if (idx !== -1) {
                  return idx + "://".length;
              }
              return 0;
          }
          ts.getRootLength = getRootLength;
          ts.directorySeparator = "/";
          function getNormalizedParts(normalizedSlashedPath, rootLength) {
              var parts = normalizedSlashedPath.substr(rootLength).split(ts.directorySeparator);
              var normalized = [];
              for (var _i = 0; _i < parts.length; _i++) {
                  var part = parts[_i];
                  if (part !== ".") {
                      if (part === ".." && normalized.length > 0 && lastOrUndefined(normalized) !== "..") {
                          normalized.pop();
                      }
                      else {
                          if (part) {
                              normalized.push(part);
                          }
                      }
                  }
              }
              return normalized;
          }
          function normalizePath(path) {
              path = normalizeSlashes(path);
              var rootLength = getRootLength(path);
              var normalized = getNormalizedParts(path, rootLength);
              return path.substr(0, rootLength) + normalized.join(ts.directorySeparator);
          }
          ts.normalizePath = normalizePath;
          function getDirectoryPath(path) {
              return path.substr(0, Math.max(getRootLength(path), path.lastIndexOf(ts.directorySeparator)));
          }
          ts.getDirectoryPath = getDirectoryPath;
          function isUrl(path) {
              return path && !isRootedDiskPath(path) && path.indexOf("://") !== -1;
          }
          ts.isUrl = isUrl;
          function isRootedDiskPath(path) {
              return getRootLength(path) !== 0;
          }
          ts.isRootedDiskPath = isRootedDiskPath;
          function normalizedPathComponents(path, rootLength) {
              var normalizedParts = getNormalizedParts(path, rootLength);
              return [path.substr(0, rootLength)].concat(normalizedParts);
          }
          function getNormalizedPathComponents(path, currentDirectory) {
              path = normalizeSlashes(path);
              var rootLength = getRootLength(path);
              if (rootLength == 0) {
                  path = combinePaths(normalizeSlashes(currentDirectory), path);
                  rootLength = getRootLength(path);
              }
              return normalizedPathComponents(path, rootLength);
          }
          ts.getNormalizedPathComponents = getNormalizedPathComponents;
          function getNormalizedAbsolutePath(fileName, currentDirectory) {
              return getNormalizedPathFromPathComponents(getNormalizedPathComponents(fileName, currentDirectory));
          }
          ts.getNormalizedAbsolutePath = getNormalizedAbsolutePath;
          function getNormalizedPathFromPathComponents(pathComponents) {
              if (pathComponents && pathComponents.length) {
                  return pathComponents[0] + pathComponents.slice(1).join(ts.directorySeparator);
              }
          }
          ts.getNormalizedPathFromPathComponents = getNormalizedPathFromPathComponents;
          function getNormalizedPathComponentsOfUrl(url) {
              // Get root length of http://www.website.com/folder1/foler2/
              // In this example the root is:  http://www.website.com/ 
              // normalized path components should be ["http://www.website.com/", "folder1", "folder2"]
              var urlLength = url.length;
              var rootLength = url.indexOf("://") + "://".length;
              while (rootLength < urlLength) {
                  if (url.charCodeAt(rootLength) === 47) {
                      rootLength++;
                  }
                  else {
                      break;
                  }
              }
              if (rootLength === urlLength) {
                  return [url];
              }
              var indexOfNextSlash = url.indexOf(ts.directorySeparator, rootLength);
              if (indexOfNextSlash !== -1) {
                  rootLength = indexOfNextSlash + 1;
                  return normalizedPathComponents(url, rootLength);
              }
              else {
                  return [url + ts.directorySeparator];
              }
          }
          function getNormalizedPathOrUrlComponents(pathOrUrl, currentDirectory) {
              if (isUrl(pathOrUrl)) {
                  return getNormalizedPathComponentsOfUrl(pathOrUrl);
              }
              else {
                  return getNormalizedPathComponents(pathOrUrl, currentDirectory);
              }
          }
          function getRelativePathToDirectoryOrUrl(directoryPathOrUrl, relativeOrAbsolutePath, currentDirectory, getCanonicalFileName, isAbsolutePathAnUrl) {
              var pathComponents = getNormalizedPathOrUrlComponents(relativeOrAbsolutePath, currentDirectory);
              var directoryComponents = getNormalizedPathOrUrlComponents(directoryPathOrUrl, currentDirectory);
              if (directoryComponents.length > 1 && lastOrUndefined(directoryComponents) === "") {
                  directoryComponents.length--;
              }
              for (var joinStartIndex = 0; joinStartIndex < pathComponents.length && joinStartIndex < directoryComponents.length; joinStartIndex++) {
                  if (getCanonicalFileName(directoryComponents[joinStartIndex]) !== getCanonicalFileName(pathComponents[joinStartIndex])) {
                      break;
                  }
              }
              if (joinStartIndex) {
                  var relativePath = "";
                  var relativePathComponents = pathComponents.slice(joinStartIndex, pathComponents.length);
                  for (; joinStartIndex < directoryComponents.length; joinStartIndex++) {
                      if (directoryComponents[joinStartIndex] !== "") {
                          relativePath = relativePath + ".." + ts.directorySeparator;
                      }
                  }
                  return relativePath + relativePathComponents.join(ts.directorySeparator);
              }
              var absolutePath = getNormalizedPathFromPathComponents(pathComponents);
              if (isAbsolutePathAnUrl && isRootedDiskPath(absolutePath)) {
                  absolutePath = "file:///" + absolutePath;
              }
              return absolutePath;
          }
          ts.getRelativePathToDirectoryOrUrl = getRelativePathToDirectoryOrUrl;
          function getBaseFileName(path) {
              var i = path.lastIndexOf(ts.directorySeparator);
              return i < 0 ? path : path.substring(i + 1);
          }
          ts.getBaseFileName = getBaseFileName;
          function combinePaths(path1, path2) {
              if (!(path1 && path1.length))
                  return path2;
              if (!(path2 && path2.length))
                  return path1;
              if (getRootLength(path2) !== 0)
                  return path2;
              if (path1.charAt(path1.length - 1) === ts.directorySeparator)
                  return path1 + path2;
              return path1 + ts.directorySeparator + path2;
          }
          ts.combinePaths = combinePaths;
          function fileExtensionIs(path, extension) {
              var pathLen = path.length;
              var extLen = extension.length;
              return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension;
          }
          ts.fileExtensionIs = fileExtensionIs;
          ts.supportedExtensions = [".ts", ".d.ts"];
          var extensionsToRemove = [".d.ts", ".ts", ".js"];
          function removeFileExtension(path) {
              for (var _i = 0; _i < extensionsToRemove.length; _i++) {
                  var ext = extensionsToRemove[_i];
                  if (fileExtensionIs(path, ext)) {
                      return path.substr(0, path.length - ext.length);
                  }
              }
              return path;
          }
          ts.removeFileExtension = removeFileExtension;
          var backslashOrDoubleQuote = /[\"\\]/g;
          var escapedCharsRegExp = /[\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
          var escapedCharsMap = {
              "\0": "\\0",
              "\t": "\\t",
              "\v": "\\v",
              "\f": "\\f",
              "\b": "\\b",
              "\r": "\\r",
              "\n": "\\n",
              "\\": "\\\\",
              "\"": "\\\"",
              "\u2028": "\\u2028",
              "\u2029": "\\u2029",
              "\u0085": "\\u0085"
          };
          function Symbol(flags, name) {
              this.flags = flags;
              this.name = name;
              this.declarations = undefined;
          }
          function Type(checker, flags) {
              this.flags = flags;
          }
          function Signature(checker) {
          }
          ts.objectAllocator = {
              getNodeConstructor: function (kind) {
                  function Node() {
                  }
                  Node.prototype = {
                      kind: kind,
                      pos: 0,
                      end: 0,
                      flags: 0,
                      parent: undefined
                  };
                  return Node;
              },
              getSymbolConstructor: function () { return Symbol; },
              getTypeConstructor: function () { return Type; },
              getSignatureConstructor: function () { return Signature; }
          };
          var Debug;
          (function (Debug) {
              var currentAssertionLevel = 0;
              function shouldAssert(level) {
                  return currentAssertionLevel >= level;
              }
              Debug.shouldAssert = shouldAssert;
              function assert(expression, message, verboseDebugInfo) {
                  if (!expression) {
                      var verboseDebugString = "";
                      if (verboseDebugInfo) {
                          verboseDebugString = "\r\nVerbose Debug Information: " + verboseDebugInfo();
                      }
                      throw new Error("Debug Failure. False expression: " + (message || "") + verboseDebugString);
                  }
              }
              Debug.assert = assert;
              function fail(message) {
                  Debug.assert(false, message);
              }
              Debug.fail = fail;
          })(Debug = ts.Debug || (ts.Debug = {}));
      })(ts || (ts = {}));
      /// <reference path="core.ts"/>
      var ts;
      (function (ts) {
          ts.sys = (function () {
              function getWScriptSystem() {
                  var fso = new ActiveXObject("Scripting.FileSystemObject");
                  var fileStream = new ActiveXObject("ADODB.Stream");
                  fileStream.Type = 2;
                  var binaryStream = new ActiveXObject("ADODB.Stream");
                  binaryStream.Type = 1;
                  var args = [];
                  for (var i = 0; i < WScript.Arguments.length; i++) {
                      args[i] = WScript.Arguments.Item(i);
                  }
                  function readFile(fileName, encoding) {
                      if (!fso.FileExists(fileName)) {
                          return undefined;
                      }
                      fileStream.Open();
                      try {
                          if (encoding) {
                              fileStream.Charset = encoding;
                              fileStream.LoadFromFile(fileName);
                          }
                          else {
                              fileStream.Charset = "x-ansi";
                              fileStream.LoadFromFile(fileName);
                              var bom = fileStream.ReadText(2) || "";
                              fileStream.Position = 0;
                              fileStream.Charset = bom.length >= 2 && (bom.charCodeAt(0) === 0xFF && bom.charCodeAt(1) === 0xFE || bom.charCodeAt(0) === 0xFE && bom.charCodeAt(1) === 0xFF) ? "unicode" : "utf-8";
                          }
                          return fileStream.ReadText();
                      }
                      catch (e) {
                          throw e;
                      }
                      finally {
                          fileStream.Close();
                      }
                  }
                  function writeFile(fileName, data, writeByteOrderMark) {
                      fileStream.Open();
                      binaryStream.Open();
                      try {
                          fileStream.Charset = "utf-8";
                          fileStream.WriteText(data);
                          if (writeByteOrderMark) {
                              fileStream.Position = 0;
                          }
                          else {
                              fileStream.Position = 3;
                          }
                          fileStream.CopyTo(binaryStream);
                          binaryStream.SaveToFile(fileName, 2);
                      }
                      finally {
                          binaryStream.Close();
                          fileStream.Close();
                      }
                  }
                  function getNames(collection) {
                      var result = [];
                      for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
                          result.push(e.item().Name);
                      }
                      return result.sort();
                  }
                  function readDirectory(path, extension) {
                      var result = [];
                      visitDirectory(path);
                      return result;
                      function visitDirectory(path) {
                          var folder = fso.GetFolder(path || ".");
                          var files = getNames(folder.files);
                          for (var _i = 0; _i < files.length; _i++) {
                              var name_1 = files[_i];
                              if (!extension || ts.fileExtensionIs(name_1, extension)) {
                                  result.push(ts.combinePaths(path, name_1));
                              }
                          }
                          var subfolders = getNames(folder.subfolders);
                          for (var _a = 0; _a < subfolders.length; _a++) {
                              var current = subfolders[_a];
                              visitDirectory(ts.combinePaths(path, current));
                          }
                      }
                  }
                  return {
                      args: args,
                      newLine: "\r\n",
                      useCaseSensitiveFileNames: false,
                      write: function (s) {
                          WScript.StdOut.Write(s);
                      },
                      readFile: readFile,
                      writeFile: writeFile,
                      resolvePath: function (path) {
                          return fso.GetAbsolutePathName(path);
                      },
                      fileExists: function (path) {
                          return fso.FileExists(path);
                      },
                      directoryExists: function (path) {
                          return fso.FolderExists(path);
                      },
                      createDirectory: function (directoryName) {
                          if (!this.directoryExists(directoryName)) {
                              fso.CreateFolder(directoryName);
                          }
                      },
                      getExecutingFilePath: function () {
                          return WScript.ScriptFullName;
                      },
                      getCurrentDirectory: function () {
                          return new ActiveXObject("WScript.Shell").CurrentDirectory;
                      },
                      readDirectory: readDirectory,
                      exit: function (exitCode) {
                          try {
                              WScript.Quit(exitCode);
                          }
                          catch (e) {
                          }
                      }
                  };
              }
              function getNodeSystem() {
                  var _fs = require("fs");
                  var _path = require("path");
                  var _os = require('os');
                  var platform = _os.platform();
                  var useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin";
                  function readFile(fileName, encoding) {
                      if (!_fs.existsSync(fileName)) {
                          return undefined;
                      }
                      var buffer = _fs.readFileSync(fileName);
                      var len = buffer.length;
                      if (len >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {
                          len &= ~1;
                          for (var i = 0; i < len; i += 2) {
                              var temp = buffer[i];
                              buffer[i] = buffer[i + 1];
                              buffer[i + 1] = temp;
                          }
                          return buffer.toString("utf16le", 2);
                      }
                      if (len >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {
                          return buffer.toString("utf16le", 2);
                      }
                      if (len >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
                          return buffer.toString("utf8", 3);
                      }
                      return buffer.toString("utf8");
                  }
                  function writeFile(fileName, data, writeByteOrderMark) {
                      if (writeByteOrderMark) {
                          data = '\uFEFF' + data;
                      }
                      _fs.writeFileSync(fileName, data, "utf8");
                  }
                  function readDirectory(path, extension) {
                      var result = [];
                      visitDirectory(path);
                      return result;
                      function visitDirectory(path) {
                          var files = _fs.readdirSync(path || ".").sort();
                          var directories = [];
                          for (var _i = 0; _i < files.length; _i++) {
                              var current = files[_i];
                              var name = ts.combinePaths(path, current);
                              var stat = _fs.lstatSync(name);
                              if (stat.isFile()) {
                                  if (!extension || ts.fileExtensionIs(name, extension)) {
                                      result.push(name);
                                  }
                              }
                              else if (stat.isDirectory()) {
                                  directories.push(name);
                              }
                          }
                          for (var _a = 0; _a < directories.length; _a++) {
                              var current = directories[_a];
                              visitDirectory(current);
                          }
                      }
                  }
                  return {
                      args: process.argv.slice(2),
                      newLine: _os.EOL,
                      useCaseSensitiveFileNames: useCaseSensitiveFileNames,
                      write: function (s) {
                          _fs.writeSync(1, s);
                      },
                      readFile: readFile,
                      writeFile: writeFile,
                      watchFile: function (fileName, callback) {
                          _fs.watchFile(fileName, { persistent: true, interval: 250 }, fileChanged);
                          return {
                              close: function () { _fs.unwatchFile(fileName, fileChanged); }
                          };
                          function fileChanged(curr, prev) {
                              if (+curr.mtime <= +prev.mtime) {
                                  return;
                              }
                              callback(fileName);
                          }
                          ;
                      },
                      resolvePath: function (path) {
                          return _path.resolve(path);
                      },
                      fileExists: function (path) {
                          return _fs.existsSync(path);
                      },
                      directoryExists: function (path) {
                          return _fs.existsSync(path) && _fs.statSync(path).isDirectory();
                      },
                      createDirectory: function (directoryName) {
                          if (!this.directoryExists(directoryName)) {
                              _fs.mkdirSync(directoryName);
                          }
                      },
                      getExecutingFilePath: function () {
                          return __filename;
                      },
                      getCurrentDirectory: function () {
                          return process.cwd();
                      },
                      readDirectory: readDirectory,
                      getMemoryUsage: function () {
                          if (global.gc) {
                              global.gc();
                          }
                          return process.memoryUsage().heapUsed;
                      },
                      exit: function (exitCode) {
                          process.exit(exitCode);
                      }
                  };
              }
              if (typeof WScript !== "undefined" && typeof ActiveXObject === "function") {
                  return getWScriptSystem();
              }
              else if (typeof module !== "undefined" && module.exports) {
                  return getNodeSystem();
              }
              else {
                  return undefined;
              }
          })();
      })(ts || (ts = {}));
      /// <reference path="types.ts" />
      var ts;
      (function (ts) {
          ts.Diagnostics = {
              Unterminated_string_literal: { code: 1002, category: ts.DiagnosticCategory.Error, key: "Unterminated string literal." },
              Identifier_expected: { code: 1003, category: ts.DiagnosticCategory.Error, key: "Identifier expected." },
              _0_expected: { code: 1005, category: ts.DiagnosticCategory.Error, key: "'{0}' expected." },
              A_file_cannot_have_a_reference_to_itself: { code: 1006, category: ts.DiagnosticCategory.Error, key: "A file cannot have a reference to itself." },
              Trailing_comma_not_allowed: { code: 1009, category: ts.DiagnosticCategory.Error, key: "Trailing comma not allowed." },
              Asterisk_Slash_expected: { code: 1010, category: ts.DiagnosticCategory.Error, key: "'*/' expected." },
              Unexpected_token: { code: 1012, category: ts.DiagnosticCategory.Error, key: "Unexpected token." },
              A_rest_parameter_must_be_last_in_a_parameter_list: { code: 1014, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be last in a parameter list." },
              Parameter_cannot_have_question_mark_and_initializer: { code: 1015, category: ts.DiagnosticCategory.Error, key: "Parameter cannot have question mark and initializer." },
              A_required_parameter_cannot_follow_an_optional_parameter: { code: 1016, category: ts.DiagnosticCategory.Error, key: "A required parameter cannot follow an optional parameter." },
              An_index_signature_cannot_have_a_rest_parameter: { code: 1017, category: ts.DiagnosticCategory.Error, key: "An index signature cannot have a rest parameter." },
              An_index_signature_parameter_cannot_have_an_accessibility_modifier: { code: 1018, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an accessibility modifier." },
              An_index_signature_parameter_cannot_have_a_question_mark: { code: 1019, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have a question mark." },
              An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." },
              An_index_signature_must_have_a_type_annotation: { code: 1021, category: ts.DiagnosticCategory.Error, key: "An index signature must have a type annotation." },
              An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: ts.DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." },
              An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: ts.DiagnosticCategory.Error, key: "An index signature parameter type must be 'string' or 'number'." },
              A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: ts.DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." },
              An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: ts.DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." },
              A_class_can_only_extend_a_single_class: { code: 1026, category: ts.DiagnosticCategory.Error, key: "A class can only extend a single class." },
              A_class_declaration_can_only_have_one_implements_clause: { code: 1027, category: ts.DiagnosticCategory.Error, key: "A class declaration can only have one 'implements' clause." },
              Accessibility_modifier_already_seen: { code: 1028, category: ts.DiagnosticCategory.Error, key: "Accessibility modifier already seen." },
              _0_modifier_must_precede_1_modifier: { code: 1029, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier must precede '{1}' modifier." },
              _0_modifier_already_seen: { code: 1030, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier already seen." },
              _0_modifier_cannot_appear_on_a_class_element: { code: 1031, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a class element." },
              An_interface_declaration_cannot_have_an_implements_clause: { code: 1032, category: ts.DiagnosticCategory.Error, key: "An interface declaration cannot have an 'implements' clause." },
              super_must_be_followed_by_an_argument_list_or_member_access: { code: 1034, category: ts.DiagnosticCategory.Error, key: "'super' must be followed by an argument list or member access." },
              Only_ambient_modules_can_use_quoted_names: { code: 1035, category: ts.DiagnosticCategory.Error, key: "Only ambient modules can use quoted names." },
              Statements_are_not_allowed_in_ambient_contexts: { code: 1036, category: ts.DiagnosticCategory.Error, key: "Statements are not allowed in ambient contexts." },
              A_declare_modifier_cannot_be_used_in_an_already_ambient_context: { code: 1038, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used in an already ambient context." },
              Initializers_are_not_allowed_in_ambient_contexts: { code: 1039, category: ts.DiagnosticCategory.Error, key: "Initializers are not allowed in ambient contexts." },
              _0_modifier_cannot_appear_on_a_module_element: { code: 1044, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a module element." },
              A_declare_modifier_cannot_be_used_with_an_interface_declaration: { code: 1045, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an interface declaration." },
              A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file: { code: 1046, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier is required for a top level declaration in a .d.ts file." },
              A_rest_parameter_cannot_be_optional: { code: 1047, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot be optional." },
              A_rest_parameter_cannot_have_an_initializer: { code: 1048, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot have an initializer." },
              A_set_accessor_must_have_exactly_one_parameter: { code: 1049, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor must have exactly one parameter." },
              A_set_accessor_cannot_have_an_optional_parameter: { code: 1051, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have an optional parameter." },
              A_set_accessor_parameter_cannot_have_an_initializer: { code: 1052, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor parameter cannot have an initializer." },
              A_set_accessor_cannot_have_rest_parameter: { code: 1053, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have rest parameter." },
              A_get_accessor_cannot_have_parameters: { code: 1054, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor cannot have parameters." },
              Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1056, category: ts.DiagnosticCategory.Error, key: "Accessors are only available when targeting ECMAScript 5 and higher." },
              Enum_member_must_have_initializer: { code: 1061, category: ts.DiagnosticCategory.Error, key: "Enum member must have initializer." },
              An_export_assignment_cannot_be_used_in_a_namespace: { code: 1063, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a namespace." },
              Ambient_enum_elements_can_only_have_integer_literal_initializers: { code: 1066, category: ts.DiagnosticCategory.Error, key: "Ambient enum elements can only have integer literal initializers." },
              Unexpected_token_A_constructor_method_accessor_or_property_was_expected: { code: 1068, category: ts.DiagnosticCategory.Error, key: "Unexpected token. A constructor, method, accessor, or property was expected." },
              A_declare_modifier_cannot_be_used_with_an_import_declaration: { code: 1079, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an import declaration." },
              Invalid_reference_directive_syntax: { code: 1084, category: ts.DiagnosticCategory.Error, key: "Invalid 'reference' directive syntax." },
              Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher: { code: 1085, category: ts.DiagnosticCategory.Error, key: "Octal literals are not available when targeting ECMAScript 5 and higher." },
              An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: ts.DiagnosticCategory.Error, key: "An accessor cannot be declared in an ambient context." },
              _0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a constructor declaration." },
              _0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a parameter." },
              Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...in' statement." },
              Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: ts.DiagnosticCategory.Error, key: "Type parameters cannot appear on a constructor declaration." },
              Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: ts.DiagnosticCategory.Error, key: "Type annotation cannot appear on a constructor declaration." },
              An_accessor_cannot_have_type_parameters: { code: 1094, category: ts.DiagnosticCategory.Error, key: "An accessor cannot have type parameters." },
              A_set_accessor_cannot_have_a_return_type_annotation: { code: 1095, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have a return type annotation." },
              An_index_signature_must_have_exactly_one_parameter: { code: 1096, category: ts.DiagnosticCategory.Error, key: "An index signature must have exactly one parameter." },
              _0_list_cannot_be_empty: { code: 1097, category: ts.DiagnosticCategory.Error, key: "'{0}' list cannot be empty." },
              Type_parameter_list_cannot_be_empty: { code: 1098, category: ts.DiagnosticCategory.Error, key: "Type parameter list cannot be empty." },
              Type_argument_list_cannot_be_empty: { code: 1099, category: ts.DiagnosticCategory.Error, key: "Type argument list cannot be empty." },
              Invalid_use_of_0_in_strict_mode: { code: 1100, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}' in strict mode." },
              with_statements_are_not_allowed_in_strict_mode: { code: 1101, category: ts.DiagnosticCategory.Error, key: "'with' statements are not allowed in strict mode." },
              delete_cannot_be_called_on_an_identifier_in_strict_mode: { code: 1102, category: ts.DiagnosticCategory.Error, key: "'delete' cannot be called on an identifier in strict mode." },
              A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: { code: 1104, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only be used within an enclosing iteration statement." },
              A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: { code: 1105, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only be used within an enclosing iteration or switch statement." },
              Jump_target_cannot_cross_function_boundary: { code: 1107, category: ts.DiagnosticCategory.Error, key: "Jump target cannot cross function boundary." },
              A_return_statement_can_only_be_used_within_a_function_body: { code: 1108, category: ts.DiagnosticCategory.Error, key: "A 'return' statement can only be used within a function body." },
              Expression_expected: { code: 1109, category: ts.DiagnosticCategory.Error, key: "Expression expected." },
              Type_expected: { code: 1110, category: ts.DiagnosticCategory.Error, key: "Type expected." },
              A_class_member_cannot_be_declared_optional: { code: 1112, category: ts.DiagnosticCategory.Error, key: "A class member cannot be declared optional." },
              A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: { code: 1113, category: ts.DiagnosticCategory.Error, key: "A 'default' clause cannot appear more than once in a 'switch' statement." },
              Duplicate_label_0: { code: 1114, category: ts.DiagnosticCategory.Error, key: "Duplicate label '{0}'" },
              A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: { code: 1115, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only jump to a label of an enclosing iteration statement." },
              A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: { code: 1116, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only jump to a label of an enclosing statement." },
              An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode: { code: 1117, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple properties with the same name in strict mode." },
              An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: { code: 1118, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple get/set accessors with the same name." },
              An_object_literal_cannot_have_property_and_accessor_with_the_same_name: { code: 1119, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have property and accessor with the same name." },
              An_export_assignment_cannot_have_modifiers: { code: 1120, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot have modifiers." },
              Octal_literals_are_not_allowed_in_strict_mode: { code: 1121, category: ts.DiagnosticCategory.Error, key: "Octal literals are not allowed in strict mode." },
              A_tuple_type_element_list_cannot_be_empty: { code: 1122, category: ts.DiagnosticCategory.Error, key: "A tuple type element list cannot be empty." },
              Variable_declaration_list_cannot_be_empty: { code: 1123, category: ts.DiagnosticCategory.Error, key: "Variable declaration list cannot be empty." },
              Digit_expected: { code: 1124, category: ts.DiagnosticCategory.Error, key: "Digit expected." },
              Hexadecimal_digit_expected: { code: 1125, category: ts.DiagnosticCategory.Error, key: "Hexadecimal digit expected." },
              Unexpected_end_of_text: { code: 1126, category: ts.DiagnosticCategory.Error, key: "Unexpected end of text." },
              Invalid_character: { code: 1127, category: ts.DiagnosticCategory.Error, key: "Invalid character." },
              Declaration_or_statement_expected: { code: 1128, category: ts.DiagnosticCategory.Error, key: "Declaration or statement expected." },
              Statement_expected: { code: 1129, category: ts.DiagnosticCategory.Error, key: "Statement expected." },
              case_or_default_expected: { code: 1130, category: ts.DiagnosticCategory.Error, key: "'case' or 'default' expected." },
              Property_or_signature_expected: { code: 1131, category: ts.DiagnosticCategory.Error, key: "Property or signature expected." },
              Enum_member_expected: { code: 1132, category: ts.DiagnosticCategory.Error, key: "Enum member expected." },
              Type_reference_expected: { code: 1133, category: ts.DiagnosticCategory.Error, key: "Type reference expected." },
              Variable_declaration_expected: { code: 1134, category: ts.DiagnosticCategory.Error, key: "Variable declaration expected." },
              Argument_expression_expected: { code: 1135, category: ts.DiagnosticCategory.Error, key: "Argument expression expected." },
              Property_assignment_expected: { code: 1136, category: ts.DiagnosticCategory.Error, key: "Property assignment expected." },
              Expression_or_comma_expected: { code: 1137, category: ts.DiagnosticCategory.Error, key: "Expression or comma expected." },
              Parameter_declaration_expected: { code: 1138, category: ts.DiagnosticCategory.Error, key: "Parameter declaration expected." },
              Type_parameter_declaration_expected: { code: 1139, category: ts.DiagnosticCategory.Error, key: "Type parameter declaration expected." },
              Type_argument_expected: { code: 1140, category: ts.DiagnosticCategory.Error, key: "Type argument expected." },
              String_literal_expected: { code: 1141, category: ts.DiagnosticCategory.Error, key: "String literal expected." },
              Line_break_not_permitted_here: { code: 1142, category: ts.DiagnosticCategory.Error, key: "Line break not permitted here." },
              or_expected: { code: 1144, category: ts.DiagnosticCategory.Error, key: "'{' or ';' expected." },
              Modifiers_not_permitted_on_index_signature_members: { code: 1145, category: ts.DiagnosticCategory.Error, key: "Modifiers not permitted on index signature members." },
              Declaration_expected: { code: 1146, category: ts.DiagnosticCategory.Error, key: "Declaration expected." },
              Import_declarations_in_a_namespace_cannot_reference_a_module: { code: 1147, category: ts.DiagnosticCategory.Error, key: "Import declarations in a namespace cannot reference a module." },
              Cannot_compile_modules_unless_the_module_flag_is_provided: { code: 1148, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules unless the '--module' flag is provided." },
              File_name_0_differs_from_already_included_file_name_1_only_in_casing: { code: 1149, category: ts.DiagnosticCategory.Error, key: "File name '{0}' differs from already included file name '{1}' only in casing" },
              new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead: { code: 1150, category: ts.DiagnosticCategory.Error, key: "'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead." },
              var_let_or_const_expected: { code: 1152, category: ts.DiagnosticCategory.Error, key: "'var', 'let' or 'const' expected." },
              let_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1153, category: ts.DiagnosticCategory.Error, key: "'let' declarations are only available when targeting ECMAScript 6 and higher." },
              const_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1154, category: ts.DiagnosticCategory.Error, key: "'const' declarations are only available when targeting ECMAScript 6 and higher." },
              const_declarations_must_be_initialized: { code: 1155, category: ts.DiagnosticCategory.Error, key: "'const' declarations must be initialized" },
              const_declarations_can_only_be_declared_inside_a_block: { code: 1156, category: ts.DiagnosticCategory.Error, key: "'const' declarations can only be declared inside a block." },
              let_declarations_can_only_be_declared_inside_a_block: { code: 1157, category: ts.DiagnosticCategory.Error, key: "'let' declarations can only be declared inside a block." },
              Unterminated_template_literal: { code: 1160, category: ts.DiagnosticCategory.Error, key: "Unterminated template literal." },
              Unterminated_regular_expression_literal: { code: 1161, category: ts.DiagnosticCategory.Error, key: "Unterminated regular expression literal." },
              An_object_member_cannot_be_declared_optional: { code: 1162, category: ts.DiagnosticCategory.Error, key: "An object member cannot be declared optional." },
              yield_expression_must_be_contained_within_a_generator_declaration: { code: 1163, category: ts.DiagnosticCategory.Error, key: "'yield' expression must be contained_within a generator declaration." },
              Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: ts.DiagnosticCategory.Error, key: "Computed property names are not allowed in enums." },
              A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol: { code: 1165, category: ts.DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in symbol." },
              A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol: { code: 1166, category: ts.DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in symbol." },
              Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1167, category: ts.DiagnosticCategory.Error, key: "Computed property names are only available when targeting ECMAScript 6 and higher." },
              A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol: { code: 1168, category: ts.DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in symbol." },
              A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol: { code: 1169, category: ts.DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in symbol." },
              A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol: { code: 1170, category: ts.DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in symbol." },
              A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: ts.DiagnosticCategory.Error, key: "A comma expression is not allowed in a computed property name." },
              extends_clause_already_seen: { code: 1172, category: ts.DiagnosticCategory.Error, key: "'extends' clause already seen." },
              extends_clause_must_precede_implements_clause: { code: 1173, category: ts.DiagnosticCategory.Error, key: "'extends' clause must precede 'implements' clause." },
              Classes_can_only_extend_a_single_class: { code: 1174, category: ts.DiagnosticCategory.Error, key: "Classes can only extend a single class." },
              implements_clause_already_seen: { code: 1175, category: ts.DiagnosticCategory.Error, key: "'implements' clause already seen." },
              Interface_declaration_cannot_have_implements_clause: { code: 1176, category: ts.DiagnosticCategory.Error, key: "Interface declaration cannot have 'implements' clause." },
              Binary_digit_expected: { code: 1177, category: ts.DiagnosticCategory.Error, key: "Binary digit expected." },
              Octal_digit_expected: { code: 1178, category: ts.DiagnosticCategory.Error, key: "Octal digit expected." },
              Unexpected_token_expected: { code: 1179, category: ts.DiagnosticCategory.Error, key: "Unexpected token. '{' expected." },
              Property_destructuring_pattern_expected: { code: 1180, category: ts.DiagnosticCategory.Error, key: "Property destructuring pattern expected." },
              Array_element_destructuring_pattern_expected: { code: 1181, category: ts.DiagnosticCategory.Error, key: "Array element destructuring pattern expected." },
              A_destructuring_declaration_must_have_an_initializer: { code: 1182, category: ts.DiagnosticCategory.Error, key: "A destructuring declaration must have an initializer." },
              Destructuring_declarations_are_not_allowed_in_ambient_contexts: { code: 1183, category: ts.DiagnosticCategory.Error, key: "Destructuring declarations are not allowed in ambient contexts." },
              An_implementation_cannot_be_declared_in_ambient_contexts: { code: 1184, category: ts.DiagnosticCategory.Error, key: "An implementation cannot be declared in ambient contexts." },
              Modifiers_cannot_appear_here: { code: 1184, category: ts.DiagnosticCategory.Error, key: "Modifiers cannot appear here." },
              Merge_conflict_marker_encountered: { code: 1185, category: ts.DiagnosticCategory.Error, key: "Merge conflict marker encountered." },
              A_rest_element_cannot_have_an_initializer: { code: 1186, category: ts.DiagnosticCategory.Error, key: "A rest element cannot have an initializer." },
              A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: ts.DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." },
              Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...of' statement." },
              The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: { code: 1189, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...in' statement cannot have an initializer." },
              The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: { code: 1190, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...of' statement cannot have an initializer." },
              An_import_declaration_cannot_have_modifiers: { code: 1191, category: ts.DiagnosticCategory.Error, key: "An import declaration cannot have modifiers." },
              Module_0_has_no_default_export: { code: 1192, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no default export." },
              An_export_declaration_cannot_have_modifiers: { code: 1193, category: ts.DiagnosticCategory.Error, key: "An export declaration cannot have modifiers." },
              Export_declarations_are_not_permitted_in_a_namespace: { code: 1194, category: ts.DiagnosticCategory.Error, key: "Export declarations are not permitted in a namespace." },
              Catch_clause_variable_name_must_be_an_identifier: { code: 1195, category: ts.DiagnosticCategory.Error, key: "Catch clause variable name must be an identifier." },
              Catch_clause_variable_cannot_have_a_type_annotation: { code: 1196, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have a type annotation." },
              Catch_clause_variable_cannot_have_an_initializer: { code: 1197, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have an initializer." },
              An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: { code: 1198, category: ts.DiagnosticCategory.Error, key: "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive." },
              Unterminated_Unicode_escape_sequence: { code: 1199, category: ts.DiagnosticCategory.Error, key: "Unterminated Unicode escape sequence." },
              Line_terminator_not_permitted_before_arrow: { code: 1200, category: ts.DiagnosticCategory.Error, key: "Line terminator not permitted before arrow." },
              Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead: { code: 1202, category: ts.DiagnosticCategory.Error, key: "Import assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'import * as ns from \"mod\"', 'import {a} from \"mod\"' or 'import d from \"mod\"' instead." },
              Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead: { code: 1203, category: ts.DiagnosticCategory.Error, key: "Export assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'export default' instead." },
              Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher: { code: 1204, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules into 'commonjs', 'amd', 'system' or 'umd' when targeting 'ES6' or higher." },
              Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1205, category: ts.DiagnosticCategory.Error, key: "Decorators are only available when targeting ECMAScript 5 and higher." },
              Decorators_are_not_valid_here: { code: 1206, category: ts.DiagnosticCategory.Error, key: "Decorators are not valid here." },
              Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: { code: 1207, category: ts.DiagnosticCategory.Error, key: "Decorators cannot be applied to multiple get/set accessors of the same name." },
              Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided: { code: 1208, category: ts.DiagnosticCategory.Error, key: "Cannot compile namespaces when the '--separateCompilation' flag is provided." },
              Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided: { code: 1209, category: ts.DiagnosticCategory.Error, key: "Ambient const enums are not allowed when the '--separateCompilation' flag is provided." },
              Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode: { code: 1210, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}'. Class definitions are automatically in strict mode." },
              A_class_declaration_without_the_default_modifier_must_have_a_name: { code: 1211, category: ts.DiagnosticCategory.Error, key: "A class declaration without the 'default' modifier must have a name" },
              Identifier_expected_0_is_a_reserved_word_in_strict_mode: { code: 1212, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode" },
              Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1213, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
              Type_expected_0_is_a_reserved_word_in_strict_mode: { code: 1215, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode" },
              Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1216, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
              Export_assignment_is_not_supported_when_module_flag_is_system: { code: 1218, category: ts.DiagnosticCategory.Error, key: "Export assignment is not supported when '--module' flag is 'system'." },
              Duplicate_identifier_0: { code: 2300, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
              Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: ts.DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
              Static_members_cannot_reference_class_type_parameters: { code: 2302, category: ts.DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },
              Circular_definition_of_import_alias_0: { code: 2303, category: ts.DiagnosticCategory.Error, key: "Circular definition of import alias '{0}'." },
              Cannot_find_name_0: { code: 2304, category: ts.DiagnosticCategory.Error, key: "Cannot find name '{0}'." },
              Module_0_has_no_exported_member_1: { code: 2305, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no exported member '{1}'." },
              File_0_is_not_a_module: { code: 2306, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not a module." },
              Cannot_find_module_0: { code: 2307, category: ts.DiagnosticCategory.Error, key: "Cannot find module '{0}'." },
              A_module_cannot_have_more_than_one_export_assignment: { code: 2308, category: ts.DiagnosticCategory.Error, key: "A module cannot have more than one export assignment." },
              An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: { code: 2309, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a module with other exported elements." },
              Type_0_recursively_references_itself_as_a_base_type: { code: 2310, category: ts.DiagnosticCategory.Error, key: "Type '{0}' recursively references itself as a base type." },
              A_class_may_only_extend_another_class: { code: 2311, category: ts.DiagnosticCategory.Error, key: "A class may only extend another class." },
              An_interface_may_only_extend_a_class_or_another_interface: { code: 2312, category: ts.DiagnosticCategory.Error, key: "An interface may only extend a class or another interface." },
              Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list: { code: 2313, category: ts.DiagnosticCategory.Error, key: "Constraint of a type parameter cannot reference any type parameter from the same type parameter list." },
              Generic_type_0_requires_1_type_argument_s: { code: 2314, category: ts.DiagnosticCategory.Error, key: "Generic type '{0}' requires {1} type argument(s)." },
              Type_0_is_not_generic: { code: 2315, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not generic." },
              Global_type_0_must_be_a_class_or_interface_type: { code: 2316, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must be a class or interface type." },
              Global_type_0_must_have_1_type_parameter_s: { code: 2317, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must have {1} type parameter(s)." },
              Cannot_find_global_type_0: { code: 2318, category: ts.DiagnosticCategory.Error, key: "Cannot find global type '{0}'." },
              Named_property_0_of_types_1_and_2_are_not_identical: { code: 2319, category: ts.DiagnosticCategory.Error, key: "Named property '{0}' of types '{1}' and '{2}' are not identical." },
              Interface_0_cannot_simultaneously_extend_types_1_and_2: { code: 2320, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'." },
              Excessive_stack_depth_comparing_types_0_and_1: { code: 2321, category: ts.DiagnosticCategory.Error, key: "Excessive stack depth comparing types '{0}' and '{1}'." },
              Type_0_is_not_assignable_to_type_1: { code: 2322, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not assignable to type '{1}'." },
              Property_0_is_missing_in_type_1: { code: 2324, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is missing in type '{1}'." },
              Property_0_is_private_in_type_1_but_not_in_type_2: { code: 2325, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private in type '{1}' but not in type '{2}'." },
              Types_of_property_0_are_incompatible: { code: 2326, category: ts.DiagnosticCategory.Error, key: "Types of property '{0}' are incompatible." },
              Property_0_is_optional_in_type_1_but_required_in_type_2: { code: 2327, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is optional in type '{1}' but required in type '{2}'." },
              Types_of_parameters_0_and_1_are_incompatible: { code: 2328, category: ts.DiagnosticCategory.Error, key: "Types of parameters '{0}' and '{1}' are incompatible." },
              Index_signature_is_missing_in_type_0: { code: 2329, category: ts.DiagnosticCategory.Error, key: "Index signature is missing in type '{0}'." },
              Index_signatures_are_incompatible: { code: 2330, category: ts.DiagnosticCategory.Error, key: "Index signatures are incompatible." },
              this_cannot_be_referenced_in_a_module_or_namespace_body: { code: 2331, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a module or namespace body." },
              this_cannot_be_referenced_in_current_location: { code: 2332, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in current location." },
              this_cannot_be_referenced_in_constructor_arguments: { code: 2333, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in constructor arguments." },
              this_cannot_be_referenced_in_a_static_property_initializer: { code: 2334, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a static property initializer." },
              super_can_only_be_referenced_in_a_derived_class: { code: 2335, category: ts.DiagnosticCategory.Error, key: "'super' can only be referenced in a derived class." },
              super_cannot_be_referenced_in_constructor_arguments: { code: 2336, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in constructor arguments." },
              Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: { code: 2337, category: ts.DiagnosticCategory.Error, key: "Super calls are not permitted outside constructors or in nested functions inside constructors" },
              super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: { code: 2338, category: ts.DiagnosticCategory.Error, key: "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class" },
              Property_0_does_not_exist_on_type_1: { code: 2339, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on type '{1}'." },
              Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: { code: 2340, category: ts.DiagnosticCategory.Error, key: "Only public and protected methods of the base class are accessible via the 'super' keyword" },
              Property_0_is_private_and_only_accessible_within_class_1: { code: 2341, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private and only accessible within class '{1}'." },
              An_index_expression_argument_must_be_of_type_string_number_symbol_or_any: { code: 2342, category: ts.DiagnosticCategory.Error, key: "An index expression argument must be of type 'string', 'number', 'symbol, or 'any'." },
              Type_0_does_not_satisfy_the_constraint_1: { code: 2344, category: ts.DiagnosticCategory.Error, key: "Type '{0}' does not satisfy the constraint '{1}'." },
              Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: { code: 2345, category: ts.DiagnosticCategory.Error, key: "Argument of type '{0}' is not assignable to parameter of type '{1}'." },
              Supplied_parameters_do_not_match_any_signature_of_call_target: { code: 2346, category: ts.DiagnosticCategory.Error, key: "Supplied parameters do not match any signature of call target." },
              Untyped_function_calls_may_not_accept_type_arguments: { code: 2347, category: ts.DiagnosticCategory.Error, key: "Untyped function calls may not accept type arguments." },
              Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: { code: 2348, category: ts.DiagnosticCategory.Error, key: "Value of type '{0}' is not callable. Did you mean to include 'new'?" },
              Cannot_invoke_an_expression_whose_type_lacks_a_call_signature: { code: 2349, category: ts.DiagnosticCategory.Error, key: "Cannot invoke an expression whose type lacks a call signature." },
              Only_a_void_function_can_be_called_with_the_new_keyword: { code: 2350, category: ts.DiagnosticCategory.Error, key: "Only a void function can be called with the 'new' keyword." },
              Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature: { code: 2351, category: ts.DiagnosticCategory.Error, key: "Cannot use 'new' with an expression whose type lacks a call or construct signature." },
              Neither_type_0_nor_type_1_is_assignable_to_the_other: { code: 2352, category: ts.DiagnosticCategory.Error, key: "Neither type '{0}' nor type '{1}' is assignable to the other." },
              No_best_common_type_exists_among_return_expressions: { code: 2354, category: ts.DiagnosticCategory.Error, key: "No best common type exists among return expressions." },
              A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2355, category: ts.DiagnosticCategory.Error, key: "A function whose declared type is neither 'void' nor 'any' must return a value or consist of a single 'throw' statement." },
              An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type: { code: 2356, category: ts.DiagnosticCategory.Error, key: "An arithmetic operand must be of type 'any', 'number' or an enum type." },
              The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer: { code: 2357, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator must be a variable, property or indexer." },
              The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2358, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter." },
              The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: { code: 2359, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type." },
              The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol: { code: 2360, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'." },
              The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2361, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter" },
              The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2362, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
              The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2363, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
              Invalid_left_hand_side_of_assignment_expression: { code: 2364, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side of assignment expression." },
              Operator_0_cannot_be_applied_to_types_1_and_2: { code: 2365, category: ts.DiagnosticCategory.Error, key: "Operator '{0}' cannot be applied to types '{1}' and '{2}'." },
              Type_parameter_name_cannot_be_0: { code: 2368, category: ts.DiagnosticCategory.Error, key: "Type parameter name cannot be '{0}'" },
              A_parameter_property_is_only_allowed_in_a_constructor_implementation: { code: 2369, category: ts.DiagnosticCategory.Error, key: "A parameter property is only allowed in a constructor implementation." },
              A_rest_parameter_must_be_of_an_array_type: { code: 2370, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be of an array type." },
              A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: { code: 2371, category: ts.DiagnosticCategory.Error, key: "A parameter initializer is only allowed in a function or constructor implementation." },
              Parameter_0_cannot_be_referenced_in_its_initializer: { code: 2372, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' cannot be referenced in its initializer." },
              Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it: { code: 2373, category: ts.DiagnosticCategory.Error, key: "Initializer of parameter '{0}' cannot reference identifier '{1}' declared after it." },
              Duplicate_string_index_signature: { code: 2374, category: ts.DiagnosticCategory.Error, key: "Duplicate string index signature." },
              Duplicate_number_index_signature: { code: 2375, category: ts.DiagnosticCategory.Error, key: "Duplicate number index signature." },
              A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties: { code: 2376, category: ts.DiagnosticCategory.Error, key: "A 'super' call must be the first statement in the constructor when a class contains initialized properties or has parameter properties." },
              Constructors_for_derived_classes_must_contain_a_super_call: { code: 2377, category: ts.DiagnosticCategory.Error, key: "Constructors for derived classes must contain a 'super' call." },
              A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2378, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor must return a value or consist of a single 'throw' statement." },
              Getter_and_setter_accessors_do_not_agree_in_visibility: { code: 2379, category: ts.DiagnosticCategory.Error, key: "Getter and setter accessors do not agree in visibility." },
              get_and_set_accessor_must_have_the_same_type: { code: 2380, category: ts.DiagnosticCategory.Error, key: "'get' and 'set' accessor must have the same type." },
              A_signature_with_an_implementation_cannot_use_a_string_literal_type: { code: 2381, category: ts.DiagnosticCategory.Error, key: "A signature with an implementation cannot use a string literal type." },
              Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature: { code: 2382, category: ts.DiagnosticCategory.Error, key: "Specialized overload signature is not assignable to any non-specialized signature." },
              Overload_signatures_must_all_be_exported_or_not_exported: { code: 2383, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be exported or not exported." },
              Overload_signatures_must_all_be_ambient_or_non_ambient: { code: 2384, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be ambient or non-ambient." },
              Overload_signatures_must_all_be_public_private_or_protected: { code: 2385, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be public, private or protected." },
              Overload_signatures_must_all_be_optional_or_required: { code: 2386, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be optional or required." },
              Function_overload_must_be_static: { code: 2387, category: ts.DiagnosticCategory.Error, key: "Function overload must be static." },
              Function_overload_must_not_be_static: { code: 2388, category: ts.DiagnosticCategory.Error, key: "Function overload must not be static." },
              Function_implementation_name_must_be_0: { code: 2389, category: ts.DiagnosticCategory.Error, key: "Function implementation name must be '{0}'." },
              Constructor_implementation_is_missing: { code: 2390, category: ts.DiagnosticCategory.Error, key: "Constructor implementation is missing." },
              Function_implementation_is_missing_or_not_immediately_following_the_declaration: { code: 2391, category: ts.DiagnosticCategory.Error, key: "Function implementation is missing or not immediately following the declaration." },
              Multiple_constructor_implementations_are_not_allowed: { code: 2392, category: ts.DiagnosticCategory.Error, key: "Multiple constructor implementations are not allowed." },
              Duplicate_function_implementation: { code: 2393, category: ts.DiagnosticCategory.Error, key: "Duplicate function implementation." },
              Overload_signature_is_not_compatible_with_function_implementation: { code: 2394, category: ts.DiagnosticCategory.Error, key: "Overload signature is not compatible with function implementation." },
              Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: { code: 2395, category: ts.DiagnosticCategory.Error, key: "Individual declarations in merged declaration {0} must be all exported or all local." },
              Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: { code: 2396, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters." },
              Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: { code: 2399, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference." },
              Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: { code: 2400, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference." },
              Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference: { code: 2401, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_super'. Compiler uses '_super' to capture base class reference." },
              Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: { code: 2402, category: ts.DiagnosticCategory.Error, key: "Expression resolves to '_super' that compiler uses to capture base class reference." },
              Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: { code: 2403, category: ts.DiagnosticCategory.Error, key: "Subsequent variable declarations must have the same type.  Variable '{0}' must be of type '{1}', but here has type '{2}'." },
              The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: { code: 2404, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot use a type annotation." },
              The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: { code: 2405, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'." },
              Invalid_left_hand_side_in_for_in_statement: { code: 2406, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...in' statement." },
              The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2407, category: ts.DiagnosticCategory.Error, key: "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter." },
              Setters_cannot_return_a_value: { code: 2408, category: ts.DiagnosticCategory.Error, key: "Setters cannot return a value." },
              Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: { code: 2409, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature must be assignable to the instance type of the class" },
              All_symbols_within_a_with_block_will_be_resolved_to_any: { code: 2410, category: ts.DiagnosticCategory.Error, key: "All symbols within a 'with' block will be resolved to 'any'." },
              Property_0_of_type_1_is_not_assignable_to_string_index_type_2: { code: 2411, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to string index type '{2}'." },
              Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2: { code: 2412, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to numeric index type '{2}'." },
              Numeric_index_type_0_is_not_assignable_to_string_index_type_1: { code: 2413, category: ts.DiagnosticCategory.Error, key: "Numeric index type '{0}' is not assignable to string index type '{1}'." },
              Class_name_cannot_be_0: { code: 2414, category: ts.DiagnosticCategory.Error, key: "Class name cannot be '{0}'" },
              Class_0_incorrectly_extends_base_class_1: { code: 2415, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly extends base class '{1}'." },
              Class_static_side_0_incorrectly_extends_base_class_static_side_1: { code: 2417, category: ts.DiagnosticCategory.Error, key: "Class static side '{0}' incorrectly extends base class static side '{1}'." },
              Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0: { code: 2419, category: ts.DiagnosticCategory.Error, key: "Type name '{0}' in extends clause does not reference constructor function for '{0}'." },
              Class_0_incorrectly_implements_interface_1: { code: 2420, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly implements interface '{1}'." },
              A_class_may_only_implement_another_class_or_interface: { code: 2422, category: ts.DiagnosticCategory.Error, key: "A class may only implement another class or interface." },
              Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: { code: 2423, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor." },
              Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property: { code: 2424, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member property." },
              Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2425, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function." },
              Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2426, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function." },
              Interface_name_cannot_be_0: { code: 2427, category: ts.DiagnosticCategory.Error, key: "Interface name cannot be '{0}'" },
              All_declarations_of_an_interface_must_have_identical_type_parameters: { code: 2428, category: ts.DiagnosticCategory.Error, key: "All declarations of an interface must have identical type parameters." },
              Interface_0_incorrectly_extends_interface_1: { code: 2430, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' incorrectly extends interface '{1}'." },
              Enum_name_cannot_be_0: { code: 2431, category: ts.DiagnosticCategory.Error, key: "Enum name cannot be '{0}'" },
              In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: { code: 2432, category: ts.DiagnosticCategory.Error, key: "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element." },
              A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: { code: 2433, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be in a different file from a class or function with which it is merged" },
              A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: { code: 2434, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be located prior to a class or function with which it is merged" },
              Ambient_modules_cannot_be_nested_in_other_modules: { code: 2435, category: ts.DiagnosticCategory.Error, key: "Ambient modules cannot be nested in other modules." },
              Ambient_module_declaration_cannot_specify_relative_module_name: { code: 2436, category: ts.DiagnosticCategory.Error, key: "Ambient module declaration cannot specify relative module name." },
              Module_0_is_hidden_by_a_local_declaration_with_the_same_name: { code: 2437, category: ts.DiagnosticCategory.Error, key: "Module '{0}' is hidden by a local declaration with the same name" },
              Import_name_cannot_be_0: { code: 2438, category: ts.DiagnosticCategory.Error, key: "Import name cannot be '{0}'" },
              Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: { code: 2439, category: ts.DiagnosticCategory.Error, key: "Import or export declaration in an ambient module declaration cannot reference module through relative module name." },
              Import_declaration_conflicts_with_local_declaration_of_0: { code: 2440, category: ts.DiagnosticCategory.Error, key: "Import declaration conflicts with local declaration of '{0}'" },
              Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: { code: 2441, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module." },
              Types_have_separate_declarations_of_a_private_property_0: { code: 2442, category: ts.DiagnosticCategory.Error, key: "Types have separate declarations of a private property '{0}'." },
              Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: { code: 2443, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'." },
              Property_0_is_protected_in_type_1_but_public_in_type_2: { code: 2444, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected in type '{1}' but public in type '{2}'." },
              Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: { code: 2445, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible within class '{1}' and its subclasses." },
              Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1: { code: 2446, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible through an instance of class '{1}'." },
              The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: { code: 2447, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead." },
              Block_scoped_variable_0_used_before_its_declaration: { code: 2448, category: ts.DiagnosticCategory.Error, key: "Block-scoped variable '{0}' used before its declaration." },
              The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant: { code: 2449, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator cannot be a constant." },
              Left_hand_side_of_assignment_expression_cannot_be_a_constant: { code: 2450, category: ts.DiagnosticCategory.Error, key: "Left-hand side of assignment expression cannot be a constant." },
              Cannot_redeclare_block_scoped_variable_0: { code: 2451, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare block-scoped variable '{0}'." },
              An_enum_member_cannot_have_a_numeric_name: { code: 2452, category: ts.DiagnosticCategory.Error, key: "An enum member cannot have a numeric name." },
              The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly: { code: 2453, category: ts.DiagnosticCategory.Error, key: "The type argument for type parameter '{0}' cannot be inferred from the usage. Consider specifying the type arguments explicitly." },
              Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0: { code: 2455, category: ts.DiagnosticCategory.Error, key: "Type argument candidate '{1}' is not a valid type argument because it is not a supertype of candidate '{0}'." },
              Type_alias_0_circularly_references_itself: { code: 2456, category: ts.DiagnosticCategory.Error, key: "Type alias '{0}' circularly references itself." },
              Type_alias_name_cannot_be_0: { code: 2457, category: ts.DiagnosticCategory.Error, key: "Type alias name cannot be '{0}'" },
              An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: ts.DiagnosticCategory.Error, key: "An AMD module cannot have multiple name assignments." },
              Type_0_has_no_property_1_and_no_string_index_signature: { code: 2459, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}' and no string index signature." },
              Type_0_has_no_property_1: { code: 2460, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}'." },
              Type_0_is_not_an_array_type: { code: 2461, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type." },
              A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: ts.DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" },
              A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: ts.DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." },
              A_computed_property_name_must_be_of_type_string_number_symbol_or_any: { code: 2464, category: ts.DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'symbol', or 'any'." },
              this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." },
              super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." },
              A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: ts.DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." },
              Cannot_find_global_value_0: { code: 2468, category: ts.DiagnosticCategory.Error, key: "Cannot find global value '{0}'." },
              The_0_operator_cannot_be_applied_to_type_symbol: { code: 2469, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to type 'symbol'." },
              Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: ts.DiagnosticCategory.Error, key: "'Symbol' reference does not refer to the global Symbol constructor object." },
              A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: ts.DiagnosticCategory.Error, key: "A computed property name of the form '{0}' must be of type 'symbol'." },
              Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher: { code: 2472, category: ts.DiagnosticCategory.Error, key: "Spread operator in 'new' expressions is only available when targeting ECMAScript 6 and higher." },
              Enum_declarations_must_all_be_const_or_non_const: { code: 2473, category: ts.DiagnosticCategory.Error, key: "Enum declarations must all be const or non-const." },
              In_const_enum_declarations_member_initializer_must_be_constant_expression: { code: 2474, category: ts.DiagnosticCategory.Error, key: "In 'const' enum declarations member initializer must be constant expression." },
              const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment: { code: 2475, category: ts.DiagnosticCategory.Error, key: "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment." },
              A_const_enum_member_can_only_be_accessed_using_a_string_literal: { code: 2476, category: ts.DiagnosticCategory.Error, key: "A const enum member can only be accessed using a string literal." },
              const_enum_member_initializer_was_evaluated_to_a_non_finite_value: { code: 2477, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to a non-finite value." },
              const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: { code: 2478, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to disallowed value 'NaN'." },
              Property_0_does_not_exist_on_const_enum_1: { code: 2479, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." },
              let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2480, category: ts.DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." },
              Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2481, category: ts.DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." },
              The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." },
              Export_declaration_conflicts_with_exported_declaration_of_0: { code: 2484, category: ts.DiagnosticCategory.Error, key: "Export declaration conflicts with exported declaration of '{0}'" },
              The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant: { code: 2485, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot be a previously defined constant." },
              The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant: { code: 2486, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a previously defined constant." },
              Invalid_left_hand_side_in_for_of_statement: { code: 2487, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...of' statement." },
              Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: ts.DiagnosticCategory.Error, key: "Type must have a '[Symbol.iterator]()' method that returns an iterator." },
              An_iterator_must_have_a_next_method: { code: 2489, category: ts.DiagnosticCategory.Error, key: "An iterator must have a 'next()' method." },
              The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property: { code: 2490, category: ts.DiagnosticCategory.Error, key: "The type returned by the 'next()' method of an iterator must have a 'value' property." },
              The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." },
              Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" },
              Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: ts.DiagnosticCategory.Error, key: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." },
              Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: ts.DiagnosticCategory.Error, key: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." },
              Type_0_is_not_an_array_type_or_a_string_type: { code: 2495, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type or a string type." },
              The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: { code: 2496, category: ts.DiagnosticCategory.Error, key: "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression." },
              Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct: { code: 2497, category: ts.DiagnosticCategory.Error, key: "Module '{0}' resolves to a non-module entity and cannot be imported using this construct." },
              Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: { code: 2498, category: ts.DiagnosticCategory.Error, key: "Module '{0}' uses 'export =' and cannot be used with 'export *'." },
              An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2499, category: ts.DiagnosticCategory.Error, key: "An interface can only extend an identifier/qualified-name with optional type arguments." },
              A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2500, category: ts.DiagnosticCategory.Error, key: "A class can only implement an identifier/qualified-name with optional type arguments." },
              A_rest_element_cannot_contain_a_binding_pattern: { code: 2501, category: ts.DiagnosticCategory.Error, key: "A rest element cannot contain a binding pattern." },
              _0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: { code: 2502, category: ts.DiagnosticCategory.Error, key: "'{0}' is referenced directly or indirectly in its own type annotation." },
              Cannot_find_namespace_0: { code: 2503, category: ts.DiagnosticCategory.Error, key: "Cannot find namespace '{0}'." },
              Import_declaration_0_is_using_private_name_1: { code: 4000, category: ts.DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
              Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
              Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4006, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4008, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4010, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
              Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4012, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public method from exported class has or is using private name '{1}'." },
              Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4014, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of method from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4016, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported function has or is using private name '{1}'." },
              Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4019, category: ts.DiagnosticCategory.Error, key: "Implements clause of exported class '{0}' has or is using private name '{1}'." },
              Extends_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4020, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported class '{0}' has or is using private name '{1}'." },
              Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: { code: 4022, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported interface '{0}' has or is using private name '{1}'." },
              Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4023, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named." },
              Exported_variable_0_has_or_is_using_name_1_from_private_module_2: { code: 4024, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from private module '{2}'." },
              Exported_variable_0_has_or_is_using_private_name_1: { code: 4025, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using private name '{1}'." },
              Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4026, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4027, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
              Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4028, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using private name '{1}'." },
              Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4029, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4030, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
              Public_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4031, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using private name '{1}'." },
              Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4032, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'." },
              Property_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4033, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using private name '{1}'." },
              Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4034, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4035, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using private name '{1}'." },
              Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4036, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4037, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using private name '{1}'." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4038, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4039, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4040, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using private name '{0}'." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4041, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4042, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4043, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using private name '{0}'." },
              Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4044, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4045, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using private name '{0}'." },
              Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4046, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4047, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using private name '{0}'." },
              Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4048, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4049, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using private name '{0}'." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4050, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4051, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: { code: 4052, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using private name '{0}'." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4053, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4054, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: { code: 4055, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using private name '{0}'." },
              Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4056, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: { code: 4057, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using private name '{0}'." },
              Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4058, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: { code: 4059, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from private module '{1}'." },
              Return_type_of_exported_function_has_or_is_using_private_name_0: { code: 4060, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using private name '{0}'." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4061, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4062, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: { code: 4063, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using private name '{1}'." },
              Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4064, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4065, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
              Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4066, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4067, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4068, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4069, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4070, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4071, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4072, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4073, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using private name '{1}'." },
              Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4074, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4075, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using private name '{1}'." },
              Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4076, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: { code: 4077, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4078, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using private name '{1}'." },
              Exported_type_alias_0_has_or_is_using_private_name_1: { code: 4081, category: ts.DiagnosticCategory.Error, key: "Exported type alias '{0}' has or is using private name '{1}'." },
              Default_export_of_the_module_has_or_is_using_private_name_0: { code: 4082, category: ts.DiagnosticCategory.Error, key: "Default export of the module has or is using private name '{0}'." },
              Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher: { code: 4091, category: ts.DiagnosticCategory.Error, key: "Loop contains block-scoped variable '{0}' referenced by a function in the loop. This is only supported in ECMAScript 6 or higher." },
              The_current_host_does_not_support_the_0_option: { code: 5001, category: ts.DiagnosticCategory.Error, key: "The current host does not support the '{0}' option." },
              Cannot_find_the_common_subdirectory_path_for_the_input_files: { code: 5009, category: ts.DiagnosticCategory.Error, key: "Cannot find the common subdirectory path for the input files." },
              Cannot_read_file_0_Colon_1: { code: 5012, category: ts.DiagnosticCategory.Error, key: "Cannot read file '{0}': {1}" },
              Unsupported_file_encoding: { code: 5013, category: ts.DiagnosticCategory.Error, key: "Unsupported file encoding." },
              Failed_to_parse_file_0_Colon_1: { code: 5014, category: ts.DiagnosticCategory.Error, key: "Failed to parse file '{0}': {1}." },
              Unknown_compiler_option_0: { code: 5023, category: ts.DiagnosticCategory.Error, key: "Unknown compiler option '{0}'." },
              Compiler_option_0_requires_a_value_of_type_1: { code: 5024, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' requires a value of type {1}." },
              Could_not_write_file_0_Colon_1: { code: 5033, category: ts.DiagnosticCategory.Error, key: "Could not write file '{0}': {1}" },
              Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5038, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified without specifying 'sourceMap' option." },
              Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5039, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified without specifying 'sourceMap' option." },
              Option_noEmit_cannot_be_specified_with_option_out_or_outDir: { code: 5040, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'out' or 'outDir'." },
              Option_noEmit_cannot_be_specified_with_option_declaration: { code: 5041, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'declaration'." },
              Option_project_cannot_be_mixed_with_source_files_on_a_command_line: { code: 5042, category: ts.DiagnosticCategory.Error, key: "Option 'project' cannot be mixed with source files on a command line." },
              Option_sourceMap_cannot_be_specified_with_option_separateCompilation: { code: 5043, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'separateCompilation'." },
              Option_declaration_cannot_be_specified_with_option_separateCompilation: { code: 5044, category: ts.DiagnosticCategory.Error, key: "Option 'declaration' cannot be specified with option 'separateCompilation'." },
              Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation: { code: 5045, category: ts.DiagnosticCategory.Error, key: "Option 'noEmitOnError' cannot be specified with option 'separateCompilation'." },
              Option_out_cannot_be_specified_with_option_separateCompilation: { code: 5046, category: ts.DiagnosticCategory.Error, key: "Option 'out' cannot be specified with option 'separateCompilation'." },
              Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher: { code: 5047, category: ts.DiagnosticCategory.Error, key: "Option 'separateCompilation' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher." },
              Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap: { code: 5048, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'inlineSourceMap'." },
              Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5049, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'." },
              Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5050, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified with option 'inlineSourceMap'." },
              Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: ts.DiagnosticCategory.Error, key: "Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
              Concatenate_and_emit_output_to_single_file: { code: 6001, category: ts.DiagnosticCategory.Message, key: "Concatenate and emit output to single file." },
              Generates_corresponding_d_ts_file: { code: 6002, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.d.ts' file." },
              Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate map files instead of generated locations." },
              Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: { code: 6004, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate TypeScript files instead of source locations." },
              Watch_input_files: { code: 6005, category: ts.DiagnosticCategory.Message, key: "Watch input files." },
              Redirect_output_structure_to_the_directory: { code: 6006, category: ts.DiagnosticCategory.Message, key: "Redirect output structure to the directory." },
              Do_not_erase_const_enum_declarations_in_generated_code: { code: 6007, category: ts.DiagnosticCategory.Message, key: "Do not erase const enum declarations in generated code." },
              Do_not_emit_outputs_if_any_errors_were_reported: { code: 6008, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs if any errors were reported." },
              Do_not_emit_comments_to_output: { code: 6009, category: ts.DiagnosticCategory.Message, key: "Do not emit comments to output." },
              Do_not_emit_outputs: { code: 6010, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs." },
              Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental: { code: 6015, category: ts.DiagnosticCategory.Message, key: "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES6' (experimental)" },
              Specify_module_code_generation_Colon_commonjs_amd_system_or_umd: { code: 6016, category: ts.DiagnosticCategory.Message, key: "Specify module code generation: 'commonjs', 'amd', 'system' or 'umd'" },
              Print_this_message: { code: 6017, category: ts.DiagnosticCategory.Message, key: "Print this message." },
              Print_the_compiler_s_version: { code: 6019, category: ts.DiagnosticCategory.Message, key: "Print the compiler's version." },
              Compile_the_project_in_the_given_directory: { code: 6020, category: ts.DiagnosticCategory.Message, key: "Compile the project in the given directory." },
              Syntax_Colon_0: { code: 6023, category: ts.DiagnosticCategory.Message, key: "Syntax: {0}" },
              options: { code: 6024, category: ts.DiagnosticCategory.Message, key: "options" },
              file: { code: 6025, category: ts.DiagnosticCategory.Message, key: "file" },
              Examples_Colon_0: { code: 6026, category: ts.DiagnosticCategory.Message, key: "Examples: {0}" },
              Options_Colon: { code: 6027, category: ts.DiagnosticCategory.Message, key: "Options:" },
              Version_0: { code: 6029, category: ts.DiagnosticCategory.Message, key: "Version {0}" },
              Insert_command_line_options_and_files_from_a_file: { code: 6030, category: ts.DiagnosticCategory.Message, key: "Insert command line options and files from a file." },
              File_change_detected_Starting_incremental_compilation: { code: 6032, category: ts.DiagnosticCategory.Message, key: "File change detected. Starting incremental compilation..." },
              KIND: { code: 6034, category: ts.DiagnosticCategory.Message, key: "KIND" },
              FILE: { code: 6035, category: ts.DiagnosticCategory.Message, key: "FILE" },
              VERSION: { code: 6036, category: ts.DiagnosticCategory.Message, key: "VERSION" },
              LOCATION: { code: 6037, category: ts.DiagnosticCategory.Message, key: "LOCATION" },
              DIRECTORY: { code: 6038, category: ts.DiagnosticCategory.Message, key: "DIRECTORY" },
              Compilation_complete_Watching_for_file_changes: { code: 6042, category: ts.DiagnosticCategory.Message, key: "Compilation complete. Watching for file changes." },
              Generates_corresponding_map_file: { code: 6043, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.map' file." },
              Compiler_option_0_expects_an_argument: { code: 6044, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' expects an argument." },
              Unterminated_quoted_string_in_response_file_0: { code: 6045, category: ts.DiagnosticCategory.Error, key: "Unterminated quoted string in response file '{0}'." },
              Argument_for_module_option_must_be_commonjs_amd_system_or_umd: { code: 6046, category: ts.DiagnosticCategory.Error, key: "Argument for '--module' option must be 'commonjs', 'amd', 'system' or 'umd'." },
              Argument_for_target_option_must_be_ES3_ES5_or_ES6: { code: 6047, category: ts.DiagnosticCategory.Error, key: "Argument for '--target' option must be 'ES3', 'ES5', or 'ES6'." },
              Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: { code: 6048, category: ts.DiagnosticCategory.Error, key: "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'." },
              Unsupported_locale_0: { code: 6049, category: ts.DiagnosticCategory.Error, key: "Unsupported locale '{0}'." },
              Unable_to_open_file_0: { code: 6050, category: ts.DiagnosticCategory.Error, key: "Unable to open file '{0}'." },
              Corrupted_locale_file_0: { code: 6051, category: ts.DiagnosticCategory.Error, key: "Corrupted locale file {0}." },
              Raise_error_on_expressions_and_declarations_with_an_implied_any_type: { code: 6052, category: ts.DiagnosticCategory.Message, key: "Raise error on expressions and declarations with an implied 'any' type." },
              File_0_not_found: { code: 6053, category: ts.DiagnosticCategory.Error, key: "File '{0}' not found." },
              File_0_has_unsupported_extension_The_only_supported_extensions_are_1: { code: 6054, category: ts.DiagnosticCategory.Error, key: "File '{0}' has unsupported extension. The only supported extensions are {1}." },
              Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: ts.DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
              Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: ts.DiagnosticCategory.Message, key: "Do not emit declarations for code that has an '@internal' annotation." },
              Preserve_new_lines_when_emitting_code: { code: 6057, category: ts.DiagnosticCategory.Message, key: "Preserve new-lines when emitting code." },
              Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: { code: 6058, category: ts.DiagnosticCategory.Message, key: "Specifies the root directory of input files. Use to control the output directory structure with --outDir." },
              File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: { code: 6059, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files." },
              Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: { code: 6060, category: ts.DiagnosticCategory.Message, key: "Specifies the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)." },
              NEWLINE: { code: 6061, category: ts.DiagnosticCategory.Message, key: "NEWLINE" },
              Argument_for_newLine_option_must_be_CRLF_or_LF: { code: 6062, category: ts.DiagnosticCategory.Error, key: "Argument for '--newLine' option must be 'CRLF' or 'LF'." },
              Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
              Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
              Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
              new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: { code: 7009, category: ts.DiagnosticCategory.Error, key: "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type." },
              _0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: { code: 7010, category: ts.DiagnosticCategory.Error, key: "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type." },
              Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: { code: 7011, category: ts.DiagnosticCategory.Error, key: "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type." },
              Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7013, category: ts.DiagnosticCategory.Error, key: "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type." },
              Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation: { code: 7016, category: ts.DiagnosticCategory.Error, key: "Property '{0}' implicitly has type 'any', because its 'set' accessor lacks a type annotation." },
              Index_signature_of_object_type_implicitly_has_an_any_type: { code: 7017, category: ts.DiagnosticCategory.Error, key: "Index signature of object type implicitly has an 'any' type." },
              Object_literal_s_property_0_implicitly_has_an_1_type: { code: 7018, category: ts.DiagnosticCategory.Error, key: "Object literal's property '{0}' implicitly has an '{1}' type." },
              Rest_parameter_0_implicitly_has_an_any_type: { code: 7019, category: ts.DiagnosticCategory.Error, key: "Rest parameter '{0}' implicitly has an 'any[]' type." },
              Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7020, category: ts.DiagnosticCategory.Error, key: "Call signature, which lacks return-type annotation, implicitly has an 'any' return type." },
              _0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: { code: 7022, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer." },
              _0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7023, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
              Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7024, category: ts.DiagnosticCategory.Error, key: "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
              You_cannot_rename_this_element: { code: 8000, category: ts.DiagnosticCategory.Error, key: "You cannot rename this element." },
              You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: { code: 8001, category: ts.DiagnosticCategory.Error, key: "You cannot rename elements that are defined in the standard TypeScript library." },
              import_can_only_be_used_in_a_ts_file: { code: 8002, category: ts.DiagnosticCategory.Error, key: "'import ... =' can only be used in a .ts file." },
              export_can_only_be_used_in_a_ts_file: { code: 8003, category: ts.DiagnosticCategory.Error, key: "'export=' can only be used in a .ts file." },
              type_parameter_declarations_can_only_be_used_in_a_ts_file: { code: 8004, category: ts.DiagnosticCategory.Error, key: "'type parameter declarations' can only be used in a .ts file." },
              implements_clauses_can_only_be_used_in_a_ts_file: { code: 8005, category: ts.DiagnosticCategory.Error, key: "'implements clauses' can only be used in a .ts file." },
              interface_declarations_can_only_be_used_in_a_ts_file: { code: 8006, category: ts.DiagnosticCategory.Error, key: "'interface declarations' can only be used in a .ts file." },
              module_declarations_can_only_be_used_in_a_ts_file: { code: 8007, category: ts.DiagnosticCategory.Error, key: "'module declarations' can only be used in a .ts file." },
              type_aliases_can_only_be_used_in_a_ts_file: { code: 8008, category: ts.DiagnosticCategory.Error, key: "'type aliases' can only be used in a .ts file." },
              _0_can_only_be_used_in_a_ts_file: { code: 8009, category: ts.DiagnosticCategory.Error, key: "'{0}' can only be used in a .ts file." },
              types_can_only_be_used_in_a_ts_file: { code: 8010, category: ts.DiagnosticCategory.Error, key: "'types' can only be used in a .ts file." },
              type_arguments_can_only_be_used_in_a_ts_file: { code: 8011, category: ts.DiagnosticCategory.Error, key: "'type arguments' can only be used in a .ts file." },
              parameter_modifiers_can_only_be_used_in_a_ts_file: { code: 8012, category: ts.DiagnosticCategory.Error, key: "'parameter modifiers' can only be used in a .ts file." },
              can_only_be_used_in_a_ts_file: { code: 8013, category: ts.DiagnosticCategory.Error, key: "'?' can only be used in a .ts file." },
              property_declarations_can_only_be_used_in_a_ts_file: { code: 8014, category: ts.DiagnosticCategory.Error, key: "'property declarations' can only be used in a .ts file." },
              enum_declarations_can_only_be_used_in_a_ts_file: { code: 8015, category: ts.DiagnosticCategory.Error, key: "'enum declarations' can only be used in a .ts file." },
              type_assertion_expressions_can_only_be_used_in_a_ts_file: { code: 8016, category: ts.DiagnosticCategory.Error, key: "'type assertion expressions' can only be used in a .ts file." },
              decorators_can_only_be_used_in_a_ts_file: { code: 8017, category: ts.DiagnosticCategory.Error, key: "'decorators' can only be used in a .ts file." },
              yield_expressions_are_not_currently_supported: { code: 9000, category: ts.DiagnosticCategory.Error, key: "'yield' expressions are not currently supported." },
              Generators_are_not_currently_supported: { code: 9001, category: ts.DiagnosticCategory.Error, key: "Generators are not currently supported." },
              Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses: { code: 9002, category: ts.DiagnosticCategory.Error, key: "Only identifiers/qualified-names with optional type arguments are currently supported in a class 'extends' clauses." },
              class_expressions_are_not_currently_supported: { code: 9003, category: ts.DiagnosticCategory.Error, key: "'class' expressions are not currently supported." },
              class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration: { code: 9004, category: ts.DiagnosticCategory.Error, key: "'class' declarations are only supported directly inside a module or as a top level declaration." }
          };
      })(ts || (ts = {}));
      /// <reference path="core.ts"/>
      /// <reference path="diagnosticInformationMap.generated.ts"/>
      var ts;
      (function (ts) {
          var textToToken = {
              "any": 112,
              "as": 111,
              "boolean": 113,
              "break": 66,
              "case": 67,
              "catch": 68,
              "class": 69,
              "continue": 71,
              "const": 70,
              "constructor": 114,
              "debugger": 72,
              "declare": 115,
              "default": 73,
              "delete": 74,
              "do": 75,
              "else": 76,
              "enum": 77,
              "export": 78,
              "extends": 79,
              "false": 80,
              "finally": 81,
              "for": 82,
              "from": 125,
              "function": 83,
              "get": 116,
              "if": 84,
              "implements": 102,
              "import": 85,
              "in": 86,
              "instanceof": 87,
              "interface": 103,
              "let": 104,
              "module": 117,
              "namespace": 118,
              "new": 88,
              "null": 89,
              "number": 120,
              "package": 105,
              "private": 106,
              "protected": 107,
              "public": 108,
              "require": 119,
              "return": 90,
              "set": 121,
              "static": 109,
              "string": 122,
              "super": 91,
              "switch": 92,
              "symbol": 123,
              "this": 93,
              "throw": 94,
              "true": 95,
              "try": 96,
              "type": 124,
              "typeof": 97,
              "var": 98,
              "void": 99,
              "while": 100,
              "with": 101,
              "yield": 110,
              "of": 126,
              "{": 14,
              "}": 15,
              "(": 16,
              ")": 17,
              "[": 18,
              "]": 19,
              ".": 20,
              "...": 21,
              ";": 22,
              ",": 23,
              "<": 24,
              ">": 25,
              "<=": 26,
              ">=": 27,
              "==": 28,
              "!=": 29,
              "===": 30,
              "!==": 31,
              "=>": 32,
              "+": 33,
              "-": 34,
              "*": 35,
              "/": 36,
              "%": 37,
              "++": 38,
              "--": 39,
              "<<": 40,
              ">>": 41,
              ">>>": 42,
              "&": 43,
              "|": 44,
              "^": 45,
              "!": 46,
              "~": 47,
              "&&": 48,
              "||": 49,
              "?": 50,
              ":": 51,
              "=": 53,
              "+=": 54,
              "-=": 55,
              "*=": 56,
              "/=": 57,
              "%=": 58,
              "<<=": 59,
              ">>=": 60,
              ">>>=": 61,
              "&=": 62,
              "|=": 63,
              "^=": 64,
              "@": 52
          };
          var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          function lookupInUnicodeMap(code, map) {
              if (code < map[0]) {
                  return false;
              }
              var lo = 0;
              var hi = map.length;
              var mid;
              while (lo + 1 < hi) {
                  mid = lo + (hi - lo) / 2;
                  mid -= mid % 2;
                  if (map[mid] <= code && code <= map[mid + 1]) {
                      return true;
                  }
                  if (code < map[mid]) {
                      hi = mid;
                  }
                  else {
                      lo = mid + 2;
                  }
              }
              return false;
          }
          function isUnicodeIdentifierStart(code, languageVersion) {
              return languageVersion >= 1 ?
                  lookupInUnicodeMap(code, unicodeES5IdentifierStart) :
                  lookupInUnicodeMap(code, unicodeES3IdentifierStart);
          }
          ts.isUnicodeIdentifierStart = isUnicodeIdentifierStart;
          function isUnicodeIdentifierPart(code, languageVersion) {
              return languageVersion >= 1 ?
                  lookupInUnicodeMap(code, unicodeES5IdentifierPart) :
                  lookupInUnicodeMap(code, unicodeES3IdentifierPart);
          }
          function makeReverseMap(source) {
              var result = [];
              for (var name_2 in source) {
                  if (source.hasOwnProperty(name_2)) {
                      result[source[name_2]] = name_2;
                  }
              }
              return result;
          }
          var tokenStrings = makeReverseMap(textToToken);
          function tokenToString(t) {
              return tokenStrings[t];
          }
          ts.tokenToString = tokenToString;
          function stringToToken(s) {
              return textToToken[s];
          }
          ts.stringToToken = stringToToken;
          function computeLineStarts(text) {
              var result = new Array();
              var pos = 0;
              var lineStart = 0;
              while (pos < text.length) {
                  var ch = text.charCodeAt(pos++);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                      case 10:
                          result.push(lineStart);
                          lineStart = pos;
                          break;
                      default:
                          if (ch > 127 && isLineBreak(ch)) {
                              result.push(lineStart);
                              lineStart = pos;
                          }
                          break;
                  }
              }
              result.push(lineStart);
              return result;
          }
          ts.computeLineStarts = computeLineStarts;
          function getPositionOfLineAndCharacter(sourceFile, line, character) {
              return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character);
          }
          ts.getPositionOfLineAndCharacter = getPositionOfLineAndCharacter;
          function computePositionOfLineAndCharacter(lineStarts, line, character) {
              ts.Debug.assert(line >= 0 && line < lineStarts.length);
              return lineStarts[line] + character;
          }
          ts.computePositionOfLineAndCharacter = computePositionOfLineAndCharacter;
          function getLineStarts(sourceFile) {
              return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
          }
          ts.getLineStarts = getLineStarts;
          function computeLineAndCharacterOfPosition(lineStarts, position) {
              var lineNumber = ts.binarySearch(lineStarts, position);
              if (lineNumber < 0) {
                  lineNumber = ~lineNumber - 1;
              }
              return {
                  line: lineNumber,
                  character: position - lineStarts[lineNumber]
              };
          }
          ts.computeLineAndCharacterOfPosition = computeLineAndCharacterOfPosition;
          function getLineAndCharacterOfPosition(sourceFile, position) {
              return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
          }
          ts.getLineAndCharacterOfPosition = getLineAndCharacterOfPosition;
          var hasOwnProperty = Object.prototype.hasOwnProperty;
          function isWhiteSpace(ch) {
              return ch === 32 ||
                  ch === 9 ||
                  ch === 11 ||
                  ch === 12 ||
                  ch === 160 ||
                  ch === 133 ||
                  ch === 5760 ||
                  ch >= 8192 && ch <= 8203 ||
                  ch === 8239 ||
                  ch === 8287 ||
                  ch === 12288 ||
                  ch === 65279;
          }
          ts.isWhiteSpace = isWhiteSpace;
          function isLineBreak(ch) {
              // ES5 7.3:
              // The ECMAScript line terminator characters are listed in Table 3.
              //     Table 3: Line Terminator Characters
              //     Code Unit Value     Name                    Formal Name
              //     \u000A              Line Feed               <LF>
              //     \u000D              Carriage Return         <CR>
              //     \u2028              Line separator          <LS>
              //     \u2029              Paragraph separator     <PS>
              // Only the characters in Table 3 are treated as line terminators. Other new line or line 
              // breaking characters are treated as white space but not as line terminators. 
              return ch === 10 ||
                  ch === 13 ||
                  ch === 8232 ||
                  ch === 8233;
          }
          ts.isLineBreak = isLineBreak;
          function isDigit(ch) {
              return ch >= 48 && ch <= 57;
          }
          function isOctalDigit(ch) {
              return ch >= 48 && ch <= 55;
          }
          ts.isOctalDigit = isOctalDigit;
          function skipTrivia(text, pos, stopAfterLineBreak) {
              while (true) {
                  var ch = text.charCodeAt(pos);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos + 1) === 10) {
                              pos++;
                          }
                      case 10:
                          pos++;
                          if (stopAfterLineBreak) {
                              return pos;
                          }
                          continue;
                      case 9:
                      case 11:
                      case 12:
                      case 32:
                          pos++;
                          continue;
                      case 47:
                          if (text.charCodeAt(pos + 1) === 47) {
                              pos += 2;
                              while (pos < text.length) {
                                  if (isLineBreak(text.charCodeAt(pos))) {
                                      break;
                                  }
                                  pos++;
                              }
                              continue;
                          }
                          if (text.charCodeAt(pos + 1) === 42) {
                              pos += 2;
                              while (pos < text.length) {
                                  if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                                      pos += 2;
                                      break;
                                  }
                                  pos++;
                              }
                              continue;
                          }
                          break;
                      case 60:
                      case 61:
                      case 62:
                          if (isConflictMarkerTrivia(text, pos)) {
                              pos = scanConflictMarkerTrivia(text, pos);
                              continue;
                          }
                          break;
                      default:
                          if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
                              pos++;
                              continue;
                          }
                          break;
                  }
                  return pos;
              }
          }
          ts.skipTrivia = skipTrivia;
          var mergeConflictMarkerLength = "<<<<<<<".length;
          function isConflictMarkerTrivia(text, pos) {
              ts.Debug.assert(pos >= 0);
              if (pos === 0 || isLineBreak(text.charCodeAt(pos - 1))) {
                  var ch = text.charCodeAt(pos);
                  if ((pos + mergeConflictMarkerLength) < text.length) {
                      for (var i = 0, n = mergeConflictMarkerLength; i < n; i++) {
                          if (text.charCodeAt(pos + i) !== ch) {
                              return false;
                          }
                      }
                      return ch === 61 ||
                          text.charCodeAt(pos + mergeConflictMarkerLength) === 32;
                  }
              }
              return false;
          }
          function scanConflictMarkerTrivia(text, pos, error) {
              if (error) {
                  error(ts.Diagnostics.Merge_conflict_marker_encountered, mergeConflictMarkerLength);
              }
              var ch = text.charCodeAt(pos);
              var len = text.length;
              if (ch === 60 || ch === 62) {
                  while (pos < len && !isLineBreak(text.charCodeAt(pos))) {
                      pos++;
                  }
              }
              else {
                  ts.Debug.assert(ch === 61);
                  while (pos < len) {
                      var ch_1 = text.charCodeAt(pos);
                      if (ch_1 === 62 && isConflictMarkerTrivia(text, pos)) {
                          break;
                      }
                      pos++;
                  }
              }
              return pos;
          }
          function getCommentRanges(text, pos, trailing) {
              var result;
              var collecting = trailing || pos === 0;
              while (true) {
                  var ch = text.charCodeAt(pos);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos + 1) === 10) {
                              pos++;
                          }
                      case 10:
                          pos++;
                          if (trailing) {
                              return result;
                          }
                          collecting = true;
                          if (result && result.length) {
                              ts.lastOrUndefined(result).hasTrailingNewLine = true;
                          }
                          continue;
                      case 9:
                      case 11:
                      case 12:
                      case 32:
                          pos++;
                          continue;
                      case 47:
                          var nextChar = text.charCodeAt(pos + 1);
                          var hasTrailingNewLine = false;
                          if (nextChar === 47 || nextChar === 42) {
                              var kind = nextChar === 47 ? 2 : 3;
                              var startPos = pos;
                              pos += 2;
                              if (nextChar === 47) {
                                  while (pos < text.length) {
                                      if (isLineBreak(text.charCodeAt(pos))) {
                                          hasTrailingNewLine = true;
                                          break;
                                      }
                                      pos++;
                                  }
                              }
                              else {
                                  while (pos < text.length) {
                                      if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                                          pos += 2;
                                          break;
                                      }
                                      pos++;
                                  }
                              }
                              if (collecting) {
                                  if (!result) {
                                      result = [];
                                  }
                                  result.push({ pos: startPos, end: pos, hasTrailingNewLine: hasTrailingNewLine, kind: kind });
                              }
                              continue;
                          }
                          break;
                      default:
                          if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
                              if (result && result.length && isLineBreak(ch)) {
                                  ts.lastOrUndefined(result).hasTrailingNewLine = true;
                              }
                              pos++;
                              continue;
                          }
                          break;
                  }
                  return result;
              }
          }
          function getLeadingCommentRanges(text, pos) {
              return getCommentRanges(text, pos, false);
          }
          ts.getLeadingCommentRanges = getLeadingCommentRanges;
          function getTrailingCommentRanges(text, pos) {
              return getCommentRanges(text, pos, true);
          }
          ts.getTrailingCommentRanges = getTrailingCommentRanges;
          function isIdentifierStart(ch, languageVersion) {
              return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                  ch === 36 || ch === 95 ||
                  ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
          }
          ts.isIdentifierStart = isIdentifierStart;
          function isIdentifierPart(ch, languageVersion) {
              return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                  ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
                  ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
          }
          ts.isIdentifierPart = isIdentifierPart;
          function createScanner(languageVersion, skipTrivia, text, onError, start, length) {
              var pos;
              var end;
              var startPos;
              var tokenPos;
              var token;
              var tokenValue;
              var precedingLineBreak;
              var hasExtendedUnicodeEscape;
              var tokenIsUnterminated;
              setText(text, start, length);
              return {
                  getStartPos: function () { return startPos; },
                  getTextPos: function () { return pos; },
                  getToken: function () { return token; },
                  getTokenPos: function () { return tokenPos; },
                  getTokenText: function () { return text.substring(tokenPos, pos); },
                  getTokenValue: function () { return tokenValue; },
                  hasExtendedUnicodeEscape: function () { return hasExtendedUnicodeEscape; },
                  hasPrecedingLineBreak: function () { return precedingLineBreak; },
                  isIdentifier: function () { return token === 65 || token > 101; },
                  isReservedWord: function () { return token >= 66 && token <= 101; },
                  isUnterminated: function () { return tokenIsUnterminated; },
                  reScanGreaterToken: reScanGreaterToken,
                  reScanSlashToken: reScanSlashToken,
                  reScanTemplateToken: reScanTemplateToken,
                  scan: scan,
                  setText: setText,
                  setScriptTarget: setScriptTarget,
                  setOnError: setOnError,
                  setTextPos: setTextPos,
                  tryScan: tryScan,
                  lookAhead: lookAhead
              };
              function error(message, length) {
                  if (onError) {
                      onError(message, length || 0);
                  }
              }
              function isIdentifierStart(ch) {
                  return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                      ch === 36 || ch === 95 ||
                      ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
              }
              function isIdentifierPart(ch) {
                  return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                      ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
                      ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
              }
              function scanNumber() {
                  var start = pos;
                  while (isDigit(text.charCodeAt(pos)))
                      pos++;
                  if (text.charCodeAt(pos) === 46) {
                      pos++;
                      while (isDigit(text.charCodeAt(pos)))
                          pos++;
                  }
                  var end = pos;
                  if (text.charCodeAt(pos) === 69 || text.charCodeAt(pos) === 101) {
                      pos++;
                      if (text.charCodeAt(pos) === 43 || text.charCodeAt(pos) === 45)
                          pos++;
                      if (isDigit(text.charCodeAt(pos))) {
                          pos++;
                          while (isDigit(text.charCodeAt(pos)))
                              pos++;
                          end = pos;
                      }
                      else {
                          error(ts.Diagnostics.Digit_expected);
                      }
                  }
                  return +(text.substring(start, end));
              }
              function scanOctalDigits() {
                  var start = pos;
                  while (isOctalDigit(text.charCodeAt(pos))) {
                      pos++;
                  }
                  return +(text.substring(start, pos));
              }
              function scanExactNumberOfHexDigits(count) {
                  return scanHexDigits(count, false);
              }
              function scanMinimumNumberOfHexDigits(count) {
                  return scanHexDigits(count, true);
              }
              function scanHexDigits(minCount, scanAsManyAsPossible) {
                  var digits = 0;
                  var value = 0;
                  while (digits < minCount || scanAsManyAsPossible) {
                      var ch = text.charCodeAt(pos);
                      if (ch >= 48 && ch <= 57) {
                          value = value * 16 + ch - 48;
                      }
                      else if (ch >= 65 && ch <= 70) {
                          value = value * 16 + ch - 65 + 10;
                      }
                      else if (ch >= 97 && ch <= 102) {
                          value = value * 16 + ch - 97 + 10;
                      }
                      else {
                          break;
                      }
                      pos++;
                      digits++;
                  }
                  if (digits < minCount) {
                      value = -1;
                  }
                  return value;
              }
              function scanString() {
                  var quote = text.charCodeAt(pos++);
                  var result = "";
                  var start = pos;
                  while (true) {
                      if (pos >= end) {
                          result += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_string_literal);
                          break;
                      }
                      var ch = text.charCodeAt(pos);
                      if (ch === quote) {
                          result += text.substring(start, pos);
                          pos++;
                          break;
                      }
                      if (ch === 92) {
                          result += text.substring(start, pos);
                          result += scanEscapeSequence();
                          start = pos;
                          continue;
                      }
                      if (isLineBreak(ch)) {
                          result += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_string_literal);
                          break;
                      }
                      pos++;
                  }
                  return result;
              }
              function scanTemplateAndSetTokenValue() {
                  var startedWithBacktick = text.charCodeAt(pos) === 96;
                  pos++;
                  var start = pos;
                  var contents = "";
                  var resultingToken;
                  while (true) {
                      if (pos >= end) {
                          contents += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_template_literal);
                          resultingToken = startedWithBacktick ? 10 : 13;
                          break;
                      }
                      var currChar = text.charCodeAt(pos);
                      if (currChar === 96) {
                          contents += text.substring(start, pos);
                          pos++;
                          resultingToken = startedWithBacktick ? 10 : 13;
                          break;
                      }
                      if (currChar === 36 && pos + 1 < end && text.charCodeAt(pos + 1) === 123) {
                          contents += text.substring(start, pos);
                          pos += 2;
                          resultingToken = startedWithBacktick ? 11 : 12;
                          break;
                      }
                      if (currChar === 92) {
                          contents += text.substring(start, pos);
                          contents += scanEscapeSequence();
                          start = pos;
                          continue;
                      }
                      if (currChar === 13) {
                          contents += text.substring(start, pos);
                          pos++;
                          if (pos < end && text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                          contents += "\n";
                          start = pos;
                          continue;
                      }
                      pos++;
                  }
                  ts.Debug.assert(resultingToken !== undefined);
                  tokenValue = contents;
                  return resultingToken;
              }
              function scanEscapeSequence() {
                  pos++;
                  if (pos >= end) {
                      error(ts.Diagnostics.Unexpected_end_of_text);
                      return "";
                  }
                  var ch = text.charCodeAt(pos++);
                  switch (ch) {
                      case 48:
                          return "\0";
                      case 98:
                          return "\b";
                      case 116:
                          return "\t";
                      case 110:
                          return "\n";
                      case 118:
                          return "\v";
                      case 102:
                          return "\f";
                      case 114:
                          return "\r";
                      case 39:
                          return "\'";
                      case 34:
                          return "\"";
                      case 117:
                          if (pos < end && text.charCodeAt(pos) === 123) {
                              hasExtendedUnicodeEscape = true;
                              pos++;
                              return scanExtendedUnicodeEscape();
                          }
                          return scanHexadecimalEscape(4);
                      case 120:
                          return scanHexadecimalEscape(2);
                      case 13:
                          if (pos < end && text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                      case 10:
                      case 8232:
                      case 8233:
                          return "";
                      default:
                          return String.fromCharCode(ch);
                  }
              }
              function scanHexadecimalEscape(numDigits) {
                  var escapedValue = scanExactNumberOfHexDigits(numDigits);
                  if (escapedValue >= 0) {
                      return String.fromCharCode(escapedValue);
                  }
                  else {
                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                      return "";
                  }
              }
              function scanExtendedUnicodeEscape() {
                  var escapedValue = scanMinimumNumberOfHexDigits(1);
                  var isInvalidExtendedEscape = false;
                  if (escapedValue < 0) {
                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                      isInvalidExtendedEscape = true;
                  }
                  else if (escapedValue > 0x10FFFF) {
                      error(ts.Diagnostics.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive);
                      isInvalidExtendedEscape = true;
                  }
                  if (pos >= end) {
                      error(ts.Diagnostics.Unexpected_end_of_text);
                      isInvalidExtendedEscape = true;
                  }
                  else if (text.charCodeAt(pos) == 125) {
                      pos++;
                  }
                  else {
                      error(ts.Diagnostics.Unterminated_Unicode_escape_sequence);
                      isInvalidExtendedEscape = true;
                  }
                  if (isInvalidExtendedEscape) {
                      return "";
                  }
                  return utf16EncodeAsString(escapedValue);
              }
              function utf16EncodeAsString(codePoint) {
                  ts.Debug.assert(0x0 <= codePoint && codePoint <= 0x10FFFF);
                  if (codePoint <= 65535) {
                      return String.fromCharCode(codePoint);
                  }
                  var codeUnit1 = Math.floor((codePoint - 65536) / 1024) + 0xD800;
                  var codeUnit2 = ((codePoint - 65536) % 1024) + 0xDC00;
                  return String.fromCharCode(codeUnit1, codeUnit2);
              }
              function peekUnicodeEscape() {
                  if (pos + 5 < end && text.charCodeAt(pos + 1) === 117) {
                      var start_1 = pos;
                      pos += 2;
                      var value = scanExactNumberOfHexDigits(4);
                      pos = start_1;
                      return value;
                  }
                  return -1;
              }
              function scanIdentifierParts() {
                  var result = "";
                  var start = pos;
                  while (pos < end) {
                      var ch = text.charCodeAt(pos);
                      if (isIdentifierPart(ch)) {
                          pos++;
                      }
                      else if (ch === 92) {
                          ch = peekUnicodeEscape();
                          if (!(ch >= 0 && isIdentifierPart(ch))) {
                              break;
                          }
                          result += text.substring(start, pos);
                          result += String.fromCharCode(ch);
                          pos += 6;
                          start = pos;
                      }
                      else {
                          break;
                      }
                  }
                  result += text.substring(start, pos);
                  return result;
              }
              function getIdentifierToken() {
                  var len = tokenValue.length;
                  if (len >= 2 && len <= 11) {
                      var ch = tokenValue.charCodeAt(0);
                      if (ch >= 97 && ch <= 122 && hasOwnProperty.call(textToToken, tokenValue)) {
                          return token = textToToken[tokenValue];
                      }
                  }
                  return token = 65;
              }
              function scanBinaryOrOctalDigits(base) {
                  ts.Debug.assert(base !== 2 || base !== 8, "Expected either base 2 or base 8");
                  var value = 0;
                  var numberOfDigits = 0;
                  while (true) {
                      var ch = text.charCodeAt(pos);
                      var valueOfCh = ch - 48;
                      if (!isDigit(ch) || valueOfCh >= base) {
                          break;
                      }
                      value = value * base + valueOfCh;
                      pos++;
                      numberOfDigits++;
                  }
                  if (numberOfDigits === 0) {
                      return -1;
                  }
                  return value;
              }
              function scan() {
                  startPos = pos;
                  hasExtendedUnicodeEscape = false;
                  precedingLineBreak = false;
                  tokenIsUnterminated = false;
                  while (true) {
                      tokenPos = pos;
                      if (pos >= end) {
                          return token = 1;
                      }
                      var ch = text.charCodeAt(pos);
                      switch (ch) {
                          case 10:
                          case 13:
                              precedingLineBreak = true;
                              if (skipTrivia) {
                                  pos++;
                                  continue;
                              }
                              else {
                                  if (ch === 13 && pos + 1 < end && text.charCodeAt(pos + 1) === 10) {
                                      pos += 2;
                                  }
                                  else {
                                      pos++;
                                  }
                                  return token = 4;
                              }
                          case 9:
                          case 11:
                          case 12:
                          case 32:
                              if (skipTrivia) {
                                  pos++;
                                  continue;
                              }
                              else {
                                  while (pos < end && isWhiteSpace(text.charCodeAt(pos))) {
                                      pos++;
                                  }
                                  return token = 5;
                              }
                          case 33:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 31;
                                  }
                                  return pos += 2, token = 29;
                              }
                              return pos++, token = 46;
                          case 34:
                          case 39:
                              tokenValue = scanString();
                              return token = 8;
                          case 96:
                              return token = scanTemplateAndSetTokenValue();
                          case 37:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 58;
                              }
                              return pos++, token = 37;
                          case 38:
                              if (text.charCodeAt(pos + 1) === 38) {
                                  return pos += 2, token = 48;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 62;
                              }
                              return pos++, token = 43;
                          case 40:
                              return pos++, token = 16;
                          case 41:
                              return pos++, token = 17;
                          case 42:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 56;
                              }
                              return pos++, token = 35;
                          case 43:
                              if (text.charCodeAt(pos + 1) === 43) {
                                  return pos += 2, token = 38;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 54;
                              }
                              return pos++, token = 33;
                          case 44:
                              return pos++, token = 23;
                          case 45:
                              if (text.charCodeAt(pos + 1) === 45) {
                                  return pos += 2, token = 39;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 55;
                              }
                              return pos++, token = 34;
                          case 46:
                              if (isDigit(text.charCodeAt(pos + 1))) {
                                  tokenValue = "" + scanNumber();
                                  return token = 7;
                              }
                              if (text.charCodeAt(pos + 1) === 46 && text.charCodeAt(pos + 2) === 46) {
                                  return pos += 3, token = 21;
                              }
                              return pos++, token = 20;
                          case 47:
                              if (text.charCodeAt(pos + 1) === 47) {
                                  pos += 2;
                                  while (pos < end) {
                                      if (isLineBreak(text.charCodeAt(pos))) {
                                          break;
                                      }
                                      pos++;
                                  }
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 2;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 42) {
                                  pos += 2;
                                  var commentClosed = false;
                                  while (pos < end) {
                                      var ch_2 = text.charCodeAt(pos);
                                      if (ch_2 === 42 && text.charCodeAt(pos + 1) === 47) {
                                          pos += 2;
                                          commentClosed = true;
                                          break;
                                      }
                                      if (isLineBreak(ch_2)) {
                                          precedingLineBreak = true;
                                      }
                                      pos++;
                                  }
                                  if (!commentClosed) {
                                      error(ts.Diagnostics.Asterisk_Slash_expected);
                                  }
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      tokenIsUnterminated = !commentClosed;
                                      return token = 3;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 57;
                              }
                              return pos++, token = 36;
                          case 48:
                              if (pos + 2 < end && (text.charCodeAt(pos + 1) === 88 || text.charCodeAt(pos + 1) === 120)) {
                                  pos += 2;
                                  var value = scanMinimumNumberOfHexDigits(1);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 66 || text.charCodeAt(pos + 1) === 98)) {
                                  pos += 2;
                                  var value = scanBinaryOrOctalDigits(2);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Binary_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 79 || text.charCodeAt(pos + 1) === 111)) {
                                  pos += 2;
                                  var value = scanBinaryOrOctalDigits(8);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Octal_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              if (pos + 1 < end && isOctalDigit(text.charCodeAt(pos + 1))) {
                                  tokenValue = "" + scanOctalDigits();
                                  return token = 7;
                              }
                          case 49:
                          case 50:
                          case 51:
                          case 52:
                          case 53:
                          case 54:
                          case 55:
                          case 56:
                          case 57:
                              tokenValue = "" + scanNumber();
                              return token = 7;
                          case 58:
                              return pos++, token = 51;
                          case 59:
                              return pos++, token = 22;
                          case 60:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 60) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 59;
                                  }
                                  return pos += 2, token = 40;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 26;
                              }
                              return pos++, token = 24;
                          case 61:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 30;
                                  }
                                  return pos += 2, token = 28;
                              }
                              if (text.charCodeAt(pos + 1) === 62) {
                                  return pos += 2, token = 32;
                              }
                              return pos++, token = 53;
                          case 62:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              return pos++, token = 25;
                          case 63:
                              return pos++, token = 50;
                          case 91:
                              return pos++, token = 18;
                          case 93:
                              return pos++, token = 19;
                          case 94:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 64;
                              }
                              return pos++, token = 45;
                          case 123:
                              return pos++, token = 14;
                          case 124:
                              if (text.charCodeAt(pos + 1) === 124) {
                                  return pos += 2, token = 49;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 63;
                              }
                              return pos++, token = 44;
                          case 125:
                              return pos++, token = 15;
                          case 126:
                              return pos++, token = 47;
                          case 64:
                              return pos++, token = 52;
                          case 92:
                              var cookedChar = peekUnicodeEscape();
                              if (cookedChar >= 0 && isIdentifierStart(cookedChar)) {
                                  pos += 6;
                                  tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
                                  return token = getIdentifierToken();
                              }
                              error(ts.Diagnostics.Invalid_character);
                              return pos++, token = 0;
                          default:
                              if (isIdentifierStart(ch)) {
                                  pos++;
                                  while (pos < end && isIdentifierPart(ch = text.charCodeAt(pos)))
                                      pos++;
                                  tokenValue = text.substring(tokenPos, pos);
                                  if (ch === 92) {
                                      tokenValue += scanIdentifierParts();
                                  }
                                  return token = getIdentifierToken();
                              }
                              else if (isWhiteSpace(ch)) {
                                  pos++;
                                  continue;
                              }
                              else if (isLineBreak(ch)) {
                                  precedingLineBreak = true;
                                  pos++;
                                  continue;
                              }
                              error(ts.Diagnostics.Invalid_character);
                              return pos++, token = 0;
                      }
                  }
              }
              function reScanGreaterToken() {
                  if (token === 25) {
                      if (text.charCodeAt(pos) === 62) {
                          if (text.charCodeAt(pos + 1) === 62) {
                              if (text.charCodeAt(pos + 2) === 61) {
                                  return pos += 3, token = 61;
                              }
                              return pos += 2, token = 42;
                          }
                          if (text.charCodeAt(pos + 1) === 61) {
                              return pos += 2, token = 60;
                          }
                          return pos++, token = 41;
                      }
                      if (text.charCodeAt(pos) === 61) {
                          return pos++, token = 27;
                      }
                  }
                  return token;
              }
              function reScanSlashToken() {
                  if (token === 36 || token === 57) {
                      var p = tokenPos + 1;
                      var inEscape = false;
                      var inCharacterClass = false;
                      while (true) {
                          if (p >= end) {
                              tokenIsUnterminated = true;
                              error(ts.Diagnostics.Unterminated_regular_expression_literal);
                              break;
                          }
                          var ch = text.charCodeAt(p);
                          if (isLineBreak(ch)) {
                              tokenIsUnterminated = true;
                              error(ts.Diagnostics.Unterminated_regular_expression_literal);
                              break;
                          }
                          if (inEscape) {
                              inEscape = false;
                          }
                          else if (ch === 47 && !inCharacterClass) {
                              p++;
                              break;
                          }
                          else if (ch === 91) {
                              inCharacterClass = true;
                          }
                          else if (ch === 92) {
                              inEscape = true;
                          }
                          else if (ch === 93) {
                              inCharacterClass = false;
                          }
                          p++;
                      }
                      while (p < end && isIdentifierPart(text.charCodeAt(p))) {
                          p++;
                      }
                      pos = p;
                      tokenValue = text.substring(tokenPos, pos);
                      token = 9;
                  }
                  return token;
              }
              function reScanTemplateToken() {
                  ts.Debug.assert(token === 15, "'reScanTemplateToken' should only be called on a '}'");
                  pos = tokenPos;
                  return token = scanTemplateAndSetTokenValue();
              }
              function speculationHelper(callback, isLookahead) {
                  var savePos = pos;
                  var saveStartPos = startPos;
                  var saveTokenPos = tokenPos;
                  var saveToken = token;
                  var saveTokenValue = tokenValue;
                  var savePrecedingLineBreak = precedingLineBreak;
                  var result = callback();
                  if (!result || isLookahead) {
                      pos = savePos;
                      startPos = saveStartPos;
                      tokenPos = saveTokenPos;
                      token = saveToken;
                      tokenValue = saveTokenValue;
                      precedingLineBreak = savePrecedingLineBreak;
                  }
                  return result;
              }
              function lookAhead(callback) {
                  return speculationHelper(callback, true);
              }
              function tryScan(callback) {
                  return speculationHelper(callback, false);
              }
              function setText(newText, start, length) {
                  text = newText || "";
                  end = length === undefined ? text.length : start + length;
                  setTextPos(start || 0);
              }
              function setOnError(errorCallback) {
                  onError = errorCallback;
              }
              function setScriptTarget(scriptTarget) {
                  languageVersion = scriptTarget;
              }
              function setTextPos(textPos) {
                  ts.Debug.assert(textPos >= 0);
                  pos = textPos;
                  startPos = textPos;
                  tokenPos = textPos;
                  token = 0;
                  precedingLineBreak = false;
                  tokenValue = undefined;
                  hasExtendedUnicodeEscape = false;
                  tokenIsUnterminated = false;
              }
          }
          ts.createScanner = createScanner;
      })(ts || (ts = {}));
      /// <reference path="parser.ts"/>
      var ts;
      (function (ts) {
          ts.bindTime = 0;
          function getModuleInstanceState(node) {
              if (node.kind === 203 || node.kind === 204) {
                  return 0;
              }
              else if (ts.isConstEnumDeclaration(node)) {
                  return 2;
              }
              else if ((node.kind === 210 || node.kind === 209) && !(node.flags & 1)) {
                  return 0;
              }
              else if (node.kind === 207) {
                  var state = 0;
                  ts.forEachChild(node, function (n) {
                      switch (getModuleInstanceState(n)) {
                          case 0:
                              return false;
                          case 2:
                              state = 2;
                              return false;
                          case 1:
                              state = 1;
                              return true;
                      }
                  });
                  return state;
              }
              else if (node.kind === 206) {
                  return getModuleInstanceState(node.body);
              }
              else {
                  return 1;
              }
          }
          ts.getModuleInstanceState = getModuleInstanceState;
          function bindSourceFile(file) {
              var start = new Date().getTime();
              bindSourceFileWorker(file);
              ts.bindTime += new Date().getTime() - start;
          }
          ts.bindSourceFile = bindSourceFile;
          function bindSourceFileWorker(file) {
              var parent;
              var container;
              var blockScopeContainer;
              var lastContainer;
              var symbolCount = 0;
              var Symbol = ts.objectAllocator.getSymbolConstructor();
              if (!file.locals) {
                  file.locals = {};
                  container = file;
                  setBlockScopeContainer(file, false);
                  bind(file);
                  file.symbolCount = symbolCount;
              }
              function createSymbol(flags, name) {
                  symbolCount++;
                  return new Symbol(flags, name);
              }
              function setBlockScopeContainer(node, cleanLocals) {
                  blockScopeContainer = node;
                  if (cleanLocals) {
                      blockScopeContainer.locals = undefined;
                  }
              }
              function addDeclarationToSymbol(symbol, node, symbolKind) {
                  symbol.flags |= symbolKind;
                  if (!symbol.declarations)
                      symbol.declarations = [];
                  symbol.declarations.push(node);
                  if (symbolKind & 1952 && !symbol.exports)
                      symbol.exports = {};
                  if (symbolKind & 6240 && !symbol.members)
                      symbol.members = {};
                  node.symbol = symbol;
                  if (symbolKind & 107455 && !symbol.valueDeclaration)
                      symbol.valueDeclaration = node;
              }
              function getDeclarationName(node) {
                  if (node.name) {
                      if (node.kind === 206 && node.name.kind === 8) {
                          return '"' + node.name.text + '"';
                      }
                      if (node.name.kind === 128) {
                          var nameExpression = node.name.expression;
                          ts.Debug.assert(ts.isWellKnownSymbolSyntactically(nameExpression));
                          return ts.getPropertyNameForKnownSymbolName(nameExpression.name.text);
                      }
                      return node.name.text;
                  }
                  switch (node.kind) {
                      case 144:
                      case 136:
                          return "__constructor";
                      case 143:
                      case 139:
                          return "__call";
                      case 140:
                          return "__new";
                      case 141:
                          return "__index";
                      case 216:
                          return "__export";
                      case 215:
                          return node.isExportEquals ? "export=" : "default";
                      case 201:
                      case 202:
                          return node.flags & 256 ? "default" : undefined;
                  }
              }
              function getDisplayName(node) {
                  return node.name ? ts.declarationNameToString(node.name) : getDeclarationName(node);
              }
              function declareSymbol(symbols, parent, node, includes, excludes) {
                  ts.Debug.assert(!ts.hasDynamicName(node));
                  var name = node.flags & 256 && parent ? "default" : getDeclarationName(node);
                  var symbol;
                  if (name !== undefined) {
                      symbol = ts.hasProperty(symbols, name) ? symbols[name] : (symbols[name] = createSymbol(0, name));
                      if (symbol.flags & excludes) {
                          if (node.name) {
                              node.name.parent = node;
                          }
                          var message = symbol.flags & 2
                              ? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0
                              : ts.Diagnostics.Duplicate_identifier_0;
                          ts.forEach(symbol.declarations, function (declaration) {
                              file.bindDiagnostics.push(ts.createDiagnosticForNode(declaration.name || declaration, message, getDisplayName(declaration)));
                          });
                          file.bindDiagnostics.push(ts.createDiagnosticForNode(node.name || node, message, getDisplayName(node)));
                          symbol = createSymbol(0, name);
                      }
                  }
                  else {
                      symbol = createSymbol(0, "__missing");
                  }
                  addDeclarationToSymbol(symbol, node, includes);
                  symbol.parent = parent;
                  if ((node.kind === 202 || node.kind === 175) && symbol.exports) {
                      var prototypeSymbol = createSymbol(4 | 134217728, "prototype");
                      if (ts.hasProperty(symbol.exports, prototypeSymbol.name)) {
                          if (node.name) {
                              node.name.parent = node;
                          }
                          file.bindDiagnostics.push(ts.createDiagnosticForNode(symbol.exports[prototypeSymbol.name].declarations[0], ts.Diagnostics.Duplicate_identifier_0, prototypeSymbol.name));
                      }
                      symbol.exports[prototypeSymbol.name] = prototypeSymbol;
                      prototypeSymbol.parent = symbol;
                  }
                  return symbol;
              }
              function declareModuleMember(node, symbolKind, symbolExcludes) {
                  var hasExportModifier = ts.getCombinedNodeFlags(node) & 1;
                  if (symbolKind & 8388608) {
                      if (node.kind === 218 || (node.kind === 209 && hasExportModifier)) {
                          declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                      }
                      else {
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                      }
                  }
                  else {
                      if (hasExportModifier || container.flags & 65536) {
                          var exportKind = (symbolKind & 107455 ? 1048576 : 0) |
                              (symbolKind & 793056 ? 2097152 : 0) |
                              (symbolKind & 1536 ? 4194304 : 0);
                          var local = declareSymbol(container.locals, undefined, node, exportKind, symbolExcludes);
                          local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                          node.localSymbol = local;
                      }
                      else {
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                      }
                  }
              }
              function bindChildren(node, symbolKind, isBlockScopeContainer) {
                  if (symbolKind & 255504) {
                      node.locals = {};
                  }
                  var saveParent = parent;
                  var saveContainer = container;
                  var savedBlockScopeContainer = blockScopeContainer;
                  parent = node;
                  if (symbolKind & 262128) {
                      container = node;
                      addToContainerChain(container);
                  }
                  if (isBlockScopeContainer) {
                      setBlockScopeContainer(node, (symbolKind & 255504) === 0 && node.kind !== 228);
                  }
                  ts.forEachChild(node, bind);
                  container = saveContainer;
                  parent = saveParent;
                  blockScopeContainer = savedBlockScopeContainer;
              }
              function addToContainerChain(node) {
                  if (lastContainer) {
                      lastContainer.nextContainer = node;
                  }
                  lastContainer = node;
              }
              function bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
                  switch (container.kind) {
                      case 206:
                          declareModuleMember(node, symbolKind, symbolExcludes);
                          break;
                      case 228:
                          if (ts.isExternalModule(container)) {
                              declareModuleMember(node, symbolKind, symbolExcludes);
                              break;
                          }
                      case 143:
                      case 144:
                      case 139:
                      case 140:
                      case 141:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                      case 201:
                      case 163:
                      case 164:
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                          break;
                      case 175:
                      case 202:
                          if (node.flags & 128) {
                              declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                              break;
                          }
                      case 146:
                      case 155:
                      case 203:
                          declareSymbol(container.symbol.members, container.symbol, node, symbolKind, symbolExcludes);
                          break;
                      case 205:
                          declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                          break;
                  }
                  bindChildren(node, symbolKind, isBlockScopeContainer);
              }
              function isAmbientContext(node) {
                  while (node) {
                      if (node.flags & 2)
                          return true;
                      node = node.parent;
                  }
                  return false;
              }
              function hasExportDeclarations(node) {
                  var body = node.kind === 228 ? node : node.body;
                  if (body.kind === 228 || body.kind === 207) {
                      for (var _i = 0, _a = body.statements; _i < _a.length; _i++) {
                          var stat = _a[_i];
                          if (stat.kind === 216 || stat.kind === 215) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function setExportContextFlag(node) {
                  if (isAmbientContext(node) && !hasExportDeclarations(node)) {
                      node.flags |= 65536;
                  }
                  else {
                      node.flags &= ~65536;
                  }
              }
              function bindModuleDeclaration(node) {
                  setExportContextFlag(node);
                  if (node.name.kind === 8) {
                      bindDeclaration(node, 512, 106639, true);
                  }
                  else {
                      var state = getModuleInstanceState(node);
                      if (state === 0) {
                          bindDeclaration(node, 1024, 0, true);
                      }
                      else {
                          bindDeclaration(node, 512, 106639, true);
                          var currentModuleIsConstEnumOnly = state === 2;
                          if (node.symbol.constEnumOnlyModule === undefined) {
                              node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
                          }
                          else {
                              node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
                          }
                      }
                  }
              }
              function bindFunctionOrConstructorType(node) {
                  // For a given function symbol "<...>(...) => T" we want to generate a symbol identical
                  // to the one we would get for: { <...>(...): T }
                  //
                  // We do that by making an anonymous type literal symbol, and then setting the function 
                  // symbol as its sole member. To the rest of the system, this symbol will be  indistinguishable 
                  // from an actual type literal symbol you would have gotten had you used the long form.
                  var symbol = createSymbol(131072, getDeclarationName(node));
                  addDeclarationToSymbol(symbol, node, 131072);
                  bindChildren(node, 131072, false);
                  var typeLiteralSymbol = createSymbol(2048, "__type");
                  addDeclarationToSymbol(typeLiteralSymbol, node, 2048);
                  typeLiteralSymbol.members = {};
                  typeLiteralSymbol.members[node.kind === 143 ? "__call" : "__new"] = symbol;
              }
              function bindAnonymousDeclaration(node, symbolKind, name, isBlockScopeContainer) {
                  var symbol = createSymbol(symbolKind, name);
                  addDeclarationToSymbol(symbol, node, symbolKind);
                  bindChildren(node, symbolKind, isBlockScopeContainer);
              }
              function bindCatchVariableDeclaration(node) {
                  bindChildren(node, 0, true);
              }
              function bindBlockScopedDeclaration(node, symbolKind, symbolExcludes) {
                  switch (blockScopeContainer.kind) {
                      case 206:
                          declareModuleMember(node, symbolKind, symbolExcludes);
                          break;
                      case 228:
                          if (ts.isExternalModule(container)) {
                              declareModuleMember(node, symbolKind, symbolExcludes);
                              break;
                          }
                      default:
                          if (!blockScopeContainer.locals) {
                              blockScopeContainer.locals = {};
                              addToContainerChain(blockScopeContainer);
                          }
                          declareSymbol(blockScopeContainer.locals, undefined, node, symbolKind, symbolExcludes);
                  }
                  bindChildren(node, symbolKind, false);
              }
              function bindBlockScopedVariableDeclaration(node) {
                  bindBlockScopedDeclaration(node, 2, 107455);
              }
              function getDestructuringParameterName(node) {
                  return "__" + ts.indexOf(node.parent.parameters, node);
              }
              function bind(node) {
                  node.parent = parent;
                  switch (node.kind) {
                      case 129:
                          bindDeclaration(node, 262144, 530912, false);
                          break;
                      case 130:
                          bindParameter(node);
                          break;
                      case 199:
                      case 153:
                          if (ts.isBindingPattern(node.name)) {
                              bindChildren(node, 0, false);
                          }
                          else if (ts.isBlockOrCatchScoped(node)) {
                              bindBlockScopedVariableDeclaration(node);
                          }
                          else if (ts.isParameterDeclaration(node)) {
                              bindDeclaration(node, 1, 107455, false);
                          }
                          else {
                              bindDeclaration(node, 1, 107454, false);
                          }
                          break;
                      case 133:
                      case 132:
                          bindPropertyOrMethodOrAccessor(node, 4 | (node.questionToken ? 536870912 : 0), 107455, false);
                          break;
                      case 225:
                      case 226:
                          bindPropertyOrMethodOrAccessor(node, 4, 107455, false);
                          break;
                      case 227:
                          bindPropertyOrMethodOrAccessor(node, 8, 107455, false);
                          break;
                      case 139:
                      case 140:
                      case 141:
                          bindDeclaration(node, 131072, 0, false);
                          break;
                      case 135:
                      case 134:
                          bindPropertyOrMethodOrAccessor(node, 8192 | (node.questionToken ? 536870912 : 0), ts.isObjectLiteralMethod(node) ? 107455 : 99263, true);
                          break;
                      case 201:
                          bindDeclaration(node, 16, 106927, true);
                          break;
                      case 136:
                          bindDeclaration(node, 16384, 0, true);
                          break;
                      case 137:
                          bindPropertyOrMethodOrAccessor(node, 32768, 41919, true);
                          break;
                      case 138:
                          bindPropertyOrMethodOrAccessor(node, 65536, 74687, true);
                          break;
                      case 143:
                      case 144:
                          bindFunctionOrConstructorType(node);
                          break;
                      case 146:
                          bindAnonymousDeclaration(node, 2048, "__type", false);
                          break;
                      case 155:
                          bindAnonymousDeclaration(node, 4096, "__object", false);
                          break;
                      case 163:
                      case 164:
                          bindAnonymousDeclaration(node, 16, "__function", true);
                          break;
                      case 175:
                          bindAnonymousDeclaration(node, 32, "__class", false);
                          break;
                      case 224:
                          bindCatchVariableDeclaration(node);
                          break;
                      case 202:
                          bindBlockScopedDeclaration(node, 32, 899583);
                          break;
                      case 203:
                          bindDeclaration(node, 64, 792992, false);
                          break;
                      case 204:
                          bindDeclaration(node, 524288, 793056, false);
                          break;
                      case 205:
                          if (ts.isConst(node)) {
                              bindDeclaration(node, 128, 899967, false);
                          }
                          else {
                              bindDeclaration(node, 256, 899327, false);
                          }
                          break;
                      case 206:
                          bindModuleDeclaration(node);
                          break;
                      case 209:
                      case 212:
                      case 214:
                      case 218:
                          bindDeclaration(node, 8388608, 8388608, false);
                          break;
                      case 211:
                          if (node.name) {
                              bindDeclaration(node, 8388608, 8388608, false);
                          }
                          else {
                              bindChildren(node, 0, false);
                          }
                          break;
                      case 216:
                          if (!node.exportClause) {
                              declareSymbol(container.symbol.exports, container.symbol, node, 1073741824, 0);
                          }
                          bindChildren(node, 0, false);
                          break;
                      case 215:
                          if (node.expression.kind === 65) {
                              declareSymbol(container.symbol.exports, container.symbol, node, 8388608, 107455 | 8388608);
                          }
                          else {
                              declareSymbol(container.symbol.exports, container.symbol, node, 4, 107455 | 8388608);
                          }
                          bindChildren(node, 0, false);
                          break;
                      case 228:
                          setExportContextFlag(node);
                          if (ts.isExternalModule(node)) {
                              bindAnonymousDeclaration(node, 512, '"' + ts.removeFileExtension(node.fileName) + '"', true);
                              break;
                          }
                      case 180:
                          bindChildren(node, 0, !ts.isFunctionLike(node.parent));
                          break;
                      case 224:
                      case 187:
                      case 188:
                      case 189:
                      case 208:
                          bindChildren(node, 0, true);
                          break;
                      default:
                          var saveParent = parent;
                          parent = node;
                          ts.forEachChild(node, bind);
                          parent = saveParent;
                  }
              }
              function bindParameter(node) {
                  if (ts.isBindingPattern(node.name)) {
                      bindAnonymousDeclaration(node, 1, getDestructuringParameterName(node), false);
                  }
                  else {
                      bindDeclaration(node, 1, 107455, false);
                  }
                  if (node.flags & 112 &&
                      node.parent.kind === 136 &&
                      (node.parent.parent.kind === 202 || node.parent.parent.kind === 175)) {
                      var classDeclaration = node.parent.parent;
                      declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, 4, 107455);
                  }
              }
              function bindPropertyOrMethodOrAccessor(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
                  if (ts.hasDynamicName(node)) {
                      bindAnonymousDeclaration(node, symbolKind, "__computed", isBlockScopeContainer);
                  }
                  else {
                      bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer);
                  }
              }
          }
      })(ts || (ts = {}));
      /// <reference path="binder.ts" />
      var ts;
      (function (ts) {
          function getDeclarationOfKind(symbol, kind) {
              var declarations = symbol.declarations;
              for (var _i = 0; _i < declarations.length; _i++) {
                  var declaration = declarations[_i];
                  if (declaration.kind === kind) {
                      return declaration;
                  }
              }
              return undefined;
          }
          ts.getDeclarationOfKind = getDeclarationOfKind;
          var stringWriters = [];
          function getSingleLineStringWriter() {
              if (stringWriters.length == 0) {
                  var str = "";
                  var writeText = function (text) { return str += text; };
                  return {
                      string: function () { return str; },
                      writeKeyword: writeText,
                      writeOperator: writeText,
                      writePunctuation: writeText,
                      writeSpace: writeText,
                      writeStringLiteral: writeText,
                      writeParameter: writeText,
                      writeSymbol: writeText,
                      writeLine: function () { return str += " "; },
                      increaseIndent: function () { },
                      decreaseIndent: function () { },
                      clear: function () { return str = ""; },
                      trackSymbol: function () { }
                  };
              }
              return stringWriters.pop();
          }
          ts.getSingleLineStringWriter = getSingleLineStringWriter;
          function releaseStringWriter(writer) {
              writer.clear();
              stringWriters.push(writer);
          }
          ts.releaseStringWriter = releaseStringWriter;
          function getFullWidth(node) {
              return node.end - node.pos;
          }
          ts.getFullWidth = getFullWidth;
          function containsParseError(node) {
              aggregateChildData(node);
              return (node.parserContextFlags & 64) !== 0;
          }
          ts.containsParseError = containsParseError;
          function aggregateChildData(node) {
              if (!(node.parserContextFlags & 128)) {
                  var thisNodeOrAnySubNodesHasError = ((node.parserContextFlags & 32) !== 0) ||
                      ts.forEachChild(node, containsParseError);
                  if (thisNodeOrAnySubNodesHasError) {
                      node.parserContextFlags |= 64;
                  }
                  node.parserContextFlags |= 128;
              }
          }
          function getSourceFileOfNode(node) {
              while (node && node.kind !== 228) {
                  node = node.parent;
              }
              return node;
          }
          ts.getSourceFileOfNode = getSourceFileOfNode;
          function getStartPositionOfLine(line, sourceFile) {
              ts.Debug.assert(line >= 0);
              return ts.getLineStarts(sourceFile)[line];
          }
          ts.getStartPositionOfLine = getStartPositionOfLine;
          function nodePosToString(node) {
              var file = getSourceFileOfNode(node);
              var loc = ts.getLineAndCharacterOfPosition(file, node.pos);
              return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")";
          }
          ts.nodePosToString = nodePosToString;
          function getStartPosOfNode(node) {
              return node.pos;
          }
          ts.getStartPosOfNode = getStartPosOfNode;
          function nodeIsMissing(node) {
              if (!node) {
                  return true;
              }
              return node.pos === node.end && node.kind !== 1;
          }
          ts.nodeIsMissing = nodeIsMissing;
          function nodeIsPresent(node) {
              return !nodeIsMissing(node);
          }
          ts.nodeIsPresent = nodeIsPresent;
          function getTokenPosOfNode(node, sourceFile) {
              if (nodeIsMissing(node)) {
                  return node.pos;
              }
              return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos);
          }
          ts.getTokenPosOfNode = getTokenPosOfNode;
          function getNonDecoratorTokenPosOfNode(node, sourceFile) {
              if (nodeIsMissing(node) || !node.decorators) {
                  return getTokenPosOfNode(node, sourceFile);
              }
              return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.decorators.end);
          }
          ts.getNonDecoratorTokenPosOfNode = getNonDecoratorTokenPosOfNode;
          function getSourceTextOfNodeFromSourceFile(sourceFile, node) {
              if (nodeIsMissing(node)) {
                  return "";
              }
              var text = sourceFile.text;
              return text.substring(ts.skipTrivia(text, node.pos), node.end);
          }
          ts.getSourceTextOfNodeFromSourceFile = getSourceTextOfNodeFromSourceFile;
          function getTextOfNodeFromSourceText(sourceText, node) {
              if (nodeIsMissing(node)) {
                  return "";
              }
              return sourceText.substring(ts.skipTrivia(sourceText, node.pos), node.end);
          }
          ts.getTextOfNodeFromSourceText = getTextOfNodeFromSourceText;
          function getTextOfNode(node) {
              return getSourceTextOfNodeFromSourceFile(getSourceFileOfNode(node), node);
          }
          ts.getTextOfNode = getTextOfNode;
          function escapeIdentifier(identifier) {
              return identifier.length >= 2 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 ? "_" + identifier : identifier;
          }
          ts.escapeIdentifier = escapeIdentifier;
          function unescapeIdentifier(identifier) {
              return identifier.length >= 3 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 && identifier.charCodeAt(2) === 95 ? identifier.substr(1) : identifier;
          }
          ts.unescapeIdentifier = unescapeIdentifier;
          function makeIdentifierFromModuleName(moduleName) {
              return ts.getBaseFileName(moduleName).replace(/\W/g, "_");
          }
          ts.makeIdentifierFromModuleName = makeIdentifierFromModuleName;
          function isBlockOrCatchScoped(declaration) {
              return (getCombinedNodeFlags(declaration) & 12288) !== 0 ||
                  isCatchClauseVariableDeclaration(declaration);
          }
          ts.isBlockOrCatchScoped = isBlockOrCatchScoped;
          function getEnclosingBlockScopeContainer(node) {
              var current = node.parent;
              while (current) {
                  if (isFunctionLike(current)) {
                      return current;
                  }
                  switch (current.kind) {
                      case 228:
                      case 208:
                      case 224:
                      case 206:
                      case 187:
                      case 188:
                      case 189:
                          return current;
                      case 180:
                          if (!isFunctionLike(current.parent)) {
                              return current;
                          }
                  }
                  current = current.parent;
              }
          }
          ts.getEnclosingBlockScopeContainer = getEnclosingBlockScopeContainer;
          function isCatchClauseVariableDeclaration(declaration) {
              return declaration &&
                  declaration.kind === 199 &&
                  declaration.parent &&
                  declaration.parent.kind === 224;
          }
          ts.isCatchClauseVariableDeclaration = isCatchClauseVariableDeclaration;
          function declarationNameToString(name) {
              return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
          }
          ts.declarationNameToString = declarationNameToString;
          function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
              var sourceFile = getSourceFileOfNode(node);
              var span = getErrorSpanForNode(sourceFile, node);
              return ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2);
          }
          ts.createDiagnosticForNode = createDiagnosticForNode;
          function createDiagnosticForNodeFromMessageChain(node, messageChain) {
              var sourceFile = getSourceFileOfNode(node);
              var span = getErrorSpanForNode(sourceFile, node);
              return {
                  file: sourceFile,
                  start: span.start,
                  length: span.length,
                  code: messageChain.code,
                  category: messageChain.category,
                  messageText: messageChain.next ? messageChain : messageChain.messageText
              };
          }
          ts.createDiagnosticForNodeFromMessageChain = createDiagnosticForNodeFromMessageChain;
          function getSpanOfTokenAtPosition(sourceFile, pos) {
              var scanner = ts.createScanner(sourceFile.languageVersion, true, sourceFile.text, undefined, pos);
              scanner.scan();
              var start = scanner.getTokenPos();
              return ts.createTextSpanFromBounds(start, scanner.getTextPos());
          }
          ts.getSpanOfTokenAtPosition = getSpanOfTokenAtPosition;
          function getErrorSpanForNode(sourceFile, node) {
              var errorNode = node;
              switch (node.kind) {
                  case 228:
                      var pos_1 = ts.skipTrivia(sourceFile.text, 0, false);
                      if (pos_1 === sourceFile.text.length) {
                          return ts.createTextSpan(0, 0);
                      }
                      return getSpanOfTokenAtPosition(sourceFile, pos_1);
                  case 199:
                  case 153:
                  case 202:
                  case 175:
                  case 203:
                  case 206:
                  case 205:
                  case 227:
                  case 201:
                  case 163:
                      errorNode = node.name;
                      break;
              }
              if (errorNode === undefined) {
                  return getSpanOfTokenAtPosition(sourceFile, node.pos);
              }
              var pos = nodeIsMissing(errorNode)
                  ? errorNode.pos
                  : ts.skipTrivia(sourceFile.text, errorNode.pos);
              return ts.createTextSpanFromBounds(pos, errorNode.end);
          }
          ts.getErrorSpanForNode = getErrorSpanForNode;
          function isExternalModule(file) {
              return file.externalModuleIndicator !== undefined;
          }
          ts.isExternalModule = isExternalModule;
          function isDeclarationFile(file) {
              return (file.flags & 2048) !== 0;
          }
          ts.isDeclarationFile = isDeclarationFile;
          function isConstEnumDeclaration(node) {
              return node.kind === 205 && isConst(node);
          }
          ts.isConstEnumDeclaration = isConstEnumDeclaration;
          function walkUpBindingElementsAndPatterns(node) {
              while (node && (node.kind === 153 || isBindingPattern(node))) {
                  node = node.parent;
              }
              return node;
          }
          function getCombinedNodeFlags(node) {
              node = walkUpBindingElementsAndPatterns(node);
              var flags = node.flags;
              if (node.kind === 199) {
                  node = node.parent;
              }
              if (node && node.kind === 200) {
                  flags |= node.flags;
                  node = node.parent;
              }
              if (node && node.kind === 181) {
                  flags |= node.flags;
              }
              return flags;
          }
          ts.getCombinedNodeFlags = getCombinedNodeFlags;
          function isConst(node) {
              return !!(getCombinedNodeFlags(node) & 8192);
          }
          ts.isConst = isConst;
          function isLet(node) {
              return !!(getCombinedNodeFlags(node) & 4096);
          }
          ts.isLet = isLet;
          function isPrologueDirective(node) {
              return node.kind === 183 && node.expression.kind === 8;
          }
          ts.isPrologueDirective = isPrologueDirective;
          function getLeadingCommentRangesOfNode(node, sourceFileOfNode) {
              if (node.kind === 130 || node.kind === 129) {
                  return ts.concatenate(ts.getTrailingCommentRanges(sourceFileOfNode.text, node.pos), ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos));
              }
              else {
                  return ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos);
              }
          }
          ts.getLeadingCommentRangesOfNode = getLeadingCommentRangesOfNode;
          function getJsDocComments(node, sourceFileOfNode) {
              return ts.filter(getLeadingCommentRangesOfNode(node, sourceFileOfNode), isJsDocComment);
              function isJsDocComment(comment) {
                  return sourceFileOfNode.text.charCodeAt(comment.pos + 1) === 42 &&
                      sourceFileOfNode.text.charCodeAt(comment.pos + 2) === 42 &&
                      sourceFileOfNode.text.charCodeAt(comment.pos + 3) !== 47;
              }
          }
          ts.getJsDocComments = getJsDocComments;
          ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*<reference\s+path\s*=\s*)('|")(.+?)\2.*?\/>/;
          function forEachReturnStatement(body, visitor) {
              return traverse(body);
              function traverse(node) {
                  switch (node.kind) {
                      case 192:
                          return visitor(node);
                      case 208:
                      case 180:
                      case 184:
                      case 185:
                      case 186:
                      case 187:
                      case 188:
                      case 189:
                      case 193:
                      case 194:
                      case 221:
                      case 222:
                      case 195:
                      case 197:
                      case 224:
                          return ts.forEachChild(node, traverse);
                  }
              }
          }
          ts.forEachReturnStatement = forEachReturnStatement;
          function isVariableLike(node) {
              if (node) {
                  switch (node.kind) {
                      case 153:
                      case 227:
                      case 130:
                      case 225:
                      case 133:
                      case 132:
                      case 226:
                      case 199:
                          return true;
                  }
              }
              return false;
          }
          ts.isVariableLike = isVariableLike;
          function isAccessor(node) {
              if (node) {
                  switch (node.kind) {
                      case 137:
                      case 138:
                          return true;
                  }
              }
              return false;
          }
          ts.isAccessor = isAccessor;
          function isFunctionLike(node) {
              if (node) {
                  switch (node.kind) {
                      case 136:
                      case 163:
                      case 201:
                      case 164:
                      case 135:
                      case 134:
                      case 137:
                      case 138:
                      case 139:
                      case 140:
                      case 141:
                      case 143:
                      case 144:
                          return true;
                  }
              }
              return false;
          }
          ts.isFunctionLike = isFunctionLike;
          function isFunctionBlock(node) {
              return node && node.kind === 180 && isFunctionLike(node.parent);
          }
          ts.isFunctionBlock = isFunctionBlock;
          function isObjectLiteralMethod(node) {
              return node && node.kind === 135 && node.parent.kind === 155;
          }
          ts.isObjectLiteralMethod = isObjectLiteralMethod;
          function getContainingFunction(node) {
              while (true) {
                  node = node.parent;
                  if (!node || isFunctionLike(node)) {
                      return node;
                  }
              }
          }
          ts.getContainingFunction = getContainingFunction;
          function getThisContainer(node, includeArrowFunctions) {
              while (true) {
                  node = node.parent;
                  if (!node) {
                      return undefined;
                  }
                  switch (node.kind) {
                      case 128:
                          if (node.parent.parent.kind === 202) {
                              return node;
                          }
                          node = node.parent;
                          break;
                      case 131:
                          if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
                              node = node.parent.parent;
                          }
                          else if (isClassElement(node.parent)) {
                              node = node.parent;
                          }
                          break;
                      case 164:
                          if (!includeArrowFunctions) {
                              continue;
                          }
                      case 201:
                      case 163:
                      case 206:
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                      case 205:
                      case 228:
                          return node;
                  }
              }
          }
          ts.getThisContainer = getThisContainer;
          function getSuperContainer(node, includeFunctions) {
              while (true) {
                  node = node.parent;
                  if (!node)
                      return node;
                  switch (node.kind) {
                      case 128:
                          if (node.parent.parent.kind === 202) {
                              return node;
                          }
                          node = node.parent;
                          break;
                      case 131:
                          if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
                              node = node.parent.parent;
                          }
                          else if (isClassElement(node.parent)) {
                              node = node.parent;
                          }
                          break;
                      case 201:
                      case 163:
                      case 164:
                          if (!includeFunctions) {
                              continue;
                          }
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                          return node;
                  }
              }
          }
          ts.getSuperContainer = getSuperContainer;
          function getInvokedExpression(node) {
              if (node.kind === 160) {
                  return node.tag;
              }
              return node.expression;
          }
          ts.getInvokedExpression = getInvokedExpression;
          function nodeCanBeDecorated(node) {
              switch (node.kind) {
                  case 202:
                      return true;
                  case 133:
                      return node.parent.kind === 202;
                  case 130:
                      return node.parent.body && node.parent.parent.kind === 202;
                  case 137:
                  case 138:
                  case 135:
                      return node.body && node.parent.kind === 202;
              }
              return false;
          }
          ts.nodeCanBeDecorated = nodeCanBeDecorated;
          function nodeIsDecorated(node) {
              switch (node.kind) {
                  case 202:
                      if (node.decorators) {
                          return true;
                      }
                      return false;
                  case 133:
                  case 130:
                      if (node.decorators) {
                          return true;
                      }
                      return false;
                  case 137:
                      if (node.body && node.decorators) {
                          return true;
                      }
                      return false;
                  case 135:
                  case 138:
                      if (node.body && node.decorators) {
                          return true;
                      }
                      return false;
              }
              return false;
          }
          ts.nodeIsDecorated = nodeIsDecorated;
          function childIsDecorated(node) {
              switch (node.kind) {
                  case 202:
                      return ts.forEach(node.members, nodeOrChildIsDecorated);
                  case 135:
                  case 138:
                      return ts.forEach(node.parameters, nodeIsDecorated);
              }
              return false;
          }
          ts.childIsDecorated = childIsDecorated;
          function nodeOrChildIsDecorated(node) {
              return nodeIsDecorated(node) || childIsDecorated(node);
          }
          ts.nodeOrChildIsDecorated = nodeOrChildIsDecorated;
          function isExpression(node) {
              switch (node.kind) {
                  case 93:
                  case 91:
                  case 89:
                  case 95:
                  case 80:
                  case 9:
                  case 154:
                  case 155:
                  case 156:
                  case 157:
                  case 158:
                  case 159:
                  case 160:
                  case 161:
                  case 162:
                  case 163:
                  case 175:
                  case 164:
                  case 167:
                  case 165:
                  case 166:
                  case 168:
                  case 169:
                  case 170:
                  case 171:
                  case 174:
                  case 172:
                  case 10:
                  case 176:
                      return true;
                  case 127:
                      while (node.parent.kind === 127) {
                          node = node.parent;
                      }
                      return node.parent.kind === 145;
                  case 65:
                      if (node.parent.kind === 145) {
                          return true;
                      }
                  case 7:
                  case 8:
                      var parent_1 = node.parent;
                      switch (parent_1.kind) {
                          case 199:
                          case 130:
                          case 133:
                          case 132:
                          case 227:
                          case 225:
                          case 153:
                              return parent_1.initializer === node;
                          case 183:
                          case 184:
                          case 185:
                          case 186:
                          case 192:
                          case 193:
                          case 194:
                          case 221:
                          case 196:
                          case 194:
                              return parent_1.expression === node;
                          case 187:
                              var forStatement = parent_1;
                              return (forStatement.initializer === node && forStatement.initializer.kind !== 200) ||
                                  forStatement.condition === node ||
                                  forStatement.incrementor === node;
                          case 188:
                          case 189:
                              var forInStatement = parent_1;
                              return (forInStatement.initializer === node && forInStatement.initializer.kind !== 200) ||
                                  forInStatement.expression === node;
                          case 161:
                              return node === parent_1.expression;
                          case 178:
                              return node === parent_1.expression;
                          case 128:
                              return node === parent_1.expression;
                          case 131:
                              return true;
                          default:
                              if (isExpression(parent_1)) {
                                  return true;
                              }
                      }
              }
              return false;
          }
          ts.isExpression = isExpression;
          function isInstantiatedModule(node, preserveConstEnums) {
              var moduleState = ts.getModuleInstanceState(node);
              return moduleState === 1 ||
                  (preserveConstEnums && moduleState === 2);
          }
          ts.isInstantiatedModule = isInstantiatedModule;
          function isExternalModuleImportEqualsDeclaration(node) {
              return node.kind === 209 && node.moduleReference.kind === 220;
          }
          ts.isExternalModuleImportEqualsDeclaration = isExternalModuleImportEqualsDeclaration;
          function getExternalModuleImportEqualsDeclarationExpression(node) {
              ts.Debug.assert(isExternalModuleImportEqualsDeclaration(node));
              return node.moduleReference.expression;
          }
          ts.getExternalModuleImportEqualsDeclarationExpression = getExternalModuleImportEqualsDeclarationExpression;
          function isInternalModuleImportEqualsDeclaration(node) {
              return node.kind === 209 && node.moduleReference.kind !== 220;
          }
          ts.isInternalModuleImportEqualsDeclaration = isInternalModuleImportEqualsDeclaration;
          function getExternalModuleName(node) {
              if (node.kind === 210) {
                  return node.moduleSpecifier;
              }
              if (node.kind === 209) {
                  var reference = node.moduleReference;
                  if (reference.kind === 220) {
                      return reference.expression;
                  }
              }
              if (node.kind === 216) {
                  return node.moduleSpecifier;
              }
          }
          ts.getExternalModuleName = getExternalModuleName;
          function hasDotDotDotToken(node) {
              return node && node.kind === 130 && node.dotDotDotToken !== undefined;
          }
          ts.hasDotDotDotToken = hasDotDotDotToken;
          function hasQuestionToken(node) {
              if (node) {
                  switch (node.kind) {
                      case 130:
                          return node.questionToken !== undefined;
                      case 135:
                      case 134:
                          return node.questionToken !== undefined;
                      case 226:
                      case 225:
                      case 133:
                      case 132:
                          return node.questionToken !== undefined;
                  }
              }
              return false;
          }
          ts.hasQuestionToken = hasQuestionToken;
          function hasRestParameters(s) {
              return s.parameters.length > 0 && ts.lastOrUndefined(s.parameters).dotDotDotToken !== undefined;
          }
          ts.hasRestParameters = hasRestParameters;
          function isLiteralKind(kind) {
              return 7 <= kind && kind <= 10;
          }
          ts.isLiteralKind = isLiteralKind;
          function isTextualLiteralKind(kind) {
              return kind === 8 || kind === 10;
          }
          ts.isTextualLiteralKind = isTextualLiteralKind;
          function isTemplateLiteralKind(kind) {
              return 10 <= kind && kind <= 13;
          }
          ts.isTemplateLiteralKind = isTemplateLiteralKind;
          function isBindingPattern(node) {
              return !!node && (node.kind === 152 || node.kind === 151);
          }
          ts.isBindingPattern = isBindingPattern;
          function isInAmbientContext(node) {
              while (node) {
                  if (node.flags & (2 | 2048)) {
                      return true;
                  }
                  node = node.parent;
              }
              return false;
          }
          ts.isInAmbientContext = isInAmbientContext;
          function isDeclaration(node) {
              switch (node.kind) {
                  case 164:
                  case 153:
                  case 202:
                  case 136:
                  case 205:
                  case 227:
                  case 218:
                  case 201:
                  case 163:
                  case 137:
                  case 211:
                  case 209:
                  case 214:
                  case 203:
                  case 135:
                  case 134:
                  case 206:
                  case 212:
                  case 130:
                  case 225:
                  case 133:
                  case 132:
                  case 138:
                  case 226:
                  case 204:
                  case 129:
                  case 199:
                      return true;
              }
              return false;
          }
          ts.isDeclaration = isDeclaration;
          function isStatement(n) {
              switch (n.kind) {
                  case 191:
                  case 190:
                  case 198:
                  case 185:
                  case 183:
                  case 182:
                  case 188:
                  case 189:
                  case 187:
                  case 184:
                  case 195:
                  case 192:
                  case 194:
                  case 94:
                  case 197:
                  case 181:
                  case 186:
                  case 193:
                  case 215:
                      return true;
                  default:
                      return false;
              }
          }
          ts.isStatement = isStatement;
          function isClassElement(n) {
              switch (n.kind) {
                  case 136:
                  case 133:
                  case 135:
                  case 137:
                  case 138:
                  case 134:
                  case 141:
                      return true;
                  default:
                      return false;
              }
          }
          ts.isClassElement = isClassElement;
          function isDeclarationName(name) {
              if (name.kind !== 65 && name.kind !== 8 && name.kind !== 7) {
                  return false;
              }
              var parent = name.parent;
              if (parent.kind === 214 || parent.kind === 218) {
                  if (parent.propertyName) {
                      return true;
                  }
              }
              if (isDeclaration(parent)) {
                  return parent.name === name;
              }
              return false;
          }
          ts.isDeclarationName = isDeclarationName;
          function isAliasSymbolDeclaration(node) {
              return node.kind === 209 ||
                  node.kind === 211 && !!node.name ||
                  node.kind === 212 ||
                  node.kind === 214 ||
                  node.kind === 218 ||
                  node.kind === 215 && node.expression.kind === 65;
          }
          ts.isAliasSymbolDeclaration = isAliasSymbolDeclaration;
          function getClassExtendsHeritageClauseElement(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 79);
              return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : undefined;
          }
          ts.getClassExtendsHeritageClauseElement = getClassExtendsHeritageClauseElement;
          function getClassImplementsHeritageClauseElements(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 102);
              return heritageClause ? heritageClause.types : undefined;
          }
          ts.getClassImplementsHeritageClauseElements = getClassImplementsHeritageClauseElements;
          function getInterfaceBaseTypeNodes(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 79);
              return heritageClause ? heritageClause.types : undefined;
          }
          ts.getInterfaceBaseTypeNodes = getInterfaceBaseTypeNodes;
          function getHeritageClause(clauses, kind) {
              if (clauses) {
                  for (var _i = 0; _i < clauses.length; _i++) {
                      var clause = clauses[_i];
                      if (clause.token === kind) {
                          return clause;
                      }
                  }
              }
              return undefined;
          }
          ts.getHeritageClause = getHeritageClause;
          function tryResolveScriptReference(host, sourceFile, reference) {
              if (!host.getCompilerOptions().noResolve) {
                  var referenceFileName = ts.isRootedDiskPath(reference.fileName) ? reference.fileName : ts.combinePaths(ts.getDirectoryPath(sourceFile.fileName), reference.fileName);
                  referenceFileName = ts.getNormalizedAbsolutePath(referenceFileName, host.getCurrentDirectory());
                  return host.getSourceFile(referenceFileName);
              }
          }
          ts.tryResolveScriptReference = tryResolveScriptReference;
          function getAncestor(node, kind) {
              while (node) {
                  if (node.kind === kind) {
                      return node;
                  }
                  node = node.parent;
              }
              return undefined;
          }
          ts.getAncestor = getAncestor;
          function getFileReferenceFromReferencePath(comment, commentRange) {
              var simpleReferenceRegEx = /^\/\/\/\s*<reference\s+/gim;
              var isNoDefaultLibRegEx = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)('|")(.+?)\2\s*\/>/gim;
              if (simpleReferenceRegEx.exec(comment)) {
                  if (isNoDefaultLibRegEx.exec(comment)) {
                      return {
                          isNoDefaultLib: true
                      };
                  }
                  else {
                      var matchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment);
                      if (matchResult) {
                          var start = commentRange.pos;
                          var end = commentRange.end;
                          return {
                              fileReference: {
                                  pos: start,
                                  end: end,
                                  fileName: matchResult[3]
                              },
                              isNoDefaultLib: false
                          };
                      }
                      else {
                          return {
                              diagnosticMessage: ts.Diagnostics.Invalid_reference_directive_syntax,
                              isNoDefaultLib: false
                          };
                      }
                  }
              }
              return undefined;
          }
          ts.getFileReferenceFromReferencePath = getFileReferenceFromReferencePath;
          function isKeyword(token) {
              return 66 <= token && token <= 126;
          }
          ts.isKeyword = isKeyword;
          function isTrivia(token) {
              return 2 <= token && token <= 6;
          }
          ts.isTrivia = isTrivia;
          function hasDynamicName(declaration) {
              return declaration.name &&
                  declaration.name.kind === 128 &&
                  !isWellKnownSymbolSyntactically(declaration.name.expression);
          }
          ts.hasDynamicName = hasDynamicName;
          function isWellKnownSymbolSyntactically(node) {
              return node.kind === 156 && isESSymbolIdentifier(node.expression);
          }
          ts.isWellKnownSymbolSyntactically = isWellKnownSymbolSyntactically;
          function getPropertyNameForPropertyNameNode(name) {
              if (name.kind === 65 || name.kind === 8 || name.kind === 7) {
                  return name.text;
              }
              if (name.kind === 128) {
                  var nameExpression = name.expression;
                  if (isWellKnownSymbolSyntactically(nameExpression)) {
                      var rightHandSideName = nameExpression.name.text;
                      return getPropertyNameForKnownSymbolName(rightHandSideName);
                  }
              }
              return undefined;
          }
          ts.getPropertyNameForPropertyNameNode = getPropertyNameForPropertyNameNode;
          function getPropertyNameForKnownSymbolName(symbolName) {
              return "__@" + symbolName;
          }
          ts.getPropertyNameForKnownSymbolName = getPropertyNameForKnownSymbolName;
          function isESSymbolIdentifier(node) {
              return node.kind === 65 && node.text === "Symbol";
          }
          ts.isESSymbolIdentifier = isESSymbolIdentifier;
          function isModifier(token) {
              switch (token) {
                  case 108:
                  case 106:
                  case 107:
                  case 109:
                  case 78:
                  case 115:
                  case 70:
                  case 73:
                      return true;
              }
              return false;
          }
          ts.isModifier = isModifier;
          function isParameterDeclaration(node) {
              var root = getRootDeclaration(node);
              return root.kind === 130;
          }
          ts.isParameterDeclaration = isParameterDeclaration;
          function getRootDeclaration(node) {
              while (node.kind === 153) {
                  node = node.parent.parent;
              }
              return node;
          }
          ts.getRootDeclaration = getRootDeclaration;
          function nodeStartsNewLexicalEnvironment(n) {
              return isFunctionLike(n) || n.kind === 206 || n.kind === 228;
          }
          ts.nodeStartsNewLexicalEnvironment = nodeStartsNewLexicalEnvironment;
          function nodeIsSynthesized(node) {
              return node.pos === -1;
          }
          ts.nodeIsSynthesized = nodeIsSynthesized;
          function createSynthesizedNode(kind, startsOnNewLine) {
              var node = ts.createNode(kind);
              node.pos = -1;
              node.end = -1;
              node.startsOnNewLine = startsOnNewLine;
              return node;
          }
          ts.createSynthesizedNode = createSynthesizedNode;
          function createSynthesizedNodeArray() {
              var array = [];
              array.pos = -1;
              array.end = -1;
              return array;
          }
          ts.createSynthesizedNodeArray = createSynthesizedNodeArray;
          function createDiagnosticCollection() {
              var nonFileDiagnostics = [];
              var fileDiagnostics = {};
              var diagnosticsModified = false;
              var modificationCount = 0;
              return {
                  add: add,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getDiagnostics: getDiagnostics,
                  getModificationCount: getModificationCount
              };
              function getModificationCount() {
                  return modificationCount;
              }
              function add(diagnostic) {
                  var diagnostics;
                  if (diagnostic.file) {
                      diagnostics = fileDiagnostics[diagnostic.file.fileName];
                      if (!diagnostics) {
                          diagnostics = [];
                          fileDiagnostics[diagnostic.file.fileName] = diagnostics;
                      }
                  }
                  else {
                      diagnostics = nonFileDiagnostics;
                  }
                  diagnostics.push(diagnostic);
                  diagnosticsModified = true;
                  modificationCount++;
              }
              function getGlobalDiagnostics() {
                  sortAndDeduplicate();
                  return nonFileDiagnostics;
              }
              function getDiagnostics(fileName) {
                  sortAndDeduplicate();
                  if (fileName) {
                      return fileDiagnostics[fileName] || [];
                  }
                  var allDiagnostics = [];
                  function pushDiagnostic(d) {
                      allDiagnostics.push(d);
                  }
                  ts.forEach(nonFileDiagnostics, pushDiagnostic);
                  for (var key in fileDiagnostics) {
                      if (ts.hasProperty(fileDiagnostics, key)) {
                          ts.forEach(fileDiagnostics[key], pushDiagnostic);
                      }
                  }
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function sortAndDeduplicate() {
                  if (!diagnosticsModified) {
                      return;
                  }
                  diagnosticsModified = false;
                  nonFileDiagnostics = ts.sortAndDeduplicateDiagnostics(nonFileDiagnostics);
                  for (var key in fileDiagnostics) {
                      if (ts.hasProperty(fileDiagnostics, key)) {
                          fileDiagnostics[key] = ts.sortAndDeduplicateDiagnostics(fileDiagnostics[key]);
                      }
                  }
              }
          }
          ts.createDiagnosticCollection = createDiagnosticCollection;
          var escapedCharsRegExp = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
          var escapedCharsMap = {
              "\0": "\\0",
              "\t": "\\t",
              "\v": "\\v",
              "\f": "\\f",
              "\b": "\\b",
              "\r": "\\r",
              "\n": "\\n",
              "\\": "\\\\",
              "\"": "\\\"",
              "\u2028": "\\u2028",
              "\u2029": "\\u2029",
              "\u0085": "\\u0085"
          };
          function escapeString(s) {
              s = escapedCharsRegExp.test(s) ? s.replace(escapedCharsRegExp, getReplacement) : s;
              return s;
              function getReplacement(c) {
                  return escapedCharsMap[c] || get16BitUnicodeEscapeSequence(c.charCodeAt(0));
              }
          }
          ts.escapeString = escapeString;
          function get16BitUnicodeEscapeSequence(charCode) {
              var hexCharCode = charCode.toString(16).toUpperCase();
              var paddedHexCode = ("0000" + hexCharCode).slice(-4);
              return "\\u" + paddedHexCode;
          }
          var nonAsciiCharacters = /[^\u0000-\u007F]/g;
          function escapeNonAsciiCharacters(s) {
              return nonAsciiCharacters.test(s) ?
                  s.replace(nonAsciiCharacters, function (c) { return get16BitUnicodeEscapeSequence(c.charCodeAt(0)); }) :
                  s;
          }
          ts.escapeNonAsciiCharacters = escapeNonAsciiCharacters;
          var indentStrings = ["", "    "];
          function getIndentString(level) {
              if (indentStrings[level] === undefined) {
                  indentStrings[level] = getIndentString(level - 1) + indentStrings[1];
              }
              return indentStrings[level];
          }
          ts.getIndentString = getIndentString;
          function getIndentSize() {
              return indentStrings[1].length;
          }
          ts.getIndentSize = getIndentSize;
          function createTextWriter(newLine) {
              var output = "";
              var indent = 0;
              var lineStart = true;
              var lineCount = 0;
              var linePos = 0;
              function write(s) {
                  if (s && s.length) {
                      if (lineStart) {
                          output += getIndentString(indent);
                          lineStart = false;
                      }
                      output += s;
                  }
              }
              function rawWrite(s) {
                  if (s !== undefined) {
                      if (lineStart) {
                          lineStart = false;
                      }
                      output += s;
                  }
              }
              function writeLiteral(s) {
                  if (s && s.length) {
                      write(s);
                      var lineStartsOfS = ts.computeLineStarts(s);
                      if (lineStartsOfS.length > 1) {
                          lineCount = lineCount + lineStartsOfS.length - 1;
                          linePos = output.length - s.length + ts.lastOrUndefined(lineStartsOfS);
                      }
                  }
              }
              function writeLine() {
                  if (!lineStart) {
                      output += newLine;
                      lineCount++;
                      linePos = output.length;
                      lineStart = true;
                  }
              }
              function writeTextOfNode(sourceFile, node) {
                  write(getSourceTextOfNodeFromSourceFile(sourceFile, node));
              }
              return {
                  write: write,
                  rawWrite: rawWrite,
                  writeTextOfNode: writeTextOfNode,
                  writeLiteral: writeLiteral,
                  writeLine: writeLine,
                  increaseIndent: function () { return indent++; },
                  decreaseIndent: function () { return indent--; },
                  getIndent: function () { return indent; },
                  getTextPos: function () { return output.length; },
                  getLine: function () { return lineCount + 1; },
                  getColumn: function () { return lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1; },
                  getText: function () { return output; }
              };
          }
          ts.createTextWriter = createTextWriter;
          function getOwnEmitOutputFilePath(sourceFile, host, extension) {
              var compilerOptions = host.getCompilerOptions();
              var emitOutputFilePathWithoutExtension;
              if (compilerOptions.outDir) {
                  emitOutputFilePathWithoutExtension = ts.removeFileExtension(getSourceFilePathInNewDir(sourceFile, host, compilerOptions.outDir));
              }
              else {
                  emitOutputFilePathWithoutExtension = ts.removeFileExtension(sourceFile.fileName);
              }
              return emitOutputFilePathWithoutExtension + extension;
          }
          ts.getOwnEmitOutputFilePath = getOwnEmitOutputFilePath;
          function getSourceFilePathInNewDir(sourceFile, host, newDirPath) {
              var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory());
              sourceFilePath = sourceFilePath.replace(host.getCommonSourceDirectory(), "");
              return ts.combinePaths(newDirPath, sourceFilePath);
          }
          ts.getSourceFilePathInNewDir = getSourceFilePathInNewDir;
          function writeFile(host, diagnostics, fileName, data, writeByteOrderMark) {
              host.writeFile(fileName, data, writeByteOrderMark, function (hostErrorMessage) {
                  diagnostics.push(ts.createCompilerDiagnostic(ts.Diagnostics.Could_not_write_file_0_Colon_1, fileName, hostErrorMessage));
              });
          }
          ts.writeFile = writeFile;
          function getLineOfLocalPosition(currentSourceFile, pos) {
              return ts.getLineAndCharacterOfPosition(currentSourceFile, pos).line;
          }
          ts.getLineOfLocalPosition = getLineOfLocalPosition;
          function getFirstConstructorWithBody(node) {
              return ts.forEach(node.members, function (member) {
                  if (member.kind === 136 && nodeIsPresent(member.body)) {
                      return member;
                  }
              });
          }
          ts.getFirstConstructorWithBody = getFirstConstructorWithBody;
          function shouldEmitToOwnFile(sourceFile, compilerOptions) {
              if (!isDeclarationFile(sourceFile)) {
                  if ((isExternalModule(sourceFile) || !compilerOptions.out)) {
                      return compilerOptions.separateCompilation || !ts.fileExtensionIs(sourceFile.fileName, ".js");
                  }
                  return false;
              }
              return false;
          }
          ts.shouldEmitToOwnFile = shouldEmitToOwnFile;
          function getAllAccessorDeclarations(declarations, accessor) {
              var firstAccessor;
              var secondAccessor;
              var getAccessor;
              var setAccessor;
              if (hasDynamicName(accessor)) {
                  firstAccessor = accessor;
                  if (accessor.kind === 137) {
                      getAccessor = accessor;
                  }
                  else if (accessor.kind === 138) {
                      setAccessor = accessor;
                  }
                  else {
                      ts.Debug.fail("Accessor has wrong kind");
                  }
              }
              else {
                  ts.forEach(declarations, function (member) {
                      if ((member.kind === 137 || member.kind === 138)
                          && (member.flags & 128) === (accessor.flags & 128)) {
                          var memberName = getPropertyNameForPropertyNameNode(member.name);
                          var accessorName = getPropertyNameForPropertyNameNode(accessor.name);
                          if (memberName === accessorName) {
                              if (!firstAccessor) {
                                  firstAccessor = member;
                              }
                              else if (!secondAccessor) {
                                  secondAccessor = member;
                              }
                              if (member.kind === 137 && !getAccessor) {
                                  getAccessor = member;
                              }
                              if (member.kind === 138 && !setAccessor) {
                                  setAccessor = member;
                              }
                          }
                      }
                  });
              }
              return {
                  firstAccessor: firstAccessor,
                  secondAccessor: secondAccessor,
                  getAccessor: getAccessor,
                  setAccessor: setAccessor
              };
          }
          ts.getAllAccessorDeclarations = getAllAccessorDeclarations;
          function emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments) {
              if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos &&
                  getLineOfLocalPosition(currentSourceFile, node.pos) !== getLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) {
                  writer.writeLine();
              }
          }
          ts.emitNewLineBeforeLeadingComments = emitNewLineBeforeLeadingComments;
          function emitComments(currentSourceFile, writer, comments, trailingSeparator, newLine, writeComment) {
              var emitLeadingSpace = !trailingSeparator;
              ts.forEach(comments, function (comment) {
                  if (emitLeadingSpace) {
                      writer.write(" ");
                      emitLeadingSpace = false;
                  }
                  writeComment(currentSourceFile, writer, comment, newLine);
                  if (comment.hasTrailingNewLine) {
                      writer.writeLine();
                  }
                  else if (trailingSeparator) {
                      writer.write(" ");
                  }
                  else {
                      emitLeadingSpace = true;
                  }
              });
          }
          ts.emitComments = emitComments;
          function writeCommentRange(currentSourceFile, writer, comment, newLine) {
              if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
                  var firstCommentLineAndCharacter = ts.getLineAndCharacterOfPosition(currentSourceFile, comment.pos);
                  var lineCount = ts.getLineStarts(currentSourceFile).length;
                  var firstCommentLineIndent;
                  for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) {
                      var nextLineStart = (currentLine + 1) === lineCount
                          ? currentSourceFile.text.length + 1
                          : getStartPositionOfLine(currentLine + 1, currentSourceFile);
                      if (pos !== comment.pos) {
                          if (firstCommentLineIndent === undefined) {
                              firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos);
                          }
                          var currentWriterIndentSpacing = writer.getIndent() * getIndentSize();
                          var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(pos, nextLineStart);
                          if (spacesToEmit > 0) {
                              var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize();
                              var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize());
                              writer.rawWrite(indentSizeSpaceString);
                              while (numberOfSingleSpacesToEmit) {
                                  writer.rawWrite(" ");
                                  numberOfSingleSpacesToEmit--;
                              }
                          }
                          else {
                              writer.rawWrite("");
                          }
                      }
                      writeTrimmedCurrentLine(pos, nextLineStart);
                      pos = nextLineStart;
                  }
              }
              else {
                  writer.write(currentSourceFile.text.substring(comment.pos, comment.end));
              }
              function writeTrimmedCurrentLine(pos, nextLineStart) {
                  var end = Math.min(comment.end, nextLineStart - 1);
                  var currentLineText = currentSourceFile.text.substring(pos, end).replace(/^\s+|\s+$/g, '');
                  if (currentLineText) {
                      writer.write(currentLineText);
                      if (end !== comment.end) {
                          writer.writeLine();
                      }
                  }
                  else {
                      writer.writeLiteral(newLine);
                  }
              }
              function calculateIndent(pos, end) {
                  var currentLineIndent = 0;
                  for (; pos < end && ts.isWhiteSpace(currentSourceFile.text.charCodeAt(pos)); pos++) {
                      if (currentSourceFile.text.charCodeAt(pos) === 9) {
                          currentLineIndent += getIndentSize() - (currentLineIndent % getIndentSize());
                      }
                      else {
                          currentLineIndent++;
                      }
                  }
                  return currentLineIndent;
              }
          }
          ts.writeCommentRange = writeCommentRange;
          function modifierToFlag(token) {
              switch (token) {
                  case 109: return 128;
                  case 108: return 16;
                  case 107: return 64;
                  case 106: return 32;
                  case 78: return 1;
                  case 115: return 2;
                  case 70: return 8192;
                  case 73: return 256;
              }
              return 0;
          }
          ts.modifierToFlag = modifierToFlag;
          function isLeftHandSideExpression(expr) {
              if (expr) {
                  switch (expr.kind) {
                      case 156:
                      case 157:
                      case 159:
                      case 158:
                      case 160:
                      case 154:
                      case 162:
                      case 155:
                      case 175:
                      case 163:
                      case 65:
                      case 9:
                      case 7:
                      case 8:
                      case 10:
                      case 172:
                      case 80:
                      case 89:
                      case 93:
                      case 95:
                      case 91:
                          return true;
                  }
              }
              return false;
          }
          ts.isLeftHandSideExpression = isLeftHandSideExpression;
          function isAssignmentOperator(token) {
              return token >= 53 && token <= 64;
          }
          ts.isAssignmentOperator = isAssignmentOperator;
          function isSupportedExpressionWithTypeArguments(node) {
              return isSupportedExpressionWithTypeArgumentsRest(node.expression);
          }
          ts.isSupportedExpressionWithTypeArguments = isSupportedExpressionWithTypeArguments;
          function isSupportedExpressionWithTypeArgumentsRest(node) {
              if (node.kind === 65) {
                  return true;
              }
              else if (node.kind === 156) {
                  return isSupportedExpressionWithTypeArgumentsRest(node.expression);
              }
              else {
                  return false;
              }
          }
          function isRightSideOfQualifiedNameOrPropertyAccess(node) {
              return (node.parent.kind === 127 && node.parent.right === node) ||
                  (node.parent.kind === 156 && node.parent.name === node);
          }
          ts.isRightSideOfQualifiedNameOrPropertyAccess = isRightSideOfQualifiedNameOrPropertyAccess;
          function getLocalSymbolForExportDefault(symbol) {
              return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & 256) ? symbol.valueDeclaration.localSymbol : undefined;
          }
          ts.getLocalSymbolForExportDefault = getLocalSymbolForExportDefault;
          function getExpandedCharCodes(input) {
              var output = [];
              var length = input.length;
              var leadSurrogate = undefined;
              for (var i = 0; i < length; i++) {
                  var charCode = input.charCodeAt(i);
                  if (charCode < 0x80) {
                      output.push(charCode);
                  }
                  else if (charCode < 0x800) {
                      output.push((charCode >> 6) | 192);
                      output.push((charCode & 63) | 128);
                  }
                  else if (charCode < 0x10000) {
                      output.push((charCode >> 12) | 224);
                      output.push(((charCode >> 6) & 63) | 128);
                      output.push((charCode & 63) | 128);
                  }
                  else if (charCode < 0x20000) {
                      output.push((charCode >> 18) | 240);
                      output.push(((charCode >> 12) & 63) | 128);
                      output.push(((charCode >> 6) & 63) | 128);
                      output.push((charCode & 63) | 128);
                  }
                  else {
                      ts.Debug.assert(false, "Unexpected code point");
                  }
              }
              return output;
          }
          var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
          function convertToBase64(input) {
              var result = "";
              var charCodes = getExpandedCharCodes(input);
              var i = 0;
              var length = charCodes.length;
              var byte1, byte2, byte3, byte4;
              while (i < length) {
                  byte1 = charCodes[i] >> 2;
                  byte2 = (charCodes[i] & 3) << 4 | charCodes[i + 1] >> 4;
                  byte3 = (charCodes[i + 1] & 15) << 2 | charCodes[i + 2] >> 6;
                  byte4 = charCodes[i + 2] & 63;
                  if (i + 1 >= length) {
                      byte3 = byte4 = 64;
                  }
                  else if (i + 2 >= length) {
                      byte4 = 64;
                  }
                  result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
                  i += 3;
              }
              return result;
          }
          ts.convertToBase64 = convertToBase64;
      })(ts || (ts = {}));
      var ts;
      (function (ts) {
          function getDefaultLibFileName(options) {
              return options.target === 2 ? "lib.es6.d.ts" : "lib.d.ts";
          }
          ts.getDefaultLibFileName = getDefaultLibFileName;
          function textSpanEnd(span) {
              return span.start + span.length;
          }
          ts.textSpanEnd = textSpanEnd;
          function textSpanIsEmpty(span) {
              return span.length === 0;
          }
          ts.textSpanIsEmpty = textSpanIsEmpty;
          function textSpanContainsPosition(span, position) {
              return position >= span.start && position < textSpanEnd(span);
          }
          ts.textSpanContainsPosition = textSpanContainsPosition;
          function textSpanContainsTextSpan(span, other) {
              return other.start >= span.start && textSpanEnd(other) <= textSpanEnd(span);
          }
          ts.textSpanContainsTextSpan = textSpanContainsTextSpan;
          function textSpanOverlapsWith(span, other) {
              var overlapStart = Math.max(span.start, other.start);
              var overlapEnd = Math.min(textSpanEnd(span), textSpanEnd(other));
              return overlapStart < overlapEnd;
          }
          ts.textSpanOverlapsWith = textSpanOverlapsWith;
          function textSpanOverlap(span1, span2) {
              var overlapStart = Math.max(span1.start, span2.start);
              var overlapEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
              if (overlapStart < overlapEnd) {
                  return createTextSpanFromBounds(overlapStart, overlapEnd);
              }
              return undefined;
          }
          ts.textSpanOverlap = textSpanOverlap;
          function textSpanIntersectsWithTextSpan(span, other) {
              return other.start <= textSpanEnd(span) && textSpanEnd(other) >= span.start;
          }
          ts.textSpanIntersectsWithTextSpan = textSpanIntersectsWithTextSpan;
          function textSpanIntersectsWith(span, start, length) {
              var end = start + length;
              return start <= textSpanEnd(span) && end >= span.start;
          }
          ts.textSpanIntersectsWith = textSpanIntersectsWith;
          function textSpanIntersectsWithPosition(span, position) {
              return position <= textSpanEnd(span) && position >= span.start;
          }
          ts.textSpanIntersectsWithPosition = textSpanIntersectsWithPosition;
          function textSpanIntersection(span1, span2) {
              var intersectStart = Math.max(span1.start, span2.start);
              var intersectEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
              if (intersectStart <= intersectEnd) {
                  return createTextSpanFromBounds(intersectStart, intersectEnd);
              }
              return undefined;
          }
          ts.textSpanIntersection = textSpanIntersection;
          function createTextSpan(start, length) {
              if (start < 0) {
                  throw new Error("start < 0");
              }
              if (length < 0) {
                  throw new Error("length < 0");
              }
              return { start: start, length: length };
          }
          ts.createTextSpan = createTextSpan;
          function createTextSpanFromBounds(start, end) {
              return createTextSpan(start, end - start);
          }
          ts.createTextSpanFromBounds = createTextSpanFromBounds;
          function textChangeRangeNewSpan(range) {
              return createTextSpan(range.span.start, range.newLength);
          }
          ts.textChangeRangeNewSpan = textChangeRangeNewSpan;
          function textChangeRangeIsUnchanged(range) {
              return textSpanIsEmpty(range.span) && range.newLength === 0;
          }
          ts.textChangeRangeIsUnchanged = textChangeRangeIsUnchanged;
          function createTextChangeRange(span, newLength) {
              if (newLength < 0) {
                  throw new Error("newLength < 0");
              }
              return { span: span, newLength: newLength };
          }
          ts.createTextChangeRange = createTextChangeRange;
          ts.unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0);
          function collapseTextChangeRangesAcrossMultipleVersions(changes) {
              if (changes.length === 0) {
                  return ts.unchangedTextChangeRange;
              }
              if (changes.length === 1) {
                  return changes[0];
              }
              var change0 = changes[0];
              var oldStartN = change0.span.start;
              var oldEndN = textSpanEnd(change0.span);
              var newEndN = oldStartN + change0.newLength;
              for (var i = 1; i < changes.length; i++) {
                  var nextChange = changes[i];
                  var oldStart1 = oldStartN;
                  var oldEnd1 = oldEndN;
                  var newEnd1 = newEndN;
                  var oldStart2 = nextChange.span.start;
                  var oldEnd2 = textSpanEnd(nextChange.span);
                  var newEnd2 = oldStart2 + nextChange.newLength;
                  oldStartN = Math.min(oldStart1, oldStart2);
                  oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1));
                  newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2));
              }
              return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), newEndN - oldStartN);
          }
          ts.collapseTextChangeRangesAcrossMultipleVersions = collapseTextChangeRangesAcrossMultipleVersions;
      })(ts || (ts = {}));
      /// <reference path="scanner.ts"/>
      /// <reference path="utilities.ts"/>
      var ts;
      (function (ts) {
          var nodeConstructors = new Array(230);
          ts.parseTime = 0;
          function getNodeConstructor(kind) {
              return nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind));
          }
          ts.getNodeConstructor = getNodeConstructor;
          function createNode(kind) {
              return new (getNodeConstructor(kind))();
          }
          ts.createNode = createNode;
          function visitNode(cbNode, node) {
              if (node) {
                  return cbNode(node);
              }
          }
          function visitNodeArray(cbNodes, nodes) {
              if (nodes) {
                  return cbNodes(nodes);
              }
          }
          function visitEachNode(cbNode, nodes) {
              if (nodes) {
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      var result = cbNode(node);
                      if (result) {
                          return result;
                      }
                  }
              }
          }
          function forEachChild(node, cbNode, cbNodeArray) {
              if (!node) {
                  return;
              }
              var visitNodes = cbNodeArray ? visitNodeArray : visitEachNode;
              var cbNodes = cbNodeArray || cbNode;
              switch (node.kind) {
                  case 127:
                      return visitNode(cbNode, node.left) ||
                          visitNode(cbNode, node.right);
                  case 129:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.constraint) ||
                          visitNode(cbNode, node.expression);
                  case 130:
                  case 133:
                  case 132:
                  case 225:
                  case 226:
                  case 199:
                  case 153:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.propertyName) ||
                          visitNode(cbNode, node.dotDotDotToken) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.initializer);
                  case 143:
                  case 144:
                  case 139:
                  case 140:
                  case 141:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.parameters) ||
                          visitNode(cbNode, node.type);
                  case 135:
                  case 134:
                  case 136:
                  case 137:
                  case 138:
                  case 163:
                  case 201:
                  case 164:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.asteriskToken) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.parameters) ||
                          visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.equalsGreaterThanToken) ||
                          visitNode(cbNode, node.body);
                  case 142:
                      return visitNode(cbNode, node.typeName) ||
                          visitNodes(cbNodes, node.typeArguments);
                  case 145:
                      return visitNode(cbNode, node.exprName);
                  case 146:
                      return visitNodes(cbNodes, node.members);
                  case 147:
                      return visitNode(cbNode, node.elementType);
                  case 148:
                      return visitNodes(cbNodes, node.elementTypes);
                  case 149:
                      return visitNodes(cbNodes, node.types);
                  case 150:
                      return visitNode(cbNode, node.type);
                  case 151:
                  case 152:
                      return visitNodes(cbNodes, node.elements);
                  case 154:
                      return visitNodes(cbNodes, node.elements);
                  case 155:
                      return visitNodes(cbNodes, node.properties);
                  case 156:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.dotToken) ||
                          visitNode(cbNode, node.name);
                  case 157:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.argumentExpression);
                  case 158:
                  case 159:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.typeArguments) ||
                          visitNodes(cbNodes, node.arguments);
                  case 160:
                      return visitNode(cbNode, node.tag) ||
                          visitNode(cbNode, node.template);
                  case 161:
                      return visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.expression);
                  case 162:
                      return visitNode(cbNode, node.expression);
                  case 165:
                      return visitNode(cbNode, node.expression);
                  case 166:
                      return visitNode(cbNode, node.expression);
                  case 167:
                      return visitNode(cbNode, node.expression);
                  case 168:
                      return visitNode(cbNode, node.operand);
                  case 173:
                      return visitNode(cbNode, node.asteriskToken) ||
                          visitNode(cbNode, node.expression);
                  case 169:
                      return visitNode(cbNode, node.operand);
                  case 170:
                      return visitNode(cbNode, node.left) ||
                          visitNode(cbNode, node.operatorToken) ||
                          visitNode(cbNode, node.right);
                  case 171:
                      return visitNode(cbNode, node.condition) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNode(cbNode, node.whenTrue) ||
                          visitNode(cbNode, node.colonToken) ||
                          visitNode(cbNode, node.whenFalse);
                  case 174:
                      return visitNode(cbNode, node.expression);
                  case 180:
                  case 207:
                      return visitNodes(cbNodes, node.statements);
                  case 228:
                      return visitNodes(cbNodes, node.statements) ||
                          visitNode(cbNode, node.endOfFileToken);
                  case 181:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.declarationList);
                  case 200:
                      return visitNodes(cbNodes, node.declarations);
                  case 183:
                      return visitNode(cbNode, node.expression);
                  case 184:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.thenStatement) ||
                          visitNode(cbNode, node.elseStatement);
                  case 185:
                      return visitNode(cbNode, node.statement) ||
                          visitNode(cbNode, node.expression);
                  case 186:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 187:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.condition) ||
                          visitNode(cbNode, node.incrementor) ||
                          visitNode(cbNode, node.statement);
                  case 188:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 189:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 190:
                  case 191:
                      return visitNode(cbNode, node.label);
                  case 192:
                      return visitNode(cbNode, node.expression);
                  case 193:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 194:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.caseBlock);
                  case 208:
                      return visitNodes(cbNodes, node.clauses);
                  case 221:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.statements);
                  case 222:
                      return visitNodes(cbNodes, node.statements);
                  case 195:
                      return visitNode(cbNode, node.label) ||
                          visitNode(cbNode, node.statement);
                  case 196:
                      return visitNode(cbNode, node.expression);
                  case 197:
                      return visitNode(cbNode, node.tryBlock) ||
                          visitNode(cbNode, node.catchClause) ||
                          visitNode(cbNode, node.finallyBlock);
                  case 224:
                      return visitNode(cbNode, node.variableDeclaration) ||
                          visitNode(cbNode, node.block);
                  case 131:
                      return visitNode(cbNode, node.expression);
                  case 202:
                  case 175:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.heritageClauses) ||
                          visitNodes(cbNodes, node.members);
                  case 203:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.heritageClauses) ||
                          visitNodes(cbNodes, node.members);
                  case 204:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.type);
                  case 205:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.members);
                  case 227:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.initializer);
                  case 206:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.body);
                  case 209:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.moduleReference);
                  case 210:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.importClause) ||
                          visitNode(cbNode, node.moduleSpecifier);
                  case 211:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.namedBindings);
                  case 212:
                      return visitNode(cbNode, node.name);
                  case 213:
                  case 217:
                      return visitNodes(cbNodes, node.elements);
                  case 216:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.exportClause) ||
                          visitNode(cbNode, node.moduleSpecifier);
                  case 214:
                  case 218:
                      return visitNode(cbNode, node.propertyName) ||
                          visitNode(cbNode, node.name);
                  case 215:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.expression);
                  case 172:
                      return visitNode(cbNode, node.head) || visitNodes(cbNodes, node.templateSpans);
                  case 178:
                      return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal);
                  case 128:
                      return visitNode(cbNode, node.expression);
                  case 223:
                      return visitNodes(cbNodes, node.types);
                  case 177:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.typeArguments);
                  case 220:
                      return visitNode(cbNode, node.expression);
                  case 219:
                      return visitNodes(cbNodes, node.decorators);
              }
          }
          ts.forEachChild = forEachChild;
          function createSourceFile(fileName, sourceText, languageVersion, setParentNodes) {
              if (setParentNodes === void 0) { setParentNodes = false; }
              var start = new Date().getTime();
              var result = Parser.parseSourceFile(fileName, sourceText, languageVersion, undefined, setParentNodes);
              ts.parseTime += new Date().getTime() - start;
              return result;
          }
          ts.createSourceFile = createSourceFile;
          function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
              return IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
          }
          ts.updateSourceFile = updateSourceFile;
          var Parser;
          (function (Parser) {
              var scanner = ts.createScanner(2, true);
              var disallowInAndDecoratorContext = 2 | 16;
              var sourceFile;
              var syntaxCursor;
              var token;
              var sourceText;
              var nodeCount;
              var identifiers;
              var identifierCount;
              var parsingContext;
              var contextFlags = 0;
              var parseErrorBeforeNextFinishedNode = false;
              function parseSourceFile(fileName, _sourceText, languageVersion, _syntaxCursor, setParentNodes) {
                  sourceText = _sourceText;
                  syntaxCursor = _syntaxCursor;
                  parsingContext = 0;
                  identifiers = {};
                  identifierCount = 0;
                  nodeCount = 0;
                  contextFlags = 0;
                  parseErrorBeforeNextFinishedNode = false;
                  createSourceFile(fileName, languageVersion);
                  scanner.setText(sourceText);
                  scanner.setOnError(scanError);
                  scanner.setScriptTarget(languageVersion);
                  token = nextToken();
                  processReferenceComments(sourceFile);
                  sourceFile.statements = parseList(0, true, parseSourceElement);
                  ts.Debug.assert(token === 1);
                  sourceFile.endOfFileToken = parseTokenNode();
                  setExternalModuleIndicator(sourceFile);
                  sourceFile.nodeCount = nodeCount;
                  sourceFile.identifierCount = identifierCount;
                  sourceFile.identifiers = identifiers;
                  if (setParentNodes) {
                      fixupParentReferences(sourceFile);
                  }
                  syntaxCursor = undefined;
                  scanner.setText("");
                  scanner.setOnError(undefined);
                  var result = sourceFile;
                  sourceFile = undefined;
                  identifiers = undefined;
                  syntaxCursor = undefined;
                  sourceText = undefined;
                  return result;
              }
              Parser.parseSourceFile = parseSourceFile;
              function fixupParentReferences(sourceFile) {
                  // normally parent references are set during binding. However, for clients that only need
                  // a syntax tree, and no semantic features, then the binding process is an unnecessary
                  // overhead.  This functions allows us to set all the parents, without all the expense of
                  // binding.
                  var parent = sourceFile;
                  forEachChild(sourceFile, visitNode);
                  return;
                  function visitNode(n) {
                      if (n.parent !== parent) {
                          n.parent = parent;
                          var saveParent = parent;
                          parent = n;
                          forEachChild(n, visitNode);
                          parent = saveParent;
                      }
                  }
              }
              function createSourceFile(fileName, languageVersion) {
                  sourceFile = createNode(228, 0);
                  sourceFile.pos = 0;
                  sourceFile.end = sourceText.length;
                  sourceFile.text = sourceText;
                  sourceFile.parseDiagnostics = [];
                  sourceFile.bindDiagnostics = [];
                  sourceFile.languageVersion = languageVersion;
                  sourceFile.fileName = ts.normalizePath(fileName);
                  sourceFile.flags = ts.fileExtensionIs(sourceFile.fileName, ".d.ts") ? 2048 : 0;
              }
              function setContextFlag(val, flag) {
                  if (val) {
                      contextFlags |= flag;
                  }
                  else {
                      contextFlags &= ~flag;
                  }
              }
              function setStrictModeContext(val) {
                  setContextFlag(val, 1);
              }
              function setDisallowInContext(val) {
                  setContextFlag(val, 2);
              }
              function setYieldContext(val) {
                  setContextFlag(val, 4);
              }
              function setGeneratorParameterContext(val) {
                  setContextFlag(val, 8);
              }
              function setDecoratorContext(val) {
                  setContextFlag(val, 16);
              }
              function doOutsideOfContext(flags, func) {
                  var currentContextFlags = contextFlags & flags;
                  if (currentContextFlags) {
                      setContextFlag(false, currentContextFlags);
                      var result = func();
                      setContextFlag(true, currentContextFlags);
                      return result;
                  }
                  return func();
              }
              function allowInAnd(func) {
                  if (contextFlags & 2) {
                      setDisallowInContext(false);
                      var result = func();
                      setDisallowInContext(true);
                      return result;
                  }
                  return func();
              }
              function disallowInAnd(func) {
                  if (contextFlags & 2) {
                      return func();
                  }
                  setDisallowInContext(true);
                  var result = func();
                  setDisallowInContext(false);
                  return result;
              }
              function doInYieldContext(func) {
                  if (contextFlags & 4) {
                      return func();
                  }
                  setYieldContext(true);
                  var result = func();
                  setYieldContext(false);
                  return result;
              }
              function doOutsideOfYieldContext(func) {
                  if (contextFlags & 4) {
                      setYieldContext(false);
                      var result = func();
                      setYieldContext(true);
                      return result;
                  }
                  return func();
              }
              function doInDecoratorContext(func) {
                  if (contextFlags & 16) {
                      return func();
                  }
                  setDecoratorContext(true);
                  var result = func();
                  setDecoratorContext(false);
                  return result;
              }
              function inYieldContext() {
                  return (contextFlags & 4) !== 0;
              }
              function inStrictModeContext() {
                  return (contextFlags & 1) !== 0;
              }
              function inGeneratorParameterContext() {
                  return (contextFlags & 8) !== 0;
              }
              function inDisallowInContext() {
                  return (contextFlags & 2) !== 0;
              }
              function inDecoratorContext() {
                  return (contextFlags & 16) !== 0;
              }
              function parseErrorAtCurrentToken(message, arg0) {
                  var start = scanner.getTokenPos();
                  var length = scanner.getTextPos() - start;
                  parseErrorAtPosition(start, length, message, arg0);
              }
              function parseErrorAtPosition(start, length, message, arg0) {
                  var lastError = ts.lastOrUndefined(sourceFile.parseDiagnostics);
                  if (!lastError || start !== lastError.start) {
                      sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, start, length, message, arg0));
                  }
                  parseErrorBeforeNextFinishedNode = true;
              }
              function scanError(message, length) {
                  var pos = scanner.getTextPos();
                  parseErrorAtPosition(pos, length || 0, message);
              }
              function getNodePos() {
                  return scanner.getStartPos();
              }
              function getNodeEnd() {
                  return scanner.getStartPos();
              }
              function nextToken() {
                  return token = scanner.scan();
              }
              function getTokenPos(pos) {
                  return ts.skipTrivia(sourceText, pos);
              }
              function reScanGreaterToken() {
                  return token = scanner.reScanGreaterToken();
              }
              function reScanSlashToken() {
                  return token = scanner.reScanSlashToken();
              }
              function reScanTemplateToken() {
                  return token = scanner.reScanTemplateToken();
              }
              function speculationHelper(callback, isLookAhead) {
                  var saveToken = token;
                  var saveParseDiagnosticsLength = sourceFile.parseDiagnostics.length;
                  var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
                  var saveContextFlags = contextFlags;
                  var result = isLookAhead
                      ? scanner.lookAhead(callback)
                      : scanner.tryScan(callback);
                  ts.Debug.assert(saveContextFlags === contextFlags);
                  if (!result || isLookAhead) {
                      token = saveToken;
                      sourceFile.parseDiagnostics.length = saveParseDiagnosticsLength;
                      parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
                  }
                  return result;
              }
              function lookAhead(callback) {
                  return speculationHelper(callback, true);
              }
              function tryParse(callback) {
                  return speculationHelper(callback, false);
              }
              function isIdentifier() {
                  if (token === 65) {
                      return true;
                  }
                  if (token === 110 && inYieldContext()) {
                      return false;
                  }
                  return token > 101;
              }
              function parseExpected(kind, diagnosticMessage) {
                  if (token === kind) {
                      nextToken();
                      return true;
                  }
                  if (diagnosticMessage) {
                      parseErrorAtCurrentToken(diagnosticMessage);
                  }
                  else {
                      parseErrorAtCurrentToken(ts.Diagnostics._0_expected, ts.tokenToString(kind));
                  }
                  return false;
              }
              function parseOptional(t) {
                  if (token === t) {
                      nextToken();
                      return true;
                  }
                  return false;
              }
              function parseOptionalToken(t) {
                  if (token === t) {
                      return parseTokenNode();
                  }
                  return undefined;
              }
              function parseExpectedToken(t, reportAtCurrentPosition, diagnosticMessage, arg0) {
                  return parseOptionalToken(t) ||
                      createMissingNode(t, reportAtCurrentPosition, diagnosticMessage, arg0);
              }
              function parseTokenNode() {
                  var node = createNode(token);
                  nextToken();
                  return finishNode(node);
              }
              function canParseSemicolon() {
                  if (token === 22) {
                      return true;
                  }
                  return token === 15 || token === 1 || scanner.hasPrecedingLineBreak();
              }
              function parseSemicolon() {
                  if (canParseSemicolon()) {
                      if (token === 22) {
                          nextToken();
                      }
                      return true;
                  }
                  else {
                      return parseExpected(22);
                  }
              }
              function createNode(kind, pos) {
                  nodeCount++;
                  var node = new (nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind)))();
                  if (!(pos >= 0)) {
                      pos = scanner.getStartPos();
                  }
                  node.pos = pos;
                  node.end = pos;
                  return node;
              }
              function finishNode(node) {
                  node.end = scanner.getStartPos();
                  if (contextFlags) {
                      node.parserContextFlags = contextFlags;
                  }
                  if (parseErrorBeforeNextFinishedNode) {
                      parseErrorBeforeNextFinishedNode = false;
                      node.parserContextFlags |= 32;
                  }
                  return node;
              }
              function createMissingNode(kind, reportAtCurrentPosition, diagnosticMessage, arg0) {
                  if (reportAtCurrentPosition) {
                      parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
                  }
                  else {
                      parseErrorAtCurrentToken(diagnosticMessage, arg0);
                  }
                  var result = createNode(kind, scanner.getStartPos());
                  result.text = "";
                  return finishNode(result);
              }
              function internIdentifier(text) {
                  text = ts.escapeIdentifier(text);
                  return ts.hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
              }
              function createIdentifier(isIdentifier, diagnosticMessage) {
                  identifierCount++;
                  if (isIdentifier) {
                      var node = createNode(65);
                      if (token !== 65) {
                          node.originalKeywordKind = token;
                      }
                      node.text = internIdentifier(scanner.getTokenValue());
                      nextToken();
                      return finishNode(node);
                  }
                  return createMissingNode(65, false, diagnosticMessage || ts.Diagnostics.Identifier_expected);
              }
              function parseIdentifier(diagnosticMessage) {
                  return createIdentifier(isIdentifier(), diagnosticMessage);
              }
              function parseIdentifierName() {
                  return createIdentifier(isIdentifierOrKeyword());
              }
              function isLiteralPropertyName() {
                  return isIdentifierOrKeyword() ||
                      token === 8 ||
                      token === 7;
              }
              function parsePropertyName() {
                  if (token === 8 || token === 7) {
                      return parseLiteralNode(true);
                  }
                  if (token === 18) {
                      return parseComputedPropertyName();
                  }
                  return parseIdentifierName();
              }
              function parseComputedPropertyName() {
                  var node = createNode(128);
                  parseExpected(18);
                  var yieldContext = inYieldContext();
                  if (inGeneratorParameterContext()) {
                      setYieldContext(false);
                  }
                  node.expression = allowInAnd(parseExpression);
                  if (inGeneratorParameterContext()) {
                      setYieldContext(yieldContext);
                  }
                  parseExpected(19);
                  return finishNode(node);
              }
              function parseContextualModifier(t) {
                  return token === t && tryParse(nextTokenCanFollowModifier);
              }
              function nextTokenCanFollowModifier() {
                  if (token === 70) {
                      return nextToken() === 77;
                  }
                  if (token === 78) {
                      nextToken();
                      if (token === 73) {
                          return lookAhead(nextTokenIsClassOrFunction);
                      }
                      return token !== 35 && token !== 14 && canFollowModifier();
                  }
                  if (token === 73) {
                      return nextTokenIsClassOrFunction();
                  }
                  nextToken();
                  return canFollowModifier();
              }
              function parseAnyContextualModifier() {
                  return ts.isModifier(token) && tryParse(nextTokenCanFollowModifier);
              }
              function canFollowModifier() {
                  return token === 18
                      || token === 14
                      || token === 35
                      || isLiteralPropertyName();
              }
              function nextTokenIsClassOrFunction() {
                  nextToken();
                  return token === 69 || token === 83;
              }
              function isListElement(parsingContext, inErrorRecovery) {
                  var node = currentNode(parsingContext);
                  if (node) {
                      return true;
                  }
                  switch (parsingContext) {
                      case 0:
                      case 1:
                          return isSourceElement(inErrorRecovery);
                      case 2:
                      case 4:
                          return isStartOfStatement(inErrorRecovery);
                      case 3:
                          return token === 67 || token === 73;
                      case 5:
                          return isStartOfTypeMember();
                      case 6:
                          return lookAhead(isClassMemberStart) || (token === 22 && !inErrorRecovery);
                      case 7:
                          return token === 18 || isLiteralPropertyName();
                      case 13:
                          return token === 18 || token === 35 || isLiteralPropertyName();
                      case 10:
                          return isLiteralPropertyName();
                      case 8:
                          if (token === 14) {
                              return lookAhead(isValidHeritageClauseObjectLiteral);
                          }
                          if (!inErrorRecovery) {
                              return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword();
                          }
                          else {
                              return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword();
                          }
                      case 9:
                          return isIdentifierOrPattern();
                      case 11:
                          return token === 23 || token === 21 || isIdentifierOrPattern();
                      case 16:
                          return isIdentifier();
                      case 12:
                      case 14:
                          return token === 23 || token === 21 || isStartOfExpression();
                      case 15:
                          return isStartOfParameter();
                      case 17:
                      case 18:
                          return token === 23 || isStartOfType();
                      case 19:
                          return isHeritageClause();
                      case 20:
                          return isIdentifierOrKeyword();
                  }
                  ts.Debug.fail("Non-exhaustive case in 'isListElement'.");
              }
              function isValidHeritageClauseObjectLiteral() {
                  ts.Debug.assert(token === 14);
                  if (nextToken() === 15) {
                      var next = nextToken();
                      return next === 23 || next === 14 || next === 79 || next === 102;
                  }
                  return true;
              }
              function nextTokenIsIdentifier() {
                  nextToken();
                  return isIdentifier();
              }
              function isHeritageClauseExtendsOrImplementsKeyword() {
                  if (token === 102 ||
                      token === 79) {
                      return lookAhead(nextTokenIsStartOfExpression);
                  }
                  return false;
              }
              function nextTokenIsStartOfExpression() {
                  nextToken();
                  return isStartOfExpression();
              }
              function isListTerminator(kind) {
                  if (token === 1) {
                      return true;
                  }
                  switch (kind) {
                      case 1:
                      case 2:
                      case 3:
                      case 5:
                      case 6:
                      case 7:
                      case 13:
                      case 10:
                      case 20:
                          return token === 15;
                      case 4:
                          return token === 15 || token === 67 || token === 73;
                      case 8:
                          return token === 14 || token === 79 || token === 102;
                      case 9:
                          return isVariableDeclaratorListTerminator();
                      case 16:
                          return token === 25 || token === 16 || token === 14 || token === 79 || token === 102;
                      case 12:
                          return token === 17 || token === 22;
                      case 14:
                      case 18:
                      case 11:
                          return token === 19;
                      case 15:
                          return token === 17 || token === 19;
                      case 17:
                          return token === 25 || token === 16;
                      case 19:
                          return token === 14 || token === 15;
                  }
              }
              function isVariableDeclaratorListTerminator() {
                  if (canParseSemicolon()) {
                      return true;
                  }
                  if (isInOrOfKeyword(token)) {
                      return true;
                  }
                  if (token === 32) {
                      return true;
                  }
                  return false;
              }
              function isInSomeParsingContext() {
                  for (var kind = 0; kind < 21; kind++) {
                      if (parsingContext & (1 << kind)) {
                          if (isListElement(kind, true) || isListTerminator(kind)) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function parseList(kind, checkForStrictMode, parseElement) {
                  var saveParsingContext = parsingContext;
                  parsingContext |= 1 << kind;
                  var result = [];
                  result.pos = getNodePos();
                  var savedStrictModeContext = inStrictModeContext();
                  while (!isListTerminator(kind)) {
                      if (isListElement(kind, false)) {
                          var element = parseListElement(kind, parseElement);
                          result.push(element);
                          if (checkForStrictMode && !inStrictModeContext()) {
                              if (ts.isPrologueDirective(element)) {
                                  if (isUseStrictPrologueDirective(sourceFile, element)) {
                                      setStrictModeContext(true);
                                      checkForStrictMode = false;
                                  }
                              }
                              else {
                                  checkForStrictMode = false;
                              }
                          }
                          continue;
                      }
                      if (abortParsingListOrMoveToNextToken(kind)) {
                          break;
                      }
                  }
                  setStrictModeContext(savedStrictModeContext);
                  result.end = getNodeEnd();
                  parsingContext = saveParsingContext;
                  return result;
              }
              function isUseStrictPrologueDirective(sourceFile, node) {
                  ts.Debug.assert(ts.isPrologueDirective(node));
                  var nodeText = ts.getSourceTextOfNodeFromSourceFile(sourceFile, node.expression);
                  return nodeText === '"use strict"' || nodeText === "'use strict'";
              }
              function parseListElement(parsingContext, parseElement) {
                  var node = currentNode(parsingContext);
                  if (node) {
                      return consumeNode(node);
                  }
                  return parseElement();
              }
              function currentNode(parsingContext) {
                  if (parseErrorBeforeNextFinishedNode) {
                      return undefined;
                  }
                  if (!syntaxCursor) {
                      return undefined;
                  }
                  var node = syntaxCursor.currentNode(scanner.getStartPos());
                  if (ts.nodeIsMissing(node)) {
                      return undefined;
                  }
                  if (node.intersectsChange) {
                      return undefined;
                  }
                  if (ts.containsParseError(node)) {
                      return undefined;
                  }
                  var nodeContextFlags = node.parserContextFlags & 63;
                  if (nodeContextFlags !== contextFlags) {
                      return undefined;
                  }
                  if (!canReuseNode(node, parsingContext)) {
                      return undefined;
                  }
                  return node;
              }
              function consumeNode(node) {
                  scanner.setTextPos(node.end);
                  nextToken();
                  return node;
              }
              function canReuseNode(node, parsingContext) {
                  switch (parsingContext) {
                      case 1:
                          return isReusableModuleElement(node);
                      case 6:
                          return isReusableClassMember(node);
                      case 3:
                          return isReusableSwitchClause(node);
                      case 2:
                      case 4:
                          return isReusableStatement(node);
                      case 7:
                          return isReusableEnumMember(node);
                      case 5:
                          return isReusableTypeMember(node);
                      case 9:
                          return isReusableVariableDeclaration(node);
                      case 15:
                          return isReusableParameter(node);
                      case 19:
                      case 16:
                      case 18:
                      case 17:
                      case 12:
                      case 13:
                      case 8:
                  }
                  return false;
              }
              function isReusableModuleElement(node) {
                  if (node) {
                      switch (node.kind) {
                          case 210:
                          case 209:
                          case 216:
                          case 215:
                          case 202:
                          case 203:
                          case 206:
                          case 205:
                              return true;
                      }
                      return isReusableStatement(node);
                  }
                  return false;
              }
              function isReusableClassMember(node) {
                  if (node) {
                      switch (node.kind) {
                          case 136:
                          case 141:
                          case 135:
                          case 137:
                          case 138:
                          case 133:
                          case 179:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableSwitchClause(node) {
                  if (node) {
                      switch (node.kind) {
                          case 221:
                          case 222:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableStatement(node) {
                  if (node) {
                      switch (node.kind) {
                          case 201:
                          case 181:
                          case 180:
                          case 184:
                          case 183:
                          case 196:
                          case 192:
                          case 194:
                          case 191:
                          case 190:
                          case 188:
                          case 189:
                          case 187:
                          case 186:
                          case 193:
                          case 182:
                          case 197:
                          case 195:
                          case 185:
                          case 198:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableEnumMember(node) {
                  return node.kind === 227;
              }
              function isReusableTypeMember(node) {
                  if (node) {
                      switch (node.kind) {
                          case 140:
                          case 134:
                          case 141:
                          case 132:
                          case 139:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableVariableDeclaration(node) {
                  if (node.kind !== 199) {
                      return false;
                  }
                  var variableDeclarator = node;
                  return variableDeclarator.initializer === undefined;
              }
              function isReusableParameter(node) {
                  if (node.kind !== 130) {
                      return false;
                  }
                  var parameter = node;
                  return parameter.initializer === undefined;
              }
              function abortParsingListOrMoveToNextToken(kind) {
                  parseErrorAtCurrentToken(parsingContextErrors(kind));
                  if (isInSomeParsingContext()) {
                      return true;
                  }
                  nextToken();
                  return false;
              }
              function parsingContextErrors(context) {
                  switch (context) {
                      case 0: return ts.Diagnostics.Declaration_or_statement_expected;
                      case 1: return ts.Diagnostics.Declaration_or_statement_expected;
                      case 2: return ts.Diagnostics.Statement_expected;
                      case 3: return ts.Diagnostics.case_or_default_expected;
                      case 4: return ts.Diagnostics.Statement_expected;
                      case 5: return ts.Diagnostics.Property_or_signature_expected;
                      case 6: return ts.Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected;
                      case 7: return ts.Diagnostics.Enum_member_expected;
                      case 8: return ts.Diagnostics.Expression_expected;
                      case 9: return ts.Diagnostics.Variable_declaration_expected;
                      case 10: return ts.Diagnostics.Property_destructuring_pattern_expected;
                      case 11: return ts.Diagnostics.Array_element_destructuring_pattern_expected;
                      case 12: return ts.Diagnostics.Argument_expression_expected;
                      case 13: return ts.Diagnostics.Property_assignment_expected;
                      case 14: return ts.Diagnostics.Expression_or_comma_expected;
                      case 15: return ts.Diagnostics.Parameter_declaration_expected;
                      case 16: return ts.Diagnostics.Type_parameter_declaration_expected;
                      case 17: return ts.Diagnostics.Type_argument_expected;
                      case 18: return ts.Diagnostics.Type_expected;
                      case 19: return ts.Diagnostics.Unexpected_token_expected;
                      case 20: return ts.Diagnostics.Identifier_expected;
                  }
              }
              ;
              function parseDelimitedList(kind, parseElement, considerSemicolonAsDelimeter) {
                  var saveParsingContext = parsingContext;
                  parsingContext |= 1 << kind;
                  var result = [];
                  result.pos = getNodePos();
                  var commaStart = -1;
                  while (true) {
                      if (isListElement(kind, false)) {
                          result.push(parseListElement(kind, parseElement));
                          commaStart = scanner.getTokenPos();
                          if (parseOptional(23)) {
                              continue;
                          }
                          commaStart = -1;
                          if (isListTerminator(kind)) {
                              break;
                          }
                          parseExpected(23);
                          if (considerSemicolonAsDelimeter && token === 22 && !scanner.hasPrecedingLineBreak()) {
                              nextToken();
                          }
                          continue;
                      }
                      if (isListTerminator(kind)) {
                          break;
                      }
                      if (abortParsingListOrMoveToNextToken(kind)) {
                          break;
                      }
                  }
                  if (commaStart >= 0) {
                      result.hasTrailingComma = true;
                  }
                  result.end = getNodeEnd();
                  parsingContext = saveParsingContext;
                  return result;
              }
              function createMissingList() {
                  var pos = getNodePos();
                  var result = [];
                  result.pos = pos;
                  result.end = pos;
                  return result;
              }
              function parseBracketedList(kind, parseElement, open, close) {
                  if (parseExpected(open)) {
                      var result = parseDelimitedList(kind, parseElement);
                      parseExpected(close);
                      return result;
                  }
                  return createMissingList();
              }
              function parseEntityName(allowReservedWords, diagnosticMessage) {
                  var entity = parseIdentifier(diagnosticMessage);
                  while (parseOptional(20)) {
                      var node = createNode(127, entity.pos);
                      node.left = entity;
                      node.right = parseRightSideOfDot(allowReservedWords);
                      entity = finishNode(node);
                  }
                  return entity;
              }
              function parseRightSideOfDot(allowIdentifierNames) {
                  if (scanner.hasPrecedingLineBreak() && scanner.isReservedWord()) {
                      var matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
                      if (matchesPattern) {
                          return createMissingNode(65, true, ts.Diagnostics.Identifier_expected);
                      }
                  }
                  return allowIdentifierNames ? parseIdentifierName() : parseIdentifier();
              }
              function parseTemplateExpression() {
                  var template = createNode(172);
                  template.head = parseLiteralNode();
                  ts.Debug.assert(template.head.kind === 11, "Template head has wrong token kind");
                  var templateSpans = [];
                  templateSpans.pos = getNodePos();
                  do {
                      templateSpans.push(parseTemplateSpan());
                  } while (ts.lastOrUndefined(templateSpans).literal.kind === 12);
                  templateSpans.end = getNodeEnd();
                  template.templateSpans = templateSpans;
                  return finishNode(template);
              }
              function parseTemplateSpan() {
                  var span = createNode(178);
                  span.expression = allowInAnd(parseExpression);
                  var literal;
                  if (token === 15) {
                      reScanTemplateToken();
                      literal = parseLiteralNode();
                  }
                  else {
                      literal = parseExpectedToken(13, false, ts.Diagnostics._0_expected, ts.tokenToString(15));
                  }
                  span.literal = literal;
                  return finishNode(span);
              }
              function parseLiteralNode(internName) {
                  var node = createNode(token);
                  var text = scanner.getTokenValue();
                  node.text = internName ? internIdentifier(text) : text;
                  if (scanner.hasExtendedUnicodeEscape()) {
                      node.hasExtendedUnicodeEscape = true;
                  }
                  if (scanner.isUnterminated()) {
                      node.isUnterminated = true;
                  }
                  var tokenPos = scanner.getTokenPos();
                  nextToken();
                  finishNode(node);
                  if (node.kind === 7
                      && sourceText.charCodeAt(tokenPos) === 48
                      && ts.isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
                      node.flags |= 16384;
                  }
                  return node;
              }
              function parseTypeReference() {
                  var node = createNode(142);
                  node.typeName = parseEntityName(false, ts.Diagnostics.Type_expected);
                  if (!scanner.hasPrecedingLineBreak() && token === 24) {
                      node.typeArguments = parseBracketedList(17, parseType, 24, 25);
                  }
                  return finishNode(node);
              }
              function parseTypeQuery() {
                  var node = createNode(145);
                  parseExpected(97);
                  node.exprName = parseEntityName(true);
                  return finishNode(node);
              }
              function parseTypeParameter() {
                  var node = createNode(129);
                  node.name = parseIdentifier();
                  if (parseOptional(79)) {
                      if (isStartOfType() || !isStartOfExpression()) {
                          node.constraint = parseType();
                      }
                      else {
                          node.expression = parseUnaryExpressionOrHigher();
                      }
                  }
                  return finishNode(node);
              }
              function parseTypeParameters() {
                  if (token === 24) {
                      return parseBracketedList(16, parseTypeParameter, 24, 25);
                  }
              }
              function parseParameterType() {
                  if (parseOptional(51)) {
                      return token === 8
                          ? parseLiteralNode(true)
                          : parseType();
                  }
                  return undefined;
              }
              function isStartOfParameter() {
                  return token === 21 || isIdentifierOrPattern() || ts.isModifier(token) || token === 52;
              }
              function setModifiers(node, modifiers) {
                  if (modifiers) {
                      node.flags |= modifiers.flags;
                      node.modifiers = modifiers;
                  }
              }
              function parseParameter() {
                  var node = createNode(130);
                  node.decorators = parseDecorators();
                  setModifiers(node, parseModifiers());
                  node.dotDotDotToken = parseOptionalToken(21);
                  node.name = inGeneratorParameterContext() ? doInYieldContext(parseIdentifierOrPattern) : parseIdentifierOrPattern();
                  if (ts.getFullWidth(node.name) === 0 && node.flags === 0 && ts.isModifier(token)) {
                      nextToken();
                  }
                  node.questionToken = parseOptionalToken(50);
                  node.type = parseParameterType();
                  node.initializer = inGeneratorParameterContext() ? doOutsideOfYieldContext(parseParameterInitializer) : parseParameterInitializer();
                  return finishNode(node);
              }
              function parseParameterInitializer() {
                  return parseInitializer(true);
              }
              function fillSignature(returnToken, yieldAndGeneratorParameterContext, requireCompleteParameterList, signature) {
                  var returnTokenRequired = returnToken === 32;
                  signature.typeParameters = parseTypeParameters();
                  signature.parameters = parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList);
                  if (returnTokenRequired) {
                      parseExpected(returnToken);
                      signature.type = parseType();
                  }
                  else if (parseOptional(returnToken)) {
                      signature.type = parseType();
                  }
              }
              function parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList) {
                  if (parseExpected(16)) {
                      var savedYieldContext = inYieldContext();
                      var savedGeneratorParameterContext = inGeneratorParameterContext();
                      setYieldContext(yieldAndGeneratorParameterContext);
                      setGeneratorParameterContext(yieldAndGeneratorParameterContext);
                      var result = parseDelimitedList(15, parseParameter);
                      setYieldContext(savedYieldContext);
                      setGeneratorParameterContext(savedGeneratorParameterContext);
                      if (!parseExpected(17) && requireCompleteParameterList) {
                          return undefined;
                      }
                      return result;
                  }
                  return requireCompleteParameterList ? undefined : createMissingList();
              }
              function parseTypeMemberSemicolon() {
                  if (parseOptional(23)) {
                      return;
                  }
                  parseSemicolon();
              }
              function parseSignatureMember(kind) {
                  var node = createNode(kind);
                  if (kind === 140) {
                      parseExpected(88);
                  }
                  fillSignature(51, false, false, node);
                  parseTypeMemberSemicolon();
                  return finishNode(node);
              }
              function isIndexSignature() {
                  if (token !== 18) {
                      return false;
                  }
                  return lookAhead(isUnambiguouslyIndexSignature);
              }
              function isUnambiguouslyIndexSignature() {
                  nextToken();
                  if (token === 21 || token === 19) {
                      return true;
                  }
                  if (ts.isModifier(token)) {
                      nextToken();
                      if (isIdentifier()) {
                          return true;
                      }
                  }
                  else if (!isIdentifier()) {
                      return false;
                  }
                  else {
                      nextToken();
                  }
                  if (token === 51 || token === 23) {
                      return true;
                  }
                  if (token !== 50) {
                      return false;
                  }
                  nextToken();
                  return token === 51 || token === 23 || token === 19;
              }
              function parseIndexSignatureDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(141, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.parameters = parseBracketedList(15, parseParameter, 18, 19);
                  node.type = parseTypeAnnotation();
                  parseTypeMemberSemicolon();
                  return finishNode(node);
              }
              function parsePropertyOrMethodSignature() {
                  var fullStart = scanner.getStartPos();
                  var name = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (token === 16 || token === 24) {
                      var method = createNode(134, fullStart);
                      method.name = name;
                      method.questionToken = questionToken;
                      fillSignature(51, false, false, method);
                      parseTypeMemberSemicolon();
                      return finishNode(method);
                  }
                  else {
                      var property = createNode(132, fullStart);
                      property.name = name;
                      property.questionToken = questionToken;
                      property.type = parseTypeAnnotation();
                      parseTypeMemberSemicolon();
                      return finishNode(property);
                  }
              }
              function isStartOfTypeMember() {
                  switch (token) {
                      case 16:
                      case 24:
                      case 18:
                          return true;
                      default:
                          if (ts.isModifier(token)) {
                              var result = lookAhead(isStartOfIndexSignatureDeclaration);
                              if (result) {
                                  return result;
                              }
                          }
                          return isLiteralPropertyName() && lookAhead(isTypeMemberWithLiteralPropertyName);
                  }
              }
              function isStartOfIndexSignatureDeclaration() {
                  while (ts.isModifier(token)) {
                      nextToken();
                  }
                  return isIndexSignature();
              }
              function isTypeMemberWithLiteralPropertyName() {
                  nextToken();
                  return token === 16 ||
                      token === 24 ||
                      token === 50 ||
                      token === 51 ||
                      canParseSemicolon();
              }
              function parseTypeMember() {
                  switch (token) {
                      case 16:
                      case 24:
                          return parseSignatureMember(139);
                      case 18:
                          return isIndexSignature()
                              ? parseIndexSignatureDeclaration(scanner.getStartPos(), undefined, undefined)
                              : parsePropertyOrMethodSignature();
                      case 88:
                          if (lookAhead(isStartOfConstructSignature)) {
                              return parseSignatureMember(140);
                          }
                      case 8:
                      case 7:
                          return parsePropertyOrMethodSignature();
                      default:
                          if (ts.isModifier(token)) {
                              var result = tryParse(parseIndexSignatureWithModifiers);
                              if (result) {
                                  return result;
                              }
                          }
                          if (isIdentifierOrKeyword()) {
                              return parsePropertyOrMethodSignature();
                          }
                  }
              }
              function parseIndexSignatureWithModifiers() {
                  var fullStart = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  return isIndexSignature()
                      ? parseIndexSignatureDeclaration(fullStart, decorators, modifiers)
                      : undefined;
              }
              function isStartOfConstructSignature() {
                  nextToken();
                  return token === 16 || token === 24;
              }
              function parseTypeLiteral() {
                  var node = createNode(146);
                  node.members = parseObjectTypeMembers();
                  return finishNode(node);
              }
              function parseObjectTypeMembers() {
                  var members;
                  if (parseExpected(14)) {
                      members = parseList(5, false, parseTypeMember);
                      parseExpected(15);
                  }
                  else {
                      members = createMissingList();
                  }
                  return members;
              }
              function parseTupleType() {
                  var node = createNode(148);
                  node.elementTypes = parseBracketedList(18, parseType, 18, 19);
                  return finishNode(node);
              }
              function parseParenthesizedType() {
                  var node = createNode(150);
                  parseExpected(16);
                  node.type = parseType();
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseFunctionOrConstructorType(kind) {
                  var node = createNode(kind);
                  if (kind === 144) {
                      parseExpected(88);
                  }
                  fillSignature(32, false, false, node);
                  return finishNode(node);
              }
              function parseKeywordAndNoDot() {
                  var node = parseTokenNode();
                  return token === 20 ? undefined : node;
              }
              function parseNonArrayType() {
                  switch (token) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                          var node = tryParse(parseKeywordAndNoDot);
                          return node || parseTypeReference();
                      case 99:
                          return parseTokenNode();
                      case 97:
                          return parseTypeQuery();
                      case 14:
                          return parseTypeLiteral();
                      case 18:
                          return parseTupleType();
                      case 16:
                          return parseParenthesizedType();
                      default:
                          return parseTypeReference();
                  }
              }
              function isStartOfType() {
                  switch (token) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                      case 99:
                      case 97:
                      case 14:
                      case 18:
                      case 24:
                      case 88:
                          return true;
                      case 16:
                          return lookAhead(isStartOfParenthesizedOrFunctionType);
                      default:
                          return isIdentifier();
                  }
              }
              function isStartOfParenthesizedOrFunctionType() {
                  nextToken();
                  return token === 17 || isStartOfParameter() || isStartOfType();
              }
              function parseArrayTypeOrHigher() {
                  var type = parseNonArrayType();
                  while (!scanner.hasPrecedingLineBreak() && parseOptional(18)) {
                      parseExpected(19);
                      var node = createNode(147, type.pos);
                      node.elementType = type;
                      type = finishNode(node);
                  }
                  return type;
              }
              function parseUnionTypeOrHigher() {
                  var type = parseArrayTypeOrHigher();
                  if (token === 44) {
                      var types = [type];
                      types.pos = type.pos;
                      while (parseOptional(44)) {
                          types.push(parseArrayTypeOrHigher());
                      }
                      types.end = getNodeEnd();
                      var node = createNode(149, type.pos);
                      node.types = types;
                      type = finishNode(node);
                  }
                  return type;
              }
              function isStartOfFunctionType() {
                  if (token === 24) {
                      return true;
                  }
                  return token === 16 && lookAhead(isUnambiguouslyStartOfFunctionType);
              }
              function isUnambiguouslyStartOfFunctionType() {
                  nextToken();
                  if (token === 17 || token === 21) {
                      return true;
                  }
                  if (isIdentifier() || ts.isModifier(token)) {
                      nextToken();
                      if (token === 51 || token === 23 ||
                          token === 50 || token === 53 ||
                          isIdentifier() || ts.isModifier(token)) {
                          return true;
                      }
                      if (token === 17) {
                          nextToken();
                          if (token === 32) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function parseType() {
                  var savedYieldContext = inYieldContext();
                  var savedGeneratorParameterContext = inGeneratorParameterContext();
                  setYieldContext(false);
                  setGeneratorParameterContext(false);
                  var result = parseTypeWorker();
                  setYieldContext(savedYieldContext);
                  setGeneratorParameterContext(savedGeneratorParameterContext);
                  return result;
              }
              function parseTypeWorker() {
                  if (isStartOfFunctionType()) {
                      return parseFunctionOrConstructorType(143);
                  }
                  if (token === 88) {
                      return parseFunctionOrConstructorType(144);
                  }
                  return parseUnionTypeOrHigher();
              }
              function parseTypeAnnotation() {
                  return parseOptional(51) ? parseType() : undefined;
              }
              function isStartOfLeftHandSideExpression() {
                  switch (token) {
                      case 93:
                      case 91:
                      case 89:
                      case 95:
                      case 80:
                      case 7:
                      case 8:
                      case 10:
                      case 11:
                      case 16:
                      case 18:
                      case 14:
                      case 83:
                      case 69:
                      case 88:
                      case 36:
                      case 57:
                      case 65:
                          return true;
                      default:
                          return isIdentifier();
                  }
              }
              function isStartOfExpression() {
                  if (isStartOfLeftHandSideExpression()) {
                      return true;
                  }
                  switch (token) {
                      case 33:
                      case 34:
                      case 47:
                      case 46:
                      case 74:
                      case 97:
                      case 99:
                      case 38:
                      case 39:
                      case 24:
                      case 110:
                          return true;
                      default:
                          if (isBinaryOperator()) {
                              return true;
                          }
                          return isIdentifier();
                  }
              }
              function isStartOfExpressionStatement() {
                  return token !== 14 &&
                      token !== 83 &&
                      token !== 69 &&
                      token !== 52 &&
                      isStartOfExpression();
              }
              function parseExpression() {
                  // Expression[in]:
                  //      AssignmentExpression[in]
                  //      Expression[in] , AssignmentExpression[in]
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var expr = parseAssignmentExpressionOrHigher();
                  var operatorToken;
                  while ((operatorToken = parseOptionalToken(23))) {
                      expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher());
                  }
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  return expr;
              }
              function parseInitializer(inParameter) {
                  if (token !== 53) {
                      if (scanner.hasPrecedingLineBreak() || (inParameter && token === 14) || !isStartOfExpression()) {
                          return undefined;
                      }
                  }
                  parseExpected(53);
                  return parseAssignmentExpressionOrHigher();
              }
              function parseAssignmentExpressionOrHigher() {
                  //  AssignmentExpression[in,yield]:
                  //      1) ConditionalExpression[?in,?yield]
                  //      2) LeftHandSideExpression = AssignmentExpression[?in,?yield]
                  //      3) LeftHandSideExpression AssignmentOperator AssignmentExpression[?in,?yield]
                  //      4) ArrowFunctionExpression[?in,?yield]
                  //      5) [+Yield] YieldExpression[?In]
                  //
                  // Note: for ease of implementation we treat productions '2' and '3' as the same thing.
                  // (i.e. they're both BinaryExpressions with an assignment operator in it).
                  if (isYieldExpression()) {
                      return parseYieldExpression();
                  }
                  var arrowExpression = tryParseParenthesizedArrowFunctionExpression();
                  if (arrowExpression) {
                      return arrowExpression;
                  }
                  var expr = parseBinaryExpressionOrHigher(0);
                  if (expr.kind === 65 && token === 32) {
                      return parseSimpleArrowFunctionExpression(expr);
                  }
                  if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
                      return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher());
                  }
                  return parseConditionalExpressionRest(expr);
              }
              function isYieldExpression() {
                  if (token === 110) {
                      if (inYieldContext()) {
                          return true;
                      }
                      if (inStrictModeContext()) {
                          return true;
                      }
                      return lookAhead(nextTokenIsIdentifierOnSameLine);
                  }
                  return false;
              }
              function nextTokenIsIdentifierOnSameLine() {
                  nextToken();
                  return !scanner.hasPrecedingLineBreak() && isIdentifier();
              }
              function nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() {
                  nextToken();
                  return !scanner.hasPrecedingLineBreak() &&
                      (isIdentifier() || token === 14 || token === 18);
              }
              function parseYieldExpression() {
                  var node = createNode(173);
                  nextToken();
                  if (!scanner.hasPrecedingLineBreak() &&
                      (token === 35 || isStartOfExpression())) {
                      node.asteriskToken = parseOptionalToken(35);
                      node.expression = parseAssignmentExpressionOrHigher();
                      return finishNode(node);
                  }
                  else {
                      return finishNode(node);
                  }
              }
              function parseSimpleArrowFunctionExpression(identifier) {
                  ts.Debug.assert(token === 32, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
                  var node = createNode(164, identifier.pos);
                  var parameter = createNode(130, identifier.pos);
                  parameter.name = identifier;
                  finishNode(parameter);
                  node.parameters = [parameter];
                  node.parameters.pos = parameter.pos;
                  node.parameters.end = parameter.end;
                  node.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
                  node.body = parseArrowFunctionExpressionBody();
                  return finishNode(node);
              }
              function tryParseParenthesizedArrowFunctionExpression() {
                  var triState = isParenthesizedArrowFunctionExpression();
                  if (triState === 0) {
                      return undefined;
                  }
                  var arrowFunction = triState === 1
                      ? parseParenthesizedArrowFunctionExpressionHead(true)
                      : tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead);
                  if (!arrowFunction) {
                      return undefined;
                  }
                  var lastToken = token;
                  arrowFunction.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
                  arrowFunction.body = (lastToken === 32 || lastToken === 14)
                      ? parseArrowFunctionExpressionBody()
                      : parseIdentifier();
                  return finishNode(arrowFunction);
              }
              function isParenthesizedArrowFunctionExpression() {
                  if (token === 16 || token === 24) {
                      return lookAhead(isParenthesizedArrowFunctionExpressionWorker);
                  }
                  if (token === 32) {
                      return 1;
                  }
                  return 0;
              }
              function isParenthesizedArrowFunctionExpressionWorker() {
                  var first = token;
                  var second = nextToken();
                  if (first === 16) {
                      if (second === 17) {
                          var third = nextToken();
                          switch (third) {
                              case 32:
                              case 51:
                              case 14:
                                  return 1;
                              default:
                                  return 0;
                          }
                      }
                      if (second === 18 || second === 14) {
                          return 2;
                      }
                      if (second === 21) {
                          return 1;
                      }
                      if (!isIdentifier()) {
                          return 0;
                      }
                      if (nextToken() === 51) {
                          return 1;
                      }
                      return 2;
                  }
                  else {
                      ts.Debug.assert(first === 24);
                      if (!isIdentifier()) {
                          return 0;
                      }
                      return 2;
                  }
              }
              function parsePossibleParenthesizedArrowFunctionExpressionHead() {
                  return parseParenthesizedArrowFunctionExpressionHead(false);
              }
              function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity) {
                  var node = createNode(164);
                  fillSignature(51, false, !allowAmbiguity, node);
                  if (!node.parameters) {
                      return undefined;
                  }
                  if (!allowAmbiguity && token !== 32 && token !== 14) {
                      return undefined;
                  }
                  return node;
              }
              function parseArrowFunctionExpressionBody() {
                  if (token === 14) {
                      return parseFunctionBlock(false, false);
                  }
                  if (isStartOfStatement(true) &&
                      !isStartOfExpressionStatement() &&
                      token !== 83 &&
                      token !== 69) {
                      return parseFunctionBlock(false, true);
                  }
                  return parseAssignmentExpressionOrHigher();
              }
              function parseConditionalExpressionRest(leftOperand) {
                  var questionToken = parseOptionalToken(50);
                  if (!questionToken) {
                      return leftOperand;
                  }
                  var node = createNode(171, leftOperand.pos);
                  node.condition = leftOperand;
                  node.questionToken = questionToken;
                  node.whenTrue = doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher);
                  node.colonToken = parseExpectedToken(51, false, ts.Diagnostics._0_expected, ts.tokenToString(51));
                  node.whenFalse = parseAssignmentExpressionOrHigher();
                  return finishNode(node);
              }
              function parseBinaryExpressionOrHigher(precedence) {
                  var leftOperand = parseUnaryExpressionOrHigher();
                  return parseBinaryExpressionRest(precedence, leftOperand);
              }
              function isInOrOfKeyword(t) {
                  return t === 86 || t === 126;
              }
              function parseBinaryExpressionRest(precedence, leftOperand) {
                  while (true) {
                      reScanGreaterToken();
                      var newPrecedence = getBinaryOperatorPrecedence();
                      if (newPrecedence <= precedence) {
                          break;
                      }
                      if (token === 86 && inDisallowInContext()) {
                          break;
                      }
                      leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence));
                  }
                  return leftOperand;
              }
              function isBinaryOperator() {
                  if (inDisallowInContext() && token === 86) {
                      return false;
                  }
                  return getBinaryOperatorPrecedence() > 0;
              }
              function getBinaryOperatorPrecedence() {
                  switch (token) {
                      case 49:
                          return 1;
                      case 48:
                          return 2;
                      case 44:
                          return 3;
                      case 45:
                          return 4;
                      case 43:
                          return 5;
                      case 28:
                      case 29:
                      case 30:
                      case 31:
                          return 6;
                      case 24:
                      case 25:
                      case 26:
                      case 27:
                      case 87:
                      case 86:
                          return 7;
                      case 40:
                      case 41:
                      case 42:
                          return 8;
                      case 33:
                      case 34:
                          return 9;
                      case 35:
                      case 36:
                      case 37:
                          return 10;
                  }
                  return -1;
              }
              function makeBinaryExpression(left, operatorToken, right) {
                  var node = createNode(170, left.pos);
                  node.left = left;
                  node.operatorToken = operatorToken;
                  node.right = right;
                  return finishNode(node);
              }
              function parsePrefixUnaryExpression() {
                  var node = createNode(168);
                  node.operator = token;
                  nextToken();
                  node.operand = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseDeleteExpression() {
                  var node = createNode(165);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseTypeOfExpression() {
                  var node = createNode(166);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseVoidExpression() {
                  var node = createNode(167);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseUnaryExpressionOrHigher() {
                  switch (token) {
                      case 33:
                      case 34:
                      case 47:
                      case 46:
                      case 38:
                      case 39:
                          return parsePrefixUnaryExpression();
                      case 74:
                          return parseDeleteExpression();
                      case 97:
                          return parseTypeOfExpression();
                      case 99:
                          return parseVoidExpression();
                      case 24:
                          return parseTypeAssertion();
                      default:
                          return parsePostfixExpressionOrHigher();
                  }
              }
              function parsePostfixExpressionOrHigher() {
                  var expression = parseLeftHandSideExpressionOrHigher();
                  ts.Debug.assert(ts.isLeftHandSideExpression(expression));
                  if ((token === 38 || token === 39) && !scanner.hasPrecedingLineBreak()) {
                      var node = createNode(169, expression.pos);
                      node.operand = expression;
                      node.operator = token;
                      nextToken();
                      return finishNode(node);
                  }
                  return expression;
              }
              function parseLeftHandSideExpressionOrHigher() {
                  var expression = token === 91
                      ? parseSuperExpression()
                      : parseMemberExpressionOrHigher();
                  return parseCallExpressionRest(expression);
              }
              function parseMemberExpressionOrHigher() {
                  var expression = parsePrimaryExpression();
                  return parseMemberExpressionRest(expression);
              }
              function parseSuperExpression() {
                  var expression = parseTokenNode();
                  if (token === 16 || token === 20) {
                      return expression;
                  }
                  var node = createNode(156, expression.pos);
                  node.expression = expression;
                  node.dotToken = parseExpectedToken(20, false, ts.Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
                  node.name = parseRightSideOfDot(true);
                  return finishNode(node);
              }
              function parseTypeAssertion() {
                  var node = createNode(161);
                  parseExpected(24);
                  node.type = parseType();
                  parseExpected(25);
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseMemberExpressionRest(expression) {
                  while (true) {
                      var dotToken = parseOptionalToken(20);
                      if (dotToken) {
                          var propertyAccess = createNode(156, expression.pos);
                          propertyAccess.expression = expression;
                          propertyAccess.dotToken = dotToken;
                          propertyAccess.name = parseRightSideOfDot(true);
                          expression = finishNode(propertyAccess);
                          continue;
                      }
                      if (!inDecoratorContext() && parseOptional(18)) {
                          var indexedAccess = createNode(157, expression.pos);
                          indexedAccess.expression = expression;
                          if (token !== 19) {
                              indexedAccess.argumentExpression = allowInAnd(parseExpression);
                              if (indexedAccess.argumentExpression.kind === 8 || indexedAccess.argumentExpression.kind === 7) {
                                  var literal = indexedAccess.argumentExpression;
                                  literal.text = internIdentifier(literal.text);
                              }
                          }
                          parseExpected(19);
                          expression = finishNode(indexedAccess);
                          continue;
                      }
                      if (token === 10 || token === 11) {
                          var tagExpression = createNode(160, expression.pos);
                          tagExpression.tag = expression;
                          tagExpression.template = token === 10
                              ? parseLiteralNode()
                              : parseTemplateExpression();
                          expression = finishNode(tagExpression);
                          continue;
                      }
                      return expression;
                  }
              }
              function parseCallExpressionRest(expression) {
                  while (true) {
                      expression = parseMemberExpressionRest(expression);
                      if (token === 24) {
                          var typeArguments = tryParse(parseTypeArgumentsInExpression);
                          if (!typeArguments) {
                              return expression;
                          }
                          var callExpr = createNode(158, expression.pos);
                          callExpr.expression = expression;
                          callExpr.typeArguments = typeArguments;
                          callExpr.arguments = parseArgumentList();
                          expression = finishNode(callExpr);
                          continue;
                      }
                      else if (token === 16) {
                          var callExpr = createNode(158, expression.pos);
                          callExpr.expression = expression;
                          callExpr.arguments = parseArgumentList();
                          expression = finishNode(callExpr);
                          continue;
                      }
                      return expression;
                  }
              }
              function parseArgumentList() {
                  parseExpected(16);
                  var result = parseDelimitedList(12, parseArgumentExpression);
                  parseExpected(17);
                  return result;
              }
              function parseTypeArgumentsInExpression() {
                  if (!parseOptional(24)) {
                      return undefined;
                  }
                  var typeArguments = parseDelimitedList(17, parseType);
                  if (!parseExpected(25)) {
                      return undefined;
                  }
                  return typeArguments && canFollowTypeArgumentsInExpression()
                      ? typeArguments
                      : undefined;
              }
              function canFollowTypeArgumentsInExpression() {
                  switch (token) {
                      case 16:
                      case 20:
                      case 17:
                      case 19:
                      case 51:
                      case 22:
                      case 50:
                      case 28:
                      case 30:
                      case 29:
                      case 31:
                      case 48:
                      case 49:
                      case 45:
                      case 43:
                      case 44:
                      case 15:
                      case 1:
                          return true;
                      case 23:
                      case 14:
                      default:
                          return false;
                  }
              }
              function parsePrimaryExpression() {
                  switch (token) {
                      case 7:
                      case 8:
                      case 10:
                          return parseLiteralNode();
                      case 93:
                      case 91:
                      case 89:
                      case 95:
                      case 80:
                          return parseTokenNode();
                      case 16:
                          return parseParenthesizedExpression();
                      case 18:
                          return parseArrayLiteralExpression();
                      case 14:
                          return parseObjectLiteralExpression();
                      case 69:
                          return parseClassExpression();
                      case 83:
                          return parseFunctionExpression();
                      case 88:
                          return parseNewExpression();
                      case 36:
                      case 57:
                          if (reScanSlashToken() === 9) {
                              return parseLiteralNode();
                          }
                          break;
                      case 11:
                          return parseTemplateExpression();
                  }
                  return parseIdentifier(ts.Diagnostics.Expression_expected);
              }
              function parseParenthesizedExpression() {
                  var node = createNode(162);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseSpreadElement() {
                  var node = createNode(174);
                  parseExpected(21);
                  node.expression = parseAssignmentExpressionOrHigher();
                  return finishNode(node);
              }
              function parseArgumentOrArrayLiteralElement() {
                  return token === 21 ? parseSpreadElement() :
                      token === 23 ? createNode(176) :
                          parseAssignmentExpressionOrHigher();
              }
              function parseArgumentExpression() {
                  return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
              }
              function parseArrayLiteralExpression() {
                  var node = createNode(154);
                  parseExpected(18);
                  if (scanner.hasPrecedingLineBreak())
                      node.flags |= 512;
                  node.elements = parseDelimitedList(14, parseArgumentOrArrayLiteralElement);
                  parseExpected(19);
                  return finishNode(node);
              }
              function tryParseAccessorDeclaration(fullStart, decorators, modifiers) {
                  if (parseContextualModifier(116)) {
                      return parseAccessorDeclaration(137, fullStart, decorators, modifiers);
                  }
                  else if (parseContextualModifier(121)) {
                      return parseAccessorDeclaration(138, fullStart, decorators, modifiers);
                  }
                  return undefined;
              }
              function parseObjectLiteralElement() {
                  var fullStart = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
                  if (accessor) {
                      return accessor;
                  }
                  var asteriskToken = parseOptionalToken(35);
                  var tokenIsIdentifier = isIdentifier();
                  var nameToken = token;
                  var propertyName = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (asteriskToken || token === 16 || token === 24) {
                      return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, propertyName, questionToken);
                  }
                  if ((token === 23 || token === 15) && tokenIsIdentifier) {
                      var shorthandDeclaration = createNode(226, fullStart);
                      shorthandDeclaration.name = propertyName;
                      shorthandDeclaration.questionToken = questionToken;
                      return finishNode(shorthandDeclaration);
                  }
                  else {
                      var propertyAssignment = createNode(225, fullStart);
                      propertyAssignment.name = propertyName;
                      propertyAssignment.questionToken = questionToken;
                      parseExpected(51);
                      propertyAssignment.initializer = allowInAnd(parseAssignmentExpressionOrHigher);
                      return finishNode(propertyAssignment);
                  }
              }
              function parseObjectLiteralExpression() {
                  var node = createNode(155);
                  parseExpected(14);
                  if (scanner.hasPrecedingLineBreak()) {
                      node.flags |= 512;
                  }
                  node.properties = parseDelimitedList(13, parseObjectLiteralElement, true);
                  parseExpected(15);
                  return finishNode(node);
              }
              function parseFunctionExpression() {
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var node = createNode(163);
                  parseExpected(83);
                  node.asteriskToken = parseOptionalToken(35);
                  node.name = node.asteriskToken ? doInYieldContext(parseOptionalIdentifier) : parseOptionalIdentifier();
                  fillSignature(51, !!node.asteriskToken, false, node);
                  node.body = parseFunctionBlock(!!node.asteriskToken, false);
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  return finishNode(node);
              }
              function parseOptionalIdentifier() {
                  return isIdentifier() ? parseIdentifier() : undefined;
              }
              function parseNewExpression() {
                  var node = createNode(159);
                  parseExpected(88);
                  node.expression = parseMemberExpressionOrHigher();
                  node.typeArguments = tryParse(parseTypeArgumentsInExpression);
                  if (node.typeArguments || token === 16) {
                      node.arguments = parseArgumentList();
                  }
                  return finishNode(node);
              }
              function parseBlock(ignoreMissingOpenBrace, checkForStrictMode, diagnosticMessage) {
                  var node = createNode(180);
                  if (parseExpected(14, diagnosticMessage) || ignoreMissingOpenBrace) {
                      node.statements = parseList(2, checkForStrictMode, parseStatement);
                      parseExpected(15);
                  }
                  else {
                      node.statements = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseFunctionBlock(allowYield, ignoreMissingOpenBrace, diagnosticMessage) {
                  var savedYieldContext = inYieldContext();
                  setYieldContext(allowYield);
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var block = parseBlock(ignoreMissingOpenBrace, true, diagnosticMessage);
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  setYieldContext(savedYieldContext);
                  return block;
              }
              function parseEmptyStatement() {
                  var node = createNode(182);
                  parseExpected(22);
                  return finishNode(node);
              }
              function parseIfStatement() {
                  var node = createNode(184);
                  parseExpected(84);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.thenStatement = parseStatement();
                  node.elseStatement = parseOptional(76) ? parseStatement() : undefined;
                  return finishNode(node);
              }
              function parseDoStatement() {
                  var node = createNode(185);
                  parseExpected(75);
                  node.statement = parseStatement();
                  parseExpected(100);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  parseOptional(22);
                  return finishNode(node);
              }
              function parseWhileStatement() {
                  var node = createNode(186);
                  parseExpected(100);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.statement = parseStatement();
                  return finishNode(node);
              }
              function parseForOrForInOrForOfStatement() {
                  var pos = getNodePos();
                  parseExpected(82);
                  parseExpected(16);
                  var initializer = undefined;
                  if (token !== 22) {
                      if (token === 98 || token === 104 || token === 70) {
                          initializer = parseVariableDeclarationList(true);
                      }
                      else {
                          initializer = disallowInAnd(parseExpression);
                      }
                  }
                  var forOrForInOrForOfStatement;
                  if (parseOptional(86)) {
                      var forInStatement = createNode(188, pos);
                      forInStatement.initializer = initializer;
                      forInStatement.expression = allowInAnd(parseExpression);
                      parseExpected(17);
                      forOrForInOrForOfStatement = forInStatement;
                  }
                  else if (parseOptional(126)) {
                      var forOfStatement = createNode(189, pos);
                      forOfStatement.initializer = initializer;
                      forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher);
                      parseExpected(17);
                      forOrForInOrForOfStatement = forOfStatement;
                  }
                  else {
                      var forStatement = createNode(187, pos);
                      forStatement.initializer = initializer;
                      parseExpected(22);
                      if (token !== 22 && token !== 17) {
                          forStatement.condition = allowInAnd(parseExpression);
                      }
                      parseExpected(22);
                      if (token !== 17) {
                          forStatement.incrementor = allowInAnd(parseExpression);
                      }
                      parseExpected(17);
                      forOrForInOrForOfStatement = forStatement;
                  }
                  forOrForInOrForOfStatement.statement = parseStatement();
                  return finishNode(forOrForInOrForOfStatement);
              }
              function parseBreakOrContinueStatement(kind) {
                  var node = createNode(kind);
                  parseExpected(kind === 191 ? 66 : 71);
                  if (!canParseSemicolon()) {
                      node.label = parseIdentifier();
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseReturnStatement() {
                  var node = createNode(192);
                  parseExpected(90);
                  if (!canParseSemicolon()) {
                      node.expression = allowInAnd(parseExpression);
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseWithStatement() {
                  var node = createNode(193);
                  parseExpected(101);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.statement = parseStatement();
                  return finishNode(node);
              }
              function parseCaseClause() {
                  var node = createNode(221);
                  parseExpected(67);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(51);
                  node.statements = parseList(4, false, parseStatement);
                  return finishNode(node);
              }
              function parseDefaultClause() {
                  var node = createNode(222);
                  parseExpected(73);
                  parseExpected(51);
                  node.statements = parseList(4, false, parseStatement);
                  return finishNode(node);
              }
              function parseCaseOrDefaultClause() {
                  return token === 67 ? parseCaseClause() : parseDefaultClause();
              }
              function parseSwitchStatement() {
                  var node = createNode(194);
                  parseExpected(92);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  var caseBlock = createNode(208, scanner.getStartPos());
                  parseExpected(14);
                  caseBlock.clauses = parseList(3, false, parseCaseOrDefaultClause);
                  parseExpected(15);
                  node.caseBlock = finishNode(caseBlock);
                  return finishNode(node);
              }
              function parseThrowStatement() {
                  // ThrowStatement[Yield] :
                  //      throw [no LineTerminator here]Expression[In, ?Yield];
                  var node = createNode(196);
                  parseExpected(94);
                  node.expression = scanner.hasPrecedingLineBreak() ? undefined : allowInAnd(parseExpression);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseTryStatement() {
                  var node = createNode(197);
                  parseExpected(96);
                  node.tryBlock = parseBlock(false, false);
                  node.catchClause = token === 68 ? parseCatchClause() : undefined;
                  if (!node.catchClause || token === 81) {
                      parseExpected(81);
                      node.finallyBlock = parseBlock(false, false);
                  }
                  return finishNode(node);
              }
              function parseCatchClause() {
                  var result = createNode(224);
                  parseExpected(68);
                  if (parseExpected(16)) {
                      result.variableDeclaration = parseVariableDeclaration();
                  }
                  parseExpected(17);
                  result.block = parseBlock(false, false);
                  return finishNode(result);
              }
              function parseDebuggerStatement() {
                  var node = createNode(198);
                  parseExpected(72);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseExpressionOrLabeledStatement() {
                  var fullStart = scanner.getStartPos();
                  var expression = allowInAnd(parseExpression);
                  if (expression.kind === 65 && parseOptional(51)) {
                      var labeledStatement = createNode(195, fullStart);
                      labeledStatement.label = expression;
                      labeledStatement.statement = parseStatement();
                      return finishNode(labeledStatement);
                  }
                  else {
                      var expressionStatement = createNode(183, fullStart);
                      expressionStatement.expression = expression;
                      parseSemicolon();
                      return finishNode(expressionStatement);
                  }
              }
              function isStartOfStatement(inErrorRecovery) {
                  if (ts.isModifier(token)) {
                      var result = lookAhead(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
                      if (result) {
                          return true;
                      }
                  }
                  switch (token) {
                      case 22:
                          return !inErrorRecovery;
                      case 14:
                      case 98:
                      case 104:
                      case 83:
                      case 69:
                      case 84:
                      case 75:
                      case 100:
                      case 82:
                      case 71:
                      case 66:
                      case 90:
                      case 101:
                      case 92:
                      case 94:
                      case 96:
                      case 72:
                      case 68:
                      case 81:
                          return true;
                      case 70:
                          var isConstEnum = lookAhead(nextTokenIsEnumKeyword);
                          return !isConstEnum;
                      case 103:
                      case 117:
                      case 118:
                      case 77:
                      case 124:
                          if (isDeclarationStart()) {
                              return false;
                          }
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          if (lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine)) {
                              return false;
                          }
                      default:
                          return isStartOfExpression();
                  }
              }
              function nextTokenIsEnumKeyword() {
                  nextToken();
                  return token === 77;
              }
              function nextTokenIsIdentifierOrKeywordOnSameLine() {
                  nextToken();
                  return isIdentifierOrKeyword() && !scanner.hasPrecedingLineBreak();
              }
              function parseStatement() {
                  switch (token) {
                      case 14:
                          return parseBlock(false, false);
                      case 98:
                      case 70:
                          return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
                      case 83:
                          return parseFunctionDeclaration(scanner.getStartPos(), undefined, undefined);
                      case 69:
                          return parseClassDeclaration(scanner.getStartPos(), undefined, undefined);
                      case 22:
                          return parseEmptyStatement();
                      case 84:
                          return parseIfStatement();
                      case 75:
                          return parseDoStatement();
                      case 100:
                          return parseWhileStatement();
                      case 82:
                          return parseForOrForInOrForOfStatement();
                      case 71:
                          return parseBreakOrContinueStatement(190);
                      case 66:
                          return parseBreakOrContinueStatement(191);
                      case 90:
                          return parseReturnStatement();
                      case 101:
                          return parseWithStatement();
                      case 92:
                          return parseSwitchStatement();
                      case 94:
                          return parseThrowStatement();
                      case 96:
                      case 68:
                      case 81:
                          return parseTryStatement();
                      case 72:
                          return parseDebuggerStatement();
                      case 104:
                          if (isLetDeclaration()) {
                              return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
                          }
                      default:
                          if (ts.isModifier(token) || token === 52) {
                              var result = tryParse(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
                              if (result) {
                                  return result;
                              }
                          }
                          return parseExpressionOrLabeledStatement();
                  }
              }
              function parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers() {
                  var start = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  switch (token) {
                      case 70:
                          var nextTokenIsEnum = lookAhead(nextTokenIsEnumKeyword);
                          if (nextTokenIsEnum) {
                              return undefined;
                          }
                          return parseVariableStatement(start, decorators, modifiers);
                      case 104:
                          if (!isLetDeclaration()) {
                              return undefined;
                          }
                          return parseVariableStatement(start, decorators, modifiers);
                      case 98:
                          return parseVariableStatement(start, decorators, modifiers);
                      case 83:
                          return parseFunctionDeclaration(start, decorators, modifiers);
                      case 69:
                          return parseClassDeclaration(start, decorators, modifiers);
                  }
                  return undefined;
              }
              function parseFunctionBlockOrSemicolon(isGenerator, diagnosticMessage) {
                  if (token !== 14 && canParseSemicolon()) {
                      parseSemicolon();
                      return;
                  }
                  return parseFunctionBlock(isGenerator, false, diagnosticMessage);
              }
              function parseArrayBindingElement() {
                  if (token === 23) {
                      return createNode(176);
                  }
                  var node = createNode(153);
                  node.dotDotDotToken = parseOptionalToken(21);
                  node.name = parseIdentifierOrPattern();
                  node.initializer = parseInitializer(false);
                  return finishNode(node);
              }
              function parseObjectBindingElement() {
                  var node = createNode(153);
                  var tokenIsIdentifier = isIdentifier();
                  var propertyName = parsePropertyName();
                  if (tokenIsIdentifier && token !== 51) {
                      node.name = propertyName;
                  }
                  else {
                      parseExpected(51);
                      node.propertyName = propertyName;
                      node.name = parseIdentifierOrPattern();
                  }
                  node.initializer = parseInitializer(false);
                  return finishNode(node);
              }
              function parseObjectBindingPattern() {
                  var node = createNode(151);
                  parseExpected(14);
                  node.elements = parseDelimitedList(10, parseObjectBindingElement);
                  parseExpected(15);
                  return finishNode(node);
              }
              function parseArrayBindingPattern() {
                  var node = createNode(152);
                  parseExpected(18);
                  node.elements = parseDelimitedList(11, parseArrayBindingElement);
                  parseExpected(19);
                  return finishNode(node);
              }
              function isIdentifierOrPattern() {
                  return token === 14 || token === 18 || isIdentifier();
              }
              function parseIdentifierOrPattern() {
                  if (token === 18) {
                      return parseArrayBindingPattern();
                  }
                  if (token === 14) {
                      return parseObjectBindingPattern();
                  }
                  return parseIdentifier();
              }
              function parseVariableDeclaration() {
                  var node = createNode(199);
                  node.name = parseIdentifierOrPattern();
                  node.type = parseTypeAnnotation();
                  if (!isInOrOfKeyword(token)) {
                      node.initializer = parseInitializer(false);
                  }
                  return finishNode(node);
              }
              function parseVariableDeclarationList(inForStatementInitializer) {
                  var node = createNode(200);
                  switch (token) {
                      case 98:
                          break;
                      case 104:
                          node.flags |= 4096;
                          break;
                      case 70:
                          node.flags |= 8192;
                          break;
                      default:
                          ts.Debug.fail();
                  }
                  nextToken();
                  if (token === 126 && lookAhead(canFollowContextualOfKeyword)) {
                      node.declarations = createMissingList();
                  }
                  else {
                      var savedDisallowIn = inDisallowInContext();
                      setDisallowInContext(inForStatementInitializer);
                      node.declarations = parseDelimitedList(9, parseVariableDeclaration);
                      setDisallowInContext(savedDisallowIn);
                  }
                  return finishNode(node);
              }
              function canFollowContextualOfKeyword() {
                  return nextTokenIsIdentifier() && nextToken() === 17;
              }
              function parseVariableStatement(fullStart, decorators, modifiers) {
                  var node = createNode(181, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.declarationList = parseVariableDeclarationList(false);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseFunctionDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(201, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(83);
                  node.asteriskToken = parseOptionalToken(35);
                  node.name = node.flags & 256 ? parseOptionalIdentifier() : parseIdentifier();
                  fillSignature(51, !!node.asteriskToken, false, node);
                  node.body = parseFunctionBlockOrSemicolon(!!node.asteriskToken, ts.Diagnostics.or_expected);
                  return finishNode(node);
              }
              function parseConstructorDeclaration(pos, decorators, modifiers) {
                  var node = createNode(136, pos);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(114);
                  fillSignature(51, false, false, node);
                  node.body = parseFunctionBlockOrSemicolon(false, ts.Diagnostics.or_expected);
                  return finishNode(node);
              }
              function parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, diagnosticMessage) {
                  var method = createNode(135, fullStart);
                  method.decorators = decorators;
                  setModifiers(method, modifiers);
                  method.asteriskToken = asteriskToken;
                  method.name = name;
                  method.questionToken = questionToken;
                  fillSignature(51, !!asteriskToken, false, method);
                  method.body = parseFunctionBlockOrSemicolon(!!asteriskToken, diagnosticMessage);
                  return finishNode(method);
              }
              function parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken) {
                  var property = createNode(133, fullStart);
                  property.decorators = decorators;
                  setModifiers(property, modifiers);
                  property.name = name;
                  property.questionToken = questionToken;
                  property.type = parseTypeAnnotation();
                  property.initializer = allowInAnd(parseNonParameterInitializer);
                  parseSemicolon();
                  return finishNode(property);
              }
              function parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers) {
                  var asteriskToken = parseOptionalToken(35);
                  var name = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (asteriskToken || token === 16 || token === 24) {
                      return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, ts.Diagnostics.or_expected);
                  }
                  else {
                      return parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken);
                  }
              }
              function parseNonParameterInitializer() {
                  return parseInitializer(false);
              }
              function parseAccessorDeclaration(kind, fullStart, decorators, modifiers) {
                  var node = createNode(kind, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.name = parsePropertyName();
                  fillSignature(51, false, false, node);
                  node.body = parseFunctionBlockOrSemicolon(false);
                  return finishNode(node);
              }
              function isClassMemberModifier(idToken) {
                  switch (idToken) {
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          return true;
                      default:
                          return false;
                  }
              }
              function isClassMemberStart() {
                  var idToken;
                  if (token === 52) {
                      return true;
                  }
                  while (ts.isModifier(token)) {
                      idToken = token;
                      if (isClassMemberModifier(idToken)) {
                          return true;
                      }
                      nextToken();
                  }
                  if (token === 35) {
                      return true;
                  }
                  if (isLiteralPropertyName()) {
                      idToken = token;
                      nextToken();
                  }
                  if (token === 18) {
                      return true;
                  }
                  if (idToken !== undefined) {
                      if (!ts.isKeyword(idToken) || idToken === 121 || idToken === 116) {
                          return true;
                      }
                      switch (token) {
                          case 16:
                          case 24:
                          case 51:
                          case 53:
                          case 50:
                              return true;
                          default:
                              return canParseSemicolon();
                      }
                  }
                  return false;
              }
              function parseDecorators() {
                  var decorators;
                  while (true) {
                      var decoratorStart = getNodePos();
                      if (!parseOptional(52)) {
                          break;
                      }
                      if (!decorators) {
                          decorators = [];
                          decorators.pos = scanner.getStartPos();
                      }
                      var decorator = createNode(131, decoratorStart);
                      decorator.expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher);
                      decorators.push(finishNode(decorator));
                  }
                  if (decorators) {
                      decorators.end = getNodeEnd();
                  }
                  return decorators;
              }
              function parseModifiers() {
                  var flags = 0;
                  var modifiers;
                  while (true) {
                      var modifierStart = scanner.getStartPos();
                      var modifierKind = token;
                      if (!parseAnyContextualModifier()) {
                          break;
                      }
                      if (!modifiers) {
                          modifiers = [];
                          modifiers.pos = modifierStart;
                      }
                      flags |= ts.modifierToFlag(modifierKind);
                      modifiers.push(finishNode(createNode(modifierKind, modifierStart)));
                  }
                  if (modifiers) {
                      modifiers.flags = flags;
                      modifiers.end = scanner.getStartPos();
                  }
                  return modifiers;
              }
              function parseClassElement() {
                  if (token === 22) {
                      var result = createNode(179);
                      nextToken();
                      return finishNode(result);
                  }
                  var fullStart = getNodePos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
                  if (accessor) {
                      return accessor;
                  }
                  if (token === 114) {
                      return parseConstructorDeclaration(fullStart, decorators, modifiers);
                  }
                  if (isIndexSignature()) {
                      return parseIndexSignatureDeclaration(fullStart, decorators, modifiers);
                  }
                  if (isIdentifierOrKeyword() ||
                      token === 8 ||
                      token === 7 ||
                      token === 35 ||
                      token === 18) {
                      return parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers);
                  }
                  if (decorators) {
                      var name_3 = createMissingNode(65, true, ts.Diagnostics.Declaration_expected);
                      return parsePropertyDeclaration(fullStart, decorators, modifiers, name_3, undefined);
                  }
                  ts.Debug.fail("Should not have attempted to parse class member declaration.");
              }
              function parseClassExpression() {
                  return parseClassDeclarationOrExpression(scanner.getStartPos(), undefined, undefined, 175);
              }
              function parseClassDeclaration(fullStart, decorators, modifiers) {
                  return parseClassDeclarationOrExpression(fullStart, decorators, modifiers, 202);
              }
              function parseClassDeclarationOrExpression(fullStart, decorators, modifiers, kind) {
                  var savedStrictModeContext = inStrictModeContext();
                  setStrictModeContext(true);
                  var node = createNode(kind, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(69);
                  node.name = parseOptionalIdentifier();
                  node.typeParameters = parseTypeParameters();
                  node.heritageClauses = parseHeritageClauses(true);
                  if (parseExpected(14)) {
                      node.members = inGeneratorParameterContext()
                          ? doOutsideOfYieldContext(parseClassMembers)
                          : parseClassMembers();
                      parseExpected(15);
                  }
                  else {
                      node.members = createMissingList();
                  }
                  var finishedNode = finishNode(node);
                  setStrictModeContext(savedStrictModeContext);
                  return finishedNode;
              }
              function parseHeritageClauses(isClassHeritageClause) {
                  // ClassTail[Yield,GeneratorParameter] : See 14.5
                  //      [~GeneratorParameter]ClassHeritage[?Yield]opt { ClassBody[?Yield]opt }
                  //      [+GeneratorParameter] ClassHeritageopt { ClassBodyopt }
                  if (isHeritageClause()) {
                      return isClassHeritageClause && inGeneratorParameterContext()
                          ? doOutsideOfYieldContext(parseHeritageClausesWorker)
                          : parseHeritageClausesWorker();
                  }
                  return undefined;
              }
              function parseHeritageClausesWorker() {
                  return parseList(19, false, parseHeritageClause);
              }
              function parseHeritageClause() {
                  if (token === 79 || token === 102) {
                      var node = createNode(223);
                      node.token = token;
                      nextToken();
                      node.types = parseDelimitedList(8, parseExpressionWithTypeArguments);
                      return finishNode(node);
                  }
                  return undefined;
              }
              function parseExpressionWithTypeArguments() {
                  var node = createNode(177);
                  node.expression = parseLeftHandSideExpressionOrHigher();
                  if (token === 24) {
                      node.typeArguments = parseBracketedList(17, parseType, 24, 25);
                  }
                  return finishNode(node);
              }
              function isHeritageClause() {
                  return token === 79 || token === 102;
              }
              function parseClassMembers() {
                  return parseList(6, false, parseClassElement);
              }
              function parseInterfaceDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(203, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(103);
                  node.name = parseIdentifier();
                  node.typeParameters = parseTypeParameters();
                  node.heritageClauses = parseHeritageClauses(false);
                  node.members = parseObjectTypeMembers();
                  return finishNode(node);
              }
              function parseTypeAliasDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(204, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(124);
                  node.name = parseIdentifier();
                  parseExpected(53);
                  node.type = parseType();
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseEnumMember() {
                  var node = createNode(227, scanner.getStartPos());
                  node.name = parsePropertyName();
                  node.initializer = allowInAnd(parseNonParameterInitializer);
                  return finishNode(node);
              }
              function parseEnumDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(205, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(77);
                  node.name = parseIdentifier();
                  if (parseExpected(14)) {
                      node.members = parseDelimitedList(7, parseEnumMember);
                      parseExpected(15);
                  }
                  else {
                      node.members = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseModuleBlock() {
                  var node = createNode(207, scanner.getStartPos());
                  if (parseExpected(14)) {
                      node.statements = parseList(1, false, parseModuleElement);
                      parseExpected(15);
                  }
                  else {
                      node.statements = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags) {
                  var node = createNode(206, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.flags |= flags;
                  node.name = parseIdentifier();
                  node.body = parseOptional(20)
                      ? parseModuleOrNamespaceDeclaration(getNodePos(), undefined, undefined, 1)
                      : parseModuleBlock();
                  return finishNode(node);
              }
              function parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(206, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.name = parseLiteralNode(true);
                  node.body = parseModuleBlock();
                  return finishNode(node);
              }
              function parseModuleDeclaration(fullStart, decorators, modifiers) {
                  var flags = modifiers ? modifiers.flags : 0;
                  if (parseOptional(118)) {
                      flags |= 32768;
                  }
                  else {
                      parseExpected(117);
                      if (token === 8) {
                          return parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers);
                      }
                  }
                  return parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags);
              }
              function isExternalModuleReference() {
                  return token === 119 &&
                      lookAhead(nextTokenIsOpenParen);
              }
              function nextTokenIsOpenParen() {
                  return nextToken() === 16;
              }
              function nextTokenIsCommaOrFromKeyword() {
                  nextToken();
                  return token === 23 ||
                      token === 125;
              }
              function parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers) {
                  parseExpected(85);
                  var afterImportPos = scanner.getStartPos();
                  var identifier;
                  if (isIdentifier()) {
                      identifier = parseIdentifier();
                      if (token !== 23 && token !== 125) {
                          var importEqualsDeclaration = createNode(209, fullStart);
                          importEqualsDeclaration.decorators = decorators;
                          setModifiers(importEqualsDeclaration, modifiers);
                          importEqualsDeclaration.name = identifier;
                          parseExpected(53);
                          importEqualsDeclaration.moduleReference = parseModuleReference();
                          parseSemicolon();
                          return finishNode(importEqualsDeclaration);
                      }
                  }
                  var importDeclaration = createNode(210, fullStart);
                  importDeclaration.decorators = decorators;
                  setModifiers(importDeclaration, modifiers);
                  if (identifier ||
                      token === 35 ||
                      token === 14) {
                      importDeclaration.importClause = parseImportClause(identifier, afterImportPos);
                      parseExpected(125);
                  }
                  importDeclaration.moduleSpecifier = parseModuleSpecifier();
                  parseSemicolon();
                  return finishNode(importDeclaration);
              }
              function parseImportClause(identifier, fullStart) {
                  //ImportClause:
                  //  ImportedDefaultBinding
                  //  NameSpaceImport
                  //  NamedImports
                  //  ImportedDefaultBinding, NameSpaceImport
                  //  ImportedDefaultBinding, NamedImports
                  var importClause = createNode(211, fullStart);
                  if (identifier) {
                      importClause.name = identifier;
                  }
                  if (!importClause.name ||
                      parseOptional(23)) {
                      importClause.namedBindings = token === 35 ? parseNamespaceImport() : parseNamedImportsOrExports(213);
                  }
                  return finishNode(importClause);
              }
              function parseModuleReference() {
                  return isExternalModuleReference()
                      ? parseExternalModuleReference()
                      : parseEntityName(false);
              }
              function parseExternalModuleReference() {
                  var node = createNode(220);
                  parseExpected(119);
                  parseExpected(16);
                  node.expression = parseModuleSpecifier();
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseModuleSpecifier() {
                  var result = parseExpression();
                  if (result.kind === 8) {
                      internIdentifier(result.text);
                  }
                  return result;
              }
              function parseNamespaceImport() {
                  var namespaceImport = createNode(212);
                  parseExpected(35);
                  parseExpected(111);
                  namespaceImport.name = parseIdentifier();
                  return finishNode(namespaceImport);
              }
              function parseNamedImportsOrExports(kind) {
                  var node = createNode(kind);
                  node.elements = parseBracketedList(20, kind === 213 ? parseImportSpecifier : parseExportSpecifier, 14, 15);
                  return finishNode(node);
              }
              function parseExportSpecifier() {
                  return parseImportOrExportSpecifier(218);
              }
              function parseImportSpecifier() {
                  return parseImportOrExportSpecifier(214);
              }
              function parseImportOrExportSpecifier(kind) {
                  var node = createNode(kind);
                  var checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
                  var checkIdentifierStart = scanner.getTokenPos();
                  var checkIdentifierEnd = scanner.getTextPos();
                  var identifierName = parseIdentifierName();
                  if (token === 111) {
                      node.propertyName = identifierName;
                      parseExpected(111);
                      checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
                      checkIdentifierStart = scanner.getTokenPos();
                      checkIdentifierEnd = scanner.getTextPos();
                      node.name = parseIdentifierName();
                  }
                  else {
                      node.name = identifierName;
                  }
                  if (kind === 214 && checkIdentifierIsKeyword) {
                      parseErrorAtPosition(checkIdentifierStart, checkIdentifierEnd - checkIdentifierStart, ts.Diagnostics.Identifier_expected);
                  }
                  return finishNode(node);
              }
              function parseExportDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(216, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  if (parseOptional(35)) {
                      parseExpected(125);
                      node.moduleSpecifier = parseModuleSpecifier();
                  }
                  else {
                      node.exportClause = parseNamedImportsOrExports(217);
                      if (parseOptional(125)) {
                          node.moduleSpecifier = parseModuleSpecifier();
                      }
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseExportAssignment(fullStart, decorators, modifiers) {
                  var node = createNode(215, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  if (parseOptional(53)) {
                      node.isExportEquals = true;
                  }
                  else {
                      parseExpected(73);
                  }
                  node.expression = parseAssignmentExpressionOrHigher();
                  parseSemicolon();
                  return finishNode(node);
              }
              function isLetDeclaration() {
                  return inStrictModeContext() || lookAhead(nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine);
              }
              function isDeclarationStart(followsModifier) {
                  switch (token) {
                      case 98:
                      case 70:
                      case 83:
                          return true;
                      case 104:
                          return isLetDeclaration();
                      case 69:
                      case 103:
                      case 77:
                      case 124:
                          return lookAhead(nextTokenIsIdentifierOrKeyword);
                      case 85:
                          return lookAhead(nextTokenCanFollowImportKeyword);
                      case 117:
                      case 118:
                          return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteral);
                      case 78:
                          return lookAhead(nextTokenCanFollowExportKeyword);
                      case 115:
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          return lookAhead(nextTokenIsDeclarationStart);
                      case 52:
                          return !followsModifier;
                  }
              }
              function isIdentifierOrKeyword() {
                  return token >= 65;
              }
              function nextTokenIsIdentifierOrKeyword() {
                  nextToken();
                  return isIdentifierOrKeyword();
              }
              function nextTokenIsIdentifierOrKeywordOrStringLiteral() {
                  nextToken();
                  return isIdentifierOrKeyword() || token === 8;
              }
              function nextTokenCanFollowImportKeyword() {
                  nextToken();
                  return isIdentifierOrKeyword() || token === 8 ||
                      token === 35 || token === 14;
              }
              function nextTokenCanFollowExportKeyword() {
                  nextToken();
                  return token === 53 || token === 35 ||
                      token === 14 || token === 73 || isDeclarationStart(true);
              }
              function nextTokenIsDeclarationStart() {
                  nextToken();
                  return isDeclarationStart(true);
              }
              function nextTokenIsAsKeyword() {
                  return nextToken() === 111;
              }
              function parseDeclaration() {
                  var fullStart = getNodePos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  if (token === 78) {
                      nextToken();
                      if (token === 73 || token === 53) {
                          return parseExportAssignment(fullStart, decorators, modifiers);
                      }
                      if (token === 35 || token === 14) {
                          return parseExportDeclaration(fullStart, decorators, modifiers);
                      }
                  }
                  switch (token) {
                      case 98:
                      case 104:
                      case 70:
                          return parseVariableStatement(fullStart, decorators, modifiers);
                      case 83:
                          return parseFunctionDeclaration(fullStart, decorators, modifiers);
                      case 69:
                          return parseClassDeclaration(fullStart, decorators, modifiers);
                      case 103:
                          return parseInterfaceDeclaration(fullStart, decorators, modifiers);
                      case 124:
                          return parseTypeAliasDeclaration(fullStart, decorators, modifiers);
                      case 77:
                          return parseEnumDeclaration(fullStart, decorators, modifiers);
                      case 117:
                      case 118:
                          return parseModuleDeclaration(fullStart, decorators, modifiers);
                      case 85:
                          return parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers);
                      default:
                          if (decorators) {
                              var node = createMissingNode(219, true, ts.Diagnostics.Declaration_expected);
                              node.pos = fullStart;
                              node.decorators = decorators;
                              setModifiers(node, modifiers);
                              return finishNode(node);
                          }
                          ts.Debug.fail("Mismatch between isDeclarationStart and parseDeclaration");
                  }
              }
              function isSourceElement(inErrorRecovery) {
                  return isDeclarationStart() || isStartOfStatement(inErrorRecovery);
              }
              function parseSourceElement() {
                  return parseSourceElementOrModuleElement();
              }
              function parseModuleElement() {
                  return parseSourceElementOrModuleElement();
              }
              function parseSourceElementOrModuleElement() {
                  return isDeclarationStart()
                      ? parseDeclaration()
                      : parseStatement();
              }
              function processReferenceComments(sourceFile) {
                  var triviaScanner = ts.createScanner(sourceFile.languageVersion, false, sourceText);
                  var referencedFiles = [];
                  var amdDependencies = [];
                  var amdModuleName;
                  while (true) {
                      var kind = triviaScanner.scan();
                      if (kind === 5 || kind === 4 || kind === 3) {
                          continue;
                      }
                      if (kind !== 2) {
                          break;
                      }
                      var range = { pos: triviaScanner.getTokenPos(), end: triviaScanner.getTextPos(), kind: triviaScanner.getToken() };
                      var comment = sourceText.substring(range.pos, range.end);
                      var referencePathMatchResult = ts.getFileReferenceFromReferencePath(comment, range);
                      if (referencePathMatchResult) {
                          var fileReference = referencePathMatchResult.fileReference;
                          sourceFile.hasNoDefaultLib = referencePathMatchResult.isNoDefaultLib;
                          var diagnosticMessage = referencePathMatchResult.diagnosticMessage;
                          if (fileReference) {
                              referencedFiles.push(fileReference);
                          }
                          if (diagnosticMessage) {
                              sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, diagnosticMessage));
                          }
                      }
                      else {
                          var amdModuleNameRegEx = /^\/\/\/\s*<amd-module\s+name\s*=\s*('|")(.+?)\1/gim;
                          var amdModuleNameMatchResult = amdModuleNameRegEx.exec(comment);
                          if (amdModuleNameMatchResult) {
                              if (amdModuleName) {
                                  sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, ts.Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments));
                              }
                              amdModuleName = amdModuleNameMatchResult[2];
                          }
                          var amdDependencyRegEx = /^\/\/\/\s*<amd-dependency\s/gim;
                          var pathRegex = /\spath\s*=\s*('|")(.+?)\1/gim;
                          var nameRegex = /\sname\s*=\s*('|")(.+?)\1/gim;
                          var amdDependencyMatchResult = amdDependencyRegEx.exec(comment);
                          if (amdDependencyMatchResult) {
                              var pathMatchResult = pathRegex.exec(comment);
                              var nameMatchResult = nameRegex.exec(comment);
                              if (pathMatchResult) {
                                  var amdDependency = { path: pathMatchResult[2], name: nameMatchResult ? nameMatchResult[2] : undefined };
                                  amdDependencies.push(amdDependency);
                              }
                          }
                      }
                  }
                  sourceFile.referencedFiles = referencedFiles;
                  sourceFile.amdDependencies = amdDependencies;
                  sourceFile.amdModuleName = amdModuleName;
              }
              function setExternalModuleIndicator(sourceFile) {
                  sourceFile.externalModuleIndicator = ts.forEach(sourceFile.statements, function (node) {
                      return node.flags & 1
                          || node.kind === 209 && node.moduleReference.kind === 220
                          || node.kind === 210
                          || node.kind === 215
                          || node.kind === 216
                          ? node
                          : undefined;
                  });
              }
          })(Parser || (Parser = {}));
          var IncrementalParser;
          (function (IncrementalParser) {
              function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
                  aggressiveChecks = aggressiveChecks || ts.Debug.shouldAssert(2);
                  checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks);
                  if (ts.textChangeRangeIsUnchanged(textChangeRange)) {
                      return sourceFile;
                  }
                  if (sourceFile.statements.length === 0) {
                      return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, undefined, true);
                  }
                  var incrementalSourceFile = sourceFile;
                  ts.Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed);
                  incrementalSourceFile.hasBeenIncrementallyParsed = true;
                  var oldText = sourceFile.text;
                  var syntaxCursor = createSyntaxCursor(sourceFile);
                  var changeRange = extendToAffectedRange(sourceFile, textChangeRange);
                  checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks);
                  ts.Debug.assert(changeRange.span.start <= textChangeRange.span.start);
                  ts.Debug.assert(ts.textSpanEnd(changeRange.span) === ts.textSpanEnd(textChangeRange.span));
                  ts.Debug.assert(ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)) === ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)));
                  var delta = ts.textChangeRangeNewSpan(changeRange).length - changeRange.span.length;
                  updateTokenPositionsAndMarkElements(incrementalSourceFile, changeRange.span.start, ts.textSpanEnd(changeRange.span), ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks);
                  var result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, true);
                  return result;
              }
              IncrementalParser.updateSourceFile = updateSourceFile;
              function moveElementEntirelyPastChangeRange(element, isArray, delta, oldText, newText, aggressiveChecks) {
                  if (isArray) {
                      visitArray(element);
                  }
                  else {
                      visitNode(element);
                  }
                  return;
                  function visitNode(node) {
                      if (aggressiveChecks && shouldCheckNode(node)) {
                          var text = oldText.substring(node.pos, node.end);
                      }
                      node._children = undefined;
                      node.pos += delta;
                      node.end += delta;
                      if (aggressiveChecks && shouldCheckNode(node)) {
                          ts.Debug.assert(text === newText.substring(node.pos, node.end));
                      }
                      forEachChild(node, visitNode, visitArray);
                      checkNodePositions(node, aggressiveChecks);
                  }
                  function visitArray(array) {
                      array._children = undefined;
                      array.pos += delta;
                      array.end += delta;
                      for (var _i = 0; _i < array.length; _i++) {
                          var node = array[_i];
                          visitNode(node);
                      }
                  }
              }
              function shouldCheckNode(node) {
                  switch (node.kind) {
                      case 8:
                      case 7:
                      case 65:
                          return true;
                  }
                  return false;
              }
              function adjustIntersectingElement(element, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta) {
                  ts.Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range");
                  ts.Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range");
                  ts.Debug.assert(element.pos <= element.end);
                  element.pos = Math.min(element.pos, changeRangeNewEnd);
                  if (element.end >= changeRangeOldEnd) {
                      element.end += delta;
                  }
                  else {
                      element.end = Math.min(element.end, changeRangeNewEnd);
                  }
                  ts.Debug.assert(element.pos <= element.end);
                  if (element.parent) {
                      ts.Debug.assert(element.pos >= element.parent.pos);
                      ts.Debug.assert(element.end <= element.parent.end);
                  }
              }
              function checkNodePositions(node, aggressiveChecks) {
                  if (aggressiveChecks) {
                      var pos = node.pos;
                      forEachChild(node, function (child) {
                          ts.Debug.assert(child.pos >= pos);
                          pos = child.end;
                      });
                      ts.Debug.assert(pos <= node.end);
                  }
              }
              function updateTokenPositionsAndMarkElements(sourceFile, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta, oldText, newText, aggressiveChecks) {
                  visitNode(sourceFile);
                  return;
                  function visitNode(child) {
                      ts.Debug.assert(child.pos <= child.end);
                      if (child.pos > changeRangeOldEnd) {
                          moveElementEntirelyPastChangeRange(child, false, delta, oldText, newText, aggressiveChecks);
                          return;
                      }
                      var fullEnd = child.end;
                      if (fullEnd >= changeStart) {
                          child.intersectsChange = true;
                          child._children = undefined;
                          adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
                          forEachChild(child, visitNode, visitArray);
                          checkNodePositions(child, aggressiveChecks);
                          return;
                      }
                      ts.Debug.assert(fullEnd < changeStart);
                  }
                  function visitArray(array) {
                      ts.Debug.assert(array.pos <= array.end);
                      if (array.pos > changeRangeOldEnd) {
                          moveElementEntirelyPastChangeRange(array, true, delta, oldText, newText, aggressiveChecks);
                          return;
                      }
                      var fullEnd = array.end;
                      if (fullEnd >= changeStart) {
                          array.intersectsChange = true;
                          array._children = undefined;
                          adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
                          for (var _i = 0; _i < array.length; _i++) {
                              var node = array[_i];
                              visitNode(node);
                          }
                          return;
                      }
                      ts.Debug.assert(fullEnd < changeStart);
                  }
              }
              function extendToAffectedRange(sourceFile, changeRange) {
                  var maxLookahead = 1;
                  var start = changeRange.span.start;
                  for (var i = 0; start > 0 && i <= maxLookahead; i++) {
                      var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);
                      ts.Debug.assert(nearestNode.pos <= start);
                      var position = nearestNode.pos;
                      start = Math.max(0, position - 1);
                  }
                  var finalSpan = ts.createTextSpanFromBounds(start, ts.textSpanEnd(changeRange.span));
                  var finalLength = changeRange.newLength + (changeRange.span.start - start);
                  return ts.createTextChangeRange(finalSpan, finalLength);
              }
              function findNearestNodeStartingBeforeOrAtPosition(sourceFile, position) {
                  var bestResult = sourceFile;
                  var lastNodeEntirelyBeforePosition;
                  forEachChild(sourceFile, visit);
                  if (lastNodeEntirelyBeforePosition) {
                      var lastChildOfLastEntireNodeBeforePosition = getLastChild(lastNodeEntirelyBeforePosition);
                      if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {
                          bestResult = lastChildOfLastEntireNodeBeforePosition;
                      }
                  }
                  return bestResult;
                  function getLastChild(node) {
                      while (true) {
                          var lastChild = getLastChildWorker(node);
                          if (lastChild) {
                              node = lastChild;
                          }
                          else {
                              return node;
                          }
                      }
                  }
                  function getLastChildWorker(node) {
                      var last = undefined;
                      forEachChild(node, function (child) {
                          if (ts.nodeIsPresent(child)) {
                              last = child;
                          }
                      });
                      return last;
                  }
                  function visit(child) {
                      if (ts.nodeIsMissing(child)) {
                          return;
                      }
                      if (child.pos <= position) {
                          if (child.pos >= bestResult.pos) {
                              bestResult = child;
                          }
                          if (position < child.end) {
                              forEachChild(child, visit);
                              return true;
                          }
                          else {
                              ts.Debug.assert(child.end <= position);
                              lastNodeEntirelyBeforePosition = child;
                          }
                      }
                      else {
                          ts.Debug.assert(child.pos > position);
                          return true;
                      }
                  }
              }
              function checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks) {
                  var oldText = sourceFile.text;
                  if (textChangeRange) {
                      ts.Debug.assert((oldText.length - textChangeRange.span.length + textChangeRange.newLength) === newText.length);
                      if (aggressiveChecks || ts.Debug.shouldAssert(3)) {
                          var oldTextPrefix = oldText.substr(0, textChangeRange.span.start);
                          var newTextPrefix = newText.substr(0, textChangeRange.span.start);
                          ts.Debug.assert(oldTextPrefix === newTextPrefix);
                          var oldTextSuffix = oldText.substring(ts.textSpanEnd(textChangeRange.span), oldText.length);
                          var newTextSuffix = newText.substring(ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)), newText.length);
                          ts.Debug.assert(oldTextSuffix === newTextSuffix);
                      }
                  }
              }
              function createSyntaxCursor(sourceFile) {
                  var currentArray = sourceFile.statements;
                  var currentArrayIndex = 0;
                  ts.Debug.assert(currentArrayIndex < currentArray.length);
                  var current = currentArray[currentArrayIndex];
                  var lastQueriedPosition = -1;
                  return {
                      currentNode: function (position) {
                          if (position !== lastQueriedPosition) {
                              if (current && current.end === position && currentArrayIndex < (currentArray.length - 1)) {
                                  currentArrayIndex++;
                                  current = currentArray[currentArrayIndex];
                              }
                              if (!current || current.pos !== position) {
                                  findHighestListElementThatStartsAtPosition(position);
                              }
                          }
                          lastQueriedPosition = position;
                          ts.Debug.assert(!current || current.pos === position);
                          return current;
                      }
                  };
                  function findHighestListElementThatStartsAtPosition(position) {
                      currentArray = undefined;
                      currentArrayIndex = -1;
                      current = undefined;
                      forEachChild(sourceFile, visitNode, visitArray);
                      return;
                      function visitNode(node) {
                          if (position >= node.pos && position < node.end) {
                              forEachChild(node, visitNode, visitArray);
                              return true;
                          }
                          return false;
                      }
                      function visitArray(array) {
                          if (position >= array.pos && position < array.end) {
                              for (var i = 0, n = array.length; i < n; i++) {
                                  var child = array[i];
                                  if (child) {
                                      if (child.pos === position) {
                                          currentArray = array;
                                          currentArrayIndex = i;
                                          current = child;
                                          return true;
                                      }
                                      else {
                                          if (child.pos < position && position < child.end) {
                                              forEachChild(child, visitNode, visitArray);
                                              return true;
                                          }
                                      }
                                  }
                              }
                          }
                          return false;
                      }
                  }
              }
          })(IncrementalParser || (IncrementalParser = {}));
      })(ts || (ts = {}));
      /// <reference path="binder.ts"/>
      var ts;
      (function (ts) {
          var nextSymbolId = 1;
          var nextNodeId = 1;
          var nextMergeId = 1;
          function getNodeId(node) {
              if (!node.id)
                  node.id = nextNodeId++;
              return node.id;
          }
          ts.getNodeId = getNodeId;
          ts.checkTime = 0;
          function getSymbolId(symbol) {
              if (!symbol.id) {
                  symbol.id = nextSymbolId++;
              }
              return symbol.id;
          }
          ts.getSymbolId = getSymbolId;
          function createTypeChecker(host, produceDiagnostics) {
              var Symbol = ts.objectAllocator.getSymbolConstructor();
              var Type = ts.objectAllocator.getTypeConstructor();
              var Signature = ts.objectAllocator.getSignatureConstructor();
              var typeCount = 0;
              var emptyArray = [];
              var emptySymbols = {};
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var emitResolver = createResolver();
              var undefinedSymbol = createSymbol(4 | 67108864, "undefined");
              var argumentsSymbol = createSymbol(4 | 67108864, "arguments");
              var checker = {
                  getNodeCount: function () { return ts.sum(host.getSourceFiles(), "nodeCount"); },
                  getIdentifierCount: function () { return ts.sum(host.getSourceFiles(), "identifierCount"); },
                  getSymbolCount: function () { return ts.sum(host.getSourceFiles(), "symbolCount"); },
                  getTypeCount: function () { return typeCount; },
                  isUndefinedSymbol: function (symbol) { return symbol === undefinedSymbol; },
                  isArgumentsSymbol: function (symbol) { return symbol === argumentsSymbol; },
                  getDiagnostics: getDiagnostics,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getTypeOfSymbolAtLocation: getTypeOfSymbolAtLocation,
                  getDeclaredTypeOfSymbol: getDeclaredTypeOfSymbol,
                  getPropertiesOfType: getPropertiesOfType,
                  getPropertyOfType: getPropertyOfType,
                  getSignaturesOfType: getSignaturesOfType,
                  getIndexTypeOfType: getIndexTypeOfType,
                  getReturnTypeOfSignature: getReturnTypeOfSignature,
                  getSymbolsInScope: getSymbolsInScope,
                  getSymbolAtLocation: getSymbolAtLocation,
                  getShorthandAssignmentValueSymbol: getShorthandAssignmentValueSymbol,
                  getTypeAtLocation: getTypeAtLocation,
                  typeToString: typeToString,
                  getSymbolDisplayBuilder: getSymbolDisplayBuilder,
                  symbolToString: symbolToString,
                  getAugmentedPropertiesOfType: getAugmentedPropertiesOfType,
                  getRootSymbols: getRootSymbols,
                  getContextualType: getContextualType,
                  getFullyQualifiedName: getFullyQualifiedName,
                  getResolvedSignature: getResolvedSignature,
                  getConstantValue: getConstantValue,
                  isValidPropertyAccess: isValidPropertyAccess,
                  getSignatureFromDeclaration: getSignatureFromDeclaration,
                  isImplementationOfOverload: isImplementationOfOverload,
                  getAliasedSymbol: resolveAlias,
                  getEmitResolver: getEmitResolver,
                  getExportsOfModule: getExportsOfModuleAsArray
              };
              var unknownSymbol = createSymbol(4 | 67108864, "unknown");
              var resolvingSymbol = createSymbol(67108864, "__resolving__");
              var anyType = createIntrinsicType(1, "any");
              var stringType = createIntrinsicType(2, "string");
              var numberType = createIntrinsicType(4, "number");
              var booleanType = createIntrinsicType(8, "boolean");
              var esSymbolType = createIntrinsicType(1048576, "symbol");
              var voidType = createIntrinsicType(16, "void");
              var undefinedType = createIntrinsicType(32 | 262144, "undefined");
              var nullType = createIntrinsicType(64 | 262144, "null");
              var unknownType = createIntrinsicType(1, "unknown");
              var emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var anyFunctionType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var noConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var anySignature = createSignature(undefined, undefined, emptyArray, anyType, 0, false, false);
              var unknownSignature = createSignature(undefined, undefined, emptyArray, unknownType, 0, false, false);
              var globals = {};
              var globalArraySymbol;
              var globalESSymbolConstructorSymbol;
              var globalObjectType;
              var globalFunctionType;
              var globalArrayType;
              var globalStringType;
              var globalNumberType;
              var globalBooleanType;
              var globalRegExpType;
              var globalTemplateStringsArrayType;
              var globalESSymbolType;
              var globalIterableType;
              var anyArrayType;
              var getGlobalClassDecoratorType;
              var getGlobalParameterDecoratorType;
              var getGlobalPropertyDecoratorType;
              var getGlobalMethodDecoratorType;
              var tupleTypes = {};
              var unionTypes = {};
              var stringLiteralTypes = {};
              var emitExtends = false;
              var emitDecorate = false;
              var emitParam = false;
              var resolutionTargets = [];
              var resolutionResults = [];
              var mergedSymbols = [];
              var symbolLinks = [];
              var nodeLinks = [];
              var potentialThisCollisions = [];
              var diagnostics = ts.createDiagnosticCollection();
              var primitiveTypeInfo = {
                  "string": {
                      type: stringType,
                      flags: 258
                  },
                  "number": {
                      type: numberType,
                      flags: 132
                  },
                  "boolean": {
                      type: booleanType,
                      flags: 8
                  },
                  "symbol": {
                      type: esSymbolType,
                      flags: 1048576
                  }
              };
              function getEmitResolver(sourceFile) {
                  getDiagnostics(sourceFile);
                  return emitResolver;
              }
              function error(location, message, arg0, arg1, arg2) {
                  var diagnostic = location
                      ? ts.createDiagnosticForNode(location, message, arg0, arg1, arg2)
                      : ts.createCompilerDiagnostic(message, arg0, arg1, arg2);
                  diagnostics.add(diagnostic);
              }
              function createSymbol(flags, name) {
                  return new Symbol(flags, name);
              }
              function getExcludedSymbolFlags(flags) {
                  var result = 0;
                  if (flags & 2)
                      result |= 107455;
                  if (flags & 1)
                      result |= 107454;
                  if (flags & 4)
                      result |= 107455;
                  if (flags & 8)
                      result |= 107455;
                  if (flags & 16)
                      result |= 106927;
                  if (flags & 32)
                      result |= 899583;
                  if (flags & 64)
                      result |= 792992;
                  if (flags & 256)
                      result |= 899327;
                  if (flags & 128)
                      result |= 899967;
                  if (flags & 512)
                      result |= 106639;
                  if (flags & 8192)
                      result |= 99263;
                  if (flags & 32768)
                      result |= 41919;
                  if (flags & 65536)
                      result |= 74687;
                  if (flags & 262144)
                      result |= 530912;
                  if (flags & 524288)
                      result |= 793056;
                  if (flags & 8388608)
                      result |= 8388608;
                  return result;
              }
              function recordMergedSymbol(target, source) {
                  if (!source.mergeId)
                      source.mergeId = nextMergeId++;
                  mergedSymbols[source.mergeId] = target;
              }
              function cloneSymbol(symbol) {
                  var result = createSymbol(symbol.flags | 33554432, symbol.name);
                  result.declarations = symbol.declarations.slice(0);
                  result.parent = symbol.parent;
                  if (symbol.valueDeclaration)
                      result.valueDeclaration = symbol.valueDeclaration;
                  if (symbol.constEnumOnlyModule)
                      result.constEnumOnlyModule = true;
                  if (symbol.members)
                      result.members = cloneSymbolTable(symbol.members);
                  if (symbol.exports)
                      result.exports = cloneSymbolTable(symbol.exports);
                  recordMergedSymbol(result, symbol);
                  return result;
              }
              function mergeSymbol(target, source) {
                  if (!(target.flags & getExcludedSymbolFlags(source.flags))) {
                      if (source.flags & 512 && target.flags & 512 && target.constEnumOnlyModule && !source.constEnumOnlyModule) {
                          target.constEnumOnlyModule = false;
                      }
                      target.flags |= source.flags;
                      if (!target.valueDeclaration && source.valueDeclaration)
                          target.valueDeclaration = source.valueDeclaration;
                      ts.forEach(source.declarations, function (node) {
                          target.declarations.push(node);
                      });
                      if (source.members) {
                          if (!target.members)
                              target.members = {};
                          mergeSymbolTable(target.members, source.members);
                      }
                      if (source.exports) {
                          if (!target.exports)
                              target.exports = {};
                          mergeSymbolTable(target.exports, source.exports);
                      }
                      recordMergedSymbol(target, source);
                  }
                  else {
                      var message = target.flags & 2 || source.flags & 2
                          ? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts.Diagnostics.Duplicate_identifier_0;
                      ts.forEach(source.declarations, function (node) {
                          error(node.name ? node.name : node, message, symbolToString(source));
                      });
                      ts.forEach(target.declarations, function (node) {
                          error(node.name ? node.name : node, message, symbolToString(source));
                      });
                  }
              }
              function cloneSymbolTable(symbolTable) {
                  var result = {};
                  for (var id in symbolTable) {
                      if (ts.hasProperty(symbolTable, id)) {
                          result[id] = symbolTable[id];
                      }
                  }
                  return result;
              }
              function mergeSymbolTable(target, source) {
                  for (var id in source) {
                      if (ts.hasProperty(source, id)) {
                          if (!ts.hasProperty(target, id)) {
                              target[id] = source[id];
                          }
                          else {
                              var symbol = target[id];
                              if (!(symbol.flags & 33554432)) {
                                  target[id] = symbol = cloneSymbol(symbol);
                              }
                              mergeSymbol(symbol, source[id]);
                          }
                      }
                  }
              }
              function getSymbolLinks(symbol) {
                  if (symbol.flags & 67108864)
                      return symbol;
                  var id = getSymbolId(symbol);
                  return symbolLinks[id] || (symbolLinks[id] = {});
              }
              function getNodeLinks(node) {
                  var nodeId = getNodeId(node);
                  return nodeLinks[nodeId] || (nodeLinks[nodeId] = {});
              }
              function getSourceFile(node) {
                  return ts.getAncestor(node, 228);
              }
              function isGlobalSourceFile(node) {
                  return node.kind === 228 && !ts.isExternalModule(node);
              }
              function getSymbol(symbols, name, meaning) {
                  if (meaning && ts.hasProperty(symbols, name)) {
                      var symbol = symbols[name];
                      ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
                      if (symbol.flags & meaning) {
                          return symbol;
                      }
                      if (symbol.flags & 8388608) {
                          var target = resolveAlias(symbol);
                          if (target === unknownSymbol || target.flags & meaning) {
                              return symbol;
                          }
                      }
                  }
              }
              function isDefinedBefore(node1, node2) {
                  var file1 = ts.getSourceFileOfNode(node1);
                  var file2 = ts.getSourceFileOfNode(node2);
                  if (file1 === file2) {
                      return node1.pos <= node2.pos;
                  }
                  if (!compilerOptions.out) {
                      return true;
                  }
                  var sourceFiles = host.getSourceFiles();
                  return sourceFiles.indexOf(file1) <= sourceFiles.indexOf(file2);
              }
              function resolveName(location, name, meaning, nameNotFoundMessage, nameArg) {
                  var result;
                  var lastLocation;
                  var propertyWithInvalidInitializer;
                  var errorLocation = location;
                  var grandparent;
                  loop: while (location) {
                      if (location.locals && !isGlobalSourceFile(location)) {
                          if (result = getSymbol(location.locals, name, meaning)) {
                              break loop;
                          }
                      }
                      switch (location.kind) {
                          case 228:
                              if (!ts.isExternalModule(location))
                                  break;
                          case 206:
                              if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8914931)) {
                                  if (result.flags & meaning || !(result.flags & 8388608 && getDeclarationOfAliasSymbol(result).kind === 218)) {
                                      break loop;
                                  }
                                  result = undefined;
                              }
                              else if (location.kind === 228 ||
                                  (location.kind === 206 && location.name.kind === 8)) {
                                  result = getSymbolOfNode(location).exports["default"];
                                  var localSymbol = ts.getLocalSymbolForExportDefault(result);
                                  if (result && localSymbol && (result.flags & meaning) && localSymbol.name === name) {
                                      break loop;
                                  }
                                  result = undefined;
                              }
                              break;
                          case 205:
                              if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8)) {
                                  break loop;
                              }
                              break;
                          case 133:
                          case 132:
                              if (location.parent.kind === 202 && !(location.flags & 128)) {
                                  var ctor = findConstructorDeclaration(location.parent);
                                  if (ctor && ctor.locals) {
                                      if (getSymbol(ctor.locals, name, meaning & 107455)) {
                                          propertyWithInvalidInitializer = location;
                                      }
                                  }
                              }
                              break;
                          case 202:
                          case 203:
                              if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & 793056)) {
                                  if (lastLocation && lastLocation.flags & 128) {
                                      error(errorLocation, ts.Diagnostics.Static_members_cannot_reference_class_type_parameters);
                                      return undefined;
                                  }
                                  break loop;
                              }
                              break;
                          case 128:
                              grandparent = location.parent.parent;
                              if (grandparent.kind === 202 || grandparent.kind === 203) {
                                  if (result = getSymbol(getSymbolOfNode(grandparent).members, name, meaning & 793056)) {
                                      error(errorLocation, ts.Diagnostics.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type);
                                      return undefined;
                                  }
                              }
                              break;
                          case 135:
                          case 134:
                          case 136:
                          case 137:
                          case 138:
                          case 201:
                          case 164:
                              if (name === "arguments") {
                                  result = argumentsSymbol;
                                  break loop;
                              }
                              break;
                          case 163:
                              if (name === "arguments") {
                                  result = argumentsSymbol;
                                  break loop;
                              }
                              var functionName = location.name;
                              if (functionName && name === functionName.text) {
                                  result = location.symbol;
                                  break loop;
                              }
                              break;
                          case 175:
                              var className = location.name;
                              if (className && name === className.text) {
                                  result = location.symbol;
                                  break loop;
                              }
                              break;
                          case 131:
                              if (location.parent && location.parent.kind === 130) {
                                  location = location.parent;
                              }
                              if (location.parent && ts.isClassElement(location.parent)) {
                                  location = location.parent;
                              }
                              break;
                      }
                      lastLocation = location;
                      location = location.parent;
                  }
                  if (!result) {
                      result = getSymbol(globals, name, meaning);
                  }
                  if (!result) {
                      if (nameNotFoundMessage) {
                          error(errorLocation, nameNotFoundMessage, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
                      }
                      return undefined;
                  }
                  if (nameNotFoundMessage) {
                      if (propertyWithInvalidInitializer) {
                          var propertyName = propertyWithInvalidInitializer.name;
                          error(errorLocation, ts.Diagnostics.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, ts.declarationNameToString(propertyName), typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
                          return undefined;
                      }
                      if (result.flags & 2) {
                          checkResolvedBlockScopedVariable(result, errorLocation);
                      }
                  }
                  return result;
              }
              function checkResolvedBlockScopedVariable(result, errorLocation) {
                  ts.Debug.assert((result.flags & 2) !== 0);
                  var declaration = ts.forEach(result.declarations, function (d) { return ts.isBlockOrCatchScoped(d) ? d : undefined; });
                  ts.Debug.assert(declaration !== undefined, "Block-scoped variable declaration is undefined");
                  var isUsedBeforeDeclaration = !isDefinedBefore(declaration, errorLocation);
                  if (!isUsedBeforeDeclaration) {
                      var variableDeclaration = ts.getAncestor(declaration, 199);
                      var container = ts.getEnclosingBlockScopeContainer(variableDeclaration);
                      if (variableDeclaration.parent.parent.kind === 181 ||
                          variableDeclaration.parent.parent.kind === 187) {
                          isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, variableDeclaration, container);
                      }
                      else if (variableDeclaration.parent.parent.kind === 189 ||
                          variableDeclaration.parent.parent.kind === 188) {
                          var expression = variableDeclaration.parent.parent.expression;
                          isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, expression, container);
                      }
                  }
                  if (isUsedBeforeDeclaration) {
                      error(errorLocation, ts.Diagnostics.Block_scoped_variable_0_used_before_its_declaration, ts.declarationNameToString(declaration.name));
                  }
              }
              function isSameScopeDescendentOf(initial, parent, stopAt) {
                  if (!parent) {
                      return false;
                  }
                  for (var current = initial; current && current !== stopAt && !ts.isFunctionLike(current); current = current.parent) {
                      if (current === parent) {
                          return true;
                      }
                  }
                  return false;
              }
              function getAnyImportSyntax(node) {
                  if (ts.isAliasSymbolDeclaration(node)) {
                      if (node.kind === 209) {
                          return node;
                      }
                      while (node && node.kind !== 210) {
                          node = node.parent;
                      }
                      return node;
                  }
              }
              function getDeclarationOfAliasSymbol(symbol) {
                  return ts.forEach(symbol.declarations, function (d) { return ts.isAliasSymbolDeclaration(d) ? d : undefined; });
              }
              function getTargetOfImportEqualsDeclaration(node) {
                  if (node.moduleReference.kind === 220) {
                      return resolveExternalModuleSymbol(resolveExternalModuleName(node, ts.getExternalModuleImportEqualsDeclarationExpression(node)));
                  }
                  return getSymbolOfPartOfRightHandSideOfImportEquals(node.moduleReference, node);
              }
              function getTargetOfImportClause(node) {
                  var moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
                  if (moduleSymbol) {
                      var exportDefaultSymbol = resolveSymbol(moduleSymbol.exports["default"]);
                      if (!exportDefaultSymbol) {
                          error(node.name, ts.Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
                      }
                      return exportDefaultSymbol;
                  }
              }
              function getTargetOfNamespaceImport(node) {
                  var moduleSpecifier = node.parent.parent.moduleSpecifier;
                  return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier);
              }
              function getMemberOfModuleVariable(moduleSymbol, name) {
                  if (moduleSymbol.flags & 3) {
                      var typeAnnotation = moduleSymbol.valueDeclaration.type;
                      if (typeAnnotation) {
                          return getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name);
                      }
                  }
              }
              function combineValueAndTypeSymbols(valueSymbol, typeSymbol) {
                  if (valueSymbol.flags & (793056 | 1536)) {
                      return valueSymbol;
                  }
                  var result = createSymbol(valueSymbol.flags | typeSymbol.flags, valueSymbol.name);
                  result.declarations = ts.concatenate(valueSymbol.declarations, typeSymbol.declarations);
                  result.parent = valueSymbol.parent || typeSymbol.parent;
                  if (valueSymbol.valueDeclaration)
                      result.valueDeclaration = valueSymbol.valueDeclaration;
                  if (typeSymbol.members)
                      result.members = typeSymbol.members;
                  if (valueSymbol.exports)
                      result.exports = valueSymbol.exports;
                  return result;
              }
              function getExportOfModule(symbol, name) {
                  if (symbol.flags & 1536) {
                      var exports = getExportsOfSymbol(symbol);
                      if (ts.hasProperty(exports, name)) {
                          return resolveSymbol(exports[name]);
                      }
                  }
              }
              function getPropertyOfVariable(symbol, name) {
                  if (symbol.flags & 3) {
                      var typeAnnotation = symbol.valueDeclaration.type;
                      if (typeAnnotation) {
                          return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
                      }
                  }
              }
              function getExternalModuleMember(node, specifier) {
                  var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
                  var targetSymbol = resolveESModuleSymbol(moduleSymbol, node.moduleSpecifier);
                  if (targetSymbol) {
                      var name_4 = specifier.propertyName || specifier.name;
                      if (name_4.text) {
                          var symbolFromModule = getExportOfModule(targetSymbol, name_4.text);
                          var symbolFromVariable = getPropertyOfVariable(targetSymbol, name_4.text);
                          var symbol = symbolFromModule && symbolFromVariable ?
                              combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) :
                              symbolFromModule || symbolFromVariable;
                          if (!symbol) {
                              error(name_4, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(moduleSymbol), ts.declarationNameToString(name_4));
                          }
                          return symbol;
                      }
                  }
              }
              function getTargetOfImportSpecifier(node) {
                  return getExternalModuleMember(node.parent.parent.parent, node);
              }
              function getTargetOfExportSpecifier(node) {
                  return node.parent.parent.moduleSpecifier ?
                      getExternalModuleMember(node.parent.parent, node) :
                      resolveEntityName(node.propertyName || node.name, 107455 | 793056 | 1536);
              }
              function getTargetOfExportAssignment(node) {
                  return resolveEntityName(node.expression, 107455 | 793056 | 1536);
              }
              function getTargetOfAliasDeclaration(node) {
                  switch (node.kind) {
                      case 209:
                          return getTargetOfImportEqualsDeclaration(node);
                      case 211:
                          return getTargetOfImportClause(node);
                      case 212:
                          return getTargetOfNamespaceImport(node);
                      case 214:
                          return getTargetOfImportSpecifier(node);
                      case 218:
                          return getTargetOfExportSpecifier(node);
                      case 215:
                          return getTargetOfExportAssignment(node);
                  }
              }
              function resolveSymbol(symbol) {
                  return symbol && symbol.flags & 8388608 && !(symbol.flags & (107455 | 793056 | 1536)) ? resolveAlias(symbol) : symbol;
              }
              function resolveAlias(symbol) {
                  ts.Debug.assert((symbol.flags & 8388608) !== 0, "Should only get Alias here.");
                  var links = getSymbolLinks(symbol);
                  if (!links.target) {
                      links.target = resolvingSymbol;
                      var node = getDeclarationOfAliasSymbol(symbol);
                      var target = getTargetOfAliasDeclaration(node);
                      if (links.target === resolvingSymbol) {
                          links.target = target || unknownSymbol;
                      }
                      else {
                          error(node, ts.Diagnostics.Circular_definition_of_import_alias_0, symbolToString(symbol));
                      }
                  }
                  else if (links.target === resolvingSymbol) {
                      links.target = unknownSymbol;
                  }
                  return links.target;
              }
              function markExportAsReferenced(node) {
                  var symbol = getSymbolOfNode(node);
                  var target = resolveAlias(symbol);
                  if (target) {
                      var markAlias = (target === unknownSymbol && compilerOptions.separateCompilation) ||
                          (target !== unknownSymbol && (target.flags & 107455) && !isConstEnumOrConstEnumOnlyModule(target));
                      if (markAlias) {
                          markAliasSymbolAsReferenced(symbol);
                      }
                  }
              }
              function markAliasSymbolAsReferenced(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.referenced) {
                      links.referenced = true;
                      var node = getDeclarationOfAliasSymbol(symbol);
                      if (node.kind === 215) {
                          checkExpressionCached(node.expression);
                      }
                      else if (node.kind === 218) {
                          checkExpressionCached(node.propertyName || node.name);
                      }
                      else if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                          checkExpressionCached(node.moduleReference);
                      }
                  }
              }
              function getSymbolOfPartOfRightHandSideOfImportEquals(entityName, importDeclaration) {
                  if (!importDeclaration) {
                      importDeclaration = ts.getAncestor(entityName, 209);
                      ts.Debug.assert(importDeclaration !== undefined);
                  }
                  if (entityName.kind === 65 && ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
                      entityName = entityName.parent;
                  }
                  if (entityName.kind === 65 || entityName.parent.kind === 127) {
                      return resolveEntityName(entityName, 1536);
                  }
                  else {
                      ts.Debug.assert(entityName.parent.kind === 209);
                      return resolveEntityName(entityName, 107455 | 793056 | 1536);
                  }
              }
              function getFullyQualifiedName(symbol) {
                  return symbol.parent ? getFullyQualifiedName(symbol.parent) + "." + symbolToString(symbol) : symbolToString(symbol);
              }
              function resolveEntityName(name, meaning) {
                  if (ts.nodeIsMissing(name)) {
                      return undefined;
                  }
                  var symbol;
                  if (name.kind === 65) {
                      var message = meaning === 1536 ? ts.Diagnostics.Cannot_find_namespace_0 : ts.Diagnostics.Cannot_find_name_0;
                      symbol = resolveName(name, name.text, meaning, message, name);
                      if (!symbol) {
                          return undefined;
                      }
                  }
                  else if (name.kind === 127 || name.kind === 156) {
                      var left = name.kind === 127 ? name.left : name.expression;
                      var right = name.kind === 127 ? name.right : name.name;
                      var namespace = resolveEntityName(left, 1536);
                      if (!namespace || namespace === unknownSymbol || ts.nodeIsMissing(right)) {
                          return undefined;
                      }
                      symbol = getSymbol(getExportsOfSymbol(namespace), right.text, meaning);
                      if (!symbol) {
                          error(right, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(namespace), ts.declarationNameToString(right));
                          return undefined;
                      }
                  }
                  else {
                      ts.Debug.fail("Unknown entity name kind.");
                  }
                  ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
                  return symbol.flags & meaning ? symbol : resolveAlias(symbol);
              }
              function isExternalModuleNameRelative(moduleName) {
                  return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\";
              }
              function resolveExternalModuleName(location, moduleReferenceExpression) {
                  if (moduleReferenceExpression.kind !== 8) {
                      return;
                  }
                  var moduleReferenceLiteral = moduleReferenceExpression;
                  var searchPath = ts.getDirectoryPath(getSourceFile(location).fileName);
                  var moduleName = ts.escapeIdentifier(moduleReferenceLiteral.text);
                  if (!moduleName)
                      return;
                  var isRelative = isExternalModuleNameRelative(moduleName);
                  if (!isRelative) {
                      var symbol = getSymbol(globals, '"' + moduleName + '"', 512);
                      if (symbol) {
                          return symbol;
                      }
                  }
                  var fileName;
                  var sourceFile;
                  while (true) {
                      fileName = ts.normalizePath(ts.combinePaths(searchPath, moduleName));
                      sourceFile = ts.forEach(ts.supportedExtensions, function (extension) { return host.getSourceFile(fileName + extension); });
                      if (sourceFile || isRelative) {
                          break;
                      }
                      var parentPath = ts.getDirectoryPath(searchPath);
                      if (parentPath === searchPath) {
                          break;
                      }
                      searchPath = parentPath;
                  }
                  if (sourceFile) {
                      if (sourceFile.symbol) {
                          return sourceFile.symbol;
                      }
                      error(moduleReferenceLiteral, ts.Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
                      return;
                  }
                  error(moduleReferenceLiteral, ts.Diagnostics.Cannot_find_module_0, moduleName);
              }
              function resolveExternalModuleSymbol(moduleSymbol) {
                  return moduleSymbol && resolveSymbol(moduleSymbol.exports["export="]) || moduleSymbol;
              }
              function resolveESModuleSymbol(moduleSymbol, moduleReferenceExpression) {
                  var symbol = resolveExternalModuleSymbol(moduleSymbol);
                  if (symbol && !(symbol.flags & (1536 | 3))) {
                      error(moduleReferenceExpression, ts.Diagnostics.Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct, symbolToString(moduleSymbol));
                      symbol = undefined;
                  }
                  return symbol;
              }
              function getExportAssignmentSymbol(moduleSymbol) {
                  return moduleSymbol.exports["export="];
              }
              function getExportsOfModuleAsArray(moduleSymbol) {
                  return symbolsToArray(getExportsOfModule(moduleSymbol));
              }
              function getExportsOfSymbol(symbol) {
                  return symbol.flags & 1536 ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
              }
              function getExportsOfModule(moduleSymbol) {
                  var links = getSymbolLinks(moduleSymbol);
                  return links.resolvedExports || (links.resolvedExports = getExportsForModule(moduleSymbol));
              }
              function extendExportSymbols(target, source) {
                  for (var id in source) {
                      if (id !== "default" && !ts.hasProperty(target, id)) {
                          target[id] = source[id];
                      }
                  }
              }
              function getExportsForModule(moduleSymbol) {
                  var result;
                  var visitedSymbols = [];
                  visit(moduleSymbol);
                  return result || moduleSymbol.exports;
                  function visit(symbol) {
                      if (symbol && symbol.flags & 1952 && !ts.contains(visitedSymbols, symbol)) {
                          visitedSymbols.push(symbol);
                          if (symbol !== moduleSymbol) {
                              if (!result) {
                                  result = cloneSymbolTable(moduleSymbol.exports);
                              }
                              extendExportSymbols(result, symbol.exports);
                          }
                          var exportStars = symbol.exports["__export"];
                          if (exportStars) {
                              for (var _i = 0, _a = exportStars.declarations; _i < _a.length; _i++) {
                                  var node = _a[_i];
                                  visit(resolveExternalModuleName(node, node.moduleSpecifier));
                              }
                          }
                      }
                  }
              }
              function getMergedSymbol(symbol) {
                  var merged;
                  return symbol && symbol.mergeId && (merged = mergedSymbols[symbol.mergeId]) ? merged : symbol;
              }
              function getSymbolOfNode(node) {
                  return getMergedSymbol(node.symbol);
              }
              function getParentOfSymbol(symbol) {
                  return getMergedSymbol(symbol.parent);
              }
              function getExportSymbolOfValueSymbolIfExported(symbol) {
                  return symbol && (symbol.flags & 1048576) !== 0
                      ? getMergedSymbol(symbol.exportSymbol)
                      : symbol;
              }
              function symbolIsValue(symbol) {
                  if (symbol.flags & 16777216) {
                      return symbolIsValue(getSymbolLinks(symbol).target);
                  }
                  if (symbol.flags & 107455) {
                      return true;
                  }
                  if (symbol.flags & 8388608) {
                      return (resolveAlias(symbol).flags & 107455) !== 0;
                  }
                  return false;
              }
              function findConstructorDeclaration(node) {
                  var members = node.members;
                  for (var _i = 0; _i < members.length; _i++) {
                      var member = members[_i];
                      if (member.kind === 136 && ts.nodeIsPresent(member.body)) {
                          return member;
                      }
                  }
              }
              function createType(flags) {
                  var result = new Type(checker, flags);
                  result.id = typeCount++;
                  return result;
              }
              function createIntrinsicType(kind, intrinsicName) {
                  var type = createType(kind);
                  type.intrinsicName = intrinsicName;
                  return type;
              }
              function createObjectType(kind, symbol) {
                  var type = createType(kind);
                  type.symbol = symbol;
                  return type;
              }
              function isReservedMemberName(name) {
                  return name.charCodeAt(0) === 95 &&
                      name.charCodeAt(1) === 95 &&
                      name.charCodeAt(2) !== 95 &&
                      name.charCodeAt(2) !== 64;
              }
              function getNamedMembers(members) {
                  var result;
                  for (var id in members) {
                      if (ts.hasProperty(members, id)) {
                          if (!isReservedMemberName(id)) {
                              if (!result)
                                  result = [];
                              var symbol = members[id];
                              if (symbolIsValue(symbol)) {
                                  result.push(symbol);
                              }
                          }
                      }
                  }
                  return result || emptyArray;
              }
              function setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
                  type.members = members;
                  type.properties = getNamedMembers(members);
                  type.callSignatures = callSignatures;
                  type.constructSignatures = constructSignatures;
                  if (stringIndexType)
                      type.stringIndexType = stringIndexType;
                  if (numberIndexType)
                      type.numberIndexType = numberIndexType;
                  return type;
              }
              function createAnonymousType(symbol, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
                  return setObjectTypeMembers(createObjectType(32768, symbol), members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function forEachSymbolTableInScope(enclosingDeclaration, callback) {
                  var result;
                  for (var location_1 = enclosingDeclaration; location_1; location_1 = location_1.parent) {
                      if (location_1.locals && !isGlobalSourceFile(location_1)) {
                          if (result = callback(location_1.locals)) {
                              return result;
                          }
                      }
                      switch (location_1.kind) {
                          case 228:
                              if (!ts.isExternalModule(location_1)) {
                                  break;
                              }
                          case 206:
                              if (result = callback(getSymbolOfNode(location_1).exports)) {
                                  return result;
                              }
                              break;
                          case 202:
                          case 203:
                              if (result = callback(getSymbolOfNode(location_1).members)) {
                                  return result;
                              }
                              break;
                      }
                  }
                  return callback(globals);
              }
              function getQualifiedLeftMeaning(rightMeaning) {
                  return rightMeaning === 107455 ? 107455 : 1536;
              }
              function getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, useOnlyExternalAliasing) {
                  function getAccessibleSymbolChainFromSymbolTable(symbols) {
                      function canQualifySymbol(symbolFromSymbolTable, meaning) {
                          if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
                              return true;
                          }
                          var accessibleParent = getAccessibleSymbolChain(symbolFromSymbolTable.parent, enclosingDeclaration, getQualifiedLeftMeaning(meaning), useOnlyExternalAliasing);
                          return !!accessibleParent;
                      }
                      function isAccessible(symbolFromSymbolTable, resolvedAliasSymbol) {
                          if (symbol === (resolvedAliasSymbol || symbolFromSymbolTable)) {
                              return !ts.forEach(symbolFromSymbolTable.declarations, hasExternalModuleSymbol) &&
                                  canQualifySymbol(symbolFromSymbolTable, meaning);
                          }
                      }
                      if (isAccessible(ts.lookUp(symbols, symbol.name))) {
                          return [symbol];
                      }
                      return ts.forEachValue(symbols, function (symbolFromSymbolTable) {
                          if (symbolFromSymbolTable.flags & 8388608 && symbolFromSymbolTable.name !== "export=") {
                              if (!useOnlyExternalAliasing ||
                                  ts.forEach(symbolFromSymbolTable.declarations, ts.isExternalModuleImportEqualsDeclaration)) {
                                  var resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
                                  if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
                                      return [symbolFromSymbolTable];
                                  }
                                  var accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTable(resolvedImportedSymbol.exports) : undefined;
                                  if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
                                      return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
                                  }
                              }
                          }
                      });
                  }
                  if (symbol) {
                      return forEachSymbolTableInScope(enclosingDeclaration, getAccessibleSymbolChainFromSymbolTable);
                  }
              }
              function needsQualification(symbol, enclosingDeclaration, meaning) {
                  var qualify = false;
                  forEachSymbolTableInScope(enclosingDeclaration, function (symbolTable) {
                      if (!ts.hasProperty(symbolTable, symbol.name)) {
                          return false;
                      }
                      var symbolFromSymbolTable = symbolTable[symbol.name];
                      if (symbolFromSymbolTable === symbol) {
                          return true;
                      }
                      symbolFromSymbolTable = (symbolFromSymbolTable.flags & 8388608) ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
                      if (symbolFromSymbolTable.flags & meaning) {
                          qualify = true;
                          return true;
                      }
                      return false;
                  });
                  return qualify;
              }
              function isSymbolAccessible(symbol, enclosingDeclaration, meaning) {
                  if (symbol && enclosingDeclaration && !(symbol.flags & 262144)) {
                      var initialSymbol = symbol;
                      var meaningToLook = meaning;
                      while (symbol) {
                          var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaningToLook, false);
                          if (accessibleSymbolChain) {
                              var hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0]);
                              if (!hasAccessibleDeclarations) {
                                  return {
                                      accessibility: 1,
                                      errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
                                      errorModuleName: symbol !== initialSymbol ? symbolToString(symbol, enclosingDeclaration, 1536) : undefined
                                  };
                              }
                              return hasAccessibleDeclarations;
                          }
                          meaningToLook = getQualifiedLeftMeaning(meaning);
                          symbol = getParentOfSymbol(symbol);
                      }
                      var symbolExternalModule = ts.forEach(initialSymbol.declarations, getExternalModuleContainer);
                      if (symbolExternalModule) {
                          var enclosingExternalModule = getExternalModuleContainer(enclosingDeclaration);
                          if (symbolExternalModule !== enclosingExternalModule) {
                              return {
                                  accessibility: 2,
                                  errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
                                  errorModuleName: symbolToString(symbolExternalModule)
                              };
                          }
                      }
                      return {
                          accessibility: 1,
                          errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning)
                      };
                  }
                  return { accessibility: 0 };
                  function getExternalModuleContainer(declaration) {
                      for (; declaration; declaration = declaration.parent) {
                          if (hasExternalModuleSymbol(declaration)) {
                              return getSymbolOfNode(declaration);
                          }
                      }
                  }
              }
              function hasExternalModuleSymbol(declaration) {
                  return (declaration.kind === 206 && declaration.name.kind === 8) ||
                      (declaration.kind === 228 && ts.isExternalModule(declaration));
              }
              function hasVisibleDeclarations(symbol) {
                  var aliasesToMakeVisible;
                  if (ts.forEach(symbol.declarations, function (declaration) { return !getIsDeclarationVisible(declaration); })) {
                      return undefined;
                  }
                  return { accessibility: 0, aliasesToMakeVisible: aliasesToMakeVisible };
                  function getIsDeclarationVisible(declaration) {
                      if (!isDeclarationVisible(declaration)) {
                          var anyImportSyntax = getAnyImportSyntax(declaration);
                          if (anyImportSyntax &&
                              !(anyImportSyntax.flags & 1) &&
                              isDeclarationVisible(anyImportSyntax.parent)) {
                              getNodeLinks(declaration).isVisible = true;
                              if (aliasesToMakeVisible) {
                                  if (!ts.contains(aliasesToMakeVisible, anyImportSyntax)) {
                                      aliasesToMakeVisible.push(anyImportSyntax);
                                  }
                              }
                              else {
                                  aliasesToMakeVisible = [anyImportSyntax];
                              }
                              return true;
                          }
                          return false;
                      }
                      return true;
                  }
              }
              function isEntityNameVisible(entityName, enclosingDeclaration) {
                  var meaning;
                  if (entityName.parent.kind === 145) {
                      meaning = 107455 | 1048576;
                  }
                  else if (entityName.kind === 127 || entityName.kind === 156 ||
                      entityName.parent.kind === 209) {
                      meaning = 1536;
                  }
                  else {
                      meaning = 793056;
                  }
                  var firstIdentifier = getFirstIdentifier(entityName);
                  var symbol = resolveName(enclosingDeclaration, firstIdentifier.text, meaning, undefined, undefined);
                  return (symbol && hasVisibleDeclarations(symbol)) || {
                      accessibility: 1,
                      errorSymbolName: ts.getTextOfNode(firstIdentifier),
                      errorNode: firstIdentifier
                  };
              }
              function writeKeyword(writer, kind) {
                  writer.writeKeyword(ts.tokenToString(kind));
              }
              function writePunctuation(writer, kind) {
                  writer.writePunctuation(ts.tokenToString(kind));
              }
              function writeSpace(writer) {
                  writer.writeSpace(" ");
              }
              function symbolToString(symbol, enclosingDeclaration, meaning) {
                  var writer = ts.getSingleLineStringWriter();
                  getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
                  var result = writer.string();
                  ts.releaseStringWriter(writer);
                  return result;
              }
              function typeToString(type, enclosingDeclaration, flags) {
                  var writer = ts.getSingleLineStringWriter();
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
                  var result = writer.string();
                  ts.releaseStringWriter(writer);
                  var maxLength = compilerOptions.noErrorTruncation || flags & 4 ? undefined : 100;
                  if (maxLength && result.length >= maxLength) {
                      result = result.substr(0, maxLength - "...".length) + "...";
                  }
                  return result;
              }
              function getTypeAliasForTypeLiteral(type) {
                  if (type.symbol && type.symbol.flags & 2048) {
                      var node = type.symbol.declarations[0].parent;
                      while (node.kind === 150) {
                          node = node.parent;
                      }
                      if (node.kind === 204) {
                          return getSymbolOfNode(node);
                      }
                  }
                  return undefined;
              }
              var _displayBuilder;
              function getSymbolDisplayBuilder() {
                  function appendSymbolNameOnly(symbol, writer) {
                      if (symbol.declarations && symbol.declarations.length > 0) {
                          var declaration = symbol.declarations[0];
                          if (declaration.name) {
                              writer.writeSymbol(ts.declarationNameToString(declaration.name), symbol);
                              return;
                          }
                      }
                      writer.writeSymbol(symbol.name, symbol);
                  }
                  function buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning, flags, typeFlags) {
                      var parentSymbol;
                      function appendParentTypeArgumentsAndSymbolName(symbol) {
                          if (parentSymbol) {
                              if (flags & 1) {
                                  if (symbol.flags & 16777216) {
                                      buildDisplayForTypeArgumentsAndDelimiters(getTypeParametersOfClassOrInterface(parentSymbol), symbol.mapper, writer, enclosingDeclaration);
                                  }
                                  else {
                                      buildTypeParameterDisplayFromSymbol(parentSymbol, writer, enclosingDeclaration);
                                  }
                              }
                              writePunctuation(writer, 20);
                          }
                          parentSymbol = symbol;
                          appendSymbolNameOnly(symbol, writer);
                      }
                      writer.trackSymbol(symbol, enclosingDeclaration, meaning);
                      function walkSymbol(symbol, meaning) {
                          if (symbol) {
                              var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, !!(flags & 2));
                              if (!accessibleSymbolChain ||
                                  needsQualification(accessibleSymbolChain[0], enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning : getQualifiedLeftMeaning(meaning))) {
                                  walkSymbol(getParentOfSymbol(accessibleSymbolChain ? accessibleSymbolChain[0] : symbol), getQualifiedLeftMeaning(meaning));
                              }
                              if (accessibleSymbolChain) {
                                  for (var _i = 0; _i < accessibleSymbolChain.length; _i++) {
                                      var accessibleSymbol = accessibleSymbolChain[_i];
                                      appendParentTypeArgumentsAndSymbolName(accessibleSymbol);
                                  }
                              }
                              else {
                                  if (!parentSymbol && ts.forEach(symbol.declarations, hasExternalModuleSymbol)) {
                                      return;
                                  }
                                  if (symbol.flags & 2048 || symbol.flags & 4096) {
                                      return;
                                  }
                                  appendParentTypeArgumentsAndSymbolName(symbol);
                              }
                          }
                      }
                      var isTypeParameter = symbol.flags & 262144;
                      var typeFormatFlag = 128 & typeFlags;
                      if (!isTypeParameter && (enclosingDeclaration || typeFormatFlag)) {
                          walkSymbol(symbol, meaning);
                          return;
                      }
                      return appendParentTypeArgumentsAndSymbolName(symbol);
                  }
                  function buildTypeDisplay(type, writer, enclosingDeclaration, globalFlags, typeStack) {
                      var globalFlagsToPass = globalFlags & 16;
                      return writeType(type, globalFlags);
                      function writeType(type, flags) {
                          if (type.flags & 1048703) {
                              writer.writeKeyword(!(globalFlags & 16) &&
                                  (type.flags & 1) ? "any" : type.intrinsicName);
                          }
                          else if (type.flags & 4096) {
                              writeTypeReference(type, flags);
                          }
                          else if (type.flags & (1024 | 2048 | 128 | 512)) {
                              buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 793056, 0, flags);
                          }
                          else if (type.flags & 8192) {
                              writeTupleType(type);
                          }
                          else if (type.flags & 16384) {
                              writeUnionType(type, flags);
                          }
                          else if (type.flags & 32768) {
                              writeAnonymousType(type, flags);
                          }
                          else if (type.flags & 256) {
                              writer.writeStringLiteral(type.text);
                          }
                          else {
                              writePunctuation(writer, 14);
                              writeSpace(writer);
                              writePunctuation(writer, 21);
                              writeSpace(writer);
                              writePunctuation(writer, 15);
                          }
                      }
                      function writeTypeList(types, union) {
                          for (var i = 0; i < types.length; i++) {
                              if (i > 0) {
                                  if (union) {
                                      writeSpace(writer);
                                  }
                                  writePunctuation(writer, union ? 44 : 23);
                                  writeSpace(writer);
                              }
                              writeType(types[i], union ? 64 : 0);
                          }
                      }
                      function writeTypeReference(type, flags) {
                          if (type.target === globalArrayType && !(flags & 1)) {
                              writeType(type.typeArguments[0], 64);
                              writePunctuation(writer, 18);
                              writePunctuation(writer, 19);
                          }
                          else {
                              buildSymbolDisplay(type.target.symbol, writer, enclosingDeclaration, 793056);
                              writePunctuation(writer, 24);
                              writeTypeList(type.typeArguments, false);
                              writePunctuation(writer, 25);
                          }
                      }
                      function writeTupleType(type) {
                          writePunctuation(writer, 18);
                          writeTypeList(type.elementTypes, false);
                          writePunctuation(writer, 19);
                      }
                      function writeUnionType(type, flags) {
                          if (flags & 64) {
                              writePunctuation(writer, 16);
                          }
                          writeTypeList(type.types, true);
                          if (flags & 64) {
                              writePunctuation(writer, 17);
                          }
                      }
                      function writeAnonymousType(type, flags) {
                          if (type.symbol && type.symbol.flags & (32 | 384 | 512)) {
                              writeTypeofSymbol(type, flags);
                          }
                          else if (shouldWriteTypeOfFunctionSymbol()) {
                              writeTypeofSymbol(type, flags);
                          }
                          else if (typeStack && ts.contains(typeStack, type)) {
                              var typeAlias = getTypeAliasForTypeLiteral(type);
                              if (typeAlias) {
                                  buildSymbolDisplay(typeAlias, writer, enclosingDeclaration, 793056, 0, flags);
                              }
                              else {
                                  writeKeyword(writer, 112);
                              }
                          }
                          else {
                              if (!typeStack) {
                                  typeStack = [];
                              }
                              typeStack.push(type);
                              writeLiteralType(type, flags);
                              typeStack.pop();
                          }
                          function shouldWriteTypeOfFunctionSymbol() {
                              if (type.symbol) {
                                  var isStaticMethodSymbol = !!(type.symbol.flags & 8192 &&
                                      ts.forEach(type.symbol.declarations, function (declaration) { return declaration.flags & 128; }));
                                  var isNonLocalFunctionSymbol = !!(type.symbol.flags & 16) &&
                                      (type.symbol.parent ||
                                          ts.forEach(type.symbol.declarations, function (declaration) {
                                              return declaration.parent.kind === 228 || declaration.parent.kind === 207;
                                          }));
                                  if (isStaticMethodSymbol || isNonLocalFunctionSymbol) {
                                      return !!(flags & 2) ||
                                          (typeStack && ts.contains(typeStack, type));
                                  }
                              }
                          }
                      }
                      function writeTypeofSymbol(type, typeFormatFlags) {
                          writeKeyword(writer, 97);
                          writeSpace(writer);
                          buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 107455, 0, typeFormatFlags);
                      }
                      function getIndexerParameterName(type, indexKind, fallbackName) {
                          var declaration = getIndexDeclarationOfSymbol(type.symbol, indexKind);
                          if (!declaration) {
                              return fallbackName;
                          }
                          ts.Debug.assert(declaration.parameters.length !== 0);
                          return ts.declarationNameToString(declaration.parameters[0].name);
                      }
                      function writeLiteralType(type, flags) {
                          var resolved = resolveObjectOrUnionTypeMembers(type);
                          if (!resolved.properties.length && !resolved.stringIndexType && !resolved.numberIndexType) {
                              if (!resolved.callSignatures.length && !resolved.constructSignatures.length) {
                                  writePunctuation(writer, 14);
                                  writePunctuation(writer, 15);
                                  return;
                              }
                              if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
                                  if (flags & 64) {
                                      writePunctuation(writer, 16);
                                  }
                                  buildSignatureDisplay(resolved.callSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
                                  if (flags & 64) {
                                      writePunctuation(writer, 17);
                                  }
                                  return;
                              }
                              if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
                                  if (flags & 64) {
                                      writePunctuation(writer, 16);
                                  }
                                  writeKeyword(writer, 88);
                                  writeSpace(writer);
                                  buildSignatureDisplay(resolved.constructSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
                                  if (flags & 64) {
                                      writePunctuation(writer, 17);
                                  }
                                  return;
                              }
                          }
                          writePunctuation(writer, 14);
                          writer.writeLine();
                          writer.increaseIndent();
                          for (var _i = 0, _a = resolved.callSignatures; _i < _a.length; _i++) {
                              var signature = _a[_i];
                              buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          for (var _b = 0, _c = resolved.constructSignatures; _b < _c.length; _b++) {
                              var signature = _c[_b];
                              writeKeyword(writer, 88);
                              writeSpace(writer);
                              buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          if (resolved.stringIndexType) {
                              writePunctuation(writer, 18);
                              writer.writeParameter(getIndexerParameterName(resolved, 0, "x"));
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeKeyword(writer, 122);
                              writePunctuation(writer, 19);
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeType(resolved.stringIndexType, 0);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          if (resolved.numberIndexType) {
                              writePunctuation(writer, 18);
                              writer.writeParameter(getIndexerParameterName(resolved, 1, "x"));
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeKeyword(writer, 120);
                              writePunctuation(writer, 19);
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeType(resolved.numberIndexType, 0);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          for (var _d = 0, _e = resolved.properties; _d < _e.length; _d++) {
                              var p = _e[_d];
                              var t = getTypeOfSymbol(p);
                              if (p.flags & (16 | 8192) && !getPropertiesOfObjectType(t).length) {
                                  var signatures = getSignaturesOfType(t, 0);
                                  for (var _f = 0; _f < signatures.length; _f++) {
                                      var signature = signatures[_f];
                                      buildSymbolDisplay(p, writer);
                                      if (p.flags & 536870912) {
                                          writePunctuation(writer, 50);
                                      }
                                      buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                                      writePunctuation(writer, 22);
                                      writer.writeLine();
                                  }
                              }
                              else {
                                  buildSymbolDisplay(p, writer);
                                  if (p.flags & 536870912) {
                                      writePunctuation(writer, 50);
                                  }
                                  writePunctuation(writer, 51);
                                  writeSpace(writer);
                                  writeType(t, 0);
                                  writePunctuation(writer, 22);
                                  writer.writeLine();
                              }
                          }
                          writer.decreaseIndent();
                          writePunctuation(writer, 15);
                      }
                  }
                  function buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaraiton, flags) {
                      var targetSymbol = getTargetSymbol(symbol);
                      if (targetSymbol.flags & 32 || targetSymbol.flags & 64) {
                          buildDisplayForTypeParametersAndDelimiters(getTypeParametersOfClassOrInterface(symbol), writer, enclosingDeclaraiton, flags);
                      }
                  }
                  function buildTypeParameterDisplay(tp, writer, enclosingDeclaration, flags, typeStack) {
                      appendSymbolNameOnly(tp.symbol, writer);
                      var constraint = getConstraintOfTypeParameter(tp);
                      if (constraint) {
                          writeSpace(writer);
                          writeKeyword(writer, 79);
                          writeSpace(writer);
                          buildTypeDisplay(constraint, writer, enclosingDeclaration, flags, typeStack);
                      }
                  }
                  function buildParameterDisplay(p, writer, enclosingDeclaration, flags, typeStack) {
                      if (ts.hasDotDotDotToken(p.valueDeclaration)) {
                          writePunctuation(writer, 21);
                      }
                      appendSymbolNameOnly(p, writer);
                      if (ts.hasQuestionToken(p.valueDeclaration) || p.valueDeclaration.initializer) {
                          writePunctuation(writer, 50);
                      }
                      writePunctuation(writer, 51);
                      writeSpace(writer);
                      buildTypeDisplay(getTypeOfSymbol(p), writer, enclosingDeclaration, flags, typeStack);
                  }
                  function buildDisplayForTypeParametersAndDelimiters(typeParameters, writer, enclosingDeclaration, flags, typeStack) {
                      if (typeParameters && typeParameters.length) {
                          writePunctuation(writer, 24);
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (i > 0) {
                                  writePunctuation(writer, 23);
                                  writeSpace(writer);
                              }
                              buildTypeParameterDisplay(typeParameters[i], writer, enclosingDeclaration, flags, typeStack);
                          }
                          writePunctuation(writer, 25);
                      }
                  }
                  function buildDisplayForTypeArgumentsAndDelimiters(typeParameters, mapper, writer, enclosingDeclaration, flags, typeStack) {
                      if (typeParameters && typeParameters.length) {
                          writePunctuation(writer, 24);
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (i > 0) {
                                  writePunctuation(writer, 23);
                                  writeSpace(writer);
                              }
                              buildTypeDisplay(mapper(typeParameters[i]), writer, enclosingDeclaration, 0);
                          }
                          writePunctuation(writer, 25);
                      }
                  }
                  function buildDisplayForParametersAndDelimiters(parameters, writer, enclosingDeclaration, flags, typeStack) {
                      writePunctuation(writer, 16);
                      for (var i = 0; i < parameters.length; i++) {
                          if (i > 0) {
                              writePunctuation(writer, 23);
                              writeSpace(writer);
                          }
                          buildParameterDisplay(parameters[i], writer, enclosingDeclaration, flags, typeStack);
                      }
                      writePunctuation(writer, 17);
                  }
                  function buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
                      if (flags & 8) {
                          writeSpace(writer);
                          writePunctuation(writer, 32);
                      }
                      else {
                          writePunctuation(writer, 51);
                      }
                      writeSpace(writer);
                      buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags, typeStack);
                  }
                  function buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
                      if (signature.target && (flags & 32)) {
                          buildDisplayForTypeArgumentsAndDelimiters(signature.target.typeParameters, signature.mapper, writer, enclosingDeclaration);
                      }
                      else {
                          buildDisplayForTypeParametersAndDelimiters(signature.typeParameters, writer, enclosingDeclaration, flags, typeStack);
                      }
                      buildDisplayForParametersAndDelimiters(signature.parameters, writer, enclosingDeclaration, flags, typeStack);
                      buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack);
                  }
                  return _displayBuilder || (_displayBuilder = {
                      symbolToString: symbolToString,
                      typeToString: typeToString,
                      buildSymbolDisplay: buildSymbolDisplay,
                      buildTypeDisplay: buildTypeDisplay,
                      buildTypeParameterDisplay: buildTypeParameterDisplay,
                      buildParameterDisplay: buildParameterDisplay,
                      buildDisplayForParametersAndDelimiters: buildDisplayForParametersAndDelimiters,
                      buildDisplayForTypeParametersAndDelimiters: buildDisplayForTypeParametersAndDelimiters,
                      buildDisplayForTypeArgumentsAndDelimiters: buildDisplayForTypeArgumentsAndDelimiters,
                      buildTypeParameterDisplayFromSymbol: buildTypeParameterDisplayFromSymbol,
                      buildSignatureDisplay: buildSignatureDisplay,
                      buildReturnTypeDisplay: buildReturnTypeDisplay
                  });
              }
              function isDeclarationVisible(node) {
                  function getContainingExternalModule(node) {
                      for (; node; node = node.parent) {
                          if (node.kind === 206) {
                              if (node.name.kind === 8) {
                                  return node;
                              }
                          }
                          else if (node.kind === 228) {
                              return ts.isExternalModule(node) ? node : undefined;
                          }
                      }
                      ts.Debug.fail("getContainingModule cant reach here");
                  }
                  function isUsedInExportAssignment(node) {
                      var externalModule = getContainingExternalModule(node);
                      var exportAssignmentSymbol;
                      var resolvedExportSymbol;
                      if (externalModule) {
                          var externalModuleSymbol = getSymbolOfNode(externalModule);
                          exportAssignmentSymbol = getExportAssignmentSymbol(externalModuleSymbol);
                          var symbolOfNode = getSymbolOfNode(node);
                          if (isSymbolUsedInExportAssignment(symbolOfNode)) {
                              return true;
                          }
                          if (symbolOfNode.flags & 8388608) {
                              return isSymbolUsedInExportAssignment(resolveAlias(symbolOfNode));
                          }
                      }
                      function isSymbolUsedInExportAssignment(symbol) {
                          if (exportAssignmentSymbol === symbol) {
                              return true;
                          }
                          if (exportAssignmentSymbol && !!(exportAssignmentSymbol.flags & 8388608)) {
                              resolvedExportSymbol = resolvedExportSymbol || resolveAlias(exportAssignmentSymbol);
                              if (resolvedExportSymbol === symbol) {
                                  return true;
                              }
                              return ts.forEach(resolvedExportSymbol.declarations, function (current) {
                                  while (current) {
                                      if (current === node) {
                                          return true;
                                      }
                                      current = current.parent;
                                  }
                              });
                          }
                      }
                  }
                  function determineIfDeclarationIsVisible() {
                      switch (node.kind) {
                          case 153:
                              return isDeclarationVisible(node.parent.parent);
                          case 199:
                              if (ts.isBindingPattern(node.name) &&
                                  !node.name.elements.length) {
                                  return false;
                              }
                          case 206:
                          case 202:
                          case 203:
                          case 204:
                          case 201:
                          case 205:
                          case 209:
                              var parent_2 = getDeclarationContainer(node);
                              if (!(ts.getCombinedNodeFlags(node) & 1) &&
                                  !(node.kind !== 209 && parent_2.kind !== 228 && ts.isInAmbientContext(parent_2))) {
                                  return isGlobalSourceFile(parent_2);
                              }
                              return isDeclarationVisible(parent_2);
                          case 133:
                          case 132:
                          case 137:
                          case 138:
                          case 135:
                          case 134:
                              if (node.flags & (32 | 64)) {
                                  return false;
                              }
                          case 136:
                          case 140:
                          case 139:
                          case 141:
                          case 130:
                          case 207:
                          case 143:
                          case 144:
                          case 146:
                          case 142:
                          case 147:
                          case 148:
                          case 149:
                          case 150:
                              return isDeclarationVisible(node.parent);
                          case 211:
                          case 212:
                          case 214:
                              return false;
                          case 129:
                          case 228:
                              return true;
                          case 215:
                              return false;
                          default:
                              ts.Debug.fail("isDeclarationVisible unknown: SyntaxKind: " + node.kind);
                      }
                  }
                  if (node) {
                      var links = getNodeLinks(node);
                      if (links.isVisible === undefined) {
                          links.isVisible = !!determineIfDeclarationIsVisible();
                      }
                      return links.isVisible;
                  }
              }
              function collectLinkedAliases(node) {
                  var exportSymbol;
                  if (node.parent && node.parent.kind === 215) {
                      exportSymbol = resolveName(node.parent, node.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, node);
                  }
                  else if (node.parent.kind === 218) {
                      exportSymbol = getTargetOfExportSpecifier(node.parent);
                  }
                  var result = [];
                  if (exportSymbol) {
                      buildVisibleNodeList(exportSymbol.declarations);
                  }
                  return result;
                  function buildVisibleNodeList(declarations) {
                      ts.forEach(declarations, function (declaration) {
                          getNodeLinks(declaration).isVisible = true;
                          var resultNode = getAnyImportSyntax(declaration) || declaration;
                          if (!ts.contains(result, resultNode)) {
                              result.push(resultNode);
                          }
                          if (ts.isInternalModuleImportEqualsDeclaration(declaration)) {
                              var internalModuleReference = declaration.moduleReference;
                              var firstIdentifier = getFirstIdentifier(internalModuleReference);
                              var importSymbol = resolveName(declaration, firstIdentifier.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, firstIdentifier);
                              buildVisibleNodeList(importSymbol.declarations);
                          }
                      });
                  }
              }
              function pushTypeResolution(target) {
                  var i = 0;
                  var count = resolutionTargets.length;
                  while (i < count && resolutionTargets[i] !== target) {
                      i++;
                  }
                  if (i < count) {
                      do {
                          resolutionResults[i++] = false;
                      } while (i < count);
                      return false;
                  }
                  resolutionTargets.push(target);
                  resolutionResults.push(true);
                  return true;
              }
              function popTypeResolution() {
                  resolutionTargets.pop();
                  return resolutionResults.pop();
              }
              function getDeclarationContainer(node) {
                  node = ts.getRootDeclaration(node);
                  return node.kind === 199 ? node.parent.parent.parent : node.parent;
              }
              function getTypeOfPrototypeProperty(prototype) {
                  var classType = getDeclaredTypeOfSymbol(prototype.parent);
                  return classType.typeParameters ? createTypeReference(classType, ts.map(classType.typeParameters, function (_) { return anyType; })) : classType;
              }
              function getTypeOfPropertyOfType(type, name) {
                  var prop = getPropertyOfType(type, name);
                  return prop ? getTypeOfSymbol(prop) : undefined;
              }
              function getTypeForBindingElement(declaration) {
                  var pattern = declaration.parent;
                  var parentType = getTypeForVariableLikeDeclaration(pattern.parent);
                  if (parentType === unknownType) {
                      return unknownType;
                  }
                  if (!parentType || parentType === anyType) {
                      if (declaration.initializer) {
                          return checkExpressionCached(declaration.initializer);
                      }
                      return parentType;
                  }
                  var type;
                  if (pattern.kind === 151) {
                      var name_5 = declaration.propertyName || declaration.name;
                      type = getTypeOfPropertyOfType(parentType, name_5.text) ||
                          isNumericLiteralName(name_5.text) && getIndexTypeOfType(parentType, 1) ||
                          getIndexTypeOfType(parentType, 0);
                      if (!type) {
                          error(name_5, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), ts.declarationNameToString(name_5));
                          return unknownType;
                      }
                  }
                  else {
                      var elementType = checkIteratedTypeOrElementType(parentType, pattern, false);
                      if (!declaration.dotDotDotToken) {
                          if (elementType.flags & 1) {
                              return elementType;
                          }
                          var propName = "" + ts.indexOf(pattern.elements, declaration);
                          type = isTupleLikeType(parentType)
                              ? getTypeOfPropertyOfType(parentType, propName)
                              : elementType;
                          if (!type) {
                              if (isTupleType(parentType)) {
                                  error(declaration, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), parentType.elementTypes.length, pattern.elements.length);
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Type_0_has_no_property_1, typeToString(parentType), propName);
                              }
                              return unknownType;
                          }
                      }
                      else {
                          type = createArrayType(elementType);
                      }
                  }
                  return type;
              }
              function getTypeForVariableLikeDeclaration(declaration) {
                  if (declaration.parent.parent.kind === 188) {
                      return anyType;
                  }
                  if (declaration.parent.parent.kind === 189) {
                      return checkRightHandSideOfForOf(declaration.parent.parent.expression) || anyType;
                  }
                  if (ts.isBindingPattern(declaration.parent)) {
                      return getTypeForBindingElement(declaration);
                  }
                  if (declaration.type) {
                      return getTypeFromTypeNode(declaration.type);
                  }
                  if (declaration.kind === 130) {
                      var func = declaration.parent;
                      if (func.kind === 138 && !ts.hasDynamicName(func)) {
                          var getter = ts.getDeclarationOfKind(declaration.parent.symbol, 137);
                          if (getter) {
                              return getReturnTypeOfSignature(getSignatureFromDeclaration(getter));
                          }
                      }
                      var type = getContextuallyTypedParameterType(declaration);
                      if (type) {
                          return type;
                      }
                  }
                  if (declaration.initializer) {
                      return checkExpressionCached(declaration.initializer);
                  }
                  if (declaration.kind === 226) {
                      return checkIdentifier(declaration.name);
                  }
                  return undefined;
              }
              function getTypeFromBindingElement(element) {
                  if (element.initializer) {
                      return getWidenedType(checkExpressionCached(element.initializer));
                  }
                  if (ts.isBindingPattern(element.name)) {
                      return getTypeFromBindingPattern(element.name);
                  }
                  return anyType;
              }
              function getTypeFromObjectBindingPattern(pattern) {
                  var members = {};
                  ts.forEach(pattern.elements, function (e) {
                      var flags = 4 | 67108864 | (e.initializer ? 536870912 : 0);
                      var name = e.propertyName || e.name;
                      var symbol = createSymbol(flags, name.text);
                      symbol.type = getTypeFromBindingElement(e);
                      members[symbol.name] = symbol;
                  });
                  return createAnonymousType(undefined, members, emptyArray, emptyArray, undefined, undefined);
              }
              function getTypeFromArrayBindingPattern(pattern) {
                  var hasSpreadElement = false;
                  var elementTypes = [];
                  ts.forEach(pattern.elements, function (e) {
                      elementTypes.push(e.kind === 176 || e.dotDotDotToken ? anyType : getTypeFromBindingElement(e));
                      if (e.dotDotDotToken) {
                          hasSpreadElement = true;
                      }
                  });
                  if (!elementTypes.length) {
                      return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType;
                  }
                  else if (hasSpreadElement) {
                      var unionOfElements = getUnionType(elementTypes);
                      return languageVersion >= 2 ? createIterableType(unionOfElements) : createArrayType(unionOfElements);
                  }
                  return createTupleType(elementTypes);
              }
              function getTypeFromBindingPattern(pattern) {
                  return pattern.kind === 151
                      ? getTypeFromObjectBindingPattern(pattern)
                      : getTypeFromArrayBindingPattern(pattern);
              }
              function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
                  var type = getTypeForVariableLikeDeclaration(declaration);
                  if (type) {
                      if (reportErrors) {
                          reportErrorsFromWidening(declaration, type);
                      }
                      return declaration.kind !== 225 ? getWidenedType(type) : type;
                  }
                  if (ts.isBindingPattern(declaration.name)) {
                      return getTypeFromBindingPattern(declaration.name);
                  }
                  type = declaration.dotDotDotToken ? anyArrayType : anyType;
                  if (reportErrors && compilerOptions.noImplicitAny) {
                      var root = ts.getRootDeclaration(declaration);
                      if (!isPrivateWithinAmbient(root) && !(root.kind === 130 && isPrivateWithinAmbient(root.parent))) {
                          reportImplicitAnyError(declaration, type);
                      }
                  }
                  return type;
              }
              function getTypeOfVariableOrParameterOrProperty(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      if (symbol.flags & 134217728) {
                          return links.type = getTypeOfPrototypeProperty(symbol);
                      }
                      var declaration = symbol.valueDeclaration;
                      if (declaration.parent.kind === 224) {
                          return links.type = anyType;
                      }
                      if (declaration.kind === 215) {
                          return links.type = checkExpression(declaration.expression);
                      }
                      if (!pushTypeResolution(symbol)) {
                          return unknownType;
                      }
                      var type = getWidenedTypeForVariableLikeDeclaration(declaration, true);
                      if (!popTypeResolution()) {
                          if (symbol.valueDeclaration.type) {
                              type = unknownType;
                              error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
                          }
                          else {
                              type = anyType;
                              if (compilerOptions.noImplicitAny) {
                                  error(symbol.valueDeclaration, ts.Diagnostics._0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, symbolToString(symbol));
                              }
                          }
                      }
                      links.type = type;
                  }
                  return links.type;
              }
              function getSetAccessorTypeAnnotationNode(accessor) {
                  return accessor && accessor.parameters.length > 0 && accessor.parameters[0].type;
              }
              function getAnnotatedAccessorType(accessor) {
                  if (accessor) {
                      if (accessor.kind === 137) {
                          return accessor.type && getTypeFromTypeNode(accessor.type);
                      }
                      else {
                          var setterTypeAnnotation = getSetAccessorTypeAnnotationNode(accessor);
                          return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation);
                      }
                  }
                  return undefined;
              }
              function getTypeOfAccessors(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      if (!pushTypeResolution(symbol)) {
                          return unknownType;
                      }
                      var getter = ts.getDeclarationOfKind(symbol, 137);
                      var setter = ts.getDeclarationOfKind(symbol, 138);
                      var type;
                      var getterReturnType = getAnnotatedAccessorType(getter);
                      if (getterReturnType) {
                          type = getterReturnType;
                      }
                      else {
                          var setterParameterType = getAnnotatedAccessorType(setter);
                          if (setterParameterType) {
                              type = setterParameterType;
                          }
                          else {
                              if (getter && getter.body) {
                                  type = getReturnTypeFromBody(getter);
                              }
                              else {
                                  if (compilerOptions.noImplicitAny) {
                                      error(setter, ts.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation, symbolToString(symbol));
                                  }
                                  type = anyType;
                              }
                          }
                      }
                      if (!popTypeResolution()) {
                          type = anyType;
                          if (compilerOptions.noImplicitAny) {
                              var getter_1 = ts.getDeclarationOfKind(symbol, 137);
                              error(getter_1, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
                          }
                      }
                      links.type = type;
                  }
                  return links.type;
              }
              function getTypeOfFuncClassEnumModule(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = createObjectType(32768, symbol);
                  }
                  return links.type;
              }
              function getTypeOfEnumMember(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = getDeclaredTypeOfEnum(getParentOfSymbol(symbol));
                  }
                  return links.type;
              }
              function getTypeOfAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      var targetSymbol = resolveAlias(symbol);
                      links.type = targetSymbol.flags & 107455
                          ? getTypeOfSymbol(targetSymbol)
                          : unknownType;
                  }
                  return links.type;
              }
              function getTypeOfInstantiatedSymbol(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = instantiateType(getTypeOfSymbol(links.target), links.mapper);
                  }
                  return links.type;
              }
              function getTypeOfSymbol(symbol) {
                  if (symbol.flags & 16777216) {
                      return getTypeOfInstantiatedSymbol(symbol);
                  }
                  if (symbol.flags & (3 | 4)) {
                      return getTypeOfVariableOrParameterOrProperty(symbol);
                  }
                  if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
                      return getTypeOfFuncClassEnumModule(symbol);
                  }
                  if (symbol.flags & 8) {
                      return getTypeOfEnumMember(symbol);
                  }
                  if (symbol.flags & 98304) {
                      return getTypeOfAccessors(symbol);
                  }
                  if (symbol.flags & 8388608) {
                      return getTypeOfAlias(symbol);
                  }
                  return unknownType;
              }
              function getTargetType(type) {
                  return type.flags & 4096 ? type.target : type;
              }
              function hasBaseType(type, checkBase) {
                  return check(type);
                  function check(type) {
                      var target = getTargetType(type);
                      return target === checkBase || ts.forEach(getBaseTypes(target), check);
                  }
              }
              function getTypeParametersOfClassOrInterface(symbol) {
                  var result;
                  ts.forEach(symbol.declarations, function (node) {
                      if (node.kind === 203 || node.kind === 202) {
                          var declaration = node;
                          if (declaration.typeParameters && declaration.typeParameters.length) {
                              ts.forEach(declaration.typeParameters, function (node) {
                                  var tp = getDeclaredTypeOfTypeParameter(getSymbolOfNode(node));
                                  if (!result) {
                                      result = [tp];
                                  }
                                  else if (!ts.contains(result, tp)) {
                                      result.push(tp);
                                  }
                              });
                          }
                      }
                  });
                  return result;
              }
              function getBaseTypes(type) {
                  var typeWithBaseTypes = type;
                  if (!typeWithBaseTypes.baseTypes) {
                      if (type.symbol.flags & 32) {
                          resolveBaseTypesOfClass(typeWithBaseTypes);
                      }
                      else if (type.symbol.flags & 64) {
                          resolveBaseTypesOfInterface(typeWithBaseTypes);
                      }
                      else {
                          ts.Debug.fail("type must be class or interface");
                      }
                  }
                  return typeWithBaseTypes.baseTypes;
              }
              function resolveBaseTypesOfClass(type) {
                  type.baseTypes = [];
                  var declaration = ts.getDeclarationOfKind(type.symbol, 202);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(declaration);
                  if (baseTypeNode) {
                      var baseType = getTypeFromTypeNode(baseTypeNode);
                      if (baseType !== unknownType) {
                          if (getTargetType(baseType).flags & 1024) {
                              if (type !== baseType && !hasBaseType(baseType, type)) {
                                  type.baseTypes.push(baseType);
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
                              }
                          }
                          else {
                              error(baseTypeNode, ts.Diagnostics.A_class_may_only_extend_another_class);
                          }
                      }
                  }
              }
              function resolveBaseTypesOfInterface(type) {
                  type.baseTypes = [];
                  for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
                      var declaration = _a[_i];
                      if (declaration.kind === 203 && ts.getInterfaceBaseTypeNodes(declaration)) {
                          for (var _b = 0, _c = ts.getInterfaceBaseTypeNodes(declaration); _b < _c.length; _b++) {
                              var node = _c[_b];
                              var baseType = getTypeFromTypeNode(node);
                              if (baseType !== unknownType) {
                                  if (getTargetType(baseType).flags & (1024 | 2048)) {
                                      if (type !== baseType && !hasBaseType(baseType, type)) {
                                          type.baseTypes.push(baseType);
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
                                      }
                                  }
                                  else {
                                      error(node, ts.Diagnostics.An_interface_may_only_extend_a_class_or_another_interface);
                                  }
                              }
                          }
                      }
                  }
              }
              function getDeclaredTypeOfClassOrInterface(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var kind = symbol.flags & 32 ? 1024 : 2048;
                      var type = links.declaredType = createObjectType(kind, symbol);
                      var typeParameters = getTypeParametersOfClassOrInterface(symbol);
                      if (typeParameters) {
                          type.flags |= 4096;
                          type.typeParameters = typeParameters;
                          type.instantiations = {};
                          type.instantiations[getTypeListId(type.typeParameters)] = type;
                          type.target = type;
                          type.typeArguments = type.typeParameters;
                      }
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfTypeAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      if (!pushTypeResolution(links)) {
                          return unknownType;
                      }
                      var declaration = ts.getDeclarationOfKind(symbol, 204);
                      var type = getTypeFromTypeNode(declaration.type);
                      if (!popTypeResolution()) {
                          type = unknownType;
                          error(declaration.name, ts.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
                      }
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfEnum(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var type = createType(128);
                      type.symbol = symbol;
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfTypeParameter(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var type = createType(512);
                      type.symbol = symbol;
                      if (!ts.getDeclarationOfKind(symbol, 129).constraint) {
                          type.constraint = noConstraintType;
                      }
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      links.declaredType = getDeclaredTypeOfSymbol(resolveAlias(symbol));
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfSymbol(symbol) {
                  ts.Debug.assert((symbol.flags & 16777216) === 0);
                  if (symbol.flags & (32 | 64)) {
                      return getDeclaredTypeOfClassOrInterface(symbol);
                  }
                  if (symbol.flags & 524288) {
                      return getDeclaredTypeOfTypeAlias(symbol);
                  }
                  if (symbol.flags & 384) {
                      return getDeclaredTypeOfEnum(symbol);
                  }
                  if (symbol.flags & 262144) {
                      return getDeclaredTypeOfTypeParameter(symbol);
                  }
                  if (symbol.flags & 8388608) {
                      return getDeclaredTypeOfAlias(symbol);
                  }
                  return unknownType;
              }
              function createSymbolTable(symbols) {
                  var result = {};
                  for (var _i = 0; _i < symbols.length; _i++) {
                      var symbol = symbols[_i];
                      result[symbol.name] = symbol;
                  }
                  return result;
              }
              function createInstantiatedSymbolTable(symbols, mapper) {
                  var result = {};
                  for (var _i = 0; _i < symbols.length; _i++) {
                      var symbol = symbols[_i];
                      result[symbol.name] = instantiateSymbol(symbol, mapper);
                  }
                  return result;
              }
              function addInheritedMembers(symbols, baseSymbols) {
                  for (var _i = 0; _i < baseSymbols.length; _i++) {
                      var s = baseSymbols[_i];
                      if (!ts.hasProperty(symbols, s.name)) {
                          symbols[s.name] = s;
                      }
                  }
              }
              function addInheritedSignatures(signatures, baseSignatures) {
                  if (baseSignatures) {
                      for (var _i = 0; _i < baseSignatures.length; _i++) {
                          var signature = baseSignatures[_i];
                          signatures.push(signature);
                      }
                  }
              }
              function resolveDeclaredMembers(type) {
                  if (!type.declaredProperties) {
                      var symbol = type.symbol;
                      type.declaredProperties = getNamedMembers(symbol.members);
                      type.declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
                      type.declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
                      type.declaredStringIndexType = getIndexTypeOfSymbol(symbol, 0);
                      type.declaredNumberIndexType = getIndexTypeOfSymbol(symbol, 1);
                  }
                  return type;
              }
              function resolveClassOrInterfaceMembers(type) {
                  var target = resolveDeclaredMembers(type);
                  var members = target.symbol.members;
                  var callSignatures = target.declaredCallSignatures;
                  var constructSignatures = target.declaredConstructSignatures;
                  var stringIndexType = target.declaredStringIndexType;
                  var numberIndexType = target.declaredNumberIndexType;
                  var baseTypes = getBaseTypes(target);
                  if (baseTypes.length) {
                      members = createSymbolTable(target.declaredProperties);
                      for (var _i = 0; _i < baseTypes.length; _i++) {
                          var baseType = baseTypes[_i];
                          addInheritedMembers(members, getPropertiesOfObjectType(baseType));
                          callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(baseType, 0));
                          constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(baseType, 1));
                          stringIndexType = stringIndexType || getIndexTypeOfType(baseType, 0);
                          numberIndexType = numberIndexType || getIndexTypeOfType(baseType, 1);
                      }
                  }
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveTypeReferenceMembers(type) {
                  var target = resolveDeclaredMembers(type.target);
                  var mapper = createTypeMapper(target.typeParameters, type.typeArguments);
                  var members = createInstantiatedSymbolTable(target.declaredProperties, mapper);
                  var callSignatures = instantiateList(target.declaredCallSignatures, mapper, instantiateSignature);
                  var constructSignatures = instantiateList(target.declaredConstructSignatures, mapper, instantiateSignature);
                  var stringIndexType = target.declaredStringIndexType ? instantiateType(target.declaredStringIndexType, mapper) : undefined;
                  var numberIndexType = target.declaredNumberIndexType ? instantiateType(target.declaredNumberIndexType, mapper) : undefined;
                  ts.forEach(getBaseTypes(target), function (baseType) {
                      var instantiatedBaseType = instantiateType(baseType, mapper);
                      addInheritedMembers(members, getPropertiesOfObjectType(instantiatedBaseType));
                      callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(instantiatedBaseType, 0));
                      constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(instantiatedBaseType, 1));
                      stringIndexType = stringIndexType || getIndexTypeOfType(instantiatedBaseType, 0);
                      numberIndexType = numberIndexType || getIndexTypeOfType(instantiatedBaseType, 1);
                  });
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function createSignature(declaration, typeParameters, parameters, resolvedReturnType, minArgumentCount, hasRestParameter, hasStringLiterals) {
                  var sig = new Signature(checker);
                  sig.declaration = declaration;
                  sig.typeParameters = typeParameters;
                  sig.parameters = parameters;
                  sig.resolvedReturnType = resolvedReturnType;
                  sig.minArgumentCount = minArgumentCount;
                  sig.hasRestParameter = hasRestParameter;
                  sig.hasStringLiterals = hasStringLiterals;
                  return sig;
              }
              function cloneSignature(sig) {
                  return createSignature(sig.declaration, sig.typeParameters, sig.parameters, sig.resolvedReturnType, sig.minArgumentCount, sig.hasRestParameter, sig.hasStringLiterals);
              }
              function getDefaultConstructSignatures(classType) {
                  var baseTypes = getBaseTypes(classType);
                  if (baseTypes.length) {
                      var baseType = baseTypes[0];
                      var baseSignatures = getSignaturesOfType(getTypeOfSymbol(baseType.symbol), 1);
                      return ts.map(baseSignatures, function (baseSignature) {
                          var signature = baseType.flags & 4096 ?
                              getSignatureInstantiation(baseSignature, baseType.typeArguments) : cloneSignature(baseSignature);
                          signature.typeParameters = classType.typeParameters;
                          signature.resolvedReturnType = classType;
                          return signature;
                      });
                  }
                  return [createSignature(undefined, classType.typeParameters, emptyArray, classType, 0, false, false)];
              }
              function createTupleTypeMemberSymbols(memberTypes) {
                  var members = {};
                  for (var i = 0; i < memberTypes.length; i++) {
                      var symbol = createSymbol(4 | 67108864, "" + i);
                      symbol.type = memberTypes[i];
                      members[i] = symbol;
                  }
                  return members;
              }
              function resolveTupleTypeMembers(type) {
                  var arrayType = resolveObjectOrUnionTypeMembers(createArrayType(getUnionType(type.elementTypes)));
                  var members = createTupleTypeMemberSymbols(type.elementTypes);
                  addInheritedMembers(members, arrayType.properties);
                  setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexType, arrayType.numberIndexType);
              }
              function signatureListsIdentical(s, t) {
                  if (s.length !== t.length) {
                      return false;
                  }
                  for (var i = 0; i < s.length; i++) {
                      if (!compareSignatures(s[i], t[i], false, compareTypes)) {
                          return false;
                      }
                  }
                  return true;
              }
              function getUnionSignatures(types, kind) {
                  var signatureLists = ts.map(types, function (t) { return getSignaturesOfType(t, kind); });
                  var signatures = signatureLists[0];
                  for (var _i = 0; _i < signatures.length; _i++) {
                      var signature = signatures[_i];
                      if (signature.typeParameters) {
                          return emptyArray;
                      }
                  }
                  for (var i_1 = 1; i_1 < signatureLists.length; i_1++) {
                      if (!signatureListsIdentical(signatures, signatureLists[i_1])) {
                          return emptyArray;
                      }
                  }
                  var result = ts.map(signatures, cloneSignature);
                  for (var i = 0; i < result.length; i++) {
                      var s = result[i];
                      s.resolvedReturnType = undefined;
                      s.unionSignatures = ts.map(signatureLists, function (signatures) { return signatures[i]; });
                  }
                  return result;
              }
              function getUnionIndexType(types, kind) {
                  var indexTypes = [];
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      var indexType = getIndexTypeOfType(type, kind);
                      if (!indexType) {
                          return undefined;
                      }
                      indexTypes.push(indexType);
                  }
                  return getUnionType(indexTypes);
              }
              function resolveUnionTypeMembers(type) {
                  var callSignatures = getUnionSignatures(type.types, 0);
                  var constructSignatures = getUnionSignatures(type.types, 1);
                  var stringIndexType = getUnionIndexType(type.types, 0);
                  var numberIndexType = getUnionIndexType(type.types, 1);
                  setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveAnonymousTypeMembers(type) {
                  var symbol = type.symbol;
                  var members;
                  var callSignatures;
                  var constructSignatures;
                  var stringIndexType;
                  var numberIndexType;
                  if (symbol.flags & 2048) {
                      members = symbol.members;
                      callSignatures = getSignaturesOfSymbol(members["__call"]);
                      constructSignatures = getSignaturesOfSymbol(members["__new"]);
                      stringIndexType = getIndexTypeOfSymbol(symbol, 0);
                      numberIndexType = getIndexTypeOfSymbol(symbol, 1);
                  }
                  else {
                      members = emptySymbols;
                      callSignatures = emptyArray;
                      constructSignatures = emptyArray;
                      if (symbol.flags & 1952) {
                          members = getExportsOfSymbol(symbol);
                      }
                      if (symbol.flags & (16 | 8192)) {
                          callSignatures = getSignaturesOfSymbol(symbol);
                      }
                      if (symbol.flags & 32) {
                          var classType = getDeclaredTypeOfClassOrInterface(symbol);
                          constructSignatures = getSignaturesOfSymbol(symbol.members["__constructor"]);
                          if (!constructSignatures.length) {
                              constructSignatures = getDefaultConstructSignatures(classType);
                          }
                          var baseTypes = getBaseTypes(classType);
                          if (baseTypes.length) {
                              members = createSymbolTable(getNamedMembers(members));
                              addInheritedMembers(members, getPropertiesOfObjectType(getTypeOfSymbol(baseTypes[0].symbol)));
                          }
                      }
                      stringIndexType = undefined;
                      numberIndexType = (symbol.flags & 384) ? stringType : undefined;
                  }
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveObjectOrUnionTypeMembers(type) {
                  if (!type.members) {
                      if (type.flags & (1024 | 2048)) {
                          resolveClassOrInterfaceMembers(type);
                      }
                      else if (type.flags & 32768) {
                          resolveAnonymousTypeMembers(type);
                      }
                      else if (type.flags & 8192) {
                          resolveTupleTypeMembers(type);
                      }
                      else if (type.flags & 16384) {
                          resolveUnionTypeMembers(type);
                      }
                      else {
                          resolveTypeReferenceMembers(type);
                      }
                  }
                  return type;
              }
              function getPropertiesOfObjectType(type) {
                  if (type.flags & 48128) {
                      return resolveObjectOrUnionTypeMembers(type).properties;
                  }
                  return emptyArray;
              }
              function getPropertyOfObjectType(type, name) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (ts.hasProperty(resolved.members, name)) {
                          var symbol = resolved.members[name];
                          if (symbolIsValue(symbol)) {
                              return symbol;
                          }
                      }
                  }
              }
              function getPropertiesOfUnionType(type) {
                  var result = [];
                  ts.forEach(getPropertiesOfType(type.types[0]), function (prop) {
                      var unionProp = getPropertyOfUnionType(type, prop.name);
                      if (unionProp) {
                          result.push(unionProp);
                      }
                  });
                  return result;
              }
              function getPropertiesOfType(type) {
                  type = getApparentType(type);
                  return type.flags & 16384 ? getPropertiesOfUnionType(type) : getPropertiesOfObjectType(type);
              }
              function getApparentType(type) {
                  if (type.flags & 16384) {
                      type = getReducedTypeOfUnionType(type);
                  }
                  if (type.flags & 512) {
                      do {
                          type = getConstraintOfTypeParameter(type);
                      } while (type && type.flags & 512);
                      if (!type) {
                          type = emptyObjectType;
                      }
                  }
                  if (type.flags & 258) {
                      type = globalStringType;
                  }
                  else if (type.flags & 132) {
                      type = globalNumberType;
                  }
                  else if (type.flags & 8) {
                      type = globalBooleanType;
                  }
                  else if (type.flags & 1048576) {
                      type = globalESSymbolType;
                  }
                  return type;
              }
              function createUnionProperty(unionType, name) {
                  var types = unionType.types;
                  var props;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      var type = getApparentType(current);
                      if (type !== unknownType) {
                          var prop = getPropertyOfType(type, name);
                          if (!prop || getDeclarationFlagsFromSymbol(prop) & (32 | 64)) {
                              return undefined;
                          }
                          if (!props) {
                              props = [prop];
                          }
                          else {
                              props.push(prop);
                          }
                      }
                  }
                  var propTypes = [];
                  var declarations = [];
                  for (var _a = 0; _a < props.length; _a++) {
                      var prop = props[_a];
                      if (prop.declarations) {
                          declarations.push.apply(declarations, prop.declarations);
                      }
                      propTypes.push(getTypeOfSymbol(prop));
                  }
                  var result = createSymbol(4 | 67108864 | 268435456, name);
                  result.unionType = unionType;
                  result.declarations = declarations;
                  result.type = getUnionType(propTypes);
                  return result;
              }
              function getPropertyOfUnionType(type, name) {
                  var properties = type.resolvedProperties || (type.resolvedProperties = {});
                  if (ts.hasProperty(properties, name)) {
                      return properties[name];
                  }
                  var property = createUnionProperty(type, name);
                  if (property) {
                      properties[name] = property;
                  }
                  return property;
              }
              function getPropertyOfType(type, name) {
                  type = getApparentType(type);
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (ts.hasProperty(resolved.members, name)) {
                          var symbol = resolved.members[name];
                          if (symbolIsValue(symbol)) {
                              return symbol;
                          }
                      }
                      if (resolved === anyFunctionType || resolved.callSignatures.length || resolved.constructSignatures.length) {
                          var symbol = getPropertyOfObjectType(globalFunctionType, name);
                          if (symbol) {
                              return symbol;
                          }
                      }
                      return getPropertyOfObjectType(globalObjectType, name);
                  }
                  if (type.flags & 16384) {
                      return getPropertyOfUnionType(type, name);
                  }
                  return undefined;
              }
              function getSignaturesOfObjectOrUnionType(type, kind) {
                  if (type.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return kind === 0 ? resolved.callSignatures : resolved.constructSignatures;
                  }
                  return emptyArray;
              }
              function getSignaturesOfType(type, kind) {
                  return getSignaturesOfObjectOrUnionType(getApparentType(type), kind);
              }
              function typeHasCallOrConstructSignatures(type) {
                  var apparentType = getApparentType(type);
                  if (apparentType.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return resolved.callSignatures.length > 0
                          || resolved.constructSignatures.length > 0;
                  }
                  return false;
              }
              function getIndexTypeOfObjectOrUnionType(type, kind) {
                  if (type.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return kind === 0 ? resolved.stringIndexType : resolved.numberIndexType;
                  }
              }
              function getIndexTypeOfType(type, kind) {
                  return getIndexTypeOfObjectOrUnionType(getApparentType(type), kind);
              }
              function getTypeParametersFromDeclaration(typeParameterDeclarations) {
                  var result = [];
                  ts.forEach(typeParameterDeclarations, function (node) {
                      var tp = getDeclaredTypeOfTypeParameter(node.symbol);
                      if (!ts.contains(result, tp)) {
                          result.push(tp);
                      }
                  });
                  return result;
              }
              function symbolsToArray(symbols) {
                  var result = [];
                  for (var id in symbols) {
                      if (!isReservedMemberName(id)) {
                          result.push(symbols[id]);
                      }
                  }
                  return result;
              }
              function getSignatureFromDeclaration(declaration) {
                  var links = getNodeLinks(declaration);
                  if (!links.resolvedSignature) {
                      var classType = declaration.kind === 136 ? getDeclaredTypeOfClassOrInterface(declaration.parent.symbol) : undefined;
                      var typeParameters = classType ? classType.typeParameters :
                          declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : undefined;
                      var parameters = [];
                      var hasStringLiterals = false;
                      var minArgumentCount = -1;
                      for (var i = 0, n = declaration.parameters.length; i < n; i++) {
                          var param = declaration.parameters[i];
                          parameters.push(param.symbol);
                          if (param.type && param.type.kind === 8) {
                              hasStringLiterals = true;
                          }
                          if (minArgumentCount < 0) {
                              if (param.initializer || param.questionToken || param.dotDotDotToken) {
                                  minArgumentCount = i;
                              }
                          }
                      }
                      if (minArgumentCount < 0) {
                          minArgumentCount = declaration.parameters.length;
                      }
                      var returnType;
                      if (classType) {
                          returnType = classType;
                      }
                      else if (declaration.type) {
                          returnType = getTypeFromTypeNode(declaration.type);
                      }
                      else {
                          if (declaration.kind === 137 && !ts.hasDynamicName(declaration)) {
                              var setter = ts.getDeclarationOfKind(declaration.symbol, 138);
                              returnType = getAnnotatedAccessorType(setter);
                          }
                          if (!returnType && ts.nodeIsMissing(declaration.body)) {
                              returnType = anyType;
                          }
                      }
                      links.resolvedSignature = createSignature(declaration, typeParameters, parameters, returnType, minArgumentCount, ts.hasRestParameters(declaration), hasStringLiterals);
                  }
                  return links.resolvedSignature;
              }
              function getSignaturesOfSymbol(symbol) {
                  if (!symbol)
                      return emptyArray;
                  var result = [];
                  for (var i = 0, len = symbol.declarations.length; i < len; i++) {
                      var node = symbol.declarations[i];
                      switch (node.kind) {
                          case 143:
                          case 144:
                          case 201:
                          case 135:
                          case 134:
                          case 136:
                          case 139:
                          case 140:
                          case 141:
                          case 137:
                          case 138:
                          case 163:
                          case 164:
                              if (i > 0 && node.body) {
                                  var previous = symbol.declarations[i - 1];
                                  if (node.parent === previous.parent && node.kind === previous.kind && node.pos === previous.end) {
                                      break;
                                  }
                              }
                              result.push(getSignatureFromDeclaration(node));
                      }
                  }
                  return result;
              }
              function getReturnTypeOfSignature(signature) {
                  if (!signature.resolvedReturnType) {
                      if (!pushTypeResolution(signature)) {
                          return unknownType;
                      }
                      var type;
                      if (signature.target) {
                          type = instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper);
                      }
                      else if (signature.unionSignatures) {
                          type = getUnionType(ts.map(signature.unionSignatures, getReturnTypeOfSignature));
                      }
                      else {
                          type = getReturnTypeFromBody(signature.declaration);
                      }
                      if (!popTypeResolution()) {
                          type = anyType;
                          if (compilerOptions.noImplicitAny) {
                              var declaration = signature.declaration;
                              if (declaration.name) {
                                  error(declaration.name, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, ts.declarationNameToString(declaration.name));
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions);
                              }
                          }
                      }
                      signature.resolvedReturnType = type;
                  }
                  return signature.resolvedReturnType;
              }
              function getRestTypeOfSignature(signature) {
                  if (signature.hasRestParameter) {
                      var type = getTypeOfSymbol(ts.lastOrUndefined(signature.parameters));
                      if (type.flags & 4096 && type.target === globalArrayType) {
                          return type.typeArguments[0];
                      }
                  }
                  return anyType;
              }
              function getSignatureInstantiation(signature, typeArguments) {
                  return instantiateSignature(signature, createTypeMapper(signature.typeParameters, typeArguments), true);
              }
              function getErasedSignature(signature) {
                  if (!signature.typeParameters)
                      return signature;
                  if (!signature.erasedSignatureCache) {
                      if (signature.target) {
                          signature.erasedSignatureCache = instantiateSignature(getErasedSignature(signature.target), signature.mapper);
                      }
                      else {
                          signature.erasedSignatureCache = instantiateSignature(signature, createTypeEraser(signature.typeParameters), true);
                      }
                  }
                  return signature.erasedSignatureCache;
              }
              function getOrCreateTypeFromSignature(signature) {
                  if (!signature.isolatedSignatureType) {
                      var isConstructor = signature.declaration.kind === 136 || signature.declaration.kind === 140;
                      var type = createObjectType(32768 | 65536);
                      type.members = emptySymbols;
                      type.properties = emptyArray;
                      type.callSignatures = !isConstructor ? [signature] : emptyArray;
                      type.constructSignatures = isConstructor ? [signature] : emptyArray;
                      signature.isolatedSignatureType = type;
                  }
                  return signature.isolatedSignatureType;
              }
              function getIndexSymbol(symbol) {
                  return symbol.members["__index"];
              }
              function getIndexDeclarationOfSymbol(symbol, kind) {
                  var syntaxKind = kind === 1 ? 120 : 122;
                  var indexSymbol = getIndexSymbol(symbol);
                  if (indexSymbol) {
                      var len = indexSymbol.declarations.length;
                      for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
                          var decl = _a[_i];
                          var node = decl;
                          if (node.parameters.length === 1) {
                              var parameter = node.parameters[0];
                              if (parameter && parameter.type && parameter.type.kind === syntaxKind) {
                                  return node;
                              }
                          }
                      }
                  }
                  return undefined;
              }
              function getIndexTypeOfSymbol(symbol, kind) {
                  var declaration = getIndexDeclarationOfSymbol(symbol, kind);
                  return declaration
                      ? declaration.type ? getTypeFromTypeNode(declaration.type) : anyType
                      : undefined;
              }
              function getConstraintOfTypeParameter(type) {
                  if (!type.constraint) {
                      if (type.target) {
                          var targetConstraint = getConstraintOfTypeParameter(type.target);
                          type.constraint = targetConstraint ? instantiateType(targetConstraint, type.mapper) : noConstraintType;
                      }
                      else {
                          type.constraint = getTypeFromTypeNode(ts.getDeclarationOfKind(type.symbol, 129).constraint);
                      }
                  }
                  return type.constraint === noConstraintType ? undefined : type.constraint;
              }
              function getTypeListId(types) {
                  switch (types.length) {
                      case 1:
                          return "" + types[0].id;
                      case 2:
                          return types[0].id + "," + types[1].id;
                      default:
                          var result = "";
                          for (var i = 0; i < types.length; i++) {
                              if (i > 0) {
                                  result += ",";
                              }
                              result += types[i].id;
                          }
                          return result;
                  }
              }
              function getWideningFlagsOfTypes(types) {
                  var result = 0;
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      result |= type.flags;
                  }
                  return result & 786432;
              }
              function createTypeReference(target, typeArguments) {
                  var id = getTypeListId(typeArguments);
                  var type = target.instantiations[id];
                  if (!type) {
                      var flags = 4096 | getWideningFlagsOfTypes(typeArguments);
                      type = target.instantiations[id] = createObjectType(flags, target.symbol);
                      type.target = target;
                      type.typeArguments = typeArguments;
                  }
                  return type;
              }
              function isTypeParameterReferenceIllegalInConstraint(typeReferenceNode, typeParameterSymbol) {
                  var links = getNodeLinks(typeReferenceNode);
                  if (links.isIllegalTypeReferenceInConstraint !== undefined) {
                      return links.isIllegalTypeReferenceInConstraint;
                  }
                  var currentNode = typeReferenceNode;
                  while (!ts.forEach(typeParameterSymbol.declarations, function (d) { return d.parent === currentNode.parent; })) {
                      currentNode = currentNode.parent;
                  }
                  links.isIllegalTypeReferenceInConstraint = currentNode.kind === 129;
                  return links.isIllegalTypeReferenceInConstraint;
              }
              function checkTypeParameterHasIllegalReferencesInConstraint(typeParameter) {
                  var typeParameterSymbol;
                  function check(n) {
                      if (n.kind === 142 && n.typeName.kind === 65) {
                          var links = getNodeLinks(n);
                          if (links.isIllegalTypeReferenceInConstraint === undefined) {
                              var symbol = resolveName(typeParameter, n.typeName.text, 793056, undefined, undefined);
                              if (symbol && (symbol.flags & 262144)) {
                                  links.isIllegalTypeReferenceInConstraint = ts.forEach(symbol.declarations, function (d) { return d.parent == typeParameter.parent; });
                              }
                          }
                          if (links.isIllegalTypeReferenceInConstraint) {
                              error(typeParameter, ts.Diagnostics.Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list);
                          }
                      }
                      ts.forEachChild(n, check);
                  }
                  if (typeParameter.constraint) {
                      typeParameterSymbol = getSymbolOfNode(typeParameter);
                      check(typeParameter.constraint);
                  }
              }
              function getTypeFromTypeReferenceOrExpressionWithTypeArguments(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      var type;
                      if (node.kind !== 177 || ts.isSupportedExpressionWithTypeArguments(node)) {
                          var typeNameOrExpression = node.kind === 142
                              ? node.typeName
                              : node.expression;
                          var symbol = resolveEntityName(typeNameOrExpression, 793056);
                          if (symbol) {
                              if ((symbol.flags & 262144) && isTypeParameterReferenceIllegalInConstraint(node, symbol)) {
                                  type = unknownType;
                              }
                              else {
                                  type = getDeclaredTypeOfSymbol(symbol);
                                  if (type.flags & (1024 | 2048) && type.flags & 4096) {
                                      var typeParameters = type.typeParameters;
                                      if (node.typeArguments && node.typeArguments.length === typeParameters.length) {
                                          type = createTypeReference(type, ts.map(node.typeArguments, getTypeFromTypeNode));
                                      }
                                      else {
                                          error(node, ts.Diagnostics.Generic_type_0_requires_1_type_argument_s, typeToString(type, undefined, 1), typeParameters.length);
                                          type = undefined;
                                      }
                                  }
                                  else {
                                      if (node.typeArguments) {
                                          error(node, ts.Diagnostics.Type_0_is_not_generic, typeToString(type));
                                          type = undefined;
                                      }
                                  }
                              }
                          }
                      }
                      links.resolvedType = type || unknownType;
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeQueryNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getWidenedType(checkExpressionOrQualifiedName(node.exprName));
                  }
                  return links.resolvedType;
              }
              function getTypeOfGlobalSymbol(symbol, arity) {
                  function getTypeDeclaration(symbol) {
                      var declarations = symbol.declarations;
                      for (var _i = 0; _i < declarations.length; _i++) {
                          var declaration = declarations[_i];
                          switch (declaration.kind) {
                              case 202:
                              case 203:
                              case 205:
                                  return declaration;
                          }
                      }
                  }
                  if (!symbol) {
                      return emptyObjectType;
                  }
                  var type = getDeclaredTypeOfSymbol(symbol);
                  if (!(type.flags & 48128)) {
                      error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name);
                      return emptyObjectType;
                  }
                  if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) {
                      error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity);
                      return emptyObjectType;
                  }
                  return type;
              }
              function getGlobalValueSymbol(name) {
                  return getGlobalSymbol(name, 107455, ts.Diagnostics.Cannot_find_global_value_0);
              }
              function getGlobalTypeSymbol(name) {
                  return getGlobalSymbol(name, 793056, ts.Diagnostics.Cannot_find_global_type_0);
              }
              function getGlobalSymbol(name, meaning, diagnostic) {
                  return resolveName(undefined, name, meaning, diagnostic, name);
              }
              function getGlobalType(name, arity) {
                  if (arity === void 0) { arity = 0; }
                  return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), arity);
              }
              function getGlobalESSymbolConstructorSymbol() {
                  return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"));
              }
              function createIterableType(elementType) {
                  return globalIterableType !== emptyObjectType ? createTypeReference(globalIterableType, [elementType]) : emptyObjectType;
              }
              function createArrayType(elementType) {
                  var arrayType = globalArrayType || getDeclaredTypeOfSymbol(globalArraySymbol);
                  return arrayType !== emptyObjectType ? createTypeReference(arrayType, [elementType]) : emptyObjectType;
              }
              function getTypeFromArrayTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
                  }
                  return links.resolvedType;
              }
              function createTupleType(elementTypes) {
                  var id = getTypeListId(elementTypes);
                  var type = tupleTypes[id];
                  if (!type) {
                      type = tupleTypes[id] = createObjectType(8192);
                      type.elementTypes = elementTypes;
                  }
                  return type;
              }
              function getTypeFromTupleTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createTupleType(ts.map(node.elementTypes, getTypeFromTypeNode));
                  }
                  return links.resolvedType;
              }
              function addTypeToSortedSet(sortedSet, type) {
                  if (type.flags & 16384) {
                      addTypesToSortedSet(sortedSet, type.types);
                  }
                  else {
                      var i = 0;
                      var id = type.id;
                      while (i < sortedSet.length && sortedSet[i].id < id) {
                          i++;
                      }
                      if (i === sortedSet.length || sortedSet[i].id !== id) {
                          sortedSet.splice(i, 0, type);
                      }
                  }
              }
              function addTypesToSortedSet(sortedTypes, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      addTypeToSortedSet(sortedTypes, type);
                  }
              }
              function isSubtypeOfAny(candidate, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (candidate !== type && isTypeSubtypeOf(candidate, type)) {
                          return true;
                      }
                  }
                  return false;
              }
              var removeSubtypesStack = [];
              function removeSubtypes(types) {
                  var typeListId = getTypeListId(types);
                  if (removeSubtypesStack.lastIndexOf(typeListId) >= 0) {
                      return;
                  }
                  removeSubtypesStack.push(typeListId);
                  var i = types.length;
                  while (i > 0) {
                      i--;
                      if (isSubtypeOfAny(types[i], types)) {
                          types.splice(i, 1);
                      }
                  }
                  removeSubtypesStack.pop();
              }
              function containsAnyType(types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (type.flags & 1) {
                          return true;
                      }
                  }
                  return false;
              }
              function removeAllButLast(types, typeToRemove) {
                  var i = types.length;
                  while (i > 0 && types.length > 1) {
                      i--;
                      if (types[i] === typeToRemove) {
                          types.splice(i, 1);
                      }
                  }
              }
              function getUnionType(types, noSubtypeReduction) {
                  if (types.length === 0) {
                      return emptyObjectType;
                  }
                  var sortedTypes = [];
                  addTypesToSortedSet(sortedTypes, types);
                  if (noSubtypeReduction) {
                      if (containsAnyType(sortedTypes)) {
                          return anyType;
                      }
                      removeAllButLast(sortedTypes, undefinedType);
                      removeAllButLast(sortedTypes, nullType);
                  }
                  else {
                      removeSubtypes(sortedTypes);
                  }
                  if (sortedTypes.length === 1) {
                      return sortedTypes[0];
                  }
                  var id = getTypeListId(sortedTypes);
                  var type = unionTypes[id];
                  if (!type) {
                      type = unionTypes[id] = createObjectType(16384 | getWideningFlagsOfTypes(sortedTypes));
                      type.types = sortedTypes;
                      type.reducedType = noSubtypeReduction ? undefined : type;
                  }
                  return type;
              }
              function getReducedTypeOfUnionType(type) {
                  if (!type.reducedType) {
                      type.reducedType = getUnionType(type.types, false);
                  }
                  return type.reducedType;
              }
              function getTypeFromUnionTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getUnionType(ts.map(node.types, getTypeFromTypeNode), true);
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createObjectType(32768, node.symbol);
                  }
                  return links.resolvedType;
              }
              function getStringLiteralType(node) {
                  if (ts.hasProperty(stringLiteralTypes, node.text)) {
                      return stringLiteralTypes[node.text];
                  }
                  var type = stringLiteralTypes[node.text] = createType(256);
                  type.text = ts.getTextOfNode(node);
                  return type;
              }
              function getTypeFromStringLiteral(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getStringLiteralType(node);
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeNode(node) {
                  switch (node.kind) {
                      case 112:
                          return anyType;
                      case 122:
                          return stringType;
                      case 120:
                          return numberType;
                      case 113:
                          return booleanType;
                      case 123:
                          return esSymbolType;
                      case 99:
                          return voidType;
                      case 8:
                          return getTypeFromStringLiteral(node);
                      case 142:
                          return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                      case 177:
                          return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                      case 145:
                          return getTypeFromTypeQueryNode(node);
                      case 147:
                          return getTypeFromArrayTypeNode(node);
                      case 148:
                          return getTypeFromTupleTypeNode(node);
                      case 149:
                          return getTypeFromUnionTypeNode(node);
                      case 150:
                          return getTypeFromTypeNode(node.type);
                      case 143:
                      case 144:
                      case 146:
                          return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
                      case 65:
                      case 127:
                          var symbol = getSymbolInfo(node);
                          return symbol && getDeclaredTypeOfSymbol(symbol);
                      default:
                          return unknownType;
                  }
              }
              function instantiateList(items, mapper, instantiator) {
                  if (items && items.length) {
                      var result = [];
                      for (var _i = 0; _i < items.length; _i++) {
                          var v = items[_i];
                          result.push(instantiator(v, mapper));
                      }
                      return result;
                  }
                  return items;
              }
              function createUnaryTypeMapper(source, target) {
                  return function (t) { return t === source ? target : t; };
              }
              function createBinaryTypeMapper(source1, target1, source2, target2) {
                  return function (t) { return t === source1 ? target1 : t === source2 ? target2 : t; };
              }
              function createTypeMapper(sources, targets) {
                  switch (sources.length) {
                      case 1: return createUnaryTypeMapper(sources[0], targets[0]);
                      case 2: return createBinaryTypeMapper(sources[0], targets[0], sources[1], targets[1]);
                  }
                  return function (t) {
                      for (var i = 0; i < sources.length; i++) {
                          if (t === sources[i]) {
                              return targets[i];
                          }
                      }
                      return t;
                  };
              }
              function createUnaryTypeEraser(source) {
                  return function (t) { return t === source ? anyType : t; };
              }
              function createBinaryTypeEraser(source1, source2) {
                  return function (t) { return t === source1 || t === source2 ? anyType : t; };
              }
              function createTypeEraser(sources) {
                  switch (sources.length) {
                      case 1: return createUnaryTypeEraser(sources[0]);
                      case 2: return createBinaryTypeEraser(sources[0], sources[1]);
                  }
                  return function (t) {
                      for (var _i = 0; _i < sources.length; _i++) {
                          var source = sources[_i];
                          if (t === source) {
                              return anyType;
                          }
                      }
                      return t;
                  };
              }
              function createInferenceMapper(context) {
                  return function (t) {
                      for (var i = 0; i < context.typeParameters.length; i++) {
                          if (t === context.typeParameters[i]) {
                              context.inferences[i].isFixed = true;
                              return getInferredType(context, i);
                          }
                      }
                      return t;
                  };
              }
              function identityMapper(type) {
                  return type;
              }
              function combineTypeMappers(mapper1, mapper2) {
                  return function (t) { return instantiateType(mapper1(t), mapper2); };
              }
              function instantiateTypeParameter(typeParameter, mapper) {
                  var result = createType(512);
                  result.symbol = typeParameter.symbol;
                  if (typeParameter.constraint) {
                      result.constraint = instantiateType(typeParameter.constraint, mapper);
                  }
                  else {
                      result.target = typeParameter;
                      result.mapper = mapper;
                  }
                  return result;
              }
              function instantiateSignature(signature, mapper, eraseTypeParameters) {
                  var freshTypeParameters;
                  if (signature.typeParameters && !eraseTypeParameters) {
                      freshTypeParameters = instantiateList(signature.typeParameters, mapper, instantiateTypeParameter);
                      mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
                  }
                  var result = createSignature(signature.declaration, freshTypeParameters, instantiateList(signature.parameters, mapper, instantiateSymbol), signature.resolvedReturnType ? instantiateType(signature.resolvedReturnType, mapper) : undefined, signature.minArgumentCount, signature.hasRestParameter, signature.hasStringLiterals);
                  result.target = signature;
                  result.mapper = mapper;
                  return result;
              }
              function instantiateSymbol(symbol, mapper) {
                  if (symbol.flags & 16777216) {
                      var links = getSymbolLinks(symbol);
                      symbol = links.target;
                      mapper = combineTypeMappers(links.mapper, mapper);
                  }
                  var result = createSymbol(16777216 | 67108864 | symbol.flags, symbol.name);
                  result.declarations = symbol.declarations;
                  result.parent = symbol.parent;
                  result.target = symbol;
                  result.mapper = mapper;
                  if (symbol.valueDeclaration) {
                      result.valueDeclaration = symbol.valueDeclaration;
                  }
                  return result;
              }
              function instantiateAnonymousType(type, mapper) {
                  var result = createObjectType(32768, type.symbol);
                  result.properties = instantiateList(getPropertiesOfObjectType(type), mapper, instantiateSymbol);
                  result.members = createSymbolTable(result.properties);
                  result.callSignatures = instantiateList(getSignaturesOfType(type, 0), mapper, instantiateSignature);
                  result.constructSignatures = instantiateList(getSignaturesOfType(type, 1), mapper, instantiateSignature);
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType)
                      result.stringIndexType = instantiateType(stringIndexType, mapper);
                  if (numberIndexType)
                      result.numberIndexType = instantiateType(numberIndexType, mapper);
                  return result;
              }
              function instantiateType(type, mapper) {
                  if (mapper !== identityMapper) {
                      if (type.flags & 512) {
                          return mapper(type);
                      }
                      if (type.flags & 32768) {
                          return type.symbol && type.symbol.flags & (16 | 8192 | 2048 | 4096) ?
                              instantiateAnonymousType(type, mapper) : type;
                      }
                      if (type.flags & 4096) {
                          return createTypeReference(type.target, instantiateList(type.typeArguments, mapper, instantiateType));
                      }
                      if (type.flags & 8192) {
                          return createTupleType(instantiateList(type.elementTypes, mapper, instantiateType));
                      }
                      if (type.flags & 16384) {
                          return getUnionType(instantiateList(type.types, mapper, instantiateType), true);
                      }
                  }
                  return type;
              }
              function isContextSensitive(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  switch (node.kind) {
                      case 163:
                      case 164:
                          return isContextSensitiveFunctionLikeDeclaration(node);
                      case 155:
                          return ts.forEach(node.properties, isContextSensitive);
                      case 154:
                          return ts.forEach(node.elements, isContextSensitive);
                      case 171:
                          return isContextSensitive(node.whenTrue) ||
                              isContextSensitive(node.whenFalse);
                      case 170:
                          return node.operatorToken.kind === 49 &&
                              (isContextSensitive(node.left) || isContextSensitive(node.right));
                      case 225:
                          return isContextSensitive(node.initializer);
                      case 135:
                      case 134:
                          return isContextSensitiveFunctionLikeDeclaration(node);
                      case 162:
                          return isContextSensitive(node.expression);
                  }
                  return false;
              }
              function isContextSensitiveFunctionLikeDeclaration(node) {
                  return !node.typeParameters && node.parameters.length && !ts.forEach(node.parameters, function (p) { return p.type; });
              }
              function getTypeWithoutConstructors(type) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (resolved.constructSignatures.length) {
                          var result = createObjectType(32768, type.symbol);
                          result.members = resolved.members;
                          result.properties = resolved.properties;
                          result.callSignatures = resolved.callSignatures;
                          result.constructSignatures = emptyArray;
                          type = result;
                      }
                  }
                  return type;
              }
              var subtypeRelation = {};
              var assignableRelation = {};
              var identityRelation = {};
              function isTypeIdenticalTo(source, target) {
                  return checkTypeRelatedTo(source, target, identityRelation, undefined);
              }
              function compareTypes(source, target) {
                  return checkTypeRelatedTo(source, target, identityRelation, undefined) ? -1 : 0;
              }
              function isTypeSubtypeOf(source, target) {
                  return checkTypeSubtypeOf(source, target, undefined);
              }
              function isTypeAssignableTo(source, target) {
                  return checkTypeAssignableTo(source, target, undefined);
              }
              function checkTypeSubtypeOf(source, target, errorNode, headMessage, containingMessageChain) {
                  return checkTypeRelatedTo(source, target, subtypeRelation, errorNode, headMessage, containingMessageChain);
              }
              function checkTypeAssignableTo(source, target, errorNode, headMessage) {
                  return checkTypeRelatedTo(source, target, assignableRelation, errorNode, headMessage);
              }
              function isSignatureAssignableTo(source, target) {
                  var sourceType = getOrCreateTypeFromSignature(source);
                  var targetType = getOrCreateTypeFromSignature(target);
                  return checkTypeRelatedTo(sourceType, targetType, assignableRelation, undefined);
              }
              function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain) {
                  var errorInfo;
                  var sourceStack;
                  var targetStack;
                  var maybeStack;
                  var expandingFlags;
                  var depth = 0;
                  var overflow = false;
                  var elaborateErrors = false;
                  ts.Debug.assert(relation !== identityRelation || !errorNode, "no error reporting in identity checking");
                  var result = isRelatedTo(source, target, errorNode !== undefined, headMessage);
                  if (overflow) {
                      error(errorNode, ts.Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target));
                  }
                  else if (errorInfo) {
                      if (errorInfo.next === undefined) {
                          errorInfo = undefined;
                          elaborateErrors = true;
                          isRelatedTo(source, target, errorNode !== undefined, headMessage);
                      }
                      if (containingMessageChain) {
                          errorInfo = ts.concatenateDiagnosticMessageChains(containingMessageChain, errorInfo);
                      }
                      diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(errorNode, errorInfo));
                  }
                  return result !== 0;
                  function reportError(message, arg0, arg1, arg2) {
                      errorInfo = ts.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2);
                  }
                  function isRelatedTo(source, target, reportErrors, headMessage) {
                      var result;
                      if (source === target)
                          return -1;
                      if (relation !== identityRelation) {
                          if (target.flags & 1)
                              return -1;
                          if (source === undefinedType)
                              return -1;
                          if (source === nullType && target !== undefinedType)
                              return -1;
                          if (source.flags & 128 && target === numberType)
                              return -1;
                          if (source.flags & 256 && target === stringType)
                              return -1;
                          if (relation === assignableRelation) {
                              if (source.flags & 1)
                                  return -1;
                              if (source === numberType && target.flags & 128)
                                  return -1;
                          }
                      }
                      var saveErrorInfo = errorInfo;
                      if (source.flags & 16384 || target.flags & 16384) {
                          if (relation === identityRelation) {
                              if (source.flags & 16384 && target.flags & 16384) {
                                  if (result = unionTypeRelatedToUnionType(source, target)) {
                                      if (result &= unionTypeRelatedToUnionType(target, source)) {
                                          return result;
                                      }
                                  }
                              }
                              else if (source.flags & 16384) {
                                  if (result = unionTypeRelatedToType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                              else {
                                  if (result = unionTypeRelatedToType(target, source, reportErrors)) {
                                      return result;
                                  }
                              }
                          }
                          else {
                              if (source.flags & 16384) {
                                  if (result = unionTypeRelatedToType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                              else {
                                  if (result = typeRelatedToUnionType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                          }
                      }
                      else if (source.flags & 512 && target.flags & 512) {
                          if (result = typeParameterRelatedTo(source, target, reportErrors)) {
                              return result;
                          }
                      }
                      else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
                          if (result = typesRelatedTo(source.typeArguments, target.typeArguments, reportErrors)) {
                              return result;
                          }
                      }
                      var reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo;
                      var sourceOrApparentType = relation === identityRelation ? source : getApparentType(source);
                      if (sourceOrApparentType.flags & 48128 && target.flags & 48128) {
                          if (result = objectTypeRelatedTo(sourceOrApparentType, target, reportStructuralErrors)) {
                              errorInfo = saveErrorInfo;
                              return result;
                          }
                      }
                      else if (source.flags & 512 && sourceOrApparentType.flags & 16384) {
                          errorInfo = saveErrorInfo;
                          if (result = isRelatedTo(sourceOrApparentType, target, reportErrors)) {
                              return result;
                          }
                      }
                      if (reportErrors) {
                          headMessage = headMessage || ts.Diagnostics.Type_0_is_not_assignable_to_type_1;
                          var sourceType = typeToString(source);
                          var targetType = typeToString(target);
                          if (sourceType === targetType) {
                              sourceType = typeToString(source, undefined, 128);
                              targetType = typeToString(target, undefined, 128);
                          }
                          reportError(headMessage, sourceType, targetType);
                      }
                      return 0;
                  }
                  function unionTypeRelatedToUnionType(source, target) {
                      var result = -1;
                      var sourceTypes = source.types;
                      for (var _i = 0; _i < sourceTypes.length; _i++) {
                          var sourceType = sourceTypes[_i];
                          var related = typeRelatedToUnionType(sourceType, target, false);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typeRelatedToUnionType(source, target, reportErrors) {
                      var targetTypes = target.types;
                      for (var i = 0, len = targetTypes.length; i < len; i++) {
                          var related = isRelatedTo(source, targetTypes[i], reportErrors && i === len - 1);
                          if (related) {
                              return related;
                          }
                      }
                      return 0;
                  }
                  function unionTypeRelatedToType(source, target, reportErrors) {
                      var result = -1;
                      var sourceTypes = source.types;
                      for (var _i = 0; _i < sourceTypes.length; _i++) {
                          var sourceType = sourceTypes[_i];
                          var related = isRelatedTo(sourceType, target, reportErrors);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typesRelatedTo(sources, targets, reportErrors) {
                      var result = -1;
                      for (var i = 0, len = sources.length; i < len; i++) {
                          var related = isRelatedTo(sources[i], targets[i], reportErrors);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typeParameterRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          if (source.symbol.name !== target.symbol.name) {
                              return 0;
                          }
                          if (source.constraint === target.constraint) {
                              return -1;
                          }
                          if (source.constraint === noConstraintType || target.constraint === noConstraintType) {
                              return 0;
                          }
                          return isRelatedTo(source.constraint, target.constraint, reportErrors);
                      }
                      else {
                          while (true) {
                              var constraint = getConstraintOfTypeParameter(source);
                              if (constraint === target)
                                  return -1;
                              if (!(constraint && constraint.flags & 512))
                                  break;
                              source = constraint;
                          }
                          return 0;
                      }
                  }
                  function objectTypeRelatedTo(source, target, reportErrors) {
                      if (overflow) {
                          return 0;
                      }
                      var id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
                      var related = relation[id];
                      if (related !== undefined) {
                          if (!elaborateErrors || (related === 3)) {
                              return related === 1 ? -1 : 0;
                          }
                      }
                      if (depth > 0) {
                          for (var i = 0; i < depth; i++) {
                              if (maybeStack[i][id]) {
                                  return 1;
                              }
                          }
                          if (depth === 100) {
                              overflow = true;
                              return 0;
                          }
                      }
                      else {
                          sourceStack = [];
                          targetStack = [];
                          maybeStack = [];
                          expandingFlags = 0;
                      }
                      sourceStack[depth] = source;
                      targetStack[depth] = target;
                      maybeStack[depth] = {};
                      maybeStack[depth][id] = 1;
                      depth++;
                      var saveExpandingFlags = expandingFlags;
                      if (!(expandingFlags & 1) && isDeeplyNestedGeneric(source, sourceStack))
                          expandingFlags |= 1;
                      if (!(expandingFlags & 2) && isDeeplyNestedGeneric(target, targetStack))
                          expandingFlags |= 2;
                      var result;
                      if (expandingFlags === 3) {
                          result = 1;
                      }
                      else {
                          result = propertiesRelatedTo(source, target, reportErrors);
                          if (result) {
                              result &= signaturesRelatedTo(source, target, 0, reportErrors);
                              if (result) {
                                  result &= signaturesRelatedTo(source, target, 1, reportErrors);
                                  if (result) {
                                      result &= stringIndexTypesRelatedTo(source, target, reportErrors);
                                      if (result) {
                                          result &= numberIndexTypesRelatedTo(source, target, reportErrors);
                                      }
                                  }
                              }
                          }
                      }
                      expandingFlags = saveExpandingFlags;
                      depth--;
                      if (result) {
                          var maybeCache = maybeStack[depth];
                          var destinationCache = (result === -1 || depth === 0) ? relation : maybeStack[depth - 1];
                          ts.copyMap(maybeCache, destinationCache);
                      }
                      else {
                          relation[id] = reportErrors ? 3 : 2;
                      }
                      return result;
                  }
                  function isDeeplyNestedGeneric(type, stack) {
                      if (type.flags & 4096 && depth >= 10) {
                          var target_1 = type.target;
                          var count = 0;
                          for (var i = 0; i < depth; i++) {
                              var t = stack[i];
                              if (t.flags & 4096 && t.target === target_1) {
                                  count++;
                                  if (count >= 10)
                                      return true;
                              }
                          }
                      }
                      return false;
                  }
                  function propertiesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return propertiesIdenticalTo(source, target);
                      }
                      var result = -1;
                      var properties = getPropertiesOfObjectType(target);
                      var requireOptionalProperties = relation === subtypeRelation && !(source.flags & 131072);
                      for (var _i = 0; _i < properties.length; _i++) {
                          var targetProp = properties[_i];
                          var sourceProp = getPropertyOfType(source, targetProp.name);
                          if (sourceProp !== targetProp) {
                              if (!sourceProp) {
                                  if (!(targetProp.flags & 536870912) || requireOptionalProperties) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_missing_in_type_1, symbolToString(targetProp), typeToString(source));
                                      }
                                      return 0;
                                  }
                              }
                              else if (!(targetProp.flags & 134217728)) {
                                  var sourceFlags = getDeclarationFlagsFromSymbol(sourceProp);
                                  var targetFlags = getDeclarationFlagsFromSymbol(targetProp);
                                  if (sourceFlags & 32 || targetFlags & 32) {
                                      if (sourceProp.valueDeclaration !== targetProp.valueDeclaration) {
                                          if (reportErrors) {
                                              if (sourceFlags & 32 && targetFlags & 32) {
                                                  reportError(ts.Diagnostics.Types_have_separate_declarations_of_a_private_property_0, symbolToString(targetProp));
                                              }
                                              else {
                                                  reportError(ts.Diagnostics.Property_0_is_private_in_type_1_but_not_in_type_2, symbolToString(targetProp), typeToString(sourceFlags & 32 ? source : target), typeToString(sourceFlags & 32 ? target : source));
                                              }
                                          }
                                          return 0;
                                      }
                                  }
                                  else if (targetFlags & 64) {
                                      var sourceDeclaredInClass = sourceProp.parent && sourceProp.parent.flags & 32;
                                      var sourceClass = sourceDeclaredInClass ? getDeclaredTypeOfSymbol(sourceProp.parent) : undefined;
                                      var targetClass = getDeclaredTypeOfSymbol(targetProp.parent);
                                      if (!sourceClass || !hasBaseType(sourceClass, targetClass)) {
                                          if (reportErrors) {
                                              reportError(ts.Diagnostics.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, symbolToString(targetProp), typeToString(sourceClass || source), typeToString(targetClass));
                                          }
                                          return 0;
                                      }
                                  }
                                  else if (sourceFlags & 64) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_protected_in_type_1_but_public_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
                                      }
                                      return 0;
                                  }
                                  var related = isRelatedTo(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp), reportErrors);
                                  if (!related) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));
                                      }
                                      return 0;
                                  }
                                  result &= related;
                                  if (sourceProp.flags & 536870912 && !(targetProp.flags & 536870912)) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
                                      }
                                      return 0;
                                  }
                              }
                          }
                      }
                      return result;
                  }
                  function propertiesIdenticalTo(source, target) {
                      var sourceProperties = getPropertiesOfObjectType(source);
                      var targetProperties = getPropertiesOfObjectType(target);
                      if (sourceProperties.length !== targetProperties.length) {
                          return 0;
                      }
                      var result = -1;
                      for (var _i = 0; _i < sourceProperties.length; _i++) {
                          var sourceProp = sourceProperties[_i];
                          var targetProp = getPropertyOfObjectType(target, sourceProp.name);
                          if (!targetProp) {
                              return 0;
                          }
                          var related = compareProperties(sourceProp, targetProp, isRelatedTo);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function signaturesRelatedTo(source, target, kind, reportErrors) {
                      if (relation === identityRelation) {
                          return signaturesIdenticalTo(source, target, kind);
                      }
                      if (target === anyFunctionType || source === anyFunctionType) {
                          return -1;
                      }
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      var result = -1;
                      var saveErrorInfo = errorInfo;
                      outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
                          var t = targetSignatures[_i];
                          if (!t.hasStringLiterals || target.flags & 65536) {
                              var localErrors = reportErrors;
                              for (var _a = 0; _a < sourceSignatures.length; _a++) {
                                  var s = sourceSignatures[_a];
                                  if (!s.hasStringLiterals || source.flags & 65536) {
                                      var related = signatureRelatedTo(s, t, localErrors);
                                      if (related) {
                                          result &= related;
                                          errorInfo = saveErrorInfo;
                                          continue outer;
                                      }
                                      localErrors = false;
                                  }
                              }
                              return 0;
                          }
                      }
                      return result;
                  }
                  function signatureRelatedTo(source, target, reportErrors) {
                      if (source === target) {
                          return -1;
                      }
                      if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) {
                          return 0;
                      }
                      var sourceMax = source.parameters.length;
                      var targetMax = target.parameters.length;
                      var checkCount;
                      if (source.hasRestParameter && target.hasRestParameter) {
                          checkCount = sourceMax > targetMax ? sourceMax : targetMax;
                          sourceMax--;
                          targetMax--;
                      }
                      else if (source.hasRestParameter) {
                          sourceMax--;
                          checkCount = targetMax;
                      }
                      else if (target.hasRestParameter) {
                          targetMax--;
                          checkCount = sourceMax;
                      }
                      else {
                          checkCount = sourceMax < targetMax ? sourceMax : targetMax;
                      }
                      source = getErasedSignature(source);
                      target = getErasedSignature(target);
                      var result = -1;
                      for (var i = 0; i < checkCount; i++) {
                          var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
                          var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
                          var saveErrorInfo = errorInfo;
                          var related = isRelatedTo(s_1, t_1, reportErrors);
                          if (!related) {
                              related = isRelatedTo(t_1, s_1, false);
                              if (!related) {
                                  if (reportErrors) {
                                      reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
                                  }
                                  return 0;
                              }
                              errorInfo = saveErrorInfo;
                          }
                          result &= related;
                      }
                      var t = getReturnTypeOfSignature(target);
                      if (t === voidType)
                          return result;
                      var s = getReturnTypeOfSignature(source);
                      return result & isRelatedTo(s, t, reportErrors);
                  }
                  function signaturesIdenticalTo(source, target, kind) {
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      if (sourceSignatures.length !== targetSignatures.length) {
                          return 0;
                      }
                      var result = -1;
                      for (var i = 0, len = sourceSignatures.length; i < len; ++i) {
                          var related = compareSignatures(sourceSignatures[i], targetSignatures[i], true, isRelatedTo);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function stringIndexTypesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return indexTypesIdenticalTo(0, source, target);
                      }
                      var targetType = getIndexTypeOfType(target, 0);
                      if (targetType) {
                          var sourceType = getIndexTypeOfType(source, 0);
                          if (!sourceType) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
                              }
                              return 0;
                          }
                          var related = isRelatedTo(sourceType, targetType, reportErrors);
                          if (!related) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signatures_are_incompatible);
                              }
                              return 0;
                          }
                          return related;
                      }
                      return -1;
                  }
                  function numberIndexTypesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return indexTypesIdenticalTo(1, source, target);
                      }
                      var targetType = getIndexTypeOfType(target, 1);
                      if (targetType) {
                          var sourceStringType = getIndexTypeOfType(source, 0);
                          var sourceNumberType = getIndexTypeOfType(source, 1);
                          if (!(sourceStringType || sourceNumberType)) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
                              }
                              return 0;
                          }
                          var related;
                          if (sourceStringType && sourceNumberType) {
                              related = isRelatedTo(sourceStringType, targetType, false) || isRelatedTo(sourceNumberType, targetType, reportErrors);
                          }
                          else {
                              related = isRelatedTo(sourceStringType || sourceNumberType, targetType, reportErrors);
                          }
                          if (!related) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signatures_are_incompatible);
                              }
                              return 0;
                          }
                          return related;
                      }
                      return -1;
                  }
                  function indexTypesIdenticalTo(indexKind, source, target) {
                      var targetType = getIndexTypeOfType(target, indexKind);
                      var sourceType = getIndexTypeOfType(source, indexKind);
                      if (!sourceType && !targetType) {
                          return -1;
                      }
                      if (sourceType && targetType) {
                          return isRelatedTo(sourceType, targetType);
                      }
                      return 0;
                  }
              }
              function isPropertyIdenticalTo(sourceProp, targetProp) {
                  return compareProperties(sourceProp, targetProp, compareTypes) !== 0;
              }
              function compareProperties(sourceProp, targetProp, compareTypes) {
                  if (sourceProp === targetProp) {
                      return -1;
                  }
                  var sourcePropAccessibility = getDeclarationFlagsFromSymbol(sourceProp) & (32 | 64);
                  var targetPropAccessibility = getDeclarationFlagsFromSymbol(targetProp) & (32 | 64);
                  if (sourcePropAccessibility !== targetPropAccessibility) {
                      return 0;
                  }
                  if (sourcePropAccessibility) {
                      if (getTargetSymbol(sourceProp) !== getTargetSymbol(targetProp)) {
                          return 0;
                      }
                  }
                  else {
                      if ((sourceProp.flags & 536870912) !== (targetProp.flags & 536870912)) {
                          return 0;
                      }
                  }
                  return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
              }
              function compareSignatures(source, target, compareReturnTypes, compareTypes) {
                  if (source === target) {
                      return -1;
                  }
                  if (source.parameters.length !== target.parameters.length ||
                      source.minArgumentCount !== target.minArgumentCount ||
                      source.hasRestParameter !== target.hasRestParameter) {
                      return 0;
                  }
                  var result = -1;
                  if (source.typeParameters && target.typeParameters) {
                      if (source.typeParameters.length !== target.typeParameters.length) {
                          return 0;
                      }
                      for (var i = 0, len = source.typeParameters.length; i < len; ++i) {
                          var related = compareTypes(source.typeParameters[i], target.typeParameters[i]);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                  }
                  else if (source.typeParameters || target.typeParameters) {
                      return 0;
                  }
                  source = getErasedSignature(source);
                  target = getErasedSignature(target);
                  for (var i = 0, len = source.parameters.length; i < len; i++) {
                      var s = source.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
                      var t = target.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
                      var related = compareTypes(s, t);
                      if (!related) {
                          return 0;
                      }
                      result &= related;
                  }
                  if (compareReturnTypes) {
                      result &= compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
                  }
                  return result;
              }
              function isSupertypeOfEach(candidate, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (candidate !== type && !isTypeSubtypeOf(type, candidate))
                          return false;
                  }
                  return true;
              }
              function getCommonSupertype(types) {
                  return ts.forEach(types, function (t) { return isSupertypeOfEach(t, types) ? t : undefined; });
              }
              function reportNoCommonSupertypeError(types, errorLocation, errorMessageChainHead) {
                  var bestSupertype;
                  var bestSupertypeDownfallType;
                  var bestSupertypeScore = 0;
                  for (var i = 0; i < types.length; i++) {
                      var score = 0;
                      var downfallType = undefined;
                      for (var j = 0; j < types.length; j++) {
                          if (isTypeSubtypeOf(types[j], types[i])) {
                              score++;
                          }
                          else if (!downfallType) {
                              downfallType = types[j];
                          }
                      }
                      ts.Debug.assert(!!downfallType, "If there is no common supertype, each type should have a downfallType");
                      if (score > bestSupertypeScore) {
                          bestSupertype = types[i];
                          bestSupertypeDownfallType = downfallType;
                          bestSupertypeScore = score;
                      }
                      if (bestSupertypeScore === types.length - 1) {
                          break;
                      }
                  }
                  checkTypeSubtypeOf(bestSupertypeDownfallType, bestSupertype, errorLocation, ts.Diagnostics.Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0, errorMessageChainHead);
              }
              function isArrayType(type) {
                  return type.flags & 4096 && type.target === globalArrayType;
              }
              function isArrayLikeType(type) {
                  return !(type.flags & (32 | 64)) && isTypeAssignableTo(type, anyArrayType);
              }
              function isTupleLikeType(type) {
                  return !!getPropertyOfType(type, "0");
              }
              function isTupleType(type) {
                  return (type.flags & 8192) && !!type.elementTypes;
              }
              function getWidenedTypeOfObjectLiteral(type) {
                  var properties = getPropertiesOfObjectType(type);
                  var members = {};
                  ts.forEach(properties, function (p) {
                      var propType = getTypeOfSymbol(p);
                      var widenedType = getWidenedType(propType);
                      if (propType !== widenedType) {
                          var symbol = createSymbol(p.flags | 67108864, p.name);
                          symbol.declarations = p.declarations;
                          symbol.parent = p.parent;
                          symbol.type = widenedType;
                          symbol.target = p;
                          if (p.valueDeclaration)
                              symbol.valueDeclaration = p.valueDeclaration;
                          p = symbol;
                      }
                      members[p.name] = p;
                  });
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType)
                      stringIndexType = getWidenedType(stringIndexType);
                  if (numberIndexType)
                      numberIndexType = getWidenedType(numberIndexType);
                  return createAnonymousType(type.symbol, members, emptyArray, emptyArray, stringIndexType, numberIndexType);
              }
              function getWidenedType(type) {
                  if (type.flags & 786432) {
                      if (type.flags & (32 | 64)) {
                          return anyType;
                      }
                      if (type.flags & 131072) {
                          return getWidenedTypeOfObjectLiteral(type);
                      }
                      if (type.flags & 16384) {
                          return getUnionType(ts.map(type.types, getWidenedType));
                      }
                      if (isArrayType(type)) {
                          return createArrayType(getWidenedType(type.typeArguments[0]));
                      }
                  }
                  return type;
              }
              function reportWideningErrorsInType(type) {
                  if (type.flags & 16384) {
                      var errorReported = false;
                      ts.forEach(type.types, function (t) {
                          if (reportWideningErrorsInType(t)) {
                              errorReported = true;
                          }
                      });
                      return errorReported;
                  }
                  if (isArrayType(type)) {
                      return reportWideningErrorsInType(type.typeArguments[0]);
                  }
                  if (type.flags & 131072) {
                      var errorReported = false;
                      ts.forEach(getPropertiesOfObjectType(type), function (p) {
                          var t = getTypeOfSymbol(p);
                          if (t.flags & 262144) {
                              if (!reportWideningErrorsInType(t)) {
                                  error(p.valueDeclaration, ts.Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
                              }
                              errorReported = true;
                          }
                      });
                      return errorReported;
                  }
                  return false;
              }
              function reportImplicitAnyError(declaration, type) {
                  var typeAsString = typeToString(getWidenedType(type));
                  var diagnostic;
                  switch (declaration.kind) {
                      case 133:
                      case 132:
                          diagnostic = ts.Diagnostics.Member_0_implicitly_has_an_1_type;
                          break;
                      case 130:
                          diagnostic = declaration.dotDotDotToken ?
                              ts.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type :
                              ts.Diagnostics.Parameter_0_implicitly_has_an_1_type;
                          break;
                      case 201:
                      case 135:
                      case 134:
                      case 137:
                      case 138:
                      case 163:
                      case 164:
                          if (!declaration.name) {
                              error(declaration, ts.Diagnostics.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
                              return;
                          }
                          diagnostic = ts.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type;
                          break;
                      default:
                          diagnostic = ts.Diagnostics.Variable_0_implicitly_has_an_1_type;
                  }
                  error(declaration, diagnostic, ts.declarationNameToString(declaration.name), typeAsString);
              }
              function reportErrorsFromWidening(declaration, type) {
                  if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & 262144) {
                      if (!reportWideningErrorsInType(type)) {
                          reportImplicitAnyError(declaration, type);
                      }
                  }
              }
              function forEachMatchingParameterType(source, target, callback) {
                  var sourceMax = source.parameters.length;
                  var targetMax = target.parameters.length;
                  var count;
                  if (source.hasRestParameter && target.hasRestParameter) {
                      count = sourceMax > targetMax ? sourceMax : targetMax;
                      sourceMax--;
                      targetMax--;
                  }
                  else if (source.hasRestParameter) {
                      sourceMax--;
                      count = targetMax;
                  }
                  else if (target.hasRestParameter) {
                      targetMax--;
                      count = sourceMax;
                  }
                  else {
                      count = sourceMax < targetMax ? sourceMax : targetMax;
                  }
                  for (var i = 0; i < count; i++) {
                      var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
                      var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
                      callback(s, t);
                  }
              }
              function createInferenceContext(typeParameters, inferUnionTypes) {
                  var inferences = [];
                  for (var _i = 0; _i < typeParameters.length; _i++) {
                      var unused = typeParameters[_i];
                      inferences.push({ primary: undefined, secondary: undefined, isFixed: false });
                  }
                  return {
                      typeParameters: typeParameters,
                      inferUnionTypes: inferUnionTypes,
                      inferences: inferences,
                      inferredTypes: new Array(typeParameters.length)
                  };
              }
              function inferTypes(context, source, target) {
                  var sourceStack;
                  var targetStack;
                  var depth = 0;
                  var inferiority = 0;
                  inferFromTypes(source, target);
                  function isInProcess(source, target) {
                      for (var i = 0; i < depth; i++) {
                          if (source === sourceStack[i] && target === targetStack[i]) {
                              return true;
                          }
                      }
                      return false;
                  }
                  function isWithinDepthLimit(type, stack) {
                      if (depth >= 5) {
                          var target_2 = type.target;
                          var count = 0;
                          for (var i = 0; i < depth; i++) {
                              var t = stack[i];
                              if (t.flags & 4096 && t.target === target_2) {
                                  count++;
                              }
                          }
                          return count < 5;
                      }
                      return true;
                  }
                  function inferFromTypes(source, target) {
                      if (source === anyFunctionType) {
                          return;
                      }
                      if (target.flags & 512) {
                          var typeParameters = context.typeParameters;
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (target === typeParameters[i]) {
                                  var inferences = context.inferences[i];
                                  if (!inferences.isFixed) {
                                      var candidates = inferiority ?
                                          inferences.secondary || (inferences.secondary = []) :
                                          inferences.primary || (inferences.primary = []);
                                      if (!ts.contains(candidates, source)) {
                                          candidates.push(source);
                                      }
                                  }
                                  return;
                              }
                          }
                      }
                      else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
                          var sourceTypes = source.typeArguments;
                          var targetTypes = target.typeArguments;
                          for (var i = 0; i < sourceTypes.length; i++) {
                              inferFromTypes(sourceTypes[i], targetTypes[i]);
                          }
                      }
                      else if (target.flags & 16384) {
                          var targetTypes = target.types;
                          var typeParameterCount = 0;
                          var typeParameter;
                          for (var _i = 0; _i < targetTypes.length; _i++) {
                              var t = targetTypes[_i];
                              if (t.flags & 512 && ts.contains(context.typeParameters, t)) {
                                  typeParameter = t;
                                  typeParameterCount++;
                              }
                              else {
                                  inferFromTypes(source, t);
                              }
                          }
                          if (typeParameterCount === 1) {
                              inferiority++;
                              inferFromTypes(source, typeParameter);
                              inferiority--;
                          }
                      }
                      else if (source.flags & 16384) {
                          var sourceTypes = source.types;
                          for (var _a = 0; _a < sourceTypes.length; _a++) {
                              var sourceType = sourceTypes[_a];
                              inferFromTypes(sourceType, target);
                          }
                      }
                      else if (source.flags & 48128 && (target.flags & (4096 | 8192) ||
                          (target.flags & 32768) && target.symbol && target.symbol.flags & (8192 | 2048))) {
                          if (!isInProcess(source, target) && isWithinDepthLimit(source, sourceStack) && isWithinDepthLimit(target, targetStack)) {
                              if (depth === 0) {
                                  sourceStack = [];
                                  targetStack = [];
                              }
                              sourceStack[depth] = source;
                              targetStack[depth] = target;
                              depth++;
                              inferFromProperties(source, target);
                              inferFromSignatures(source, target, 0);
                              inferFromSignatures(source, target, 1);
                              inferFromIndexTypes(source, target, 0, 0);
                              inferFromIndexTypes(source, target, 1, 1);
                              inferFromIndexTypes(source, target, 0, 1);
                              depth--;
                          }
                      }
                  }
                  function inferFromProperties(source, target) {
                      var properties = getPropertiesOfObjectType(target);
                      for (var _i = 0; _i < properties.length; _i++) {
                          var targetProp = properties[_i];
                          var sourceProp = getPropertyOfObjectType(source, targetProp.name);
                          if (sourceProp) {
                              inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
                          }
                      }
                  }
                  function inferFromSignatures(source, target, kind) {
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      var sourceLen = sourceSignatures.length;
                      var targetLen = targetSignatures.length;
                      var len = sourceLen < targetLen ? sourceLen : targetLen;
                      for (var i = 0; i < len; i++) {
                          inferFromSignature(getErasedSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i]));
                      }
                  }
                  function inferFromSignature(source, target) {
                      forEachMatchingParameterType(source, target, inferFromTypes);
                      inferFromTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
                  }
                  function inferFromIndexTypes(source, target, sourceKind, targetKind) {
                      var targetIndexType = getIndexTypeOfType(target, targetKind);
                      if (targetIndexType) {
                          var sourceIndexType = getIndexTypeOfType(source, sourceKind);
                          if (sourceIndexType) {
                              inferFromTypes(sourceIndexType, targetIndexType);
                          }
                      }
                  }
              }
              function getInferenceCandidates(context, index) {
                  var inferences = context.inferences[index];
                  return inferences.primary || inferences.secondary || emptyArray;
              }
              function getInferredType(context, index) {
                  var inferredType = context.inferredTypes[index];
                  var inferenceSucceeded;
                  if (!inferredType) {
                      var inferences = getInferenceCandidates(context, index);
                      if (inferences.length) {
                          var unionOrSuperType = context.inferUnionTypes ? getUnionType(inferences) : getCommonSupertype(inferences);
                          inferredType = unionOrSuperType ? getWidenedType(unionOrSuperType) : unknownType;
                          inferenceSucceeded = !!unionOrSuperType;
                      }
                      else {
                          inferredType = emptyObjectType;
                          inferenceSucceeded = true;
                      }
                      if (inferenceSucceeded) {
                          var constraint = getConstraintOfTypeParameter(context.typeParameters[index]);
                          inferredType = constraint && !isTypeAssignableTo(inferredType, constraint) ? constraint : inferredType;
                      }
                      else if (context.failedTypeParameterIndex === undefined || context.failedTypeParameterIndex > index) {
                          context.failedTypeParameterIndex = index;
                      }
                      context.inferredTypes[index] = inferredType;
                  }
                  return inferredType;
              }
              function getInferredTypes(context) {
                  for (var i = 0; i < context.inferredTypes.length; i++) {
                      getInferredType(context, i);
                  }
                  return context.inferredTypes;
              }
              function hasAncestor(node, kind) {
                  return ts.getAncestor(node, kind) !== undefined;
              }
              function getResolvedSymbol(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedSymbol) {
                      links.resolvedSymbol = (!ts.nodeIsMissing(node) && resolveName(node, node.text, 107455 | 1048576, ts.Diagnostics.Cannot_find_name_0, node)) || unknownSymbol;
                  }
                  return links.resolvedSymbol;
              }
              function isInTypeQuery(node) {
                  while (node) {
                      switch (node.kind) {
                          case 145:
                              return true;
                          case 65:
                          case 127:
                              node = node.parent;
                              continue;
                          default:
                              return false;
                      }
                  }
                  ts.Debug.fail("should not get here");
              }
              function removeTypesFromUnionType(type, typeKind, isOfTypeKind, allowEmptyUnionResult) {
                  if (type.flags & 16384) {
                      var types = type.types;
                      if (ts.forEach(types, function (t) { return !!(t.flags & typeKind) === isOfTypeKind; })) {
                          var narrowedType = getUnionType(ts.filter(types, function (t) { return !(t.flags & typeKind) === isOfTypeKind; }));
                          if (allowEmptyUnionResult || narrowedType !== emptyObjectType) {
                              return narrowedType;
                          }
                      }
                  }
                  else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) {
                      return getUnionType(emptyArray);
                  }
                  return type;
              }
              function hasInitializer(node) {
                  return !!(node.initializer || ts.isBindingPattern(node.parent) && hasInitializer(node.parent.parent));
              }
              function isVariableAssignedWithin(symbol, node) {
                  var links = getNodeLinks(node);
                  if (links.assignmentChecks) {
                      var cachedResult = links.assignmentChecks[symbol.id];
                      if (cachedResult !== undefined) {
                          return cachedResult;
                      }
                  }
                  else {
                      links.assignmentChecks = {};
                  }
                  return links.assignmentChecks[symbol.id] = isAssignedIn(node);
                  function isAssignedInBinaryExpression(node) {
                      if (node.operatorToken.kind >= 53 && node.operatorToken.kind <= 64) {
                          var n = node.left;
                          while (n.kind === 162) {
                              n = n.expression;
                          }
                          if (n.kind === 65 && getResolvedSymbol(n) === symbol) {
                              return true;
                          }
                      }
                      return ts.forEachChild(node, isAssignedIn);
                  }
                  function isAssignedInVariableDeclaration(node) {
                      if (!ts.isBindingPattern(node.name) && getSymbolOfNode(node) === symbol && hasInitializer(node)) {
                          return true;
                      }
                      return ts.forEachChild(node, isAssignedIn);
                  }
                  function isAssignedIn(node) {
                      switch (node.kind) {
                          case 170:
                              return isAssignedInBinaryExpression(node);
                          case 199:
                          case 153:
                              return isAssignedInVariableDeclaration(node);
                          case 151:
                          case 152:
                          case 154:
                          case 155:
                          case 156:
                          case 157:
                          case 158:
                          case 159:
                          case 161:
                          case 162:
                          case 168:
                          case 165:
                          case 166:
                          case 167:
                          case 169:
                          case 171:
                          case 174:
                          case 180:
                          case 181:
                          case 183:
                          case 184:
                          case 185:
                          case 186:
                          case 187:
                          case 188:
                          case 189:
                          case 192:
                          case 193:
                          case 194:
                          case 221:
                          case 222:
                          case 195:
                          case 196:
                          case 197:
                          case 224:
                              return ts.forEachChild(node, isAssignedIn);
                      }
                      return false;
                  }
              }
              function resolveLocation(node) {
                  var containerNodes = [];
                  for (var parent_3 = node.parent; parent_3; parent_3 = parent_3.parent) {
                      if ((ts.isExpression(parent_3) || ts.isObjectLiteralMethod(node)) &&
                          isContextSensitive(parent_3)) {
                          containerNodes.unshift(parent_3);
                      }
                  }
                  ts.forEach(containerNodes, function (node) { getTypeOfNode(node); });
              }
              function getSymbolAtLocation(node) {
                  resolveLocation(node);
                  return getSymbolInfo(node);
              }
              function getTypeAtLocation(node) {
                  resolveLocation(node);
                  return getTypeOfNode(node);
              }
              function getTypeOfSymbolAtLocation(symbol, node) {
                  resolveLocation(node);
                  return getNarrowedTypeOfSymbol(symbol, node);
              }
              function getNarrowedTypeOfSymbol(symbol, node) {
                  var type = getTypeOfSymbol(symbol);
                  if (node && symbol.flags & 3 && type.flags & (1 | 48128 | 16384 | 512)) {
                      loop: while (node.parent) {
                          var child = node;
                          node = node.parent;
                          var narrowedType = type;
                          switch (node.kind) {
                              case 184:
                                  if (child !== node.expression) {
                                      narrowedType = narrowType(type, node.expression, child === node.thenStatement);
                                  }
                                  break;
                              case 171:
                                  if (child !== node.condition) {
                                      narrowedType = narrowType(type, node.condition, child === node.whenTrue);
                                  }
                                  break;
                              case 170:
                                  if (child === node.right) {
                                      if (node.operatorToken.kind === 48) {
                                          narrowedType = narrowType(type, node.left, true);
                                      }
                                      else if (node.operatorToken.kind === 49) {
                                          narrowedType = narrowType(type, node.left, false);
                                      }
                                  }
                                  break;
                              case 228:
                              case 206:
                              case 201:
                              case 135:
                              case 134:
                              case 137:
                              case 138:
                              case 136:
                                  break loop;
                          }
                          if (narrowedType !== type) {
                              if (isVariableAssignedWithin(symbol, node)) {
                                  break;
                              }
                              type = narrowedType;
                          }
                      }
                  }
                  return type;
                  function narrowTypeByEquality(type, expr, assumeTrue) {
                      if (expr.left.kind !== 166 || expr.right.kind !== 8) {
                          return type;
                      }
                      var left = expr.left;
                      var right = expr.right;
                      if (left.expression.kind !== 65 || getResolvedSymbol(left.expression) !== symbol) {
                          return type;
                      }
                      var typeInfo = primitiveTypeInfo[right.text];
                      if (expr.operatorToken.kind === 31) {
                          assumeTrue = !assumeTrue;
                      }
                      if (assumeTrue) {
                          if (!typeInfo) {
                              return removeTypesFromUnionType(type, 258 | 132 | 8 | 1048576, true, false);
                          }
                          if (isTypeSubtypeOf(typeInfo.type, type)) {
                              return typeInfo.type;
                          }
                          return removeTypesFromUnionType(type, typeInfo.flags, false, false);
                      }
                      else {
                          if (typeInfo) {
                              return removeTypesFromUnionType(type, typeInfo.flags, true, false);
                          }
                          return type;
                      }
                  }
                  function narrowTypeByAnd(type, expr, assumeTrue) {
                      if (assumeTrue) {
                          return narrowType(narrowType(type, expr.left, true), expr.right, true);
                      }
                      else {
                          return getUnionType([
                              narrowType(type, expr.left, false),
                              narrowType(narrowType(type, expr.left, true), expr.right, false)
                          ]);
                      }
                  }
                  function narrowTypeByOr(type, expr, assumeTrue) {
                      if (assumeTrue) {
                          return getUnionType([
                              narrowType(type, expr.left, true),
                              narrowType(narrowType(type, expr.left, false), expr.right, true)
                          ]);
                      }
                      else {
                          return narrowType(narrowType(type, expr.left, false), expr.right, false);
                      }
                  }
                  function narrowTypeByInstanceof(type, expr, assumeTrue) {
                      if (type.flags & 1 || !assumeTrue || expr.left.kind !== 65 || getResolvedSymbol(expr.left) !== symbol) {
                          return type;
                      }
                      var rightType = checkExpression(expr.right);
                      if (!isTypeSubtypeOf(rightType, globalFunctionType)) {
                          return type;
                      }
                      var targetType;
                      var prototypeProperty = getPropertyOfType(rightType, "prototype");
                      if (prototypeProperty) {
                          var prototypePropertyType = getTypeOfSymbol(prototypeProperty);
                          if (prototypePropertyType !== anyType) {
                              targetType = prototypePropertyType;
                          }
                      }
                      if (!targetType) {
                          var constructSignatures;
                          if (rightType.flags & 2048) {
                              constructSignatures = resolveDeclaredMembers(rightType).declaredConstructSignatures;
                          }
                          else if (rightType.flags & 32768) {
                              constructSignatures = getSignaturesOfType(rightType, 1);
                          }
                          if (constructSignatures && constructSignatures.length) {
                              targetType = getUnionType(ts.map(constructSignatures, function (signature) { return getReturnTypeOfSignature(getErasedSignature(signature)); }));
                          }
                      }
                      if (targetType) {
                          if (isTypeSubtypeOf(targetType, type)) {
                              return targetType;
                          }
                          if (type.flags & 16384) {
                              return getUnionType(ts.filter(type.types, function (t) { return isTypeSubtypeOf(t, targetType); }));
                          }
                      }
                      return type;
                  }
                  function narrowType(type, expr, assumeTrue) {
                      switch (expr.kind) {
                          case 162:
                              return narrowType(type, expr.expression, assumeTrue);
                          case 170:
                              var operator = expr.operatorToken.kind;
                              if (operator === 30 || operator === 31) {
                                  return narrowTypeByEquality(type, expr, assumeTrue);
                              }
                              else if (operator === 48) {
                                  return narrowTypeByAnd(type, expr, assumeTrue);
                              }
                              else if (operator === 49) {
                                  return narrowTypeByOr(type, expr, assumeTrue);
                              }
                              else if (operator === 87) {
                                  return narrowTypeByInstanceof(type, expr, assumeTrue);
                              }
                              break;
                          case 168:
                              if (expr.operator === 46) {
                                  return narrowType(type, expr.operand, !assumeTrue);
                              }
                              break;
                      }
                      return type;
                  }
              }
              function checkIdentifier(node) {
                  var symbol = getResolvedSymbol(node);
                  if (symbol === argumentsSymbol && ts.getContainingFunction(node).kind === 164 && languageVersion < 2) {
                      error(node, ts.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
                  }
                  if (symbol.flags & 8388608 && !isInTypeQuery(node) && !isConstEnumOrConstEnumOnlyModule(resolveAlias(symbol))) {
                      markAliasSymbolAsReferenced(symbol);
                  }
                  checkCollisionWithCapturedSuperVariable(node, node);
                  checkCollisionWithCapturedThisVariable(node, node);
                  checkBlockScopedBindingCapturedInLoop(node, symbol);
                  return getNarrowedTypeOfSymbol(getExportSymbolOfValueSymbolIfExported(symbol), node);
              }
              function isInsideFunction(node, threshold) {
                  var current = node;
                  while (current && current !== threshold) {
                      if (ts.isFunctionLike(current)) {
                          return true;
                      }
                      current = current.parent;
                  }
                  return false;
              }
              function checkBlockScopedBindingCapturedInLoop(node, symbol) {
                  if (languageVersion >= 2 ||
                      (symbol.flags & 2) === 0 ||
                      symbol.valueDeclaration.parent.kind === 224) {
                      return;
                  }
                  var container = symbol.valueDeclaration;
                  while (container.kind !== 200) {
                      container = container.parent;
                  }
                  container = container.parent;
                  if (container.kind === 181) {
                      container = container.parent;
                  }
                  var inFunction = isInsideFunction(node.parent, container);
                  var current = container;
                  while (current && !ts.nodeStartsNewLexicalEnvironment(current)) {
                      if (isIterationStatement(current, false)) {
                          if (inFunction) {
                              grammarErrorOnFirstToken(current, ts.Diagnostics.Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher, ts.declarationNameToString(node));
                          }
                          getNodeLinks(symbol.valueDeclaration).flags |= 256;
                          break;
                      }
                      current = current.parent;
                  }
              }
              function captureLexicalThis(node, container) {
                  var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
                  getNodeLinks(node).flags |= 2;
                  if (container.kind === 133 || container.kind === 136) {
                      getNodeLinks(classNode).flags |= 4;
                  }
                  else {
                      getNodeLinks(container).flags |= 4;
                  }
              }
              function checkThisExpression(node) {
                  var container = ts.getThisContainer(node, true);
                  var needToCaptureLexicalThis = false;
                  if (container.kind === 164) {
                      container = ts.getThisContainer(container, false);
                      needToCaptureLexicalThis = (languageVersion < 2);
                  }
                  switch (container.kind) {
                      case 206:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_module_or_namespace_body);
                          break;
                      case 205:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
                          break;
                      case 136:
                          if (isInConstructorArgumentInitializer(node, container)) {
                              error(node, ts.Diagnostics.this_cannot_be_referenced_in_constructor_arguments);
                          }
                          break;
                      case 133:
                      case 132:
                          if (container.flags & 128) {
                              error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_static_property_initializer);
                          }
                          break;
                      case 128:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_computed_property_name);
                          break;
                  }
                  if (needToCaptureLexicalThis) {
                      captureLexicalThis(node, container);
                  }
                  var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
                  if (classNode) {
                      var symbol = getSymbolOfNode(classNode);
                      return container.flags & 128 ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol);
                  }
                  return anyType;
              }
              function isInConstructorArgumentInitializer(node, constructorDecl) {
                  for (var n = node; n && n !== constructorDecl; n = n.parent) {
                      if (n.kind === 130) {
                          return true;
                      }
                  }
                  return false;
              }
              function checkSuperExpression(node) {
                  var isCallExpression = node.parent.kind === 158 && node.parent.expression === node;
                  var enclosingClass = ts.getAncestor(node, 202);
                  var baseClass;
                  if (enclosingClass && ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
                      var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClass));
                      var baseTypes = getBaseTypes(classType);
                      baseClass = baseTypes.length && baseTypes[0];
                  }
                  if (!baseClass) {
                      error(node, ts.Diagnostics.super_can_only_be_referenced_in_a_derived_class);
                      return unknownType;
                  }
                  var container = ts.getSuperContainer(node, true);
                  if (container) {
                      var canUseSuperExpression = false;
                      var needToCaptureLexicalThis;
                      if (isCallExpression) {
                          canUseSuperExpression = container.kind === 136;
                      }
                      else {
                          needToCaptureLexicalThis = false;
                          while (container && container.kind === 164) {
                              container = ts.getSuperContainer(container, true);
                              needToCaptureLexicalThis = languageVersion < 2;
                          }
                          if (container && container.parent && container.parent.kind === 202) {
                              if (container.flags & 128) {
                                  canUseSuperExpression =
                                      container.kind === 135 ||
                                          container.kind === 134 ||
                                          container.kind === 137 ||
                                          container.kind === 138;
                              }
                              else {
                                  canUseSuperExpression =
                                      container.kind === 135 ||
                                          container.kind === 134 ||
                                          container.kind === 137 ||
                                          container.kind === 138 ||
                                          container.kind === 133 ||
                                          container.kind === 132 ||
                                          container.kind === 136;
                              }
                          }
                      }
                      if (canUseSuperExpression) {
                          var returnType;
                          if ((container.flags & 128) || isCallExpression) {
                              getNodeLinks(node).flags |= 32;
                              returnType = getTypeOfSymbol(baseClass.symbol);
                          }
                          else {
                              getNodeLinks(node).flags |= 16;
                              returnType = baseClass;
                          }
                          if (container.kind === 136 && isInConstructorArgumentInitializer(node, container)) {
                              error(node, ts.Diagnostics.super_cannot_be_referenced_in_constructor_arguments);
                              returnType = unknownType;
                          }
                          if (!isCallExpression && needToCaptureLexicalThis) {
                              captureLexicalThis(node.parent, container);
                          }
                          return returnType;
                      }
                  }
                  if (container && container.kind === 128) {
                      error(node, ts.Diagnostics.super_cannot_be_referenced_in_a_computed_property_name);
                  }
                  else if (isCallExpression) {
                      error(node, ts.Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors);
                  }
                  else {
                      error(node, ts.Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class);
                  }
                  return unknownType;
              }
              function getContextuallyTypedParameterType(parameter) {
                  if (isFunctionExpressionOrArrowFunction(parameter.parent)) {
                      var func = parameter.parent;
                      if (isContextSensitive(func)) {
                          var contextualSignature = getContextualSignature(func);
                          if (contextualSignature) {
                              var funcHasRestParameters = ts.hasRestParameters(func);
                              var len = func.parameters.length - (funcHasRestParameters ? 1 : 0);
                              var indexOfParameter = ts.indexOf(func.parameters, parameter);
                              if (indexOfParameter < len) {
                                  return getTypeAtPosition(contextualSignature, indexOfParameter);
                              }
                              if (indexOfParameter === (func.parameters.length - 1) &&
                                  funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
                                  return getTypeOfSymbol(ts.lastOrUndefined(contextualSignature.parameters));
                              }
                          }
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForInitializerExpression(node) {
                  var declaration = node.parent;
                  if (node === declaration.initializer) {
                      if (declaration.type) {
                          return getTypeFromTypeNode(declaration.type);
                      }
                      if (declaration.kind === 130) {
                          var type = getContextuallyTypedParameterType(declaration);
                          if (type) {
                              return type;
                          }
                      }
                      if (ts.isBindingPattern(declaration.name)) {
                          return getTypeFromBindingPattern(declaration.name);
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForReturnExpression(node) {
                  var func = ts.getContainingFunction(node);
                  if (func) {
                      if (func.type || func.kind === 136 || func.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(func.symbol, 138))) {
                          return getReturnTypeOfSignature(getSignatureFromDeclaration(func));
                      }
                      var signature = getContextualSignatureForFunctionLikeDeclaration(func);
                      if (signature) {
                          return getReturnTypeOfSignature(signature);
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForArgument(callTarget, arg) {
                  var args = getEffectiveCallArguments(callTarget);
                  var argIndex = ts.indexOf(args, arg);
                  if (argIndex >= 0) {
                      var signature = getResolvedSignature(callTarget);
                      return getTypeAtPosition(signature, argIndex);
                  }
                  return undefined;
              }
              function getContextualTypeForSubstitutionExpression(template, substitutionExpression) {
                  if (template.parent.kind === 160) {
                      return getContextualTypeForArgument(template.parent, substitutionExpression);
                  }
                  return undefined;
              }
              function getContextualTypeForBinaryOperand(node) {
                  var binaryExpression = node.parent;
                  var operator = binaryExpression.operatorToken.kind;
                  if (operator >= 53 && operator <= 64) {
                      if (node === binaryExpression.right) {
                          return checkExpression(binaryExpression.left);
                      }
                  }
                  else if (operator === 49) {
                      var type = getContextualType(binaryExpression);
                      if (!type && node === binaryExpression.right) {
                          type = checkExpression(binaryExpression.left);
                      }
                      return type;
                  }
                  return undefined;
              }
              function applyToContextualType(type, mapper) {
                  if (!(type.flags & 16384)) {
                      return mapper(type);
                  }
                  var types = type.types;
                  var mappedType;
                  var mappedTypes;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      var t = mapper(current);
                      if (t) {
                          if (!mappedType) {
                              mappedType = t;
                          }
                          else if (!mappedTypes) {
                              mappedTypes = [mappedType, t];
                          }
                          else {
                              mappedTypes.push(t);
                          }
                      }
                  }
                  return mappedTypes ? getUnionType(mappedTypes) : mappedType;
              }
              function getTypeOfPropertyOfContextualType(type, name) {
                  return applyToContextualType(type, function (t) {
                      var prop = getPropertyOfObjectType(t, name);
                      return prop ? getTypeOfSymbol(prop) : undefined;
                  });
              }
              function getIndexTypeOfContextualType(type, kind) {
                  return applyToContextualType(type, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); });
              }
              function contextualTypeIsTupleLikeType(type) {
                  return !!(type.flags & 16384 ? ts.forEach(type.types, isTupleLikeType) : isTupleLikeType(type));
              }
              function contextualTypeHasIndexSignature(type, kind) {
                  return !!(type.flags & 16384 ? ts.forEach(type.types, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); }) : getIndexTypeOfObjectOrUnionType(type, kind));
              }
              function getContextualTypeForObjectLiteralMethod(node) {
                  ts.Debug.assert(ts.isObjectLiteralMethod(node));
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  return getContextualTypeForObjectLiteralElement(node);
              }
              function getContextualTypeForObjectLiteralElement(element) {
                  var objectLiteral = element.parent;
                  var type = getContextualType(objectLiteral);
                  if (type) {
                      if (!ts.hasDynamicName(element)) {
                          var symbolName = getSymbolOfNode(element).name;
                          var propertyType = getTypeOfPropertyOfContextualType(type, symbolName);
                          if (propertyType) {
                              return propertyType;
                          }
                      }
                      return isNumericName(element.name) && getIndexTypeOfContextualType(type, 1) ||
                          getIndexTypeOfContextualType(type, 0);
                  }
                  return undefined;
              }
              function getContextualTypeForElementExpression(node) {
                  var arrayLiteral = node.parent;
                  var type = getContextualType(arrayLiteral);
                  if (type) {
                      var index = ts.indexOf(arrayLiteral.elements, node);
                      return getTypeOfPropertyOfContextualType(type, "" + index)
                          || getIndexTypeOfContextualType(type, 1)
                          || (languageVersion >= 2 ? checkIteratedType(type, undefined) : undefined);
                  }
                  return undefined;
              }
              function getContextualTypeForConditionalOperand(node) {
                  var conditional = node.parent;
                  return node === conditional.whenTrue || node === conditional.whenFalse ? getContextualType(conditional) : undefined;
              }
              function getContextualType(node) {
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  if (node.contextualType) {
                      return node.contextualType;
                  }
                  var parent = node.parent;
                  switch (parent.kind) {
                      case 199:
                      case 130:
                      case 133:
                      case 132:
                      case 153:
                          return getContextualTypeForInitializerExpression(node);
                      case 164:
                      case 192:
                          return getContextualTypeForReturnExpression(node);
                      case 158:
                      case 159:
                          return getContextualTypeForArgument(parent, node);
                      case 161:
                          return getTypeFromTypeNode(parent.type);
                      case 170:
                          return getContextualTypeForBinaryOperand(node);
                      case 225:
                          return getContextualTypeForObjectLiteralElement(parent);
                      case 154:
                          return getContextualTypeForElementExpression(node);
                      case 171:
                          return getContextualTypeForConditionalOperand(node);
                      case 178:
                          ts.Debug.assert(parent.parent.kind === 172);
                          return getContextualTypeForSubstitutionExpression(parent.parent, node);
                      case 162:
                          return getContextualType(parent);
                  }
                  return undefined;
              }
              function getNonGenericSignature(type) {
                  var signatures = getSignaturesOfObjectOrUnionType(type, 0);
                  if (signatures.length === 1) {
                      var signature = signatures[0];
                      if (!signature.typeParameters) {
                          return signature;
                      }
                  }
              }
              function isFunctionExpressionOrArrowFunction(node) {
                  return node.kind === 163 || node.kind === 164;
              }
              function getContextualSignatureForFunctionLikeDeclaration(node) {
                  return isFunctionExpressionOrArrowFunction(node) ? getContextualSignature(node) : undefined;
              }
              function getContextualSignature(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  var type = ts.isObjectLiteralMethod(node)
                      ? getContextualTypeForObjectLiteralMethod(node)
                      : getContextualType(node);
                  if (!type) {
                      return undefined;
                  }
                  if (!(type.flags & 16384)) {
                      return getNonGenericSignature(type);
                  }
                  var signatureList;
                  var types = type.types;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      if (signatureList &&
                          getSignaturesOfObjectOrUnionType(current, 0).length > 1) {
                          return undefined;
                      }
                      var signature = getNonGenericSignature(current);
                      if (signature) {
                          if (!signatureList) {
                              signatureList = [signature];
                          }
                          else if (!compareSignatures(signatureList[0], signature, false, compareTypes)) {
                              return undefined;
                          }
                          else {
                              signatureList.push(signature);
                          }
                      }
                  }
                  var result;
                  if (signatureList) {
                      result = cloneSignature(signatureList[0]);
                      result.resolvedReturnType = undefined;
                      result.unionSignatures = signatureList;
                  }
                  return result;
              }
              function isInferentialContext(mapper) {
                  return mapper && mapper !== identityMapper;
              }
              function isAssignmentTarget(node) {
                  var parent = node.parent;
                  if (parent.kind === 170 && parent.operatorToken.kind === 53 && parent.left === node) {
                      return true;
                  }
                  if (parent.kind === 225) {
                      return isAssignmentTarget(parent.parent);
                  }
                  if (parent.kind === 154) {
                      return isAssignmentTarget(parent);
                  }
                  return false;
              }
              function checkSpreadElementExpression(node, contextualMapper) {
                  var arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper);
                  return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, false);
              }
              function checkArrayLiteral(node, contextualMapper) {
                  var elements = node.elements;
                  if (!elements.length) {
                      return createArrayType(undefinedType);
                  }
                  var hasSpreadElement = false;
                  var elementTypes = [];
                  var inDestructuringPattern = isAssignmentTarget(node);
                  for (var _i = 0; _i < elements.length; _i++) {
                      var e = elements[_i];
                      if (inDestructuringPattern && e.kind === 174) {
                          var restArrayType = checkExpression(e.expression, contextualMapper);
                          var restElementType = getIndexTypeOfType(restArrayType, 1) ||
                              (languageVersion >= 2 ? checkIteratedType(restArrayType, undefined) : undefined);
                          if (restElementType) {
                              elementTypes.push(restElementType);
                          }
                      }
                      else {
                          var type = checkExpression(e, contextualMapper);
                          elementTypes.push(type);
                      }
                      hasSpreadElement = hasSpreadElement || e.kind === 174;
                  }
                  if (!hasSpreadElement) {
                      var contextualType = getContextualType(node);
                      if (contextualType && contextualTypeIsTupleLikeType(contextualType) || inDestructuringPattern) {
                          return createTupleType(elementTypes);
                      }
                  }
                  return createArrayType(getUnionType(elementTypes));
              }
              function isNumericName(name) {
                  return name.kind === 128 ? isNumericComputedName(name) : isNumericLiteralName(name.text);
              }
              function isNumericComputedName(name) {
                  return allConstituentTypesHaveKind(checkComputedPropertyName(name), 1 | 132);
              }
              function isNumericLiteralName(name) {
                  return (+name).toString() === name;
              }
              function checkComputedPropertyName(node) {
                  var links = getNodeLinks(node.expression);
                  if (!links.resolvedType) {
                      links.resolvedType = checkExpression(node.expression);
                      if (!allConstituentTypesHaveKind(links.resolvedType, 1 | 132 | 258 | 1048576)) {
                          error(node, ts.Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any);
                      }
                      else {
                          checkThatExpressionIsProperSymbolReference(node.expression, links.resolvedType, true);
                      }
                  }
                  return links.resolvedType;
              }
              function checkObjectLiteral(node, contextualMapper) {
                  checkGrammarObjectLiteralExpression(node);
                  var propertiesTable = {};
                  var propertiesArray = [];
                  var contextualType = getContextualType(node);
                  var typeFlags;
                  for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
                      var memberDecl = _a[_i];
                      var member = memberDecl.symbol;
                      if (memberDecl.kind === 225 ||
                          memberDecl.kind === 226 ||
                          ts.isObjectLiteralMethod(memberDecl)) {
                          var type = void 0;
                          if (memberDecl.kind === 225) {
                              type = checkPropertyAssignment(memberDecl, contextualMapper);
                          }
                          else if (memberDecl.kind === 135) {
                              type = checkObjectLiteralMethod(memberDecl, contextualMapper);
                          }
                          else {
                              ts.Debug.assert(memberDecl.kind === 226);
                              type = checkExpression(memberDecl.name, contextualMapper);
                          }
                          typeFlags |= type.flags;
                          var prop = createSymbol(4 | 67108864 | member.flags, member.name);
                          prop.declarations = member.declarations;
                          prop.parent = member.parent;
                          if (member.valueDeclaration) {
                              prop.valueDeclaration = member.valueDeclaration;
                          }
                          prop.type = type;
                          prop.target = member;
                          member = prop;
                      }
                      else {
                          ts.Debug.assert(memberDecl.kind === 137 || memberDecl.kind === 138);
                          checkAccessorDeclaration(memberDecl);
                      }
                      if (!ts.hasDynamicName(memberDecl)) {
                          propertiesTable[member.name] = member;
                      }
                      propertiesArray.push(member);
                  }
                  var stringIndexType = getIndexType(0);
                  var numberIndexType = getIndexType(1);
                  var result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexType, numberIndexType);
                  result.flags |= 131072 | 524288 | (typeFlags & 262144);
                  return result;
                  function getIndexType(kind) {
                      if (contextualType && contextualTypeHasIndexSignature(contextualType, kind)) {
                          var propTypes = [];
                          for (var i = 0; i < propertiesArray.length; i++) {
                              var propertyDecl = node.properties[i];
                              if (kind === 0 || isNumericName(propertyDecl.name)) {
                                  var type = getTypeOfSymbol(propertiesArray[i]);
                                  if (!ts.contains(propTypes, type)) {
                                      propTypes.push(type);
                                  }
                              }
                          }
                          var result_1 = propTypes.length ? getUnionType(propTypes) : undefinedType;
                          typeFlags |= result_1.flags;
                          return result_1;
                      }
                      return undefined;
                  }
              }
              function getDeclarationKindFromSymbol(s) {
                  return s.valueDeclaration ? s.valueDeclaration.kind : 133;
              }
              function getDeclarationFlagsFromSymbol(s) {
                  return s.valueDeclaration ? ts.getCombinedNodeFlags(s.valueDeclaration) : s.flags & 134217728 ? 16 | 128 : 0;
              }
              function checkClassPropertyAccess(node, left, type, prop) {
                  var flags = getDeclarationFlagsFromSymbol(prop);
                  if (!(flags & (32 | 64))) {
                      return;
                  }
                  var enclosingClassDeclaration = ts.getAncestor(node, 202);
                  var enclosingClass = enclosingClassDeclaration ? getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClassDeclaration)) : undefined;
                  var declaringClass = getDeclaredTypeOfSymbol(prop.parent);
                  if (flags & 32) {
                      if (declaringClass !== enclosingClass) {
                          error(node, ts.Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(declaringClass));
                      }
                      return;
                  }
                  if (left.kind === 91) {
                      return;
                  }
                  if (!enclosingClass || !hasBaseType(enclosingClass, declaringClass)) {
                      error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(declaringClass));
                      return;
                  }
                  if (flags & 128) {
                      return;
                  }
                  if (!(getTargetType(type).flags & (1024 | 2048) && hasBaseType(type, enclosingClass))) {
                      error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass));
                  }
              }
              function checkPropertyAccessExpression(node) {
                  return checkPropertyAccessExpressionOrQualifiedName(node, node.expression, node.name);
              }
              function checkQualifiedName(node) {
                  return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
              }
              function checkPropertyAccessExpressionOrQualifiedName(node, left, right) {
                  var type = checkExpressionOrQualifiedName(left);
                  if (type === unknownType)
                      return type;
                  if (type !== anyType) {
                      var apparentType = getApparentType(getWidenedType(type));
                      if (apparentType === unknownType) {
                          return unknownType;
                      }
                      var prop = getPropertyOfType(apparentType, right.text);
                      if (!prop) {
                          if (right.text) {
                              error(right, ts.Diagnostics.Property_0_does_not_exist_on_type_1, ts.declarationNameToString(right), typeToString(type));
                          }
                          return unknownType;
                      }
                      getNodeLinks(node).resolvedSymbol = prop;
                      if (prop.parent && prop.parent.flags & 32) {
                          if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
                              error(right, ts.Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword);
                          }
                          else {
                              checkClassPropertyAccess(node, left, type, prop);
                          }
                      }
                      return getTypeOfSymbol(prop);
                  }
                  return anyType;
              }
              function isValidPropertyAccess(node, propertyName) {
                  var left = node.kind === 156
                      ? node.expression
                      : node.left;
                  var type = checkExpressionOrQualifiedName(left);
                  if (type !== unknownType && type !== anyType) {
                      var prop = getPropertyOfType(getWidenedType(type), propertyName);
                      if (prop && prop.parent && prop.parent.flags & 32) {
                          if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
                              return false;
                          }
                          else {
                              var modificationCount = diagnostics.getModificationCount();
                              checkClassPropertyAccess(node, left, type, prop);
                              return diagnostics.getModificationCount() === modificationCount;
                          }
                      }
                  }
                  return true;
              }
              function checkIndexedAccess(node) {
                  if (!node.argumentExpression) {
                      var sourceFile = getSourceFile(node);
                      if (node.parent.kind === 159 && node.parent.expression === node) {
                          var start = ts.skipTrivia(sourceFile.text, node.expression.end);
                          var end = node.end;
                          grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead);
                      }
                      else {
                          var start = node.end - "]".length;
                          var end = node.end;
                          grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Expression_expected);
                      }
                  }
                  var objectType = getApparentType(checkExpression(node.expression));
                  var indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
                  if (objectType === unknownType) {
                      return unknownType;
                  }
                  var isConstEnum = isConstEnumObjectType(objectType);
                  if (isConstEnum &&
                      (!node.argumentExpression || node.argumentExpression.kind !== 8)) {
                      error(node.argumentExpression, ts.Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal);
                      return unknownType;
                  }
                  if (node.argumentExpression) {
                      var name_6 = getPropertyNameForIndexedAccess(node.argumentExpression, indexType);
                      if (name_6 !== undefined) {
                          var prop = getPropertyOfType(objectType, name_6);
                          if (prop) {
                              getNodeLinks(node).resolvedSymbol = prop;
                              return getTypeOfSymbol(prop);
                          }
                          else if (isConstEnum) {
                              error(node.argumentExpression, ts.Diagnostics.Property_0_does_not_exist_on_const_enum_1, name_6, symbolToString(objectType.symbol));
                              return unknownType;
                          }
                      }
                  }
                  if (allConstituentTypesHaveKind(indexType, 1 | 258 | 132 | 1048576)) {
                      if (allConstituentTypesHaveKind(indexType, 1 | 132)) {
                          var numberIndexType = getIndexTypeOfType(objectType, 1);
                          if (numberIndexType) {
                              return numberIndexType;
                          }
                      }
                      var stringIndexType = getIndexTypeOfType(objectType, 0);
                      if (stringIndexType) {
                          return stringIndexType;
                      }
                      if (compilerOptions.noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && objectType !== anyType) {
                          error(node, ts.Diagnostics.Index_signature_of_object_type_implicitly_has_an_any_type);
                      }
                      return anyType;
                  }
                  error(node, ts.Diagnostics.An_index_expression_argument_must_be_of_type_string_number_symbol_or_any);
                  return unknownType;
              }
              function getPropertyNameForIndexedAccess(indexArgumentExpression, indexArgumentType) {
                  if (indexArgumentExpression.kind === 8 || indexArgumentExpression.kind === 7) {
                      return indexArgumentExpression.text;
                  }
                  if (checkThatExpressionIsProperSymbolReference(indexArgumentExpression, indexArgumentType, false)) {
                      var rightHandSideName = indexArgumentExpression.name.text;
                      return ts.getPropertyNameForKnownSymbolName(rightHandSideName);
                  }
                  return undefined;
              }
              function checkThatExpressionIsProperSymbolReference(expression, expressionType, reportError) {
                  if (expressionType === unknownType) {
                      return false;
                  }
                  if (!ts.isWellKnownSymbolSyntactically(expression)) {
                      return false;
                  }
                  if ((expressionType.flags & 1048576) === 0) {
                      if (reportError) {
                          error(expression, ts.Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, ts.getTextOfNode(expression));
                      }
                      return false;
                  }
                  var leftHandSide = expression.expression;
                  var leftHandSideSymbol = getResolvedSymbol(leftHandSide);
                  if (!leftHandSideSymbol) {
                      return false;
                  }
                  var globalESSymbol = getGlobalESSymbolConstructorSymbol();
                  if (!globalESSymbol) {
                      return false;
                  }
                  if (leftHandSideSymbol !== globalESSymbol) {
                      if (reportError) {
                          error(leftHandSide, ts.Diagnostics.Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object);
                      }
                      return false;
                  }
                  return true;
              }
              function resolveUntypedCall(node) {
                  if (node.kind === 160) {
                      checkExpression(node.template);
                  }
                  else {
                      ts.forEach(node.arguments, function (argument) {
                          checkExpression(argument);
                      });
                  }
                  return anySignature;
              }
              function resolveErrorCall(node) {
                  resolveUntypedCall(node);
                  return unknownSignature;
              }
              function reorderCandidates(signatures, result) {
                  var lastParent;
                  var lastSymbol;
                  var cutoffIndex = 0;
                  var index;
                  var specializedIndex = -1;
                  var spliceIndex;
                  ts.Debug.assert(!result.length);
                  for (var _i = 0; _i < signatures.length; _i++) {
                      var signature = signatures[_i];
                      var symbol = signature.declaration && getSymbolOfNode(signature.declaration);
                      var parent_4 = signature.declaration && signature.declaration.parent;
                      if (!lastSymbol || symbol === lastSymbol) {
                          if (lastParent && parent_4 === lastParent) {
                              index++;
                          }
                          else {
                              lastParent = parent_4;
                              index = cutoffIndex;
                          }
                      }
                      else {
                          index = cutoffIndex = result.length;
                          lastParent = parent_4;
                      }
                      lastSymbol = symbol;
                      if (signature.hasStringLiterals) {
                          specializedIndex++;
                          spliceIndex = specializedIndex;
                          cutoffIndex++;
                      }
                      else {
                          spliceIndex = index;
                      }
                      result.splice(spliceIndex, 0, signature);
                  }
              }
              function getSpreadArgumentIndex(args) {
                  for (var i = 0; i < args.length; i++) {
                      if (args[i].kind === 174) {
                          return i;
                      }
                  }
                  return -1;
              }
              function hasCorrectArity(node, args, signature) {
                  var adjustedArgCount;
                  var typeArguments;
                  var callIsIncomplete;
                  if (node.kind === 160) {
                      var tagExpression = node;
                      adjustedArgCount = args.length;
                      typeArguments = undefined;
                      if (tagExpression.template.kind === 172) {
                          var templateExpression = tagExpression.template;
                          var lastSpan = ts.lastOrUndefined(templateExpression.templateSpans);
                          ts.Debug.assert(lastSpan !== undefined);
                          callIsIncomplete = ts.nodeIsMissing(lastSpan.literal) || !!lastSpan.literal.isUnterminated;
                      }
                      else {
                          var templateLiteral = tagExpression.template;
                          ts.Debug.assert(templateLiteral.kind === 10);
                          callIsIncomplete = !!templateLiteral.isUnterminated;
                      }
                  }
                  else {
                      var callExpression = node;
                      if (!callExpression.arguments) {
                          ts.Debug.assert(callExpression.kind === 159);
                          return signature.minArgumentCount === 0;
                      }
                      adjustedArgCount = callExpression.arguments.hasTrailingComma ? args.length + 1 : args.length;
                      callIsIncomplete = callExpression.arguments.end === callExpression.end;
                      typeArguments = callExpression.typeArguments;
                  }
                  var hasRightNumberOfTypeArgs = !typeArguments ||
                      (signature.typeParameters && typeArguments.length === signature.typeParameters.length);
                  if (!hasRightNumberOfTypeArgs) {
                      return false;
                  }
                  var spreadArgIndex = getSpreadArgumentIndex(args);
                  if (spreadArgIndex >= 0) {
                      return signature.hasRestParameter && spreadArgIndex >= signature.parameters.length - 1;
                  }
                  if (!signature.hasRestParameter && adjustedArgCount > signature.parameters.length) {
                      return false;
                  }
                  var hasEnoughArguments = adjustedArgCount >= signature.minArgumentCount;
                  return callIsIncomplete || hasEnoughArguments;
              }
              function getSingleCallSignature(type) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0 &&
                          resolved.properties.length === 0 && !resolved.stringIndexType && !resolved.numberIndexType) {
                          return resolved.callSignatures[0];
                      }
                  }
                  return undefined;
              }
              function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) {
                  var context = createInferenceContext(signature.typeParameters, true);
                  forEachMatchingParameterType(contextualSignature, signature, function (source, target) {
                      inferTypes(context, instantiateType(source, contextualMapper), target);
                  });
                  return getSignatureInstantiation(signature, getInferredTypes(context));
              }
              function inferTypeArguments(signature, args, excludeArgument, context) {
                  var typeParameters = signature.typeParameters;
                  var inferenceMapper = createInferenceMapper(context);
                  for (var i = 0; i < typeParameters.length; i++) {
                      if (!context.inferences[i].isFixed) {
                          context.inferredTypes[i] = undefined;
                      }
                  }
                  if (context.failedTypeParameterIndex !== undefined && !context.inferences[context.failedTypeParameterIndex].isFixed) {
                      context.failedTypeParameterIndex = undefined;
                  }
                  for (var i = 0; i < args.length; i++) {
                      var arg = args[i];
                      if (arg.kind !== 176) {
                          var paramType = getTypeAtPosition(signature, i);
                          var argType = void 0;
                          if (i === 0 && args[i].parent.kind === 160) {
                              argType = globalTemplateStringsArrayType;
                          }
                          else {
                              var mapper = excludeArgument && excludeArgument[i] !== undefined ? identityMapper : inferenceMapper;
                              argType = checkExpressionWithContextualType(arg, paramType, mapper);
                          }
                          inferTypes(context, argType, paramType);
                      }
                  }
                  if (excludeArgument) {
                      for (var i = 0; i < args.length; i++) {
                          if (excludeArgument[i] === false) {
                              var arg = args[i];
                              var paramType = getTypeAtPosition(signature, i);
                              inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType);
                          }
                      }
                  }
                  getInferredTypes(context);
              }
              function checkTypeArguments(signature, typeArguments, typeArgumentResultTypes, reportErrors) {
                  var typeParameters = signature.typeParameters;
                  var typeArgumentsAreAssignable = true;
                  for (var i = 0; i < typeParameters.length; i++) {
                      var typeArgNode = typeArguments[i];
                      var typeArgument = getTypeFromTypeNode(typeArgNode);
                      typeArgumentResultTypes[i] = typeArgument;
                      if (typeArgumentsAreAssignable) {
                          var constraint = getConstraintOfTypeParameter(typeParameters[i]);
                          if (constraint) {
                              typeArgumentsAreAssignable = checkTypeAssignableTo(typeArgument, constraint, reportErrors ? typeArgNode : undefined, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
                          }
                      }
                  }
                  return typeArgumentsAreAssignable;
              }
              function checkApplicableSignature(node, args, signature, relation, excludeArgument, reportErrors) {
                  for (var i = 0; i < args.length; i++) {
                      var arg = args[i];
                      if (arg.kind !== 176) {
                          var paramType = getTypeAtPosition(signature, i);
                          var argType = i === 0 && node.kind === 160
                              ? globalTemplateStringsArrayType
                              : arg.kind === 8 && !reportErrors
                                  ? getStringLiteralType(arg)
                                  : checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
                          if (!checkTypeRelatedTo(argType, paramType, relation, reportErrors ? arg : undefined, ts.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1)) {
                              return false;
                          }
                      }
                  }
                  return true;
              }
              function getEffectiveCallArguments(node) {
                  var args;
                  if (node.kind === 160) {
                      var template = node.template;
                      args = [template];
                      if (template.kind === 172) {
                          ts.forEach(template.templateSpans, function (span) {
                              args.push(span.expression);
                          });
                      }
                  }
                  else {
                      args = node.arguments || emptyArray;
                  }
                  return args;
              }
              function getEffectiveTypeArguments(callExpression) {
                  if (callExpression.expression.kind === 91) {
                      var containingClass = ts.getAncestor(callExpression, 202);
                      var baseClassTypeNode = containingClass && ts.getClassExtendsHeritageClauseElement(containingClass);
                      return baseClassTypeNode && baseClassTypeNode.typeArguments;
                  }
                  else {
                      return callExpression.typeArguments;
                  }
              }
              function resolveCall(node, signatures, candidatesOutArray) {
                  var isTaggedTemplate = node.kind === 160;
                  var typeArguments;
                  if (!isTaggedTemplate) {
                      typeArguments = getEffectiveTypeArguments(node);
                      if (node.expression.kind !== 91) {
                          ts.forEach(typeArguments, checkSourceElement);
                      }
                  }
                  var candidates = candidatesOutArray || [];
                  reorderCandidates(signatures, candidates);
                  if (!candidates.length) {
                      error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
                      return resolveErrorCall(node);
                  }
                  var args = getEffectiveCallArguments(node);
                  var excludeArgument;
                  for (var i = isTaggedTemplate ? 1 : 0; i < args.length; i++) {
                      if (isContextSensitive(args[i])) {
                          if (!excludeArgument) {
                              excludeArgument = new Array(args.length);
                          }
                          excludeArgument[i] = true;
                      }
                  }
                  var candidateForArgumentError;
                  var candidateForTypeArgumentError;
                  var resultOfFailedInference;
                  var result;
                  if (candidates.length > 1) {
                      result = chooseOverload(candidates, subtypeRelation);
                  }
                  if (!result) {
                      candidateForArgumentError = undefined;
                      candidateForTypeArgumentError = undefined;
                      resultOfFailedInference = undefined;
                      result = chooseOverload(candidates, assignableRelation);
                  }
                  if (result) {
                      return result;
                  }
                  if (candidateForArgumentError) {
                      checkApplicableSignature(node, args, candidateForArgumentError, assignableRelation, undefined, true);
                  }
                  else if (candidateForTypeArgumentError) {
                      if (!isTaggedTemplate && node.typeArguments) {
                          checkTypeArguments(candidateForTypeArgumentError, node.typeArguments, [], true);
                      }
                      else {
                          ts.Debug.assert(resultOfFailedInference.failedTypeParameterIndex >= 0);
                          var failedTypeParameter = candidateForTypeArgumentError.typeParameters[resultOfFailedInference.failedTypeParameterIndex];
                          var inferenceCandidates = getInferenceCandidates(resultOfFailedInference, resultOfFailedInference.failedTypeParameterIndex);
                          var diagnosticChainHead = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly, typeToString(failedTypeParameter));
                          reportNoCommonSupertypeError(inferenceCandidates, node.expression || node.tag, diagnosticChainHead);
                      }
                  }
                  else {
                      error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
                  }
                  if (!produceDiagnostics) {
                      for (var _i = 0; _i < candidates.length; _i++) {
                          var candidate = candidates[_i];
                          if (hasCorrectArity(node, args, candidate)) {
                              return candidate;
                          }
                      }
                  }
                  return resolveErrorCall(node);
                  function chooseOverload(candidates, relation) {
                      for (var _i = 0; _i < candidates.length; _i++) {
                          var originalCandidate = candidates[_i];
                          if (!hasCorrectArity(node, args, originalCandidate)) {
                              continue;
                          }
                          var candidate = void 0;
                          var typeArgumentsAreValid = void 0;
                          var inferenceContext = originalCandidate.typeParameters
                              ? createInferenceContext(originalCandidate.typeParameters, false)
                              : undefined;
                          while (true) {
                              candidate = originalCandidate;
                              if (candidate.typeParameters) {
                                  var typeArgumentTypes = void 0;
                                  if (typeArguments) {
                                      typeArgumentTypes = new Array(candidate.typeParameters.length);
                                      typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, false);
                                  }
                                  else {
                                      inferTypeArguments(candidate, args, excludeArgument, inferenceContext);
                                      typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
                                      typeArgumentTypes = inferenceContext.inferredTypes;
                                  }
                                  if (!typeArgumentsAreValid) {
                                      break;
                                  }
                                  candidate = getSignatureInstantiation(candidate, typeArgumentTypes);
                              }
                              if (!checkApplicableSignature(node, args, candidate, relation, excludeArgument, false)) {
                                  break;
                              }
                              var index = excludeArgument ? ts.indexOf(excludeArgument, true) : -1;
                              if (index < 0) {
                                  return candidate;
                              }
                              excludeArgument[index] = false;
                          }
                          if (originalCandidate.typeParameters) {
                              var instantiatedCandidate = candidate;
                              if (typeArgumentsAreValid) {
                                  candidateForArgumentError = instantiatedCandidate;
                              }
                              else {
                                  candidateForTypeArgumentError = originalCandidate;
                                  if (!typeArguments) {
                                      resultOfFailedInference = inferenceContext;
                                  }
                              }
                          }
                          else {
                              ts.Debug.assert(originalCandidate === candidate);
                              candidateForArgumentError = originalCandidate;
                          }
                      }
                      return undefined;
                  }
              }
              function resolveCallExpression(node, candidatesOutArray) {
                  if (node.expression.kind === 91) {
                      var superType = checkSuperExpression(node.expression);
                      if (superType !== unknownType) {
                          return resolveCall(node, getSignaturesOfType(superType, 1), candidatesOutArray);
                      }
                      return resolveUntypedCall(node);
                  }
                  var funcType = checkExpression(node.expression);
                  var apparentType = getApparentType(funcType);
                  if (apparentType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var callSignatures = getSignaturesOfType(apparentType, 0);
                  var constructSignatures = getSignaturesOfType(apparentType, 1);
                  if (funcType === anyType || (!callSignatures.length && !constructSignatures.length && !(funcType.flags & 16384) && isTypeAssignableTo(funcType, globalFunctionType))) {
                      if (node.typeArguments) {
                          error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
                      }
                      return resolveUntypedCall(node);
                  }
                  if (!callSignatures.length) {
                      if (constructSignatures.length) {
                          error(node, ts.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
                      }
                      else {
                          error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
                      }
                      return resolveErrorCall(node);
                  }
                  return resolveCall(node, callSignatures, candidatesOutArray);
              }
              function resolveNewExpression(node, candidatesOutArray) {
                  if (node.arguments && languageVersion < 2) {
                      var spreadIndex = getSpreadArgumentIndex(node.arguments);
                      if (spreadIndex >= 0) {
                          error(node.arguments[spreadIndex], ts.Diagnostics.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher);
                      }
                  }
                  var expressionType = checkExpression(node.expression);
                  if (expressionType === anyType) {
                      if (node.typeArguments) {
                          error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
                      }
                      return resolveUntypedCall(node);
                  }
                  expressionType = getApparentType(expressionType);
                  if (expressionType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var constructSignatures = getSignaturesOfType(expressionType, 1);
                  if (constructSignatures.length) {
                      return resolveCall(node, constructSignatures, candidatesOutArray);
                  }
                  var callSignatures = getSignaturesOfType(expressionType, 0);
                  if (callSignatures.length) {
                      var signature = resolveCall(node, callSignatures, candidatesOutArray);
                      if (getReturnTypeOfSignature(signature) !== voidType) {
                          error(node, ts.Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
                      }
                      return signature;
                  }
                  error(node, ts.Diagnostics.Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature);
                  return resolveErrorCall(node);
              }
              function resolveTaggedTemplateExpression(node, candidatesOutArray) {
                  var tagType = checkExpression(node.tag);
                  var apparentType = getApparentType(tagType);
                  if (apparentType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var callSignatures = getSignaturesOfType(apparentType, 0);
                  if (tagType === anyType || (!callSignatures.length && !(tagType.flags & 16384) && isTypeAssignableTo(tagType, globalFunctionType))) {
                      return resolveUntypedCall(node);
                  }
                  if (!callSignatures.length) {
                      error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
                      return resolveErrorCall(node);
                  }
                  return resolveCall(node, callSignatures, candidatesOutArray);
              }
              function getResolvedSignature(node, candidatesOutArray) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedSignature || candidatesOutArray) {
                      links.resolvedSignature = anySignature;
                      if (node.kind === 158) {
                          links.resolvedSignature = resolveCallExpression(node, candidatesOutArray);
                      }
                      else if (node.kind === 159) {
                          links.resolvedSignature = resolveNewExpression(node, candidatesOutArray);
                      }
                      else if (node.kind === 160) {
                          links.resolvedSignature = resolveTaggedTemplateExpression(node, candidatesOutArray);
                      }
                      else {
                          ts.Debug.fail("Branch in 'getResolvedSignature' should be unreachable.");
                      }
                  }
                  return links.resolvedSignature;
              }
              function checkCallExpression(node) {
                  checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments);
                  var signature = getResolvedSignature(node);
                  if (node.expression.kind === 91) {
                      return voidType;
                  }
                  if (node.kind === 159) {
                      var declaration = signature.declaration;
                      if (declaration &&
                          declaration.kind !== 136 &&
                          declaration.kind !== 140 &&
                          declaration.kind !== 144) {
                          if (compilerOptions.noImplicitAny) {
                              error(node, ts.Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type);
                          }
                          return anyType;
                      }
                  }
                  return getReturnTypeOfSignature(signature);
              }
              function checkTaggedTemplateExpression(node) {
                  return getReturnTypeOfSignature(getResolvedSignature(node));
              }
              function checkTypeAssertion(node) {
                  var exprType = checkExpression(node.expression);
                  var targetType = getTypeFromTypeNode(node.type);
                  if (produceDiagnostics && targetType !== unknownType) {
                      var widenedType = getWidenedType(exprType);
                      if (!(isTypeAssignableTo(targetType, widenedType))) {
                          checkTypeAssignableTo(exprType, targetType, node, ts.Diagnostics.Neither_type_0_nor_type_1_is_assignable_to_the_other);
                      }
                  }
                  return targetType;
              }
              function getTypeAtPosition(signature, pos) {
                  return signature.hasRestParameter ?
                      pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
                      pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType;
              }
              function assignContextualParameterTypes(signature, context, mapper) {
                  var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0);
                  for (var i = 0; i < len; i++) {
                      var parameter = signature.parameters[i];
                      var links = getSymbolLinks(parameter);
                      links.type = instantiateType(getTypeAtPosition(context, i), mapper);
                  }
                  if (signature.hasRestParameter && context.hasRestParameter && signature.parameters.length >= context.parameters.length) {
                      var parameter = ts.lastOrUndefined(signature.parameters);
                      var links = getSymbolLinks(parameter);
                      links.type = instantiateType(getTypeOfSymbol(ts.lastOrUndefined(context.parameters)), mapper);
                  }
              }
              function getReturnTypeFromBody(func, contextualMapper) {
                  var contextualSignature = getContextualSignatureForFunctionLikeDeclaration(func);
                  if (!func.body) {
                      return unknownType;
                  }
                  var type;
                  if (func.body.kind !== 180) {
                      type = checkExpressionCached(func.body, contextualMapper);
                  }
                  else {
                      var types = checkAndAggregateReturnExpressionTypes(func.body, contextualMapper);
                      if (types.length === 0) {
                          return voidType;
                      }
                      type = contextualSignature ? getUnionType(types) : getCommonSupertype(types);
                      if (!type) {
                          error(func, ts.Diagnostics.No_best_common_type_exists_among_return_expressions);
                          return unknownType;
                      }
                  }
                  if (!contextualSignature) {
                      reportErrorsFromWidening(func, type);
                  }
                  return getWidenedType(type);
              }
              function checkAndAggregateReturnExpressionTypes(body, contextualMapper) {
                  var aggregatedTypes = [];
                  ts.forEachReturnStatement(body, function (returnStatement) {
                      var expr = returnStatement.expression;
                      if (expr) {
                          var type = checkExpressionCached(expr, contextualMapper);
                          if (!ts.contains(aggregatedTypes, type)) {
                              aggregatedTypes.push(type);
                          }
                      }
                  });
                  return aggregatedTypes;
              }
              function bodyContainsAReturnStatement(funcBody) {
                  return ts.forEachReturnStatement(funcBody, function (returnStatement) {
                      return true;
                  });
              }
              function bodyContainsSingleThrowStatement(body) {
                  return (body.statements.length === 1) && (body.statements[0].kind === 196);
              }
              function checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(func, returnType) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  if (returnType === voidType || returnType === anyType) {
                      return;
                  }
                  if (ts.nodeIsMissing(func.body) || func.body.kind !== 180) {
                      return;
                  }
                  var bodyBlock = func.body;
                  if (bodyContainsAReturnStatement(bodyBlock)) {
                      return;
                  }
                  if (bodyContainsSingleThrowStatement(bodyBlock)) {
                      return;
                  }
                  error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement);
              }
              function checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  var hasGrammarError = checkGrammarDeclarationNameInStrictMode(node) || checkGrammarFunctionLikeDeclaration(node);
                  if (!hasGrammarError && node.kind === 163) {
                      checkGrammarFunctionName(node.name) || checkGrammarForGenerator(node);
                  }
                  if (contextualMapper === identityMapper && isContextSensitive(node)) {
                      return anyFunctionType;
                  }
                  var links = getNodeLinks(node);
                  var type = getTypeOfSymbol(node.symbol);
                  if (!(links.flags & 64)) {
                      var contextualSignature = getContextualSignature(node);
                      if (!(links.flags & 64)) {
                          links.flags |= 64;
                          if (contextualSignature) {
                              var signature = getSignaturesOfType(type, 0)[0];
                              if (isContextSensitive(node)) {
                                  assignContextualParameterTypes(signature, contextualSignature, contextualMapper || identityMapper);
                              }
                              if (!node.type && !signature.resolvedReturnType) {
                                  var returnType = getReturnTypeFromBody(node, contextualMapper);
                                  if (!signature.resolvedReturnType) {
                                      signature.resolvedReturnType = returnType;
                                  }
                              }
                          }
                          checkSignatureDeclaration(node);
                      }
                  }
                  if (produceDiagnostics && node.kind !== 135 && node.kind !== 134) {
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                  }
                  return type;
              }
              function checkFunctionExpressionOrObjectLiteralMethodBody(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  if (node.type && !node.asteriskToken) {
                      checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
                  }
                  if (node.body) {
                      if (node.body.kind === 180) {
                          checkSourceElement(node.body);
                      }
                      else {
                          var exprType = checkExpression(node.body);
                          if (node.type) {
                              checkTypeAssignableTo(exprType, getTypeFromTypeNode(node.type), node.body, undefined);
                          }
                          checkFunctionExpressionBodies(node.body);
                      }
                  }
              }
              function checkArithmeticOperandType(operand, type, diagnostic) {
                  if (!allConstituentTypesHaveKind(type, 1 | 132)) {
                      error(operand, diagnostic);
                      return false;
                  }
                  return true;
              }
              function checkReferenceExpression(n, invalidReferenceMessage, constantVariableMessage) {
                  function findSymbol(n) {
                      var symbol = getNodeLinks(n).resolvedSymbol;
                      return symbol && getExportSymbolOfValueSymbolIfExported(symbol);
                  }
                  function isReferenceOrErrorExpression(n) {
                      switch (n.kind) {
                          case 65: {
                              var symbol = findSymbol(n);
                              return !symbol || symbol === unknownSymbol || symbol === argumentsSymbol || (symbol.flags & 3) !== 0;
                          }
                          case 156: {
                              var symbol = findSymbol(n);
                              return !symbol || symbol === unknownSymbol || (symbol.flags & ~8) !== 0;
                          }
                          case 157:
                              return true;
                          case 162:
                              return isReferenceOrErrorExpression(n.expression);
                          default:
                              return false;
                      }
                  }
                  function isConstVariableReference(n) {
                      switch (n.kind) {
                          case 65:
                          case 156: {
                              var symbol = findSymbol(n);
                              return symbol && (symbol.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(symbol) & 8192) !== 0;
                          }
                          case 157: {
                              var index = n.argumentExpression;
                              var symbol = findSymbol(n.expression);
                              if (symbol && index && index.kind === 8) {
                                  var name_7 = index.text;
                                  var prop = getPropertyOfType(getTypeOfSymbol(symbol), name_7);
                                  return prop && (prop.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(prop) & 8192) !== 0;
                              }
                              return false;
                          }
                          case 162:
                              return isConstVariableReference(n.expression);
                          default:
                              return false;
                      }
                  }
                  if (!isReferenceOrErrorExpression(n)) {
                      error(n, invalidReferenceMessage);
                      return false;
                  }
                  if (isConstVariableReference(n)) {
                      error(n, constantVariableMessage);
                      return false;
                  }
                  return true;
              }
              function checkDeleteExpression(node) {
                  if (node.parserContextFlags & 1 && node.expression.kind === 65) {
                      grammarErrorOnNode(node.expression, ts.Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode);
                  }
                  var operandType = checkExpression(node.expression);
                  return booleanType;
              }
              function checkTypeOfExpression(node) {
                  var operandType = checkExpression(node.expression);
                  return stringType;
              }
              function checkVoidExpression(node) {
                  var operandType = checkExpression(node.expression);
                  return undefinedType;
              }
              function checkPrefixUnaryExpression(node) {
                  if ((node.operator === 38 || node.operator === 39)) {
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
                  }
                  var operandType = checkExpression(node.operand);
                  switch (node.operator) {
                      case 33:
                      case 34:
                      case 47:
                          if (someConstituentTypeHasKind(operandType, 1048576)) {
                              error(node.operand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(node.operator));
                          }
                          return numberType;
                      case 46:
                          return booleanType;
                      case 38:
                      case 39:
                          var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
                          if (ok) {
                              checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
                          }
                          return numberType;
                  }
                  return unknownType;
              }
              function checkPostfixUnaryExpression(node) {
                  checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
                  var operandType = checkExpression(node.operand);
                  var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
                  if (ok) {
                      checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
                  }
                  return numberType;
              }
              function someConstituentTypeHasKind(type, kind) {
                  if (type.flags & kind) {
                      return true;
                  }
                  if (type.flags & 16384) {
                      var types = type.types;
                      for (var _i = 0; _i < types.length; _i++) {
                          var current = types[_i];
                          if (current.flags & kind) {
                              return true;
                          }
                      }
                      return false;
                  }
                  return false;
              }
              function allConstituentTypesHaveKind(type, kind) {
                  if (type.flags & kind) {
                      return true;
                  }
                  if (type.flags & 16384) {
                      var types = type.types;
                      for (var _i = 0; _i < types.length; _i++) {
                          var current = types[_i];
                          if (!(current.flags & kind)) {
                              return false;
                          }
                      }
                      return true;
                  }
                  return false;
              }
              function isConstEnumObjectType(type) {
                  return type.flags & (48128 | 32768) && type.symbol && isConstEnumSymbol(type.symbol);
              }
              function isConstEnumSymbol(symbol) {
                  return (symbol.flags & 128) !== 0;
              }
              function checkInstanceOfExpression(node, leftType, rightType) {
                  if (allConstituentTypesHaveKind(leftType, 1049086)) {
                      error(node.left, ts.Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  if (!(rightType.flags & 1 || isTypeSubtypeOf(rightType, globalFunctionType))) {
                      error(node.right, ts.Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type);
                  }
                  return booleanType;
              }
              function checkInExpression(node, leftType, rightType) {
                  if (!allConstituentTypesHaveKind(leftType, 1 | 258 | 132 | 1048576)) {
                      error(node.left, ts.Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
                  }
                  if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
                      error(node.right, ts.Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  return booleanType;
              }
              function checkObjectLiteralAssignment(node, sourceType, contextualMapper) {
                  var properties = node.properties;
                  for (var _i = 0; _i < properties.length; _i++) {
                      var p = properties[_i];
                      if (p.kind === 225 || p.kind === 226) {
                          var name_8 = p.name;
                          var type = sourceType.flags & 1 ? sourceType :
                              getTypeOfPropertyOfType(sourceType, name_8.text) ||
                                  isNumericLiteralName(name_8.text) && getIndexTypeOfType(sourceType, 1) ||
                                  getIndexTypeOfType(sourceType, 0);
                          if (type) {
                              checkDestructuringAssignment(p.initializer || name_8, type);
                          }
                          else {
                              error(name_8, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(sourceType), ts.declarationNameToString(name_8));
                          }
                      }
                      else {
                          error(p, ts.Diagnostics.Property_assignment_expected);
                      }
                  }
                  return sourceType;
              }
              function checkArrayLiteralAssignment(node, sourceType, contextualMapper) {
                  var elementType = checkIteratedTypeOrElementType(sourceType, node, false) || unknownType;
                  var elements = node.elements;
                  for (var i = 0; i < elements.length; i++) {
                      var e = elements[i];
                      if (e.kind !== 176) {
                          if (e.kind !== 174) {
                              var propName = "" + i;
                              var type = sourceType.flags & 1 ? sourceType :
                                  isTupleLikeType(sourceType)
                                      ? getTypeOfPropertyOfType(sourceType, propName)
                                      : elementType;
                              if (type) {
                                  checkDestructuringAssignment(e, type, contextualMapper);
                              }
                              else {
                                  if (isTupleType(sourceType)) {
                                      error(e, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(sourceType), sourceType.elementTypes.length, elements.length);
                                  }
                                  else {
                                      error(e, ts.Diagnostics.Type_0_has_no_property_1, typeToString(sourceType), propName);
                                  }
                              }
                          }
                          else {
                              if (i < elements.length - 1) {
                                  error(e, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
                              }
                              else {
                                  var restExpression = e.expression;
                                  if (restExpression.kind === 170 && restExpression.operatorToken.kind === 53) {
                                      error(restExpression.operatorToken, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
                                  }
                                  else {
                                      checkDestructuringAssignment(restExpression, createArrayType(elementType), contextualMapper);
                                  }
                              }
                          }
                      }
                  }
                  return sourceType;
              }
              function checkDestructuringAssignment(target, sourceType, contextualMapper) {
                  if (target.kind === 170 && target.operatorToken.kind === 53) {
                      checkBinaryExpression(target, contextualMapper);
                      target = target.left;
                  }
                  if (target.kind === 155) {
                      return checkObjectLiteralAssignment(target, sourceType, contextualMapper);
                  }
                  if (target.kind === 154) {
                      return checkArrayLiteralAssignment(target, sourceType, contextualMapper);
                  }
                  return checkReferenceAssignment(target, sourceType, contextualMapper);
              }
              function checkReferenceAssignment(target, sourceType, contextualMapper) {
                  var targetType = checkExpression(target, contextualMapper);
                  if (checkReferenceExpression(target, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant)) {
                      checkTypeAssignableTo(sourceType, targetType, target, undefined);
                  }
                  return sourceType;
              }
              function checkBinaryExpression(node, contextualMapper) {
                  if (ts.isLeftHandSideExpression(node.left) && ts.isAssignmentOperator(node.operatorToken.kind)) {
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.left);
                  }
                  var operator = node.operatorToken.kind;
                  if (operator === 53 && (node.left.kind === 155 || node.left.kind === 154)) {
                      return checkDestructuringAssignment(node.left, checkExpression(node.right, contextualMapper), contextualMapper);
                  }
                  var leftType = checkExpression(node.left, contextualMapper);
                  var rightType = checkExpression(node.right, contextualMapper);
                  switch (operator) {
                      case 35:
                      case 56:
                      case 36:
                      case 57:
                      case 37:
                      case 58:
                      case 34:
                      case 55:
                      case 40:
                      case 59:
                      case 41:
                      case 60:
                      case 42:
                      case 61:
                      case 44:
                      case 63:
                      case 45:
                      case 64:
                      case 43:
                      case 62:
                          if (leftType.flags & (32 | 64))
                              leftType = rightType;
                          if (rightType.flags & (32 | 64))
                              rightType = leftType;
                          var suggestedOperator;
                          if ((leftType.flags & 8) &&
                              (rightType.flags & 8) &&
                              (suggestedOperator = getSuggestedBooleanOperator(node.operatorToken.kind)) !== undefined) {
                              error(node, ts.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts.tokenToString(node.operatorToken.kind), ts.tokenToString(suggestedOperator));
                          }
                          else {
                              var leftOk = checkArithmeticOperandType(node.left, leftType, ts.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
                              var rightOk = checkArithmeticOperandType(node.right, rightType, ts.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
                              if (leftOk && rightOk) {
                                  checkAssignmentOperator(numberType);
                              }
                          }
                          return numberType;
                      case 33:
                      case 54:
                          if (leftType.flags & (32 | 64))
                              leftType = rightType;
                          if (rightType.flags & (32 | 64))
                              rightType = leftType;
                          var resultType;
                          if (allConstituentTypesHaveKind(leftType, 132) && allConstituentTypesHaveKind(rightType, 132)) {
                              resultType = numberType;
                          }
                          else {
                              if (allConstituentTypesHaveKind(leftType, 258) || allConstituentTypesHaveKind(rightType, 258)) {
                                  resultType = stringType;
                              }
                              else if (leftType.flags & 1 || rightType.flags & 1) {
                                  resultType = anyType;
                              }
                              if (resultType && !checkForDisallowedESSymbolOperand(operator)) {
                                  return resultType;
                              }
                          }
                          if (!resultType) {
                              reportOperatorError();
                              return anyType;
                          }
                          if (operator === 54) {
                              checkAssignmentOperator(resultType);
                          }
                          return resultType;
                      case 24:
                      case 25:
                      case 26:
                      case 27:
                          if (!checkForDisallowedESSymbolOperand(operator)) {
                              return booleanType;
                          }
                      case 28:
                      case 29:
                      case 30:
                      case 31:
                          if (!isTypeAssignableTo(leftType, rightType) && !isTypeAssignableTo(rightType, leftType)) {
                              reportOperatorError();
                          }
                          return booleanType;
                      case 87:
                          return checkInstanceOfExpression(node, leftType, rightType);
                      case 86:
                          return checkInExpression(node, leftType, rightType);
                      case 48:
                          return rightType;
                      case 49:
                          return getUnionType([leftType, rightType]);
                      case 53:
                          checkAssignmentOperator(rightType);
                          return rightType;
                      case 23:
                          return rightType;
                  }
                  function checkForDisallowedESSymbolOperand(operator) {
                      var offendingSymbolOperand = someConstituentTypeHasKind(leftType, 1048576) ? node.left :
                          someConstituentTypeHasKind(rightType, 1048576) ? node.right :
                              undefined;
                      if (offendingSymbolOperand) {
                          error(offendingSymbolOperand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(operator));
                          return false;
                      }
                      return true;
                  }
                  function getSuggestedBooleanOperator(operator) {
                      switch (operator) {
                          case 44:
                          case 63:
                              return 49;
                          case 45:
                          case 64:
                              return 31;
                          case 43:
                          case 62:
                              return 48;
                          default:
                              return undefined;
                      }
                  }
                  function checkAssignmentOperator(valueType) {
                      if (produceDiagnostics && operator >= 53 && operator <= 64) {
                          var ok = checkReferenceExpression(node.left, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant);
                          if (ok) {
                              checkTypeAssignableTo(valueType, leftType, node.left, undefined);
                          }
                      }
                  }
                  function reportOperatorError() {
                      error(node, ts.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2, ts.tokenToString(node.operatorToken.kind), typeToString(leftType), typeToString(rightType));
                  }
              }
              function checkYieldExpression(node) {
                  if (!(node.parserContextFlags & 4)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expression_must_be_contained_within_a_generator_declaration);
                  }
                  else {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expressions_are_not_currently_supported);
                  }
              }
              function checkConditionalExpression(node, contextualMapper) {
                  checkExpression(node.condition);
                  var type1 = checkExpression(node.whenTrue, contextualMapper);
                  var type2 = checkExpression(node.whenFalse, contextualMapper);
                  return getUnionType([type1, type2]);
              }
              function checkTemplateExpression(node) {
                  ts.forEach(node.templateSpans, function (templateSpan) {
                      checkExpression(templateSpan.expression);
                  });
                  return stringType;
              }
              function checkExpressionWithContextualType(node, contextualType, contextualMapper) {
                  var saveContextualType = node.contextualType;
                  node.contextualType = contextualType;
                  var result = checkExpression(node, contextualMapper);
                  node.contextualType = saveContextualType;
                  return result;
              }
              function checkExpressionCached(node, contextualMapper) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = checkExpression(node, contextualMapper);
                  }
                  return links.resolvedType;
              }
              function checkPropertyAssignment(node, contextualMapper) {
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  return checkExpression(node.initializer, contextualMapper);
              }
              function checkObjectLiteralMethod(node, contextualMapper) {
                  checkGrammarMethod(node);
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  var uninstantiatedType = checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
                  return instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
              }
              function instantiateTypeWithSingleGenericCallSignature(node, type, contextualMapper) {
                  if (contextualMapper && contextualMapper !== identityMapper) {
                      var signature = getSingleCallSignature(type);
                      if (signature && signature.typeParameters) {
                          var contextualType = getContextualType(node);
                          if (contextualType) {
                              var contextualSignature = getSingleCallSignature(contextualType);
                              if (contextualSignature && !contextualSignature.typeParameters) {
                                  return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper));
                              }
                          }
                      }
                  }
                  return type;
              }
              function checkExpression(node, contextualMapper) {
                  checkGrammarIdentifierInStrictMode(node);
                  return checkExpressionOrQualifiedName(node, contextualMapper);
              }
              function checkExpressionOrQualifiedName(node, contextualMapper) {
                  var type;
                  if (node.kind == 127) {
                      type = checkQualifiedName(node);
                  }
                  else {
                      var uninstantiatedType = checkExpressionWorker(node, contextualMapper);
                      type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
                  }
                  if (isConstEnumObjectType(type)) {
                      var ok = (node.parent.kind === 156 && node.parent.expression === node) ||
                          (node.parent.kind === 157 && node.parent.expression === node) ||
                          ((node.kind === 65 || node.kind === 127) && isInRightSideOfImportOrExportAssignment(node));
                      if (!ok) {
                          error(node, ts.Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment);
                      }
                  }
                  return type;
              }
              function checkNumericLiteral(node) {
                  checkGrammarNumericLiteral(node);
                  return numberType;
              }
              function checkExpressionWorker(node, contextualMapper) {
                  switch (node.kind) {
                      case 65:
                          return checkIdentifier(node);
                      case 93:
                          return checkThisExpression(node);
                      case 91:
                          return checkSuperExpression(node);
                      case 89:
                          return nullType;
                      case 95:
                      case 80:
                          return booleanType;
                      case 7:
                          return checkNumericLiteral(node);
                      case 172:
                          return checkTemplateExpression(node);
                      case 8:
                      case 10:
                          return stringType;
                      case 9:
                          return globalRegExpType;
                      case 154:
                          return checkArrayLiteral(node, contextualMapper);
                      case 155:
                          return checkObjectLiteral(node, contextualMapper);
                      case 156:
                          return checkPropertyAccessExpression(node);
                      case 157:
                          return checkIndexedAccess(node);
                      case 158:
                      case 159:
                          return checkCallExpression(node);
                      case 160:
                          return checkTaggedTemplateExpression(node);
                      case 161:
                          return checkTypeAssertion(node);
                      case 162:
                          return checkExpression(node.expression, contextualMapper);
                      case 175:
                          return checkClassExpression(node);
                      case 163:
                      case 164:
                          return checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
                      case 166:
                          return checkTypeOfExpression(node);
                      case 165:
                          return checkDeleteExpression(node);
                      case 167:
                          return checkVoidExpression(node);
                      case 168:
                          return checkPrefixUnaryExpression(node);
                      case 169:
                          return checkPostfixUnaryExpression(node);
                      case 170:
                          return checkBinaryExpression(node, contextualMapper);
                      case 171:
                          return checkConditionalExpression(node, contextualMapper);
                      case 174:
                          return checkSpreadElementExpression(node, contextualMapper);
                      case 176:
                          return undefinedType;
                      case 173:
                          checkYieldExpression(node);
                          return unknownType;
                  }
                  return unknownType;
              }
              function checkTypeParameter(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  if (node.expression) {
                      grammarErrorOnFirstToken(node.expression, ts.Diagnostics.Type_expected);
                  }
                  checkSourceElement(node.constraint);
                  if (produceDiagnostics) {
                      checkTypeParameterHasIllegalReferencesInConstraint(node);
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_parameter_name_cannot_be_0);
                  }
              }
              function checkParameter(node) {
                  // Grammar checking
                  // It is a SyntaxError if the Identifier "eval" or the Identifier "arguments" occurs as the
                  // Identifier in a PropertySetParameterList of a PropertyAssignment that is contained in strict code
                  // or if its FunctionBody is strict code(11.1.5).
                  // It is a SyntaxError if the identifier eval or arguments appears within a FormalParameterList of a
                  // strict mode FunctionLikeDeclaration or FunctionExpression(13.1)
                  checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
                  checkVariableLikeDeclaration(node);
                  var func = ts.getContainingFunction(node);
                  if (node.flags & 112) {
                      func = ts.getContainingFunction(node);
                      if (!(func.kind === 136 && ts.nodeIsPresent(func.body))) {
                          error(node, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
                      }
                  }
                  if (node.questionToken && ts.isBindingPattern(node.name) && func.body) {
                      error(node, ts.Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
                  }
                  if (node.dotDotDotToken && !ts.isBindingPattern(node.name) && !isArrayType(getTypeOfSymbol(node.symbol))) {
                      error(node, ts.Diagnostics.A_rest_parameter_must_be_of_an_array_type);
                  }
              }
              function checkSignatureDeclaration(node) {
                  if (node.kind === 141) {
                      checkGrammarIndexSignature(node);
                  }
                  else if (node.kind === 143 || node.kind === 201 || node.kind === 144 ||
                      node.kind === 139 || node.kind === 136 ||
                      node.kind === 140) {
                      checkGrammarFunctionLikeDeclaration(node);
                  }
                  checkTypeParameters(node.typeParameters);
                  ts.forEach(node.parameters, checkParameter);
                  if (node.type) {
                      checkSourceElement(node.type);
                  }
                  if (produceDiagnostics) {
                      checkCollisionWithArgumentsInGeneratedCode(node);
                      if (compilerOptions.noImplicitAny && !node.type) {
                          switch (node.kind) {
                              case 140:
                                  error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                                  break;
                              case 139:
                                  error(node, ts.Diagnostics.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                                  break;
                          }
                      }
                  }
                  checkSpecializedSignatureDeclaration(node);
              }
              function checkTypeForDuplicateIndexSignatures(node) {
                  if (node.kind === 203) {
                      var nodeSymbol = getSymbolOfNode(node);
                      if (nodeSymbol.declarations.length > 0 && nodeSymbol.declarations[0] !== node) {
                          return;
                      }
                  }
                  var indexSymbol = getIndexSymbol(getSymbolOfNode(node));
                  if (indexSymbol) {
                      var seenNumericIndexer = false;
                      var seenStringIndexer = false;
                      for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
                          var decl = _a[_i];
                          var declaration = decl;
                          if (declaration.parameters.length === 1 && declaration.parameters[0].type) {
                              switch (declaration.parameters[0].type.kind) {
                                  case 122:
                                      if (!seenStringIndexer) {
                                          seenStringIndexer = true;
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Duplicate_string_index_signature);
                                      }
                                      break;
                                  case 120:
                                      if (!seenNumericIndexer) {
                                          seenNumericIndexer = true;
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Duplicate_number_index_signature);
                                      }
                                      break;
                              }
                          }
                      }
                  }
              }
              function checkPropertyDeclaration(node) {
                  checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name);
                  checkVariableLikeDeclaration(node);
              }
              function checkMethodDeclaration(node) {
                  checkGrammarMethod(node) || checkGrammarComputedPropertyName(node.name);
                  checkFunctionLikeDeclaration(node);
              }
              function checkConstructorDeclaration(node) {
                  checkSignatureDeclaration(node);
                  checkGrammarConstructorTypeParameters(node) || checkGrammarConstructorTypeAnnotation(node);
                  checkSourceElement(node.body);
                  var symbol = getSymbolOfNode(node);
                  var firstDeclaration = ts.getDeclarationOfKind(symbol, node.kind);
                  if (node === firstDeclaration) {
                      checkFunctionOrConstructorSymbol(symbol);
                  }
                  if (ts.nodeIsMissing(node.body)) {
                      return;
                  }
                  if (!produceDiagnostics) {
                      return;
                  }
                  function isSuperCallExpression(n) {
                      return n.kind === 158 && n.expression.kind === 91;
                  }
                  function containsSuperCall(n) {
                      if (isSuperCallExpression(n)) {
                          return true;
                      }
                      switch (n.kind) {
                          case 163:
                          case 201:
                          case 164:
                          case 155: return false;
                          default: return ts.forEachChild(n, containsSuperCall);
                      }
                  }
                  function markThisReferencesAsErrors(n) {
                      if (n.kind === 93) {
                          error(n, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
                      }
                      else if (n.kind !== 163 && n.kind !== 201) {
                          ts.forEachChild(n, markThisReferencesAsErrors);
                      }
                  }
                  function isInstancePropertyWithInitializer(n) {
                      return n.kind === 133 &&
                          !(n.flags & 128) &&
                          !!n.initializer;
                  }
                  if (ts.getClassExtendsHeritageClauseElement(node.parent)) {
                      if (containsSuperCall(node.body)) {
                          var superCallShouldBeFirst = ts.forEach(node.parent.members, isInstancePropertyWithInitializer) ||
                              ts.forEach(node.parameters, function (p) { return p.flags & (16 | 32 | 64); });
                          if (superCallShouldBeFirst) {
                              var statements = node.body.statements;
                              if (!statements.length || statements[0].kind !== 183 || !isSuperCallExpression(statements[0].expression)) {
                                  error(node, ts.Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties);
                              }
                              else {
                                  markThisReferencesAsErrors(statements[0].expression);
                              }
                          }
                      }
                      else {
                          error(node, ts.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call);
                      }
                  }
              }
              function checkAccessorDeclaration(node) {
                  if (produceDiagnostics) {
                      checkGrammarFunctionLikeDeclaration(node) || checkGrammarAccessor(node) || checkGrammarComputedPropertyName(node.name);
                      if (node.kind === 137) {
                          if (!ts.isInAmbientContext(node) && ts.nodeIsPresent(node.body) && !(bodyContainsAReturnStatement(node.body) || bodyContainsSingleThrowStatement(node.body))) {
                              error(node.name, ts.Diagnostics.A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement);
                          }
                      }
                      if (!ts.hasDynamicName(node)) {
                          var otherKind = node.kind === 137 ? 138 : 137;
                          var otherAccessor = ts.getDeclarationOfKind(node.symbol, otherKind);
                          if (otherAccessor) {
                              if (((node.flags & 112) !== (otherAccessor.flags & 112))) {
                                  error(node.name, ts.Diagnostics.Getter_and_setter_accessors_do_not_agree_in_visibility);
                              }
                              var currentAccessorType = getAnnotatedAccessorType(node);
                              var otherAccessorType = getAnnotatedAccessorType(otherAccessor);
                              if (currentAccessorType && otherAccessorType) {
                                  if (!isTypeIdenticalTo(currentAccessorType, otherAccessorType)) {
                                      error(node, ts.Diagnostics.get_and_set_accessor_must_have_the_same_type);
                                  }
                              }
                          }
                      }
                      getTypeOfAccessors(getSymbolOfNode(node));
                  }
                  checkFunctionLikeDeclaration(node);
              }
              function checkMissingDeclaration(node) {
                  checkDecorators(node);
              }
              function checkTypeReferenceNode(node) {
                  checkGrammarTypeReferenceInStrictMode(node.typeName);
                  return checkTypeReferenceOrExpressionWithTypeArguments(node);
              }
              function checkExpressionWithTypeArguments(node) {
                  checkGrammarExpressionWithTypeArgumentsInStrictMode(node.expression);
                  return checkTypeReferenceOrExpressionWithTypeArguments(node);
              }
              function checkTypeReferenceOrExpressionWithTypeArguments(node) {
                  checkGrammarTypeArguments(node, node.typeArguments);
                  var type = getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                  if (type !== unknownType && node.typeArguments) {
                      var len = node.typeArguments.length;
                      for (var i = 0; i < len; i++) {
                          checkSourceElement(node.typeArguments[i]);
                          var constraint = getConstraintOfTypeParameter(type.target.typeParameters[i]);
                          if (produceDiagnostics && constraint) {
                              var typeArgument = type.typeArguments[i];
                              checkTypeAssignableTo(typeArgument, constraint, node, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
                          }
                      }
                  }
              }
              function checkTypeQuery(node) {
                  getTypeFromTypeQueryNode(node);
              }
              function checkTypeLiteral(node) {
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      var type = getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
                      checkIndexConstraints(type);
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function checkArrayType(node) {
                  checkSourceElement(node.elementType);
              }
              function checkTupleType(node) {
                  var hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
                  if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) {
                      grammarErrorOnNode(node, ts.Diagnostics.A_tuple_type_element_list_cannot_be_empty);
                  }
                  ts.forEach(node.elementTypes, checkSourceElement);
              }
              function checkUnionType(node) {
                  ts.forEach(node.types, checkSourceElement);
              }
              function isPrivateWithinAmbient(node) {
                  return (node.flags & 32) && ts.isInAmbientContext(node);
              }
              function checkSpecializedSignatureDeclaration(signatureDeclarationNode) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  var signature = getSignatureFromDeclaration(signatureDeclarationNode);
                  if (!signature.hasStringLiterals) {
                      return;
                  }
                  if (ts.nodeIsPresent(signatureDeclarationNode.body)) {
                      error(signatureDeclarationNode, ts.Diagnostics.A_signature_with_an_implementation_cannot_use_a_string_literal_type);
                      return;
                  }
                  var signaturesToCheck;
                  if (!signatureDeclarationNode.name && signatureDeclarationNode.parent && signatureDeclarationNode.parent.kind === 203) {
                      ts.Debug.assert(signatureDeclarationNode.kind === 139 || signatureDeclarationNode.kind === 140);
                      var signatureKind = signatureDeclarationNode.kind === 139 ? 0 : 1;
                      var containingSymbol = getSymbolOfNode(signatureDeclarationNode.parent);
                      var containingType = getDeclaredTypeOfSymbol(containingSymbol);
                      signaturesToCheck = getSignaturesOfType(containingType, signatureKind);
                  }
                  else {
                      signaturesToCheck = getSignaturesOfSymbol(getSymbolOfNode(signatureDeclarationNode));
                  }
                  for (var _i = 0; _i < signaturesToCheck.length; _i++) {
                      var otherSignature = signaturesToCheck[_i];
                      if (!otherSignature.hasStringLiterals && isSignatureAssignableTo(signature, otherSignature)) {
                          return;
                      }
                  }
                  error(signatureDeclarationNode, ts.Diagnostics.Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature);
              }
              function getEffectiveDeclarationFlags(n, flagsToCheck) {
                  var flags = ts.getCombinedNodeFlags(n);
                  if (n.parent.kind !== 203 && ts.isInAmbientContext(n)) {
                      if (!(flags & 2)) {
                          flags |= 1;
                      }
                      flags |= 2;
                  }
                  return flags & flagsToCheck;
              }
              function checkFunctionOrConstructorSymbol(symbol) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  function getCanonicalOverload(overloads, implementation) {
                      var implementationSharesContainerWithFirstOverload = implementation !== undefined && implementation.parent === overloads[0].parent;
                      return implementationSharesContainerWithFirstOverload ? implementation : overloads[0];
                  }
                  function checkFlagAgreementBetweenOverloads(overloads, implementation, flagsToCheck, someOverloadFlags, allOverloadFlags) {
                      var someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
                      if (someButNotAllOverloadFlags !== 0) {
                          var canonicalFlags = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck);
                          ts.forEach(overloads, function (o) {
                              var deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags;
                              if (deviation & 1) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_exported_or_not_exported);
                              }
                              else if (deviation & 2) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
                              }
                              else if (deviation & (32 | 64)) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
                              }
                          });
                      }
                  }
                  function checkQuestionTokenAgreementBetweenOverloads(overloads, implementation, someHaveQuestionToken, allHaveQuestionToken) {
                      if (someHaveQuestionToken !== allHaveQuestionToken) {
                          var canonicalHasQuestionToken = ts.hasQuestionToken(getCanonicalOverload(overloads, implementation));
                          ts.forEach(overloads, function (o) {
                              var deviation = ts.hasQuestionToken(o) !== canonicalHasQuestionToken;
                              if (deviation) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_optional_or_required);
                              }
                          });
                      }
                  }
                  var flagsToCheck = 1 | 2 | 32 | 64;
                  var someNodeFlags = 0;
                  var allNodeFlags = flagsToCheck;
                  var someHaveQuestionToken = false;
                  var allHaveQuestionToken = true;
                  var hasOverloads = false;
                  var bodyDeclaration;
                  var lastSeenNonAmbientDeclaration;
                  var previousDeclaration;
                  var declarations = symbol.declarations;
                  var isConstructor = (symbol.flags & 16384) !== 0;
                  function reportImplementationExpectedError(node) {
                      if (node.name && ts.nodeIsMissing(node.name)) {
                          return;
                      }
                      var seen = false;
                      var subsequentNode = ts.forEachChild(node.parent, function (c) {
                          if (seen) {
                              return c;
                          }
                          else {
                              seen = c === node;
                          }
                      });
                      if (subsequentNode) {
                          if (subsequentNode.kind === node.kind) {
                              var errorNode_1 = subsequentNode.name || subsequentNode;
                              if (node.name && subsequentNode.name && node.name.text === subsequentNode.name.text) {
                                  ts.Debug.assert(node.kind === 135 || node.kind === 134);
                                  ts.Debug.assert((node.flags & 128) !== (subsequentNode.flags & 128));
                                  var diagnostic = node.flags & 128 ? ts.Diagnostics.Function_overload_must_be_static : ts.Diagnostics.Function_overload_must_not_be_static;
                                  error(errorNode_1, diagnostic);
                                  return;
                              }
                              else if (ts.nodeIsPresent(subsequentNode.body)) {
                                  error(errorNode_1, ts.Diagnostics.Function_implementation_name_must_be_0, ts.declarationNameToString(node.name));
                                  return;
                              }
                          }
                      }
                      var errorNode = node.name || node;
                      if (isConstructor) {
                          error(errorNode, ts.Diagnostics.Constructor_implementation_is_missing);
                      }
                      else {
                          error(errorNode, ts.Diagnostics.Function_implementation_is_missing_or_not_immediately_following_the_declaration);
                      }
                  }
                  var isExportSymbolInsideModule = symbol.parent && symbol.parent.flags & 1536;
                  var duplicateFunctionDeclaration = false;
                  var multipleConstructorImplementation = false;
                  for (var _i = 0; _i < declarations.length; _i++) {
                      var current = declarations[_i];
                      var node = current;
                      var inAmbientContext = ts.isInAmbientContext(node);
                      var inAmbientContextOrInterface = node.parent.kind === 203 || node.parent.kind === 146 || inAmbientContext;
                      if (inAmbientContextOrInterface) {
                          previousDeclaration = undefined;
                      }
                      if (node.kind === 201 || node.kind === 135 || node.kind === 134 || node.kind === 136) {
                          var currentNodeFlags = getEffectiveDeclarationFlags(node, flagsToCheck);
                          someNodeFlags |= currentNodeFlags;
                          allNodeFlags &= currentNodeFlags;
                          someHaveQuestionToken = someHaveQuestionToken || ts.hasQuestionToken(node);
                          allHaveQuestionToken = allHaveQuestionToken && ts.hasQuestionToken(node);
                          if (ts.nodeIsPresent(node.body) && bodyDeclaration) {
                              if (isConstructor) {
                                  multipleConstructorImplementation = true;
                              }
                              else {
                                  duplicateFunctionDeclaration = true;
                              }
                          }
                          else if (!isExportSymbolInsideModule && previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) {
                              reportImplementationExpectedError(previousDeclaration);
                          }
                          if (ts.nodeIsPresent(node.body)) {
                              if (!bodyDeclaration) {
                                  bodyDeclaration = node;
                              }
                          }
                          else {
                              hasOverloads = true;
                          }
                          previousDeclaration = node;
                          if (!inAmbientContextOrInterface) {
                              lastSeenNonAmbientDeclaration = node;
                          }
                      }
                  }
                  if (multipleConstructorImplementation) {
                      ts.forEach(declarations, function (declaration) {
                          error(declaration, ts.Diagnostics.Multiple_constructor_implementations_are_not_allowed);
                      });
                  }
                  if (duplicateFunctionDeclaration) {
                      ts.forEach(declarations, function (declaration) {
                          error(declaration.name, ts.Diagnostics.Duplicate_function_implementation);
                      });
                  }
                  if (!isExportSymbolInsideModule && lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body) {
                      reportImplementationExpectedError(lastSeenNonAmbientDeclaration);
                  }
                  if (hasOverloads) {
                      checkFlagAgreementBetweenOverloads(declarations, bodyDeclaration, flagsToCheck, someNodeFlags, allNodeFlags);
                      checkQuestionTokenAgreementBetweenOverloads(declarations, bodyDeclaration, someHaveQuestionToken, allHaveQuestionToken);
                      if (bodyDeclaration) {
                          var signatures = getSignaturesOfSymbol(symbol);
                          var bodySignature = getSignatureFromDeclaration(bodyDeclaration);
                          if (!bodySignature.hasStringLiterals) {
                              for (var _a = 0; _a < signatures.length; _a++) {
                                  var signature = signatures[_a];
                                  if (!signature.hasStringLiterals && !isSignatureAssignableTo(bodySignature, signature)) {
                                      error(signature.declaration, ts.Diagnostics.Overload_signature_is_not_compatible_with_function_implementation);
                                      break;
                                  }
                              }
                          }
                      }
                  }
              }
              function checkExportsOnMergedDeclarations(node) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  var symbol = node.localSymbol;
                  if (!symbol) {
                      symbol = getSymbolOfNode(node);
                      if (!(symbol.flags & 7340032)) {
                          return;
                      }
                  }
                  if (ts.getDeclarationOfKind(symbol, node.kind) !== node) {
                      return;
                  }
                  var exportedDeclarationSpaces = 0;
                  var nonExportedDeclarationSpaces = 0;
                  ts.forEach(symbol.declarations, function (d) {
                      var declarationSpaces = getDeclarationSpaces(d);
                      if (getEffectiveDeclarationFlags(d, 1)) {
                          exportedDeclarationSpaces |= declarationSpaces;
                      }
                      else {
                          nonExportedDeclarationSpaces |= declarationSpaces;
                      }
                  });
                  var commonDeclarationSpace = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
                  if (commonDeclarationSpace) {
                      ts.forEach(symbol.declarations, function (d) {
                          if (getDeclarationSpaces(d) & commonDeclarationSpace) {
                              error(d.name, ts.Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, ts.declarationNameToString(d.name));
                          }
                      });
                  }
                  function getDeclarationSpaces(d) {
                      switch (d.kind) {
                          case 203:
                              return 2097152;
                          case 206:
                              return d.name.kind === 8 || ts.getModuleInstanceState(d) !== 0
                                  ? 4194304 | 1048576
                                  : 4194304;
                          case 202:
                          case 205:
                              return 2097152 | 1048576;
                          case 209:
                              var result = 0;
                              var target = resolveAlias(getSymbolOfNode(d));
                              ts.forEach(target.declarations, function (d) { result |= getDeclarationSpaces(d); });
                              return result;
                          default:
                              return 1048576;
                      }
                  }
              }
              function checkDecorator(node) {
                  var expression = node.expression;
                  var exprType = checkExpression(expression);
                  switch (node.parent.kind) {
                      case 202:
                          var classSymbol = getSymbolOfNode(node.parent);
                          var classConstructorType = getTypeOfSymbol(classSymbol);
                          var classDecoratorType = instantiateSingleCallFunctionType(getGlobalClassDecoratorType(), [classConstructorType]);
                          checkTypeAssignableTo(exprType, classDecoratorType, node);
                          break;
                      case 133:
                          checkTypeAssignableTo(exprType, getGlobalPropertyDecoratorType(), node);
                          break;
                      case 135:
                      case 137:
                      case 138:
                          var methodType = getTypeOfNode(node.parent);
                          var methodDecoratorType = instantiateSingleCallFunctionType(getGlobalMethodDecoratorType(), [methodType]);
                          checkTypeAssignableTo(exprType, methodDecoratorType, node);
                          break;
                      case 130:
                          checkTypeAssignableTo(exprType, getGlobalParameterDecoratorType(), node);
                          break;
                  }
              }
              function checkTypeNodeAsExpression(node) {
                  if (node && node.kind === 142) {
                      var type = getTypeFromTypeNode(node);
                      var shouldCheckIfUnknownType = type === unknownType && compilerOptions.separateCompilation;
                      if (!type || (!shouldCheckIfUnknownType && type.flags & (1048703 | 132 | 258))) {
                          return;
                      }
                      if (shouldCheckIfUnknownType || type.symbol.valueDeclaration) {
                          checkExpressionOrQualifiedName(node.typeName);
                      }
                  }
              }
              function checkTypeAnnotationAsExpression(node) {
                  switch (node.kind) {
                      case 133:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 130:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 135:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 137:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 138:
                          checkTypeNodeAsExpression(getSetAccessorTypeAnnotationNode(node));
                          break;
                  }
              }
              function checkParameterTypeAnnotationsAsExpressions(node) {
                  for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
                      var parameter = _a[_i];
                      checkTypeAnnotationAsExpression(parameter);
                  }
              }
              function checkDecorators(node) {
                  if (!node.decorators) {
                      return;
                  }
                  if (!ts.nodeCanBeDecorated(node)) {
                      return;
                  }
                  if (compilerOptions.emitDecoratorMetadata) {
                      switch (node.kind) {
                          case 202:
                              var constructor = ts.getFirstConstructorWithBody(node);
                              if (constructor) {
                                  checkParameterTypeAnnotationsAsExpressions(constructor);
                              }
                              break;
                          case 135:
                              checkParameterTypeAnnotationsAsExpressions(node);
                          case 138:
                          case 137:
                          case 133:
                          case 130:
                              checkTypeAnnotationAsExpression(node);
                              break;
                      }
                  }
                  emitDecorate = true;
                  if (node.kind === 130) {
                      emitParam = true;
                  }
                  ts.forEach(node.decorators, checkDecorator);
              }
              function checkFunctionDeclaration(node) {
                  if (produceDiagnostics) {
                      checkFunctionLikeDeclaration(node) ||
                          checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
                          checkGrammarFunctionName(node.name) ||
                          checkGrammarForGenerator(node);
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
              }
              function checkFunctionLikeDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  checkDecorators(node);
                  checkSignatureDeclaration(node);
                  if (node.name && node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  if (!ts.hasDynamicName(node)) {
                      var symbol = getSymbolOfNode(node);
                      var localSymbol = node.localSymbol || symbol;
                      var firstDeclaration = ts.getDeclarationOfKind(localSymbol, node.kind);
                      if (node === firstDeclaration) {
                          checkFunctionOrConstructorSymbol(localSymbol);
                      }
                      if (symbol.parent) {
                          if (ts.getDeclarationOfKind(symbol, node.kind) === node) {
                              checkFunctionOrConstructorSymbol(symbol);
                          }
                      }
                  }
                  checkSourceElement(node.body);
                  if (node.type && !isAccessor(node.kind) && !node.asteriskToken) {
                      checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
                  }
                  if (compilerOptions.noImplicitAny && ts.nodeIsMissing(node.body) && !node.type && !isPrivateWithinAmbient(node)) {
                      reportImplicitAnyError(node, anyType);
                  }
              }
              function checkBlock(node) {
                  if (node.kind === 180) {
                      checkGrammarStatementInAmbientContext(node);
                  }
                  ts.forEach(node.statements, checkSourceElement);
                  if (ts.isFunctionBlock(node) || node.kind === 207) {
                      checkFunctionExpressionBodies(node);
                  }
              }
              function checkCollisionWithArgumentsInGeneratedCode(node) {
                  if (!ts.hasRestParameters(node) || ts.isInAmbientContext(node) || ts.nodeIsMissing(node.body)) {
                      return;
                  }
                  ts.forEach(node.parameters, function (p) {
                      if (p.name && !ts.isBindingPattern(p.name) && p.name.text === argumentsSymbol.name) {
                          error(p, ts.Diagnostics.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters);
                      }
                  });
              }
              function needCollisionCheckForIdentifier(node, identifier, name) {
                  if (!(identifier && identifier.text === name)) {
                      return false;
                  }
                  if (node.kind === 133 ||
                      node.kind === 132 ||
                      node.kind === 135 ||
                      node.kind === 134 ||
                      node.kind === 137 ||
                      node.kind === 138) {
                      return false;
                  }
                  if (ts.isInAmbientContext(node)) {
                      return false;
                  }
                  var root = ts.getRootDeclaration(node);
                  if (root.kind === 130 && ts.nodeIsMissing(root.parent.body)) {
                      return false;
                  }
                  return true;
              }
              function checkCollisionWithCapturedThisVariable(node, name) {
                  if (needCollisionCheckForIdentifier(node, name, "_this")) {
                      potentialThisCollisions.push(node);
                  }
              }
              function checkIfThisIsCapturedInEnclosingScope(node) {
                  var current = node;
                  while (current) {
                      if (getNodeCheckFlags(current) & 4) {
                          var isDeclaration_1 = node.kind !== 65;
                          if (isDeclaration_1) {
                              error(node.name, ts.Diagnostics.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference);
                          }
                          else {
                              error(node, ts.Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference);
                          }
                          return;
                      }
                      current = current.parent;
                  }
              }
              function checkCollisionWithCapturedSuperVariable(node, name) {
                  if (!needCollisionCheckForIdentifier(node, name, "_super")) {
                      return;
                  }
                  var enclosingClass = ts.getAncestor(node, 202);
                  if (!enclosingClass || ts.isInAmbientContext(enclosingClass)) {
                      return;
                  }
                  if (ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
                      var isDeclaration_2 = node.kind !== 65;
                      if (isDeclaration_2) {
                          error(node, ts.Diagnostics.Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference);
                      }
                      else {
                          error(node, ts.Diagnostics.Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference);
                      }
                  }
              }
              function checkCollisionWithRequireExportsInGeneratedCode(node, name) {
                  if (!needCollisionCheckForIdentifier(node, name, "require") && !needCollisionCheckForIdentifier(node, name, "exports")) {
                      return;
                  }
                  if (node.kind === 206 && ts.getModuleInstanceState(node) !== 1) {
                      return;
                  }
                  var parent = getDeclarationContainer(node);
                  if (parent.kind === 228 && ts.isExternalModule(parent)) {
                      error(name, ts.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, ts.declarationNameToString(name), ts.declarationNameToString(name));
                  }
              }
              function checkVarDeclaredNamesNotShadowed(node) {
                  // - ScriptBody : StatementList
                  // It is a Syntax Error if any element of the LexicallyDeclaredNames of StatementList
                  // also occurs in the VarDeclaredNames of StatementList.
                  if ((ts.getCombinedNodeFlags(node) & 12288) !== 0 || ts.isParameterDeclaration(node)) {
                      return;
                  }
                  if (node.kind === 199 && !node.initializer) {
                      return;
                  }
                  var symbol = getSymbolOfNode(node);
                  if (symbol.flags & 1) {
                      var localDeclarationSymbol = resolveName(node, node.name.text, 3, undefined, undefined);
                      if (localDeclarationSymbol &&
                          localDeclarationSymbol !== symbol &&
                          localDeclarationSymbol.flags & 2) {
                          if (getDeclarationFlagsFromSymbol(localDeclarationSymbol) & 12288) {
                              var varDeclList = ts.getAncestor(localDeclarationSymbol.valueDeclaration, 200);
                              var container = varDeclList.parent.kind === 181 && varDeclList.parent.parent
                                  ? varDeclList.parent.parent
                                  : undefined;
                              var namesShareScope = container &&
                                  (container.kind === 180 && ts.isFunctionLike(container.parent) ||
                                      container.kind === 207 ||
                                      container.kind === 206 ||
                                      container.kind === 228);
                              if (!namesShareScope) {
                                  var name_9 = symbolToString(localDeclarationSymbol);
                                  error(node, ts.Diagnostics.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, name_9, name_9);
                              }
                          }
                      }
                  }
              }
              function checkParameterInitializer(node) {
                  if (ts.getRootDeclaration(node).kind !== 130) {
                      return;
                  }
                  var func = ts.getContainingFunction(node);
                  visit(node.initializer);
                  function visit(n) {
                      if (n.kind === 65) {
                          var referencedSymbol = getNodeLinks(n).resolvedSymbol;
                          if (referencedSymbol && referencedSymbol !== unknownSymbol && getSymbol(func.locals, referencedSymbol.name, 107455) === referencedSymbol) {
                              if (referencedSymbol.valueDeclaration.kind === 130) {
                                  if (referencedSymbol.valueDeclaration === node) {
                                      error(n, ts.Diagnostics.Parameter_0_cannot_be_referenced_in_its_initializer, ts.declarationNameToString(node.name));
                                      return;
                                  }
                                  if (referencedSymbol.valueDeclaration.pos < node.pos) {
                                      return;
                                  }
                              }
                              error(n, ts.Diagnostics.Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it, ts.declarationNameToString(node.name), ts.declarationNameToString(n));
                          }
                      }
                      else {
                          ts.forEachChild(n, visit);
                      }
                  }
              }
              function checkVariableLikeDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  checkDecorators(node);
                  checkSourceElement(node.type);
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                      if (node.initializer) {
                          checkExpressionCached(node.initializer);
                      }
                  }
                  if (ts.isBindingPattern(node.name)) {
                      ts.forEach(node.name.elements, checkSourceElement);
                  }
                  if (node.initializer && ts.getRootDeclaration(node).kind === 130 && ts.nodeIsMissing(ts.getContainingFunction(node).body)) {
                      error(node, ts.Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation);
                      return;
                  }
                  if (ts.isBindingPattern(node.name)) {
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), getWidenedTypeForVariableLikeDeclaration(node), node, undefined);
                          checkParameterInitializer(node);
                      }
                      return;
                  }
                  var symbol = getSymbolOfNode(node);
                  var type = getTypeOfVariableOrParameterOrProperty(symbol);
                  if (node === symbol.valueDeclaration) {
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), type, node, undefined);
                          checkParameterInitializer(node);
                      }
                  }
                  else {
                      var declarationType = getWidenedTypeForVariableLikeDeclaration(node);
                      if (type !== unknownType && declarationType !== unknownType && !isTypeIdenticalTo(type, declarationType)) {
                          error(node.name, ts.Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, ts.declarationNameToString(node.name), typeToString(type), typeToString(declarationType));
                      }
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), declarationType, node, undefined);
                      }
                  }
                  if (node.kind !== 133 && node.kind !== 132) {
                      checkExportsOnMergedDeclarations(node);
                      if (node.kind === 199 || node.kind === 153) {
                          checkVarDeclaredNamesNotShadowed(node);
                      }
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
              }
              function checkVariableDeclaration(node) {
                  checkGrammarVariableDeclaration(node);
                  return checkVariableLikeDeclaration(node);
              }
              function checkBindingElement(node) {
                  checkGrammarBindingElement(node);
                  return checkVariableLikeDeclaration(node);
              }
              function checkVariableStatement(node) {
                  checkGrammarDecorators(node) || checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) || checkGrammarModifiers(node) || checkGrammarVariableDeclarationList(node.declarationList) || checkGrammarForDisallowedLetOrConstStatement(node);
                  ts.forEach(node.declarationList.declarations, checkSourceElement);
              }
              function checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) {
                  if (node.modifiers) {
                      if (inBlockOrObjectLiteralExpression(node)) {
                          return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
                      }
                  }
              }
              function inBlockOrObjectLiteralExpression(node) {
                  while (node) {
                      if (node.kind === 180 || node.kind === 155) {
                          return true;
                      }
                      node = node.parent;
                  }
              }
              function checkExpressionStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
              }
              function checkIfStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
                  checkSourceElement(node.thenStatement);
                  checkSourceElement(node.elseStatement);
              }
              function checkDoStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkSourceElement(node.statement);
                  checkExpression(node.expression);
              }
              function checkWhileStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
                  checkSourceElement(node.statement);
              }
              function checkForStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.initializer && node.initializer.kind == 200) {
                          checkGrammarVariableDeclarationList(node.initializer);
                      }
                  }
                  if (node.initializer) {
                      if (node.initializer.kind === 200) {
                          ts.forEach(node.initializer.declarations, checkVariableDeclaration);
                      }
                      else {
                          checkExpression(node.initializer);
                      }
                  }
                  if (node.condition)
                      checkExpression(node.condition);
                  if (node.incrementor)
                      checkExpression(node.incrementor);
                  checkSourceElement(node.statement);
              }
              function checkForOfStatement(node) {
                  checkGrammarForInOrForOfStatement(node);
                  if (node.initializer.kind === 200) {
                      checkForInOrForOfVariableDeclaration(node);
                  }
                  else {
                      var varExpr = node.initializer;
                      var iteratedType = checkRightHandSideOfForOf(node.expression);
                      if (varExpr.kind === 154 || varExpr.kind === 155) {
                          checkDestructuringAssignment(varExpr, iteratedType || unknownType);
                      }
                      else {
                          var leftType = checkExpression(varExpr);
                          checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_of_statement, ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant);
                          if (iteratedType) {
                              checkTypeAssignableTo(iteratedType, leftType, varExpr, undefined);
                          }
                      }
                  }
                  checkSourceElement(node.statement);
              }
              function checkForInStatement(node) {
                  checkGrammarForInOrForOfStatement(node);
                  if (node.initializer.kind === 200) {
                      var variable = node.initializer.declarations[0];
                      if (variable && ts.isBindingPattern(variable.name)) {
                          error(variable.name, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
                      }
                      checkForInOrForOfVariableDeclaration(node);
                  }
                  else {
                      var varExpr = node.initializer;
                      var leftType = checkExpression(varExpr);
                      if (varExpr.kind === 154 || varExpr.kind === 155) {
                          error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
                      }
                      else if (!allConstituentTypesHaveKind(leftType, 1 | 258)) {
                          error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any);
                      }
                      else {
                          checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_in_statement, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant);
                      }
                  }
                  var rightType = checkExpression(node.expression);
                  if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
                      error(node.expression, ts.Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  checkSourceElement(node.statement);
              }
              function checkForInOrForOfVariableDeclaration(iterationStatement) {
                  var variableDeclarationList = iterationStatement.initializer;
                  if (variableDeclarationList.declarations.length >= 1) {
                      var decl = variableDeclarationList.declarations[0];
                      checkVariableDeclaration(decl);
                  }
              }
              function checkRightHandSideOfForOf(rhsExpression) {
                  var expressionType = getTypeOfExpression(rhsExpression);
                  return checkIteratedTypeOrElementType(expressionType, rhsExpression, true);
              }
              function checkIteratedTypeOrElementType(inputType, errorNode, allowStringInput) {
                  if (inputType.flags & 1) {
                      return inputType;
                  }
                  if (languageVersion >= 2) {
                      return checkIteratedType(inputType, errorNode) || anyType;
                  }
                  if (allowStringInput) {
                      return checkElementTypeOfArrayOrString(inputType, errorNode);
                  }
                  if (isArrayLikeType(inputType)) {
                      var indexType = getIndexTypeOfType(inputType, 1);
                      if (indexType) {
                          return indexType;
                      }
                  }
                  error(errorNode, ts.Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType));
                  return unknownType;
              }
              function checkIteratedType(iterable, errorNode) {
                  ts.Debug.assert(languageVersion >= 2);
                  var iteratedType = getIteratedType(iterable, errorNode);
                  if (errorNode && iteratedType) {
                      checkTypeAssignableTo(iterable, createIterableType(iteratedType), errorNode);
                  }
                  return iteratedType;
                  function getIteratedType(iterable, errorNode) {
                      // We want to treat type as an iterable, and get the type it is an iterable of. The iterable
                      // must have the following structure (annotated with the names of the variables below):
                      //
                      // { // iterable
                      //     [Symbol.iterator]: { // iteratorFunction
                      //         (): { // iterator
                      //             next: { // iteratorNextFunction
                      //                 (): { // iteratorNextResult
                      //                     value: T // iteratorNextValue
                      //                 }
                      //             }
                      //         }
                      //     }
                      // }
                      //
                      // T is the type we are after. At every level that involves analyzing return types
                      // of signatures, we union the return types of all the signatures.
                      //
                      // Another thing to note is that at any step of this process, we could run into a dead end,
                      // meaning either the property is missing, or we run into the anyType. If either of these things
                      // happens, we return undefined to signal that we could not find the iterated type. If a property
                      // is missing, and the previous step did not result in 'any', then we also give an error if the
                      // caller requested it. Then the caller can decide what to do in the case where there is no iterated
                      // type. This is different from returning anyType, because that would signify that we have matched the
                      // whole pattern and that T (above) is 'any'.
                      if (allConstituentTypesHaveKind(iterable, 1)) {
                          return undefined;
                      }
                      if ((iterable.flags & 4096) && iterable.target === globalIterableType) {
                          return iterable.typeArguments[0];
                      }
                      var iteratorFunction = getTypeOfPropertyOfType(iterable, ts.getPropertyNameForKnownSymbolName("iterator"));
                      if (iteratorFunction && allConstituentTypesHaveKind(iteratorFunction, 1)) {
                          return undefined;
                      }
                      var iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, 0) : emptyArray;
                      if (iteratorFunctionSignatures.length === 0) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator);
                          }
                          return undefined;
                      }
                      var iterator = getUnionType(ts.map(iteratorFunctionSignatures, getReturnTypeOfSignature));
                      if (allConstituentTypesHaveKind(iterator, 1)) {
                          return undefined;
                      }
                      var iteratorNextFunction = getTypeOfPropertyOfType(iterator, "next");
                      if (iteratorNextFunction && allConstituentTypesHaveKind(iteratorNextFunction, 1)) {
                          return undefined;
                      }
                      var iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, 0) : emptyArray;
                      if (iteratorNextFunctionSignatures.length === 0) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.An_iterator_must_have_a_next_method);
                          }
                          return undefined;
                      }
                      var iteratorNextResult = getUnionType(ts.map(iteratorNextFunctionSignatures, getReturnTypeOfSignature));
                      if (allConstituentTypesHaveKind(iteratorNextResult, 1)) {
                          return undefined;
                      }
                      var iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value");
                      if (!iteratorNextValue) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property);
                          }
                          return undefined;
                      }
                      return iteratorNextValue;
                  }
              }
              function checkElementTypeOfArrayOrString(arrayOrStringType, errorNode) {
                  ts.Debug.assert(languageVersion < 2);
                  var arrayType = removeTypesFromUnionType(arrayOrStringType, 258, true, true);
                  var hasStringConstituent = arrayOrStringType !== arrayType;
                  var reportedError = false;
                  if (hasStringConstituent) {
                      if (languageVersion < 1) {
                          error(errorNode, ts.Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher);
                          reportedError = true;
                      }
                      if (arrayType === emptyObjectType) {
                          return stringType;
                      }
                  }
                  if (!isArrayLikeType(arrayType)) {
                      if (!reportedError) {
                          var diagnostic = hasStringConstituent
                              ? ts.Diagnostics.Type_0_is_not_an_array_type
                              : ts.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type;
                          error(errorNode, diagnostic, typeToString(arrayType));
                      }
                      return hasStringConstituent ? stringType : unknownType;
                  }
                  var arrayElementType = getIndexTypeOfType(arrayType, 1) || unknownType;
                  if (hasStringConstituent) {
                      if (arrayElementType.flags & 258) {
                          return stringType;
                      }
                      return getUnionType([arrayElementType, stringType]);
                  }
                  return arrayElementType;
              }
              function checkBreakOrContinueStatement(node) {
                  checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node);
              }
              function isGetAccessorWithAnnotatatedSetAccessor(node) {
                  return !!(node.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 138)));
              }
              function checkReturnStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      var functionBlock = ts.getContainingFunction(node);
                      if (!functionBlock) {
                          grammarErrorOnFirstToken(node, ts.Diagnostics.A_return_statement_can_only_be_used_within_a_function_body);
                      }
                  }
                  if (node.expression) {
                      var func = ts.getContainingFunction(node);
                      if (func) {
                          var returnType = getReturnTypeOfSignature(getSignatureFromDeclaration(func));
                          var exprType = checkExpressionCached(node.expression);
                          if (func.kind === 138) {
                              error(node.expression, ts.Diagnostics.Setters_cannot_return_a_value);
                          }
                          else {
                              if (func.kind === 136) {
                                  if (!isTypeAssignableTo(exprType, returnType)) {
                                      error(node.expression, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class);
                                  }
                              }
                              else if (func.type || isGetAccessorWithAnnotatatedSetAccessor(func)) {
                                  checkTypeAssignableTo(exprType, returnType, node.expression, undefined);
                              }
                          }
                      }
                  }
              }
              function checkWithStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.parserContextFlags & 1) {
                          grammarErrorOnFirstToken(node, ts.Diagnostics.with_statements_are_not_allowed_in_strict_mode);
                      }
                  }
                  checkExpression(node.expression);
                  error(node.expression, ts.Diagnostics.All_symbols_within_a_with_block_will_be_resolved_to_any);
              }
              function checkSwitchStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  var firstDefaultClause;
                  var hasDuplicateDefaultClause = false;
                  var expressionType = checkExpression(node.expression);
                  ts.forEach(node.caseBlock.clauses, function (clause) {
                      if (clause.kind === 222 && !hasDuplicateDefaultClause) {
                          if (firstDefaultClause === undefined) {
                              firstDefaultClause = clause;
                          }
                          else {
                              var sourceFile = ts.getSourceFileOfNode(node);
                              var start = ts.skipTrivia(sourceFile.text, clause.pos);
                              var end = clause.statements.length > 0 ? clause.statements[0].pos : clause.end;
                              grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement);
                              hasDuplicateDefaultClause = true;
                          }
                      }
                      if (produceDiagnostics && clause.kind === 221) {
                          var caseClause = clause;
                          var caseType = checkExpression(caseClause.expression);
                          if (!isTypeAssignableTo(expressionType, caseType)) {
                              checkTypeAssignableTo(caseType, expressionType, caseClause.expression, undefined);
                          }
                      }
                      ts.forEach(clause.statements, checkSourceElement);
                  });
              }
              function checkLabeledStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      var current = node.parent;
                      while (current) {
                          if (ts.isFunctionLike(current)) {
                              break;
                          }
                          if (current.kind === 195 && current.label.text === node.label.text) {
                              var sourceFile = ts.getSourceFileOfNode(node);
                              grammarErrorOnNode(node.label, ts.Diagnostics.Duplicate_label_0, ts.getTextOfNodeFromSourceText(sourceFile.text, node.label));
                              break;
                          }
                          current = current.parent;
                      }
                  }
                  checkSourceElement(node.statement);
              }
              function checkThrowStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.expression === undefined) {
                          grammarErrorAfterFirstToken(node, ts.Diagnostics.Line_break_not_permitted_here);
                      }
                  }
                  if (node.expression) {
                      checkExpression(node.expression);
                  }
              }
              function checkTryStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkBlock(node.tryBlock);
                  var catchClause = node.catchClause;
                  if (catchClause) {
                      if (catchClause.variableDeclaration) {
                          if (catchClause.variableDeclaration.name.kind !== 65) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.name, ts.Diagnostics.Catch_clause_variable_name_must_be_an_identifier);
                          }
                          else if (catchClause.variableDeclaration.type) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.type, ts.Diagnostics.Catch_clause_variable_cannot_have_a_type_annotation);
                          }
                          else if (catchClause.variableDeclaration.initializer) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.initializer, ts.Diagnostics.Catch_clause_variable_cannot_have_an_initializer);
                          }
                          else {
                              var identifierName = catchClause.variableDeclaration.name.text;
                              var locals = catchClause.block.locals;
                              if (locals && ts.hasProperty(locals, identifierName)) {
                                  var localSymbol = locals[identifierName];
                                  if (localSymbol && (localSymbol.flags & 2) !== 0) {
                                      grammarErrorOnNode(localSymbol.valueDeclaration, ts.Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause, identifierName);
                                  }
                              }
                              checkGrammarEvalOrArgumentsInStrictMode(node, catchClause.variableDeclaration.name);
                          }
                      }
                      checkBlock(catchClause.block);
                  }
                  if (node.finallyBlock) {
                      checkBlock(node.finallyBlock);
                  }
              }
              function checkIndexConstraints(type) {
                  var declaredNumberIndexer = getIndexDeclarationOfSymbol(type.symbol, 1);
                  var declaredStringIndexer = getIndexDeclarationOfSymbol(type.symbol, 0);
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType || numberIndexType) {
                      ts.forEach(getPropertiesOfObjectType(type), function (prop) {
                          var propType = getTypeOfSymbol(prop);
                          checkIndexConstraintForProperty(prop, propType, type, declaredStringIndexer, stringIndexType, 0);
                          checkIndexConstraintForProperty(prop, propType, type, declaredNumberIndexer, numberIndexType, 1);
                      });
                      if (type.flags & 1024 && type.symbol.valueDeclaration.kind === 202) {
                          var classDeclaration = type.symbol.valueDeclaration;
                          for (var _i = 0, _a = classDeclaration.members; _i < _a.length; _i++) {
                              var member = _a[_i];
                              if (!(member.flags & 128) && ts.hasDynamicName(member)) {
                                  var propType = getTypeOfSymbol(member.symbol);
                                  checkIndexConstraintForProperty(member.symbol, propType, type, declaredStringIndexer, stringIndexType, 0);
                                  checkIndexConstraintForProperty(member.symbol, propType, type, declaredNumberIndexer, numberIndexType, 1);
                              }
                          }
                      }
                  }
                  var errorNode;
                  if (stringIndexType && numberIndexType) {
                      errorNode = declaredNumberIndexer || declaredStringIndexer;
                      if (!errorNode && (type.flags & 2048)) {
                          var someBaseTypeHasBothIndexers = ts.forEach(getBaseTypes(type), function (base) { return getIndexTypeOfType(base, 0) && getIndexTypeOfType(base, 1); });
                          errorNode = someBaseTypeHasBothIndexers ? undefined : type.symbol.declarations[0];
                      }
                  }
                  if (errorNode && !isTypeAssignableTo(numberIndexType, stringIndexType)) {
                      error(errorNode, ts.Diagnostics.Numeric_index_type_0_is_not_assignable_to_string_index_type_1, typeToString(numberIndexType), typeToString(stringIndexType));
                  }
                  function checkIndexConstraintForProperty(prop, propertyType, containingType, indexDeclaration, indexType, indexKind) {
                      if (!indexType) {
                          return;
                      }
                      if (indexKind === 1 && !isNumericName(prop.valueDeclaration.name)) {
                          return;
                      }
                      var errorNode;
                      if (prop.valueDeclaration.name.kind === 128 || prop.parent === containingType.symbol) {
                          errorNode = prop.valueDeclaration;
                      }
                      else if (indexDeclaration) {
                          errorNode = indexDeclaration;
                      }
                      else if (containingType.flags & 2048) {
                          var someBaseClassHasBothPropertyAndIndexer = ts.forEach(getBaseTypes(containingType), function (base) { return getPropertyOfObjectType(base, prop.name) && getIndexTypeOfType(base, indexKind); });
                          errorNode = someBaseClassHasBothPropertyAndIndexer ? undefined : containingType.symbol.declarations[0];
                      }
                      if (errorNode && !isTypeAssignableTo(propertyType, indexType)) {
                          var errorMessage = indexKind === 0
                              ? ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_string_index_type_2
                              : ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2;
                          error(errorNode, errorMessage, symbolToString(prop), typeToString(propertyType), typeToString(indexType));
                      }
                  }
              }
              function checkTypeNameIsReserved(name, message) {
                  switch (name.text) {
                      case "any":
                      case "number":
                      case "boolean":
                      case "string":
                      case "symbol":
                      case "void":
                          error(name, message, name.text);
                  }
              }
              function checkTypeParameters(typeParameterDeclarations) {
                  if (typeParameterDeclarations) {
                      for (var i = 0, n = typeParameterDeclarations.length; i < n; i++) {
                          var node = typeParameterDeclarations[i];
                          checkTypeParameter(node);
                          if (produceDiagnostics) {
                              for (var j = 0; j < i; j++) {
                                  if (typeParameterDeclarations[j].symbol === node.symbol) {
                                      error(node.name, ts.Diagnostics.Duplicate_identifier_0, ts.declarationNameToString(node.name));
                                  }
                              }
                          }
                      }
                  }
              }
              function checkClassExpression(node) {
                  grammarErrorOnNode(node, ts.Diagnostics.class_expressions_are_not_currently_supported);
                  ts.forEach(node.members, checkSourceElement);
                  return unknownType;
              }
              function checkClassDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  if (node.parent.kind !== 207 && node.parent.kind !== 228) {
                      grammarErrorOnNode(node, ts.Diagnostics.class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration);
                  }
                  if (!node.name && !(node.flags & 256)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name);
                  }
                  checkGrammarClassDeclarationHeritageClauses(node);
                  checkDecorators(node);
                  if (node.name) {
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Class_name_cannot_be_0);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
                  checkTypeParameters(node.typeParameters);
                  checkExportsOnMergedDeclarations(node);
                  var symbol = getSymbolOfNode(node);
                  var type = getDeclaredTypeOfSymbol(symbol);
                  var staticType = getTypeOfSymbol(symbol);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                  if (baseTypeNode) {
                      if (!ts.isSupportedExpressionWithTypeArguments(baseTypeNode)) {
                          error(baseTypeNode.expression, ts.Diagnostics.Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses);
                      }
                      emitExtends = emitExtends || !ts.isInAmbientContext(node);
                      checkExpressionWithTypeArguments(baseTypeNode);
                  }
                  var baseTypes = getBaseTypes(type);
                  if (baseTypes.length) {
                      if (produceDiagnostics) {
                          var baseType = baseTypes[0];
                          checkTypeAssignableTo(type, baseType, node.name || node, ts.Diagnostics.Class_0_incorrectly_extends_base_class_1);
                          var staticBaseType = getTypeOfSymbol(baseType.symbol);
                          checkTypeAssignableTo(staticType, getTypeWithoutConstructors(staticBaseType), node.name || node, ts.Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1);
                          if (baseType.symbol !== resolveEntityName(baseTypeNode.expression, 107455)) {
                              error(baseTypeNode, ts.Diagnostics.Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0, typeToString(baseType));
                          }
                          checkKindsOfPropertyMemberOverrides(type, baseType);
                      }
                  }
                  if (baseTypes.length || (baseTypeNode && compilerOptions.separateCompilation)) {
                      checkExpressionOrQualifiedName(baseTypeNode.expression);
                  }
                  var implementedTypeNodes = ts.getClassImplementsHeritageClauseElements(node);
                  if (implementedTypeNodes) {
                      ts.forEach(implementedTypeNodes, function (typeRefNode) {
                          if (!ts.isSupportedExpressionWithTypeArguments(typeRefNode)) {
                              error(typeRefNode.expression, ts.Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
                          }
                          checkExpressionWithTypeArguments(typeRefNode);
                          if (produceDiagnostics) {
                              var t = getTypeFromTypeNode(typeRefNode);
                              if (t !== unknownType) {
                                  var declaredType = (t.flags & 4096) ? t.target : t;
                                  if (declaredType.flags & (1024 | 2048)) {
                                      checkTypeAssignableTo(type, t, node.name || node, ts.Diagnostics.Class_0_incorrectly_implements_interface_1);
                                  }
                                  else {
                                      error(typeRefNode, ts.Diagnostics.A_class_may_only_implement_another_class_or_interface);
                                  }
                              }
                          }
                      });
                  }
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      checkIndexConstraints(type);
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function getTargetSymbol(s) {
                  return s.flags & 16777216 ? getSymbolLinks(s).target : s;
              }
              function checkKindsOfPropertyMemberOverrides(type, baseType) {
                  // TypeScript 1.0 spec (April 2014): 8.2.3
                  // A derived class inherits all members from its base class it doesn't override.
                  // Inheritance means that a derived class implicitly contains all non - overridden members of the base class.
                  // Both public and private property members are inherited, but only public property members can be overridden.
                  // A property member in a derived class is said to override a property member in a base class
                  // when the derived class property member has the same name and kind(instance or static)
                  // as the base class property member.
                  // The type of an overriding property member must be assignable(section 3.8.4)
                  // to the type of the overridden property member, or otherwise a compile - time error occurs.
                  // Base class instance member functions can be overridden by derived class instance member functions,
                  // but not by other kinds of members.
                  // Base class instance member variables and accessors can be overridden by
                  // derived class instance member variables and accessors, but not by other kinds of members.
                  var baseProperties = getPropertiesOfObjectType(baseType);
                  for (var _i = 0; _i < baseProperties.length; _i++) {
                      var baseProperty = baseProperties[_i];
                      var base = getTargetSymbol(baseProperty);
                      if (base.flags & 134217728) {
                          continue;
                      }
                      var derived = getTargetSymbol(getPropertyOfObjectType(type, base.name));
                      if (derived) {
                          var baseDeclarationFlags = getDeclarationFlagsFromSymbol(base);
                          var derivedDeclarationFlags = getDeclarationFlagsFromSymbol(derived);
                          if ((baseDeclarationFlags & 32) || (derivedDeclarationFlags & 32)) {
                              continue;
                          }
                          if ((baseDeclarationFlags & 128) !== (derivedDeclarationFlags & 128)) {
                              continue;
                          }
                          if ((base.flags & derived.flags & 8192) || ((base.flags & 98308) && (derived.flags & 98308))) {
                              continue;
                          }
                          var errorMessage = void 0;
                          if (base.flags & 8192) {
                              if (derived.flags & 98304) {
                                  errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
                              }
                              else {
                                  ts.Debug.assert((derived.flags & 4) !== 0);
                                  errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property;
                              }
                          }
                          else if (base.flags & 4) {
                              ts.Debug.assert((derived.flags & 8192) !== 0);
                              errorMessage = ts.Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
                          }
                          else {
                              ts.Debug.assert((base.flags & 98304) !== 0);
                              ts.Debug.assert((derived.flags & 8192) !== 0);
                              errorMessage = ts.Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
                          }
                          error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
                      }
                  }
              }
              function isAccessor(kind) {
                  return kind === 137 || kind === 138;
              }
              function areTypeParametersIdentical(list1, list2) {
                  if (!list1 && !list2) {
                      return true;
                  }
                  if (!list1 || !list2 || list1.length !== list2.length) {
                      return false;
                  }
                  for (var i = 0, len = list1.length; i < len; i++) {
                      var tp1 = list1[i];
                      var tp2 = list2[i];
                      if (tp1.name.text !== tp2.name.text) {
                          return false;
                      }
                      if (!tp1.constraint && !tp2.constraint) {
                          continue;
                      }
                      if (!tp1.constraint || !tp2.constraint) {
                          return false;
                      }
                      if (!isTypeIdenticalTo(getTypeFromTypeNode(tp1.constraint), getTypeFromTypeNode(tp2.constraint))) {
                          return false;
                      }
                  }
                  return true;
              }
              function checkInheritedPropertiesAreIdentical(type, typeNode) {
                  var baseTypes = getBaseTypes(type);
                  if (baseTypes.length < 2) {
                      return true;
                  }
                  var seen = {};
                  ts.forEach(resolveDeclaredMembers(type).declaredProperties, function (p) { seen[p.name] = { prop: p, containingType: type }; });
                  var ok = true;
                  for (var _i = 0; _i < baseTypes.length; _i++) {
                      var base = baseTypes[_i];
                      var properties = getPropertiesOfObjectType(base);
                      for (var _a = 0; _a < properties.length; _a++) {
                          var prop = properties[_a];
                          if (!ts.hasProperty(seen, prop.name)) {
                              seen[prop.name] = { prop: prop, containingType: base };
                          }
                          else {
                              var existing = seen[prop.name];
                              var isInheritedProperty = existing.containingType !== type;
                              if (isInheritedProperty && !isPropertyIdenticalTo(existing.prop, prop)) {
                                  ok = false;
                                  var typeName1 = typeToString(existing.containingType);
                                  var typeName2 = typeToString(base);
                                  var errorInfo = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2);
                                  errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2);
                                  diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(typeNode, errorInfo));
                              }
                          }
                      }
                  }
                  return ok;
              }
              function checkInterfaceDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarInterfaceDeclaration(node);
                  checkTypeParameters(node.typeParameters);
                  if (produceDiagnostics) {
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Interface_name_cannot_be_0);
                      checkExportsOnMergedDeclarations(node);
                      var symbol = getSymbolOfNode(node);
                      var firstInterfaceDecl = ts.getDeclarationOfKind(symbol, 203);
                      if (symbol.declarations.length > 1) {
                          if (node !== firstInterfaceDecl && !areTypeParametersIdentical(firstInterfaceDecl.typeParameters, node.typeParameters)) {
                              error(node.name, ts.Diagnostics.All_declarations_of_an_interface_must_have_identical_type_parameters);
                          }
                      }
                      if (node === firstInterfaceDecl) {
                          var type = getDeclaredTypeOfSymbol(symbol);
                          if (checkInheritedPropertiesAreIdentical(type, node.name)) {
                              ts.forEach(getBaseTypes(type), function (baseType) {
                                  checkTypeAssignableTo(type, baseType, node.name, ts.Diagnostics.Interface_0_incorrectly_extends_interface_1);
                              });
                              checkIndexConstraints(type);
                          }
                      }
                  }
                  ts.forEach(ts.getInterfaceBaseTypeNodes(node), function (heritageElement) {
                      if (!ts.isSupportedExpressionWithTypeArguments(heritageElement)) {
                          error(heritageElement.expression, ts.Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
                      }
                      checkExpressionWithTypeArguments(heritageElement);
                  });
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function checkTypeAliasDeclaration(node) {
                  checkGrammarDecorators(node) || checkGrammarModifiers(node);
                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_alias_name_cannot_be_0);
                  checkSourceElement(node.type);
              }
              function computeEnumMemberValues(node) {
                  var nodeLinks = getNodeLinks(node);
                  if (!(nodeLinks.flags & 128)) {
                      var enumSymbol = getSymbolOfNode(node);
                      var enumType = getDeclaredTypeOfSymbol(enumSymbol);
                      var autoValue = 0;
                      var ambient = ts.isInAmbientContext(node);
                      var enumIsConst = ts.isConst(node);
                      ts.forEach(node.members, function (member) {
                          if (member.name.kind !== 128 && isNumericLiteralName(member.name.text)) {
                              error(member.name, ts.Diagnostics.An_enum_member_cannot_have_a_numeric_name);
                          }
                          var initializer = member.initializer;
                          if (initializer) {
                              autoValue = getConstantValueForEnumMemberInitializer(initializer);
                              if (autoValue === undefined) {
                                  if (enumIsConst) {
                                      error(initializer, ts.Diagnostics.In_const_enum_declarations_member_initializer_must_be_constant_expression);
                                  }
                                  else if (!ambient) {
                                      checkTypeAssignableTo(checkExpression(initializer), enumType, initializer, undefined);
                                  }
                              }
                              else if (enumIsConst) {
                                  if (isNaN(autoValue)) {
                                      error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN);
                                  }
                                  else if (!isFinite(autoValue)) {
                                      error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value);
                                  }
                              }
                          }
                          else if (ambient && !enumIsConst) {
                              autoValue = undefined;
                          }
                          if (autoValue !== undefined) {
                              getNodeLinks(member).enumMemberValue = autoValue++;
                          }
                      });
                      nodeLinks.flags |= 128;
                  }
                  function getConstantValueForEnumMemberInitializer(initializer) {
                      return evalConstant(initializer);
                      function evalConstant(e) {
                          switch (e.kind) {
                              case 168:
                                  var value = evalConstant(e.operand);
                                  if (value === undefined) {
                                      return undefined;
                                  }
                                  switch (e.operator) {
                                      case 33: return value;
                                      case 34: return -value;
                                      case 47: return ~value;
                                  }
                                  return undefined;
                              case 170:
                                  var left = evalConstant(e.left);
                                  if (left === undefined) {
                                      return undefined;
                                  }
                                  var right = evalConstant(e.right);
                                  if (right === undefined) {
                                      return undefined;
                                  }
                                  switch (e.operatorToken.kind) {
                                      case 44: return left | right;
                                      case 43: return left & right;
                                      case 41: return left >> right;
                                      case 42: return left >>> right;
                                      case 40: return left << right;
                                      case 45: return left ^ right;
                                      case 35: return left * right;
                                      case 36: return left / right;
                                      case 33: return left + right;
                                      case 34: return left - right;
                                      case 37: return left % right;
                                  }
                                  return undefined;
                              case 7:
                                  return +e.text;
                              case 162:
                                  return evalConstant(e.expression);
                              case 65:
                              case 157:
                              case 156:
                                  var member = initializer.parent;
                                  var currentType = getTypeOfSymbol(getSymbolOfNode(member.parent));
                                  var enumType;
                                  var propertyName;
                                  if (e.kind === 65) {
                                      enumType = currentType;
                                      propertyName = e.text;
                                  }
                                  else {
                                      var expression;
                                      if (e.kind === 157) {
                                          if (e.argumentExpression === undefined ||
                                              e.argumentExpression.kind !== 8) {
                                              return undefined;
                                          }
                                          expression = e.expression;
                                          propertyName = e.argumentExpression.text;
                                      }
                                      else {
                                          expression = e.expression;
                                          propertyName = e.name.text;
                                      }
                                      var current = expression;
                                      while (current) {
                                          if (current.kind === 65) {
                                              break;
                                          }
                                          else if (current.kind === 156) {
                                              current = current.expression;
                                          }
                                          else {
                                              return undefined;
                                          }
                                      }
                                      enumType = checkExpression(expression);
                                      if (!(enumType.symbol && (enumType.symbol.flags & 384))) {
                                          return undefined;
                                      }
                                  }
                                  if (propertyName === undefined) {
                                      return undefined;
                                  }
                                  var property = getPropertyOfObjectType(enumType, propertyName);
                                  if (!property || !(property.flags & 8)) {
                                      return undefined;
                                  }
                                  var propertyDecl = property.valueDeclaration;
                                  if (member === propertyDecl) {
                                      return undefined;
                                  }
                                  if (!isDefinedBefore(propertyDecl, member)) {
                                      return undefined;
                                  }
                                  return getNodeLinks(propertyDecl).enumMemberValue;
                          }
                      }
                  }
              }
              function checkEnumDeclaration(node) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEnumDeclaration(node);
                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Enum_name_cannot_be_0);
                  checkCollisionWithCapturedThisVariable(node, node.name);
                  checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  checkExportsOnMergedDeclarations(node);
                  computeEnumMemberValues(node);
                  var enumIsConst = ts.isConst(node);
                  if (compilerOptions.separateCompilation && enumIsConst && ts.isInAmbientContext(node)) {
                      error(node.name, ts.Diagnostics.Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided);
                  }
                  var enumSymbol = getSymbolOfNode(node);
                  var firstDeclaration = ts.getDeclarationOfKind(enumSymbol, node.kind);
                  if (node === firstDeclaration) {
                      if (enumSymbol.declarations.length > 1) {
                          ts.forEach(enumSymbol.declarations, function (decl) {
                              if (ts.isConstEnumDeclaration(decl) !== enumIsConst) {
                                  error(decl.name, ts.Diagnostics.Enum_declarations_must_all_be_const_or_non_const);
                              }
                          });
                      }
                      var seenEnumMissingInitialInitializer = false;
                      ts.forEach(enumSymbol.declarations, function (declaration) {
                          if (declaration.kind !== 205) {
                              return false;
                          }
                          var enumDeclaration = declaration;
                          if (!enumDeclaration.members.length) {
                              return false;
                          }
                          var firstEnumMember = enumDeclaration.members[0];
                          if (!firstEnumMember.initializer) {
                              if (seenEnumMissingInitialInitializer) {
                                  error(firstEnumMember.name, ts.Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element);
                              }
                              else {
                                  seenEnumMissingInitialInitializer = true;
                              }
                          }
                      });
                  }
              }
              function getFirstNonAmbientClassOrFunctionDeclaration(symbol) {
                  var declarations = symbol.declarations;
                  for (var _i = 0; _i < declarations.length; _i++) {
                      var declaration = declarations[_i];
                      if ((declaration.kind === 202 ||
                          (declaration.kind === 201 && ts.nodeIsPresent(declaration.body))) &&
                          !ts.isInAmbientContext(declaration)) {
                          return declaration;
                      }
                  }
                  return undefined;
              }
              function inSameLexicalScope(node1, node2) {
                  var container1 = ts.getEnclosingBlockScopeContainer(node1);
                  var container2 = ts.getEnclosingBlockScopeContainer(node2);
                  if (isGlobalSourceFile(container1)) {
                      return isGlobalSourceFile(container2);
                  }
                  else if (isGlobalSourceFile(container2)) {
                      return false;
                  }
                  else {
                      return container1 === container2;
                  }
              }
              function checkModuleDeclaration(node) {
                  if (produceDiagnostics) {
                      if (!checkGrammarDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
                          if (!ts.isInAmbientContext(node) && node.name.kind === 8) {
                              grammarErrorOnNode(node.name, ts.Diagnostics.Only_ambient_modules_can_use_quoted_names);
                          }
                      }
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                      checkExportsOnMergedDeclarations(node);
                      var symbol = getSymbolOfNode(node);
                      if (symbol.flags & 512
                          && symbol.declarations.length > 1
                          && !ts.isInAmbientContext(node)
                          && ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation)) {
                          var firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol);
                          if (firstNonAmbientClassOrFunc) {
                              if (ts.getSourceFileOfNode(node) !== ts.getSourceFileOfNode(firstNonAmbientClassOrFunc)) {
                                  error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged);
                              }
                              else if (node.pos < firstNonAmbientClassOrFunc.pos) {
                                  error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged);
                              }
                          }
                          var mergedClass = ts.getDeclarationOfKind(symbol, 202);
                          if (mergedClass &&
                              inSameLexicalScope(node, mergedClass)) {
                              getNodeLinks(node).flags |= 2048;
                          }
                      }
                      if (node.name.kind === 8) {
                          if (!isGlobalSourceFile(node.parent)) {
                              error(node.name, ts.Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules);
                          }
                          if (isExternalModuleNameRelative(node.name.text)) {
                              error(node.name, ts.Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name);
                          }
                      }
                  }
                  checkSourceElement(node.body);
              }
              function getFirstIdentifier(node) {
                  while (true) {
                      if (node.kind === 127) {
                          node = node.left;
                      }
                      else if (node.kind === 156) {
                          node = node.expression;
                      }
                      else {
                          break;
                      }
                  }
                  ts.Debug.assert(node.kind === 65);
                  return node;
              }
              function checkExternalImportOrExportDeclaration(node) {
                  var moduleName = ts.getExternalModuleName(node);
                  if (!ts.nodeIsMissing(moduleName) && moduleName.kind !== 8) {
                      error(moduleName, ts.Diagnostics.String_literal_expected);
                      return false;
                  }
                  var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
                  if (node.parent.kind !== 228 && !inAmbientExternalModule) {
                      error(moduleName, node.kind === 216 ?
                          ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace :
                          ts.Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module);
                      return false;
                  }
                  if (inAmbientExternalModule && isExternalModuleNameRelative(moduleName.text)) {
                      error(node, ts.Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name);
                      return false;
                  }
                  return true;
              }
              function checkAliasSymbol(node) {
                  var symbol = getSymbolOfNode(node);
                  var target = resolveAlias(symbol);
                  if (target !== unknownSymbol) {
                      var excludedMeanings = (symbol.flags & 107455 ? 107455 : 0) |
                          (symbol.flags & 793056 ? 793056 : 0) |
                          (symbol.flags & 1536 ? 1536 : 0);
                      if (target.flags & excludedMeanings) {
                          var message = node.kind === 218 ?
                              ts.Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 :
                              ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0;
                          error(node, message, symbolToString(symbol));
                      }
                  }
              }
              function checkImportBinding(node) {
                  checkCollisionWithCapturedThisVariable(node, node.name);
                  checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  checkAliasSymbol(node);
              }
              function checkImportDeclaration(node) {
                  if (!checkGrammarImportDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_import_declaration_cannot_have_modifiers);
                  }
                  if (checkExternalImportOrExportDeclaration(node)) {
                      var importClause = node.importClause;
                      if (importClause) {
                          if (importClause.name) {
                              checkImportBinding(importClause);
                          }
                          if (importClause.namedBindings) {
                              if (importClause.namedBindings.kind === 212) {
                                  checkImportBinding(importClause.namedBindings);
                              }
                              else {
                                  ts.forEach(importClause.namedBindings.elements, checkImportBinding);
                              }
                          }
                      }
                  }
              }
              function checkImportEqualsDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node);
                  if (ts.isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
                      checkImportBinding(node);
                      if (node.flags & 1) {
                          markExportAsReferenced(node);
                      }
                      if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                          var target = resolveAlias(getSymbolOfNode(node));
                          if (target !== unknownSymbol) {
                              if (target.flags & 107455) {
                                  var moduleName = getFirstIdentifier(node.moduleReference);
                                  if (!(resolveEntityName(moduleName, 107455 | 1536).flags & 1536)) {
                                      error(moduleName, ts.Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, ts.declarationNameToString(moduleName));
                                  }
                              }
                              if (target.flags & 793056) {
                                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Import_name_cannot_be_0);
                              }
                          }
                      }
                      else {
                          if (languageVersion >= 2) {
                              grammarErrorOnNode(node, ts.Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead);
                          }
                      }
                  }
              }
              function checkExportDeclaration(node) {
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_declaration_cannot_have_modifiers);
                  }
                  if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
                      if (node.exportClause) {
                          ts.forEach(node.exportClause.elements, checkExportSpecifier);
                          var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
                          if (node.parent.kind !== 228 && !inAmbientExternalModule) {
                              error(node, ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
                          }
                      }
                      else {
                          var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
                          if (moduleSymbol && moduleSymbol.exports["export="]) {
                              error(node.moduleSpecifier, ts.Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
                          }
                      }
                  }
              }
              function checkExportSpecifier(node) {
                  checkAliasSymbol(node);
                  if (!node.parent.parent.moduleSpecifier) {
                      markExportAsReferenced(node);
                  }
              }
              function checkExportAssignment(node) {
                  var container = node.parent.kind === 228 ? node.parent : node.parent.parent;
                  if (container.kind === 206 && container.name.kind === 65) {
                      error(node, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace);
                      return;
                  }
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_assignment_cannot_have_modifiers);
                  }
                  if (node.expression.kind === 65) {
                      markExportAsReferenced(node);
                  }
                  else {
                      checkExpressionCached(node.expression);
                  }
                  checkExternalModuleExports(container);
                  if (node.isExportEquals && !ts.isInAmbientContext(node)) {
                      if (languageVersion >= 2) {
                          grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead);
                      }
                      else if (compilerOptions.module === 4) {
                          grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
                      }
                  }
              }
              function getModuleStatements(node) {
                  if (node.kind === 228) {
                      return node.statements;
                  }
                  if (node.kind === 206 && node.body.kind === 207) {
                      return node.body.statements;
                  }
                  return emptyArray;
              }
              function hasExportedMembers(moduleSymbol) {
                  for (var id in moduleSymbol.exports) {
                      if (id !== "export=") {
                          return true;
                      }
                  }
                  return false;
              }
              function checkExternalModuleExports(node) {
                  var moduleSymbol = getSymbolOfNode(node);
                  var links = getSymbolLinks(moduleSymbol);
                  if (!links.exportsChecked) {
                      var exportEqualsSymbol = moduleSymbol.exports["export="];
                      if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) {
                          var declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration;
                          error(declaration, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements);
                      }
                      links.exportsChecked = true;
                  }
              }
              function checkSourceElement(node) {
                  if (!node)
                      return;
                  switch (node.kind) {
                      case 129:
                          return checkTypeParameter(node);
                      case 130:
                          return checkParameter(node);
                      case 133:
                      case 132:
                          return checkPropertyDeclaration(node);
                      case 143:
                      case 144:
                      case 139:
                      case 140:
                          return checkSignatureDeclaration(node);
                      case 141:
                          return checkSignatureDeclaration(node);
                      case 135:
                      case 134:
                          return checkMethodDeclaration(node);
                      case 136:
                          return checkConstructorDeclaration(node);
                      case 137:
                      case 138:
                          return checkAccessorDeclaration(node);
                      case 142:
                          return checkTypeReferenceNode(node);
                      case 145:
                          return checkTypeQuery(node);
                      case 146:
                          return checkTypeLiteral(node);
                      case 147:
                          return checkArrayType(node);
                      case 148:
                          return checkTupleType(node);
                      case 149:
                          return checkUnionType(node);
                      case 150:
                          return checkSourceElement(node.type);
                      case 201:
                          return checkFunctionDeclaration(node);
                      case 180:
                      case 207:
                          return checkBlock(node);
                      case 181:
                          return checkVariableStatement(node);
                      case 183:
                          return checkExpressionStatement(node);
                      case 184:
                          return checkIfStatement(node);
                      case 185:
                          return checkDoStatement(node);
                      case 186:
                          return checkWhileStatement(node);
                      case 187:
                          return checkForStatement(node);
                      case 188:
                          return checkForInStatement(node);
                      case 189:
                          return checkForOfStatement(node);
                      case 190:
                      case 191:
                          return checkBreakOrContinueStatement(node);
                      case 192:
                          return checkReturnStatement(node);
                      case 193:
                          return checkWithStatement(node);
                      case 194:
                          return checkSwitchStatement(node);
                      case 195:
                          return checkLabeledStatement(node);
                      case 196:
                          return checkThrowStatement(node);
                      case 197:
                          return checkTryStatement(node);
                      case 199:
                          return checkVariableDeclaration(node);
                      case 153:
                          return checkBindingElement(node);
                      case 202:
                          return checkClassDeclaration(node);
                      case 203:
                          return checkInterfaceDeclaration(node);
                      case 204:
                          return checkTypeAliasDeclaration(node);
                      case 205:
                          return checkEnumDeclaration(node);
                      case 206:
                          return checkModuleDeclaration(node);
                      case 210:
                          return checkImportDeclaration(node);
                      case 209:
                          return checkImportEqualsDeclaration(node);
                      case 216:
                          return checkExportDeclaration(node);
                      case 215:
                          return checkExportAssignment(node);
                      case 182:
                          checkGrammarStatementInAmbientContext(node);
                          return;
                      case 198:
                          checkGrammarStatementInAmbientContext(node);
                          return;
                      case 219:
                          return checkMissingDeclaration(node);
                  }
              }
              function checkFunctionExpressionBodies(node) {
                  switch (node.kind) {
                      case 163:
                      case 164:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          checkFunctionExpressionOrObjectLiteralMethodBody(node);
                          break;
                      case 135:
                      case 134:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          if (ts.isObjectLiteralMethod(node)) {
                              checkFunctionExpressionOrObjectLiteralMethodBody(node);
                          }
                          break;
                      case 136:
                      case 137:
                      case 138:
                      case 201:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          break;
                      case 193:
                          checkFunctionExpressionBodies(node.expression);
                          break;
                      case 130:
                      case 133:
                      case 132:
                      case 151:
                      case 152:
                      case 153:
                      case 154:
                      case 155:
                      case 225:
                      case 156:
                      case 157:
                      case 158:
                      case 159:
                      case 160:
                      case 172:
                      case 178:
                      case 161:
                      case 162:
                      case 166:
                      case 167:
                      case 165:
                      case 168:
                      case 169:
                      case 170:
                      case 171:
                      case 174:
                      case 180:
                      case 207:
                      case 181:
                      case 183:
                      case 184:
                      case 185:
                      case 186:
                      case 187:
                      case 188:
                      case 189:
                      case 190:
                      case 191:
                      case 192:
                      case 194:
                      case 208:
                      case 221:
                      case 222:
                      case 195:
                      case 196:
                      case 197:
                      case 224:
                      case 199:
                      case 200:
                      case 202:
                      case 205:
                      case 227:
                      case 215:
                      case 228:
                          ts.forEachChild(node, checkFunctionExpressionBodies);
                          break;
                  }
              }
              function checkSourceFile(node) {
                  var start = new Date().getTime();
                  checkSourceFileWorker(node);
                  ts.checkTime += new Date().getTime() - start;
              }
              function checkSourceFileWorker(node) {
                  var links = getNodeLinks(node);
                  if (!(links.flags & 1)) {
                      checkGrammarSourceFile(node);
                      emitExtends = false;
                      emitDecorate = false;
                      emitParam = false;
                      potentialThisCollisions.length = 0;
                      ts.forEach(node.statements, checkSourceElement);
                      checkFunctionExpressionBodies(node);
                      if (ts.isExternalModule(node)) {
                          checkExternalModuleExports(node);
                      }
                      if (potentialThisCollisions.length) {
                          ts.forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope);
                          potentialThisCollisions.length = 0;
                      }
                      if (emitExtends) {
                          links.flags |= 8;
                      }
                      if (emitDecorate) {
                          links.flags |= 512;
                      }
                      if (emitParam) {
                          links.flags |= 1024;
                      }
                      links.flags |= 1;
                  }
              }
              function getDiagnostics(sourceFile) {
                  throwIfNonDiagnosticsProducing();
                  if (sourceFile) {
                      checkSourceFile(sourceFile);
                      return diagnostics.getDiagnostics(sourceFile.fileName);
                  }
                  ts.forEach(host.getSourceFiles(), checkSourceFile);
                  return diagnostics.getDiagnostics();
              }
              function getGlobalDiagnostics() {
                  throwIfNonDiagnosticsProducing();
                  return diagnostics.getGlobalDiagnostics();
              }
              function throwIfNonDiagnosticsProducing() {
                  if (!produceDiagnostics) {
                      throw new Error("Trying to get diagnostics from a type checker that does not produce them.");
                  }
              }
              function isInsideWithStatementBody(node) {
                  if (node) {
                      while (node.parent) {
                          if (node.parent.kind === 193 && node.parent.statement === node) {
                              return true;
                          }
                          node = node.parent;
                      }
                  }
                  return false;
              }
              function getSymbolsInScope(location, meaning) {
                  var symbols = {};
                  var memberFlags = 0;
                  if (isInsideWithStatementBody(location)) {
                      return [];
                  }
                  populateSymbols();
                  return symbolsToArray(symbols);
                  function populateSymbols() {
                      while (location) {
                          if (location.locals && !isGlobalSourceFile(location)) {
                              copySymbols(location.locals, meaning);
                          }
                          switch (location.kind) {
                              case 228:
                                  if (!ts.isExternalModule(location)) {
                                      break;
                                  }
                              case 206:
                                  copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
                                  break;
                              case 205:
                                  copySymbols(getSymbolOfNode(location).exports, meaning & 8);
                                  break;
                              case 202:
                              case 203:
                                  if (!(memberFlags & 128)) {
                                      copySymbols(getSymbolOfNode(location).members, meaning & 793056);
                                  }
                                  break;
                              case 163:
                                  if (location.name) {
                                      copySymbol(location.symbol, meaning);
                                  }
                                  break;
                          }
                          memberFlags = location.flags;
                          location = location.parent;
                      }
                      copySymbols(globals, meaning);
                  }
                  function copySymbol(symbol, meaning) {
                      if (symbol.flags & meaning) {
                          var id = symbol.name;
                          if (!isReservedMemberName(id) && !ts.hasProperty(symbols, id)) {
                              symbols[id] = symbol;
                          }
                      }
                  }
                  function copySymbols(source, meaning) {
                      if (meaning) {
                          for (var id in source) {
                              if (ts.hasProperty(source, id)) {
                                  copySymbol(source[id], meaning);
                              }
                          }
                      }
                  }
                  if (isInsideWithStatementBody(location)) {
                      return [];
                  }
                  while (location) {
                      if (location.locals && !isGlobalSourceFile(location)) {
                          copySymbols(location.locals, meaning);
                      }
                      switch (location.kind) {
                          case 228:
                              if (!ts.isExternalModule(location))
                                  break;
                          case 206:
                              copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
                              break;
                          case 205:
                              copySymbols(getSymbolOfNode(location).exports, meaning & 8);
                              break;
                          case 202:
                          case 203:
                              if (!(memberFlags & 128)) {
                                  copySymbols(getSymbolOfNode(location).members, meaning & 793056);
                              }
                              break;
                          case 163:
                              if (location.name) {
                                  copySymbol(location.symbol, meaning);
                              }
                              break;
                      }
                      memberFlags = location.flags;
                      location = location.parent;
                  }
                  copySymbols(globals, meaning);
                  return symbolsToArray(symbols);
              }
              function isTypeDeclarationName(name) {
                  return name.kind == 65 &&
                      isTypeDeclaration(name.parent) &&
                      name.parent.name === name;
              }
              function isTypeDeclaration(node) {
                  switch (node.kind) {
                      case 129:
                      case 202:
                      case 203:
                      case 204:
                      case 205:
                          return true;
                  }
              }
              function isTypeReferenceIdentifier(entityName) {
                  var node = entityName;
                  while (node.parent && node.parent.kind === 127) {
                      node = node.parent;
                  }
                  return node.parent && node.parent.kind === 142;
              }
              function isHeritageClauseElementIdentifier(entityName) {
                  var node = entityName;
                  while (node.parent && node.parent.kind === 156) {
                      node = node.parent;
                  }
                  return node.parent && node.parent.kind === 177;
              }
              function isTypeNode(node) {
                  if (142 <= node.kind && node.kind <= 150) {
                      return true;
                  }
                  switch (node.kind) {
                      case 112:
                      case 120:
                      case 122:
                      case 113:
                      case 123:
                          return true;
                      case 99:
                          return node.parent.kind !== 167;
                      case 8:
                          return node.parent.kind === 130;
                      case 177:
                          return true;
                      case 65:
                          if (node.parent.kind === 127 && node.parent.right === node) {
                              node = node.parent;
                          }
                          else if (node.parent.kind === 156 && node.parent.name === node) {
                              node = node.parent;
                          }
                      case 127:
                      case 156:
                          ts.Debug.assert(node.kind === 65 || node.kind === 127 || node.kind === 156, "'node' was expected to be a qualified name, identifier or property access in 'isTypeNode'.");
                          var parent_5 = node.parent;
                          if (parent_5.kind === 145) {
                              return false;
                          }
                          if (142 <= parent_5.kind && parent_5.kind <= 150) {
                              return true;
                          }
                          switch (parent_5.kind) {
                              case 177:
                                  return true;
                              case 129:
                                  return node === parent_5.constraint;
                              case 133:
                              case 132:
                              case 130:
                              case 199:
                                  return node === parent_5.type;
                              case 201:
                              case 163:
                              case 164:
                              case 136:
                              case 135:
                              case 134:
                              case 137:
                              case 138:
                                  return node === parent_5.type;
                              case 139:
                              case 140:
                              case 141:
                                  return node === parent_5.type;
                              case 161:
                                  return node === parent_5.type;
                              case 158:
                              case 159:
                                  return parent_5.typeArguments && ts.indexOf(parent_5.typeArguments, node) >= 0;
                              case 160:
                                  return false;
                          }
                  }
                  return false;
              }
              function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) {
                  while (nodeOnRightSide.parent.kind === 127) {
                      nodeOnRightSide = nodeOnRightSide.parent;
                  }
                  if (nodeOnRightSide.parent.kind === 209) {
                      return nodeOnRightSide.parent.moduleReference === nodeOnRightSide && nodeOnRightSide.parent;
                  }
                  if (nodeOnRightSide.parent.kind === 215) {
                      return nodeOnRightSide.parent.expression === nodeOnRightSide && nodeOnRightSide.parent;
                  }
                  return undefined;
              }
              function isInRightSideOfImportOrExportAssignment(node) {
                  return getLeftSideOfImportEqualsOrExportAssignment(node) !== undefined;
              }
              function getSymbolOfEntityNameOrPropertyAccessExpression(entityName) {
                  if (ts.isDeclarationName(entityName)) {
                      return getSymbolOfNode(entityName.parent);
                  }
                  if (entityName.parent.kind === 215) {
                      return resolveEntityName(entityName, 107455 | 793056 | 1536 | 8388608);
                  }
                  if (entityName.kind !== 156) {
                      if (isInRightSideOfImportOrExportAssignment(entityName)) {
                          return getSymbolOfPartOfRightHandSideOfImportEquals(entityName);
                      }
                  }
                  if (ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
                      entityName = entityName.parent;
                  }
                  if (isHeritageClauseElementIdentifier(entityName)) {
                      var meaning = entityName.parent.kind === 177 ? 793056 : 1536;
                      meaning |= 8388608;
                      return resolveEntityName(entityName, meaning);
                  }
                  else if (ts.isExpression(entityName)) {
                      if (ts.nodeIsMissing(entityName)) {
                          return undefined;
                      }
                      if (entityName.kind === 65) {
                          var meaning = 107455 | 8388608;
                          return resolveEntityName(entityName, meaning);
                      }
                      else if (entityName.kind === 156) {
                          var symbol = getNodeLinks(entityName).resolvedSymbol;
                          if (!symbol) {
                              checkPropertyAccessExpression(entityName);
                          }
                          return getNodeLinks(entityName).resolvedSymbol;
                      }
                      else if (entityName.kind === 127) {
                          var symbol = getNodeLinks(entityName).resolvedSymbol;
                          if (!symbol) {
                              checkQualifiedName(entityName);
                          }
                          return getNodeLinks(entityName).resolvedSymbol;
                      }
                  }
                  else if (isTypeReferenceIdentifier(entityName)) {
                      var meaning = entityName.parent.kind === 142 ? 793056 : 1536;
                      meaning |= 8388608;
                      return resolveEntityName(entityName, meaning);
                  }
                  return undefined;
              }
              function getSymbolInfo(node) {
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  if (ts.isDeclarationName(node)) {
                      return getSymbolOfNode(node.parent);
                  }
                  if (node.kind === 65 && isInRightSideOfImportOrExportAssignment(node)) {
                      return node.parent.kind === 215
                          ? getSymbolOfEntityNameOrPropertyAccessExpression(node)
                          : getSymbolOfPartOfRightHandSideOfImportEquals(node);
                  }
                  switch (node.kind) {
                      case 65:
                      case 156:
                      case 127:
                          return getSymbolOfEntityNameOrPropertyAccessExpression(node);
                      case 93:
                      case 91:
                          var type = checkExpression(node);
                          return type.symbol;
                      case 114:
                          var constructorDeclaration = node.parent;
                          if (constructorDeclaration && constructorDeclaration.kind === 136) {
                              return constructorDeclaration.parent.symbol;
                          }
                          return undefined;
                      case 8:
                          var moduleName;
                          if ((ts.isExternalModuleImportEqualsDeclaration(node.parent.parent) &&
                              ts.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) ||
                              ((node.parent.kind === 210 || node.parent.kind === 216) &&
                                  node.parent.moduleSpecifier === node)) {
                              return resolveExternalModuleName(node, node);
                          }
                      case 7:
                          if (node.parent.kind == 157 && node.parent.argumentExpression === node) {
                              var objectType = checkExpression(node.parent.expression);
                              if (objectType === unknownType)
                                  return undefined;
                              var apparentType = getApparentType(objectType);
                              if (apparentType === unknownType)
                                  return undefined;
                              return getPropertyOfType(apparentType, node.text);
                          }
                          break;
                  }
                  return undefined;
              }
              function getShorthandAssignmentValueSymbol(location) {
                  if (location && location.kind === 226) {
                      return resolveEntityName(location.name, 107455);
                  }
                  return undefined;
              }
              function getTypeOfNode(node) {
                  if (isInsideWithStatementBody(node)) {
                      return unknownType;
                  }
                  if (isTypeNode(node)) {
                      return getTypeFromTypeNode(node);
                  }
                  if (ts.isExpression(node)) {
                      return getTypeOfExpression(node);
                  }
                  if (isTypeDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      return getDeclaredTypeOfSymbol(symbol);
                  }
                  if (isTypeDeclarationName(node)) {
                      var symbol = getSymbolInfo(node);
                      return symbol && getDeclaredTypeOfSymbol(symbol);
                  }
                  if (ts.isDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      return getTypeOfSymbol(symbol);
                  }
                  if (ts.isDeclarationName(node)) {
                      var symbol = getSymbolInfo(node);
                      return symbol && getTypeOfSymbol(symbol);
                  }
                  if (isInRightSideOfImportOrExportAssignment(node)) {
                      var symbol = getSymbolInfo(node);
                      var declaredType = symbol && getDeclaredTypeOfSymbol(symbol);
                      return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol);
                  }
                  return unknownType;
              }
              function getTypeOfExpression(expr) {
                  if (ts.isRightSideOfQualifiedNameOrPropertyAccess(expr)) {
                      expr = expr.parent;
                  }
                  return checkExpression(expr);
              }
              function getAugmentedPropertiesOfType(type) {
                  type = getApparentType(type);
                  var propsByName = createSymbolTable(getPropertiesOfType(type));
                  if (getSignaturesOfType(type, 0).length || getSignaturesOfType(type, 1).length) {
                      ts.forEach(getPropertiesOfType(globalFunctionType), function (p) {
                          if (!ts.hasProperty(propsByName, p.name)) {
                              propsByName[p.name] = p;
                          }
                      });
                  }
                  return getNamedMembers(propsByName);
              }
              function getRootSymbols(symbol) {
                  if (symbol.flags & 268435456) {
                      var symbols = [];
                      var name_10 = symbol.name;
                      ts.forEach(getSymbolLinks(symbol).unionType.types, function (t) {
                          symbols.push(getPropertyOfType(t, name_10));
                      });
                      return symbols;
                  }
                  else if (symbol.flags & 67108864) {
                      var target = getSymbolLinks(symbol).target;
                      if (target) {
                          return [target];
                      }
                  }
                  return [symbol];
              }
              function isExternalModuleSymbol(symbol) {
                  return symbol.flags & 512 && symbol.declarations.length === 1 && symbol.declarations[0].kind === 228;
              }
              function getAliasNameSubstitution(symbol, getGeneratedNameForNode) {
                  if (languageVersion >= 2) {
                      return undefined;
                  }
                  var node = getDeclarationOfAliasSymbol(symbol);
                  if (node) {
                      if (node.kind === 211) {
                          var defaultKeyword;
                          if (languageVersion === 0) {
                              defaultKeyword = "[\"default\"]";
                          }
                          else {
                              defaultKeyword = ".default";
                          }
                          return getGeneratedNameForNode(node.parent) + defaultKeyword;
                      }
                      if (node.kind === 214) {
                          var moduleName = getGeneratedNameForNode(node.parent.parent.parent);
                          var propertyName = node.propertyName || node.name;
                          return moduleName + "." + ts.unescapeIdentifier(propertyName.text);
                      }
                  }
              }
              function getExportNameSubstitution(symbol, location, getGeneratedNameForNode) {
                  if (isExternalModuleSymbol(symbol.parent)) {
                      if (languageVersion >= 2 || compilerOptions.module === 4) {
                          return undefined;
                      }
                      return "exports." + ts.unescapeIdentifier(symbol.name);
                  }
                  var node = location;
                  var containerSymbol = getParentOfSymbol(symbol);
                  while (node) {
                      if ((node.kind === 206 || node.kind === 205) && getSymbolOfNode(node) === containerSymbol) {
                          return getGeneratedNameForNode(node) + "." + ts.unescapeIdentifier(symbol.name);
                      }
                      node = node.parent;
                  }
              }
              function getExpressionNameSubstitution(node, getGeneratedNameForNode) {
                  var symbol = getNodeLinks(node).resolvedSymbol || (ts.isDeclarationName(node) ? getSymbolOfNode(node.parent) : undefined);
                  if (symbol) {
                      if (symbol.parent) {
                          return getExportNameSubstitution(symbol, node.parent, getGeneratedNameForNode);
                      }
                      var exportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
                      if (symbol !== exportSymbol && !(exportSymbol.flags & 944)) {
                          return getExportNameSubstitution(exportSymbol, node.parent, getGeneratedNameForNode);
                      }
                      if (symbol.flags & 8388608) {
                          return getAliasNameSubstitution(symbol, getGeneratedNameForNode);
                      }
                  }
              }
              function isValueAliasDeclaration(node) {
                  switch (node.kind) {
                      case 209:
                      case 211:
                      case 212:
                      case 214:
                      case 218:
                          return isAliasResolvedToValue(getSymbolOfNode(node));
                      case 216:
                          var exportClause = node.exportClause;
                          return exportClause && ts.forEach(exportClause.elements, isValueAliasDeclaration);
                      case 215:
                          return node.expression && node.expression.kind === 65 ? isAliasResolvedToValue(getSymbolOfNode(node)) : true;
                  }
                  return false;
              }
              function isTopLevelValueImportEqualsWithEntityName(node) {
                  if (node.parent.kind !== 228 || !ts.isInternalModuleImportEqualsDeclaration(node)) {
                      return false;
                  }
                  var isValue = isAliasResolvedToValue(getSymbolOfNode(node));
                  return isValue && node.moduleReference && !ts.nodeIsMissing(node.moduleReference);
              }
              function isAliasResolvedToValue(symbol) {
                  var target = resolveAlias(symbol);
                  if (target === unknownSymbol && compilerOptions.separateCompilation) {
                      return true;
                  }
                  return target !== unknownSymbol && target && target.flags & 107455 && !isConstEnumOrConstEnumOnlyModule(target);
              }
              function isConstEnumOrConstEnumOnlyModule(s) {
                  return isConstEnumSymbol(s) || s.constEnumOnlyModule;
              }
              function isReferencedAliasDeclaration(node, checkChildren) {
                  if (ts.isAliasSymbolDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      if (getSymbolLinks(symbol).referenced) {
                          return true;
                      }
                  }
                  if (checkChildren) {
                      return ts.forEachChild(node, function (node) { return isReferencedAliasDeclaration(node, checkChildren); });
                  }
                  return false;
              }
              function isImplementationOfOverload(node) {
                  if (ts.nodeIsPresent(node.body)) {
                      var symbol = getSymbolOfNode(node);
                      var signaturesOfSymbol = getSignaturesOfSymbol(symbol);
                      return signaturesOfSymbol.length > 1 ||
                          (signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node);
                  }
                  return false;
              }
              function getNodeCheckFlags(node) {
                  return getNodeLinks(node).flags;
              }
              function getEnumMemberValue(node) {
                  computeEnumMemberValues(node.parent);
                  return getNodeLinks(node).enumMemberValue;
              }
              function getConstantValue(node) {
                  if (node.kind === 227) {
                      return getEnumMemberValue(node);
                  }
                  var symbol = getNodeLinks(node).resolvedSymbol;
                  if (symbol && (symbol.flags & 8)) {
                      if (ts.isConstEnumDeclaration(symbol.valueDeclaration.parent)) {
                          return getEnumMemberValue(symbol.valueDeclaration);
                      }
                  }
                  return undefined;
              }
              function serializeEntityName(node, getGeneratedNameForNode, fallbackPath) {
                  if (node.kind === 65) {
                      var substitution = getExpressionNameSubstitution(node, getGeneratedNameForNode);
                      var text = substitution || node.text;
                      if (fallbackPath) {
                          fallbackPath.push(text);
                      }
                      else {
                          return text;
                      }
                  }
                  else {
                      var left = serializeEntityName(node.left, getGeneratedNameForNode, fallbackPath);
                      var right = serializeEntityName(node.right, getGeneratedNameForNode, fallbackPath);
                      if (!fallbackPath) {
                          return left + "." + right;
                      }
                  }
              }
              function serializeTypeReferenceNode(node, getGeneratedNameForNode) {
                  var type = getTypeFromTypeNode(node);
                  if (type.flags & 16) {
                      return "void 0";
                  }
                  else if (type.flags & 8) {
                      return "Boolean";
                  }
                  else if (type.flags & 132) {
                      return "Number";
                  }
                  else if (type.flags & 258) {
                      return "String";
                  }
                  else if (type.flags & 8192) {
                      return "Array";
                  }
                  else if (type.flags & 1048576) {
                      return "Symbol";
                  }
                  else if (type === unknownType) {
                      var fallbackPath = [];
                      serializeEntityName(node.typeName, getGeneratedNameForNode, fallbackPath);
                      return fallbackPath;
                  }
                  else if (type.symbol && type.symbol.valueDeclaration) {
                      return serializeEntityName(node.typeName, getGeneratedNameForNode);
                  }
                  else if (typeHasCallOrConstructSignatures(type)) {
                      return "Function";
                  }
                  return "Object";
              }
              function serializeTypeNode(node, getGeneratedNameForNode) {
                  if (node) {
                      switch (node.kind) {
                          case 99:
                              return "void 0";
                          case 150:
                              return serializeTypeNode(node.type, getGeneratedNameForNode);
                          case 143:
                          case 144:
                              return "Function";
                          case 147:
                          case 148:
                              return "Array";
                          case 113:
                              return "Boolean";
                          case 122:
                          case 8:
                              return "String";
                          case 120:
                              return "Number";
                          case 142:
                              return serializeTypeReferenceNode(node, getGeneratedNameForNode);
                          case 145:
                          case 146:
                          case 149:
                          case 112:
                              break;
                          default:
                              ts.Debug.fail("Cannot serialize unexpected type node.");
                              break;
                      }
                  }
                  return "Object";
              }
              function serializeTypeOfNode(node, getGeneratedNameForNode) {
                  switch (node.kind) {
                      case 202: return "Function";
                      case 133: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 130: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 137: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 138: return serializeTypeNode(getSetAccessorTypeAnnotationNode(node), getGeneratedNameForNode);
                  }
                  if (ts.isFunctionLike(node)) {
                      return "Function";
                  }
                  return "void 0";
              }
              function serializeParameterTypesOfNode(node, getGeneratedNameForNode) {
                  if (node) {
                      var valueDeclaration;
                      if (node.kind === 202) {
                          valueDeclaration = ts.getFirstConstructorWithBody(node);
                      }
                      else if (ts.isFunctionLike(node) && ts.nodeIsPresent(node.body)) {
                          valueDeclaration = node;
                      }
                      if (valueDeclaration) {
                          var result;
                          var parameters = valueDeclaration.parameters;
                          var parameterCount = parameters.length;
                          if (parameterCount > 0) {
                              result = new Array(parameterCount);
                              for (var i = 0; i < parameterCount; i++) {
                                  if (parameters[i].dotDotDotToken) {
                                      var parameterType = parameters[i].type;
                                      if (parameterType.kind === 147) {
                                          parameterType = parameterType.elementType;
                                      }
                                      else if (parameterType.kind === 142 && parameterType.typeArguments && parameterType.typeArguments.length === 1) {
                                          parameterType = parameterType.typeArguments[0];
                                      }
                                      else {
                                          parameterType = undefined;
                                      }
                                      result[i] = serializeTypeNode(parameterType, getGeneratedNameForNode);
                                  }
                                  else {
                                      result[i] = serializeTypeOfNode(parameters[i], getGeneratedNameForNode);
                                  }
                              }
                              return result;
                          }
                      }
                  }
                  return emptyArray;
              }
              function serializeReturnTypeOfNode(node, getGeneratedNameForNode) {
                  if (node && ts.isFunctionLike(node)) {
                      return serializeTypeNode(node.type, getGeneratedNameForNode);
                  }
                  return "void 0";
              }
              function writeTypeOfDeclaration(declaration, enclosingDeclaration, flags, writer) {
                  var symbol = getSymbolOfNode(declaration);
                  var type = symbol && !(symbol.flags & (2048 | 131072))
                      ? getTypeOfSymbol(symbol)
                      : unknownType;
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
              }
              function writeReturnTypeOfSignatureDeclaration(signatureDeclaration, enclosingDeclaration, flags, writer) {
                  var signature = getSignatureFromDeclaration(signatureDeclaration);
                  getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
              }
              function writeTypeOfExpression(expr, enclosingDeclaration, flags, writer) {
                  var type = getTypeOfExpression(expr);
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
              }
              function hasGlobalName(name) {
                  return ts.hasProperty(globals, name);
              }
              function resolvesToSomeValue(location, name) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(location), "resolvesToSomeValue called with a synthesized location");
                  return !!resolveName(location, name, 107455, undefined, undefined);
              }
              function getReferencedValueDeclaration(reference) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(reference));
                  var symbol = getNodeLinks(reference).resolvedSymbol ||
                      resolveName(reference, reference.text, 107455 | 8388608, undefined, undefined);
                  return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
              }
              function getBlockScopedVariableId(n) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(n));
                  var isVariableDeclarationOrBindingElement = n.parent.kind === 153 || (n.parent.kind === 199 && n.parent.name === n);
                  var symbol = (isVariableDeclarationOrBindingElement ? getSymbolOfNode(n.parent) : undefined) ||
                      getNodeLinks(n).resolvedSymbol ||
                      resolveName(n, n.text, 107455 | 8388608, undefined, undefined);
                  var isLetOrConst = symbol &&
                      (symbol.flags & 2) &&
                      symbol.valueDeclaration.parent.kind !== 224;
                  if (isLetOrConst) {
                      getSymbolLinks(symbol);
                      return symbol.id;
                  }
                  return undefined;
              }
              function instantiateSingleCallFunctionType(functionType, typeArguments) {
                  if (functionType === unknownType) {
                      return unknownType;
                  }
                  var signature = getSingleCallSignature(functionType);
                  if (!signature) {
                      return unknownType;
                  }
                  var instantiatedSignature = getSignatureInstantiation(signature, typeArguments);
                  return getOrCreateTypeFromSignature(instantiatedSignature);
              }
              function createResolver() {
                  return {
                      getExpressionNameSubstitution: getExpressionNameSubstitution,
                      isValueAliasDeclaration: isValueAliasDeclaration,
                      hasGlobalName: hasGlobalName,
                      isReferencedAliasDeclaration: isReferencedAliasDeclaration,
                      getNodeCheckFlags: getNodeCheckFlags,
                      isTopLevelValueImportEqualsWithEntityName: isTopLevelValueImportEqualsWithEntityName,
                      isDeclarationVisible: isDeclarationVisible,
                      isImplementationOfOverload: isImplementationOfOverload,
                      writeTypeOfDeclaration: writeTypeOfDeclaration,
                      writeReturnTypeOfSignatureDeclaration: writeReturnTypeOfSignatureDeclaration,
                      writeTypeOfExpression: writeTypeOfExpression,
                      isSymbolAccessible: isSymbolAccessible,
                      isEntityNameVisible: isEntityNameVisible,
                      getConstantValue: getConstantValue,
                      resolvesToSomeValue: resolvesToSomeValue,
                      collectLinkedAliases: collectLinkedAliases,
                      getBlockScopedVariableId: getBlockScopedVariableId,
                      getReferencedValueDeclaration: getReferencedValueDeclaration,
                      serializeTypeOfNode: serializeTypeOfNode,
                      serializeParameterTypesOfNode: serializeParameterTypesOfNode,
                      serializeReturnTypeOfNode: serializeReturnTypeOfNode
                  };
              }
              function initializeTypeChecker() {
                  ts.forEach(host.getSourceFiles(), function (file) {
                      ts.bindSourceFile(file);
                  });
                  ts.forEach(host.getSourceFiles(), function (file) {
                      if (!ts.isExternalModule(file)) {
                          mergeSymbolTable(globals, file.locals);
                      }
                  });
                  getSymbolLinks(undefinedSymbol).type = undefinedType;
                  getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
                  getSymbolLinks(unknownSymbol).type = unknownType;
                  globals[undefinedSymbol.name] = undefinedSymbol;
                  globalArraySymbol = getGlobalTypeSymbol("Array");
                  globalArrayType = getTypeOfGlobalSymbol(globalArraySymbol, 1);
                  globalObjectType = getGlobalType("Object");
                  globalFunctionType = getGlobalType("Function");
                  globalStringType = getGlobalType("String");
                  globalNumberType = getGlobalType("Number");
                  globalBooleanType = getGlobalType("Boolean");
                  globalRegExpType = getGlobalType("RegExp");
                  getGlobalClassDecoratorType = ts.memoize(function () { return getGlobalType("ClassDecorator"); });
                  getGlobalPropertyDecoratorType = ts.memoize(function () { return getGlobalType("PropertyDecorator"); });
                  getGlobalMethodDecoratorType = ts.memoize(function () { return getGlobalType("MethodDecorator"); });
                  getGlobalParameterDecoratorType = ts.memoize(function () { return getGlobalType("ParameterDecorator"); });
                  if (languageVersion >= 2) {
                      globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
                      globalESSymbolType = getGlobalType("Symbol");
                      globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
                      globalIterableType = getGlobalType("Iterable", 1);
                  }
                  else {
                      globalTemplateStringsArrayType = unknownType;
                      globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
                      globalESSymbolConstructorSymbol = undefined;
                  }
                  anyArrayType = createArrayType(anyType);
              }
              function isReservedWordInStrictMode(node) {
                  return (node.parserContextFlags & 1) &&
                      (102 <= node.originalKeywordKind && node.originalKeywordKind <= 110);
              }
              function reportStrictModeGrammarErrorInClassDeclaration(identifier, message, arg0, arg1, arg2) {
                  if (ts.getAncestor(identifier, 202) || ts.getAncestor(identifier, 175)) {
                      return grammarErrorOnNode(identifier, message, arg0);
                  }
                  return false;
              }
              function checkGrammarImportDeclarationNameInStrictMode(node) {
                  if (node.importClause) {
                      var impotClause = node.importClause;
                      if (impotClause.namedBindings) {
                          var nameBindings = impotClause.namedBindings;
                          if (nameBindings.kind === 212) {
                              var name_11 = nameBindings.name;
                              if (isReservedWordInStrictMode(name_11)) {
                                  var nameText = ts.declarationNameToString(name_11);
                                  return grammarErrorOnNode(name_11, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                              }
                          }
                          else if (nameBindings.kind === 213) {
                              var reportError = false;
                              for (var _i = 0, _a = nameBindings.elements; _i < _a.length; _i++) {
                                  var element = _a[_i];
                                  var name_12 = element.name;
                                  if (isReservedWordInStrictMode(name_12)) {
                                      var nameText = ts.declarationNameToString(name_12);
                                      reportError = reportError || grammarErrorOnNode(name_12, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                                  }
                              }
                              return reportError;
                          }
                      }
                  }
                  return false;
              }
              function checkGrammarDeclarationNameInStrictMode(node) {
                  var name = node.name;
                  if (name && name.kind === 65 && isReservedWordInStrictMode(name)) {
                      var nameText = ts.declarationNameToString(name);
                      switch (node.kind) {
                          case 130:
                          case 199:
                          case 201:
                          case 129:
                          case 153:
                          case 203:
                          case 204:
                          case 205:
                              return checkGrammarIdentifierInStrictMode(name);
                          case 202:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText);
                          case 206:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                          case 209:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      }
                  }
                  return false;
              }
              function checkGrammarTypeReferenceInStrictMode(typeName) {
                  if (typeName.kind === 65) {
                      checkGrammarTypeNameInStrictMode(typeName);
                  }
                  else if (typeName.kind === 127) {
                      checkGrammarTypeNameInStrictMode(typeName.right);
                      checkGrammarTypeReferenceInStrictMode(typeName.left);
                  }
              }
              function checkGrammarExpressionWithTypeArgumentsInStrictMode(expression) {
                  if (expression && expression.kind === 65) {
                      return checkGrammarIdentifierInStrictMode(expression);
                  }
                  else if (expression && expression.kind === 156) {
                      checkGrammarExpressionWithTypeArgumentsInStrictMode(expression.expression);
                  }
              }
              function checkGrammarIdentifierInStrictMode(node, nameText) {
                  if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
                      if (!nameText) {
                          nameText = ts.declarationNameToString(node);
                      }
                      var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
                          grammarErrorOnNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      return errorReport;
                  }
                  return false;
              }
              function checkGrammarTypeNameInStrictMode(node) {
                  if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
                      var nameText = ts.declarationNameToString(node);
                      var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
                          grammarErrorOnNode(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      return errorReport;
                  }
                  return false;
              }
              function checkGrammarDecorators(node) {
                  if (!node.decorators) {
                      return false;
                  }
                  if (!ts.nodeCanBeDecorated(node)) {
                      return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_not_valid_here);
                  }
                  else if (languageVersion < 1) {
                      return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher);
                  }
                  else if (node.kind === 137 || node.kind === 138) {
                      var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
                      if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
                          return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name);
                      }
                  }
                  return false;
              }
              function checkGrammarModifiers(node) {
                  switch (node.kind) {
                      case 137:
                      case 138:
                      case 136:
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 141:
                      case 202:
                      case 203:
                      case 206:
                      case 205:
                      case 181:
                      case 201:
                      case 204:
                      case 210:
                      case 209:
                      case 216:
                      case 215:
                      case 130:
                          break;
                      default:
                          return false;
                  }
                  if (!node.modifiers) {
                      return;
                  }
                  var lastStatic, lastPrivate, lastProtected, lastDeclare;
                  var flags = 0;
                  for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
                      var modifier = _a[_i];
                      switch (modifier.kind) {
                          case 108:
                          case 107:
                          case 106:
                              var text = void 0;
                              if (modifier.kind === 108) {
                                  text = "public";
                              }
                              else if (modifier.kind === 107) {
                                  text = "protected";
                                  lastProtected = modifier;
                              }
                              else {
                                  text = "private";
                                  lastPrivate = modifier;
                              }
                              if (flags & 112) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics.Accessibility_modifier_already_seen);
                              }
                              else if (flags & 128) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
                              }
                              else if (node.parent.kind === 207 || node.parent.kind === 228) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, text);
                              }
                              flags |= ts.modifierToFlag(modifier.kind);
                              break;
                          case 109:
                              if (flags & 128) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "static");
                              }
                              else if (node.parent.kind === 207 || node.parent.kind === 228) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, "static");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
                              }
                              flags |= 128;
                              lastStatic = modifier;
                              break;
                          case 78:
                              if (flags & 1) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "export");
                              }
                              else if (flags & 2) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
                              }
                              else if (node.parent.kind === 202) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "export");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
                              }
                              flags |= 1;
                              break;
                          case 115:
                              if (flags & 2) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "declare");
                              }
                              else if (node.parent.kind === 202) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "declare");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
                              }
                              else if (ts.isInAmbientContext(node.parent) && node.parent.kind === 207) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
                              }
                              flags |= 2;
                              lastDeclare = modifier;
                              break;
                      }
                  }
                  if (node.kind === 136) {
                      if (flags & 128) {
                          return grammarErrorOnNode(lastStatic, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
                      }
                      else if (flags & 64) {
                          return grammarErrorOnNode(lastProtected, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "protected");
                      }
                      else if (flags & 32) {
                          return grammarErrorOnNode(lastPrivate, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "private");
                      }
                  }
                  else if ((node.kind === 210 || node.kind === 209) && flags & 2) {
                      return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_import_declaration, "declare");
                  }
                  else if (node.kind === 203 && flags & 2) {
                      return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_interface_declaration, "declare");
                  }
                  else if (node.kind === 130 && (flags & 112) && ts.isBindingPattern(node.name)) {
                      return grammarErrorOnNode(node, ts.Diagnostics.A_parameter_property_may_not_be_a_binding_pattern);
                  }
              }
              function checkGrammarForDisallowedTrailingComma(list) {
                  if (list && list.hasTrailingComma) {
                      var start = list.end - ",".length;
                      var end = list.end;
                      var sourceFile = ts.getSourceFileOfNode(list[0]);
                      return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Trailing_comma_not_allowed);
                  }
              }
              function checkGrammarTypeParameterList(node, typeParameters, file) {
                  if (checkGrammarForDisallowedTrailingComma(typeParameters)) {
                      return true;
                  }
                  if (typeParameters && typeParameters.length === 0) {
                      var start = typeParameters.pos - "<".length;
                      var end = ts.skipTrivia(file.text, typeParameters.end) + ">".length;
                      return grammarErrorAtPos(file, start, end - start, ts.Diagnostics.Type_parameter_list_cannot_be_empty);
                  }
              }
              function checkGrammarParameterList(parameters) {
                  if (checkGrammarForDisallowedTrailingComma(parameters)) {
                      return true;
                  }
                  var seenOptionalParameter = false;
                  var parameterCount = parameters.length;
                  for (var i = 0; i < parameterCount; i++) {
                      var parameter = parameters[i];
                      if (parameter.dotDotDotToken) {
                          if (i !== (parameterCount - 1)) {
                              return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
                          }
                          if (ts.isBindingPattern(parameter.name)) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
                          }
                          if (parameter.questionToken) {
                              return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_rest_parameter_cannot_be_optional);
                          }
                          if (parameter.initializer) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_parameter_cannot_have_an_initializer);
                          }
                      }
                      else if (parameter.questionToken || parameter.initializer) {
                          seenOptionalParameter = true;
                          if (parameter.questionToken && parameter.initializer) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
                          }
                      }
                      else {
                          if (seenOptionalParameter) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter);
                          }
                      }
                  }
              }
              function checkGrammarFunctionLikeDeclaration(node) {
                  var file = ts.getSourceFileOfNode(node);
                  return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarTypeParameterList(node, node.typeParameters, file) ||
                      checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file);
              }
              function checkGrammarArrowFunction(node, file) {
                  if (node.kind === 164) {
                      var arrowFunction = node;
                      var startLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.pos).line;
                      var endLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.end).line;
                      if (startLine !== endLine) {
                          return grammarErrorOnNode(arrowFunction.equalsGreaterThanToken, ts.Diagnostics.Line_terminator_not_permitted_before_arrow);
                      }
                  }
                  return false;
              }
              function checkGrammarIndexSignatureParameters(node) {
                  var parameter = node.parameters[0];
                  if (node.parameters.length !== 1) {
                      if (parameter) {
                          return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
                      }
                      else {
                          return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
                      }
                  }
                  if (parameter.dotDotDotToken) {
                      return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
                  }
                  if (parameter.flags & 499) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier);
                  }
                  if (parameter.questionToken) {
                      return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark);
                  }
                  if (parameter.initializer) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_initializer);
                  }
                  if (!parameter.type) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
                  }
                  if (parameter.type.kind !== 122 && parameter.type.kind !== 120) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_type_must_be_string_or_number);
                  }
                  if (!node.type) {
                      return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_a_type_annotation);
                  }
              }
              function checkGrammarForIndexSignatureModifier(node) {
                  if (node.flags & 499) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_not_permitted_on_index_signature_members);
                  }
              }
              function checkGrammarIndexSignature(node) {
                  return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarIndexSignatureParameters(node) || checkGrammarForIndexSignatureModifier(node);
              }
              function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) {
                  if (typeArguments && typeArguments.length === 0) {
                      var sourceFile = ts.getSourceFileOfNode(node);
                      var start = typeArguments.pos - "<".length;
                      var end = ts.skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
                      return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Type_argument_list_cannot_be_empty);
                  }
              }
              function checkGrammarTypeArguments(node, typeArguments) {
                  return checkGrammarForDisallowedTrailingComma(typeArguments) ||
                      checkGrammarForAtLeastOneTypeArgument(node, typeArguments);
              }
              function checkGrammarForOmittedArgument(node, arguments) {
                  if (arguments) {
                      var sourceFile = ts.getSourceFileOfNode(node);
                      for (var _i = 0; _i < arguments.length; _i++) {
                          var arg = arguments[_i];
                          if (arg.kind === 176) {
                              return grammarErrorAtPos(sourceFile, arg.pos, 0, ts.Diagnostics.Argument_expression_expected);
                          }
                      }
                  }
              }
              function checkGrammarArguments(node, arguments) {
                  return checkGrammarForDisallowedTrailingComma(arguments) ||
                      checkGrammarForOmittedArgument(node, arguments);
              }
              function checkGrammarHeritageClause(node) {
                  var types = node.types;
                  if (checkGrammarForDisallowedTrailingComma(types)) {
                      return true;
                  }
                  if (types && types.length === 0) {
                      var listType = ts.tokenToString(node.token);
                      var sourceFile = ts.getSourceFileOfNode(node);
                      return grammarErrorAtPos(sourceFile, types.pos, 0, ts.Diagnostics._0_list_cannot_be_empty, listType);
                  }
              }
              function checkGrammarClassDeclarationHeritageClauses(node) {
                  var seenExtendsClause = false;
                  var seenImplementsClause = false;
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && node.heritageClauses) {
                      for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
                          var heritageClause = _a[_i];
                          if (heritageClause.token === 79) {
                              if (seenExtendsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
                              }
                              if (seenImplementsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_must_precede_implements_clause);
                              }
                              if (heritageClause.types.length > 1) {
                                  return grammarErrorOnFirstToken(heritageClause.types[1], ts.Diagnostics.Classes_can_only_extend_a_single_class);
                              }
                              seenExtendsClause = true;
                          }
                          else {
                              ts.Debug.assert(heritageClause.token === 102);
                              if (seenImplementsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.implements_clause_already_seen);
                              }
                              seenImplementsClause = true;
                          }
                          checkGrammarHeritageClause(heritageClause);
                      }
                  }
              }
              function checkGrammarInterfaceDeclaration(node) {
                  var seenExtendsClause = false;
                  if (node.heritageClauses) {
                      for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
                          var heritageClause = _a[_i];
                          if (heritageClause.token === 79) {
                              if (seenExtendsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
                              }
                              seenExtendsClause = true;
                          }
                          else {
                              ts.Debug.assert(heritageClause.token === 102);
                              return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.Interface_declaration_cannot_have_implements_clause);
                          }
                          checkGrammarHeritageClause(heritageClause);
                      }
                  }
                  return false;
              }
              function checkGrammarComputedPropertyName(node) {
                  if (node.kind !== 128) {
                      return false;
                  }
                  var computedPropertyName = node;
                  if (computedPropertyName.expression.kind === 170 && computedPropertyName.expression.operatorToken.kind === 23) {
                      return grammarErrorOnNode(computedPropertyName.expression, ts.Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name);
                  }
              }
              function checkGrammarForGenerator(node) {
                  if (node.asteriskToken) {
                      return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.Generators_are_not_currently_supported);
                  }
              }
              function checkGrammarFunctionName(name) {
                  return checkGrammarEvalOrArgumentsInStrictMode(name, name);
              }
              function checkGrammarForInvalidQuestionMark(node, questionToken, message) {
                  if (questionToken) {
                      return grammarErrorOnNode(questionToken, message);
                  }
              }
              function checkGrammarObjectLiteralExpression(node) {
                  var seen = {};
                  var Property = 1;
                  var GetAccessor = 2;
                  var SetAccesor = 4;
                  var GetOrSetAccessor = GetAccessor | SetAccesor;
                  var inStrictMode = (node.parserContextFlags & 1) !== 0;
                  for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
                      var prop = _a[_i];
                      var name_13 = prop.name;
                      if (prop.kind === 176 ||
                          name_13.kind === 128) {
                          checkGrammarComputedPropertyName(name_13);
                          continue;
                      }
                      var currentKind = void 0;
                      if (prop.kind === 225 || prop.kind === 226) {
                          checkGrammarForInvalidQuestionMark(prop, prop.questionToken, ts.Diagnostics.An_object_member_cannot_be_declared_optional);
                          if (name_13.kind === 7) {
                              checkGrammarNumericLiteral(name_13);
                          }
                          currentKind = Property;
                      }
                      else if (prop.kind === 135) {
                          currentKind = Property;
                      }
                      else if (prop.kind === 137) {
                          currentKind = GetAccessor;
                      }
                      else if (prop.kind === 138) {
                          currentKind = SetAccesor;
                      }
                      else {
                          ts.Debug.fail("Unexpected syntax kind:" + prop.kind);
                      }
                      if (!ts.hasProperty(seen, name_13.text)) {
                          seen[name_13.text] = currentKind;
                      }
                      else {
                          var existingKind = seen[name_13.text];
                          if (currentKind === Property && existingKind === Property) {
                              if (inStrictMode) {
                                  grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode);
                              }
                          }
                          else if ((currentKind & GetOrSetAccessor) && (existingKind & GetOrSetAccessor)) {
                              if (existingKind !== GetOrSetAccessor && currentKind !== existingKind) {
                                  seen[name_13.text] = currentKind | existingKind;
                              }
                              else {
                                  return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name);
                              }
                          }
                          else {
                              return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name);
                          }
                      }
                  }
              }
              function checkGrammarForInOrForOfStatement(forInOrOfStatement) {
                  if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) {
                      return true;
                  }
                  if (forInOrOfStatement.initializer.kind === 200) {
                      var variableList = forInOrOfStatement.initializer;
                      if (!checkGrammarVariableDeclarationList(variableList)) {
                          if (variableList.declarations.length > 1) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
                                  : ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
                              return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
                          }
                          var firstDeclaration = variableList.declarations[0];
                          if (firstDeclaration.initializer) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
                                  : ts.Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
                              return grammarErrorOnNode(firstDeclaration.name, diagnostic);
                          }
                          if (firstDeclaration.type) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
                                  : ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
                              return grammarErrorOnNode(firstDeclaration, diagnostic);
                          }
                      }
                  }
                  return false;
              }
              function checkGrammarAccessor(accessor) {
                  var kind = accessor.kind;
                  if (languageVersion < 1) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
                  }
                  else if (ts.isInAmbientContext(accessor)) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_be_declared_in_an_ambient_context);
                  }
                  else if (accessor.body === undefined) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(accessor), accessor.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
                  }
                  else if (accessor.typeParameters) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_have_type_parameters);
                  }
                  else if (kind === 137 && accessor.parameters.length) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_get_accessor_cannot_have_parameters);
                  }
                  else if (kind === 138) {
                      if (accessor.type) {
                          return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation);
                      }
                      else if (accessor.parameters.length !== 1) {
                          return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_must_have_exactly_one_parameter);
                      }
                      else {
                          var parameter = accessor.parameters[0];
                          if (parameter.dotDotDotToken) {
                              return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_set_accessor_cannot_have_rest_parameter);
                          }
                          else if (parameter.flags & 499) {
                              return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
                          }
                          else if (parameter.questionToken) {
                              return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_set_accessor_cannot_have_an_optional_parameter);
                          }
                          else if (parameter.initializer) {
                              return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer);
                          }
                      }
                  }
              }
              function checkGrammarForNonSymbolComputedProperty(node, message) {
                  if (node.kind === 128 && !ts.isWellKnownSymbolSyntactically(node.expression)) {
                      return grammarErrorOnNode(node, message);
                  }
              }
              function checkGrammarMethod(node) {
                  if (checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
                      checkGrammarFunctionLikeDeclaration(node) ||
                      checkGrammarForGenerator(node)) {
                      return true;
                  }
                  if (node.parent.kind === 155) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
                          return true;
                      }
                      else if (node.body === undefined) {
                          return grammarErrorAtPos(getSourceFile(node), node.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
                      }
                  }
                  if (node.parent.kind === 202) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
                          return true;
                      }
                      if (ts.isInAmbientContext(node)) {
                          return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol);
                      }
                      else if (!node.body) {
                          return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol);
                      }
                  }
                  else if (node.parent.kind === 203) {
                      return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol);
                  }
                  else if (node.parent.kind === 146) {
                      return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol);
                  }
              }
              function isIterationStatement(node, lookInLabeledStatements) {
                  switch (node.kind) {
                      case 187:
                      case 188:
                      case 189:
                      case 185:
                      case 186:
                          return true;
                      case 195:
                          return lookInLabeledStatements && isIterationStatement(node.statement, lookInLabeledStatements);
                  }
                  return false;
              }
              function checkGrammarBreakOrContinueStatement(node) {
                  var current = node;
                  while (current) {
                      if (ts.isFunctionLike(current)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Jump_target_cannot_cross_function_boundary);
                      }
                      switch (current.kind) {
                          case 195:
                              if (node.label && current.label.text === node.label.text) {
                                  var isMisplacedContinueLabel = node.kind === 190
                                      && !isIterationStatement(current.statement, true);
                                  if (isMisplacedContinueLabel) {
                                      return grammarErrorOnNode(node, ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement);
                                  }
                                  return false;
                              }
                              break;
                          case 194:
                              if (node.kind === 191 && !node.label) {
                                  return false;
                              }
                              break;
                          default:
                              if (isIterationStatement(current, false) && !node.label) {
                                  return false;
                              }
                              break;
                      }
                      current = current.parent;
                  }
                  if (node.label) {
                      var message = node.kind === 191
                          ? ts.Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement
                          : ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement;
                      return grammarErrorOnNode(node, message);
                  }
                  else {
                      var message = node.kind === 191
                          ? ts.Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement
                          : ts.Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement;
                      return grammarErrorOnNode(node, message);
                  }
              }
              function checkGrammarBindingElement(node) {
                  if (node.dotDotDotToken) {
                      var elements = node.parent.elements;
                      if (node !== ts.lastOrUndefined(elements)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
                      }
                      if (node.name.kind === 152 || node.name.kind === 151) {
                          return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
                      }
                      if (node.initializer) {
                          return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
                      }
                  }
                  return checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
              }
              function checkGrammarVariableDeclaration(node) {
                  if (node.parent.parent.kind !== 188 && node.parent.parent.kind !== 189) {
                      if (ts.isInAmbientContext(node)) {
                          if (node.initializer) {
                              var equalsTokenLength = "=".length;
                              return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - equalsTokenLength, equalsTokenLength, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
                          }
                      }
                      else if (!node.initializer) {
                          if (ts.isBindingPattern(node.name) && !ts.isBindingPattern(node.parent)) {
                              return grammarErrorOnNode(node, ts.Diagnostics.A_destructuring_declaration_must_have_an_initializer);
                          }
                          if (ts.isConst(node)) {
                              return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_must_be_initialized);
                          }
                      }
                  }
                  var checkLetConstNames = languageVersion >= 2 && (ts.isLet(node) || ts.isConst(node));
                  return (checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name)) ||
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
              }
              function checkGrammarNameInLetOrConstDeclarations(name) {
                  if (name.kind === 65) {
                      if (name.text === "let") {
                          return grammarErrorOnNode(name, ts.Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
                      }
                  }
                  else {
                      var elements = name.elements;
                      for (var _i = 0; _i < elements.length; _i++) {
                          var element = elements[_i];
                          if (element.kind !== 176) {
                              checkGrammarNameInLetOrConstDeclarations(element.name);
                          }
                      }
                  }
              }
              function checkGrammarVariableDeclarationList(declarationList) {
                  var declarations = declarationList.declarations;
                  if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) {
                      return true;
                  }
                  if (!declarationList.declarations.length) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(declarationList), declarations.pos, declarations.end - declarations.pos, ts.Diagnostics.Variable_declaration_list_cannot_be_empty);
                  }
              }
              function allowLetAndConstDeclarations(parent) {
                  switch (parent.kind) {
                      case 184:
                      case 185:
                      case 186:
                      case 193:
                      case 187:
                      case 188:
                      case 189:
                          return false;
                      case 195:
                          return allowLetAndConstDeclarations(parent.parent);
                  }
                  return true;
              }
              function checkGrammarForDisallowedLetOrConstStatement(node) {
                  if (!allowLetAndConstDeclarations(node.parent)) {
                      if (ts.isLet(node.declarationList)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
                      }
                      else if (ts.isConst(node.declarationList)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
                      }
                  }
              }
              function isIntegerLiteral(expression) {
                  if (expression.kind === 168) {
                      var unaryExpression = expression;
                      if (unaryExpression.operator === 33 || unaryExpression.operator === 34) {
                          expression = unaryExpression.operand;
                      }
                  }
                  if (expression.kind === 7) {
                      return /^[0-9]+([eE]\+?[0-9]+)?$/.test(expression.text);
                  }
                  return false;
              }
              function checkGrammarEnumDeclaration(enumDecl) {
                  var enumIsConst = (enumDecl.flags & 8192) !== 0;
                  var hasError = false;
                  if (!enumIsConst) {
                      var inConstantEnumMemberSection = true;
                      var inAmbientContext = ts.isInAmbientContext(enumDecl);
                      for (var _i = 0, _a = enumDecl.members; _i < _a.length; _i++) {
                          var node = _a[_i];
                          if (node.name.kind === 128) {
                              hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Computed_property_names_are_not_allowed_in_enums);
                          }
                          else if (inAmbientContext) {
                              if (node.initializer && !isIntegerLiteral(node.initializer)) {
                                  hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Ambient_enum_elements_can_only_have_integer_literal_initializers) || hasError;
                              }
                          }
                          else if (node.initializer) {
                              inConstantEnumMemberSection = isIntegerLiteral(node.initializer);
                          }
                          else if (!inConstantEnumMemberSection) {
                              hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Enum_member_must_have_initializer) || hasError;
                          }
                      }
                  }
                  return hasError;
              }
              function hasParseDiagnostics(sourceFile) {
                  return sourceFile.parseDiagnostics.length > 0;
              }
              function grammarErrorOnFirstToken(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function grammarErrorAtPos(sourceFile, start, length, message, arg0, arg1, arg2) {
                  if (!hasParseDiagnostics(sourceFile)) {
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, start, length, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function grammarErrorOnNode(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      diagnostics.add(ts.createDiagnosticForNode(node, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function checkGrammarEvalOrArgumentsInStrictMode(contextNode, name) {
                  if (name && name.kind === 65) {
                      var identifier = name;
                      if (contextNode && (contextNode.parserContextFlags & 1) && isEvalOrArgumentsIdentifier(identifier)) {
                          var nameText = ts.declarationNameToString(identifier);
                          var reportErrorInClassDeclaration = reportStrictModeGrammarErrorInClassDeclaration(identifier, ts.Diagnostics.Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode, nameText);
                          if (!reportErrorInClassDeclaration) {
                              return grammarErrorOnNode(identifier, ts.Diagnostics.Invalid_use_of_0_in_strict_mode, nameText);
                          }
                          return reportErrorInClassDeclaration;
                      }
                  }
              }
              function isEvalOrArgumentsIdentifier(node) {
                  return node.kind === 65 &&
                      (node.text === "eval" || node.text === "arguments");
              }
              function checkGrammarConstructorTypeParameters(node) {
                  if (node.typeParameters) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.typeParameters.pos, node.typeParameters.end - node.typeParameters.pos, ts.Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration);
                  }
              }
              function checkGrammarConstructorTypeAnnotation(node) {
                  if (node.type) {
                      return grammarErrorOnNode(node.type, ts.Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration);
                  }
              }
              function checkGrammarProperty(node) {
                  if (node.parent.kind === 202) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional) ||
                          checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  else if (node.parent.kind === 203) {
                      if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  else if (node.parent.kind === 146) {
                      if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  if (ts.isInAmbientContext(node) && node.initializer) {
                      return grammarErrorOnFirstToken(node.initializer, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
                  }
              }
              function checkGrammarTopLevelElementForRequiredDeclareModifier(node) {
                  if (node.kind === 203 ||
                      node.kind === 210 ||
                      node.kind === 209 ||
                      node.kind === 216 ||
                      node.kind === 215 ||
                      (node.flags & 2) ||
                      (node.flags & (1 | 256))) {
                      return false;
                  }
                  return grammarErrorOnFirstToken(node, ts.Diagnostics.A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file);
              }
              function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) {
                  for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
                      var decl = _a[_i];
                      if (ts.isDeclaration(decl) || decl.kind === 181) {
                          if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
                              return true;
                          }
                      }
                  }
              }
              function checkGrammarSourceFile(node) {
                  return ts.isInAmbientContext(node) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
              }
              function checkGrammarStatementInAmbientContext(node) {
                  if (ts.isInAmbientContext(node)) {
                      if (isAccessor(node.parent.kind)) {
                          return getNodeLinks(node).hasReportedStatementInAmbientContext = true;
                      }
                      var links = getNodeLinks(node);
                      if (!links.hasReportedStatementInAmbientContext && ts.isFunctionLike(node.parent)) {
                          return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
                      }
                      if (node.parent.kind === 180 || node.parent.kind === 207 || node.parent.kind === 228) {
                          var links_1 = getNodeLinks(node.parent);
                          if (!links_1.hasReportedStatementInAmbientContext) {
                              return links_1.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.Statements_are_not_allowed_in_ambient_contexts);
                          }
                      }
                      else {
                      }
                  }
              }
              function checkGrammarNumericLiteral(node) {
                  if (node.flags & 16384) {
                      if (node.parserContextFlags & 1) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_allowed_in_strict_mode);
                      }
                      else if (languageVersion >= 1) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
                      }
                  }
              }
              function grammarErrorAfterFirstToken(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, ts.textSpanEnd(span), 0, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              initializeTypeChecker();
              return checker;
          }
          ts.createTypeChecker = createTypeChecker;
      })(ts || (ts = {}));
      /// <reference path="checker.ts"/>
      var ts;
      (function (ts) {
          function getDeclarationDiagnostics(host, resolver, targetSourceFile) {
              var diagnostics = [];
              var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
              emitDeclarations(host, resolver, diagnostics, jsFilePath, targetSourceFile);
              return diagnostics;
          }
          ts.getDeclarationDiagnostics = getDeclarationDiagnostics;
          function emitDeclarations(host, resolver, diagnostics, jsFilePath, root) {
              var newLine = host.getNewLine();
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var write;
              var writeLine;
              var increaseIndent;
              var decreaseIndent;
              var writeTextOfNode;
              var writer = createAndSetNewTextWriterWithSymbolWriter();
              var enclosingDeclaration;
              var currentSourceFile;
              var reportedDeclarationError = false;
              var emitJsDocComments = compilerOptions.removeComments ? function (declaration) { } : writeJsDocComments;
              var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
              var moduleElementDeclarationEmitInfo = [];
              var asynchronousSubModuleDeclarationEmitInfo;
              var referencePathsOutput = "";
              if (root) {
                  if (!compilerOptions.noResolve) {
                      var addedGlobalFileReference = false;
                      ts.forEach(root.referencedFiles, function (fileReference) {
                          var referencedFile = ts.tryResolveScriptReference(host, root, fileReference);
                          if (referencedFile && ((referencedFile.flags & 2048) ||
                              ts.shouldEmitToOwnFile(referencedFile, compilerOptions) ||
                              !addedGlobalFileReference)) {
                              writeReferencePath(referencedFile);
                              if (!ts.isExternalModuleOrDeclarationFile(referencedFile)) {
                                  addedGlobalFileReference = true;
                              }
                          }
                      });
                  }
                  emitSourceFile(root);
                  if (moduleElementDeclarationEmitInfo.length) {
                      var oldWriter = writer;
                      ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
                          if (aliasEmitInfo.isVisible) {
                              ts.Debug.assert(aliasEmitInfo.node.kind === 210);
                              createAndSetNewTextWriterWithSymbolWriter();
                              ts.Debug.assert(aliasEmitInfo.indent === 0);
                              writeImportDeclaration(aliasEmitInfo.node);
                              aliasEmitInfo.asynchronousOutput = writer.getText();
                          }
                      });
                      setWriter(oldWriter);
                  }
              }
              else {
                  var emittedReferencedFiles = [];
                  ts.forEach(host.getSourceFiles(), function (sourceFile) {
                      if (!ts.isExternalModuleOrDeclarationFile(sourceFile)) {
                          if (!compilerOptions.noResolve) {
                              ts.forEach(sourceFile.referencedFiles, function (fileReference) {
                                  var referencedFile = ts.tryResolveScriptReference(host, sourceFile, fileReference);
                                  if (referencedFile && (ts.isExternalModuleOrDeclarationFile(referencedFile) &&
                                      !ts.contains(emittedReferencedFiles, referencedFile))) {
                                      writeReferencePath(referencedFile);
                                      emittedReferencedFiles.push(referencedFile);
                                  }
                              });
                          }
                          emitSourceFile(sourceFile);
                      }
                  });
              }
              return {
                  reportedDeclarationError: reportedDeclarationError,
                  moduleElementDeclarationEmitInfo: moduleElementDeclarationEmitInfo,
                  synchronousDeclarationOutput: writer.getText(),
                  referencePathsOutput: referencePathsOutput
              };
              function hasInternalAnnotation(range) {
                  var text = currentSourceFile.text;
                  var comment = text.substring(range.pos, range.end);
                  return comment.indexOf("@internal") >= 0;
              }
              function stripInternal(node) {
                  if (node) {
                      var leadingCommentRanges = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
                      if (ts.forEach(leadingCommentRanges, hasInternalAnnotation)) {
                          return;
                      }
                      emitNode(node);
                  }
              }
              function createAndSetNewTextWriterWithSymbolWriter() {
                  var writer = ts.createTextWriter(newLine);
                  writer.trackSymbol = trackSymbol;
                  writer.writeKeyword = writer.write;
                  writer.writeOperator = writer.write;
                  writer.writePunctuation = writer.write;
                  writer.writeSpace = writer.write;
                  writer.writeStringLiteral = writer.writeLiteral;
                  writer.writeParameter = writer.write;
                  writer.writeSymbol = writer.write;
                  setWriter(writer);
                  return writer;
              }
              function setWriter(newWriter) {
                  writer = newWriter;
                  write = newWriter.write;
                  writeTextOfNode = newWriter.writeTextOfNode;
                  writeLine = newWriter.writeLine;
                  increaseIndent = newWriter.increaseIndent;
                  decreaseIndent = newWriter.decreaseIndent;
              }
              function writeAsynchronousModuleElements(nodes) {
                  var oldWriter = writer;
                  ts.forEach(nodes, function (declaration) {
                      var nodeToCheck;
                      if (declaration.kind === 199) {
                          nodeToCheck = declaration.parent.parent;
                      }
                      else if (declaration.kind === 213 || declaration.kind === 214 || declaration.kind === 211) {
                          ts.Debug.fail("We should be getting ImportDeclaration instead to write");
                      }
                      else {
                          nodeToCheck = declaration;
                      }
                      var moduleElementEmitInfo = ts.forEach(moduleElementDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
                      if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
                          moduleElementEmitInfo = ts.forEach(asynchronousSubModuleDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
                      }
                      if (moduleElementEmitInfo) {
                          if (moduleElementEmitInfo.node.kind === 210) {
                              moduleElementEmitInfo.isVisible = true;
                          }
                          else {
                              createAndSetNewTextWriterWithSymbolWriter();
                              for (var declarationIndent = moduleElementEmitInfo.indent; declarationIndent; declarationIndent--) {
                                  increaseIndent();
                              }
                              if (nodeToCheck.kind === 206) {
                                  ts.Debug.assert(asynchronousSubModuleDeclarationEmitInfo === undefined);
                                  asynchronousSubModuleDeclarationEmitInfo = [];
                              }
                              writeModuleElement(nodeToCheck);
                              if (nodeToCheck.kind === 206) {
                                  moduleElementEmitInfo.subModuleElementDeclarationEmitInfo = asynchronousSubModuleDeclarationEmitInfo;
                                  asynchronousSubModuleDeclarationEmitInfo = undefined;
                              }
                              moduleElementEmitInfo.asynchronousOutput = writer.getText();
                          }
                      }
                  });
                  setWriter(oldWriter);
              }
              function handleSymbolAccessibilityError(symbolAccesibilityResult) {
                  if (symbolAccesibilityResult.accessibility === 0) {
                      if (symbolAccesibilityResult && symbolAccesibilityResult.aliasesToMakeVisible) {
                          writeAsynchronousModuleElements(symbolAccesibilityResult.aliasesToMakeVisible);
                      }
                  }
                  else {
                      reportedDeclarationError = true;
                      var errorInfo = writer.getSymbolAccessibilityDiagnostic(symbolAccesibilityResult);
                      if (errorInfo) {
                          if (errorInfo.typeName) {
                              diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, errorInfo.typeName), symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
                          }
                          else {
                              diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
                          }
                      }
                  }
              }
              function trackSymbol(symbol, enclosingDeclaration, meaning) {
                  handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
              }
              function writeTypeOfDeclaration(declaration, type, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  write(": ");
                  if (type) {
                      emitType(type);
                  }
                  else {
                      resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, 2, writer);
                  }
              }
              function writeReturnTypeAtSignature(signature, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  write(": ");
                  if (signature.type) {
                      emitType(signature.type);
                  }
                  else {
                      resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, 2, writer);
                  }
              }
              function emitLines(nodes) {
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      emit(node);
                  }
              }
              function emitSeparatedList(nodes, separator, eachNodeEmitFn, canEmitFn) {
                  var currentWriterPos = writer.getTextPos();
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      if (!canEmitFn || canEmitFn(node)) {
                          if (currentWriterPos !== writer.getTextPos()) {
                              write(separator);
                          }
                          currentWriterPos = writer.getTextPos();
                          eachNodeEmitFn(node);
                      }
                  }
              }
              function emitCommaList(nodes, eachNodeEmitFn, canEmitFn) {
                  emitSeparatedList(nodes, ", ", eachNodeEmitFn, canEmitFn);
              }
              function writeJsDocComments(declaration) {
                  if (declaration) {
                      var jsDocComments = ts.getJsDocComments(declaration, currentSourceFile);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, declaration, jsDocComments);
                      ts.emitComments(currentSourceFile, writer, jsDocComments, true, newLine, ts.writeCommentRange);
                  }
              }
              function emitTypeWithNewGetSymbolAccessibilityDiagnostic(type, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  emitType(type);
              }
              function emitType(type) {
                  switch (type.kind) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                      case 99:
                      case 8:
                          return writeTextOfNode(currentSourceFile, type);
                      case 177:
                          return emitExpressionWithTypeArguments(type);
                      case 142:
                          return emitTypeReference(type);
                      case 145:
                          return emitTypeQuery(type);
                      case 147:
                          return emitArrayType(type);
                      case 148:
                          return emitTupleType(type);
                      case 149:
                          return emitUnionType(type);
                      case 150:
                          return emitParenType(type);
                      case 143:
                      case 144:
                          return emitSignatureDeclarationWithJsDocComments(type);
                      case 146:
                          return emitTypeLiteral(type);
                      case 65:
                          return emitEntityName(type);
                      case 127:
                          return emitEntityName(type);
                  }
                  function emitEntityName(entityName) {
                      var visibilityResult = resolver.isEntityNameVisible(entityName, entityName.parent.kind === 209 ? entityName.parent : enclosingDeclaration);
                      handleSymbolAccessibilityError(visibilityResult);
                      writeEntityName(entityName);
                      function writeEntityName(entityName) {
                          if (entityName.kind === 65) {
                              writeTextOfNode(currentSourceFile, entityName);
                          }
                          else {
                              var left = entityName.kind === 127 ? entityName.left : entityName.expression;
                              var right = entityName.kind === 127 ? entityName.right : entityName.name;
                              writeEntityName(left);
                              write(".");
                              writeTextOfNode(currentSourceFile, right);
                          }
                      }
                  }
                  function emitExpressionWithTypeArguments(node) {
                      if (ts.isSupportedExpressionWithTypeArguments(node)) {
                          ts.Debug.assert(node.expression.kind === 65 || node.expression.kind === 156);
                          emitEntityName(node.expression);
                          if (node.typeArguments) {
                              write("<");
                              emitCommaList(node.typeArguments, emitType);
                              write(">");
                          }
                      }
                  }
                  function emitTypeReference(type) {
                      emitEntityName(type.typeName);
                      if (type.typeArguments) {
                          write("<");
                          emitCommaList(type.typeArguments, emitType);
                          write(">");
                      }
                  }
                  function emitTypeQuery(type) {
                      write("typeof ");
                      emitEntityName(type.exprName);
                  }
                  function emitArrayType(type) {
                      emitType(type.elementType);
                      write("[]");
                  }
                  function emitTupleType(type) {
                      write("[");
                      emitCommaList(type.elementTypes, emitType);
                      write("]");
                  }
                  function emitUnionType(type) {
                      emitSeparatedList(type.types, " | ", emitType);
                  }
                  function emitParenType(type) {
                      write("(");
                      emitType(type.type);
                      write(")");
                  }
                  function emitTypeLiteral(type) {
                      write("{");
                      if (type.members.length) {
                          writeLine();
                          increaseIndent();
                          emitLines(type.members);
                          decreaseIndent();
                      }
                      write("}");
                  }
              }
              function emitSourceFile(node) {
                  currentSourceFile = node;
                  enclosingDeclaration = node;
                  emitLines(node.statements);
              }
              function getExportDefaultTempVariableName() {
                  var baseName = "_default";
                  if (!ts.hasProperty(currentSourceFile.identifiers, baseName)) {
                      return baseName;
                  }
                  var count = 0;
                  while (true) {
                      var name_14 = baseName + "_" + (++count);
                      if (!ts.hasProperty(currentSourceFile.identifiers, name_14)) {
                          return name_14;
                      }
                  }
              }
              function emitExportAssignment(node) {
                  if (node.expression.kind === 65) {
                      write(node.isExportEquals ? "export = " : "export default ");
                      writeTextOfNode(currentSourceFile, node.expression);
                  }
                  else {
                      var tempVarName = getExportDefaultTempVariableName();
                      write("declare var ");
                      write(tempVarName);
                      write(": ");
                      writer.getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic;
                      resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, 2, writer);
                      write(";");
                      writeLine();
                      write(node.isExportEquals ? "export = " : "export default ");
                      write(tempVarName);
                  }
                  write(";");
                  writeLine();
                  if (node.expression.kind === 65) {
                      var nodes = resolver.collectLinkedAliases(node.expression);
                      writeAsynchronousModuleElements(nodes);
                  }
                  function getDefaultExportAccessibilityDiagnostic(diagnostic) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
                          errorNode: node
                      };
                  }
              }
              function isModuleElementVisible(node) {
                  return resolver.isDeclarationVisible(node);
              }
              function emitModuleElement(node, isModuleElementVisible) {
                  if (isModuleElementVisible) {
                      writeModuleElement(node);
                  }
                  else if (node.kind === 209 ||
                      (node.parent.kind === 228 && ts.isExternalModule(currentSourceFile))) {
                      var isVisible;
                      if (asynchronousSubModuleDeclarationEmitInfo && node.parent.kind !== 228) {
                          asynchronousSubModuleDeclarationEmitInfo.push({
                              node: node,
                              outputPos: writer.getTextPos(),
                              indent: writer.getIndent(),
                              isVisible: isVisible
                          });
                      }
                      else {
                          if (node.kind === 210) {
                              var importDeclaration = node;
                              if (importDeclaration.importClause) {
                                  isVisible = (importDeclaration.importClause.name && resolver.isDeclarationVisible(importDeclaration.importClause)) ||
                                      isVisibleNamedBinding(importDeclaration.importClause.namedBindings);
                              }
                          }
                          moduleElementDeclarationEmitInfo.push({
                              node: node,
                              outputPos: writer.getTextPos(),
                              indent: writer.getIndent(),
                              isVisible: isVisible
                          });
                      }
                  }
              }
              function writeModuleElement(node) {
                  switch (node.kind) {
                      case 201:
                          return writeFunctionDeclaration(node);
                      case 181:
                          return writeVariableStatement(node);
                      case 203:
                          return writeInterfaceDeclaration(node);
                      case 202:
                          return writeClassDeclaration(node);
                      case 204:
                          return writeTypeAliasDeclaration(node);
                      case 205:
                          return writeEnumDeclaration(node);
                      case 206:
                          return writeModuleDeclaration(node);
                      case 209:
                          return writeImportEqualsDeclaration(node);
                      case 210:
                          return writeImportDeclaration(node);
                      default:
                          ts.Debug.fail("Unknown symbol kind");
                  }
              }
              function emitModuleElementDeclarationFlags(node) {
                  if (node.parent === currentSourceFile) {
                      if (node.flags & 1) {
                          write("export ");
                      }
                      if (node.flags & 256) {
                          write("default ");
                      }
                      else if (node.kind !== 203) {
                          write("declare ");
                      }
                  }
              }
              function emitClassMemberDeclarationFlags(node) {
                  if (node.flags & 32) {
                      write("private ");
                  }
                  else if (node.flags & 64) {
                      write("protected ");
                  }
                  if (node.flags & 128) {
                      write("static ");
                  }
              }
              function writeImportEqualsDeclaration(node) {
                  emitJsDocComments(node);
                  if (node.flags & 1) {
                      write("export ");
                  }
                  write("import ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" = ");
                  if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                      emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.moduleReference, getImportEntityNameVisibilityError);
                      write(";");
                  }
                  else {
                      write("require(");
                      writeTextOfNode(currentSourceFile, ts.getExternalModuleImportEqualsDeclarationExpression(node));
                      write(");");
                  }
                  writer.writeLine();
                  function getImportEntityNameVisibilityError(symbolAccesibilityResult) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Import_declaration_0_is_using_private_name_1,
                          errorNode: node,
                          typeName: node.name
                      };
                  }
              }
              function isVisibleNamedBinding(namedBindings) {
                  if (namedBindings) {
                      if (namedBindings.kind === 212) {
                          return resolver.isDeclarationVisible(namedBindings);
                      }
                      else {
                          return ts.forEach(namedBindings.elements, function (namedImport) { return resolver.isDeclarationVisible(namedImport); });
                      }
                  }
              }
              function writeImportDeclaration(node) {
                  if (!node.importClause && !(node.flags & 1)) {
                      return;
                  }
                  emitJsDocComments(node);
                  if (node.flags & 1) {
                      write("export ");
                  }
                  write("import ");
                  if (node.importClause) {
                      var currentWriterPos = writer.getTextPos();
                      if (node.importClause.name && resolver.isDeclarationVisible(node.importClause)) {
                          writeTextOfNode(currentSourceFile, node.importClause.name);
                      }
                      if (node.importClause.namedBindings && isVisibleNamedBinding(node.importClause.namedBindings)) {
                          if (currentWriterPos !== writer.getTextPos()) {
                              write(", ");
                          }
                          if (node.importClause.namedBindings.kind === 212) {
                              write("* as ");
                              writeTextOfNode(currentSourceFile, node.importClause.namedBindings.name);
                          }
                          else {
                              write("{ ");
                              emitCommaList(node.importClause.namedBindings.elements, emitImportOrExportSpecifier, resolver.isDeclarationVisible);
                              write(" }");
                          }
                      }
                      write(" from ");
                  }
                  writeTextOfNode(currentSourceFile, node.moduleSpecifier);
                  write(";");
                  writer.writeLine();
              }
              function emitImportOrExportSpecifier(node) {
                  if (node.propertyName) {
                      writeTextOfNode(currentSourceFile, node.propertyName);
                      write(" as ");
                  }
                  writeTextOfNode(currentSourceFile, node.name);
              }
              function emitExportSpecifier(node) {
                  emitImportOrExportSpecifier(node);
                  var nodes = resolver.collectLinkedAliases(node.propertyName || node.name);
                  writeAsynchronousModuleElements(nodes);
              }
              function emitExportDeclaration(node) {
                  emitJsDocComments(node);
                  write("export ");
                  if (node.exportClause) {
                      write("{ ");
                      emitCommaList(node.exportClause.elements, emitExportSpecifier);
                      write(" }");
                  }
                  else {
                      write("*");
                  }
                  if (node.moduleSpecifier) {
                      write(" from ");
                      writeTextOfNode(currentSourceFile, node.moduleSpecifier);
                  }
                  write(";");
                  writer.writeLine();
              }
              function writeModuleDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("module ");
                  writeTextOfNode(currentSourceFile, node.name);
                  while (node.body.kind !== 207) {
                      node = node.body;
                      write(".");
                      writeTextOfNode(currentSourceFile, node.name);
                  }
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.body.statements);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function writeTypeAliasDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("type ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" = ");
                  emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.type, getTypeAliasDeclarationVisibilityError);
                  write(";");
                  writeLine();
                  function getTypeAliasDeclarationVisibilityError(symbolAccesibilityResult) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
                          errorNode: node.type,
                          typeName: node.name
                      };
                  }
              }
              function writeEnumDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  if (ts.isConst(node)) {
                      write("const ");
                  }
                  write("enum ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
              }
              function emitEnumMemberDeclaration(node) {
                  emitJsDocComments(node);
                  writeTextOfNode(currentSourceFile, node.name);
                  var enumMemberValue = resolver.getConstantValue(node);
                  if (enumMemberValue !== undefined) {
                      write(" = ");
                      write(enumMemberValue.toString());
                  }
                  write(",");
                  writeLine();
              }
              function isPrivateMethodTypeParameter(node) {
                  return node.parent.kind === 135 && (node.parent.flags & 32);
              }
              function emitTypeParameters(typeParameters) {
                  function emitTypeParameter(node) {
                      increaseIndent();
                      emitJsDocComments(node);
                      decreaseIndent();
                      writeTextOfNode(currentSourceFile, node.name);
                      if (node.constraint && !isPrivateMethodTypeParameter(node)) {
                          write(" extends ");
                          if (node.parent.kind === 143 ||
                              node.parent.kind === 144 ||
                              (node.parent.parent && node.parent.parent.kind === 146)) {
                              ts.Debug.assert(node.parent.kind === 135 ||
                                  node.parent.kind === 134 ||
                                  node.parent.kind === 143 ||
                                  node.parent.kind === 144 ||
                                  node.parent.kind === 139 ||
                                  node.parent.kind === 140);
                              emitType(node.constraint);
                          }
                          else {
                              emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.constraint, getTypeParameterConstraintVisibilityError);
                          }
                      }
                      function getTypeParameterConstraintVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage;
                          switch (node.parent.kind) {
                              case 202:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
                                  break;
                              case 203:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 140:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 139:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 135:
                              case 134:
                                  if (node.parent.flags & 128) {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
                                  }
                                  else if (node.parent.parent.kind === 202) {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
                                  }
                                  else {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
                                  }
                                  break;
                              case 201:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
                                  break;
                              default:
                                  ts.Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: node,
                              typeName: node.name
                          };
                      }
                  }
                  if (typeParameters) {
                      write("<");
                      emitCommaList(typeParameters, emitTypeParameter);
                      write(">");
                  }
              }
              function emitHeritageClause(typeReferences, isImplementsList) {
                  if (typeReferences) {
                      write(isImplementsList ? " implements " : " extends ");
                      emitCommaList(typeReferences, emitTypeOfTypeReference);
                  }
                  function emitTypeOfTypeReference(node) {
                      if (ts.isSupportedExpressionWithTypeArguments(node)) {
                          emitTypeWithNewGetSymbolAccessibilityDiagnostic(node, getHeritageClauseVisibilityError);
                      }
                      function getHeritageClauseVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage;
                          if (node.parent.parent.kind === 202) {
                              diagnosticMessage = isImplementsList ?
                                  ts.Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 :
                                  ts.Diagnostics.Extends_clause_of_exported_class_0_has_or_is_using_private_name_1;
                          }
                          else {
                              diagnosticMessage = ts.Diagnostics.Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: node,
                              typeName: node.parent.parent.name
                          };
                      }
                  }
              }
              function writeClassDeclaration(node) {
                  function emitParameterProperties(constructorDeclaration) {
                      if (constructorDeclaration) {
                          ts.forEach(constructorDeclaration.parameters, function (param) {
                              if (param.flags & 112) {
                                  emitPropertyDeclaration(param);
                              }
                          });
                      }
                  }
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("class ");
                  writeTextOfNode(currentSourceFile, node.name);
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitTypeParameters(node.typeParameters);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                  if (baseTypeNode) {
                      emitHeritageClause([baseTypeNode], false);
                  }
                  emitHeritageClause(ts.getClassImplementsHeritageClauseElements(node), true);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitParameterProperties(ts.getFirstConstructorWithBody(node));
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function writeInterfaceDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("interface ");
                  writeTextOfNode(currentSourceFile, node.name);
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitTypeParameters(node.typeParameters);
                  emitHeritageClause(ts.getInterfaceBaseTypeNodes(node), false);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function emitPropertyDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  emitJsDocComments(node);
                  emitClassMemberDeclarationFlags(node);
                  emitVariableDeclaration(node);
                  write(";");
                  writeLine();
              }
              function emitVariableDeclaration(node) {
                  if (node.kind !== 199 || resolver.isDeclarationVisible(node)) {
                      if (ts.isBindingPattern(node.name)) {
                          emitBindingPattern(node.name);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node.name);
                          if ((node.kind === 133 || node.kind === 132) && ts.hasQuestionToken(node)) {
                              write("?");
                          }
                          if ((node.kind === 133 || node.kind === 132) && node.parent.kind === 146) {
                              emitTypeOfVariableDeclarationFromTypeLiteral(node);
                          }
                          else if (!(node.flags & 32)) {
                              writeTypeOfDeclaration(node, node.type, getVariableDeclarationTypeVisibilityError);
                          }
                      }
                  }
                  function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
                      if (node.kind === 199) {
                          return symbolAccesibilityResult.errorModuleName ?
                              symbolAccesibilityResult.accessibility === 2 ?
                                  ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                  ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 :
                              ts.Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
                      }
                      else if (node.kind === 133 || node.kind === 132) {
                          if (node.flags & 128) {
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
                          }
                          else if (node.parent.kind === 202) {
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
                          }
                          else {
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
                          }
                      }
                  }
                  function getVariableDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                      return diagnosticMessage !== undefined ? {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node,
                          typeName: node.name
                      } : undefined;
                  }
                  function emitBindingPattern(bindingPattern) {
                      var elements = [];
                      for (var _i = 0, _a = bindingPattern.elements; _i < _a.length; _i++) {
                          var element = _a[_i];
                          if (element.kind !== 176) {
                              elements.push(element);
                          }
                      }
                      emitCommaList(elements, emitBindingElement);
                  }
                  function emitBindingElement(bindingElement) {
                      function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                          return diagnosticMessage !== undefined ? {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: bindingElement,
                              typeName: bindingElement.name
                          } : undefined;
                      }
                      if (bindingElement.name) {
                          if (ts.isBindingPattern(bindingElement.name)) {
                              emitBindingPattern(bindingElement.name);
                          }
                          else {
                              writeTextOfNode(currentSourceFile, bindingElement.name);
                              writeTypeOfDeclaration(bindingElement, undefined, getBindingElementTypeVisibilityError);
                          }
                      }
                  }
              }
              function emitTypeOfVariableDeclarationFromTypeLiteral(node) {
                  if (node.type) {
                      write(": ");
                      emitType(node.type);
                  }
              }
              function isVariableStatementVisible(node) {
                  return ts.forEach(node.declarationList.declarations, function (varDeclaration) { return resolver.isDeclarationVisible(varDeclaration); });
              }
              function writeVariableStatement(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  if (ts.isLet(node.declarationList)) {
                      write("let ");
                  }
                  else if (ts.isConst(node.declarationList)) {
                      write("const ");
                  }
                  else {
                      write("var ");
                  }
                  emitCommaList(node.declarationList.declarations, emitVariableDeclaration, resolver.isDeclarationVisible);
                  write(";");
                  writeLine();
              }
              function emitAccessorDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
                  var accessorWithTypeAnnotation;
                  if (node === accessors.firstAccessor) {
                      emitJsDocComments(accessors.getAccessor);
                      emitJsDocComments(accessors.setAccessor);
                      emitClassMemberDeclarationFlags(node);
                      writeTextOfNode(currentSourceFile, node.name);
                      if (!(node.flags & 32)) {
                          accessorWithTypeAnnotation = node;
                          var type = getTypeAnnotationFromAccessor(node);
                          if (!type) {
                              var anotherAccessor = node.kind === 137 ? accessors.setAccessor : accessors.getAccessor;
                              type = getTypeAnnotationFromAccessor(anotherAccessor);
                              if (type) {
                                  accessorWithTypeAnnotation = anotherAccessor;
                              }
                          }
                          writeTypeOfDeclaration(node, type, getAccessorDeclarationTypeVisibilityError);
                      }
                      write(";");
                      writeLine();
                  }
                  function getTypeAnnotationFromAccessor(accessor) {
                      if (accessor) {
                          return accessor.kind === 137
                              ? accessor.type
                              : accessor.parameters.length > 0
                                  ? accessor.parameters[0].type
                                  : undefined;
                      }
                  }
                  function getAccessorDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage;
                      if (accessorWithTypeAnnotation.kind === 138) {
                          if (accessorWithTypeAnnotation.parent.flags & 128) {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1;
                          }
                          else {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: accessorWithTypeAnnotation.parameters[0],
                              typeName: accessorWithTypeAnnotation.name
                          };
                      }
                      else {
                          if (accessorWithTypeAnnotation.flags & 128) {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0;
                          }
                          else {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: accessorWithTypeAnnotation.name,
                              typeName: undefined
                          };
                      }
                  }
              }
              function writeFunctionDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  if (!resolver.isImplementationOfOverload(node)) {
                      emitJsDocComments(node);
                      if (node.kind === 201) {
                          emitModuleElementDeclarationFlags(node);
                      }
                      else if (node.kind === 135) {
                          emitClassMemberDeclarationFlags(node);
                      }
                      if (node.kind === 201) {
                          write("function ");
                          writeTextOfNode(currentSourceFile, node.name);
                      }
                      else if (node.kind === 136) {
                          write("constructor");
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node.name);
                          if (ts.hasQuestionToken(node)) {
                              write("?");
                          }
                      }
                      emitSignatureDeclaration(node);
                  }
              }
              function emitSignatureDeclarationWithJsDocComments(node) {
                  emitJsDocComments(node);
                  emitSignatureDeclaration(node);
              }
              function emitSignatureDeclaration(node) {
                  if (node.kind === 140 || node.kind === 144) {
                      write("new ");
                  }
                  emitTypeParameters(node.typeParameters);
                  if (node.kind === 141) {
                      write("[");
                  }
                  else {
                      write("(");
                  }
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitCommaList(node.parameters, emitParameterDeclaration);
                  if (node.kind === 141) {
                      write("]");
                  }
                  else {
                      write(")");
                  }
                  var isFunctionTypeOrConstructorType = node.kind === 143 || node.kind === 144;
                  if (isFunctionTypeOrConstructorType || node.parent.kind === 146) {
                      if (node.type) {
                          write(isFunctionTypeOrConstructorType ? " => " : ": ");
                          emitType(node.type);
                      }
                  }
                  else if (node.kind !== 136 && !(node.flags & 32)) {
                      writeReturnTypeAtSignature(node, getReturnTypeVisibilityError);
                  }
                  enclosingDeclaration = prevEnclosingDeclaration;
                  if (!isFunctionTypeOrConstructorType) {
                      write(";");
                      writeLine();
                  }
                  function getReturnTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage;
                      switch (node.kind) {
                          case 140:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 139:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 141:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 135:
                          case 134:
                              if (node.flags & 128) {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                          ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
                              }
                              else if (node.parent.kind === 202) {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                          ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
                              }
                              else {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
                              }
                              break;
                          case 201:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
                              break;
                          default:
                              ts.Debug.fail("This is unknown kind for signature: " + node.kind);
                      }
                      return {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node.name || node
                      };
                  }
              }
              function emitParameterDeclaration(node) {
                  increaseIndent();
                  emitJsDocComments(node);
                  if (node.dotDotDotToken) {
                      write("...");
                  }
                  if (ts.isBindingPattern(node.name)) {
                      emitBindingPattern(node.name);
                  }
                  else {
                      writeTextOfNode(currentSourceFile, node.name);
                  }
                  if (node.initializer || ts.hasQuestionToken(node)) {
                      write("?");
                  }
                  decreaseIndent();
                  if (node.parent.kind === 143 ||
                      node.parent.kind === 144 ||
                      node.parent.parent.kind === 146) {
                      emitTypeOfVariableDeclarationFromTypeLiteral(node);
                  }
                  else if (!(node.parent.flags & 32)) {
                      writeTypeOfDeclaration(node, node.type, getParameterDeclarationTypeVisibilityError);
                  }
                  function getParameterDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                      return diagnosticMessage !== undefined ? {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node,
                          typeName: node.name
                      } : undefined;
                  }
                  function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
                      switch (node.parent.kind) {
                          case 136:
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
                          case 140:
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
                          case 139:
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
                          case 135:
                          case 134:
                              if (node.parent.flags & 128) {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                          ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
                              }
                              else if (node.parent.parent.kind === 202) {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                          ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
                              }
                              else {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
                              }
                          case 201:
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
                          default:
                              ts.Debug.fail("This is unknown parent for parameter: " + node.parent.kind);
                      }
                  }
                  function emitBindingPattern(bindingPattern) {
                      if (bindingPattern.kind === 151) {
                          write("{");
                          emitCommaList(bindingPattern.elements, emitBindingElement);
                          write("}");
                      }
                      else if (bindingPattern.kind === 152) {
                          write("[");
                          var elements = bindingPattern.elements;
                          emitCommaList(elements, emitBindingElement);
                          if (elements && elements.hasTrailingComma) {
                              write(", ");
                          }
                          write("]");
                      }
                  }
                  function emitBindingElement(bindingElement) {
                      function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                          return diagnosticMessage !== undefined ? {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: bindingElement,
                              typeName: bindingElement.name
                          } : undefined;
                      }
                      if (bindingElement.kind === 176) {
                          write(" ");
                      }
                      else if (bindingElement.kind === 153) {
                          if (bindingElement.propertyName) {
                              writeTextOfNode(currentSourceFile, bindingElement.propertyName);
                              write(": ");
                              emitBindingPattern(bindingElement.name);
                          }
                          else if (bindingElement.name) {
                              if (ts.isBindingPattern(bindingElement.name)) {
                                  emitBindingPattern(bindingElement.name);
                              }
                              else {
                                  ts.Debug.assert(bindingElement.name.kind === 65);
                                  if (bindingElement.dotDotDotToken) {
                                      write("...");
                                  }
                                  writeTextOfNode(currentSourceFile, bindingElement.name);
                              }
                          }
                      }
                  }
              }
              function emitNode(node) {
                  switch (node.kind) {
                      case 201:
                      case 206:
                      case 209:
                      case 203:
                      case 202:
                      case 204:
                      case 205:
                          return emitModuleElement(node, isModuleElementVisible(node));
                      case 181:
                          return emitModuleElement(node, isVariableStatementVisible(node));
                      case 210:
                          return emitModuleElement(node, !node.importClause);
                      case 216:
                          return emitExportDeclaration(node);
                      case 136:
                      case 135:
                      case 134:
                          return writeFunctionDeclaration(node);
                      case 140:
                      case 139:
                      case 141:
                          return emitSignatureDeclarationWithJsDocComments(node);
                      case 137:
                      case 138:
                          return emitAccessorDeclaration(node);
                      case 133:
                      case 132:
                          return emitPropertyDeclaration(node);
                      case 227:
                          return emitEnumMemberDeclaration(node);
                      case 215:
                          return emitExportAssignment(node);
                      case 228:
                          return emitSourceFile(node);
                  }
              }
              function writeReferencePath(referencedFile) {
                  var declFileName = referencedFile.flags & 2048
                      ? referencedFile.fileName
                      : ts.shouldEmitToOwnFile(referencedFile, compilerOptions)
                          ? ts.getOwnEmitOutputFilePath(referencedFile, host, ".d.ts")
                          : ts.removeFileExtension(compilerOptions.out) + ".d.ts";
                  declFileName = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizeSlashes(jsFilePath)), declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, false);
                  referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
              }
          }
          function writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics) {
              var emitDeclarationResult = emitDeclarations(host, resolver, diagnostics, jsFilePath, sourceFile);
              if (!emitDeclarationResult.reportedDeclarationError) {
                  var declarationOutput = emitDeclarationResult.referencePathsOutput
                      + getDeclarationOutput(emitDeclarationResult.synchronousDeclarationOutput, emitDeclarationResult.moduleElementDeclarationEmitInfo);
                  ts.writeFile(host, diagnostics, ts.removeFileExtension(jsFilePath) + ".d.ts", declarationOutput, host.getCompilerOptions().emitBOM);
              }
              function getDeclarationOutput(synchronousDeclarationOutput, moduleElementDeclarationEmitInfo) {
                  var appliedSyncOutputPos = 0;
                  var declarationOutput = "";
                  ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
                      if (aliasEmitInfo.asynchronousOutput) {
                          declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos, aliasEmitInfo.outputPos);
                          declarationOutput += getDeclarationOutput(aliasEmitInfo.asynchronousOutput, aliasEmitInfo.subModuleElementDeclarationEmitInfo);
                          appliedSyncOutputPos = aliasEmitInfo.outputPos;
                      }
                  });
                  declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos);
                  return declarationOutput;
              }
          }
          ts.writeDeclarationFile = writeDeclarationFile;
      })(ts || (ts = {}));
      /// <reference path="checker.ts"/>
      /// <reference path="declarationEmitter.ts"/>
      var ts;
      (function (ts) {
          function isExternalModuleOrDeclarationFile(sourceFile) {
              return ts.isExternalModule(sourceFile) || ts.isDeclarationFile(sourceFile);
          }
          ts.isExternalModuleOrDeclarationFile = isExternalModuleOrDeclarationFile;
          function emitFiles(resolver, host, targetSourceFile) {
              var extendsHelper = "\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    __.prototype = b.prototype;\n    d.prototype = new __();\n};";
              var decorateHelper = "\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") return Reflect.decorate(decorators, target, key, desc);\n    switch (arguments.length) {\n        case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);\n        case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);\n        case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);\n    }\n};";
              var metadataHelper = "\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};";
              var paramHelper = "\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};";
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
              var diagnostics = [];
              var newLine = host.getNewLine();
              if (targetSourceFile === undefined) {
                  ts.forEach(host.getSourceFiles(), function (sourceFile) {
                      if (ts.shouldEmitToOwnFile(sourceFile, compilerOptions)) {
                          var jsFilePath = ts.getOwnEmitOutputFilePath(sourceFile, host, ".js");
                          emitFile(jsFilePath, sourceFile);
                      }
                  });
                  if (compilerOptions.out) {
                      emitFile(compilerOptions.out);
                  }
              }
              else {
                  if (ts.shouldEmitToOwnFile(targetSourceFile, compilerOptions)) {
                      var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
                      emitFile(jsFilePath, targetSourceFile);
                  }
                  else if (!ts.isDeclarationFile(targetSourceFile) && compilerOptions.out) {
                      emitFile(compilerOptions.out);
                  }
              }
              diagnostics = ts.sortAndDeduplicateDiagnostics(diagnostics);
              return {
                  emitSkipped: false,
                  diagnostics: diagnostics,
                  sourceMaps: sourceMapDataList
              };
              function isNodeDescendentOf(node, ancestor) {
                  while (node) {
                      if (node === ancestor)
                          return true;
                      node = node.parent;
                  }
                  return false;
              }
              function isUniqueLocalName(name, container) {
                  for (var node = container; isNodeDescendentOf(node, container); node = node.nextContainer) {
                      if (node.locals && ts.hasProperty(node.locals, name)) {
                          if (node.locals[name].flags & (107455 | 1048576 | 8388608)) {
                              return false;
                          }
                      }
                  }
                  return true;
              }
              function emitJavaScript(jsFilePath, root) {
                  var writer = ts.createTextWriter(newLine);
                  var write = writer.write;
                  var writeTextOfNode = writer.writeTextOfNode;
                  var writeLine = writer.writeLine;
                  var increaseIndent = writer.increaseIndent;
                  var decreaseIndent = writer.decreaseIndent;
                  var currentSourceFile;
                  var exportFunctionForFile;
                  var generatedNameSet = {};
                  var nodeToGeneratedName = [];
                  var blockScopedVariableToGeneratedName;
                  var computedPropertyNamesToGeneratedNames;
                  var extendsEmitted = false;
                  var decorateEmitted = false;
                  var paramEmitted = false;
                  var tempFlags = 0;
                  var tempVariables;
                  var tempParameters;
                  var externalImports;
                  var exportSpecifiers;
                  var exportEquals;
                  var hasExportStars;
                  var writeEmittedFiles = writeJavaScriptFile;
                  var detachedCommentsInfo;
                  var writeComment = ts.writeCommentRange;
                  var emit = emitNodeWithoutSourceMap;
                  var emitStart = function (node) { };
                  var emitEnd = function (node) { };
                  var emitToken = emitTokenText;
                  var scopeEmitStart = function (scopeDeclaration, scopeName) { };
                  var scopeEmitEnd = function () { };
                  var sourceMapData;
                  if (compilerOptions.sourceMap || compilerOptions.inlineSourceMap) {
                      initializeEmitterWithSourceMaps();
                  }
                  if (root) {
                      emitSourceFile(root);
                  }
                  else {
                      ts.forEach(host.getSourceFiles(), function (sourceFile) {
                          if (!isExternalModuleOrDeclarationFile(sourceFile)) {
                              emitSourceFile(sourceFile);
                          }
                      });
                  }
                  writeLine();
                  writeEmittedFiles(writer.getText(), compilerOptions.emitBOM);
                  return;
                  function emitSourceFile(sourceFile) {
                      currentSourceFile = sourceFile;
                      exportFunctionForFile = undefined;
                      emit(sourceFile);
                  }
                  function isUniqueName(name) {
                      return !resolver.hasGlobalName(name) &&
                          !ts.hasProperty(currentSourceFile.identifiers, name) &&
                          !ts.hasProperty(generatedNameSet, name);
                  }
                  function makeTempVariableName(flags) {
                      if (flags && !(tempFlags & flags)) {
                          var name = flags === 268435456 ? "_i" : "_n";
                          if (isUniqueName(name)) {
                              tempFlags |= flags;
                              return name;
                          }
                      }
                      while (true) {
                          var count = tempFlags & 268435455;
                          tempFlags++;
                          if (count !== 8 && count !== 13) {
                              var name_15 = count < 26 ? "_" + String.fromCharCode(97 + count) : "_" + (count - 26);
                              if (isUniqueName(name_15)) {
                                  return name_15;
                              }
                          }
                      }
                  }
                  function makeUniqueName(baseName) {
                      if (baseName.charCodeAt(baseName.length - 1) !== 95) {
                          baseName += "_";
                      }
                      var i = 1;
                      while (true) {
                          var generatedName = baseName + i;
                          if (isUniqueName(generatedName)) {
                              return generatedNameSet[generatedName] = generatedName;
                          }
                          i++;
                      }
                  }
                  function assignGeneratedName(node, name) {
                      nodeToGeneratedName[ts.getNodeId(node)] = ts.unescapeIdentifier(name);
                  }
                  function generateNameForFunctionOrClassDeclaration(node) {
                      if (!node.name) {
                          assignGeneratedName(node, makeUniqueName("default"));
                      }
                  }
                  function generateNameForModuleOrEnum(node) {
                      if (node.name.kind === 65) {
                          var name_16 = node.name.text;
                          assignGeneratedName(node, isUniqueLocalName(name_16, node) ? name_16 : makeUniqueName(name_16));
                      }
                  }
                  function generateNameForImportOrExportDeclaration(node) {
                      var expr = ts.getExternalModuleName(node);
                      var baseName = expr.kind === 8 ?
                          ts.escapeIdentifier(ts.makeIdentifierFromModuleName(expr.text)) : "module";
                      assignGeneratedName(node, makeUniqueName(baseName));
                  }
                  function generateNameForImportDeclaration(node) {
                      if (node.importClause) {
                          generateNameForImportOrExportDeclaration(node);
                      }
                  }
                  function generateNameForExportDeclaration(node) {
                      if (node.moduleSpecifier) {
                          generateNameForImportOrExportDeclaration(node);
                      }
                  }
                  function generateNameForExportAssignment(node) {
                      if (node.expression && node.expression.kind !== 65) {
                          assignGeneratedName(node, makeUniqueName("default"));
                      }
                  }
                  function generateNameForNode(node) {
                      switch (node.kind) {
                          case 201:
                          case 202:
                          case 175:
                              generateNameForFunctionOrClassDeclaration(node);
                              break;
                          case 206:
                              generateNameForModuleOrEnum(node);
                              generateNameForNode(node.body);
                              break;
                          case 205:
                              generateNameForModuleOrEnum(node);
                              break;
                          case 210:
                              generateNameForImportDeclaration(node);
                              break;
                          case 216:
                              generateNameForExportDeclaration(node);
                              break;
                          case 215:
                              generateNameForExportAssignment(node);
                              break;
                      }
                  }
                  function getGeneratedNameForNode(node) {
                      var nodeId = ts.getNodeId(node);
                      if (!nodeToGeneratedName[nodeId]) {
                          generateNameForNode(node);
                      }
                      return nodeToGeneratedName[nodeId];
                  }
                  function initializeEmitterWithSourceMaps() {
                      var sourceMapDir;
                      var sourceMapSourceIndex = -1;
                      var sourceMapNameIndexMap = {};
                      var sourceMapNameIndices = [];
                      function getSourceMapNameIndex() {
                          return sourceMapNameIndices.length ? ts.lastOrUndefined(sourceMapNameIndices) : -1;
                      }
                      var lastRecordedSourceMapSpan;
                      var lastEncodedSourceMapSpan = {
                          emittedLine: 1,
                          emittedColumn: 1,
                          sourceLine: 1,
                          sourceColumn: 1,
                          sourceIndex: 0
                      };
                      var lastEncodedNameIndex = 0;
                      function encodeLastRecordedSourceMapSpan() {
                          if (!lastRecordedSourceMapSpan || lastRecordedSourceMapSpan === lastEncodedSourceMapSpan) {
                              return;
                          }
                          var prevEncodedEmittedColumn = lastEncodedSourceMapSpan.emittedColumn;
                          if (lastEncodedSourceMapSpan.emittedLine == lastRecordedSourceMapSpan.emittedLine) {
                              if (sourceMapData.sourceMapMappings) {
                                  sourceMapData.sourceMapMappings += ",";
                              }
                          }
                          else {
                              for (var encodedLine = lastEncodedSourceMapSpan.emittedLine; encodedLine < lastRecordedSourceMapSpan.emittedLine; encodedLine++) {
                                  sourceMapData.sourceMapMappings += ";";
                              }
                              prevEncodedEmittedColumn = 1;
                          }
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.emittedColumn - prevEncodedEmittedColumn);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceIndex - lastEncodedSourceMapSpan.sourceIndex);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceLine - lastEncodedSourceMapSpan.sourceLine);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceColumn - lastEncodedSourceMapSpan.sourceColumn);
                          if (lastRecordedSourceMapSpan.nameIndex >= 0) {
                              sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.nameIndex - lastEncodedNameIndex);
                              lastEncodedNameIndex = lastRecordedSourceMapSpan.nameIndex;
                          }
                          lastEncodedSourceMapSpan = lastRecordedSourceMapSpan;
                          sourceMapData.sourceMapDecodedMappings.push(lastEncodedSourceMapSpan);
                          function base64VLQFormatEncode(inValue) {
                              function base64FormatEncode(inValue) {
                                  if (inValue < 64) {
                                      return 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(inValue);
                                  }
                                  throw TypeError(inValue + ": not a 64 based value");
                              }
                              if (inValue < 0) {
                                  inValue = ((-inValue) << 1) + 1;
                              }
                              else {
                                  inValue = inValue << 1;
                              }
                              var encodedStr = "";
                              do {
                                  var currentDigit = inValue & 31;
                                  inValue = inValue >> 5;
                                  if (inValue > 0) {
                                      currentDigit = currentDigit | 32;
                                  }
                                  encodedStr = encodedStr + base64FormatEncode(currentDigit);
                              } while (inValue > 0);
                              return encodedStr;
                          }
                      }
                      function recordSourceMapSpan(pos) {
                          var sourceLinePos = ts.getLineAndCharacterOfPosition(currentSourceFile, pos);
                          sourceLinePos.line++;
                          sourceLinePos.character++;
                          var emittedLine = writer.getLine();
                          var emittedColumn = writer.getColumn();
                          if (!lastRecordedSourceMapSpan ||
                              lastRecordedSourceMapSpan.emittedLine != emittedLine ||
                              lastRecordedSourceMapSpan.emittedColumn != emittedColumn ||
                              (lastRecordedSourceMapSpan.sourceIndex === sourceMapSourceIndex &&
                                  (lastRecordedSourceMapSpan.sourceLine > sourceLinePos.line ||
                                      (lastRecordedSourceMapSpan.sourceLine === sourceLinePos.line && lastRecordedSourceMapSpan.sourceColumn > sourceLinePos.character)))) {
                              encodeLastRecordedSourceMapSpan();
                              lastRecordedSourceMapSpan = {
                                  emittedLine: emittedLine,
                                  emittedColumn: emittedColumn,
                                  sourceLine: sourceLinePos.line,
                                  sourceColumn: sourceLinePos.character,
                                  nameIndex: getSourceMapNameIndex(),
                                  sourceIndex: sourceMapSourceIndex
                              };
                          }
                          else {
                              lastRecordedSourceMapSpan.sourceLine = sourceLinePos.line;
                              lastRecordedSourceMapSpan.sourceColumn = sourceLinePos.character;
                              lastRecordedSourceMapSpan.sourceIndex = sourceMapSourceIndex;
                          }
                      }
                      function recordEmitNodeStartSpan(node) {
                          recordSourceMapSpan(ts.skipTrivia(currentSourceFile.text, node.pos));
                      }
                      function recordEmitNodeEndSpan(node) {
                          recordSourceMapSpan(node.end);
                      }
                      function writeTextWithSpanRecord(tokenKind, startPos, emitFn) {
                          var tokenStartPos = ts.skipTrivia(currentSourceFile.text, startPos);
                          recordSourceMapSpan(tokenStartPos);
                          var tokenEndPos = emitTokenText(tokenKind, tokenStartPos, emitFn);
                          recordSourceMapSpan(tokenEndPos);
                          return tokenEndPos;
                      }
                      function recordNewSourceFileStart(node) {
                          var sourcesDirectoryPath = compilerOptions.sourceRoot ? host.getCommonSourceDirectory() : sourceMapDir;
                          sourceMapData.sourceMapSources.push(ts.getRelativePathToDirectoryOrUrl(sourcesDirectoryPath, node.fileName, host.getCurrentDirectory(), host.getCanonicalFileName, true));
                          sourceMapSourceIndex = sourceMapData.sourceMapSources.length - 1;
                          sourceMapData.inputSourceFileNames.push(node.fileName);
                          if (compilerOptions.inlineSources) {
                              if (!sourceMapData.sourceMapSourcesContent) {
                                  sourceMapData.sourceMapSourcesContent = [];
                              }
                              sourceMapData.sourceMapSourcesContent.push(node.text);
                          }
                      }
                      function recordScopeNameOfNode(node, scopeName) {
                          function recordScopeNameIndex(scopeNameIndex) {
                              sourceMapNameIndices.push(scopeNameIndex);
                          }
                          function recordScopeNameStart(scopeName) {
                              var scopeNameIndex = -1;
                              if (scopeName) {
                                  var parentIndex = getSourceMapNameIndex();
                                  if (parentIndex !== -1) {
                                      var name_17 = node.name;
                                      if (!name_17 || name_17.kind !== 128) {
                                          scopeName = "." + scopeName;
                                      }
                                      scopeName = sourceMapData.sourceMapNames[parentIndex] + scopeName;
                                  }
                                  scopeNameIndex = ts.getProperty(sourceMapNameIndexMap, scopeName);
                                  if (scopeNameIndex === undefined) {
                                      scopeNameIndex = sourceMapData.sourceMapNames.length;
                                      sourceMapData.sourceMapNames.push(scopeName);
                                      sourceMapNameIndexMap[scopeName] = scopeNameIndex;
                                  }
                              }
                              recordScopeNameIndex(scopeNameIndex);
                          }
                          if (scopeName) {
                              recordScopeNameStart(scopeName);
                          }
                          else if (node.kind === 201 ||
                              node.kind === 163 ||
                              node.kind === 135 ||
                              node.kind === 134 ||
                              node.kind === 137 ||
                              node.kind === 138 ||
                              node.kind === 206 ||
                              node.kind === 202 ||
                              node.kind === 205) {
                              if (node.name) {
                                  var name_18 = node.name;
                                  scopeName = name_18.kind === 128
                                      ? ts.getTextOfNode(name_18)
                                      : node.name.text;
                              }
                              recordScopeNameStart(scopeName);
                          }
                          else {
                              recordScopeNameIndex(getSourceMapNameIndex());
                          }
                      }
                      function recordScopeNameEnd() {
                          sourceMapNameIndices.pop();
                      }
                      ;
                      function writeCommentRangeWithMap(curentSourceFile, writer, comment, newLine) {
                          recordSourceMapSpan(comment.pos);
                          ts.writeCommentRange(currentSourceFile, writer, comment, newLine);
                          recordSourceMapSpan(comment.end);
                      }
                      function serializeSourceMapContents(version, file, sourceRoot, sources, names, mappings, sourcesContent) {
                          if (typeof JSON !== "undefined") {
                              var map_1 = {
                                  version: version,
                                  file: file,
                                  sourceRoot: sourceRoot,
                                  sources: sources,
                                  names: names,
                                  mappings: mappings
                              };
                              if (sourcesContent !== undefined) {
                                  map_1.sourcesContent = sourcesContent;
                              }
                              return JSON.stringify(map_1);
                          }
                          return "{\"version\":" + version + ",\"file\":\"" + ts.escapeString(file) + "\",\"sourceRoot\":\"" + ts.escapeString(sourceRoot) + "\",\"sources\":[" + serializeStringArray(sources) + "],\"names\":[" + serializeStringArray(names) + "],\"mappings\":\"" + ts.escapeString(mappings) + "\" " + (sourcesContent !== undefined ? ",\"sourcesContent\":[" + serializeStringArray(sourcesContent) + "]" : "") + "}";
                          function serializeStringArray(list) {
                              var output = "";
                              for (var i = 0, n = list.length; i < n; i++) {
                                  if (i) {
                                      output += ",";
                                  }
                                  output += "\"" + ts.escapeString(list[i]) + "\"";
                              }
                              return output;
                          }
                      }
                      function writeJavaScriptAndSourceMapFile(emitOutput, writeByteOrderMark) {
                          encodeLastRecordedSourceMapSpan();
                          var sourceMapText = serializeSourceMapContents(3, sourceMapData.sourceMapFile, sourceMapData.sourceMapSourceRoot, sourceMapData.sourceMapSources, sourceMapData.sourceMapNames, sourceMapData.sourceMapMappings, sourceMapData.sourceMapSourcesContent);
                          sourceMapDataList.push(sourceMapData);
                          var sourceMapUrl;
                          if (compilerOptions.inlineSourceMap) {
                              var base64SourceMapText = ts.convertToBase64(sourceMapText);
                              sourceMapUrl = "//# sourceMappingURL=data:application/json;base64," + base64SourceMapText;
                          }
                          else {
                              ts.writeFile(host, diagnostics, sourceMapData.sourceMapFilePath, sourceMapText, false);
                              sourceMapUrl = "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL;
                          }
                          writeJavaScriptFile(emitOutput + sourceMapUrl, writeByteOrderMark);
                      }
                      var sourceMapJsFile = ts.getBaseFileName(ts.normalizeSlashes(jsFilePath));
                      sourceMapData = {
                          sourceMapFilePath: jsFilePath + ".map",
                          jsSourceMappingURL: sourceMapJsFile + ".map",
                          sourceMapFile: sourceMapJsFile,
                          sourceMapSourceRoot: compilerOptions.sourceRoot || "",
                          sourceMapSources: [],
                          inputSourceFileNames: [],
                          sourceMapNames: [],
                          sourceMapMappings: "",
                          sourceMapSourcesContent: undefined,
                          sourceMapDecodedMappings: []
                      };
                      sourceMapData.sourceMapSourceRoot = ts.normalizeSlashes(sourceMapData.sourceMapSourceRoot);
                      if (sourceMapData.sourceMapSourceRoot.length && sourceMapData.sourceMapSourceRoot.charCodeAt(sourceMapData.sourceMapSourceRoot.length - 1) !== 47) {
                          sourceMapData.sourceMapSourceRoot += ts.directorySeparator;
                      }
                      if (compilerOptions.mapRoot) {
                          sourceMapDir = ts.normalizeSlashes(compilerOptions.mapRoot);
                          if (root) {
                              sourceMapDir = ts.getDirectoryPath(ts.getSourceFilePathInNewDir(root, host, sourceMapDir));
                          }
                          if (!ts.isRootedDiskPath(sourceMapDir) && !ts.isUrl(sourceMapDir)) {
                              sourceMapDir = ts.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
                              sourceMapData.jsSourceMappingURL = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizePath(jsFilePath)), ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL), host.getCurrentDirectory(), host.getCanonicalFileName, true);
                          }
                          else {
                              sourceMapData.jsSourceMappingURL = ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL);
                          }
                      }
                      else {
                          sourceMapDir = ts.getDirectoryPath(ts.normalizePath(jsFilePath));
                      }
                      function emitNodeWithSourceMap(node, allowGeneratedIdentifiers) {
                          if (node) {
                              if (ts.nodeIsSynthesized(node)) {
                                  return emitNodeWithoutSourceMap(node, false);
                              }
                              if (node.kind != 228) {
                                  recordEmitNodeStartSpan(node);
                                  emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers);
                                  recordEmitNodeEndSpan(node);
                              }
                              else {
                                  recordNewSourceFileStart(node);
                                  emitNodeWithoutSourceMap(node, false);
                              }
                          }
                      }
                      writeEmittedFiles = writeJavaScriptAndSourceMapFile;
                      emit = emitNodeWithSourceMap;
                      emitStart = recordEmitNodeStartSpan;
                      emitEnd = recordEmitNodeEndSpan;
                      emitToken = writeTextWithSpanRecord;
                      scopeEmitStart = recordScopeNameOfNode;
                      scopeEmitEnd = recordScopeNameEnd;
                      writeComment = writeCommentRangeWithMap;
                  }
                  function writeJavaScriptFile(emitOutput, writeByteOrderMark) {
                      ts.writeFile(host, diagnostics, jsFilePath, emitOutput, writeByteOrderMark);
                  }
                  function createTempVariable(flags) {
                      var result = ts.createSynthesizedNode(65);
                      result.text = makeTempVariableName(flags);
                      return result;
                  }
                  function recordTempDeclaration(name) {
                      if (!tempVariables) {
                          tempVariables = [];
                      }
                      tempVariables.push(name);
                  }
                  function createAndRecordTempVariable(flags) {
                      var temp = createTempVariable(flags);
                      recordTempDeclaration(temp);
                      return temp;
                  }
                  function emitTempDeclarations(newLine) {
                      if (tempVariables) {
                          if (newLine) {
                              writeLine();
                          }
                          else {
                              write(" ");
                          }
                          write("var ");
                          emitCommaList(tempVariables);
                          write(";");
                      }
                  }
                  function emitTokenText(tokenKind, startPos, emitFn) {
                      var tokenString = ts.tokenToString(tokenKind);
                      if (emitFn) {
                          emitFn();
                      }
                      else {
                          write(tokenString);
                      }
                      return startPos + tokenString.length;
                  }
                  function emitOptional(prefix, node) {
                      if (node) {
                          write(prefix);
                          emit(node);
                      }
                  }
                  function emitParenthesizedIf(node, parenthesized) {
                      if (parenthesized) {
                          write("(");
                      }
                      emit(node);
                      if (parenthesized) {
                          write(")");
                      }
                  }
                  function emitTrailingCommaIfPresent(nodeList) {
                      if (nodeList.hasTrailingComma) {
                          write(",");
                      }
                  }
                  function emitLinePreservingList(parent, nodes, allowTrailingComma, spacesBetweenBraces) {
                      ts.Debug.assert(nodes.length > 0);
                      increaseIndent();
                      if (nodeStartPositionsAreOnSameLine(parent, nodes[0])) {
                          if (spacesBetweenBraces) {
                              write(" ");
                          }
                      }
                      else {
                          writeLine();
                      }
                      for (var i = 0, n = nodes.length; i < n; i++) {
                          if (i) {
                              if (nodeEndIsOnSameLineAsNodeStart(nodes[i - 1], nodes[i])) {
                                  write(", ");
                              }
                              else {
                                  write(",");
                                  writeLine();
                              }
                          }
                          emit(nodes[i]);
                      }
                      if (nodes.hasTrailingComma && allowTrailingComma) {
                          write(",");
                      }
                      decreaseIndent();
                      if (nodeEndPositionsAreOnSameLine(parent, ts.lastOrUndefined(nodes))) {
                          if (spacesBetweenBraces) {
                              write(" ");
                          }
                      }
                      else {
                          writeLine();
                      }
                  }
                  function emitList(nodes, start, count, multiLine, trailingComma, leadingComma, noTrailingNewLine, emitNode) {
                      if (!emitNode) {
                          emitNode = emit;
                      }
                      for (var i = 0; i < count; i++) {
                          if (multiLine) {
                              if (i || leadingComma) {
                                  write(",");
                              }
                              writeLine();
                          }
                          else {
                              if (i || leadingComma) {
                                  write(", ");
                              }
                          }
                          emitNode(nodes[start + i]);
                          leadingComma = true;
                      }
                      if (trailingComma) {
                          write(",");
                      }
                      if (multiLine && !noTrailingNewLine) {
                          writeLine();
                      }
                      return count;
                  }
                  function emitCommaList(nodes) {
                      if (nodes) {
                          emitList(nodes, 0, nodes.length, false, false);
                      }
                  }
                  function emitLines(nodes) {
                      emitLinesStartingAt(nodes, 0);
                  }
                  function emitLinesStartingAt(nodes, startIndex) {
                      for (var i = startIndex; i < nodes.length; i++) {
                          writeLine();
                          emit(nodes[i]);
                      }
                  }
                  function isBinaryOrOctalIntegerLiteral(node, text) {
                      if (node.kind === 7 && text.length > 1) {
                          switch (text.charCodeAt(1)) {
                              case 98:
                              case 66:
                              case 111:
                              case 79:
                                  return true;
                          }
                      }
                      return false;
                  }
                  function emitLiteral(node) {
                      var text = getLiteralText(node);
                      if ((compilerOptions.sourceMap || compilerOptions.inlineSourceMap) && (node.kind === 8 || ts.isTemplateLiteralKind(node.kind))) {
                          writer.writeLiteral(text);
                      }
                      else if (languageVersion < 2 && isBinaryOrOctalIntegerLiteral(node, text)) {
                          write(node.text);
                      }
                      else {
                          write(text);
                      }
                  }
                  function getLiteralText(node) {
                      if (languageVersion < 2 && (ts.isTemplateLiteralKind(node.kind) || node.hasExtendedUnicodeEscape)) {
                          return getQuotedEscapedLiteralText('"', node.text, '"');
                      }
                      if (node.parent) {
                          return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
                      }
                      switch (node.kind) {
                          case 8:
                              return getQuotedEscapedLiteralText('"', node.text, '"');
                          case 10:
                              return getQuotedEscapedLiteralText('`', node.text, '`');
                          case 11:
                              return getQuotedEscapedLiteralText('`', node.text, '${');
                          case 12:
                              return getQuotedEscapedLiteralText('}', node.text, '${');
                          case 13:
                              return getQuotedEscapedLiteralText('}', node.text, '`');
                          case 7:
                              return node.text;
                      }
                      ts.Debug.fail("Literal kind '" + node.kind + "' not accounted for.");
                  }
                  function getQuotedEscapedLiteralText(leftQuote, text, rightQuote) {
                      return leftQuote + ts.escapeNonAsciiCharacters(ts.escapeString(text)) + rightQuote;
                  }
                  function emitDownlevelRawTemplateLiteral(node) {
                      var text = ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
                      var isLast = node.kind === 10 || node.kind === 13;
                      text = text.substring(1, text.length - (isLast ? 1 : 2));
                      text = text.replace(/\r\n?/g, "\n");
                      text = ts.escapeString(text);
                      write('"' + text + '"');
                  }
                  function emitDownlevelTaggedTemplateArray(node, literalEmitter) {
                      write("[");
                      if (node.template.kind === 10) {
                          literalEmitter(node.template);
                      }
                      else {
                          literalEmitter(node.template.head);
                          ts.forEach(node.template.templateSpans, function (child) {
                              write(", ");
                              literalEmitter(child.literal);
                          });
                      }
                      write("]");
                  }
                  function emitDownlevelTaggedTemplate(node) {
                      var tempVariable = createAndRecordTempVariable(0);
                      write("(");
                      emit(tempVariable);
                      write(" = ");
                      emitDownlevelTaggedTemplateArray(node, emit);
                      write(", ");
                      emit(tempVariable);
                      write(".raw = ");
                      emitDownlevelTaggedTemplateArray(node, emitDownlevelRawTemplateLiteral);
                      write(", ");
                      emitParenthesizedIf(node.tag, needsParenthesisForPropertyAccessOrInvocation(node.tag));
                      write("(");
                      emit(tempVariable);
                      if (node.template.kind === 172) {
                          ts.forEach(node.template.templateSpans, function (templateSpan) {
                              write(", ");
                              var needsParens = templateSpan.expression.kind === 170
                                  && templateSpan.expression.operatorToken.kind === 23;
                              emitParenthesizedIf(templateSpan.expression, needsParens);
                          });
                      }
                      write("))");
                  }
                  function emitTemplateExpression(node) {
                      if (languageVersion >= 2) {
                          ts.forEachChild(node, emit);
                          return;
                      }
                      var emitOuterParens = ts.isExpression(node.parent)
                          && templateNeedsParens(node, node.parent);
                      if (emitOuterParens) {
                          write("(");
                      }
                      var headEmitted = false;
                      if (shouldEmitTemplateHead()) {
                          emitLiteral(node.head);
                          headEmitted = true;
                      }
                      for (var i = 0, n = node.templateSpans.length; i < n; i++) {
                          var templateSpan = node.templateSpans[i];
                          var needsParens = templateSpan.expression.kind !== 162
                              && comparePrecedenceToBinaryPlus(templateSpan.expression) !== 1;
                          if (i > 0 || headEmitted) {
                              write(" + ");
                          }
                          emitParenthesizedIf(templateSpan.expression, needsParens);
                          if (templateSpan.literal.text.length !== 0) {
                              write(" + ");
                              emitLiteral(templateSpan.literal);
                          }
                      }
                      if (emitOuterParens) {
                          write(")");
                      }
                      function shouldEmitTemplateHead() {
                          // If this expression has an empty head literal and the first template span has a non-empty
                          // literal, then emitting the empty head literal is not necessary.
                          //     `${ foo } and ${ bar }`
                          // can be emitted as
                          //     foo + " and " + bar
                          // This is because it is only required that one of the first two operands in the emit
                          // output must be a string literal, so that the other operand and all following operands
                          // are forced into strings.
                          //
                          // If the first template span has an empty literal, then the head must still be emitted.
                          //     `${ foo }${ bar }`
                          // must still be emitted as
                          //     "" + foo + bar
                          ts.Debug.assert(node.templateSpans.length !== 0);
                          return node.head.text.length !== 0 || node.templateSpans[0].literal.text.length === 0;
                      }
                      function templateNeedsParens(template, parent) {
                          switch (parent.kind) {
                              case 158:
                              case 159:
                                  return parent.expression === template;
                              case 160:
                              case 162:
                                  return false;
                              default:
                                  return comparePrecedenceToBinaryPlus(parent) !== -1;
                          }
                      }
                      function comparePrecedenceToBinaryPlus(expression) {
                          switch (expression.kind) {
                              case 170:
                                  switch (expression.operatorToken.kind) {
                                      case 35:
                                      case 36:
                                      case 37:
                                          return 1;
                                      case 33:
                                      case 34:
                                          return 0;
                                      default:
                                          return -1;
                                  }
                              case 173:
                              case 171:
                                  return -1;
                              default:
                                  return 1;
                          }
                      }
                  }
                  function emitTemplateSpan(span) {
                      emit(span.expression);
                      emit(span.literal);
                  }
                  function emitExpressionForPropertyName(node) {
                      ts.Debug.assert(node.kind !== 153);
                      if (node.kind === 8) {
                          emitLiteral(node);
                      }
                      else if (node.kind === 128) {
                          if (ts.nodeIsDecorated(node.parent)) {
                              if (!computedPropertyNamesToGeneratedNames) {
                                  computedPropertyNamesToGeneratedNames = [];
                              }
                              var generatedName = computedPropertyNamesToGeneratedNames[ts.getNodeId(node)];
                              if (generatedName) {
                                  write(generatedName);
                                  return;
                              }
                              generatedName = createAndRecordTempVariable(0).text;
                              computedPropertyNamesToGeneratedNames[ts.getNodeId(node)] = generatedName;
                              write(generatedName);
                              write(" = ");
                          }
                          emit(node.expression);
                      }
                      else {
                          write("\"");
                          if (node.kind === 7) {
                              write(node.text);
                          }
                          else {
                              writeTextOfNode(currentSourceFile, node);
                          }
                          write("\"");
                      }
                  }
                  function isNotExpressionIdentifier(node) {
                      var parent = node.parent;
                      switch (parent.kind) {
                          case 130:
                          case 199:
                          case 153:
                          case 133:
                          case 132:
                          case 225:
                          case 226:
                          case 227:
                          case 135:
                          case 134:
                          case 201:
                          case 137:
                          case 138:
                          case 163:
                          case 202:
                          case 203:
                          case 205:
                          case 206:
                          case 209:
                          case 211:
                          case 212:
                              return parent.name === node;
                          case 214:
                          case 218:
                              return parent.name === node || parent.propertyName === node;
                          case 191:
                          case 190:
                          case 215:
                              return false;
                          case 195:
                              return node.parent.label === node;
                      }
                  }
                  function emitExpressionIdentifier(node) {
                      var substitution = resolver.getExpressionNameSubstitution(node, getGeneratedNameForNode);
                      if (substitution) {
                          write(substitution);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node);
                      }
                  }
                  function getGeneratedNameForIdentifier(node) {
                      if (ts.nodeIsSynthesized(node) || !blockScopedVariableToGeneratedName) {
                          return undefined;
                      }
                      var variableId = resolver.getBlockScopedVariableId(node);
                      if (variableId === undefined) {
                          return undefined;
                      }
                      return blockScopedVariableToGeneratedName[variableId];
                  }
                  function emitIdentifier(node, allowGeneratedIdentifiers) {
                      if (allowGeneratedIdentifiers) {
                          var generatedName = getGeneratedNameForIdentifier(node);
                          if (generatedName) {
                              write(generatedName);
                              return;
                          }
                      }
                      if (!node.parent) {
                          write(node.text);
                      }
                      else if (!isNotExpressionIdentifier(node)) {
                          emitExpressionIdentifier(node);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node);
                      }
                  }
                  function emitThis(node) {
                      if (resolver.getNodeCheckFlags(node) & 2) {
                          write("_this");
                      }
                      else {
                          write("this");
                      }
                  }
                  function emitSuper(node) {
                      if (languageVersion >= 2) {
                          write("super");
                      }
                      else {
                          var flags = resolver.getNodeCheckFlags(node);
                          if (flags & 16) {
                              write("_super.prototype");
                          }
                          else {
                              write("_super");
                          }
                      }
                  }
                  function emitObjectBindingPattern(node) {
                      write("{ ");
                      var elements = node.elements;
                      emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
                      write(" }");
                  }
                  function emitArrayBindingPattern(node) {
                      write("[");
                      var elements = node.elements;
                      emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
                      write("]");
                  }
                  function emitBindingElement(node) {
                      if (node.propertyName) {
                          emit(node.propertyName, false);
                          write(": ");
                      }
                      if (node.dotDotDotToken) {
                          write("...");
                      }
                      if (ts.isBindingPattern(node.name)) {
                          emit(node.name);
                      }
                      else {
                          emitModuleMemberName(node);
                      }
                      emitOptional(" = ", node.initializer);
                  }
                  function emitSpreadElementExpression(node) {
                      write("...");
                      emit(node.expression);
                  }
                  function emitYieldExpression(node) {
                      write(ts.tokenToString(110));
                      if (node.asteriskToken) {
                          write("*");
                      }
                      if (node.expression) {
                          write(" ");
                          emit(node.expression);
                      }
                  }
                  function needsParenthesisForPropertyAccessOrInvocation(node) {
                      switch (node.kind) {
                          case 65:
                          case 154:
                          case 156:
                          case 157:
                          case 158:
                          case 162:
                              return false;
                      }
                      return true;
                  }
                  function emitListWithSpread(elements, alwaysCopy, multiLine, trailingComma) {
                      var pos = 0;
                      var group = 0;
                      var length = elements.length;
                      while (pos < length) {
                          if (group === 1) {
                              write(".concat(");
                          }
                          else if (group > 1) {
                              write(", ");
                          }
                          var e = elements[pos];
                          if (e.kind === 174) {
                              e = e.expression;
                              emitParenthesizedIf(e, group === 0 && needsParenthesisForPropertyAccessOrInvocation(e));
                              pos++;
                              if (pos === length && group === 0 && alwaysCopy && e.kind !== 154) {
                                  write(".slice()");
                              }
                          }
                          else {
                              var i = pos;
                              while (i < length && elements[i].kind !== 174) {
                                  i++;
                              }
                              write("[");
                              if (multiLine) {
                                  increaseIndent();
                              }
                              emitList(elements, pos, i - pos, multiLine, trailingComma && i === length);
                              if (multiLine) {
                                  decreaseIndent();
                              }
                              write("]");
                              pos = i;
                          }
                          group++;
                      }
                      if (group > 1) {
                          write(")");
                      }
                  }
                  function isSpreadElementExpression(node) {
                      return node.kind === 174;
                  }
                  function emitArrayLiteral(node) {
                      var elements = node.elements;
                      if (elements.length === 0) {
                          write("[]");
                      }
                      else if (languageVersion >= 2 || !ts.forEach(elements, isSpreadElementExpression)) {
                          write("[");
                          emitLinePreservingList(node, node.elements, elements.hasTrailingComma, false);
                          write("]");
                      }
                      else {
                          emitListWithSpread(elements, true, (node.flags & 512) !== 0, elements.hasTrailingComma);
                      }
                  }
                  function emitObjectLiteralBody(node, numElements) {
                      if (numElements === 0) {
                          write("{}");
                          return;
                      }
                      write("{");
                      if (numElements > 0) {
                          var properties = node.properties;
                          if (numElements === properties.length) {
                              emitLinePreservingList(node, properties, languageVersion >= 1, true);
                          }
                          else {
                              var multiLine = (node.flags & 512) !== 0;
                              if (!multiLine) {
                                  write(" ");
                              }
                              else {
                                  increaseIndent();
                              }
                              emitList(properties, 0, numElements, multiLine, false);
                              if (!multiLine) {
                                  write(" ");
                              }
                              else {
                                  decreaseIndent();
                              }
                          }
                      }
                      write("}");
                  }
                  function emitDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex) {
                      var multiLine = (node.flags & 512) !== 0;
                      var properties = node.properties;
                      write("(");
                      if (multiLine) {
                          increaseIndent();
                      }
                      var tempVar = createAndRecordTempVariable(0);
                      emit(tempVar);
                      write(" = ");
                      emitObjectLiteralBody(node, firstComputedPropertyIndex);
                      for (var i = firstComputedPropertyIndex, n = properties.length; i < n; i++) {
                          writeComma();
                          var property = properties[i];
                          emitStart(property);
                          if (property.kind === 137 || property.kind === 138) {
                              var accessors = ts.getAllAccessorDeclarations(node.properties, property);
                              if (property !== accessors.firstAccessor) {
                                  continue;
                              }
                              write("Object.defineProperty(");
                              emit(tempVar);
                              write(", ");
                              emitStart(node.name);
                              emitExpressionForPropertyName(property.name);
                              emitEnd(property.name);
                              write(", {");
                              increaseIndent();
                              if (accessors.getAccessor) {
                                  writeLine();
                                  emitLeadingComments(accessors.getAccessor);
                                  write("get: ");
                                  emitStart(accessors.getAccessor);
                                  write("function ");
                                  emitSignatureAndBody(accessors.getAccessor);
                                  emitEnd(accessors.getAccessor);
                                  emitTrailingComments(accessors.getAccessor);
                                  write(",");
                              }
                              if (accessors.setAccessor) {
                                  writeLine();
                                  emitLeadingComments(accessors.setAccessor);
                                  write("set: ");
                                  emitStart(accessors.setAccessor);
                                  write("function ");
                                  emitSignatureAndBody(accessors.setAccessor);
                                  emitEnd(accessors.setAccessor);
                                  emitTrailingComments(accessors.setAccessor);
                                  write(",");
                              }
                              writeLine();
                              write("enumerable: true,");
                              writeLine();
                              write("configurable: true");
                              decreaseIndent();
                              writeLine();
                              write("})");
                              emitEnd(property);
                          }
                          else {
                              emitLeadingComments(property);
                              emitStart(property.name);
                              emit(tempVar);
                              emitMemberAccessForPropertyName(property.name);
                              emitEnd(property.name);
                              write(" = ");
                              if (property.kind === 225) {
                                  emit(property.initializer);
                              }
                              else if (property.kind === 226) {
                                  emitExpressionIdentifier(property.name);
                              }
                              else if (property.kind === 135) {
                                  emitFunctionDeclaration(property);
                              }
                              else {
                                  ts.Debug.fail("ObjectLiteralElement type not accounted for: " + property.kind);
                              }
                          }
                          emitEnd(property);
                      }
                      writeComma();
                      emit(tempVar);
                      if (multiLine) {
                          decreaseIndent();
                          writeLine();
                      }
                      write(")");
                      function writeComma() {
                          if (multiLine) {
                              write(",");
                              writeLine();
                          }
                          else {
                              write(", ");
                          }
                      }
                  }
                  function emitObjectLiteral(node) {
                      var properties = node.properties;
                      if (languageVersion < 2) {
                          var numProperties = properties.length;
                          var numInitialNonComputedProperties = numProperties;
                          for (var i = 0, n = properties.length; i < n; i++) {
                              if (properties[i].name.kind === 128) {
                                  numInitialNonComputedProperties = i;
                                  break;
                              }
                          }
                          var hasComputedProperty = numInitialNonComputedProperties !== properties.length;
                          if (hasComputedProperty) {
                              emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties);
                              return;
                          }
                      }
                      emitObjectLiteralBody(node, properties.length);
                  }
                  function createBinaryExpression(left, operator, right, startsOnNewLine) {
                      var result = ts.createSynthesizedNode(170, startsOnNewLine);
                      result.operatorToken = ts.createSynthesizedNode(operator);
                      result.left = left;
                      result.right = right;
                      return result;
                  }
                  function createPropertyAccessExpression(expression, name) {
                      var result = ts.createSynthesizedNode(156);
                      result.expression = parenthesizeForAccess(expression);
                      result.dotToken = ts.createSynthesizedNode(20);
                      result.name = name;
                      return result;
                  }
                  function createElementAccessExpression(expression, argumentExpression) {
                      var result = ts.createSynthesizedNode(157);
                      result.expression = parenthesizeForAccess(expression);
                      result.argumentExpression = argumentExpression;
                      return result;
                  }
                  function parenthesizeForAccess(expr) {
                      if (ts.isLeftHandSideExpression(expr) && expr.kind !== 159 && expr.kind !== 7) {
                          return expr;
                      }
                      var node = ts.createSynthesizedNode(162);
                      node.expression = expr;
                      return node;
                  }
                  function emitComputedPropertyName(node) {
                      write("[");
                      emitExpressionForPropertyName(node);
                      write("]");
                  }
                  function emitMethod(node) {
                      if (languageVersion >= 2 && node.asteriskToken) {
                          write("*");
                      }
                      emit(node.name, false);
                      if (languageVersion < 2) {
                          write(": function ");
                      }
                      emitSignatureAndBody(node);
                  }
                  function emitPropertyAssignment(node) {
                      emit(node.name, false);
                      write(": ");
                      emit(node.initializer);
                  }
                  function emitShorthandPropertyAssignment(node) {
                      emit(node.name, false);
                      if (languageVersion < 2) {
                          write(": ");
                          var generatedName = getGeneratedNameForIdentifier(node.name);
                          if (generatedName) {
                              write(generatedName);
                          }
                          else {
                              emitExpressionIdentifier(node.name);
                          }
                      }
                      else if (resolver.getExpressionNameSubstitution(node.name, getGeneratedNameForNode)) {
                          write(": ");
                          emitExpressionIdentifier(node.name);
                      }
                  }
                  function tryEmitConstantValue(node) {
                      if (compilerOptions.separateCompilation) {
                          return false;
                      }
                      var constantValue = resolver.getConstantValue(node);
                      if (constantValue !== undefined) {
                          write(constantValue.toString());
                          if (!compilerOptions.removeComments) {
                              var propertyName = node.kind === 156 ? ts.declarationNameToString(node.name) : ts.getTextOfNode(node.argumentExpression);
                              write(" /* " + propertyName + " */");
                          }
                          return true;
                      }
                      return false;
                  }
                  function indentIfOnDifferentLines(parent, node1, node2, valueToWriteWhenNotIndenting) {
                      var realNodesAreOnDifferentLines = !ts.nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2);
                      var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2);
                      if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) {
                          increaseIndent();
                          writeLine();
                          return true;
                      }
                      else {
                          if (valueToWriteWhenNotIndenting) {
                              write(valueToWriteWhenNotIndenting);
                          }
                          return false;
                      }
                  }
                  function emitPropertyAccess(node) {
                      if (tryEmitConstantValue(node)) {
                          return;
                      }
                      emit(node.expression);
                      var indentedBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken);
                      write(".");
                      var indentedAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name);
                      emit(node.name, false);
                      decreaseIndentIf(indentedBeforeDot, indentedAfterDot);
                  }
                  function emitQualifiedName(node) {
                      emit(node.left);
                      write(".");
                      emit(node.right);
                  }
                  function emitIndexedAccess(node) {
                      if (tryEmitConstantValue(node)) {
                          return;
                      }
                      emit(node.expression);
                      write("[");
                      emit(node.argumentExpression);
                      write("]");
                  }
                  function hasSpreadElement(elements) {
                      return ts.forEach(elements, function (e) { return e.kind === 174; });
                  }
                  function skipParentheses(node) {
                      while (node.kind === 162 || node.kind === 161) {
                          node = node.expression;
                      }
                      return node;
                  }
                  function emitCallTarget(node) {
                      if (node.kind === 65 || node.kind === 93 || node.kind === 91) {
                          emit(node);
                          return node;
                      }
                      var temp = createAndRecordTempVariable(0);
                      write("(");
                      emit(temp);
                      write(" = ");
                      emit(node);
                      write(")");
                      return temp;
                  }
                  function emitCallWithSpread(node) {
                      var target;
                      var expr = skipParentheses(node.expression);
                      if (expr.kind === 156) {
                          target = emitCallTarget(expr.expression);
                          write(".");
                          emit(expr.name);
                      }
                      else if (expr.kind === 157) {
                          target = emitCallTarget(expr.expression);
                          write("[");
                          emit(expr.argumentExpression);
                          write("]");
                      }
                      else if (expr.kind === 91) {
                          target = expr;
                          write("_super");
                      }
                      else {
                          emit(node.expression);
                      }
                      write(".apply(");
                      if (target) {
                          if (target.kind === 91) {
                              emitThis(target);
                          }
                          else {
                              emit(target);
                          }
                      }
                      else {
                          write("void 0");
                      }
                      write(", ");
                      emitListWithSpread(node.arguments, false, false, false);
                      write(")");
                  }
                  function emitCallExpression(node) {
                      if (languageVersion < 2 && hasSpreadElement(node.arguments)) {
                          emitCallWithSpread(node);
                          return;
                      }
                      var superCall = false;
                      if (node.expression.kind === 91) {
                          emitSuper(node.expression);
                          superCall = true;
                      }
                      else {
                          emit(node.expression);
                          superCall = node.expression.kind === 156 && node.expression.expression.kind === 91;
                      }
                      if (superCall && languageVersion < 2) {
                          write(".call(");
                          emitThis(node.expression);
                          if (node.arguments.length) {
                              write(", ");
                              emitCommaList(node.arguments);
                          }
                          write(")");
                      }
                      else {
                          write("(");
                          emitCommaList(node.arguments);
                          write(")");
                      }
                  }
                  function emitNewExpression(node) {
                      write("new ");
                      emit(node.expression);
                      if (node.arguments) {
                          write("(");
                          emitCommaList(node.arguments);
                          write(")");
                      }
                  }
                  function emitTaggedTemplateExpression(node) {
                      if (languageVersion >= 2) {
                          emit(node.tag);
                          write(" ");
                          emit(node.template);
                      }
                      else {
                          emitDownlevelTaggedTemplate(node);
                      }
                  }
                  function emitParenExpression(node) {
                      if (!node.parent || node.parent.kind !== 164) {
                          if (node.expression.kind === 161) {
                              var operand = node.expression.expression;
                              while (operand.kind == 161) {
                                  operand = operand.expression;
                              }
                              if (operand.kind !== 168 &&
                                  operand.kind !== 167 &&
                                  operand.kind !== 166 &&
                                  operand.kind !== 165 &&
                                  operand.kind !== 169 &&
                                  operand.kind !== 159 &&
                                  !(operand.kind === 158 && node.parent.kind === 159) &&
                                  !(operand.kind === 163 && node.parent.kind === 158)) {
                                  emit(operand);
                                  return;
                              }
                          }
                      }
                      write("(");
                      emit(node.expression);
                      write(")");
                  }
                  function emitDeleteExpression(node) {
                      write(ts.tokenToString(74));
                      write(" ");
                      emit(node.expression);
                  }
                  function emitVoidExpression(node) {
                      write(ts.tokenToString(99));
                      write(" ");
                      emit(node.expression);
                  }
                  function emitTypeOfExpression(node) {
                      write(ts.tokenToString(97));
                      write(" ");
                      emit(node.expression);
                  }
                  function isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node) {
                      if (!isCurrentFileSystemExternalModule() || node.kind !== 65 || ts.nodeIsSynthesized(node)) {
                          return false;
                      }
                      var isVariableDeclarationOrBindingElement = node.parent && (node.parent.kind === 199 || node.parent.kind === 153);
                      var targetDeclaration = isVariableDeclarationOrBindingElement
                          ? node.parent
                          : resolver.getReferencedValueDeclaration(node);
                      return isSourceFileLevelDeclarationInSystemJsModule(targetDeclaration, true);
                  }
                  function emitPrefixUnaryExpression(node) {
                      var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
                      if (exportChanged) {
                          write(exportFunctionForFile + "(\"");
                          emitNodeWithoutSourceMap(node.operand);
                          write("\", ");
                      }
                      write(ts.tokenToString(node.operator));
                      if (node.operand.kind === 168) {
                          var operand = node.operand;
                          if (node.operator === 33 && (operand.operator === 33 || operand.operator === 38)) {
                              write(" ");
                          }
                          else if (node.operator === 34 && (operand.operator === 34 || operand.operator === 39)) {
                              write(" ");
                          }
                      }
                      emit(node.operand);
                      if (exportChanged) {
                          write(")");
                      }
                  }
                  function emitPostfixUnaryExpression(node) {
                      var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
                      if (exportChanged) {
                          write("(" + exportFunctionForFile + "(\"");
                          emitNodeWithoutSourceMap(node.operand);
                          write("\", ");
                          write(ts.tokenToString(node.operator));
                          emit(node.operand);
                          if (node.operator === 38) {
                              write(") - 1)");
                          }
                          else {
                              write(") + 1)");
                          }
                      }
                      else {
                          emit(node.operand);
                          write(ts.tokenToString(node.operator));
                      }
                  }
                  function shouldHoistDeclarationInSystemJsModule(node) {
                      return isSourceFileLevelDeclarationInSystemJsModule(node, false);
                  }
                  function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) {
                      if (!node || languageVersion >= 2 || !isCurrentFileSystemExternalModule()) {
                          return false;
                      }
                      var current = node;
                      while (current) {
                          if (current.kind === 228) {
                              return !isExported || ((ts.getCombinedNodeFlags(node) & 1) !== 0);
                          }
                          else if (ts.isFunctionLike(current) || current.kind === 207) {
                              return false;
                          }
                          else {
                              current = current.parent;
                          }
                      }
                  }
                  function emitBinaryExpression(node) {
                      if (languageVersion < 2 && node.operatorToken.kind === 53 &&
                          (node.left.kind === 155 || node.left.kind === 154)) {
                          emitDestructuring(node, node.parent.kind === 183);
                      }
                      else {
                          var exportChanged = node.operatorToken.kind >= 53 &&
                              node.operatorToken.kind <= 64 &&
                              isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.left);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(node.left);
                              write("\", ");
                          }
                          emit(node.left);
                          var indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== 23 ? " " : undefined);
                          write(ts.tokenToString(node.operatorToken.kind));
                          var indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " ");
                          emit(node.right);
                          decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                  }
                  function synthesizedNodeStartsOnNewLine(node) {
                      return ts.nodeIsSynthesized(node) && node.startsOnNewLine;
                  }
                  function emitConditionalExpression(node) {
                      emit(node.condition);
                      var indentedBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " ");
                      write("?");
                      var indentedAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " ");
                      emit(node.whenTrue);
                      decreaseIndentIf(indentedBeforeQuestion, indentedAfterQuestion);
                      var indentedBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " ");
                      write(":");
                      var indentedAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " ");
                      emit(node.whenFalse);
                      decreaseIndentIf(indentedBeforeColon, indentedAfterColon);
                  }
                  function decreaseIndentIf(value1, value2) {
                      if (value1) {
                          decreaseIndent();
                      }
                      if (value2) {
                          decreaseIndent();
                      }
                  }
                  function isSingleLineEmptyBlock(node) {
                      if (node && node.kind === 180) {
                          var block = node;
                          return block.statements.length === 0 && nodeEndIsOnSameLineAsNodeStart(block, block);
                      }
                  }
                  function emitBlock(node) {
                      if (isSingleLineEmptyBlock(node)) {
                          emitToken(14, node.pos);
                          write(" ");
                          emitToken(15, node.statements.end);
                          return;
                      }
                      emitToken(14, node.pos);
                      increaseIndent();
                      scopeEmitStart(node.parent);
                      if (node.kind === 207) {
                          ts.Debug.assert(node.parent.kind === 206);
                          emitCaptureThisForNodeIfNecessary(node.parent);
                      }
                      emitLines(node.statements);
                      if (node.kind === 207) {
                          emitTempDeclarations(true);
                      }
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.statements.end);
                      scopeEmitEnd();
                  }
                  function emitEmbeddedStatement(node) {
                      if (node.kind === 180) {
                          write(" ");
                          emit(node);
                      }
                      else {
                          increaseIndent();
                          writeLine();
                          emit(node);
                          decreaseIndent();
                      }
                  }
                  function emitExpressionStatement(node) {
                      emitParenthesizedIf(node.expression, node.expression.kind === 164);
                      write(";");
                  }
                  function emitIfStatement(node) {
                      var endPos = emitToken(84, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      emit(node.expression);
                      emitToken(17, node.expression.end);
                      emitEmbeddedStatement(node.thenStatement);
                      if (node.elseStatement) {
                          writeLine();
                          emitToken(76, node.thenStatement.end);
                          if (node.elseStatement.kind === 184) {
                              write(" ");
                              emit(node.elseStatement);
                          }
                          else {
                              emitEmbeddedStatement(node.elseStatement);
                          }
                      }
                  }
                  function emitDoStatement(node) {
                      write("do");
                      emitEmbeddedStatement(node.statement);
                      if (node.statement.kind === 180) {
                          write(" ");
                      }
                      else {
                          writeLine();
                      }
                      write("while (");
                      emit(node.expression);
                      write(");");
                  }
                  function emitWhileStatement(node) {
                      write("while (");
                      emit(node.expression);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function tryEmitStartOfVariableDeclarationList(decl, startPos) {
                      if (shouldHoistVariable(decl, true)) {
                          return false;
                      }
                      var tokenKind = 98;
                      if (decl && languageVersion >= 2) {
                          if (ts.isLet(decl)) {
                              tokenKind = 104;
                          }
                          else if (ts.isConst(decl)) {
                              tokenKind = 70;
                          }
                      }
                      if (startPos !== undefined) {
                          emitToken(tokenKind, startPos);
                          write(" ");
                      }
                      else {
                          switch (tokenKind) {
                              case 98:
                                  write("var ");
                                  break;
                              case 104:
                                  write("let ");
                                  break;
                              case 70:
                                  write("const ");
                                  break;
                          }
                      }
                      return true;
                  }
                  function emitVariableDeclarationListSkippingUninitializedEntries(list) {
                      var started = false;
                      for (var _a = 0, _b = list.declarations; _a < _b.length; _a++) {
                          var decl = _b[_a];
                          if (!decl.initializer) {
                              continue;
                          }
                          if (!started) {
                              started = true;
                          }
                          else {
                              write(", ");
                          }
                          emit(decl);
                      }
                      return started;
                  }
                  function emitForStatement(node) {
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      if (node.initializer && node.initializer.kind === 200) {
                          var variableDeclarationList = node.initializer;
                          var startIsEmitted = tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
                          if (startIsEmitted) {
                              emitCommaList(variableDeclarationList.declarations);
                          }
                          else {
                              emitVariableDeclarationListSkippingUninitializedEntries(variableDeclarationList);
                          }
                      }
                      else if (node.initializer) {
                          emit(node.initializer);
                      }
                      write(";");
                      emitOptional(" ", node.condition);
                      write(";");
                      emitOptional(" ", node.incrementor);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitForInOrForOfStatement(node) {
                      if (languageVersion < 2 && node.kind === 189) {
                          return emitDownLevelForOfStatement(node);
                      }
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      if (node.initializer.kind === 200) {
                          var variableDeclarationList = node.initializer;
                          if (variableDeclarationList.declarations.length >= 1) {
                              tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
                              emit(variableDeclarationList.declarations[0]);
                          }
                      }
                      else {
                          emit(node.initializer);
                      }
                      if (node.kind === 188) {
                          write(" in ");
                      }
                      else {
                          write(" of ");
                      }
                      emit(node.expression);
                      emitToken(17, node.expression.end);
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitDownLevelForOfStatement(node) {
                      // The following ES6 code:
                      //
                      //    for (let v of expr) { }
                      //
                      // should be emitted as
                      //
                      //    for (let _i = 0, _a = expr; _i < _a.length; _i++) {
                      //        let v = _a[_i];
                      //    }
                      //
                      // where _a and _i are temps emitted to capture the RHS and the counter,
                      // respectively.
                      // When the left hand side is an expression instead of a let declaration,
                      // the "let v" is not emitted.
                      // When the left hand side is a let/const, the v is renamed if there is
                      // another v in scope.
                      // Note that all assignments to the LHS are emitted in the body, including
                      // all destructuring.
                      // Note also that because an extra statement is needed to assign to the LHS,
                      // for-of bodies are always emitted as blocks.
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      var rhsIsIdentifier = node.expression.kind === 65;
                      var counter = createTempVariable(268435456);
                      var rhsReference = rhsIsIdentifier ? node.expression : createTempVariable(0);
                      emitStart(node.expression);
                      write("var ");
                      emitNodeWithoutSourceMap(counter);
                      write(" = 0");
                      emitEnd(node.expression);
                      if (!rhsIsIdentifier) {
                          write(", ");
                          emitStart(node.expression);
                          emitNodeWithoutSourceMap(rhsReference);
                          write(" = ");
                          emitNodeWithoutSourceMap(node.expression);
                          emitEnd(node.expression);
                      }
                      write("; ");
                      emitStart(node.initializer);
                      emitNodeWithoutSourceMap(counter);
                      write(" < ");
                      emitNodeWithoutSourceMap(rhsReference);
                      write(".length");
                      emitEnd(node.initializer);
                      write("; ");
                      emitStart(node.initializer);
                      emitNodeWithoutSourceMap(counter);
                      write("++");
                      emitEnd(node.initializer);
                      emitToken(17, node.expression.end);
                      write(" {");
                      writeLine();
                      increaseIndent();
                      var rhsIterationValue = createElementAccessExpression(rhsReference, counter);
                      emitStart(node.initializer);
                      if (node.initializer.kind === 200) {
                          write("var ");
                          var variableDeclarationList = node.initializer;
                          if (variableDeclarationList.declarations.length > 0) {
                              var declaration = variableDeclarationList.declarations[0];
                              if (ts.isBindingPattern(declaration.name)) {
                                  emitDestructuring(declaration, false, rhsIterationValue);
                              }
                              else {
                                  emitNodeWithoutSourceMap(declaration);
                                  write(" = ");
                                  emitNodeWithoutSourceMap(rhsIterationValue);
                              }
                          }
                          else {
                              emitNodeWithoutSourceMap(createTempVariable(0));
                              write(" = ");
                              emitNodeWithoutSourceMap(rhsIterationValue);
                          }
                      }
                      else {
                          var assignmentExpression = createBinaryExpression(node.initializer, 53, rhsIterationValue, false);
                          if (node.initializer.kind === 154 || node.initializer.kind === 155) {
                              emitDestructuring(assignmentExpression, true, undefined);
                          }
                          else {
                              emitNodeWithoutSourceMap(assignmentExpression);
                          }
                      }
                      emitEnd(node.initializer);
                      write(";");
                      if (node.statement.kind === 180) {
                          emitLines(node.statement.statements);
                      }
                      else {
                          writeLine();
                          emit(node.statement);
                      }
                      writeLine();
                      decreaseIndent();
                      write("}");
                  }
                  function emitBreakOrContinueStatement(node) {
                      emitToken(node.kind === 191 ? 66 : 71, node.pos);
                      emitOptional(" ", node.label);
                      write(";");
                  }
                  function emitReturnStatement(node) {
                      emitToken(90, node.pos);
                      emitOptional(" ", node.expression);
                      write(";");
                  }
                  function emitWithStatement(node) {
                      write("with (");
                      emit(node.expression);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitSwitchStatement(node) {
                      var endPos = emitToken(92, node.pos);
                      write(" ");
                      emitToken(16, endPos);
                      emit(node.expression);
                      endPos = emitToken(17, node.expression.end);
                      write(" ");
                      emitCaseBlock(node.caseBlock, endPos);
                  }
                  function emitCaseBlock(node, startPos) {
                      emitToken(14, startPos);
                      increaseIndent();
                      emitLines(node.clauses);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.clauses.end);
                  }
                  function nodeStartPositionsAreOnSameLine(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node1.pos)) ===
                          ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
                  }
                  function nodeEndPositionsAreOnSameLine(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
                          ts.getLineOfLocalPosition(currentSourceFile, node2.end);
                  }
                  function nodeEndIsOnSameLineAsNodeStart(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
                          ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
                  }
                  function emitCaseOrDefaultClause(node) {
                      if (node.kind === 221) {
                          write("case ");
                          emit(node.expression);
                          write(":");
                      }
                      else {
                          write("default:");
                      }
                      if (node.statements.length === 1 && nodeStartPositionsAreOnSameLine(node, node.statements[0])) {
                          write(" ");
                          emit(node.statements[0]);
                      }
                      else {
                          increaseIndent();
                          emitLines(node.statements);
                          decreaseIndent();
                      }
                  }
                  function emitThrowStatement(node) {
                      write("throw ");
                      emit(node.expression);
                      write(";");
                  }
                  function emitTryStatement(node) {
                      write("try ");
                      emit(node.tryBlock);
                      emit(node.catchClause);
                      if (node.finallyBlock) {
                          writeLine();
                          write("finally ");
                          emit(node.finallyBlock);
                      }
                  }
                  function emitCatchClause(node) {
                      writeLine();
                      var endPos = emitToken(68, node.pos);
                      write(" ");
                      emitToken(16, endPos);
                      emit(node.variableDeclaration);
                      emitToken(17, node.variableDeclaration ? node.variableDeclaration.end : endPos);
                      write(" ");
                      emitBlock(node.block);
                  }
                  function emitDebuggerStatement(node) {
                      emitToken(72, node.pos);
                      write(";");
                  }
                  function emitLabelledStatement(node) {
                      emit(node.label);
                      write(": ");
                      emit(node.statement);
                  }
                  function getContainingModule(node) {
                      do {
                          node = node.parent;
                      } while (node && node.kind !== 206);
                      return node;
                  }
                  function emitContainingModuleName(node) {
                      var container = getContainingModule(node);
                      write(container ? getGeneratedNameForNode(container) : "exports");
                  }
                  function emitModuleMemberName(node) {
                      emitStart(node.name);
                      if (ts.getCombinedNodeFlags(node) & 1) {
                          var container = getContainingModule(node);
                          if (container) {
                              write(getGeneratedNameForNode(container));
                              write(".");
                          }
                          else if (languageVersion < 2 && compilerOptions.module !== 4) {
                              write("exports.");
                          }
                      }
                      emitNodeWithoutSourceMap(node.name);
                      emitEnd(node.name);
                  }
                  function createVoidZero() {
                      var zero = ts.createSynthesizedNode(7);
                      zero.text = "0";
                      var result = ts.createSynthesizedNode(167);
                      result.expression = zero;
                      return result;
                  }
                  function emitExportMemberAssignment(node) {
                      if (node.flags & 1) {
                          writeLine();
                          emitStart(node);
                          if (compilerOptions.module === 4 && node.parent === currentSourceFile) {
                              write(exportFunctionForFile + "(\"");
                              if (node.flags & 256) {
                                  write("default");
                              }
                              else {
                                  emitNodeWithoutSourceMap(node.name);
                              }
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          else {
                              if (node.flags & 256) {
                                  if (languageVersion === 0) {
                                      write("exports[\"default\"]");
                                  }
                                  else {
                                      write("exports.default");
                                  }
                              }
                              else {
                                  emitModuleMemberName(node);
                              }
                              write(" = ");
                              emitDeclarationName(node);
                          }
                          emitEnd(node);
                          write(";");
                      }
                  }
                  function emitExportMemberAssignments(name) {
                      if (!exportEquals && exportSpecifiers && ts.hasProperty(exportSpecifiers, name.text)) {
                          for (var _a = 0, _b = exportSpecifiers[name.text]; _a < _b.length; _a++) {
                              var specifier = _b[_a];
                              writeLine();
                              if (compilerOptions.module === 4) {
                                  emitStart(specifier.name);
                                  write(exportFunctionForFile + "(\"");
                                  emitNodeWithoutSourceMap(specifier.name);
                                  write("\", ");
                                  emitExpressionIdentifier(name);
                                  write(")");
                                  emitEnd(specifier.name);
                              }
                              else {
                                  emitStart(specifier.name);
                                  emitContainingModuleName(specifier);
                                  write(".");
                                  emitNodeWithoutSourceMap(specifier.name);
                                  emitEnd(specifier.name);
                                  write(" = ");
                                  emitExpressionIdentifier(name);
                              }
                              write(";");
                          }
                      }
                  }
                  function emitDestructuring(root, isAssignmentExpressionStatement, value) {
                      var emitCount = 0;
                      var canDefineTempVariablesInPlace = false;
                      if (root.kind === 199) {
                          var isExported = ts.getCombinedNodeFlags(root) & 1;
                          var isSourceLevelForSystemModuleKind = shouldHoistDeclarationInSystemJsModule(root);
                          canDefineTempVariablesInPlace = !isExported && !isSourceLevelForSystemModuleKind;
                      }
                      else if (root.kind === 130) {
                          canDefineTempVariablesInPlace = true;
                      }
                      if (root.kind === 170) {
                          emitAssignmentExpression(root);
                      }
                      else {
                          ts.Debug.assert(!isAssignmentExpressionStatement);
                          emitBindingElement(root, value);
                      }
                      function emitAssignment(name, value) {
                          if (emitCount++) {
                              write(", ");
                          }
                          renameNonTopLevelLetAndConst(name);
                          var isVariableDeclarationOrBindingElement = name.parent && (name.parent.kind === 199 || name.parent.kind === 153);
                          var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(name);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(name);
                              write("\", ");
                          }
                          if (isVariableDeclarationOrBindingElement) {
                              emitModuleMemberName(name.parent);
                          }
                          else {
                              emit(name);
                          }
                          write(" = ");
                          emit(value);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                      function ensureIdentifier(expr) {
                          if (expr.kind !== 65) {
                              var identifier = createTempVariable(0);
                              if (!canDefineTempVariablesInPlace) {
                                  recordTempDeclaration(identifier);
                              }
                              emitAssignment(identifier, expr);
                              expr = identifier;
                          }
                          return expr;
                      }
                      function createDefaultValueCheck(value, defaultValue) {
                          value = ensureIdentifier(value);
                          var equals = ts.createSynthesizedNode(170);
                          equals.left = value;
                          equals.operatorToken = ts.createSynthesizedNode(30);
                          equals.right = createVoidZero();
                          return createConditionalExpression(equals, defaultValue, value);
                      }
                      function createConditionalExpression(condition, whenTrue, whenFalse) {
                          var cond = ts.createSynthesizedNode(171);
                          cond.condition = condition;
                          cond.questionToken = ts.createSynthesizedNode(50);
                          cond.whenTrue = whenTrue;
                          cond.colonToken = ts.createSynthesizedNode(51);
                          cond.whenFalse = whenFalse;
                          return cond;
                      }
                      function createNumericLiteral(value) {
                          var node = ts.createSynthesizedNode(7);
                          node.text = "" + value;
                          return node;
                      }
                      function createPropertyAccessForDestructuringProperty(object, propName) {
                          if (propName.kind !== 65) {
                              return createElementAccessExpression(object, propName);
                          }
                          return createPropertyAccessExpression(object, propName);
                      }
                      function createSliceCall(value, sliceIndex) {
                          var call = ts.createSynthesizedNode(158);
                          var sliceIdentifier = ts.createSynthesizedNode(65);
                          sliceIdentifier.text = "slice";
                          call.expression = createPropertyAccessExpression(value, sliceIdentifier);
                          call.arguments = ts.createSynthesizedNodeArray();
                          call.arguments[0] = createNumericLiteral(sliceIndex);
                          return call;
                      }
                      function emitObjectLiteralAssignment(target, value) {
                          var properties = target.properties;
                          if (properties.length !== 1) {
                              value = ensureIdentifier(value);
                          }
                          for (var _a = 0; _a < properties.length; _a++) {
                              var p = properties[_a];
                              if (p.kind === 225 || p.kind === 226) {
                                  var propName = (p.name);
                                  emitDestructuringAssignment(p.initializer || propName, createPropertyAccessForDestructuringProperty(value, propName));
                              }
                          }
                      }
                      function emitArrayLiteralAssignment(target, value) {
                          var elements = target.elements;
                          if (elements.length !== 1) {
                              value = ensureIdentifier(value);
                          }
                          for (var i = 0; i < elements.length; i++) {
                              var e = elements[i];
                              if (e.kind !== 176) {
                                  if (e.kind !== 174) {
                                      emitDestructuringAssignment(e, createElementAccessExpression(value, createNumericLiteral(i)));
                                  }
                                  else if (i === elements.length - 1) {
                                      emitDestructuringAssignment(e.expression, createSliceCall(value, i));
                                  }
                              }
                          }
                      }
                      function emitDestructuringAssignment(target, value) {
                          if (target.kind === 170 && target.operatorToken.kind === 53) {
                              value = createDefaultValueCheck(value, target.right);
                              target = target.left;
                          }
                          if (target.kind === 155) {
                              emitObjectLiteralAssignment(target, value);
                          }
                          else if (target.kind === 154) {
                              emitArrayLiteralAssignment(target, value);
                          }
                          else {
                              emitAssignment(target, value);
                          }
                      }
                      function emitAssignmentExpression(root) {
                          var target = root.left;
                          var value = root.right;
                          if (isAssignmentExpressionStatement) {
                              emitDestructuringAssignment(target, value);
                          }
                          else {
                              if (root.parent.kind !== 162) {
                                  write("(");
                              }
                              value = ensureIdentifier(value);
                              emitDestructuringAssignment(target, value);
                              write(", ");
                              emit(value);
                              if (root.parent.kind !== 162) {
                                  write(")");
                              }
                          }
                      }
                      function emitBindingElement(target, value) {
                          if (target.initializer) {
                              value = value ? createDefaultValueCheck(value, target.initializer) : target.initializer;
                          }
                          else if (!value) {
                              value = createVoidZero();
                          }
                          if (ts.isBindingPattern(target.name)) {
                              var pattern = target.name;
                              var elements = pattern.elements;
                              if (elements.length !== 1) {
                                  value = ensureIdentifier(value);
                              }
                              for (var i = 0; i < elements.length; i++) {
                                  var element = elements[i];
                                  if (pattern.kind === 151) {
                                      var propName = element.propertyName || element.name;
                                      emitBindingElement(element, createPropertyAccessForDestructuringProperty(value, propName));
                                  }
                                  else if (element.kind !== 176) {
                                      if (!element.dotDotDotToken) {
                                          emitBindingElement(element, createElementAccessExpression(value, createNumericLiteral(i)));
                                      }
                                      else if (i === elements.length - 1) {
                                          emitBindingElement(element, createSliceCall(value, i));
                                      }
                                  }
                              }
                          }
                          else {
                              emitAssignment(target.name, value);
                          }
                      }
                  }
                  function emitVariableDeclaration(node) {
                      if (ts.isBindingPattern(node.name)) {
                          if (languageVersion < 2) {
                              emitDestructuring(node, false);
                          }
                          else {
                              emit(node.name);
                              emitOptional(" = ", node.initializer);
                          }
                      }
                      else {
                          renameNonTopLevelLetAndConst(node.name);
                          var initializer = node.initializer;
                          if (!initializer && languageVersion < 2) {
                              var isUninitializedLet = (resolver.getNodeCheckFlags(node) & 256) &&
                                  (getCombinedFlagsForIdentifier(node.name) & 4096);
                              if (isUninitializedLet &&
                                  node.parent.parent.kind !== 188 &&
                                  node.parent.parent.kind !== 189) {
                                  initializer = createVoidZero();
                              }
                          }
                          var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.name);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(node.name);
                              write("\", ");
                          }
                          emitModuleMemberName(node);
                          emitOptional(" = ", initializer);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                  }
                  function emitExportVariableAssignments(node) {
                      if (node.kind === 176) {
                          return;
                      }
                      var name = node.name;
                      if (name.kind === 65) {
                          emitExportMemberAssignments(name);
                      }
                      else if (ts.isBindingPattern(name)) {
                          ts.forEach(name.elements, emitExportVariableAssignments);
                      }
                  }
                  function getCombinedFlagsForIdentifier(node) {
                      if (!node.parent || (node.parent.kind !== 199 && node.parent.kind !== 153)) {
                          return 0;
                      }
                      return ts.getCombinedNodeFlags(node.parent);
                  }
                  function renameNonTopLevelLetAndConst(node) {
                      if (languageVersion >= 2 ||
                          ts.nodeIsSynthesized(node) ||
                          node.kind !== 65 ||
                          (node.parent.kind !== 199 && node.parent.kind !== 153)) {
                          return;
                      }
                      var combinedFlags = getCombinedFlagsForIdentifier(node);
                      if (((combinedFlags & 12288) === 0) || combinedFlags & 1) {
                          return;
                      }
                      var list = ts.getAncestor(node, 200);
                      if (list.parent.kind === 181) {
                          var isSourceFileLevelBinding = list.parent.parent.kind === 228;
                          var isModuleLevelBinding = list.parent.parent.kind === 207;
                          var isFunctionLevelBinding = list.parent.parent.kind === 180 && ts.isFunctionLike(list.parent.parent.parent);
                          if (isSourceFileLevelBinding || isModuleLevelBinding || isFunctionLevelBinding) {
                              return;
                          }
                      }
                      var blockScopeContainer = ts.getEnclosingBlockScopeContainer(node);
                      var parent = blockScopeContainer.kind === 228
                          ? blockScopeContainer
                          : blockScopeContainer.parent;
                      if (resolver.resolvesToSomeValue(parent, node.text)) {
                          var variableId = resolver.getBlockScopedVariableId(node);
                          if (!blockScopedVariableToGeneratedName) {
                              blockScopedVariableToGeneratedName = [];
                          }
                          var generatedName = makeUniqueName(node.text);
                          blockScopedVariableToGeneratedName[variableId] = generatedName;
                      }
                  }
                  function isES6ExportedDeclaration(node) {
                      return !!(node.flags & 1) &&
                          languageVersion >= 2 &&
                          node.parent.kind === 228;
                  }
                  function emitVariableStatement(node) {
                      var startIsEmitted = false;
                      if (node.flags & 1) {
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
                          }
                      }
                      else {
                          startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
                      }
                      if (startIsEmitted) {
                          emitCommaList(node.declarationList.declarations);
                          write(";");
                      }
                      else {
                          var atLeastOneItem = emitVariableDeclarationListSkippingUninitializedEntries(node.declarationList);
                          if (atLeastOneItem) {
                              write(";");
                          }
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile) {
                          ts.forEach(node.declarationList.declarations, emitExportVariableAssignments);
                      }
                  }
                  function emitParameter(node) {
                      if (languageVersion < 2) {
                          if (ts.isBindingPattern(node.name)) {
                              var name_19 = createTempVariable(0);
                              if (!tempParameters) {
                                  tempParameters = [];
                              }
                              tempParameters.push(name_19);
                              emit(name_19);
                          }
                          else {
                              emit(node.name);
                          }
                      }
                      else {
                          if (node.dotDotDotToken) {
                              write("...");
                          }
                          emit(node.name);
                          emitOptional(" = ", node.initializer);
                      }
                  }
                  function emitDefaultValueAssignments(node) {
                      if (languageVersion < 2) {
                          var tempIndex = 0;
                          ts.forEach(node.parameters, function (p) {
                              if (p.dotDotDotToken) {
                                  return;
                              }
                              if (ts.isBindingPattern(p.name)) {
                                  writeLine();
                                  write("var ");
                                  emitDestructuring(p, false, tempParameters[tempIndex]);
                                  write(";");
                                  tempIndex++;
                              }
                              else if (p.initializer) {
                                  writeLine();
                                  emitStart(p);
                                  write("if (");
                                  emitNodeWithoutSourceMap(p.name);
                                  write(" === void 0)");
                                  emitEnd(p);
                                  write(" { ");
                                  emitStart(p);
                                  emitNodeWithoutSourceMap(p.name);
                                  write(" = ");
                                  emitNodeWithoutSourceMap(p.initializer);
                                  emitEnd(p);
                                  write("; }");
                              }
                          });
                      }
                  }
                  function emitRestParameter(node) {
                      if (languageVersion < 2 && ts.hasRestParameters(node)) {
                          var restIndex = node.parameters.length - 1;
                          var restParam = node.parameters[restIndex];
                          if (ts.isBindingPattern(restParam.name)) {
                              return;
                          }
                          var tempName = createTempVariable(268435456).text;
                          writeLine();
                          emitLeadingComments(restParam);
                          emitStart(restParam);
                          write("var ");
                          emitNodeWithoutSourceMap(restParam.name);
                          write(" = [];");
                          emitEnd(restParam);
                          emitTrailingComments(restParam);
                          writeLine();
                          write("for (");
                          emitStart(restParam);
                          write("var " + tempName + " = " + restIndex + ";");
                          emitEnd(restParam);
                          write(" ");
                          emitStart(restParam);
                          write(tempName + " < arguments.length;");
                          emitEnd(restParam);
                          write(" ");
                          emitStart(restParam);
                          write(tempName + "++");
                          emitEnd(restParam);
                          write(") {");
                          increaseIndent();
                          writeLine();
                          emitStart(restParam);
                          emitNodeWithoutSourceMap(restParam.name);
                          write("[" + tempName + " - " + restIndex + "] = arguments[" + tempName + "];");
                          emitEnd(restParam);
                          decreaseIndent();
                          writeLine();
                          write("}");
                      }
                  }
                  function emitAccessor(node) {
                      write(node.kind === 137 ? "get " : "set ");
                      emit(node.name, false);
                      emitSignatureAndBody(node);
                  }
                  function shouldEmitAsArrowFunction(node) {
                      return node.kind === 164 && languageVersion >= 2;
                  }
                  function emitDeclarationName(node) {
                      if (node.name) {
                          emitNodeWithoutSourceMap(node.name);
                      }
                      else {
                          write(getGeneratedNameForNode(node));
                      }
                  }
                  function shouldEmitFunctionName(node) {
                      if (node.kind === 163) {
                          return !!node.name;
                      }
                      if (node.kind === 201) {
                          return !!node.name || languageVersion < 2;
                      }
                  }
                  function emitFunctionDeclaration(node) {
                      if (ts.nodeIsMissing(node.body)) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      if (node.kind !== 135 && node.kind !== 134) {
                          emitLeadingComments(node);
                      }
                      if (!shouldEmitAsArrowFunction(node)) {
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              if (node.flags & 256) {
                                  write("default ");
                              }
                          }
                          write("function");
                          if (languageVersion >= 2 && node.asteriskToken) {
                              write("*");
                          }
                          write(" ");
                      }
                      if (shouldEmitFunctionName(node)) {
                          emitDeclarationName(node);
                      }
                      emitSignatureAndBody(node);
                      if (languageVersion < 2 && node.kind === 201 && node.parent === currentSourceFile && node.name) {
                          emitExportMemberAssignments(node.name);
                      }
                      if (node.kind !== 135 && node.kind !== 134) {
                          emitTrailingComments(node);
                      }
                  }
                  function emitCaptureThisForNodeIfNecessary(node) {
                      if (resolver.getNodeCheckFlags(node) & 4) {
                          writeLine();
                          emitStart(node);
                          write("var _this = this;");
                          emitEnd(node);
                      }
                  }
                  function emitSignatureParameters(node) {
                      increaseIndent();
                      write("(");
                      if (node) {
                          var parameters = node.parameters;
                          var omitCount = languageVersion < 2 && ts.hasRestParameters(node) ? 1 : 0;
                          emitList(parameters, 0, parameters.length - omitCount, false, false);
                      }
                      write(")");
                      decreaseIndent();
                  }
                  function emitSignatureParametersForArrow(node) {
                      if (node.parameters.length === 1 && node.pos === node.parameters[0].pos) {
                          emit(node.parameters[0]);
                          return;
                      }
                      emitSignatureParameters(node);
                  }
                  function emitSignatureAndBody(node) {
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      if (shouldEmitAsArrowFunction(node)) {
                          emitSignatureParametersForArrow(node);
                          write(" =>");
                      }
                      else {
                          emitSignatureParameters(node);
                      }
                      if (!node.body) {
                          write(" { }");
                      }
                      else if (node.body.kind === 180) {
                          emitBlockFunctionBody(node, node.body);
                      }
                      else {
                          emitExpressionFunctionBody(node, node.body);
                      }
                      if (!isES6ExportedDeclaration(node)) {
                          emitExportMemberAssignment(node);
                      }
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                  }
                  function emitFunctionBodyPreamble(node) {
                      emitCaptureThisForNodeIfNecessary(node);
                      emitDefaultValueAssignments(node);
                      emitRestParameter(node);
                  }
                  function emitExpressionFunctionBody(node, body) {
                      if (languageVersion < 2) {
                          emitDownLevelExpressionFunctionBody(node, body);
                          return;
                      }
                      write(" ");
                      var current = body;
                      while (current.kind === 161) {
                          current = current.expression;
                      }
                      emitParenthesizedIf(body, current.kind === 155);
                  }
                  function emitDownLevelExpressionFunctionBody(node, body) {
                      write(" {");
                      scopeEmitStart(node);
                      increaseIndent();
                      var outPos = writer.getTextPos();
                      emitDetachedComments(node.body);
                      emitFunctionBodyPreamble(node);
                      var preambleEmitted = writer.getTextPos() !== outPos;
                      decreaseIndent();
                      if (!preambleEmitted && nodeStartPositionsAreOnSameLine(node, body)) {
                          write(" ");
                          emitStart(body);
                          write("return ");
                          emit(body);
                          emitEnd(body);
                          write(";");
                          emitTempDeclarations(false);
                          write(" ");
                      }
                      else {
                          increaseIndent();
                          writeLine();
                          emitLeadingComments(node.body);
                          write("return ");
                          emit(body);
                          write(";");
                          emitTrailingComments(node.body);
                          emitTempDeclarations(true);
                          decreaseIndent();
                          writeLine();
                      }
                      emitStart(node.body);
                      write("}");
                      emitEnd(node.body);
                      scopeEmitEnd();
                  }
                  function emitBlockFunctionBody(node, body) {
                      write(" {");
                      scopeEmitStart(node);
                      var initialTextPos = writer.getTextPos();
                      increaseIndent();
                      emitDetachedComments(body.statements);
                      var startIndex = emitDirectivePrologues(body.statements, true);
                      emitFunctionBodyPreamble(node);
                      decreaseIndent();
                      var preambleEmitted = writer.getTextPos() !== initialTextPos;
                      if (!preambleEmitted && nodeEndIsOnSameLineAsNodeStart(body, body)) {
                          for (var _a = 0, _b = body.statements; _a < _b.length; _a++) {
                              var statement = _b[_a];
                              write(" ");
                              emit(statement);
                          }
                          emitTempDeclarations(false);
                          write(" ");
                          emitLeadingCommentsOfPosition(body.statements.end);
                      }
                      else {
                          increaseIndent();
                          emitLinesStartingAt(body.statements, startIndex);
                          emitTempDeclarations(true);
                          writeLine();
                          emitLeadingCommentsOfPosition(body.statements.end);
                          decreaseIndent();
                      }
                      emitToken(15, body.statements.end);
                      scopeEmitEnd();
                  }
                  function findInitialSuperCall(ctor) {
                      if (ctor.body) {
                          var statement = ctor.body.statements[0];
                          if (statement && statement.kind === 183) {
                              var expr = statement.expression;
                              if (expr && expr.kind === 158) {
                                  var func = expr.expression;
                                  if (func && func.kind === 91) {
                                      return statement;
                                  }
                              }
                          }
                      }
                  }
                  function emitParameterPropertyAssignments(node) {
                      ts.forEach(node.parameters, function (param) {
                          if (param.flags & 112) {
                              writeLine();
                              emitStart(param);
                              emitStart(param.name);
                              write("this.");
                              emitNodeWithoutSourceMap(param.name);
                              emitEnd(param.name);
                              write(" = ");
                              emit(param.name);
                              write(";");
                              emitEnd(param);
                          }
                      });
                  }
                  function emitMemberAccessForPropertyName(memberName) {
                      if (memberName.kind === 8 || memberName.kind === 7) {
                          write("[");
                          emitNodeWithoutSourceMap(memberName);
                          write("]");
                      }
                      else if (memberName.kind === 128) {
                          emitComputedPropertyName(memberName);
                      }
                      else {
                          write(".");
                          emitNodeWithoutSourceMap(memberName);
                      }
                  }
                  function getInitializedProperties(node, isStatic) {
                      var properties = [];
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if (member.kind === 133 && isStatic === ((member.flags & 128) !== 0) && member.initializer) {
                              properties.push(member);
                          }
                      }
                      return properties;
                  }
                  function emitPropertyDeclarations(node, properties) {
                      for (var _a = 0; _a < properties.length; _a++) {
                          var property = properties[_a];
                          emitPropertyDeclaration(node, property);
                      }
                  }
                  function emitPropertyDeclaration(node, property, receiver, isExpression) {
                      writeLine();
                      emitLeadingComments(property);
                      emitStart(property);
                      emitStart(property.name);
                      if (receiver) {
                          emit(receiver);
                      }
                      else {
                          if (property.flags & 128) {
                              emitDeclarationName(node);
                          }
                          else {
                              write("this");
                          }
                      }
                      emitMemberAccessForPropertyName(property.name);
                      emitEnd(property.name);
                      write(" = ");
                      emit(property.initializer);
                      if (!isExpression) {
                          write(";");
                      }
                      emitEnd(property);
                      emitTrailingComments(property);
                  }
                  function emitMemberFunctionsForES5AndLower(node) {
                      ts.forEach(node.members, function (member) {
                          if (member.kind === 179) {
                              writeLine();
                              write(";");
                          }
                          else if (member.kind === 135 || node.kind === 134) {
                              if (!member.body) {
                                  return emitOnlyPinnedOrTripleSlashComments(member);
                              }
                              writeLine();
                              emitLeadingComments(member);
                              emitStart(member);
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              emitMemberAccessForPropertyName(member.name);
                              emitEnd(member.name);
                              write(" = ");
                              emitStart(member);
                              emitFunctionDeclaration(member);
                              emitEnd(member);
                              emitEnd(member);
                              write(";");
                              emitTrailingComments(member);
                          }
                          else if (member.kind === 137 || member.kind === 138) {
                              var accessors = ts.getAllAccessorDeclarations(node.members, member);
                              if (member === accessors.firstAccessor) {
                                  writeLine();
                                  emitStart(member);
                                  write("Object.defineProperty(");
                                  emitStart(member.name);
                                  emitClassMemberPrefix(node, member);
                                  write(", ");
                                  emitExpressionForPropertyName(member.name);
                                  emitEnd(member.name);
                                  write(", {");
                                  increaseIndent();
                                  if (accessors.getAccessor) {
                                      writeLine();
                                      emitLeadingComments(accessors.getAccessor);
                                      write("get: ");
                                      emitStart(accessors.getAccessor);
                                      write("function ");
                                      emitSignatureAndBody(accessors.getAccessor);
                                      emitEnd(accessors.getAccessor);
                                      emitTrailingComments(accessors.getAccessor);
                                      write(",");
                                  }
                                  if (accessors.setAccessor) {
                                      writeLine();
                                      emitLeadingComments(accessors.setAccessor);
                                      write("set: ");
                                      emitStart(accessors.setAccessor);
                                      write("function ");
                                      emitSignatureAndBody(accessors.setAccessor);
                                      emitEnd(accessors.setAccessor);
                                      emitTrailingComments(accessors.setAccessor);
                                      write(",");
                                  }
                                  writeLine();
                                  write("enumerable: true,");
                                  writeLine();
                                  write("configurable: true");
                                  decreaseIndent();
                                  writeLine();
                                  write("});");
                                  emitEnd(member);
                              }
                          }
                      });
                  }
                  function emitMemberFunctionsForES6AndHigher(node) {
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if ((member.kind === 135 || node.kind === 134) && !member.body) {
                              emitOnlyPinnedOrTripleSlashComments(member);
                          }
                          else if (member.kind === 135 ||
                              member.kind === 137 ||
                              member.kind === 138) {
                              writeLine();
                              emitLeadingComments(member);
                              emitStart(member);
                              if (member.flags & 128) {
                                  write("static ");
                              }
                              if (member.kind === 137) {
                                  write("get ");
                              }
                              else if (member.kind === 138) {
                                  write("set ");
                              }
                              if (member.asteriskToken) {
                                  write("*");
                              }
                              emit(member.name);
                              emitSignatureAndBody(member);
                              emitEnd(member);
                              emitTrailingComments(member);
                          }
                          else if (member.kind === 179) {
                              writeLine();
                              write(";");
                          }
                      }
                  }
                  function emitConstructor(node, baseTypeElement) {
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      emitConstructorWorker(node, baseTypeElement);
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                  }
                  function emitConstructorWorker(node, baseTypeElement) {
                      var hasInstancePropertyWithInitializer = false;
                      ts.forEach(node.members, function (member) {
                          if (member.kind === 136 && !member.body) {
                              emitOnlyPinnedOrTripleSlashComments(member);
                          }
                          if (member.kind === 133 && member.initializer && (member.flags & 128) === 0) {
                              hasInstancePropertyWithInitializer = true;
                          }
                      });
                      var ctor = ts.getFirstConstructorWithBody(node);
                      if (languageVersion >= 2 && !ctor && !hasInstancePropertyWithInitializer) {
                          return;
                      }
                      if (ctor) {
                          emitLeadingComments(ctor);
                      }
                      emitStart(ctor || node);
                      if (languageVersion < 2) {
                          write("function ");
                          emitDeclarationName(node);
                          emitSignatureParameters(ctor);
                      }
                      else {
                          write("constructor");
                          if (ctor) {
                              emitSignatureParameters(ctor);
                          }
                          else {
                              if (baseTypeElement) {
                                  write("(...args)");
                              }
                              else {
                                  write("()");
                              }
                          }
                      }
                      write(" {");
                      scopeEmitStart(node, "constructor");
                      increaseIndent();
                      if (ctor) {
                          emitDetachedComments(ctor.body.statements);
                      }
                      emitCaptureThisForNodeIfNecessary(node);
                      if (ctor) {
                          emitDefaultValueAssignments(ctor);
                          emitRestParameter(ctor);
                          if (baseTypeElement) {
                              var superCall = findInitialSuperCall(ctor);
                              if (superCall) {
                                  writeLine();
                                  emit(superCall);
                              }
                          }
                          emitParameterPropertyAssignments(ctor);
                      }
                      else {
                          if (baseTypeElement) {
                              writeLine();
                              emitStart(baseTypeElement);
                              if (languageVersion < 2) {
                                  write("_super.apply(this, arguments);");
                              }
                              else {
                                  write("super(...args);");
                              }
                              emitEnd(baseTypeElement);
                          }
                      }
                      emitPropertyDeclarations(node, getInitializedProperties(node, false));
                      if (ctor) {
                          var statements = ctor.body.statements;
                          if (superCall) {
                              statements = statements.slice(1);
                          }
                          emitLines(statements);
                      }
                      emitTempDeclarations(true);
                      writeLine();
                      if (ctor) {
                          emitLeadingCommentsOfPosition(ctor.body.statements.end);
                      }
                      decreaseIndent();
                      emitToken(15, ctor ? ctor.body.statements.end : node.members.end);
                      scopeEmitEnd();
                      emitEnd(ctor || node);
                      if (ctor) {
                          emitTrailingComments(ctor);
                      }
                  }
                  function emitClassExpression(node) {
                      return emitClassLikeDeclaration(node);
                  }
                  function emitClassDeclaration(node) {
                      return emitClassLikeDeclaration(node);
                  }
                  function emitClassLikeDeclaration(node) {
                      if (languageVersion < 2) {
                          emitClassLikeDeclarationBelowES6(node);
                      }
                      else {
                          emitClassLikeDeclarationForES6AndHigher(node);
                      }
                  }
                  function emitClassLikeDeclarationForES6AndHigher(node) {
                      var thisNodeIsDecorated = ts.nodeIsDecorated(node);
                      if (node.kind === 202) {
                          if (thisNodeIsDecorated) {
                              if (isES6ExportedDeclaration(node) && !(node.flags & 256)) {
                                  write("export ");
                              }
                              write("let ");
                              emitDeclarationName(node);
                              write(" = ");
                          }
                          else if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              if (node.flags & 256) {
                                  write("default ");
                              }
                          }
                      }
                      var staticProperties = getInitializedProperties(node, true);
                      var isClassExpressionWithStaticProperties = staticProperties.length > 0 && node.kind === 175;
                      var tempVariable;
                      if (isClassExpressionWithStaticProperties) {
                          tempVariable = createAndRecordTempVariable(0);
                          write("(");
                          increaseIndent();
                          emit(tempVariable);
                          write(" = ");
                      }
                      write("class");
                      if ((node.name || !(node.flags & 256)) && !thisNodeIsDecorated) {
                          write(" ");
                          emitDeclarationName(node);
                      }
                      var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                      if (baseTypeNode) {
                          write(" extends ");
                          emit(baseTypeNode.expression);
                      }
                      write(" {");
                      increaseIndent();
                      scopeEmitStart(node);
                      writeLine();
                      emitConstructor(node, baseTypeNode);
                      emitMemberFunctionsForES6AndHigher(node);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      if (thisNodeIsDecorated) {
                          write(";");
                      }
                      if (isClassExpressionWithStaticProperties) {
                          for (var _a = 0; _a < staticProperties.length; _a++) {
                              var property = staticProperties[_a];
                              write(",");
                              writeLine();
                              emitPropertyDeclaration(node, property, tempVariable, true);
                          }
                          write(",");
                          writeLine();
                          emit(tempVariable);
                          decreaseIndent();
                          write(")");
                      }
                      else {
                          writeLine();
                          emitPropertyDeclarations(node, staticProperties);
                          emitDecoratorsOfClass(node);
                      }
                      if (!isES6ExportedDeclaration(node) && (node.flags & 1)) {
                          writeLine();
                          emitStart(node);
                          emitModuleMemberName(node);
                          write(" = ");
                          emitDeclarationName(node);
                          emitEnd(node);
                          write(";");
                      }
                      else if (isES6ExportedDeclaration(node) && (node.flags & 256) && thisNodeIsDecorated) {
                          writeLine();
                          write("export default ");
                          emitDeclarationName(node);
                          write(";");
                      }
                  }
                  function emitClassLikeDeclarationBelowES6(node) {
                      if (node.kind === 202) {
                          if (!shouldHoistDeclarationInSystemJsModule(node)) {
                              write("var ");
                          }
                          emitDeclarationName(node);
                          write(" = ");
                      }
                      write("(function (");
                      var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                      if (baseTypeNode) {
                          write("_super");
                      }
                      write(") {");
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      var saveComputedPropertyNamesToGeneratedNames = computedPropertyNamesToGeneratedNames;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      computedPropertyNamesToGeneratedNames = undefined;
                      increaseIndent();
                      scopeEmitStart(node);
                      if (baseTypeNode) {
                          writeLine();
                          emitStart(baseTypeNode);
                          write("__extends(");
                          emitDeclarationName(node);
                          write(", _super);");
                          emitEnd(baseTypeNode);
                      }
                      writeLine();
                      emitConstructor(node, baseTypeNode);
                      emitMemberFunctionsForES5AndLower(node);
                      emitPropertyDeclarations(node, getInitializedProperties(node, true));
                      writeLine();
                      emitDecoratorsOfClass(node);
                      writeLine();
                      emitToken(15, node.members.end, function () {
                          write("return ");
                          emitDeclarationName(node);
                      });
                      write(";");
                      emitTempDeclarations(true);
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                      computedPropertyNamesToGeneratedNames = saveComputedPropertyNamesToGeneratedNames;
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      emitStart(node);
                      write(")(");
                      if (baseTypeNode) {
                          emit(baseTypeNode.expression);
                      }
                      write(")");
                      if (node.kind === 202) {
                          write(";");
                      }
                      emitEnd(node);
                      if (node.kind === 202) {
                          emitExportMemberAssignment(node);
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile && node.name) {
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitClassMemberPrefix(node, member) {
                      emitDeclarationName(node);
                      if (!(member.flags & 128)) {
                          write(".prototype");
                      }
                  }
                  function emitDecoratorsOfClass(node) {
                      emitDecoratorsOfMembers(node, 0);
                      emitDecoratorsOfMembers(node, 128);
                      emitDecoratorsOfConstructor(node);
                  }
                  function emitDecoratorsOfConstructor(node) {
                      var decorators = node.decorators;
                      var constructor = ts.getFirstConstructorWithBody(node);
                      var hasDecoratedParameters = constructor && ts.forEach(constructor.parameters, ts.nodeIsDecorated);
                      if (!decorators && !hasDecoratedParameters) {
                          return;
                      }
                      writeLine();
                      emitStart(node);
                      emitDeclarationName(node);
                      write(" = __decorate([");
                      increaseIndent();
                      writeLine();
                      var decoratorCount = decorators ? decorators.length : 0;
                      var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
                          emitStart(decorator);
                          emit(decorator.expression);
                          emitEnd(decorator);
                      });
                      argumentsWritten += emitDecoratorsOfParameters(constructor, argumentsWritten > 0);
                      emitSerializedTypeMetadata(node, argumentsWritten >= 0);
                      decreaseIndent();
                      writeLine();
                      write("], ");
                      emitDeclarationName(node);
                      write(");");
                      emitEnd(node);
                      writeLine();
                  }
                  function emitDecoratorsOfMembers(node, staticFlag) {
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if ((member.flags & 128) !== staticFlag) {
                              continue;
                          }
                          if (!ts.nodeCanBeDecorated(member)) {
                              continue;
                          }
                          if (!ts.nodeOrChildIsDecorated(member)) {
                              continue;
                          }
                          var decorators = void 0;
                          var functionLikeMember = void 0;
                          if (ts.isAccessor(member)) {
                              var accessors = ts.getAllAccessorDeclarations(node.members, member);
                              if (member !== accessors.firstAccessor) {
                                  continue;
                              }
                              decorators = accessors.firstAccessor.decorators;
                              if (!decorators && accessors.secondAccessor) {
                                  decorators = accessors.secondAccessor.decorators;
                              }
                              functionLikeMember = accessors.setAccessor;
                          }
                          else {
                              decorators = member.decorators;
                              if (member.kind === 135) {
                                  functionLikeMember = member;
                              }
                          }
                          writeLine();
                          emitStart(member);
                          if (member.kind !== 133) {
                              write("Object.defineProperty(");
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              write(", ");
                              emitExpressionForPropertyName(member.name);
                              emitEnd(member.name);
                              write(",");
                              increaseIndent();
                              writeLine();
                          }
                          write("__decorate([");
                          increaseIndent();
                          writeLine();
                          var decoratorCount = decorators ? decorators.length : 0;
                          var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
                              emitStart(decorator);
                              emit(decorator.expression);
                              emitEnd(decorator);
                          });
                          argumentsWritten += emitDecoratorsOfParameters(functionLikeMember, argumentsWritten > 0);
                          emitSerializedTypeMetadata(member, argumentsWritten > 0);
                          decreaseIndent();
                          writeLine();
                          write("], ");
                          emitStart(member.name);
                          emitClassMemberPrefix(node, member);
                          write(", ");
                          emitExpressionForPropertyName(member.name);
                          emitEnd(member.name);
                          if (member.kind !== 133) {
                              write(", Object.getOwnPropertyDescriptor(");
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              write(", ");
                              emitExpressionForPropertyName(member.name);
                              emitEnd(member.name);
                              write("))");
                              decreaseIndent();
                          }
                          write(");");
                          emitEnd(member);
                          writeLine();
                      }
                  }
                  function emitDecoratorsOfParameters(node, leadingComma) {
                      var argumentsWritten = 0;
                      if (node) {
                          var parameterIndex = 0;
                          for (var _a = 0, _b = node.parameters; _a < _b.length; _a++) {
                              var parameter = _b[_a];
                              if (ts.nodeIsDecorated(parameter)) {
                                  var decorators = parameter.decorators;
                                  argumentsWritten += emitList(decorators, 0, decorators.length, true, false, leadingComma, true, function (decorator) {
                                      emitStart(decorator);
                                      write("__param(" + parameterIndex + ", ");
                                      emit(decorator.expression);
                                      write(")");
                                      emitEnd(decorator);
                                  });
                                  leadingComma = true;
                              }
                              ++parameterIndex;
                          }
                      }
                      return argumentsWritten;
                  }
                  function shouldEmitTypeMetadata(node) {
                      switch (node.kind) {
                          case 135:
                          case 137:
                          case 138:
                          case 133:
                              return true;
                      }
                      return false;
                  }
                  function shouldEmitReturnTypeMetadata(node) {
                      switch (node.kind) {
                          case 135:
                              return true;
                      }
                      return false;
                  }
                  function shouldEmitParamTypesMetadata(node) {
                      switch (node.kind) {
                          case 202:
                          case 135:
                          case 138:
                              return true;
                      }
                      return false;
                  }
                  function emitSerializedTypeMetadata(node, writeComma) {
                      var argumentsWritten = 0;
                      if (compilerOptions.emitDecoratorMetadata) {
                          if (shouldEmitTypeMetadata(node)) {
                              var serializedType = resolver.serializeTypeOfNode(node, getGeneratedNameForNode);
                              if (serializedType) {
                                  if (writeComma) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:type', ");
                                  emitSerializedType(node, serializedType);
                                  write(")");
                                  argumentsWritten++;
                              }
                          }
                          if (shouldEmitParamTypesMetadata(node)) {
                              var serializedTypes = resolver.serializeParameterTypesOfNode(node, getGeneratedNameForNode);
                              if (serializedTypes) {
                                  if (writeComma || argumentsWritten) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:paramtypes', [");
                                  for (var i = 0; i < serializedTypes.length; ++i) {
                                      if (i > 0) {
                                          write(", ");
                                      }
                                      emitSerializedType(node, serializedTypes[i]);
                                  }
                                  write("])");
                                  argumentsWritten++;
                              }
                          }
                          if (shouldEmitReturnTypeMetadata(node)) {
                              var serializedType = resolver.serializeReturnTypeOfNode(node, getGeneratedNameForNode);
                              if (serializedType) {
                                  if (writeComma || argumentsWritten) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:returntype', ");
                                  emitSerializedType(node, serializedType);
                                  write(")");
                                  argumentsWritten++;
                              }
                          }
                      }
                      return argumentsWritten;
                  }
                  function serializeTypeNameSegment(location, path, index) {
                      switch (index) {
                          case 0:
                              return "typeof " + path[index] + " !== 'undefined' && " + path[index];
                          case 1:
                              return serializeTypeNameSegment(location, path, index - 1) + "." + path[index];
                          default:
                              var temp = createAndRecordTempVariable(0).text;
                              return "(" + temp + " = " + serializeTypeNameSegment(location, path, index - 1) + ") && " + temp + "." + path[index];
                      }
                  }
                  function emitSerializedType(location, name) {
                      if (typeof name === "string") {
                          write(name);
                          return;
                      }
                      else {
                          ts.Debug.assert(name.length > 0, "Invalid serialized type name");
                          write("(" + serializeTypeNameSegment(location, name, name.length - 1) + ") || Object");
                      }
                  }
                  function emitInterfaceDeclaration(node) {
                      emitOnlyPinnedOrTripleSlashComments(node);
                  }
                  function shouldEmitEnumDeclaration(node) {
                      var isConstEnum = ts.isConst(node);
                      return !isConstEnum || compilerOptions.preserveConstEnums || compilerOptions.separateCompilation;
                  }
                  function emitEnumDeclaration(node) {
                      if (!shouldEmitEnumDeclaration(node)) {
                          return;
                      }
                      if (!shouldHoistDeclarationInSystemJsModule(node)) {
                          if (!(node.flags & 1) || isES6ExportedDeclaration(node)) {
                              emitStart(node);
                              if (isES6ExportedDeclaration(node)) {
                                  write("export ");
                              }
                              write("var ");
                              emit(node.name);
                              emitEnd(node);
                              write(";");
                          }
                      }
                      writeLine();
                      emitStart(node);
                      write("(function (");
                      emitStart(node.name);
                      write(getGeneratedNameForNode(node));
                      emitEnd(node.name);
                      write(") {");
                      increaseIndent();
                      scopeEmitStart(node);
                      emitLines(node.members);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      write(")(");
                      emitModuleMemberName(node);
                      write(" || (");
                      emitModuleMemberName(node);
                      write(" = {}));");
                      emitEnd(node);
                      if (!isES6ExportedDeclaration(node) && node.flags & 1 && !shouldHoistDeclarationInSystemJsModule(node)) {
                          writeLine();
                          emitStart(node);
                          write("var ");
                          emit(node.name);
                          write(" = ");
                          emitModuleMemberName(node);
                          emitEnd(node);
                          write(";");
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile) {
                          if (compilerOptions.module === 4 && (node.flags & 1)) {
                              writeLine();
                              write(exportFunctionForFile + "(\"");
                              emitDeclarationName(node);
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitEnumMember(node) {
                      var enumParent = node.parent;
                      emitStart(node);
                      write(getGeneratedNameForNode(enumParent));
                      write("[");
                      write(getGeneratedNameForNode(enumParent));
                      write("[");
                      emitExpressionForPropertyName(node.name);
                      write("] = ");
                      writeEnumMemberDeclarationValue(node);
                      write("] = ");
                      emitExpressionForPropertyName(node.name);
                      emitEnd(node);
                      write(";");
                  }
                  function writeEnumMemberDeclarationValue(member) {
                      var value = resolver.getConstantValue(member);
                      if (value !== undefined) {
                          write(value.toString());
                          return;
                      }
                      else if (member.initializer) {
                          emit(member.initializer);
                      }
                      else {
                          write("undefined");
                      }
                  }
                  function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
                      if (moduleDeclaration.body.kind === 206) {
                          var recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
                          return recursiveInnerModule || moduleDeclaration.body;
                      }
                  }
                  function shouldEmitModuleDeclaration(node) {
                      return ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation);
                  }
                  function isModuleMergedWithES6Class(node) {
                      return languageVersion === 2 && !!(resolver.getNodeCheckFlags(node) & 2048);
                  }
                  function emitModuleDeclaration(node) {
                      var shouldEmit = shouldEmitModuleDeclaration(node);
                      if (!shouldEmit) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      var hoistedInDeclarationScope = shouldHoistDeclarationInSystemJsModule(node);
                      var emitVarForModule = !hoistedInDeclarationScope && !isModuleMergedWithES6Class(node);
                      if (emitVarForModule) {
                          emitStart(node);
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                          }
                          write("var ");
                          emit(node.name);
                          write(";");
                          emitEnd(node);
                          writeLine();
                      }
                      emitStart(node);
                      write("(function (");
                      emitStart(node.name);
                      write(getGeneratedNameForNode(node));
                      emitEnd(node.name);
                      write(") ");
                      if (node.body.kind === 207) {
                          var saveTempFlags = tempFlags;
                          var saveTempVariables = tempVariables;
                          tempFlags = 0;
                          tempVariables = undefined;
                          emit(node.body);
                          tempFlags = saveTempFlags;
                          tempVariables = saveTempVariables;
                      }
                      else {
                          write("{");
                          increaseIndent();
                          scopeEmitStart(node);
                          emitCaptureThisForNodeIfNecessary(node);
                          writeLine();
                          emit(node.body);
                          decreaseIndent();
                          writeLine();
                          var moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
                          emitToken(15, moduleBlock.statements.end);
                          scopeEmitEnd();
                      }
                      write(")(");
                      if ((node.flags & 1) && !isES6ExportedDeclaration(node)) {
                          emit(node.name);
                          write(" = ");
                      }
                      emitModuleMemberName(node);
                      write(" || (");
                      emitModuleMemberName(node);
                      write(" = {}));");
                      emitEnd(node);
                      if (!isES6ExportedDeclaration(node) && node.name.kind === 65 && node.parent === currentSourceFile) {
                          if (compilerOptions.module === 4 && (node.flags & 1)) {
                              writeLine();
                              write(exportFunctionForFile + "(\"");
                              emitDeclarationName(node);
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitRequire(moduleName) {
                      if (moduleName.kind === 8) {
                          write("require(");
                          emitStart(moduleName);
                          emitLiteral(moduleName);
                          emitEnd(moduleName);
                          emitToken(17, moduleName.end);
                      }
                      else {
                          write("require()");
                      }
                  }
                  function getNamespaceDeclarationNode(node) {
                      if (node.kind === 209) {
                          return node;
                      }
                      var importClause = node.importClause;
                      if (importClause && importClause.namedBindings && importClause.namedBindings.kind === 212) {
                          return importClause.namedBindings;
                      }
                  }
                  function isDefaultImport(node) {
                      return node.kind === 210 && node.importClause && !!node.importClause.name;
                  }
                  function emitExportImportAssignments(node) {
                      if (ts.isAliasSymbolDeclaration(node) && resolver.isValueAliasDeclaration(node)) {
                          emitExportMemberAssignments(node.name);
                      }
                      ts.forEachChild(node, emitExportImportAssignments);
                  }
                  function emitImportDeclaration(node) {
                      if (languageVersion < 2) {
                          return emitExternalImportDeclaration(node);
                      }
                      if (node.importClause) {
                          var shouldEmitDefaultBindings = resolver.isReferencedAliasDeclaration(node.importClause);
                          var shouldEmitNamedBindings = node.importClause.namedBindings && resolver.isReferencedAliasDeclaration(node.importClause.namedBindings, true);
                          if (shouldEmitDefaultBindings || shouldEmitNamedBindings) {
                              write("import ");
                              emitStart(node.importClause);
                              if (shouldEmitDefaultBindings) {
                                  emit(node.importClause.name);
                                  if (shouldEmitNamedBindings) {
                                      write(", ");
                                  }
                              }
                              if (shouldEmitNamedBindings) {
                                  emitLeadingComments(node.importClause.namedBindings);
                                  emitStart(node.importClause.namedBindings);
                                  if (node.importClause.namedBindings.kind === 212) {
                                      write("* as ");
                                      emit(node.importClause.namedBindings.name);
                                  }
                                  else {
                                      write("{ ");
                                      emitExportOrImportSpecifierList(node.importClause.namedBindings.elements, resolver.isReferencedAliasDeclaration);
                                      write(" }");
                                  }
                                  emitEnd(node.importClause.namedBindings);
                                  emitTrailingComments(node.importClause.namedBindings);
                              }
                              emitEnd(node.importClause);
                              write(" from ");
                              emit(node.moduleSpecifier);
                              write(";");
                          }
                      }
                      else {
                          write("import ");
                          emit(node.moduleSpecifier);
                          write(";");
                      }
                  }
                  function emitExternalImportDeclaration(node) {
                      if (ts.contains(externalImports, node)) {
                          var isExportedImport = node.kind === 209 && (node.flags & 1) !== 0;
                          var namespaceDeclaration = getNamespaceDeclarationNode(node);
                          if (compilerOptions.module !== 2) {
                              emitLeadingComments(node);
                              emitStart(node);
                              if (namespaceDeclaration && !isDefaultImport(node)) {
                                  if (!isExportedImport)
                                      write("var ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                              }
                              else {
                                  var isNakedImport = 210 && !node.importClause;
                                  if (!isNakedImport) {
                                      write("var ");
                                      write(getGeneratedNameForNode(node));
                                      write(" = ");
                                  }
                              }
                              emitRequire(ts.getExternalModuleName(node));
                              if (namespaceDeclaration && isDefaultImport(node)) {
                                  write(", ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  write(getGeneratedNameForNode(node));
                              }
                              write(";");
                              emitEnd(node);
                              emitExportImportAssignments(node);
                              emitTrailingComments(node);
                          }
                          else {
                              if (isExportedImport) {
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  emit(namespaceDeclaration.name);
                                  write(";");
                              }
                              else if (namespaceDeclaration && isDefaultImport(node)) {
                                  write("var ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  write(getGeneratedNameForNode(node));
                                  write(";");
                              }
                              emitExportImportAssignments(node);
                          }
                      }
                  }
                  function emitImportEqualsDeclaration(node) {
                      if (ts.isExternalModuleImportEqualsDeclaration(node)) {
                          emitExternalImportDeclaration(node);
                          return;
                      }
                      if (resolver.isReferencedAliasDeclaration(node) ||
                          (!ts.isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node))) {
                          emitLeadingComments(node);
                          emitStart(node);
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              write("var ");
                          }
                          else if (!(node.flags & 1)) {
                              write("var ");
                          }
                          emitModuleMemberName(node);
                          write(" = ");
                          emit(node.moduleReference);
                          write(";");
                          emitEnd(node);
                          emitExportImportAssignments(node);
                          emitTrailingComments(node);
                      }
                  }
                  function emitExportDeclaration(node) {
                      ts.Debug.assert(compilerOptions.module !== 4);
                      if (languageVersion < 2) {
                          if (node.moduleSpecifier && (!node.exportClause || resolver.isValueAliasDeclaration(node))) {
                              emitStart(node);
                              var generatedName = getGeneratedNameForNode(node);
                              if (node.exportClause) {
                                  if (compilerOptions.module !== 2) {
                                      write("var ");
                                      write(generatedName);
                                      write(" = ");
                                      emitRequire(ts.getExternalModuleName(node));
                                      write(";");
                                  }
                                  for (var _a = 0, _b = node.exportClause.elements; _a < _b.length; _a++) {
                                      var specifier = _b[_a];
                                      if (resolver.isValueAliasDeclaration(specifier)) {
                                          writeLine();
                                          emitStart(specifier);
                                          emitContainingModuleName(specifier);
                                          write(".");
                                          emitNodeWithoutSourceMap(specifier.name);
                                          write(" = ");
                                          write(generatedName);
                                          write(".");
                                          emitNodeWithoutSourceMap(specifier.propertyName || specifier.name);
                                          write(";");
                                          emitEnd(specifier);
                                      }
                                  }
                              }
                              else {
                                  writeLine();
                                  write("__export(");
                                  if (compilerOptions.module !== 2) {
                                      emitRequire(ts.getExternalModuleName(node));
                                  }
                                  else {
                                      write(generatedName);
                                  }
                                  write(");");
                              }
                              emitEnd(node);
                          }
                      }
                      else {
                          if (!node.exportClause || resolver.isValueAliasDeclaration(node)) {
                              emitStart(node);
                              write("export ");
                              if (node.exportClause) {
                                  write("{ ");
                                  emitExportOrImportSpecifierList(node.exportClause.elements, resolver.isValueAliasDeclaration);
                                  write(" }");
                              }
                              else {
                                  write("*");
                              }
                              if (node.moduleSpecifier) {
                                  write(" from ");
                                  emitNodeWithoutSourceMap(node.moduleSpecifier);
                              }
                              write(";");
                              emitEnd(node);
                          }
                      }
                  }
                  function emitExportOrImportSpecifierList(specifiers, shouldEmit) {
                      ts.Debug.assert(languageVersion >= 2);
                      var needsComma = false;
                      for (var _a = 0; _a < specifiers.length; _a++) {
                          var specifier = specifiers[_a];
                          if (shouldEmit(specifier)) {
                              if (needsComma) {
                                  write(", ");
                              }
                              emitStart(specifier);
                              if (specifier.propertyName) {
                                  emitNodeWithoutSourceMap(specifier.propertyName);
                                  write(" as ");
                              }
                              emitNodeWithoutSourceMap(specifier.name);
                              emitEnd(specifier);
                              needsComma = true;
                          }
                      }
                  }
                  function emitExportAssignment(node) {
                      if (!node.isExportEquals && resolver.isValueAliasDeclaration(node)) {
                          if (languageVersion >= 2) {
                              writeLine();
                              emitStart(node);
                              write("export default ");
                              var expression = node.expression;
                              emit(expression);
                              if (expression.kind !== 201 &&
                                  expression.kind !== 202) {
                                  write(";");
                              }
                              emitEnd(node);
                          }
                          else {
                              writeLine();
                              emitStart(node);
                              if (compilerOptions.module === 4) {
                                  write(exportFunctionForFile + "(\"default\",");
                                  emit(node.expression);
                                  write(")");
                              }
                              else {
                                  emitContainingModuleName(node);
                                  if (languageVersion === 0) {
                                      write("[\"default\"] = ");
                                  }
                                  else {
                                      write(".default = ");
                                  }
                                  emit(node.expression);
                              }
                              write(";");
                              emitEnd(node);
                          }
                      }
                  }
                  function collectExternalModuleInfo(sourceFile) {
                      externalImports = [];
                      exportSpecifiers = {};
                      exportEquals = undefined;
                      hasExportStars = false;
                      for (var _a = 0, _b = sourceFile.statements; _a < _b.length; _a++) {
                          var node = _b[_a];
                          switch (node.kind) {
                              case 210:
                                  if (!node.importClause ||
                                      resolver.isReferencedAliasDeclaration(node.importClause, true)) {
                                      externalImports.push(node);
                                  }
                                  break;
                              case 209:
                                  if (node.moduleReference.kind === 220 && resolver.isReferencedAliasDeclaration(node)) {
                                      externalImports.push(node);
                                  }
                                  break;
                              case 216:
                                  if (node.moduleSpecifier) {
                                      if (!node.exportClause) {
                                          externalImports.push(node);
                                          hasExportStars = true;
                                      }
                                      else if (resolver.isValueAliasDeclaration(node)) {
                                          externalImports.push(node);
                                      }
                                  }
                                  else {
                                      for (var _c = 0, _d = node.exportClause.elements; _c < _d.length; _c++) {
                                          var specifier = _d[_c];
                                          var name_20 = (specifier.propertyName || specifier.name).text;
                                          (exportSpecifiers[name_20] || (exportSpecifiers[name_20] = [])).push(specifier);
                                      }
                                  }
                                  break;
                              case 215:
                                  if (node.isExportEquals && !exportEquals) {
                                      exportEquals = node;
                                  }
                                  break;
                          }
                      }
                  }
                  function emitExportStarHelper() {
                      if (hasExportStars) {
                          writeLine();
                          write("function __export(m) {");
                          increaseIndent();
                          writeLine();
                          write("for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];");
                          decreaseIndent();
                          writeLine();
                          write("}");
                      }
                  }
                  function getLocalNameForExternalImport(importNode) {
                      var namespaceDeclaration = getNamespaceDeclarationNode(importNode);
                      if (namespaceDeclaration && !isDefaultImport(importNode)) {
                          return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, namespaceDeclaration.name);
                      }
                      else {
                          return getGeneratedNameForNode(importNode);
                      }
                  }
                  function getExternalModuleNameText(importNode) {
                      var moduleName = ts.getExternalModuleName(importNode);
                      if (moduleName.kind === 8) {
                          return getLiteralText(moduleName);
                      }
                      return undefined;
                  }
                  function emitVariableDeclarationsForImports() {
                      if (externalImports.length === 0) {
                          return;
                      }
                      writeLine();
                      var started = false;
                      for (var _a = 0; _a < externalImports.length; _a++) {
                          var importNode = externalImports[_a];
                          var skipNode = importNode.kind === 216 ||
                              (importNode.kind === 210 && !importNode.importClause);
                          if (skipNode) {
                              continue;
                          }
                          if (!started) {
                              write("var ");
                              started = true;
                          }
                          else {
                              write(", ");
                          }
                          write(getLocalNameForExternalImport(importNode));
                      }
                      if (started) {
                          write(";");
                      }
                  }
                  function emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations) {
                      if (!hasExportStars) {
                          return undefined;
                      }
                      if (!exportedDeclarations && ts.isEmpty(exportSpecifiers)) {
                          var hasExportDeclarationWithExportClause = false;
                          for (var _a = 0; _a < externalImports.length; _a++) {
                              var externalImport = externalImports[_a];
                              if (externalImport.kind === 216 && externalImport.exportClause) {
                                  hasExportDeclarationWithExportClause = true;
                                  break;
                              }
                          }
                          if (!hasExportDeclarationWithExportClause) {
                              return emitExportStarFunction(undefined);
                          }
                      }
                      var exportedNamesStorageRef = makeUniqueName("exportedNames");
                      writeLine();
                      write("var " + exportedNamesStorageRef + " = {");
                      increaseIndent();
                      var started = false;
                      if (exportedDeclarations) {
                          for (var i = 0; i < exportedDeclarations.length; ++i) {
                              writeExportedName(exportedDeclarations[i]);
                          }
                      }
                      if (exportSpecifiers) {
                          for (var n in exportSpecifiers) {
                              for (var _b = 0, _c = exportSpecifiers[n]; _b < _c.length; _b++) {
                                  var specifier = _c[_b];
                                  writeExportedName(specifier.name);
                              }
                          }
                      }
                      for (var _d = 0; _d < externalImports.length; _d++) {
                          var externalImport = externalImports[_d];
                          if (externalImport.kind !== 216) {
                              continue;
                          }
                          var exportDecl = externalImport;
                          if (!exportDecl.exportClause) {
                              continue;
                          }
                          for (var _e = 0, _f = exportDecl.exportClause.elements; _e < _f.length; _e++) {
                              var element = _f[_e];
                              writeExportedName(element.name || element.propertyName);
                          }
                      }
                      decreaseIndent();
                      writeLine();
                      write("};");
                      return emitExportStarFunction(exportedNamesStorageRef);
                      function emitExportStarFunction(localNames) {
                          var exportStarFunction = makeUniqueName("exportStar");
                          writeLine();
                          write("function " + exportStarFunction + "(m) {");
                          increaseIndent();
                          writeLine();
                          write("for(var n in m) {");
                          increaseIndent();
                          writeLine();
                          write("if (n !== \"default\"");
                          if (localNames) {
                              write("&& !" + localNames + ".hasOwnProperty(n)");
                          }
                          write(") " + exportFunctionForFile + "(n, m[n]);");
                          decreaseIndent();
                          writeLine();
                          write("}");
                          decreaseIndent();
                          writeLine();
                          write("}");
                          return exportStarFunction;
                      }
                      function writeExportedName(node) {
                          if (node.kind !== 65 && node.flags & 256) {
                              return;
                          }
                          if (started) {
                              write(",");
                          }
                          else {
                              started = true;
                          }
                          writeLine();
                          write("'");
                          if (node.kind === 65) {
                              emitNodeWithoutSourceMap(node);
                          }
                          else {
                              emitDeclarationName(node);
                          }
                          write("': true");
                      }
                  }
                  function processTopLevelVariableAndFunctionDeclarations(node) {
                      var hoistedVars;
                      var hoistedFunctionDeclarations;
                      var exportedDeclarations;
                      visit(node);
                      if (hoistedVars) {
                          writeLine();
                          write("var ");
                          var seen = {};
                          for (var i = 0; i < hoistedVars.length; ++i) {
                              var local = hoistedVars[i];
                              var name_21 = local.kind === 65
                                  ? local
                                  : local.name;
                              if (name_21) {
                                  var text = ts.unescapeIdentifier(name_21.text);
                                  if (ts.hasProperty(seen, text)) {
                                      continue;
                                  }
                                  else {
                                      seen[text] = text;
                                  }
                              }
                              if (i !== 0) {
                                  write(", ");
                              }
                              if (local.kind === 202 || local.kind === 206 || local.kind === 205) {
                                  emitDeclarationName(local);
                              }
                              else {
                                  emit(local);
                              }
                              var flags = ts.getCombinedNodeFlags(local.kind === 65 ? local.parent : local);
                              if (flags & 1) {
                                  if (!exportedDeclarations) {
                                      exportedDeclarations = [];
                                  }
                                  exportedDeclarations.push(local);
                              }
                          }
                          write(";");
                      }
                      if (hoistedFunctionDeclarations) {
                          for (var _a = 0; _a < hoistedFunctionDeclarations.length; _a++) {
                              var f = hoistedFunctionDeclarations[_a];
                              writeLine();
                              emit(f);
                              if (f.flags & 1) {
                                  if (!exportedDeclarations) {
                                      exportedDeclarations = [];
                                  }
                                  exportedDeclarations.push(f);
                              }
                          }
                      }
                      return exportedDeclarations;
                      function visit(node) {
                          if (node.flags & 2) {
                              return;
                          }
                          if (node.kind === 201) {
                              if (!hoistedFunctionDeclarations) {
                                  hoistedFunctionDeclarations = [];
                              }
                              hoistedFunctionDeclarations.push(node);
                              return;
                          }
                          if (node.kind === 202) {
                              if (!hoistedVars) {
                                  hoistedVars = [];
                              }
                              hoistedVars.push(node);
                              return;
                          }
                          if (node.kind === 205) {
                              if (shouldEmitEnumDeclaration(node)) {
                                  if (!hoistedVars) {
                                      hoistedVars = [];
                                  }
                                  hoistedVars.push(node);
                              }
                              return;
                          }
                          if (node.kind === 206) {
                              if (shouldEmitModuleDeclaration(node)) {
                                  if (!hoistedVars) {
                                      hoistedVars = [];
                                  }
                                  hoistedVars.push(node);
                              }
                              return;
                          }
                          if (node.kind === 199 || node.kind === 153) {
                              if (shouldHoistVariable(node, false)) {
                                  var name_22 = node.name;
                                  if (name_22.kind === 65) {
                                      if (!hoistedVars) {
                                          hoistedVars = [];
                                      }
                                      hoistedVars.push(name_22);
                                  }
                                  else {
                                      ts.forEachChild(name_22, visit);
                                  }
                              }
                              return;
                          }
                          if (ts.isBindingPattern(node)) {
                              ts.forEach(node.elements, visit);
                              return;
                          }
                          if (!ts.isDeclaration(node)) {
                              ts.forEachChild(node, visit);
                          }
                      }
                  }
                  function shouldHoistVariable(node, checkIfSourceFileLevelDecl) {
                      if (checkIfSourceFileLevelDecl && !shouldHoistDeclarationInSystemJsModule(node)) {
                          return false;
                      }
                      return (ts.getCombinedNodeFlags(node) & 12288) === 0 ||
                          ts.getEnclosingBlockScopeContainer(node).kind === 228;
                  }
                  function isCurrentFileSystemExternalModule() {
                      return compilerOptions.module === 4 && ts.isExternalModule(currentSourceFile);
                  }
                  function emitSystemModuleBody(node, startIndex) {
                      emitVariableDeclarationsForImports();
                      writeLine();
                      var exportedDeclarations = processTopLevelVariableAndFunctionDeclarations(node);
                      var exportStarFunction = emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations);
                      writeLine();
                      write("return {");
                      increaseIndent();
                      writeLine();
                      emitSetters(exportStarFunction);
                      writeLine();
                      emitExecute(node, startIndex);
                      emitTempDeclarations(true);
                      decreaseIndent();
                      writeLine();
                      write("}");
                  }
                  function emitSetters(exportStarFunction) {
                      write("setters:[");
                      for (var i = 0; i < externalImports.length; ++i) {
                          if (i !== 0) {
                              write(",");
                          }
                          writeLine();
                          increaseIndent();
                          var importNode = externalImports[i];
                          var importVariableName = getLocalNameForExternalImport(importNode) || "";
                          var parameterName = "_" + importVariableName;
                          write("function (" + parameterName + ") {");
                          switch (importNode.kind) {
                              case 210:
                                  if (!importNode.importClause) {
                                      break;
                                  }
                              case 209:
                                  ts.Debug.assert(importVariableName !== "");
                                  increaseIndent();
                                  writeLine();
                                  write(importVariableName + " = " + parameterName + ";");
                                  writeLine();
                                  var defaultName = importNode.kind === 210
                                      ? importNode.importClause.name
                                      : importNode.name;
                                  if (defaultName) {
                                      emitExportMemberAssignments(defaultName);
                                      writeLine();
                                  }
                                  if (importNode.kind === 210 &&
                                      importNode.importClause.namedBindings) {
                                      var namedBindings = importNode.importClause.namedBindings;
                                      if (namedBindings.kind === 212) {
                                          emitExportMemberAssignments(namedBindings.name);
                                          writeLine();
                                      }
                                      else {
                                          for (var _a = 0, _b = namedBindings.elements; _a < _b.length; _a++) {
                                              var element = _b[_a];
                                              emitExportMemberAssignments(element.name || element.propertyName);
                                              writeLine();
                                          }
                                      }
                                  }
                                  decreaseIndent();
                                  break;
                              case 216:
                                  ts.Debug.assert(importVariableName !== "");
                                  increaseIndent();
                                  if (importNode.exportClause) {
                                      for (var _c = 0, _d = importNode.exportClause.elements; _c < _d.length; _c++) {
                                          var e = _d[_c];
                                          writeLine();
                                          write(exportFunctionForFile + "(\"");
                                          emitNodeWithoutSourceMap(e.name);
                                          write("\", " + parameterName + "[\"");
                                          emitNodeWithoutSourceMap(e.propertyName || e.name);
                                          write("\"]);");
                                      }
                                  }
                                  else {
                                      writeLine();
                                      write(exportStarFunction + "(" + parameterName + ");");
                                  }
                                  writeLine();
                                  decreaseIndent();
                                  break;
                          }
                          write("}");
                          decreaseIndent();
                      }
                      write("],");
                  }
                  function emitExecute(node, startIndex) {
                      write("execute: function() {");
                      increaseIndent();
                      writeLine();
                      for (var i = startIndex; i < node.statements.length; ++i) {
                          var statement = node.statements[i];
                          switch (statement.kind) {
                              case 216:
                              case 210:
                              case 209:
                              case 201:
                                  continue;
                          }
                          writeLine();
                          emit(statement);
                      }
                      decreaseIndent();
                      writeLine();
                      write("}");
                  }
                  function emitSystemModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      ts.Debug.assert(!exportFunctionForFile);
                      exportFunctionForFile = makeUniqueName("exports");
                      write("System.register([");
                      for (var i = 0; i < externalImports.length; ++i) {
                          var text = getExternalModuleNameText(externalImports[i]);
                          if (i !== 0) {
                              write(", ");
                          }
                          write(text);
                      }
                      write("], function(" + exportFunctionForFile + ") {");
                      writeLine();
                      increaseIndent();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitSystemModuleBody(node, startIndex);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitAMDDependencies(node, includeNonAmdDependencies) {
                      // An AMD define function has the following shape:
                      //     define(id?, dependencies?, factory);
                      //
                      // This has the shape of
                      //     define(name, ["module1", "module2"], function (module1Alias) {
                      // The location of the alias in the parameter list in the factory function needs to
                      // match the position of the module name in the dependency list.
                      //
                      // To ensure this is true in cases of modules with no aliases, e.g.:
                      // `import "module"` or `<amd-dependency path= "a.css" />`
                      // we need to add modules without alias names to the end of the dependencies list
                      var aliasedModuleNames = [];
                      var unaliasedModuleNames = [];
                      var importAliasNames = [];
                      for (var _a = 0, _b = node.amdDependencies; _a < _b.length; _a++) {
                          var amdDependency = _b[_a];
                          if (amdDependency.name) {
                              aliasedModuleNames.push("\"" + amdDependency.path + "\"");
                              importAliasNames.push(amdDependency.name);
                          }
                          else {
                              unaliasedModuleNames.push("\"" + amdDependency.path + "\"");
                          }
                      }
                      for (var _c = 0; _c < externalImports.length; _c++) {
                          var importNode = externalImports[_c];
                          var externalModuleName = getExternalModuleNameText(importNode);
                          var importAliasName = getLocalNameForExternalImport(importNode);
                          if (includeNonAmdDependencies && importAliasName) {
                              aliasedModuleNames.push(externalModuleName);
                              importAliasNames.push(importAliasName);
                          }
                          else {
                              unaliasedModuleNames.push(externalModuleName);
                          }
                      }
                      write("[\"require\", \"exports\"");
                      if (aliasedModuleNames.length) {
                          write(", ");
                          write(aliasedModuleNames.join(", "));
                      }
                      if (unaliasedModuleNames.length) {
                          write(", ");
                          write(unaliasedModuleNames.join(", "));
                      }
                      write("], function (require, exports");
                      if (importAliasNames.length) {
                          write(", ");
                          write(importAliasNames.join(", "));
                      }
                  }
                  function emitAMDModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      writeLine();
                      write("define(");
                      if (node.amdModuleName) {
                          write("\"" + node.amdModuleName + "\", ");
                      }
                      emitAMDDependencies(node, true);
                      write(") {");
                      increaseIndent();
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(true);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitCommonJSModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(false);
                  }
                  function emitUMDModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      writeLines("(function (deps, factory) {\n    if (typeof module === 'object' && typeof module.exports === 'object') {\n        var v = factory(require, exports); if (v !== undefined) module.exports = v;\n    }\n    else if (typeof define === 'function' && define.amd) {\n        define(deps, factory);\n    }\n})(");
                      emitAMDDependencies(node, false);
                      write(") {");
                      increaseIndent();
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(true);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitES6Module(node, startIndex) {
                      externalImports = undefined;
                      exportSpecifiers = undefined;
                      exportEquals = undefined;
                      hasExportStars = false;
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                  }
                  function emitExportEquals(emitAsReturn) {
                      if (exportEquals && resolver.isValueAliasDeclaration(exportEquals)) {
                          writeLine();
                          emitStart(exportEquals);
                          write(emitAsReturn ? "return " : "module.exports = ");
                          emit(exportEquals.expression);
                          write(";");
                          emitEnd(exportEquals);
                      }
                  }
                  function emitDirectivePrologues(statements, startWithNewLine) {
                      for (var i = 0; i < statements.length; ++i) {
                          if (ts.isPrologueDirective(statements[i])) {
                              if (startWithNewLine || i > 0) {
                                  writeLine();
                              }
                              emit(statements[i]);
                          }
                          else {
                              return i;
                          }
                      }
                      return statements.length;
                  }
                  function writeLines(text) {
                      var lines = text.split(/\r\n|\r|\n/g);
                      for (var i = 0; i < lines.length; ++i) {
                          var line = lines[i];
                          if (line.length) {
                              writeLine();
                              write(line);
                          }
                      }
                  }
                  function emitSourceFileNode(node) {
                      writeLine();
                      emitDetachedComments(node);
                      var startIndex = emitDirectivePrologues(node.statements, false);
                      if (!compilerOptions.noEmitHelpers) {
                          if ((languageVersion < 2) && (!extendsEmitted && resolver.getNodeCheckFlags(node) & 8)) {
                              writeLines(extendsHelper);
                              extendsEmitted = true;
                          }
                          if (!decorateEmitted && resolver.getNodeCheckFlags(node) & 512) {
                              writeLines(decorateHelper);
                              if (compilerOptions.emitDecoratorMetadata) {
                                  writeLines(metadataHelper);
                              }
                              decorateEmitted = true;
                          }
                          if (!paramEmitted && resolver.getNodeCheckFlags(node) & 1024) {
                              writeLines(paramHelper);
                              paramEmitted = true;
                          }
                      }
                      if (ts.isExternalModule(node) || compilerOptions.separateCompilation) {
                          if (languageVersion >= 2) {
                              emitES6Module(node, startIndex);
                          }
                          else if (compilerOptions.module === 2) {
                              emitAMDModule(node, startIndex);
                          }
                          else if (compilerOptions.module === 4) {
                              emitSystemModule(node, startIndex);
                          }
                          else if (compilerOptions.module === 3) {
                              emitUMDModule(node, startIndex);
                          }
                          else {
                              emitCommonJSModule(node, startIndex);
                          }
                      }
                      else {
                          externalImports = undefined;
                          exportSpecifiers = undefined;
                          exportEquals = undefined;
                          hasExportStars = false;
                          emitCaptureThisForNodeIfNecessary(node);
                          emitLinesStartingAt(node.statements, startIndex);
                          emitTempDeclarations(true);
                      }
                      emitLeadingComments(node.endOfFileToken);
                  }
                  function emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers) {
                      if (!node) {
                          return;
                      }
                      if (node.flags & 2) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      var emitComments = shouldEmitLeadingAndTrailingComments(node);
                      if (emitComments) {
                          emitLeadingComments(node);
                      }
                      emitJavaScriptWorker(node, allowGeneratedIdentifiers);
                      if (emitComments) {
                          emitTrailingComments(node);
                      }
                  }
                  function shouldEmitLeadingAndTrailingComments(node) {
                      switch (node.kind) {
                          case 203:
                          case 201:
                          case 210:
                          case 209:
                          case 204:
                          case 215:
                              return false;
                          case 206:
                              return shouldEmitModuleDeclaration(node);
                          case 205:
                              return shouldEmitEnumDeclaration(node);
                      }
                      if (node.kind !== 180 &&
                          node.parent &&
                          node.parent.kind === 164 &&
                          node.parent.body === node &&
                          compilerOptions.target <= 1) {
                          return false;
                      }
                      return true;
                  }
                  function emitJavaScriptWorker(node, allowGeneratedIdentifiers) {
                      if (allowGeneratedIdentifiers === void 0) { allowGeneratedIdentifiers = true; }
                      switch (node.kind) {
                          case 65:
                              return emitIdentifier(node, allowGeneratedIdentifiers);
                          case 130:
                              return emitParameter(node);
                          case 135:
                          case 134:
                              return emitMethod(node);
                          case 137:
                          case 138:
                              return emitAccessor(node);
                          case 93:
                              return emitThis(node);
                          case 91:
                              return emitSuper(node);
                          case 89:
                              return write("null");
                          case 95:
                              return write("true");
                          case 80:
                              return write("false");
                          case 7:
                          case 8:
                          case 9:
                          case 10:
                          case 11:
                          case 12:
                          case 13:
                              return emitLiteral(node);
                          case 172:
                              return emitTemplateExpression(node);
                          case 178:
                              return emitTemplateSpan(node);
                          case 127:
                              return emitQualifiedName(node);
                          case 151:
                              return emitObjectBindingPattern(node);
                          case 152:
                              return emitArrayBindingPattern(node);
                          case 153:
                              return emitBindingElement(node);
                          case 154:
                              return emitArrayLiteral(node);
                          case 155:
                              return emitObjectLiteral(node);
                          case 225:
                              return emitPropertyAssignment(node);
                          case 226:
                              return emitShorthandPropertyAssignment(node);
                          case 128:
                              return emitComputedPropertyName(node);
                          case 156:
                              return emitPropertyAccess(node);
                          case 157:
                              return emitIndexedAccess(node);
                          case 158:
                              return emitCallExpression(node);
                          case 159:
                              return emitNewExpression(node);
                          case 160:
                              return emitTaggedTemplateExpression(node);
                          case 161:
                              return emit(node.expression);
                          case 162:
                              return emitParenExpression(node);
                          case 201:
                          case 163:
                          case 164:
                              return emitFunctionDeclaration(node);
                          case 165:
                              return emitDeleteExpression(node);
                          case 166:
                              return emitTypeOfExpression(node);
                          case 167:
                              return emitVoidExpression(node);
                          case 168:
                              return emitPrefixUnaryExpression(node);
                          case 169:
                              return emitPostfixUnaryExpression(node);
                          case 170:
                              return emitBinaryExpression(node);
                          case 171:
                              return emitConditionalExpression(node);
                          case 174:
                              return emitSpreadElementExpression(node);
                          case 173:
                              return emitYieldExpression(node);
                          case 176:
                              return;
                          case 180:
                          case 207:
                              return emitBlock(node);
                          case 181:
                              return emitVariableStatement(node);
                          case 182:
                              return write(";");
                          case 183:
                              return emitExpressionStatement(node);
                          case 184:
                              return emitIfStatement(node);
                          case 185:
                              return emitDoStatement(node);
                          case 186:
                              return emitWhileStatement(node);
                          case 187:
                              return emitForStatement(node);
                          case 189:
                          case 188:
                              return emitForInOrForOfStatement(node);
                          case 190:
                          case 191:
                              return emitBreakOrContinueStatement(node);
                          case 192:
                              return emitReturnStatement(node);
                          case 193:
                              return emitWithStatement(node);
                          case 194:
                              return emitSwitchStatement(node);
                          case 221:
                          case 222:
                              return emitCaseOrDefaultClause(node);
                          case 195:
                              return emitLabelledStatement(node);
                          case 196:
                              return emitThrowStatement(node);
                          case 197:
                              return emitTryStatement(node);
                          case 224:
                              return emitCatchClause(node);
                          case 198:
                              return emitDebuggerStatement(node);
                          case 199:
                              return emitVariableDeclaration(node);
                          case 175:
                              return emitClassExpression(node);
                          case 202:
                              return emitClassDeclaration(node);
                          case 203:
                              return emitInterfaceDeclaration(node);
                          case 205:
                              return emitEnumDeclaration(node);
                          case 227:
                              return emitEnumMember(node);
                          case 206:
                              return emitModuleDeclaration(node);
                          case 210:
                              return emitImportDeclaration(node);
                          case 209:
                              return emitImportEqualsDeclaration(node);
                          case 216:
                              return emitExportDeclaration(node);
                          case 215:
                              return emitExportAssignment(node);
                          case 228:
                              return emitSourceFileNode(node);
                      }
                  }
                  function hasDetachedComments(pos) {
                      return detachedCommentsInfo !== undefined && ts.lastOrUndefined(detachedCommentsInfo).nodePos === pos;
                  }
                  function getLeadingCommentsWithoutDetachedComments() {
                      var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, ts.lastOrUndefined(detachedCommentsInfo).detachedCommentEndPos);
                      if (detachedCommentsInfo.length - 1) {
                          detachedCommentsInfo.pop();
                      }
                      else {
                          detachedCommentsInfo = undefined;
                      }
                      return leadingComments;
                  }
                  function filterComments(ranges, onlyPinnedOrTripleSlashComments) {
                      if (ranges && onlyPinnedOrTripleSlashComments) {
                          ranges = ts.filter(ranges, isPinnedOrTripleSlashComment);
                          if (ranges.length === 0) {
                              return undefined;
                          }
                      }
                      return ranges;
                  }
                  function getLeadingCommentsToEmit(node) {
                      if (node.parent) {
                          if (node.parent.kind === 228 || node.pos !== node.parent.pos) {
                              if (hasDetachedComments(node.pos)) {
                                  return getLeadingCommentsWithoutDetachedComments();
                              }
                              else {
                                  return ts.getLeadingCommentRangesOfNode(node, currentSourceFile);
                              }
                          }
                      }
                  }
                  function getTrailingCommentsToEmit(node) {
                      if (node.parent) {
                          if (node.parent.kind === 228 || node.end !== node.parent.end) {
                              return ts.getTrailingCommentRanges(currentSourceFile.text, node.end);
                          }
                      }
                  }
                  function emitOnlyPinnedOrTripleSlashComments(node) {
                      emitLeadingCommentsWorker(node, true);
                  }
                  function emitLeadingComments(node) {
                      return emitLeadingCommentsWorker(node, compilerOptions.removeComments);
                  }
                  function emitLeadingCommentsWorker(node, onlyPinnedOrTripleSlashComments) {
                      var leadingComments = filterComments(getLeadingCommentsToEmit(node), onlyPinnedOrTripleSlashComments);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
                      ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
                  }
                  function emitTrailingComments(node) {
                      var trailingComments = filterComments(getTrailingCommentsToEmit(node), compilerOptions.removeComments);
                      ts.emitComments(currentSourceFile, writer, trailingComments, false, newLine, writeComment);
                  }
                  function emitLeadingCommentsOfPosition(pos) {
                      var leadingComments;
                      if (hasDetachedComments(pos)) {
                          leadingComments = getLeadingCommentsWithoutDetachedComments();
                      }
                      else {
                          leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, pos);
                      }
                      leadingComments = filterComments(leadingComments, compilerOptions.removeComments);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, { pos: pos, end: pos }, leadingComments);
                      ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
                  }
                  function emitDetachedComments(node) {
                      var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
                      if (leadingComments) {
                          var detachedComments = [];
                          var lastComment;
                          ts.forEach(leadingComments, function (comment) {
                              if (lastComment) {
                                  var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, lastComment.end);
                                  var commentLine = ts.getLineOfLocalPosition(currentSourceFile, comment.pos);
                                  if (commentLine >= lastCommentLine + 2) {
                                      return detachedComments;
                                  }
                              }
                              detachedComments.push(comment);
                              lastComment = comment;
                          });
                          if (detachedComments.length) {
                              var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, ts.lastOrUndefined(detachedComments).end);
                              var nodeLine = ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node.pos));
                              if (nodeLine >= lastCommentLine + 2) {
                                  ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
                                  ts.emitComments(currentSourceFile, writer, detachedComments, true, newLine, writeComment);
                                  var currentDetachedCommentInfo = { nodePos: node.pos, detachedCommentEndPos: ts.lastOrUndefined(detachedComments).end };
                                  if (detachedCommentsInfo) {
                                      detachedCommentsInfo.push(currentDetachedCommentInfo);
                                  }
                                  else {
                                      detachedCommentsInfo = [currentDetachedCommentInfo];
                                  }
                              }
                          }
                      }
                  }
                  function isPinnedOrTripleSlashComment(comment) {
                      if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
                          return currentSourceFile.text.charCodeAt(comment.pos + 2) === 33;
                      }
                      else if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 47 &&
                          comment.pos + 2 < comment.end &&
                          currentSourceFile.text.charCodeAt(comment.pos + 2) === 47 &&
                          currentSourceFile.text.substring(comment.pos, comment.end).match(ts.fullTripleSlashReferencePathRegEx)) {
                          return true;
                      }
                  }
              }
              function emitFile(jsFilePath, sourceFile) {
                  emitJavaScript(jsFilePath, sourceFile);
                  if (compilerOptions.declaration) {
                      ts.writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics);
                  }
              }
          }
          ts.emitFiles = emitFiles;
      })(ts || (ts = {}));
      /// <reference path="sys.ts" />
      /// <reference path="emitter.ts" />
      var ts;
      (function (ts) {
          ts.programTime = 0;
          ts.emitTime = 0;
          ts.ioReadTime = 0;
          ts.ioWriteTime = 0;
          ts.version = "1.5.2";
          var carriageReturnLineFeed = "\r\n";
          var lineFeed = "\n";
          function findConfigFile(searchPath) {
              var fileName = "tsconfig.json";
              while (true) {
                  if (ts.sys.fileExists(fileName)) {
                      return fileName;
                  }
                  var parentPath = ts.getDirectoryPath(searchPath);
                  if (parentPath === searchPath) {
                      break;
                  }
                  searchPath = parentPath;
                  fileName = "../" + fileName;
              }
              return undefined;
          }
          ts.findConfigFile = findConfigFile;
          function createCompilerHost(options, setParentNodes) {
              var currentDirectory;
              var existingDirectories = {};
              function getCanonicalFileName(fileName) {
                  return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
              }
              var unsupportedFileEncodingErrorCode = -2147024809;
              function getSourceFile(fileName, languageVersion, onError) {
                  var text;
                  try {
                      var start = new Date().getTime();
                      text = ts.sys.readFile(fileName, options.charset);
                      ts.ioReadTime += new Date().getTime() - start;
                  }
                  catch (e) {
                      if (onError) {
                          onError(e.number === unsupportedFileEncodingErrorCode
                              ? ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_file_encoding).messageText
                              : e.message);
                      }
                      text = "";
                  }
                  return text !== undefined ? ts.createSourceFile(fileName, text, languageVersion, setParentNodes) : undefined;
              }
              function directoryExists(directoryPath) {
                  if (ts.hasProperty(existingDirectories, directoryPath)) {
                      return true;
                  }
                  if (ts.sys.directoryExists(directoryPath)) {
                      existingDirectories[directoryPath] = true;
                      return true;
                  }
                  return false;
              }
              function ensureDirectoriesExist(directoryPath) {
                  if (directoryPath.length > ts.getRootLength(directoryPath) && !directoryExists(directoryPath)) {
                      var parentDirectory = ts.getDirectoryPath(directoryPath);
                      ensureDirectoriesExist(parentDirectory);
                      ts.sys.createDirectory(directoryPath);
                  }
              }
              function writeFile(fileName, data, writeByteOrderMark, onError) {
                  try {
                      var start = new Date().getTime();
                      ensureDirectoriesExist(ts.getDirectoryPath(ts.normalizePath(fileName)));
                      ts.sys.writeFile(fileName, data, writeByteOrderMark);
                      ts.ioWriteTime += new Date().getTime() - start;
                  }
                  catch (e) {
                      if (onError) {
                          onError(e.message);
                      }
                  }
              }
              var newLine = options.newLine === 0 ? carriageReturnLineFeed :
                  options.newLine === 1 ? lineFeed :
                      ts.sys.newLine;
              return {
                  getSourceFile: getSourceFile,
                  getDefaultLibFileName: function (options) { return ts.combinePaths(ts.getDirectoryPath(ts.normalizePath(ts.sys.getExecutingFilePath())), ts.getDefaultLibFileName(options)); },
                  writeFile: writeFile,
                  getCurrentDirectory: function () { return currentDirectory || (currentDirectory = ts.sys.getCurrentDirectory()); },
                  useCaseSensitiveFileNames: function () { return ts.sys.useCaseSensitiveFileNames; },
                  getCanonicalFileName: getCanonicalFileName,
                  getNewLine: function () { return newLine; }
              };
          }
          ts.createCompilerHost = createCompilerHost;
          function getPreEmitDiagnostics(program, sourceFile) {
              var diagnostics = program.getSyntacticDiagnostics(sourceFile).concat(program.getGlobalDiagnostics()).concat(program.getSemanticDiagnostics(sourceFile));
              if (program.getCompilerOptions().declaration) {
                  diagnostics.concat(program.getDeclarationDiagnostics(sourceFile));
              }
              return ts.sortAndDeduplicateDiagnostics(diagnostics);
          }
          ts.getPreEmitDiagnostics = getPreEmitDiagnostics;
          function flattenDiagnosticMessageText(messageText, newLine) {
              if (typeof messageText === "string") {
                  return messageText;
              }
              else {
                  var diagnosticChain = messageText;
                  var result = "";
                  var indent = 0;
                  while (diagnosticChain) {
                      if (indent) {
                          result += newLine;
                          for (var i = 0; i < indent; i++) {
                              result += "  ";
                          }
                      }
                      result += diagnosticChain.messageText;
                      indent++;
                      diagnosticChain = diagnosticChain.next;
                  }
                  return result;
              }
          }
          ts.flattenDiagnosticMessageText = flattenDiagnosticMessageText;
          function createProgram(rootNames, options, host) {
              var program;
              var files = [];
              var filesByName = {};
              var diagnostics = ts.createDiagnosticCollection();
              var seenNoDefaultLib = options.noLib;
              var commonSourceDirectory;
              var diagnosticsProducingTypeChecker;
              var noDiagnosticsTypeChecker;
              var start = new Date().getTime();
              host = host || createCompilerHost(options);
              ts.forEach(rootNames, function (name) { return processRootFile(name, false); });
              if (!seenNoDefaultLib) {
                  processRootFile(host.getDefaultLibFileName(options), true);
              }
              verifyCompilerOptions();
              ts.programTime += new Date().getTime() - start;
              program = {
                  getSourceFile: getSourceFile,
                  getSourceFiles: function () { return files; },
                  getCompilerOptions: function () { return options; },
                  getSyntacticDiagnostics: getSyntacticDiagnostics,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getSemanticDiagnostics: getSemanticDiagnostics,
                  getDeclarationDiagnostics: getDeclarationDiagnostics,
                  getTypeChecker: getTypeChecker,
                  getDiagnosticsProducingTypeChecker: getDiagnosticsProducingTypeChecker,
                  getCommonSourceDirectory: function () { return commonSourceDirectory; },
                  emit: emit,
                  getCurrentDirectory: function () { return host.getCurrentDirectory(); },
                  getNodeCount: function () { return getDiagnosticsProducingTypeChecker().getNodeCount(); },
                  getIdentifierCount: function () { return getDiagnosticsProducingTypeChecker().getIdentifierCount(); },
                  getSymbolCount: function () { return getDiagnosticsProducingTypeChecker().getSymbolCount(); },
                  getTypeCount: function () { return getDiagnosticsProducingTypeChecker().getTypeCount(); }
              };
              return program;
              function getEmitHost(writeFileCallback) {
                  return {
                      getCanonicalFileName: function (fileName) { return host.getCanonicalFileName(fileName); },
                      getCommonSourceDirectory: program.getCommonSourceDirectory,
                      getCompilerOptions: program.getCompilerOptions,
                      getCurrentDirectory: function () { return host.getCurrentDirectory(); },
                      getNewLine: function () { return host.getNewLine(); },
                      getSourceFile: program.getSourceFile,
                      getSourceFiles: program.getSourceFiles,
                      writeFile: writeFileCallback || (function (fileName, data, writeByteOrderMark, onError) { return host.writeFile(fileName, data, writeByteOrderMark, onError); })
                  };
              }
              function getDiagnosticsProducingTypeChecker() {
                  return diagnosticsProducingTypeChecker || (diagnosticsProducingTypeChecker = ts.createTypeChecker(program, true));
              }
              function getTypeChecker() {
                  return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false));
              }
              function emit(sourceFile, writeFileCallback) {
                  if (options.noEmitOnError && getPreEmitDiagnostics(this).length > 0) {
                      return { diagnostics: [], sourceMaps: undefined, emitSkipped: true };
                  }
                  var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver(options.out ? undefined : sourceFile);
                  var start = new Date().getTime();
                  var emitResult = ts.emitFiles(emitResolver, getEmitHost(writeFileCallback), sourceFile);
                  ts.emitTime += new Date().getTime() - start;
                  return emitResult;
              }
              function getSourceFile(fileName) {
                  fileName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
                  return ts.hasProperty(filesByName, fileName) ? filesByName[fileName] : undefined;
              }
              function getDiagnosticsHelper(sourceFile, getDiagnostics) {
                  if (sourceFile) {
                      return getDiagnostics(sourceFile);
                  }
                  var allDiagnostics = [];
                  ts.forEach(program.getSourceFiles(), function (sourceFile) {
                      ts.addRange(allDiagnostics, getDiagnostics(sourceFile));
                  });
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function getSyntacticDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile);
              }
              function getSemanticDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile);
              }
              function getDeclarationDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile);
              }
              function getSyntacticDiagnosticsForFile(sourceFile) {
                  return sourceFile.parseDiagnostics;
              }
              function getSemanticDiagnosticsForFile(sourceFile) {
                  var typeChecker = getDiagnosticsProducingTypeChecker();
                  ts.Debug.assert(!!sourceFile.bindDiagnostics);
                  var bindDiagnostics = sourceFile.bindDiagnostics;
                  var checkDiagnostics = typeChecker.getDiagnostics(sourceFile);
                  var programDiagnostics = diagnostics.getDiagnostics(sourceFile.fileName);
                  return bindDiagnostics.concat(checkDiagnostics).concat(programDiagnostics);
              }
              function getDeclarationDiagnosticsForFile(sourceFile) {
                  if (!ts.isDeclarationFile(sourceFile)) {
                      var resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile);
                      var writeFile = function () { };
                      return ts.getDeclarationDiagnostics(getEmitHost(writeFile), resolver, sourceFile);
                  }
              }
              function getGlobalDiagnostics() {
                  var typeChecker = getDiagnosticsProducingTypeChecker();
                  var allDiagnostics = [];
                  ts.addRange(allDiagnostics, typeChecker.getGlobalDiagnostics());
                  ts.addRange(allDiagnostics, diagnostics.getGlobalDiagnostics());
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function hasExtension(fileName) {
                  return ts.getBaseFileName(fileName).indexOf(".") >= 0;
              }
              function processRootFile(fileName, isDefaultLib) {
                  processSourceFile(ts.normalizePath(fileName), isDefaultLib);
              }
              function processSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd) {
                  var start;
                  var length;
                  var extensions;
                  var diagnosticArgument;
                  if (refEnd !== undefined && refPos !== undefined) {
                      start = refPos;
                      length = refEnd - refPos;
                  }
                  var diagnostic;
                  if (hasExtension(fileName)) {
                      if (!options.allowNonTsExtensions && !ts.forEach(ts.supportedExtensions, function (extension) { return ts.fileExtensionIs(host.getCanonicalFileName(fileName), extension); })) {
                          diagnostic = ts.Diagnostics.File_0_has_unsupported_extension_The_only_supported_extensions_are_1;
                          diagnosticArgument = [fileName, "'" + ts.supportedExtensions.join("', '") + "'"];
                      }
                      else if (!findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          diagnosticArgument = [fileName];
                      }
                      else if (refFile && host.getCanonicalFileName(fileName) === host.getCanonicalFileName(refFile.fileName)) {
                          diagnostic = ts.Diagnostics.A_file_cannot_have_a_reference_to_itself;
                          diagnosticArgument = [fileName];
                      }
                  }
                  else {
                      if (options.allowNonTsExtensions && !findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          diagnosticArgument = [fileName];
                      }
                      else if (!ts.forEach(ts.supportedExtensions, function (extension) { return findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd); })) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          fileName += ".ts";
                          diagnosticArgument = [fileName];
                      }
                  }
                  if (diagnostic) {
                      if (refFile) {
                          diagnostics.add(ts.createFileDiagnostic.apply(void 0, [refFile, start, length, diagnostic].concat(diagnosticArgument)));
                      }
                      else {
                          diagnostics.add(ts.createCompilerDiagnostic.apply(void 0, [diagnostic].concat(diagnosticArgument)));
                      }
                  }
              }
              function findSourceFile(fileName, isDefaultLib, refFile, refStart, refLength) {
                  var canonicalName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
                  if (ts.hasProperty(filesByName, canonicalName)) {
                      return getSourceFileFromCache(fileName, canonicalName, false);
                  }
                  else {
                      var normalizedAbsolutePath = ts.getNormalizedAbsolutePath(fileName, host.getCurrentDirectory());
                      var canonicalAbsolutePath = host.getCanonicalFileName(normalizedAbsolutePath);
                      if (ts.hasProperty(filesByName, canonicalAbsolutePath)) {
                          return getSourceFileFromCache(normalizedAbsolutePath, canonicalAbsolutePath, true);
                      }
                      var file = filesByName[canonicalName] = host.getSourceFile(fileName, options.target, function (hostErrorMessage) {
                          if (refFile) {
                              diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                          }
                          else {
                              diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                          }
                      });
                      if (file) {
                          seenNoDefaultLib = seenNoDefaultLib || file.hasNoDefaultLib;
                          filesByName[canonicalAbsolutePath] = file;
                          if (!options.noResolve) {
                              var basePath = ts.getDirectoryPath(fileName);
                              processReferencedFiles(file, basePath);
                              processImportedModules(file, basePath);
                          }
                          if (isDefaultLib) {
                              files.unshift(file);
                          }
                          else {
                              files.push(file);
                          }
                      }
                      return file;
                  }
                  function getSourceFileFromCache(fileName, canonicalName, useAbsolutePath) {
                      var file = filesByName[canonicalName];
                      if (file && host.useCaseSensitiveFileNames()) {
                          var sourceFileName = useAbsolutePath ? ts.getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory()) : file.fileName;
                          if (canonicalName !== sourceFileName) {
                              diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, fileName, sourceFileName));
                          }
                      }
                      return file;
                  }
              }
              function processReferencedFiles(file, basePath) {
                  ts.forEach(file.referencedFiles, function (ref) {
                      var referencedFileName = ts.isRootedDiskPath(ref.fileName) ? ref.fileName : ts.combinePaths(basePath, ref.fileName);
                      processSourceFile(ts.normalizePath(referencedFileName), false, file, ref.pos, ref.end);
                  });
              }
              function processImportedModules(file, basePath) {
                  ts.forEach(file.statements, function (node) {
                      if (node.kind === 210 || node.kind === 209 || node.kind === 216) {
                          var moduleNameExpr = ts.getExternalModuleName(node);
                          if (moduleNameExpr && moduleNameExpr.kind === 8) {
                              var moduleNameText = moduleNameExpr.text;
                              if (moduleNameText) {
                                  var searchPath = basePath;
                                  var searchName;
                                  while (true) {
                                      searchName = ts.normalizePath(ts.combinePaths(searchPath, moduleNameText));
                                      if (ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, moduleNameExpr); })) {
                                          break;
                                      }
                                      var parentPath = ts.getDirectoryPath(searchPath);
                                      if (parentPath === searchPath) {
                                          break;
                                      }
                                      searchPath = parentPath;
                                  }
                              }
                          }
                      }
                      else if (node.kind === 206 && node.name.kind === 8 && (node.flags & 2 || ts.isDeclarationFile(file))) {
                          ts.forEachChild(node.body, function (node) {
                              if (ts.isExternalModuleImportEqualsDeclaration(node) &&
                                  ts.getExternalModuleImportEqualsDeclarationExpression(node).kind === 8) {
                                  var nameLiteral = ts.getExternalModuleImportEqualsDeclarationExpression(node);
                                  var moduleName = nameLiteral.text;
                                  if (moduleName) {
                                      var searchName = ts.normalizePath(ts.combinePaths(basePath, moduleName));
                                      ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, nameLiteral); });
                                  }
                              }
                          });
                      }
                  });
                  function findModuleSourceFile(fileName, nameLiteral) {
                      return findSourceFile(fileName, false, file, nameLiteral.pos, nameLiteral.end - nameLiteral.pos);
                  }
              }
              function computeCommonSourceDirectory(sourceFiles) {
                  var commonPathComponents;
                  var currentDirectory = host.getCurrentDirectory();
                  ts.forEach(files, function (sourceFile) {
                      if (ts.isDeclarationFile(sourceFile)) {
                          return;
                      }
                      var sourcePathComponents = ts.getNormalizedPathComponents(sourceFile.fileName, currentDirectory);
                      sourcePathComponents.pop();
                      if (!commonPathComponents) {
                          commonPathComponents = sourcePathComponents;
                          return;
                      }
                      for (var i = 0, n = Math.min(commonPathComponents.length, sourcePathComponents.length); i < n; i++) {
                          if (commonPathComponents[i] !== sourcePathComponents[i]) {
                              if (i === 0) {
                                  diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files));
                                  return;
                              }
                              commonPathComponents.length = i;
                              break;
                          }
                      }
                      if (sourcePathComponents.length < commonPathComponents.length) {
                          commonPathComponents.length = sourcePathComponents.length;
                      }
                  });
                  return ts.getNormalizedPathFromPathComponents(commonPathComponents);
              }
              function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
                  var allFilesBelongToPath = true;
                  if (sourceFiles) {
                      var currentDirectory = host.getCurrentDirectory();
                      var absoluteRootDirectoryPath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(rootDirectory, currentDirectory));
                      for (var _i = 0; _i < sourceFiles.length; _i++) {
                          var sourceFile = sourceFiles[_i];
                          if (!ts.isDeclarationFile(sourceFile)) {
                              var absoluteSourceFilePath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
                              if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
                                  diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, sourceFile.fileName, options.rootDir));
                                  allFilesBelongToPath = false;
                              }
                          }
                      }
                  }
                  return allFilesBelongToPath;
              }
              function verifyCompilerOptions() {
                  if (options.separateCompilation) {
                      if (options.sourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.declaration) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_declaration_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.noEmitOnError) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.out) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_out_cannot_be_specified_with_option_separateCompilation));
                      }
                  }
                  if (options.inlineSourceMap) {
                      if (options.sourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap));
                      }
                      if (options.mapRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap));
                      }
                      if (options.sourceRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap));
                      }
                  }
                  if (options.inlineSources) {
                      if (!options.sourceMap && !options.inlineSourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided));
                      }
                  }
                  if (!options.sourceMap && (options.mapRoot || options.sourceRoot)) {
                      if (options.mapRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option));
                      }
                      if (options.sourceRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option));
                      }
                      return;
                  }
                  var languageVersion = options.target || 0;
                  var firstExternalModuleSourceFile = ts.forEach(files, function (f) { return ts.isExternalModule(f) ? f : undefined; });
                  if (options.separateCompilation) {
                      if (!options.module && languageVersion < 2) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher));
                      }
                      var firstNonExternalModuleSourceFile = ts.forEach(files, function (f) { return !ts.isExternalModule(f) && !ts.isDeclarationFile(f) ? f : undefined; });
                      if (firstNonExternalModuleSourceFile) {
                          var span = ts.getErrorSpanForNode(firstNonExternalModuleSourceFile, firstNonExternalModuleSourceFile);
                          diagnostics.add(ts.createFileDiagnostic(firstNonExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided));
                      }
                  }
                  else if (firstExternalModuleSourceFile && languageVersion < 2 && !options.module) {
                      var span = ts.getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
                      diagnostics.add(ts.createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_modules_unless_the_module_flag_is_provided));
                  }
                  if (options.module && languageVersion >= 2) {
                      diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher));
                  }
                  if (options.outDir ||
                      options.sourceRoot ||
                      (options.mapRoot &&
                          (!options.out || firstExternalModuleSourceFile !== undefined))) {
                      if (options.rootDir && checkSourceFilesBelongToPath(files, options.rootDir)) {
                          commonSourceDirectory = ts.getNormalizedAbsolutePath(options.rootDir, host.getCurrentDirectory());
                      }
                      else {
                          commonSourceDirectory = computeCommonSourceDirectory(files);
                      }
                      if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== ts.directorySeparator) {
                          commonSourceDirectory += ts.directorySeparator;
                      }
                  }
                  if (options.noEmit) {
                      if (options.out || options.outDir) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_out_or_outDir));
                      }
                      if (options.declaration) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_declaration));
                      }
                  }
              }
          }
          ts.createProgram = createProgram;
      })(ts || (ts = {}));
      /// <reference path="sys.ts"/>
      /// <reference path="types.ts"/>
      /// <reference path="core.ts"/>
      /// <reference path="scanner.ts"/>
      var ts;
      (function (ts) {
          ts.optionDeclarations = [
              {
                  name: "charset",
                  type: "string"
              },
              {
                  name: "declaration",
                  shortName: "d",
                  type: "boolean",
                  description: ts.Diagnostics.Generates_corresponding_d_ts_file
              },
              {
                  name: "diagnostics",
                  type: "boolean"
              },
              {
                  name: "emitBOM",
                  type: "boolean"
              },
              {
                  name: "help",
                  shortName: "h",
                  type: "boolean",
                  description: ts.Diagnostics.Print_this_message
              },
              {
                  name: "inlineSourceMap",
                  type: "boolean"
              },
              {
                  name: "inlineSources",
                  type: "boolean"
              },
              {
                  name: "listFiles",
                  type: "boolean"
              },
              {
                  name: "locale",
                  type: "string"
              },
              {
                  name: "mapRoot",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "module",
                  shortName: "m",
                  type: {
                      "commonjs": 1,
                      "amd": 2,
                      "system": 4,
                      "umd": 3
                  },
                  description: ts.Diagnostics.Specify_module_code_generation_Colon_commonjs_amd_system_or_umd,
                  paramType: ts.Diagnostics.KIND,
                  error: ts.Diagnostics.Argument_for_module_option_must_be_commonjs_amd_system_or_umd
              },
              {
                  name: "newLine",
                  type: {
                      "crlf": 0,
                      "lf": 1
                  },
                  description: ts.Diagnostics.Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix,
                  paramType: ts.Diagnostics.NEWLINE,
                  error: ts.Diagnostics.Argument_for_newLine_option_must_be_CRLF_or_LF
              },
              {
                  name: "noEmit",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_outputs
              },
              {
                  name: "noEmitHelpers",
                  type: "boolean"
              },
              {
                  name: "noEmitOnError",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_outputs_if_any_errors_were_reported
              },
              {
                  name: "noImplicitAny",
                  type: "boolean",
                  description: ts.Diagnostics.Raise_error_on_expressions_and_declarations_with_an_implied_any_type
              },
              {
                  name: "noLib",
                  type: "boolean"
              },
              {
                  name: "noResolve",
                  type: "boolean"
              },
              {
                  name: "out",
                  type: "string",
                  description: ts.Diagnostics.Concatenate_and_emit_output_to_single_file,
                  paramType: ts.Diagnostics.FILE
              },
              {
                  name: "outDir",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Redirect_output_structure_to_the_directory,
                  paramType: ts.Diagnostics.DIRECTORY
              },
              {
                  name: "preserveConstEnums",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
              },
              {
                  name: "project",
                  shortName: "p",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Compile_the_project_in_the_given_directory,
                  paramType: ts.Diagnostics.DIRECTORY
              },
              {
                  name: "removeComments",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_comments_to_output
              },
              {
                  name: "rootDir",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "separateCompilation",
                  type: "boolean"
              },
              {
                  name: "sourceMap",
                  type: "boolean",
                  description: ts.Diagnostics.Generates_corresponding_map_file
              },
              {
                  name: "sourceRoot",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "suppressImplicitAnyIndexErrors",
                  type: "boolean",
                  description: ts.Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures
              },
              {
                  name: "stripInternal",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_declarations_for_code_that_has_an_internal_annotation,
                  experimental: true
              },
              {
                  name: "target",
                  shortName: "t",
                  type: { "es3": 0, "es5": 1, "es6": 2 },
                  description: ts.Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental,
                  paramType: ts.Diagnostics.VERSION,
                  error: ts.Diagnostics.Argument_for_target_option_must_be_ES3_ES5_or_ES6
              },
              {
                  name: "version",
                  shortName: "v",
                  type: "boolean",
                  description: ts.Diagnostics.Print_the_compiler_s_version
              },
              {
                  name: "watch",
                  shortName: "w",
                  type: "boolean",
                  description: ts.Diagnostics.Watch_input_files
              },
              {
                  name: "emitDecoratorMetadata",
                  type: "boolean",
                  experimental: true
              }
          ];
          function parseCommandLine(commandLine) {
              var options = {};
              var fileNames = [];
              var errors = [];
              var shortOptionNames = {};
              var optionNameMap = {};
              ts.forEach(ts.optionDeclarations, function (option) {
                  optionNameMap[option.name.toLowerCase()] = option;
                  if (option.shortName) {
                      shortOptionNames[option.shortName] = option.name;
                  }
              });
              parseStrings(commandLine);
              return {
                  options: options,
                  fileNames: fileNames,
                  errors: errors
              };
              function parseStrings(args) {
                  var i = 0;
                  while (i < args.length) {
                      var s = args[i++];
                      if (s.charCodeAt(0) === 64) {
                          parseResponseFile(s.slice(1));
                      }
                      else if (s.charCodeAt(0) === 45) {
                          s = s.slice(s.charCodeAt(1) === 45 ? 2 : 1).toLowerCase();
                          if (ts.hasProperty(shortOptionNames, s)) {
                              s = shortOptionNames[s];
                          }
                          if (ts.hasProperty(optionNameMap, s)) {
                              var opt = optionNameMap[s];
                              if (!args[i] && opt.type !== "boolean") {
                                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
                              }
                              switch (opt.type) {
                                  case "number":
                                      options[opt.name] = parseInt(args[i++]);
                                      break;
                                  case "boolean":
                                      options[opt.name] = true;
                                      break;
                                  case "string":
                                      options[opt.name] = args[i++] || "";
                                      break;
                                  default:
                                      var map = opt.type;
                                      var key = (args[i++] || "").toLowerCase();
                                      if (ts.hasProperty(map, key)) {
                                          options[opt.name] = map[key];
                                      }
                                      else {
                                          errors.push(ts.createCompilerDiagnostic(opt.error));
                                      }
                              }
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, s));
                          }
                      }
                      else {
                          fileNames.push(s);
                      }
                  }
              }
              function parseResponseFile(fileName) {
                  var text = ts.sys.readFile(fileName);
                  if (!text) {
                      errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_not_found, fileName));
                      return;
                  }
                  var args = [];
                  var pos = 0;
                  while (true) {
                      while (pos < text.length && text.charCodeAt(pos) <= 32)
                          pos++;
                      if (pos >= text.length)
                          break;
                      var start = pos;
                      if (text.charCodeAt(start) === 34) {
                          pos++;
                          while (pos < text.length && text.charCodeAt(pos) !== 34)
                              pos++;
                          if (pos < text.length) {
                              args.push(text.substring(start + 1, pos));
                              pos++;
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unterminated_quoted_string_in_response_file_0, fileName));
                          }
                      }
                      else {
                          while (text.charCodeAt(pos) > 32)
                              pos++;
                          args.push(text.substring(start, pos));
                      }
                  }
                  parseStrings(args);
              }
          }
          ts.parseCommandLine = parseCommandLine;
          function readConfigFile(fileName) {
              try {
                  var text = ts.sys.readFile(fileName);
              }
              catch (e) {
                  return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, e.message) };
              }
              return parseConfigFileText(fileName, text);
          }
          ts.readConfigFile = readConfigFile;
          function parseConfigFileText(fileName, jsonText) {
              try {
                  return { config: /\S/.test(jsonText) ? JSON.parse(jsonText) : {} };
              }
              catch (e) {
                  return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Failed_to_parse_file_0_Colon_1, fileName, e.message) };
              }
          }
          ts.parseConfigFileText = parseConfigFileText;
          function parseConfigFile(json, host, basePath) {
              var errors = [];
              return {
                  options: getCompilerOptions(),
                  fileNames: getFiles(),
                  errors: errors
              };
              function getCompilerOptions() {
                  var options = {};
                  var optionNameMap = {};
                  ts.forEach(ts.optionDeclarations, function (option) {
                      optionNameMap[option.name] = option;
                  });
                  var jsonOptions = json["compilerOptions"];
                  if (jsonOptions) {
                      for (var id in jsonOptions) {
                          if (ts.hasProperty(optionNameMap, id)) {
                              var opt = optionNameMap[id];
                              var optType = opt.type;
                              var value = jsonOptions[id];
                              var expectedType = typeof optType === "string" ? optType : "string";
                              if (typeof value === expectedType) {
                                  if (typeof optType !== "string") {
                                      var key = value.toLowerCase();
                                      if (ts.hasProperty(optType, key)) {
                                          value = optType[key];
                                      }
                                      else {
                                          errors.push(ts.createCompilerDiagnostic(opt.error));
                                          value = 0;
                                      }
                                  }
                                  if (opt.isFilePath) {
                                      value = ts.normalizePath(ts.combinePaths(basePath, value));
                                  }
                                  options[opt.name] = value;
                              }
                              else {
                                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, id, expectedType));
                              }
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, id));
                          }
                      }
                  }
                  return options;
              }
              function getFiles() {
                  var files = [];
                  if (ts.hasProperty(json, "files")) {
                      if (json["files"] instanceof Array) {
                          var files = ts.map(json["files"], function (s) { return ts.combinePaths(basePath, s); });
                      }
                  }
                  else {
                      var sysFiles = host.readDirectory(basePath, ".ts");
                      for (var i = 0; i < sysFiles.length; i++) {
                          var name = sysFiles[i];
                          if (!ts.fileExtensionIs(name, ".d.ts") || !ts.contains(sysFiles, name.substr(0, name.length - 5) + ".ts")) {
                              files.push(name);
                          }
                      }
                  }
                  return files;
              }
          }
          ts.parseConfigFile = parseConfigFile;
      })(ts || (ts = {}));
      /// <reference path="program.ts"/>
      /// <reference path="commandLineParser.ts"/>
      var ts;
      (function (ts) {
          function validateLocaleAndSetLanguage(locale, errors) {
              var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase());
              if (!matchResult) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, 'en', 'ja-jp'));
                  return false;
              }
              var language = matchResult[1];
              var territory = matchResult[3];
              if (!trySetLanguageAndTerritory(language, territory, errors) &&
                  !trySetLanguageAndTerritory(language, undefined, errors)) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_locale_0, locale));
                  return false;
              }
              return true;
          }
          function trySetLanguageAndTerritory(language, territory, errors) {
              var compilerFilePath = ts.normalizePath(ts.sys.getExecutingFilePath());
              var containingDirectoryPath = ts.getDirectoryPath(compilerFilePath);
              var filePath = ts.combinePaths(containingDirectoryPath, language);
              if (territory) {
                  filePath = filePath + "-" + territory;
              }
              filePath = ts.sys.resolvePath(ts.combinePaths(filePath, "diagnosticMessages.generated.json"));
              if (!ts.sys.fileExists(filePath)) {
                  return false;
              }
              try {
                  var fileContents = ts.sys.readFile(filePath);
              }
              catch (e) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unable_to_open_file_0, filePath));
                  return false;
              }
              try {
                  ts.localizedDiagnosticMessages = JSON.parse(fileContents);
              }
              catch (e) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Corrupted_locale_file_0, filePath));
                  return false;
              }
              return true;
          }
          function countLines(program) {
              var count = 0;
              ts.forEach(program.getSourceFiles(), function (file) {
                  count += ts.getLineStarts(file).length;
              });
              return count;
          }
          function getDiagnosticText(message) {
              var args = [];
              for (var _i = 1; _i < arguments.length; _i++) {
                  args[_i - 1] = arguments[_i];
              }
              var diagnostic = ts.createCompilerDiagnostic.apply(undefined, arguments);
              return diagnostic.messageText;
          }
          function reportDiagnostic(diagnostic) {
              var output = "";
              if (diagnostic.file) {
                  var loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
                  output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): ";
              }
              var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();
              output += category + " TS" + diagnostic.code + ": " + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine;
              ts.sys.write(output);
          }
          function reportDiagnostics(diagnostics) {
              for (var i = 0; i < diagnostics.length; i++) {
                  reportDiagnostic(diagnostics[i]);
              }
          }
          function padLeft(s, length) {
              while (s.length < length) {
                  s = " " + s;
              }
              return s;
          }
          function padRight(s, length) {
              while (s.length < length) {
                  s = s + " ";
              }
              return s;
          }
          function reportStatisticalValue(name, value) {
              ts.sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + ts.sys.newLine);
          }
          function reportCountStatistic(name, count) {
              reportStatisticalValue(name, "" + count);
          }
          function reportTimeStatistic(name, time) {
              reportStatisticalValue(name, (time / 1000).toFixed(2) + "s");
          }
          function isJSONSupported() {
              return typeof JSON === "object" && typeof JSON.parse === "function";
          }
          function executeCommandLine(args) {
              var commandLine = ts.parseCommandLine(args);
              var configFileName;
              var configFileWatcher;
              var cachedProgram;
              var rootFileNames;
              var compilerOptions;
              var compilerHost;
              var hostGetSourceFile;
              var timerHandle;
              if (commandLine.options.locale) {
                  if (!isJSONSupported()) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors);
              }
              if (commandLine.errors.length > 0) {
                  reportDiagnostics(commandLine.errors);
                  return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
              }
              if (commandLine.options.version) {
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Version_0, ts.version));
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.help) {
                  printVersion();
                  printHelp();
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.project) {
                  if (!isJSONSupported()) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--project"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  configFileName = ts.normalizePath(ts.combinePaths(commandLine.options.project, "tsconfig.json"));
                  if (commandLine.fileNames.length !== 0) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
              }
              else if (commandLine.fileNames.length === 0 && isJSONSupported()) {
                  var searchPath = ts.normalizePath(ts.sys.getCurrentDirectory());
                  configFileName = ts.findConfigFile(searchPath);
              }
              if (commandLine.fileNames.length === 0 && !configFileName) {
                  printVersion();
                  printHelp();
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.watch) {
                  if (!ts.sys.watchFile) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  if (configFileName) {
                      configFileWatcher = ts.sys.watchFile(configFileName, configFileChanged);
                  }
              }
              performCompilation();
              function performCompilation() {
                  if (!cachedProgram) {
                      if (configFileName) {
                          var result = ts.readConfigFile(configFileName);
                          if (result.error) {
                              reportDiagnostic(result.error);
                              return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                          }
                          var configObject = result.config;
                          var configParseResult = ts.parseConfigFile(configObject, ts.sys, ts.getDirectoryPath(configFileName));
                          if (configParseResult.errors.length > 0) {
                              reportDiagnostics(configParseResult.errors);
                              return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                          }
                          rootFileNames = configParseResult.fileNames;
                          compilerOptions = ts.extend(commandLine.options, configParseResult.options);
                      }
                      else {
                          rootFileNames = commandLine.fileNames;
                          compilerOptions = commandLine.options;
                      }
                      compilerHost = ts.createCompilerHost(compilerOptions);
                      hostGetSourceFile = compilerHost.getSourceFile;
                      compilerHost.getSourceFile = getSourceFile;
                  }
                  var compileResult = compile(rootFileNames, compilerOptions, compilerHost);
                  if (!compilerOptions.watch) {
                      return ts.sys.exit(compileResult.exitStatus);
                  }
                  setCachedProgram(compileResult.program);
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Compilation_complete_Watching_for_file_changes));
              }
              function getSourceFile(fileName, languageVersion, onError) {
                  if (cachedProgram) {
                      var sourceFile = cachedProgram.getSourceFile(fileName);
                      if (sourceFile && sourceFile.fileWatcher) {
                          return sourceFile;
                      }
                  }
                  var sourceFile = hostGetSourceFile(fileName, languageVersion, onError);
                  if (sourceFile && compilerOptions.watch) {
                      sourceFile.fileWatcher = ts.sys.watchFile(sourceFile.fileName, function () { return sourceFileChanged(sourceFile); });
                  }
                  return sourceFile;
              }
              function setCachedProgram(program) {
                  if (cachedProgram) {
                      var newSourceFiles = program ? program.getSourceFiles() : undefined;
                      ts.forEach(cachedProgram.getSourceFiles(), function (sourceFile) {
                          if (!(newSourceFiles && ts.contains(newSourceFiles, sourceFile))) {
                              if (sourceFile.fileWatcher) {
                                  sourceFile.fileWatcher.close();
                                  sourceFile.fileWatcher = undefined;
                              }
                          }
                      });
                  }
                  cachedProgram = program;
              }
              function sourceFileChanged(sourceFile) {
                  sourceFile.fileWatcher.close();
                  sourceFile.fileWatcher = undefined;
                  startTimer();
              }
              function configFileChanged() {
                  setCachedProgram(undefined);
                  startTimer();
              }
              function startTimer() {
                  if (timerHandle) {
                      clearTimeout(timerHandle);
                  }
                  timerHandle = setTimeout(recompile, 250);
              }
              function recompile() {
                  timerHandle = undefined;
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.File_change_detected_Starting_incremental_compilation));
                  performCompilation();
              }
          }
          ts.executeCommandLine = executeCommandLine;
          function compile(fileNames, compilerOptions, compilerHost) {
              ts.ioReadTime = 0;
              ts.ioWriteTime = 0;
              ts.programTime = 0;
              ts.bindTime = 0;
              ts.checkTime = 0;
              ts.emitTime = 0;
              var program = ts.createProgram(fileNames, compilerOptions, compilerHost);
              var exitStatus = compileProgram();
              if (compilerOptions.listFiles) {
                  ts.forEach(program.getSourceFiles(), function (file) {
                      ts.sys.write(file.fileName + ts.sys.newLine);
                  });
              }
              if (compilerOptions.diagnostics) {
                  var memoryUsed = ts.sys.getMemoryUsage ? ts.sys.getMemoryUsage() : -1;
                  reportCountStatistic("Files", program.getSourceFiles().length);
                  reportCountStatistic("Lines", countLines(program));
                  reportCountStatistic("Nodes", program.getNodeCount());
                  reportCountStatistic("Identifiers", program.getIdentifierCount());
                  reportCountStatistic("Symbols", program.getSymbolCount());
                  reportCountStatistic("Types", program.getTypeCount());
                  if (memoryUsed >= 0) {
                      reportStatisticalValue("Memory used", Math.round(memoryUsed / 1000) + "K");
                  }
                  reportTimeStatistic("I/O read", ts.ioReadTime);
                  reportTimeStatistic("I/O write", ts.ioWriteTime);
                  reportTimeStatistic("Parse time", ts.programTime);
                  reportTimeStatistic("Bind time", ts.bindTime);
                  reportTimeStatistic("Check time", ts.checkTime);
                  reportTimeStatistic("Emit time", ts.emitTime);
                  reportTimeStatistic("Total time", ts.programTime + ts.bindTime + ts.checkTime + ts.emitTime);
              }
              return { program: program, exitStatus: exitStatus };
              function compileProgram() {
                  var diagnostics = program.getSyntacticDiagnostics();
                  reportDiagnostics(diagnostics);
                  if (diagnostics.length === 0) {
                      var diagnostics = program.getGlobalDiagnostics();
                      reportDiagnostics(diagnostics);
                      if (diagnostics.length === 0) {
                          var diagnostics = program.getSemanticDiagnostics();
                          reportDiagnostics(diagnostics);
                      }
                  }
                  if (compilerOptions.noEmit) {
                      return diagnostics.length
                          ? ts.ExitStatus.DiagnosticsPresent_OutputsSkipped
                          : ts.ExitStatus.Success;
                  }
                  var emitOutput = program.emit();
                  reportDiagnostics(emitOutput.diagnostics);
                  if (emitOutput.emitSkipped) {
                      return ts.ExitStatus.DiagnosticsPresent_OutputsSkipped;
                  }
                  if (diagnostics.length > 0 || emitOutput.diagnostics.length > 0) {
                      return ts.ExitStatus.DiagnosticsPresent_OutputsGenerated;
                  }
                  return ts.ExitStatus.Success;
              }
          }
          function printVersion() {
              ts.sys.write(getDiagnosticText(ts.Diagnostics.Version_0, ts.version) + ts.sys.newLine);
          }
          function printHelp() {
              var output = "";
              var syntaxLength = getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, "").length;
              var examplesLength = getDiagnosticText(ts.Diagnostics.Examples_Colon_0, "").length;
              var marginLength = Math.max(syntaxLength, examplesLength);
              var syntax = makePadding(marginLength - syntaxLength);
              syntax += "tsc [" + getDiagnosticText(ts.Diagnostics.options) + "] [" + getDiagnosticText(ts.Diagnostics.file) + " ...]";
              output += getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, syntax);
              output += ts.sys.newLine + ts.sys.newLine;
              var padding = makePadding(marginLength);
              output += getDiagnosticText(ts.Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + ts.sys.newLine;
              output += padding + "tsc --out file.js file.ts" + ts.sys.newLine;
              output += padding + "tsc @args.txt" + ts.sys.newLine;
              output += ts.sys.newLine;
              output += getDiagnosticText(ts.Diagnostics.Options_Colon) + ts.sys.newLine;
              var optsList = ts.filter(ts.optionDeclarations.slice(), function (v) { return !v.experimental; });
              optsList.sort(function (a, b) { return ts.compareValues(a.name.toLowerCase(), b.name.toLowerCase()); });
              var marginLength = 0;
              var usageColumn = [];
              var descriptionColumn = [];
              for (var i = 0; i < optsList.length; i++) {
                  var option = optsList[i];
                  if (!option.description) {
                      continue;
                  }
                  var usageText = " ";
                  if (option.shortName) {
                      usageText += "-" + option.shortName;
                      usageText += getParamType(option);
                      usageText += ", ";
                  }
                  usageText += "--" + option.name;
                  usageText += getParamType(option);
                  usageColumn.push(usageText);
                  descriptionColumn.push(getDiagnosticText(option.description));
                  marginLength = Math.max(usageText.length, marginLength);
              }
              var usageText = " @<" + getDiagnosticText(ts.Diagnostics.file) + ">";
              usageColumn.push(usageText);
              descriptionColumn.push(getDiagnosticText(ts.Diagnostics.Insert_command_line_options_and_files_from_a_file));
              marginLength = Math.max(usageText.length, marginLength);
              for (var i = 0; i < usageColumn.length; i++) {
                  var usage = usageColumn[i];
                  var description = descriptionColumn[i];
                  output += usage + makePadding(marginLength - usage.length + 2) + description + ts.sys.newLine;
              }
              ts.sys.write(output);
              return;
              function getParamType(option) {
                  if (option.paramType !== undefined) {
                      return " " + getDiagnosticText(option.paramType);
                  }
                  return "";
              }
              function makePadding(paddingLength) {
                  return Array(paddingLength + 1).join(" ");
              }
          }
      })(ts || (ts = {}));
      ts.executeCommandLine(ts.sys.args);
      
  • typings
    • webSQL.d.ts
      declare function openDatabase(
        name: string,
        version: any,
        displayName: string,
        size: number,
        upgrade?: DatabaseCallback): Database;
      
      interface DatabaseCallback {
        (database: Database): void;
      }
      
      interface Database {
        transaction(
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      
        readTransaction(
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      
        version: string;
      
        changeVersion(
          oldVersion: string,
          newVersion: string,
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      }
      
      interface SQLTransaction {
        executeSql(
          sqlStatement: string,
          arguments?: any[],
          callback?: (transaction: SQLTransaction, result: SQLResultSet) => void,
          errorCallback?: (transaction: SQLTransaction, error: SQLError) => void): void;
      }
      
      interface SQLError {
        /**
         * UNKNOWN_ERR = 0;
         * DATABASE_ERR = 1;
         * VERSION_ERR = 2;
         * TOO_LARGE_ERR = 3;
         * QUOTA_ERR = 4;
         * SYNTAX_ERR = 5;
         * CONSTRAINT_ERR = 6;
        * TIMEOUT_ERR = 7;
         */
        code: number;
        message: string
      }
      
      interface SQLResultSet {
        insertId: number;
        rowsAffected: number;
        rows: SQLResultSetRowList;
      }
      
      interface SQLResultSetRowList {
        length: number;
        item(index: number): any;
      }
  • dummy.ts
    class Apple {
      constructor(public color = 'red') {
      }
    }
    
    console.log('Look, I am a happy TypeScript file running away.');
    console.log('I\'ve got class ' + Apple);
    var apple = new Apple();
    console.log('I\'ve created an instance of it: ', apple);
    apple.color = 'green';
    console.log('I\'ve changed its colour: ', apple);
  • index.html
    <!doctype html>
    <title>mini shell </title>
    
    <script data-legit=mi>
      <%=embedFile('boot/onerror.js')%>
    //# sourceURL=boot/onerror.js
    </script>
    <script data-legit=mi>
      earlyBoot(window);
    
      	<%=typescriptBuild('boot/*')%>
    
        <%=embedFile('boot/bootUI.js')%>
    //# sourceURL=/boot/base.js
    </script>
    <script data-legit=mi>
    
    <%=typescriptBuild('load/*', 'persistence/*', 'boot/base.d.ts', 'typings/*')%>
    function showCommanderInContext(drive, window, document, require) {
    <%=typescriptBuild('shell/*', 'noapi/*', 'isolation/*',   'boot/base.d.ts', 'persistence/Drive.ts', 'typings/*')%>
      showCommander(drive);
    }
    //# sourceURL=/load/shellLoader.ts.js
    </script>
    
    <!-- total 12Mb, saved <%=(function() {
    
    var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
    
    var saveDate = new Date();
    var dtText =
      saveDate.getDate() + ' ' +
      monthsPrettyCase[saveDate.getMonth()] + ' ' +
      saveDate.getFullYear() + ' ' +
      num2(saveDate.getHours()) + ':' +
      num2(saveDate.getMinutes()) + ':' +
      num2(saveDate.getSeconds()) + '.' +
      (+saveDate).toString().slice(-3);
    
    var saveDateLocalStr = saveDate.toString();
    var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
    if (gmtMatch)
    	dtText += ' ' + gmtMatch[1];
    
    return dtText;
    
    function num2(n) {
    	return n <= 9 ? '0' + n : '' + n;
    }
    
    
    })()
    %> -->
    
    <!-- /empty/
    -->
    
    
    <!-- /LF-file.txt
    123
    456-->
    
    <!-- /CRLF-file [CRLF]
    123
    456-->
    
    <!-- /CR-file [CR]
    123
    456-->
    
    <!-- /exportsome.js [CR]
    module.exports = 55-->
    
    <!-- /exports_fs.js [CR]
    module.exports = require('fs')-->
    
    <!-- /exports_process.js [CR]
    module.exports = process-->
    
    <!-- /eval-file.txt [eval]
     "random char: " + String.fromCharCode(Math.random()*16000)+"\n"+
     "date: "+new Date()+"\n"+
     "location: "+location -->
    
    <!-- /json-file.txt [json]
    "new ok \u2222 and what\r\n or \u0001?\n\n\n"-->
    
    <%=(function() {
    return; // SWITCHED OFF LARGE DIRECTORY GENERATION (it makes it easier to debug DOM stuff)
    
    var dump = [];
    for (var i = 0; i < 2000; i++) {
    	dump.push('<'+'!'+'-- /large-directory/'+(500+i)+'.txt');
      dump.push('OK --'+'>');
    }
    return dump.join('\n');
       })()%>
    
    
    
    
    
    
    
    
    <!-- /shell/style.css
    <%=(function() {
    	var drive = portabled.build.processTemplate.mainDrive;
    	var files = drive.files();
    	var styleText = [];
      for (var i = 0; i < files.length; i++) {
        if (/^\/shell\/[\s\S]*\.css$/.test(files[i]))
          styleText.push(drive.read(files[i]));
      }
    	return styleText.join('\n');
    
    })()%>
    -->
    
    <%=(function() {
    
    	var drive = portabled.build.processTemplate.mainDrive;
    	var files = drive.files();
    	var fileDump = [];
      for (var i = 0; i < files.length; i++) {
        var content = drive.read(files[i]);
        var decoratedContent = content.
    			replace(/\-\-(\**)\>/g, '--*$1>').
    			replace(/\<(\**)\!/g, '<*$1!');
    	  fileDump.push('<'+'!'+'-- '+'/src'+files[i]);
        fileDump.push(decoratedContent);
        fileDump.push('--'+'!'+'>');
      }
    	return fileDump.join('\n');
    
    })()%>
    
    
  • readme.md
    #New mini portable shell development
    
    Used these open-source libraries:
    
     * [feross/buffer] (https://github.com/feross/buffer) - MIT
     * [beatgammit/base64-js] (https://github.com/beatgammit/base64-js) - MIT
     * [feross/ieee754] (https://github.com/feross/ieee754) - MIT
     * [retrofox/is-array] (https://github.com/retrofox/is-array) - MIT
    
    ## Boot process
    
    The boot process begins with first bytes of the page received, during the loading of the content,
    then would continue for a little after the page is loaded.
    
    The main post-content-load is completing the data fetch from the local storage. It may well finish earlier,
    but may take some time.
    
    During the boot process, and at the end of it the code is supposed to show sensible UI
    and implement neat handover animations (unless the whole boot finishes very fast).
    
    ### Early boot
    
    The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader.
    The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever.
    
     * Error handler is installed at the first opportunity
     * Base.js library with primitives for basic DOM manipulation is loaded
     * BootUI iframe is created
     * BootUI function is invoked to draw the boot animation
    
    ### Shell loader
    
    Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage).
    
    During that persistence loading the shell loader passes progress events to the boot UI. Upon completion
    it starts the actual shell and finally animates from boot UI to the shell.
    
     * Persistence loading is started
     * Persistence keeps polling the DOM state, fishing for pieces of 'virtual filesystem'
     * Progress is supposed to be reported to the BootUI
     * Persistence also need to load the locally-stored state, reconciling it with the DOM (by timestamps)
     * Eventualy persistence report completion
     * Shell iframe is created with opacity=0
     * Shell start code is loaded (normally from the filesystem) and kicked off
     * Animating BootUI.opacity -> 0; Shell.opacity->1
    
     ### Shell
    
    When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it.
    
    The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features.
    
    At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated
    and necessary tasks (copying/editing/moving of files or directories) performed interactively.
    
    Other shells may host more specialised apps. These are planned examples:
    
     * PC.js virtual machine hosting early PC images (DOS, early Windows, OS/2 and such)
     * Markdown viewer/editor
     * SVG editor
     * Slide editor
     * Spreadsheet editor
    
    ## Involved libaries and sub-modules
    
    First of all, the sequence above explicitly mentiones three mini-libraries:
    
     * Base.js
     * BootUI
     * Persistence
    
    Those indeed can be considered separately, with a degree of isolation from the rest of the boot process.
    
    ### Base.js
    
    A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell.
    
    These are broad features of the mini-library:
    
     * Setting/getting text of a DOM element (older IE handling, special workarounds for some elements)
     * Creating elements and setting properties/CSS attributes in JSON-like syntax
     * Subscribing to events
     * Creating IFRAME and retrieving its key objects (inner window, inner document)
    
    ### BootUI
    
    The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME
    with limited communication to the rest of the code.
    
    It is expected that various shells provide each their fine-tuned boot UI 'library'.
    
    A good option would be to render the state of the application as the user left,
    with a tasteful overlay reflecting the boot progress.
    
    ### Persistence
    
    The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library.
    
    The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages.
    
    Several sources of storage are implemented towards the same API:
    
     * DOM
     * IndexedDB
     * WebSQL
     * LocalStorage
    
    DOM storage is expected to exist at a very minimum (we are running in the context of a page already!),
    then one of the local storage options is added upon a brief detection process.
    
    From the external caller the persistence mini-library expects a single call to *mountDrive* function,
    passing in a few inputs and a callback.

New mini portable shell development

Used these open-source libraries:

Boot process

The boot process begins with first bytes of the page received, during the loading of the content, then would continue for a little after the page is loaded.

The main post-content-load is completing the data fetch from the local storage. It may well finish earlier, but may take some time.

During the boot process, and at the end of it the code is supposed to show sensible UI and implement neat handover animations (unless the whole boot finishes very fast).

Early boot

The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader. The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever.

  • Error handler is installed at the first opportunity
  • Base.js library with primitives for basic DOM manipulation is loaded
  • BootUI iframe is created
  • BootUI function is invoked to draw the boot animation

Shell loader

Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage).

During that persistence loading the shell loader passes progress events to the boot UI. Upon completion it starts the actual shell and finally animates from boot UI to the shell.

  • Persistence loading is started
  • Persistence keeps polling the DOM state, fishing for pieces of 'virtual filesystem'
  • Progress is supposed to be reported to the BootUI
  • Persistence also need to load the locally-stored state, reconciling it with the DOM (by timestamps)
  • Eventualy persistence report completion
  • Shell iframe is created with opacity=0
  • Shell start code is loaded (normally from the filesystem) and kicked off
  • Animating BootUI.opacity -> 0; Shell.opacity->1

    Shell

When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it.

The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features.

At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated and necessary tasks (copying/editing/moving of files or directories) performed interactively.

Other shells may host more specialised apps. These are planned examples:

  • PC.js virtual machine hosting early PC images (DOS, early Windows, OS/2 and such)
  • Markdown viewer/editor
  • SVG editor
  • Slide editor
  • Spreadsheet editor

Involved libaries and sub-modules

First of all, the sequence above explicitly mentiones three mini-libraries:

  • Base.js
  • BootUI
  • Persistence

Those indeed can be considered separately, with a degree of isolation from the rest of the boot process.

Base.js

A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell.

These are broad features of the mini-library:

  • Setting/getting text of a DOM element (older IE handling, special workarounds for some elements)
  • Creating elements and setting properties/CSS attributes in JSON-like syntax
  • Subscribing to events
  • Creating IFRAME and retrieving its key objects (inner window, inner document)

BootUI

The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME with limited communication to the rest of the code.

It is expected that various shells provide each their fine-tuned boot UI 'library'.

A good option would be to render the state of the application as the user left, with a tasteful overlay reflecting the boot progress.

Persistence

The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library.

The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages.

Several sources of storage are implemented towards the same API:

  • DOM
  • IndexedDB
  • WebSQL
  • LocalStorage

DOM storage is expected to exist at a very minimum (we are running in the context of a page already!), then one of the local storage options is added upon a brief detection process.

From the external caller the persistence mini-library expects a single call to mountDrive function, passing in a few inputs and a callback.

portabled v0.6.1a by Oleg Mihailik
built Sat Jun 13 2015 11:52:49 GMT+0100 (GMT Summer Time)

Used Open Source libraries:
TypeScript (Microsoft, with Apache 2.0 license)
CodeMirror (Marijn Haverbeke, with MIT license)
Knockout.js (Ryan Niemeyer, with MIT license)
Zip.js (Gildas Lormeau, with BSD license)
Marked (Christopher Jeffrey, with MIT license)
ES5-shims (with MIT license)
GitHub API wrapper (Michael Aufreiter with BSD2 license)
JS Murmur hasher (Gary Court with MIT license)
google-diff-match-patch (Google with Apache 2.0 license)
UglifyJS2 (Mihai Bazon with BSD license)
UglifyCSS (Franck Marcia with MIT license)
JSON3 (Kit Cambridge with MIT license)
- main contributors mentioned where applicable.
/boot/bootUI.js